Jarkの使い方メモ

# Jarkの使い方メモ
Clojureには[leiningen](https://github.com/technomancy/leiningen)という便利なツールがありますが

- 小さなスクリプト的な使い方をしたい
- テストを小まめに走らせたい

などのときにlein自体の起動(というかjvmの起動)の遅さが気になってきます。どうにかしたいと思って調べていったところ、[jark](http://icylisper.in/jark/index.html)というのが便利そうだったので、使い方を調べてみることにしました。

というか本家のほうで`test/script.clj --foo "a" --bar "b"`という感じで動かせると[書いてある](http://icylisper.in/jark/scripting.html)んですが、これだといくら頑張っても動かなかった。。。それとjark ns load XXX.cljもダメでした。なんでだろう。。。

## インストール
clojureのツールだけど、ocamlで書かれているようです。[ダウンロードのページ](http://icylisper.in/jark/downloads.html)から持ってくるか、自分でビルトしましょう。僕は自分でビルトしました。

ビルトの仕方は[この辺](http://icylisper.in/jark/build.html)。いくつか足りないものがあったので、`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が走るようになります。