開這輛車出去半條街的人都盯着看!滿足虛榮心的神器

Ghibli車上有多達13處的儲物空間,足夠日常使用。後備廂的空間有523L以上,足夠一家人出行使用。給Ghibli提供動力的是一台縱置的V6雙渦輪增壓發動機,最大馬力是350匹,最大扭矩是500牛·米。匹配的是一台8AT的變速箱。經過實測,Ghibli的百公里加速時間為6。

當天拍攝瑪莎拉蒂Ghibli的時候,有一位老人家過來跟我們聊了兩句

“這車挺漂亮的,值多少錢?”

“你猜猜”

“150到160萬吧”

“沒有啦,才110萬多。”

為什麼要把這個真實事件放在開頭呢?

因為真正要買的人看完就已經下單了。

下面就是你們的車輛說明書。

一款轎跑的外形不會差到哪兒去,更何況,這是一台瑪莎拉蒂的轎跑。亞平寧半島的設計師用迷人的曲線來描繪Ghibli的車身,而車頭上則配上了最兇悍的進氣格柵和大燈,將優雅與暴力這對二律背反的元素有機地結合在一台Ghibli身上。Ghibli的車身側面充滿着性能車的特徵。修長的車頭,是為了裝下大排量高性能的發動機;溜背的造型,是為了減少風阻。Ghibli的風阻係數僅為0.29,極低極低。

Ghibli定位是一款中大型車,同時,作為一款轎跑,Ghibli的尺寸當然比不上專為國人加長的5系等中大型車。這個尺寸正好能完成4門轎跑定位所賦予它的任務。

作為一款豪華車,Ghibli的做工自然對得起自己的身價。Ghibli的漆面非常厚,而且漆面平整,显示出良好的工藝水平。

Ghibli的內飾就稍顯四平八穩,對稱式的內飾設計讓內飾看上去莊重些。Ghibli的內飾採用了真皮+木紋飾板的組合,觸感溫潤,視覺感官豪華。儀錶盤採用經典的机械轉表+液晶显示屏的組合。時速的机械轉表表底高達310km/h,轉速的紅線區去到6500轉左右。8.4英寸的中控屏幕显示效果清晰,加入carplay后,功能更加完善,更加貼合時代。

Ghibli的座椅明顯是更注重支撐性的,座椅的填充物比較硬,坐墊和靠背兩側都有巨大的側面支撐,靠背與坐墊中央部分。後排中央為了留位置給四驅系統,所以地台高高聳起。既然你選擇了Ghibli,那當然選擇接受它啦。

Ghibli的乘坐空間不算大,以173cm的身高為例,前排頭部空間有四指,後排的頭部空間一拳,腿部空間一拳四指。

Ghibli車上有多達13處的儲物空間,足夠日常使用。後備廂的空間有523L以上,足夠一家人出行使用。

給Ghibli提供動力的是一台縱置的V6雙渦輪增壓發動機,最大馬力是350匹,最大扭矩是500牛·米。匹配的是一台8AT的變速箱。

經過實測,Ghibli的百公里加速時間為6.1秒。這個成績與官方5秒的成績有所出入。這是因為當天廣州高溫天氣導致的,不具有普遍性。

這套V6雙渦輪增壓發動機+8AT變速箱組成的動力系統可謂是天衣無縫。這套動力系統有三種邏輯,一是節能模式,二是普通模式,三是運動模式。節能模式下,整車的響應比較慢,油門的寬容度很大,需要稍微踩深一些才會給你反應。普通模式的油門響應就很快了,隨踩隨有,而且油門比較線性,踩多少就給多少力。運動模式的油門響應跟普通模式的區別不大,運動模式最大的區別就是變速箱邏輯。這時候的變速箱會更願意保持在低擋位,將發動機的轉速維持在較高的區間,以確保你需要動力的時候,能夠立刻給你最大的加速度。

Ghibli的底盤極限要比動力系統還高。Ghibli前後都採用了雙叉臂獨立懸挂的形式,底盤的高度比一般轎車還要低上一點點。豪華版的前輪胎寬是245mm,後輪胎寬是275mm。所以底盤的表現非常穩健,過彎的時候完全沒有察覺出一絲側滑,車身的側傾也非常小。

Ghibli的舒適性並不突出,這跟運動的定位有關。座椅是以支撐性為第一設計目標,偏硬的坐感註定了與舒適無緣。無框車門雖然帥,但是到了舒適性這一步,就成了缺點。還有那台雙渦輪增壓發動機帶來綿綿不絕的吼叫聲。所有這些要素都決定了Ghibli不會那麼舒適,但是,你真的在乎嗎?

毫無疑問,瑪莎拉蒂Ghibli的長處就在於強勁的動力和穩健的底盤。這兩項的組合可以讓你享受到暢快淋漓的駕駛感受。當然,性價比也是瑪莎拉蒂Ghibli的長處,花了110萬,有150萬的效果,這性價比也是沒誰了。所以,下面這個評分表,不看也罷。

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

【其他文章推薦】

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

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

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

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

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

17萬起一款空間超大、一款配置驚人,多數人都會糾結這兩款

內飾上,蒙迪歐採用三輻式方向盤,背後還有換擋撥片,儀錶台是傳統的指針式轉速、速度表。金牛座則與奧迪A6L一樣,用四輻方向盤襯托其成熟穩重風格,儀錶台上雙彩色行車電腦显示信息詳細,旋鈕式換擋現在算不上新奇了,國內大部分電動車都在使用。

長安福特蒙迪歐,一直都是中型車中炙手可熱的車型,曾與阿特茲、凱美瑞斗得難捨難分;當你要出手了,卻殺出一台金牛座,這個時候問題來了,需要在運動與穩重之間取捨,很難!家人說要大台,金牛座有C級車的空間水平!朋友說要運動帥氣,蒙迪歐大“馬丁臉”、雙十輻鋁合金輪圈。選擇困難的人很絕望,I want to die!

來幫你分析一下吧,找到適合你的“卟卟車”。哈哈哈!

蒙迪歐延續福特標誌性家族化設計語言,並且通過時尚、動感的高顏值展現出來,鯊魚鰭天線,小尾翼等細節對提升車輛運動質感起很好的作用。

金牛座作為福特全尺寸旗艦級轎車,功能、配置、空間直逼德系豪華車,前臉依舊是“馬丁臉”,但是相比蒙迪歐確實收斂了很多,反而展現出商務的高貴氣質。

在尺寸方面,金牛座完爆蒙迪歐,虐得不像“車型”,畢竟是全尺寸旗艦級轎車。

內飾上,蒙迪歐採用三輻式方向盤,背後還有換擋撥片,儀錶台是傳統的指針式轉速、速度表。金牛座則與奧迪A6L一樣,用四輻方向盤襯托其成熟穩重風格,儀錶台上雙彩色行車電腦显示信息詳細,旋鈕式換擋現在算不上新奇了,國內大部分電動車都在使用。總的來說兩車內飾設計均是扁平、簡約,中規中矩。

