カウンタ-を作成


開発中のCGIを見る
030717~030720

030721~030721

030722~030727
030728~030801
030802~


030717

画像連結カウンターライブラリを使って画像連結を試みた。ライブラリは超有名な「とほほさん」のものを使いました。↓


一日の一時間ごとのアクセス数を表示させた。↓


ここで見栄えをよくするためにカレンダーを作って見ようと思う。現在太陽暦はグレゴリオ暦を採用しているということでその計算式を書いた。グレゴリオ暦をまとめると4年に一回うるう年があり、100年に一回うるう年がなく、400年に一回うるう年があるということだ。グレゴリオは日本では1870年ぐらいに採用されたのだがアクセス解析ではそこまでの過去は必要としないので考えないことにした。計算で1年1月元旦まで遡ると月曜となるらしくそこを原点とした。うるう年のない年の元旦から次の元旦までの曜日は1つ曜日がづれ、うるう年のときは2つ曜日がずれるということでこのような計算式となった。

# 一ヶ月最初の日の曜日を取得
$tuki=$mon;
$tosi=$year;
#月の日付
@hi[1..12]=(31,28,31,30,31,30,31,31,30,31,30,31);

$allhi = 0;
if ($tuki >= 2){
   for($i = 1;$i<= $tuki - 1;$i++){
      $allhi = $allhi + $hi[$i];
   }
}

$youbim1 = $tosi + $allhi;

$youbim1 = $youbim1 + int($tosi / 4);
$youbim1 = $youbim1 - int($tosi / 100);
$youbim1 = $youbim1 + int($tosi / 400);

$youbim1 = $youbim1 % 7;

カレンダーばっちり↓


030718
うるう年の2月を29日とするのを上のファイルに挿入。これで完璧に万年カレンダーは完成した。
if ($tosi % 4 ==0){
   if($tosi % 100 ==0){
      if($tosi %400==0){$hi[2]=29;}
   }
   else{$hi[2]=29;}
}
・・・・・・・・・・・
if ($hi[2]==29){$youbim1--;}



カレンダーを上に持ってきた。データmethod=getとしてやった。カレンダーにリンクを挿入(その日、先月、来月)。これでその日の1時間ごとのアクセスを見ることが出来る。↓


030719

今見ているカレンダーの日付のセルの色を変えた。日付を右寄せさせた。↓


一時間ごとのアクセスを1年間保存するプログラムがとりあえずできた。↓

# 蓄積1日カウントファイルを書き込み
$tdayfile="$tdaydirect/tday$daymon.txt";


open(OUT,">>$tdayfile");
print OUT $daydata;
close(OUT);

引数がないときは今の時間を入れるように↓
# 引数がないときは今の時間を入れる。
if($kikan eq ""){$kikan="day";}
if($inday eq ""){$inday=$mday;}
if($inmon eq ""){$inmon=$mon;}
if($inyear eq ""){$inyear=$year;}


リンクが1日解析画面のサブルーチンに入っていたのを修正↓


1日の総アクセス数を表示。↓


月間のアクセス数を切り替えて表示できるように。↓



030720

過去の月ごとのアクセスも見れるように。↓
# 蓄積1ヶ月カウントファイルを処理(分割後、本来の配列に入れる。)
# ファイルの数だけ調べる
for ($i=1;$i<=$tmonkazu;$i++){
#とりあえず分解して年と月を調べる。
($monyear,$monmon,@inmoncount[1..31]) = split(/,/, $tmondata[$i]);

#もし年と月が同じならループを抜ける。
if (($monyear==$inyear) && ($monmon==$inmon)){$i=$tmonkazu;}
#もし年と月が違うならデータ破棄
else{@inmoncount[1..31]=(0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0);}
}




仮に今月の月ごとのアクセスが参照されたときに見れるように。↓
# もし今月を参照したとき今月の1ヶ月カウントファイル入れる
if (($inyear==$year)&&($inmon==$mon)){
($monyear,$monmon,@inmoncount[1..31]) = split(/,/, $mondata);
}


月のアクセスを指定したときカレンダーのセルの色を全て変えるようにした。↓

#期間が月のとき
if($kikan eq "mon"){
#すべて日付の色を変える。
print"bgcolor='#99ccff'";
}

