CGI プログラムは,HTML 文書(とヘッダ)を生成するプログラムと思えば理解 しやすい.ユーザは通常の静的な HTML 文書と同様に CGI プログラムにリク エストを行う.CGI プログラムが動作し,ヘッダと HTML 文書を生成し, ユーザに返す.ユーザからは静的な HTML と同様に利用できる.
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 でサーバを再起動せよ.
下記のプログラムを ~/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年度の受講生についてのリンクは以下の通り.
次に 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年度の受講生についての出力ファイルのリンクは以下の通り.
以下のプログラムを自分の計算機の ~/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 を作ることができる.
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 をインストールしてから実行してみよ.