146 Views
書き方って、人それぞれで、これが正解って中々難しいモノで、
コード的に・・・「どぉーなんだ!」って、ご意見も多々有ると思いますが、
以下の感じでコード書いてみました。
自身のブログ・サイドバーでインラインフレームで出力しているモノです。
#!/usr/bin/perl
#上記↑の「魔法の呪文」はサーバーに合わせて下さい。
###<------------------------------------------------------------------------------------
### 初期設定
###<------------------------------------------------------------------------------------
$lock_file= 'battle.lock';
$count_file = "counter.log";
#概要
#累計(画像の出力)0~9までの画像を用意して、フォルダー「img」に納めて下さい
#出力「累計、今日、昨日、今週、先週、今月、先月」
#実行ファイル、ログファイルは、サーバーのパーミッションに合わせて下さい。
#この辺を、お好みで、いじって
$figure1 = 10;
$figure2 = 5;
$tt_figure = 10;
$td_figure = 8;
$renzoku = 0; #連続投稿を許す回数
$new_time = '7'; #何日間が新しい投稿とするか
#各カウンター名称
@YOUBI = ("Total","Today","Yesterday","This Week","Last Week","This Month","Last Month");
###<---------------------------------------------------------------------------------------------
### ファイルロック・ルーチン
###<---------------------------------------------------------------------------------------------
sub filelock {
if(-e $lock_file){($ftm) = (stat($lock_file))[9]; if($ftm < time - 150) { unlink($lock_file); }}
foreach(1 .. 5){if(-e $lock_file){sleep(1);}else{open(LOCK,">$lock_file"); close(LOCK); return;}}
&error("只今他の方が書き込み中です。ブラウザの「戻る」で戻って再度登録を行って下さい。");
}
###<---------------------------------------------------------------------------------------------
### ファイルロック解除・ルーチン
###<---------------------------------------------------------------------------------------------
sub fileunlock {if(-e $lock_file){unlink($lock_file);}}
###<---------------------------------------------------------------------------------------------
###<--- ホスト情報取得
###<---------------------------------------------------------------------------------------------
sub get_host {
$host = $ENV{'REMOTE_HOST'};
$addr = $ENV{'REMOTE_ADDR'};
if($host eq "" || $host eq "$addr"){ $host = gethostbyaddr(pack("C4", split(/\./, $addr)), 2); }
if ($host eq "") { $host = $addr; }
}
###<---------------------------------------------------------------------------------------------
### HTMLヘッダー
###<---------------------------------------------------------------------------------------------
sub header {
#+++html出力宣言 ※この一行は絶対に削除不可
print "Content-type: text/html; charset=UTF-8\n\n";
print <<"EOH";
<!DOCTYPE html>
<html lang="js">
<head>
<style>
/*お好みでCSSを記載して下さい*/
</style>
</head>
<body>
EOH
}
###<---------------------------------------------------------------------------------------------
### HTMLフッター
###<---------------------------------------------------------------------------------------------
sub footer { print qq|</body></html>|; }
###<---------------------------------------------------------------------------------------------
###<--- カウント計算
###<----------------------------------------------------------------------------------------------
sub counter_calc {
&get_host;
&filelock;
if(!(open(IN,"$count_file"))){&fileunlock;&error("$count_fileのオープンに失敗しました");}
$total=<IN>;$day=<IN>;$yday=<IN>;$week=<IN>;$lweek=<IN>;$month=<IN>;$lmonth=<IN>;$dhost=<IN>;$dsecond=<IN>;
close(IN);
$dbflag_ = 0;
chop $dhost;chop $dsecond;$second = time;
if($host eq "$dhost"){
$count_time = $second - $dsecond;
$crzk_ok = 60 * $crzk_time;
$cnkr_time = $crzk_ok - $count_time;
unless($cnkr_time < 0 ){$dbflag_ = 1;}
}
if($dbflag_ == 1){
chop $total;chop $day;chop $yday;chop $week;chop $lweek;chop $month;chop $lmonth;
($d_count,$d_day) = split(/:/,$day);$dcount = $d_count;$dday = $d_day;$day = join(':',$dcount,$dday);
($w_count,$w_day) = split(/:/,$week);$wcount = $w_count;$wday = $w_day;$week = join(':',$wcount,$wday);
($m_count,$f_mon) = split(/:/,$month);$mcount = $m_count;$fmon = $f_mon;$month = join(':',$mcount,$fmon);
$second = $dsecond;$host = $dhost;$counta = $total;$count_up = 0;
}
else{
$second = time;
($sec,$min,$hour,$mday,$mon,$year,$wday,$d,$d) = localtime(time);
$mon++;
chop $total;$total++;
chop $day;chop $yday; ($dcount,$fmday) = split(/:/,$day);
if($fmday != $mday){$yday = $dcount;$dcount = 1;}else{$dcount++;} $day = join(':',$dcount,$mday);
chop $week;chop $lweek; ($wcount,$fmday2) = split(/:/,$week);
if($wday == 0){if($fmday2 != $mday){$lweek = $wcount;$wcount = 1;}else{$wcount++;}}else{$wcount++;} $week = join(':',$wcount,$mday);
chop $month;chop $lmonth; ($mcount,$fmon) = split(/:/,$month);
if($fmon != $mon){$lmonth = $mcount;$mcount = 1;$fmon = $mon;}else{$mcount++;$fmon = $fmon;} $month = join(':',$mcount,$fmon);
$counta = $total;$count_up = 1;
}
if(!(open(OUT,">$count_file"))){&fileunlock;&error("$count_fileのオープンに失敗しました");}
print OUT $total,"\n",$day,"\n",$yday,"\n",$week,"\n",$lweek,"\n",$month,"\n",$lmonth,"\n",$host,"\n",$second; close OUT;
&fileunlock;
}
###<---------------------------------------------------------------------------------------------
###<--- 出力準備
###<---------------------------------------------------------------------------------------------
sub main {
&counter_calc;
&header;
#HTMLテーブルタグを使って出力しました。
#CSSを用いてデザインも有りだと思います。
print qq|<table width="100%"|;
print qq|<td colspan="2">|;
#↓下記は「累計」で、画像で出力です。
$daystr1 = sprintf(sprintf("%%0%dld",$tt_figure),$total);
for($s1=0; $s1<length($daystr1);$s1++){
local($temp1)=substr($daystr1,$s1,1);
print qq|<img src="./img/$temp1.gif">|;
}
print qq|</td></tr>|;
#↓何のカウント?になるので、「名称(文字)」を出力
print qq|<td>$YOUBI[1]</td>|;
print qq|<td>|;
#↓下記は、画像の出力では無くて、「文字(数字)」での出力
$daystr2 = sprintf(sprintf("%%0%dld", $td_figure),$dcount);
for($s2=0; $s2<length($daystr2);$s2++ ){
local($temp2) = substr($daystr2,$s2,1);
print qq|$temp2|;
}
print qq|</td></tr>|;
print qq|<td>$YOUBI[2]</td>|;
print qq|<td>|;
$daystr3 = sprintf(sprintf("%%0%dld",$td_figure),$yday);
for($s3=0; $s3<length($daystr3);$s3++){
local($temp3) = substr($daystr3,$s3,1);
print qq|$temp3|;
}
print qq|</td></tr>|;
print qq|<td>$YOUBI[3]</td>|;
print qq|<td>|;
$daystr4 = sprintf(sprintf("%%0%dld",$td_month),$wcount);
for($s4=0; $s4<length($daystr4);$s4++){
local($temp4) = substr($daystr4,$s4,1);
print qq|$temp4|;
}
print qq|</td></tr>|;
print qq|<td>$YOUBI[4]</td>|;
print qq|<td>|;
$daystr5 = sprintf(sprintf("%%0%dld",$td_month),$lweek);
for($s5=0; $s5<length($daystr5);$s5++){
local($temp5) = substr($daystr5,$s5,1);
print qq|$temp5|;
}
print qq|</td></tr>|;
print qq|<td>$YOUBI[5]</td>|;
print qq|<td>|;
$daystr6 = sprintf(sprintf("%%0%dld",$td_month),$mcount);
for($s6=0; $s6<length($daystr6);$s6++){
local($temp6) = substr($daystr6,$s6,1);
print qq|$temp6|;
}
print qq|</td></tr>|;
print qq|<td>$YOUBI[6]</td>|;
print qq|<td>|;
$daystr7 = sprintf(sprintf("%%0%dld",$td_month),$lmonth);
for($s7=0; $s7<length($daystr7);$s7++){
local($temp7) = substr($daystr7,$s7,1);
print qq|$temp7|;
}
print qq|</td></tr>|;
print qq|</table>|;
print qq|</div>|;
&footer;
exit;
}
コメント