#!/usr/local/bin/perl
require 'cgi-lib/perl-lib.pl';
# サイトのURL
# http://及び、ファイル名(index.html等)は省略
# 【例】www.inforyoma.or.jp/~terra
$usersite = 'www.tryhp.net';
# ダミー画像のファイルパス
$image = 'cgi-images/exspc.gif';
# カウントを保存するデータベース
# DBMですので拡張子は指定しない
$dbmfile = 'pagecnt';
# 監理者パスワード
$root = 'abcd1234';
# -- ここからがメインルーチン --
# ページからページの名称を取得
readparts('QUERY', '<>', '');
if ($QUERY{'pw'} eq $root) {
print "Content-type: text/html\n\n";
print "
ページカウンタアクセスログ
";
# カウンタDBMをオープン
# 読み込み専用なので0644でアクセス
dbmopen(%DBM, $dbmfile, 0644);
# ページの数だけループしてデータを読込む
foreach $key (keys %DBM) {
$count = $DBM{$key};
# 最大値を取得
$max < $count && ($max = $count);
# 並び替えの為カウント数を0をサプレスしない
# 8桁の整数に統一する
$count = sprintf("%08d", $count);
# 書式を整えて配列@ACCESSに代入
$value = "$count\t$key";
push(@ACCESS, $value);
}
# DBMをクローズ
dbmclose(%DBM);
# アクセスの多い順に並び替え
@ACCESS = reverse(sort(@ACCESS));
print "\n";
print "\n";
print "
ページ |
カウント |
グラフ |
ポイント |
\n";
foreach (@ACCESS) {
($count, $page) = split(/\t/, $_);
$count += 0;
print "";
print "$page | \n";
print "$count | \n";
if ($max) {
$point = sprintf("%3.1f", int($count / $max * 1000 + 0.5) / 10);
$barwidth = $point * 20 / 100;
print "";
foreach (1 .. $barwidth) { print "■"; }
print " | \n";
print "$point | \n";
} else {
print " | \n";
print " | \n";
}
print " \n";
}
print " \n";
print " |
\n";
print "\n";
exit;
}
# アクセスの記録
if ($QUERY{'page'}) {
# ページが指定されている場合にだけ記録
# perl-libのロックに成功すれば書き込み
# 失敗すればDBMを守る為このアクセスを無視
if (!dblock($dbmfile)) {
# 連想配列%DBMをファイルに結合してオープン
dbmopen(%DBM, $dbmfile, 0666);
# ページ名のカウントを1プラスして保存
$DBM{$QUERY{'page'}}++;
# DBMを閉じる
dbmclose(%DBM);
# ロックを解除
dbunlock($dbmfile);
}
}
print "Content-type: image/gif\n\n";
open(IMG,$image);
binmode(IMG);
binmode(STDOUT);
print $_ while (
);
close(IMG);
exit;