現在、MT4i Version 3.0 の開発を黙々と続けております。そろそろ正式版としてリリースしようと思っているVersion 2.2 とはまったくの別物と言っても良いでしょう。正月休みの空き時間はほぼこれに費やしました。その割には表に出せるものがまだ出来上がってないのがあれですが。うーむ。
3.0 についてネタばらしすると、目玉は HTML::Template 対応とキャッシュ機能の搭載になります。Template を使用して(比較的)楽にデザイン/レイアウトを変更できるようになり、キャッシュ機能により、DB へ負荷をかけずに、あるいは DB のレスポンスに引きずられないようになる…予定です(ぇ
というのも、あらかた機能を実装したところで、ベンチマークとって 2.2 とパフォーマンスを比べているんですけど、結果がどうにも思わしくないわけです。
遅いんですよ。ほとんど変わらないか、若干遅い感じ。MT4i の性格上、あまり環境に左右されるような機能は実装できないので、キャッシュといってもファイルキャッシュなものですから、ディスクの I/O って思ってたよりレスポンス悪いのねーというか。もちろん、キャッシュ無しよりは有りの方が若干早くなるわけですけれど、HTML::Template の方が足を引っ張ってるみたい。機能が増えるんだから致し方ない部分があるとはいえ、前のバージョンよりレスポンスが悪くなるってのがなぁ。結果的に、キャッシュ積んだのに前より遅くなった、みたいなことになってる。
というわけで、何とか高速化を図ろうと試行錯誤しているわけです。
でここからがタイトルの件。あまりにバカみたいな話ですとあらかじめ言っておこう。
さて、HTML::Template を使うに当たって、
use HTML::Template; my $template = HTML::Template->new(filename => $file);
などとして Template ファイルを読み込んだ後に、
$template->param(TEXT => $text);
などとして Template に値を埋めていくわけですが、読み込んだ Template に無い param_name(上記の例で言うと 'TEXT' の部分)を使って HTML::Template->param を呼んだ場合に、エラーとして処理されていました。これではデザイン/レイアウトに変な制限が出来てしまいます(不必要なタグを削れない)。
というわけで、すべての HTML::Template->param 呼び出し部を以下のように記述してエラーを回避していました。
if ($template->query(name => 'TEXT') eq 'VAR') { $template->param(TEXT => $text); }
あまりに不細工。そして意味もなくコードが肥大。何かおかしいと思いつつも、しかし致し方ないと諦めていたわけです。
ところが。
今回、高速化を計ろうと色々と調べている中で、改めて HTML::Template の POD を読んでいたんですが、なんか
die_on_bad_params
とかいうオプションがある、らしい。
if set to 0 the module will let you call $template->param(param_name => 'value') even if 'param_name' doesn't exist in the template body.
あー、うー、えーと、お蔭様でコードを随分とダイエットできました。ってかこれ、デフォルト 0 で良くね?
3.0 公開までの道のりは険しいな…。
コメント