Webページを作成するという時は、通常はHTMLファイルを作り、Webブラウザでその内容をそのまま表示するだけです。 しかし、WebはユーザがWebブラウザに入力したデータを受け取って、それをプログラムによって処理して、 応答を返すことができます。そのような仕組みの中で、古くからあり、広く使われているものにCGIがあります。
CGIはCommon Gateway Interfaceの略で、Webサーバからプログラムを実行する場合の規定(決まり事)です。 CGIの仕組みによってWebサーバから起動されたプログラムをCGIプログラムといいます。また、CGIプログラムのうちスクリプト言語で書かれたものをCGIスクリプトと呼びます。 CGIプログラムは特に開発言語は問われません。例えばCを使うことも可能です。しかし、手軽なスクリプト言語を使うことが多く、Perlが広く使われています。ここではRubyを使ってCGIプログラムを作成します。
まず、WebサーバはWebサーバへの要求を受け取り、CGIの要求であれば、対応するCGIを実行します。
通常、/cgi-bin/ の下のファイルはCGIとして実行できます。また、.cgi と拡張子がついたファイルはCGIとして実行できます。
実行されたCGIプログラムには、ユーザが入力した項目などのデータが環境変数として渡されます。
CGIプログラムは、それを読み取り、何らかの処理をして、標準出力に出力することで応答します。
それでは、ごく簡単なCGIプログラムを作成します。まずユーザからの入力は考えず、
決まったメッセージ"Hello CGI!"を表示するプログラムを実行します。
上記のhello.cgiの内容を順に説明します。
1行目は#から始まるので単なるコメントのようですが、意味があります。
この行を先頭につけることで、このファイルはコマンドとして実行できるようになります。
詳しくはこちらを見てください。
さらに、CGIとして実行するには、ファイルがWebサーバから読み取り可で実行可でなければなりません。
chmod コマンドでそのように設定してください。
2行目は、Content-Type: text/htmlと標準出力に表示して、その後改行を2つ表示しています。
これは、http形式でHTMLを出力する際の決り文句です。
標準出力について復習したい人は、UNIXの標準入出力とリダイレクションを見てください。
3行目以降は、HTMLの内容を標準出力に表示しています。以前に作ったHTMLファイルと同じものをprint文で表示しているのです。 以上は、1行出力するたびにprint文を使っていましたが、ヒアドキュメントという仕組みをつかえばもっと簡単になります。
以下のプログラムを実行すると上記のプログラムと同じ結果になります。
2行目にprint <<END と書くと、
その後のENDと書かれた行までの間を表示してくれます。
もし、表示したい内容にENDという行を含めないといけない場合は、
例えば、print <<EOSとして、
文字列の最後もEOSにして合わせます。
なお、print <<ENDと書いても、
END2など、完全にENDと等しい行でない場合は、
文字列の最後とは見なされません。 通常のprint文を使う場合は、以下のように、今までと同じやり方で変数の内容を表示できます。 では、さきほどのヒアドキュメントを使う場合はどうしたらよいのでしょうか。 文字列の中に変数を組み込みたい場合には、#{変数名}という表記を使います。以下はヒアドキュメントの場合の例です。
この場合、#{answer} と書いた部分には、変数answerの値、つまりこの場合は33が入ります。CGIの仕組み
※ これらはWebサーバの設定によります。例えば .cgi をCGIとして実行するには .htaccess ファイルを書く場合が多くあります。ただし、電算システムの環境の場合は不要です。一番簡単なCGI
#!/usr/bin/env ruby
print "Content-Type: text/html\n\n"
print "<html>\n"
print "<head>\n"
print "<title>CGI Test</title>\n"
print "</head>\n"
print "<body>\n"
print "Hello CGI!\n"
print "</body>\n"
print "</html>\n"
CGIの作成手順
CGIプログラムの説明
※ 本学のシステムの場合は、設定が違います。情報教育システムでCGIを使用する方法にあるようにsetwwwコマンドを使用してください。ヒアドキュメントを使う
#!/usr/bin/env ruby
print <<END
Content-Type: text/html
<html>
<head>
<title>CGI Test</title>
</head>
<body>
Hello CGI!
</body>
</html>
END
通常のHTMLファイルと同様にmetaタグで文字コードを指定してください。
以下はEUCコードの場合の例です。
#!/usr/bin/env ruby
print <<END
Content-Type: text/html
<html>
<head>
<title>CGI Test</title>
<meta http-equiv="Content-Type" content="text/html; charset=EUC-JP">
</head>
<body>
日本語のテストです
</body>
</html>
END
変数の値を表示する
#!/usr/bin/env ruby
answer = 100/3
print "Content-Type: text/html\n\n"
print "<html>\n"
print "<body>\n"
print "100/3 = ", answer, "\n"
print "</body>\n"
print "</html>\n"
#!/usr/bin/env ruby
answer = 100/3
print <<END
Content-Type: text/html
<html>
<body>
100/3 = #{answer}
</body>
</html>
課題
私は学籍番号s02987の情報太郎です。
#!/usr/bin/env ruby
t = Time.now
print "現在の時間は、"
print t.hour, "時"
print t.min, "分"
print t.sec, "秒"
print "です\n"
print "今日は、"
print t.year, "年"
print t.month, "月"
print t.day, "日"
print "です\n"
東京情報大学情報システム学科
大見 嘉弘(Yoshihiro OHMI)
<ohmi@rsch.tuis.ac.jp>