[ ホーム | 基礎編 | 応用編 ]
[ 更新情報 | 日記 | 掲示板 | 著書 | お祈り | 心の健康 | フィードバック | メール | CatLink ]
[ 豊かな人生のための四つの法則 ]

『Perlで作るCGI入門』応用編

結城 浩




目次

『Perlで作るCGI入門』応用編
結城浩著
ソフトバンクパブリッシング刊
ISBN 4-7973-0581-9
本体価格3000円


はじめに

このページは、結城浩の書籍『Perlで作るCGI入門』応用編のサポートページです。 このページで以下のことができます。

Perlで作るCGI入門』応用編 結城浩 著 ソフトバンク 刊 ISBN4-7973-0581-9

book photo

本体価格3000円



ご利用にあたって

このページにあるファイルは、特に明記されていない限り 結城浩 <hyuki@hyuki.com> の著作物です。 著作権表示を削除・改変しないでください。

このページにあるファイルは、個人・会社を問わず、 また商用・非商用を問わず、自由に改造して使用してかまいません。 無料です。

ただし、ここにあるファイルをそのまま販売することはやめてください。 また改造した場合には、改造した人の著作権表示をファイル中に追加してください。

プログラムを利用したことで何らかの被害をあなたが被ったとしても 結城浩は何の責任もないものとします。 要するに無料・無保証による提供です。 商用のホームページで利用してくださってもかまいません。 ただし、プログラム自体を商品として販売することはやめてください。

また、これは強制ではありませんが、 あなたのホームページから筆者のホームページへのリンクを張ってくださると、 とてもうれしいです。 あなた同様、私も自分のホームページへの来訪者が増えることは とても大きな喜びなのです。 リンクを張るときに許可は不要です。



スクリプトのダウンロード

以下からスクリプトをダウンロードできます。



本書の目次

第1章「CGIのチェックポイント」
   CGIを始める前、またCGIを作成・公開する手順を解説しています。

第2章「CGI型アクセスカウンタ」
   『基礎編』で紹介したSSI型のアクセスカウンタとは異なり、
   SSIが使えないプロバイダでもアクセスカウンタをすぐに設置できます。

第3章「SSI型アクセスカウンタ」
   『基礎編』で紹介したアクセスカウンタの内容に加えて、
   アクセスしたときに「カチリ」とカウントアップのアニメーション
   を行わせる方法についても学びます。

第4章「クッキー型アクセスカウンタ」
   累計で何回アクセスしたかを知るだけではなく、
   その個人が何回アクセスしたかを知ることができます。

第5章「ランダムテキストとランダムイメージ」
   ページにアクセスするたびに異なる内容を表示する仕組みです。

第6章「チャットと応用例」
   シンプルなチャットを作成します。
   チャットの中に画像を埋め込んだり、
   文字の属性をユーザが変更したりする応用例について学びます。

第7章「掲示板」
   削除機能とページ分け機能を持った掲示板を作成します。
   『基礎編』で紹介したシンプルな掲示板とは異なり、
   投稿者が自分の発言を削除したり、管理者が不適切な発言を削除したりできます。
   Perl言語の暗号関数cryptの使い方についても学びます。

第8章「自動登録リンク集」
   ユーザが自分のホームページをリンク集として登録できる「自動登録リンク集」を
   作成します。単なるリンク集としてではなく、
   そこを経由してジャンプした人数がカウントされます。

第9章「私書箱」
   メールを使わずにユーザどうしがメッセージをやりとりできる仕組みです。

第10章「クイズ」
   問題が一つづつ表示され、それにユーザが答えていくクイズを作成します。
   クイズの解答者は得点順に並べられます(ランキング機能)。
   またユーザが自分で問題を追加できることもできます。
   このクイズを教育分野に応用すれば、自学自習用のCGIを作ることができます。

