このページを読む前に
はじめてホームページを作ったばかりの人向けのアドバイスも読んで必須設定項目に必要な変更をします。スクリプトの改造は自由ですが、まず変更を加えないCGIが動作することを確認してからにしましょう。第一行目(Perlのパス)を必ずプロバイダの指示に従って変更することやsendmailのパス、メールアドレス、必要なら文字コードの指定$ccodeやディレクトリの指定$basedirもして下さい。

好みの改造、初歩
あなたの好みで変更出来る部分が幾つかあります。
############
# 基本設定 #
############
     :
     :
$smpath = "/usr/sbin/sendmail";
#$addrss = 'あなたの@メール.アドレス';
$wait = 3;
$max = 512;
$dname = "ゲスト";
$dttle = "こんにちは";
$arch = "A-";
$daug = "D-";
$admin = "admin";
$init = "init";
$dlck = 10;

新規投稿がある度にメールで通知を受けたい場合はsendmailのパス(サーバのどこにsendmailというプログラムがあるか)をプロバイダに問い合わせて下さい。
############
# 基本設定 #
############
     :
     :
$smpath = "/usr/sbin/sendmail";
#$addrss = 'あなたの@メール.アドレス';
そして/usr/sbin/sendmailをプロバイダのsendmailパスで置き換え、$addrssの頭にある#を削除します。あなたの@メール.アドレスはあなたのメールアドレスに変更します。メールアドレスは一重引用符の中に記入すること。Perlは一重引用符と二重引用符を区別しており、@は二重引用符の中では特別の意味を持っています。(@その他を二重引用符の中で使うにはその直前に"\"を加え\@とする必要があります。)

もしあなたのプロバイダがsendmailを備えていない場合、あるいはあなたがその使用を許可されていない場合、またはメールを受け取りたくない場合、メール関係のこの二行には手を触れないで下さい。$addrssの頭に#がついているとスクリプトのメール送信機能が作動しません。

$wait = 3;
の数字はゲストの書込み終了後、「ありがとうございました」のメッセージが表示されてから何秒後に掲示板に戻るかを設定します。数字は引用符に入れなくて良いです。直ちに掲示板に戻るようにするには$wait = 0;で0秒後に掲示板に戻ります。掲示板に戻らないようにするには頭に#をつけて#$wait = 3;とします。

$max = 512;
の数字は母ボードに記入される記事の最大バイト数を設定します。これ以上長い記事は尻尾を切られてしまいます。記事の全文は新造した娘ボードに収容され母ボードからのリンクが貼られます。

$dname = "ゲスト";
$dttle = "こんにちは";
はゲストが何も書込まずに送信ボタンを押した場合のゲストの名前、件名を設定します。

$arch = "A-";
$daug = "D-";
はアーカイブと娘板のファイル名を決定します。最初のアーカイブはA-1.html、二番目はA-2.html等となります。もしA-の値をarchives_とするとアーカイブのファイル名はarchives_1.html等になります。同様に最初の記事の娘板はD-1.htmlに、二番目の記事の娘板はD-2.htmlになります。item_に変更すると娘板のファイル名はitem_1.html等になります。

$admin = "admin";
$init = "init";
$admin管理用ページを呼び出すURLを決めます。実際のURLではCGIのURLに続けて?$adminを入力します。例えば$admin = "tool";と設定し直したら、あなたの管理用ページはhttp://あなたのホームページ/bbs.cgi?toolです。

$initは最初の一回しか使われません。掲示板設置の時です。実際の使い方は管理ページを呼び出すURLにさらに=$initの値を続けて入力します。何も変更していなければhttp://あなたのホームページ/bbs.cgi?admin=initになるはずです。

$dlck = 10;
は10秒より古い二重書込み防止ファイルlock.datを発見して取り除きます。(二重書込み防止ファイルは、もしも全く同時に二つの記事が投稿された場合、その二つが掲示板上でぶつかってファイルを壊してしまうのを防ぐための物で、何の問題もなければ書込み終了と同時にunlock.datに変更されます。しかしエラーが起きて書き込み防止状態が残ってしまうと、誰も書込み出来ません。)10秒より古い書き込み防止ファイルはエラーとみなして自動的に取り除きます。極端に古くて遅いサーバでもなければこの程度のCGIは10秒もあれば終了しているはずですが、10秒で足りない場合は少し長めにします。

