◆NPH (Non-Parsed Header CGI)スクリプトとは?
一般的に、CGIプログラムの実行は、次のような流れをたどる。
WWWブラウザ→WWWサーバ→CGIプログラム→WWWサーバ→WWWブラウザところが、この流れを簡略化し、次のようにすることもできる。
WWWブラウザ→WWWサーバ→CGI(NPH)プログラム→WWWブラウザつまり、CGIプログラムからWWWサーバを経由しないで、直接ブラウザに応答を返すことができるのである。このCGIプログラムを、とくにNPHスクリプト(プログラム)とよんでいる。
NPHスクリプトは、応答にWWWサーバを経由しないため、サーバがサポートしていない機能を追加したり、処理の高速化に効果がある。
簡単な例を示そう。次の例文は、単純に「This is NPH Script test.」という表示を返すだけのCGIプログラムである。
[nph-helo.cgi]
#!/bin/sh echo "HTTP/1.0 200 OK" echo "Content-type: text/html" echo echo "<HTTP><HEAD><TITLE> NPH test script</TITLE></HEAD>" echo "<BODY><H2> This is NPH Script test. </H2></BODY></HTML>"
NPHスクリプトは、通常 nph- で始まるファイル名を持つ。この例の場合、ファイル名は「nph-helo.cgi」だ。
NPHスクリプトは、WWWサーバを経由しないで応答を返すため、処理の高速化に効果があると述べた。この例でも、もちろんブラウザに「This is NPH Script test.」との表示が返ってくるまでが速くなる。
ただしそのためには、nphプログラムのなかでWWWブラウザに対してWWWサーバが返す応答と同じ文字列を記述しておく必要がある。
上の例文で注目していただきたいのは、2行目の記述だ。ここには次のように記してある。
HTTP/1.0 200 OKNPHスクリプトは、「WWWブラウザに対してWWWサーバの応答と同じ応答を返す必要がある」と述べたとおり、この2行目のスクリプトは、まさしく通常のCGIプログラムでは記述する必要のないNPHスクリプトの特徴的な部分なのである。
本来であれば、WWWサーバが返答するはずの「HTTP/1.0 200 OK」という文字列を、直接NPHスクリプト側で返答するよう記述している。
別の処理を行なわせる場合は、もちろんその処理でサーバがどのような応答を返すかを知っていなければ、NHPスクリプトを作成することなどできない。NHPスクリプトとは、つまりサーバの先回りをしているようなものなのだ。
なお、このNPHスクリプトもCGIやSSI同様、WWWサーバの管理者に使用できるかどうか尋ねてみるといい。プロバイダやサーバによっては、NPHスクリプトの使用を禁止しているところもあるので注意していただきたい。
◆プロバイダで提供されているCGIを使う
これまではCGIやSSIが、わりと自由に利用できるサーバにホームページを置く場合を想定して、さまざまな解説を行ってきた。
ところが、前述したように、サーバによってはCGIもSSIも利用を禁止しているところがある。サーバ管理者にすれば、CGIやSSIを利用させて負荷が増大したり、最悪の場合にはサーバがダウンしてしまったり、セキュリティ面でも不安があるから、一般ユーザーには開放したくないというのが本音だろう。
では、CGIやSSIの利用を禁止しているプロバイダでは、これらの機能を利用することはできないのか? そんなことはない。プロバイダによっては、CGIプログラムを自ら提供しているところもあるのだ。これを利用すれば、実はもっと簡単にCGIを活用できる。そんなCGIの代表例をあげておこう。
◆アクセスカウンタとは?
あちこちのホームページに、数字の書かれたいわゆるアクセスカウンタとよばれるものがある。自分のホームページに、これまでにアクセスされた数を表示するというもの。
プロバイダでも、このグラフィックアクセスカウンタを提供しているところがあるが、プロバイダによって実際に提供されるCGIやその使い方が異なっているため、注意事項をよく読んでから利用していただきたい。
実際にプロバイダが提供するアクセスカウンタを利用する場合、HTMLファイルのなかではたとえば次のように記述する。
なお、ここではプロバイダが提供しているカウンタプログラム名を、counter.cgiとしている。ただしこれも、CGIプログラム名、その引数の使い方といったものは、提供しているプロバイダによって異なってくるから注意が必要だ。
<IMG SRC ="/cgi-bin/counter.cgi?df=ユーザ名&cl=Y">
アクセスカウンタは、プロバイダが準備するもの以外に、別のサイトで使用しているCGIを利用する方法もある。これには次のような方法がある。
(1) 知り合いの作成したカウンタCGIにアクセスする。 (2) 海外のカウンタサービスのサイトにアクセスする。どちらの場合でも、記述法は同じである。ここではアクセス先のURLを指定し、さらにカウンタプログラムを指定し、記述可能な引数などを記述することになる。たとえば、次のように記述する。
なお、海外のカウンタサービスを行なっているサイトでは、カウンタの利用が有料のサイトもある。もし利用する場合は、事前によく使用条件を確認しておくといい。
<IMG SRC ="http://counter.site.hoge/cgi-bin/counter.cgi?引数……>
また、海外に限らず、外部のサイトのCGIを使う場合は、トラフィックにも十分な配慮が必要だ。ページがアクセスされるたびに他のサイトへネットワーク転送が実施されるため、人気のあるページなどでは、トラフィック(負荷)がかなりの量となるケースもある。また、無料のカウンタサービスのサイトでは、世界中からのリクエストを受け付けるため、そのサイトへのネットワークやカウンタサーバがボトルネックとなり、カウンタの表示が異常に遅くなることも少なくない。これらのことを考慮した上で、カウンタサービスを利用するべきだろう。
◆テキスト型アクセスカウンタの作成
テキスト型アクセスカウンタは、シェルスクリプトを使っても簡単に実現できる。
用意するファイルは、カウンタ数が入るファイルと、counter.sh のシェルスクリプトファイルである。ただしこのプログラムは、ファイルロックもしないため、実用的ではないので参考にとどめて欲しい。
[count.num]初期値として 0 を、改行なしで入力しておく。このファイルには、カウンタ数が入ることになる。
0
[counter.sh]
#!/bin/sh COUNTFILE=/home/user/nohoho/public_html/cgi-bin/count.num カウンタを起動し、HTMLに返す COUNT=`cat $COUNTFILE` 人数ファイルの読み込み COUNT=`expr $COUNT + 1` 一人増やす echo $COUNT > $COUNTFILE 人数ファイルに書き込み echo $COUNT 人数の表示
[呼び出しのHTML]
あなたは<!--#exec cmd="cgi-bin/counter.sh" -->人目です。
【例】
同様の処理をCGI経由でよび出してみよう。シェルスクリプトの例と比較すると、
echo "Content-type:text/html" echoの2行が追加されているのがわかる。CGIプログラム自体が特殊なものでないことがわかるだろう。今回の例では、両者の違いを見るために例としてあげているが、実用上の面からいうと、SSIからCGIを経由する必要はない。
[countcgi.num]
0
初期値 0 を改行なしで入力する。カウンタ数が入る。
[counter.cgi]
#!/bin/sh COUNTFILE=/home/user/nohoho/public_html/cgi-bin/countcgi.num COUNT=`cat $COUNTFILE` COUNT=`expr $COUNT + 1` echo $COUNT > $COUNTFILE echo "Content-type: text/html" echo echo $COUNT
カウンタを起動し、HTMLに返す。
呼び出しのHTML では、次のように書けばよい。
あなたは<!--#exec cgi="cgi-bin/counter.cgi" -->人目です。
◆クリッカブルマップの作成
<作成の準備>
ホームページ上でマウスポインタを動かしていると、画像上のある部分でポインタの形状が変わる部分がある。このようなところをクリックすると、それに応じてアクションが起こる。
このような機能をマップ機能、またはクリッカブルマップとよんでいる。ちょっと気のきいたホームページでは、たいてい利用している機能だ。有名なところでは、NTTの「日本のWWWサーバ地図」がある。地図上をクリックすると、その近辺にあるWWWサーバが表示されるものだ。
マップ機能を利用するには、次のような準備や素材が必要となってくる。
・マップで使う画像ファイル
・マップファイル(WWWサーバによって書式が違う場合がある)
・HTMLでのタグ指定
画像ファイルは、通常のGIFファイルでいいだろう。ここでは図2-15のGIFファイルを利用して、マップファイルを作成してみることにする。
マップファイルのほうは、以下のような書式になっている。
circle maru.html 152,46 129,84 rect sikaku1.html 11,15 107,78 rect sikaku2.html 198,14 293,77
ちょっと説明しておこう。まず最初の circle、rect の部分は、マップ中で範囲を指定する円(circle)、または長方形(rect)を表わしている。
次のフィールドは、範囲をマウスでクリックしたときに実行する内容である。maru.html や sikaku1.html とあるが、つまり1行目の例でいえば、circle と指定してある円のなかをクリックすると、maru.html ファイルが呼び出されるわけだ。 最後のフィールドは、画像中の範囲を座標で示している。ちょっとわかりにくいが、たとえば1行目は最初に circle と指定されているから、これは円だ。その円の中心のX座標とY座標、さらに円の上端のX座標とY座標を、それぞれピクセル単位で指定した数値が、すなわち上記の数値になる。
クリッカブルマップを作成する場合、一番大変な作業はこの座標の入ったマップファイル作りではないだろうか。
<専用ツールMapeditを使う>
もちろん、専用のツールを使えば、意外に簡単に作成することもできる。現在、このツールとして、MacであればPageMillやHyperMapEdit、WindowsならばMapeditやMapThisといった商品が発売されているし、シェアウェアとしてネットなどにアップロードされているものもある。
ここでは、Mapeditを使って作成する手順を説明しておこう。なお、MapeditはこのFTPサイトから入手できる。
ftp://ftp.lab.kdd.co.jp/infosystems/misc/tools/
mapedit/mapedit.zipを解凍し、[File}-[Open/Create...]を選択すると、次のような画面が表示される。
Mapedit画面
この画面で、次の情報を入力する。
・Map or HTML File: 作成するマップファイル名
・Image Filename: マップで使用する画像ファイル名
・Create Type: 使用するWWWサーバを、NCSA、CERNから選択する
[OK]ボタンを選択すると、実際に指定した画像ファイルが表示される。 では、実際に範囲選択をしてみよう。まず[Tools]命令から範囲選択の種類を選択する。選択できるのは、次の3つだ。
・Polygon: 多角形、マウスで点をつなぐ。 ・Circle: 円 ・Rectangle: 長方形範囲選択の種類が決まったら、画像ファイル上をマウスの左ボタンで範囲選択する。選択範囲を確定できたら、今度はマウス右ボタンをクリックする。すると、次のウィンドウが表示される。
Mapedit上のGIFファイル
ここでは、次の項目を入力する。
選択範囲の記述がすべて終了したら、[File]-[Save]と指定すると、マップファイルが作成される。記述したマップファイルは、次のようになる。
- ・URL for clicks on this object:
- 範囲を選択された時に、実行する HTMLファイル、URL名を記述する。
- ・Comments on this object:
- マップファイル中に記述するコメント。
#Link A.HTML circle A.HTML 66,49 103,78 #Link B.HTML circle B.HTML 165,49 212,49 #Jump totte.mo.suki rect http://totte.mo.suki/ 231,5 402,41 #Jump tsugi.ni.suki rect http://tsugi.ni.suki/ 230,48 403,84
このうち行頭に # がついている行は、コメント行である。これらのコメントは、Comments on this object: で記入した文字列である。
左2つの円が、circle で、右の長方形が rect で指定されている。
マップファイルをHTMLファイル内で記述する場合は、たとえばマップファイルがtestmap.map という名であれば、次のように記述する。
<A HREF="/cgi-bin/imagemap/~nohoho/tstmap.map"> <IMG SRC="map.gif" ISMAP>
このとき map.gif、testmap.map の2つのファイルは、ともにHTMLファイルと同じディレクトリに置いておくこと。