第11章「アンケート」
   設置者が用意した設問に対してユーザの答えを収集する「アンケート」を作成します。
   収集した情報は、ブラウザを使って閲覧することもできますし、
   またCSV形式に変換することで、表計算ソフトやデータベースに取り込むこともできます。

第12章「検索」
   自分のホームページ内にある多数のHTMLファイルから特定の文字列を含むページだけを
   抜き出す仕組みです。

第13章「パスワードによるアクセス制限」
   特定のページにアクセスすることができるユーザをパスワードで制限するCGIです。

第14章「BASIC認証」
   BASIC認証でユーザを制限する方法について解説します。
   これはCGIを使わず、特定のディレクトリ以下のページすべてを守るのに便利な機能です。
   具体的な実例を使って解説します。

第15章「喜びの架け橋となるために」
   ホームページ上のファイルをどのように整理し、統合管理するか、
   また日々のメンテナンスとバックアップをどのように行うかを考えます。
   「よかった探しリース」という企画も紹介します。


デモンストレーション

以下のリンクで、実際の動作を確認することができます。 どうぞ自由にお試し下さい。 詳しい使用方法は書籍をごらんください。


CGI型アクセスカウンタ


SSI型アクセスカウンタ


クッキーカウンタ


ランダムテキスト


ランダムイメージ


シンプルチャット


ページ掲示板


自動登録リンク集


私書箱


クイズ


アンケート


検索ページ


パスワードによるアクセス制限


BASIC認証

これはSSIやCGIではありませんので、 ダウンロードするアーカイブの中には含まれていません。

数字サンプル

アクセスカウンタで使用できる数字のサンプルです。




バグ報告・改善の意見

バグ報告や改善の意見をぜひお送りください。 お送りいただいた内容は今後の著作に利用させていただきます。 どんなに細かなことでも大歓迎いたします。




関連リンク

貢献者リンク
(スクリプトのテストで協力してくださった/くださっている方々へのリンクです)


質問と回答


2000-07-19 : 「ー」や「ポ」が検索できません

質問
if ($line =~ /$form{'key'}/i) { ... }

で、$form{'key'}に「ー(長音)」を含む文字(例えばキーワード)を
指定すると、$lineにどのような文字列が入っているかに関わらず、
処理が停止してしまいます。

また$form{'key'}に「掛」や「ポ」が含まれていると
(例えば、「掛け算」や「ポスト」)、$lineにそれらの文字列が含まれていなくても、
結果は「真」になってしまいます。
対策はどうしたらよいでしょう。
回答
if ($line =~ /\Q$form{'key'}\E/) { ... }

をお試しください。

また /i はこの場合には問題がおきます。
例えばシフトJISで「嘘」の2バイト目は'R'ですが、
「詠」の2バイト目は'r'ですので、
大文字小文字の違いを無視すると、
嘘は詠にマッチしてしまいます。

全体を日本語EUCに統一するという方法もあります。

1999-04-26 : ロックの方法が基礎編と応用編で異なる?

質問
ホームページから入手した基礎編のロックの方法と、
応用編の中に記述されているロックの方法が異なっています。

基礎編のスクリプトでは、
flockをevalで評価したあと、$@は
flockが使えるか、使えないかの検出のみに使用し、
もう一つ、$lockresultで使用中かどうかを検出しているようですが、

応用編では、flockをevalで評価したあと、$@を読んで
ミスを検出するようになっています。

またflockに渡している引数も異なっているようです。
どちらを使えばいいのでしょうか?
回答
基礎編のロックは、no wait のロックを使い、
リトライしてロック解除を待ちます。
それに対して応用編のロックは、waitのロックを使い、
戻ってきたときにはロックされている状態になります。
ですから、どちらを使っても基本的には問題ありません。
no waitになるか、waitになるかの区別が引数の数値で
区別されているのです。

1999-04-26 : 掲示板に自分だけが書けるようにするには?

