回憶源碼
❶ 電影《源代碼》結局什麼意思
現實中,主角本來的身體就只剩下了半截,靠維生設備維持著腦波之類的東西。那個瘸子科學家就用這點僅存的腦波進行試驗。在火車上的是另外一個人,可能他們的腦波頻率等很多特徵都接近,就借用了他的身體去解除炸彈。
由於平行理論,火車上的人在另外一個平行空間還活著。當主角的半截身體還活著時,主角的思維已經在火車上那個人身上了,切斷維持半截身體的供給,半截身體死亡,主角的靈魂或思維就寄存在了火車上那個人身上了,以那個人的身份生活下去了。
(1)回憶源碼擴展閱讀
影片《源代碼》是由鄧肯·瓊斯執導,傑克·吉倫哈爾、維拉·法米加、米歇爾·莫娜漢等人聯袂出演。影片於2011年4月1日在美國上映。
影片講述了一位在阿富汗執行任務的美國空軍飛行員柯爾特·史蒂文斯,醒來時發現自己正處在一輛前往芝加哥的火車上,並就此經歷的一系列驚心動魄的事件。
「咚,咚」「呼,呼」,急促的心跳聲和喘息聲震耳欲聾。一切都開始模糊,繼而扭曲變形。然後,一陣尖銳的火車汽笛聲,將柯爾特·斯蒂文斯上尉(傑克·吉倫哈爾 飾演)拉回了現實。窗外,是疾馳倒退的綠地。坐在他對面的女子(米歇爾·莫娜漢 飾演)疑惑地看著走神的他,又繼續著話題,柯爾特突然覺得頭皮發麻。
柯爾特意識到只有一種方法可以證明真相。他沖向洗手間,直愣愣地盯著裡面的鏡子,出現在鏡子里的人,是一個身著呢子大衣、藍色襯衫,眼中帶著幾分驚恐的中年男子。不是他自己,至少不是他印象中的自己。還沒等他驚魂落定,一股強大的爆炸氣流襲來,整列列車在烈火中被炸成碎片。猛然睜開雙眼,柯爾特驚疑地看著四周,他發現自己身處一個獨立的空間里,穿著本就屬於他的軍服。
❷ 存儲性能優化 MMKV源碼解析
好久沒有更新常用的第三方庫了。讓我們來聊聊MMKV這個常用的第三方庫。MMKV這個庫是做什麼的呢?他本質上的定位和sp有點相似,經常用於持久化小數據的鍵值逗啟喚對。其速度可以說是當前所有同類型中速度最快,性能最優的庫。
它的最早的誕生,主要是因為在微信iOS端有一個重大的bug,一個特殊旁塵的文本可以導致微信的山凱iOS端閃退,而且還出現了不止一次。為了統計這種閃退的字元出現頻率以及過濾,但是由於出現的次數,發現原來的鍵值對存儲組件NSUserDefaults根本達不到要求,會導致cell的滑動卡頓。
因此iOS端就開始創造一個高新性能的鍵值對存儲組件。於此同時,Android端SharedPreferences也有如下幾個缺點:
因此Android也開始復用iOS的MMKV,而後Android有了多進程的寫入數據的需求,Android組又在這個基礎上進行改進。
這里是官方的性能的比較圖:
能看到mmkv比起我們開發常用的組件要快上數百倍。
那麼本文將會從源碼角度圍繞MMKV的性能為什麼會如此高,以及SharePrefences為什麼可能出現ANR的原因。
請注意下文是以MMKV 1.1.1版本源碼為例子分析。如果遇到什麼問題歡迎來到本文 https://www.jianshu.com/p/c12290a9a3f7 互相討論。
老規矩,先來看看MMKV怎麼使用。mmkv其實和SharePrefences一樣,有增刪查改四種操作。
MMKV作為一個鍵值對存儲組件,也對了存儲對象的序列化方式進行了優化。常用的方式比如有json,Twitter的Serial。而MMKV使用的是Google開源的序列化方案:Protocol Buffers。
Protocol Buffers這個方案比起json來說就高級不少:
使用方式可以閱讀下面這篇文章: https://www.jianshu.com/p/e8712962f0e9
下面進行比較幾個對象序列化之間的要素比較
而MMKV就是看重了Protocol Buffers的時間開銷小,選擇Protocol Buffers進行對象緩存的核心。
使用前請初始化:
當然mmkv除了能夠寫入這些基本類型,只要SharePrefences支持的,它也一定能夠支持。
同上,每一個key讀取的數據類型就是decodexxx對應的類型名字。使用起來十分簡單。
能夠刪除單個key對應的value,也能刪除多個key分別對應的value。containsKey判斷mmkv的磁碟緩存中是否存在對應的key。
mmkv和SharePrefences一樣,還能根據模塊和業務劃分對應的緩存文件:
這里創建了一個id為a的實例在磁碟中,進行數據的緩存。
當需要多進程緩存的時候:
MMKV可以使用Ashmem的匿名內存進行更加快速的大對象傳輸:
進程1:
最重要的一點,mmkv把SharePrefences的緩存遷移到mmkv中,之後的使用就和SharePrefences一致。
這里就是把SharedPreferences的myData數據遷移到mmkv中。當然如果我們需要保持SharePreferences的用法不變需要自己進行自定義一個SharePreferences。
mmkv的用法極其簡單,接下來我們關注他的原理。
首先來看看MMKV的初始化。
能看到實際上initialize分為如下幾個步驟:
能看到其實就是做這個判斷。由於此時設置的是libc++的打包方式。此時BuildConfig.FLAVOR就是StaticCpp,就不會載入c++_shared。當然,如果我們已經使用了c++_shared庫,則沒有必要打包進去,使用defaultPublishConfig "SharedCppRelease"會嘗試的查找動態鏈接庫_shared。這樣就能少2M的大小。
請注意一個前提的知識,jni的初始化,在調用了 System.loadLibrary之後,會通過dlopen把so載入到內存後,調用dlsym,調用jni中的JNI_OnLoad方法。
實際上這裡面做的事情十分簡單:
能從這些native方法中看到了所有MMKV的存儲方法,設置支持共享內存ashemem的存儲,支持直接獲取native malloc申請的內存
接下來就是MMKV正式的初始化方法了。
這個方法實際上調用的是pthread_once方法。它一般是在多線程環境中,根據內核的調度策略,選擇一個線程初始化一次的方法。
其實這裡面的演算法很簡單:
defaultMMKV此時調用的是getDefaultMMKV這個native方法,默認是單進程模式。從這里的設計都能猜到getDefaultMMKV會從native層實例化一個MMKV對象,並且讓實例化好的java層MMKV對象持有。之後Java層的方法和native層的方法一一映射就能實現一個直接操作native對象的Java對象。
我們再來看看MMKV的mmkvWithID。
感覺上和defaultMMKV有點相似,也是調用native層方法進行初始化,並且讓java層MMKV對象持有native層。那麼我們可否認為這兩個實例化本質上在底層調用同一個方法,只是多了一個id設置呢?
可以看看MMKV.h文件:
這里就能看到上面的推測是正確的,只要是實例化,最後都是調用mmkvWithID進行實例化。默認的mmkv的id就是mmkv.default。Android端則會設置一個默認的page大小,假設4kb為例子。
所有的mmkvID以及對應的MMKV實例都會保存在之前實例化的g_instanceDic散列表中。其中mmkv每一個id對應一個文件的路徑,其中路徑是這么處理的:
如果發現對應路徑下的mmkv在散列表中已經緩存了,則直接返回。否則就會把相對路徑保存下來,傳遞給MMKV進行實例化,並保存在g_instanceDic散列表中。
我們來看看MMKV構造函數中幾個關鍵的欄位是怎麼初始化。
mmkvID就是經過md5後對應緩存文件對應的路徑。
能看到這里是根據當前的mode初始化id,如果不是ashmem匿名共享內存模式進行創建,則會和上面的處理類似。id就是經過md5後對應緩存文件對應的路徑。
注意這里mode設置的是MMKV_ASHMEM,也就是ashmem匿名共享內存模式則是如下創建方法:
實際上就是在驅動目錄下的一個內存文件地址。
接下來,在構造函數中使用了共享的文件鎖進行保護後,調用loadFromFile進一步的初始化MMKV內部的數據。
我們大致的了解MMKV中每一個欄位的負責的職責,但是具體如何進行工作下文都會解析。
在這裡面我們遇到了看起來十分核心的類MemoryFile,它的名字有點像 Ashmem匿名共享內存 一文中描述過Java層的映射的匿名內存文件。
我們先來看看MemoryFile的初始化。
MemeoryFile分為兩個模式進行初始化:
這里的處理很簡單:
能看到此時將會調用mmap系統調用,通過設置標志位可讀寫,MAP_SHARED的模式進行打開。這樣就file就在在內核中映射了一段4kb內存,以後訪問文件可以不經過內核,直接訪問file映射的這一段內存。
關於mmap系統調用的源碼解析可以看這一篇 Binder驅動的初始化 映射原理 。
能看到在這個過程中實際上還是通過ftruncate進行擴容,接著調用zeroFillFile,先通過lseek把指針移動當前容量的最後,並把剩餘的部分都填充空數據'\0'。最後映射指向的地址是有效的,會先解開後重新進行映射。
為什麼要做最後這個步驟呢?如果閱讀過我解析的mmap的源碼一文,實際上就能明白,file使用MAP_SHARED的模式本質上是給file結構體綁定一段vma映射好的內存。ftruncate只是給file結構體進行了擴容,但是還沒有對對應綁定虛擬內存進行擴容,因此需要解開一次映射後,重新mmap一次。
MMKV在如果使用Ashmem模式打開:
接下來loadFromFile 這個方法可以說是MMKV的核心方法,所有的讀寫,還是擴容都需要這個方法,從映射的文件內存,緩存到MMKV的內存中。
進入到這個方法後進行如下的處理:
在這里,遇到了一個比較有歧義的欄位m_version ,從名字看起來有點像MMKV的版本號。其實它指代的是MMKV當前的狀態,由一個枚舉對象代表:
注意m_vector是一個長度16的char數組。其實很簡單,就是把文件保存的m_vector獲取16位拷貝到m_metaInfo的m_vector中。因為aes的加密必須以16的倍數才能正常運作。
初始化分為這6點,我們從最後三點開始聊聊MMKV的初始化的核心邏輯。我們還需要開始關注MMKV中內存存儲的結構。
能看到首先從m_file獲取映射的指針地址,往後讀取4位數據。這4位數據就是actualSize 真實數據。但是如果是m_metaInfo的m_version 大於等於3,則獲取m_metaInfo中保存的actualSize。
其校驗的手段,是通過比較m_metaInfo保存的crcDigest和從m_file中讀取的crcDigest進行比較,如果一致說明數據無誤,則返回true,設置loadFromFile為true。
其實這裡面只處理m_metaInfo的m_version的狀態大於等於3的狀態。我們回憶一下,在readActualSize方法中,把讀取當前存儲的數據長度,分為兩個邏輯進行讀取。如果大於等於3,則從m_metaInfo中獲取。
crc校驗失敗,說明我們寫入的時候發生異常。需要強制進行recover恢復數據。
首先要清除crc校驗校驗了什麼東西:
MMKV做了如下處理,只處理狀態等級在MMKVVersionActualSize情況。這個情況,在m_metaInfo記錄上一次MMKV中的信息。因此可以通過m_metaInfo進行校驗已經存儲的數據長度,進而更新真實的已經記錄數據的長度。
最後讀取上一次MMKV還沒有更新的備份數據長度和crc校驗欄位,通過writeActualSize記錄在映射的內存中。
如果最後彌補的校驗還是crc校驗錯誤,最後會回調onMMKVCRCCheckFail這個方法。這個方法會反射Java層實現的異常處理策略
如果是OnErrorRecover,則設置loadFromFile和needFullWriteback都為true,盡可能的恢復數據。當然如果OnErrorDiscard,則會丟棄掉所有的數據。
❸ 奼 鐢靛獎 鍏ㄩ潰鍥炲繂 鐩楁ⅵ絀洪棿 璋嶅獎閲嶉噸123 璁板繂瑁傜棔 婧愪唬鐮 鍏ㄩ儴瑕佽秴娓呯殑鑻辨枃涓瀛楃増鏈
鐢靛獎錛氳皪褰遍噸閲嶇郴鍒1-5
涓繪紨錛氶┈鐗孤瘋揪钂
綾誨瀷錛氱編鍥界數褰
璋嶅獎閲嶉噸1
       綆浠嬶細銆婅皪褰遍噸閲嶃嬶紙The Bourne Identity錛夋槸涓閮2002騫寸編寰峰悎鎷嶇殑闂磋皪鍔ㄤ綔鐗囷紝鏀圭紪鑷緗椾集鐗孤烽瞾寰烽瞾濮嗗悓鍚嶅皬璇達紝鐢遍亾鏍悸烽噷鏇兼墽瀵礆紝涓昏佹紨鍛樺寘鎷椹鐗孤瘋揪钂欍佸厠閲屾柉路搴撴煆銆佸紬鍏板崱路娉㈠潶鐗廣佹湵涓藉▍路鏂钂傚皵鏂銆備簬2002騫6鏈14鏃ュ湪緹庡浗鍏鏄犮傚獎鐗囦富瑕佽茶堪浜嗛┈鐗孤瘋揪钂欓グ婕旂殑鎮f湁鏋佺璁板繂涓уけ鐨勭敺涓昏掓澃媯路浼鎮╋紝璇曞浘鍦ㄩ冮伩緹庡浗涓澶鎯呮姤灞榪芥潃鐨勫悓鏃跺彂鎺樺嚭鑷宸辯殑鐪熷疄韜浠姐
       姝g増璧勬簮錛http://www.iqiyi.com/lib/m_200189114.html
