#!/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;
}