質問
pagebbs.cgiを使って、
特定のメンバーだけが書き込みできるニュース掲示板を作ろうと思いました。
つまり入力フォーム部分とテキスト表示部分を分離させて、
入力フォームは非公開にしておこうと思ったのです。
スクリプトをいじって試したのですが、うまくいきませんでした。
何かアドバイス願えますか。
回答
もし、書き込むユーザと読むユーザを分けたいのであれば、
データファイルを共有する2つのスクリプトにすればどうでしょう。
例えば、
writebbs.cgi と readbbs.cgiのようにわけて、
readbbs.cgiの方では、書き込みフォームの部分を削除してしまうのです。
(ファイル名は適当に変えてくださいね)

1999-01-13 : 掲示板に認証の機構を入れるには?

質問
楽しくタメになる本で感謝しております。
認証についての質問なのですが、CGIによる認証そのものは
良く理解できました。
認証してみせるファイルがHTMLであれば問題ないのですが
認証後、掲示板のページへ行きたいとなると
最初に表示されるページはCGIファイルということになりますが
そうすると画面にBBSのCGIスクリプトが出てきてしまいます。
回答
書籍のご購入感謝します。
ご質問の場合には、BBSのCGIそのものに認証機構を組み入れるのが楽でしょう。
結城のCマガジン連載のサンプルプログラムも参照下さい。

http://www.hyuki.com/cmcgi/

第8回:プライベートチャット (1998年12月号)
第9回:プライベート掲示板 (1998年1月号)

1998-10-27 : jcode.pl : エラーで動かない

質問
unmatched () in regexp at jcode.pl line 504.

という表示が出て動きません。
jcode.plには手を加えていないのに、なぜでしょうか?
回答
JPerlを使っていませんか?
JPerl では jcode.pl は使えません。
日本語対応されていない Perl をお使い下さい。

1998-10-27 : search.cgi : $mycmd をどうして &norm_input するのか

質問
$mycmdの値は 'search' か '' しかないはずなのにどうして &norm_input を
通しているのでしょうか?
回答
確かに、$mycmd は 'search' か '' ですから、
&norm_inputする必要はありません。
このあたりは割合に機械的に作っています。
本来は、画面に表示する変数だけ &norm_input すればよいと思います。

ただし、
CGI作成者の意図としては定数しか入ってこないことがわかっている
変数であっても「悪意のユーザが攻撃をかけてくる」ことを考えて、
&norm_inputをかけておく方が安全である、ということは注意しておいてください。

1998-10-16 : 文字化けの解決方法

質問
スクリプトは動くのだけど、全体が文字化けします。
どうしたらいいですか?
回答
全体が文字化けするのは、文字コードが一致していないからです。

(1) スクリプトファイル
(2) データファイル
(3) スクリプト中の $kanjicode

をすべてシフトJISコード(sjis)か日本語EUCコード(euc)にしてください。

1998-10-16 : AN HTTP Server でエラー

質問
AN HTTP Serverでページ掲示板を動かすと
jcode.plで
tr : both end of  - should be kanji at jcode.pl line 250.
というエラーになります。
jcode.plを使わないスクリプトは動きます。
なぜでしょうか?
回答
もしかして jperlを使っていませんか?
jcode.plを使う場合、
Perl処理系は日本語対応していない perl を使ってください。

1998-08-06 : p.27 : CGIをトップページにしたい

質問
応用編 p.27 にCGIをトップページにする話題が書かれていますが、
たとえば、
http://www.abc.ac.jp/~hanako/home.cgi
のように必ず CGI ファイル名まで書かなければならないのでしょうか。
http://www.abc.ac.jp/~hanako/
と書くだけでCGIを動かしたいのですが。
回答
サーバの設定によってはできます。
たとえば、RIMNETのstドメインでは、
ファイル名が index.cgi の場合にはファイル名まで指定しなくても
実行されるようです。あなたのサーバの設定を確認してみてください。
(プロバイダに問い合わせるか、index.cgiにして試してみましょう)

2000-02-28 : search.cgi : HTMLのサーバとCGIのサーバが違う場合

