このページへのアクセスは人目です。(Since 2000/5/13)
はじめに CGI設置の基礎知識 掲示板の設置方法 CGI自作の前に 画面表示その1 画面表示その2 文字化けを防ぐためには CGIからのメール送信


はじめに


 掲示板やアンケートのフォーム送信には、CGIというテクニックが多用されています。これは、Common Gateway Interfaceの略語だそうです。javaのようにプログラム言語ではなく、プロバイダに設置されているサーバー上でプログラムを実行させてその結果をホームページにアクセスしているユーザーのweb画面上に表示させる技術のことを差しているようです。サーバー上で動かすプログラムは、主としてPerl言語という聞き慣れないコンピュータ言語を使用します。Perl言語以外にC言語を使う人もいるそうです。Perl言語は、ベーシックと同様にインタプリター型の言語です。フォートランなどはプログラムを実行させるためにコンパイルという作業が必要ですが、インタプリターでは不要です。ただし、そのかわり実行スピードがコンパイル型の言語より遅くなりますが・・・
 掲示板などは、ユーザーが入力したテキスト文書を送信ボタンを押すことで、プロバイダーのサーバー上で動いているperl言語のプログラムがその情報を受け取り、その内容をサーバー上に自動保存すると同時にHTML形式に変換しているわけです。当館で解説しているJavaScriptと決定的に違うのは、ユーザーのパソコン上ではなく、プロバイダーのサーバー上でプログラムが実行されているところにあります。そのため、たとえば無限ループを含んだCGIプログラムなどを設置するとプロバイダーのサーバーの実行速度を遅くしたり、サーバーを停止させてしまいます。また、サーバー上で動くため、セキュリティ上の問題もあるそうで、ユーザーが自作したプログラムの設置を認めていないプロバイダー(たとえばソネット)も数多くあります。セキュリティ面や設置の難しさなどを考えればできるだけ、JavaScriptを利用しまししょう。簡単なクイズのページなど、CGIを使わなくても大抵のことはできます。JavaScriptはユーザーが古いパソコンやインターネットエクスプローラーの古いバージョンを使っている場合に動作しないのに対して、CGIの利点は、ユーザーの環境に左右されない点でしょうね。うちの大学のパソコンルームでは、javaを使っメールの送信はできません。メールソフトとして特殊なものをつかっているもので・・・。そのようなケースでもCGIを使ったメールの送信ならば処理をサーバー上でおこなうため問題ありません。そこでこのコーナーでは、CGIを使った、メールやアンケートフォームについて解説したいと思います。と言っても全部自作するほどの力量はないので、数多く存在するダウンロード可能なCGIスクリプトのカスタマイズをしてみたいと思います。このテクニックを身につければホームページ上で注文書を記入してもらってボタンを押せば、メールの形で注文を受け取るといった商売もできますから。


