Tesla電動車北美Q2售出5千多台,營收超4億美元

美國電動車商Tesla近日公布最新財報,Q2營收達到4.051億美元,北美市場銷售5千多台,遠高於目標4千台,EPS 0.2美元毛利率由前一季的17%拉升到了22%。

Tesla電動車的充電器看上去像加油槍,充飽電后可跑25公里,而後車廂配備大顆鋰電池,用家用插座可充飽電4.5度電,最高時速一小時85公里,花費比油車節省很多。

被喻為車界「蘋果」的Tesla ModelS,一台要價7萬美金,底部有整顆電池可跑200公里,車內配製17吋觸控電腦,第二季在北美市場賣出5150輛,大幅超過4500輛的目標,成為車市的大黑馬。

本站聲明:網站內容來源於EnergyTrend https://www.energytrend.com.tw/ev/,如有侵權,請聯繫我們,我們將及時處理

【其他文章推薦】

※帶您來了解什麼是 USB CONNECTOR  ?

※自行創業缺乏曝光? 網頁設計幫您第一時間規劃公司的形象門面

※如何讓商品強力曝光呢? 網頁設計公司幫您建置最吸引人的網站,提高曝光率!

※綠能、環保無空污,成為電動車最新代名詞,目前市場使用率逐漸普及化

※廣告預算用在刀口上,台北網頁設計公司幫您達到更多曝光效益

※教你寫出一流的銷售文案?

800台比亞迪E6出租車 在深累計行程超1億公裡

8月15日,在2013年中國(深圳)國際公共交通科技博覽會上,比亞迪綠色公交發展事業部人員表示,E6出租車在深圳累計行駛裡程已超1億公裡。截至2013年7月底,在深圳投入的公交運營E6純電動出租車約為800台。

該人士表示,E6作為F3DM的升級版,最大的亮點在於採用了電力驅動,其動力電池和啟動電池均採用比亞迪自主研發生產的eT-POWeR鐵電池。

E6還分為個人消費者版和出租車版,其中個人版市場有待培育,將是比亞迪銷售部門下半年的工作重點。E6出租車目前推廣順利,年初制定的計劃推廣城市現在基本已經打開。

本站聲明:網站內容來源於EnergyTrend https://www.energytrend.com.tw/ev/,如有侵權,請聯繫我們,我們將及時處理

【其他文章推薦】

※為什麼 USB CONNECTOR 是電子產業重要的元件?

網頁設計一頭霧水該從何著手呢? 台北網頁設計公司幫您輕鬆架站!

※台北網頁設計公司全省服務真心推薦

※想知道最厲害的網頁設計公司"嚨底家"!

新北清潔公司,居家、辦公、裝潢細清專業服務

※推薦評價好的iphone維修中心

傳三菱汽車將重啟PHV生產並擴增產能

據日經新聞今(19)日報導,汽車大廠三菱汽車(Mitsubishi Motors)將重啟已停擺長達約5個月的插電式油電混合車(PHV)「Outlander PHEV」的生產作業,且為了出口「Outlander PHEV」至歐洲市場,三菱汽車也計畫倍增其產能。

三菱汽車於今年1月開賣「Outlander PHEV」,之後於3月時宣佈因「Outlander PHEV」所搭載的鋰離子電池出包,故將停止生產及出貨。

報導指出,三菱汽車將利用名古屋製作所月產2,000台的規模重啟「Outlander PHEV」生產、之後並計劃於2014年5月底前將其月產能倍增至4,000台。

目前「Outlander PHEV」積壓的訂單約1.8萬台。而搭載出包鋰離子電池的電動車「i-MiEV」等其他車種也一度被迫停止生產,惟「i-MiEV」已於8月上旬前重啟生產。

據日本的調查報告指出,2012年全球插電式油電混合車(PHV)市場規模預估較2011年暴增500%至6萬台,預估2030年時將增至194萬台,將較2012年跳增約31倍。

本站聲明:網站內容來源於EnergyTrend https://www.energytrend.com.tw/ev/,如有侵權,請聯繫我們,我們將及時處理

【其他文章推薦】

網頁設計一頭霧水該從何著手呢? 台北網頁設計公司幫您輕鬆架站!

網頁設計公司推薦不同的風格,搶佔消費者視覺第一線

※想知道購買電動車哪裡補助最多?台中電動車補助資訊懶人包彙整

南投搬家公司費用,距離,噸數怎麼算?達人教你簡易估價知識!

※教你寫出一流的銷售文案?

※超省錢租車方案

特斯拉或于5年內推平價電動汽車Model E

電動汽車廠特斯拉(TESLA)本周遭披露,已向美國專利商標局申請使用「Model E」做為汽車產品命名,特斯拉不願證實是否與開發大眾化電動汽車款有關,但執行長馬斯克(Elon Musk)接受彭博專訪時,似乎間接證實這項意圖。

馬斯克表示,5年內將推出售價約3.5萬美元的平價電動汽車,同時將在亞洲、歐洲等地設廠,因應大眾化車款量產需求。

特斯拉今年計劃生產至少2.1萬台售價7萬美元的Model S豪華電動汽車,明年產量將加倍。儘管年產能上限50萬輛的加州廠仍足以應付,但未來隨售價僅約Model S一半的小型大眾車款加入,特斯拉必須擴廠。

不過,對於大眾化電動汽車上市時間,馬斯克轉趨保守,原先估計約3~4年,這次受訪則改口在5年之內。在大眾車款問世前,特斯拉明年底將先推出電動休旅車Model X延續買氣。

由於Model S熱銷,特斯拉較預期更早轉虧為盈,今年來股價大漲337%,推升該公司市值達到180億美元,超越了飛雅特(FIAT)等多家汽車大廠。

本站聲明:網站內容來源於EnergyTrend https://www.energytrend.com.tw/ev/,如有侵權,請聯繫我們,我們將及時處理

【其他文章推薦】

網頁設計一頭霧水該從何著手呢? 台北網頁設計公司幫您輕鬆架站!

網頁設計公司推薦不同的風格,搶佔消費者視覺第一線

※Google地圖已可更新顯示潭子電動車充電站設置地點!!

※廣告預算用在刀口上,台北網頁設計公司幫您達到更多曝光效益

※別再煩惱如何寫文案,掌握八大原則!

網頁設計最專業,超強功能平台可客製化

東方電氣發佈半年報 新能源汽車未來是看點

