2013年6月27日木曜日

Incanterを含むjarファイルを実行できない

project.cljは,

(defproject incanter-sample "1.0.0-SNAPSHOT"
  :description "FIXME: write description"
  :dependencies [
                 [incanter "1.5.0-SNAPSHOT"]]
  :main incanter-sample.core)

で,core.cljを

(ns incanter-sample.core
  (:gen-class))

(use '(incanter core))

(defn -main [& args]
  (do
    (def A (matrix [[1 2 3] [4 5 6] [7 8 9]]))
    (println A)
    ))

な感じに作成した.
"lein run"すれば行列が表示されるんだけど,"lein uberjar"してjarファイルを作ってから"java -jar"で実行すると,

java.lang.SecurityException: no manifiest section for signature file entry…

みたいな例外を吐く.

"lein uberjar"するときにで署名ファイルを除外するためには,project.cljに:uberjar-exclusions [#"除外したい署名ファイル.SF"]を追加すれば良い.
全部の署名ファイルを除外してしまうのが楽だけど,ファイルの名前が分からないので,

$ unzip -l 署名で怒られるjarファイル.jar | grep -i -e "\.sf"

を実行し,*.SFを探して:uberjar-exclusionsに渡す.

前のIncanterのサンプルでは以下のようなproject.cljを使えば良い.

(defproject incanter-sample "1.0.0-SNAPSHOT"
  :description "FIXME: write description"
  :dependencies [
                 ;;[org.clojure/clojure "1.4.0"]
                 [incanter "1.5.0-SNAPSHOT"]]
  :main incanter-sample.core
  ;; Same thing, but for uberjars.
  :uberjar-exclusions [#"META-INF/BCKEY.SF"]
  )

2013年5月16日木曜日

LeiningenでIncanter

 前回でも書いたが,Clojureを始めるにあたってLeiningenをインストールした.LeiningenはClojureのビルドツールで,Clojure本体はもちろんのこと,基本となるライブラリも一緒にインストールでき,leinなるコマンドでプロジェクトの作成やコンパイルなどなどを簡単に行うことができる.なんといっても,使いたいライブラリを記述するだけで以下のレポジトリからダウンロードしてパスを通してくれるのが嬉しい.

 そんな感じで簡単に使えるライブラリの中でも,Incanterは秀逸.これはRのような行列演算,統計処理ライブラリで,さしずめPythonで言うところのNumpy, Scipy, Matplotlibのようなものです.RやScipyに比べると日本語の情報は少なく,始めにくいかもしれないけど,それなりに情報は見つかる(ここは結構まとまってる).

んで,始めたんだけど,Exception in thread "main" java.lang.IllegalAccessError: abs does not existってな例外が投げられて,すごい長いトレースバックが表示される.全然原因不明で小一時間苦しんだのち,この情報を発見.

プロジェクトの名前をincanterにしてたのが原因らしい.
(注:Incanter本家にもあるように,project.cljの:dependenciesにはincanterだけ書くのが安心.:dependencies のところに書くorg.clojure/clojureとincanterのバージョンの間には依存関係があるみたいなので,それぞれに適当なバージョンを指定するとうまく動かないかも.実はこれにもかなり時間をとられた…)
結局,名前を変えたらあっさりOK.


あーあ,コーヒーが冷めちゃったよ…

2013年5月14日火曜日

Clojure始めちゃいますか

そりゃ楽しく書くならLisp系,あるいはHaskellだけど,手元にMatlabがある状況ではどうしても低きに流れてしまうわけで….PythonはNumpy,Scipy,Matplotlibのおかげで,Matlabが使える状況で「図がきれいだから使うかな~」って気にもなるけど,楽しく書けても気軽に使えない状況ではどうしてもねぇ.まあ,自分のヘボさが招いてる言い訳ですけど….

ってなところで,Clojure始めちゃいますかって話です.
何と言ってもJavaを呼び出せるんで.

始め方はここを参照しました.
難しいことは全くないですし,躓くことも無いです.
プログラミングClojure第2版」も買いました.映画にコーラみたいなもんで,こういった本は必要じゃないと思っても買ってしまいますね.あと,「Land of Lisp」も買っちゃいました.表紙がもう何とも言えず,ほぼジャケ買いです(お小遣いが…).このAlien Lisp良いですねぇ~.