北京年底前試營運純電動車租賃服務

據中國大陸北京市交通委及相關租車企業負責人日前透露, 該市正在進行試點推廣純電動車租賃舉措,預計在2013年內正式導入市場試水溫,以打開純電動汽車個人購買方面發展緩慢的局面。

對於純電動汽車,政府提出了多項政策,但這兩年的發展速度並不及預期,進行汽車租賃措施也許是解開目前僵局較好的出路。主因消費者當前對於純電動汽車的續航能力、貶值率還有顧慮,因此,改成汽車租賃後,不用加油,相應的充電站也在完成,預料消費者會更願意使用純電動車。

一輛純電動汽車和一輛普通汽車的日租金預計差不多,但是使用純電動車卻可以大大降低使用成本。以一輛日租金120元(人民幣,下同)的10萬元左右經濟型轎車為例,普通汽車每公里加油費用在7毛錢,而純電動車每公里充電費用僅需要6分錢。

而最近一兩年,部分消費者購車消費觀念開始轉變,由「我要擁有一輛車」,轉變為「我要使用一輛車」。政府和事業單位也開始用租車的方式解決公共服務,促使租車率上升幅度超過5%。

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

USB CONNECTOR掌控什麼技術要點? 帶您認識其相關發展及效能

台北網頁設計公司這麼多該如何選擇?

※智慧手機時代的來臨,RWD網頁設計為架站首選

※評比南投搬家公司費用收費行情懶人包大公開

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

※回頭車貨運收費標準

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  ?

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

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

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

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

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

強烈推薦 10 本我私藏的數據庫書單,附讀書方法

二哥有推薦的數據庫書單嗎?關於 MySQL 和 Oracle 的,謝謝了。

讀者小貓私信問了我上面這個問題,我覺得問題挺典型的,值得寫篇文章分享一下。因為對於 Java 程序員來說,幾乎不可避免地要和數據庫打交道,MySQL 和 Oracle 恰好又是兩個使用最廣泛的數據庫。

MySQL 和 Oracle 都屬於關係型數據庫,現在都隸屬於甲骨文公司,這家公司的產品很牛逼,CEO 拉里埃爾森也很牛逼,和史蒂夫喬布斯是鐵哥們。Oracle 相對 MySQL 更沉重一些,屬於企業級應用。而 MySQL 是開源的,性能又給力,所以近些年來市場佔用率已經飆升到了第一位,甩開 Oracle 兩條街。

(我用 Oracle 比較少,所以本篇就以 MySQL 為主,小夥伴們如果對 Oracle 了解得比較透徹,請在留言區推薦一下,拜謝。)

好了,接下來上書單,希望小夥伴們能夠喜歡,喜歡的話,就收藏,讓它吃灰去。不不不,喜歡的話,買幾本好好讀讀,學到就是賺到。

第一本、《SQL 必知必會》

SQL,全名為 Structured Query Language,也就是結構化查詢語言。經常有一些小夥伴抱怨說,“二哥,在公司乾的無非是一些 CURD 的工作,感覺沒啥進步。”這句話裏面的 CURD 指的就是創建(Create)、更新(Update)、讀取(Retrieve)和刪除(Delete)相關的業務操作,也就是 SQL 的範圍。

但說白了,再偉大的產品,其業務永遠也是圍繞着增刪改查轉啊。

《SQL 必知必會》這本書名副其實,能在最短時間內教會你實際工作環境中最常用和最必需的 SQL 知識,實用性極強。這本書是麻省理工學院、伊利諾伊大學等眾多大學的參考教材——是不是一下子就感覺檔次高了。

第二本、《SQL 學習指南》

封面上有一隻小動物,再帶上“O’REILLY”這個標識,就可以下一句肯定的結論了——這是一本經典書。

《SQL學習指南(第2版 修訂版)》這本書以 SQL92 標準為藍本,涵蓋了 MySQL 6.0、Oracle 11g。全面系統地介紹了 SQL 語言各方面的基礎知識以及一些高級特性,包括 SQL 數據語言、SQL 方案語言、數據集操作、子查詢以及內建函數與條件邏輯等內容。

