先日来,書評掲示板を作ったものの,どうも使いにくいので1からシステムを作りなおすことにした。第一の改変ポイントはフレーム化である。ここのようにタイトル一覧がでて,それをクリックすると詳しい書誌情報とコメントが得られるという形にしたいわけである。新規に本を追加するのは一覧と同列におけばよい。普通はフレーム化するとフレーム数だけのファイルが必要になるが,せっかくCGIで書いていて引数を渡せるのだから,メインのFRAMESET画面を作るファイル一つは別にしても,あとは一つのCGIで引数で区別させることにした。
引数の渡し方は,FRAME=でCGIのURLで"?action=showindex"などと追加してやればgetで"action=showindex"がCGIに渡されるので,$ENV('QUERY_STRING')を参照して普通に=でsplitして$FORM{$name}=$valueの形で格納してから,if ($FORM{'action'} eq 'showindex')などとして別々の処理をさせればよいわけである。個々の処理はsub(サブルーチン)にしておけばよい。
と,ここまでは誰でも思いつくと思うが,問題はその後である。FORMに入力後,INPUTで受け取ったデータもCGIに渡したいわけである。が,actionだけ読み取れれば良いときに$name=$valueをすべて解釈するようなルーチンがあっては時間の無駄である。データはpostで渡したい。で,FORMでMETHOD=postと書いてもCGIのURL"?action=showindex"はgetでCGIに渡されるかが若干不安だったが,やってみたら両方同時にちゃんと渡してくれた。案ずるより生むが易しである。これで,postで標準入力渡しをされたデータは必要なサブルーチン内でのみ解釈すればよいことになる。
次に考えたのは「コメントをつけたい」ということであった。同じ本について意見のやりとりができれば建設的だと思うし,意見の種類が多いほど多様な見方ができてよいと思うからである。そこでデータ構造をいろいろ考えた。まず考えたのは,書籍情報を記録しておくインデックスファイルを作り,コメントは本ごとに別々のファイルを作る方法であるが,これだとセキュリティ上問題がある。勝手にファイルを作れるようにしてしまうのは怖い。次に考えたのはインデックスファイルは作るとして,コメントファイルは1つにして,インデックス番号で区別する方法である。コメントが増えてくると検索のオーバーヘッドが大きくなりそうな気がするが,まあPerlは高速なのでしばらくはこれでいけそうである。なに,増えてきたらファイルをソートしてインデックスごと分割してアーカイヴにすればよいのだ。コメントをつけた後はコメントのウィンドウがそのままリロードされればよいが,新規追加した後はインデックスもリロードされなければならないので全体をリロードすることにした(何度も同じ内容でsubmitされると困るし)。
最後はクッキーである(クッキーの情報はNetscapeのサイトにあるということが,自分のNC4.05が作ったクッキーファイルを見てわかった)。欲しくない人はブラウザ側で拒否できるので,デフォルトで送ることにした方が便利だと思ってつけることにした。保持期間は30日にした。ユニークな名前というのはcgiのURLにするのが常道らしいのでそうした。つまり一旦cgiのURLをクッキー名として受け取り,そのクッキーの中身に名前とe-mailアドレスとURL名を:でつないで入れるという方法である。が,困ったのがURLをクッキーデータとして送る方法である。URLは:を含んでいるので,:で分割すると後半が消えてしまうのである。まあ:の代わりに;を使えばいいような気もするが,これは"://"を:での分割前にあらかじめ_colon_slash_slash_に置き換えておいて,分割後に再置換することで解決した。
以上のアルゴリズムに御関心があれば,これ(book_bbs.lzh: 約9 kbytes)をダウンロードして読まれたし。次は検索であるが,まだデータが少ないので検索をつけても意味はないと思われる。データが増えてきたらつけようと思う。データが増えないと何にもならんしなぁ。。。(1999年10月20日追記:この後の経過についてはCGI開発室を読まれたし)