解説 11月(3)

今回の学習項目です。


CGIの復習

課題1

これまでに学んだCGIプログラムの作成に関する復習を行います。 以下の課題を一つ一つ考えながら解いて、CGIに対する理解を深めてください。

課題1-1 CGIプログラムの作成手順

CGIサーバーに置かれたCGIプログラムは、ブラウザからのアクセスによってサーバー上で実行され、その実行結果がブラウザに表示されます。

#!/usr/local/bin/ruby
print "Content-type: text/html; charset=euc-jp\n\n"
$KCODE = "e"

t = Time.now

print "今日は#{t.year}年#{t.month}月#{t.day}日です。\n"
print "現在の時刻は#{t.hour}時#{t.min}分です。\n"

上のようなプログラムの書かれたtime_now.cgiというファイルが、CGIサーバーに置かれているとします。 以下の問いに答えなさい。

課題1-1-1

CGIプログラムは、実行可能なファイルに書かれている必要があります。 上で示したtime_now.cgiというファイルのパーミッションを確認すると、次のように表示されました。

[h209xxx@ls01 h209xxx]% ls -l time_now.cgi
-rw-------

これではブラウザからアクセスしたときにプログラムが実行されませんし、オフラインで(LinuxOS上で)次のように実行することもできません。

[h209xxx@ls01 h209xxx]% ./time_now.cgi
./time_now.cgi: 許可がありません.

time_now.cgiを実行可能なファイルにするためには、どのようなコマンドを実行すればよいか答えなさい。 実際にtime_now.cgiというファイルをCGIサーバーに作成し、実行属性を付与してからファイルのパーミッションを確認すること。

[ファイルに実行属性を与えるには]

ファイルのパーミッションを変更するときはchmodというコマンドを使用します。 STドメインのCGIサーバーでは、CGIファイルの所有者に実行権限を与えておく必要があります。 lsコマンドを使用してCGIファイルのパーミッションを確認したときに、次のように表示されることを確認しましょう。

[h209xxx@ls01 h209xxx]% ls -l time_now.cgi
-rwx------

課題1-1-2

ファイルのパーミッションを変更し、CGIファイルを実行する準備が整いました。 これで次のように、ファイル名を指定するだけでCGIプログラムを実行することができます。

[h209xxx@ls01 h209xxx]% ./time_now.cgi
Content-type: text/html; charset=euc-jp

今日は2012年11月9日です。
現在の時刻は9時20分15秒です。

上のようにファイル名を入力するだけでRubyのプログラムとして実行されるのは、ファイルの1行目に

#!/usr/local/bin/ruby

と書かれているからです。 この一行は、「このファイルに書かれている内容を、Rubyのプログラムとして実行しなさい」という、LinuxOSに対する命令文です。 (STドメインのLinux環境では、普段使っている ruby というコマンドの実体が、/usr/local/bin/ruby という場所にあります。)

WebブラウザでCGIファイルにアクセスするときには、CGIファイルをRubyのプログラムとして実行してもらう必要があるため、この #!/usr/local/bin/ruby という一行が必要になるのです。

このことを理解するために、先ほど実行属性を与えたtime_now.cgiをオフラインで実行し、次のことを確めなさい。

・1行目の #!/usr/local/bin/ruby を削除すると、
   ./time_now.cgi
  というコマンドでは正しく実行できなくなる。

・1行目の #!/usr/local/bin/ruby を削除しても、
   ruby time_now.cgi
  というコマンドなら正しく実行できる。

上記の2つの項目が正しいか確かめて、結果を報告すること。

課題1-1-3

