第4回 1999年の Perl チャットを2026年に動かす

:このホームページには、1999年から由綺チャットという人工無能チャットがあります。

人工無能というのは、チャットに書き込むと、辞書ファイルをもとにキャラクター(由綺ちゃん)が返事をしてくれる仕組みです。 Perl の CGI で、データはすべてテキストファイル。テレホーダイの時代に作ったものです(^^;
サーバーの引っ越し(第3回)にあわせて、これを2026年のサーバーで動かしてみました。 作業は Claude(生成AI)と一緒に進めました。

まずはそのまま動かしてみる

新しいサーバーの Perl は 5.34。27年前のスクリプトをそのまま置いてみると、当然エラーです。直したところは次のとおり。

これだけで、なんと普通に動きました。Perl の互換性、すごい。。
修正したら、まず手元の PC(Git for Windows に入っている Perl)で動かしてから、サーバーに上げるようにしました。

作り直し:Shift_JIS から UTF-8 へ

動くには動きましたが、ファイルが Shift_JIS、画面はフレーム、デザインも1999年のまま。 せっかくなので、中身を作り直しました。

UTF-8 化で、Perl ならではのハマりどころが2つありました。

  1. 正規表現の [ ] の中に全角文字を入れない。 Perl に「この文字列は UTF-8 の文字だよ」と教えずに扱うと、全角1文字は3バイトのばらばらの値として扱われます。 [、。] のように書くと、「、」「。」ではなく、それぞれのバイトのどれか1つにマッチしてしまい、文字化けの原因になります。 (?:、|。) のように書くと安全です。
  2. \p{Han} は漢字だけではない。 文章から話題になりそうな漢字の並びを取り出す処理で \p{Han}(漢字)を使ったら、なぜか読点「、」までマッチ。 調べてみると、「、」は漢字と一緒に使われる記号なので、漢字の仲間(Script_Extensions)にも入っているんですね。 \p{sc=Han} と書くと、本当に漢字だけになります。

由綺ちゃんの返事を自然に

昔のままだと、同じ返事を繰り返したり、分からない言葉に毎回同じように返したりしていたので、少し手を入れました。

ちなみに、昔はサブキャラクターが ToHeart の2人だったのですが、せっかくなので由綺ちゃんと同じ WHITE ALBUM のマナちゃんと美咲さんに替えました。

セキュリティの見直し

1999年の CGI なので、今の目で見るとけっこう無防備でした。 チャットを再開した翌日に、ひととおり見直してもらったところ、いくつか見つかりました。

ついでにバグも1つ見つかりました。ファイルを「読み書き用に開く。無ければ新しく作る」という処理を、

open(FH, "+<$file") || open(FH, "+>$file");

と書いていたのですが、これだとファイルが無いときに、最初に書き込んだ内容が消えることがありました。 「無ければ作る、あれば中身はそのまま」を一度にやってくれる sysopen に書き換えて解決です。

use Fcntl;
sysopen(FH, $file, O_RDWR | O_CREAT, 0600);

おまけ:Twitter bot は Bluesky へ

昔は由綺ちゃんの Twitter bot も動かしていたのですが、X の API が無料では使えなくなっていたので、 Bluesky に引っ越しました。(くわしくは日記に書きました)

振り返り

今は訪問者も少ない静かなチャットですが、由綺ちゃんはいつでも待っています。よかったら話しかけてみてください。
以上、です。

← コラム一覧へ