ところでflockというのを御存知でしょうか。flockがあなたのサーバで使えるかどうかプロバイダに問い合わせてみて下さい。もし使えるなら二重書き込み防止はflockを使いましょう。$dlckの頭に#を付けて#$dlck = 10;とするとflockが有効になります。flockならエラーでロックが掛ったままになることがないので何秒後に解除するという指示も必要なくなります。

ちなみに二重書込み防止ファイルは次のアーカイブが何番目のアーカイブになるのか、その数字の管理もしています、ついでに。間違って削除してしまったら最後のアーカイブに1を足した数字を書き込んだunlock.datをアップロードしておいて下さい。

その後に続く$erro0から$erro14まではエラーが起きた時の表示です。

HTML文書
CGIの中には何ケ所もHTML文書が隠されています。これらは比較的安全に変更することができます。ウェブページ作成ソフトに読込んで加工後、ソースコードを開いて必要部分だけ取り出し、CGIスクリプトに戻してやるならHTMLの知識も最小限のもので間に合います。

Perlをちゃんと勉強するまで$で始まる変数の名前は変更しないで下さい。不具合の原因になります。もしもPerl内部のHTML部分でドルマークを表示させたい場合は全角文字$を使うか、\を併記して半角文字\$と表記するかして下さい。@を表示するのも全角文字@または半角文字\@を使います。したがってメールアドレスはyour\@mail.adderssのようになります。\もPerlの中に表示させるには全角文字を使用するか\\とします。さらに二重引用符の"もPerlの中では特別の意味を持っていますので全角文字を使って”とするか\"としないと正しく表示されないことがあります。(半角文字の\は英文表記では\になっているはずですが、日文表記では¥になっていると思います。これらは同じものです。)

まずは掲示板自体です
############
# 基本設定 #
############
     :
     :
### 掲示板型紙 ###
$head = <<"BOARD_HEAD";
<HTML>
<HEAD>
<META HTTP-EQUIV = "Content-Type" CONTENT = "text/html; CHARSET=EUC">
<TITLE>DoubleMessageBoard</TITLE>
</HEAD>
<BODY BGCOLOR="lightgreen">
<FORM ACTION="$bbs_cgi" method="POST">
<CENTER><H1>DoubleMessageBoard</H1>
<H2>日本語版</H2></CENTER>
<TABLE>
<TD ALIGN=right>
お名前:<BR>メール:
</TD>
<TD ALIGN=left>

<INPUT TYPE="text" NAME="name" SIZE=30><BR>
<INPUT TYPE="text" NAME="email" SIZE=30>
</TD>
</TABLE>
件 名:
<INPUT TYPE="text" NAME="title" SIZE=40>
<P>
コメント(HTMLタグは使えません):<BR>

<TEXTAREA NAME="comments" cols=80 rows=10 wrap="virtual"></TEXTAREA>
<P>
<INPUT TYPE=submit VALUE="送信">
<INPUT TYPE=reset VALUE="やり直し">
</FORM>
BOARD_HEAD
入力フィールド<INPUT>とテキストエリア<TEXTAREA></TEXTAREA><FORM ... ></FORM>の間にある分にはどこに置いても構いません。入力フィールド中のSIZEの値やVALUEの値を変えることも御自由にどうぞ。しかしNAMEの値(NAME="comments"など)を変えてはいけません。

掲示板型紙には掲示板の上半分しかありませんが、下半分にはゲストからの書き込みが挿入されCGIにより自動的に作成されるのでここでは必要ありません。

次はゲストのメッセージが掲示板に書込まれる時のひな形です
##############
# 投稿受付け #
##############
     :
     :
### 新記事 ###
$msg = <<"NEW_DATA";
<hr>
<b>
$data{'name'}</b> ($posted)
<p>
<b>
$data{'title'}</b>
<p>
$data{'comments'}
NEW_DATA
ゲストの書き込みは$msg = <<"NEW_DATA";NEW_DATAの間に挟まれた書式に従って処理され掲示板に書き込まれます。$data{'name'}には花子とかいったゲストの名前が入ります。もしゲストにメールアドレスがある時は$data{'name'}にはそれも含まれ<a href="mailto:hanako@mail.address">花子</a>のようになります。$postedは記事が投稿された時刻です。$data{'title'}は記事の件名。そして$data{'comments'}が記事の本文です。

$ではじまる変数の綴りを変更しないこと。もちろん変更に際してはHTMLの文法を尊重します。

娘ボード
############
# 娘板作成 #
############
     :
     :
