Jarkの使い方メモ
Clojureにはleiningenという便利なツールがありますが
- 小さなスクリプト的な使い方をしたい
- テストを小まめに走らせたい
などのときにlein自体の起動(というかjvmの起動)の遅さが気になってきます。どうにかしたいと思って調べていったところ、jarkというのが便利そうだったので、使い方を調べてみることにしました。
というか本家のほうでtest/script.clj --foo "a" --bar "b"
という感じで動かせると書いてあるんですが、これだといくら頑張っても動かなかった。。。それとjark ns load XXX.cljもダメでした。なんでだろう。。。
インストール
clojureのツールだけど、ocamlで書かれているようです。ダウンロードのページから持ってくるか、自分でビルトしましょう。僕は自分でビルトしました。
ビルトの仕方はこの辺。いくつか足りないものがあったので、sudo port install ocaml-findlib
とsudo port install camlp5
付近を実行して入れておきました。できたバイナリを~/bin/jark
で保存しておきます(付いてるとは思うけど、実行権限が付いているか確認)。
起動の方法
jarkはサーバーを立ち上げておいて、あとでクライアントから接続して使うという形です。なので、まずサーバーを立ち上げましょう。
/Users/yasuhisa/Dropbox/lda_clj% jark server start
java -Xms256m -Xmx512m -cp /Users/yasuhisa/.cljr/lib/jark-0.4-SNAPSHOT-clojure-1.3.0-standalone.jar clojure.tools.jark.server 9000 &
Started JVM on port 9000
--host
や--port
などもオプションも指定できるようですが、portが被ったりして困らない限りはとりあえずディフォルトでよさそう。
パスの追加
実際に使う際にはjarファイルのパスをクラスパスに追加しないといけません。jark cp add <path>
という感じでpathに追加できるようです。以下、実際の例。
/Users/yasuhisa/Dropbox/lda_clj% jark cp add lib
Added jar lib/cdt-1.2.6.2.jar
Added jar lib/clj-http-0.2.7.jar
Added jar lib/clj-stacktrace-0.2.4.jar
Added jar lib/clojure-1.2.0.jar
Added jar lib/clojure-contrib-1.2.0.jar
Added jar lib/commons-codec-1.5.jar
Added jar lib/commons-io-2.1.jar
Added jar lib/commons-logging-1.1.1.jar
Added jar lib/commons-math-2.2.jar
Added jar lib/data.json-0.1.1.jar
Added jar lib/debug-repl-0.3.1.jar
Added jar lib/httpclient-4.1.2.jar
Added jar lib/httpcore-4.1.2.jar
Added jar lib/httpmime-4.1.2.jar
Added jar lib/jark-0.4-20120206.025450-1.jar
Added jar lib/java.classpath-0.1.0.jar
Added jar lib/server-socket-1.0.0.jar
Added jar lib/slingshot-0.9.0.jar
Added jar lib/swank-clojure-1.4.0.jar
Added jar lib/tools.namespace-0.1.0.jar
Added jar lib/tools.nrepl-0.0.5.jar
jark cp add src
とjark cp add test
も忘れずに実行しておきましょう(No jars found in directoryとか言われるけど、これやらないとうまくいかなかった)。
実際に使う
スクリプト的な使い方
実際に使うときはこんな感じで動かせるようです。
jark -e '((load-file "src/lda_clj/core.clj") "--file" "tmp.txt" "--max-iter" "10")'
jvmの起動の遅さにイライラしないでよくなるので快適。
テスト
Clojureのテストもjarkで走らせるようにしましょう。例えば、こんな感じでテストのファイルが
(ns lda_clj.test.util
(:use [lda_clj.util])
(:use [clojure.test]))
いくつかあったときに、以下のようにやるとマッチした名前空間中のテストを全部走らせてくれます。
jark -e '(use (quote clojure.test) (quote lda_clj.test.util) (run-all-tests #"lda_clj.test.*")'
正規表現で書いておかないとライブラリのテストなども走ってしまうので注意が必要です。いくつもテストファイルがある場合、一個一個書いていると面倒ですし、漏れが出てきます。leinだとlein test
で全部走ってくれますが、それ相当のを簡単にやる方法が分からなかったので、ちょっと長いけどこんな感じのを書いてみました。
/Users/yasuhisa/Dropbox/lda_clj% jark -e '
(use (quote clojure.test))
(use (quote clojure.contrib.string))
(let [my-package-name "lda_clj"]
(dorun (map (fn [file-name]
(->> file-name
(clojure.contrib.string/split #"\\.")
(first)
(str my-package-name ".test.")
(symbol)
(use)))
(.list (new java.io.File (str "test/" my-package-name "/test")))))
(run-all-tests
(->> ".test.*"
(str my-package-name)
(re-pattern))))
'
これでuseしてくれつつ、全部testが走るようになります。