Class::Accessor

Class::Accessorで、__PACKAGE__->follow_best_practice;を使った場合、
エイリアスを作ってくれないっぽい。
setterをオーバーライドしたいのだけど、方法はないんだろうか?
setterメソッドにバリデーション処理を入れるのではなく、
自分でバリデーションメソッドを定義するのが良いのかな?

Subversion + Apache

Subversionリポジトリに格納したWebサイトを
過去のリビジョンを指定して、仮想的にサイトを見せる方法ってないものかな?

そしたら、過去プレビューが出来て便利なんだが。

どうやってリビジョンを指定すればいいかだけど、ワイルドカードホスト名と
URLリライトを使って、Subversionのコンテンツを返すようなApacheモジュールがあれば出来そうな気がする。

http://www.system.co.jp/
http://r1.www.system.co.jp/index.html
http://r1234.www.system.co.jp/index.html
http://r2000.www.system.co.jp/index.html

ポイントは、返したファイル内において、
/some/a.html
というリンクがあった場合、
今見ているリビジョンの/some/a.htmlを
返してあげたい点。

http://www.system.co.jp/r2000/index.html
とかだと、
http://www.system.co.jp/some/a.html
にジャンプしてしまい、うまくない。

http://r2000.www.system.co.jp/some/a.html

に解釈されて、r2000をApacheが解釈して、
SVNリポジトリのリビジョン2000の/some/a.htmlコンテンツを
返すようにできれば良い。

Apache+Subversionの連携って、リポジトリツリーを見せる方法しかないので、
やっぱりそういうことは、考えないものなのだろうか?

Ver2.18がリリースされている

http://www.template-toolkit.org/は、まだ2.15のままの表記ですが、CPANの方は、2.18にあがっていました。

作者のAndy Wardleyさんは、最近、他の仕事で忙しかったようです。
自分としては、TT3のリリースが待ち遠しいのですが、開発は継続しているようで安心しました。

今回のリリースで、サブルーチンやメソッドの引数に、式をネストして指定できるようになったようです。

[% add(a+5, b < 10 ? c : d + e*5) %]

screenとvimで今何編集

vimでファイルを編集したときに、開いているファイル名をscreenのステータス行に表示するには、.vimrcに以下を記述します。

vimを終了するときは、今いるディレクトリを表示します。

if $TERM == "screen"
  autocmd BufEnter * if bufname("") !~ "^\[A-Za-z0-9\]*://" | silent! exe '!echo -n "^[k[`basename %`]^[\\"' | endif
  autocmd VimLeave * silent! exe '!echo -n "^[k`dirs`^[\\"'
endif

Vimを使い終わったらGNU Screenのステータスラインのタイトルを「** free **」にを参考にしました。

screenとbashで今どこ

screenを使うにはzshということなのですが、仕事環境では、bashがメインなので移行は億劫になっていました。

screenで、ステータス行のウィンドウリストに、今いるディレクトリを表示したいけど、bashじゃできないのかぁと思っていましたが、PROMPT_COMMANDというのを使えば出来ました。

.bashrcとかに、

if [ "$TERM" = "screen" ]; then
  PROMPT_COMMAND='echo -n "^[k`dirs`^[\\"'
fi

としておくと、今いるディレクトリを表示してくれます。
(^[は、Ctrlキーとvを押しながら[を押して入力)

cdしても、正しくディレクトリを表示してくれます。

リストデータをスカラーとして出力した場合の挙動2

リストデータをスカラーとして出力する場合の挙動 - Hatena::Diary::SHIN-YA
リストやハッシュを間違って書いて、ARRAY(0x12345678)とか出てしまうのをデフォルトでブランク出力させたいわけですが、DEBUG_PARSERを使ってコンパイルされたコードを見ると、たとえば、
[% msg %]
と書いた場合、

$output .=  $stash->get('msg');

のように展開されていることが分かります。
このコードは、Directive.pmのgetメソッドが呼ばれて生成されています。

Directive.pm

 275 #------------------------------------------------------------------------
 276 # get($expr)                                                    [% foo %]
 277 #------------------------------------------------------------------------
 278
 279 sub get {
 280     my ($class, $expr) = @_;
 281     return "$OUTPUT $expr;";
 282 }

ということは、展開結果が以下のようになれば、期待した動きになるのでは?

$output .=  ref $stash->get('msg') eq 'HASH'  ? '' :
            ref $stash->get('msg') eq 'ARRAY' ? '' :
            $stash->get('msg');

ということで、getメソッドを書き換えてみます。

sub get {
    my ($class, $expr) = @_;
    return "$OUTPUT ref $expr eq 'HASH'  ? '' :\n"
         . "        ref $expr eq 'ARRAY' ? '' :\n"
         . "        $expr;";
}

プラグインとかではなく、コアなソースを直接編集するので気持ちが悪いのですが、ほぼやりたいことが出来ました。(オーバーライドはどうやってやるんだろう)
例外とかをなげれば、ファイル自体を生成させないことも出来るかもしれません。

しかし、これだとデバッグが大変です。HASH(0x12345678)のように出ると、ハッシュリファレンスを参照していると気づきますが、ブランクだと何が起きているか分かるのに時間がかかるし、気づかないかもしれません。
Template-Toolkitには、デバッグモードが用意されているので、それらを利用することでHASHやARRAYを参照した場合に、ユーザに警告を出すようにできればいいなと思います。HASHやARRAYリファレンスを参照したときに、デバッグ情報を保存しておいて、呼び出し元に返すことができれば、Webアプリケーションでは便利かもしれません。