■2004-09-02
* [Perl] 引き続きBlosxom強化月間
この2週間、Blosxomをいじっていました。軽くて確かに素晴らしいCGIです。ただ、Blosxom v.2はプラグイン共々グローバル変数を使いまくりで、mod_perlやCGI::SpeedyCGIで動かすとなると、無理があります。そこで全部書き直されたBlosxom v.3をいじってみたのですが、α版ということもあって利用に制限が。
そこで、とりあえずv.2を修正してOOなモジュールModBlosxom.pmにしてみました。これでmod_perlでも動くと思います(blosxom v2のプラグインを使わなければ)。幾分、元のコードからかけ離れてしまったのですが、気にしないにしましょう。メソッドの名前に関してはBlosxom 3からいくつか拝借していたりします。プラグインはバージョン2とは互換がないのですが、すこしの修正で動くようになります(たぶん)。またModBlosxom::plugin::_compatというプラグインを用意しました。これは既存のプラグインを利用できるModBlosxom用プラグインです。プラグインについてはおいおいドキュメントを書いていきたいなあと(ModBlosxom::plugin::_compatをみるとプラグインメソッドの引数に何が渡されているかわかると思います)。
実際にこのサイトで動かしているCGIサンプル(txt)。まるでBlosxom3みたいですが、Blosxom2ベース。flavourとプラグインは、hail2u.netで公開なさっているblosxom starter kitを利用しました。ありがとうございます。
■2004-09-06
* サーバ移転
サーバ移転します。今日の夕方以降DNSの設定が変更される予定。リンク切れはないように気をつけたつもりですが、もし不具合がありましたらご一報くださいませ。→書き変わりました。
* [漫画] メロディ
先週郷里より宅配が届き、何かと思ってあけたら『Flowres』と『メロディ』がそれぞれ3〜8月号まで入っていましたよ(いらないので送ったそうな)。今日ぱらぱらとみてみたら、お、有木涼の作品が。わりと救われない展開が魅力。あと続きが読みたくなるものは、麻生みこと、慎結、それから及川七生あたり。そして宇野亜由美は、相変わらず凄いなあ……。
* [Perl] 特殊変数@-、@+
Perlの正規表現で使われる$`, $&, $'ですが、これを使うと(今のバージョンでは$&を除いて)速度が低下するのは有名です。で、Perl CookBookの第二版をパラパラと繰っているうちに見つけたのですが、n番目の括弧にマッチした開始位置と終了位置を記録する@-, @+という特殊変数がPerl5.6から導入されていたんですね(0番目はマッチした文字列全体)。うわあ、全然知らなかった……。これとsubstrを使えば$'や$'の代替ができて速度の低下を防げるというわけです。
# $strをマッチさせた文字列として substr($str, $-[1], $+[1] - $-[1]); # $1に同じ substr($str, $-[0], $+[0] - $-[0]); # $&に同じ
とかとか。凄い。件の$`, $'はどう書けるか一考すると面白いかも。Cook Bookにはもちろん載っています。この第二版はPerl5.8.1対応なので、まだ持っていない人は購入すると大変便利でしょう。→邦訳版
■2004-09-13
* [Perl] ModBlosxom
ModBlosxom.pmの修正をちまちまと。いくつかの対応プラグインも公開しています。バージョンによってメソッドに与える引数や返値がちょこちょこ変わっているのですが、まあたぶんこの辺で安定するでしょう。
■2004-09-17
* [Perl] reset関数
BlosxomをCGI::SpeedyCGIで走らせる実験をされているサイトがあったのですが(繋がらないのでGoogleキャッシュ)、パッケージ変数の初期化に組み込みのresetを使ってるんですね。一度も使ったことがないので、すっかり記憶の彼方になっていたのですが、reset 'a'
とかやりますと、aで始まる(カレント)パッケージ変数が全て初期化されるというまことに危なっかしい関数です。なるほどこういう手があったのか。私がblosxom.cgiをspeedycgi経由で走らせたときは必要な関数をlocalして対応したのですが、プラグインもパッケージ変数使いまくりなので無謀と判断。結局ModBlosxom.pmをつくることにしたのです。勤め先ではmod_perlで動かしています。
* [メモ] Blosxom
で、興味深いサイトをメモ。Blosxom3を扱っているblosxomについての個人的備忘録と、Java版BlosxomのBlojsom 。
* [雑感] コメントスパム
2〜3日前からコメントスパムがくるようになりました。初めてです。わーい。一度体験すれば十分なので対応策。現在のtDiaryにはフィルタリング用クラスがあることを知ったので、そこにごちょごちょ追加。とりあえず様子見です。
■2004-09-19
* [今月のAcme] Acme::Hello(先々月のAcme)
今回はAcme::Hello。useするとhelloという関数が導入されます。オブジェクト指向なインターフェースもあります。helloを呼び出すと"Hello, world!"と表示されます。……と、これだけならAcmeでも何でもないのですが、このモジュールのミソは、国際化しているところ。
use Acme::Hello; for my $lang ( qw/en ja de fr it/ ){ Acme::Hello->new(language => $lang)->hello(); } # Hello, world! # 世界よ、こんにちは! # Hallo, Welt! # Bonjour, le monde! # Salve, mondo!
などなど、Acme::Hello::I18Nクラス下に、poファイルが用意されていて、34カ国語に対応!
* [メモ] Locale::Maketext
Acme::Helloは、Perl5.7以降から標準モジュールになったLocale::Maketextと、Acme::Helloの作者自身がCPANに登録しているLocale::Maketext::Lexiconが必要です。これらのモジュールは地域化のフレームワークを提供します。i18n関連をCPANで探している際に、上で取り上げたAcme::Helloがひっかかったのです。それから、Locale::Maketext::Lexiconへの簡易なインターフェースであるLocale::Maketext::Simpleもメモ。
■2004-09-23
* [今月のAcme] Acme::Dot(先月のAcme)
これで8月分。今回はAcme::Dot。
package DotTest; use Acme::Dot; sub new { bless {}, shift } sub hello { my $self = shift; print @_,"\n"; } 1;
上はソース内でuse Acme::Dot
しただけの、何の変哲もないクラス。そして…
use strict; use DotTest; my $x = new DotTest; $x.hello(1,2,3); # $x->hello(1,2,3) と同等
ご覧のように、オブジェクト指向な言語によくみられるメソッドの呼び出し方が可能に! このモジュールのAcmeなところは、文字を連結する.
演算子をオーバーライドして、メソッドを呼び出すようにしているところ。ソースフィルタで.
を->
に書き換えれば同じ事ができるのに、あえて文字列連結演算子を使うこんな方法を取るところが素敵です(Acme::Dotをuseしたクラスだけに適用されるという利点もありますが)。
このモジュールの作者のSimon Cozensは、Perlコミュニティに多大な貢献をされてきたわけですが、宣教師になるために大学に戻るそうです。で、彼の100個目のモジュールAcme::OneHundredNotOutをかなり前に訳し始めたのですが、三分の二ぐらいのところで中断したまま。終わるのはいつになるやら……
■2004-09-26
* ありがとうございます
去年tDiaryを利用し始めたばかりのころ、よく拝見していたサイトの日記にあった保温調理のことを書いたことがありました。その方からコメントを頂いたりもしました。htaccess関連などの素晴らしいコンテンツがあり、参考にさせてもらってお世話になりました。ありがとうございます。本当にありがとうございます。心からご冥福をお祈りいたします。
■2004-09-28
* [雑感] モニタが壊れてまあ大変
日曜日、鬱々と”今月のAcme”を書いていたところ、モニタが突然真っ暗になってそれっきりでした。しかたないので前機NEC PC-9821V12に付属していたモニタを使っています。捨てなくてよかったです。でも大変見づらいです。今まではDiamondtronを使ってましたが、今度は液晶にしようかしら。Acmeは特別編にて後日。
* [Perl] EncodeモジュールでISO-2022-JP MIME-Header
Template-Toolkitの日本語情報を探していてたどり着いたページで、EncodeモジュールでUTF-8にエンコードされたMIME-Headerが、携帯メーラなどで解釈できないので結局Jcodeを使うことにしたとあります。せっかくEncodeモジュールが利用できるのにJcodeに戻すのはなんだか残念です。もちろんEncodeのラッパーであるJEncodeも同じで、今ままではUTF-8でも大抵のメーラが対応していると思って放置していました。そこでなんとか楽をしつつISO-2022-JPに対応できる方法を考えてみたいと思います。で、とりあえずEncode::MIME::Hedaer:ISO_2022_JP
というサブクラスをつくって、utf8しているところをiso-2022-jpになるようオーバーライドすることにしました。ところが、Encode::MIME::Header
ではmime-encodeを実行するサブルーチンのリファレンスが定数(constant subroutine)の中に埋め込まれていて、その定数からデリファレンスして呼び出されています。つまり、エンコード処理部分が実質的にprivateになっていて、楽ができないのです。結局、周辺部分からシンボルテーブルを弄って、何とか最小限の努力でISO-2022-JPにエンコーディングできるようになりました。もっとうまい方法をご存知の方がいらっしゃいましたらぜひ教えてください。
というわけで、JEncode v.1.30からMIME-HeaderのエンコードにISO-2022-JPをサポート。ただし、通常は従来通りUTF-8で行い、$JEncode::MIME_HEADER_ISO2022JP
に真値を設定するとISO-2022-JPでエンコードするようになります。本当にうまくいってるのかな?
[追記] mime_encode
, mime_decode
ともに正しい処理をしていませんでした。とくにmime_encodeは前から正しくなかったようです。1.31で修正しました。