Ruby
Perl
Cgi

199X年に書いたRuby 1.4/Perl 4のCGIを最新の環境で動かしてみた

はじめに

ファイルを整理していたときに、昔書いたCGIが見つかりました。
せっかくなので、最新の環境で動くようにしてみました。

199X年なのは、いつ書いたかが曖昧だからです。
Rubyを使い始めたのが確か1.4で、
Ruby 1.4のリリースが1999/8なので、おそらく1999年だと思いますが・・・

構成

当時作ってたCGIは6本で、以下のようになっています。

  • Perl 4: 2本
  • Ruby 1.4: 4本→1本(減った理由はのちほど)

復活させたCGIは以下になります。

http://www.wakaba.jp/~ikemo/cgi-bin/mahjong.cgi

変更点(共通)

EUC-JP → UTF-8

まずは全てのファイルのエンコーディングをUTF-8に変更しました。

汚染チェックを有効化

入力パラメータは「許可されたものしか使用していないこと」のチェックをしてたので
大丈夫だったのですが、念の為、汚染チェックを有効化しています。

  • Perl: -Tオプション
  • Ruby: $SAFE = 1

Content-Typeにcharsetを明示的に記載

記載しなくても大丈夫かと思いますがまあ念のため。

  • 変更前: Content-Type: text/html
  • 変更後: Content-Type: text/html; charset=utf-8

変更点(Perl)

jcode.pl → Jcode.pmに変更

jcode.plを使っていたのですが、これはUTF-8に対応していません。
何かいいものがないかなといろいろ調べたところ、Jcode.pmというのを見つけました。

これだけの変更で動きました。

require 'jcode.pl';
&jcode'convert(*value, 'euc');

変更後

use Jcode;
Jcode::convert($value, 'utf-8');

・・・ただそもそもjcode.plを使っていたのがフォームのデコードで、
しかもマルチバイト文字使ってないので不要っぽいと気づきました。
まあ今回の目的はベタ移植なのでそのままにしておきます。

@INCからカレントディレクトリが削除

Perl 5.26より@INCからカレントディレクトリが削除されました。

今回はベタ移植が目的で、かつカレントディレクトリは安全だとみなせるため、
単にカレントディレクトリを追加しました。

BEGIN { push @INC, "." if $INC[-1] ne "."; }

変更点(ruby)

Rubyの方が変更点が多かったのですが、
どれもこれは今ならやらない書き方ですね。

環境変数を直接書き換えていた

こんなコードがありました。
ENVはfreezeされていたので動きませんでした。

ENV['REQUEST_METHOD'].upcase!

直接書き換えないように変更しました。

Array#filterがなかった

メソッドがなくなってました。ちょっとびっくりしました。

しかしそもそもそのCGIは使われていませんでした。
4本あったRubyのCGIのうち、3本が未使用でした。なので修正せず。

暗黙のグローバル変数に依存したコード

以下のようなコードが動きませんでした。
Perlの書き方の癖が抜けてなかったようです。

while log.gets
  chomp!
  ...
end

こんな感じで書き換えています。

while line = log.gets
  line.chomp!
  ...
end