#!/usr/bin/perl
# ---[著作権情報]--------------------------------------------------+
# 名称:Multi Counter Text Ver 1.10 (2000/09/14)
# 作者: 夜月
# 入手先: http://www.prism-web.com/
#------------------------------------------------
# EDIT by たいが
# E-Mail : taiga_rock@mac.com
# URL : http://www.music.ne.jp/~inn/
# ---[カウンタのHTMLファイルへの張り方]---------------------------+
#
# 
#
#
#
# ----------------------------------------------------------------+
#
#==================================================================
# 設定ここから
#==================================================================
#
# メインの記録ファイル名
#
$logfile = './count.js';
#
# バックアップ機能をオンにする場合は「$bak_up = 1;」とする。
# バックアップ機能をオフにする場合は「$bak_up = 0;」とする。
#
$bak_up = 1;
#
# バックアップファイル名
#
$bakfile = './countbak.js';
#
# 同IPアドレスチェック機能をオンにする場合は「$ip_check = 1;」とする。
# 同IPアドレスチェック機能をオフにする場合は「$ip_check = 0;」とする。
#
$ip_check = 1;
#
# ファイルロック機能をオンにする場合は「$file_lock = 1;」とする。
# ファイルロック機能をオフにする場合は「$file_lock = 0;」とする。
#
$file_lock = 0;
#
# ロックファイル名
#
$lockfile = './count.lock';
### 表示桁数の整列機能の設定 ###########
#
# 表示桁数の整列機能とは
# たとえば、カウンタ数が 760 のとき、表示桁数6桁と指定すると000760といったように
# 実際の数値の前に0を補って表示する機能です。
#
# 表示桁数の整列機能をオンにする場合は「$view_much = 1;」にする。
# 表示桁数の整列機能をオフにする場合は「$view_much = 0;」にする。
#
$view_much = 1;
#
# 表示桁数の整列機能:全カウント数の表示桁数
# 6桁表示の場合は「$view_much_main = '%06d';」
# 7桁表示の場合は「$view_much_main = '%07d';」という風にする。
#
$view_much_main = '%07d';
#
# 表示桁数の整列機能:本日・昨日のカウント数の表示桁数
# 6桁表示の場合は「$view_much_sub = '%03d';」という風にする。
#
$view_much_sub = '%03d';
#==================================================================
# 初期設定ここまで
#==================================================================
#
# ここから以下は知識が無い方は触れないほうが安全です。
# また、ここ以下の改造についてのサポートはご遠慮下さい。
#
#
# カウントアップ処理
&count_up;
exit;
#==================================================================
# カウントアップ処理
#==================================================================
sub count_up {
# 更新系処理でないならば2秒待たせる
if ($mode ne "all") { sleep(2); }
# ロック開始
elsif ($mode eq "all" && $file_lock) { &lock; }
# 記録ファイルから読み込み
open(IN,"$logfile") || &error;
$data = ;
close(IN);
# 記録ファイルを分解
$data =~ s/\'//g;
($key,$yesterday,$today,$count,$ip) = split(/;/, $data);
($dummy, $key) = split(/=/, $key);
($dummy, $yesterday) = split(/=/, $yesterday);
($dummy, $today) = split(/=/, $today);
($dummy, $count) = split(/=/, $count);
($dummy, $ip) = split(/=/, $ip);
$yesterday +=0;
$today +=0;
$count +=0;
# 日時を取得
$ENV{'TZ'} = "JST-9";
($sec,$min,$hour,$mday,$mon,$year) = localtime(time);
# IPチェック
$flag=0;
if ($ip_check) {
$addr = $ENV{'REMOTE_ADDR'};
if ($addr eq "$ip") { $flag=1; }
} else {
$addr = "dummyhost";
}
if ($mday eq "") { $mday = 1; }
if ($today eq "") { $today = 0; }
if ($yesterday eq "") { $yesterday = 0; }
if ($count eq "") { $count = 0; }
# 本日のカウント数をキーにしてカウントアップ
if (!$flag) {
if ($bak_up) {
# バックアップファイルを開く
open(IN,"$bakfile") || &error;
$data = ;
close(IN);
$data =~ s/\'//g;
($bakkey,$bakyesterday,$baktoday,$bakcount,$bakip) = split(/;/, $data);
($dummy, $bakyesterday) = split(/=/, $bakyesterday);
($dummy, $baktoday) = split(/=/, $baktoday);
($dummy, $bakcount) = split(/=/, $bakcount);
$bakyesterday +=0;
$baktoday +=0;
$bakcount +=0;
$break = 0;
# バックアップから復元
if ( $bakcount > $count ) {
$yesterday = $bakyesterday;
$today = $baktoday;
$count = $bakcount;
$break = 1;
}
}
if ($key eq "$mday") {
$today++;
$count++;
} else {
# 深夜の0時を回った時の処理
if (!$break) {
$yesterday = $today;
$today = 1;
}
# バックファイルを更新する
if ($bak_up && !$break) {
if ($view_much) {
$today = sprintf("$view_much_sub", $today);
$yesterday = sprintf("$view_much_sub", $yesterday);
$count = sprintf("$view_much_main", $count);
}
$data = "day=\'$mday\'\;yesterday=\'$yesterday\'\;today=\'$today\'\;all=\'$count\'\;ip=\'$addr\'\;";
open(OUT,">$bakfile") || &error;
print OUT $data;
close(OUT);
}
$count++;
}
# 記録ファイルを更新する
if ($view_much) {
$today = sprintf("$view_much_sub", $today);
$yesterday = sprintf("$view_much_sub", $yesterday);
$count = sprintf("$view_much_main", $count);
}
$data = "day=\'$mday\'\;yesterday=\'$yesterday\'\;today=\'$today\'\;all=\'$count\'\;ip=\'$addr\'\;";
open(OUT,">$logfile") || &error;
print OUT $data;
close(OUT);
}
# ロック解除
if (-e $lockfile && $mode eq "all") { unlink($lockfile); }
}
#==================================================================
# ファイルロック
#==================================================================
sub lock {
local($flag) = 0;
foreach (1 .. 5) {
if (-e $lockfile) { sleep(1); }
else {
open(LOCK,">$lockfile") || &error;
close(LOCK);
$flag = 1;
last;
}
}
if ($flag == 0) { &error; }
}
#==================================================================
# エラー画像表示処理
#==================================================================
# エラー時はエラーのGIF画像を表示する。
# KENTさんのカウンタの処理を参考にさせていただきました。
# http://www.kent-web.com/
#
sub error {
if (-e $lockfile) { unlink($lockfile); }
@err_gif = ('47','49','46','38','39','61','2d','00','0f','00','80','00','00','00','00','00','ff','ff','ff','2c', '00','00','00','00','2d','00','0f','00','00','02','49','8c','8f','a9','cb','ed','0f','a3','9c','34', '81','7b','03','ce','7a','23','7c','6c','00','c4','19','5c','76','8e','dd','ca','96','8c','9b','b6', '63','89','aa','ee','22','ca','3a','3d','db','6a','03','f3','74','40','ac','55','ee','11','dc','f9', '42','bd','22','f0','a7','34','2d','63','4e','9c','87','c7','93','fe','b2','95','ae','f7','0b','0e', '8b','c7','de','02','00','3b');
print "Content-type: image/gif\n\n";
foreach (@err_gif) {
$data = pack('C*',hex($_));
print $data;
}
exit;
}