disruptor源碼
『壹』 為什麼 MySQL 使用多線程,而 Oracle 和 PostgreSQL 使用多進程
.NET平台很棒。真的很棒。直到它不再那麼棒。我為什麼不再用.NET?簡單來說,它限制了我們選擇的能力(對我來說很重要),轉移了我們的注意力,使得我們向內認知它的安全性,替代了幫助我們認知外面廣闊世界的所有可能性。[系好安全帶:這個文章的長度幾乎成了一本書…]優點首先讓我開始說說.NET做得對的許多事吧,盡管這其中的大多數並不來自.NET本身,但卻是由.NET社區而來。C#C#令人驚嘆。我認為它是一個令人驚嘆的編程語言。從強大的c語言背景而來,我徹底地喜歡其語法,流和這門語言的所帶來的感覺。當然有我可能改變的事,但總體來說它是一門扎實的語言。並且基於開發人員使用的編程語言如此巨額的百分比和Windows操作系統的優越性,它是一門眾所周知的語言。ReSharper我也很喜歡Resharper。在JetBrains工作的開發者們都是奇跡般的人。如果沒有ReSharper和一些相關的工具,我可能並不會如此喜歡C#。BDDandMSpec我也很喜歡簡稱為機器規格(mspec)的BDD風格的框架。它是一個令人驚嘆的測試框架,真正支持在測試中使用正確的語言測試本身。在使用mspec之前,我的測試真是一團糟並且很礙我的事。另外,當我們創建GoConvey—基於Golang的BDD測試框架的時候,Mspec對於我的組織來說是一個巨大的靈感和激勵。多語言運行時我認為多語言的CLR(公共語言運行時)的觀念真得使得JVM的世界思考著。我不知道任何非java的JVM語言在CLR之前,但隨著「公共語言運行時」的到來,我的理解是這使得使用JVM的人們向前進並且最終創造了如Scala和Clojure這樣偉大的JVM編程語言。如果我錯了請糾正我。再者,CLR使得Sun公司的人們坐下來並關注它,因為Java有一點陳舊並且隨著Java8的到來,僅僅現在才在多個方面追趕著。競爭是一件非常好的事。NuGet另一個顯著的例子是NuGet。這個包在Windows中作為一個整體特別是在Windows的開發中,它的管理軼事是糟透的。NuGet解決了很多問題,他們也通過從Python和Ruby借用了很多東西去做了很多正確的事。有改進的餘地嗎?當然。但比起其他一些選擇在這兒或那兒的包升級來說,我還沒有感到使用NuGet有這許多痛楚。Mono對於Mono的開發者們,我不能不說太棒了。他們所創造的太驚奇了。沒有任何官方支持和不顧潛在的懸在他們頭上的法律問題,他們向前推進並創造了一個居然能替代官方運行時的實現。我已經有一些運行在產品中應用程序,在Mono下運行了幾乎一年而沒有任何問題。它的產品准備好了嗎?這可能取決於你的應用程序(見下文「Mono」)。CQRS和事件溯源可以認為,關於.NET最好事之一是,它是CQRS的誕生地並有相關的技術:事件溯源。就算這樣,CQRS+ES本身並沒有什麼很新的東西。正如GregYoung將會告訴你的,這是由一堆40年歷史原料為我們重新打包並更名的。對於大型代碼庫我有些非常嚴重的問題,當我5年前使用CQRS+ES的時候,它完全釋放了我的域。CQRS+ES現在是命名模式的並且其成長是顯而易見的。這可能是因為.NET已經能夠和其他的開發平台交互共享的原因。除了這個之外,大多數的創新是從外部來的。缺點優點先放在一邊,讓我們看看什麼出錯了和我為什麼不再用.NET框架。關於我最近開發平台的遷移,最能激勵我的事是我可以利用許多最好的部分而丟下不好的部分(如下文所說)。Windows正如前文所述,當面對基於網路的伺服器軟體時,Windows並不是一個好的選手。在我看來,Windows的另一個真正的大問題是傳統的Windows開發者是通常僅僅擅長於Windows,當他們離開安樂窩之後就會很快迷失,這對於linux開發者來說卻不是問題。計算遠不止是Windows。開發者僅僅能操作單一的操作系統的一個問題是它不可避免得導致Windows的激增。換句話說,Windows生了Windows。沒法打破這個循環。另一方面,*NIX的開發者通常熟悉多操作系統(Linux,Unix,OSX,Windows等等),一個操作系統的內部工作原理,不同的分布(基於Debian和基於Fedora),窗口管理器,桌面管理器,文件系統,包管理,編譯,重新編譯,重新打包,命令行「fu」等等。我的一個心病是文件系統。NTFS並不是系統唯一的文件系統,對於任何給予的任務它幾乎都不是最好的選擇。ZFS,BTRFS,ReiserFs,ext*等等,有一些很酷的特性。我也很喜歡為了各種高速/透明的磁碟操作,能從BASH創建迴路設備或者創建RAM設備。這在Windows中不會發生—如果沒有第三方軟體的話。在AWS雲服務中,啟動一個Windows機器要花掉足足10多分鍾。我大約15-20秒就能啟動一個簡單的Linux機器。當涉及到雲計算規模,它能夠迅速擴展是很重要的,因為當擴展很重要時,10-15分鍾就像是永恆的。VisualStudio在我這另一根刺,當屬VisualStudio。我需要一個大大超出預期的IDE去做任何開發,這個想法困擾著我。它只是如Windows一樣龐大的資源豬。我有一個內核i73770K3.5GHZ的台式機,以16GB的內存和最大4512GB的固態硬碟去編譯。它差不多刷爆了Windows體驗指數,但Windows+VS仍然很慢。(是的,ReSharper使得它更慢了,但是ReSharper對這來說是值得的。)現在我在MacBookPro上開發,它比起我的強大的台式機來說只有更少的CPU馬力,但運行明顯更快,在一個短小的學習曲線之後,UX(用戶體驗)變得無限美好了。事實上,我甚至不再用滑鼠了—我的雙手一直在鍵盤或觸控板上,我可以用手勢操作我的電腦並讓它回應—不像在Windows。關於VS很酷的一個事是調試器。它的查看和使用,令人難以置信得方便。每隔一段時間會在監視窗口報告錯誤的值,導致花費時間去調試。同時,這也是很大的負面,因為CLR默認的,多線程的世界使得我一開始就需要一個調試器。沒有調試器是一個解脫的體驗,因為它迫使你以另一種方式編程。VS同樣也有創建「csproj」和「sln」文件的壞毛病。我恨這些。當然,C#必須知道編譯什麼和何時編譯。我理解這點。在Golang中,引用在代碼中使用了很重要的語句。如果它不是.NET中用到的工程文件,我可能使用簡單的文本編輯器編碼C#,並且對這門語言更流暢。使用gitrebase操作時,這些文件也有導致合並沖突。別讓我開始說換行符的差異。我不能相信直到今天我們還在處理這樣的事。如果VS解決方案文件以Linux行結束符結束,通過雙擊它並不能載入該解決方案,因為VS解決方案文件分析器讀不出它來。源代碼管理幸運的是,我早就跳出了微軟陣營的源代碼管理(版本控制系統VSS)。我早在2000年初,在VSS無數次丟失了我的提交之後,就使用了Subversion(譯者註:Subversion是開源的版本控制系統)。之後git(譯者註:git是開源的版本控制系統,內容管理系統等)出現了,我又迷上了它。不幸的是,沒有Windows的介面—對我來說是典型的遭遇。最終有人創建了一個介面,我就用了那個並且沒有回頭。Git是一把非常鋒利的刀,但當你正確運用它的時候,它是一個強大而高效的工具。我曾經在一個小工程中用過TFS(譯者註:TeamFoundationServer,工作流協作引擎),它是一個怪物—和所有來自Redmond(譯者註:美國微軟總部)的產品一樣。它感染了我的項目文件並且污染了我的源代碼目錄。真可惡。不,還是謝謝你。給了我任意一天用命令行git…或者可能是SourceTree,如果你需要從GUI得到一點關愛。Mono是的,這是第二次提及Mono。正如Mono本身如此驚艷一樣。在.NET的世界,它仍然二等公民。無論什麼時候我嘗試在Mono上運行任何重要的東西,我通常都在和漏洞作斗爭。幸運的是,對下載代碼,查找問題,發送請求和在Linux上編譯代碼我沒有感到不舒服。但是這件事我都記不清做了多少遍了。是的,CLR是個巨大的怪物,並且對一個非官方的應用在不同的操作系統都有相同的行為,簡直是個類似於分開紅海的奇跡。但事實是,我不得不花費如此多的時間來填補漏洞以使我的代碼能夠正確運行,實在是很難為其辯護。Mono的特定區域也慢。也許它不是在慢在過載,但對我來說Web伺服器是關鍵所在。並且它非常慢,最後,慢到了最底下—即使是微不足道的東西。我想好消息是它只能從這兒得到更好的。我也應該提及Mono的開發者可能忘了Linux,比起我可能知道的還多,所以我不能太挑剔。IIS也許IIS在嘗試著為太多的應用程序做太多的事情。它從作為一個web伺服器變為像J2EE應用程序容器一樣的應用程序宿主。它也站在慢速這一邊。我猜如果我需要更高的性能,我應該編寫我自己的web伺服器,但我真的很想只關注我應用程序的代碼。可能利用Windows事件伺服器將是好的,但nginx(譯者註:一個高性能的HTTP和反向代理伺服器,也是一個IMAP/POP3/SMTP代理伺服器)和其他伺服器只是不喜歡在Windows中生產。虛擬的以JVM為基礎的實現,例如Netty(譯者註:JBOSS提供的一個java開源框架),很容易處理每秒650K+/的請求量。IIS在運行一個簡單的CLR應用程序「Hello,World!」,處理大約每秒50K的請求量時就會壅塞。(有趣的題外話,參考基準開發者通過TCP套接字創建了一個簡單的C#的web伺服器,它能處理大約每秒120K的請求量。)狹隘的心理前些年有個運動叫做ALT.NET。該運動是全部是關於尋找我們自身之外的更廣闊的開發社區以作為一個整體,並匯聚不同的部分。有趣的是,那是StructureMap、Autofac、NuGet、ASP.NETMVC和許多其它工具的靈感來源。在傳統的.NET的圈子裡,這個運動受到了很多的不屑和鄙視。我把這看作是,作為一個整體的社區普遍的狹隘心理和怠惰的一個極大的例證。(的確,它們中的一些可能會消失,進而以包括Redis,MongoBD還有其它的不同的技術而出現。)有這么多很棒的方案在那裡。假定微軟已註定是唯一正確之路的想法是荒謬的。如果是這樣的話,我們就都還在使用VisualStudio的設計工具去拖放按鈕和鏈接元素到一個WebForm的界面上,我們會設定了該按鈕並且依賴ViewState以幫助我們與可怕的HTTP所帶來的恐懼隔開。我從我的一個部署的代碼庫中最後一個WebForm中擺脫的那一天,是個光榮的值得慶賀的日子。誰又曾想過「網路控制」是個好主意?很顯然我考慮過因為我喝了Kool-Aid(譯者註:卡夫公司出品的飲料,這里意指明知是註定的或有危險的仍然去做,有負面涵義)並且完全接受它。它狠咬了我。見過2MB的ViewState嗎?[註:當我寫這篇文章的時候,原來的標題,「為什麼我不再用.NET」,意味著整個.NET生態系統。標題感覺有點短於是我更新為「為什麼我不再用.NET框架」。我想.NET作為一個生態系統,包括了所有的工具,工程,平台,組織還有很多開發者。這就是為什麼有些更廣泛的.NET社區的元素在我的這篇文章中受到抨擊原因。]性能殺手C,Java和C#中典型的多線程範例都強烈推薦使用鎖和互斥。對於鎖來說有個隱藏的開銷:它們慢得難以忍受。使用Disruptor(JVM中的無鎖的環形緩存[譯者註:實際上就是擁有一個序號指向下一個可用元素的數組]),你可以很容易得每秒處理20M以上的事件。在.NET中使用規定的「最佳實踐」等任何超過每秒十幾次的傳輸,都被認為是體面又好的性能表現,在這一點上來說你僅僅需要更大/更好/的硬體設備。事實上,我見過第三方客戶端庫(Rabbit,Couch,Mongo等等)中鎖語句遍布整個代碼。即使在我的代碼中沒有任何的並發,默認的和首選的方法都用了鎖。無鎖的、事件驅動的方法允許你大幅降低硬體和資金支出。大部分應用程序可以輕易地運行在兩台機器上,第二台機器僅僅在冗餘和失效備援時是必須的,以防因為硬體相關的問題導致第一台機器不可用的時候起作用。這個問題的另一個方面是調用網路和磁碟子系統的傳統方式:同步,阻塞代碼。如果你需要多個並發的HTTP請求,你需要的線程。大多數人不知道的是,為維持線程多出的1-2MB和上下文切換線程的需求,使得CPU內核消耗所有的時間顛簸在上下文切換上而不是做真正的工作。所以現在我們得到了在一個應用程序中數百或數千的線程,佔用了RAM,並造成CPU停滯不前。還有個更好的方式。Netty/NIO(JVM),Erlang,Node,Gevent(Python)和Go都支持使用事件驅動的子系統操作(選擇/epoll[譯者註:Linux內核中的一種可擴展IO事件處理機制]/kqueue[譯者註:FreeBSD的可擴展的事件通知介面])。這就意味著當等待數據包被tx/rx跨網路的時候,CPU可以自由地去做其它,重要的工作。因為JVM的成熟,Netty可以認為是做這項工作最快的,但我喜歡Go用Goroutines操作這個的方式—它簡單,優雅,很容易推理,沒有像義大利面條一樣的回調。SQLServer作為一名.NET開發者,當你開始一個新的工程時,有一些事是你通常會去做的:創建一個新的solution將其部署到TeamFoundationServer(譯者註:Microsoft應用程序生命周期管理(ALM)解決方案的核心協作平台)IIS中建立相應的網站入口創建一個新的SQLServer資料庫在solution中關聯EntityFramework(通常是2010年之後創建的工程)開始設計你的資料庫和ActiveRecord實體在大多數情況下這不是編寫代碼的正確方式。當然它可能在某些情況下有效,但是作為一個「默認的架構」它並不是你想要的。為什麼在我們甚至還沒理解問題領域之前已經做了任何技術上的選擇?這簡直是本末倒置了。微軟的生態系統鼓勵每個人使用SQLServer。在VisualStudio中和SQLService進行交互或者使用SQLManagementStudio(和它的前身,SQL查詢分析器)是如此令人難以置信的容易。這種以資料庫為中心的重點,是欽定的或唯一正確的方式的一部分。它使你更加迷戀微軟。廠商鎖定始終對廠商來說是好的。為什麼我們要如此開發?為什麼我們不地考慮應用程序的行為而不是它如何存儲的?現在我所有的項目都使用基於JSON的鍵/值存儲。有了這種功能,我可以選擇任何我想要的存儲引擎,包括SQLServer,Oracle,PostgreSQL,MySQL,Cassandra,CouchDB,CouchBase,Dynamo,SimpleDB,S3,Riak,BerkeleyDB,Firebird,Hypertable,RavenDB,Redis,TokyoCabinet/Tyrant,AzureBlobs,文件系統中的明文JSON文件等等等等。突然之間,我們能夠開始根據其優點而不是僅僅對其熟悉來選擇存儲引擎了。題外話:在AWSRDS的雲上運行過SQLServer嗎?別這么做。當然它會工作,但是一些例如復制這樣最簡單的事是不存在的。文章充斥著對SQLServer不能在AWSRDS上工作的引用。結論也許我在軟體開發中學到的兩件最重要的教訓是:邊界和封裝的重要性(以多種形式)付出代價以得到正確的模型和抽象許多年前我恨「模型」這個詞。每個人都會把它到處扔,它是一個如此過載的術語,很難理解它的含義和它為什麼這么重要。就這點來說,我僅僅會說模型是對你想要封裝的現實的一個有限的表示。也許最簡單的例子就是地球儀的墨卡托投影了。這很確切得說明了一件事:導航。如果你在其他的事情上使用它,它並不毫無價值。如果你不專注於付出代價去使模型正確,去封裝商業現實,那麼沒有任何技術能夠拯救你。我對.NET最大的抱怨是,「唯一正確的方式」引導你遠離理想的模型並把你推向關注實現細節和技術缺陷的方向。這樣的關注導致技術實施滲血並且感染模型,最終導致它腐爛變質,因為它不能適應不斷變化的商業需求。當這發生的時候,開發者掙扎著並蹬踢著,如同吸毒者一樣,他們從一個新技術轉向另一個,以期望下一個強大的技術能夠治癒他們的病痛。技術本身並不是靈丹妙葯,相反地,它是關於取捨和選擇。只有正確地理解了商業行為並把它們封裝進結構良好的,易於理解的模型中,以幫助保持技術堆棧在屬於它的地方—作為一個實現細節。這就是我為什麼不再用.NET框架,因為它不斷地重申自己(的主張),不斷地想要比它的本身的:一個實現細節。
『貳』 ubuntu 怎麼打開 sublime text
Sublime Text是個跨平台的編輯器,支持Windows、Linux、Mac系統平台,支持各種語言的代碼編輯,配合上對應的插件,話上點時間學習,你將會對它愛不釋手,大大的提高你的編碼效率。本文將講解在Ubuntu 14.04系統中安裝SublimeText 3,並配置SublimeClang插件來配置C/C++開發環境。
1. Sublime Text 3的下載安裝
到官方網站上下載64位(系統位64位)的.deb安裝包(),下載後雙擊安裝即可。安裝好之後,通過命令subl即可打開程序,此時已經可以編寫代碼了。在開始之前建議先記下一些常用的快捷鍵,可參考:
2. 安裝Package Control
Package Control是一個用於管理插件的好工具,可以用於安裝、刪除、禁用相應的插件,常用的插件都能在上面找到。其源碼地址在上,安裝非常方便,使用git將該代碼先克隆下來即可,然後拷貝到~/.config/sublime-text-3/Packages/目錄下並命名為Package Control即可。(也可以直接在github上打包下載,然後解壓復制到~/.config/sublime-text-3/Packages/目錄下並命名為Package Control)。
cd ~/.config/sublime-text-3/Packages/
git clone .git Package\ Control
或者打開sublime_text然後按快捷鍵ctrl+`(Esc下面那個鍵),在彈出的命令輸入窗口輸入下面信息回車即可:
import urllib.request,os,hashlib; h = '' + ''; pf = 'Package Control.sublime-package'; ipp = sublime.installed_packages_path(); urllib.request.install_opener( urllib.request.build_opener( urllib.request.ProxyHandler()) ); by = urllib.request.urlopen( '' + pf.replace(' ', '%20')).read(); dh = hashlib.sha256(by).hexdigest(); print('Error validating download (got %s instead of %s), please try manual install' % (dh, h)) if dh != h else open(os.path.join( ipp, pf), 'wb' ).write(by)
重新啟動SublimeText 3,然後使用快捷鍵Ctrl + Shift + p,在彈出的輸入框中輸入Package Control則可以看到Install Package的選項,選擇它後一會兒(看左下角的狀態)會彈出插件查詢及安裝窗口,輸入想用的插件,選中回車即可。如果用於C/C++開發建議安裝C++ snipptes,ConvertToUTF8,SublimeAStyleFormatter插件,具體代表什麼意思一下就清楚了。
3. 安裝強大的SublimeClang插件
SublimeClang是Sublime Text中唯一的C/C++自動補全插件,功能強大,自帶語法檢查功能,不過最近作者已經停止更新了,目前只能在Sublime Text 2的Package Control中可以找到並自動安裝,在SublimeText 3中只能手動通過源碼安裝,其代碼線在中。具體安裝步驟如下:
安裝相關軟體
sudo apt-get install cmake build-essential clang git
cd ~/.config/sublime-text-3/Packages
git clone --recursive SublimeClang
cd SublimeClang
cp /usr/lib/x86_64-linux-gnu/libclang-3.4.so.1 internals/libclang.so #這一步很重要,如果你的clang庫不是3.4版本的話,請將對應版本的庫拷貝到internals中
cd src
mkdir build
cd build
cmake ..
make
一切成功的話將會在SublimeClang/internals目錄中生成libcache.so庫文件。重啟Sublime Text,然後按快捷鍵Ctrl + `(Esc下面那個鍵)打開自帶的控制輸出,看看有沒有錯誤,如果沒有錯誤就說明一切OK了。接下來就是配置自己的文件了,按下ctrl + shift + p快捷鍵,在彈出的輸入框中輸入 sublimeclang settings ,然後選擇帶User那一行,在打開的文件中輸入如下信息:
{
"show_output_panel": false,
"dont_prepend_clang_includes": true,
"inhibit_sublime_completions": false,
"options":
[
"-std=gnu++11",
"-isystem", "/usr/include",
"-isystem", "/usr/include/c++/*",
"-isystem", "/usr/include/c++/4.8",
"-isystem", "/usr/include/c++/4.8/*",
"-isystem", "/usr/include/boost",
"-isystem", "/usr/include/boost/**",
"-isystem", "/usr/lib/gcc/x86_64-linux-gnu/4.8/include",
"-isystem", "/usr/lib/gcc/x86_64-linux-gnu/4.8/include/*"
]
}
注釋:我的gcc版本為4.8,如果你的不是請替換對應的版本,在#include相應的頭文件後保存當前文件,在接下來的操作中將更快的提示所包含在頭文件的函數或者變數。
4. 工程實例
通過菜單欄中的Project -> Add Folder To Project...把你已有的原代碼目錄加入到Sublime Text中,然後通過Project -> Save Project As...來保存你的項目,這樣就創建好了項目。例如我的機器在/media/WinE/WorkStation/Swift中有個C++項目,代碼分別放在了Swift下的swift/base和swift/disruptor兩個目錄下,現在想要把這兩個目錄中的內容在寫代碼時能夠自動提示則需要相應的配置修改。Project -> Edit Project,在所打開的配置文件中我更改如下:
{
"folders":
[
{
"follow_symlinks": true,
"path": "/media/WinE/WorkStation/Swift"
}
],
"settings":
{
"sublimeclang_options":
[
"-I/media/WinE/WorkStation/Swift",
"-I/media/WinE/WorkStation/Swift/swift/base",
"-I/media/WinE/WorkStation/Swift/swift/disruptor",
]
}
}
綜合以上,如果你有什麼問題,請能提出,大家一起進步,希望你能愛上個傢伙。
『叄』 Disruptor 源碼分析 一個消費者和多個消費者的區別
它可以用來替代隊列,同時有很多SEDA和Actors模式的特性。和隊列比較:Disruptor可以向其他線程發送消息,並在需要的時候喚醒其他線程(和BlockingQueue相似)。不過,他們之間有三個主要的區別。2. 把消息放入Disruptor需要2個步驟
『肆』 為什麼我不再用 NET 框架
.NET平台很棒。真的很棒。直到它不再那麼棒。我為什麼不再用.NET?簡單來說,它限制了我們選擇的能力(對我來說很重要),轉移了我們的注意力,使得我們向內認知它的安全性,替代了幫助我們認知外面廣闊世界的所有可能性。
[系好安全帶:這個文章的長度幾乎成了一本書…]
優點
首先讓我開始說說.NET做得對的許多事吧,盡管這其中的大多數並不來自.NET本身,但卻是由.NET社區而來。
C#
C#令人驚嘆。我認為它是一個令人驚嘆的編程語言。從強大的C語言背景而來,我徹底地喜歡其語法,流和這門語言的所帶來的感覺。當然有我可能改變的事,但總體來說它是一門扎實的語言。並且基於開發人員使用的編程語言如此巨額的百分比和Windows操作系統的優越性,它是一門眾所周知的語言。
ReSharper
我也很喜歡Resharper。在JetBrains工作的開發者們都是奇跡般的人。如果沒有ReSharper和一些相關的工具,我可能並不會如此喜歡C#。
BDD and MSpec
我也很喜歡簡稱為機器規格(mspec)的BDD風格的框架。它是一個令人驚嘆的測試框架,真正支持在測試中使用正確的語言測試本身。在使用mspec之前,我的測試真是一團糟並且很礙我的事。
另外,當我們創建GoConvey—基於Golang的BDD測試框架的時候,Mspec對於我的組織來說是一個巨大的靈感和激勵。
多語言運行時
我認為多語言的CLR(公共語言運行時)的觀念真得使得JVM的世界思考著。我不知道任何非Java的JVM語言在CLR之前,但隨著「公共語言運行時」的到來,我的理解是這使得使用JVM的人們向前進並且最終創造了如Scala和Clojure這樣偉大的JVM編程語言。如果我錯了請糾正我。再者,CLR使得Sun公司的人們坐下來並關注它,因為Java有一點陳舊並且隨著Java 8的到來,僅僅現在才在多個方面追趕著。競爭是一件非常好的事。
NuGet
另一個顯著的例子是NuGet。這個包在Windows中作為一個整體特別是在Windows的開發中,它的管理軼事是糟透的。NuGet解決了很多問題,他們也通過從Python和Ruby借用了很多東西去做了很多正確的事。有改進的餘地嗎?當然。但比起其他一些選擇在這兒或那兒的包升級來說,我還沒有感到使用NuGet有這許多痛楚。
Mono
對於Mono的開發者們,我不能不說太棒了。他們所創造的太驚奇了。沒有任何官方支持和不顧潛在的懸在他們頭上的法律問題,他們向前推進並創造了一個居然能替代官方運行時的實現。我已經有一些運行在產品中應用程序,在Mono下運行了幾乎一年而沒有任何問題。它的產品准備好了嗎?這可能取決於你的應用程序(見下文「Mono」)。
CQRS 和事件溯源
可以認為,關於.NET最好事之一是,它是CQRS的誕生地並有相關的技術:事件溯源。就算這樣,CQRS+ES本身並沒有什麼很新的東西。正如Greg Young將會告訴你的,這是由一堆40年歷史原料為我們重新打包並更名的。對於大型代碼庫我有些非常嚴重的問題,當我5年前使用CQRS+ES的時候,它完全釋放了我的域。CQRS+ES現在是命名模式的並且其成長是顯而易見的。這可能是因為.NET已經能夠和其他的開發平台交互共享的原因。除了這個之外,大多數的創新是從外部來的。
缺點
優點先放在一邊,讓我們看看什麼出錯了和我為什麼不再用.NET框架。關於我最近開發平台的遷移,最能激勵我的事是我可以利用許多最好的部分而丟下不好的部分(如下文所說)。
Windows
正如前文所述,當面對基於網路的伺服器軟體時,Windows並不是一個好的選手。在我看來,Windows的另一個真正的大問題是傳統的Windows開發者是通常僅僅擅長於Windows,當他們離開安樂窩之後就會很快迷失,這對於Linux開發者來說卻不是問題。計算遠不止是Windows。開發者僅僅能操作單一的操作系統的一個問題是它不可避免得導致Windows的激增。換句話說,Windows生了Windows。沒辦法打破這個循環。
另一方面,*NIX的開發者通常熟悉多操作系統(Linux,Unix,OSX,Windows等等),一個操作系統的內部工作原理,不同的分布(基於Debian和基於Fedora),窗口管理器,桌面管理器,文件系統,包管理,編譯,重新編譯,重新打包,命令行「fu」等等。
我的一個心病是文件系統。NTFS並不是系統唯一的文件系統,對於任何給予的任務它幾乎都不是最好的選擇。ZFS,BTRFS,ReiserFs,ext*等等,有一些很酷的特性。我也很喜歡為了各種高速/透明的磁碟操作,能從BASH創建迴路設備或者創建RAM設備。這在Windows中不會發生—如果沒有第三方軟體的話。
在AWS雲服務中,啟動一個Windows機器要花掉足足10多分鍾。我大約15-20秒就能啟動一個簡單的Linux機器。當涉及到雲計算規模,它能夠迅速擴展是很重要的,因為當擴展很重要時,10-15分鍾就像是永恆的。
Visual Studio
在我這另一根刺,當屬Visual Studio。我需要一個大大超出預期的 IDE 去做任何開發,這個想法困擾著我。它只是如Windows一樣龐大的資源豬。我有一個內核i7 3770K 3.5GHZ的台式機,以16GB的內存和最大4512GB的固態硬碟去編譯。它差不多刷爆了Windows體驗指數,但Windows+VS仍然很慢。(是的,ReSharper使得它更慢了,但是ReSharper對這來說是值得的。)
現在我在MacBook Pro上開發,它比起我的強大的台式機來說只有更少的CPU馬力,但運行明顯更快,在一個短小的學習曲線之後,UX(用戶體驗)變得無限美好了。事實上,我甚至不再用滑鼠了—我的雙手一直在鍵盤或觸控板上,我可以用手勢操作我的電腦並讓它回應—不像在Windows。
關於VS很酷的一個事是調試器。它的查看和使用,令人難以置信得方便。每隔一段時間會在監視窗口報告錯誤的值,導致花費更多時間去調試。同時,這也是很大的負面,因為CLR默認的,多線程的世界使得我一開始就需要一個調試器。沒有調試器是一個解脫的體驗,因為它迫使你以另一種方式編程。
VS同樣也有創建「csproj」和「sln」文件的壞毛病。我恨這些。當然,C#必須知道編譯什麼和何時編譯。我理解這點。在Golang中,引用在代碼中使用了很重要的語句。如果它不是.NET中用到的工程文件,我可能使用簡單的文本編輯器編碼C#,並且對這門語言更流暢。使用git rebase操作時,這些文件也有導致合並沖突。
別讓我開始說換行符的差異。我不能相信直到今天我們還在處理這樣的事。如果VS解決方案文件以Linux行結束符結束,通過雙擊它並不能載入該解決方案,因為VS解決方案文件分析器讀不出它來。
源代碼管理
幸運的是,我早就跳出了微軟陣營的源代碼管理(版本控制系統VSS)。我早在2000年初,在VSS無數次丟失了我的提交之後,就使用了Subversion(譯者註:Subversion是開源的版本控制系統)。之後git(譯者註:git是開源的版本控制系統,內容管理系統等)出現了,我又迷上了它。不幸的是,沒有Windows的介面—對我來說是典型的遭遇。最終有人創建了一個介面,我就用了那個並且沒有回頭。Git是一把非常鋒利的刀,但當你正確運用它的時候,它是一個強大而高效的工具。我曾經在一個小工程中用過TFS(譯者註:Team Foundation Server,工作流協作引擎),它是一個怪物—和所有來自Redmond(譯者註:美國微軟總部)的產品一樣。它感染了我的項目文件並且污染了我的源代碼目錄。真可惡。不,還是謝謝你。給了我任意一天用命令行git…或者可能是SourceTree,如果你需要從GUI得到一點關愛。
Mono
是的,這是第二次提及Mono。正如Mono本身如此驚艷一樣。在.NET的世界,它仍然二等公民。無論什麼時候我嘗試在Mono上運行任何重要的東西,我通常都在和漏洞作斗爭。幸運的是,對下載代碼,查找問題,發送請求和在Linux上編譯代碼我沒有感到不舒服。但是這件事我都記不清做了多少遍了。
是的,CLR是個巨大的怪物,並且對一個非官方的應用在不同的操作系統都有相同的行為,簡直是個類似於分開紅海的奇跡。但事實是,我不得不花費如此多的時間來填補漏洞以使我的代碼能夠正確運行,實在是很難為其辯護。
Mono的特定區域也慢。也許它不是在慢在過載,但對我來說Web伺服器是關鍵所在。並且它非常慢,最後,慢到了最底下—即使是微不足道的東西。我想好消息是它只能從這兒得到更好的。我也應該提及Mono的開發者可能忘了Linux,比起我可能知道的還多,所以我不能太挑剔。
IIS
也許IIS在嘗試著為太多的應用程序做太多的事情。它從作為一個web伺服器變為像J2EE應用程序容器一樣的應用程序宿主。它也站在慢速這一邊。我猜如果我需要更高的性能,我應該編寫我自己的web伺服器,但我真的很想只關注我應用程序的代碼。可能利用Windows事件伺服器將是好的,但nginx(譯者註:一個高性能的HTTP和反向代理伺服器,也是一個IMAP/POP3/SMTP代理伺服器)和其他伺服器只是不喜歡在Windows中生產。
虛擬的以JVM為基礎的實現,例如Netty(譯者註:JBOSS提供的一個java開源框架),很容易處理每秒650K+/的請求量。IIS在運行一個簡單的CLR應用程序「Hello,World!」,處理大約每秒50K的請求量時就會壅塞。(有趣的題外話,參考基準開發者通過TCP套接字創建了一個簡單的C#的web伺服器,它能處理大約每秒120K的請求量。)
狹隘的心理
前些年有個運動叫做ALT.NET。該運動是全部是關於尋找我們自身之外的更廣闊的開發社區以作為一個整體,並匯聚不同的部分。有趣的是,那是StructureMap、Autofac、NuGet、ASP.NET MVC和許多其它工具的靈感來源。在傳統的.NET的圈子裡,這個運動受到了很多的不屑和鄙視。我把這看作是,作為一個整體的社區普遍的狹隘心理和怠惰的一個極大的例證。(的確,它們中的一些可能會消失,進而以包括Redis,MongoBD還有其它的不同的技術而出現。)
有這么多很棒的方案在那裡。假定微軟已註定是唯一正確之路的想法是荒謬的。如果是這樣的話,我們就都還在使用Visual Studio的設計工具去拖放按鈕和鏈接元素到一個WebForm的界面上,我們會設定了該按鈕並且依賴ViewState以幫助我們與可怕的HTTP所帶來的恐懼隔開。我從我的一個部署的代碼庫中最後一個WebForm中擺脫的那一天,是個光榮的值得慶賀的日子。
誰又曾想過「網路控制」是個好主意?很顯然我考慮過因為我喝了Kool-Aid(譯者註:卡夫公司出品的飲料,這里意指明知是註定的或有危險的仍然去做,有負面涵義)並且完全接受它。它狠咬了我。見過2MB的ViewState嗎?
[註:當我寫這篇文章的時候,原來的標題,「為什麼我不再用.NET」,意味著整個.NET生態系統。標題感覺有點短於是我更新為「為什麼我不再用.NET框架」。我想.NET作為一個生態系統,包括了所有的工具,工程,平台,組織還有很多開發者。這就是為什麼有些更廣泛的.NET社區的元素在我的這篇文章中受到抨擊原因。]
性能殺手
C,Java和C#中典型的多線程範例都強烈推薦使用鎖和互斥。對於鎖來說有個隱藏的開銷:它們慢得難以忍受。使用Disruptor(JVM中的無鎖的環形緩存[譯者註:實際上就是擁有一個序號指向下一個可用元素的數組]),你可以很容易得每秒處理20M以上的事件。在.NET中使用規定的「最佳實踐」等任何超過每秒十幾次的傳輸,都被認為是體面又好的性能表現,在這一點上來說你僅僅需要更大/更好/更多的硬體設備。事實上,我見過第三方客戶端庫(Rabbit,Couch,Mongo等等)中鎖語句遍布整個代碼。即使在我的代碼中沒有任何的並發,默認的和首選的方法都用了鎖。
無鎖的、事件驅動的方法允許你大幅降低硬體和資金支出。大部分應用程序可以輕易地運行在兩台機器上,第二台機器僅僅在冗餘和失效備援時是必須的,以防因為硬體相關的問題導致第一台機器不可用的時候起作用。
這個問題的另一個方面是調用網路和磁碟子系統的傳統方式:同步,阻塞代碼。如果你需要多個並發的HTTP請求,你需要更多的線程。大多數人不知道的是,為維持線程多出的1-2MB和上下文切換線程的需求,使得CPU內核消耗所有的時間顛簸在上下文切換上而不是做真正的工作。所以現在我們得到了在一個應用程序中數百或數千的線程,佔用了RAM,並造成CPU停滯不前。還有個更好的方式。
Netty/NIO (JVM),Erlang,Node,Gevent (Python)和Go都支持使用事件驅動的子系統操作(選擇/epoll[譯者註:Linux內核中的一種可擴展IO事件處理機制]/kqueue[譯者註:FreeBSD的可擴展的事件通知介面])。這就意味著當等待數據包被tx/rx跨網路的時候,CPU可以自由地去做其它,重要的工作。因為JVM的成熟,Netty可以認為是做這項工作最快的,但我喜歡Go用Goroutines操作這個的方式—它簡單,優雅,很容易推理,沒有像義大利面條一樣的回調。
SQL Server
作為一名.NET開發者,當你開始一個新的工程時,有一些事是你通常會去做的:
創建一個新的solution
將其部署到Team Foundation Server(譯者註:Microsoft 應用程序生命周期管理 (ALM) 解決方案的核心協作平台)
IIS中建立相應的網站入口
創建一個新的SQL Server資料庫
在solution中關聯Entity Framework(通常是2010年之後創建的工程)
開始設計你的資料庫和ActiveRecord實體
在大多數情況下這不是編寫代碼的正確方式。當然它可能在某些情況下有效,但是作為一個「默認的架構」它並不是你想要的。為什麼在我們甚至還沒理解問題領域之前已經做了任何技術上的選擇?這簡直是本末倒置了。
微軟的生態系統鼓勵每個人使用SQL Server。在Visual Studio中和SQL Service進行交互或者使用SQL Management Studio(和它的前身,SQL查詢分析器)是如此令人難以置信的容易。這種以資料庫為中心的重點,是欽定的或唯一正確的方式的一部分。它使你更加迷戀微軟。廠商鎖定始終對廠商來說是好的。
為什麼我們要如此開發?為什麼我們不更多地考慮應用程序的行為而不是它如何存儲的?現在我所有的項目都使用基於JSON的鍵/值存儲。有了這種功能,我可以選擇任何我想要的存儲引擎,包括SQL Server,Oracle,PostgreSQL,MySQL,Cassandra, CouchDB, CouchBase, Dynamo, SimpleDB, S3, Riak, BerkeleyDB, Firebird, Hypertable, RavenDB, Redis, Tokyo Cabinet/Tyrant, Azure Blobs,文件系統中的明文JSON文件等等等等。突然之間,我們能夠開始根據其優點而不是僅僅對其熟悉來選擇存儲引擎了。
題外話:在AWS RDS的雲上運行過SQL Server嗎?別這么做。當然它會工作,但是一些例如復制這樣最簡單的事是不存在的。文章充斥著對SQL Server不能在AWS RDS上工作的引用。
結論
也許我在軟體開發中學到的兩件最重要的教訓是:
邊界和封裝的重要性(以多種形式)
付出代價以得到正確的模型和抽象
許多年前我恨「模型」這個詞。每個人都會把它到處扔,它是一個如此過載的術語,很難理解它的含義和它為什麼這么重要。就這點來說,我僅僅會說模型是對你想要封裝的現實的一個有限的表示。也許最簡單的例子就是地球儀的墨卡托投影了。這很確切得說明了一件事:導航。如果你在其他的事情上使用它,它並不毫無價值。如果你不專注於付出代價去使模型正確,去封裝商業現實,那麼沒有任何技術能夠拯救你。
我對.NET最大的抱怨是,「唯一正確的方式」引導你遠離理想的模型並把你推向關注實現細節和技術缺陷的方向。這樣的關注導致技術實施滲血並且感染模型,最終導致它腐爛變質,因為它不能適應不斷變化的商業需求。當這發生的時候,開發者掙扎著並蹬踢著,如同吸毒者一樣,他們從一個新技術轉向另一個,以期望下一個強大的技術能夠治癒他們的病痛。
技術本身並不是靈丹妙葯,相反地,它是關於取捨和選擇。只有正確地理解了商業行為並把它們封裝進結構良好的,易於理解的模型中,以幫助保持技術堆棧在屬於它的地方—作為一個實現細節。
這就是我為什麼不再用.NET 框架,因為它不斷地重申自己(的主張),不斷地想要比它的本身更多的:一個實現細節。
『伍』 GitHub上面有哪些經典的java框架源碼
Bazel:來自Google的構建工具,可以快速、可靠地構建代碼。官網
Gradle:使用Groovy(非XML)進行增量構建,可以很好地與Maven依賴管理配合工作。官網
Buck:Facebook構建工具。官網
ASM:通用底層位元組碼操作和分析開發庫。官網
Byte Buddy:使用流式API進一步簡化位元組碼生成。官網
Byteman:在運行時通過DSL(規則)操作位元組碼進行測試和故障排除。官網
Javassist:一個簡化位元組碼編輯嘗試。官網
Apache Aurora:Apache Aurora是一個Mesos框架,用於長時間運行服務和定時任務(cron job)。官網
Singularity:Singularity是一個Mesos框架,方便部署和操作。它支持Web Service、後台運行、調度作業和一次性任務。官網
Checkstyle:代碼編寫規范和標准靜態分析工具。官網
Error Prone:將常見編程錯誤作為運行時錯誤報告。官網
FindBugs:通過位元組碼靜態分析查找隱藏bug。官網
jQAssistant:使用基於Neo4J查詢語言進行代碼靜態分析。官網
PMD:對源代碼分析查找不良的編程習慣。官網
SonarQube:通過插件集成其它分析組件,對過去一段時間內的數據進行統計。官網
ANTLR:復雜的全功能自頂向下解析框架。官網
JavaCC:JavaCC是更加專門的輕量級工具,易於上手且支持語法超前預測。官網
config:針對JVM語言的配置庫。官網
owner:減少冗餘配置屬性。官網
Choco:可直接使用的約束滿足問題求解程序,使用了約束規劃技術。官網
JaCoP:為FlatZinc語言提供了一個介面,可以執行MiniZinc模型。官網
OptaPlanner:企業規劃與資源調度優化求解程序。官網
Sat4J:邏輯代數與優化問題最先進的求解程序。官網
Bamboo:Atlassian解決方案,可以很好地集成Atlassian的其他產品。可以選擇開源許可,也可以購買商業版。官網
CircleCI:提供託管服務,可以免費試用。官網
Codeship:提供託管服務,提供有限的免費模式。官網
fabric8:容器集成平台。官網
Go:ThoughtWork開源解決方案。官網
Jenkins:支持基於伺服器的部署服務。官網
TeamCity:JetBrain的持續集成解決方案,有免費版。官網
Travis:通常用作開源項目的託管服務。官網
Buildkite: 持續集成工具,用簡單的腳本就能設置pipeline,而且能快速構建,可以免費試用。官網
uniVocity-parsers:速度最快功能最全的CSV開發庫之一,同時支持TSV與固定寬度記錄的讀寫。官網
Apache Phoenix:HBase針對低延時應用程序的高性能關系資料庫層。官網
Crate:實現了數據同步、分片、縮放、復制的分布式數據存儲。除此之外還可以使用基於SQL的語法跨集群查詢。官網
Flyway:簡單的資料庫遷移工具。官網
H2:小型SQL資料庫,以可以作為內存資料庫使用著稱。官網
HikariCP:高性能JDBC連接工具。官網
JDBI:便捷的JDBC抽象。官網
Protobuf:Google數據交換格式。官網
SBE:簡單二進制編碼,是最快速的消息格式之一。官網
Wire:整潔輕量級協議緩存。官網
Apache DeltaSpike:CDI擴展框架。官網
Dagger2:編譯時注入框架,不需要使用反射。官網
Guice:可以匹敵Dagger的輕量級注入框架。官網
HK2:輕量級動態依賴注入框架。官網
ADT4J:針對代數數據類型的JSR-269代碼生成器。官網
AspectJ:面向切面編程(AOP)的無縫擴展。官網
Auto:源代碼生成器集合。官網
DCEVM:通過修改JVM在運行時支持對已載入的類進行無限次重定義。官網
HotswapAgent:支持無限次重定義運行時類與資源。官網
Immutables:類似Scala的條件類。官網
JHipster:基於Spring Boot與AngularJS應用程序的Yeoman源代碼生成器。官網
JRebel:無需重新部署,可以即時重新載入代碼與配置的商業軟體。官網
Lombok:減少冗餘的代碼生成器。官網
Spring Loaded:類重載代理。官網
vert.x:多語言事件驅動應用框架。官網
Akka:用來編寫分布式容錯並發事件驅動應用程序的工具和運行時。官網
Apache Storm:實時計算系統。官網
Apache ZooKeeper:針對大型分布式系統的協調服務,支持分布式配置、同步和名稱注冊。官網
Hazelcast:高可擴展內存數據網格。官網
Hystrix:提供延遲和容錯。官網
JGroups:提供可靠的消息傳遞和集群創建的工具。官網
Orbit:支持虛擬角色(Actor),在傳統角色的基礎上增加了另外一層抽象。官網
Quasar:為JVM提供輕量級線程和角色。官網
Apache Cassandra:列式資料庫,可用性高且沒有單點故障。官網
Apache HBase:針對大數據的Hadoop資料庫。官網
Druid:實時和歷史OLAP數據存儲,在聚集查詢和近似查詢方面表現不俗。官網
Infinispan:針對緩存的高並發鍵值對數據存儲。官網
Bintray:發布二進制文件版本控制工具。可以於Maven或Gradle一起配合使用。提供開源免費版本和幾種商業收費版本。官網
Central Repository:最大的二進制組件倉庫,面向開源社區提供免費服務。Apache Maven默認使用Central官網Repository,也可以在所有其他構建工具中使用。
IzPack:為跨平台部署建立創作工具(Authoring Tool)。官網
JitPack:打包GitHub倉庫的便捷工具。可根據需要構建Maven、Gradle項目,發布可立即使用的組件。官網
Launch4j:將JAR包裝為輕量級本機Windows可執行程序。官網
Nexus:支持代理和緩存功能的二進制管理工具。官網
packr:將JAR、資源和JVM打包成Windows、Linux和Mac OS X本地發布文件。官網
Apache POI:支持OOXML規范(XLSX、DOCX、PPTX)以及OLE2規范(XLS、DOC、PPT)。官網
documents4j:使用第三方轉換器進行文檔格式轉換,轉成類似MS Word這樣的格式。官網
jOpenDocument:處理OpenDocument格式(由Sun公司提出基於XML的文檔格式)。官網
Cyclops:支持一元(Monad)操作和流操作工具類、comprehension(List語法)、模式匹配、trampoline等特性。官網
Fugue:Guava的函數式編程擴展。官網
Functional Java:實現了多種基礎和高級編程抽象,用來輔助面向組合開發(composition-oriented development)。官網
Javaslang:一個函數式組件庫,提供持久化數據類型和函數式控制結構。官網
jOOλ:旨在填補Java 8 lambda差距的擴展,提供了眾多缺失的類型和一組豐富的順序流API。官網
jMonkeyEngine:現代3D游戲開發引擎。官網
libGDX:全面的跨平台高級框架。官網
LWJGL:對OpenGL/CL/AL等技術進行抽象的健壯框架。官網
JavaFX:Swing的後繼者。官網
Scene Builder:開發JavaFX應用的可視化布局工具。官網
Agrona:高性能應用中常見的數據結構和工具方法。官網
Disruptor:線程間消息傳遞開發庫。官網
fastutil:快速緊湊的特定類型集合(Collection)。官網
GS Collections:受Smalltalk啟發的集合框架。官網
HPPC:基礎類型集合。官網
Javolution:實時和嵌入式系統的開發庫。官網
JCTools:JDK中缺失的並發工具。官網
Koloboke:Hash set和hash map。官網
Trove:基礎類型集合。官網
High-scale-bli:Cliff Click 個人開發的高性能並發庫官網
Eclipse:老牌開源項目,支持多種插件和編程語言。官網
IntelliJ IDEA:支持眾多JVM語言,是安卓開發者好的選擇。商業版主要針對企業客戶。官網
NetBeans:為多種技術提供集成化支持,包括Java SE、Java EE、資料庫訪問、HTML5
Imgscalr:純Java 2D實現,簡單、高效、支持硬體加速的圖像縮放開發庫。官網
Picasso:安卓圖片下載和圖片緩存開發庫。官網
Thumbnailator:Thumbnailator是一個高質量Java縮略圖開發庫。官網
ZXing:支持多種格式的一維、二維條形碼圖片處理開發庫。官網
im4java: 基於ImageMagick或GraphicsMagick命令行的圖片處理開發庫,基本上ImageMagick能夠支持的圖片格式和處理方式都能夠處理。官網
Apache Batik:在Java應用中程序以SVG格式顯示、生成及處理圖像的工具集,包括SVG解析器、SVG生成器、SVG DOM等模塊,可以集成使用也可以單獨使用,還可以擴展自定義的SVG標簽。官網
Genson:強大且易於使用的Java到JSON轉換開發庫。官網
Gson:谷歌官方推出的JSON處理庫,支持在對象與JSON之間雙向序列化,性能良好且可以實時調用。官網
Jackson:與GSON類似,在頻繁使用時性能更佳。官網
LoganSquare:基於Jackson流式API,提供對JSON解析和序列化。比GSON與Jackson組合方式效果更好。官網
Fastjson:一個Java語言編寫的高性能功能完善的JSON庫。官網
Kyro:快速、高效、自動化的Java對象序列化和克隆庫。官網
JDK 9:JDK 9的早期訪問版本。官網
OpenJDK:JDK開源實現。官網
Scala:融合了面向對象和函數式編程思想的靜態類型編程語言。官網
Groovy:類型可選(Optionally typed)的動態語言,支持靜態類型和靜態編譯。目前是一個Apache孵化器項目。官網
Clojure:可看做現代版Lisp的動態類型語言。官網
Ceylon:RedHat開發的面向對象靜態類型編程語言。官網
Kotlin:JetBrain針對JVM、安卓和瀏覽器提供的靜態類型編程語言。官網
Xtend:一種靜態編程語言,能夠將其代碼轉換為簡潔高效的Java代碼,並基於JVM運行。官網
Apache Log4j 2:使用強大的插件和配置架構進行完全重寫。官網
kibana:分析及可視化日誌文件。官網
Logback:強健的日期開發庫,通過Groovy提供很多有趣的選項。官網
logstash:日誌文件管理工具。官網
Metrics:通過JMX或HTTP發布參數,並且支持存儲到資料庫。官網
SLF4J:日誌抽象層,需要與具體的實現配合使用。官網
Apache Flink:快速、可靠的大規模數據處理引擎。官網
Apache Hadoop:在商用硬體集群上用來進行大規模數據存儲的開源軟體框架。官網
Apache Mahout:專注協同過濾、聚類和分類的可擴展演算法。官網
Apache Spark:開源數據分析集群計算框架。官網
DeepDive:從非結構化數據建立結構化信息並集成到已有資料庫的工具。官網
Deeplearning4j:分布式多線程深度學習開發庫。官網
H2O:用作大數據統計的分析引擎。官網
Weka:用作數據挖掘的演算法集合,包括從預處理到可視化的各個層次。官網
QuickML:高效機器學習庫。官網、GitHub
Aeron:高效可擴展的單播、多播消息傳遞工具。官網
Apache ActiveMQ:實現JMS的開源消息代理(broker),可將同步通訊轉為非同步通訊。官網
Apache Camel:通過企業級整合模式(Enterprise Integration Pattern EIP)將不同的消息傳輸API整合在一起。官網
Apache Kafka:高吞吐量分布式消息系統。官網
Hermes:快速、可靠的消息代理(Broker),基於Kafka構建。官網
JBoss HornetQ:清晰、准確、模塊化,可以方便嵌入的消息工具。官網
JeroMQ:ZeroMQ的純Java實現。官網
Smack:跨平台XMPP客戶端函數庫。官網
Openfire:是開源的、基於XMPP、採用Java編程語言開發的實時協作伺服器。 Openfire安裝和使用都非常簡單,並可利用Web界面進行管理。官網GitHub
Spark:是一個開源,跨平台IM客戶端。它的特性支持集組聊天,電話集成和強大安全性能。如果企業內部部署IM使用Openfire+Spark是最佳的組合。官網GitHub
Tigase: 是一個輕量級的可伸縮的 Jabber/XMPP 伺服器。無需其他第三方庫支持,可以處理非常高的復雜和大量的用戶數,可以根據需要進行水平擴展。官網
Design Patterns:實現並解釋了最常見的設計模式。官網
Jimfs:內存文件系統。官網
Lanterna:類似curses的簡單console文本GUI函數庫。官網
LightAdmin:可插入式CRUD UI函數庫,可用來快速應用開發。官網
OpenRefine:用來處理混亂數據的工具,包括清理、轉換、使用Web Service進行擴展並將其關聯到資料庫。官網
RoboVM:Java編寫原生iOS應用。官網
Quartz:強大的任務調度庫.官網
AppDynamics:性能監測商業工具。官網
JavaMelody:性能監測和分析工具。官網
Kamon:Kamon用來監測在JVM上運行的應用程序。官網
New Relic:性能監測商業工具。官網
SPM:支持對JVM應用程序進行分布式事務追蹤的性能監測商業工具。官網
Takipi:產品運行時錯誤監測及調試商業工具。官網
JNA:不使用JNI就可以使用原生開發庫。此外,還為常見系統函數提供了介面。官網
Apache OpenNLP:處理類似分詞等常見任務的工具。官網
CoreNLP:斯坦佛CoreNLP提供了一組基礎工具,可以處理類似標簽、實體名識別和情感分析這樣的任務。官網
LingPipe:一組可以處理各種任務的工具集,支持POS標簽、情感分析等。官網
Mallet:統計學自然語言處理、文檔分類、聚類、主題建模等。官網
Async Http Client:非同步HTTP和WebSocket客戶端函數庫。官網
Grizzly:NIO框架,在Glassfish中作為網路層使用。官網
Netty:構建高性能網路應用程序開發框架。官網
OkHttp:一個Android和Java應用的HTTP+SPDY客戶端。官網
Undertow:基於NIO實現了阻塞和非阻塞API的Web伺服器,在WildFly中作為網路層使用。官網
Ebean:支持快速數據訪問和編碼的ORM框架。官網
EclipseLink:支持許多持久化標准,JPA、JAXB、JCA和SDO。官網
Hibernate:廣泛使用、強健的持久化框架。Hibernate的技術社區非常活躍。官網
MyBatis:帶有存儲過程或者SQL語句的耦合對象(Couples object)。官網
OrmLite:輕量級開發包,免除了其它ORM產品中的復雜性和開銷。官網
Nutz:另一個SSH。官網,Github
JFinal:JAVA WEB + ORM框架。官網,Github
Apache FOP:從XSL-FO創建PDF。官網
Apache PDFBox:用來創建和操作PDF的工具集。官網
DynamicReports:JasperReports的精簡版。官網
flyingsaucer:XML/XHTML和CSS 2.1渲染器。官網
iText:一個易於使用的PDF函數庫,用來編程創建PDF文件。注意,用於商業用途時需要許可證。官網
JasperReports:一個復雜的報表引擎。官網
jHiccup:提供平台中JVM暫停的日誌和記錄。官網
JMH:JVM基準測試工具。官網
JProfiler:商業分析器。官網
LatencyUtils:測量和報告延遲的工具。官網
VisualVM:對運行中的應用程序信息提供了可視化界面。官網
YourKit Java Profiler:商業分析器。官網
Reactive Streams:非同步流處理標准,支持非阻塞式反向壓力(backpressure)。官網
Reactor:構建響應式快速數據(fast-data)應用程序的開發庫。官網
RxJava:通過JVM可觀察序列(observable sequence)構建非同步和基於事件的程序。官網
Dropwizard:偏向於自己使用的Web框架。用來構建Web應用程序,使用了Jetty、Jackson、Jersey和Metrics。官網
Feign:受Retrofit、JAXRS-2.0和WebSocket啟發的HTTP客戶端連接器(binder)。官網
Jersey:JAX-RS參考實現。官網
RESTEasy:經過JAX-RS規范完全認證的可移植實現。官網
RestExpress:一個Java類型安全的REST客戶端。官網
RestX:基於註解處理和編譯時源碼生成的框架。官網
Retrofit:類型安全的REST客戶端。官網
Spark:受到Sinatra啟發的Java REST框架。官網
Swagger:Swagger是一個規范且完整的框架,提供描述、生產、消費和可視化RESTful Web Service。官網
Blade:國人開發的一個輕量級的MVC框架. 它擁有簡潔的代碼,優雅的設計。官網
DataMelt:用於科學計算、數據分析及數據可視化的開發環境。官網
JGraphT:支持數學圖論對象和演算法的圖形庫。官網
JScience:用來進行科學測量和單位的一組類。官網
Apache Solr:一個完全的企業搜索引擎。為高吞吐量通信進行了優化。官網
Elasticsearch:一個分布式、支持多租戶(multitenant)全文本搜索引擎。提供了RESTful Web介面和無schema的JSON文檔。官網
Apache Lucene:是一個開放源代碼的全文檢索引擎工具包,是一個全文檢索引擎的架構,提供了完整的查詢引擎和索引引擎,部分文本分析引擎。官網
Apache Shiro:執行認證、授權、加密和會話管理。官網
Bouncy Castle,涵蓋了從基礎的幫助函數到PGP/SMIME操作。官網:多途加密開發庫。支持JCA提供者(JCA provider)
Cryptomator:在雲上進行客戶端跨平台透明加密。官網
Keycloak:為瀏覽器應用和RESTful Web Service集成SSO和IDM。目前還處於beta版本,但是看起來非常有前途。官網
PicketLink:PicketLink是一個針對Java應用進行安全和身份認證管理的大型項目(Umbrella Project)。官網
FlatBuffers:高效利用內存的序列化函數庫,無需解包和解析即可高效訪問序列化數據。官網
Kryo:快速、高效的對象圖形序列化框架。官網
FST:提供兼容JDK的高性能對象圖形序列化。官網
MessagePack:一種高效的二進制序列化格式。官網
Apache Tomcat:針對Servlet和JSP的應用伺服器,健壯性好且適用性強。官網
Apache TomEE:Tomcat加Java EE。官網
Jetty:輕量級、小巧的應用伺服器,通常會嵌入到項目中。官網
WebSphere Liberty:輕量級、模塊化應用伺服器,由IBM開發。官網
WildFly:之前被稱作JBoss,由Red Hat開發。支持很多Java EE功能。官網
Apache Velocity:提供HTML頁面模板、email模板和通用開源代碼生成器模板。官網
FreeMarker:通用模板引擎,不需要任何重量級或自己使用的依賴關系。官網
Handlebars.java:使用Java編寫的模板引擎,邏輯簡單,支持語義擴展(semantic Mustache)。官網
Thymeleaf:旨在替換JSP,支持XML文件的工具。官網
Apache JMeter:功能性測試和性能評測。官網
Arquillian:集成測試和功能行測試平台,集成Java EE容器。官網
AssertJ:支持流式斷言提高測試的可讀性。官網
Awaitility:用來同步非同步操作的DSL。官網
Cucumber:BDD測試框架。官網
Gatling:設計為易於使用、可維護的和高性能負載測試工具。官網
Hamcrest:可用來靈活創建意圖(intent)表達式的匹配器。官網
JMockit:用來模擬靜態、final方法等。官網
JUnit:通用測試框架。官網
Mockito:在自動化單元測試中創建測試對象,為TDD或BDD提供支持。官網
PowerMock: 支持模擬靜態方法、構造函數、final類和方法、私有方法以及移除靜態初始化器的模擬工具。官網
REST Assured:為REST/HTTP服務提供方便測試的Java DSL。官網
Selenide:為Selenium提供精準的周邊API,用來編寫穩定且可讀的UI測試。官網
Selenium:為Web應用程序提供可移植軟體測試框架。官網
Spock:JUnit-compatible framework featuring an expressive Groovy-derived specification language.官網兼容JUnit框架,支持衍生的Groovy范的語言。
TestNG:測試框架。官網
Truth:Google的斷言和命題(proposition)框架。官網
Unitils:模塊化測試函數庫,支持單元測試和集成測試。官網
WireMock:Web Service測試樁(Stub)和模擬函數。官網
Apache Commons:提供各種用途的函數,比如配置、驗證、集合、文件上傳或XML處理等。官網
args4j:命令行參數解析器。官網
CRaSH:為運行進行提供CLI。官網
Gephi:可視化跨平台網路圖形化操作程序。官網
Guava:集合、緩存、支持基本類型、並發函數庫、通用註解、字元串處理、I/O等。官網
JADE:構建、調試多租戶系統的框架和環境。官網
javatuples:正如名字表示的那樣,提供tuple支持。盡管目前tuple的概念還有留有爭議。官網
JCommander:命令行參數解析器。官網
Protégé:提供存在論(ontology)編輯器以及構建知識系統的框架。官網
Apache Nutch:可用於生產環境的高度可擴展、可伸縮的網路爬蟲。官網
Crawler4j:簡單的輕量級網路爬蟲。官網
JSoup:刮取、解析、操作和清理HTML。官網
Apache Tapestry:基於組件的框架,使用Java創建動態、強健的、高度可擴展的Web應用程序。官網
Apache Wicket:基於組件的Web應用框架,與Tapestry類似帶有狀態顯示GUI。官網
Google Web Toolkit:一組Web開發工具集,包含在客戶端將Java代碼轉為JavaScript的編譯器、XML解析器、RCP官網API、JUnit集成、國際化支持和GUI控制項。
Grails:Groovy框架,旨在提供一個高效開發環境,使用約定而非配置、沒有XML並支持混入(mixin)。官網
Ninja:Java全棧Web開發框架。非常穩固、快速和高效。官網
Pippo:小型、高度模塊化的類Sinatra框架。官網
Play:使用約定而非配置,支持代碼熱載入並在瀏覽器中顯示錯誤。官網
PrimeFaces:JSF框架,提供免費和帶支持的商業版本。包括若干前端組件。官網
Ratpack:一組Java開發函數庫,用於構建快速、高效、可擴展且測試完備的HTTP應用程序。官網
Spring Boot:微框架,簡化了Spring新程序的開發過程。官網
Spring:旨在簡化Java EE的開發過程,提供依賴注入相關組件並支持面向切面編程。官網
Vaadin:基於GWT構建的事件驅動框架。使用服務端架構,客戶端使用Ajax。官網
Blade:國人開發的一個輕量級的MVC框架. 它擁有簡潔的代碼,優雅的設計。官網
jBPM:非常靈活的業務流程管理框架,致力於構建開發與業務分析人員之間的橋梁。官網
Activity:輕量級工作流和業務流程管理框架。官網github
位元組碼操作
編程方式操作位元組碼的開發庫。
集群管理
在集群內動態管理應用程序的框架。
代碼分析
測量代碼指標和質量工具。
編譯器生成工具
用來創建解析器、解釋器或編譯器的框架。
外部配置工具
支持外部配置的開發庫。
約束滿足問題求解程序
幫助解決約束滿足問題的開發庫。
持續集成
CSV解析
簡化CSV數據讀寫的框架與開發庫
資料庫
簡化資料庫交互的相關工具。
幫實現依賴翻轉範式的開發庫。官網
開發流程增強工具
從最基本的層面增強開發流程。
分布式應用
用來編寫分布式容錯應用的開發庫和框架。
分布式資料庫
對應用程序而言,在分布式系統中的資料庫看起來就像是只有一個數據源。
發布
以本機格式發布應用程序的工具。
文檔處理工具
處理Office文檔的開發庫。
函數式編程
函數式編程支持庫。
游戲開發
游戲開發框架。
GUI
現代圖形化用戶界面開發庫。
高性能計算
涵蓋了從集合到特定開發庫的高性能計算相關工具。
IDE
簡化開發的集成開發環境。
JSON
簡化JSON處理的開發庫。
JVM與JDK
目前的JVM和JDK實現。
基於JVM的語言
除Java外,可以用來編寫JVM應用程序的編程語言。
日誌
記錄應用程序行為日誌的開發庫。
機器學習
提供具體統計演算法的工具。其演算法可從數據中學習。
消息傳遞
在客戶端之間進行消息傳遞,確保協議獨立性的工具。
雜項
未分類其它資源。
應用監控工具
監控生產環境中應用程序的工具。
原生開發庫
用來進行特定平台開發的原生開發庫。
自然語言處理
用來專門處理文本的函數庫。
網路
網路編程函數庫。
ORM
處理對象持久化的API。
用來幫助創建PDF文件的資源。
性能分析
性能分析、性能剖析及基準測試工具。
響應式開發庫
用來開發響應式應用程序的開發庫。
REST框架
用來創建RESTful 服務的框架。
科學計算與分析
用於科學計算和分析的函數庫。
搜索引擎
文檔索引引擎,用於搜索和分析。
安全
用於處理安全、認證、授權或會話管理的函數庫。
序列化
用來高效處理序列化的函數庫。
應用伺服器
用來部署應用程序的伺服器。
模板引擎
在模板中替換表達式的工具。
測試
測試內容從對象到介面,涵蓋性能測試和基準測試工具。
通用工具庫
通用工具類函數庫。
網路爬蟲
用於分析網站內容的函數庫。
Web框架
用於處理Web應用程序不同層次間通訊的框架。
業務流程管理套件
流程驅動的軟體系統構建。
資源
社區
『陸』 ubuntu 怎麼打開 sublime text
Sublime Text是個跨平台的編輯器,支持Windows、Linux、Mac系統平台,支持各種語言的代碼編輯,配合上對應的插件,話上點時間學習,你將會對它愛不釋手,大大的提高你的編碼效率。本文將講解在Ubuntu 14.04系統中安裝SublimeText 3,並配置SublimeClang插件來配置C/C++開發環境。
1. Sublime Text 3的下載安裝
到官方網站上http://www.sublimetext.com/3下載64位(系統位64位)的.deb安裝包(http://c758482.r82.cf2.rackcdn.com/sublime-text_build-3059_amd64.deb),下載後雙擊安裝即可。安裝好之後,通過命令subl即可打開程序,此時已經可以編寫代碼了。在開始之前建議先記下一些常用的快捷鍵,可參考:http://blog.csdn.net/cywosp/article/details/31791881
2. 安裝Package Control
Package Control是一個用於管理插件的好工具,可以用於安裝、刪除、禁用相應的插件,常用的插件都能在上面找到。其源碼地址在https://github.com/wbond/package_control_channel上,安裝非常方便,使用git將該代碼先克隆下來即可,然後拷貝到~/.config/sublime-text-3/Packages/目錄下並命名為Package Control即可。(也可以直接在github上打包下載,然後解壓復制到~/.config/sublime-text-3/Packages/目錄下並命名為Package Control)。
cd ~/.config/sublime-text-3/Packages/
git clone https://github.com/wbond/package_control_channel.git Package\ Control
或者打開sublime_text然後按快捷鍵ctrl+`(Esc下面那個鍵),在彈出的命令輸入窗口輸入下面信息回車即可:
import urllib.request,os,hashlib; h = '' + ''; pf = 'Package Control.sublime-package'; ipp = sublime.installed_packages_path(); urllib.request.install_opener( urllib.request.build_opener( urllib.request.ProxyHandler()) ); by = urllib.request.urlopen( 'http://packagecontrol.io/' + pf.replace(' ', '%20')).read(); dh = hashlib.sha256(by).hexdigest(); print('Error validating download (got %s instead of %s), please try manual install' % (dh, h)) if dh != h else open(os.path.join( ipp, pf), 'wb' ).write(by)
重新啟動SublimeText 3,然後使用快捷鍵Ctrl + Shift + p,在彈出的輸入框中輸入Package Control則可以看到Install Package的選項,選擇它後一會兒(看左下角的狀態)會彈出插件查詢及安裝窗口,輸入想用的插件,選中回車即可。如果用於C/C++開發建議安裝C++ snipptes,ConvertToUTF8,SublimeAStyleFormatter插件,具體代表什麼意思一下就清楚了。
3. 安裝強大的SublimeClang插件
SublimeClang是Sublime Text中唯一的C/C++自動補全插件,功能強大,自帶語法檢查功能,不過最近作者已經停止更新了,目前只能在Sublime Text 2的Package Control中可以找到並自動安裝,在SublimeText 3中只能手動通過源碼安裝,其代碼線在https://github.com/quarnster/SublimeClang中。具體安裝步驟如下:
安裝相關軟體
sudo apt-get install cmake build-essential clang git
cd ~/.config/sublime-text-3/Packages
git clone --recursive https://github.com/quarnster/SublimeClang SublimeClang
cd SublimeClang
cp /usr/lib/x86_64-linux-gnu/libclang-3.4.so.1 internals/libclang.so #這一步很重要,如果你的clang庫不是3.4版本的話,請將對應版本的庫拷貝到internals中
cd src
mkdir build
cd build
cmake ..
make
一切成功的話將會在SublimeClang/internals目錄中生成libcache.so庫文件。重啟Sublime Text,然後按快捷鍵Ctrl + `(Esc下面那個鍵)打開自帶的控制輸出,看看有沒有錯誤,如果沒有錯誤就說明一切OK了。接下來就是配置自己的文件了,按下ctrl + shift + p快捷鍵,在彈出的輸入框中輸入 sublimeclang settings ,然後選擇帶User那一行,在打開的文件中輸入如下信息:
{
"show_output_panel": false,
"dont_prepend_clang_includes": true,
"inhibit_sublime_completions": false,
"options":
[
"-std=gnu++11",
"-isystem", "/usr/include",
"-isystem", "/usr/include/c++/*",
"-isystem", "/usr/include/c++/4.8",
"-isystem", "/usr/include/c++/4.8/*",
"-isystem", "/usr/include/boost",
"-isystem", "/usr/include/boost/**",
"-isystem", "/usr/lib/gcc/x86_64-linux-gnu/4.8/include",
"-isystem", "/usr/lib/gcc/x86_64-linux-gnu/4.8/include/*"
]
}
注釋:我的gcc版本為4.8,如果你的不是請替換對應的版本,在#include相應的頭文件後保存當前文件,在接下來的操作中將更快的提示所包含在頭文件的函數或者變數。
4. 工程實例
通過菜單欄中的Project -> Add Folder To Project...把你已有的原代碼目錄加入到Sublime Text中,然後通過Project -> Save Project As...來保存你的項目,這樣就創建好了項目。例如我的機器在/media/WinE/WorkStation/Swift中有個C++項目,代碼分別放在了Swift下的swift/base和swift/disruptor兩個目錄下,現在想要把這兩個目錄中的內容在寫代碼時能夠自動提示則需要相應的配置修改。Project -> Edit Project,在所打開的配置文件中我更改如下:
{
"folders":
[
{
"follow_symlinks": true,
"path": "/media/WinE/WorkStation/Swift"
}
],
"settings":
{
"sublimeclang_options":
[
"-I/media/WinE/WorkStation/Swift",
"-I/media/WinE/WorkStation/Swift/swift/base",
"-I/media/WinE/WorkStation/Swift/swift/disruptor",
]
}
}
綜合以上,如果你有什麼問題,請能提出,大家一起進步,希望你能愛上個傢伙。
『柒』 linux sublime3 怎麼寫c
Sublime Text是個跨平台的編輯器,支持Windows、Linux、Mac系統平台,支持各種語言的代碼編輯,配合上對應的插件,話上點時間學習,你將會對它愛不釋手,大大的提高你的編碼效率。本文將講解在Ubuntu 14.04系統中安裝SublimeText 3,並配置SublimeClang插件來配置C/C++開發環境。
1. Sublime Text 3的下載安裝
到官方網站上http://www.sublimetext.com/3下載64位(系統位64位)的.deb安裝包(http://c758482.r82.cf2.rackcdn.com/sublime-text_build-3059_amd64.deb),下載後雙擊安裝即可。安裝好之後,通過命令subl即可打開程序,此時已經可以編寫代碼了。在開始之前建議先記下一些常用的快捷鍵,可參考:http://blog.csdn.net/cywosp/article/details/31791881
2. 安裝Package Control
Package Control是一個用於管理插件的好工具,可以用於安裝、刪除、禁用相應的插件,常用的插件都能在上面找到。其源碼地址在https://github.com/wbond/package_control_channel上,安裝非常方便,使用git將該代碼先克隆下來即可,然後拷貝到~/.config/sublime-text-3/Packages/目錄下並命名為Package Control即可。(也可以直接在github上打包下載,然後解壓復制到~/.config/sublime-text-3/Packages/目錄下並命名為Package Control)。
cd ~/.config/sublime-text-3/Packages/
git clone https://github.com/wbond/package_control_channel.git Package\ Control
重新啟動SublimeText 3,然後使用快捷鍵Ctrl + Shift + p,在彈出的輸入框中輸入Package Control則可以看到Install Package的選項,選擇它後一會兒(看左下角的狀態)會彈出插件查詢及安裝窗口,輸入想用的插件,選中回車即可。如果用於C/C++開發建議安裝C++ snipptes,ConvertToUTF8,SublimeAStyleFormatter插件,具體代表什麼意思一下就清楚了。
3. 安裝強大的SublimeClang插件
SublimeClang是Sublime Text中唯一的C/C++自動補全插件,功能強大,自帶語法檢查功能,不過最近作者已經停止更新了,目前只能在Sublime Text 2的Package Control中可以找到並自動安裝,在SublimeText 3中只能手動通過源碼安裝,其代碼線在https://github.com/quarnster/SublimeClang中。具體安裝步驟如下:
安裝相關軟體
sudo apt-get install cmake build-essential clang git
cd ~/.config/sublime-text-3/Packages
git clone --recursive https://github.com/quarnster/SublimeClang SublimeClang
cd SublimeClang
cp /usr/lib/x86_64-linux-gnu/libclang-3.4.so.1 internals/libclang.so #這一步很重要,如果你的clang庫不是3.4版本的話,請將對應版本的庫拷貝到internals中
cd src
mkdir build
cd build
cmake ..
make
一切成功的話將會在SublimeClang/internals目錄中生成libcache.so庫文件。重啟Sublime Text,然後按快捷鍵Ctrl + `(Esc下面那個鍵)打開自帶的控制輸出,看看有沒有錯誤,如果沒有錯誤就說明一切OK了。接下來就是配置自己的文件了,按下ctrl + shift + p快捷鍵,在彈出的輸入框中輸入 sublimeclang settings ,然後選擇帶User那一行,在打開的文件中輸入如下信息:
{
"show_output_panel": false,
"dont_prepend_clang_includes": true,
"inhibit_sublime_completions": false,
"options":
[
"-std=gnu++11",
"-isystem", "/usr/include",
"-isystem", "/usr/include/c++/*",
"-isystem", "/usr/include/c++/4.8",
"-isystem", "/usr/include/c++/4.8/*",
"-isystem", "/usr/include/boost",
"-isystem", "/usr/include/boost/**",
"-isystem", "/usr/lib/gcc/x86_64-linux-gnu/4.8/include",
"-isystem", "/usr/lib/gcc/x86_64-linux-gnu/4.8/include/*"
]
}
注釋:我的gcc版本為4.8,如果你的不是請替換對應的版本,在#include相應的頭文件後保存當前文件,在接下來的操作中將更快的提示所包含在頭文件的函數或者變數。
4. 工程實例
通過菜單欄中的Project -> Add Folder To Project...把你已有的原代碼目錄加入到Sublime Text中,然後通過Project -> Save Project As...來保存你的項目,這樣就創建好了項目。例如我的機器在/media/WinE/WorkStation/Swift中有個C++項目,代碼分別放在了Swift下的swift/base和swift/disruptor兩個目錄下,現在想要把這兩個目錄中的內容在寫代碼時能夠自動提示則需要相應的配置修改。Project -> Edit Project,在所打開的配置文件中我更改如下:
{
"folders":
[
{
"follow_symlinks": true,
"path": "/media/WinE/WorkStation/Swift"
}
],
"settings":
{
"sublimeclang_options":
[
"-I/media/WinE/WorkStation/Swift",
"-I/media/WinE/WorkStation/Swift/swift/base",
"-I/media/WinE/WorkStation/Swift/swift/disruptor",
]
}
}
綜合以上,如果你有什麼問題,請能提出,大家一起進步,希望你能愛上個傢伙。
『捌』 Disruptor 源碼分析 一個生產者和多個生產者的區別
disruptor一個生產者和多個生產者的區別
一個生產者的時候用的是SingleProcerSequencer,多個的時候用的是MultiProcerSequencer.
SingleProcerSequencer直接用cursor去判斷,應為只有一個生產者的cursor,所以是沒問題的.
public boolean isAvailable(long sequence)
{
return sequence <= cursor.get();
}
但是MultiProcerSequencer時候,每一個生產者都有cursor,disruptor採取的做法是用一個數組來存.
而且這個數組的大小和RingBuffer的大小是一樣的.因為數組的一個位置只會由一個生產者獲取,而且一個位置只能被某一圈的時候獲取.
(獲取一個位置兩次,表示一個生產者從後面追上另外一個生產者,這個是不允許的.)
這里說說他們next方法的不同:
SingleProcerSequencer,完全不同sequence來表示位置,而是用了Padding類,緩存同樣也用的是Padding類
private static class Padding
{
public long nextValue = Sequence.INITIAL_VALUE, cachedValue = Sequence.INITIAL_VALUE, p2, p3, p4, p5, p6, p7;
}
可以看到Padding的p2到p7是沒用的,只是為了湊夠64位元組.因為cpu的緩存是64位元組.這樣做是為了避免緩存失效.Sequence類也做了同樣的事情
可以看到Padding不是線程安全的,但是對於SingleProcerSequencer來說,只有一個生產者,足夠了.
MultiProcerSequencer的next方法用cursor(Sequence類)來表示位置信息.用gatingSequenceCache(Sequence類)來緩存位置信息,這是為什麼呢.
來看看Sequence類吧
public long get()
{
return UNSAFE.getLongVolatile(paddedValue, VALUE_OFFSET);
}
public void set(final long value)
{
UNSAFE.putOrderedLong(paddedValue, VALUE_OFFSET, value);
}
可以看到Sequence類是線程安全的,在MultiProcerSequencer 多個生產者的情況下必須要保障線程安全的.
但是說了這么多,感覺disruptor不可能會出現多個生產者.為什麼呢.
在RingBuffer的構造函數中只能傳入一個Sequencer對象,一個對象怎麼多個生產者.
而且Sequencer不是線程類,完全沒辦法多線程.