單單從動力數據上來看,兩者沒有差距,但是蒙迪歐動力選擇更加靈活,另外,相同的動力,推動這兩台車,顯然更輕的蒙迪歐推重比更高,動力響應性更好。

雖然價位相近,但是配置方面真的天差地別,典型的做雞頭,選鳳尾問題。蒙迪歐高配的安全配置更高,輔助功能也齊全,按摩座椅也逆天出現了。

另外,金牛座之所以銷量不如蒙迪歐,原因是定價偏高,很多配置與蒙迪歐重疊,或者更遜色,市場整體走年輕運動的路線,明顯金牛座定位稍稍偏離主線。做雞頭,還是選鳳尾,是買車的必經之路。原因就是只有有限的資金,買不到完美的車,這個時候就要按個人氣質或需求來選擇了,就例如很少年輕人買克萊斯勒300C吧,沒有人買轎車越野一樣。那麼這兩台車定位不同,認為心還沒能靜下來和需要高配置的就選蒙迪歐吧,心緒沉澱下來了和需要氣場大、空間大就選金牛座。還是那句話,適合自己的才是最好的!本站聲明:網站內容來源於http://www.auto6s.com/,如有侵權,請聯繫我們,我們將及時處理

【其他文章推薦】

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

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

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

※超省錢租車方案

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

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

這5款帥爆的車,多花6、7萬你都覺得不虧?

由於奧迪A5 Coupe的車身線條都偏硬朗,所以它很難體現出Coupe那種優雅,更像一款雙門的大型“小鋼炮”。奧迪A5有一款叫哥特蘭綠的專屬車漆,象徵著“復古騎士”,其實還是挺有味道的。從奧迪A4L的名字我們就可以看出,奧迪A4實現國產時並沒有保留標軸版,所以奧迪A5 Coupe的軸距要比國產奧迪A4L的短。

有許多走高端路線的汽車品牌,為了建立豐富的汽車產品線,基於同一個車型平台往往能衍生出轎跑版、三廂版或旅行版等車型,通過這些車型的差異取向,去滿足不同消費者的個性需求。我們通過對這些車型的特性分析,發現他們的最大差異在於外觀、實用性和售價。

通過這樣的大致分析,我們就可以理解到為什麼傳統的三廂車是銷量最大,因為它的特性很均衡,而且受眾廣,在實現國產的情況下,價格也有很大優勢。不過我們今天的話題是那些很炫酷但又不是太實用,而且賣得很貴的轎跑車型,也就是我們常說的Coupe。

如果問Coupe車型最值錢的地方在於哪裡?我認為是車身側面,一般情況下,Coupe車型與同平台的三廂車型往往在底盤架構和動力總成方面是一致的,最大的區別在於Coupe車型是雙門的,由於是雙門設計,後排空間受到了很大限制,而且後排只能設定兩個座位,乘坐空間也非常拘束,但是也因為由四門變成了雙門,車身側面的美感上升了不止一個層次,而且都是無框車門,這種姿態上的進化,就是Coupe車型的價值所在,這也就是我們所說的“顏值即正義”。

那麼這些Cuope車型到底要比三廂車貴多少呢?又帥了多少呢?我們通過幾款熱門的車型分析一波。

奔馳C級/C級Coupe

首先第一款Coupe車型是奔馳的C級,由於進口版本的奔馳C級Coupe並沒有1.6T動力的版本,最低配置為C 200,指導價38.08萬,相對於同動力同配置(配置接近)的北京奔馳C 200運動版,指導價為31.28萬,兩車差價6.8萬,這6.8萬多了什麼?

外觀方面,C級Coupe的前臉配有星輝大標中網,側面與三廂版一樣是採用雙腰線的設計,但是由於少了兩個門,而且車身高度也更低,所以側面看起來的效果非常優雅;而尾部的設計也有所不同,更小的后風擋,扁平式的尾燈樣式,更簡潔的尾箱蓋設計,都使得C級Coupe的尾部具有更寬大的視覺效果。

尺寸方面,C級Coupe的軸距和C級三廂標軸版的保持一致,這也象徵著它們源自同一平台。但這不意味着它們有相同的空間表現,如果是170cm以上的人,就不要考慮坐進後排了,實在太難受。

內飾樣式也基本保持一致,不過根據車主反映,C級Coupe的內飾會更具質感,畢竟是進口車型,一些用料和做工還是比較優越。

進口的C級Coupe除了沒有1.6T的動力外,2.0T的高低功率版與國產C級保持一致,只是在調校方面有小小差異,但基本感覺不出來。

寶馬3系/4系 Coupe

其實現在的4系Coupe就是過去的3系轎跑版,只是現在獨立出來了,現款寶馬430i M運動套裝版指導價為52.59萬,而國產的華晨寶馬330i M運動曜夜版指導價為45.20萬,兩車差價7.39萬。看上去還好,實際上現在華晨寶馬330i的優惠幅度非常大。

首先4系Coupe由於“雙腎”和“天使眼大燈”的設計跟3系有一點點差異,加上下進氣格柵也比3系更扁平,所以整個前臉都是更扁平的;側面的確也比3系更拉風,但是實際上3系的側面也是非常協調和優美的;尾部除了尾燈的設計有一點點不同,其他的差距並不大。值得一提的是4系有一款專屬的“海岸藍”車漆。

尺寸方面,寶馬4系coupe的軸距與3系標軸版的保持一致,但車身高度也是更低,所以造型當然更拉風。

內飾不要說出自同平台的車了,對於寶馬來說,3系和7系的內飾風格就一個樣。上圖方向盤的樣式不同主要是因為基本版和運動版的差別。

由於寶馬4系Coupe為進口車型,所以也沒有配備1.5T的動力,不過卻多了一個3.0T的動力,但又跟M4的3.0T不一樣,功率比M4的要更低。

奧迪A4L/奧迪A5 Coupe

現款奧迪A5 Coupe 40 TFSI時尚型指導價39.80萬(看似很便宜,實際聽說要加價),而對應的現款國產奧迪A4L 30周年年型 40 TFSI 時尚型指導價為34.57萬(現優惠幅度還不錯,應該有4萬左右),兩車差價5.23萬(所以實際差價應該上10萬,具體以4S店為準)。

相對於奧迪A4L,奧迪A5 Coupe的前臉也有所不同,大燈樣式更簡潔凌厲,六邊形的進氣格柵更扁平,整個前臉也是更扁平的風格;而側面的腰線呈“大波浪”的走勢;尾燈的設計則更運動。由於奧迪A5 Coupe的車身線條都偏硬朗,所以它很難體現出Coupe那種優雅,更像一款雙門的大型“小鋼炮”…?奧迪A5有一款叫哥特蘭綠的專屬車漆,象徵著“復古騎士”,其實還是挺有味道的。

