log4j for Perl。Perl 用ロギングフレームワーク。
Log::Log4perl::Appender::Synchronized を使う (Log4perl 0.39 より)。
WiKicker / DiKicker の Log::Log4perl 対応作業。
ということで、warn -> Apache のエラーログに流れている警告メッセージも、Log::Log4perl の方に流して、好きに消せるようにしておくことにする。
SpeedyCGI 下で動かす事を想定して初期化は、init_once で行うようにする。 可能な限り早く初期化すべきなので、設定ファイル名/設定文字列はプロパティファイルに記述しておくのではなく、CGI プログラムで最初に生成する Controller オブジェクトの初期化パラメータで指定するように。
$SIG{__WARN__}を設定して、warn のメッセージを Log::Log4perl に送る。 最初はほぼ FAQ の例のまま、以下のように記述。
use Log::Log4perl qw(:easy); BEGIN { $::SIG{__WARN__} = sub { local $Log::Log4perl::caller_depth = $Log::Log4perl::caller_depth + 1; WARN(@_); }; }
しかし期待していた通りに動かず悩む。原因は前述する init_once との絡み。 use Log::Log4perl qw(:easy) した時点でデフォルトの初期化が行われてしまうため、初期化済みになってしまって init_once での設定処理がスキップされていたのが問題。
use Log::Log4perl; BEGIN { $::SIG{__WARN__} = sub { local $Log::Log4perl::caller_depth = $Log::Log4perl::caller_depth + 1; if (Log::Log4perl->initialized) { Log::Log4perl->get_logger->warn(@_); } }; }
と修正。 get_logger も暗黙的に初期化を行うので、init_once する前に warn されるとやはりデフォルトの初期化がおこってしまう。 それではまずいので initialized が真(=初期化済み)の時のみロギングするようにする。 ただしこれだと init_once する前の warn メッセージが失なわれる(STDERR あたりに print するようにすればいいかもしれない)。
CGI::Carp も $SIG{__WARN__} を上書きするので同時に使えない。 以前に use していたのが残っていてはまる。
NaneyOrgWiki、nDiki でロギングしはじめたところ、CGI プログラムの処理はきちんと成功しているもののその後(?) speedy_backend が core dump してしまう事があるようだ。 最初は $::SIG{__WARN__} の設定あたりに問題があるのかと思ったが、Log::Log4perl::Appender::Synchronized を使わないようにしたところ core を吐かなくなった。
IPC::Shareable、IPC::Semaphoreなんて使っているしやっぱりこれが怪しい。 とりあえず外しておくことにする。
しかし何らかの方法でシンクロしておかないとログファイルが壊れるはずだから、本当はどうにかしなければならないな。 もっと簡単に flock とかで排他制御する Appender とか無いのかな。 自分で書くしかない?
朝、Naney's Diary をチェックしたらエラーが出てしまっている。 昨日 WiKicker をアップデートした事による影響か。
チェックしたところ、ハイパー日記システムではライブラリに HTTP というパッケージがありその中で Request サブルーチンが定義されていた。 これが HTTP::Request モジュールと被っており、今回 WiKicker の更新で間接的に使用されることになった Log::Log4perl の中での new HTTP::Request と衝突する事に。
名前空間大事。
hns の方の HTTP::Request サブルーチンはそのパッケージ内でしか呼ばれていないようなので、HTTP::RequestSub と名前を変更して対処。
改良とういか実装。 DiKicker の Term DB (記事のインデックスファイル)はまだ不完全で、記事・単語の削除機能が一部未実装のところがある。 まとまった時間がとれたので、がりがりコードを書く。
Devel::Coverを使って、テストケースで各コードが使われているかを確認。 Perl だとメソッド名の typo など実際に実行されるまで気がつかないバグがあるので、コードを通過しているかどうかだけでもチェックできると結構便利。
WiKicker の部分とあわせて、Log::Log4perl によるロギングも随時整理。
昨日 Linux 上で実験してみた PAR を Windows にも入れてみる。 PDLを使っている関係で ActivePerl は 5.6.1。
ppm install で入るパッケージは古いので、最新のものを入れておく。 ちょっと手間。
ワンライナーを pp できるところまで動作確認。
ExtUtils::Makemakerを使ってパッケージ化している開発中のモジュール(スクリプトあり、XS あり)を実行可能形式化してみる。
perl Makefile.PL nmake nmake test cd blib set PERL5LIB=lib;arch (pp の -I オプションが効かなかったので) pp -o foo.exe -a lib -a arch -M ... -c script/foo
Log::Log4perl::Appender::Screen、Jcode::Unicode::NoXS、Unicode::String、GD については依存関係を自動検出できなかったので、それぞれ -M で指定。
できた。動いた。素晴しい。 PDL や GD を使っていたのでちょっと不安だったのだがうまく動いて感激。 これでCD-ROMとか USB メモリに入れておいて一発実行とかできる。
WiKicker の Windows 上での動作確認の続き。 WiKicker のPPM パッケージを作成して ActivePerl 5.8.6.811 上にインストール。 依存するモジュールで、ActivePerl に入っていないものは以下の通り。
既に手元で PPM パッケージ化済みなので、これもインストールしておく。
後は RCS をパスの通っているディレクトリに入れてタイムゾーンを設定。
TZ=JST-9
で CGI プログラムとして実行。 お、表示できた。 書き込みはと。
エラー。
予想していたけれど、sendmail に依存していたところ。 sendmail が見つからない場合はメールの送信をスキップするように修正。
これでうまく動くかなと思ったら、日本語名のページを作るとうまく表示できない問題を発見。
WiKicker では UTF-8 文字列をURIエスケープして WikiPage のURLを生成している。 このURIにアクセスされると WiKicker は、PATH_INFO から WikiName を取り出す。 この文字列がシフト JIS になってしまっている。
Windows がファイル名に使用する charset にあわせて、Apache が変換してしまっているようだ。 調べてみると他の WikiEngine でも同様の問題にあっているという記事が見つかった。
将来の 2.0 系でパッチが取り込まれて修正されるとか、そうでないとか。
現状どうするかなぁ。 WiKicker 側でシフト JIS から UTF-8 に戻すというのもできない事はないけれど、あまりやりたくはないな。 いったんシフト JIS を介しているという時点で、シフト JIS に無い文字の扱いに関する問題をかかえてしまっているし(Apache が)。
対策案:
0.26 での依存モジュールの再確認。 ActivePerl 5.8.6.811では、追加で
ロックまわりがうまく動いているかちょっと不安なのでテストが必要だが、一人でメモ用に使う分には問題なく使えるようになったかな。
WiKicker には依存している Perl モジュールとして、必須なものとオプションなものがある。 必須なものは例えば Log::Log4perl など。 一方 Cache::Memcached や HTML::Scrubber などは、追加機能を使用したい場合のみ必要である。
一般的な Perl モジュールパッケージと同様、WiKicker では Makefile.PL に ExtUtils::MakeMaker を使っている。 必須な依存 Perl モジュールは PREREQ_PM に指定してあるが、オプションのものについては独自にチェックして警告をするにとどめていた。 しかしこれだと、オプションのものは CPAN.pm を使って自動的にインストールすることができない。
ということで検討した結果、Module::Install を用いることにした。 Module::Install を用いて Makefile.PL を作成すると、
などの機能が使えるようになる。
Module::Install の実行に必要なファイルはパッケージの inc ディレクトリ以下に自動的にコピーされ配布パッケージに含められるので、インストールする側はそのために余分なインストールを強いられることもない。
最終的に内部で ExtUtils::MakeMaker を使っているので、それの機能はほぼ全て使える。
Perl のバージョンも 5.004 から使えるとのことで、Perl 5.005_03 以上を対象としている WiKicker で使っても問題なし。
ということで、Makefile.PL をさらっと書き換え。
合わせて WiKicker に含まれていた実験的な機能を削除して、(オプションな)依存モジュールも減らすことにした。
次回のリリース版から、Module::Install ベースだ。
ホスティングサービス会社より、www.naney.org が契約容量超過との警告のメールをもらった。まずい。
ということで急いでデータの整理を開始。
これでもまだまだ。コンテンツ系も、かなり整理する必要がありそうだ。 できれば他からリンクされているコンテンツについては対応する新しいものへリダイレクト設定しておきたいのだが、作業時間的にはちょっと無理。
@kazuho → @kazeburo → @nekokak → @hiratara → @comewalk → @aloelight → @sartak → @Yappo → LT → @hidek → @lestrrat
雨大丈夫かなーと思って家を出たら、いきなりザーザーで折り畳み傘をさしたものの、ちょっと濡れたかなって感じで、着替え調達を口実に昨日ちょっと欲しいなと思った Perl T シャツを買ったんだけれど、そのあとは雨はあがりましたとか。
IPC::Open3 の話とか。
過去 Log::Log4perl とかをチョイスしていたけど、より Log::Minimal の方が手軽そうでいいな。
DevOps なお話。
開発と運用のコミュニケーション大切。開発だけれど障害出ると「ヤバい俺か?」といつもビビる。
モナド。
今までスルーしてたので参考になった。「Perl でモナドってみた」については理解するのに良いけど、(Perl において)プラクティカルかというと微妙だなという第一印象。まだ掘り下げて学ぶ必要あり。
Blog をとりまく今までの歴史など。
私的開発スタイルの変遷について。
DTrace で何かごにょごにょやってた。
スピーカーが一方的に話すだけではない YAPC らしいセッションを試みるなど、チャレンジングな良いトーク。
いろいろ。
マネージメント視点での話。他に無いトークで良かった。 DeNA にもってかれた。
時間もおしてたので、マキで。
トークとしては、やはり聞いてる自分が「お、これは自分でもやってみたいな」とか「ここに生かせるな」と思えるものが印象に残るし満足感が高いね。ここは落とし穴だから注意ねとか、ハマッたのでこんな工夫してみたよとかも引きこまれる。
逆に Perl 的な話だったとしてもモジュールの羅列紹介とかだとちょっと退屈。
内容レベル的には、浅すぎず、後半だんだん高度な話になってきたところでギリギリついていけるぐらいがいいかなと。
以上はもし自分がトークする立場になった時の参考用のメモ。
YAPC::Asia Tokyo 2012 もぜひ開催を!
日は落ちてゆき。#photography
— Naney (@Naney) December 10, 2021
RICOH GR IIIx #GR #GRIIIx #GR3x pic.twitter.com/85tyPQza5o
Naney (なにい) です。株式会社MIXIで SNS 事業の部長をしています。
※本サイトの内容は個人的見解であり所属組織とは関係ありません。