PaddieのCGIの部屋        Since 2000.04.28

ここではPaddieが作ったCGIスクリプトの紹介やCGI (Webサーバーの設定やPerl) について、わかる範囲で(笑)解説します。
〜Last Modified : 23 May.2000〜


 
Perlってどう書くの?(6)
前項でカウンターの設計のしかたはおわかりいただけたと思います。

次はCGIとして実際にHTMLを吐き出す物を考えてみましょう。

HTMLを吐き出すとはどういうことかというと、たとえば、
http://www.paddie.com/cgi-bin/shred.cgi」 とかいう風に、CGIスクリプト自体にアクセスがあった場合、その実行結果としてHTML形式のテキストが出力されるということです。

上のURLは実際にPaddieが運営している掲示板にリンクしていますから、一度クリックしてみてください。

別のウィンドウが開いて、掲示板(スレッド表示)が表示されますよね? URLは「http://www.paddie.com/cgi-bin/shred.cgi」となっています。

しかし、実際にはshred.cgiというのはこのスレッド表示のHTMLファイルが置かれているのではなく、 shred.cgiというCGIスクリプトが置かれていて、その実行結果としてHTMLの形式で出力がなされているだけなんです。

いきなりスレッド表示対応の掲示板を設計するのは大変なので、ここでは簡単な追記型掲示板スクリプトを考えてみましょう。

追記型掲示板というのは、書き込まれたメッセージが新しい順に表示されるタイプの掲示板で、ゲストブックなどと呼ばれている場合もあります。

では基本的にどう言う動作をするか考えてみましょう。

1)アクセスがあって、もしメッセージが無ければ3)に進む。
2)HTMLに整形し、記録する
3)記録ファイルを読み込んでHTMLを組み立て、出力する。
というのが基本骨格になります。

では、順に考えていきましょう。

1)アクセス
アクセスには、「リンクをクリックしたりブラウザにURLを入力してアクセスする場合」と、 「書き込んだ場合」の2通りが考えられます。

両者の違いはメッセージ本文の内容または記録者名が含まれているかどうかで判別することにします。

もし、メッセージ本文の内容または記録者名が無ければ途中の処理をとばして3)へ進みます。

2)HTML形式に整形し、記録する
ブラウザから受け取ったメッセージをHTML形式に整形します。

HTML形式に整形すると言っても、簡単です。
少しのタグを追加する程度でかまわないでしょう。

そして、記録ファイルの先頭部分に新しいメッセージを記録します。

3)記録ファイルを読み込んでHTMLを組み立て、出力する。
まず、記録ファイルを読み込んでおきます。
そして、あらかじめ作ったHTMLの前半と、読み込んだメッセージ部分、そして、 HTMLの後半をつなげて出力するだけです。
ただし、出力の前にはHTTPヘッダをお忘れなく。

以上が大まかな設計になります(^^)

ファイルの構成やWebサーバーの設定を次のようにして考えてみましょう。
(:の後の数字はパーミションと思って下さい)

home directory(/)
 |
 cgi-bin:777
  ├guestbook.cgi:755(スクリプト本体)
  ├guestbook.txt:666(記録ファイル)
  ├jcode.pl:644(漢字コード変換ライブラリ)
  └cgi-lib.pl:644(フォームデコード用ライブラリ)

・「cgi-bin」ディレクトリは書き込み可能
・「cgi-bin」ディレクトリは拡張子cgiがCGI実行の設定

perlのパスは例によって「/usr/bin/perl」とします。

構成ファイルは以上の通りたったの4つですし、2つのライブラリはすでにmail protected](Bですから作る必要はありません。

さらに記録ファイルも自動生成されますから、作っておく必要はありません(笑)
結局、作るのはスクリプトファイル本体だけということになります。

まずは出力される予定のHTMLを考えてみましょう。

見本ですからとても単純な構成にしておきます。

---------- 例 7 ここから ----------
<HTML>
<HEAD>
<TITLE>GuestBook</TITLE>
</HEAD>
<BODY BGCOLOR="#FFFFFF">
<FONT SIZE="5">GUEST BOOK!</FONT><BR>
<FORM ACTION="./guestbook.cgi" METHOD="POST">
お名前:<BR>
<INPUT TYPE="TEXT" NAME="name" VALUE=""><BR>
メッセージ:<BR>
<TEXTAREA ROWS="5" COLS="70" WRAP="HARD" NAME="mes"></TEXTAREA><BR>
<INPUT TYPE="SUBMIT" VALUE="送信!">
 <INPUT TYPE="RESET" VALUE="書き直し"><BR>
</FORM>

ここに書き込まれたメッセージを埋め込んで表示する。

<HR>
</BODY>
</HTML>
---------- 例 7 ここまで ----------

この例を実際に表示させてみると、こうなります。
(これは動作しません。)

GUEST BOOK!
お名前:

メッセージ:

 
ここに書き込まれたメッセージを表示する。


とても単純なものですが、追記型掲示板として最低限の機能を搭載していますね(^^)

次にそれぞれのメッセージがどういう形式で記録されるか考えましょう。

先ほどのフォームで送信されてくるデータは「name」と「mes」の二つだけです。

現在時刻は以前の「localtime(time)」を使って「YYYY/MM/DD hh:mm」の形式で記録することにしましょう。

そして、最終的には

<HR>
お名前  YYYY/MM/DD hh:mm<BR>
メッセージ本文がずらずらと書かれる。

という形式にすることにします。

結局、実際に表示されるページのイメージは、こういうものになるはずです。

GUEST BOOK!
お名前:

メッセージ:

 

お名前1  YYYY/MM/DD hh:mm
メッセージ本文がずらずらと書かれるのです。

お名前2  YYYY/MM/DD hh:mm
メッセージ本文がずらずらと書かれているようですね。



かなりゲストブック(追記型掲示板)に近づいてきましたね(^^)

表示のイメージが固まってきましたが、少し問題があります。

この形式でどんどんメッセージを足していくと、だんだんとデータが大きくなって、読み込みに時間が掛かってしまうということが起こり得るのです。

ですから、ある程度古い物は別のファイルにしてしまうか、潔く捨ててしまうかということになるのですが、 複雑なことはここの主旨に反するので「潔く捨ててしまう」方式を採用することにします。

有効な書き込みの数なんですが、例ということで、とりあえず20ほどにしておきましょう。

書き込みがあった際そのメッセージを記録する時に、既存メッセージ内では「<HR>」だけの行をカウントして新しい書き込み分以降に 19個だけ記録する、というようにしておけば、最新20個のみ保存という仕組みを実現できます。

でも、もし書き込まれるメッセージ内に「<HR>」があった場合、カウントに失敗するのではないでしょうか?

ご心配にはおよびません(笑)
先ほど決定した仕様で、HTMLに整形してから記録されることになっているので、 メッセージ内に「<HR>しかない行を書き込まれても、 それは記録ファイル上では「<HR><BR>」となるのでカウント対象には含まれないのです。

以上の仕様をふまえた上で、実際にスクリプトファイルを作っていきましょう。

Perlってどう書くの?(5)
CGIの部屋へ戻る
Perlってどう書くの?(7)
 


Copyright 1999-2000 Paddie
私宛のメールは"[email protected]"まで。

// TOPページ  // 掲示板  // MEMOちゃ  // CGIの部屋 //