從奧迪A4L的名字我們就可以看出,奧迪A4實現國產時並沒有保留標軸版,所以奧迪A5 Coupe的軸距要比國產奧迪A4L的短。

內飾風格兩個幾乎保持一致,基本也就材質或配置的小小差異。不得不說奧迪內飾的科技感或高級感真非常強。

動力方面,奧迪A5 Coupe除了有沒配備1.4T的動力,2.0T的高低功率版也與國產的奧迪A4L保持一致;如果你要更強的動力,那就要上奧迪S5,甚至奧迪RS5了。

英菲尼迪Q50L/Q60 Coupe

最新款的英菲尼迪Q60 2.0T豪華版指導價為38.98萬,而相同動力,配置接近的最新款英菲尼迪Q50L 2.0T豪華版的指導價為36.98萬(現有5萬左右的優惠幅度),兩車差價2萬元,就指導價來看,差距的確非常小。

要說英菲尼迪Q60 Coupe與英菲尼迪Q50L在外觀上的差距,無論是整體還是細節都有所體現,更大尺寸的中網、更精緻的大燈和尾燈造型、更具動感的C柱設計,整體外觀更寬、更扁。對於英菲尼迪的Q60 Coupe,可以說是以上車型中最動感或最性感的一款了,車身那些流暢且優美的曲線可以說是把Coupe那種美感展現得淋漓盡致。

由於英菲尼迪Q50實現國產時也沒有保留標軸版,所以Q60 Coupe的軸距是和進口版,沒加長的Q50保持一致。

內飾風格兩車也是一個樣,但材質方面應該也有一點點不一樣,或者說座椅的設計不同,Q60的座椅會更偏向運動風格。對於這兩款偏向運動的車型來說,這套內飾並沒有很激進,而是通過大面積的皮質營造比較豪華的氛圍。

動力方面,現款Q60隻有一個動力可選,也就是和Q50L一樣2.0T。但Q60在海外有3.0T的版本,如果你對動力有比較高的追求,就只能選擇平行進口了,但那樣的價格當然也貴得離譜吧。

雷克薩斯IS/RC

其實雷克薩斯RC與以上所有的Coupe都不同,它是出自跑車平台的純種跑車。但是,由於雷克薩斯RC的調節和設定都非常偏向於豪華和舒適,就連排氣聲浪也是模擬出來的,而且它也是跟雷克薩斯IS共享同一套動力總成,所以經常會被誤以為是雷克薩斯IS的Coupe車型。

那麼作為一款跑車,獨立的平台,價格當然會很貴,最受歡迎的200t F SpORT版本指導價為52.80萬,而現款雷克薩斯IS 300 F SpORT版的指導價為36.90萬,由於兩款都是進口車型,所以基本都沒什麼優惠,兩車差價15.9萬。畢竟RC是跑車嘛…可以理解。

由於出自不同的平台,所以軸距也是不同的。而整個外觀造型,比起IS,雷克薩斯RC更長,更寬,更矮,那當然也更帥咯。

同為F SpORT版本,那源自LFA的“机械式液晶”是必不可少的,兩車內飾風格基本保持一致,但細心的朋友就會發現,其實還是有所不同的,就在中央空調出風口下方的中控面板,IS是陷進去的,而RC是揚出來的。還有就是擋桿後面,RC配有一個小型“手寫板”。

動力總成是共享的,講道理,RC比IS少了兩個門,那就應該更輕,也跑得更快。但事實並非如此,同是F SpORT版本,RC的整備質量要重一點點,RC的官方百公里加速為7.5秒,而IS的官方百公里加速為7秒。

總結

最後,通過上述車型對比,如果不考慮終端優惠,其實那些進口的Coupe車型也沒有我們想象中那麼貴,也只不過比同級三廂車型貴個5、6、7萬。至於實用性,你也別指望它們的後排有什麼驚喜了,總之,1米7以上的乘客“免進”後排。其實對於中國市場而言,說後排不重要的人只是少數,但說顏值不重要的人更是少數,那麼對於顏值、後排、價格,你會怎麼選?本站聲明:網站內容來源於http://www.auto6s.com/,如有侵權,請聯繫我們,我們將及時處理

【其他文章推薦】

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

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

※超省錢租車方案

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

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

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

奔馳又一輛大嗓門,將推AMG GT S Roadster,3.8秒破百!

0L V8雙渦輪汽油發動機,能爆發出最大功率522馬力,峰值扭矩670牛·米,傳動系統匹配7速雙離合變速箱,百公里加速性能方面能去到3。8秒,極速高達309km/h。又是一輛貼心為你省下買吹風筒的汽車。都知道梅賽德斯-AMG GT非常迅猛兇惡,它最初的研發目標就是衝著保時捷911而來,無論在跑車市場亦或是各種賽事當中。

梅賽德斯-AMG又來新車了,這回是AMG GT S車型新增了Roadster(敞篷版)版本,官方於近日發布了最新的車型官圖,新車上市后,其定位將介於AMG GT Roadster以及AMG GT C Roadster車型之間。其中,新車還搭載了4.0L V8雙渦輪汽油發動機,最大功率高達522馬力,與AMG GT S硬頂版車型保持一致的強悍性能。

外觀方面,最大的不同就是將硬頂更換為黑色軟頂敞篷,前保險杠的左右兩側進氣口以及翼子板散熱口的內部鍍鉻飾條更換為啞光黑色,且左右兩隻外后視鏡和AMG輪轂均採用為黑色設計,其目的是為了與靚黃色車身配色和剎車卡鉗形成撞色衝擊,增強跑車在外觀上的視覺撞擊感。對於這樣的玩樂型跑車,此設定無可厚非,相信也會討好許多富家公子們的歡心。

內飾部分,Roadster版本相比硬頂版本的變化不多,主要的變化在中控擋把操作區域,將原本的大面積鋼琴烤漆材質更換為鍍鉻材質,空調出風口也由原來的鋼琴烤漆加鍍鉻雙層邊框,統一更換為鍍鉻邊框,極大地提升了車廂戰鬥氣氛,且車廂內隨處可見的縫線顏色也變為黃色,與外觀的主題色形成呼應。

車身尾部方面的變化則更加具有質感,不僅取消了硬頂版車型在下保險桿底部的橫向鍍鉻飾條,且在可升降尾翼部分新增了一處剎車光源,進一步提升對後車的安全距離警示,畢竟AMG來者不善。

動力方面,新車延續了硬頂版AMG GT S車型的動力系統,搭載4.0L V8雙渦輪汽油發動機,能爆發出最大功率522馬力,峰值扭矩670牛·米,傳動系統匹配7速雙離合變速箱,百公里加速性能方面能去到3.8秒,極速高達309km/h。又是一輛貼心為你省下買吹風筒的汽車。

