G君がまるごとPerl持ってたので中身をちらちら見てたら、拙作のモジュールがちょこちょこ紹介されているということを教えてくれた。言われたとたん、必死で探し始める。XangoとXML::RSS::LibXML、Text::MeCabがでてた。ちと嬉しい。
オープンソースで書くのは楽しいねぇ。
G君がまるごとPerl持ってたので中身をちらちら見てたら、拙作のモジュールがちょこちょこ紹介されているということを教えてくれた。言われたとたん、必死で探し始める。XangoとXML::RSS::LibXML、Text::MeCabがでてた。ちと嬉しい。
オープンソースで書くのは楽しいねぇ。
昨日書いたFF7のヤツ、なんか少しはまってる。最初のリフの所でバレットがガトリングガンぶっぱなしてるのが目に浮かぶぜ。
近所の自販機が全商品100円~120円で売られている。しかも4台も並んでて、結構よりどりみどり。最近こういう些細な事が嬉しかったりする。
一番ギターを弾いていた頃は6弦と5弦が大好きなメタル野郎で、しかもソロなんてどーでもいいから俺にリフを弾かせろ!派だったので速弾きはかなり苦手。そういうわけで昨日のFF7のヤツ、速いところが全然弾けん。出だしの所は超俺の好きなタイプの弾き方なんだけどなぁ。
っていうか、久しぶりにスウィーピングとか見たよ。
追記。サービスごとにsymlinkを作る事で対処する、ゴルぁ
ln -s /www/myapp.com/misc/lighttpd.conf /etc/lighttpd/myapp.conf
# /etc/lighttpd/lighttpd.conf
include "myapp.conf"
追記。リダイレクト設定が^/myapp/に行ってる場合はREQUEST_URIからその部分を削除しないといけない。
BEGIN
{
if ($ENV{CATALYST_ENGINE} eq 'FastCGI') {
use Data::Dumper;
eval <<' EOCODE';
sub prepare_request {
my $self = shift;
my %args = @_;
my $env = $args{env};
$env->{PATH_INFO} = $env->{REQUEST_URI};
$env->{PATH_INFO} =~ s{^/myapp}{};
$self->NEXT::prepare_request(%args);
}
EOCODE
}
}
まだ実装してないけど、メモ的に。現状としてApache+mod_perlが生きていて、他のサービスもバーチャルホストで走っているマシン。このApache + mod_perlもプロキシ+アプリサーバーという設定。
ここで一部のアプリサーバーをlighttpdに変えたい。
基本的にはメインのlighttpd.confを作り、そこからinclude でそれぞれのサービス設定を反映させるのがよろしいような気がする。
ってことで。基本的に http://myapp1.com/ にアクセスが来たらhttp://app:8080/myapp1/にリダイレクトして、lighttpdに渡す事にする。ということで、まずApache proxyのほうで、
<VirtualHost myapp.com:80>
...
RewriteRule ^/+(.*) http://localhost:8080/myapp/$1 [P]
# プロキシ設定
</VirtualHost>
で、lighttpdの設定はそれぞれのアプリのmiscディレクトリにlighttpd.confを作って、その後はmod_rewriteを使ってふりわける:
url.rewrite-once = (
"^/myapp/(.*)" => "/myapp.fcgi/$1"
);
fastcgi.server = (
"/myapp.fcgi/" => ( ... ),
)
これで多分できると思う。ひとつ心配なのは、includeを繰り返して上の設定を何個ものサービスからファイルを持ってきた場合fastcgi.server とかの設定が上書きじゃなくて追加されるかどうかが気になるな。これは要検証。
昨日の%ENVの問題、やっぱり他の人もぶちあたってた。奇しくも昨日同じ時間帯に同じ事で悩んでる人がCatalyst MLに投稿して、「あ、俺もそうだった!」的な人が書いた回答が以下
http://lists.rawmode.org/pipermail/catalyst/2006-June/008361.html
これだこれ。
ただその後のメールのやりとりを見ているとApache + FastCGIの設定ではもう少し工夫がいる、という報告がされている。
で、この後ちょっと色々試してみてたら、結局 ルートパスにそのままFastCGIハンドラをひもづけるとPATH_INFOが正しく設定されないってことらしい。
とりあえずデバッグ的にも問題なので、デフォルトで書いたlighttpd.confでstaticファイルはCatalystを通らないように設定。Perl互換正規表現が使えるのが嬉しい:
server.modules = (
...,
"mod_fastcgi",
"mod_rewrite"
);
...
url.rewrite-once = (
"^/((?!static).*)" => "/fastcgi.fcgi/$1"
)
fastcgi.server = (
"/fastcgi.fcgi/" => (
"MyApp" => (
....
)
)
)
で、状況把握のためにMyApp.pmでprepare_requestをオーバーライド:
BEGIN
{
if ($ENV{CATALYST_ENGINE} eq 'FastCGI') {
use Data::Dumper;
eval <<' EOCODE';
sub prepare_request {
my $self = shift;
my %args = @_;
my $env = $args{env};
print STDERR Dumper($env);
$self->NEXT::prepare_request(%args);
}
EOCODE
}
}
さて、これでhttp://myapp.com/hogeにアクセスしてログを見ると、%ENVの中身で気になるのはこの辺り:
'SCRIPT_NAME' => '/fastcgi.fcgi/hoge',
'HTTP_REFERER' => 'http://myapp.com/hoge’,
'SCRIPT_FILENAME' => '/path/to/MyApp/root/fastcgi.fcgi/hoge',
'REDIRECT_URI' => '/fastcgi.fcgi/hoge',
'REQUEST_URI' => '/hoge',
'DOCUMENT_ROOT' => '/path/to/root',
おーっと。REQUEST_URIに俺の欲しい物がそのまま入ってる!ってことで先ほどのMyAppの中に1行追加。
BEGIN
{
if ($ENV{CATALYST_ENGINE} eq 'FastCGI') {
use Data::Dumper;
eval <<' EOCODE';
sub prepare_request {
my $self = shift;
my %args = @_;
my $env = $args{env};
$env->{PATH_INFO} = $env->{REQUEST_URI};
$self->NEXT::prepare_request(%args);
}
EOCODE
}
}
今のところ、コレは俺的に結構美しい解。
夜中に結構ショックな事実を知ってしまってちょっと寝れない感じ。ふーむふーむ。まぁ、でも本人の口から聞くのが優しさなのね、と思いつつも。スコッチ飲みながらがんばってコード書いて必死に気を紛らわしたのであります。
まぁそういう時期なのかもねぇ。色んな条件が重なって、今の俺は仕事するしかねぇのか。っていうかそう思う事にしましょう。
やり方もわかったので某案件のサーバーもCatalystで書き直したいなぁ。
タグとかを使って、タグA B Cを含むけどD E Fを含まない、みたいなのをデータベースレベルで実装しようと思ったのでちょっと四苦八苦。概要としてはこんな感じでできたっぽい:
SELECT id FROM ... WHERE <A> INTERSECT
SELECT id FROM ... WHERE <B> INTERSECT
SELECT id FROM ... WHERE <C> EXCEPT
SELECT id FROM ... WHERE <D> EXCEPT
SELECT id FROM ... WHERE <E> EXCEPT
SELECT id FROM ... WHERE <F>
ただ、これって全文検索できればもっと簡単にできるよね。tag カラムに入れておいてA B C -D -E -Fみたいな感じで一発でできるわな。
仕事をすること、特にコードを書く事は俺の日常生活の一部であり、切り離す事が今の時点ではできない。自然時間さえあればいつでも仕事してる。別にだからといって遊びに行く時間が減るってことではないのだけれども家にいて他にする事なかったら調子悪いとかじゃなければ絶対仕事してる。漫画を読んでることがあったり、ゲームをしてることがあったり、その辺をプラプラ散歩してたりはあるけど、ぼーっとしてるのはほとんどない。
切り替えができないからむかつくみたいな事を言われた事もあったけど、とにかくやる事がたくさんあるんだもの。切り替えができてないなんて事ないのになぁ。別に家で15分ぼーっとしてる時間があってコードを書く気があるなら書いていいじゃん。呼ばれたらすぐ止めるし。仕事中毒とかじゃなくて、寝る事、飯を食う事、そういうことと同じくらいの普通さでコードを書く事ができるだけなんだけどなぁ。
全く普通の事なのだ。
今日はかなり体に悪い食生活。野菜食いたいよう・・・
さて、lighttpd + FastCGI + Catalystで一発簡単なサイト(全て静的なファイル・・・テンプレート使うだけ)をmod_perlベースから書き直してみたのだが、問題は今まで書いた数々のmod_perlサイトとの共存。
今まで書いてたヤツは何個も何個もvirtual hostを使って同じマシンで動かしてるのだが、これとさらにlighttpdを共存させるにはどーしたらいいもんだろうか。うーむ。とりあえずmod_perlのプロキシは残しておいて、裏のアプリケーションサーバーをlighttpdにするか・・・。
Catalyst::Engine::CGIの140行目:
my $path = $base_path . ($ENV{PATH_INFO} || $ENV{SCRIPT_NAME} || '');
これで一応直る。ただ、これは根本的にいいのかどうかわからん。
use Data::Dumper;
sub index : Local {
print STDERR Dumper(\%ENV);
}
してみると、PATH_INFOとか、いわゆるCGI変数が見当たらない。これを使ってるのがCatalyst::Engine::CGI::prepare_path()で、ここの中で
my $path = $base_path . ($ENV{PATH_INFO} || '');
してるわけだから、PATH_INFOが%ENVの中に入ってなきゃうまくうごかんわなぁ。うーん。
スタンドアロンサーバーならちゃんと動くのに、FastCGIにすると、namespace設定が全然効かなくなる。例えば
package Hoge::Controller::Root;
sub index : Local { }
は動くんだけど、
package Hoge::Controller::Foo;
sub bar : Local { }
にアクセスしようと http://localhost:3000/foo/barにアクセスすると、/indexのハンドラが動き出す。なんじゃこれ・・・
もらったのでパクパク夕飯かわり。麦茶とあうねぇ。手作りって久しぶりだなぁ。
やっと山岸風花合流、文化部編入。25Fのボスを倒すのに時間がかかりすぎたなぁ。もう、せめてパーティー全滅でリタイヤならいいんだけど主人公が死ぬとおしまいって辛いわぁ。あと、軽く攻略サイトみたら最初っからでてる岳羽ゆかりもコミュとして存在するのね。ついつい女子マネージャー重点でやってしまったよ・・・ちっ。
ふーむ、このゲームクリアできるかなぁ。
http://use.perl.org/~Matts/journal/30721
わー、勉強になるっす!あと、
http://use.perl.org/~Matts/journal/30758
IO::AIOってそういう時に使うのか・・・なるほど。AxKit2、この間こき下ろしたけどソースみるっす。id:miyagawaさんもなんか言ってた。