Play が良さそう 18:37

Posted at 2010/09/12 18:37, Modified at 2010/09/14 03:56

Scala むけの Web アプリケーションフレームワークで、Foursquare でも使われているという Lift だけど、いまひとつぐっとこない。ほかの選択肢を探していたら Play というフレームワークが良さそうだった。

ステートレス、変更即反映、Servlet じゃない

Play は Java むけのフレームワークだ。ただ、Java で一般的なやりかたにはあんまりそっていない。ファイルのおきかたは Rails 風だし、雛形をつくるのは Maven じゃないし、パッケージ名は短く「play」だ。そしてなにより、Servlet をつかっていない。

開発者の Guillaume Bort は自身のブログの Why there is no servlets in Play という記事で

  • Play はステートレスだ。
  • ステートレスなおかげで、リロードするだけでコードの変更を反映する、ということができる。
  • そもそも Web 自体もステートレスで、それが色々な利点をもたらしている。
  • Servlet でステートレスもできる。ただ Servlet の利点である既存の Servlet Filter とかを使おうとすると、それらがセッションを使っていたりして Play と相性が悪い。
  • さらにいうと Servlet コンテナの1リクエスト/スレッドモデルは古い。

といろいろ理由をあげ「たぶん、Java にも Rack みたいな低レベルな API が必要で、Servlet の設計はよくなかった。」とむすんでいる。

なお、war を生成して Servlet コンテナの元で走らせることも実はできる。ただ、コンテナなしのほうが The simplest and the more robust way とされている。

スクリプト言語っぽい

Java で一般的なやりかたにはそってない Play だけど、スクリプト言語で、Rails 以降のフレームワークを知っているひとからすると、わりと普通だと思う。その普通を Java に持ち込んでいるところが面白いんだけど。

ただ、Five cool things you can do with Play にある、メソッドのパラメータの仮引数名が、そのまま HTTP のクエリパラメータになる

// こういうリクエストから呼ばれる /articles/archive?date=08/01/08&page=2
public static void archive(Date date, Integer page) {
...

とか、テンプレートに変数をひきわたすとその変数名で参照できる

Article article = Article.findById(id);
User user = User.getConnected();
// テンプレート側からは "article", "user" で参照できる
render(article, user);

とかは少しびっくりするかもしれない。

ニュース

最近 Digg のインターンが社内むけのダッシュボード (チケットからトラフィック、社員の Twitter でのつぶやき、最寄のバス停情報までを壁のディスプレイに表示する、らしい) を作った、という記事 (AWACS: A Monitoring Dashboards Platform) を読んだのだけど、それは Play を使っている。Play の採用事例には知らないサイトが多いので、Digg というのはちょっと心強い。インターンのひとの社内向けソフトウェアなので、これをもって「Digg も Play を採用」というのはおおげさだろうけど。

そしてなにより Play 1.1 だ。Play を Scala から使うためのモジュール はいままでもあった。ただ Play 1.1 からはこれが一緒に配布されるようになる。Scala support いわく

The 1.1 release of play will include support for the Scala programming language.

Play 1.1 はまだベータだけど、リリースされたらなんか Scala でアプリケーションを書きたいなあと思っています。

0 comments
riddle for guest comment authorization:
Where is the capital city of Japan? ...

blog.8-p.info加藤和良 の個人的なブログで、プログラミングのはなしが多めです。