2021/07/15(木) [n年前の日記]
#3 [linux][debian][prog] imgboard.cgiが動かなくて悩んだ
Debian Linux 10 buster + Apache2 2.4.38-3+deb10u5 上で、Perl CGI の動作確認を兼ねて imgboard.cgi を動かそうとしたら、Internal Server Error が出て悩んだ。Vine Linux 上では動いていたスクリプトなのだけど…。
Perlのバージョンは以下。
imgboard.cgi は以下から入手。
_imgboard.com CGIダウンロードセンター
今まで利用していた Rev.6.1v2 ではなく、imgboard Rev6.1 v4 をDLして試したけれど、結果は同じ。エラーになる。
perl imgboard.cgi を実行して出力結果を眺めたら、正規表現の記述でエラーが出ているようで。
ただ、Debian Linux は UTF-8 だけど、imgboard.cgi は SJIS で書かれているので、該当行が表示されても日本語文字列が全部文字化け(?)していて、どこが原因なのか分からない…。
以下を打つことで、エラー出力をファイルにすることができた。
error.txt を、エンコードを切り替えられるエディタで開いて確認したところ、原因が分かってきた。
「正規表現を指定する文字列の中に『{』が入っているぞ」と怒られてるようで。最近の Perl ではエラー扱いにするようになった模様。ただ、実際には「{」なんてどこにも書かれてない。
いわゆるダメ文字の問題だった。SJISで書かれた Perlスクリプトでよく発生するアレ。
_fudist - ダメ文字一覧表
「京都府」「大阪府」の「府」に、0x7b = 「{」が含まれてしまっている。「{」が直接記述されているなら「\{」と書くことで回避できるけど、漢字の中に含まれているとなると…対策が思いつかない…。
仕方ないので、「府」だけを削除してみた。「京都府」「大阪府」は「京都」「大阪」に。そもそも、自動住所リンクが有効設定になっている時に処理が走るようなので、該当設定を無効にしておいた。
この状態なら画面が表示…されなかった。まだエラーが出ている…。
今度は、require "$imgsize_prog" if(-e "$imgsize_prog"); でエラー。最近の Perl は、スクリプトの置いてあるディレクトリ内(「.」)を検索しないようになったので、imgboard.cgi と同階層に置いてある、$imgsize_prog = "imgsize.pl" が見つからない模様。
require "./$imgsize_prog" if(-e "./$imgsize_prog"); に書き換えたら動いてくれた。
古いスクリプトだから仕方ないけど、SJIS で書かれた Perlスクリプトはこういう罠があるなと…。UTF-8 ならこういう問題に遭遇しないのだろうか。
Perlのバージョンは以下。
$ perl --version This is perl 5, version 28, subversion 1 (v5.28.1) built for i686-linux-gnu-thread-multi-64int
imgboard.cgi は以下から入手。
_imgboard.com CGIダウンロードセンター
今まで利用していた Rev.6.1v2 ではなく、imgboard Rev6.1 v4 をDLして試したけれど、結果は同じ。エラーになる。
perl imgboard.cgi を実行して出力結果を眺めたら、正規表現の記述でエラーが出ているようで。
ただ、Debian Linux は UTF-8 だけど、imgboard.cgi は SJIS で書かれているので、該当行が表示されても日本語文字列が全部文字化け(?)していて、どこが原因なのか分からない…。
以下を打つことで、エラー出力をファイルにすることができた。
perl imgboard.cgi 2> error.txt
error.txt を、エンコードを切り替えられるエディタで開いて確認したところ、原因が分かってきた。
Unescaped left brace in regex is deprecated here (and will be fatal in Perl 5.30), passed through in regex; marked by <-- HERE in m/東京|区|市|郡|府 <-- HERE |県|北海道|字|町|番地/ at /home/www/blackwater/public_html/cgi-bin/imgboard.cgi line 7571. Unescaped left brace in regex is deprecated here (and will be fatal in Perl 5.30), passed through in regex; marked by <-- HERE in m/(東京都|大阪府 <-- HERE |京都府|[^\s\>\d]+県|北海道)([^\s\>\d]+)(市|区)([^\s\>\d]+)([0-90-9]+)(\-|−|丁目|の|ノ)([0-90-9]+)([\-|−|の|ノ]?)([0-90-9]?)/ at /home/www/blackwater/public_html/cgi-bin/imgboard.cgi line 7574. Unescaped left brace in regex is deprecated here (and will be fatal in Perl 5.30), passed through in regex; marked by <-- HERE in m/(東京都|大阪府|京都府 <-- HERE |[^\s\>\d]+県|北海道)([^\s\>\d]+)(市|区)([^\s\>\d]+)([0-90-9]+)(\-|−|丁目|の|ノ)([0-90-9]+)([\-|−|の|ノ]?)([0-90-9]?)/ at /home/www/blackwater/public_html/cgi-bin/imgboard.cgi line 7574. Unescaped left brace in regex is deprecated here (and will be fatal in Perl 5.30), passed through in regex; marked by <-- HERE in m/(東京都|大阪府 <-- HERE |京都府|[^\s\>\d]+県|北海道)([^\s\>\d]+)(市|区)([^\s\>\d]+)([0-90-9]+)(\-|−|丁目|の|ノ)([0-90-9]+)([\-|−|の|ノ]?)([0-90-9]?)/ at /home/www/blackwater/public_html/cgi-bin/imgboard.cgi line 7578. Unescaped left brace in regex is deprecated here (and will be fatal in Perl 5.30), passed through in regex; marked by <-- HERE in m/(東京都|大阪府|京都府 <-- HERE |[^\s\>\d]+県|北海道)([^\s\>\d]+)(市|区)([^\s\>\d]+)([0-90-9]+)(\-|−|丁目|の|ノ)([0-90-9]+)([\-|−|の|ノ]?)([0-90-9]?)/ at /home/www/blackwater/public_html/cgi-bin/imgboard.cgi line 7578.
「正規表現を指定する文字列の中に『{』が入っているぞ」と怒られてるようで。最近の Perl ではエラー扱いにするようになった模様。ただ、実際には「{」なんてどこにも書かれてない。
いわゆるダメ文字の問題だった。SJISで書かれた Perlスクリプトでよく発生するアレ。
_fudist - ダメ文字一覧表
「京都府」「大阪府」の「府」に、0x7b = 「{」が含まれてしまっている。「{」が直接記述されているなら「\{」と書くことで回避できるけど、漢字の中に含まれているとなると…対策が思いつかない…。
仕方ないので、「府」だけを削除してみた。「京都府」「大阪府」は「京都」「大阪」に。そもそも、自動住所リンクが有効設定になっている時に処理が走るようなので、該当設定を無効にしておいた。
# <Google MAP 自動住所リンクのオンオフ> # # 本文中にある住所らしき文字を拾って、Google Mapのリンク化する自動住所リンクは # デフォルトでONです。オフにしたい場合は、以下のフラグを変更してください。 # (1=ON(推奨),0=OFF) $PM{'auto_japanese_address_find'}=0;
この状態なら画面が表示…されなかった。まだエラーが出ている…。
今度は、require "$imgsize_prog" if(-e "$imgsize_prog"); でエラー。最近の Perl は、スクリプトの置いてあるディレクトリ内(「.」)を検索しないようになったので、imgboard.cgi と同階層に置いてある、$imgsize_prog = "imgsize.pl" が見つからない模様。
require "./$imgsize_prog" if(-e "./$imgsize_prog"); に書き換えたら動いてくれた。
古いスクリプトだから仕方ないけど、SJIS で書かれた Perlスクリプトはこういう罠があるなと…。UTF-8 ならこういう問題に遭遇しないのだろうか。
[ ツッコむ ]
以上です。