月のそうアクセス数を入れる。↓


グラフでアクセスを視覚的に見えるように。また最大アクセスを100として残りを計算した。単純に幅と高さを指定してやればいいんだね。↓
<img src='./graph.gif' width='$daygraph[$i]' height='6'>
日別                                     月別
      

030717~030720 開発中のCGI


030721
プログラムをほとんどを今後処理しやすいようにサブルーチンでまとめた。↓
#カウント日処理
&syoricountkikanday();
#カウント月処理
&syoricountkikanmon();
#曜日処理
&syoriyoubi();
#カレンダー処理
&syorikarenda();
#解析を表示。
&html();
exit;


全てのアクセスを見れるようにした。解析グラフが真中にきていたので上(top)に持ってきた。↓


#カレンダーを表示しに行く
&htmlkarenda();
print"</td><td valign='top'>";   #←topを追加

#解析を表示しに行く
&htmlkaiseki();

ためしに年月にいくつかアクセスを入れてみてみた。上手くいっている。(総アクセスは都合上変えていない)↓


全てのアクセスの月の表示にリンクをつけた。↓

#その月のリンク
print"<a href='kaiseki.cgi?kikan=mon&jouhou=count&inday=$inday&inmon=$yearmon[$i]&inyear=$year'>$yearmon[$i]</a>";

1月のアクセスの1日の表示にもリンクをつけた。↓

全て、今月、今日のリンクをつけた。↓


24時を回ったにも関わらず今日の日ファイルにカウントが入っているとき、それをその日ようのものに変えて読み込む。↓
#今日の日ファイルに何日のものが入っているか調べる。(翌月調査のため)
($raidayyear,$raidaymon,$raidayday) = split(/,/, $daydata);
#----------------------------------------------------------
#もし今日の日ファイルの日と参照した日が同じならそれを入れる。
if (($inday==$raidayday)&&($inmon==$raidaymon)){
($dayyear,$daymon,$dayday,$daysoucount,@daycount[0..23]) = split(/,/, $daydata);
}


カウンタ処理の方もサブルーチンでまとめて分かりやすいように。↓
# 日時を取得
&hiduke();
# カウンタ処理
&count();
# カウンタ連結表示
&countview();
exit;


ホストなど環境変数を取得できるようにした。↓
# ホストを取得
&host();
# アドレスを取得
&addr();
# リンク元を取得
&linkmoto();
#ユーザエイジェントを取得
&user_agent();
# 生ログ処理
&namalog();
#----------------------------------------------------------
#HOSTを取得
sub host(){
   if ( !$ENV{'REMOTE_HOST'} || $ENV{'REMOTE_HOST'} eq $ENV{'REMOTE_ADDR'} ){
      if ( !($host=gethostbyaddr(pack('C4',split(/\./,$ENV{'REMOTE_ADDR'})),2)) ){
      $host = $ENV{'REMOTE_ADDR'};
      }
   }
   else { $host = $ENV{'REMOTE_HOST'}; }
}
#----------------------------------------------------------------
#アドレスを取得
sub addr(){
   $addr=$ENV{'REMOTE_ADDR'};
}
#----------------------------------------------------------------
#リンク先を取得
sub linkmoto(){
   $linkmoto=$ENV{'HTTP_REFERER'};
}
#----------------------------------------------------------------
#ユーザエイジェントを取得
sub user_agent(){
   $user_agent=$ENV{'HTTP_USER_AGENT'};
}
#----------------------------------------------------------------


日付が変わったら生ログを別ファイルに入れる処理を間違えたらしく[ディレクトリ/$file.txt]  ($file="20\n")となっていた。この20のファイルがffftpでは消せないんですけど・・参ったな↓



情報(アクセス数、生ログ)を選択出来るようにした。↓



とりあえず今日の生ログだけだけど表示することが出来た。↓


ジャパスクリプトの戻るを組み込んだ。これがあると便利だ。↓

print"<a href='javascript:history.go(-1)'>戻る</A>";

次から急遽全てのカレンダーを見れるように設定しようと思う。まず左に付いているカレンダーをそのまま右に持ってきたみたところ。↓


030721~030721 開発中のCGI


030722
全ての月のカレンダー表示した。