都知道梅賽德斯-AMG GT非常迅猛兇惡,它最初的研發目標就是衝著保時捷911而來,無論在跑車市場亦或是各種賽事當中。有趣的是,在两天前剛結束的2018紐伯格林24小時耐力賽的頒獎台上,兩台梅賽德斯-AMG GT3賽車左右“陪伴”保時捷911 GT3 R登頂,儘管這並不能說明兩款車之間的性能差異,但後者這回免費做了波廣告,而梅賽德斯AMG GT則默默地發布了此新車官圖,有冤家的戲顯然更加有趣。

與保時捷911一樣,梅賽德斯-AMG GT的全系產品還是非常完善,從476馬力到585馬力,無論是“過日子”還是賽道控都能找到對應合適的車型,而此次推出Roadster(敞篷版),更是進一步完善產品線。當然對於這級別的消費者講,同價位同配置這樣的選購對比壓根沒有意義,還不如關心一回,這台AMG GT S Roadster版本,除了在賽道意外,還能滿足我們怎樣的想象力呢?

要不你提提意見試試看?本站聲明:網站內容來源於http://www.auto6s.com/,如有侵權,請聯繫我們,我們將及時處理

【其他文章推薦】

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

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

※回頭車貨運收費標準

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

※超省錢租車方案

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

最低10多萬,開上這6款車,老同學都說我成了大老闆?

5s,提速時可謂是又快又順,高速再加速也不會有底氣不足的情況。說起商務車,恐怕就不得不提邁騰。儘管外形變得年輕化了不少,整個前臉設計就像一位西裝革履的年輕人,既有朝氣,又不失嚴肅。側麵線條修長,看上去較為舒展,尾部鍍鉻雙出排氣口較為有精緻感。

俗話說:“先敬羅衣后敬人”,意思就是先看一個人的着裝再看一個人的內涵。因此,那些做銷售的人,大多都是西裝革履的樣子外出洽談。同時,談生意難免需要一輛靠譜的交通工具。

就20萬左右這個區間而言,可選的車型還是比較多的。無論是選擇轎車,還是選擇SUV,最重要的一點就是外形足夠端莊,不能給人一種花哨的感覺。下面這6款車就挺適合用來商務洽談的。

BX7的外形設計簡約為主,瀑布式的中網格柵大氣耐看,大燈與中網相連的設計,更好地展現出了設計的一體感,霧燈處的鍍鉻裝飾條實屬畫龍點睛之筆。側面五輻式輪圈頗有高級感,尾部設計簡潔大氣。

BX7的2.0T+6AT調校得頗為平順,低速蠕行時的動作較為自然,深踩油門時的降擋也爽脆不含糊。即使是在高速時再加速,BX7也不會有底氣不足的情況。應對顛簸路面時,雖然BX7的左右晃動稍微多了一些,但是濾震還是足夠厚實的。

柯迪亞克的前臉同樣是採用了豎條形的鍍鉻裝飾條設計,儘管面積沒有BX7那麼大,但是裝飾條看上去更為精緻。大燈的造型頗為嚴肅,與進氣格柵相連的設計,較為有一體感。側麵線條平直,不規則的尾燈設計蠻有特點,隱藏式的排氣足夠簡潔。

柯迪亞克的2.0T低功版車型配的是7擋雙離合變速箱,開起來的感覺還是頗為舒爽的。低速蠕行時的頓挫控製得還算可以,零百成績也能去到8.5s左右。底盤是偏歐洲化的調校,過濾震動時較為有韌性。

冠道是這幾款SUV中尺寸最魁梧的,前臉典型的“大齙牙”設計,鍍鉻裝飾條十分粗壯,長條形的大燈炯炯有神。翼子板上的三個鍍鉻裝飾孔,頗有運動感。鍍鉻裝飾條連接兩尾燈,帶出較好的一體感。

很多人會對冠道的1.5T發動機有所質疑,覺得它的動力帶這麼大一台車會不會很“肉”。實際上,大家都多慮了。1.5T冠道的零百實測成績約為8.5s,提速時可謂是又快又順,高速再加速也不會有底氣不足的情況。

說起商務車,恐怕就不得不提邁騰。儘管外形變得年輕化了不少,整個前臉設計就像一位西裝革履的年輕人,既有朝氣,又不失嚴肅。側麵線條修長,看上去較為舒展,尾部鍍鉻雙出排氣口較為有精緻感。

大眾在調校雙離合變速箱方面走過一些彎路,現在出來的效果已經不太令人擔心。1.4T車型採用的是DQ200的七速乾式雙離合,而1.8T和2.0T則是用DQ380的濕式雙離合,從耐久性出發,還是選1.8T或2.0T車型比較好。

金牛座大嘴式的六邊形中網,無論遠看還是近看,都顯得相當霸氣。發動機艙上拱起的兩條“肌肉線”讓前臉更有中心感。側麵線條平直,門板下方的鍍鉻裝飾條起到畫龍點睛的作用。尾部設計飽滿,雙邊鍍鉻排氣口也較為常見。

金牛座入門的1.5T+6AT整體響應不錯,輕輕踩一下油門就能有相當不錯的動力輸出。整體的動力輸出偏向於前段,稍微深踩一點就能馬上降擋來提供加速度。不過上到高速時,它的動力也是僅僅夠用而已。

君威在年輕化的道路上同樣幹得不錯,瀑布式的黑色中網格柵加上飛翼式的標誌相當帥氣。側麵線條凹凸有致,輪圈樣式簡約耐看。尾部設計飽滿,雙出鍍鉻排氣口更顯高級感。

1.5T的動力配上9AT的變速箱,在日常駕駛時給人的輕快感頗為充足。齒比設置綿密,所以換擋時的平順性頗高。油門鬆開時,9AT又懂得升擋來提升燃油經濟性。

總結

汽車其實就是一個人的另一張卡片,所以如果經常要出去商務洽談的話,挑選一輛外形端莊的車還是很有必要的。這6款車無論是外形還是動力水平,都令人滿意,所以大家不妨考慮一下。本站聲明:網站內容來源於http://www.auto6s.com/,如有侵權,請聯繫我們,我們將及時處理

【其他文章推薦】

※超省錢租車方案

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

※回頭車貨運收費標準

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

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

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

協議生成器工具

前言

何為協議生成器?其實就是前後端同學在對協議的時候使用的工具,手動添加對應的內容,最後一鍵發布自己需要的任何與協議有關的內容。
有人會說,我直接寫proto文件用它的命令行也可以生成很多文件的。不過proto本身的能力,我工具都可以使用,因為本身工具就可以調用proto。下面開始介紹一下這款附帶源碼的工具
良心價格,買來不一定要用,但是你可以拿來學習這種思想;用什麼語言開並不重要,重要的還是思想;編程編的就是思想,就跟寫文章一樣。