東方電氣昨(28)日發佈2013年半年報,其在報告期內實現營業收入增加2.28%,達到204.67億元(人民幣,下同);但淨利潤則同比下降4.65%,為11.86億元。對於業績上升而淨利潤下滑的原因,公司稱是產品毛利率下跌所致。資料顯示,上半年,該公司的毛利率下跌了1.3%,為18.05%。

雖然淨利潤下滑,但東方電氣的產品銷路仍良好。據中報披露,報告期內,公司新增訂單202億元,在手訂單超過1400億元。其中,高效清潔能源占59.5%、新能源占14%、水能及環保占7.3%、工程及服務業占19.2%。

東方電氣的中央研究院新能源與發電技術研究所,主要負責新能源開發,該所副所長胡蘊成近日表示,東方電氣的電動機產品已經成熟,進入到了市場領域,目前國內新能源汽車大多數電動機都是由東方電氣生產的。同時,動力總成和儲能技術已取得重大突破,不久將投入市場。

相關人士分析稱,成都發展新能源汽車有較強優勢:第一,成都有強大的汽車工業基礎,形成了較為完備的汽車產業鏈;第二,成都汽車科研實力強大,川大、電子科大等高校都有涉及,同時還有中科等電池、電機等的研發與生產企業;第三,鋰礦是新能源汽車的主要能源,而四川鋰礦資源豐富;第四,成都正在建設世界現代田園城市,在低碳方面投入力度也較大。

另外,國家對新能源汽車的扶持力度也正在加大,《節能與新能源汽車產業發展規劃》已編制完成,正在向各部委徵求意見,根據規劃,未來10年,中央財政將拿出超過1000億元,扶持新能源汽車產業鏈。

本站聲明:網站內容來源於EnergyTrend https://www.energytrend.com.tw/ev/,如有侵權,請聯繫我們,我們將及時處理

【其他文章推薦】

網頁設計公司推薦不同的風格,搶佔消費者視覺第一線

※廣告預算用在刀口上,台北網頁設計公司幫您達到更多曝光效益

※自行創業缺乏曝光? 網頁設計幫您第一時間規劃公司的形象門面

南投搬家公司費用需注意的眉眉角角,別等搬了再說!

新北清潔公司,居家、辦公、裝潢細清專業服務

※教你寫出一流的銷售文案?

韓國發明可折疊電動汽車

全球不少大城市都面臨交通擁擠,停車位嚴重不足的問題。而韓國近日研發一款可折疊電動汽車,減少樂停車時佔據的空間。

據韓國科研人員介紹,這款稱為Armadillo-T的車子可搭載兩個人,最高速度為每小時60公裏,充電10分鐘可走100公裏。駕駛員還可利用智能手機應用程序,在車子外部發出折疊或展開指令。

據了解,Armadillo-T在停車時會以車體中心為軸抬起後輪,使得車子佔位長度從2.8公尺縮短到1.65公尺。一個普通停車位可放置三輛Armadillo-T汽車,而且它可在停車狀態下旋轉360度,停放在普通車輛不能停放的地方。

為安全起見,設計師還將傳統的後視鏡置替換為環繞視圖攝像頭。然而,由于Armadillo-T未達韓國公共交通安全準則,如無法承受猛烈撞擊,因此無法在街道上行駛。

本站聲明:網站內容來源於EnergyTrend https://www.energytrend.com.tw/ev/,如有侵權,請聯繫我們,我們將及時處理

【其他文章推薦】

※自行創業缺乏曝光? 網頁設計幫您第一時間規劃公司的形象門面

網頁設計一頭霧水該從何著手呢? 台北網頁設計公司幫您輕鬆架站!

※想知道最厲害的網頁設計公司"嚨底家"!

※幫你省時又省力,新北清潔一流服務好口碑

※別再煩惱如何寫文案,掌握八大原則!

※產品缺大量曝光嗎?你需要的是一流包裝設計!

Domain Adaptive Faster R-CNN:經典域自適應目標檢測算法,解決現實中痛點,代碼開源 | CVPR2018

論文從理論的角度出發,對目標檢測的域自適應問題進行了深入的研究,基於H-divergence的對抗訓練提出了DA Faster R-CNN,從圖片級和實例級兩種角度進行域對齊,並且加入一致性正則化來學習域不變的RPN。從實驗來看,論文的方法十分有效,這是一個很符合實際需求的研究,能解決現實中場景多樣,訓練數據標註有限的情況。

來源:曉飛的算法工程筆記 公眾號

論文: Domain Adaptive Faster R-CNN for Object Detection in the Wild

  • 論文地址:https://arxiv.org/pdf/1803.03243.pdf
  • 論文代碼:https://github.com/yuhuayc/da-faster-rcnn

Introduction

  目前,目標檢測算法在公開數據上有很好的表現,但在現實世界環境中通常會有許多特殊的挑戰,比如視角、物體外觀、背景、光照以及圖片質量的不同,使得測試數據和訓練數據存在較大的跨偏移問題。

  以自動駕駛為例,不同的公開數據集里的圖片存在較大的差異,域偏移問題會導致明顯的檢測器性能下降。儘管收集更多的訓練圖片能解決域偏移的影響,但顯然這不是最好的方案。
  為了解決上面的問題,論文提出Domain Adaptive Faster R-CNN,最小化圖片級別域偏移(圖片尺寸、圖片風格、光照等)以及實例級域偏移(目標外表、目標尺寸等),每個模塊學習一個域分類器並且通過對抗訓練學習域不變的特徵,並且加入分類器的一致性正則化來保證RPN學習到域不變的proposal。
  論文的主要貢獻如下:

  • 從概率角度對跨域目標檢測中的域偏移問題進行理論分析。
  • 設計了兩個域自適應模塊來消除圖片級別和實例級別的域差異。
  • 提出一致性正則化來學習域不變RPN。
  • 將提出的模塊集成到Faster R-CNN中,進行端到端的訓練。

