好みの改造、初歩
あなたの好みで変更出来る部分が幾つかあります。
| ############
# 基本設定 # ############ : : $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 = 'あなたの@メール.アドレス'; |
もしあなたのプロバイダがsendmailを備えていない場合、あるいはあなたがその使用を許可されていない場合、またはメールを受け取りたくない場合、メール関係のこの二行には手を触れないで下さい。$addrssの頭に#がついているとスクリプトのメール送信機能が作動しません。
| $wait = 3; |
| $max = 512; |
| $dname = "ゲスト";
$dttle = "こんにちは"; |
| $arch = "A-";
$daug = "D-"; |
| $admin = "admin";
$init = "init"; |
$initは最初の一回しか使われません。掲示板設置の時です。実際の使い方は管理ページを呼び出すURLにさらに=と$initの値を続けて入力します。何も変更していなければhttp://あなたのホームページ/bbs.cgi?admin=initになるはずです。
| $dlck = 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 |
掲示板型紙には掲示板の上半分しかありませんが、下半分にはゲストからの書き込みが挿入されCGIにより自動的に作成されるのでここでは必要ありません。
次はゲストのメッセージが掲示板に書込まれる時のひな形です
| ##############
# 投稿受付け # ############## : : ### 新記事 ### $msg = <<"NEW_DATA"; <hr> <b>$data{'name'}</b> ($posted) <p> <b>$data{'title'}</b> <p> $data{'comments'} NEW_DATA |
$ではじまる変数の綴りを変更しないこと。もちろん変更に際してはHTMLの文法を尊重します。
娘ボード
| ############
# 娘板作成 # ############ : : <HTML> <HEAD> <TITLE>DaughterBoard</TITLE> </HEAD> <BODY BGCOLOR="lightpink"> <B>$data{'title'}</B> <P> $data{'comments'} </BODY> </HTML> |
さらにprint NDF <<"HTML_DAUG";とHTML_DAUGの間だけ改造すること、HTMLの文法を守ることも同じです。
さらに、娘ボードが出来た時は母ボードに娘ボードへのリンクが追加されます。
| ############
# 娘板作成 # ############ : : ### 娘板へのリンク ### $data{'comments'} .= "<p><a href='$file'><i>あと$cutoffバイトあります。ここをクリックして下さい。</i></a>"; |
「ありがとうございました」
| ################
# ありがとう文 # ################ : : <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> |
| <BODY BGCOLOR="pink">
<CENTER><H1>アーカイブその$afno</H1></CENTER> $star番から$enar番の記事 <BR><A HREF="$boardurl"><B>掲示板へ戻る</B></A> |
アーカイブその2101番から200番の記事 掲示板へ戻る |
アーカイブページが作成された時は掲示板からアーカイブへのリンクも作られます。
| ####################
# データ編集出力 # #################### : : ### アーカイブへリンク ### print TEMPF "<!--arch-->\t<HR><A HREF='$arch'><B>もっと古い記事があります。ここをクリックして下さい。</B></A>\n"; |
エラーメッセージ
| ############
# エラー文 # ############ : : <HTML> <HEAD> <TITLE>エラー!</TITLE> </HEAD> <BODY> <B>お客様へ</B> <P> 以下の理由により命令は実行されませんでした。 <BR>$_[0] <BR>$_[1] <BR>$_[2] <BR>$_[3] </BODY> </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> |
二番目はそれぞれの記事を削除するかどうかです。<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> |
| ##################
# データ編集入力 # ################## : : $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> |