ザの人カウンターのコード

#! /usr/bin/perl
# ザの人用カウンター
# http://d.hatena.ne.jp/jjx/
#
# -.cgi
# gifcat.pl (http://www.tohoho-web.com/wwwsoft.htm)
# log
# img---+---normal
#       +---fuga
# img/fuga(画像コード)ディレクトリには0.gif-9.gifという名前で書く番号の画像ファイルをおいて下さい。
#
use strict;

my $locknewuser = 0;    # 新規利用停止( 停止しない:0  停止する:1 )
my $logdir     = 'log'; # ログファイルを格納するディレクトリの名前
my $imagedir   = 'img'; # カウンター画像を格納するディレクトリの名前

my $id = $ENV{QUERY_STRING};

my $sp  = 'normal'; # デフォルトの画像コードはnormal
my $day;
if( $id =~ s/(T|Y)$// ){ $day = $1; }
if( $id =~ s/([a-z]{1,})$// ){ $sp = $1; }

# 不正
if( $id !~ /^\d+$/ ){ die; }
if( $id >=  100000 ){ die; }

if( ! -e "$logdir/$id.txt" ){
    if( $locknewuser ){
        die;
    } else {
        open( my $o, '>>', "$logdir/$id.txt" );
        close($o);
    }
}

open( my $io, '+<', "$logdir/$id.txt" ) or die;
flock( $io, 2 );
chomp( my $counter = <$io> );
chomp( my @counted = <$io> );
seek($io, 0, 0);

my( $total, $today, $yesterday ) = split(/\$/, $counter);

# 最終アクセス日が今日でなければVisitorログを初期化
if( (localtime( (stat($io))[9]) )[3] != (localtime(time))[3] ){
    $yesterday = $today;
    $today = 0;
    @counted = ();
}
unless( grep{ $_ eq $ENV{REMOTE_ADDR} }@counted ){ # ユニークである
    $total++;
    $today++;
    push(@counted, $ENV{REMOTE_ADDR});
}

print $io join("\n", join('$', $total, $today, $yesterday), @counted);
truncate( $io, tell($io) );
close($io);

require "gifcat.pl"; # by tohoho

my @giflist;
foreach my $s ( split(//, sprintf("%05d", ( $day eq 'T' ? $today : ( $day eq 'Y' ? $yesterday : $total ) )  )) ){
    push( @giflist, "$imagedir/$sp/$s.gif" );
}

print 
    "Content-type: image/gif\n\n",
    gifcat::gifcat( @giflist );