Distribution Alignment with H-divergence

  論文設計了H-divergence度量兩個不同分佈的樣本集,定義$x$為特徵向量,$x_{\mathcal{S}}$為源域樣本$x_{\mathcal{T}}$為目標域樣本,$h:x\to {0,1}$為域分類器,預測源域樣本$x_{\mathcal{S}}$為0,預測目標域樣本$x_{\mathcal{T}}$為1。假設$\mathcal{H}$為一組域分類器,則H-divergence的定義為:

  $err_{\mathcal{S}}$和$err_{\mathcal{T}}$為$h(x)$在源域和目標域樣本的預測誤差,上述的公式意味着域距離$d_{\mathcal{H}}(\mathcal{S},\mathcal{T})$與域分類器的錯誤率成反比,若最好的域分類器的錯誤率越高,則源域和目標域的距離越近。
  在神經網絡中,定義網絡$f$產生特徵向量$x$,為了進行域對齊,需要網絡$f$產生能夠減小域距離$d_{\mathcal{H}}(\mathcal{S},\mathcal{T})$的特徵向量,即最小化公式:

  上述的公式可以通過對抗訓練進行優化,論文採用gradient reverse
layer(GRL)進行實現,訓練主幹特徵最大化域分類誤差並且訓練域分類器最小域分類誤差進行對抗訓練,最終得出魯棒的特徵。

Domain Adaptation for Object Detection

A Probabilistic Perspective

  目標檢測問題可表示為後驗概率$P(C, B|I)$,$I$為圖片,$B$為目標的bbox,$C\in {1,\cdots,K}$為目標類別。定義目標檢測的樣本的聯合分佈為$P(C,B,I)$,其中源域和目標域的分佈是不一樣的$P_{\mathcal{S}}(C,B,I) \neq P_{\mathcal{T}}(C,B,I)$

  • Image-Level Adaptation

  根據貝恭弘=叶 恭弘斯公式,目標檢測的聯合分佈可定義為

  定義目標檢測為covariate shift假設,設定域間的條件概率$P(C, B|I)$是一樣的,域分佈偏移主要來自於$P(I)$分佈的不同。在Faster R-CNN中,$P(I)$即從圖片提取的特徵,所以要解決域偏移問題,就要控制$P_{\mathcal{S}}(I)=P_{\mathcal{T}}(I)$,保證不同域的圖片提取的特徵一致。

  • Instance-Level Adaptation

  另一方面,目標檢測的聯合分佈也可以定義為

  基於covariate shift假設,設定域間的條件概率$P(C|B,I)$是一樣的,域分佈偏移主要來自於$P(B,I)$分佈的不同,而$P(B,I)$即圖像中bbox區域特徵,所以為了解決域偏移問題,需要控制$P_{\mathcal{S}}(B,I)=P_{\mathcal{T}}(B,I)$,保證不同域的圖片提取的相同目標的bbox特徵不變。
  需要注意的是,目標域是沒有標註信息的,只能通過$P(B,I)=P(B|I)P(I)$獲取,$P(B|I)$為bbox預測器,這樣就需要RPN具備域不變性,為此,論文再添加了Joint Adaptation。

  • Joint Adaptation

  考慮到$P(B,I)=P(B|I)P(I)$,而分佈$P(B|I)$是域不變且非零的,因此有

  若域間的圖片級特徵的分佈是一樣的,實例級特徵的分佈也應該是一樣的。但實際中很難達到完美的$P(B|I)$,首先$P(I)$分佈很難完美地對齊,導致$P(B|I)$的輸入有偏,其次bbox是從源域學習而來的,會存在一定地偏差。
  為此,論文使用一致性正則化來消除$P(B|I)$的偏置,使用域分類器$h(x)$來進行源域和目標域的判斷。定義域標籤為$D$,圖像級分類器可看為預測$P(D|I)$,實例級的分類器可看為預測$P(D|B,I)$。根據貝恭弘=叶 恭弘斯理論,得到

  其中,$P(B|I)$是域不變的bbox預測器,而$P(B|D,I)$為域相關的bbox預測器。由於目標域沒有標註的bbox,所以實際僅學習到域相關的bbox預測器$P(B|D,I)$。但可以通過強制兩種分類器的一致性$P(D|B,I)=P(D|I)$,使得$P(B|D,I)$逼近$P(B|I)$。

Domain Adaptation Components

  DA Faster R-CNN的架構如圖2所示,包含兩個域自適應模塊以及一致性正則化模塊,自適應模塊加入GRL(gradient reverse layer)進行對抗訓練,每個模塊包含一個域分類器,最終的損失函數為

  • Image-Level Adaptation

  為了消除圖片級域分佈不匹配,使用patch-based域分類器對特徵圖的每個特徵點進行分類,每個特徵點實際對應原圖的一片區域$I_i$,這樣特徵點域分類器就等同於預測了每個圖像中每個patch的域標籤,這樣的好處在於:

  • 圖片級表達的對齊通常能有助於消除整圖帶來的偏移。
  • 由於目標檢測算法的batch size通常很小,path-based能夠提高域分類器的訓練樣本數。

  定義$D_i$為第$i$個訓練圖片的域標籤,$\phi_{u,v}(I_i)$為特徵圖上的一個激活值,$p^{(u,v)}_i$為域分類器的一個輸出,則圖片級自適應損失為

  為了對齊域分佈,需要同時優化域分類器最小化域分類損失以及優化主幹網絡的參數最大化域分類損失進行對抗訓練,論文採用GRL進行實現,使用梯度下降來訓練域分類器,回傳梯度給主幹時將梯度置為反符號。

  • Instance-Level Adaptation

  實例級特徵對齊有助於減少實例的局部差異,比如外表,大小,視角等。跟圖片級特徵對齊類似,定義$p_{i,j}$為第$i$個圖片的第$j$個proposal,實例級的自適應損失為

  同樣的,在域分類器前添加GRL模塊進行對抗訓練。

  • Consistency Regularization

  如前面的分析,強制域分類器的一致性有助於學習魯棒的跨域bbox預測器,加入一致性正則化。由於圖片級域分類器是對特徵值進行分類的,取平均輸出作為圖片級概率,一致性正則化為

  其中$|I|$為特徵圖的點數,$||\cdot||$為$\mathcal{l}_2$距離。

Experiments

Learning from Synthetic Data

  SIM 10k是從GTAV中截取畫面進行標註的數據集,Cityscapes為真實圖片,這裏對比從生成圖片到真實圖片的域轉移。

Driving in Adverse Weather

  Foggy Cityscapes通過生成霧來模擬真實場景,這裏對比天氣帶來的域轉移。

Cross Camera Adaptation

  這裏對比兩個不同的訓練數據集的域對齊。

Error Analysis on Top Ranked Detections

  每個模塊都能提升一定的準確率,而圖片級對齊的背景錯誤率較高,這可能由於圖片級對齊對RPN的提升更直接。

Image-level v.s. Instance-level Alignment