經常和數據庫接觸的初學者可以常備在身邊,用到就去翻翻。

第三本、《MySQL 必知必會》

《MySQL 必知必會》這本書的英文原版名是《Sams Teach Yourself MySQL in 10 Minutes》,有沒有品到一絲絲標題黨的味道?不過,中文版名字就優雅多了。

這書非常適合想快速了解數據庫原理和 MySQL 的新手閱讀。快餐性質,簡潔明快,小開本,而且很薄,有點《了不起的蓋茨比》那本書的味道,讀起來很流暢。

第四本、《數據庫系統概念》

哇,黑皮書來了哦!黑皮書只有一個缺點,就是枯燥,但說良心話,黑皮書都特么是經典之作啊。尤其適合心靜的大學生來讀,反正大學生活除了談戀愛最重要外(嘿嘿),我覺得就剩下學習了。

數據庫領域的殿堂級作品;夯實數據庫理論基礎,增強數據庫技術內功的必備之選;對深入理解數據庫,深入研究數據庫,深入操作數據庫都具有極強的指導作用!

總之,有時間就讀,真的香就對了。

第五本、《MySQL技術內幕 : InnoDB存儲引擎 第2版》

眾所周知,MySQL 有兩種常見的存儲引擎,一種是 MyISAM,一種是 InnoDB。如果需要支持事務,就選擇 InnoDB,如果一個表絕大多數情況下只用來讀,可以選擇 MyISAM。從 MySQL 5.5 開始,InnoDB 已經成為 MySQL 的默認引擎,這說明它的優勢是有目共睹的。

《MySQL技術內幕:InnoDB存儲引擎(第2版)》這本書恰好從源代碼的角度深度解析了 InnoDB 的體繫結構、實現原理、工作機制,並給出了大量最佳實踐,能幫助你系統而深入地掌握 InnoDB,更重要的是,它能給你你設計高性能、高可用的數據庫系統提供絕佳的指導。

第六本、《高性能MySQL(第3版)》

這本書的封面是不是有點熟,風格和之前推薦的《 SQL 學習指南》高度相似,對吧?這本書的知名度非常高,就好像 MySQL 領域的周杰倫,幾乎所有要學習 MySQL 的開發人員都得買它。

我家裡這本書已經快被我翻爛了,說實話。這本書的內容非常豐富,幾乎涵蓋了 MySQL 所有方面:

  • 前兩章為準備階段,包含一些基本的概念與性能評測工具。
  • 第三章到第七章為優化部分,從架構、索引、查詢語句,到參數配置、軟硬件的優化。
  • 第八章到第十四章為服務的管理與維護,涵蓋了複製、備份、安全等等內容及相關工具。

第七本、《高可用MySQL(第2版)》

《高可用MySQL:構建健壯的數據中心》這本書主要講解真實環境下如何使用 MySQL 的複製、集群和監控特性,揭示 MySQL 可靠性和高可用性的方方面面。旨在解決 MySQL 數據庫的常見應用瓶頸,在保持 MySQL 的持續可用性的前提下,挖潛各種提高性能的解決方案。

這本書比較適合 MySQL 的專業人士看,否則很難駕馭得了。

第八本、《Oracle高效設計》

沒辦法,雖然 Oracle 用得不多,但對經典書還是有一些耳聞的。《Oracle高效設計》這本書的評價還是不錯的,作者 Thomas Kyte 是 Oracle 專業領域世界上最權威的專家之一,也是 Oracle 核心技術小組副主席。

這本書對 Oracle 及數據庫的知識進行了全面深入的講解,是一本關於 Oracle 的高級手冊。內容包括:性能工具包、體繫結構選擇、語句處理、故障排除、高效的管理、高效的設計模式、高效的 PL/SQL 程序設計等。