<HTML>
<HEAD>
<TITLE>DaughterBoard</TITLE>
</HEAD>
<BODY BGCOLOR="lightpink">
<B>$data{'title'}</B>
<P>
$data{'comments'}
</BODY>
</HTML>
記事が長い場合DoubleMessageBoardはその全文を娘ボードに記述します。これがその書式です。上で説明した母ボードへの書込み同様$data{'name'}$data{'email'}$posted$data{'title'}$data{'comments'}を使用することが出来ます。

さらにprint NDF <<"HTML_DAUG";HTML_DAUGの間だけ改造すること、HTMLの文法を守ることも同じです。

さらに、娘ボードが出来た時は母ボードに娘ボードへのリンクが追加されます。
############
# 娘板作成 #
############
     :
     :
### 娘板へのリンク ###
$data{'comments'} .= "<p><a href='$file'><i>あと$cutoffバイトあります。ここをクリックして下さい。</i></a>";
<a href='$file'></a>の組み合わせがリンクです。<p><i>あと$cutoffバイトあります。ここをクリックして下さい。</i>の部分が変更可能です。$cutoffは母ボードに登載し切れなかった部分の記事の大きさです。半角二重引用符は全体に掛かる形で既に使われていますから"をその中で使用することは出来ません。引用符を使いたい時は一重引用符、全角ニ重引用符または\"を使います。

「ありがとうございました」
################
# ありがとう文 #
################
     :
     :
<HTML>
<HEAD>
<TITLE>ありがとうございました。</TITLE>
</HEAD>
<BODY>
<BR><H1>
御利用者さまへ
</H1><H2>
CGIはあなた様から命じられた作業を無事終了しました。再び掲示板へ御案内いたします。
<BR>m(. .)m
</H2>

</BODY>
</HTML>
これはゲストが投稿後に見る画面です。太字の部分は自由に変えて下さい。

アーカイブページ
####################
# データ編集出力 #
####################
     :
     :
### アーカイブ ###
     :
     :
<HTML>
<HEAD>
<TITLE>アーカイブ</TITLE>
</HEAD>
<BODY BGCOLOR="lightgreen">
<CENTER><H1>DoubleMessageBoardアーカイブ</H1></CENTER>
<A HREF="$boardurl"><B>掲示板へ戻る</B></A>
これはアーカイブのページの上の方です。自分の好みのタイトルや背景色に変更出来ます。$boardurlは掲示板のURLです。アーカイブには$star$enarを使うことができます。$starはこのアーカイブページの一番最初の記事の番号です。$enarは一番最後の番号になります。また、$afnoはこのページがアーカイブの何ページ目に当るかです。例えば101番から200番までアーカイブにするとして、すでにアーカイブの1ページ目が存在するならば、次ぎは2ページ目ですから
<BODY BGCOLOR="pink">
<CENTER><H1>アーカイブその$afno</H1></CENTER>
$star番から$enar番の記事
<BR><A HREF="$boardurl"><B>掲示板へ戻る</B></A>
という書式を採用していると

アーカイブその2


101番から200番の記事
掲示板へ戻る
と表示されます。

アーカイブページが作成された時は掲示板からアーカイブへのリンクも作られます。
####################
# データ編集出力 #
####################
     :
     :
### アーカイブへリンク ###
print TEMPF "<!--arch-->\t<HR><A HREF='$arch'><B>もっと古い記事があります。ここをクリックして下さい。</B></A>\n";
<HR><B>もっと古い記事があります。ここをクリックして下さい。</B>の部分は変更出来きますが他は変更できません。ここでも半角二重引用符が全体に掛かる形で既に使われていますから"をその中で使用することは出来ません。引用符を使いたい時は一重引用符、全角ニ重引用符または\"を使います。

エラーメッセージ
############
# エラー文 #
############
     :
     :
<HTML>
<HEAD>
<TITLE>エラー!</TITLE>
</HEAD>
<BODY>
<B>お客様へ</B>
<P>
以下の理由により命令は実行されませんでした。

<BR>$_[0]
<BR>$_[1]
<BR>$_[2]
<BR>$_[3]
</BODY>
</HTML>
スクリプトの一番下の方にあるエラー文です。何か問題があったときゲストにそれを知らせるためのものです。$_[0]から$_[3]までは変更しないで下さい。ここには一番最初の# 基本設定 #のところで決められた標準のエラーメッセージやPerl自身のエラーメッセージ、CGIの何行目でエラーが起きたのかが代入されます。