Consistency Regularization

CONCLUSION

  論文從理論的角度出發,對目標檢測的域自適應問題進行了深入的研究,基於H-divergence的對抗訓練提出了DA Faster R-CNN,從圖片級和實例級兩種角度進行域對齊,並且加入一致性正則化來學習域不變的RPN。從實驗來看,論文的方法十分有效,這是一個很符合實際需求的研究,能解決現實中場景多樣,訓練數據標註有限的情況。



如果本文對你有幫助,麻煩點個贊或在看唄~
更多內容請關注 微信公眾號【曉飛的算法工程筆記】

本站聲明:網站內容來源於博客園,如有侵權,請聯繫我們,我們將及時處理

【其他文章推薦】

※帶您來了解什麼是 USB CONNECTOR  ?

※自行創業缺乏曝光? 網頁設計幫您第一時間規劃公司的形象門面

※如何讓商品強力曝光呢? 網頁設計公司幫您建置最吸引人的網站,提高曝光率!

※綠能、環保無空污,成為電動車最新代名詞,目前市場使用率逐漸普及化

※廣告預算用在刀口上,台北網頁設計公司幫您達到更多曝光效益

※教你寫出一流的銷售文案?

Golang簡易入門教程——面向對象篇

本文始發於個人公眾號:TechFlow,原創不易,求個關注

今天是golang專題的第9篇文章,我們一起來看看golang當中的面向對象的部分。

在現在高級語言當中,面向對象幾乎是不可或缺也是一門語言最重要的部分之一。golang作為一門剛剛誕生十年的新興語言自然是支持面向對象的,但是golang當中面向對象的概念和特性與我們之前熟悉的大部分語言都不盡相同。比如Java、Python等,相比之下, golang這個部分的設計非常得簡潔和優雅(仁者見仁),所以即使你之前沒有系統地了解過面向對象,也沒有關係,也一定能夠看懂。

常見的面向對象的部分,比如繼承、構造函數、析構函數,這些內容在golang當中統統沒有,因此整體的學習成本和其他的語言比起來會更低一些。

struct

在golang當中沒有類的概念,代替的是結構體(struct)這個概念。我們可以給結構體類型定義方法,為了表明該方法的適用對象是當前結構體,我們需要在方法當中定義接收者,位於func關鍵字和方法名之間。

我們一起來看一個例子:

type Point struct {
 x int
 y int
}

func (p Point) Dis() float64 {
 return math.Sqrt(float64(p.x*p.x + p.y*p.y))
}

在上面這段代碼當中我們定義了一個叫做Point的結構體,以及一個面向這個結構體的方法Dis。我們一個一個來看它們的語法。

對於結構體來說,我們通過type關鍵字定義。在golang當中type關鍵字的含義是定義一個新的類型。比如我們也可以這樣使用type:

type Integer int

它的含義是從int類型定義了一個新的類型Integer,從此之後我們可以在後序的代碼當中使用Integer來代替int。它有些類似於C++當中的typedef,結合這個含義,我們再來看結構體的定義就很好理解了。其實是我們通過struct關鍵字構造了一個結構體,然後使用type關鍵字定義成了一個類型。

之後我們創建了一個面向結構體Point的函數Dis,這個函數和我們之前使用的函數看起來並沒有太多的不同,唯一的區別在於我們在func和函數名之間多了一個(p Point)的定義。這其實是定義這個函數的接收者,也就是說它接受一個結構體的調用。

不僅如此,我們可以給golang當中的任何類型添加方法,比如:

type Integer int

func (a Integer) Less(b Integer) bool {
 return a < b
}

在這個例子當中,我們給原生的int類型添加了Less這個方法,用來比較大小。我們在添加方法之前使用type給int起了一個別名,這是因為golang不允許給簡單的內置類型添加方法,並且接收者的類型定義和方法聲明必須在同一個包里,我們必須要使用type關鍵字臨時定義一個新的類型。這裏要注意的是,雖然我們定義出來的Integer和int的功能完全一樣,但是它們屬於不同的類型,不能互相賦值。

和別的語言比較起來,這樣的定義的一個好處就是清晰。舉個例子,比如在Java當中,同樣的功能會寫成不同的樣子:

class Integer {
    private int val;
    public boolean less(Integer b) {
        return this.val < b.val;
    }
}

對於初學者而言,可能會覺得困惑,less函數當中的這個this究竟是哪裡來的?其實這是因為Java的成員方法當中隱藏了this這個參數,這一點在Python當中要稍稍清晰一些,因為它將self參數明確地寫了出來:

class Integer:
    def __init__(self, val):
        self.val = val
    def less(self, val):
        return self.val < val.val

而golang明確了結構體函數的接收者以及參數,顯得更加清晰。

指針接收者

golang當中,我們也可以將函數的接收者定義成指針類型

比如我們可以將剛才的函數寫成這樣:

type Point struct {
 x int
 y int
}

func (p *Point) Dis() float64 {
 return math.Sqrt(float64(p.x*p.x + p.y*p.y))
}

指針接收者和類型接收者在使用上是一樣的,我們並不需要將結構體轉化成指針類型,可以直接進行調用。golang內部會自己完成這個轉化:

func main() {
 p := Point{3, 4}
 fmt.Print(p.Dis())
}

那麼這兩者的區別是什麼呢?我們既然可以定義成普通的結構體對象,為什麼還要有一個指針對象的接收者呢?

其實很好理解, 兩者的區別有些類似於C++當中的值傳遞和引用傳遞。在值傳遞當中,我們傳遞的是值的一個拷貝,我們在函數當中修改參數並不會影響函數外的結果。而引用傳遞則不然,傳遞的是參數的引用,我們在函數內部修改它的話,會影響函數外的值。

也就是說在golang當中,如果我們函數接收的是一個指針類型,我們可以在函數內部修改這個結構體的值。否則的話,傳入的是一個拷貝,我們在其中修改值並不會影響它本身。我們來看個例子:

func (p *Point) Modify() {
 p.x += 5
 p.y -= 3
}

func main() {
 p := Point{3, 4}
 p.Modify()
 fmt.Print(p)
}

上面這段代碼當中函數的接收者是一個指針,所以我們得到的結果會是{8, 1},如果我們把指針去掉,改成普通的值接收的話,那麼最後的結果仍然是{3, 4}。

總結