CGI設置の基礎知識


 掲示板やカウンターなどCGIで作成したプログラムを利用するには、プロバイダーのサーバーに関する知識が必要です。初心者の方は、掲示板、カウンターを自分で設置するより、レンタルした方がよいと思います。広告はつきますが無料で貸してくれるところも数多くあります(詳しくは当館のホームページを作ろうのコーナーを見てね。)。広告がつくのが嫌だという方は、ほとんどのプロバイダーが用意している掲示板を利用すれば十分だと思います。私の利用しているPlalaは、カウンター、掲示板、アンケートフォームなど大抵のCGIスクリプトをあらかじめ用意してくれています。しかも設置方法も申し込みフォームに記入するだけでプロバイダーの方で自動的に設定してくれます。あとは、掲示板などのCGIスクリプトへリンクを貼るだけです。プロバイダーが用意しているCGIでは不満な方は、数多く存在するCGIスクリプトをダウンロードして自分で設置する必要があります。これにはFTPツールを使用します。ホームページを作ろうで解説しているように私はFFFTPというフリーソフトを使用しています。掲示板を設置するには、通常のホームページのアップロードと同様にファイルをプロバイダーのサーバーに転送する必要があります。ホームページを自分で作成している人ならば、誰でもやってますね。でも難しいのは、通常のページとは違うところに転送することが必要なプロバイダーも存在することです。わたしの利用しているぷららでは、CGIは通常のホームページとは別のアドレスへ転送しなければなりません。ユーザーの自作したCGIスクリプトを使用するためには、ホームページ開設手続きと同様に、申し込みが必要でした。以前に加入していたinfowebでは、通常のホームページと同じサーバーに転送していました。同じサーバーを使用するプロバイダーでもCGIは、たとえばcgi-binというような特定の名前を付けたディレクトリの中に転送しなければならないケースもあります。特に制約が設けられていない場合でも一般のファイルと区別するために、ディレクトリを作成してそこに転送することをお勧めします。それはなぜかというとCGIスクリプトは、パーミッションを変更する必要があるからです。通常のホームページは、誰でもアクセスできますが、ファイルを書き換えたりすることはできないようになってますね。windowsのファイルにもファイルの属性というのがありますね。マウスでファイルを指定し、右クリックすると読みとり専用のチェック欄がありますよね。プロバイダーのサーバーのほとんどは、OSとしてunixを使用しているのですが、UNIXの場合、ファイルの属性はかなり細かく設定できます。
アクセスしてくる人をオーナー、グループ、その他に区別したうえで、それぞれについて呼び出し、書き込み、実行について可、不可を設定することができます。この属性は、数字でも表記されます。CGIの場合は、777ないし755というパーミッションがよく使われます。777は、すべての人が呼び出し、書き込み、実行が許可されます。CGIを使えないプロバイダーが多いのはここに原因があるようです。プロバイダーと契約を結んでいる人以外の第3者がサーバー上のファイルを呼び出し、書き込みもできるので、セキュリティ上の弱点になる可能性もあるからです。したがって、これらの問題点を熟知した人以外は、CGIスクリプトの自作はやめた方がよいでしょう。



掲示板の設置方法


 最初に書いたように掲示板は、プロバイダーが用意しているケースがほとんどなのでそれを利用するのが一番です。でもプロバイダーが用意している掲示板では不満だという人のために、掲示板の設置方法を解説しておきましょう。掲示板を設置するにはまず、フリーソフトとして公開されているCGIスクリプトを入手する必要があります。私のおすすめは、超有名なKENTWEBで公開されているaska.cgiというスクリプトです。設置方法が比較的簡単のわりに、掲示板に必要とされる機能はすべて備えている大変優れたスクリプトです。このサイトでは、掲示板、カウンター、チャットというCGIの三種の神器はもちろんのこと、アンケートやおみくじなど数多くの優れたスクリプトが公開されています。しかも、それぞれのスクリプトの設置方法が丁寧に解説されています。詳しくは、このサイトの解説をみてもらうとして、初心者がつまづき安いポイントだけ解説しておきます。
 CGI設置が初心者に難しいのは、ダウンロードしたスクリプトを自分が契約しているプロバイダーの環境にあわせてカスタマイズする必要があるところです。CGIを動かすためには、プロバイダーのサーバー上でperl言語で作成したスクリプトを実行できるという前提条件が必要です。perl言語は、プログラムを実行するためのインタプリターとしてのファイルを必要とします。実はこのファイルはwindows版もあります。私が購入した『CGIプログラミング入門』に付属しているCD-ROMの中に入ってました。CGIを自作する場合は、自分のパソコンにインストールして動作確認することもできます。
 パソコンをMS-DOSの時代から使っている人なら常識ですが、ハードディスクにインストールしたアプリケーションソフトを実行するためには、通常ソフトをインストールしたファイルの場所をPATHというコマンドを使用して環境を構築します。これと同様のことが、プロバイダーのサーバー上でperl言語で表記されたスクリプトを実行させるために必要とされます。これはすべてのCGIスクリプトの最初の方に

