ひさしぶりにwebアプリを書くことになり、既存のフレームワークを利用することにした。
Rails周辺の喧騒はなんとなく気にしていて興味はあったのだけど、rubyを最後に触ったのが5年前で、今回はより慣れているperlでいくことに。

「まるごとperl」でフレームワークの特集記事があって、Catalyst・Sledge・Jiftyが紹介されていた。Jiftyのポニーの由来とDB上のスキーマありき「ではない」ところにすごく惹かれたけど、今回はあまり七転八倒する時間的猶予がなく、web上の日本語情報が多そうなCatalyst+mod_perlに決めた。

フレームワークというのはなんだかんだでフレームワーク自身の内部的な動きも含めて理解しないと、ホントに便利にはならないものだと再認識。
特にプラグインをパイプ的にチェーンするフレームワークでは。

フレームワーク固有というよりはutf8フラグ絡みなんだけど、文字化けとの格闘を越えてやっと便利だなぁと思えるようになってきた。

apacheのアクセスログにユーザを記録する

認証といえばインフラのレイヤに任せる、という方式を好むのだけど、今回はアプリの都合もあってフレームワークとアプリで認証の面倒を見ることにした。
そうするとapacheのアクセスログにリモートユーザ(LogFormatでの%u指定)を記録するようにしていても「-(ハイフン)」で記録されてしまう。

  • 今回の環境は、apache 2.2.3、mod_perl 2.0.2、Catalyst 5.7006、perl 5.8.8、認証/セッションはAuthentication::CDBIとSession::FastMmapを使用。
  • コンテキストオブジェクトから、Apache2::RequestRecを得る。
    my $rr = $c->apache;
  • あとは、認証ユーザを設定するだけ。Root.pmのauto内で設定している。
    $rr->user( $c->req->{user} );
  • ただし、テストサーバで実行中はコンテキストオブジェクトにapacheメソッドがないので、こんな感じにした。
    $c->apache->user( $c->req->{user} ) if $c->can("apache") && $c->req->{user};
既存のアクセスログ解析ツールをそのまま使えるので都合がいい。
  • staticなリソースについてはCatalystを経由せずapacheが直接serveするようにしているので相変わらず「-(ハイフン)」だけど。