#!/usr/bin/perl #Perlのパスを指定 #普通は、『#!/usr/bin/perl』or『#!/usr/local/bin/perl』を指定 #プロバイダによっては、『#!/usr/local/bin/perl5』の場合もあり。 ############################################### #このscriptの著作権は・・・ #HPサービス(hp@bird.to・mkc@intacc.ne.jp)に帰属しています。 #よって、改竄する事は許可しますが、著作権の表示は削除しないで下さい。 #また、このscriptによる如何なる損害も賠償しませんので・・・ #予め、ご了承下さい。 #尚、バグ情報などは、HPサービス(hp@bird.to)まで #お知らせ頂けると有難いです。 #また、利用にあたっては、HPサービス(http://hp.bird.to/)に従って下さい。 ####################使用方法###################### #一番上のPerlのパスを合わせて転送し、パーミッションを設定すれば・・・ #それで、使えるようになります。 #このCGIのカスタマイズは、ほとんどインターネット上で出来るように #作ってありますので、ファイル内容を、特に変更する必要はありません。 ####################変数設定###################### #(★☆)は、変更可能部分(よく分からない人は、変更しない事!!) #(★)は、変更しない方がいい部分 #(☆)は、変更した方がいい部分 #カウンターイメージ(★☆) #(counter_rent.cgiのカウンターイメージと同じにして下さい) for($i=0;$i<10;$i++){ $img0[$i]="./IMAGE/counter0/$i.gif"; $img1[$i]="./IMAGE/counter1/$i.gif"; $img2[$i]="./IMAGE/counter2/$i.gif"; $img3[$i]="./IMAGE/counter3/$i.gif"; $img4[$i]="./IMAGE/counter4/$i.gif"; $img5[$i]="./IMAGE/counter5/$i.gif"; $img6[$i]="./IMAGE/counter6/$i.gif"; $img7[$i]="./IMAGE/counter7/$i.gif"; $img8[$i]="./IMAGE/counter8/$i.gif"; $img9[$i]="./IMAGE/counter9/$i.gif"; } my $noimage='./IMAGE/noimage.gif';#カウンター非表示の際使用 #perlのバージョンを指定(★) require 5.001; #カウンター連結ライブラリを指定(★) require "./gifcat.pl"; # 排他制御使用関数(★) my $expire = 3*60; # 最大排他制御時間( sec ) my $num_retry = 30; # 最大再試行回数 my $retry_time = 1; # 排他制御待ち時間( sec ) # 現在time(★) my $now_time=time(); ##########ここより先は、Perlの知識が必要です!!########## ##########よく分からない人は、立ち入るべからず########## ####################条件分岐#################### my($user_id,$counter_img,$counter_figure)=split(/=/,$ENV{'QUERY_STRING'}); #IDとカウンターの種類と桁数 # 排他制御として使用するディレクトリ名 my $lockname="./DATA/COUNTCENTER/$user_id.lock"; # データファイル名 my $data_file = "./DATA/COUNTCENTER/$user_id"; print "Content-type: image/gif\n\n";#とりあえず出力 if(defined ($dlock_id=&LockOn($lockname))){ &data_open; if($counter_img ne ''){ &return_gif; } else{ binmode(STDOUT); print &gifcat'gifcat($noimage); } &data_save; &LockOff($dlock_id); }#排他制御終了 else { binmode(STDOUT); print &gifcat'gifcat($noimage); } exit 0; ####################GIFを抽出#################### sub return_gif{ my $figure=5; $figure=$counter_figure if($counter_figure>0 && $counter_figure<10); my $figure_rank=1; for($i=0;$i<$figure;$i++){ $figure_rank*=10; } for($i=0;$i<$figure;$i++){ $num[$i]=${img.$counter_img}[int($total%$figure_rank/($figure_rank/10))]; $figure_rank/=10; } binmode(STDOUT); print &gifcat'gifcat(@num); } ####################データ収集#################### sub data_open{ unless(-f $data_file){ $today = 0; } elsif(open(DATA,"$data_file")){ @line = ; close(DATA); for($i=0; $i<@line; $i++){ chomp($line[$i]); if($i==0){ $today=$line[$i]; } elsif($i==1){ $yesterday=$line[$i]; } elsif($i==2){ $total=$line[$i]; } elsif($i==3){ $average=$line[$i]; } elsif($i==4){ $pastday=$line[$i]; } elsif($i==5){ $maxcount=$line[$i]; } elsif($i==6){ $deadline_time=$line[$i]; } } } if($deadline_time<$now_time-60*60*24*7){ $deadline_time=int($now_time/(60*60*24))*(60*60*24)+(60*60*24);#昨日と今日を書き換える、日付変更タイム $deadline_time-=60*60*9;#日本時間 $deadline_time+=60*60*24 if($deadline_time<$now_time); }#データが破損した時 if($today=~/[^0-9]/){ $today=0; }#データが破損した時 if($yesterday=~/[^0-9]/){ $yesterday=0; }#データが破損した時 if($total=~/[^0-9]/){ $total=0; }#データが破損した時 if($average=~/[^0-9\.]/){ $average=0; }#データが破損した時 if($pastday=~/[^0-9]/){ $pastday=0; }#データが破損した時 if($maxcount=~/[^0-9]/){ $maxcount=0; }#データが破損した時 if($deadline_time<$now_time){ $average=int(($average*$pastday+$today)/($pastday+1)*100)/100;#小数点まで求めて正確さを出す $yesterday=$today; $deadline_time+=60*60*24; $maxcount=$today if($maxcount<$today); $today=0; $pastday++; }#日付が変更したら、初期化する $today++; $total++; } ####################データセーブ#################### sub data_save{ if(-f $data_file){ if(open(DATA, ">$data_file")){ print DATA "$today\n"; print DATA "$yesterday\n"; print DATA "$total\n"; print DATA "$average\n"; print DATA "$pastday\n"; print DATA "$maxcount\n"; print DATA "$deadline_time\n"; close(DATA); } } } ####################排他制御開始#################### # $id = LockOn(filename); sub LockOn{ my ($filename)=@_; # 古いディレクトリを削除 rmdir($filename) if(-d $filename && ($now_time-(stat($filename))[9])>$expire); # 排他制御用ディレクトリ生成 my $retry; for($retry=$num_retry; $retry>0 && mkdir($filename,0755)!=1; $retry--){ sleep($retry_time); } return $filename if($retry>0); # 成功 return undef; # 失敗 } ####################排他制御終了#################### # LockOff($id); sub LockOff{ my ($filename)=@_; rmdir ($filename) if(defined $filename); }