gaebar

gaebarと書いてゲイバーと読むそうです。
何をするものかというと、GoogleAppEngineで使用するBigTableの中身をバックアップするというもの。
http://takashi-matsuo.blogspot.com/2009/02/gaebar.html
http://code.google.com/intl/ja/appengine/articles/gae_backup_and_restore.html

GAE/Jで作成したBigTableもバックアップできるのかなと。

ただし、アプリはPython
しかも既存のプロジェクトのプラグインとして動作するそうです。

まずはPhtyonのプロジェクトを作成するところからです。
下記を参考にGAEで動くプロジェクトを作成。
http://itpro.nikkeibp.co.jp/article/COLUMN/20080529/305017/
はい、Hello!Worldは出せました。
http://py01.latest.yamataku-gaetest.appspot.com/

で、gaebarはDjangoというフレームワークを使ったプロジェクトじゃないと動かないということなので、Djangoについてお勉強。
GAEで動くDjangoプロジェクトは以下を参考に。
http://thomas.broxrost.com/2008/04/08/django-on-google-app-engine/
ふむふむ。動いてはいるようだ。


gaebarの作者のページを見てみると、gaebarを使う前提のスケルトンが公開されているようです。
gaebar-gaed-skeleton:
http://github.com/aral/gaebar-gaed-skeleton/tree/master
gaebar:
http://github.com/aral/gaebar/tree/master

このスケルトンとgaebarをダウンロードします。

> git clone git://github.com/aral/gaebar-gaed-skeleton.git
> cd gaebar-gaed-skeleton
> git clone git://github.com/aral/gaebar.git

settings.pyを開き、GAEBAR_LOCAL_URL,GAEBAR_SECRET_KEY,GAEBAR_SERVERSを設定します。
(GAEBAR_MODELSはまたあとで。)

とりあえずローカルで動作確認するもエラー。

ImportError: No module named _multiprocessing

下記のページを参考にdev_appserver.pyを変更。
http://d.hatena.ne.jp/tmatsuu/20090818/1250606215

再度起動するもまたエラー

Application configuration could not be read from ".\app.yaml" 

今度は下記のページを参考にすると、スケルトンに含まれているappengine_helperが古いと推測。
http://code.google.com/p/google-app-engine-django/issues/detail?id=115
下記より最新版のr86を取得し、差し替える
http://code.google.com/p/google-app-engine-django/downloads/list?can=1&q=

今度はローカルで起動OK!
デプロイすると本番でも起動OK

先ほどモデルを設定しなかったので、モデルの設定を。
ケルトンにはなにもアプリケーションが入っていないので、モデルも含まれていません。
Javaで作ったモデルをDataViewerを見ながらPythonのモデルに変更し、記述します。
まずはmodels.pyを格納するためのサブフォルダを作り、__init__.pyとmodels.pyを配置する。

> mkdir app1
> cd app1
> touch __init__.py
> touch models.py

models.pyを編集。

from google.appengine.ext import db

class CaliculateResult(db.Model):
    index = db.IntegerProperty()
    result = db.StringProperty()

こんな具合。

で、settings.pyのGAEBAR_MODELSに以下のように追加

GAEBAR_MODELS = (
      (
           'app1.models', 
           (u'CaliculateResult'),
      ),
)

これで動くようになりました。