CGIについて

CGIで何ができるか・・・

 アクセスカウンター
 クリッカブルマップ
 フォームの読み取り
 HTML文書のプログラムによる作成
 プログラムによる映像や音声の生成
 メールを発信することも可能
 所有するページの変更日時によるインデックスの作成
 来訪者のリモート・ホスト名を取得

CGIの行うことは簡単

 通常のHTML文書は指定されたファイルがサーバーからそのまま転送するが、
 CGIは、プログラムを呼び出して、その出力をブラウザーに転送する。
 また、出力とは関係ない処理もできる。
 CGIは、ホームページを置いているサイトのサーバー上で実行される。

どうやって呼び出すの?

 <A HREF="CGIprogram?param">呼び出し</A>
 <IMG SRC="CGIprogram?param">
 <FRAME SRC="CGIprogram?param">

 などのタグで呼び出す。
 この場合、paramが引き数としてシェルの環境変数で受け渡される。
 CGIのプログラムは、シェルスクリプト、C言語、Perlなどが一般的だが、
 何といってもPerlが最も適しているだろう。画像生成など特殊な重い処理を
 行わせるには、C言語が適している。
 ただし、出来るだけネットワークやサーバーの負荷を重くしないよう配慮しよう。
 Macをサーバーとしているサイトでは、アップル・スクリプトを使用している様だ。

受け取ることができる環境変数

 下のリンクは、U−netSURFのサーバーが値を返すものについて、
 実際にCGIでテキスト表示する。

 Not On Service

 WWWサーバーからの情報だけでなく、時間などホストマシンが持つ
 環境変数も取得できる。
 この表示プログラムのソースは、

 http://home.netyou.jp/77/future/cgi-bin/env.cgi

タグと出力

 CGIからブラウザーに出力されるデータは、スタンダードアウトから出力する。
 このとき、出力の最初に、MIMEヘッダーというものを送る必要がある。
 MIMEヘッダーと本文の間には、一つ空行を挿入する必要がある。
 IMGタグで呼び出されたCGIは、GIFとJPEGなど画像のみを
 返すことが許される。

  "Content-type: image/gif\n\n"
  "Content-type: image/jpeg\n\n"

 など。image以外のものを返しても無視される。
 A(アンカー)タグやFRAMEタグからの呼び出しでは、

  "Content-type: text/plain\n\n"
  "Content-type: text/html\n\n"
  "Content-type: image/gif\n\n"
  "Content-type: image/jpeg\n\n"

 などが指定できる。
 1つのタグで出力できるのは1ファイルのみ。
 複数のファイルを並列に転送する規格はMIMEで規定されているが
 ブラウザーが対応していない様だ。

アクセスカウンタの種類

 アクセスカウンタの種類には2種類ある。
 プロバイダーが用意しているものの多くは、IMGタグで呼び出すものだ。
 これは、プログラムでGIFを合成して転送しているらしい。
 もう一つは、FRAMEタグでCGIを呼び出しHTMLを合成して、
 既存のGIFを並べて表示する方法。
 ホームページにこの方法でアクセスカウンターを作るには、ブラウザーが
 フレーム対応でなければならない。しかし、現在ほとんどのブラウザーが
 フレーム対応になっているので問題ないだろう。

アクセスカウンターのサンプル

 現在、フューチャー・ホームページは、PerlによるGIFイメージ合成で
 自作のアクセスカウンターを生成しているが、開設時にはFRAMEタグを使って
 実現していた。ここではその方法を紹介する。

 1. index.html ~future/index.html
  直接呼び出されるホームページのファイル。
  このファイルには、ホームページの中身が含まれていない。
  基本的には、CGIによるフレームの呼び出しを記述しているだけだ。
  引き数で、テンプレートファイル名とカウント値を保持するファイル名を
  指定している。

 2. template.html ~future/template.html
  このファイルには、ホームページの内容の本体が記述されている。
  コメントタグ内に<!--counter-->というキーワードを仕込んでおくことで、
  その場所にアクセス・カウンタ等を配置するようにプログラムしている。
  ただし、このタグと同じ行に書かれた内容は表示されない。
  このファイルの改行コードは、プロバイダーのサーバーマシンの
  改行コードと合わせておかないと正しく機能しない。
  U−netSURFでは、UNIXなので、0x0A。
  FTPで転送の際テキストモードで転送すると自動変換される。

 3. sample.cgi ~future/cgi-bin/sample.cgi
  実際に呼び出されるCGIのプログラム。
  perlで書いてあり、動作チェック済み。
  このプログラムを使いたい人は、コピーして自分用に修正して使うといい。

 4. カウンタのGIFファイル ~future/GIF/*.gif
  以下のような各桁のイメージを用意しておく。

  ファイル名:L-frame2.gif, atfSP.gif, atf0.gif - atf9.gif, R-frame2.gif

  

 このサンプルを元に、オリジナルのアクセスカウンタ付きホームページが作ろう。
 U−netSURFにホームページを持っている人は、
 1. オリジナルのカウンタの画像を用意する。
 2. ホームページのテンプレートファイルを用意する。
 3. index.htmlをこのページを参考に作成する。
 4. CGIプログラムをコピーして、ユーザー名や画像ファイル名などを変更する。
 という手順で、実現できるはず。
 他のプロバイダーの方は、perlが使えることが必要で、CGIやその他ファイルの
 パス指定の変更などが必要になる。

ディスクの使用容量を知る

通常、プロバイダーでホームページを置く場合、容量制限(quotas)を超えた時に
初めて警告が出ます。しかし、その前にどれくらい使っているか知りたいものです。
そこで、容量を知るためのスクリプトを作ってみました。
U−netSURFは、サーバーマシンのOSがUNIXなので、以下のスクリプトで
ディスク容量を知ることが出来ます。

#!/usr/local/bin/perl

print "Content-type: text/plain\n\n";
open(IN,"du -s ..|");
$size=<IN>
close(IN);
chop $size;

$size =~ s/\s.*//;
print "$size blocks\n";
$size *=512;
print "$size bytes\n";
$size /=1024;
print "$size Kbytes\n";
$size /=1024;
print "$size Mbytes\n";
--------
du -s
は、あるディレクトリ以下のブロック(512バイト)数を知るUNIXコマンドです。
この出力結果をパイプを使って入力しています。

フューチャー・ホームページへ戻る

(C)1997 Future on netyou ALL RIGHTS RESERVED.