我們今天學的內容有些多,我們來簡單梳理一下。首先,我們了解了通過type和struct關鍵字來定義一個結構體,結構體是golang當中面向對象的載體,golang拋棄了傳統的面向對象的實現方式和特性,擁有自己的面向對象的理念。

對於結構體來說,我們可以把它當做是接受者傳遞給一個函數,使得我們可以以類似調用類當中方法的形式來調用一個函數。並且對於函數而言,接受者除了值以外還可以是一個指針。如果是指針的話,當我們對結構體值進行修改的時候,會影響到原值。即使我們定義的接收者類型是指針,我們在調用的時候也不必显示將它轉化成結構體指針,golang當中會自動替我們完成這樣的轉化。

面向對象部分可以說是golang這一門語言當中最大的創新之一,也正是因為拋棄了傳統的類以及繼承、派生的概念,使得golang當中的面向對象語法糖相對簡潔。也因此有人將golang稱為升級版的C語言。雖然我們啰啰嗦嗦寫了很多,但是實際談到的內容並不多,我想理解起來也不會特別困難。

今天的文章到這裏就結束了,如果喜歡本文,可以的話,請點個關注,給我一點鼓勵,也方便獲取更多文章。

本文使用 mdnice 排版

本站聲明:網站內容來源於博客園,如有侵權,請聯繫我們,我們將及時處理

【其他文章推薦】

※為什麼 USB CONNECTOR 是電子產業重要的元件?

網頁設計一頭霧水該從何著手呢? 台北網頁設計公司幫您輕鬆架站!

※台北網頁設計公司全省服務真心推薦

※想知道最厲害的網頁設計公司"嚨底家"!

新北清潔公司,居家、辦公、裝潢細清專業服務

※推薦評價好的iphone維修中心

有趣的條漫版 HashMap,25歲大爺都能看懂

我是風箏,公眾號「古時的風箏」,一個兼具深度與廣度的程序員鼓勵師,一個本打算寫詩卻寫起了代碼的田園碼農!
文章會收錄在 JavaNewBee 中,更有 Java 後端知識圖譜,從小白到大牛要走的路都在裏面。回復「666」有高清學習路線圖。

因為寫文章的過程中畫了不少的圖,所以,我想,能不能用長圖的形式展現一次呢,結果圖片熬夜做了半天,最後出來的效果不是很好,哎,審美缺失吧。之後會有詳細的文字源碼解析版放出,敬請各位看官關注。

在 Java 中,最常用的數據類型是 8 中基本類型以及他們的包裝類型以及字符串類型,其次應該就是 ArrayList和HashMap了吧。HashMap存的是鍵值對類型的數據,其存儲和獲取的速度快、性能高,是非常好用的一個數據結構,每一個 Java 開發者都肯定用過它。

而且 HashMap的設計巧妙,其結構和原理也經常被拿去當做面試題。其中有很多巧妙的算法和設計,比如 Hash 算法、拉鏈法、紅黑樹設計等,值得每一個開發者借鑒學習。

先來看一下整個 Map家族的集成關係圖,一看東西還不少,但其他的可能都沒怎麼用過,只有 HashMap 最熟悉。

壯士且慢,先給點個贊吧,總是被白嫖,身體吃不消!

我是風箏,公眾號「古時的風箏」。一個兼具深度與廣度的程序員鼓勵師,一個本打算寫詩卻寫起了代碼的田園碼農!你可選擇現在就關注我,或者看看歷史文章再關注也不遲。

本站聲明:網站內容來源於博客園,如有侵權,請聯繫我們,我們將及時處理

【其他文章推薦】

網頁設計一頭霧水該從何著手呢? 台北網頁設計公司幫您輕鬆架站!

網頁設計公司推薦不同的風格,搶佔消費者視覺第一線

※想知道購買電動車哪裡補助最多?台中電動車補助資訊懶人包彙整

南投搬家公司費用,距離,噸數怎麼算?達人教你簡易估價知識!

※教你寫出一流的銷售文案?

※超省錢租車方案

008.OpenShift Metric應用

一 METRICS子系統組件

1.1 metric架構介紹


OpenShift metric子系統支持捕獲和長期存儲OpenShift集群的性能度量,收集節點以及節點中運行的所有容器的指標。



metric子系統被由以下開源項目的容器組件構成:

  • Heapster


從Kubernetes集群中的所有節點收集指標,並將其轉發給存儲引擎進行長期存儲。OCP使用Hawkular作為Heapster的存儲引擎。

Heapster項目是由Kubernetes社區孵化的,目的是為第三方應用程序提供一種從Kubernetes集群捕獲性能數據的方法。

  • Hawkular Metrics


提供用於存儲和查詢時間序列數據的REST API。Hawkular Metrics組件是更大的Hawkular項目的一部分。Hawkular Metrics使用Cassandra作為其數據存儲。

Hawkular是作為RHQ項目(Red Hat JBoss Operations Network product)的繼承者創建的,是Red Hat CloudForms產品中間件管理功能的一個關鍵部分。

  • Hawkular Agent


從應用程序收集自定義性能指標,並將其轉發到Hawkular Metrics進行存儲。應用程序為Hawkular agent提供度量標準。

Hawkular OpenShift Agent (HOSA)目前是一個技術預覽功能,默認情況下沒有安裝,Red Hat不支持技術預覽功能,也不建議將其用於生產。

  • Cassandra


將時間序列數據存儲在非關係分佈式數據庫中。

OpenShift Metrics子系統獨立於其他OpenShift組件工作。OpenShift只有三個部分需要metrics子系統來提供一些可選特性:

  • web控制台調用Hawkular Metrics API來獲取數據,以呈現項目中pod的性能圖形。如果沒有部署度量子系統,則不显示圖表。


注意,這些調用是從用戶web瀏覽器發出的,而不是從OpenShift主節點發出的。

  • oc adm top命令使用Heapster API來獲取關於集群中所有pod和節點的當前狀態的數據。
  • Kubernetes的autoscaler控制器調用Heapster API來從部署中獲取關於所有pod當前狀態的數據,以便決定如何伸縮部署控制器。


OCP並不強制一定部署完整的度量子系統,如果已經有一個監視系統,並且希望使用它來管理OpenShift集群,那麼可以選擇只部署Heapster組件,並將度量的長期存儲委託給外部監視系統。

如果現有的監視系統只提供警報和健康功能,那麼監視系統可以使用Hawkular API捕獲指標來生成警報。

Heapster收集節點及其容器的指標,然後聚合pod、namespace和整個集群的指標。