介紹

  1. 文件功能
  2. 定義服務

    可能我門一款遊戲用到好幾個服務,比如登陸服務,大廳獲得道具服務,戰鬥服務。對於棋牌遊戲或者聯網對戰遊戲尤其如此。而這些服務器有的是長連接,有的是短鏈接,有的是proto格式,有的是json格式。在這個工具里都是可以設置的。

  3. 定義協議號

    我們用socket做遊戲的一般定義格式的時候都是協議號+數據長度+數據段。這個很正常,當然http也是可以這樣定義的。比如http://xxx.xxx.com:80/classname/functionname?xxx=cc&xx=xx
    ip+端口,這個跟socket是一樣的。端口之後和問號之前的就可以定義為協議號了,也就是資源路徑。這樣就可以長短鏈接使用同樣的處理方式。

  4. 定義模塊

    我個人喜歡將不同的功能分為不同的模塊。然後在模塊中定義消息。

  5. 定義消息格式

    比如這個商店模塊,在進入商店時需要給服務器發送獲取商品列表的消息。而服務器需要兩個字段。並設置了類型。而工具是支持註釋的,CNName就是了。有請求格式,自然也有返回格式,所以有GetProductInfoResult,並定義了返回的消息格式。

  6. 使用

    xxxHandler代表了一個請求處理。一個處理會有請求消息,響應消息。所以將剛才定義的兩個消息格式,設置到request和response中就可以了。

導出

xml目錄為項目配置文件,export為導出內容目錄

導出的文檔

導出proto的java類

使用lua腳本解析xml文件

結語

工具介紹就這些,希望對有需求的人提供一定的幫助。關鍵還是思想,結合我微店裡的網絡框架一起學習會更快速。
歡迎關注我的公眾號,獲取更多精彩內容。

歡迎掃碼關注公眾號《微笑遊戲》,瀏覽更多內容。

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

【其他文章推薦】

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

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

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

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

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

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

SpringBoot整合Hibernate Validator實現參數驗證功能

  在前後端分離的開發模式中,後端對前端傳入的參數的校驗成了必不可少的一個環節。但是在多參數的情況下,在controller層加上參數驗證,會顯得特別臃腫,並且會有許多的重複代碼。這裏可以引用Hibernate Validator來解決這個問題,直接在實體類進行參數校驗,驗證失敗直接返回錯誤信息給前端,減少controller層的代碼量。

一、pom引入Hibernate Validator

<!-- 驗證器 -->
<dependency>
      <groupId>org.hibernate.validator</groupId>
      <artifactId>hibernate-validator</artifactId>
      <version>6.1.5.Final</version>
</dependency>

 二、通過註解在實體類進行參數校驗

@Data
public class UserModel {

    @NotNull(message = "用戶名稱不能為空!")
    private String userName;

    @NotNull(message = "age不能為null!")
    @Range(min = 1, max = 888, message = "範圍為1至888")
    private Integer age;

    /**
     * 日期格式化轉換
     */
    @NotNull(message = "日期不能為null!")
    private Date date;
}

這裏用到的參數校驗的註解有@NotNull和@Range,message是到時候我們返回給前端的信息,註解的具體意思如下:

@Null  被註釋的元素必須為null
@NotNull  被註釋的元素不能為null
@AssertTrue  被註釋的元素必須為true
@AssertFalse  被註釋的元素必須為false
@Min(value)  被註釋的元素必須是一個数字,其值必須大於等於指定的最小值
@Max(value)  被註釋的元素必須是一個数字,其值必須小於等於指定的最大值
@DecimalMin(value)  被註釋的元素必須是一個数字,其值必須大於等於指定的最小值
@DecimalMax(value)  被註釋的元素必須是一個数字,其值必須小於等於指定的最大值
@Size(max,min)  被註釋的元素的大小必須在指定的範圍內。
@Digits(integer,fraction)  被註釋的元素必須是一個数字,其值必須在可接受的範圍內
@Past  被註釋的元素必須是一個過去的日期
@Future  被註釋的元素必須是一個將來的日期
@Pattern(value) 被註釋的元素必須符合指定的正則表達式。
@Email 被註釋的元素必須是电子郵件地址
@Length 被註釋的字符串的大小必須在指定的範圍內
@NotEmpty  被註釋的字符串必須非空
@Range  被註釋的元素必須在合適的範圍內

 三、controller層的方法加上@Valid註解

@PostMapping("/testPost")
public Object testPost(@RequestBody @Valid UserModel userModel, BindingResult result){
if(result.hasErrors()){
for(ObjectError error:result.getAllErrors()){
return error.getDefaultMessage();
}
}
return userModel;
}

controller層這裏只需要在實體類的前面加上@Valid註解,這個註解可以實現數據的驗證。這裏BindingResult是存儲了校驗時的錯誤信息,驗證有誤時將錯誤信息返回給前端。這裏不使用BindingResult的時候,控制台會報MethodArgumentNotValidException,這裏可以通過自定義異常類來捕捉它,然後去掉BindingResult,以及難看的if判斷。

四、自定義異常類捕捉MethodArgumentNotValidException

@RestControllerAdvice
public class GlobalExceptionAdvice {

    @ExceptionHandler(value = MethodArgumentNotValidException.class)
    public JsonData validException(MethodArgumentNotValidException e) {
        //驗證post請求的參數合法性
        MethodArgumentNotValidException notValidException = e;
        String msg = notValidException.getBindingResult().getFieldError().getDefaultMessage();
        return JsonData.buildError(msg);
    }
}

使用PostMan的測試結果如下:

具體的代碼可以在我的gitee上面查看,springboot_validator

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

【其他文章推薦】

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

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

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

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

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

qemu-guest-agent詳解

qemu guest agent簡稱qga, 是運行在虛擬機內部的一個守護程序(qemu-guest-agent.service),他可以管理應用程序,執行宿主機發出的命令。

QEMU為宿主機和虛擬機提供了一個數據通道(channel,這個通道的兩端分別是在虛擬機內看到的串口和在宿主機上看到的unix socket文件。

   

宿主機與虛擬機內的qga通訊就擴展了對虛擬機的控制能力,例如在宿主機上獲取虛擬機的ip地址等。

   

libvrit提供了專門的 virDomainQemuAgentCommand API對應virsh qemu-agent-command命令)來和qemu-guest-agent通訊,

另外有些libvirt內置api也可以支持qga,例如rebootshutdown等。

   

下面的實踐分為兩種方式,虛擬機的channeltargetname使用org.qemu.guest_agent.0不是用org.qemu.guest_agent.0

兩種方式在libvirt和宿主機中的qemu-guest-agent中都有所不同。

   

【使用org.qemu.guest_agent.0

宿主機上libvirt的虛擬機xml配置channel

<channel type=’unix’>

  <source mode=’bind’ path=’/var/lib/libvirt/qemu/org.qemu.guest_agent.0/>

  <target type=’virtio’ name=‘org.qemu.guest_agent.0’/>

</channel>

   

注意這裏targetname要使用org.qemu.guest_agent.0

   

