前回のアクセスカウンタを作った話の続きです。あのカウンタはgifファイルを連結して表示していたのですが、バックが透明の場合、gifファイルだと縁のジャギーがちょっと気になるので、pngファイルで連結できないか調べてみました。
ネットで調べてもそのものズバリなものはなかなか出てきません。どうやら単独でモジュールを作るのではなく、PerlのグラフィックモジュールのGDかPerlMagickを使って画像処理をしているようです。そこで、うちのレンタルサーバーのLaCoocanでも使えるPerlMagickを使って、pngファイルを連結するプログラムに変更してみました。

現在のアクセスカウント値
(前回の記事もプログラムが更新されているので、同じpng表示になっています)
PerlMagickというのは、PerlモジュールImage::Magickのことで、ImageMagickライブラリをPerlから使えるようにしたものです。
で、早速使おうと思ったところ、Perlでどう書いていいのかよく分からんw。PerlMagickのページで解説されているのですが、いかんせん英語で...。
#!/usr/local/bin/perl -wT
use strict;
use Image::Magick;
...
# $image_dir は数字イメージファイルのディレクトリ
# 数字イメージファイルのディレクトリ内には、0.pngから9.pngのpngファイルあり
# $count にはアクセスタウンタの値が整数で入っている状態
...
my $count_length = length($count); # 桁数
my $image = Image::Magick->new;
my $i = 0;
my $n = '';
for ($i = 0; $i < $count_length; $i++) {
$n = substr($count, $i, 1);
$image->Read("$image_dir$n.png");
}
my $append_image = $image->Append(stack => 'false'); # false:横に連結
undef $image;
print "Content-type: image/png\n\n";
binmode STDOUT;
$append_image->Write('png:-');
ふぅ、なんとか試行錯誤でできました。ちなみに赤字はPerlMagickの部分で、出来てからPerlMagickのドキュメントを読み返すと、悩んだところはちゃんと解説されているし...w。
簡単に解説すると、$imageのイメージオブジェクトを作成して、Readで左のpngファイルから順に読み込んで、Appendで連結して、Writeで連結したpngファイルを書き出しています。この中で、$imageに桁数分の違うファイルを読み込んでいますが、このオブジェクトはこんな風に使えるようです。普通の変数のように見えるので、ちょっと違和感がありますが...。
PerlMagickを使うとPerlで色々な画像処理が出来るようなので、興味のある方は使ってみるといいかも。
8月末にニフティから2016年9月29日に@homepageのサービスが終了する旨のメールがきました。まぁ、うちはLaCoocanのレンタルサーバーに乗り換えているのでwebページ自体は問題ないのですが、@homepage時代から使っている右上のアクセスカウンタCGIのサービスも終了するとのこと。アクセスカウンタはあってもなくても問題はないのですが、ないと寂しい...ということで、アクセスカウントを表示するプログラムをPerlで作ってみました。

現在のアクセスカウント値
アクセスカウンタというのは当該webページの表示回数やアクセス回数を示すものですが、何をもって+1するかという考え方が設置者やプログラムによって違い、単純に表示回数をカウントする場合を除き、正確な値ではありません。
うちのサイトの場合は、@homepageが用意するアクセスカウンタをトップページのみに貼っていたため、トップページを表示させないとカウントしない上に、たぶん同一IPアドレスからの24時間以内のアクセスはカウントしないようになっており、かなり少なめのカウント値になっています。もちろん、それで十分だったのでそのままにしていたのですが...。
今回作成したアクセスカウンタは、トップページだけでなく子ページの表示もカウントし、同一IPアドレスからのアクセスでもカウントする、以前の状態からすると(表示されればカウントされる)真逆なカウンタになっていますw。
(Perlに関する余談)
プログラミング言語で「好き」と言えるのはPerlぐらいのもので、他は好きでも嫌いでもありません。Perlは自由度が高いため、プログラマーの能力により同じ処理をするプログラムでも色々な書き方があります。これは能力のある人がいなくなるとメンテできなくなるので、企業から嫌われている理由でもあるのですが、日曜プログラマには頭の体操にもってこいだと思います。
Perlを勉強するのであれば、オライリー・ジャパンから出版されている「初めてのPerl」は、内容がとても正確、やさしい解説で分かりやすい、基本の解説を網羅、ユーモアもあって読んで面白いという、とても良く出来た教本なのでオススメです。