5日ぶりの日記か。実家に帰ったり,世遊び……(お,すごい誤変換)したりで,更新が滞ってしまった。ちょっと時間ができたので,去年のパリ旅行のページを完成させようと思ったけど,それも途中で断念。「凱旋門」とか「エッフェル塔」なんていうキーワードだと,ぼくのページがバリバリと検索エンジンでひっかかるようで,結構メールをもらうんです。せっかく写真をスキャナで読み込み済みだし(そう,デジカメじゃないんです),全部のせようかなと思ったんです。実はのせてる写真の画像サイズが全部デカいことも気になってたし,やり直そうとも思ってたのでした。
100枚近く写真があるといっても,コメントくっつけるだけだから,別にすぐにできるんだけど,さすがに100個のHTMLファイルの編集はウンザリ。「次へ」ボタンに次のHTMLファイルへのリンクを埋めこむのを手でやるかって話です。で,HTMLを作るのを,XMLとPerlを使ってやろうとあれこれやってたら,ハマってしまった。以下,パソコンオタクな話です。
もともと,Parisのページは,XMLモドキで書いたデータファイルから,複数のHTMLを吐き出すPerlスクリプトを書いて作ったページなんです。たとえばこんな感じ。
<画像 サイズ="449,336">gaisenm.jpg</画像>
<見出し>観光名所は偽物に見える</見出し>
<キャプション>凱旋門は思ったより小さかった</キャプション>
<本文>凱旋門の上にプチプチと小さく人がいるのが見えるだろうか。
写真で見慣れた観光名所というのが,どこもでもそうであるように,
実際に行ってみると凱旋門も偽物のように見えるものだ。</本文>
<MAKEHTML/>
ださいのは,最後にプログラム処理用のトリガーのタグがあることだったりして……。どこがXMLやねんとか言われそう。つまりロクにXMLらしい処理の仕方をしてなかったのですね。画像のサイズが埋め込んであるのもダサい。でもこれは,見てもらえれば分かるとおり,写真の左と下にくっついてる,写真の影にあたる画像を,サイズ指定して写真のサイズにいちいち合わせているので,どっちにしてもサイズ情報はなんとかしなきゃいけなかったんです。
これをイッチョまともにやってみるかってんで,XML::Parser,XML::Grove,XML::DOMなんていうXML処理用のPerlモジュールあたりをインストールして,あれこれ試してみたわけですが,あれこれ試したりドキュメントを読んでいるだけで3時間ぐらい経ってた。検索してみても,意外に使い方のサンプルコードが見付からなくて。でも,このへんのモジュールと,ImageMagickなんていう画像処理ライブラリのPerlモジュールを使えば,手作業での画像サイズの埋め込みをする必要もなくなって,すっきりエレガントに処理できるはずだなぁとか思いながら……,日が暮れてゆくのでした。そもそもXMLというわけで,必然的に文字コードはUTFが好ましいわけだけど,Mule-UCSなんかを使うかって言われると,うーん,と考えてしまう。Unicodeを快適に使える環境にはまだなってないんだね,世の中。Perlだって,UTF-8がデフォルトとは言え,正規表現は使えないってことだし(Perl5.005_50あたりで対応したみたい)。Unicode-EUCのコンバータもインストールする必要があった。
なんて面倒なんだと思う反面,いずれこの処理が書ければ,いろんな応用が効くだろうからというので,もう少し頑張ることにした。Windows95/98環境(=DOS環境)で,いつまでもPerl4の世界にいたぼくとしては,このへんで,まっとうなPerl5ユーザーになっとかないと,という思いもあったのでした。人によっては,このさいRubyにしたらどう? なんていうかもしれないけど。
XML::ParserとXML::GroveとXML::DOMは,全部必要なわけじゃなくて,どれか1つあれば用は足りるらしい。要は目的に合わせてということ。XML::Parserは,イベント処理型で,スタートタグが来たら,この関数を呼び出せなんていう風にハンドラを定義して,関数の中でなんとかかんとかやればいいらしい。素直だけど,動作が頭からお尻に向かってリニアに進むだけだから,イメージとしてはプレーンテキストに対するawkみたいな感じ。単純にXMLのタグを順番にHTMLのタグに置き換えていくような用途なら,良さそうなんだけど。
XML::Groveは,一番シンプルで,かつPerlらしい処理ができるものらしい。XML文書を適当なリストに入れて返してくれる……,はずなんだけど,使い方がよく分からないまま,XML::DOMを使うことに決定。
XML::DOMは,なんたって
DOM準拠だから,いちばんポータビリティも高くて覚えて得するはず。XMLは,いずれ今で言うフラットテキストという位置付けになるだろうから,DOMはフラットテキストに対する正規表現のように,XMLを自在に操るための便利なインターフェイスになると思う。処理の柔軟さも,3つの中では,XML::DOMが一番高そうだ。たとえば,「キャプションタグをかきあつめて,その数を数えろ。その文字列を吐き出せ」とか,そういうことが簡単にできる……,はずなんだけど,テキストが出てこないんだよな。タグは拾えても,テキストが出てこない。
W3CのDOMの仕様書を眺めたり,XML::DOMのドキュメントを眺めたり,何ができそうなのかをあれこれ調べていると,元の目的であるパリの旅行写真をホームページにのせるということを,すっかり忘れてしまいそうになった。こういうのを本末転倒というのだろうか。いやいや,コンピュータにやらせるべき作業は,コンピュータにやらせるべきなんだ。いっときは遠回りに見えても,結局トータルで時間を節約できればいいんだ。