年を(0から5000まで選択できるように)年は無限数まで行けるが、とりあえずここまででいいか。0年ってあったかなかったかうーん。ないような・・・



生ログのリンク元をリンク表示した。↓



過去生ログも見れるようにした。カウンタのときと同じやり方で実現した。↓


#生ログ蓄積ファイルから読み込み
open(IN,"./namalog/$inday.txt");

   #始めのファイルには日付が入ってるがいらないので捨てる。
   $dami=<IN>;

   #生ログファイル数を初期化
   $namalogkazu=1;
   while($namalog[$namalogkazu] = <IN>){
      #生ログファイル数
      $namalogkazu++;
   }
close(IN);
#----------------------------------------------------------
#生ログ今ファイルから読み込み
open(IN,"./namalog.txt");

   #始めのファイルには日付が入ってる。
   $namalogday=<IN>;
   #----------------------------------------------------------
   #参照日と今のログが同じ日のときそのログを入れる。
   if ( $namalogday == $inday){

      #生ログファイル数を初期化
      $namalogkazu=1;
      while($namalog[$namalogkazu] = <IN>){
         #生ログファイル数
         $namalogkazu++;
      }
      #----------------------------------------------------------
   }
close(IN);


カレンダー表示時で去年、今年、来年を選択できるようにした。↓


リンク元が間違っていたがやっと原因がわかった。カウンタが表示される場所のリンク元を取得するためにjavascriptを使いやった。↓
<script langeage="javascript">
<!--
//リンク元を取得モードの後に&を挟んで入れる。
linkmoto = document.referrer;
document.write('<img src="count.cgi?sougou&',linkmoto,'">');
/-->
</script>


(総合、今日、昨日)と一緒にリンク元もカウンタcgiに渡す処理をした。↓
# 引数データを入れる
$insuu = $ENV{'QUERY_STRING'};

#引数を分解(総合、今日、昨日を区別)とリンク元
($mode,$linkmoto)=split(/&/,$insuu);



030723

リンクをクリックしたときリンク先が解析されないように間接リンクファイルを作った。↓

ファイル名 xxx.cgi
#!/usr/bin/perl

print "Content-type: text/html\n\n";

#引数を入れる。
$link=$ENV{'QUERY_STRING'};

#5秒後にジャンプ
print"<META http-equiv=refresh content=5;URL='$link'>";

#リンク表示
print"<a href='$link'>$link</a>";
print"<br>";
print"5秒後にジャンプします。";

exit;



年、月単位では生ログは閲覧できないようにした。↓
#もし期間が日のとき
if ($kikan eq "day"){
   if ($namalogkazu >=1){
   }
   else{
      print"この日のログはありません";
   }
}
#----------------------------------------------------------
#もし期間が日以外のとき
else{
   print"生ログは日単位でしか閲覧できません。";
}


030724

