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