construct_url
use Apache2::RequestRec; use Apache2::URI; sub handler : method { my ($class, $r) = @_; my $url = $r->construct_url($r->unparsed_uri)); : :unparsed_uri はuriをパースしない形、例えば%20とかをスペースに変換しないでそのまま返してくれる。mp1にはパース後を返すバージョンしかなくて困ったことがある。 construct_urlを使うには
Apach2::URI
をuseしなければならない、ってのはこんなことすると調べられる。% perl -Mmod_perl2 -MModPerl::MethodLookup -e print_method construct_url To use method 'construct_url' add: use Apache2::URI ();
APR::UUID
Data::UUID
を愛用していたのだが、コンパイルできないマシンとかあるのがイマイチ。mod_perl2にはAPR::UUID
というのが付いてきた。これはべつにmod_perlの中じゃなくても使えて、
% perl -MAPR::UUID -e 'print APR::UUID->new->format,"\n"' 505fb0b7-5c0a-0410-aa9d-924b2a725eabというわけで、これからはこっちで。 こんなことしてる人もいる。 UUID用のモジュールってこんなにあったのか。
Apache2::Reload
mod_perlで開発してるとき、変更されたモジュールを自動的に再ロードしてくれるApache::Reload
ってのがある。これはmp1用で、mp2用はApache2::Reload
になっている。
新しい方には指定したディレクトリ以下だけをチェックしてくれる機能があって、
開発中のディレクトリをこれでチェックするようにしておくと、えらく楽チンな感じ。
設定はhttpd.confにこんなので。
PerlModule Apache2::Reload PerlInitHandler Apache2::Reload PerlSetVar ReloadDirectories "/Users/hogehoge/mp2" PerlSetVar ReloadDebug Onこれで
/Users/hogehoge/mp2
以下に置いてあるモジュールの更新をチェックしてくれる。
最後の ReloadDebug On
はerror_logにリロード関係のメッセージを出すための設定。Onにしておくと、こんなのが書かれる。Apache2::Reload: Checking mtime of Hello.pm Apache2::Reload: Checking mtime of Hello.pm Subroutine handler redefined at /Users/hogehoge/mp2/Hello.pm line 10. Apache2::Reload: process 3101 reloading Hello from Hello.pm
やっとmp2
というわけで予想どおり家にいる。naoyaさんによる脳にやさしい解説もでたことだし、いままで放置してきたmod_perl2お試しでもやってみっか、ってことでまずはインストールを試みる。 perl.apache.orgを見に行くとapacheは2.0系列を使えと書いてあるのだが2.2については何も書かれていない。せっかくだからapacheは最新の2.2でやってやれ、でも何も書いてないからダメかも。2.0と2.2ではapacheモジュールの互換性ないみたいだし。まあいいや、ビルド開始... ダメだ。テストコケました。んじゃapacheは2.0ってことで。
はいできた。Sandbox::Hello...
おぉ!ちゃんと動くじゃん。あたりまえか。
次Apache2::Request
。ビルドもテストもするする通って make install。apache起動...
立ち上がらない...。なんだかlibexpatのダイナミックライブラリのバージョンが混沌としているので困った、と宣うておる。あーこの手のやつはメンドイんだよなぁ。
otool -L modules/mod_apreq2.so
すると、バージョン違いのlibexpatを2種類要求している。こいつか。
昔subversion用にfinkでもってきたやつが混入してるのね。なんだかオレのマシンaprが3種類も入っちゃってるじゃん。しょーがねーなー。リンクするライブラリのパスをごにょごにょして、ビルドしなおし。あーやっとできた。やれやれ。
カミさんたち旅行
Effect.Highlightの時間をのばす
new Effect.Highlight(target, {duration: 2.0})ついでにeffectをキャンセル、というかスッパリ終了させるには、new Effect.Heilight(...)が返したオブジェクトに対して、render(1.0); cancel(); というメソッドを順番に呼んでやるとよいみたい。今のところこれで、なんとなく上手くいっている。