play2.1で個人的なものを作った

play framework 2.1で個人的な課題を解消するためのサービスを作ってみた。
github https://github.com/kencharos/yakimashi/
herokuでのサンプル http://yakimashi.herokuapp.com/

動機

家族が増えて以来写真を撮ることが多くなり、写真は自分のMacbookiPhotoで管理しているんだけど、
家族が写真を見たりするときに面倒。
またプリントしてアルバムに残したり、親戚に送ったりするので、写真の一覧を紙に印刷して、家族でこの写真は誰々に何枚みたいな作業を数か月に1回くらいやっている。
写真の一覧だと細部がわかりにくかったりするし、集計がすげえ面倒。
というわけでこれらを解消するためのものを勉強がてら作ろうというのが動機。

要望

  • 家族各自のPC,iPadから見れる。
  • 写真の一覧、詳細を確認できる。
  • 写真ごとに送る人の設定とかができる。
  • 基本的に家族でしか使わないからユーザー管理とかしない。

構成要素

勉強のため自分の仕事であんまり触ってないものを中心にやってみた。

  • play framework2.1 + scala
  • mongoDB (playとの接続はplay-salatプラグインが超便利)
  • metadata extractor (JPGのEXIF取得javaライブラリ)
  • jquery + colorbox
  • LESS
  • css3
  • github
  • heroku

メモ、忘備録

作っていてはまったことやこれはすげえと思ったことなど。

  • 雑感として,playだとコード量がとても少ない(多分javascriptの方が多い。)。とはいえ学習コストは他のフレームワーク同様高いと感じた。
  • 色々な方式をscalaの文法や関数でなるべく対処しようとしているんだと思うんだけど、おまじないとしか思えない記述が多すぎて色々戸惑う。(下のformの宣言とか、formの検証とか最初はよくわからなかった)
  • playでformとcaseクラス、JSONとcaseクラスの変換を宣言的に記述できて面白い。

また、上記で特定の項目だけcaseクラスに設定したくないとか単純にマッピングできない場合にも対応できていて○

  • play、サーバー起動中の修正が再起動なしで反映されて楽。
  • ただし、コンパイルが微妙に遅く、viewとかrouteもコンパイルされるので、画面をちょっと直して5,6秒待つみたいなケースがある。
  • view templateは@に続く箇所にscalaコードを記述できるので色々できるんだけど慣れるまで微妙。
  • viewで使用するデータは、viewで宣言した引数のみで、JSPみたいな暗黙なリクエストとかセッションみたいなものは(宣言しない限り)出てこない。

viewの描画が関数の呼び出しになっているので、viewで色々できる危険性が減っている、、のかな。

  • Actionを合成することで、Action前後のログ出力とか、ログイン判定とかができる。
  • mongoDBが便利すぎて笑える。1対多のデータをそのままコレクションに突っ込めるとか。
  • play-salatも超便利。case classのコンパニオンに特定のクラスを継承するだけで、CRUD諸々の機能が追加される。
  • heroku でmongoHQを使う場合、herokuの環境変数(heroku configで確認)に、MONGOHQ_URLというmonngoDBのurlが設定されるのでこの値を設定する。設定するには、Procfileを作成し以下の形式でconf/application.confのプロパティを上書きする。
  • -Dmongodb.default.uri="$MONGOHQ_URL"