***HPクリエイターのためのCGI講座 第40回***
3.1 簡単なカウンター

HPには必ずと言って良いくらいに、カウンターが付いていますね。
カウンター用CGIプログラムで、一番簡単な方法はどのようなやりかたでしょうか?
筆者が考えた一番簡単な方法は次のとおりです。

1.カウンター用数値ファイルを用意して、最初はそのファイルに0を書き込んでおく。
2.カウンター用CGIプログラムが起動される度に、ファイルの内容を読み出し、1を加えてファイルを書き直す。
3.ファイルに書き出すと同時に、その数値をブラウザに表示させる。

ファイルにカウンター値を持つ理由
カウンター値をプログラム内の変数に持っておけば、ファイルへの読み書きの必要がなくなり、簡単になるのでは?と疑問に思われる方も居られるでしょう。
しかし、変数はCGIプログラムが起動される度にクリアされます。
CGIプログラムの起動毎にカウンター変数を1上げても、変数は起動毎にクリアされるので、カウンター値は上がっていきません

カウンター値は、プログラムが終了しても、保持される場所に格納しておく必要があります。
それが、ファイルなのです。

残念ながらCGIでテキストをHTML文書の途中に入れるような処理はできません。
「3.数値をブラウザに表示させる」の処理は図形処理になります。
具体的にはHTML文章に
    <img src="esy_cnt.cgi">
のようにタグを記述します。

wwwサーバーは、このタグを受け取ると esy_cnt.cgi を起動させます。
esy_cnt.cgiは、カウント値の情報を図形で出力するように作成します。

HPの「簡単なカウンター」をクリックしてください。
最上部に1ケタのカウンターを、黄色の枠に、このカウンターを表示しているCGIプログラムを表示しています。

まずは、HPのHTMLソースコードをご覧ください。
下記の記述が、ありますね。
<P><IMG src="esy_cnt.cgi"></P>
この記述で、このページが開かれる度に、esy_cnt.cgiが起動されます。
ここの項では、説明を簡単にするために、1ケタのカウンターにしています。

では、esy_cnt.cgi について、説明しましょう。

open(IN,"<esy_cnt.dat");
カウンター値は ファイル名=esy_cnt.dat に入っています。
カウンター値を読み出すために esy_cnt.dat を読み込みモードでオープンします。

$cnt = <IN>;
カウンター値を変数 $cnt に読み出します。

close(IN);
カウンター値を読み出した後は、そのファイルからデータを読み出すことは、ないのでクローズします。

$cnt++;
カウンター値を1上げます。

if($cnt>9){$cnt=0};
カウンタ値が10以上であれば0にします(1ケタのカウンターなので)。

open(OUT,">esy_cnt.dat");
カウンター値をファイルへ書き込みたいので esy_cnt.dat を書込みオープンします

print OUT $cnt;
$cntを esy_cnt.dat へ書込みます

close(OUT);
esy_cnt.dat はこの後使わないので、クローズします。

print "Content-type: image/gif\n\n";
今から、gif画像データーを送ることをブラウザへ通知します。

print "Content-type: text/html\n\n";
では、ない事に注意してください。
このCGIプログラムが <IMG src="esy_cnt.cgi"> で呼び出されていることを思い出してください。
ブラウザは画像を要求しています。
CGIプログラムは Content-type: image/gif\n\n を出力して、今からgif画像 ファイルを送ることを、ブラウザに知らせています。


($dev,$ino,$mode,$nlink,$uid,$gid,$rdev,$size,$atime,$mtime,$ctime,$blksize,$blocks)=stat("c1_$cnt.gif");
stat は組み込み関数です。
ファイル情報の13要素を返します。
次のステップでgifファイルの大きさが必要です。
この組み込み関数でファイルサイズを得ています。
この例では $size にファイルサイズが格納されます。
その他の変数は使用しません、内容の説明はここでは割愛します。

"c1_$cnt.gif"はファイル名を作成しています
例えば $cnt=5 の時
c1_5.gif
になります

open(IN, "c1_$cnt.gif");
gifファイル(数字用図形)を読み込みモードでオープンします。

sysread(IN, $buf, $size);
gifファイルを読み込みます。
今までの例では、次のように記述したと思います。
$buf = <IN>;
この方法は、テキストファイルの読み出しには使えますが、画像データのような
テキストファイル以外には使用できません。
テキストファイル以外(バイナリーファイルと呼ばれる)を読み出すには、例のように
sysread を使います。

sysread の使い方
    sysread(IN, $buf, $size);
ファイルハンドル IN から $size の大きさを $buf へ読み込む

close(IN);
読み込んだgifファイルをクローズする。

print $buf;
読み込んだgifデーターをブラウザへ送ります。


********************************************************************************
講師:ALK alk@arkland.co.jp
運営:アークランド(株) http://www.arkland.co.jp/