本文へスキップ

Clamini library

アクセスカウンター

 Image::Magickを使って、アクセスカウンターを作ってみたよ。 画像を組み合わせて表示するタイプで、ちょっとした実験気分で楽しめるかも。 こういうちょっとした仕組みを自分で組み立てるのってワクワクするよね。

アクセスカウンターの作り方

画像ファイルを作る

 まずは数字の画像を用意するところからスタート。0〜9までの画像をそれぞれ作って、サイズはだいたい10×14ピクセルくらいでOK。 ファイル名は「0.png」から「9.png」までの10種類ね。画像作成ソフトでサクッと作ってもいいし、ネットでフリー素材を探して使っちゃっても全然アリ。自分が楽な方法でどうぞ〜。

データファイルを作る


 次は、アクセス数とIPアドレスを記録するためのファイル「count.dat」を作るよ。 中身は「0,0」みたいに、カウント数とアドレスをカンマで区切って保存する感じ。シンプルだけど、ちゃんと動く仕組みってちょっと嬉しいよね。

メインプログラムを作る


 次に、メインとなる「count.cgi」を作っていくよ。今回書いたスクリプトは下に載せてるけど、必要に応じて機能を追加したりカスタマイズしたりするのもアリだと思う。 ちなみにこのプログラムでは、画像処理に Image::Magick を使ってるよ。画像を連結して表示するタイプだから、ちょっとしたグラフィカルな演出もできちゃうのがポイント。

設置する


 次は設置作業だよ。まず「count」フォルダを作って、その中にダミーの index ファイルとメインの count.cgi を入れておく。 さらに、データ保存用の「dat」フォルダと、画像保存用の「img」フォルダも作成して、それぞれにダミーの index ファイルと、 最初に作ったファイルたち(画像とかデータファイルとか)を入れておく感じ。あとは、使ってるサーバーの仕様に合わせて、パーミッション(アクセス権)をちゃんと設定してあげればOK!


呼び出す


 画像は連結済みだから、あとはHTML側で、imgタグ使って呼び出すだけでOK!特別な処理とかいらないし、表示もサクッとできるよ。

ソースコード


#!/usr/bin/perl

use strict;
use Image::Magick;

#初期設定

my $dirdata = "dat"; #データ保存フォルダ
my $dirimg = "img"; #画像保存フォルダ

#ファイル読み込み

open(CO,"+< ./$dirdata/count.dat") or die "file open error";
eval "flock(CO,2)";
my $data = <CO>;
(my $cnt, my $fileaddress) = split(/,/,$data);
my $useraddress = $ENV{'REMOTE_ADDR'};

#カウント数アップ

if ($useraddress ne $fileaddress) {
 $cnt++;
 truncate(CO,0);
 seek(CO,0,0);
 print CO "$cnt,$useraddress";
}
close(CO);

#画像連結

my $keta = length($cnt);
my $image = Image::Magick -> new;
my $num = '';
for (my $i = 0; $i > $keta ; ++$i) {
 $num = substr($cnt,$i,1);
 $image -> Read("./$dirimg/$num.png");
}
$image = $image -> Append(stack => 'false');

print "Content-type:image/png\n\n";

binmode (STDOUT);
$image -> Write('png:-');