虛擬機內部:

yum install qemuguestagent

setenforce 0

systemctl restart qemuguestagent.service

   

在宿主機上測試功能:

virsh
virsh # qemu-agent-command centos ‘{“execute”:”guest-info”}’

virsh # qemu-agent-command centos ‘{“execute”:”guest-network-get-interfaces”}’

virsh # reboot –mode agent centos

   

上面的命令直接讀出了虛擬機中的ip地址信息。

   

【不使用org.qemu.guest_agent.0

如果在宿主機上libvirtxml配置channeltargetname不是org.qemu.guest_agent.0,例如下面的org.qemu.guest_agent.1

   

那麼在宿主機上的libvirt將不會建立與socket建立連接。在虛擬機上qemu-guest-agent服務也無法運行。

   

宿主機上的libvirtxml

<channel type=’unix’>

  <source mode=’bind’ path=’/var/lib/libvirt/qemu/org.qemu.guest_agent.1/>

  <target type=’virtio’ name=’org.qemu.guest_agent.1/>

</channel>

   

不使用org.qemu.guest_agent.0的情況下怎麼處理呢?

   

首先,在虛擬機內部通訊串口的名字變為了org.qemu.guest_agent.1,此時需要手動修改/lib/systemd/system/qemu-guest-agent.service文件,把所有的默認org.qemu.guest_agent.0改為用戶配置的名字org.qemu.guest_agent.1

   

其次,在宿主機上自己去連接socket文件:

[root@node2 ~]# socat unix-connect:/var/lib/libvirt/qemu/org.qemu.guest_agent.1 readline

{“execute”: “guest-info”}

   

【功能簡單介紹】

注:帶* 指的是win也支持

guest-sync-delimited*

宿主機發送一個int数字給qgaqga返回這個数字,並且在後續返回字符串響應中加入ascii碼為0xff的字符,
其作用是檢查宿主機與qga通信的同步狀態,主要用在宿主機上多客戶端與qga通信的情況下客戶端間切換過程的狀態同步檢查
比如有兩個客戶端ABqga發送給A的響應,由於A已經退出,目前B連接到qgasocket,所以這個響應可能被B收到,如果B連接到socket之後,立即發送該請求給qga,響應中加入了這個同步碼就能區分是A的響應還是B的響應;
qga返回宿主機客戶端發送的int数字之前,qga返回的所有響應都要忽略。

guest-sync*

與上面相同,只是不在響應中加入0xff字符

guest-ping*

Ping the guest agent, a non-error return implies success

guest-get-time*

