Last updated on 2010/06/08.
フリーCGI:人工無脳
Contents
- ダウンロード&設置方法
- ちゃぼっとくん2号
- Wちゃぼっとくん
- 改造マニュアル
- ワイルドカードを変更する
- 裏ログを取得する
- 発言消去をできるようにする
- 入退室メッセージをつける
- FAQ(よくある質問)
- 無限ループにはまる
- おみくじをひいてくれない
- ワイルドカードを間違えて教育したら?
- 改造マニュアルの発言消去の正規表現対策にだけ「*」があるのは何故?
- W-Chabotくんでは、ぼっと同志で会話しますか?
- 時々、画面に何も表示されないことがある
↑ このページのTOPへ
由来
人工無脳の流川をHPに置きたいと思ったんです。
それで、当時よく見掛けたフリーソフトをDLしてきました。
ところがその人工無脳くんは……普通のチャット用だったCGIを、
改造して作ったからだと思うのですが、ソースが色々複雑だったり、
あちこちに問題があったりしたんです。
そこで「じゃあ、チャットから改造するんじゃなくて、
人工無脳専用CGIを作っちゃえ」と思ったのが、
ちゃぼっとくん生誕のきっかけです。
しかしそもそもはそのフリーソフトを使用させていただいていたので、
辞書ファイルの形式がそのフリーソフトと同じになっています
(ゆえに、現在その人工無脳をご利用の方が、
ちゃぼっとに移行しようとされる場合、
データファイルはそのままお使いいただけます)。
ただ、EUC化してあります。
特徴
- 人工無脳と話すことが第一の目的であるなら、
自動リロードは不要だろうという考えの元、
ノンフレームとなっています。
- 人工無脳の性質上ソース内に文字列検索が多々ありますが、
それに正規表現を使用しているので、
文字コードがsjisだと色々と不具合が生じます。
したがって、ChabotはEUCで作成されています。
- ログファイルのロック機能がかなり強力で(多分)、
ログが消えちゃった〜ということが割と少ないです。
(サーバの混雑状況などにも左右されるので完璧とは言えませんが)
機能
- 基本機能(話し掛けると答える・教育を受け付ける)
- 参加者表示とささやかなROMチェック
- おみくじ機能(言うまでもありませんが信憑性はないです)
- 伝言機能(チャットしていると、
つい不在者にメッセージを書いたりしてしまうのですが、
チャットなだけにその人がそこに来るまでに、
ログが流れてしまうこともあるということから追加しました)
- 天気予報機能(言うまでもありませんが信憑性はないです)
設置の前提条件
- zipの解凍が必要です。
- EUCが扱えるエディタが必要です。
MacだとJeditとかいうのが有名らしいですね?
Windowsで私が使用しているのは「窓の杜」で拾ってきた、
REやAzEditというフリーソフトです。
- Webサーバ上にjcode.plを用意して下さい。
jcode.plとは、Perl CGI上で日本語を使う為のライブラリです。
すでにご自分のHPにCGIを置いてらっしゃる方は、
大概用意済みかと思われます。
ない方はどっからか拾ってきてサーバ上にFTPしておいて下さい。
設置方法
- タイトル行のChabot Ver〜をクリックして、
chabot.zipをダウンロードします。
ブラウザにもよるでしょうが、
クリックして「ディスクに保存する」を選べば、
ダウンロードできると思います。
- chabot.zipを解凍します。そうするとchabot.cgiが出来ます。
- chabot.cgiの初期設定を変更します。
絶対に変更する必要のある箇所はソースの頭の方にあります。
- 一行目の#!/usr/local/bin/perlを、
Webサーバの環境に合わせて変更して下さい。
- jcode.plをCGIと同じディレクトリに置いていない場合は、
パスを変更して下さい。例えば、
cgi-bin/jcode.pl
cgi-bin/chabot/chabot.cgi
というように置く場合は、chabot.cgiから見て、
jcode.plは一つ上のディレクトリにあるので、
require '../jcode.pl';になります。
まあ大概の方はcgiファイルと同じところに、
jcode.plも置かれるようなので
その場合は変更しなくていいです。
- ログファイル等データファイルを置く場所を、
$logdirで指定します。
CGIと同じディレクトリに置く場合は$logdir=".";のまま。
例えばCGIを置いてあるディレクトリに、
dataというディレクトリを作ってそこにファイルを置くぞ
という場合には$logdir="./data"になります。
- 出口のURLをご自分のHPなどに変更して下さい。
元のURLのままだと「出口」をクリックした時
「がらくたCGI工房」に出てしまいます。
絶対に変更する必要があるところは以上です。
その他の「変更した方がいいところ」については
「修正方法」のところで後述します。
さしあたりは最低限変更が必要なところだけ変更してサーバに置き、
稼動確認をすることをお勧めします。
- 辞書ファイル(defaultではyui.dat)、
つっこみファイル(defaultではago.dat)、
ボケファイル(defaultではboke.dat)、
くじファイル(defaultではkuji.dat)を中身ありで用意します。
サイズ0のログファイル(defaultではchat.log)、
伝言ファイル(defaultではden.dat)、
参加者ログファイル(defaultではuser.dat)を用意します。
サンプルデータはデータファイル7種類
になります。
ちなみに、データファイルをデフォルトの名前から変更する場合に
chabot.cgi内のファイルの名前も当たり前ですが変更して下さいね。
- chabot.cgiやデータファイル各種をサーバに置きます。
- ファイルのパーミッションを変更します。辞書ファイル、
ログファイル、伝言ファイル、
参加者ログファイルのパーミッションは666にしてください。
CGIは勿論、755です。つっこみファイル、くじファイル、
ボケファイルは644です。
それで多分動くはずです。
修正方法
変更が望ましいところについてはソース中にコメントがあります。
- 人工無脳くんの名前である$chabot。
時々ソース内の$chabotを全部、
ご自分の人工無脳くんの名前で置き換えようとされる方がいますが、
その必要はないです。
初期設定の「その他指定するところ」の$chabot="ちゃぼっと";
の「ちゃぼっと」だけ変更して下さい。
- 人工無脳くんの色である$chabotcol。
- チャットのログ行数である$row。
- 参加者の名前の表示色。
背景色に映える色だけにしておいてあげたらいいと思います。
- 背景色である$bgcol。
- HTML文のTITLEタグ内のタイトル。
- HTML文のBODYタグ内のTEXTとかLINKなどの色。
- それとソースの一番下、yobinaサブルーチン。
これは修正にperlの知識がけっこういるかもしれません。
デフォルトでは、「主人」とか「家主」という名前で入室した人だ
「ご主人サマ」と呼びかけ、それ以外の人にはサンづけで呼ぶ、
というようになっています。
変更しなくてもいいけど、したら楽しいかもしれないところもあります。例えば
- 「ちゃぼっと教育」の時の「($chabotを教育中)」を
「($chabotを調教しています)」に修正する
- 「伝言」の時の「($chabotにお願い)」を
「($chabotに伝言をお願いしております)」に修正する
- 「おみくじ」の時は、ちゃぼっとの名前の後ろに(巫女)がついた人が、おみくじをしてくれるのですが、
それは「$name=$chabot.'(巫女)';」という行でそうしているので、
そこを「$name=$chabot.'(神懸かり)';」にしてみる
- sub studyの中の、キーワードが短すぎる時のメッセージを変更してみる
- 教育時の「「$key」には○○って言うのかφ(\. \.)メモメモ」
を変更してみる
- sub dengonの中の、伝言を受けた時のメッセージを変更してみる
- sub search_dicの中の、
教えて下さいモード時のメッセージを変更してみる
- sub search_denの中の、伝言を伝える時のメッセージを変更してみる
さほど難しいことではないのですが、
perlに全然自信のない方はさしあたっていじらない方が無難でしょう。
書き方がわかってきたぞという場合には変更してみて下さい。
拡張方法&FAQ
リリースノート
- 1999/4/4
- Chabot Ver2.0を設置しました。
- 1999/4/20
- 「○○*?」をキーワードとした教育をした後、
ちゃぼっとがちゃんと応答しなくなるバグを修正しました。
Perl4で発生しました。正規表現対策のメタキャラに量指定子の
「\ { } +」が含まれていなかったのが原因のようです。
追加して、Ver2.01としました。
- 1999/7/1
- サーバが日本じゃない場合、現地時間が表示されてしまうので、
サーバの場所にかかわらず日本時間を表示するようにしました。
複数の人に同時に話し掛けられた時、
返答の順番が狂うというバグがありますが、仕様上修正は難しいので、
せめて複数人がいる場合には、返答相手を明示するようにしました。
環境変数からでは、ホストネームが取得できないことが多いようなので、
別の方法で取得するようにしました。
これらを追加して、Ver2.02としました。
- 1999/8/2
- 同時に話し掛けられた場合のバグの修正の為、仕様を変更しました。
残留ロックファイルを消去する機能を標準装備しました。
仕様を変更したので、小数点以下一桁目を上げて、Ver2.1としました。
- 2000/1/3
- Y2K対策をし、Ver2.11としました。
- 2003/1/4
- 著作権表示の変更をし、天気予報機能を追加し、Ver2.12としました。
↑ このページのTOPへ
由来
人工無脳を二人置きたいというご要望があったので作りました。
特徴
ちゃぼっとくん2号同様、ノンフレームでEUCです。
機能
- ベースはちゃぼっとくん2号です。
- 話し掛けた時には、どちらかが応答してくれる。
(話し掛ける相手を指定することもできます)
- 教育ができる。(どちらに覚えさせるかを指定することができます)
- おみくじと伝言。
(役割分担をしました。片方の人工無脳くんがおみくじ、
もう片方が伝言を承ってくれます)
設置の前提条件
ちゃぼっとくん2号と同じです。
設置方法
- タイトル行のW-Chabot Ver〜をダウンロードします。
- w_chabot.zipを解凍します。そうするとw_chabot.cgiができます。
- w_chabot.cgiの初期設定を変更します。
絶対に変更する必要のある箇所はソースの頭の方にあります。
これもちゃぼっとくん2号と同じです。
- 辞書ファイル2種(defaultではdic1.datとdic2.dat)、
つっこみファイル2種(defaultではmono1.datとmono2.dat)、
ボケファイル2種(defaultではboke1.datとboke2.dat)、
くじファイル(defaultではkuji2.dat)を中身ありで用意します。
サイズ0のログファイル(defaultではw_chat.log)、
伝言ファイル(defaultではden1.dat)、
参加者ログファイル(defaultではw_user.dat)を用意します。
サンプルはデータファイル10種類
になります。
- w_chabot.cgi、各ファイルをサーバに置きます。
- ファイルのパーミッションを変更します。
辞書ファイル、ログファイル、伝言ファイル、参加者ログファイル
のパーミッションは666にしてください。
CGIは勿論、755です。
つっこみファイル、くじファイル、ボケファイルは644です。
それで多分動くはずです。
修正方法
変更が望ましいところについてはソース中にコメントがあります。
これもほとんどちゃぼっとくん2号と同じです。
ただ、人工無脳が二人になった分、
名前が二種類だったり色が二種類だったりしますね。
変更しなくてもいいけど、したら楽しいかもしれないところも、
ちゃぼっとくん2号と同じようなものです。
ソースを頭からじっと見ていけば「この辺のメッセージを変えよう」
というところに思い当たるかと思います。
拡張方法&FAQ
リリースノート
- 1999/7/21
- W-Chabot Ver1.0を設置しました。
- 1999/8/2
- 同時に話し掛けられた場合のバグの修正の為、仕様を変更しました。
残留ロックファイルを消去する機能を標準装備しました。
仕様を変更したので、小数点以下一桁目を上げて、Ver1.1としました。
- 1999/10/22
- 1.1で発生していた、
伝言を言う時にChabotの色が黒いバグを修正しました。
Chabotの台詞にChabotが答えることがある「対話モード」をつけました。
Ver1.2としました。
- 2000/1/3
- Y2K対策をし、Ver1.21としました。
- 2004/1/4
- サイトの引越しに伴い、著作権表示を変更しました。
↑ このページのTOPへ
- ワイルドカードを変更する
- ちゃぼっとくんのワイルドカードは「*」になっています。
Perlのワイルドカードは「.*」なのに、なぜわざわざ「*」にしたかというと、一文字の方が(それもDOSやUNIX利用経験がある人にしてみれば*が)嬉しいからです。ファイルに保存する時にはCGIの方で「.*」に書き換えてくれます。
とかいうと偉そうですが、実は単に人様の人工無脳を教育しようとして、ワイルドカードを間違えた経験があるからだったりしますが(笑)。いや「*.」ってやっちゃったんです。「.」をPerlの結合の演算子と勘違いしましてね。ワイルドカードの「.*」の「.」は、正規表現の「.」ですね(^^;。
そういうわけで、ワイルドカードを「.*」に戻したい場合は、sub studyの中の
$key=~s/\*/\.\*/g; # ローカルワイルドカード*を.*に直す
の行を消しちゃって下さい。あと、説明のところのワイルドカードの説明も勿論修正してくださいね。
- 裏ログを取得する
- 通常のログは指定した行数(ちゃぼっとくんのデフォルト値は30)しか残っていませんが、もっとずっと残したい場合の改造方法です。ちなみに、どこまでも延々とログを取り続けますので、サーバさんのために時々はローカルに保存するなどして、サーバ側のはサイズ0に戻してやって下さい。
- 裏ログファイルの名前を決めます。
初期設定のところがいいでしょう。
$logfile="$logdir\/chat.log";の次の行あたりに、例えば
$llogfile="$logdir\/chat.sav";
など。そして、そのファイルを$logdirに用意してやって下さい。
サイズは最初は0でOK。パーミッションは666です。
- ログファイルに書き込む時に裏ログにも書くようにします。
- Chabot Ver.2.0x、W-Chabot 1.0の場合
- sub writelogを変更します。
ロックファイルは$logfileの方とまあ共同で構わないと思いますが、
open,flock,print,flock,closeを裏ログ用にも追加します。
sub writelog{ # 渡された文字列をログファイルに追加記入する
while (-f $lock_log){ sleep(1);} # ロックがかかっていれば待機
eval 'symlink($logfile, $lock_log);'; # ロックをかける
open(LOG, ">>$logfile") || &end_html("$logfile open error", $lock_log);
eval 'flock(LOG, 2);';
open(LLOG, ">>$llogfile") || &end_html("$llogfile open error", $lock_log);
eval 'flock(LLOG, 2);';
print LOG "$_[0]";
print LLOG "$_[0]";
eval 'flock(LOG, 8);';
close(LOG);
eval 'flock(LLOG, 8);';
close(LLOG);
unlink $lock_log; # ロックをはずす
}
- Chabot Ver.2.1x、W-Chabot 1.1以上の場合
- やることは上記と同じなのですが、ChabotのVer.2.1x、W-ChabotのVer 1.1以上の場合、ではsub writelogがなくなってしまいましたので、書き込む場所が変わります。
ログファイルに書き込みをしている部分、open(LOG, ">$logfile")〜 を探して下さい。
open(LOG, ">$logfile") || &end_html("$logfile open error", $lock_log);
eval 'flock(LOG, 2);';
open(LLOG, ">>$llogfile") || &end_html("$llogfile open error", $lock_log);
eval 'flock(LLOG, 2);';
print LOG @log; # 配列の中身をファイルに書き出す
print LLOG @messages; # @logではないので注意。
eval 'flock(LOG, 8);';
close(LOG);
eval 'flock(LLOG, 8);';
close(LLOG);
こんな感じです。
表ログの方があんまり壊れやすいようでしたら、裏ログをベースに表ログを復活させる機能も追加しようと思ってますので、ご一報くださいね。
一応ログのロックは厳重にかけたつもりなので、まずは壊れないことを祈りますが(^^;。
- 発言消去をできるようにする
- 「管理者権限でログのあの行を消したいっ!」という場合。
ログファイルから該当の行を直接消してください、と言いたいところですが(苦笑)、チャットしてる最中にログファイルをいじるわけにもいきませんもんね。指定した言葉を含む行を消すように改造しましょう。
- 発言消去コマンドを仮にcommandとした場合、
「command○○」と発言すると、○○を含む行が消去されるようにする
-
- 発言消去コマンドを打ち込んだ時、ちゃぼっとくんに反応してもらっても嬉しくないので(嬉しくない以前に、この改造の方法だとちゃぼっとくんが反応しちゃうと、うまくいきません)、CHABOT: {のすぐ後、ちゃぼっと教育の前に、こんなのを追加します。
# 発言消去だったらちゃぼっとは何もしない
if($mes=~/^command/){ last CHABOT; }
- 「ログを配列に読み込み、配列を逆順にし、ログを表示する」ところの、FILEの中身を読んだあと、すなわち、ファイルの中身を配列にうつして close(LOG)したすぐ後に、こんなのを追加します。
## 発言消去
$flag = 0; # 念のため。
if($mes=~s/^command//){
# メタキャラの正規表現対策をする
$mes=~s/([\^\(\)\<\>\/\\\[\]\$\.\*\?\{\}\+])/\\$1/g;
foreach $log (@log) {
$log = '' if($log=~/$mes/i);
}
$flag = 1;
}
- ログを変更したらログファイルも変更しなくちゃ話になりませんから、この次の行を以下のように変更します。
- Chabot Ver.2.0x or W-Chabot Ver.1.0の場合
-
修正前:
if (@log > $row ){
修正後:
if ((@log > $row) || ($flag == 1)){
- Chabot Ver.2.1x以上 or W-Chabot Ver.1.01以上の場合
-
修正前:
if(@messages > 0){
splice(@log, $#log+1, 0, @messages);
修正後:
if((@messages > 0) || ($flag == 1)){
splice(@log, $#log+1, 0, @messages) unless ($flag==1);
ちなみに、「command○○」を実行した直後、一回分だけ、
消した行が「>」と表示されますが、
次回からちゃんとなりますので、大目に見てください。
- 更に、clearと打ったら打った人の発言が消去されるようにする
- タグ対策の後、CHABOT: {の前に、
## for 発言消去
$mes = 'command'.$name if ($mes eq 'clear');
という行を追加してください。
あと、説明のところに「clearと打つと貴方の発言が全部消去されます」
とか説明を入れるといいかと。
- ちゃぼっとくんに入退室メッセージをつける
- 基本的に私が「要らん」と思っている機能は、作るのが楽しくないです。
そういうわけで「入退室メッセージ機能が欲しい」と言った方がいた時、
私は「自分でつけましょう」と言いました。
いやー、だって、わかってたんですもの。
その人がちゃぼっとくんの改造できるだけの力を身につけていたことを(^^;。
いい勉強になるしぃ。ねえ?ひかるさん。
そして、本当に自分で作ったひかるさんは、更にちゃぼっとくん改として、
それを公開してくれました。
入退室メッセージをつけたい方は、
ひかるさんの「CGI Maniax」から、
ちゃぼっとくん改造教室に行ってください。
他にも、ちゃぼっとくんの、色々なカスタマイズの仕方について載っています。
↑ このページのTOPへ
ちゃぼっとに関する御質問はメール又は掲示板にどうぞ。
- 無限ループにはまっちゃってどうにもならないんですけど!
99/4/8
- ロックファイルが残っちゃってる可能性があります〜。
ロックファイルを生成したあと、
消去するより前に何らかの原因でCGIが強制終了されたりとかすると、
ロックファイルが残っちゃいます。
しょうがないので、telnetかftpで入って、ロックファイルを消して下さい……。
あんまり頻発するようでしたら、
ロックファイルが30秒以上存在していたら消すなどの対処をしますんで、
ご連絡下さい。
※ 99/8/2に対処しました。Chabot Ver2.1やW-Chabot Ver1.1をご利用下さるか、
または、掲示板に対処方法を載せてますので、CGIを修正して下さい。
-
「おみくじ」と頭から言った時しか、おみくじをひいてくれないんですけど。
99/4/8
- 会話中のどこでも「おみくじ」が出てきたら、
おみくじをひいてくれるようにしたかったら、
# おみくじ
if($mes=~/^おみくじ/){
の^を消してください。
- ワイルドカードを「*」にしました。
これまでの利用者が勢いで「.*」で教育したら、問題がありますか?
99/4/8
- あります。何故なら、sub studyの中で、
「.」は正規表現対策対象のメタキャラとされているからです。
「バスケ.*好き.*?===勿論」と教育しちゃった場合、
「バスケ.は好き.ですか?」とか書かないとマッチしません。
「.*」と入れても問題がないようにしたければ、
メタキャラの正規表現対策から「.」を除いて、
$key=~s/([\^\(\)\<\>\/\\\[\]\$\?\{\}\+])/\\$1/g; # メタキャラの正規表現対策
にして下さい。「.」は正規表現の中で、「任意の一文字」なので、
これを省いてしまってもマッチはします。
でも何分「任意の一文字」ですから、余分なのともマッチします。
例えば「(. .)」を学習のキーワードにした場合、
「(. .)」にも勿論答えてくれますが、
「(^ ^)」とかにも答えてくれちゃうんですね。
-
発言消去の正規表現対策にだけ「*」が含まれているのは何故ですか?
99/5/10
- 「教育」の時の正規表現対策に「*」が含まれていないのは、
「*」がワイルドカードだからです。
これに対策してしまったら、「こんにち*===ちゅーっす」って教育した場合、
「こんにちは」「こんにちわ」と言っても、この回答は出なくなってしまいます。
「こんにち*」と訊かなくちゃいけなくなってしまいます。
発言消去は例えば「Command(*^^*)」とかにも対応するよう、
「*」も正規表現対策に入ってます。
- W-Chabotくんでは、人がいない時、ぼっと同志が会話しますか?
99/8/2
- しません。何故なら、CGIが動かないとぼっとは反応せず、
人が動かさなければCGIは動かないからです。
……とか何とか言っていたのですが、要望があったので、
V1.2では対話モードを標準装備しました。ある条件でちゃぼっと同志で会話します。
でも「人がいない時」じゃないですけどね。
- 時々、画面に何も表示されないことがあるんですけど。
00/07/24
- 考えられる原因の一つは、
ちゃぼっとの辞書ファイルの中によろしくない文字があることです。
直接辞書ファイルを編集した時に、顔文字などを使おうとして、
半角記号文字を普通に入れてしまいませんでしたか?
メタキャラである半角記号を普通に書いてしまうと、
辞書ファイルを検索中に正規表現でエラーになってしまいます。
そのため、画面に何も表示されなくなってしまうのです。
回避するためには、半角記号^()<>/\[]$?{}+.を使う時には、
その前に\を書くようにして下さい。
尚、CGIで、===を使ってちゃぼっとを教育した時は、
ちゃんと\付きでファイルに登録されるようになっています。
↑ このページのTOPへ