2005年06月30日
川俣晶の縁側ソフトウェア技術雑記 total 10870 count

Another HTML-lintのCGIの出力が途中までしか出力されない問題

Written By: 川俣 晶連絡先

 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は、セミコロン不用のいい加減な言語です (きっぱり)。