Heapster為一個節點收集的指標包括:

working set:節點中運行的所有進程有效使用的內存,以bytes為單位度量。

CPU usage:節點中運行的所有進程使用的CPU數量,以millicores單位度量,十個millicores相當於一個CPU繁忙時間的1%。

Heapster還支持對內存中保留的指標進行簡單查詢,這些查詢允許獲取在特定時間範圍內收集和聚合的度量。

1.2 訪問Heapster和Hawkular


OpenShift用戶需要區分聲明的資源請求(和限制)與實際的資源使用情況。pod聲明的資源請求用於調度,聲明的資源請求從節點容量中減去,其差值是節點的剩餘可用容量。

節點的可用容量不反映在節點內運行的容器和其他應用程序使用的實際內存和CPU。

oc describe node命令,在OCP 3.9中,只显示與pods聲明的資源請求相關的信息。如果pod沒有聲明任何資源請求,則不會考慮pod的實際資源使用情況,節點的可用容量可能看起來比實際容量大。

web控制台显示的信息與oc describe node命令相同,還可以显示Hawkular Metrics的實際資源使用情況。但是,OCP 3.9的web控制台只显示pod和項目的指標,web控制台不显示節點指標。

要獲得節點的實際資源使用情況,並確定節點是否接近其全部硬件或虛擬容量,系統管理員需要使用oc adm top命令。如果需要更詳細的信息,系統管理員可以使用標準的Linux命令,比如vmstat和ps。

OpenShift不向集群外部公開Heapster組件。外部應用程序需要訪問Heapster必須使用OpenShift master API代理。master API代理確保對內部組件API的訪問遵從OpenShift集群身份驗證和訪問控制策略。

將Hawkular暴露給外部訪問涉及到一些安全方面的考慮。如果系統管理員認為使用Heapster和Hawkular api過於複雜,那麼Origin和Kubernetes開源項目的上游社區還提供了與Nagios和Zabbix等流行的開源監控工具的集成,或者當前最火熱的Prometheus。

1.3 Metrics subsystem大小


OpenShift度量子系統的每個組件都使用自己的dc進行部署,並且獨立於其他組件進行伸縮。它們可以計劃在OpenShift集群的任何地方運行,但是建議為生產環境中的metrics子系統pod特定保留一些node0。

Cassandra和Hawkular是Java應用程序。Hawkular運行在JBoss EAP 7應用服務器中。Hawkular和Cassandra都利用了大規模的優勢,默認值是為中小型OpenShift集群設置的大小。測試環境可能需要更改默認值,以減少內存和CPU資源。

Heapster和Hawkular部署使用標準的OpenShift工具部署size、比例和調度。少量Heapster和Hawkular pods可以管理數百個OpenShift節點和數千個項目的指標。

可以使用oc命令配置Heapster和Hawkular部署。例如增加每個pod請求的副本數量或資源數量,但是推薦的配置參數的方法是修改為安裝Metrics的Ansible劇本中的變量。

Cassandra不能使用標準oc命令進行伸縮和配置,因為Cassandra(大多數數據庫都是這樣)不是無狀態雲應用程序。Cassandra有嚴格的存儲要求,每個Cassandra pod都有不同的部署配置。必須使用Metrics安裝playbook來伸縮和配置Cassandra部署。

1.4 CASSANDRA配置持久存儲


Cassandra可以部署為單個pod,使用一個持久卷。但至少需要三個Cassandra pod才能為度量子系統實現高可用性(HA)。每個pod都需要一個獨佔卷:Cassandra使用“無共享”存儲架構。

儘管Cassandra可以使用enptyDir存儲進行部署,但這意味着存在永久數據丟失的風險。通常生產環境不推薦使用臨時存儲(即emptyDir卷類型)。

每個Cassandra卷使用的存儲量不僅取決於預期的集群大小(節點和pod的數量),還取決於度量的時間序列的粒度和持續時間。

Metrics安裝劇本支持使用靜態供應的持久卷或動態卷。無論選擇哪種方法,playbook都基於前綴創建持久卷聲明,前綴後面附加一個序列號。對於靜態供應的持久卷,請確保使用相同的命名約定。

二 METRICS子系統

2.1 部署metrics子系統


OpenShift Metrics子系統由Ansible playbook部署,可以選擇使用基本playbook或單獨用於Metrics的playbook進行部署。

大多數Metrics子系統配置是使用用於高級安裝方法的Inventory文件中的Ansible變量執行的。儘管可以使用-e選項覆蓋或自定義某些變量的值,更建議在Inventory中定義metrics變量。如果需要更改度量Metrics配置,可更新Inventory中的變量並重新運行安裝劇本。

metrics子系統在許多生產環境中不需要認定配置,可直接通過運行metrics安裝劇本使用默認設置安裝。

示例:Ansible結合主配置文件和Metrics子系統playbook安裝。

Ansible主配置文件如下:

  1 [defaults]
  2 remote_user = student
  3 inventory = ./inventory
  4 log_path = ./ansible.log
  5 [privilege_escalation]
  6 become = yes
  7 become_user = root
  8 become_method = sudo
  9 Metrics子系統劇本:
 10 # ansible-playbook \
 11 /usr/share/ansible/openshift-ansible/playbooks

/openshift-metrics/config.yml \

-e openshift_metrics_install_metrics=True

提示:OpenShift metrics劇本由openshift-ansibl -playbooks包提供,該包是作為atom-openshift-utils包的依賴項安裝的。

openshift_metrics_install_metrics Ansible變量配置劇本用來部署metrics子系統,playbook為metrics子系統創建dc、service和其他支撐metrics的Kubernetes資源,還可以在用於部署集群的Inventory文件中定義該變量。

metrics子系統安裝playbook會在openshift-infra項目中創建所需Kubernetes資源。安裝playbook不配置任何節點選擇器來限制pod所運行的node。

2.2 卸載metrics子系統


卸載OpenShift metrics子系統的一種方法是手動刪除OpenShift-infra項目中的所有Kubernetes資源。通常需要多個oc命令,且容易出錯,因為其他OpenShift子系統也被部署到這個項目。

卸載metrics子系統的推薦方法是運行安裝劇本,但是將openshift_metrics_install_metrics Ansible變量設置為False,如下面的示例所示,-e選項覆蓋庫存文件中定義的值。

  1  # ansible-playbook \
  2 /usr/share/ansible/openshift-ansible/playbooks/openshift-metrics/config.yml \
  3 -e openshift_metrics_install_metrics=False


