「Clojure と slim3」の夏がやってくる (其の壱)

最近、ようやく AppEngine にというか、KVS の扱いに慣れてきたように思います。

RailsDjango では常に DRY であること要求されますが、その無言の圧力に従っていれば、自然とアプリ全体が見通しの良い構造になっていきます。
ある意味、考え無しでも、そこそこのモノができてしまいますので、実力が上がったように思いがちですが、実際はフレームワークの力によるもの、ということが往々にしてあります。

反面、GAE では製作者の技量が試されるような気がします。

ここは、規定時間内に処理が終了さえすれば、何も問われない世界です。だからと言って、何も考えずにアプローチしていては、この GAE というコースは攻略できません。
DRY ばかりを推し進めてもウマく行きません。さりとて、正規化を外しまくると管理が大変になってしまいます。とにかくバランスがとても大切で、この感覚を定着させるまでが一苦労でした。

「各種 API へのアクセスを可能な限り減らして、インスタンス内で高速にデータ処理する」というサイクルを、製作するアプリの性質ごとに最適化していくプロセスは、ちょっとしたパズルのようで、個人的には一番楽しい時間でもあります (ちなみに、一番キライなのはページ作りw)

ただ、先日発表になった新料金プランによって敷居が更に上がったような気がします。これからは、もっと妥協無く上記サイクルを徹底しないと利用料金を低く抑えられません (面倒になってしまって、手綱を緩めてしまうこと多々<涙>)

Rails のような FW とは異なり、AppEngine では、データとコードが相当なレベルで分離されていません。KVS からリスト構造を取得して、そのリストがコードに変化してユーザに届くような感じで、この感覚は正に Lisp であります。

そういう意味で、リストが扱いづらい Java への不満が募り始めたところでありました (ちなみに、Java の方がテスト環境の構築が容易であることを考慮すると、pytyon という選択肢は残念ながら有り得ません)

そこで、JVM 上の Lisp と言えば ClojureSlim3Clojure から操れないか、試してみました。


まずは、プロジェクトの作成から。Jenkins から扱いやすいよう maven で生成します。

$ mvn archetype:generate -DarchetypeCatalog=http://slim3.googlecode.com/svn/trunk/repository

(中略)
Define value for property 'groupId': : com.example
Define value for property 'artifactId': : CljTest
(以下略)


次に、pom.xml を修正して Clojure 関連ツールの導入準備をします。

(参考) Clojureでの開発環境 - in a Stream


次に、プロジェクトを mavenEclipse 化して Eclipse へインポートします。

$ mvn eclipse:eclipse


これで、Eclipse で編集できるようになりました。試してみたところ、Hot Reloading は有効のようです。

ただ、Eclipse の自動ビルドではコンパイルしてくれないので、手動でコンパイルする必要があります。

$ mvn compile (含む Java ファイル)
    or
$ mvn clojure:compile (Clojure ファイルのみ)

また、せっかくコンパイルした Clojure 由来のクラスファイルを消されてしまいますので、Eclipse の「Project メニュ → Build Automatically」のチェックを外しておきます。


さぁ、これで準備完了です。

手始めに maven が生成した IndexController を置き換えてみたいと思います。

まずは、src/main/java/com/example/controller/IndexController.java を削除します。

次に、src/main/clojure/com/example/controller/IndexController.clj と war/index.jsp を作成します。

IndexController.clj

(ns com.example.controller.IndexController
    (:gen-class :extends org.slim3.controller.Controller
    :exposes-methods {forward forwardSuper, requestScope requestScopeSuper}))


(defn -run
    "Docstring for -run."
    [this]

    (. this requestScopeSuper "msg", "OK?")
    (. this forwardSuper "index.jsp"))

;; 余談ではありますが、Java のソースと比べると圧到的に美しいですねぇ (主観 100%)

index.jsp

<!DOCTYPE HTML>
<html>
<body>
  <h1>Hello, World!! ${msg}</h1>
</body>
</html>


最後に、Eclipse の「Run メニュ → Run As → Web Application」を実行した後、

$ mvn clojure:compile

を実行して http://localhost:8888/ にアクセスしてみましょう。

Hello, World!! OK?

と表示されれば、成功です。


これで、コントローラーの Clojure 化を無事果たすことができました。
次は、サービスの Clojure 化に挑戦してみたいと思います。