獲取虛擬機時間(返回值為相對於1970-01-01 in UTCTime in nanoseconds.

guest-set-time*

設置虛擬機時間(輸入為相對於1970-01-01 in UTCTime in nanoseconds.

guest-info*

返回qga支持的所有命令

guest-shutdown*

關閉虛擬機(支持haltpowerdownreboot,默認動作為powerdown

guest-file-open

打開虛擬機內的某個文件(返迴文件句柄)

guest-file-close

關閉打開的虛擬機內的文件

guest-file-read

根據文件句柄讀取虛擬機內的文件內容(返回base64格式的文件內容)

guest-file-write

根據文件句柄寫入文件內容到虛擬機內的文件

……

  

   

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

【其他文章推薦】

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

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

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

※超省錢租車方案

FB行銷專家,教你從零開始的技巧

gulp壓縮html,css,js文件流程、監聽任務、使用gulp創建服務器、同時運行多個任務、反向代理

一、初始化

首先先做一個項目初始化,用來記錄你項目中用到的工具

再你項目文件下打開一個控制台,輸入命令 yarn init -y 進行初始化

 

輸入命令yarn add gulp -g  — 全局安裝gulp,這裏我提前已經安裝過了就不演示了,然後再輸入命令yarn add gulp -S 局部安裝,都安裝完成過後輸入命令 gulp -v,如果出現兩個版本號,就代表都安裝成功了

 

接着在你的項目文件夾下新建一個文件名為 gulpFile.js js文件,名字必須叫這個,官方規定的,用來寫gulp命令

 

好了,可以開始安裝壓縮工具進行壓縮了

 

 

 二、html壓縮

 

 安裝html壓縮工具,輸入命令 

yarn add gulp-htmlmin -D

安裝壓縮html的工具,安裝到開發環境,生產環境用不到

安裝完成過後打開初始化時生成的文件 package.json,開發環境有沒有你剛安裝的 gulp-htmlmin

 

 

 

 

 

 

 打開開始建的 gulpFile.js 文件,開始寫命令

const gulp = require('gulp') //引入gulp
const htmlmin = require('gulp-htmlmin') //引入html壓縮模塊
const path = { //方便管理路徑
    html: {
        src: 'src/**/*.html',
        dest: 'dist'
    }
}
gulp.task('html', () => { //創建任務,並命名任務名
    /*一個*表示所有文件,兩個*表示所有目錄*/
    return gulp.src(path.html.src) //打開讀取文件
        .pipe(htmlmin({
            removeComments: true, //清除HTML註釋
            collapseWhitespace: true, //壓縮HTML
            collapseBooleanAttributes: true, //省略布爾屬性的值 <input checked="true"/> ==> <input checked />
            removeEmptyAttributes: true, //刪除所有空格作屬性值 <input id="" /> ==> <input />
            removeScriptTypeAttributes: false, //刪除<script>的type="text/javascript"
            removeStyleLinkTypeAttributes: true, //刪除<style>和<link>的type="text/css"
            minifyJS: true, //壓縮頁面JS
            minifyCSS: true //壓縮頁面CSS
        })) //管道流操作,壓縮文件
        .pipe(gulp.dest(path.html.dest)) //指定壓縮文件放置的目錄
})

然後輸入命令

gulp html

執行壓縮

 

 

 像這樣就壓縮成功了

上面是 gulp3 寫法,gulp4 寫法:

const gulp = require('gulp') //引入gulp
const htmlmin = require('gulp-htmlmin') //引入html壓縮模塊
const path = { //方便管理路徑
    html: {
        src: 'src/**/*.html',
        dest: 'dist'
    }
}
const html = () => { //創建任務,並命名任務名
    /*一個*表示所有文件,兩個*表示所有目錄*/
    return gulp.src(path.html.src) //打開讀取文件
        .pipe(htmlmin({
            removeComments: true, //清除HTML註釋
            collapseWhitespace: true, //壓縮HTML
            collapseBooleanAttributes: true, //省略布爾屬性的值 <input checked="true"/> ==> <input checked />
            removeEmptyAttributes: true, //刪除所有空格作屬性值 <input id="" /> ==> <input />
            removeScriptTypeAttributes: false, //刪除<script>的type="text/javascript"
            removeStyleLinkTypeAttributes: true, //刪除<style>和<link>的type="text/css"
            minifyJS: true, //壓縮頁面JS
            minifyCSS: true //壓縮頁面CSS
        })) //管道流操作,壓縮文件
        .pipe(gulp.dest(path.html.dest)) //指定壓縮文件放置的目錄
}

module.exports = { //一定要以對象形式導出
    html
}

三、css壓縮

安裝css壓縮模塊,輸入命令

yarn add gulp-clean-css -D

 

 

 然後也在gulpFile.js文件里寫壓縮css的命令

const gulp = require('gulp') //引入gulp
const htmlmin = require('gulp-htmlmin') //引入html壓縮模塊
const cleanCss = require('gulp-clean-css') //引入css壓縮模塊
const path = { //方便管理路徑
    /*一個*表示所有文件,兩個*表示所有目錄*/
    html: {
        src: 'src/**/*.html',
        dest: 'dist'
    },
    css: {
        src: 'src/**/*.css',
        dest: 'dist'
    }
}

gulp.task('css', () => {
    return gulp.src(path.css.src)
        .pipe(cleanCss())
        .pipe(gulp.dest(path.css.dest))
})

輸入命令 gulp css 命令執行

 

 

 另外css還有一個很好用的模塊,它可以自動給需要兼容的css屬性加前綴,輸入命令安裝它

yarn add gulp-autoprefixer -D

安裝好了,引入模塊,調用即可

四、js壓縮

安裝js es6語法轉es5語法模塊,壓縮js模塊,輸入命令

yarn add -D gulp-babel @babel/core @babel/preset-env //es6語法轉es5
yarn add -D gulp-uglify //壓縮js

 

 

 同樣的打開 gulpFile.js 文件寫壓縮js的命令

const gulp = require('gulp') //引入gulp
const htmlmin = require('gulp-htmlmin') //引入html壓縮模塊
const cleanCss = require('gulp-clean-css') //引入css壓縮模塊
const autoprefixer = require('gulp-autoprefixer') //引入加前綴模塊
const babel = require('gulp-babel'), //引入es6轉es5模塊
    uglify = require('gulp-uglify') //引入js壓縮模塊
const path = { //方便管理路徑
    /*一個*表示所有文件,兩個*表示所有目錄*/
    html: {
        src: 'src/**/*.html',
        dest: 'dist'
    },
    css: {
        src: 'src/**/*.css',
        dest: 'dist'
    },
    js: {
        src: 'src/**/*.js',
        dest: 'dist'
    }
}
gulp.task('js', () => {
    gulp.src(path.js.src)
        .pipe(babel({
            presets: ['@babel/env'] //es6轉es5
        }))
        .pipe(uglify()) //執行壓縮
        .pipe(gulp.dest(path.js.dest))
})

輸入命令 gulp js 運行

五、監聽任務

監聽任務需要使用gulp4的寫法

const gulp = require('gulp') //引入gulp
const htmlmin = require('gulp-htmlmin') //引入html壓縮模塊
const cleanCss = require('gulp-clean-css') //引入css壓縮模塊
const autoprefixer = require('gulp-autoprefixer') //引入加前綴模塊
const babel = require('gulp-babel'), //引入es6轉es5模塊
    uglify = require('gulp-uglify') //引入js壓縮模塊
const path = { //方便管理路徑
    /*一個*表示所有文件,兩個*表示所有目錄*/
    html: {
        src: 'src/**/*.html',
        dest: 'dist'
    },
    css: {
        src: 'src/**/*.css',
        dest: 'dist'
    },
    js: {
        src: 'src/**/*.js',
        dest: 'dist'
    }
}



const css = () => {
    return gulp.src(path.css.src)
        .pipe(autoprefixer())
        .pipe(cleanCss())
        .pipe(gulp.dest(path.css.dest))
}
const js = () => {
    return gulp.src(path.js.src)
        .pipe(babel({
            presets: ['@babel/env'] //es6轉es5
        }))
        .pipe(uglify()) //執行壓縮
        .pipe(gulp.dest(path.js.dest))
}

const html = () => { //創建任務,並命名任務名
    return gulp.src(path.html.src) //打開讀取文件
        .pipe(htmlmin({
            removeComments: true, //清除HTML註釋
            collapseWhitespace: true, //壓縮HTML
            collapseBooleanAttributes: true, //省略布爾屬性的值 <input checked="true"/> ==> <input checked />
            removeEmptyAttributes: true, //刪除所有空格作屬性值 <input id="" /> ==> <input />
            removeScriptTypeAttributes: false, //刪除<script>的type="text/javascript"
            removeStyleLinkTypeAttributes: true, //刪除<style>和<link>的type="text/css"
            minifyJS: true, //壓縮頁面JS
            minifyCSS: true //壓縮頁面CSS
        })) //管道流操作,壓縮文件
        .pipe(gulp.dest(path.html.dest)) //指定壓縮文件放置的目錄
}
const watch = () => { //監聽文件,文件改變執行對應的任務
    gulp.watch(path.html.src, html)
    gulp.watch(path.css.src, css)
    gulp.watch(path.js.src, js)
}

module.exports = {
    html,
    js,
    css,
    watch
}

輸入命令 gulp watch 即可實現監聽

六、gulp創建服務器

輸入命令

yarn add gulp-connect -D

引入模塊

const connect = require('gulp-connect')

創建服務器

const server = () => {
    connect.server({ //創建服務器
        root: 'dist',//根目錄
        port: '2000',//端口號
        livereload:true//服務器熱更新
    })
}

導出模塊

module.exports = {
    html,
    js,
    css,
    watch,
    server
}

輸入命令 gulp server 就可以運行了

如果想直接打開首頁,可以輸入命令安裝open模塊

yarn add open -S

然後再任何位置寫入你想打開的網址

open('http://127.0.0.1:2000')

還有一個模塊也可以創建服務器

輸入命令安裝

yarn add gulp-webServer -D

 

 引入模塊

const    webserver = require('gulp-webserver')

創建服務器

const createServer = () => {
    return gulp.src('./dist')
        .pipe(webserver({ //創建服務器
            port:'3000', //端口號
            open:'/html', //默認打開路徑
            livereload:true //熱更新
        }))
}

七、同時運行多個任務

// 默認任務:default 我們可以把所有任務都放進default
// series 同步執行,先執行刪除dist任務,再執行其他任務
// parallel 異步執行(并行),不會互相影響的任務可以并行
module.exports.default = gulp.series(gulp.parallel(html,js,css,watch,server))

運行只需要寫 gulp 命令

如果想頁面實時更新的話,再想實時更新的任務後面加上

.pipe(connect.reload())

然後重啟服務器就ok了

八、反向代理

輸入命令

yarn add http-proxy-middleware -D

 

 引入模塊

const proxy = require('http-proxy-middleware')

創建反向代理

connect 創建的服務器要用函數創建代理

const server = () => {
    connect.server({ //創建服務器
        root: 'dist', //根目錄
        port: '2000', //端口號
        livereload: true, //服務器熱更新
        middleware: () => {
            return [
                proxy.createProxyMiddleware('/api', { //創建反向代理,請求已 /api 開頭就使用target的服務器
                    target: 'http://localhost',//需要代理的服務器
                    changeOrigin: true
                })
            ]
        }

    })
}

 webserver創建的服務器要用數組創建代理

const createServer = () => {
    return gulp.src('./dist')
        .pipe(webserver({ //創建服務器
            port: '3000', //端口號
            open: '/html', //默認打開路徑
            livereload: true, //熱更新
            middleware: [
                proxy.createProxyMiddleware('/api', { //創建反向代理,請求已 /api 開頭就使用target的服務器
                    target: 'http://localhost',
                    changeOrigin: true
                })
            ]
        }))
}

 

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

【其他文章推薦】

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

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

※超省錢租車方案

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

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

科學計算:Python 分析數據找問題,並圖形化

對於記錄的數據,如何用 Python 進行分析、或圖形化呢?

本文將介紹 numpy, matplotlib, pandas, scipy 幾個包,進行數據分析、與圖形化。

準備環境

Python 環境建議用 Anaconda 發行版,下載地址:

  • 官方: https://www.anaconda.com/products/individual#Downloads
  • 清華源: https://mirrors.tuna.tsinghua.edu.cn/anaconda/archive/

Anaconda 是一個用於科學計算的 Python 發行版,已經包含了眾多流行的科學計算、數據分析的 Python 包。

可以 conda list 列出已有的包,會發現本文要介紹的幾個包都有了:

$ conda list | grep numpy
numpy                     1.17.2           py37h99e6662_0

$ conda list | grep "matplot\|seaborn\|plotly"
matplotlib                3.1.1            py37h54f8f79_0
seaborn                   0.9.0                    py37_0

$ conda list | grep "pandas\|scipy"
pandas                    0.25.1           py37h0a44026_0
scipy                     1.3.1            py37h1410ff5_0

如果已有 Python 環境,那麼 pip 安裝一下它們:

pip install numpy matplotlib pandas scipy
# pypi 鏡像: https://mirrors.tuna.tsinghua.edu.cn/help/pypi/

本文環境為: Python 3.7.4 (Anaconda3-2019.10)

準備數據

本文假設了如下格式的數據 data0.txt :

id, data, timestamp
0, 55, 1592207702.688805
1, 41, 1592207702.783134
2, 57, 1592207702.883619
3, 59, 1592207702.980597
4, 58, 1592207703.08313
5, 41, 1592207703.183011
6, 52, 1592207703.281802
...

CSV 格式:逗號分隔,讀寫簡單, Excel 可打開。

之後,我們會一起達成如下幾個目標:

  • CSV 數據, numpy 讀取與計算
  • data 列數據, matplotlib 圖形化
  • data 列數據, scipy 插值,形成曲線
  • timestamp 列數據, pandas 分析前後差值、每秒個數

numpy 讀取數據

numpy 可用 loadtxt 直接讀取 CSV 數據,

import numpy as np

# id, (data), timestamp
datas = np.loadtxt(p, dtype=np.int32, delimiter=",", skiprows=1, usecols=(1))
  • dtype=np.int32: 數據類型 np.int32
  • delimiter=",": 分隔符 “,”
  • skiprows=1: 跳過第 1 行
  • usecols=(1): 讀取第 1 列

如果讀取多列,

# id, (data, timestamp)
dtype = {'names': ('data', 'timestamp'), 'formats': ('i4', 'f8')}
datas = np.loadtxt(path, dtype=dtype, delimiter=",", skiprows=1, usecols=(1, 2))

dtype 說明可見: https://numpy.org/devdocs/reference/arrays.dtypes.html

numpy 分析數據

numpy 計算均值、樣本標準差:

# average
data_avg = np.mean(datas)
# data_avg = np.average(datas)

# standard deviation
# data_std = np.std(datas)
# sample standard deviation
data_std = np.std(datas, ddof=1)

print("  avg: {:.2f}, std: {:.2f}, sum: {}".format(
      data_avg, data_std, np.sum(datas)))

matplotlib 圖形化

只需四行,就能圖形化显示了:

import sys

import matplotlib.pyplot as plt
import numpy as np

def _plot(path):
  print("Load: {}".format(path))
  # id, (data), timestamp
  datas = np.loadtxt(path, dtype=np.int32, delimiter=",", skiprows=1, usecols=(1))

  fig, ax = plt.subplots()
  ax.plot(range(len(datas)), datas, label=str(i))
  ax.legend()
  plt.show()

if __name__ == "__main__":
  if len(sys.argv) < 2:
    sys.exit("python data_plot.py *.txt")
  _plot(sys.argv[1])

ax.plot(x, y, ...) 橫坐標 x 取的數據下標 range(len(datas))

完整代碼見文末 Gist 地址的 data_plot.py 。運行效果如下:

$ python data_plot.py data0.txt
Args
  nonzero: False
Load: data0.txt
  size: 20
  avg: 52.15, std: 8.57, sum: 1043

可以讀取多個文件,一起显示:

$ python data_plot.py data*.txt
Args
  nonzero: False
Load: data0.txt
  size: 20
  avg: 52.15, std: 8.57, sum: 1043
Load: data1.txt
  size: 20
  avg: 53.35, std: 6.78, sum: 1067

scipy 對數據插值

x, y 兩組數據,用 scipy 進行插值,平滑成曲線:

from scipy import interpolate

xnew = np.arange(xvalues[0], xvalues[-1], 0.01)
ynew = interpolate.interp1d(xvalues, yvalues, kind='cubic')

完整代碼見文末 Gist 地址的 data_interp.py 。運行效果如下:

python data_interp.py data0.txt

matplotlib 圖像化時如何配置、延遲、保存,可見代碼與註釋。

pandas 分析數據

這兒需要讀取 timestamp 列數據,

# id, data, (timestamp)
stamps = np.loadtxt(path, dtype=np.float64, delimiter=",", skiprows=1, usecols=(2))

numpy 計算前後差值,

stamps_diff = np.diff(stamps)

pandas 統計每秒個數,

stamps_int = np.array(stamps, dtype='int')
stamps_int = stamps_int - stamps_int[0]
import pandas as pd
stamps_s = pd.Series(data=stamps_int)
stamps_s = stamps_s.value_counts(sort=False)

辦法:把時間戳直接變整秒數,再 pandas 統計相同值。

完整代碼見文末 Gist 地址的 stamp_diff.py 。運行效果如下:

python stamp_diff.py data0.txt

matplotlib 圖形化時怎麼显示多個圖表,也可見代碼。

結語

本文代碼 Gist 地址: https://gist.github.com/ikuokuo/8629cc28079199c65e0eedb0d02a9e74

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

【其他文章推薦】

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

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

※回頭車貨運收費標準

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

※超省錢租車方案

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