リンクを日別、月別、全てで取得できるようにした。下の奴はリンク元取得プログラム側↓
#------------------------------------------------------
#リンク元取得処理
sub linkmotosyutoku(){
#リンク元取得(日)しにいく
&linkmotoday();
#リンク元取得(月)しにいく
&linkmotomon();
#リンク元取得(all)しにいく
&linkmotoall();
}
#------------------------------------------------------
#リンク元取得処理(日)
sub linkmotoday(){
# 今のリンク元ランクファイルから読み込み

open(IN,"./linkmotorank/day.txt");
($linkmotorankdayday,$linkmotorankdaymon,$linkmotorankdayyear,$dami) =split(/,/,<IN>);
#------------------------------------------------------
#リンク元ランクのファイルの数
$linkmotorankkazu=1;
while($linkmotorankdata[$linkmotorankkazu] = <IN>){
#蓄積月ファイル数
$linkmotorankkazu++;
}
close(IN);
#------------------------------------------------------
#蓄積月ファイル数を調整
$linkmotorankkazu--;

#------------------------------------------------------
#リンク元ランクのファイルを分割
for ($i=1;$i<=$linkmotorankkazu;$i++){
($linkmotoranklink[$i],$linkmotorankkaisuu[$i],$dami)=split(/,/,$linkmotorankdata[$i]);
}

#日付が変わったら
if ($linkmotorankdayday != $mday){&linkmotodaykawaru();}
#日付が同じ
else{&linkmotodaykyou();}

}
#------------------------------------------------------
#日付が変わっていないとき(日)
sub linkmotodaykyou(){

#リンク元がすでにあるか調べる
$linkmotorankari=0;
for ($i=1;$i<=$linkmotorankkazu;$i++){
#もしあるときはその回数を+1する。
if($linkmoto eq $linkmotoranklink[$i]){
$linkmotorankkaisuu[$i]++;
$linkmotorankari=1;
}
}

#リンク元がなかったとき(最後尾に新しくリンクを追加する。)
if ($linkmotorankari != 1){
$linkmotorankkazu++;
$linkmotoranklink[$linkmotorankkazu]=$linkmoto;
$linkmotorankkaisuu[$linkmotorankkazu]=1;
}


#1日リンク元ランクファイルを結合させる
for ($i=1;$i<=$linkmotorankkazu;$i++){
$linkmotorankdata[$i]="$linkmotoranklink[$i],$linkmotorankkaisuu[$i],\n";
}

# 1日リンク元ランクファイルを書き込み
open(OUT,">./linkmotorank/day.txt");
print OUT "$linkmotorankdayday,$linkmotorankdaymon,$linkmotorankdayyear,\n";
print OUT @linkmotorankdata;
close(OUT);

}
#------------------------------------------------------
#日付が変わったら(日)
sub linkmotodaykawaru(){


open(IN,"./linkmotorank/day.txt");
@linkmotorank= <IN>;
close(IN);

open(OUT,">./linkmotorank/$linkmotorankdaymon/$linkmotorankdayday.txt");
print OUT @linkmotorank;
close(OUT);

#現在のリンク元ファイルを初期化する。
#データに今のリンクと1を入れる。
$linkmotorankdata="$linkmoto,1,\n";
open(OUT,">./linkmotorank/day.txt");
print OUT "$mday,$mon,$year,\n";
print OUT $linkmotorankdata;
close(OUT);

}

