D-7 <altijd in beweging>

Day to day life of a Perl/Go/C/C++/whatever hacker. May include anything from tech, food, and family.

2006年08月


G君がまるごとPerl持ってたので中身をちらちら見てたら、拙作のモジュールがちょこちょこ紹介されているということを教えてくれた。言われたとたん、必死で探し始める。XangoとXML::RSS::LibXML、Text::MeCabがでてた。ちと嬉しい。


オープンソースで書くのは楽しいねぇ。



    このエントリーをはてなブックマークに追加 mixiチェック


昨日書いたFF7のヤツ、なんか少しはまってる。最初のリフの所でバレットがガトリングガンぶっぱなしてるのが目に浮かぶぜ。



    このエントリーをはてなブックマークに追加 mixiチェック


近所の自販機が全商品100円~120円で売られている。しかも4台も並んでて、結構よりどりみどり。最近こういう些細な事が嬉しかったりする。



    このエントリーをはてなブックマークに追加 mixiチェック


一番ギターを弾いていた頃は6弦と5弦が大好きなメタル野郎で、しかもソロなんてどーでもいいから俺にリフを弾かせろ!派だったので速弾きはかなり苦手。そういうわけで昨日のFF7のヤツ、速いところが全然弾けん。出だしの所は超俺の好きなタイプの弾き方なんだけどなぁ。


っていうか、久しぶりにスウィーピングとか見たよ。



    このエントリーをはてなブックマークに追加 mixiチェック


今度から日常カテゴリは常に開発の上に持ってくる事にした。



http://www.youtube.com/watch?v=PxtOlFo-1hE



勉強になります!小指でチョークは俺できねぇや・・・



    このエントリーをはてなブックマークに追加 mixiチェック



  • includeは相対パスを要求する。/etc/lighttpd/lighttpd.confがメインの設定ファイルだとしたら、/etc/lighttpd/app.confとかにファイルを置いて、include "app.conf"としないと動かない。


追記。サービスごとにsymlinkを作る事で対処する、ゴルぁ



ln -s /www/myapp.com/misc/lighttpd.conf /etc/lighttpd/myapp.conf

# /etc/lighttpd/lighttpd.conf
include "myapp.conf"


  • 前のエントリで書いたフィックスは、lighttpdの前にプロキシがあると動かない。動かない。動かない!


追記。リダイレクト設定が^/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
}
}


    このエントリーをはてなブックマークに追加 mixiチェック


まだ実装してないけど、メモ的に。現状として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 とかの設定が上書きじゃなくて追加されるかどうかが気になるな。これは要検証。



    このエントリーをはてなブックマークに追加 mixiチェック


昨日の%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
}
}

今のところ、コレは俺的に結構美しい解。



    このエントリーをはてなブックマークに追加 mixiチェック


夜中に結構ショックな事実を知ってしまってちょっと寝れない感じ。ふーむふーむ。まぁ、でも本人の口から聞くのが優しさなのね、と思いつつも。スコッチ飲みながらがんばってコード書いて必死に気を紛らわしたのであります。


まぁそういう時期なのかもねぇ。色んな条件が重なって、今の俺は仕事するしかねぇのか。っていうかそう思う事にしましょう。


やり方もわかったので某案件のサーバーもCatalystで書き直したいなぁ。



    このエントリーをはてなブックマークに追加 mixiチェック



http://www.youtube.com/watch?v=GOE4H_zpco0



こっちなら少しひける!



    このエントリーをはてなブックマークに追加 mixiチェック


タグとかを使って、タグ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みたいな感じで一発でできるわな。



    このエントリーをはてなブックマークに追加 mixiチェック


仕事をすること、特にコードを書く事は俺の日常生活の一部であり、切り離す事が今の時点ではできない。自然時間さえあればいつでも仕事してる。別にだからといって遊びに行く時間が減るってことではないのだけれども家にいて他にする事なかったら調子悪いとかじゃなければ絶対仕事してる。漫画を読んでることがあったり、ゲームをしてることがあったり、その辺をプラプラ散歩してたりはあるけど、ぼーっとしてるのはほとんどない。


切り替えができないからむかつくみたいな事を言われた事もあったけど、とにかくやる事がたくさんあるんだもの。切り替えができてないなんて事ないのになぁ。別に家で15分ぼーっとしてる時間があってコードを書く気があるなら書いていいじゃん。呼ばれたらすぐ止めるし。仕事中毒とかじゃなくて、寝る事、飯を食う事、そういうことと同じくらいの普通さでコードを書く事ができるだけなんだけどなぁ。


全く普通の事なのだ。



    このエントリーをはてなブックマークに追加 mixiチェック


今日はかなり体に悪い食生活。野菜食いたいよう・・・



    このエントリーをはてなブックマークに追加 mixiチェック


さて、lighttpd + FastCGI + Catalystで一発簡単なサイト(全て静的なファイル・・・テンプレート使うだけ)をmod_perlベースから書き直してみたのだが、問題は今まで書いた数々のmod_perlサイトとの共存。


今まで書いてたヤツは何個も何個もvirtual hostを使って同じマシンで動かしてるのだが、これとさらにlighttpdを共存させるにはどーしたらいいもんだろうか。うーむ。とりあえずmod_perlのプロキシは残しておいて、裏のアプリケーションサーバーをlighttpdにするか・・・。



    このエントリーをはてなブックマークに追加 mixiチェック


Catalyst::Engine::CGIの140行目:



my $path = $base_path . ($ENV{PATH_INFO} || $ENV{SCRIPT_NAME} || '');

これで一応直る。ただ、これは根本的にいいのかどうかわからん。



    このエントリーをはてなブックマークに追加 mixiチェック



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の中に入ってなきゃうまくうごかんわなぁ。うーん。



    このエントリーをはてなブックマークに追加 mixiチェック


スタンドアロンサーバーならちゃんと動くのに、FastCGIにすると、namespace設定が全然効かなくなる。例えば



package Hoge::Controller::Root;
sub index : Local { }

は動くんだけど、



package Hoge::Controller::Foo;
sub bar : Local { }

にアクセスしようと http://localhost:3000/foo/barにアクセスすると、/indexのハンドラが動き出す。なんじゃこれ・・・



    このエントリーをはてなブックマークに追加 mixiチェック


もらったのでパクパク夕飯かわり。麦茶とあうねぇ。手作りって久しぶりだなぁ。



    このエントリーをはてなブックマークに追加 mixiチェック


やっと山岸風花合流、文化部編入。25Fのボスを倒すのに時間がかかりすぎたなぁ。もう、せめてパーティー全滅でリタイヤならいいんだけど主人公が死ぬとおしまいって辛いわぁ。あと、軽く攻略サイトみたら最初っからでてる岳羽ゆかりもコミュとして存在するのね。ついつい女子マネージャー重点でやってしまったよ・・・ちっ。


ふーむ、このゲームクリアできるかなぁ。



    このエントリーをはてなブックマークに追加 mixiチェック



http://use.perl.org/~Matts/journal/30721



わー、勉強になるっす!あと、



http://use.perl.org/~Matts/journal/30758



IO::AIOってそういう時に使うのか・・・なるほど。AxKit2、この間こき下ろしたけどソースみるっす。id:miyagawaさんもなんか言ってた。



    このエントリーをはてなブックマークに追加 mixiチェック

このページのトップヘ