CGI, CPAN, LWP module
CGI, CPAN, LWPモジュール

CGI

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

簡単な CGI プログラム

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

ls /etc/apache2/mods-enabled を実行すると,cgi.conf cgi.load が 存在しないことが確認できる.標準の状態では cgi モジュールが 有効化されていないためである. userdir と同様に a2enmod コマンドを利用して CGI モジュールを有効化する. 以下のコマンドを実行せよ.

$ sudo a2enmod cgid

ls /etc/apache2/mods-enabled を実行し,cgi.conf cgi.load が存在することを確認せよ.

次にpublic_html 直下に cgi-bin ディレクトリを作成せよ(mkdir). パーミッションが 775 (755 でもよい)になっているか確認せよ.

上記 cgi-bin ディレクトリのファイルに CGI の実行許可を与える設定を 行う.これは

/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 systemctl restart apache2 でサーバを再起動せよ.

練習 10.1

下記のプログラムを ~/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アドレス/~自分のユーザ名/cgi-bin/first.cgi
としてアクセスしてみよ.

2019年度の受講生についてのリンクは以下の通り.

練習 10.2

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

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

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`; に変更することで目的のプログラムを作成できる.

(動作確認用URL)

課題 7 が完成しなかった学生は 以下のプログラムをreport07.plというファイル名でホームディレクトリの下の pl ディレクトリ直下に 作れ.

#!/usr/bin/perl -w
use strict;

my $x;
my $y;
my $n = 10000000;
my $m = 100000;
my $all;
my $in;
my $pi;

foreach (1 .. $m){
    foreach (1 .. $n){
        $x = rand;
        $y = rand;
        $in++ if ($x*$x+$y*$y < 1);
    }
    $all = $_*$n;
    $pi = $in/$all * 4;
    open OUTFILE, "> /home/自分のログイン名/public_html/report07.html"
        or die "Cannot open: $!";
    print OUTFILE<<'Section1'; 
<!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>report 07 output file</title>
</head>
<body>
<h1>pi</h1>
<dl>
Section1
    print OUTFILE "<dt>trial:</dt>\n";
    print OUTFILE "<dd>$all</dd>\n";
    print OUTFILE "<dt>circle:</dt>\n";
    print OUTFILE "<dd>$in</dd>\n";
    print OUTFILE "<dt>pi:</dt>\n";
    print OUTFILE "<dd>$pi</dd>\n";
    print OUTFILE<<'Section2';
</dl>
<hr>
<address>
generated by report07.pl
</address>
</body>
</html>
Section2
    close OUTFILE;
}

このプログラムを ./report07.pl & として実行し,授業の間バックグラウンドで動作しているようにせよ.

2019年度の受講生についての出力ファイルのリンクは以下の通り.

練習 10.3 CGI プログラムの雛型

以下のプログラムを自分の計算機の ~/public_html/cgi-bin/gtotal0.cgi として作成し, chmod 755 gtotal0.cgi コマンドで実行権限を与えよ.

プログラム gtotal0.cgi

#!/usr/bin/perl -w

use strict;
my $gtrial=0;
my $gcircle=0;
my $gpi=0;
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>gtotal.cgi</title>
</head>
<body>
<h1>pi</h1>
Section1
print "<dl>\n";
print "<dt>trial:</dt>\n<dd>$gtrial</dd>\n";
print "<dt>circle:</dt>\n<dd>$gcircle</dd>\n";
print "<dt>pi:</dt>\n<dd>$gpi</dd>\n";
print "</dl>\n";
print <<'Section2';
<hr>
<address>
generated by gtotal.cgi
</address>
</body>
</html>
Section2

2019年度の受講生についてのリンクは以下の通り.

このプログラムは $gtrial,$gcircle,$pi の値を html の形に整形して出力す るものである.上記 3 変数の値を出力する中盤とその前後の部分の出力,の 3 パートに分れていることに注意せよ.$gtrial,$gcircle,$pi には初期値と して 0 が与えられているが,これを集計で求める部分を追加することで 各自が計算したπの値を集計する CGI を作ることができる.

LWP モジュールの利用

perl では CPAN とよばれるシステムを使って追加モジュールを ネットワーク上のリソースから取得することができる.面倒な バージョン,依存関係のチェックも自動で行われる.

対話モードで CPAN を起動する. 端末で以下のコマンドを入力せよ.

% sudo cpan

設定をいろいろ聞かれるが,今回はすべてエンターキーを押し, デフォルト値を利用する.

cpan>

というプロンプトが表示されたら対話モードでコマンドが利用できる.

まず LWP モジュールを導入する. LWP モジュールにより web 上のドキュメントをブラウザではなく perl プログラムから直接アクセスするための便利な関数が 利用できるようになる.

LWP とそれに付随するものをまとめてダウンロードするには cpan のプロンプトに以下のコマンドを入力すればよい.実行せよ.

cpan> install Bundle::LWP

すべての処理が終了した後,exit コマンドで cpan を終了させよ.

LWP のインストールに失敗する場合は コマンドプロンプトから sudo apt-get update; apt-get install libwww-perl で libwww-perl をインストールしてから実行してみよ.


Updated in December 9, 2015, index, Yamamoto Hiroshi