好了,就到這吧,小夥伴們,我覺得這八本書已經夠看上一段時間了。接下來,順帶分享一下我的一些讀書方法,我覺得這個價值可能比書單本身更有價值,希望能夠給小夥伴們的一些參考。

1)速讀

像入門書籍,要在最短時間內過一遍,比如說《SQL 必知必會》,不要覺得速讀一遍什麼也記不住,沒關係的,本身腦容量就是有限的。速讀的目的很單純,了解一本書的大綱,有沒有勾引你(感興趣)的內容。

或者說有沒有你不懂的內容,標記一下,對後面再讀做到一個提醒的作用。

2)精讀

有了速讀的基礎,再認真讀一遍的時候,你就會感覺完全不一樣了,就好像你去一個地方旅遊,總要先做個小攻略,在地圖上盤算一下,真正身處一個地方的時候,你就不會暈頭轉向,或者說有一種,“哦,原來是這樣啊”的感覺。

3)實戰

讀書最怕就是眼高手低,你以為你記住了,理解了,如果不動手記筆記或者敲代碼去實戰的話,基本上等於沒看,因為你是在讀技術書,又不是哲學書,對吧?

只靠大腦去思考是遠遠不夠的,還需要你的手去敲一敲,跑一跑,執行一下,看看結果是否符合預期,會不會出錯。

這三個步驟下來,一本書就再也不愁“讀了和沒讀一樣”了,小夥伴們有沒有 get 到?

我是沉默王二,一枚有趣的程序員。如果覺得文章對你有點幫助,請微信搜索「 沉默王二 」第一時間閱讀。

本文 GitHub 已經收錄,有大廠面試完整考點,歡迎 Star。

原創不易,莫要白票,請你為本文點個贊吧,這將是我寫作更多優質文章的最強動力。

本站聲明:網站內容來源於博客園,如有侵權,請聯繫我們,我們將及時處理
【其他文章推薦】

USB CONNECTOR掌控什麼技術要點? 帶您認識其相關發展及效能

台北網頁設計公司這麼多該如何選擇?

※智慧手機時代的來臨,RWD網頁設計為架站首選

※評比南投搬家公司費用收費行情懶人包大公開

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

※回頭車貨運收費標準

美國八大州擬擴建充電站等 提升電動汽車普及率

為增加電動汽車普及率,美國加州、紐約及其它6州政府昨(24) 日聯合發布聲明,將廣設充電站、修改營建法條,務求使一般市民也能輕鬆擁有、享受電動汽車。

加州、紐約、麻州、康乃狄克、馬里蘭、羅德島、佛蒙特、奧勒崗等州,合計銷售佔比已超過美國汽車市場的25%。其中,加州是美國最大的汽車銷售市場。

據紐約時報報導,到2025年,州政府希望零碳排放汽車(包含電動汽車與燃料電池汽車)銷量至少能達到330萬輛的目標。

美國電動汽車製造商特斯拉(Tesla)昨天宣布,成功挖腳蘋果產品設計副總裁Doug Field,他在蘋果公司任職時,曾是MacBook Air、MacBook Pro、與iMac等明星級產品的幕後推手。Field之前還在福特汽車任職過,未來他將領導特斯拉汽車研發部門。

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

【其他文章推薦】

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

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

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

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

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

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

雷諾擬與LG Chem合作開發時速400公里的電動車

全球最大可充電電池製造商樂金化學公司(LG Chem),和歐洲電動車先驅雷諾汽車(Renault)聯手,希望未來幾年將電動車的最高時速加快一倍。

據韓國總統朴槿惠的首席經濟幕僚趙源東(Cho Won Dong)透露,這兩家公司正在考慮開發最快時速可達400公里的電動車。目前電動車的最高時速為每小時200公里。

為加強雙邊合作,朴槿惠4日還拜會了雷諾在巴黎南方設立的電動車測試中心。

