Streetとあるフリープログラマの頭ん中。使ってみようシリーズです。今回のリリースはバグフィックスとのことですので、大きな機能追加はないようです。開発者MLによると、3月に1.2のリリースを予定しているという話がありました。ScalaでMemcacheを使ってみます。Play!には標準でキャッシュのためのAPIが備わっていますが、GAEモジュールを利用することでGAEのmemcacheにデータをキャッシュすることができます。Play!本体とsienaモジュールをアップデート(play-1.1.1、siena-1.4)してありますので適宜インストールもしくは読み替えをして下さい。Scalaのキャッシュ機能には次の2つの不具合があるため、現在提供されているPlay!、およびScalaモジュールでは正しく動作しません。(2011.01.29現在)ScalaモジュールのScalaCacheが、Actorを起動しようとする。GAEではThreadが利用できない(必然的にActorも利用できない)ため、エラーとなってしまう。github上では修正済みですが、まだリリースされていません。Play!起動時の初期化フローが正しくない(と思われる)ため、GAECacheを利用するよう設定されない。Java版でも同様の現象となります。修正されていませんでした。#527上記2点は、Scalaモジュール0.8を少しだけ修正することで回避できます。既存のScalaモジュールをコピーするコピー先のバージョン指定はなんでもいいですし、コピーせずにそのまま修正でも構わないです。指定したバージョンはapplication.confファイルに反映してください。scala-0.8.1scala-0.8.1/src/play/cache/ScalaCache.scalaを修正15行目をlazyにする。=>Actorを遅延評価にすることで、勝手にActorが起動するのを防いでいます。これで1点目の修正ができました。scala-0.8.1/src/play/cache/CacheDelegate.javaを修正14行目あたりにstatic初期化ブロックを作ってCacheの初期化をする。}Cacheの初期化はPlay!起動時に行われるんですが、GAECacheが設定される前に初期化されてしまうので、ここで再度初期化してあげます。初期化をここですべきかどうかはアレですが(w)、暫定的に、ということで、本対応を待ちましょう。Scalaモジュールをビルド同梱されているbuild.xmlファイルのままではビルドが成功しないので、8行目を修正します。dir="${play.path}/framework/lib">antコマンドでビルドします。-Dplay.path=${PLAY_HOME}ビルドが正常に完了したらオッケーです。application.confファイルのScalaモジュールのバージョンを新しく作成したバージョンに合わせてください。Cacheを使うキャッシュするには、play.cache.Cacheクラス(実体はplay.cache.ScalaCacheクラス)を使います。Java版で提供されている各種メソッドも利用できますが、今回はScala版特有の機能を利用しました。}これは、Option#getOrElseのような動作になります。要するに、キャッシュが存在したらそれを使い、なければ後続のブロックが処理された結果を新たにキャッシュして返す、というわけです。キャッシュのためのキーを第1引数、存続時間が第2引数となります。キャッシュ対象となるインスタンスのクラスはSerializableである(@serializableアノテーションが付いている)必要があります。Follow.scala)簡単ですね!ちなみにGAEでない場合には、サーバーのメモリ上か、Memcachedをキャッシュとして利用します。Memcachedと互換のあるプロトコルを実装しているもの(kumofsやMembaseなど)であればキャッシュ先として利用可能です。すいません、試してません。)サンプルアプリ実際にGAE上で動作しているサンプルアプリを公開しています。ログインして、Followings画面に表示される一覧をキャッシュに登録しています。保持期間は10分、もしくは新たにフォローするまで、となっています。いつになっても見た目がしょぼいのでどなたかがデザインをあててくれる事を切に願います。BackgroundsAdSenseこのブログはクリエイティブ・コモンズでライセンスされています。Typeこのブログはクリエイティブ・コモンズでライセンスされています。