コンピュータリテラシー演習のページへ
Rubyによるはじめてのプログラミング

CGIプログラミング(1)

CGIとは

Webページを作成するという時は、通常はHTMLファイルを作り、Webブラウザでその内容をそのまま表示するだけです。 しかし、WebはユーザがWebブラウザに入力したデータを受け取って、それをプログラムによって処理して、 応答を返すことができます。そのような仕組みの中で、古くからあり、広く使われているものにCGIがあります。

CGIはCommon Gateway Interfaceの略で、Webサーバからプログラムを実行する場合の規定(決まり事)です。 CGIの仕組みによってWebサーバから起動されたプログラムをCGIプログラムといいます。また、CGIプログラムのうちスクリプト言語で書かれたものをCGIスクリプトと呼びます。 CGIプログラムは特に開発言語は問われません。例えばCを使うことも可能です。しかし、手軽なスクリプト言語を使うことが多く、Perlが広く使われています。ここではRubyを使ってCGIプログラムを作成します。

CGIの仕組み

まず、WebサーバはWebサーバへの要求を受け取り、CGIの要求であれば、対応するCGIを実行します。 通常、/cgi-bin/ の下のファイルはCGIとして実行できます。また、.cgi と拡張子がついたファイルはCGIとして実行できます。
※ これらはWebサーバの設定によります。例えば .cgi をCGIとして実行するには .htaccess ファイルを書く場合が多くあります。ただし、電算システムの環境の場合は不要です。

実行されたCGIプログラムには、ユーザが入力した項目などのデータが環境変数として渡されます。 CGIプログラムは、それを読み取り、何らかの処理をして、標準出力に出力することで応答します。

一番簡単なCGI

それでは、ごく簡単なCGIプログラムを作成します。まずユーザからの入力は考えず、 決まったメッセージ"Hello CGI!"を表示するプログラムを実行します。

hello.cgi - 簡単な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の作成手順

  1. 上記 hello.cgi を、例えば ~/public_html 上に作成する。
  2. setwwwを実行してパーミッションを設定する。
  3. Webブラウザからアクセスする。例えば、~/public_html 上に作成したなら、 http://www.edu.tuis.ac.jp/~ユーザ名/hello.cgi というURLでアクセスする。
  4. CGI Test と表示されれば成功。

CGIプログラムの説明

上記のhello.cgiの内容を順に説明します。

1行目は#から始まるので単なるコメントのようですが、意味があります。 この行を先頭につけることで、このファイルはコマンドとして実行できるようになります。 詳しくはこちらを見てください。 さらに、CGIとして実行するには、ファイルがWebサーバから読み取り可で実行可でなければなりません。 chmod コマンドでそのように設定してください。
※ 本学のシステムの場合は、設定が違います。情報教育システムでCGIを使用する方法にあるようにsetwwwコマンドを使用してください。

2行目は、Content-Type: text/htmlと標準出力に表示して、その後改行を2つ表示しています。 これは、http形式でHTMLを出力する際の決り文句です。 標準出力について復習したい人は、UNIXの標準入出力とリダイレクションを見てください。

3行目以降は、HTMLの内容を標準出力に表示しています。以前に作ったHTMLファイルと同じものをprint文で表示しているのです。

ヒアドキュメントを使う

以上は、1行出力するたびにprint文を使っていましたが、ヒアドキュメントという仕組みをつかえばもっと簡単になります。 以下のプログラムを実行すると上記のプログラムと同じ結果になります。

#!/usr/bin/env ruby
print <<END
Content-Type: text/html

<html>
<head>
<title>CGI Test</title>
</head>
<body>
Hello CGI!
</body>
</html>
END

2行目にprint <<END と書くと、 その後のENDと書かれた行までの間を表示してくれます。 もし、表示したい内容にENDという行を含めないといけない場合は、 例えば、print <<EOSとして、 文字列の最後もEOSにして合わせます。 なお、print <<ENDと書いても、 END2など、完全に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

変数の値を表示する

通常のprint文を使う場合は、以下のように、今までと同じやり方で変数の内容を表示できます。

var.cgi - 変数の値を表示するプログラム
#!/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>

この場合、#{answer} と書いた部分には、変数answerの値、つまりこの場合は33が入ります。

課題

  1. 以下のように自分の学籍番号と名前を表示するCGIを作成せよ。
    私は学籍番号s02987の情報太郎です。
  2. 乱数の課題(さいころを振った値を表示する)をCGIで作成せよ。
  3. 現在の時刻(時、分、秒)を表示するCGIを作成せよ。現在の時刻の表示方法は以下のプログラムを参考にせよ。
    #!/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>