他にもスクリプト中にHTML文書がありますが、それは管理人であるあなたのための管理ページ用のものです。変更したければこれも変更出来ます。

掲示板編集用のページ
##################
# データ編集入力 #
##################
     :
     :
<HTML>
<HEAD>
<TITLE>ウェブマスター専用ページ</TITLE>
</HEAD>
<BODY>
<CENTER>
<H1>ようこそ。これは管理作業用ページです</H1>
<H2>ウェブマスター以外の入室はお断りします</H2>
くれぐれもハッキングとかしないでね m(..)m
</CENTER>

<FORM ACTION="$bbs_cgi?$admin" method="POST">
     :
     :
print <<"HTML_BODY";
<P>
$2
<P>
<B>記事No.
$1</B><BR>
<INPUT TYPE="checkbox" NAME="$1" VALUE="D">この記事を削除する
HTML_BODY
     :
     :
print <<"HTML_FOOT";
<P><HR><HR>
No.
<INPUT TYPE="text" NAME="STDE">からNo.<INPUT TYPE="text" NAME="ENDE">までの記事を削除する
<P>
No.
<INPUT TYPE="text" NAME="STAR">からNo.<INPUT TYPE="text" NAME="ENAR">までの記事を古文書として別途保管する
<P>
合い言葉:
<INPUT TYPE="password" NAME="pswd"><BR>
<INPUT TYPE="submit" NAME="submit" VALUE="以上の通り処理する">
<INPUT TYPE="reset" VALUE="やり直し">
</FORM>
<BR><A HREF="$boardurl">何もせず掲示板に戻る</A>
<P>
<SMALL>処理の優先順位:CGIはそれぞれの記事について、まず<B>この記事を削除する</B>がチェックされているか、次ぎに連番での削除範囲に指定されているか、最後に古文書へ入れる範囲に含まれているかの順で判断して処理し、どれにも含まれない記事は掲示板に残されます。</SMALL>

</BODY>
一番上が編集用ページの頭部です。最後の行の<FORM ACTION="$bbs_cgi?$admin" method="POST">は変更しないこと。それ以外は変更自由。

二番目はそれぞれの記事を削除するかどうかです。<INPUT TYPE="checkbox" NAME="$1" VALUE="D">は必ずどこかになければなりません。$1$2はそれぞれ記事の番号と記事そのものです。その他の字句はどのようにでも変更出来ます。

最後のものは一連の記事をまとめて削除する、あるいはまとめてアーカイブ化するための<INPUT TYPE="text" NAME="STDE"><INPUT TYPE="text" NAME="ENDE"><INPUT TYPE="text" NAME="STAR"><INPUT TYPE="text" NAME="ENAR">とパスワード入力項目<INPUT TYPE="password" NAME="pswd">を含みます。これらは場所を少々移動することはできますが内容を変更することはできません。

サブミット(送信)とリセット(やり直し)の項目についてはその値、以上の通り処理するやり直しが他の字句に変更可能です。全ての入力項目は必ず</FORM>より上に置きます。

パソコンを他の人と共用している場合などでは管理作業用ページにアクセスした形跡を残しておくことはセキュリティー上望ましくありません。作業終了後にブラウザのキャッシュをクリアして下さい。後で誰かがブラウザの「戻る」のボタンを押してもデータは消えているはずです。毎回同じことをするのが面倒ならHTML文書のはじまる少し前print <<"HTML_HEAD";Content-type: text/htmlの間に
##################
# データ編集入力 #
##################
     :
     :
print <<"HTML_HEAD";
Cache-Control: no-cache
Pragma: no-cache

Content-type: text/html

<HTML>
<HEAD>
<TITLE>ウェブマスター専用ページ</TITLE>
とすると自動でキャッシュが消えます。一定時間後、例えば10分後にキャッシュを消したい時はprint <<"HTML_HEAD";を挟んでその上下に
##################
# データ編集入力 #
##################
     :
     :
$exprs = gmtime(10*60 + time);
$exprs =~ s/ / 0/;
($wday,$mon,$mday,$hms,$year) = split(/ /,$exprs);

print <<"HTML_HEAD";
Expires: $wday, $mday $mon $year $hms GMT
Content-type: text/html

<HTML>
とします。15分にしたければ最初のところを$exprs = gmtime(15*60 + time);に変えます。

Click Here