#!/usr/local/bin/perl

という行を加えることで実現されます。あとは、管理者用パスワードの設定や、設置するホームページのアドレスなどを記入するだけです。これらの設定が済んだら、CGIスクリプトを自分の契約しているプロバイダーに転送します。その場合、ほとんどのCGIスクリプトは、特定の名前、たとえばcgi-binというディレクトリを作成するように指示しています。このディレクトリのパーミッションとCGIスクリプトのパーミッションを使用するCGIスクリプトの指示にしたがって変更します。ほとんどのケースで、755ないし、777のパーミッションのもとで使用されるようです。これらの手続きが済んだらあとは掲示板へのリンクを通常のリンクと同様にHTMLで記述するだけです。たとえば、BBS.CGIというスクリプトへリンクするなら

<A href="http://www.○○○.ne.jp/~ユーザー名/cgi-bin/BBS.CGI">

のように書くだけです。



CGI自作の前に


 すでにCGIスクリプトはプロバイダーのサーバー上で動作させるため、不完全なCGIを設置した場合、プロバイダーに迷惑をかける恐れもあります。しかし、プログラムを作成したことのある人なら誰もが経験しているように、バグの全くないプログラムを作成することは至難のワザです。実際に動作させてみないとバグ取りはできません。といってサーバー上でバグ取りすることもできません。そのような場合のために、ユーザーのパソコンをローカルサーバーとして動作させてくれるソフトがあります。インターネットにつながなくてもあなたのマシンがあたかもプロバイダーのサーバーのように振るまってくれます。私の使用しているソフトはAN HTTPDというソフトです。

http://www.st.rim.or.jp/~nakata/
 
からダウンロードできます。ダウンロードが面倒な方は

Terra著『CGIでつくるインタラクティブWebページ』エーアイ出版の付属CD-ROMに収録されていますので。このソフトをインストールして実行すると、あなたのパソコン上でCGIプログラムを動かすことができます。


画面表示その1


 CGIの作成が厄介なのは、サーバー上でプログラムを動作させるために、さまざまな処理の結果をWeb上に表示しなければならないところにあります。Web上でアンケートをとり、その結果を集計して、画面に表示するにはユーザーのパソコンとプロバイダーのサーバーとの間で情報をやりとりしなければならないわけです。ここがJavaScriptと決定的に違う部分です。判定文、ループ文などのプログラムの基本的な文法はjavaに似ていますが、Web画面へ出力をHTML形式でおこなわなければなりません。
 実際のプログラムを例にとって、画面に文字を表示させる仕組みを説明しましょう。

#!/usr/local/bin/perl
print "Content-Type: text/html\n\n";
print "<HTML>\n";
print "<HEAD>\n";
print "<TITLE></TITLE>\n";
print "</HEAD>\n";
print "<BODY>\n";
print "<P align=center><B><FONT size=+4 color=#ff0000>CGIによる画面表示プログラム</FONT></B><BR><BR>\n";
print "わざわざCGIを使う必要はないですね・・・</P>\n";
print "</BODY>\n";
print "</HTML>\n";

上記のプログラムは、perl言語で記述したプログラムです。まず1行目の

#!/usr/local/bin/perl


は、サーバー上に存在するperl言語へのパスが記述されています。これはプロバイダによって異なる場合があります。
2行目からが画面に表示する部分です。これはすべてprint文が使用されています。これは画面に文字を表示しなさいという命令です。ここで""の部分に、記述されているのがHTML言語です。第2行目には

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

と記述されていますね。Content-Type: text/html というのはこれから実行するプログラムがテキスト形式のHTML文書であることを宣言するものです。

\n

は改行させる命令です。そして各行の最後には必ず;をつけなければなりません。

print "<HTML>\n";

