Java构建工具, ZeroC ICE, word2vec
https://antkillerfarm.github.io/
Java構建工具
構建工具的意義在于,提供一種獨立于IDE的軟件構建方式。而且通常來說,構建工具更適合特大項目的構建。比如,即使是以功能強大著稱的Visual Studio,也提供nmake用以處理特大項目。
常用的Java構建工具主要有:Ant、Maven、Gradle。
Ant
Ant作為最早的Java構建工具,使用最為廣泛,一經使用即取代了之前的IDE工程文件。
PS:那個時代最著名的Java IDE估計要算Borland的JBuilder了。
Ant使用XML語言格式的配置文件,并可結合Ivy用以處理網絡式的依賴管理。
Ant入門教程:
http://ant.apache.org/manual/tutorial-HelloWorldWithAnt.html
從設計思想來看,Ant非常類似make。除了建立依賴關系樹之外,其他方面完全不限制編寫者的發揮。因此,Ant的自由度很高,但缺點就是編寫難度和make也類似。
代碼示例:
https://github.com/antkillerfarm/antkillerfarm_crazy/tree/master/java_build/ant
Maven
Maven仍舊使用XML作為配置文件格式,但使用內置規則簡化腳本的編寫。其配置文件一般叫做pom.xml。
Maven最大的優點是,具備從網絡上自動下載依賴的能力。比如,最常用的maven repository:
https://repository.apache.org/
http://ebr.springsource.com/repository/app/
本地maven repository通常在~/.m2/repository/下,某些直接下載失敗的包,可手動安裝到該路徑下。
Maven入門教程:
http://www.oracle.com/technetwork/cn/community/java/apache-maven-getting-started-1-406235-zhs.html
Maven的缺點是規則的力量過于強大,對于規則覆蓋不了的情況,很難處理。但好在多數項目并沒有那么復雜的情況。
針對規則的復雜,Maven提出了模板的概念,用以簡化操作。命令是:
mvn archetype:generate
可選的模板參見:
https://maven.apache.org/guides/introduction/introduction-to-archetypes.html
代碼示例:
https://github.com/antkillerfarm/antkillerfarm_crazy/tree/master/java_build/maven
常用maven命令
| mvn compile | 編譯代碼 |
| mvn package | 打包操作 |
| mvn exec:java | 執行程序 |
| mvn exec:exec | 執行程序 |
| mvn clean | 清理程序 |
使用mvn exec:java,還是mvn exec:exec,一般根據pom.xml中定義的目標來確定,后者的語法更靈活,功能也更強。
插件和依賴模塊的版本控制
Maven允許同一個軟件包的不同版本安裝在同一臺PC上。比如程序A可以使用spring v3.1,而程序B可以使用spring v3.2。
它的實現方式是:同一個軟件包的不同版本,放在不同的路徑下。
插件和依賴模塊一般使用version標簽定義所使用的版本。版本標簽在大多數示例中一般是固定值,這樣可以確保部署的一致性。
然而對于一些簡單的demo,特別是比較老的demo來說,老舊的版本標簽意味著,需要從repo中下載老的庫,速度慢且占用空間大。
因此,在開發用的機器上,通常需要將同一類應用的各個插件和依賴模塊配置為同一版本,以節省空間。
插件和依賴模塊的版本號,可用以下網站查詢:
https://mvnrepository.com/
此外,還可以用range dependency機制,直接使用最新版本。示例如下:
<version>[2.40.0,)</version>
這里的[2.40.0,)表示取2.40.0以上最新版本。注意只有依賴模塊可以使用這種語法,插件是不行的。
更換mirror
Maven的官方軟件倉庫URL為:
http://repo.maven.apache.org/maven2
然而這個網址有的時候會比較慢,這時就需要更換更快的mirror。其方法為:
修改${user.home}/.m2/settings.xml。
注意這個配置文件只對該repo生效,如果想全局有效的話,可修改/etc/maven/settings.xml。
<mirrors><mirror><id>UK</id><name>UK Central</name><url>http://uk.maven.org/maven2</url><mirrorOf>central</mirrorOf></mirror> </mirrors>其他mirror有:
http://uk.maven.org/maven2
http://repo.maven.org/maven2/
http://repo1.maven.org/maven2/
http://repo2.maven.org/maven2/
http://maven.aliyun.com/nexus/content/groups/public
阿里云的mirror大概是2016年7、8月份推出的,速度非常快。
本來國內的OSChina有一個Maven mirror。但現在已經不可用了。
http://jcenter.bintray.com
jcenter是JFrog的產品,后者專注于maven部署,因此該網站擁有的jar最全且新,速度也不慢。
Eclipse工程轉為Maven工程
選擇項目,右鍵點擊->Configure->Convert to Maven Project
Maven引用本地jar
大多數情況下,Maven并不需要處理jar的引用問題,項目所需的jar以及相應的依賴,會自動從中心軟件倉庫中下載至本地。
那么對于中心軟件倉庫中沒有的jar,Maven是怎么處理的呢?
這里主要有3種方法:
1.將jar包安裝到本地repository中。
mvn install:install-file -Dfile=my-jar.jar -DgroupId=org.richard -DartifactId=my-jar -Dversion=1.0 -Dpackaging=jar
這種方法的好處是安裝之后的操作,和外部jar相同。但缺點是:部署的時候,每臺機器都要安裝一次。
2.使用system scope。
<dependencies><dependency><groupId>org.richard</groupId><artifactId>my-jar</artifactId><version>1.0</version><scope>system</scope><systemPath>${project.basedir}/lib/my-jar.jar</systemPath></dependency></dependencies>這種方法下,jar可以和代碼放在同一個文件夾下,以便分發。然而這種做法不是官方推薦的做法,在執行時,需要自己處理classpath的問題。
這里吐槽一下Java。Java的classpath選項中,如果指定的jar不止一個,那么兩個jar之間需用符號分隔。這個分隔符在Windows上是;,而在Linux上是:。居然連這一點都沒統一,實在無語。
uber-jar
uber在德語中,表示above或over。uber-jar實際上就是將程序的依賴也打包,而生成的jar。例如maven中,可用:
mvn uberjar
生成uber-jar。
此外,maven shade plugin和dependency-reduced-pom.xml實際上也與uber-jar有關。
搭建Maven私服
Artifactory可用于搭建團隊內部的Maven私服。官網:
https://www.jfrog.com/open-source/
正常運行項目的maven命令,向artifactory索求jar。如果artifactory已經下載了就會直接返回給你,還沒有的就會去那幾個repo官方站下載。
參考:
http://blog.csdn.net/calvinxiu/article/details/1713323
Gradle
XML作為配置文件格式,主要有兩個缺點:
1.各種標記占用的空間較大,不簡潔。有用的信息淹沒在各種標記中,反而降低了配置文件的可讀性。
2.XML本身的樹狀結構,對于條件編譯(例如if分支)的情況,沒有什么好的語法組織形式。
針對以上問題,Gradle使用Groovy語言作為配置文件格式。它自2012年誕生以來,獲得了快速普及,尤其是Google采用Gradle作為Android應用的默認構建工具。
Gradle的設計思想已經脫離了make的范疇。make腳本也好,XML也好,都不是通用程序語言,無論設置再多的規則,也總有滿足不了需求的時候。因此,Gradle使用Groovy這種通用程序語言來提供靈活性,同時使用plugin,尤其是官方提供的plugin,來設定規則。就好比是C語言+標準庫,這樣的組合夠強吧。
premake實際上也是類似的設計思路。
代碼示例:
https://github.com/antkillerfarm/antkillerfarm_crazy/tree/master/java_build/gradle
官網:
https://gradle.org/
教程:
https://spring.io/guides/gs/gradle/
Gradle Wrapper
Gradle Wrapper能夠讓你的工程在沒有安裝Gradle的機器上編譯。
1.使用gradle wrapper命令生成gradlew命令。
2../gradlew run
類似的,maven也有一個Wrapper,有些工程里的mvnw或mvnw.cmd,就是這個Wrapper的文件。
ZeroC ICE
我在研究生時代,研究過CORBA、EJB、COM這樣的中間件技術。然而工作以后,再沒有機會使用。平時偶爾關注,也只是曉得CORBA從來沒有流行過,EJB在Struts、Hibernate、Spring等框架的圍攻下,用者寥寥。直到最近,因為項目需要接觸到ZeroC的ICE框架。
ICE框架的官網地址:
https://zeroc.com/downloads/ice
安裝:
wget https://zeroc.com/download/GPG-KEY-zeroc-release sudo apt-key add GPG-KEY-zeroc-release sudo apt-add-repository "deb http://zeroc.com/download/apt/ubuntu16.04 stable main" sudo apt-get update sudo apt-get install zeroc-ice-all-runtime zeroc-ice-all-dev sudo apt-get install libssl-dev pip install zeroc-ice多語言demo:
https://github.com/zeroc-ice/ice-demos
注意demo的master分支是開發分支,好多代碼都是有問題的,請切換到正在使用版本的分支,例如:
git checkout 3.6
Hprose
Hprose是ZeroC ICE的一個競爭者,由國內某高手打造,支持的語言超過20種,堪稱最全。不過貌似沒什么大公司用啊。。。
其標榜的無需生成樁代碼的優點,相比ZeroC ICE的老版本來說,的確是個進步。但目前的ZeroC ICE 3.6版本,也同樣提供了類似的功能。這或者也是Hprose一直火不起來的原因。
官網:
http://hprose.com/
Github:
https://github.com/hprose
word2vec
word2vec是Google于2013年開源推出的一個用于獲取word vector的工具包。作者是Tomas Mikolov。
Github:
https://github.com/tmikolov/word2vec
注:Tomas Mikolov,捷克布爾諾科技大學博士。先后在Google、Facebook擔任研究員。
word2vec包中還有一個word2phrase的程序,這個程序可以根據統計信息由單詞生成短語。考慮到中文的字和詞之間的關系,實際上也可以用它來進行無先驗數據的分詞。
注:NLP中的先驗數據,最出名的當屬分詞詞典。除此之外,還包括HMM的轉移矩陣表等。
其一般方法為:
1.對原始語料按字切分,以空格分隔,相當于認為一個字就是一個詞,即單字成詞。
2.使用word2phrase**組字成詞**。
time ./word2phrase -train 1.txt -output 2.txt -threshold 100 -debug 2
3.由于word2phrase最多只考慮到2-gram。因此,對于超過3個字以上的詞語,需要迭代執行word2phrase。
我以金庸的小說為語料進行測試。從結果來看,這種方法對于人名、地名、武功招式名等專有名詞,分詞效果較好。但對于具有語法結構的句子,分詞效果較差。比如“那人”其實是兩個單字詞,但卻被word2phrase認為是一個雙字詞。
./word2vec -train resultbig.txt -output vectors.bin -cbow 0 -size 200 -window 5 -negative 0 -hs 1 -sample 1e-3 -threads 12 -binary 1
./distance vectors.bin
訓練之后的結果文件中,保存著每個詞的向量??蓪inary選項設為0,來查看相應結果的明文。
明文和二進制數據之間的轉換可使用gensim工具,參見:
https://github.com/antkillerfarm/antkillerfarm_crazy/blob/master/python/ml/nlp/hello_gensim.py
參考:
http://wei-li.cnblogs.com/p/word2vec.html
文本深度表示模型Word2Vec
http://www.cnblogs.com/wowarsenal/p/3293586.html
用中文把玩Google開源的Deep-Learning項目word2vec
http://www.jianshu.com/p/05800a28c5e4
使用word2vec訓練wiki中英文語料庫
總結
以上是生活随笔為你收集整理的Java构建工具, ZeroC ICE, word2vec的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 云计算论文集, Spark, 数据描述语
- 下一篇: 网络杂谈, Docker, MongoD