據悉,兩家公司目前還不會簽署了解備忘錄(MOU),但原則上同意互相合作,正在協商細節上的歧異。由於要開發高速電動車,鋰電池是最重要的環節之一,因此對於雷諾來說,與樂金化學的合作十分重要。

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

USB CONNECTOR掌控什麼技術要點? 帶您認識其相關發展及效能

台北網頁設計公司這麼多該如何選擇?

※智慧手機時代的來臨,RWD網頁設計為架站首選

※評比南投搬家公司費用收費行情懶人包大公開

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

※回頭車貨運收費標準

光靠撤資還不夠 外媒:擺脫化石燃料 國際合作有必要

環境資訊中心綜合外電;姜唯 編譯;林大利 審校

本站聲明:網站內容來源環境資訊中心https://e-info.org.tw/,如有侵權,請聯繫我們,我們將及時處理

【其他文章推薦】

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

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

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

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

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

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

有毒藻類大爆發 波蘭關閉數十海灘

摘錄自2018年07月26日自由時報報導

波蘭衛生當局週三(25日)表示,由於熱浪引發大量有毒藻類爆發,已關閉該國波羅的海沿海的數十個海灘。

《法新社》報導,波蘭北部格坦斯克(Gdansk)的衛生官員奧古斯蒂尼亞克(Tomasz Augustyniak)表示,「這種藻類有毒,對健康構成威脅」。他提到,由於長期高溫炎熱的天氣,導致藍藻大爆發。本週,波蘭電視台也從空中拍攝到被大量藻類覆蓋的大海。

奧古斯蒂尼亞克表示,近年來,含有農場肥料和硝酸鹽、磷酸鹽的汙水流入波羅的海,引發藻類大量繁殖。

本站聲明:網站內容來源環境資訊中心https://e-info.org.tw/,如有侵權,請聯繫我們,我們將及時處理

【其他文章推薦】

USB CONNECTOR掌控什麼技術要點? 帶您認識其相關發展及效能

台北網頁設計公司這麼多該如何選擇?

※智慧手機時代的來臨,RWD網頁設計為架站首選

※評比南投搬家公司費用收費行情懶人包大公開

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

※回頭車貨運收費標準

比亞迪與戴姆勒合作電動汽車2014年有望面市

比亞迪高級副總裁廉玉波近日表示,比亞迪與奔馳合作的一款高端電動汽車目前已完成研發進入測試階段,預計2014年4月的北京車展就能面市。

據公開資料顯示,2010年5月27日,比亞迪與奔馳母公司戴姆勒簽署合同,在中國成立深圳比亞迪-戴姆勒新技術有限公司,雙方各佔50%股權,注冊資本為6億元人民幣。

與傳統的“市場換技術”中外合資企業模式不同,本著品牌平等和技術平等的合作方式,比亞迪與戴姆勒共同擁有一個新品牌。雙方從零部件、整車性能、整車標准各方面進行研發合作,德國戴姆勒方面隻提供方案,而比亞迪的研發團隊將親自參與具體實踐。

2011年10月31日,新京報曾報道,比亞迪與奔馳合作的電動車樣車設計已接近尾聲,預計售價為50萬元左右,2012年4月將於北京車展面市。但這款高端電動汽車卻遲遲不見上市。

除了這款高端電動汽車之外,比亞迪方面還有兩款新能源車型也處於研發之中。其中 “唐”是一款搭載2.0TID和大電機的混合動力SUV車型,該車的百公裡加速時間將縮短至3.9秒,預計將於2014年上市。另一款e6的升級版車型也在研發之中。

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

【其他文章推薦】

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

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

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

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

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

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

德KBA調查Model S著火事件 稱未發現製造商缺陷

據BusinessInsider報導,Tesla昨(2)日表示,德國聯邦汽車運輸管理局(KBA)在對近期發生的三起Model S著火事件調查後得出結論,沒有發現「與製造商相關的缺陷」。

Tesla在一份新聞稿中表示,該公司向KBA提供了事故的相關資料,並接到KBA的一封信。KBA在信中稱:「按照德國產品安全法,沒有必要採取進一步措施。」