の部分以降は、ここからHTML形式の記述をするという宣言ですね。webブラウザのソースリストをみるとかならず最初の方にでてきますね。HTMLでは、本文は<BODY></BODY>の間に記述されます。このような約束事にしたがってprint文を使うことでperl言語でwebブラウザへの文字表示を可能にしています。このプログラムを実際にサーバーに設置するとこのようになります。わざわざCGIを使うまでもありませんね。


画面表示その2


 単に画面に表示させるだけなら、HTMLで記述した方がはるかに簡単です。でもユーザーからの入力の結果を表示するにはJavaScriptやperlの手を借りる必要があります。そのためには、HTMLのファイルとCGIスクリプトを組み合わせる必要があります。まず、HTML文書からCGIを呼び出す部分から説明しましょう。

<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0//EN">
<HTML>
<HEAD>
<META http-equiv="Content-Type" content="text/html; charset=Shift_JIS">
<TITLE></TITLE>
</HEAD>
<BODY>
<FORM ACTION="http://127.0.0.1/hkyoji/yoyaku.cgi">氏名<INPUT size="20" type="text" name="namae">
<INPUT type="submit" value="送信">
<INPUT type="reset">
</FORM>
</BODY>
</HTML>

上記の記述は、CGIスクリプトに引き渡す文字を入力してもらい、入力された文字をyoyaku.cgiに引き渡すためのものです。

<FORM ACTION="http://127.0.0.1/hkyoji/yoyaku.cgi">   

</FORM>

の部分にフォームが定義されています。"http://127.0.0.1/hkyoji/yoyaku.cgi"の部分はCGIを設置するディレクトリを指定しています。この部分は、自分の環境に合わせて書き換える必要があります。

<INPUT size="20" type="text" name="namae">

のname="namae" の部分でnamaeという変数を使用することが記述されています。

<INPUT type="submit" value="送信">
<INPUT type="reset">

の部分は送信ボタンとリセットボタンに関する記述です。次にこのHTML文書から呼び出されるCGIスクリプトは


!/usr/local/bin/perl
require 'cgi-lib.pl';
&ReadParse;
$name = $in{"namae"};
print <<hiyadoc;
content-type: text/html

<HTML>
<HEAD>
<TITLE>画面表示</TITLE>
</HEAD>
<BODY>
入力された名前は
$in{"namae"}
です。
</BODY>
</HTML>
hiyadoc

というようにしてみました。

require 'cgi-lib.pl';
&ReadParse;
$name = $in{"namae"};

の部分が入力されたデータを "namae” という変数にセットしているところです。cgi-lib.plは、入力されたデータを取り組むさいに使用されるライブラリファイルです。&ReadParse;の部分でライブラリを呼び出しています。以上の3行はユーザの入力した情報を配列変数へセットするときの決まり文句のようです。

print <<hiyadoc;
content-type: text/html

<HTML>
<HEAD>
<TITLE>画面表示</TITLE>
</HEAD>
<BODY>
入力された名前は
$in{"namae"}
です。
</BODY>
</HTML>
hiyadoc

の部分が入力された文字をHTML形式で表示する記述です。HTML形式で表示するのに1行ごとにprint文を使っていないことに気づきましたか?画面表示その1のプログラムでは1行ごとにprint文と改行マークの¥nを使用していましたが、今回はヒヤドキュメントを使用しています。これは

print <<hiyadoc;

hiyadoc

に囲まれた部分をすべてプリントするというものです。ここでhiyadocはprint文が実行される始点と終点を示しています。このhiyadocという文字の箇所には予約後を除く任意の変数が使用できます。



