SICP 問題4.67 ループ検出器の実装 on GAE

 2月14日の日記で書いた、「質問システム on GAE」へのループ検出器の組み込みを行いました。

 まいったのは、2月14日の時点では実装に問題があったこと。

 ”(married Mickey ?who)”が止まるのは確かですが、これ(問題4.57の答え)まで停止してしまうのです。

(and (replace ?x ?y)
     (salary ?x ?salx)
     (salary ?y ?saly)
     (lisp-value < ?salx ?saly))

 対策としては、変数を含まないクエリをループ検出対象外とすることでこのクエリも再び動くようになりました。

 他にも修正を加えているのですが、そんな中で今回勉強になったのは、”BeakerをGAEで使う方法”。

 ただ、パッケージをコピーするだけではImport Errorになってしまうのです。

 回避方法を備忘をかねてここに書いておきます。ちなみにこの時の環境はApp Engine SDK 1.3.1とBeaker 1.5.1です。

  1. Beakerをダウンロードし、tar-ballの中にある”beaker”ディレクトリをGAEのアプリケーションのディレクトリにコピー
  2. pkg_resources.py*1をコピーする。
  3. こんな感じで有効化
from beaker.middleware import SessionMiddleware
# (中略)
application = webapp.WSGIApplication([('/', MainPage),
                                      ('/dumpData01', DumpDataPage01)],
                                     debug=True)
session_opts = {
    'session.type': 'ext:google',
    'session.cookie_expires': True,
    'session.timeout': 300,
}
application = SessionMiddleware(application, session_opts)

 ってことで、試してみたい人はこちらへどうぞ〜!

 http://torilon-querysystem.appspot.com/

*1:Debian lenny環境であれば、/usr/share/pysharedの下にある