質問
search.cgiで、検索対象HTMLファイルのあるサーバと、
CGIのあるサーバがまったく異なります。
どのようにしたらいいのでしょうか。
回答
CGIのサーバからHTMLのサーバ上のファイルが本当にオープンできない場合には、
search.cgiは使えません。ご了承ください。

ただし、サーバが異なっているように見えても、
適切なパスを選択することによって、HTMLがCGIからアクセスできる場合もあります。
実際にどうなのかはプロバイダに確認するか、ご自身で調査ください。
その場合の修正は次の質問を参考にしてください。

1998-08-06 : search.cgi : HTMLの場所とCGIの場所が違う場合

質問
search.cgi で、検索対象HTMLファイルのディレクトリと、
CGIのあるディレクトリがまったく別のところにあります。
どのようにしたらいいのでしょうか。
回答
以下のようにしてください。
URLの基準を表す $baseurl だけではなく、
あらたにディレクトリの基準を表す $basedir を設けます。
そして、$baseurl に対応するディレクトリ位置を $basedir に記述し、
search.txt には $basedir からの相対位置を記述します。

たとえば、
HTMLのあるディレクトリを、
/home/hanako/public_html/
として、そのURLが
http://www.abc.ac.jp/~hanako/
であるとします。
そのとき、

# ↓(必ず修正)検索対象ディレクトリの基準位置に対応する場所(ディレクトリ,最後のスラッシュ不要)
$basedir = '/home/hanako/public_html';
# ↓(必ず修正)検索対象ディレクトリの基準位置に対応する場所(URL,最後のスラッシュ不要)
$baseurl = 'http://www.abc.ac.jp/~hanako';

とし、
search.txtには $basedir からの相対位置を指定します。

そして、以下の修正をします。

