CGI
CGI プログラミング

ヒアドキュメント

ヒアドキュメントの記法は 複数行にわたる文章を出力するのに便利である. 下のプログラム部分を 実行してみよ.

print <<Section1;
This is the first line.
This is the second line.
Section1

この例の Section1 の部分の文字列を終端文字列という. 終端文字列は変数名と同様,ユーザが決める. print <<Section1 の次の行から引用が始まり, 引用開始に使った終端文字列だけからなる行があると, そこで引用は終了する.

デフォルトでは二重引用符と同じ引用となり,変数展開が行なわれる. 終端文字列を一重引用符で囲むことで一重引用符と同じ引用ができる. 二重引用符を明示的に指示することもできる. 次のプログラム部分を実行し,違いを確かめよ.

$a = "llama";
print <<"Section1";
The valiable is $a.
Section1
print <<'Section2';
The valiable is $a.
Section2

HTML 文書の生成など, 複数行に渡る文字列を出力する場合,個別の print 文を 書き連ねてもよいが,ヒアドキュメントを利用することもできる. 使いやすい方を利用せよ.

print '<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01//EN">\n';
print '<html lang="ja">\n';
print '<head>\n';
print <<'Section1';

<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01//EN">
<html lang="ja">
<head>
Section1

変数展開を行いたい場合は 2 重引用符による引用を 行う必要があるが,$ などの文字をエスケープしなければならない ことに注意せよ.

my $repno = 1;
print "<title>shortreport $repno \"here-document\"</title>";

CGI

CGI プログラムは,HTML 文書(とヘッダ)を生成するプログラムと思えば理解 しやすい.ユーザは通常の静的な HTML 文書と同様に CGI プログラムにリク エストを行う.CGI プログラムが動作し,ヘッダと HTML 文書を生成し, ユーザに返す.ユーザからは静的な HTML と同様に利用できる.

簡単な CGI プログラム

CGI プログラムとして標準出力へヘッダと HTML 本体を出力するプログラムを 書けばよい.

ウェブサーバの設置

まず,下記コマンドで自分の計算機にウェブサーバを設置し稼働させる.

$ sudo apt-get install apache2

ユーザのホームディレクトリを利用できるようにするための モジュールの設定ファイルが /etc/apache2/mods-available/userdir.conf, /etc/apache2/mods-available/userdir.load, に用意されている./etc/apache2/mods-enabled ディレクトリを調べ, 上記ファイルへのリンクが無い,すなわち有効になっていないことを確認せよ.

上記モジュールを有効にするためのコマンドは a2enmod である. 以下のコマンドで userdir を有効にせよ.

$ sudo a2enmod userdir

設定ファイルを変更しても apache2 を再起動しないと 変更が反映されない.以下のコマンドを 入力し ウェブサーバを再起動せよ.

apache2 の再起動

$ sudo service apache2 restart

/etc/apache2/mods-enabled ディレクトリを調べ, 有効になったことを確認せよ.userdir.conf を確認し, UserDir として public_html が指定されていることを確認せよ.

ホームディレクトリの下に public_html ディレクトリがある. ここに他人から読み出し可能のパーミッションで置かれたファイルは ウェブ上に公開さる.この public_html 直下に cgi-bin というディレクトリ を作成せよ.public_html, cgi-bin のパーミッションはどちらも 755 に なっているか確認せよ.(775 でもよい)

上記設定は自分のホームディレクトリ直下の public_html ディレクトリが 自分のトップディレクトリになるという意味である.ホームディレクトリで 以下のコマンドで public_html ディレクトリを作成せよ.

$ mkdir public_html

実験用のhtml文書ファイルを以下の方法でコピーする.

  1. http://sirius.yamamotolab.jt.u-tokai.ac.jp/%7Enet/index.html にアクセスし, 実験用の文書を開け.
  2. 表示>ページのソース,でソースを開き,ソース表示画面で ファイル>名前をつけてページを保存,を選択する.
  3. ファイル名を index.html とし, 「フォルダの中に保存」で一旦ホームディレクトリ(自分のユーザ名) に保存する.これで自分のホームディレクトリにコピーができたので, mv コマンド等を使って先に作成した public_html に移動させる.

cp や ls で public_html,その中の index.html のパーミッションを 確認する.ディレクトリが 755 (drwxr-xr-x), ファイルが 644 (-rw-r--r--) であればよい.

ifconfig コマンドで自分の端末のIPアドレスを調べ, ブラウザのURL欄に"http://自分の端末のIPアドレス/%7E自分のユーザ名/" を入力し,表示を確認せよ.

次に個人の public_html/cgi-bin ディレクトリ以下のファイル にCGI実行の許可を与える.

まず public_html 直下に cgi-bin ディレクトリを作成せよ(mkdir).

次に /etc/apache2/mods-available/userdir.conf ファイルを編集する.このファイルを管理者権限でエディタで開き,

        </Directory>
</IfModule>

という2行を探し,この2行の間に以下の行を挿入せよ.

        <Directory /home/*/public_html/cgi-bin>
                Options +ExecCGI
                AddHandler cgi-script .cgi .pl
        </Directory>

設定が済めば sudo service apache2 restart でサーバを再起動せよ.

下記のプログラムを ~/public_html/cgi-bin/first.cgi として作成せよ.

#!/usr/bin/perl -w

print <<'Section1';
Content-type: text/html

<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01//EN">
<html lang="ja">

<head>
<meta http-equiv="Content-Type" content="text/html; charset=euc-jp">
<title>my first CGI</title>
</head>
<body>
<h1>Hello world!</h1>
<p>This is my first CGI page.</p>

</body>
</html>
Section1

cgi-bin ディレクトリで ls -l first.cgi コマンドを実行し,アクセス権が -rwxr-xr-x となっていることを確認し,コマンドラインから実行せよ. 異なっている場合は chmod 755 first.cgi コマンドを実行し,正しく設定せ よ.

ブラウザから
http://自分の端末のIPアドレス/%7E自分のユーザ名/cgi-bin/first.cgi
としてアクセスしてみよ.

次に This is my first CGI page. の代りに date コマンドの結果を表示する CGI プログラムを作成する.

ここでは <p>This is my first CGI page.</p> を出力する部分, その前を出力する部分,後ろを出力する部分に分割する方針で作成する. This is my first CGI page. を出力するプログラムを以下のように書き変え よ.

#!/usr/bin/perl -w

print <<'Section1';
Content-type: text/html


<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01//EN">
<html lang="ja">
<head>
<meta http-equiv="Content-Type" content="text/html; charset=euc-jp">
<title>my first CGI</title>
</head>
<body>
<h1>Hello world!</h1>

Section1

print "<p>";
print "This is my first CGI page.";
print "</p>\n";

print <<'Section2';
</body>
</html>
Section2

一般の perl プログラムでできる処理を 行うことができる. print "This is my first CGI page."; の部分を print `date`; に変更することで目的のプログラムを作成できる.

課題 12

課題「HTML 文書の生成」 を読んで課題 12 を提出しなさい.


Updated in December 6, 2011, index, Yamamoto Hiroshi