今年11月,美國國家公路交通安全管理局(NHTSA)對Model S三起著火事件發起調查。雖然NHTSA的調查正在進行中,但至少德國發佈的結果會讓Tesla安心一些。

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

USB CONNECTOR掌控什麼技術要點? 帶您認識其相關發展及效能

台北網頁設計公司這麼多該如何選擇?

※智慧手機時代的來臨,RWD網頁設計為架站首選

※評比南投搬家公司費用收費行情懶人包大公開

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

※回頭車貨運收費標準

Spring如何解決循環依賴?

介紹

先說一下什麼是循環依賴,Spring在初始化A的時候需要注入B,而初始化B的時候需要注入A,在Spring啟動后這2個Bean都要被初始化完成

Spring的循環依賴有兩種場景

  1. 構造器的循環依賴
  2. 屬性的循環依賴

構造器的循環依賴,可以在構造函數中使用@Lazy註解延遲加載。在注入依賴時,先注入代理對象,當首次使用時再創建對象完成注入

屬性的循環依賴主要是通過3個map來解決的

構造器的循環依賴

@Component
public class ConstructorA {

	private ConstructorB constructorB;

	@Autowired
	public ConstructorA(ConstructorB constructorB) {
		this.constructorB = constructorB;
	}
}
@Component
public class ConstructorB {

	private ConstructorA constructorA;

	@Autowired
	public ConstructorB(ConstructorA constructorA) {
		this.constructorA = constructorA;
	}
}
@Configuration
@ComponentScan("com.javashitang.dependency.constructor")
public class ConstructorConfig {
}
public class ConstructorMain {

	public static void main(String[] args) {
		AnnotationConfigApplicationContext context =
				new AnnotationConfigApplicationContext(ConstructorConfig.class);
		System.out.println(context.getBean(ConstructorA.class));
		System.out.println(context.getBean(ConstructorB.class));
	}
}

運行ConstructorMain的main方法的時候會在第一行就報異常,說明Spring沒辦法初始化所有的Bean,即上面這種形式的循環依賴Spring無法解決。

我們可以在ConstructorA或者ConstructorB構造函數的參數上加上@Lazy註解就可以解決

@Autowired
public ConstructorB(@Lazy ConstructorA constructorA) {
	this.constructorA = constructorA;
}

因為我們主要關注屬性的循環依賴,構造器的循環依賴就不做過多分析了

屬性的循環依賴

先演示一下什麼是屬性的循環依賴

@Component
public class FieldA {

	@Autowired
	private FieldB fieldB;
}
@Component
public class FieldB {

	@Autowired
	private FieldA fieldA;
}
@Configuration
@ComponentScan("com.javashitang.dependency.field")
public class FieldConfig {
}
public class FieldMain {

	public static void main(String[] args) {
		AnnotationConfigApplicationContext context =
				new AnnotationConfigApplicationContext(FieldConfig.class);
		// com.javashitang.dependency.field.FieldA@3aa9e816
		System.out.println(context.getBean(FieldA.class));
		// com.javashitang.dependency.field.FieldB@17d99928
		System.out.println(context.getBean(FieldB.class));
	}
}

Spring容器正常啟動,能獲取到FieldA和FieldB這2個Bean

屬性的循環依賴在面試中還是經常被問到的。總體來說也不複雜,但是涉及到Spring Bean的初始化過程,所以感覺比較複雜,我寫個demo演示一下整個過程

Spring的Bean的初始化過程其實比較複雜,為了方便理解Demo,我就把Spring Bean的初始化過程分為2部分

  1. bean的實例化過程,即調用構造函數將對象創建出來
  2. bean的初始化過程,即填充bean的各種屬性

bean初始化過程完畢,則bean就能被正常創建出來了

下面開始寫Demo,ObjectFactory接口用來生產Bean,和Spring中定義的接口一樣

public interface ObjectFactory<T> {
	T getObject();
}
public class DependencyDemo {