リンク元解析側のプログラム。やり方は生ログの時同じ。↓
#----------------------------------------------------------
#リンク元ランク処理
sub syorilinkmotorank(){
if ($kikan eq "day"){&syorilinkmotorankday();}
if ($kikan eq "mon"){&syorilinkmotorankmon();}
if ($kikan eq "year"){&syorilinkmotorankall();}
}
#リンク元ランク処理(日)
sub syorilinkmotorankday(){
#----------------------------------------------------------
#蓄積リンク元ランクファイルから読み込み
open(IN,"./linkmotorank/$inmon/$inday.txt");
#----------------------------------------------------------
#始めのファイルには日月年が入ってる。
($linkmotorankday,$linkmotorankmon,$linkmotorankyear)=split(/,/,<IN>);
#----------------------------------------------------------
#参照年月日と今のリンク元ランクが同じ日のときそのデータを入れる。
if (($linkmotorankday == $inday)&& ($linkmotorankmon ==$inmon)&& ($linkmotorankyear==$inyear)){

#リンク元ランクファイル数を初期化
$linkmotorankkazu=1;
while($linkmotorankdata[$linkmotorankkazu] = <IN>){
#リンク元ランクファイル数
$linkmotorankkazu++;
}
}
close(IN);
#----------------------------------------------------------
#今のリンク元ランクファイルから読み込み
open(IN,"./linkmotorank/day.txt");
#----------------------------------------------------------
#始めのファイルには日月年が入ってる。
($linkmotorankday,$linkmotorankmon,$linkmotorankyear)=split(/,/,<IN>);
#----------------------------------------------------------
#参照年月日と今のリンク元ランクが同じ日のときそのデータを入れる。
if (($linkmotorankday == $inday)&& ($linkmotorankmon ==$inmon)&& ($linkmotorankyear==$inyear)){

#リンク元ランクファイル数を初期化
$linkmotorankkazu=1;
while($linkmotorankdata[$linkmotorankkazu] = <IN>){
#リンク元ランクファイル数
$linkmotorankkazu++;
}
#----------------------------------------------------------
}
close(IN);
#----------------------------------------------------------
#リンク元ランクファイル数を調整
$linkmotorankkazu--;

#リンク元ランク分割
for ($i=1;$i<=$linkmotorankkazu;$i++){
($linkmotoranklink[$i],$linkmotorankkaisuu[$i],$dami)=split(/,/,$linkmotorankdata[$i]);
}

#リンク元をランク順位にしに行く。
&syorilinkmotorankrank();
}
#リンク元ランク処理(月)
sub syorilinkmotorankmon(){
#----------------------------------------------------------
#蓄積リンク元ランクファイルから読み込み
open(IN,"./linkmotorank/$inmon/tmon.txt");
#----------------------------------------------------------
#始めのファイルには月年が入ってる。
($linkmotorankmon,$linkmotorankyear)=split(/,/,<IN>);
#----------------------------------------------------------
#参照年月日と今のリンク元ランクが同じ日のときそのデータを入れる。
if (($linkmotorankmon ==$inmon)&& ($linkmotorankyear==$inyear)){

#リンク元ランクファイル数を初期化
$linkmotorankkazu=1;
while($linkmotorankdata[$linkmotorankkazu] = <IN>){
#リンク元ランクファイル数
$linkmotorankkazu++;
}
}
close(IN);
#----------------------------------------------------------
#今のリンク元ランクファイルから読み込み
open(IN,"./linkmotorank/mon.txt");
#----------------------------------------------------------
#始めのファイルには月年が入ってる。
($linkmotorankmon,$linkmotorankyear)=split(/,/,<IN>);
#----------------------------------------------------------
#参照年月と今のリンク元ランクが同じ日のときそのデータを入れる。
if (($linkmotorankmon ==$inmon)&& ($linkmotorankyear==$inyear)){

#リンク元ランクファイル数を初期化
$linkmotorankkazu=1;
while($linkmotorankdata[$linkmotorankkazu] = <IN>){
#リンク元ランクファイル数
$linkmotorankkazu++;
}
#----------------------------------------------------------
}
close(IN);
#----------------------------------------------------------
#リンク元ランクファイル数を調整
$linkmotorankkazu--;

#リンク元ランク分割
for ($i=1;$i<=$linkmotorankkazu;$i++){
($linkmotoranklink[$i],$linkmotorankkaisuu[$i],$dami)=split(/,/,$linkmotorankdata[$i]);
}

#リンク元をランク順位にしに行く。
&syorilinkmotorankrank();
}
#リンク元ランク処理(all)
sub syorilinkmotorankall(){
#----------------------------------------------------------
#リンク元ランクallファイルから読み込み
open(IN,"./linkmotorank/all.txt");
#----------------------------------------------------------

#リンク元ランクファイル数を初期化
$linkmotorankkazu=1;
while($linkmotorankdata[$linkmotorankkazu] = <IN>){
#リンク元ランクファイル数
$linkmotorankkazu++;
}

close(IN);

#----------------------------------------------------------
#リンク元ランクファイル数を調整
$linkmotorankkazu--;

#リンク元ランク分割
for ($i=1;$i<=$linkmotorankkazu;$i++){
($linkmotoranklink[$i],$linkmotorankkaisuu[$i],$dami)=split(/,/,$linkmotorankdata[$i]);
}

#リンク元をランク順位にしに行く。
&syorilinkmotorankrank();
}
#----------------------------------------------------------

#リンク元をランク順位する。
sub syorilinkmotorankrank(){

#最初の1番をそのまま入れる。
$linkmotorankkaisuurank[1] = $linkmotorankkaisuu[1];
$linkmotoranklinkrank[1] = $linkmotoranklink[1];

for ($i = 2;$i<=$linkmotorankkazu;$i++){
#(空白に0の数字を入れる。)
$linkmotorankkaisuurank[$i] = 0;
for($j = $i;$j>=1;$j--){
if ($linkmotorankkaisuurank[$j] <= $linkmotorankkaisuu[$i]){
#-----------------------------------------------
#文字を順位順にする。
$linkmotorankkaisuurank[$j + 1] =$linkmotorankkaisuurank[$j];
$linkmotorankkaisuurank[$j] = $linkmotorankkaisuu[$i];
#-----------------------------------------------
#打鍵数を順位順にする。
$linkmotoranklinkrank[$j + 1] =$linkmotoranklinkrank[$j];
$linkmotoranklinkrank[$j] = $linkmotoranklink[$i];
}
}
}

}

リンク元を回数順にした。下の画面は日別のものだが、月別、全てと表示可能。↓