プログラムをオフラインで実行することができたら、今度はブラウザからCGIファイルにアクセスし、プログラムの実行結果を確認することにします。 (上の課題で削除した #!/usr/local/bin/ruby は元に戻しておきましょう。)
まず、実行結果を確認する前に、ブラウザから実行するとどのように表示されるか予測しなさい。 予測したら、実際にブラウザでCGIファイルにアクセスして結果を表示し、予測が合っていたかどうか報告しなさい。

注:上のtime_now.cgiの出力はHTML文書ではありません。ただのテキスト文書です。 途中に改行が入っていますが、これは改行コードによるものですので、Webページに表示される文章は改行されません。 また、<meta>タグによるブラウザに対する文字コードの指定も不充分です。 そのため、場合によっては表示が文字化けしてしまうことがあるかもしれません。 そのようなときは、ブラウザの文字コードの設定をEUC-JPに変更して表示してみましょう。 (Internet Explorerの場合、メニューバーの「表示」から「エンコード」を選択し、「日本語(EUC)」を指定するとよい。)

課題1-1-4

Webブラウザには、HTML形式の文書を解釈し、Webページとして表示する機能があります。 WebブラウザはHTML文書を受け取ると、タグの意味を読み取って文字や背景に色を付けたり、文章を改行したり、文章の文字コードを特定するなど、Webページをどのように表示するかを決定します。

time_now.cgiを、HTML文書を出力するように書き変えて、次のようなWebページを表示するようにしなさい。

time_now2.cgi

そして<font>タグを使用して文字の大きさや色を指定したり、<br>タグを使用して文章を改行しなさい。 また、<meta>タグを使用してWebページの文字コードを宣言し、<title>タグを使用してタイトルを表示すること。 これらのタグは、<html>タグや<head>タグ、<body>タグなどの間の適切な場所に書く必要があります。

[文字の色や大きさを変えるには]

次のように<font>タグを使用します。

<font size="7" color="blue">今日は2012年11月4日です。</font>

[Webページの文章を改行するには]

次のように<br>タグを使用します。

今日は2012年11月4日です。<br>現在の時刻は9時30分25秒です。

[Webページの文字コードを宣言するには]

次のように<head>タグの間に<meta>タグを書いて、Webページがどの文字コードで書かれているか宣言します。

<head>
  <meta http-equiv="content-type" content="text/html; charset=EUC-JP">
  ...
</head>

文字コードを宣言しておかないと、ブラウザが間違った文字コードでWebページを表示してしまうことがあります。 (文字化けの原因になります。)

[Webページにタイトルを付けるには]

次のように<head>タグの間に<title>タグを書いて、Webページのタイトルを指定します。

<head>
  ...
  <title>今日の日付と現在時刻</title>
</head>

指定されたタイトルは、ウィンドウ最上部のタイトルバーに表示されます。


課題1-2 CGIプログラムの意義

CGIプログラムは、HTMLファイルと同様に、ブラウザにWebページを表示するために用いられます。 HTMLファイルの場合、ファイルに書かれたHTML文書がそのままブラウザに表示されますので、ファイルの内容を書き換えない限りWebページの内容も変わりません。 CGIファイルの場合は、プログラムの実行結果がHTML文書として出力されますので、一つのCGIファイルで様々なWebページを表示することができます。

以下に挙げるWebページを、「CGIプログラムで作成するとよいもの」と「CGIプログラムで作成する必要のないもの」に分類しなさい。

・現在の時刻を表示するWebページ
・自分の趣味や出身地などを書いた自己紹介のWebページ
・アクセスするたびにランダムに結果が変わる占いのWebページ
・サイトのアクセス数を記録して表示するWebページ
・アカウント名とパスワードを入力するためのフォームを表示するWebページ
・名前と生年月日の値を受け取って二人の相性を診断するWebページ

[ヒント:これまでに作成したCGIプログラムを思い出してみましょう]

ファイルに書かれたHTML文書がそのまま表示されるHTMLファイルと違い、CGIファイルには、プログラムを記述しなければいけません。 プログラムを書くのは大変かもしれませんが、CGIプログラムを使えば、HTMLファイルでは実現できないようなWebページを作成することができます。

例えば、Webページのどこかに「今日は○年×月△日です」と表示させたいとしましょう。 このWebページをHTMLファイルで作成するとしたら、日付の部分を毎日毎日書き換えなければいけません。 不可能ではありませんが、あまり現実的ではありませんね。 このような場合、現在時刻から日付を取得するCGIプログラムを作成しておけば、毎日ページを更新する必要はなくなります。 プログラムを作成する手間は若干かかるかもしれませんが、その後のファイルの書き換え作業を考えると、ずっと楽になることでしょう。

その他にも、アクセスカウンターのように、サーバー上のテキストファイルなどにデータを記録したり、記録されたデータの状態に合わせて表示を変更するWebページの場合も、プログラムの力が必要です。 また、アカウント認証ページのように、パラメータを受け取り、その値によってメッセージや表示を変更するWebページなども、CGIプログラムを用いて処理する必要があります。 このように、HTMLファイルでは実現不可能なことがCGIプログラムによって可能になります。

なお、CGIプログラムに値を送るための入力用フォームを表示するWebページは、基本的にはCGIプログラムにする必要はありません。 入力用フォームは、HTMLの<form>タグを使用すれば実現できますので、そのページ自体はHTMLファイルで作成することができます。 (値の送信先のページはCGIプログラムで作成する必要があります。値を受け取るときにCGIが必要になるのです。)

プログラミングIIIのホームに戻る