カウンター作成の村

はじめに
ある事情でホームページのカウンターを作る事になった。
いろんなカウンターの作り方や、CGI入門のホームページを参照して、作ってみました。
最近物忘れが激しいので、自分のメモ代わりに作り方を書いてみます。

特徴ってあるかのう?
2種類のカウンターがあります。
gif画像カウンターと、テキストカウンターです。
共通の特徴
・同一アドレスの訪問者は、一日一回のカウントにしてあります。

・訪問者のアドレスを日付と共に500人までとって、500人超えたら初期化してます。

・2種類の排他チェックをして、カウンターファイルをなるべく壊さないようにしています。

・ほぼ同時訪問者があった場合、1秒間まって、カウンターファイルを更新します。10秒チャレンジします。

・CGIのプログラムなのでSSIは必要ありません。


テキストカウンターの特徴
GIF画像カウンターの特徴
・スタイルシートを使って、見栄えよくなってます。

・テキストなので早いです。

・排他で10秒待ってだめなら????が表示されます。
 (カウンターは壊れてません)

・IEでもNetscapeでも表示できますが、Netscapeだとスタイルシートの効果がない。

・色や形(IEのみ)の変更がHTMLの知識で出来ます。

・GIF画像の結合をしていないので、表示が遅いです。



動作環境みたいなの
CGIの使えるサーバ。

Perl言語を使っています。(CGIの言語の一つらしいです。)

その言語のflock関数が使える事。(使えないプロバイダーもあるらしい)
(使えならflockの所を消してください。)


こんな感じ。
テキストカウンターの例です。
000019
(上記は、実際にカウントはしてません。このHPのプロバイダーはCGI使えないのでW)
スタイルシートを使ってるので、文字の大きさ・色を変更したり、影をつけたり、ぼかしたり、波型にしたりできます。
作るのめんどいけど、print文にJavaScriptとか組み込んだら、日付や時間やカウンター数等によって、色の変更等が画像を追加せずに出来たりする。
ネスケだと、
00131
こんな感じになってしまいますが、文字フォントや、大きさは変更可能です。

作るもの
count.cgi(CGIプログラム本体。".cgi"のファイル。)
count.txt(カウンターの値と訪問者ログを編集するファイル。初期値0で作ってね。)
lockfile.loc(出力時の排他処理用ファイル)
lock2(排他用ディレクトリ(フォルダの事・後述)人によってはいらないかも)
????.html(カウンターを配置するHTML文書って当たり前か。)
上記のファイル名は、自由に変更してください。(上記ファイルの.txtと.locも変更してもOK)
変更した場合は、プログラム内や、HTML内のファイル名も変更してください。


用意するもの
テキスト使用カウンター
gif画像カウンター
編集用アプリ。まあ、メモ帳やワードパットでOK。
-----------------
"0.gif","1.gif","2.gif"〜"9.gif"
(gif画像ファイル。どこかのフリー素材から取ってきて下さい。)


準備段階
1.メモ帳等でcount.txtを初期値"0"+改行で作成してください。

2.メモ帳等でlockfile.locを空ファイルで作成してください。

3.排他ディレクトリ用のディレクトリ"lock2"を作成してください。
(後述の「サーバー登録時に行う事」を参照)



サーバー登録時に行う事
ホームページと同様に上記の「作るもの」のファイルと、画像カウンターの場合は「用意するもの」のGIF画像(0.gif〜9.gif)をアップロードします。
(プロバイダーによっては登録場所とか決まってるはずなので注意)

違うのは、その後、更新権やら、実行権やらを変更しなければいけません。

FFFTPを使用している人は、ファイルを選択して、右クリック等で変更メニューが出せます。

FTPでアップロードしているなら、以下のコマンドを打って変更してください。

quote site chmod 755 count.cgi
quote site chmod 666 count.txt
quote site chmod 666 lockfile.loc

プログラム内で排他用ディレクトリを作成していて、訪問者をカウントしている間だけ存在します。

そのディレクトリを格納するディレクトリを別に作って更新権等を与える必要があります。

(もし、アップロードするディレクトリにすでに777が設定してあるのならディレクトリは必要ないので、プログラム内の$lockdirの値設定(最初にしている)の処の"./lock2/"を消してもOKと思う(未確認)。)

ディレクトリの作り方(FFFTPならフォルダ作成メニューがあったはず)は、ftpでログインし,cgiを作成するディレクトリに移動し、
mkdir lock2
quote site chmod 777 lock2
でいいはずです。
(たぶん766でもいいかと思ったけど、私のサーバーではダメでしたオーナーは実行権がないと,lock2のディレクトリに移れ(cdコマンド)なくなったりします。)

更新権等の確認は、dirコマンドで一覧が出た時に、一番左に -rwxrwxrwx のようなのが、出ていると思います。

rはリード権、wは更新権,xは実行権をあらわしていて、-は無しと言う意味です。

一番左は、ディレクトリだと、drwxrwxrwx って感じで、dがつきます。

で三つrwxがあるのは、一番左から、オーナー、グループ、その他です。

666とかの数字は、足し算で、rは4、wは2、xは1を足し算して計算します。
(例)rとwなら、4+2=6になります。

