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の連携って、リポジトリツリーを見せる方法しかないので、
やっぱりそういうことは、考えないものなのだろうか?
サイトデザインが変わっている
久しぶりに、Template-Toolkitのオフィシャルサイトを見たら、デザインが変わっていました!!
http://template-toolkit.org/pipermail/templates/2007-July/009567.html
TT3のリリースに期待が高まります。
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に以下を記述します。
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
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アプリケーションでは便利かもしれません。