if (!opendir(DIR, "$dir")) {
↓
if (!opendir(DIR, "$basedir/$dir")) {

if (!open(PAGE, "$dir/$file")) {
↓
if (!open(PAGE, "$basedir/$dir/$file")) {
以下は読者からの情報です。
WebARENAの場合、/cgi-bin/以外にはcgiを設置できないのですが、
『 1998-08-06 : search.cgi : HTMLの場所とCGIの場所が違う
場合』を参考にして動かすことができました。

$basedirに関しては説明のように
$basedir = '/home/○○○';
にしてみたのですが動かず
$basedir = '../home/○○○';
としたところ、めでたく動きました。

1998-08-06 : 全体 : Netscape Navigator 2.0 で文字化け

質問
Netscape Navigator 2.0 で cgibook2 のページが文字化けします。
どうしてですか?
回答
応用編の付録に書いてありますが、
おそらく <META> タグの charset=SHIFT_JISのせいだとおもいます。
この <META>タグをなくせば、正常に表示されます。

1998-08-06 : jcode.pl : warningが出る

質問
jcode.pl,v 2.6 を使うと、
ハッシュに代入する配列が奇数個の要素を持つという警告が発生します。
どうしたらいいですか?
回答
ある読者から、
($h2z_high = $h2z = <<'__TABLE_END__') =~ tr/\021-\176/\221-\376/;
↓
($h2z_high = $h2z = <<'__TABLE_END__') =~ tr/\041-\176/\241-\376/;
と変える事で回避できるという報告をいただいています。

なお、エディタの設定などで jcode.pl 中のタブ文字がスペースに
置き換わっているとご指摘の症状が発生するようです。



誤りと訂正


1998-10-29 : p.205 : &sort_txtが正しく動かない

場所
p.205 のサブルーチン &sort_txt
誤り
プログラム全体のミス。正しく並べ替えられない。
(読者からの指摘による)
訂正
sub sort_txt {
    local($m);
    local(@tmp, @newtxt, @rest);
    foreach $m (@txt) {
        ($id,  $count, $title, $page, $desc, $name, $mail, $mine) = split(/,/, $m);
        push(@tmp, sprintf("%10d,$m", $count));
    }
    foreach $m (reverse sort @tmp) {
        ($count, @rest) = split(/,/, $m);
        push(@newtxt, join(',', @rest));
    }
    @txt = @newtxt;
}
(第2版で修正)

1998-09-21 : cgicount, ssicount, percount : 昨日のアクセスカウントが1多くなってしまう

訂正
#今日初めてのアクセスか?
…
if ($yesterday ne $lastday) {
    #昨日はアクセスしなかった
    $yesterdaycount = 0;
} else {
    $yesterdaycount = $todaycount - 1;
}
…
(2000年7月19日以降のアーカイブで修正)
(書籍は第2版で修正)

1998-08-05 : p.454 : クッキーの月計算

場所
p.454 のサブルーチン &get_expire_date_string
誤り
$mon++;
訂正
(この行削除)
(1998年8月12日以降のアーカイブで修正)
(第2版で修正)

1998-08-05 : search.cgi : サーバエラーになる場合の対処法

検索は非常に時間がかかるため、サーバがCGIの実行を中断してしまう場合があります。
そのときでも「そこまでの検索結果」を表示させるためには、
search.cgi の中の do_search の最初の方にある以下の部分を修正します。
これでスクリプトの出力がバッファリングされなくなります。
修正前
sub do_search {
    # バッファリングをやめる場合
    # $| = 1;
修正後
sub do_search {
    # バッファリングをやめる場合
    $| = 1;
(1998年8月12日以降のアーカイブで修正)
(第2版で修正)

1998-08-03 : enq.cgi : 結果の書き込みが異常になるバグ

誤り
    # 結果ファイルのオープン
    &lock_open(RESULT, ">>$resultfile");
    print RESULT $oneline;
    &unlock_close(RESULT);
訂正
    # 結果ファイルのオープン
    &lock_open(RESULT, "+<$resultfile");
    seek(RESULT, 0, 2);
    print RESULT $oneline;
    &unlock_close(RESULT);
(1998年8月12日以降のアーカイブで修正)
(第2版で修正)


修正履歴

2000-12-14
    ・書籍購入のリンク更新

2000-07-19
    ・アクセスカウンタ:アクセスカウンタで昨日のカウント数が1ずれるバグを修正。

2000-02-06
    ・アーカイブファイル中のドメイン名をhyuki.comに変更

1998-08-12
    ・pagebbs.cgi, pobox.cgi : クッキー有効期限が一月ずれるバグを修正。
    ・search.cgi : バッファリングなしをデフォルトにした。
    ・enq.cgi : データが正しく保存されないバグを修正。
    ・jcode.pl : 以前の版はタブがスペースに置換されていたので、再度SRAから入手。

1998-07-22
    ・このページを一般公開。

1998-05-22
    ・クッキー関連バグ修正。

1998-05-21
    ・書籍の内容にあわせて全体修正。一般公開準備。

1998-03-21
    ・*.cgi, *.pl プロバイダによって常にロックがかかってしまうバグの修正。
    ・pagebbs.cgi Fix bug: $must_name -> $must_mail.
    ・pagebbs.cgi Fix error msg.
    ・その他

1998-03-18
    ・quiz.cgi 得点として正答数も表示。

1998-03-17
    ・カウントアップするアクセスカウンタ追加
    ・simchat.cgi 名前中の半角スペースに対応、終了時の名前色バグ修正、他。
    ・cgirang.txt, ssirang.txt を数字表示に変更。

1998-03-15
    ・enq.cgi の MIME タイプ
    ・lock_open の大幅修正
    ・$uselock = 1 にした
    ・その他こまごま変更


リンクはご自由に。 フィードバックはお気軽に。
Copyright (C) 1997,1998,1999 by Hiroshi Yuki.
All rights reserved.
結城浩 <hyuki@hyuki.com>
http://www.hyuki.com/
http://www.hyuki.com/cgibook2/