Another HTML-lintのCGIの出力が途中までしか得られないという問題に遭遇しました。ここに顛末をメモっておきます。
ちなみに、FreeBSD上の話ではありますが、問題の要点はプラットホームに依存しないので、Windows等でも起こり得る話です。
環境 §
- FreeBSD 5.4
- Apache2.0.54
- Perl 5.8.7
- htmllint.cgi 1.19
- htmllint.pm 3.23
- CGI 3.10
- Jcode 2.01
現象 §
Another HTML-lintのCGIで、HTML文書をチェックさせたとき、結果レポートのHTML文書が途中で切れてしまいます。
このとき、Apacheのエラーログ(/var/log/httpd-error.log)に以下のような項目が記録されました。
[Mon Jun 27 14:54:57 2005] [error] [client 220.110.2.110] Modification of a read-only value attempted at /usr/local/lib/perl5/5.8.6/mach/Encode.pm line 190., referer: http://XXXXXXXXXXXXXX/~lintrank/htmllint/htmllint.html
原因 §
直接的な原因は、Encode.pmのEncode::from_toの内部で、コード変換対象となる文字列を持つ引数に値を代入するコードにあります。しかし、引数に渡された文字列が定数文字列であるため、代入に失敗していたようです。
具体的な原因は、JcodeがEncode.pmを利用するように変更された時点で、Jcodeの挙動の非互換性が発生したことによります。
解決 §
Jcodeを2.02にバージョンアップします。
それには以下のコマンドで良いようです。
perl -MCPAN -e shell(リターン)
reload index(リターン)
install Jcode(リターン)
q(リターン)
Jcode-2.02.tar.gzを取得していれば上手くバージョンアップに成功していると思われます。
解決までの経過 §
nan.piedey.co.jpのハードウェアの更新のあと、FreeBSD 5.4を入れ、必要とされる様々なソフトを新規に入れ直しました。
HTML-LINT RANKINGを再度構築するためにAnother HTML-lintを動かしたところ、上記の問題に遭遇。
しかし、何が悪いのか全く分からず、Internetを検索しても類似の問題が見付かりません。結局、ソースをチェックして、問題の発生箇所をhtmllint.cgiの特定の行からEncode::from_toのエラー発生行までの動作の流れとして全て解明しました。しかし、それでも何が正しいの分からず、途方に暮れました。直すだけなら簡単なのですが、どう直すのが正しいのかが分かりません。関わっているのは全て実績と権威あるソフトばかりですから。(うかつな直し方をすると、後でトラブルのタネになる)
そこで、Another HTML-lintメーリングリストに状況説明を添えてHELPを送信 (Wed, 29 Jun 2005 18:23:49 +0900)。
すると、すぐに"(J|Encode)のMaintainer"の弾さんよりリプライがあり、原因が以下の点であることが確定 (Wed, 29 Jun 2005 20:26:52 +0900)。
動かなくなっている原因は、Jcodeが2.00よりEncodeのWrapperとなっている点にあります。
その後、弾さんより2回のテストリリースが行われ、これで問題の解決を確認。 (Wed, 29 Jun 2005 21:00:22 +0900)。
その後、正常に動作する版がJcode 2.02としてリリースされました。
そして…… §
これにより、Jcodeの修正履歴内に、Reported byとして私の名前が刻まれてしまったようです。
$Revision: 2.2 $ $Date: 2005/06/29 14:00:09 $
! Jcode.pm t/convert.t
Addressed: Jcode::convert("constant" ...) croaks
because 'Modification of a read-only value attempted'.
Reported by Akira Kawamata via htmllint@ring.gr.jp
Message-Id: <200506291823.ADF32994.VUONVB@piedey.co.jp>
Message-Id: <674CABD0-F30B-4244-AFD6-AE9BFA0F3744@dan.co.jp>
awk大好き人間としてPerl嫌いを公言していたにもかかわらず、どうやらPerlコミュニティに貢献してしまったようです。実はソースを追いかけている時に、Perlも面白いじゃん、とか思い始めていたのも事実なので、まあいいかな。要は、Perlはawkの弱点を克服した……というようにawkを欠陥のあるPerlの同類として扱うからイヤに感じられるだけで、最初から別物として見ればPerlも魅力がある……ということで。
それにしても、Perlはいちいち文末にセミコロンを入れないと動かないとは……。もっといい加減な言語かと思っていたら、厳密なことに感心してしまいました。ちなみに、awkは、セミコロン不用のいい加減な言語です (きっぱり)。