あまり数えないカウンタ

(´-`).。oO(なんでだろ?)

理由

普通、カウンタって増えて欲しいものです。なんでわざわざ増えにくいカウンタを作るのか?

このような小規模なサイトをやっているとままあることですが、あまりにもマイナーサイト過ぎて*1自分が(チェックなどで)一番カウンタ回していて罪悪感を感じたり、サイト内の移動でTOPに戻ったときカウントしてしまったり、とかあるわけです。

そこで本当にまわって欲しいときだけカウントするカウンタが欲しいと思って作ったのがこれです。ちなみにSSIを使ったテキストカウンタです。

どうするの?

どうゆときはカウントしたくないのか?

  1. 自分がアクセスした時はカウントしない
  2. 直前と同じ人の時はカウントしない
  3. 自分のサイト内からの移動だったらカウントしない

どうやってはじくのか

自分のIPを覚えておく
ADSLでつなぎっぱでも結構IP変わるから、簡単な方法で今の自分のIPをcgiに教えるようにする。
直前の人のIPを覚えておく
これは大抵のカウンタにはある機能です。今回はログとか余計な機能は入らないので、直前の一人だけ記録するようにします。
HTTP_REFERERを見てサイト内だったらはじく
まあこれも問題なしかと。
*1
一日数千とかいう人気サイトならまだしも、一日30hit程度のサイトでそのうち15件とか自分だったら問題だ。

こんなの

30行しかないソース

#!/usr/bin/perl

use strict;
#------------------------------------------------------------------------#
my $EXREF   = 'http://www.uso800.or.jp/~uso/';
my $PASS    = 'SaitamaSaitama';
my $LOGFILE = './count.log';
#------------------------------------------------------------------------#
my $addr = $ENV{'REMOTE_ADDR'};
my $mes;
if ( $ENV{'QUERY_STRING'} eq $PASS and $PASS ) {
    $mes = "Content-type: text/html\n\nAdmin IP changed to $addr\n";
}
open FILE, "+<$LOGFILE" or die;
flock FILE, 2;
my ( $count, $ip, $admin_ip ) = split( /:/, <FILE> );
seek( FILE, 0, 0 );
if ( $mes ) {
    print FILE "$count:$ip:$addr";
} elsif ( $ENV{'HTTP_REFERER'} !~ /^$EXREF/ and $addr ne $ip and $addr ne $admin_ip ) {
    $count++;
    print FILE "$count:$addr:$admin_ip";
} else {
    seek( FILE, 0, 2 );
}
truncate( FILE, tell );
close FILE;
$mes = sprintf ( "Content-type: text/plain\n\n%.5d", $count ) unless $mes;
print $mes;

うごかす?

設定方法

必ず変更する必要があるのは、上のソースで強調されている上側の二行だけです。

必須な設定

$EXREF
設置するサイトのトップのURLにして下さい。HTTP_REFERERにこの文字列が含まれていれば、同サイト内での移動とみなしてカウントしません。
$PASS
自分のIPを覚えさせる時のパスです。自分用に変えてください。(半角英文字でお願いします)

任意な設定

桁揃えの桁を変えたい場合、一番下のほうにある%.5dという部分の数字を桁数に変えてください。10桁にしたいなら、%.10dにすれば良いでしょう。

設置方法

  1. 空ファイルを用意して、ファイル名をソース内で指定してある名前にして下さい。(何もいじってなければ"count.log"という名前にして下さい。)
  2. 次に上のソースをメモ帳にコピーするとかして、必要項目(って2個所しか無いけど)を書き換えて、お好きな名前.cgiにして保存してください。とりあえず、count.cgiという名前にしたとして説明します。
  3. FTPで作った二つのファイルをアスキーモードで転送してください。フォルダはお好きな所でよいですが、同じフォルダに二つとも入れてください。
  4. パーミッションを変更します。cgiの方は700、logの方は600にして下さい。

設置はこれでおしまいです。

ページにカウンタを組み込む

このcgiはカウントした数字しか出力しないので、タグとかは自分で書く必要があります。

呼び出すには数字を埋め込みたい位置に
<!--#exec cgi="カウンタを置いた場所/count.cgi"-->
とSSI構文を入れて下さい。

自分のIPを覚えさせる

自分からのアクセスでカウントさせたくない場合、ブラウザのURL欄に
http://カウンタのURL/count.cgi?設定したパスワード
と入れてアクセスしてください。ブックマークに登録すると良いでしょう。

するともしパスワードが合っていたなら、その時のIPを覚えます。(成功時にはメッセージが出ます)以後、新たに覚えさせるまで、そのIPでアクセスがあってもカウントしません。

糸冬

カウンタは最も簡単なcgiの一つなので沢山世に出ています。なのに何故わざわざ自分で作るのか?とお思いになるでしょう。少し探してみればわかりますが、多機能なカウンタが多く、本当に数を数えるということだけに絞ったカウンタは意外と少ないのです。もしくは、数を数えるだけなら数行のプログラムになるので配布するまでもないのかもしれません。

しかし、カウンタはその特性上、出来る限り小さなものの方が好ましいはずです。余計な機能は要らないと思ってる人が自分の他にいてもおかしくないと思いこのページを作りました。

perlで初めてcgiを作る人の参考になるかも?しれません。

check