Help us understand the problem. What is going on with this article?

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

More than 1 year has passed since last update.

はじめに

ファイルを整理していたときに、昔書いた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
ikemo
2019/05から転職しました。
https://www.ikemo3.com/
Why not register and get more from Qiita?
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away