030726


ホストを訪問ランク順に表示できるようにした。リンク元表示の引用でサクット完成させた。↓



ホストをさらさないように秘密として載せてます。↓


選択された情報のテーブルのセルの背景を変えるように処理させた↓


今のページの情報を載せた。↓


030727

ホストの時間を取得できるようにした。↓

時間が1桁のときは前に0をつけて2桁にする。また年も-2000させて表示させた。↓

# 今の年月日時分秒を取得
sub now(){

$nyear=&syorifutaketa($year);
$nmon=&syorifutaketa($mon);
$nmday=&syorifutaketa($mday);
$nhour=&syorifutaketa($hour);
$nmin=&syorifutaketa($min);
$nsec=&syorifutaketa($sec);

$now="[$nyear/$nmon/$nmday] ($youbi) $nhour:$nmin:$nsec";
}
#----------------------------------------------------------
#$nowの2桁処理をする。
sub syorifutaketa(){
#2000より大きいときは-2000とする。
if ($_[0] > 2000){$_[0]=$_[0]-2000;}

#文字が1文字のときは2桁にする。
if (length($_[0])== 1){$_[0]="0$_[0]";}

return($_[0]);
}

生ログの情報に色々追加した。訪問回数、訪問時間はホストランクファイルから取得。↓


生ログの配置をちょっと変更、これでもやっぱりみずらいな。↓



030722~030727 開発中のCGI


030728

各カウンターを設置できるようにした。↓



カウンタタグを表示するようにした。↓。


アクセス数の全ての期間でパーセント表示できるようにした。↓


030801

どうやら、カウンタ画像の7.gifが8の画像になっていてたらしい。うかつでした。

指定したホストを省けるようにした。↓

#ホストが省くホストと同じ時はこの処理をしない。
if ($hosthabuku ne $host){

# カウンタ処理
&count();

#その他処理(ホスト、生ログ、リンク元など)
&syorisonota();
}


今日すでに訪問したときはカウントしないように。↓
#今日始めての訪問のときはカウンタ処理をする。
if ($hostdayari==0){
# カウンタ処理
&count();
}

上のサブルーチンのプログラム。↓
#今日すでに訪問したか調べる(日のホスト取得して調べる)
sub hostdayari(){
# 今のホストランクファイルから読み込み

open(IN,"./hostrank/day.txt");
($hostrankdayday,$hostrankdaymon,$hostrankdayyear,$dami) =split(/,/,<IN>);
#------------------------------------------------------
#ホストランクのファイルの数
$hostrankkazu=1;
while($hostrankdata[$hostrankkazu] = <IN>){
#蓄積月ファイル数
$hostrankkazu++;
}
close(IN);
#------------------------------------------------------
#蓄積月ファイル数を調整
$hostrankkazu--;

#------------------------------------------------------
#ホストランクのファイルを分割
for ($i=1;$i<=$hostrankkazu;$i++){
($hostrankhost[$i],$dami)=split(/,/,$hostrankdata[$i]);
}
#------------------------------------------------------
#ホストがすでにあるか調べる
$hostdayari=0;
for ($i=1;$i<=$hostrankkazu;$i++){
#もしあるときはariを1にする。
if($host eq $hostrankhost[$i]){

$hostdayari=1;
}
}
}

すでに訪問したかをチェックするのを設定できるようにした。
#今日始めての訪問のときはカウンタ処理をする。(訪問ありのときはhostdaycheckari=1になる)
if (($hostdaycheck==1)&&($hostdaycheckari==1)){
}else{
# カウンタ処理
&count();
}

030728~030801 開発中CGI


030802

リンクスタイルを追加した。また情報選択を上へ持ってきた。↓


030815
カレンダーのフォントサイズを2に統一した。

ロボット回避を表示subに移動させた。また<body>タグが間違っていたのを修正。タイトルを追加。↓
print"<html><head>";
#ロボット回避
print"<META NAME='ROBOTS' CONTENT='NOINDEX, NOFOLLOW'>";
print"<title>$title</title>";
print"</head>";
print"<body>";

データディレクトリを簡単に変更できるようにした。↓
#すべてのデータディレクトリ
$filedata="./data";


ロック権を使ったロックを組み込んだ。

030802~