#!/usr/bin/perl ################################################################## # Program : counter.cgi(Perl) # Date_written : 1999,09,11 # Author : 良寛 ################################################################## require './gifcat.pl'; # ------------------------------------------------------------ # requireは'ファイル名'で指定した、サブルーチンライブラリ # を、このプログラムの中に取り込む命令です。この場合、本プ # ログラムと同じディレクトリにある、gifcat.pl(とほほさん # 作)という画像連結プログラムを取り込んで(結合して)普 # 通のサブルーチンのように使います。 # ------------------------------------------------------------ #=== 初期設定 ================================================== $fig = 5; # カウンタ表示桁数 $cntfile = "count.dat"; # カウンタファィル $lockfile = "lock.dat"; # ロックファイル  # 存在すればカウント不可 # ------------------------------------------------------------ # 変数の初期値を設定します。トップに書いておくとメンテナンス # が容易です。 # 1行目の「#!/usr/bin/perl」はサーバーのPerlのある場所 # です。プロバイダにより少し異なりますので、プロバイダに聞い # て確かめてください。これは、ミンク(鹿児島のプロバイダ)の # 場合です。 # 必要なファイル # counter.cgi [755] # count.dat [666] メモ帳などで、半角数字0だけ書いて、 # アスキーモードで転送 # gifcat.pl [644] # 0〜9.gif とほほのWWW入門よりダウンロード # したものをバイナリモードで転送 # count [777] 以上のファイルを入れるフォルダ # index.html カウンタを表示させるHTML # 表示させたい部分に # # のように記述 # ------------------------------------------------------------ #=== 訪問日の取得 ============================================== ($sec,$min,$hour,$day,$mon,$year,$wday) = localtime(time); $date = "$day"; # ------------------------------------------------------------ # 訪問日を取得します。(perl4.htmlで解説済み) # ------------------------------------------------------------ #=== カウント処理(ここからメイン)============================== $lockflag = &lock; if ($lockflag == 0){ &error;} # ------------------------------------------------------------ # ファイルロック # 訪問者が同時にファイルに書き込むと、ファイルが破壊されるの # で、ロックをかけます。サブルーチン&lockで処理されます。 # ------------------------------------------------------------ open (IN,"$cntfile") || &error; @lines = ; close(IN); # ------------------------------------------------------------ # カウントデータを読み込み # 「|| &error」は、何かの原因でファイルを開くことができな # かった場合にエラールーチンにとびます。 # ------------------------------------------------------------ ($logday,$count) = split (/\|\|\|/,$lines[0]); # ------------------------------------------------------------ # $lines[0]を区切り文字|||で分割 # 分割後それぞれ$logdayと$countに代入します。 # ------------------------------------------------------------ $count =~s/\n//g; # ------------------------------------------------------------ # $countの中の\nを削除 # ------------------------------------------------------------ if ($logday != $date) { @lines = (); } # ------------------------------------------------------------ # 日付が変わった時、カウンタログを初期化 # ------------------------------------------------------------ $address = $ENV{'REMOTE_ADDR'}; # ------------------------------------------------------------ # 訪問者のアドレスを取得 # ------------------------------------------------------------ @data = @lines; # ------------------------------------------------------------ # カウントログ@linesを@dataに代入 # ------------------------------------------------------------ $addressflag = 0; # ------------------------------------------------------------ # 訪問者が2回以上訪問した場合、$addressflag = 1 # ------------------------------------------------------------ foreach $line (@data){ $line =~s/\n//g; if ($line eq $address){ $addressflag = 1; last; } } # ------------------------------------------------------------ # 訪問者が2回以上訪問したかチェック # ------------------------------------------------------------ unless ($addressflag == 1){ $count=$count +1; $lines[0] = "$date|||$count\n"; push(@lines,"$address\n"); open(OUT,">$cntfile") || &error; print OUT @lines; close(OUT); } # ------------------------------------------------------------ # 本日初訪問の場合の処理 # カウンタを1増やし、訪問者のアドレスと共に書き込みます。 # ------------------------------------------------------------ if (-e $lockfile){unlink($lockfile);} # ------------------------------------------------------------ # ロックファイルの削除 # ------------------------------------------------------------ #=== カウンタ表示(とほほさん作)================================ # カウンタをGIF画像で表示させる場合は、各桁をくっつけて、 # 1個の画像として表示しなければなりません。 # とほほさんが素晴らしい画像連結サブルーチン『gifcat』を作 # 成しておられますので、使用させていただきます。 # 使い方: # 1.とほほさんのHP http://www2e.biglobe.ne.jp/~s-hasei/ # より、むふふのカウンタ画像0〜9.gifをダウンロード # 2.counter.cgiと同じディレクトリにバイナリモードで転送 # 3.下の$cntstr = sprintf(sprintf("%%0%dld",$fig),$count); # の中の$figには表示桁数、$countにはカウント数が入りま # す。 #***** この部分の著作権はとほほさんにありますので、*************** #***** 解説はとほほさんのHPをご覧ください。 *************** $cntstr = sprintf(sprintf("%%0%dld",$fig),$count); printf("Content-type: image/gif\n"); printf("\n"); @files = (); for ($i=0;$i$lockfile"); close(LOCK); $flag = 1; last; # ------------------------------------------------------------ # $lockfileの空ファイルを作成し、ループから出ます。 # ------------------------------------------------------------ } sleep(1); # ------------------------------------------------------------ # $lockfileがすでに存在すれば、1秒待ちます。 # ------------------------------------------------------------ } $flag; # ------------------------------------------------------------ # $flagの値を返します。($flag=1はロック成功、0は失敗) # ------------------------------------------------------------ } #=== エラー処理 ================================================ sub error { if (-e $lockfile){unlink($lockfile);} exit; }