渋谷行き

FirefoxのScrapBook拡張を使ってGoogle App Engineのドキュメントをローカルにスクラップしたので渋谷行きの電車で読んでいる。

Expandoは便利だな。事前の宣言なしに代入するだけで新しいカラムが出来てデータベースにきちんと保存される。ただ、listは代入できないみたい。

今気づいたんだが、各オブジェクトにデータベース全体でユニークなkeyが振られているということは、そのオブジェクトが住んでいるテーブルと無関係にForeignKeyを張れるということか。例えば「Gameテーブルのplayer1カラムにはHumanテーブルもしくはAIテーブルのオブジェクト(のキー)が入ります」なんて設計が可能。「それ以外のオブジェクトが入らない制約」にする機能はなさそうだけど。これが出来ると何がうれしいって、データの持ち方(実際に持っているカラム)と無関係にインターフェイスだけ同じにしておけば同じものとして振る舞えるところ。仮想のPlayerクラスが存在して、それを継承したHumanやAIのインスタンスvectorに混ぜていれるみたいなノリの設計が出来るようになる。

渋谷についた。

        • -

帰りの電車。

Using Templateの節を見ていて「Djangoそっくりだなぁ」と思ってたら

The template uses Django templating syntax to access and iterate over the values, and can refer to properties of those values.
(snip)
For more information about the Django templating engine

わはは、Djangoそのものだった。Django以外のウェブアプリフレームワークは詳しくないのでこれはすごくラッキー。

    • -

An App Engine application cannot:
(snip)
# open a socket (snip)
# (snip) A web request to an application must be handled in a single process within a few seconds. Processes that take a very long time to respond are terminated to avoid overloading the web server.

うん、ソケットははれないし、時間のかかるAIも無理だね。まぁ予想の範囲内。
数秒でレスポンスを返せないと打ち切られるってなると、AIを同じリクエスト処理中で走らせるのはアレだな。Ajaxかな。ユーザのカード選択待ち画面で、ページ中のJavaScriptがAIを叩きに行って、AIは自分の手をDBに登録した上で裏向きカード画像へのRedirectをする。時間内に終わらなくて500か何かが帰ってきたら、ランダムに手を出すAIを叩きに行く。うん、悪くなさそう。対人戦のときは他のプレイヤーがカードを出したかどうかをポーリングすればいし。

でもとりあえず今週末はプレイできるところまでやるのが目的なので一つにまとめてしまってもいいや。