	// 初始化完畢的Bean
	private final Map<String, Object> singletonObjects =
			new ConcurrentHashMap<>(256);

	// 正在初始化的Bean對應的工廠,此時對象已經被實例化
	private final Map<String, ObjectFactory<?>> singletonFactories =
			new HashMap<>(16);

	// 存放正在初始化的Bean,對象還沒有被實例化之前就放進來了
	private final Set<String> singletonsCurrentlyInCreation =
			Collections.newSetFromMap(new ConcurrentHashMap<>(16));

	public  <T> T getBean(Class<T> beanClass) throws Exception {
		// 類名為Bean的名字
		String beanName = beanClass.getSimpleName();
		// 已經初始化好了,或者正在初始化
		Object initObj = getSingleton(beanName, true);
		if (initObj != null) {
			return (T) initObj;
		}
		// bean正在被初始化
		singletonsCurrentlyInCreation.add(beanName);
		// 實例化bean
		Object object = beanClass.getDeclaredConstructor().newInstance();
		singletonFactories.put(beanName, () -> {
			return object;
		});
		// 開始初始化bean,即填充屬性
		Field[] fields = object.getClass().getDeclaredFields();
		for (Field field : fields) {
			field.setAccessible(true);
			// 獲取需要注入字段的class
			Class<?> fieldClass = field.getType();
			field.set(object, getBean(fieldClass));
		}
		// 初始化完畢
		singletonObjects.put(beanName, object);
		singletonsCurrentlyInCreation.remove(beanName);
		return (T) object;
	}

	/**
	 * allowEarlyReference參數的含義是Spring是否允許循環依賴,默認為true
	 * 所以當allowEarlyReference設置為false的時候,當項目存在循環依賴,會啟動失敗
	 */
	public Object getSingleton(String beanName, boolean allowEarlyReference) {
		Object singletonObject = this.singletonObjects.get(beanName);
		if (singletonObject == null 
				&& isSingletonCurrentlyInCreation(beanName)) {
			synchronized (this.singletonObjects) {
				if (singletonObject == null && allowEarlyReference) {
					ObjectFactory<?> singletonFactory =
							this.singletonFactories.get(beanName);
					if (singletonFactory != null) {
						singletonObject = singletonFactory.getObject();
					}
				}
			}
		}
		return singletonObject;
	}

	/**
	 * 判斷bean是否正在被初始化
	 */
	public boolean isSingletonCurrentlyInCreation(String beanName) {
		return this.singletonsCurrentlyInCreation.contains(beanName);
	}

}

測試一波

public static void main(String[] args) throws Exception {
	DependencyDemo dependencyDemo = new DependencyDemo();
	// 假裝掃描出來的對象
	Class[] classes = {A.class, B.class};
	// 假裝項目初始化所有bean
	for (Class aClass : classes) {
		dependencyDemo.getBean(aClass);
	}
	// true
	System.out.println(
			dependencyDemo.getBean(B.class).getA() == dependencyDemo.getBean(A.class));
	// true
	System.out.println(
			dependencyDemo.getBean(A.class).getB() == dependencyDemo.getBean(B.class));
}

是不是很簡單?我們只用了2個map就搞定了Spring的循環依賴

2個Map就能搞定循環依賴,那為什麼Spring要用3個Map呢?

原因其實也很簡單,當我們從singletonFactories中根據BeanName獲取相應的ObjectFactory,然後調用getObject()這個方法返回對應的Bean。在我們的例子中
ObjectFactory的實現很簡單哈,就是將實例化好的對象直接返回,但是在Spring中就沒有這麼簡單了,執行過程比較複雜,為了避免每次拿到ObjectFactory然後調用getObject(),我們直接把ObjectFactory創建的對象緩存起來不就行了,這樣就能提高效率了

比如A依賴B和C,B和C又依賴A,如果不做緩存那麼初始化B和C都會調用A對應的ObjectFactory的getObject()方法。如果做緩存只需要B或者C調用一次即可。

