Scala+Scalate+GAE/Jでcheck*padのクローンを作りました

ソースコード https://github.com/bbpink/shpapad
実物 http://shpapad.appspot.com/ (勝手に使ってもいいけどどうなっても知りません!)

作った動機

  1. check*padがリニューアルしてOperaMiniでうまく動かなくなった
  2. 職場でcheck*padがブロッキングされてる
  3. クラウド環境でなんか作ってみてえ

環境選定までの道のり

check*padの代替を作ろうと思ったところまではいいのですがどうやって作るのかをまず考えました。

  • 無料だからappengineでやろう
    • javaはメンドいからやりたくない
    • pythonにする?
    • 守備力上がりそうだからScalaで
  • Scalaで手軽にappengineアプリを作るならLiftっていうフレームワークがいいらしい
    • ちょっといじってみたけど自動生成されるjavascriptファイルに日本語を入れられなくて詰んだ
  • じゃあ俺ームワークを作ろう
    • テンプレートエンジンはScalate
    • ググるとescalateという単語がひっかかって大変だけど我慢

準備

Scalaとappengineの両方の素人だったのですが、webの情報だけを頼りになんとか作業環境を整えることができました。
やんなきゃいけないことは、

です。多いですね。

まずappengineSDKをダウンロードして展開後どっかに置いておきます。1.4.0を使いました。
Scala本体はlzPackってやつをダウンロードしてバシバシやってたらインストールできました。2.8.1。
windowsで開発したのですが、環境変数にSCALA_HOMEとか設定したかもしれません。
そしてsbtも同様です。sbt.batにパスを通しました。0.7.4です。

問題はyasushiaさんの4つです

scalateのテンプレートはjspみたいに初回アクセス時コンパイルされるらしいのですが、
appengineだとファイルシステムが使えないのでコンパイルできません。
これを回避するため、テンプレートをプリコンパイルしてくれちゃうのがこの4つなのです!!!
環境変数APPENGINE_SDK_HOMEにappengineSDKのパスを設定したら、
Yasushi-scalate-cli、Yasushi-sbt-scalate-plugin、Yasushi-sbt-appengine-pluginの3つをダウンロードし、
それぞれに対して

sbt publish-local

とやるとローカルのリポジトリに入ってくれるみたいです。

最後に今回のプロジェクトテンプレートとしてhello-scalate-appengineをダウンロードし、

sbt
+update

とやるとようやく開発のための準備完了!!!

sbt clean package

でhello-scalate-appengineのコンパイルが通らなかったらなんかの手順を忘れているかもしくは間違ってるので教えてください。

実装(主にScalateの使い方)

HttpServletを継承したサーブレットクラスに

val te = new TemplateEngine
te.resourceLoader = new ServletResourceLoader(getServletContext)
val context = new ServletRenderContext(te, req, res, getServletContext)
context.render("index.ssp", Map("name"->"bbpink"))

こんな感じで書いてレンダリングしてもらいます。
レンダリング結果を文字列として欲しい時は

val out = context.capture(context.render("index.ssp", Map("name"->"bbpink")))

でおk。
テンプレート側ではrenderで渡したMapを使うことができますが、

<%@ val name:String %>

みたいにして渡した変数を宣言しないと使えなくてメンドいです。(Mapのキーと変数名が一致していないとダメ!!)
テンプレート内で他テンプレートを呼び出す時もおんなじで、

<% render("header.ssp", Map("name" -> name)) %>

という感じでScalaのまんまっぽく書きます。
あとはScalateのドキュメントを読みまくれば大丈夫やれるできる!
http://scalate.fusesource.org/documentation/user-guide.html

あと難しかったのはデータストアです

appengine初心者は概念をつかむためにLowlevelAPIを使ったほうがいいらしかったので使ってみました。
無限にでかいExcelの表をvlookupしてることをイメージしたらなんとなくわかってきましたね。
初学者は無駄なプライドを捨て3000円をケチらずSlim3の本を読むのが絶対いいです。
オープンソース徹底活用 Slim3 on Google App Engine for Java

今後の課題

  • Scalaっぽく書けるようになりたい!(Liftとかのソースを見てみたら面白いかも)
  • 実はまだタスクの表示順を変えられません
    • ユーザ定義順に表示するには1つのエンティティを更新したら他も全部更新しなきゃいけないしどうしたらいいの?
    • なんかイカしたデータ構造とかで回避できたりしないかな?

感想

英語のドキュメントばっかりで難儀しましたがすごく楽しかったです!
Scalaの勉強会にもそのうち行ってみよう。