
【CGI アクセスカウンタ】
【かうんたーCGIのソース(Perl言語)】
//-----------------------------------------------------------
#!/usr/local/bin/perl
################################################################################
# ■CGIにプログラムの読み方の豆知識
# ・行頭の『#!/usr/local/bin/perl』はUnixマシン以外では無視されます。
# ・変数に関しては宣言文が不要。『 = YYY』で代入を行う。
# ・『./』は同一ディレクトリ。
# ・『
』は改行を示す。
# ・『+<
# ・『localtime(time)』は時間を『秒分時 日月年』の並びで『現地時間』で取得するの意。
# ・年の起点…『1900年』
# ・月の起点…『0』…が『1月』を意味する。
# ・コメント以外の行の最後には『;』が必ず必要。
# ・『ne』は『<>』と同意。
# ・『#』はコメントの意。
# ・『""』と『''』は文字列を表す。
# ・プロシジャーは『{}』で囲まれた部分単位。
# ・『&サブルーチン名;』でファンクションの呼び出し。
# ・『&』の読み方は…アンパサント
# ・サブルーチンの構成…『sub サブルーチン名 { Perl文 }』
# ・Perl言語ではパラメーターがないときは『()』を省略できる。
# ・『++』で変数に1加えるの意。
# ・『 += 増減値』加算して代入の意。
# ・『<<』ヒア文字列機能の記号。(解説;H)
# ・配列の書き方…『 [0から始まる添え字]』
# ・『=~』…パターンマッチ演算子(曖昧検索と同様)。
# ・『*』
# ・『eval』
# ・『!』
# ■構文
# ・『for (変数 = 初期値; 継続条件 ;増減値)』
################################################################################
################################################ A
###■設定部分
### カウンタファイル名(.datと同じ)
= "./cntcgi.cnt";
### HTMLファイル名(特殊タグ<CNTtag>の入ったもの)
= "./cntcgi.html";
### 置き変えされる特殊タグ名
= '<CNTtag>';
### ロック関連。# ロックを使うなら1。うまく動かないとき0にする。
= 1;
################################################ B
###■HTTPヘッダ部分
###"
"でヘッダ部分の終了を認識させる。
print "content-type: text/html
";
print "
";
################################################ C
###■データ・カウンタファイルのオープン
###『show_page』はサブルーチン名。
###『OUT』というファイルハンドルにオープンされたファイルデータを格納。
if (!open(OUT, "+<")) {
= '[not found]';
&show_page;
exit(0);
}
################################################ D
###■ファイルのロック
###『lock_file』はサブルーチン名。
if (!&lock_file(OUT)) {
= '[lock error]';
&show_page;
exit(0);
}
################################################ E
###■カウンタ値の取得
###『seek』でファイルの先頭に移動(rec.movefirstと同じ)。
###『OUT』のデータを一行ずつ読み込み
seek(OUT, 0, 0);
= 1 + ;
= 0 + ;
= 1 + ;
= ;
################################################ F
###■年月日の取得
( , , , , , ) = localtime(time);
###月は『0』が1月なので、表示用に1を加える。
++;
###年の起点が1900なので、表示用にその数値を加える。
+= 1900;
###年月日の並びに整形。
= "--
";
################################################ G
###■初めてのアクセスかどうかの判断
###上で整形した『today』とカウンタファイルの4行目に入っている『lastday』の比較。
if ( ne ) {
( , , , , , ) = localtime(time - 24*60*60);
++;
+= 1900;
= "-=
";
if ( ne ) {
###昨日のアクセスは0件
= 0;
} else {
###昨日のカウンタファイルのtodaycnt-1をyesterdaycntに入れる。
###『todaycnt』はすでにEで1加算されているので、それを除算する。
= - 1;
}
= 1;
= ;
}
################################################ H
###■ファイルのカウンタ値の更新
seek(OUT, 0, 0);
print OUT "
";
print OUT "
";
print OUT "
";
print OUT "";
&unlock_file(OUT);
close(OUT);
################################################ H
###■HTMLへの表示
###『<<』ヒア文字列機能の記号。
###通常の文字列表記の前に『<<』が付くと、次行から
###印譜(ここではend_msg)が出てくるまでの文字が二重引用符("")の中に収まる。
###ここでは豆知識にあった『行の最後には『;』が必ず必要』は適用されない。
= <<"end_msg";
昨日は 回。
今日は 回。
通算 回のアクセスがありました。<br>
今日の日付は です。
end_msg
&show_page;
###終了
exit(0);
#############################################################################
## (ここから下はサブルーチン) ###############################################
#############################################################################
################################################ I(sub)
###■サブルーチン:&show_page
###『@html = ;』でHTMLファイルの内容を配列『@html』に読み込みます。
###配列の要素は行数に相当。
sub show_page {
###HTMLファイルの読み込み
if (!open(HTML, "")) {
print "<html><H1><H1></html>
";
exit(0);
}
@html = ;
close(HTML);
###HTMLファイルの読み込み
###『for (変数 = 初期値; 継続条件 ;増減値)』
###『 < @html;』の時の@htmlは要素の数。つまり『@html = 行数』。html文のテキストではないので注意。
###スカラーコンテキスト
###『=~』…パターンマッチ演算子(曖昧検索と同様)。
###if文は『もし文字中に該当文字()を見つけたら()と置き換える』という内容。
###『s/置き換え前の文字列/置き換え後の文字列/gi』
###s…置換(substitute), g…全体(global), i…無視(ignore)
for ( = 0; < @html; ++) {
if ( =~ //i) {
=~ s///gi;
}
print ;
}
}
################################################ J(sub)
###■サブルーチン:&lock_file
sub lock_file {
local(*FILE) = @_;
if () {
eval("flock(FILE, 2)"); # 2=LOCK_EX
if ($@) {
###flockが使えない時
return 0;
}
}
return 1;
}
################################################ K(sub)
###■サブルーチン:&unlock_file
sub unlock_file {
local(*FILE) = @_;
if () {
eval("flock(FILE, 8)"); # 8=LOCK_UN
}
}
//-----------------------------------------------------------
■以上がソースコードです。
Perlの記述自体はどんなOSでも作成可能なようですが、僕の場合はWindows環境で作業しています。そのため上記のコードがどんなOSでも通用するかは明確には言えませんが、基本的にはOKなはずです。
【上記CGIの動作に必要なファイル】
1.cntcgi.html
2.cntcgi.cnt
3.cntcgi.cgi
※ちなみに上記のソースはあくまでも学習の参照用に公開しています。もし仮にトラブルが発生したり、
何らかの影響がOSやサーバー等に発生したとしても私の方では責任は負いかねますのでご了承ください。
※また本プログラムの設計構成に関しましては結城浩様のものであり、著作権も結城浩様に属します。
【お勧めの書籍・独り言】
僕がこのようなサイトを運営している背景に、当然僕の仕事が『開発』であるという前提があります。
(サイトの内容があまり細かくないのは、個人的にこれをやっている時間があまり取れないためです。時間をくれ!…って感じ)
Webの作成から始まり、Visual Basic、JAVA、CGI、Java-script、PHPなどを使った業務系の開発をしてます。
なんでそんなにたくさんの言語を…と、思うかもしれませんが、最近の業務系アプリの主流はユーザーが
ストレスを感じない使い勝手の良いプログラムの作成です。ユーザーに専門的な知識を要求しない
アプリを作成しようと思うとやはり『ブラウザ』をベースにした作りがいいわけです。(あくまでも私見)
そんな私が『プログラムの知識を広げよう、ヒントを得たい』と思った時に、例えば書店やWebサイトを
覗いてみると、世間に出回っている書籍やサイトはやはりちょっと物足りない、ある種わかりきっている
入門書やWeb向けの開発ヒントが不足しているものばかりでした。
『どっかにトータル的に見た開発の書籍はないかな?』と思ってた時に出会ったのが『結城浩』さんの書籍
です。彼の著書はWebでの活用ができやすい上に、CGIの著作の中などでもC言語との対比をところどころに
ちりばめてくれていて言語をかじったことのある人なら非常に有効だと感じました。
しかも小難しい専門書と違い実用的でわかりやすい言葉で書かれています。
僕が参考にさせてもらったのは彼の『Perlで作るCGI入門(応用編)』という書籍ですが、『結城浩』さんには
その他の言語の著書もたくさんあるようです。僕と同じように世間のプログラム解説本にちょっと物足りなさを
感じている人には、ぜひ一度彼の本を開いてみることをお勧めします。
ちなみに上記は完全な私見です。多言語を操る作家さんの本に出会えてうれしかったので私的に紹介してみました。
現在僕は仕事上でPost-ScriptとXMLもかじっていますが、(VBでPost-Scriptのコードをいじるアプリを作ってます)他の言語に比べて書籍もサイトも有効な物に出会えずハンマー・テクノロジー的な手法(サンプルプログラムをばらしたり、くっつけたりしてコードの意味を解釈していく方法)でなんとかプログラムを組んでいます。もしこのページを読んでいる方で、いいサイトや書籍(レベル2,3)を知っている方がいたらぜひ教えてください。
この言語はちょっとくせがあっておもしろいですよ。
|
 /// サイト・インフォメーション //////////////////////////////////////
海外旅行はJTB!Web限定商品など、海外ツアー検索・予約が可能!
 ■海外パッケージツアー「ルックJTB」と抜群の品揃えを誇る「海外ホテル予約」がネット上でできる。
■「かんたん海外ツアー検索&予約」ではかなり高機能の検索ができる。
■世界のホテル約4200都市・50000軒のプランを有する。
[242865]
| |
|