2.3 驗證metrics子系統


OpenShift metrics子系統playbook完成后,應該創建所有Cassandra、Hawkular和Heapster pod,並可能需要一些時間進行初始化。可能由於Cassandra pod初始化時間過長,會重新啟動Hawkular和Heapster pod。

除非另外配置,否則安裝程序劇本應該為每個組件創建一個dc,其中包含一個pod,並且openshift-infra項目的oc get pod能显示相應pod。

2.4 部署metrics子系統常見錯誤


造成部署錯誤的常見原因通常有:

  • image缺失;
  • metrics所需資源過高,節點無法滿足;
  • Cassandra pod所需的持久卷無法滿足。

2.5 其他配置


在所有pod準備好並運行之後,需要執行一個特定配置以便於和web對接。如果跳過此步驟,OpenShift web控制台將無法显示項目的metrics圖形,儘管底層metrics子系統正在正常工作。

OpenShift web控制台是一個JavaScript應用程序,它直接訪問Hawkular API,而不需要經過OpenShift master service。

但由於內部使用TLS訪問API,默認情況下,TLS證書不是由受信任的認證機構簽署的。因此web瀏覽器拒絕連接到Hawkular API endpoint。

在OpenShift安裝之後,web控制台本身也會出現類似證書不信任的問題。與metrics同樣的方式解決,配置瀏覽器接受TLS證書。為此,在web瀏覽器中打開Hawkular API歡迎頁面,並接受不受信任的TLS證書。

https://hawkular-metrics.<master-wildcard-domain>

主通配符域DNS後綴應該與OpenShift主服務中配置的後綴相同,並用作新路由的默認域。

playbook從Ansible hosts文件中獲取主通配符域值,由openshift_master_default_subdomain變量定義。如果更改了OpenShift master service配置,則它們將不匹配。在本例中,為metrics劇本中的openshift_metrics_hawkular_hostname變量提供新值。2.6

2.6 metrics涉及變量


OCP安裝和配置文檔提供了metrics安裝劇本使用的所有可能變量的列表,它們控制着各種配置參數。常見有:

每個組件的pod比例:

  • openshift_metrics_cassandra_replicas
  • openshift_metrics_hawkular_replicas


每個組件對pod的資源請求和限制:

  • openshift_metrics_cassandra_requests_memory
  • openshift_metrics_cassandra_limits_memory
  • openshift_metrics_cassandra_requests_cpu
  • openshift_metrics_cassandra_limits_cpu


對於Hawkular和Heapster,有類似配置:

  • openshift_metrics_hawkular_requests_memory
  • openshift_metrics_heapster_requests_memory


用於duration和resolution參數:

  • openshift_metrics_duration
  • openshift_metrics_resolution


Cassandra pods的持久卷聲明屬性:

  • openshift_metrics_cassandra_storage_type
  • openshift_metrics_cassandra_pvc_prefix
  • openshift_metrics_cassandra_pvc_size


用於pull metrics子系統容器image的倉庫:

  • openshift_metrics_image_prefix
  • openshift_metrics_image_version


其他配置參考:

  • openshift_metrics_heapster_standalone
  • openshift_metrics_hawkular_hostname


示例1:使用自定義配置安裝metrics子系統,用於覆蓋Inventory中定義的Cassandra配置。

  1 [OSEv3:vars]
  2 ...output omitted...
  3 openshift_metrics_cassandra_replicas=2
  4 openshift_metrics_cassandra_requests_memory=2Gi
  5 openshift_metrics_cassandra_pvc_size=50Gi



示例2:使用自定義配置,用於覆蓋Cassandra定義的屬性。

  1 # ansible-playbook \
  2 /usr/share/ansible/openshift-ansible/playbooks/openshift-metrics/config.yml \
  3 -e openshift_metrics_cassandra_replicas=3 \
  4 -e openshift_metrics_cassandra_requests_memory=4Gi \
  5 -e openshift_metrics_cassandra_pvc_size=25Gi



提示:大多數配置參數都可以使用OpenShift oc命令進行更改,但是推薦的方法是使用更新Inventory中變量值運行metrics安裝劇本進行修改。

三 安裝metrics子系統

3.1 前置準備


準備完整的OpenShift集群,參考《003.OpenShift網絡》2.1。

3.2 本練習準備

  1 [student@workstation ~]$ lab install-metrics setup

3.3 驗證image

  1 [student@workstation ~]$ docker-registry-cli registry.lab.example.com \
  2 search metrics-cassandra ssl
  3 [student@workstation ~]$ docker-registry-cli registry.lab.example.com \
  4 search ose-recycler ssl


3.4 驗證NFS

  1 [root@services ~]# ll -aZ /exports/metrics/
  2 drwxrwxrwx. nfsnobody nfsnobody unconfined_u:object_r:default_t:s0 .
  3 drwxr-xr-x. root      root      unconfined_u:object_r:default_t:s0 ..
  4 [root@services ~]# cat /etc/exports.d/openshift-ansible.exports




3.5 創建PV

  1 [student@workstation ~]$ cat /home/student/DO280/labs/install-metrics/metrics-pv.yml
  2 apiVersion: v1
  3 kind: PersistentVolume
  4 metadata:
  5   name: metrics
  6 spec:
  7   capacity:
  8     storage: 5Gi			#定義capacity.storage容量為5G
  9   accessModes:
 10   - ReadWriteOnce			#定義訪問模式
 11   nfs:
 12     path: /exports/metrics		#定義nfs.path
 13     server: services.lab.example.com	#定義nfs.services
 14   persistentVolumeReclaimPolicy: Recycl	#定義回收策略


  1 [student@workstation ~]$ oc login -u admin -p redhat https://master.lab.example.com
  2 [student@workstation ~]$ oc create -f /home/student/DO280/labs/install-metrics/metrics-pv.yml
  3 [student@workstation ~]$ oc get pv
  4 NAME        CAPACITY    ACCESS MODES    RECLAIM POLICY    STATUS    CLAIM    STORAGECLASS    REASON    AGE
  5 metrics     Gi          RWO             Recycle           Available                                    14s


3.6 規劃安裝變量


openshift_metrics_image_prefix:指向服務VM上的私有倉庫,並添加openshift3/ose-作為映像名稱前綴。

openshift_metrics_image_version:要使用的容器image標記,私有倉庫為image添加一個v3.9標記。