文字化けを防ぐためには


 日本語を表示するCGIスクリプトを実行した場合、文字化けすることがあります。これは漢字コードの問題です。コwindowsパソコンの世界ではshift-jisと呼ばれる漢字コードが使われています。一方、プロバイダーのサーバーの多くがUNIXというOSを採用しています。UNIXでは漢字コードとしてEUCを使用しています。この漢字コードの違いが文字化けの原因となります。漢字を出力する必要のないカウンタなどはこの問題を意識する必要はないのですが、画面に漢字を表示するときには、文字化けを防ぐために、windows上で作成したCGIスクリプトをEUCに変換して保存したり、FTP転送の際にEUCモードで送付する措置などが必要です。しかも厄介なことにプロバイダのサーバーの漢字コードはEUCとは限らないので必ずしもEUCで送付する必要がない場合もあるようです。画面表示その1で作成したスクリプトは、そのまま転送したところ文字化けしたので、EUCに変換してから保存して、FTP転送したところとサンプルのように正しく表示できました。EUCに変換して保存するには、超有名なテキスト・エディタである秀丸を使うのが一般的です。
 また画面表示その2のようにテキストボックスからの入力した文字を表示するプログラムの場合には、文字化けを防ぐには、入力された漢字をEUCに変換するライブラリjcode.plが必要になります。画面表示その2では、jcode.plを使用していないので、文字化けする可能性がありますのであしからず。
 
 上記で触れたCGI作成にかかせないソフトウェアについては、http://www2q.biglobe.ne.jp/~terra/cgi/freeware.htmから入手できますので。



CGIからのメール送信


 CGIにしかできない芸当のひとつにフォームからのメール送信があげられます。掲示板、アンケート、訪問帳などへの記入をメールの形で送信するものです。JavaScriptでもメール送信は可能ですが、Javaのメール送信機能はユーザーのパソコンに入っているメールソフトを利用することで実現しています。これに対してCGIは、プロバイダのサーバーのメール送信コマンドsendmailを利用して、サーバーからメールを送信することができます。ただし、私が以前加入していたinfowebのようにプロバイダーの中には、sendmailコマンドの使用を禁止しているところもあるようです。
 ではサーバーからのメール送信のCGIプログラムについて解説しましょう。

#!/usr/local/bin/perl
$sendmail = '/usr/lib/sendmail';
$myaddress = '○○@×××.or.jp';
require 'jcode.pl';
$message = <<hiyadoc;
Subject: A comment to Web

テストメッセージです。
hiyadoc

&jcode'convert(*message,'jis');

open(MAIL,"|$sendmail $myaddress");
print MAIL $message;
close(MAIL);

まず、1行目の#!/usr/local/bin/perlは、例によってperl言語へのパスですから、サーバーによっては書き換えが必要になる部分です。次に、$sendmail = '/usr/lib/sendmail';の部分が、プロバイダーのサーバーでのsendmailへのパスです。この部分もプロバイダーによっては異なる場合もあるそうです。
$myaddress = '○○@×××.or.jp';のところには、メールの送信先を指定します。
require 'jcode.pl';は、漢字変換ライブラリであるjcode.plを使用することを宣言しています。なお、jcode.plもこのcgiプログラムと同じディレクトリに転送する必要があるのでお忘れなく。

$message = <<hiyadoc;
Subject: A comment to Web

テストメッセージです。
hiyadoc

の部分がメールの本体です。ヒヤドキュメントを利用して$message の変数にメールの本文を挿入してますね。Subject: はインターネットメールのタイトルです。その下に書かかれた「テストメッセージです。」というところがメールのメッセージです。
&jcode'convert(*message,'jis');の部分が漢字コードをjisコードへ変換する命令です。

open(MAIL,"|$sendmail $myaddress");
print MAIL $message;
close(MAIL);

の3行がメール送信を実行している部分です。このプログラムだとあらかじめ入力されたメッセージしか送信できません。アンケートなどのフォームからのメール送信をおこなうには、画面表示その2で学んだテクニックと組み合わせる必要があります。



Copyright(c) 2000  by Kyoji Hashimoto
2001/09/02 14:43:26