つまり、count.txt等は、全員に更新権とリード権を与えているって感じです。


HTMLに書く事
カウンターを付けるHTML文書内の記述内容については、以下の通り。
テキスト使用カウンター
gif画像カウンター
方法は二つあります。
もっと良い方法があるかもしれませんが。

(1)フレームを使って行う方法です。
 フレームの大きさはカウンター文字の大きさ指定(後述)し、好きなように変更してください。

 フレーム未対応のブラウザーは無理。



(2)IFRAMを使って行う方法です。
 カウンターの文字の大きさから、width,heightを変更してください。

 IFRAMだと、現状のHTMLに直接書けるから便利。

 IFRAMはネスケで使えないので、ILAYERを使ってます。


(3)その他。
プログラム修正して、JavaScriptの外部ファイルを作成出力するようにして、カウンター出力したりするのも面白いかも。
その場合、IMG SRC="count.cgi" width=1 height=1とかをHTMLの上部において、下のほうで、の外部ファイルを実行するようにしたりすればいいかも。
IMGのSRCにカウンターCGIを指定するだけです。

下記の例は5桁の場合です。


CGIの後の"?"は、パラメータをCGIに渡しています。

一つ目のパラメータ"1"〜"5"は、カウンターの何桁目を表示するかを指定します。

二つ目のパラメータ"+"は、CGI実行時にカウンターを増やすぞって、指示するパラです。

つまり、二つ目のパラメータをすべて+にすると、一人の訪問者でカウンターが5上がる事になりますW

"IMG "と"SRC"で改行しているのは、表示の時にGIF間に間が開かないようにするためです。




すぐに使わせろ!!プログラムなんかみたくなーーい。
直ぐに動かしてみたい人は,以下の要領でこの下にあるプログラミングの所から、メモ帳等にコピー&ペーストして、チョビット修正してcount.cgiを作成して使ってください。

なお、メモ帳等でcount.cgiを新規作成して保存すると、count.cgi.txtになってしまったら、エクスプローラとかで、名前の変更してください。
(保存時に名前をダブルコーテーションでくくると、.txtが付かないって話しもある。)
テキストカウンター
GIF画像カウンター
プログラム共通部その1
     ↓
プログラム共通部その2
     ↓
プログラム共通部その3
     ↓
テキストカウンター専用プログラム部
の順で貼り付け。

一行目の#! /usr/bin/perlを修正

これでOKですが、
カウンターをつけるホームページにあうように、
HTMLOUTサブルーチン内のプリント文のHTML文書を
変更してください。
プログラム共通部その1
     ↓
GIFカウンター専用プログラム部その1
     ↓
プログラム共通部その2
     ↓
GIFカウンター専用プログラム部その2
     ↓
プログラム共通部その3
     ↓
GIFカウンター専用プログラム部その3
の順で貼り付け。

一行目の#! /usr/bin/perlを修正

これでOK。

CGIプログラミング
右側がプログラムソース、左側が説明です。
説明は、自分のメモのために、非常に見にくくw、細かく、脱線したりして書いてありますが、
たぶん初心者の人(私もですが)でもPerlが少しは理解できるようになるのではないかなあ??
(説明文が間違ってたら、ごめんなさい。)
プログラム共通部その1
説明部

Perlの決め事

ファイルの設定

日付の設定
(日付取得方法、変数代入の説明、文字列結合)

排他ディレクトリ作成(サブルーチンとIF文と条件説明)

カウンターファイル読込
(ファイル入出力、flock,配列変数について。)

文字列分割
(split文、ファイル内説明)

$countから改行消去
[改行は計算で無しと考えるといらんステップかも]
(文字列の変換の説明)

GIFカウンター専用プログラム部その1
説明

コマンドパラメータ取込
(環境変数の説明)

パラメータによる判定

プログラム共通部その2
説明部

アクセスログの初期化

訪問者アドレスの取得

アドレスフラグ初期化

同一アドレス、同一日付チェック
(foreach文について)
ロックファイルのロック・カウンターUP・出力
(forの無限ループ、push文,last;)
(他の言語と一味違う論理演算子)


GIFカウンター専用プログラム部その2
説明

GIFカウンター専用プログラム1のIF文の終了です。
プログラム共通部その3
説明部

HTML出力サブルーチンへ。

ロックファイルの削除
(ファイルの存在等をチェックする(-e),rmdir文)

プログラム終了
(exit(値)文)


ロックディレクトリ用サブルーチン

(サブルーチン説明(sub文)特殊変数@_ return)
ローカルフラグの初期化
(変数の扱いの種類について my文local文)

10秒チェック
(while文,mkdir文sleep文)
返り値

サブルーチン終了。
GIFカウンター専用プログラム部その3
説明

GIF用画像表示ルーチン

カウンター変数画像取得
(length文,substr文,について)

画像出力
(Content-typeについて)

エラーサブルーチン[GIF画像用]
(排他ディレクトリを強制的に消去してperlスクリプト終了。)
テキストカウンター専用プログラム部
説明

テキストカウンター用表示ルーチン

カウンターテキスト部作成

スタイルシート設定出力

エラーサブルーチン[テキスト用]