openshift_metrics_heapster_requests_memory:本環境配置300mb內存。

openshift_metrics_hawkular_requests_memory:本環境配置750mb內存。

openshift_metrics_cassandra_requests_memory:本環境配置750mb內存。

openshift_metrics_cassandra_storage_type:使用pv選擇一個持久卷作為存儲類型。

openshift_metrics_cassandra_pvc_size:本環境配置5gib容量。

openshift_metrics_cassandra_pvc_prefix:使用metrics作為pvc名稱的前綴.

提示:生產環境中建議根據實際規劃進行配置,可適當調大配置規格。

3.7 配置安裝變量

  1 [student@workstation ~]$ cd /home/student/DO280/labs/install-metrics
  2 [student@workstation install-metrics]$ cat metrics-vars.txt
  3 # Metrics Variables
  4 # Append the variables to the [OSEv3:vars] group
  5 openshift_metrics_install_metrics=True
  6 openshift_metrics_image_prefix=registry.lab.example.com/openshift3/ose-
  7 openshift_metrics_image_version=v3.9
  8 openshift_metrics_heapster_requests_memory=300M
  9 openshift_metrics_hawkular_requests_memory=750M
 10 openshift_metrics_cassandra_requests_memory=750M
 11 openshift_metrics_cassandra_storage_type=pv
 12 openshift_metrics_cassandra_pvc_size=5Gi
 13 openshift_metrics_cassandra_pvc_prefix=metrics
 14 [student@workstation install-metrics]$ cat metrics-vars.txt >> inventory
 15 [student@workstation install-metrics]$ lab install-metrics grade		#本環境使用腳本判斷配置


3.8 執行安裝

  1 [student@workstation install-metrics]$ ansible-playbook /usr/share/ansible/openshift-ansible/playbooks/openshift-metrics/config.yml



3.9 驗證安裝

  1 [student@workstation install-metrics]$ oc get pvc -n openshift-infra		#驗證持久卷是否成功掛載
  2 NAME        STATUS    VOLUME    CAPACITY   ACCESS MODES   STORAGECLASS   AGE
  3 metrics-1   Bound     metrics   5Gi        RWO                           5m
  4 [student@workstation install-metrics]$ oc get pod -n openshift-infra		#驗證metric相關pod
  5 NAME                         READY     STATUS    RESTARTS   AGE
  6 hawkular-cassandra-1-6k7fr   1/1       Running   0          5m
  7 hawkular-metrics-z9v85       1/1       Running   0          5m
  8 heapster-mbdcl               1/1       Running   0          5m
  9 [student@workstation install-metrics]$ oc get route -n openshift-infra		#查看metric route地址
 10 NAME                HOST/PORT                                PATH    SERVICES            PORT    TERMINATION    WILDCARD
 11 hawkular-metrics   hawkular-metrics.apps.lab.example.com             hawkular-metrics    <all>   reencrypt
 12 None



瀏覽器訪問:

https://hawkular-metrics.apps.lab.example.com



提示:瀏覽器信任SSL證書。

3.10 部署測試應用

  1 [student@workstation ~]$ oc login -u developer -p redhat \
  2 https://master.lab.example.com				#登錄OpenShift
  3 [student@workstation ~]$ oc new-project load		#創建project
  4 [student@workstation ~]$ oc new-app --name=hello \
  5 --docker-image=registry.lab.example.com/openshift/hello-openshift	#部署應用
  6 [student@workstation ~]$ oc scale --replicas=9 dc/hello			#擴展應用
  7 [student@workstation ~]$ oc get pod -o wide				#查看pod
  8 NAME            READY     STATUS    RESTARTS   AGE       IP            NODE
  9 hello-1-4nvfd   1/1       Running   0          1m        10.129.0.40   node2.lab.example.com
 10 hello-1-c9f8t   1/1       Running   0          1m        10.128.0.22   node1.lab.example.com
 11 hello-1-dfczg   1/1       Running   0          1m        10.128.0.23   node1.lab.example.com
 12 hello-1-dvdx2   1/1       Running   0          1m        10.129.0.36   node2.lab.example.com
 13 hello-1-f6rsl   1/1       Running   0          1m        10.128.0.20   node1.lab.example.com
 14 hello-1-m2hb4   1/1       Running   0          1m        10.129.0.39   node2.lab.example.com
 15 hello-1-r64z9   1/1       Running   0          1m        10.128.0.21   node1.lab.example.com
 16 hello-1-tf4l5   1/1       Running   0          1m        10.129.0.37   node2.lab.example.com
 17 hello-1-wl6zx   1/1       Running   0          1m        10.129.0.38   node2.lab.example.com
 18 [student@workstation ~]$ oc expose svc hello


3.11 壓力測試

  1 [student@workstation ~]$ sudo yum -y install httpd-tools
  2 [student@workstation ~]$ ab -n 300000 -c 20 http://hello-load.apps.lab.example.com/


3.12 查看資源使用情況

  1 [student@workstation ~]$ oc login -u admin -p redhat
  2 [student@workstation ~]$ oc adm top node \
  3 --heapster-namespace=openshift-infra \
  4 --heapster-scheme=https
  5 NAME                     CPU(cores)   CPU%      MEMORY(bytes)   MEMORY%
  6 master.lab.example.com   273m         13%       1271Mi          73%
  7 node1.lab.example.com    1685m        84%       3130Mi          40%
  8 node2.lab.example.com    1037m        51%       477Mi           6%



提示:保持3.11的壓測程序,重開終端進行查看。

3.13 獲取指標

  1 [student@workstation ~]$ cat ~/DO280/labs/install-metrics/node-metrics.sh	#使用此腳本獲取指標



  1 [student@workstation ~]$ ./DO280/labs/install-metrics/node-metrics.sh




瀏覽器訪問:https://master.lab.example.com

查看相關性能監控。


本站聲明:網站內容來源於博客園,如有侵權,請聯繫我們,我們將及時處理

【其他文章推薦】

網頁設計一頭霧水該從何著手呢? 台北網頁設計公司幫您輕鬆架站!

網頁設計公司推薦不同的風格,搶佔消費者視覺第一線

※Google地圖已可更新顯示潭子電動車充電站設置地點!!

※廣告預算用在刀口上,台北網頁設計公司幫您達到更多曝光效益

※別再煩惱如何寫文案,掌握八大原則!

網頁設計最專業,超強功能平台可客製化