知道了思路,我們把上面的代碼改一波,加個緩存。

public class DependencyDemo {

	// 初始化完畢的Bean
	private final Map<String, Object> singletonObjects =
			new ConcurrentHashMap<>(256);

	// 正在初始化的Bean對應的工廠,此時對象已經被實例化
	private final Map<String, ObjectFactory<?>> singletonFactories =
			new HashMap<>(16);

	// 緩存Bean對應的工廠生產好的Bean
	private final Map<String, Object> earlySingletonObjects =
			new HashMap<>(16);

	// 存放正在初始化的Bean,對象還沒有被實例化之前就放進來了
	private final Set<String> singletonsCurrentlyInCreation =
			Collections.newSetFromMap(new ConcurrentHashMap<>(16));

	public  <T> T getBean(Class<T> beanClass) throws Exception {
		// 類名為Bean的名字
		String beanName = beanClass.getSimpleName();
		// 已經初始化好了,或者正在初始化
		Object initObj = getSingleton(beanName, true);
		if (initObj != null) {
			return (T) initObj;
		}
		// bean正在被初始化
		singletonsCurrentlyInCreation.add(beanName);
		// 實例化bean
		Object object = beanClass.getDeclaredConstructor().newInstance();
		singletonFactories.put(beanName, () -> {
			return object;
		});
		// 開始初始化bean,即填充屬性
		Field[] fields = object.getClass().getDeclaredFields();
		for (Field field : fields) {
			field.setAccessible(true);
			// 獲取需要注入字段的class
			Class<?> fieldClass = field.getType();
			field.set(object, getBean(fieldClass));
		}
		singletonObjects.put(beanName, object);
		singletonsCurrentlyInCreation.remove(beanName);
		earlySingletonObjects.remove(beanName);
		return (T) object;
	}

	/**
	 * allowEarlyReference參數的含義是Spring是否允許循環依賴,默認為true
	 */
	public Object getSingleton(String beanName, boolean allowEarlyReference) {
		Object singletonObject = this.singletonObjects.get(beanName);
		if (singletonObject == null
				&& isSingletonCurrentlyInCreation(beanName)) {
			synchronized (this.singletonObjects) {
				singletonObject = this.earlySingletonObjects.get(beanName);
				if (singletonObject == null && allowEarlyReference) {
					ObjectFactory<?> singletonFactory =
							this.singletonFactories.get(beanName);
					if (singletonFactory != null) {
						singletonObject = singletonFactory.getObject();
						this.earlySingletonObjects.put(beanName, singletonObject);
						this.singletonFactories.remove(beanName);
					}
				}
			}
		}
		return singletonObject;
	}
}

我們寫的getSingleton的實現和org.springframework.beans.factory.support.DefaultSingletonBeanRegistry#getSingleton(java.lang.String, boolean)的實現一模一樣,這個方法幾乎所有分析Spring循環依賴的文章都會提到,這次你明白工作原理是什麼了把

總結一波

  1. 拿bean的時候先從singletonObjects(一級緩存)中獲取
  2. 如果獲取不到,並且對象正在創建中,就從earlySingletonObjects(二級緩存)中獲取
  3. 如果還是獲取不到就從singletonFactories(三級緩存)中獲取,然後將獲取到的對象放到earlySingletonObjects(二級緩存)中,並且將bean對應的singletonFactories(三級緩存)清除
  4. bean初始化完畢,放到singletonObjects(一級緩存)中,將bean對應的earlySingletonObjects(二級緩存)清除

歡迎關注

參考博客

[1]https://mp.weixin.qq.com/s/gBr3UfC1HRcw4U-ZMmtRaQ
[2]https://mp.weixin.qq.com/s/5mwkgJB7GyLdKDgzijyvXw
比較詳細
[1]https://zhuanlan.zhihu.com/p/84267654
[2]https://juejin.im/post/5c98a7b4f265da60ee12e9b2

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

【其他文章推薦】

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

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

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

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

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

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