❹ 綰㈤旀父鎴忔簮鐮佸備綍涓嬭澆
涓嬭澆鍦板潃錛http://www.37moyu.com/azyx/jsby/hongtuyouxiv3149.html
綾誨瀷錛氬畨鍗撴父鎴-瑙掕壊鎵婕
鐗堟湰錛氱孩閫旀父鎴弙3.14.9
澶у皬錛244.57M
璇璦錛氫腑鏂
騫沖彴錛氬畨鍗揂PK
鎺ㄨ崘鏄熺駭錛堣瘎鍒嗭級錛氣槄鈽呪槄鈽呪槄
娓告垙鏍囩: 綰㈤ 浼犲囨墜娓 綰㈤旀渶鏂扮増鏈鏄涓嬈句互鍏ㄦ柊鎬濈淮鍒涗綔鐨勪紶濂囨墜娓稿ぇ浣滐紝鐜╁朵滑鍦ㄨ繖閲屼笉浠呰兘澶熼噸娓╃粡鍏革紝榪樿兘浣撻獙涓庣幇浠e唴瀹圭粨鍚堣搗鏉ョ殑鍏ㄦ柊鍓ф儏錛岃屼笖鐜╂硶涔熼潪甯哥殑鑷鐢憋紝鐜╁朵滑涔熻兘鑷鐢辨垬鏂楋紝榪樿兘涓庝綘鐨勫皬浼欎即涓璧風粍闃熸寫鎴樹換鍔★紝鐖嗗嚭紼鏈夎呭囧摝錛屽績鍔ㄧ殑鐜╁跺氨蹇鏉ュⅷ楸間笅杞界珯涓嬭澆鎴樻枟鍚э紒
綰㈤斿畼鏂圭増娓告垙浠嬬粛 灝戞椂璁╀綘澶滀笉鑳藉瘣鐨勭粡鍏革紝闈掓槬姘歌繙闅懼繕鐨勬縺鎯咃紒2鏈25鏃ュ皢閲嶇呮帹鍑虹殑鍔ㄤ綔鎵嬫父宸呭嘲涔嬩綔銆婄孩閫斻嬶紝閲嶉摳灞炰簬浣犵殑闈掓槬鍥炲繂錛岃繕鍘熶護浜哄姩瀹圭殑娓告垙鍘嗙▼錛屽啀鐜板線鏃ユ祦榪炵殑閫肩湡鍦烘櫙錛岃拷蹇嗘浘緇忕敓姝諱笌鍏辯殑鍏勫紵鐪熸儏......鍗沖皢鐐圭噧浣犵殑鐑琛錛佺値鐐庡忔棩錛屽悆鐫鍐版嶏紝鍚圭潃絀鴻皟錛岀帺鐫銆婄孩閫斻嬶紝鍥炲懗涓嶈佺殑緇忓吀錛屽彂鐜版柊鐨勪紶濂囥
綰㈤旀墜鏈虹増娓告垙鐗硅壊 1銆佺Е闄靛湴瀹錛屾墍鏈塨oss涓鐖嗙巼鏈楂橈紝鐖嗗緱鏈濂界殑錛屾病鏈変箣涓銆
2銆佸滆娌欏煄錛屾搗閲忓厓瀹濆栧姳璁╀綘涔愮炕澶┿傚彟澶栵紝鏇存湁灝侀瓟濉斻侀櫎欖斿壇鏈絳変釜浜烘棩甯告椿鍔錛岃繕鏈夊ず瀹濆囧叺銆佺殗鍩庝簤闇哥瓑嬋鎯呭洟鎴樼帺娉曘
3銆佽疆鍥為亾錛屽叏澶╁悇鏃舵靛畾鏃跺紑鍚錛屽悇縐峛oss絳変綘鏉ユ垬銆
4銆佺為瓟鐣岋紝紲炵晫鎸傛満錛屾搗閲忕粡楠岋紝鍗囩駭瓚呭揩錛岄瓟鐣宐oss錛岃秴楂樼垎鐜囥
綰㈤斿畨鍗撶増鎵嬫父浜鐐 1銆乸k鐖嗚呭囷紝鑷鐢卞垏鎹㈡垬鏂楁ā寮忥紝鑷鐢眕k錛屽崟鎸戝洟鎴樹換浣犻夋嫨銆
2銆佹棤鍧愰獞銆佺繀鑶銆佺粡鑴夛紝榪樺師鏈鐪熷疄鐨勪紶濂囷紝娌℃湁閭d簺鍧戠埞鐨勫潗楠戙佺繀鑶銆佺粡鑴夌瓑鍔熻兘銆
3銆佽呭囧拰鎶鑳戒功闈犳墦錛屾父鎴忎笉涔拌呭囧拰鎶鑳戒功錛屽彧鏈夐氳繃鎵撴鎺夎惤銆
4銆侀櫎姝や互澶栵紝鏇磋繕娓呮櫚鐨勭敾闈銆佹祦鐣呯殑鎿嶄綔錛岃窇姝ョ湡瀹炪佹棤楝兼ャ佷笉鐬縐伙紝浜ゆ槗鑷鐢便佹棤鎵嬬畫璐廣
綰㈤旀父鎴忓唴瀹硅В鏋 1. 瑁呭囬潬鎵擄細銆婄孩閫斻嬬夋壙浜嗕紶濂囩殑緇忓吀鐜╂硶錛岃呭囧彧鏈夐氳繃鏉鎬鑾峰緱銆傜垎瑁呭囷紝鐪嬩漢鍝侊紝緇欑帺瀹惰惀閫犱簡涓涓鍏騫崇珵浜夌殑鑹濂界幆澧冦傛垜浠涓嶅嚭鍞1888鐨勫己鍖栨妧鑳戒功錛屼篃娌℃湁6888鍏冨疂鐨勮呭囧楄咃紝涓鍒囬潬鎵擄紝闈犺繍姘斻
2. pk鐖嗚呭囷細浼犲囩粡鍏哥殑鐜╂硶涔嬩竴錛歱k鐖嗚呭囷紝銆婄孩閫斻嬪悓鏍風戶鎵誇簡浼犲囪繖涓鐗圭偣銆傝嚜鐢卞垏鎹㈡垬鏂楁ā寮忥紝鑷鐢眕k錛屽崟鎸戣繕鏄鍥㈡垬錛屽畬鍏ㄨ嚜鐢便傛敾鍑葷櫧鍚嶇帺瀹朵細澧炲姞pk鍊礆紝pk鍊奸珮浜嗕細綰㈠悕錛岀孩鍚嶅悗姝諱骸浼氬ぇ鐖嗭紝璧庣姜浠ゅ彲浠ユ秷闄pk鍊箋傚枩嬈pk鐨勭帺瀹惰佺壒鍒娉ㄦ剰錛岃瘏鍜掑煎彲浠ユ彁楂樼垎瀵規柟瑁呭囩殑姒傜巼鍝︺
3. 鑷鐢變氦鏄撱佹棤鎵嬬畫璐癸細瀹屽叏寮鏀劇殑鑷鐢變氦鏄撶郴緇燂紝涓嶆敹鍙栦換浣曟墜緇璐癸紝涓虹帺瀹舵彁渚涗簡涓涓瀹屽叏鍏騫熾佸叕寮鐨勬父鎴忕幆澧冦備笉鑺遍挶鐨勭帺瀹跺悓鏍峰彲浠ラ氳繃鑷宸辯殑鍔鍔涘湪娓告垙涓媧誨姩鍏冨疂錛屾病鏈変氦鏄撶殑鎵嬬畫璐癸紝涓嶉渶瑕佸仛棰濆栫殑娑堣楋紝涔板崠闅忓績錛屾兂鍋氫釜娓告垙鐢熸剰浜猴紝瀹屽叏涓嶇敤鎷呭績琚緋葷粺鍚冨洖鎵c
4. 鎶鑳戒功闈犳墦錛氫笌瑁呭囦竴鏍鳳紝銆婄孩閫斻嬩腑鐨勬墍鏈夋妧鑳戒功閮介潬鏉鎬鐖嗐傛妧鑳戒竴鍏辨湁5涓絳夌駭錛屾墍鏈夌帺瀹墮兘鍙浠ュ湪npc涔﹀簵澶勭敤閲戝竵璐涔板埌鎵鏈夌殑鍒濈駭鎶鑳戒功錛岃屽叾浠栫瓑綰х殑鎶鑳戒功鍒欓渶瑕佹潃鎬鎵嶄細鎺夎惤錛屾湁閽變篃涔頒笉鍒般傘婄孩閫斻嬪憡璇変綘,鎴戜滑鐣欑粰鐜╁剁殑鏄鍙戣儲鑷村瘜鐨勬満閬囷紝鎴戜滑鐨勫晢鍩庢病鏈1888鍏冨疂鐨勫幓鎶鑳戒功寮哄寲涔﹂〉錛屼篃娌℃湁888鍏冨疂鐨勭洿鎺ュ嚭鍞鎶鑳姐
5. 鏃犲潗楠戙佺繀鑶銆佺粡鑴夛細銆婄孩閫斻嬫棤鍧愰獞銆佺繀鑶銆佺粡鑴夌瓑絳夊潙閽辯殑灞炴х郴緇燂紝瀹屽叏榪樺師姝g増浼犲囥備笉鍧戠埞銆佷笉紓ㄥ徑錛屾垜浠鍟嗗煄娌℃湁18888鍏冨疂鐨勯栧啿澶х繀鑶錛屾病鏈128888鍏冨疂鐨勮吹鏃忓潗楠戱紝涓嶄細鍥犱負浣犲厖鍊間簡灝辯粰浣犲姞8%鐗╃悊鏀誨嚮銆8%欖旀硶鏀誨嚮銆8%鍙嶆g墰閫煎埌鐖嗙殑灞炴э紝鎬諱箣閮芥病鏈夈
6. 璺戞ョ湡瀹炪佹棤楝兼ャ佷笉鐬縐伙細銆婄孩閫斻嬫垬鏂楅『鐣咃紝縐誨姩鐪熷疄錛岀粷瀵逛笉鍗★紝鏇翠笉浼氬嚭鐜伴兼ャ佺灛縐葷瓑鐜拌薄錛岀帺瀹跺彲浠ュ湪閲岄潰灝芥儏鎴樻枟銆傜Щ鍔ㄩ潬璧幫紝閫氳闈犲惣錛屼粬浠閭i炴潵椋炲幓鐨勬粦鏉塊瀷錛熼兘娌℃湁錛佸彧鏈夋懇鎿︽懇鎿︺侀瓟楝肩殑姝ヤ紣錛佷竴姝ヤ竴姝ユ渶鐪熷疄錛
7. 鐢婚潰娓呮櫚銆佹搷浣滄祦鐣咃細涓婁簡10涓浜鴻勬ā鐨勭兢鏋訛紝浣犳槸涓嶆槸灝辯湅涓嶆竻妤氳嚜宸遍暱浠涔堟牱浜嗭紵鍦ㄥ摢閲屼簡錛熸槸涓嶆槸涓鐗囩墖鐨勫垁鍏夊拰緇氫附鐨勯瓟娉曠壒鏁堟妸浣犳飯娌★紵榪樻槸鍛兼墖鍛兼墖鐨勫ぇ緲呰唨閬鎸′綘鑻變繆鐨勮劯鏃侊紵閲戝厜闂闂鐨勫ぇ鍧愰獞灝辮嗙洊浜嗕綘鐨勬尯鎷旂殑鑳歌啗錛熷湪銆婄孩閫斻嬩腑閮芥病鏈夛紒錛侊紒
8. 璁╀綘鏉ュ喅瀹氾細浣犳湡鏈涖婄孩閫斻嬬殑絎鍏澶х壒鑹叉槸浠涔堬紵浣犳湡鏈涙渶鏈夌壒鑹茬殑浼犲囨槸浠涔堬紵鍕囨暍鐨勫湪璁哄潧鍛婅瘔鎴戜滑鍚э紒浼犲囨槸鍥犱負浣犱滑鎵嶆案鎮掞紝絎鍏澶х壒鑹蹭氦緇欎綘浠鏉ュ喅瀹氾紒
緇間笂鎵榪幫紝澧ㄩ奔涓嬭澆絝欐槸鎮ㄥ繪壘瀹夊崜娓告垙鍜岃掕壊鎵婕旇В鍐蟲柟妗堢殑鐞嗘兂涔嬮夈傛棤璁烘槸瀹夊崜娓告垙瑙掕壊鎵婕旂埍濂借呰繕鏄涓撲笟浜哄+錛屾垜浠鎺ㄨ崘瀹夊崜娓告垙瑙掕壊鎵婕旂殑鐩稿叧鍐呭歸兘鑳芥弧瓚蟲偍鐨勯渶奼傘傜珛鍗充笅杞芥垨浣撻獙綰㈤旀父鎴忥紝浜鍙楀畨鍗撴父鎴忚掕壊鎵婕斿甫鏉ョ殑鏃犲敖涔愯叮錛佹ゅ栵紝鎴戜滑榪樻彁渚涚孩閫旀父鎴忕殑璇︾粏淇℃伅錛屽寘鎷鍔熻兘浠嬬粛銆佺敤鎴瘋瘎浠蜂互鍙婂畼鏂逛笅杞介摼鎺http://www.37moyu.com/azyx/jsby/hongtuyouxiv3149.html 銆傝╂偍鐨勪笅杞借繃紼嬫洿鍔犺交鏉懼揩鎹鳳紒
❺ 源碼資本|曹毅:以「碼會」籠住「江湖人」,新基金靠三種武器立足
-Begin-
2014年4月曹毅找到王興、張一鳴,告訴他們自己打算成立一隻基金。一個月後,名為「源碼資本」的新基金公司完成了1億美元的募集。即使是在「全民PE」火熱的2009年,這樣的募資速度也堪稱驚人。
不到一年,源碼資本二期基金也快速募集完成。1.5億美元、2億人民幣的基金規模只用了兩個月。除了之前的LP,7家A股上市公司的CEO全新加入曹毅構建的「碼會」。在曹毅眼中,商業的「棋局」正變成一種資源合力和智力游戲。對接起LP和創業者的,是這張「碼會」身份認證。
以「碼會」籠住「江湖人」
在北京風沙肆虐的傍晚,略帶倦色的曹毅快速吃完1個小時前訂好的快餐開始接受記者的采訪。自從成立源碼資本後,這種狀態已經成為一種常態。「一周飛五個地方,一年休息不到五天,」他的同事這樣形容。
對於互聯網的「痴迷」或許可以解釋目前身為80後的曹毅的這種狀態。這種「痴迷」正成為一種「紐帶」開始連接起曹毅和他周圍的那個圈子。王興、張一鳴、姚勁波、李想、李一男......正是因為這種紐帶開始聚集到源碼的周圍。「一期基金我們只用一個月就募完了,這些LP每個人就是見了個面,甚至有的只是打了個電話」曹毅回憶到。
在這個圈子裡,身份是一種需要江湖認可的東西。「在他所在那個領域裡面有明顯的成就,可以說在江湖上面都是有名號的,都有自己獨特的一套方法論。而且這些人基本都在一線,對行業的這種紐帶還是非常緊密的。」曹毅這樣描述著源碼的LP們。
在投資圈錘煉多年的曹毅正在觸碰到創業投資的真諦:將成功的創業者聚集在圈子裡,用資本以及人脈來撬動新的創業機會。這一點在矽谷早已得到驗證:比如創業教父Paul Grahamy以及科技偶像Kevin Rose等都曾在知名互聯網公司任職,深諳互聯網精髓,轉型投資也都獲得了不錯的收益。
對於創業公司而言,這樣的LP背景的確具有誘惑力。曹毅認為,美國創投圈50年的發展已經證明創業的成功所需要具備的要素越來越多,也可以說每個創業者得到的武器越來越多了。但是正因為提供武器的人越來越多,所以創業的紅海實際上更加殘酷。創業者需要獲取更多的資源和幫助。源碼的LP正是這樣一種武器。
他的胃口並不僅限於此。源碼的二期基金同樣只用了2個月時間完成募集。1.5億美金和2億人民幣的規模印證了曹毅對於資本市場的判斷。除了原有的一些美股港股、機構投資人外,源碼還引入了A股知名的TMT公司。藍色游標、神州泰岳等成為了碼會LP群體里的新的「入會者」。
風口中的「捕風者」
曾在紅杉任職副總裁的曹毅,自然也深諳沈南鵬的「賽道」投資法。曹毅認為,互聯網變得越來越大,隨著移動互聯網時代的到來,互聯網的賽道機會正在像白堊紀的物種大爆發一樣出現「井噴」。在這其中誕生出許多子賽道機會。
首先是傳統行業的互聯網化。曹毅以源碼投資的一畝田為例,農業是互聯網滲透水平最低的行業。盡管早期也有一些農業報價的網站,但非常初級。然而到了2014年,隨著智能手機在農民中的普及和網路購物的盛行,農業大規模的互聯網化開始成為可能。一畝田所做的正是利用互聯網來消除原本的農業信息不對稱問題。復雜的流通環節被互聯網所取代,買賣雙方則可以獲得更好的產品和利潤。
此前,一畝田花了兩個多月時間幫助河南新苗銷售完了滯銷大蔥。這被曹毅視為一次經典的互聯網改造傳統農業案例。互聯網改造傳統農業,改造的方式是透過信息化的方式,使得信息傳播更加有效,中間環節更少,資源配置得到優化。
其次是金融的互聯網化。趣分期是源碼投資的互聯網金融行業中一個代表性企業。看似簡單的學生貸款其實是一個巨大的市場。曹毅認為,金融的需求是始終存在的,傳統金融並不能解決很多需求,其中最大一塊就是學生市場:學生具有巨大的消費需求,但收入受限。趣分期的出現其實是解決了一個供需矛盾,金融就是時間和空間的轉化。學生的提前消費同時也可能提升其資源利用率。
第三是O2O。曹毅以源碼投資的PP租車為例:北京有400萬的車,每天空閑的可能有四分之一,另外一端有300多萬的人,有駕照沒有車。其實是一個巨大的供求不匹配,PP租車所做的平台,使得被閑置的這些車這些資源得到了更好的利用。
曹毅認為,從這三個賽道上可以看到了非常多的行業可以通過互聯網去改變,資源也可以更加有效地得到配置。「因為這些都是社會的底層設施,是剛需。因此而產生出來的巨大價值,我相信會很持續。
新基金的「打法」
在以互聯網基因為紐帶建立的「碼會」中,源碼的擔子並不輕。梳理企業戰略和融資戰略是曹毅每天最重要的兩項工作。「作為VC,最重要的事情是幫助創業公司做正確的事情,只有將正確的事不斷疊加,創業公司和VC才能實現雙贏。」
這並不簡單。在投資趣分期時,曹毅就曾經歷了困擾。在趣分期發展壯大後,面對的誘惑也多起來。除了大學生外,趣分期還曾開辟了注入家庭用戶、白領等用戶的貸款業務,多條業務線使得趣分期的業務總量很大,但問題也隨之而來。
有一天曹毅找到趣分期CEO羅敏,告訴他必須要坐下來好好聊聊。在源碼會議室里,曹毅在黑板上詳細闡述了他對於目前趣分期發展的看法。他在黑板上畫了一個矩陣,左邊是不同的資產類型,比如信用貸、抵押貸。縱軸是用戶、大學生、白領、家庭。曹毅告訴羅敏,每個細分市場都需要大量的人力與物力投入,而且每個市場的金融消費屬性也不相同。對於趣分期來說,最重要的目標是首先在某一領域達到王者地位。
作為投資人,曹毅坦言,如果公司有幾塊業務,每塊業務都是第3名,那麼這個公司根本就不值錢。因為每個跑道都是贏家通吃。因此,對於創業公司而言,最重要的就是聚焦。必須在某個跑道上成為王者,必須把所有的資源投入到最重要的業務上。
曹毅告訴羅敏,大學生市場並非已經飽和,很多業務可以細化,這樣是做加法而並非延伸到更多業務去分散資源做減法。「這是創業公司容易犯的錯誤,當你有資源的時候你會跑到第一名,這時候你會面對很多誘惑,你需要控制住自己,有時候甚至要去砍掉業務。作為VC,應該幫助創業者做這樣的梳理和判斷。」
除了戰略決策,融資同樣重要。在融資圈裡,流行著B輪和C輪死的說法。意思是當創業公司無法在成長階段拿到B輪或者C輪融資時,很可能會半路夭折。在曹毅看來,創業競爭的慘烈,使得融資周期大幅縮短。大概2-3個季度創業公司就必須拿到下一輪融資。但融資的殘酷性顯而易見。2014年據不完全估算,有2000-3000家已融資企業無法拿到下一輪融資,在C輪階段,50%-60%的企業將會被淘汰。因此源碼重要的工作之一就是幫助投資企業拿到下一輪融資,持續「輸血」。
曹毅認為,時間窗是一個客觀和實際的問題,如果不能在與競爭對手的角逐中持續「輸血」,那麼錯過時間周期可能就意味著滅亡。這也印證了曹毅之前所做的決斷。吸引更多具有互聯網基因的個人和企業成為源碼二期基金LP,這保證了源碼投資企業的融資可持續性。據曹毅介紹,目前所投企業中65%的後續融資通過源碼完成,這也讓其在早期投資中更加得心應手。
-end-
❻ 鍏充簬鐢靛獎婧愪唬鐮佺殑鐤戦棶
浠ヤ笅鍐呭瑰畬鍏ㄤ釜浜哄垎鏋愶紝闈炶漿杞姐傛ゼ涓葷粰鍒嗗惂錛
銆1銆戜竴寮濮嬶紝涓婂皦浠Shawn鐨勮韓浠藉嚭鐜板湪鍒楄濺涓婏紝鐓ч暅瀛愬彂鐜拌嚜宸辯殑鏍峰瓙鍏跺疄鏄瘲hawn銆
銆庤瘉鏄庤濺涓婁笉鏄鐪熷疄涓栫晫錛屽彧鏄涓婂皦鐨勪釜浜鴻板繂鍔犺澆鍒版簮浠g爜涓栫晫閲屽偍瀛樼殑Shawn鐨勮板繂瀛樻。涓錛屽苟浠shawn鐨勮韓浠藉嚭鐜般傘
銆2銆戣屽悗鍒楄濺鐖嗙偢錛屼笂灝夌涓嬈″洖鍒癇eleaguered Castle鍥村洶鍫★紝Goodwin闂涓婂皦鈥滆兘鐪嬪埌褰卞儚鍚楋紵鈥
銆庤瘉鏄庡獎鍍忓拰澹伴煶涓嶆槸閫氳繃鐪肩潧鍜岃蟲湹鐪嬫垨鍚鍒幫紝鑰屾槸閫氳繃澶栭儴浠鍣ㄧ洿鎺ュ彂閫佽嚦Colter澶ц剳鐨勶紝鍏朵粬浜烘槸鐪嬩笉鍒板惉涓嶅埌錛屾墍浠ユ墠紜璁ゃ傘
銆3銆戝垰鍥炲埌鍥村洶鍫$殑鏃跺欙紝涓婂皦寮勪笉娓呯姸鍐碉紝Goodwin甯鍔╀笂灝夐噸鏋勮板繂銆傚洖蹇嗏滆帀鑾夌┛鐫鏅氱ぜ鏈嶅拰鏂楃烽啋鏉モ︹︹濃滄墤鍏嬬墝鈥濃滅尗澶撮拱鐨勫彨澹板綍闊斥濇渶鍚庡府鍔╀笂灝夋垚鍔熷洖鎯寵搗濂圭殑鍚嶅瓧銆
銆庤瘉鏄庝笂灝夋槸鍦ㄥ洿鍥板牎浠ュ悗閫氳繃婧愪唬鐮侀」鐩瀹為獙妞嶅叆璁板繂浠g爜鎵嶈よ瘑Goodwin鐨勩傚洜涓轟笂灝夋渶鍚庣殑璁板繂鏄寮鐩村崌鏈猴紝鐒跺悗緔ф帴鐫鍦ㄥ垪杞︿笂閱掓潵錛岄┈涓婂張鍥炲埌鍥村洶鍫°傛墍浠ヤ粠涓婂皦鐨勮板繂榪炶瘡鎬т笂鍙浠ョ煡閬撲粬鏍規湰娌℃湁閫氳繃鑷鎴戞劅鐭ヨよ瘑Goodwin鐨勬椂闂淬傚叾鍚嶨oodwin鍛婅瘔涓婂皦宸茬粡鏉ュ洿鍥板牎2涓鏈堜簡鑰屼笂灝夊叏鐒朵笉鐭ワ紝涔熷彲浠ヨ存槑榪欎釜闂棰樸備篃灝辨槸璇磋繖瀹為檯涓婃槸涓婂皦絎涓嬈℃簮浠g爜浠誨姟銆備箣鍚庡崥澹瀹e竷婧愪唬鐮侀」鐩鍑烘垬鍛婃嵎涔熷嵃璇佷簡榪欎竴鐐廣傘
銆4銆戜笂灝夌浜屾″姞杞藉埌婧愪唬鐮佷笘鐣岄噷Shawn鐨勮板繂瀛樻。涓鐨勬簮浠g爜涓栫晫鐨勫彂灞曞拰絎涓嬈℃湁閮ㄥ垎鍙樺寲銆
銆庤瘉鏄庢簮浠g爜涓栫晫鏄鍗蟲椂婕旂畻鐨勮櫄鎷熶笘鐣岃岄潪鍥哄畾鐨勭▼搴忋傘
銆5銆戜笂灝夊洖鍒板洿鍥板牎鐨勬椂鍊欏彂鐜板湴鏉挎湁姘達紝鍖呮嫭鍚庢潵鎰熻夊緢鍐鋒湁鐢熷懡鍗遍櫓銆
銆庤瘉鏄庝笂灝夛紝榪樻椿鐫錛岀被浼兼嶇墿浜猴紝浣嗚韓浣撴槸鏈夋劅鐭ョ殑銆傚啺鍐鋒槸鍥犱負浠栨劅鐭ュ埌浠栫殑緇寸敓鐜澧冦傚悓鏃舵殫紺虹潃婧愪唬鐮侀」鐩榪樹笉鎴愮啛涓嶇ǔ瀹氥傘
銆6銆戜笂灝夌櫥褰曟簮浠g爜涓栫晫緇欏崥澹鎵撶數璇濓紝鏈夋帴綰垮憳鎺ラ氬苟絳斿嶄笂灝夛紝浠ュ強鍏嬮噷鏂钂傚滀笂緗戞煡鍒頒笂灝夊幓涓栫殑淇℃伅錛屽寘鎷涓婂皦鍦ㄥ垪杞︿互澶栬拷鐤戠姱絳夈
銆庤瘉鏄庢簮浠g爜涓栫晫鐨勬瀯鎴愰櫎浜嗗垪杞︿笂鐨勬墍鏈夌焦闅捐呭強涓婂皦鏈浜轟互澶栵紝榪樻湁澶ч噺鍏朵粬鐨勬暟鎹銆
鏁版嵁閲忕粷涓嶄粎鏈塖hawn姝誨墠8鍒嗛挓鐨勮板繂鏁版嵁銆傘
銆7銆戜笂灝夊湪婧愪唬鐮佷笘鐣屾椂錛屽惉鍒癎oodwin鐨勫懠鍙錛屼細寮曡搗婧愪唬鐮佷笘鐣岄噷闈㈢殑浜虹墿璐村浘閿欒銆
銆庤嚦灝戣瘉鏄庡綋Goodwin鍦ㄩ氳繃澶栭儴浠鍣ㄥ埡嬋涓婂皦鎺ュ彈淇″彿鐨勬椂鍊欙紝涓婂皦鎵澶勭殑鉶氭嫙婧愪唬鐮佷笘鐣屼細鍙楀埌褰卞儚銆傛墍浠ワ紝婧愪唬鐮佷笘鐣屽疄闄呬笂鏄鍦ㄤ笂灝夊ぇ鑴戦噷鍗蟲椂婕旂畻騫跺憟鐜板嚭鏉ョ殑錛岃屼笉鏄鉶氭嫙鍜岃劇疆浜嗗悇縐嶇幆澧冨強璁板繂鏁版嵁鐨勭數鑴戠郴緇熴傚惁鍒橤oodwin鍜屽崥澹灝變笉闇瑕佹瘡嬈¢棶涓婂皦鍙戠敓騫剁湅鍒頒簡浠涔堛傘
銆8銆戜笂灝夊湪鍙嶅嶅嚭鍏ユ簮浠g爜涓栫晫鍚庨棶Goodwin鏄鍚︾浉淇″彲鑳藉瓨鍦ㄥ彟澶栦竴涓鐗堟湰鐨勮嚜宸便侴oodwin涓嶄俊銆
銆庝笂灝夋劅瑙夊湪婧愪唬鐮佷笘鐣屽拰鐜板疄涓栫晫瀹屽叏涓鏍鳳紝鏍規湰娌℃湁鍔炴硶鍖哄垎銆傛簮浠g爜涓栫晫鍍忕煭鏆傜殑鐜板疄涓栫晫錛岃岀幇瀹炰笘鐣屽儚闀誇竴鐐圭殑婧愪唬鐮佷笘鐣屻傛垨鑰呮湁鍙鑳界幇瀹炰笘鐣屼篃鏄鏇村栧眰涓栫晫鐨勪竴灞傛簮浠g爜涓栫晫銆傚熀鏈涓婂氨鏄涓虹粨灝炬墦浼忕瑪浜嗐傘
銆9銆戜笂灝夎鋒眰Goodwin鏈鍚庝竴嬈¤╄嚜宸卞洖鍒版簮浠g爜涓栫晫鐨勭幇瀹炵敾闈㈢粰鍑轟簡浠栦滑娌熼氭柟寮忕殑鐗瑰啓闀滃ご錛氫笂灝夋槸閫氳繃澶栭儴浠鍣ㄦ劅搴斾粬鐨勮韓浣撴潵鎵撳瓧娌熼氱殑銆
銆庤瘉鏄庣數鑴戠郴緇熷彧鑳芥劅搴斾笂灝夎韓浣撶殑鍙嶅簲鑰屼笉鑳借幏鍙栦粬澶ц剳閲屼駭鐢熺殑褰卞儚銆傘
銆10銆戜笂灝変箣鍓嶅湪婧愪唬鐮佷笘鐣岀粰鍗氬+鎵撶數璇濓紝鉶界劧鍦ㄦ簮浠g爜涓栫晫鏈夊弽搴旓紝浣嗘槸鐜板疄涓栫晫瀹屽叏涓嶅彈褰卞儚銆傜幇瀹炰笘鐣岀殑鍗氬+娌℃湁鎺ュ埌鏉ヨ嚜婧愪唬鐮佷笘鐣岀殑鐢佃瘽銆備絾鏄涓婂皦鏈鍚庝竴嬈″湪婧愪唬鐮佷笘鐣岀粰Goodwin鍙戠煭淇★紝Goodwin灞呯劧鏀跺埌浜嗙煭淇°
銆庤瘉鏄庝簡涓ょ偣錛1鏄婧愪唬鐮佷笘鐣屼笉浼氬圭幇瀹炰笘鐣屼駭鐢熷獎鍝嶃2鏄鍙楀埌鐭淇$殑Goodwin鏄灞炰簬婧愪唬鐮佷笘鐣岀殑銆傘
銆11銆戞簮浠g爜涓栫晫鏆傚仠鍚庡張緇х畫銆
銆庢殏鍋滄槸鐜板疄涓栫晫涓婂皦鑴戝仠姝㈡椿鍔----涔熷氨鏄鑴戞諱骸銆傞偅涔堢戶緇媧誨姩鏄錛熶笂灝夊仠姝㈡椂鐨勬簮浠g爜涓栫晫鍦ㄥ叾浠栦笂灝夌殑澶ц剳閲岀戶緇榪愯屻傘
銆12銆戠幇瀹炰笘鐣岀殑緗欖佺ジ棣栫О鏄涓鏋佸叾鑱鏄庣殑鏍哥墿鐞嗕笓瀹訛紝鐢氳嚦鑷宸卞埗閫犱簡鏍告﹀櫒銆傚苟縐拌繖涓涓栫晫鏈夋満浼氶噸鏉ャ傚逛簬涓婂皦鐭ラ亾鑷宸辨湭瀹炶岀殑璁″垝鍙璇翠綘鐭ラ亾寰楀お澶氫簡銆
銆庝簨瀹炰笂錛岃繖浜涚嚎緔㈠彲浠ヨ╂垜浠鐩鎬俊鍑舵墜鐭ラ亾婧愪唬鐮佷笘鐣岋紝鐭ラ亾婧愪唬鐮佷笘鐣屽彲浠ラ噸鏉ワ紝鎵浠ュ逛笂灝夎瘑鐮磋嚜宸辨病鏈夊疄琛岀殑璁″垝涔熷苟涓嶅囨銆傘
銆13銆戔滅幇瀹炰笘鐣屸濇槸鐪熺殑鈥滅幇瀹炰笘鐣屸濆悧錛
銆庤繖涓娌℃湁瀹氳恆備絾鏄錛岀嶇嶈抗璞¤〃鏄庡嚩鎵嬫兂瑕佺牬鍧忕殑錛涗笂灝夈佸崥澹銆丟oodwin鎵璁や負鐨勯偅涓鐪熷疄鐨勨滅幇瀹炰笘鐣屸濇瀬鏈夊彲鑳戒篃鏄鍙﹀栦竴縐嶅艦寮忔垨灞傞潰鐨勨滄簮浠g爜涓栫晫鈥濄傜被浼箋婄洍姊︾┖闂淬嬮噷鐨勬ⅵ涓姊︿腑姊︿腑姊︹︹︺
銆14銆戜笂灝夋渶鍚庣殑璇濓細濡傛灉鎴戠寽瀵逛簡錛岄偅涔堝湪婧愪唬鐮佷笘鐣岀殑鏌愪釜鍦版柟浣犱細鎵懼埌姝e湪絳夊緟浠誨姟鐨勪笂灝夆︹
銆庤繖閲屽彲鐭ユ簮浠g爜涓栫晫涓嶆槸鍞涓鐨勶紝鑰屼笖鏃墮棿杞翠篃涓嶆槸鍚屾ョ殑銆傘
❼ 任天堂多款N64游戲源碼泄露,幾款經典大作均中招
作為很多80後和90後的童年回憶,N64主機已擁有超過20年的 歷史 ,甚至早已退出了市場。不過,這一經典機型仍然是很多黑客眼裡的目標——最近有多款任天堂N64 游戲 的源代碼就遭到了黑客盜竊,這其中就包括了經典大作《馬里奧》和《塞爾達》系列。
雖然在從前也出現過 游戲 代碼失竊事件,但任天堂此次遭受的損失是巨大的,因為本次泄漏的代碼雖然隸屬古董型號主機,但其內容卻非常重要,包括《馬里奧醫生64》、《馬里奧賽車64》、《超級馬里奧64》和《星際火狐64》等著名作品從此毫無秘密可言。
另外,此次失竊的還有《星際狐狸》、《超級馬里奧世界》、《塞爾達傳說:A Linke to the Past》、《超級馬里奧:RPG》和《F-Zero》等。
關於本次黑客盜竊事件,知情人士均表示難以置信,本次任天堂遭受的損失不但巨大,而且還很徹底,甚至連 游戲 開發工具也被發現並盜走。而《星際狐狸》系列製作人Dylan Cuthbert則表示他已經有30年沒見過該系列 游戲 的開發工具了,而且它還是早期為了學習而使用C++開發的工具。
更為值得一提的是,本次失竊的除了源代碼、開發工具,甚至還有N64的操作系統,或許它的泄漏會給模擬器開發者和MOD製作者帶來很多方便。