先週末、僕が相方とのんびりとしているとメールが入ってきた。「アイデアがあるんだけど」とメール始まるが、僕はピンと来た。これは「やってくれ」という催促だ。僕は身を固くして続きを読み始めた。

JPAのターゲットのひとつにクラウドコンピューティング

サポートってのが入っていて,ec2とかで使うことを考えて

ました.が,よく考えるとperl-appengineってのがありますね.


ああ、ありますね。そうですね。

誰かYAPCでしゃべってくれるといいんですが〜


うは!くっ。僕は肩書きこそ「長」がつくけど、そんなに偉くないので年上&目上のこの人に「君がやりたまえよぉ」とは言えないので「隙を見つけてやってみよう」と思った。

月曜、きっとやらないとなんか言われるだろうなぁ、と思いつつも忙しくてなにもできなかった。そして今日。メールを山のようにさばき、オフィスへの来客とも話をし、僕の目の前に座っている人に申し訳ないなぁと思いつつさらに仕事を振ったあと・・・ふと、一瞬時間が空いた事に気づいた。

「今だ!」

そこでとりあえずperl-appengineのサイトに行き、すべての準備を整え始めた。素っ気ない文章だけど このGetting Startedページに書いてある手順通りにやればだいたい大丈夫なようだ。モジュール類はほとんどすでにインストール済みだったので、普段使わないモジュールだけ入れておいた。Sys::ProtectやProtobufあたりはちゃんとsvnから入れておいたほうがいい。DateTime::Calendar::Mayanは全く必要ない。

Protobufをmakeしているときに問題にぶちあたった。問題というか、大量の警告・・・ひどい。これは最近のMooseが親切になった結果、通常使う必要のない形の呼び出しをすると警告文を発するようになったからだ。これについてはバグ報告をしておいた。気になる人はlib/Protobuf/Meta/Message.pmに is => 'ro'っていうのを一カ所付け加えればいいだけだ。よくわかんない人は特に気にしないでインストールすればいい。

次の問題はpython。僕の環境はMac OS Xだ。/usr/bin/pythonでとりあえず以下のコードを実行してみた:

cd perl-appengine
perl dev_appserver.pl demos/guestbook/

そしたらHTTPSHandlerがないとかよくわかんないエラーが出た。orz

Pythonのエラーはあんまり見慣れてないので途方に暮れた僕はとりあえずGoogle先生に聞いてみる。

すると、「sudo port install python25-socket-sslしろよタコ」って言われたので、これはそうかMacPortsを使えばいいんだな?と思い、とりあえずpythonを入れ替えた:

mv /usr/bin/python /usr/bin/python.mac
ln -s /opt/local/bin/python25 /usr/bin/python

そしてportsからpython25-socket-sslをインストール。

わくわくしてまた実行してみた。同じエラーが出た・・・。orz

色々やってみたが、なんかよくわからないので、「ついでにportsのpythonもアップグレードしてみようか」という安易な考えでsudo port install python25ってしたら、なぜかtclとかtkとか入れ始めたので、wassrで毒づいた。

そろそろインストール終わるか、と思ったら「すでにactiveなpython25があるからactivateできねぇよ、タコ」って言われたので、deactivateしてから今度こそ新しいのをactivate。
そしてついに実行・・・動いた!Pythonに関してはMacPortsでは新しいpython25とpython25-socket-sslがあればよいみたい。

今度こそ、と思ってhttp://localhost:9000/ にアクセスしたら、「Class::C3::XSはロードできねぇよ、タコ」って言われた。ドキュメントには確かに書いてあったね、うん。でもSys::Protectなんて結局なんちゃってセキュリティのくせに、なにやってんだよ、ちきしょう。

Class::C3::XSを消すのは面倒くさいので、local::libで使ってるディレクトリの中からClass::C3を探して、require Class::C3::XSしてる部分を

eval "die 'Cannot locate shit'; require Class::C3::XS";

に変更した。重要なのは"locate"の文字列を入れることだよ!

これでようやく完成。guestbookアプリが無事に動いた。

その後、ちょこちょこと試してみたが、とりあえずXS系のモジュールは全部駄目くさい。

TemplateもデフォルトでTemplate::Stash::XSを使うようになっている場合は、以下のように明示的にStashを指定しないと静かにundefを返す:

use Template;
use Template::Stash;

my $t = Template->new( STASH => Template::Stash->new() );

でもそれ以外はわりとまんま。app.yamlにURL→ハンドラスクリプトのマッピングを書いて、HTML出力とかすればいいんですね。わかります。

ってことで、なんかPerl AppEngineでも色々書けそうな予感、という報告でした。