分類: 3C資訊

  • 塔塔電力擬興建1千座充電站,助印度汰除汽柴油車

    塔塔電力擬興建1千座充電站,助印度汰除汽柴油車

    日經新聞周二報導,印度最大民營電廠塔塔電力(Tata Power)計畫未來五年將於印度首都建造一千座充電站,藉以響應政府2030年禁用汽柴油車的政策。

    塔塔電力目前只有五座充電站在營運,印度全國充電站加總起來也不過100座左右,由此可知印度發展電動車的基礎設施嚴重不足,增加充電站密度勢在必行。

    據塔塔電力執行長Praveer Sinha表示,一千個新充電站都將設置在新德里北部地區,預估將花費10億印度盧比(1,520萬美元),每個充電站有九成服務鉛電池車,一成服務鋰電池車。

    (本文內容由授權使用)

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

    【其他文章推薦】

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

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

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

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

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

  • 豐田看好印尼製造,將投資 20 億美元在印尼開發電動車

    豐田看好印尼製造,將投資 20 億美元在印尼開發電動車

    印尼海洋事務統籌部(Coordinating Ministry for Maritime Affairs)27 日宣布,日本豐田汽車(Toyota)計劃在未來 4 年內投資 20 億美元,在印尼開發電動車款,首先以混合動力汽車(Hybrid vehicle)為起點,以加速應對全球汽車產業的電動化浪潮。

    路透社週四報導,豐田執行董事兼社長豐田章男在聲明中表示,2019 年至 2023 年期間,將逐步增加投資對印尼的投資,總額上看 28.3 兆印尼盾(約 20 億美元)。他指出,受惠於印尼政府的政策推動,豐田將印尼視為重要的電動車投資首選地,公司將分階段逐步投資,以遵循政府的電動車發展方針。

    印尼是東南亞地區的最大經濟體,擁有豐富的鎳礦資源,這是電動車鋰電池的主要材料之一,成為吸引外國汽車製造商的拉力。此外,印尼政府先前也宣布,將給予電池和電動車製造商減稅優惠,並與其他國家簽訂關稅減免協議,積極推動電動車產業發展。

    目前印尼已是東協第二大汽車生產國,僅次於泰國。韓媒《BusinessKorea》6 月 25 日報導,受中國車市步入寒冬和產能嚴重過剩影響,南韓現代汽車(Hyundai Motor)決定關閉位於北京郊區的北京 1 號工廠,並將生產業務從中國遷至印尼,加速打入廣大的東南亞市場。

    《新加坡商業評論》(Singapore Business Review)2 月 15 日報導,國際信評機構惠譽旗下的市場研究調查機構 Fitch Solutions 預測,印尼汽車年產量將在 2019 年達到 5.8% 的成長率,主要是源於全球電動車和 SUV 的需求不斷增加。

    除此之外,印尼汽車產量也受到菲律賓、沙烏地阿拉伯、泰國和越南等市場帶動,預估合計銷量將成長 7.8%。2017 年,上述國家佔印尼整體汽車出口比重分別為 25.7%、7.4%、13.8% 和 6.2%。

    (本文內容由 授權使用。首圖來源: CC BY 2.0)

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

    【其他文章推薦】

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

    網頁設計一頭霧水??該從何著手呢? 找到專業技術的網頁設計公司,幫您輕鬆架站!

    ※想要讓你的商品成為最夯、最多人討論的話題?網頁設計公司讓你強力曝光

    ※想知道最厲害的台北網頁設計公司推薦台中網頁設計公司推薦專業設計師”嚨底家”!!

  • 不看好歐洲純電動車市場,BMW 高層:監管機構想要,但沒有顧客真的需要

    不看好歐洲純電動車市場,BMW 高層:監管機構想要,但沒有顧客真的需要

    電動車已成為多數車商的發展趨勢,然而近日在慕尼黑舉行的 NextGen 活動期間,BMW 執行董事 Klaus Fröhlich 卻語出驚人的表示,他認為電動車轉型被過度吹捧,實際上消費者對這些車輛根本沒有需求。

    考量到 BMW 日前才宣布將加速純電動車發展計畫,Fröhlich 的發言看似大膽,但其實並非沒有道理。據了解,這項發言主要是針對遊說團體 Transport and Environment 日前公開譴責歐洲車商的回應。

    該篇報告 T&E 引述 EEA 的最新排氣數據,指出歐洲在電動車銷售明顯落後中美兩國,主要原因是市場純電動車的選擇和可用性都受侷限,而 T&E 認為,這是因為歐洲車商故意推遲純電動車的銷售計畫,好最大程度提高燃油車的利潤,「在環境方面,車商只會做法律規定他們要做的事情」。

    對這項指控,Fröhlich 表示,他認為 T&E 忽略了最重要的問題:那就是歐洲客戶實際上並不想買純電動車。

    Fröhlich 解釋,與美國人為不同目的駕駛不同車輛的習慣不同,歐洲人通常是「單車家庭」,車庫中只會有一輛車使用,因此他們並不願完全依賴純電動車,不應該拿美國的市場情況來比較。

    除此之外,還有充電基礎設施的普及問題,Fröhlich 認為,柴油引擎至少還有 20 年、汽油引擎至少還有 30 年,即使是俄羅斯、中東、中國中西部地區這些市場,在缺乏基礎建設下,燃油引擎都至少還有 10~15 年時間。

    「純電動車只適用中國、美國加州市場,至於其他地方,有更大電池的混合式動力車應該是更好的選擇。」

    除了基礎設施普及,Fröhlich 也指出,在電池原始材料,純電動車的成本要遠高於燃油或混合動力車,隨著未來市場對電池原料的需求增加,一旦供應鏈無法支持,那麼價格可能只會有增無減。

    Fröhlich 表示,如果政府能提供許多協助,BMW 可生產足以淹沒歐洲的百萬台純電動車,但在他看來,歐洲人並不想買這些東西,「監管機構想要純電動車,但沒有顧客真的需要。」

    (合作媒體:。首圖來源: CC BY 2.0)

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

    【其他文章推薦】

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

    ※評比前十大台北網頁設計台北網站設計公司知名案例作品心得分享

    ※智慧手機時代的來臨,RWD網頁設計已成為網頁設計推薦首選

  • 極重要市場,福斯:2035 年 EV 占中國銷量比重衝 50%

    極重要市場,福斯:2035 年 EV 占中國銷量比重衝 50%

    日經新聞,德國福斯(Volkswagen,VW)社長 Herbert Diess 2 日在博鰲舉行的國際會議上宣布,將在 2035 年結束前把電動車(EV)佔中國年間新車銷售量比重提高至 50%。當前佔比不到 1%。

    Diess 在上述會議上發表演說時表示,「對福斯的 EV 攻略來說、中國市場是極為重要的。將藉由攜手合資夥伴及加強當地的研發,擴大市佔」。

    據報導,中國是福斯的最重要市場,2018 年福斯於中國市場的新車銷售量約 420 萬台、佔其整體銷量比重達約 4 成。

    Herbert Diess 曾於 3 月 5 日接受媒體採訪時表示,計畫在 2030 年將 EV 佔全球銷售量比重提高至 40%,其中歐洲、中國將提高至 45% 左右。福斯之前宣告的目標是要在 2025 年將 EV 佔全球銷售量比重提高至 25%。

    日本汽車業龍頭豐田汽車(Toyota)6 月 7 日宣布,計畫在 2025 年將電動化車款(包含電動車 EV、燃料電池車 FCV、油電混合車 HV 和插電式油電混合車 PHV)佔全球新車銷售量比重提高至 50% 以上水準,也就是計畫在 2025 年賣出 550 萬台電動化車款。上述電動化車款的銷售量目標達成時間較豐田於 2017 年底時預估的 2030 年提前了 5 年。

    本田(Honda)於 3 月 5 日宣布,為了加快於歐洲市場的電動化腳步,目標在 2025 年結束前將在歐洲販售的 4 輪車全數更換成油電混合車、電動車等電動化車款。本田在 2017 年宣告的目標是要在 2025 年前將歐洲販售的 2/3 4 輪車電動化,而此次則是大幅加快電動化腳步。

    日本市調機構富士經濟(Fuji Keizai)公布調查報告指出,在中國、歐洲、美洲需求加持下,預估 2035 年全球電動化車款(xEV;包含電動車、插電式油電混合車、油電混合車、輕型 HV(Mild-Hybrid;48V)和燃料電池車)市場規模(銷售量)預估為 6,341 萬台、將較 2017 年(442 萬台)飆增 13.3 倍(增加約 1,330%);其中,中國市場預估為 2,045 萬台、將較 2017 年(83 萬台)暴增 23.6 倍。

    (本文內容由 授權使用。首圖來源:)

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

    【其他文章推薦】

    台北網頁設計公司這麼多,該如何挑選?? 網頁設計報價省錢懶人包"嚨底家"

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

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

  • 是時候普及一下機器人素質教育了

    是時候普及一下機器人素質教育了

      文|腦極體

      每次看到人類訓練機器人,我都會很困惑一件事,那就是在如此殘酷環境中培養出來的技能,到底能在現實世界中用上幾回?

      像是狠狠從背後踹它一腳,讓它倒地后再爬起來;讓兩個機器人鬥毆在地上瘋狂摩擦;又或者是在十幾米的高台不停地跳高高……

      這麼對待重金打造的機器人,先不說畫面“不忍直視”,修理損耗難道不要錢的嗎?

      後來我明白了,這跟目前的技術路徑有關。深度學習就是要進行大量的實踐和訓練,才能不斷優化算法,直至機器人能夠應對真實世界中各種各樣的狀況。

      理論上講,只要時間足夠長、預算無上限,猴子也能用電腦寫出文學著作,更何況是算力逆天的機器。

      但這跟我們普通人又有什麼關係呢?我們能否在有生之年用上(而且買得起)可靠解決問題的機器小助手呢?一萬年太久,我們只爭朝夕好嗎?

      最近,伯克利和谷歌大腦最新開發的強化學習算法——soft actor-critic(SAC),據說就現實世界的機器人學習,或許,有望改變一下訓練機器人的古早思維。

      今天我們就來聊聊,SAC 會如何改變機器人的“成材之路”?

      為什麼想要一個 rio 的機器人,這麼難?

      在介紹 SAC 這個新算法之前,有必要先解釋一下,是不是一定要有更好的機器人算法呢?或者說,這個算法到底能夠改變什麼?

      這要從機器人在現實世界中遇到的挑戰來解答。

      首先,是目前的訓練方式,決定了機器掌握新技能的速度還遠遠不夠。

      傳統的機器學習算法,每次執行新任務時,都需要對原型設計進行參數調整,有的還需要重新收集數據進行訓練,這就使得機器新技能所需的總時間迅速增加;

      其次,現實場景中的無數意外,都有可能讓機器出現故障。

      真正在使用機器時,無論出現什麼問題,比如斷電或者網絡延遲,機器都會以“死機”來應對危機。如果每次都要以“重啟”來恢復作業,那應用機器人的價值何在?

      以上都是效率問題,傳統訓練方式帶來的成本困境,更是令研究人員愁到禿頭。

      無論是訓練人員人為製造 bug 的暴力操作,還是執行器在種種複雜環境下的高頻抖動,都會給硬件帶來極大的磨損。這是機器人嗎?這是鈔票粉碎機啊!

      當然,人類也不是沒有想過辦法。比如讓機器人打遊戲啦,設計仿真環境啦,這些努力都大大減少了對現實訓練的依賴,但歸根結底,都無法替代現實環境的多樣性和隨機性。最重要的,還是得打造一套專為現實世界機器人“量身定製”的算法。

      真實世界的機器人,到底需要怎樣的算法?

      那麼,這樣一套算法應該具備哪些屬性呢?

      至少需要有這樣幾個關鍵要素:

      1. 良好樣本複雜性。提供給算法的訓練樣本數量越多,機器獲得數據標籤的時間成本也就越低,返回的誤差也更小,在強化學習中的表現自然也就越出色;

      2. 沒有敏感的超參數。為了提高機器學習的性能和效果,往往需要對超參數進行優化,但在現實環境中,自然是參數調整越少越好。算法就需要最大限度地減少調整超參數的需求;

      3. 異步採樣。真實世界中,難免會出現數據流終端、推理延遲等問題,要讓機器在“重啟”階段也能夠保持一定的持續性和穩定性,就必須將數據的收集和訓練在確保在最小化的多個獨立線程中進行。

      4. 動作平滑。為了防止大幅度動作或震動損壞硬件,因此,時間上具有關聯和連貫性的探索就變得尤為重要了。

      簡單總結一下,如果我們相信未來真實世界中的機器人不可或缺,那麼,要求它用無限長的時間、無限多的投入、無數次的碰壁去掌握這樣那樣的本領,顯然不太明智。

      如何讓它自己進行有取捨、有現實意義的訓練呢?SAC 應聲出現。

      SAC 成功的秘訣,就是心大

      說了這麼多,正主終於出現了。那麼。究竟什麼是 SAC?

      SAC,全稱是 Soft actor-critic。從名字不難看出,SAC 也是基於 Actor-Critic 算法的邏輯,即 actor(玩家)隨機表演,critic(評委)隨機打分,互相制衡下追求更好的表現(reward)。

      不同的是,SAC 對參數的態度十分“溫柔”,它會自動權衡預期收益(最大化回報)和探索深度(最大化的不確定性),然後自動學習不是將其視為需要調整的“超參數”,從而獲得最優策略。

      這樣帶來的好處是,訓練樣本多樣,還不需要頻繁調整參數,學習效率高了很多。即使遇到最差的實驗環境,也表現良好。

      這就像是以前機器需要在人類親媽的“呵護”之下,點燈熬夜窮經皓首地做奧數題,以期成為“數學神童”。如今學會了勞逸結合奮發圖強,拿下高考高分就一本滿足了。顯然,後者才是大多數普通機器的榜樣和人類家長應該有的期待嘛。

      具體表現如何,有請來自“伯克利小學”的三位機器人同學現身說法:

      第一個向我們走來的是 Minitaur,一個帶有八個驅動執行器的小型四足機器人。在前進時,往往藉助控制器追蹤四肢的擺動部位,觀察好各種角度以平衡腿上的力度。如果沒有有效的訓練策略,很容易失去平衡而摔倒,摔多了鋼筋鐵骨也會壞的啊。

      不過,在掌握了新的學習方法之後,由於訓練時將數據的不確定性最大化,Minitaur 不需要任何額外的學習,就可以駕馭絕大對數平衡性的干擾。

      第二位是非常靈活的“三指手”同學,它的任務是用手旋轉“閥門”,使彩色掛鈎朝右。但閥門上安裝了一個小型電機,受力會自動複位。因此,每轉一次,閥門的初始位置都會被隨機重置,使得機器必須重新感知當前的閥門方向。這個任務需要感知預測,並精準地控制 9 個伺服電機關鍵來完成,非常具有挑戰性,但我們的“三指手”依然順利完成了任務。

      最後一位機器人同學雖然在玩樂高,但並沒有從中得到多少樂趣。因為訓練者要求它在堆疊積木的時候準確地對準螺柱以減少摩擦。

      除了需要確定關節的位置和速度之外,還需要保證末端的力度,並且將複雜命令同時傳送給 7 個關節。這和要求人類小孩“百步穿楊”有差別嗎?

      不過,掌握了 SAC 大法的機器並沒有讓人失望,只用 3 個小時就學會了如何搞定這個任務。而以往使用的 PPO 策略用了 7.4 小時才搞定。SAC 是不是很棒棒?

      在論文中,研究人員給 SAC 用了一個高調的定語:“state-of-the-art”(最先進的),可以說是實至名歸了。

      當然了,上述還都只是些比較概念化的實驗,真正要將這種能力擴展到更具挑戰性的現實任務中,還需要大量的優化迭代、開發編碼調參等工作,不過可以預測的是,由於 SAC 的出現,機器人正在無限近地接近概念到實用的臨界點。

      有了這個最佳引路人,機器人終於可以少受點“虐待”,真正滲透進生活的細節了。

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

    ※想知道網站建置網站改版該如何進行嗎?將由專業工程師為您規劃客製化網頁設計後台網頁設計

    ※不管是台北網頁設計公司台中網頁設計公司,全省皆有專員為您服務

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

    ※帶您來看台北網站建置台北網頁設計,各種案例分享

  • 中二李國慶

    中二李國慶

      本文由蓋飯特寫工作室出品,原載於公眾號「蓋飯人物」,微信號:gffeature”

      文/唐婉婷

      編輯/席驍儒

      來源: 蓋飯人物 ThePeople(ID:gffeature)

      1986 年,北大還是個在校規里明令禁止學生談戀愛的地方。

      這也可以理解。畢竟,那年頭哪怕穿個喇叭褲上街,也會換來路過的朝陽大媽們一句“不男不女,顛倒乾坤”的鬥爭腔式指責,臨走再啐上一口:呸,流氓。

      就是在這種時代環境里,時任北大學生代表大會會長的李國慶大咧咧地抱着一沓信封站在女生宿舍樓下,時不時落落大方地向路邊自以為偽裝得很好的情侶們遞上一個。信封上明晃晃印着幾個大字——“北京高等教育思想政治研究會”。

      路過的情侶看到這幾個大字,心裏暗暗犯怵,忐忑不安地接過打開一看,臉頓時憋得通紅。

      裏面裝的是避孕套。

      Part 1

      業內大嘴        

      噹噹剛上市的時候,李國慶與網友打賭“噹噹股價如果跌破發行價 16 美元,我找驢踢我腦袋。” 後來噹噹網股價跌破 16 美元。李國慶在深圳衛視的《百佬會》上說“我現在認,願賭服輸。大家誰來踢我一下?”

      中國自古有直男格言:兄弟如手足,妻子如衣服。對李國慶來說,公司大權越來越多落在妻子手中,老婆已經不是衣服,簡直是衣食父母。而兄弟呢,如果不是連續兩次挺身而出插兄弟兩刀,公眾都快忘了江湖上還有一個懟天懟地的李大嘴了。

      第一刀插在剛向婦聯道完歉的俞敏洪身上。他覺得俞敏洪“中國是因為女性的墮落導致國家的墮落”的觀點沒毛病,企業家嘛,就要敢於說出自己的真實想法。這話說完后,大家都沒怎麼較真,畢竟李國慶也不是第一次公開吐槽自己這個北大學弟,事就這麼過去了。

      還沒低調幾天,第二刀又穩穩插在剛躲過一劫的劉強東身上。李國慶說他這次只是婚外性,不是情,沒嫖娼,沒強姦,對自家太太和社會公序良俗都沒什麼損害,“雖殺風景,但劃得來”。還不忘順便傳授了一把早年的騙炮經驗。

      如果兄弟真是手足,那李國慶這就叫自殘,幸虧男人的兄弟和女人的閨蜜一樣,大都是說說而已。無論俞敏洪還是劉強東,在此之前,李國慶和這二位都多有齟齬。本意大概是想通過說反話再落井下石一波,沒成想,這回卻玩脫了。

      沒人關心他說話的動機,輿論反饋幾乎是罵聲一片。

      李國慶的微博個人簡介是“我口無遮攔,多有得罪,請海涵”,這話不是自謙。不僅他自己清楚,太太俞渝也看得明白。俞渝曾經說,“李國慶就是一個性情中人”,然後繼續解釋,這個“性情中”是“比較二”的意思。

      混到自家太太能把話說得如此直白的地步,那肯定是因為李國慶口無遮攔已經不是一天两天了。

      2010 年的 12 月,噹噹以 B2C 第一股在紐交所成功敲鐘上市。慶功宴上,投資人老虎基金、承銷投行摩根士丹利和俞渝三方觥籌交錯,說著漂亮的場面話,沒人對李國慶異樣的情緒有覺察,但後來他自己說,“當時一看見投行的人就氣得手抖”。

      李國慶為啥這麼生氣?當然因為覺得自己被投行坑了。上市之前,摩根士丹利將噹噹的股價定為 16 美元每股,一直勉強維持着噹噹收支平衡的李國慶立馬以這個價格賣了 650 萬普通股出去,一共套現 8 千多萬。結果錢還沒算清,股市開盤了,噹噹的股價蹭蹭蹭地漲到 24.5 美元,截至收盤,又漲到了 29.91 美元。開盤當天,股價總計上漲 86.94%。

      回去之後,他終於憋不住了,以往凡事都要和俞渝商量,這次算是破例:“王八蛋們明知次日開盤就會 20 億;還定價 16,也就 11 億。次日開盤,CFO 被股價嚇得尿急,我說忍了這口氣,過了靜默期,我再操你媽了個x”。

      大學時期,李國慶喜歡崔健,故而哪怕是一段諷刺投行壓低噹噹 IPO 發行價的罵街話語,看起來都像是自帶節拍韻律。

      很快,一位自稱是“摩根士丹利工作人員的”微博用戶出現,對李國慶的指責進行逐條回應。或許是因為仍不解氣,還反過來質疑噹噹的經營問題。

      摩根士丹利被圈內昵稱為大摩。投行的江湖不好混,除了不動刀棍之外,論競爭之慘烈、手段之下作,古惑仔也要認輸。大摩的人能是省油的燈嗎?公事談完,這位女工作人員繼續朝着下三路走,攻擊李國慶的婚姻和私德。

      李國慶倒是不顧身份,頂着黃V跟這位來路不清不楚的微博用戶你來我往拉鋸月余,基本上是把雙方的親戚都問候遍了,罵到兩個人都筋疲力竭,才漸漸偃旗息鼓。

      中國一直沒有自己的世界級投行,國內公司想海外上市,抱大投行的大腿都來不及,更別說問候人家母親。一時間,李國慶成了令人側目的“罵投行第一人”。而時至今日,已經沒什麼人還記得那位“大摩女”,眾人沒法忘掉的是,一月的時間,李國慶生生把噹噹的市值懟掉 20 億。

      但也不是全無好處。“大戰大摩女”事件后,中國數億網民也因此知道衣冠楚楚的商界精英群里出了個口無遮攔的李國慶,他的微博粉絲因此暴漲。

      果然沒讓粉絲們失望,幾個月後,李國慶又將正在過第一個本命年的阿里巴巴拉進了戰場——2011 年 315 晚會前,李國慶一連發了好幾條微博吐槽淘寶假貨泛濫。

      經過數輪叫陣,支付寶的白鴉(現為有贊 CEO)在微博設賭,說俞渝無法忍受李國慶,後者會被離婚,被下崗。

      白鴉不是無名之輩,雖然現在有贊因為從服務到商品各種問題被吐槽的很多,但他在中國互聯網的用戶體驗設計圈可是大神級人物和佈道者的角色。李國慶一點也不在乎,不慌不忙地在下午兩點回了一條:“估計您要輸,剛交了公糧,挺 HIGH 的”。

      Part 2

      特立獨行        

    1997 年,李國慶創辦噹噹網之前苦讀 MBA

      1964 年的國慶節,北京城裡正轟轟烈烈地進行着中華人民共和國成立 15 周年大閱兵,大街小巷一派肅穆祥和。李增雙就出生在這麼個普天同慶的日子里。

      生在國慶節,是喜上加喜。所以樸實的爹娘就給他起了個小名叫“國慶”,後來“國慶國慶”地叫順口,大名反而漸漸沒人再喊,“李增雙”就理所當然成了“李國慶”。

      那個年代,“五講四美”、“雙增雙節”的口號鋪天蓋地,所以從本質上講,換個“國慶”的名字,也並無任何根本上的不同——它們都帶着深刻的時代烙印。

      雖然家境普通,但說到底,北京是文化名城,又是紅色首都,李國慶小時候也是個愛看書的文藝少年。只是那時的書還是奢侈品,不興買,興租。不算闊綽的小學生李國慶就每天省下 3 分錢的冰棍錢,跑去租書看。在 70 年代北京前門的新華書店,經常能看到他來去匆匆的身影。

      後來,可能是因為北京城的夏天這麼熱,老不吃冰棍也不是個事兒。李國慶就跑去了離家不遠的一家叫“少年之家”的圖書館,死皮賴臉地求館里的老師答應了讓自己做圖書管理員。這個決定,不僅僅是給他省下了冰棍錢,從某種意義上講,也影響到他未來的人生路徑。

      在這裏,他看了一本據說對自己影響非常大的書——羅曼·羅蘭的《約翰·克里斯朵夫》。主人公是一位迫切地渴望被社會認可,而後又迫切要反叛主流認可的角色。他在李國慶心理種下了英雄主義的種子。

      所以也就可以理解,李國慶後來在大學和商場里老想標新立異,動不動就踹人一腳的行事風格,多半事出有因。

      1983 年,李國慶以第一名成績考入了北大社會學系,成為北大社會學重建以來的第一屆學生,再晚幾屆、後來被神奇地稱為“出行教父”的李斌,是他同門師弟。當時的校長丁石孫評價他:李國慶很鬧,但都是正統地鬧。

      這話說在李國慶大三的時候——當時北大宿舍樓的電話壞了,好幾天也沒人來修。李國慶知道后立馬氣勢洶洶跑去總務處,推門一看,“校長也在哈,校長您好。”

      寒暄完畢,轉身就換了張臉,開始質問總務長:“宿舍電話壞了為什麼老不給修?”總務長皺了皺眉頭:“不修,省得你們利用電話談戀愛”。李國慶這時的反應是憤怒地用手敲擊桌子:“你這個老昏庸,你的責任是讓它暢通無阻,你管他是談戀愛還是不談戀愛?”

      這話說得有節但不是很有禮,不卑卻稍微有點亢。總務長沒見過這般個性學生,一時竟無語凝噎。

      李國慶不是省油的燈,更不缺那個年代里罕有的特立獨行。總之,在北大校園裡,他做學生代表大會會長,貼大字報、辦演講、創立北大學生首屆藝術節。

      當時號稱中國搖滾之父的崔健正被限制演出,據說是因為用搖滾風格演繹了紅色歌曲,但是李國慶還是邀請他去北大唱歌,一時間風光無限。

      某天夜裡,李國慶從女寢樓下路過,看到有女生因談戀愛錯過了落鑰時間,而被宿管大娘拒之門外。一種使命感油然而生,他立即走上前,大手一揮:“大娘,我是學生代表大會會長,我現在要求你把門打開,而且從此不許鎖!”

      大娘不買賬,學生代表大會會長是啥官?沒聽說過啊。見官僚頭銜鎮不住對方,李國慶改用武裝鬥爭,“呵,我今天還必須把你這個封建的枷鎖砸開”,說完上前一步,脫下腳上一隻鞋,兩鞋底子把鎖給砸開了。親證如此天生神力,大娘驚得眼珠子差點掉出來。

      英雄夢想驅使下,李國慶鐵了心要做“影響中國的 100 人”。大二下學期的時候,他寫下一本書,題為《中國社會改造之我見》。北大教授袁方、於光遠看后嘖嘖稱奇:“國慶,你就好好搞學術吧,我保你三十歲必成名家”。學校領導也看到了,開玩笑和他說:“你這水平,大學一畢業,我給你找個縣委書記噹噹”。李國慶則毫不客氣:“副書記也行,保守點”。

      縣委書記自然是沒做成的,程序上講,下基層鍛煉是重用的前奏,那時的李國慶還差點火候。好在畢業之後,他還是進入了國務院發展研究中心和中共中央書記處農村政策研究室,在當時,這是個號稱“中南海翰林院”的地方。

      擺在青年李國慶面前的,是一派光明的政治前途。

      然而,規規矩矩坐了四五年辦公室后,李國慶發現,自己還是不甘違背內心,只做一個寂寞的辦公室文員。

      他渴望鮮花和掌聲。

      Part 3

      文青下海        

      2010 年 12 月,噹噹在紐交所敲鐘上市。李國慶問紐交所主席能不能敲兩下,寓意“噹噹”

      上世紀八九十年代,是一個號稱“靠擺地攤都能奔小康”的年代——會做生意的資本家,在此前幾十年的歷次政治運動中被消滅得七七八八,僵化的計劃經濟進行了幾十年。到改革開放前,國民經濟已經瀕臨崩潰。

      改革開放開啟中國大陸第一次創業熱潮,只要踏實肯干,就到處都有錢可賺,“造導彈的不如賣雞蛋的”等經典時代俗語也流傳開來。商界一派萬物初生、春光大好的景象,後來變成網絡梗的溫州皮革廠、山西煤老闆們,已經在襁褓中醞釀。

      乘着改革春風,李國慶微調整了一下自己的夢想——做“中國最富的 100 人”,然後就頭也不回地放棄公職下海了。

      作為一個名校畢業的頂級知識分子,李國慶一直對自己俗氣的名字耿耿於懷。所以,他要求自己公司的名字一定要有內涵。沉思半晌,李國慶大筆一揮,就叫“北京市科文經貿總公司”。如果不看後面的“公司”二字,旁人多半會誤以為這是哪個政府部門。

      名字起好了,賣什麼呢?李國慶繼續想,自己投筆從商一介書生,還是要面子的,肯定不能跟着人家鬧哄哄地擺地攤賣百貨。於是決定賣書,主打心靈雞湯,小目標是賺兩輛奔馳——當時,巨富們喜歡開奔馳 320,標價 32 萬。李國慶倒算一通后發現,要賣出去 10 萬套書才夠錢。

      揣着一顆火熱的奔馳夢,李國慶拎上樣書就往武漢和上海跑,隨即遭受人生第一個重大打擊——他一套也沒賣出去,連樣書都用來在火車上跟服務員換了兩盒盒飯。也幸好當年那位列車服務員的素質高,有知識需求,不然,還沒萌芽的噹噹網,就得早早倒在單程 17 小時車程的京滬線上了。

      多虧李國慶後來功成名就,才能嬉皮笑臉地回憶那段往事:那套書沒賣出去,是因為其中有一本名叫《乘着 9 路車去天堂》。而當年武漢剛好有一趟 9 路車,終點是火葬場。

      一番折騰下來,李國慶欠了一屁股債,債主怕他跑,就在他家樓下租個房子,成天守着他。在校園裡風光無限的李國慶哪裡過過這種憋屈日子,他開始反省:行走江湖,還是要把風險管控擺在第一位才靠譜。

      這一信念在二十一世紀初那場轟動全球的互聯網泡沫中更堅定了。

      2000 年,也是李國慶和俞渝一起成立噹噹的第二年,300 萬的年增長額讓李國慶雄心萬丈,彷彿又恢復了在北大校園裡揮斥方遒的時候,他斥巨資拉起一支超豪華管理團隊,大家拿着大把公司期權,憋着一口氣要把噹噹推上納斯達克。

      突然,美國股市崩盤的消息傳來,互聯網概念昨天還是香餑餑,轉眼就成了臭雞蛋,慘狀堪比今天的區塊鏈。上市的夢想就地破碎,高管們紛紛離去,李國慶和俞渝登時成了“一腳踹經理”,夫妻倆掩上門,差點抱頭痛哭。

      只是哭也沒用,該面對的還是要面對,互聯網相信數據相信忽悠相信出身相信錢,就是不相信眼淚。李國慶仔細反思了彼時的互聯網思維,覺得靠“燒錢換點擊率”不靠譜,儘管這一點現在已經成為了行業共識。俞渝也開始縮緊公司開支,預留一筆錢“過冬”。

      那段日子,倆人一邊看着一家家互聯網企業倒閉,一邊憂心忡忡地盤算自家的賬單,誰知,資本寒冬對噹噹火箭般的成長速度竟毫無影響。即便夫妻倆極力控制發展規模,噹噹依然以每年 200% 的增速成長着。靠着謹小慎微,噹噹熬過了這個冬天。

      至此,謹慎保守成了噹噹行走江湖的圭臬,然而尷尬的是,也成了最終將這個互聯網老大哥推向下坡路的重要因素。

      2010 年底,京東開啟全品類戰略,打着“三年不賺毛利,五年不賺凈利”的價格戰略侵入噹噹的命根子圖書領域,噹噹本來就不大的圖書市場硬生生被掰去一大塊,李國慶被這個隔壁學校的小學弟氣得吹鬍子瞪眼,但又無可奈何,只得再去找市場。

      經歷過資本寒冬的李國慶和俞渝仍然堅信“錢必須握在手裡才踏實”,在每一項投資中都畫上了一條價格紅線。但眾所周知,在日新月異的互聯網泡沫江湖裡,資本才是開疆拓土的核武器。

      後來這些年,噹噹做百貨,做平台,做电子書,做雲閱讀,時髦的,一樣沒落下,一樣也沒成功。大家都說這挺符合李國慶文藝青年的標籤,電影話劇小說詩歌,沒有名字不熟的,就是不能往深了問。

      說來也怪,從徐小平被俞敏洪請出新東方改扮中國年輕女創業者知音,到戴威的 ofo 獨角獸夢想破滅自己被限制高消費,再到現在噹噹面臨的尷尬局面,北大“老中青”三代創業文青,都沒能逃過半途傾覆的命運。

      2004 年,噹噹初具規模,亞馬遜提出要以 1.5 億美元收購噹噹 70% 到 90% 的股份,那時噹噹一年的銷售額才 1 億人民幣。俞渝興奮地在廚房走來走去,但李國慶不同意:“再給我三四年的時間,噹噹能翻一番”。

      當時汪延還是新浪網的總裁,他聽說李國慶不肯賣噹噹,火急火燎地帶着老婆撲到李國慶家,他說:“趕緊賣吧,別做夢了,你看我們新浪網剛上市時 16 塊一股,現在 1 塊錢一股,什麼時候爬上來?趕緊賣吧,賣了干點別的也行”。

      汪延何許人也?人家世代書香門第,他爺爺是中國著名物理學家,他爹自己是 1949 年後第一批駐法國外交官,拿過法國騎士勳章,幾個伯伯不是院士就是大學校長,比李國慶的出身顯赫太多了。他能上門規勸,應該也是真關心噹噹。

      李國慶沒理他。

      2013 年到 2014 年,噹噹又先後被百度和騰訊兩大巨頭看上,李國慶依然不肯讓步,死守占股不能超過 25% 的底線,看到這架勢,騰訊也不再多費唇舌,轉身就找了李國慶口中“傻大黑粗”的劉強東。京東在劉強東不太順利的美國求學之旅后,市值依然高達 310 億美元,而噹噹作價 75 億賣身海航失敗,至今無人接盤。

      當老大是每個文青的倔強,即使這個老大隻是一個“聯合老大”。

      Part 4

      行差踏錯        

      1995 年,31 歲的李國慶與 30 歲的俞渝相識於美國。那時候的俞渝在華爾街已經小有名聲,而李國慶還是個在紐約街頭到處求人買版權的小書商

      最早看清噹噹宿命的,是蔚來汽車的 CEO 李斌。不過那會兒,他還是個剛學會敲代碼的小伙子。

      1996 年,李斌在北大一邊輔修法律和計算機,一邊創辦了“南極科技”,偶然結識剛從美國“開眼界”回來的李國慶。李國慶覺得這位比自己小整整十歲的學弟是個不錯的苗子,就拉上了他一起創業。第二年,李斌以總經理身份參與了噹噹網前身“科文書業”創辦,李國慶任董事長。

      沒想一年後,李國慶將自己剛從美國娶回來的俞渝也安插成了董事長,李斌一看,這不成夫妻店了嗎?趕緊撤了。

      事實證明,李斌對企業管理的眼光比對電動汽車的判斷高太多了,非常有先見之明。

      後來噹噹的高層一見到李國慶和俞渝鬧分歧,立馬繞得遠遠:“無論站哪方,都要得罪另一方;哪方都不站吧,又要說我別有用心”。鬧久了,李國慶也後悔,多次在公開場合表示,如果有機會能再來一次,“一定不和俞渝一起創業”。

      噹噹創立后,李國慶的身份一直是“聯合總裁”,外人常對着這個奇怪的頭銜滿臉問號。俞渝說,這是為了顧及李國慶的自尊心,畢竟“副總裁”不太好聽,國慶還是要出去接受媒體採訪的。

      一物降一物,世事大抵如此。

      在俞渝之前,李國慶交往過六個女朋友,無一例外都出國了,他整個一出國培訓班班長。在當年,連申請護照都需要層層審批、說明嚴肅理由,可不是一般人能奢望的事情,由此也可見李國慶的社交質量之高。

      30 歲那年,李國慶覺得是時候找個人安定下來了,但他非海歸不可,卻沒聽說有哪個已經出去的真願意回國變成“海歸”。

      他決定出國找一找。

      1995 年,李國慶已近 32 歲,他在美國碰到俞渝,後來的事情就變得理所應當。俞渝是紐約大學 MBA 畢業,在華爾街做風投,已經開始嶄露頭角。兩人花了三個月時間了解,然後迅速結婚滾床單,一同回國。對於和俞渝結婚這事,李國慶承認他目標明確,是“早有預謀”。

      後來的十幾年裡,不同於功成勇退現在又出山的“百度第一夫人”馬東敏,號稱“中國第一個從索羅斯手中拿到錢的女人”的俞渝一直擔任着噹噹的聯合總裁,與李國慶平起平坐。即使李國慶氣急拍着桌子叫罵“俞渝你給我閉嘴,這事聽我的,你就好好當 CFO”,俞渝也寸步不讓。

      在噹噹任職過的老員工都說,企業領導做決策,要考慮數據、市場、競爭對手等一系列因素。但在噹噹,夫妻關係也成為影響決策的因素,而且還是重要因素。為了做成一件事,李國慶會花上足夠多的時間說服俞渝,或者反之,如果兩人意見統一不了,那就再推遲三個月做決定。

      更激烈的版本說,開會時吵得厲害,李國慶甚至會做出家暴的姿態,當然從來沒敢真正付諸實施。噹噹的產品項目組,如果彙報關係分屬夫妻兩人,最後李國慶的項目都是被砍掉的命,這也是互聯網產品圈裡公開的秘密。

      2004 年底,噹噹剛熬過寒冬,去哪兒網的聯合創始人戴政還是噹噹旗下的市場和廣告總監,在目睹了噹噹總裁辦年度總結會上的一幕後,他第一次萌生出離開的想法。當時,由於 2004 年整體業績沒有達到預期,俞渝當著所有人的面對李國慶以近乎質問的語氣說“怎麼沒有完成?”

      一分鐘沉默后,李國慶當場向俞渝提出辭職,第二天,沒有來公司,但到了第三天,就沒事人一樣地回來了。

      夫妻本是同林鳥,一起創業老想分。對於這段關係,李國慶自己在朋友圈總結:“所謂的婚姻就是有時候很愛他,有時候想一槍崩了他,大多時候是在買槍的路上遇到了他愛吃的菜,買了菜卻忘記了買槍,回家過幾天想想,還得買槍”。

      Part 5

      相愛相殺        

      2015 年的雙十一過後,李國慶與劉強東在北京一家餐館喝酒,同席的是聚美優品的陳歐

      和李國慶賣書起家一樣,早年只做 3C 的劉強東,最初在中關村租了個攤位賣刻錄機和光盤,後來生意做大,搬到了海龍大廈。據說倆人離得最近的時候,從李國慶辦公室的窗戶往外探頭,就能看到劉強東在海龍大廈底下搬箱子。

      或許是因為兩人都在創業維艱時期被初戀拋棄過,惺惺相惜,所以在很長一段時間里,李國慶和劉強東走得很近,經常約在北大西門一起喝大酒吹牛,情到深處,還和凡客的陳年一起來了個三方之約:

      你在海龍做 3C,我在書店街做圖書,陳年在凡客賣背心,我們一起干馬雲!

      聽起來怪嚇人的,雖然傑克馬打得一手好太極,但是以一敵三也讓人揪心。誰知道,馬雲還沒有被干倒,劉強東就率先打破了這份君子協議。

      2010 年底京東商城啟動全品類戰略,切入了大哥的圖書領域。大哥受不了這個氣,立即在 2011 年對數碼電器自殺式降價,“我為什麼賣 3C 啊?很簡單,為了解氣。京東賣圖書我就賣 3C,我有錢!”李國慶還不忘氣勢滿滿地到處揚言“京東的資金熬不過年底”。

      劉強東也很生氣,他最討厭別人質疑他的經濟實力。索性在微博上邀請李國慶來查賬,京東賬上若低於 60 億現金,劉強東個人捐款 1000 萬元,否則對方捐 500 萬元。

      後來,這場賭局不了了之,這大概就是所謂商業默契。所以心裏亮堂堂的這兩位,肯定不會對雷軍和董明珠的 10 億賭約有過多期待。

      不過那時的李國慶面對京東價格戰,確實信心滿滿,在他眼裡,劉強東就是個不懂事的小弟,拋出一句“噹噹網做 3C 產品只是權宜之計,若對手放手噹噹也會放棄”。意思是,你京東要玩我就花錢陪你玩,反正你也玩不了多久。

      但李國慶沒想到,京東還真把這場價格戰打到底了——全場圖書 1 折起,滿 200 減 100、免費送、折上折……8000 萬的降價補貼,直接讓噹噹的 4000 萬補貼如同燒紙。

      李國慶這才開始着急,罵劉強東“既沒有戰略,又不懂事”,放着 4000 億的服裝市場不佔,跟噹噹搶 300 億圖書的小生意,沒出息啊。

      然而,此時已穩穩掌握主動權的劉強東,絲毫不受這位大哥的嘴炮攻擊影響,清點完戰場后,立馬又向老東家老虎基金和 DST 要了 15 億,調轉炮口開始壓制蘇寧和國美。2015 年,京東第三季度的總營收出爐——441 億美元,噹噹同期總營收僅為 23.71 億,相差整整 20 倍。

      到了 2016 年 9 月,噹噹網完成私有化退市,市值 5.37 億美元,不到上市高峰時刻的四分之一。一片唏噓和指責聲中,劉強東又陰陽怪氣地上來補了一刀:“國慶在微博說我壞話最多了,但我對李國慶從來沒有討厭過,我喜歡跟他喝酒,跟他聊天”。

      Part 6

      終        

    早年俞渝在接受《人民日報》採訪時說,嫁給李國慶是為了“做柔軟的幸福女人”

      噹噹上市的時候,李國慶沒顧忌俞渝就在旁邊,把自己的前女友也請來敲鐘,一夜夫妻百日恩,居然還給了些親友股。對於此事,他常常引以為傲。俞渝也不太在意,說給親友股,那是自己建議給的。

      究竟是誰的主意,已經沒必要去深究。那時候李國慶還是噹噹第一大股東,公司控制權牢牢攢在他手裡。

      這麼些年過去,噹噹每況日下,完成私有化以後,俞渝持股上升到 64.2%,而李國慶則只佔 27.51%。噹噹實際控制人已經變成了俞渝。

      待到李國慶評論劉強東事件的微博發出,噹噹網官方微博迅速撇清和他的關係,說李國慶早已離開噹噹管理層。除了對其言論進行“強烈譴責”,還勒令李國慶換掉其個人微博頭像中的噹噹 LOGO。

      遙想當年,李國慶在公開場合炫耀起自己的“六個女朋友”,俞渝只是波瀾不驚地在旁回了一句:

      李國慶在我生活里有很重要的位置,但是我想說的就是一個幸福的女人後面她一定有十個甚至二十個她的男朋友,這些男朋友在我們家名詞中間都叫超級備胎,有陪着買衣服的,有指導做飯的,有幫着讀書的,有帶孩子滑雪的,這些人都是男性,都是我的好朋友,他們中間大概有些人跟國慶也不錯。

      【參考資料】

      【1】陳實:《李國慶:活在“襠”下》.藍媒匯

      【2】吳曉波:《吳曉波:謝謝李國慶》.虎嗅網

      【3】黃秋麗:《豪客許家印》.中國企業家

      【4】王芳潔:《中國版蓋茨比許家印》.中國企業家

      【5】熊劍輝:《力挺俞敏洪的他,用 11 年干成老大,卻在之後 6 年掉隊到“寄人籬下”》.華商韜略

      【6】嚴沁雯:《隕落與上升李國慶和王興的格局對話》.財聯社

      【7】唐三角、呂蓓卡:《噹噹,你媽貴姓?》.山河路人

      【8】陳墨:《噹噹李國慶的三場炮戰》.每日人物

      【9】王燕青:《出版業想念當年的李國慶》.南方人物周刊

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

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

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

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

  • 他本和牛頓雙宿雙飛,卻因羞澀錯失物理第二魔王威名

    他本和牛頓雙宿雙飛,卻因羞澀錯失物理第二魔王威名

      來源:我是科學家 iScientist

      有這麼一個流傳甚廣的段子,說流行歌手林俊傑要是不努力,就只能回家繼承百億家產。

      但實際上歷史上還有比這更誇張的真實故事。

      他的父親是德文郡公爵家族小兒子,母親是肯特公爵的女兒,可謂富甲一方,真·“不好好科研,就只能繼承家產成為首富“。

      然而,他卻靠“牛頓之後英國最偉大的科學家”為人所知,如果他要和人攀比,根本輪不到要拼家產的地步。

    卡文迪許

      但這僅僅是我們主角卡文迪許故事的冰山一角,他作為一名偉大科學家的完全體還要等到百年後麥克斯韋的意外發現才被世人所了解。

      歐姆定律、庫倫定律、電勢、電場,這些成就都悶在了他的手稿里,如果全都公開發表,那卡文迪許可能就是繼牛頓之後又一個大魔王級的人物。

      但如果終究是如果,現實就是卡文迪許錯失了與偶像牛頓在物理課本里“雙宿雙飛”的機會。而這一切緣起於他的羞澀。

    卡文迪許

      一場 18 世紀的英國頂尖學術聚會上,卡文迪許身上穿着的都還是一套起皺的褪色西裝,外加一頂卷邊帽,靦腆地站在角落。

      不了解的人也許難以想象,眼前這個的衣着樸素的人竟是個百萬富翁,還是個跨越化學與物理兩界的科學奇才。

      要說是奇才,和他同時代的科學家可不覺得。因為在他們眼裡,卡文迪許並沒有那麼偉大。但在後人看來,他隱藏起來的科研成果才令人驚詫。

    卡文迪許

      100 多年後,麥克斯韋發現他遺留下 20 多捆從未面世的物理、化學研究手稿。

      庫侖定律、歐姆定律、介電常數等後人才提出的概念,赫然出現在筆記本上。一些時隔幾百年才提出的定律也早在 18 世紀就被卡文迪許證明了出來。

      他甚至被懷疑是擁有現代先進物理知識穿越者。

    詹姆斯·克拉克·麥克斯韋

      麥克斯韋用了 5 年的時間把這些資料整理成書。而這些疑似穿越的產物,才消除了人們對於卡文迪許的誤解。

      原來卡文迪許的古怪性格早已在科學界名聲昭著。他生性羞澀,幾乎不與人交談,甚至連自己的研究成果也羞於發表。科學怪人的一生只追求自己科研的爽快,也讓世人對他的景仰晚了 100 年。

      人們給他貼上不合群、內向、沉默寡言、古怪等標籤。童年的成長曆程在他身上刻下了這一個個深刻的烙印。

    卡文迪許

      卡文迪許出生在一個英國貴族家庭,兩歲時母親就去世了。身為勛爵的科學家父親一手帶大了他和弟弟,卻很少有時間給予陪伴。

      作為彌補,父親實驗室里各種科學儀器成了卡文迪許的玩具。而忙碌的父親有時不得不帶上他出席倫敦皇家學會等科學家聚會的場合。

    卡文迪許家裡的餐廳

      卡文迪許的科學啟蒙也就由此開始。童年的經歷開拓了他的科學視野,所以他從小就有了不錯的科學基礎。

      但硬邦邦的儀器取代了親情的關懷,卡文迪許幾乎沒有機會能夠與人交流。這讓他性格變得內向、沉默寡言,甚至疑似患有自閉症。

      他幾乎完全喪失了社交能力,但同時他也獲得了強大的思考能力。

    卡文迪許

      這樣古怪的性格也讓卡文迪許越發沉迷於科研工作。他 18 歲考上了劍橋大學,學習了四年數學。

      但就在即將拿到畢業學位的前夕,他卻退學了。理由是對最後的考試中,關於神學知識的測試部分不滿。於是他寧願捨棄畢業學位而任性地退學。

      出於家境的優越,放棄了學位的卡文迪許並沒有因此而失去學習機會。這反而讓他不止局限於學校的數學教學,他又學習了深感興趣的物理和化學。

      在離開劍橋后不久,他追隨父親的影子,加入了皇家學會。融入科學界的圈子中,他才找到自己的價值,在深耕真理中做出影響世界的偉大貢獻。

    英國皇家學會

      空氣的主要成分是氧氣、氮氣和二氧化碳。人類直到 18 世紀才發現,原來空氣的成分不止這些。

      卡文迪許在研究中發現了一種十分微量的惰性氣體。

      他用電火花消耗空氣中的氮氣時,出現了一些小氣泡。

      奇怪的是,無論實驗重複多少遍,最後都還會剩餘一些小氣泡不能被氧化。無論加入什麼試劑,這種氣泡都沒有消失。

      於是卡文迪許得出結論,空氣中除了氮氣和氧氣之外,還存在一種“濁氣”。這種“濁氣”非常穩定,而且總量不超過全部空氣的1/120。

      但這種氣體具體是什麼成分,卡文迪許就沒有繼續研究下去了。直到一百多年後,才有科學家依據卡文迪許當初的實驗,揭開了“濁氣”的真面目。

      物理學家瑞利重複卡文迪許當年的實驗得到小氣泡,測定出這種氣體的密度比氮氣大。

      化學家萊姆塞重新設計了一個新實驗,用分光鏡檢查后給其中一種新元素命了名。

      這是化學性質極其穩定的稀有氣體中的一種,氬氣。

      而位於元素周期表第一位的氫,也是在卡文迪許的研究下被人們認知。當時科學命名法還沒有誕生,普遍常見的氣體也只有俗名。

      比如氧氣在當時被稱為“消炎氣體”。而一種“易燃氣體”也引發了許多科學家的火熱研究。

    卡文迪許也摻了一腳,還難得向皇家學會提交的一篇研究報告《人造空氣》。

      他用鐵、鋅等活潑金屬和稀硫酸反應,發現反應會產生一種氣體。這種氣體和空氣混合後點燃會爆炸,因此被叫做“易燃氣體”。它和氧氣相互反應還能生成液態的水。

      在當時,人們還以為水是一種元素,不知道這是氫和氧的化合物。

      卡文迪許的實驗其實就是現代高中化學中都學過的置換反應。而生成的氣體就是氫氣。

      現在人們對於氫氣的性質已經非常熟悉。但在那個時候,繁多的反應卻像一扇扇從未打開的大門,吸引了天生好奇心強烈的科學家們。

    氫氣球爆炸

      卡文迪許跨域廣泛,除了化學之外,他對物理、天文、氣象等科學領域也有所研究。其中牛頓自然哲學觀點就對他產生了深遠的影響。

      地球有多重?自從牛頓發現萬有引力定律之後,這個問題似乎已經攻破在望。解決問題的關鍵在於計算出“萬有引力常數”。

      理論上來說,可以直接測量地面上兩個已知質量物體之間的引力求得。

      但實際上這個引力數值十分微小,測量起來非常困難。

      許多科學家為此設計了各種奇怪的模型進行計算,但始終難以攻克。

      在牛頓的理論影響下,卡文迪許從十幾歲就開始研究這個問題。

    卡文迪許設計的扭稱模型

      他在劍橋大學的學習中請教到了一種巧妙的“扭稱”方法。於是他自己也設計了一個能觀察到微小力變化的模型。

      他在一根細長桿的兩端分別裝上一個小鉛球,再用石英絲橫吊著鉛球。

      如果用兩個大一些的鉛球靠近,由於產生引力,小鉛球就會發生擺動。

      而石英絲也會跟隨扭動,這時只要測量出石英絲的扭轉程度,就可以求出引力。

      為了排除干擾,他專門在一間屋子里進行實驗,還用價格昂貴的望遠鏡在屋子外觀察。

      但是當時實驗條件差,他只能通過肉眼觀察判斷石英絲的扭轉程度。

      然而引力的作用程度實在是微乎其微,眼看成功近在眼前,實驗結果卻無從得到。卡文迪許的實驗只好卡在半途。

      直到一天,他在路上看到小孩在玩鏡子反射太陽光的遊戲。小小的太陽光反射點映照在地上到處跳動。

      這讓卡文迪許大受啟發。他立馬回到實驗室改進了自己的扭稱裝置。

      他把在裝置上增加了一面鏡子,用反射到刻度線上的光線度量石英絲的扭動。這樣一來,石英絲的靈敏度大大提高,再通過簡單的力的計算就得出了引力的大小。

      這個堪稱上帝之手的扭稱實驗掂量起地球的質量,牛頓或許也因此安息了。

      5. 976×10^24 千克,也就是大約 60 萬億億噸。卡文迪許花費了四十多年的時間才得出這一個數值,最終終結了這個萬有引力難題。他被譽為“第一個稱量地球的人”。

      以上大體就是當時人們能了解到的卡文迪許成就了,至於為什麼將其他發現藏着掖着,只要跟他有過些許交流就能理解。

      孤僻的性格讓卡文迪許全心專註於科研實驗。濃厚的學術氛圍是對他不善言辭性格的極大寬容。他從來不主動結交朋友,對異性更是越發羞澀。

      甚至在家裡,大部分時候和女傭都是靠傳紙條來進行交流的。所以他終身都沒有結婚。

      而作為大富豪,卡文迪許對於錢財和交際卻完全沒有概念。

      有一次,一位工匠為他粉刷房間,過後他忘了給工匠付工錢。好友是在看不下去,告訴了他這件事。

      卡文迪許大吃一驚,連忙寫了一張兩萬英鎊的支票,還詢問夠不夠。這在當時幾乎是工匠十年的薪酬了,而他卻毫不在意。

      對於社交活動,卡文迪許是本能地抗拒的,除了每周一次的皇家學會聚會。而在宴會上,他也只是躲在角落默默地聆聽其他科學家的發言。

      在這裏他不需要說話,卻能收穫到最前沿的科學觀點和想法。但別人卻很難從他口中得知他深邃的思想和正在進行的研究。

      一位比較了解他的友人調侃,要想聽到卡文迪許高明的見解,就不能再宴會上和他有任何交流,否則他會羞澀地立馬逃跑。

      人們大都只知道卡文迪許稱量地球的成就,但他最成功的預言還埋藏在他的手稿中。他對電的研究甚至直接證明了牛頓對未來自然科學的設想。

      他原本打算用這篇文章當做牛頓提出萬有引力的《原理》中的續篇。但卻因為他羞於發表,而失去了與牛頓同享榮譽的機會。

    曾經在皇家學會上發言的牛頓

      另外,他最早證明了電荷之間的相互作用力應該與距離的平方呈反比關係。

      在 1772-1773 年間,他作了個雙層同心球實驗,第一次精確測出電作用力與距離的關係,指數偏差不超過 0.02。

      後來法國人庫倫通過實驗驗證了他的發現,從此關於電荷間的受力規律被稱作庫倫定律。

    夏爾·奧古斯丁·庫侖

      他還第一個提出了電勢的概念,指出了電勢與電流的正比關係。

      由於當時沒有測定電流的儀器,卡文迪許就把自己的身體當做實驗儀器。根據身體的麻木感覺來估計電流的強弱,發現了導體兩端的電勢(差)與通過它的電流成正比。

      這也就是我們物理課本電學章節中的歐姆定律。

    格奧爾格·西蒙·歐姆

      後來麥克斯韋通過整理,才出版了卡文迪許手稿中關於電學的研究。而通過他本人的發表和後人的搜尋,才挖掘出卡文迪許冰山一角的研究成果。除了手稿之外,他還有多少不為人知的研究,我們也就不得而知了。

    骨子里的自閉也鑄造了卡文迪許孤獨的一生。

      直到將死之際,他還刻意把傭人打發走,讓她在某個時間點再回來。

      而回來時發現,卡文迪許已經死在了床上。極度的羞澀讓他連死亡都不想別人看見。

      默默無聞的卡文迪許為科學事業做出了偉大貢獻,一生中卻沒有得過什麼獎。

      後來,麥克斯韋為紀念這位隱蔽的偉大科學家,建立了以他命名的實驗室。迄今為止,卡文迪許實驗室已經培養出 20 多位諾貝爾物理獎的獲得者。

      原本用沉默掩蓋科研成果,他捨棄了與牛頓齊名物理學史的機會。但他在角落裡散發出來的萬丈光芒卻無法收斂。假設卡文迪許的手稿當初沒有被藏着,我們現在課本里的可能就不止有牛頓力學三定律,或許還有卡文迪許電學定理一、定理二……

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

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

    網頁設計一頭霧水??該從何著手呢? 找到專業技術的網頁設計公司,幫您輕鬆架站!

    ※想知道最厲害的台北網頁設計公司推薦台中網頁設計公司推薦專業設計師”嚨底家”!!

  • Java開發中常用jar包整理及使用

    Java開發中常用jar包整理及使用

    本文整理了我自己在Java開發中常用的jar包以及常用的API記錄。

    <!-- https://mvnrepository.com/artifact/org.apache.commons/commons-lang3 -->
            <dependency>
                <groupId>org.apache.commons</groupId>
                <artifactId>commons-lang3</artifactId>
                <version>3.8</version>
            </dependency>
            <!-- https://mvnrepository.com/artifact/commons-io/commons-io -->
            <dependency>
                <groupId>commons-io</groupId>
                <artifactId>commons-io</artifactId>
                <version>2.6</version>
            </dependency>
            <!-- https://mvnrepository.com/artifact/org.projectlombok/lombok -->
            <dependency>
                <groupId>org.projectlombok</groupId>
                <artifactId>lombok</artifactId>
                <version>1.18.8</version>
                <scope>provided</scope>
            </dependency>
            <dependency>
                <groupId>log4j</groupId>
                <artifactId>log4j</artifactId>
                <version>1.2.17</version>
            </dependency>

    common-lang3

    簡介

    一個現在最為常用的jar包,封裝了許多常用的工具包

    依賴:

    <!-- https://mvnrepository.com/artifact/org.apache.commons/commons-lang3 -->
    <dependency>
        <groupId>org.apache.commons</groupId>
        <artifactId>commons-lang3</artifactId>
        <version>3.4</version>
    </dependency>

    主要常見的類如下:

    • 數組工具類 ArrayUtils
    • 日期工具類 DateUtils DateFormatUtils
    • 字符串工具類 StringUtils
    • 数字工具類 NumberUtils
    • 布爾工具類 BooleanUtils
    • 反射相關工具類 FieldUtils、MethodUtils、MemberUtils、TypeUtils、ConstructorUtils
    • 對象工具類 ObjectUtils
    • 序列化工具類 SerializationUtils

    API介紹

    這裏我只介紹經常使用的幾個工具類及方法,ArrayUtils,StringUtils,NumberUtils,DateUtils,其他的請查看官方API文檔吧

    1.ArrayUtils

    方法名 說明
    add
    remove
    clone 複製數組
    addAll
    removeAll 第二個參數傳入需要刪除的下標(可以指定多個下標)
    toObject 把數值(int[],double[])轉為包裝類(Int[],Double[])
    indexOf 在數組按順序查找,找到第一個滿足對應的數值的下標
    lastIndexOf 在數組按順序查找,找到最後一個滿足對應的數值的下標
    contains 數組是否包含某個值
    isEmpty 判斷數組是否為空
    isNotEmpty 判斷數組是否不為空
    reverse 數組反轉
    subarray 指定區間截取數組,區間為半開區間,不包含末尾
    toArray 接收一個多個對象,把這幾個對象轉為對應類型的數組
    toMap 將一個二維數組轉為Map

    2.NumberUtils

    方法名 說明
    min 比較三個數,返回最小值 或比較指定的幾個數,返回最小值
    max 比較三個數,返回最大值 或比較指定的幾個數,返回最大值
    createInt 從傳入的String中創建對應類型的數值,createDouble,createFloat…
    toInt 將指定字符串轉為Int類型,可以選擇指定默認數值,如果字符串為null則返回默認數值,除此之外,還有toDouble,toLong…等轉為不同類型的方法
    compare 比較兩個同類型數值的大小
    isDigits 判斷字符串是否只包含数字
    isParsable 判斷字符串是否可轉換為Long,Int等類型
    isNumber 判斷字符串是否為數值(0x,0X開頭等進制數值)

    3.DateUtils

    方法名 說明
    parseDate 將Date對象轉為字符串
    isSameDay 判斷兩個Dated對象是否為同一天
    isSameDay 判斷兩個Dated對象是否為同一天
    addHour 將指定的Date對象加上指定小時,除此之外,還有addMonth,addDay..等

    DateFormatUtils正如其名,是用來把時間轉為字符串,這裏就不再多說

    4.StringUtils

    方法名 說明
    join 將指定的數組連接成字符串,並添加指定的分割字符
    containOnly 字符串是否只包含某個字符串
    substringBefore 截取指定字符串前面的內容
    substringAfter 截取指定字符串後面的內容(不包括指定字符串)
    substringBetween 截取字符串某區間內容,如substringBetween(“abcde”,”a”,”e”)=”bcd”
    difference 比較兩個字符串,返回兩個字符串不同的內容,具體可以看API文檔給出的示例
    isBlank 判斷字符串是否為空白,null,””,” “這三個結果都是為true
    isEmpty 判斷字符串是否為空(只要不為null,或傳入的String對象的長度不為0即為true)
    countMatches 判斷指定的字符串在某個字符串中出現的次數
    deleteWhitespace 刪除字符串中的空格
    defaultIfBlank 如果字符串為空白,則返回一個指定的默認值(null或某個String)
    defaultIfEmpty 如果字符串為空,則返回一個指定的默認值(null或某個String)
    capitalize 將指定字符串首字母大寫
    abbreviate 將指定字符串的後面三位轉為…
    swapCase 將字符串中的字母大小寫反轉,如aBc變為AbC
    lowerCase 將字符串的字母全部轉為小寫
    upperCase 將字符串的字母全部轉為大寫
    left 取字符串左邊幾個字符,如left(“hello”,3)=”hel”,right與此相反
    leftPad 字符串的長度不夠,則使用指定字符填充指定字符串,如leftPad(“hel”,5,”z”)=”zzhel”,rightPad方法與此相反
    prependIfMissing 指定字符串不以某段字符串開頭,則自動添加開頭,如prependIfMissing(“hello”,”li”)=”lihello”
    prependIfMissing 指定字符串不以某段字符串開頭(忽略大小寫),則自動添加開頭
    getCommonPrefix 獲得多個字符串相同的開頭內容,接收參數為多個字符串
    removeEnd 刪除字符串中結尾(滿足是以某段內容結尾),如removeEnd(“hello”,”llo”)=”he”
    removeEndIgnoreCase 與上面一樣,忽略大小寫
    removeStart 與上面的相反
    remove 刪除字符串中的指定內容,如remove(“hello”,”l”)=”heo”
    removeIgnoreCase 刪除字符串中的指定內容,如remove(“hello”,”l”)=”heo”
    strip 清除字符串開頭和末尾指定的字符(第二個參數為null,用來清除字符串開頭和末尾的空格),如strip(” abcxy”,”xy”)=” abc”,strip(” abcxy”,”yx”)=” abc”
    stripStart 清除字符串開頭指定字符
    stripEnd 清除字符串末尾指定的字符

    common-io

    簡介

    常用的IO流工具包

    <!-- https://mvnrepository.com/artifact/commons-io/commons-io -->
    <dependency>
        <groupId>commons-io</groupId>
        <artifactId>commons-io</artifactId>
        <version>2.6</version>
    </dependency>

    API

    我們主要關心的就是Utils後綴的那幾個類即可,可以看到,common-io庫提供了FileUtils,FileSystemUtils,FileNameUtils,FileFilterUtils,IOUtils

    FileUtils

    • 寫出文件
    • 讀取文件
    • 創建一個有父級文件夾的文件夾
    • 複製文件和文件夾
    • 刪除文件和文件夾
    • URL轉文件
    • 通過過濾器和擴展名來篩選文件和文件夾
    • 比較文件內容
    • 文件最後修改時間
    • 文件校驗

    FileSystemUtils

    關於文件系統的相關操作,如查看C盤的大小,剩餘大小等操作

    IOUtils

    字面意思,是封裝了IO流的各種操作的工具類

    Log4j

    簡介

    Log4J 是 Apache 的一個開源項目,通過在項目中使用 Log4J,我們可以控制日誌信息輸出到控制台、文件、GUI 組件、甚至是數據庫中。

    我們可以控制每一條日誌的輸出格式,通過定義日誌的輸出級別,可以更靈活的控制日誌的輸出過程,方便項目的調試。

    依賴:

    <dependency>
        <groupId>log4j</groupId>
        <artifactId>log4j</artifactId>
        <version>1.2.17</version>
    </dependency>

    結構

    Log4J 主要由 Loggers (日誌記錄器)、Appenders(輸出端)和 Layout(日誌格式化器)組成。

    其中Loggers 控制日誌的輸出級別與日誌是否輸出;
    Appenders 指定日誌的輸出方式(輸出到控制台、文件等);
    Layout 控制日誌信息的輸出格式。

    日誌級別:

    級別 說明
    OFF 最高日誌級別,關閉左右日誌
    FATAL 將會導致應用程序退出的錯誤
    ERROR 發生錯誤事件,但仍不影響系統的繼續運行
    WARN 警告,即潛在的錯誤情形
    INFO 一般和在粗粒度級別上,強調應用程序的運行全程
    DEBUG 一般用於細粒度級別上,對調試應用程序非常有幫助
    ALL 最低等級,打開所有日誌記錄

    我們主要使用這四個:Error>Warn>Info>Debug

    使用

    我們可以使用兩種方式來運行Log4j,一種是java代碼方式,另外一種則是配置文件方式

    例子(Java方式)

    public class Log4JTest {
        public static void main(String[] args) {   
            //獲取Logger對象的實例(傳入當前類)         
            Logger logger = Logger.getLogger(Log4JTest.class);
            //使用默認的配置信息,不需要寫log4j.properties
            BasicConfigurator.configure();
            //設置日誌輸出級別為WARN,這將覆蓋配置文件中設置的級別,只有日誌級別低於WARN的日誌才輸出
            logger.setLevel(Level.WARN);
            logger.debug("這是debug");
            logger.info("這是info");
            logger.warn("這是warn");
            logger.error("這是error");
            logger.fatal("這是fatal");
        }
    }

    例子(配置文件方式)

    上面的例子,我們想要實現打印Log,但是每次都要寫一遍,浪費時間和精力,所以,Log4j提供了另外一種方式來配置好我們的信息

    創建一個名為log4j.properties的文件,此文件需要放在項目的根目錄(約定),如果是maven項目,直接放在resources文件夾中即可

    log4j.properties

    #控制台
    log4j.appender.Console=org.apache.log4j.ConsoleAppender
    log4j.appender.Console.layout=org.apache.log4j.PatternLayout
    log4j.appender.Console.layout.ConversionPattern=%d [%t] %-5p [%c] - %m%n
    
    #log jdbc
    log4j.logger.java.sql.ResultSet=INFO
    log4j.logger.org.apache=WARN
    log4j.logger.java.sql.Connection=DEBUG
    log4j.logger.java.sql.Statement=DEBUG
    log4j.logger.java.sql.PreparedStatement=DEBUG
    
    #log mybatis設置
    #log4j.logger.org.apache.ibatis=DEBUG
    log4j.logger.org.apache.ibatis.jdbc=error
    log4j.logger.org.apache.ibatis.io=info
    log4j.logger.org.apache.ibatis.datasource=info
    
    #springMVC日誌
    log4j.logger.org.springframework.web=WARN
    
    # 文件輸出配置
    log4j.appender.A = org.apache.log4j.DailyRollingFileAppender
    log4j.appender.A.File = D:/log.txt #指定日誌的輸出路徑
    log4j.appender.A.Append = true
    log4j.appender.A.Threshold = DEBUG
    log4j.appender.A.layout = org.apache.log4j.PatternLayout #使用自定義日誌格式化器
    log4j.appender.A.layout.ConversionPattern = %-d{yyyy-MM-dd HH:mm:ss}  [ %t:%r ] - [ %p ]  %m%n #指定日誌的輸出格式
    log4j.appender.A.encoding=UTF-8 #指定日誌的文件編碼
    
    #指定日誌的輸出級別與輸出端
    log4j.rootLogger=DEBUG,Console,A
    
    #指定某個包名日誌級別(不能超過上面定義的級別,否則日誌不會輸出)
    log4j.logger.com.wan=DEBUG

    之後使用的話就比較簡單了

    //Logger的初始化(這個推薦定義為全局變量,方便使用)
    Logger logger = Logger.getLogger(Log4JTest.class);
    //輸出Log
    logger.info("這是info");

    參考鏈接:

    lombok

    簡介

    平常我們創建實體類的時候,需要get/set方法,極其麻煩,雖然IDEA等IDE都是有提供了快捷生成,不過,最好的解決方法還是省略不寫

    而lombok就是這樣的一個框架,實現省略get/set方法,當然,lombok的功能不只有此,還有equal,toString方法也可以由此框架自動生成

    lombok的原理是使用註解,之後就會在編譯過程中,給Class文件自動加上get/set等方法

    不過IDEA似乎無法識別,代碼檢查還是會報錯,所以,使用IDEA的時候還得安裝一個插件,在plugin搜索lombok,之後安裝重啟即可,如圖

    之後為Java項目添加依賴

    <!-- https://mvnrepository.com/artifact/org.projectlombok/lombok -->
    <dependency>
        <groupId>org.projectlombok</groupId>
        <artifactId>lombok</artifactId>
        <version>1.18.8</version>
        <scope>provided</scope>
    </dependency>

    使用示例

    1.實體類省略get/set
    估計Kotlin中的data關鍵字就是參照着lombok實現的

    //這裏我們只需要為類添加Data註解,就會自動生成對應屬性的get/set方法,toString,equal等方法
    @Data
    public class User {
        private String username;
        private String password;
    }

    2.需要無參構造以及get/set方法

    @Getter
    @Setter
    @NoArgsConstructor
    public class User {
        private String username;
        private String password;
    }

    3.鏈式調用set方法

    @Data
    @Accessors(chain = true)
    public class User {
        private String username;
        private String password;
    }
    
    //使用
    User user = new User();
    user.setUsername("helo").setPassword("123");

    4.參數不為空

    //如果調用此方法,就會抱一個空指針錯誤
    public String print(@NotNull String str){
        ...
    }

    5.只需要toString

    @ToString(callSuper=true, includeFieldNames=true)
    public class User {
        private String username;
        private String password;
        //省略的get/set方法
    }

    6.builder模式創建實體類對象

    @Data
    @Builder
    public class User {
        private String username;
        private String password;
    }
    //使用
    User user1 = User.builder().username("user1").password("123").build();

    7.工具類

    @UtilityClass
    public class MyUtils{
        //會將此方法自動轉為靜態方法
        public void print(String str){
            ...
        }
    }
    //使用
    MyUtils.print("hello");

    8.自動關閉流

    public static void main(String[] args) throws Exception {
        //使用Cleanup會自動調用close方法
        @Cleanup InputStream in = new FileInputStream(args[0]);
        @Cleanup OutputStream out = new FileOutputStream(args[1]);
        byte[] b = new byte[1024];
        while (true) {
            int r = in.read(b);
            if (r == -1) break;
            out.write(b, 0, r);
        }
    }

    9.省略Logger時的初始化

    @Log4j
    @Log
    public class User{
        //會自動添加此語句
        //Logger logger = Logger.getLogger(User.class);
        ...
    }

    參考:

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

    台北網頁設計公司這麼多,該如何挑選?? 網頁設計報價省錢懶人包"嚨底家"

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

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

  • 坑~夏令時冬令時引發的時間換算問題

     

    起因

    最近接觸到一些國外的項目,由於國內外有時差這個東西,對於某些基礎數據存到數據庫的時候需要記錄時間,為了方便,這裏採用了時間戳(int或者timestamp)記錄。由於時間戳全球都是一樣的,需要的時候根據時區進行轉換就能夠拿到當地的時間。

    嗯~ o(* ̄▽ ̄*)o,這樣看起來確實沒什麼毛病。眾所周知,一天有24小時,換算成秒就是:24*60*60=86400秒。

    然而,我在某次使用 MySql 的 FROM_UNIXTIME 發現一個問題,兩個時間相差86400秒,但是格式化之後卻不是相差一天!!!

    假設北京時間2019年11月25日 12:00:00,對應的時間戳是:1574654400,照理說這個時間戳加上一天86400秒,理論上就是北京時間2019年11月26日 12:00:00,事實上確實如此,國內的話這麼算確實沒什麼問題,但是如果是國外時區的話,那可能會出問題。

    由於國外部分國家有夏令時冬令時之分(具體下面會細說),直接加上86400秒可能會有問題。

    感興趣的可以拿1572764400(太平洋時間2019-11-03 00:00:00,單位:)這個時間戳驗證下

    拿代碼演示下:

    PHP:

    <?php
    
    echo "PST時區的時間\n";
    date_default_timezone_set('PST8PDT');
    echo date('Y-m-d H:i:s',1572764400);
    echo "\n";
    echo date('Y-m-d H:i:s',1572764400+86400);
    echo "\n";
    
    //換個時區
    echo "換成上海時區看看\n";
    date_default_timezone_set('Asia/Shanghai');
    echo date('Y-m-d H:i:s',1572764400);
    echo "\n";
    echo date('Y-m-d H:i:s',1572764400+86400);
    echo "\n";

    運行結果:

    PST時區的時間
    2019-11-03 00:00:00
    2019-11-03 23:00:00
    換成上海時區看看
    2019-11-03 15:00:00
    2019-11-04 15:00:00

    明明是同一個時間戳,都是加上86400(一天),為什麼在上海這個時區是第二天,而在PST(美國太平洋時區)只加了23小時?神不神奇!意不意外!

    為了弄清楚這個問題,首先得先了解下什麼是夏令時,什麼是冬令時

     

    夏令時

    夏令時,表示為了節約能源,人為規定時間的意思。也叫夏時制,夏時令(Daylight Saving Time:DST),又稱“日光節約時制”和“夏令時間”,在這一制度實行期間所採用的統一時間稱為“夏令時間”。

    一般在天亮早的夏季人為將時間調快一小時,可以使人早起早睡,減少照明量,以充分利用光照資源,從而節約照明用電。各個採納夏時制的國家具體規定不同。目前全世界有近110個國家每年要實行夏令時。[1]

     

    冬令時

    有夏令時就會有冬令時。高緯度和中緯度的許多國家在夏季到來前,把時針撥快一小時,新的時間就是夏令時,到下半季秋季來臨前,再把時針撥回一小時,即形成冬令時。 [2] 

     

    夏令時和冬令時的影響

    拿美國來說,美國各個地區的時間都不同,不像中國一樣統一使用北京時間,美國一般以三月份第二個周日凌晨兩點當成夏季的開始,十一月份第一個周日的凌晨兩點當成冬季的開始。

    所以在每年的三月份第二個周日凌晨兩點過後,時間就會往前調快一個小時;同理,十一月份第一個周日把這一個小時調回來

    你也可以理解成美國那邊,一年裡面有一天只有23小時(夏天開始那一天),有一天有25小時(冬天開始那一天),其他時間每天都是24小時。

    所以你會發現,夏天的時候,中國的北京時間(東八區)與美國太平洋時區(西八區)的時差是15小時,而到了冬天卻變成16小時

     

    解決方案

    回到開頭那個問題,如果我們想直接算第二天,直接加上86400(一天)可能在其他國家就會有我上面那個夏令時和冬令時時間換算的問題,要如何避免呢?首先能夠確定的是,直接加上86400是不可取的,如果加上一天能否行得通

    PHP:

    <?php
    
    echo "PST時區的時間\n";
    date_default_timezone_set('PST8PDT');
    echo date('Y-m-d H:i:s',1572764400);
    echo "\n";
    echo date('Y-m-d H:i:s',1572764400+86400);
    echo "\n";
    
    echo "--------------------------\n";
    echo date('Y-m-d H:i:s',1572764400);
    echo "\n";
    echo date('Y-m-d H:i:s',strtotime('+1 day',1572764400));
    echo "\n";

    運行結果:

    PST時區的時間
    2019-11-03 00:00:00
    2019-11-03 23:00:00
    --------------------------
    2019-11-03 00:00:00
    2019-11-04 00:00:00

    可以看出,不直接加上86400,直接在日期上加上一天是完全沒問題的。

    JavaScript:

    var date = new Date(1572764400*1000);
    date.setDate(date.getDate()+1);
    var timestamp = Math.round(date.getTime()/1000);

    注意:JS的時間戳是毫秒!!!

     

    結論

    在經濟全球化快速發展的今天,在軟件開發的過程中,盡量養成習慣,由於夏令時和冬令時不是固定的,開發在時間計算上應該慎用86400進行加減運算,時間計算請直接對日期進行加減,展示時間給用戶看的時候盡量結合當地時間,結合夏令時和冬令時計算出準確的當地時間,避免產生不必要的分歧。

     

    參考:

    [1]. 

    [2]. 

     

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

    ※想知道網站建置網站改版該如何進行嗎?將由專業工程師為您規劃客製化網頁設計後台網頁設計

    ※不管是台北網頁設計公司台中網頁設計公司,全省皆有專員為您服務

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

    ※帶您來看台北網站建置台北網頁設計,各種案例分享

  • .NET高級特性-Emit(2)類的定義,.NET高級特性-Emit(1)

    .NET高級特性-Emit(2)類的定義,.NET高級特性-Emit(1)

      在上一篇博文發了一天左右的時間,就收到了博客園許多讀者的評論和推薦,非常感謝,我也會及時回復讀者的評論。之後我也將繼續撰寫博文,梳理相關.NET的知識,希望.NET的圈子能越來越大,開發者能了解/深入.NET的本質,將工作做的簡單又高效,拒絕重複勞動,拒絕CRUD。

      ok,咱們開始繼續Emit的探索。在這之前,我先放一下我往期關於Emit的文章,方便讀者閱讀。

      《》

    一、基礎知識

      既然C#作為一門面向對象的語言,所以首當其沖的我們需要讓Emit為我們動態構建類。

      廢話不多說,首先,我們先來回顧一下C#類的內部由什麼東西組成:

      (1) 字段-C#類中保存數據的地方,由訪問修飾符、類型和名稱組成;

      (2) 屬性-C#類中特有的東西,由訪問修飾符、類型、名稱和get/set訪問器組成,屬性的是用來控制類中字段數據的訪問,以實現類的封裝性;在Java當中寫作getXXX()和setXXX(val),C#當中將其變成了屬性這種語法糖;

      (3) 方法-C#類中對邏輯進行操作的基本單元,由訪問修飾符、方法名、泛型參數、入參、出參構成;

      (4) 構造器-C#類中一種特殊的方法,該方法是專門用來創建對象的方法,由訪問修飾符、與類名相同的方法名、入參構成。

      接着,我們再觀察C#類本身又具備哪些東西:

      (1) 訪問修飾符-實現對C#類的訪問控制

      (2) 繼承-C#類可以繼承一個父類,並需要實現父類當中所有抽象的方法以及選擇實現父類的虛方法,還有就是子類需要調用父類的構造器以實現對象的創建

      (3) 實現-C#類可以實現多個接口,並實現接口中的所有方法

      (4) 泛型-C#類可以包含泛型參數,此外,類還可以對泛型實現約束

      以上就是C#類所具備的一些元素,以下為樣例:

    public abstract class Bar
    {
        public abstract void PrintName();
    }
    public interface IFoo<T> { public T Name { get; set; } } //繼承Bar基類,實現IFoo接口,泛型參數T
    public class Foo<T> : Bar, IFoo<T>
      //泛型約束
      where T : struct {
    //構造器 public Foo(T name):base() { _name = name; } //字段 private T _name; //屬性 public T Name { get => _name; set => _name = value; } //方法 public override void PrintName() {
        Console.WriteLine(_name.ToString()); }
    }

      在探索完了C#類及其定義后,我們要來了解C#的項目結構組成。我們知道C#的一個csproj項目最終會對應生成一個dll文件或者exe文件,這一個文件我們稱之為程序集Assembly;而在一個程序集中,我們內部包含和定義了許多命名空間,這些命令空間在C#當中被稱為模塊Module,而模塊正是由一個一個的C#類Type組成。

     

     

     

       所以,當我們需要定義C#類時,就必須首先定義Assembly以及Module,如此才能進行下一步工作。

    二、IL概覽

       由於Emit實質是通過IL來生成C#代碼,故我們可以反向生成,先將寫好的目標代碼寫成cs文件,通過編譯器生成dll,再通過ildasm查看IL代碼,即可依葫蘆畫瓢的編寫出Emit代碼。所以我們來查看以下上節Foo所生成的IL代碼。

      

     

     

       從上圖我們可以很清晰的看到.NET的層級結構,位於樹頂層淺藍色圓點表示一個程序集Assembly,第二層藍色表示模塊Module,在模塊下的均為我們所定義的類,類中包含類的泛型參數、繼承類信息、實現接口信息,類的內部包含構造器、方法、字段、屬性以及它的get/set方法,由此,我們可以開始編寫Emit代碼了

    三、Emit編寫

      有了以上的對C#類的解讀和IL的解讀,我們知道了C#類本身所需要哪些元素,我們就開始根據這些元素來開始編寫Emit代碼了。這裏的代碼量會比較大,請讀者慢慢閱讀,也可以參照以上我寫的類生成il代碼進行比對。

      在Emit當中所有創建類型的幫助類均以Builder結尾,從下錶中我們可以看的非常清楚

    元素中文 元素名稱 對應Emit構建器名稱
    程序集  Assembly AssemblyBuilder
    模塊  Module ModuleBuilder
     Type TypeBuilder
    構造器  Constructor ConstructorBuilder
    屬性  Property PropertyBuilder
    字段  Field FieldBuilder
    方法  Method MethodBuilder

      由於創建類需要從Assembly開始創建,所以我們的入口是AssemblyBuilder

      (1) 首先,我們先引入命名空間,我們以上節Foo類為樣例進行編寫

    using System.Reflection.Emit;

      (2) 獲取基類和接口的類型

    var barType = typeof(Bar);
    var interfaceType = typeof(IFoo<>);

      (3) 定義Foo類型,我們可以看到在定義類之前我們需要創建Assembly和Module

    //定義類
    var assemblyBuilder = AssemblyBuilder.DefineDynamicAssembly(new AssemblyName("Edwin.Blog.Emit"), AssemblyBuilderAccess.Run);
    var moduleBuilder = assemblyBuilder.DefineDynamicModule("Edwin.Blog.Emit");
    var typeBuilder = moduleBuilder.DefineType("Foo", TypeAttributes.Public | TypeAttributes.Class | TypeAttributes.AutoClass | TypeAttributes.AnsiClass | TypeAttributes.BeforeFieldInit);

      (4) 定義泛型參數T,並添加約束

    //定義泛型參數
    var genericTypeBuilder = typeBuilder.DefineGenericParameters("T")[0];
    //設置泛型約束
    genericTypeBuilder.SetGenericParameterAttributes(GenericParameterAttributes.NotNullableValueTypeConstraint);

      (5) 繼承和實現接口,注意當實現類的泛型參數需傳遞給接口時,需要將泛型接口添加泛型參數后再調用AddInterfaceImplementation方法

    //繼承基類
    typeBuilder.SetParent(barType);
    //實現接口
    typeBuilder.AddInterfaceImplementation(interfaceType.MakeGenericType(genericTypeBuilder));

      (6) 定義字段,因為字段在構造器值需要使用,故先創建

    //定義字段
    var fieldBuilder = typeBuilder.DefineField("_name", genericTypeBuilder, FieldAttributes.Private);

      (7) 定義構造器,並編寫內部邏輯

    //定義構造器
    var ctorBuilder = typeBuilder.DefineConstructor(MethodAttributes.Public | MethodAttributes.HideBySig | MethodAttributes.SpecialName | MethodAttributes.RTSpecialName, CallingConventions.Standard, new Type[] { genericTypeBuilder });
    var ctorIL = ctorBuilder.GetILGenerator();
    //Ldarg_0在實例方法中表示this,在靜態方法中表示第一個參數
    ctorIL.Emit(OpCodes.Ldarg_0);
    ctorIL.Emit(OpCodes.Ldarg_1);
    //為field賦值
    ctorIL.Emit(OpCodes.Stfld, fieldBuilder);
    ctorIL.Emit(OpCodes.Ret);

      (8) 定義Name屬性

    //定義屬性
    var propertyBuilder = typeBuilder.DefineProperty("Name", PropertyAttributes.None, genericTypeBuilder, Type.EmptyTypes);

      (9) 編寫Name屬性的get/set訪問器

    //定義get方法
    var getMethodBuilder = typeBuilder.DefineMethod("get_Name", MethodAttributes.Public | MethodAttributes.HideBySig | MethodAttributes.NewSlot | MethodAttributes.SpecialName | MethodAttributes.Virtual, CallingConventions.Standard, genericTypeBuilder, Type.EmptyTypes);
    var getIL = getMethodBuilder.GetILGenerator();
    getIL.Emit(OpCodes.Ldarg_0);
    getIL.Emit(OpCodes.Ldfld, fieldBuilder);
    getIL.Emit(OpCodes.Ret);
    typeBuilder.DefineMethodOverride(getMethodBuilder, interfaceType.GetProperty("Name").GetGetMethod()); //實現對接口方法的重載
    propertyBuilder.SetGetMethod(getMethodBuilder); //設置為屬性的get方法
    //定義set方法
    var setMethodBuilder = typeBuilder.DefineMethod("set_Name", MethodAttributes.Public | MethodAttributes.HideBySig | MethodAttributes.NewSlot | MethodAttributes.SpecialName | MethodAttributes.Virtual, CallingConventions.Standard, null, new Type[] { genericTypeBuilder });
    var setIL = setMethodBuilder.GetILGenerator();
    setIL.Emit(OpCodes.Ldarg_0);
    setIL.Emit(OpCodes.Ldarg_1);
    setIL.Emit(OpCodes.Stfld, fieldBuilder);
    setIL.Emit(OpCodes.Ret);
    typeBuilder.DefineMethodOverride(setMethodBuilder, interfaceType.GetProperty("Name").GetSetMethod()); //實現對接口方法的重載
    propertyBuilder.SetSetMethod(setMethodBuilder); //設置為屬性的set方法

       (10) 定義並實現PrintName方法

    //定義方法
    var printMethodBuilder = typeBuilder.DefineMethod("PrintName", MethodAttributes.Public | MethodAttributes.HideBySig | MethodAttributes.Virtual, CallingConventions.Standard, null, Type.EmptyTypes);
    var printIL = printMethodBuilder.GetILGenerator();
    printIL.Emit(OpCodes.Ldarg_0);
    printIL.Emit(OpCodes.Ldflda, fieldBuilder);
    printIL.Emit(OpCodes.Constrained, genericTypeBuilder);
    printIL.Emit(OpCodes.Callvirt, typeof(object).GetMethod("ToString", Type.EmptyTypes));
    printIL.Emit(OpCodes.Call, typeof(Console).GetMethod("WriteLine", new Type[] { typeof(string) }));
    printIL.Emit(OpCodes.Ret);
    //實現對基類方法的重載
    typeBuilder.DefineMethodOverride(printMethodBuilder, barType.GetMethod("PrintName", Type.EmptyTypes));

      (11) 創建類

    var type = typeBuilder.CreateType(); //netstandard中請使用CreateTypeInfo().AsType()

      (12) 調用

    var obj = Activator.CreateInstance(type.MakeGenericType(typeof(DateTime)), DateTime.Now);
    (obj as Bar).PrintName();
    Console.WriteLine((obj as IFoo<DateTime>).Name);

    四、應用

      上面的樣例僅供學習只用,無法運用在實際項目當中,那麼,Emit構建類在實際項目中我們可以有什麼應用,提高我們的編碼效率

      (1) 動態DTO-當我們需要將實體映射到某個DTO時,可以用動態DTO來代替你手寫的DTO,選擇你需要的字段回傳給前端,或者前端把他想要的字段傳給後端

      (2) DynamicLinq-我的第一篇博文有個讀者提到了表達式樹,而linq使用的正是表達式樹,當表達式樹+Emit時,我們就可以用像SQL或者GraphQL那樣的查詢語句實現動態查詢

      (3) 對象合併-我們可以編寫實現一個像js當中Object.assign()一樣的方法,實現對兩個實體的合併

      (4) AOP動態代理-AOP的核心就是代理模式,但是與其對應的是需要手寫代理類,而Emit就可以幫你動態創建代理類,實現切面編程

      (5) …

    五、小結

      對於Emit,確實初學者會對其感到複雜和難以學習,但是只要搞懂其中的原理,其實最終就是C#和.NET語言的本質所在,在學習Emit的同時,也是在鍛煉你的基本功是否紮實,你是否對這門語言精通,是否有各種簡化代碼的應用。

      保持學習,勇於實踐;Write Less,Do More;作者之後還會繼續.NET高級特性系列,感謝閱讀!

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

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

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

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