コンピュータネットワーク基礎
2006.06.30
電子メールで出席確認をします.宛先など以下の情報を用いてメールを作成し, 出席申告してください.なお,キーワードは授業中に紹介します.
提出形式
宛先 | justice@mag.shimane-u.ac.jp | |
件名 | AttendA_06-30_net_s0440** | Aクラス |
AttendB_06-30_net_s0440** | Bクラス | |
本文 |
学生番号 氏名 キーワード |
(改行) (改行) キーワードは授業中に紹介 |
注意 | 「件名」の**をそのままにしないで,必ず自分の学生番号 に修正して下さい.また,ABクラス別は指示にしたがって下さい. |
次のページを参考に,CGI (Common Gateway Interface) を用いたWWWと連動する プログラミング作業を行います.
http://jp.rubyist.net/magazine/?0011-CGIProgrammingForRubyBeginners
次に示すのはWebブラウザとして動作するRubyスクリプトです.これを適当なディ レクトリに保存して下さい.右クリックでダウンロードすると,client.rb という名前になっているはずです.
require 'socket' host = "localhost" port = 80 path = "/" if %r!http://(.*?)(?::(\d+))?(/.*)! =~ ARGV[0] host = $1 port = Integer($2) if $2 path = $3 end s = TCPsocket::open(host, port) s.print "GET #{path} HTTP/ 1.0\r\n\r\n" print s.read |
次のようなコマンド操作で試してみます.
$ ruby client.rb http://localhost/~b04**/index.html
これで,先週自分で作成したWebページにアクセスして表示します.結果はどう だったでしょうか.このように,Webサーバは情報提供を求められたページをブ ラウザに提供するだけですし,ブラウザは受け取った情報を整形して表示するだ けのプログラムです.今日行うのは,サーバ側でなんらかの処理をした結果を HTML言語で記述した情報に直して提供する仕組です.
教科書のp.148にあるような動的なプログラム実行をWWWを介して行うために用意 されたインターフェイスがCommon Gateway Interface (CGI)です.HTMLに記述さ れたプログラムへのリンクによって,実行プログラムが呼び出されその結果が HTMLページに反映されたり,メールやデータベースと連携して作業したりするこ とが可能です.ここでは,CGI入門としてよく知られるアクセスカウンタについ て学習します.プログラム言語としては1年生のときに学習した「オブジェクト 指向言語Ruby」を使ってみましょう.CGIで利用するようなプログラムは「テキ スト処理」が中心になりますので,動作速度にシビアなものでない限り,スクリ プト言語(コンパイルが不要のインタプリタ言語)が利用されます.世界中で最 も多く利用されているのは,Perlだと思われますが,せっかくですので,Rubyを 思い出しながら作業してみましょう.
CGIを試すには,準備が必要ですので,まずはそこから始めましょう.
cgi-bin ディレクトリの作成
CGIはサーバ上でプログラムを走らせるため,セキュリティ上危険な要素を持っ ています.そのため,一般ユーザには自由にCGIを使わせないサービスプロバイ ダも存在します.使用できる場合でも,CGIプログラムを置くディレクトリを制 限されている場合があります.ここでは,そのように制限がなされているときに, もっとも一般的な cgi-bin ディレクトリを想定した作業を行いましょ う.まずはディレクトリの作成です.
$ mkdir ~/public_html/cgi-bin
として,ディレクトリを作成します.以後の作業はそのディレクトリの中で行い ます.
Rubyによるプログラミングが未経験の人でも,CやPerl,Javaなど何かの言語の 使用経験があれば,本日の内容は問題無くできます.プログラミングの手順は以 下のようになりますが,自分で他の方法が可能な人はどのように行っても構いま せん.
まずは,テキストエディタを開いて何かのスクリプトを作成する必要があります. 例えば,以下のようなスクリプトを作成して見ましょう.
print "Hello, world!\n" |
これを例えば,hello.rb という名前で保存するとします.その保存し たディレクトリで,
$ ruby hello.rb
のようにコマンド作業をすることにより作成したRubyスクリプトを実行すること ができます.Cなど,他の言語を知っている人には説明する必要も無いような簡 単なスクリプトですが,これによりターミナルに文字を表示させることができま す.通常は,このように print などのメソッド(Cなど関数型言語で は「関数」と言いますが)を使う際には,表示させたい文字列を二重引用符で囲 みます.しかし,CGIスクリプトは結果としてHTML言語で記述されたWebページを 生成するので,大量の文字列を作成します.このとき,改行文字(\n) やたくさんの二重引用符をいちいち記述するのは面倒ですので,「ヒアドキュメ ント」という仕組を利用して見たままを出力するようにします.これは,自分で 定義した区切り文字を用いて,その区切り文字の間にあるテキストを見た目通り に出力する仕組です.先ほどのスクリプトを次のように修正して試してみましょ う.
print <<EOF Hello, world! EOF |
実行してみた結果はいかがでしょうか.この手法を利用して簡単なHTMLページ作 成を以下のように試してみて下さい.
#!/usr/bin/ruby print <<EOF <html> <head> <title> Ruby test </title> <body> Hello, world! </body> </html> EOF |
1行目にRubyのパスが記述してあります.これは,このスクリプト自体に実行権 限を与えるために必要な「おまじない」と思っていて下さい.上のスクリプトを test.rb という名前で保存したとすると,先ほどの例では, 実行に,
$ ruby test.rb
のように,Rubyインタプリタを呼び出す ruby というコマンドが使わ れていますが,それを不要にするために1行目におまじないがあると言う訳です. 次に,スクリプトに実行権限を与えておきましょう.これも,ターミナルからコ マンドで実行します.
$ chmod +x test.rb
こうしておけば,スクリプト自体が動作するアプリケーションプログラムとなり ますので,ターミナルから次のようにするだけで動くようになります.
$ ./test.rb
試してみて下さい.
ヒアドキュメントを利用しない場合には以下のように出力メソッドを利用しても HTMLドキュメントは出力できます.
#!/usr/bin/ruby print "<html>\n" print "<head>\n" print "<title>\n" print "Ruby test\n" print "</title>\n" print "<body>\n" print "Hello, world!\n" print "</body>\n" print "</html>\n"もちろんフォーマット付の出力メソッド printf も使用可能です.
#!/usr/bin/ruby title = "Ruby test" str = "Hello, world!" printf "<html>\n" printf "<head>\n" printf "<title>\n" printf "%s\n", title printf "</title>\n" printf "<body>\n" printf "%s\n", str printf "</body>\n" printf "</html>\n"printf の出力するテキスト中には,%s, %d, %f, %e, %b, %o, %xなどが挿入可能です.これらは,文字列,10進整数,浮動小数点数,浮 動少数点数の指数表現,2進数,8進数,16進数に対応します.title, str などはこの後で説明する「変数」です.
スクリプトの中に変数を取り入れて,簡単な演算なども行って表示できるように してみましょう.変数名は小文字で始まることに注意して下さい.次の例を試し てみましょう.
#!/usr/bin/ruby num = rand(10) + 1 str = "Your lucky number is " + num.to_s print <<EOF <html> <head> <title> Ruby test </title> <body> #{str} </body> </html> EOF |
rand というメソッドで乱数を発生させています.その乱数を含む文字 列を変数 str の末尾に連結させたあとで,HTMLの中に呼び出 すような仕組を使っています.このときに重要なのは,#{ } の用法です.このように#と{ }で括った中には変数名などを指定 してその値を読み出すことができます.これにより,HTML表現の中に動 的に生成した値を取り込むことが可能になります.
さっきの number.rb のファイル名を number.cgi に変え, 2行目に以下の文字列を追加しておきます.
print "Content-type: text/html\n\n" |
その後,先ほどと同様にスクリプトに実行権限を与えておいて下さい.準備が完 了したら,最初に作成した cgi-bin ディレクトリにこのcgiスクリプ トを保存します.ここまで終わったら,ブラウザのURL入力欄に,以下のように URLを記入してEnterキーを押します.
http://localhost/~b04**/cgi-bin/number.cgi
学生番号のところは当然自分のものに直しておいて下さい.さて,うまく読み込 めたでしょうか.読み込めたなら,何度か再読み込みを実行して下さい.読み直 すたびに乱数が発生しているので,数字が変わるはずです.
Webページにアクセスするとよく「あなたは123人目のお客さまです.」のような 表示を見るでしょう.このようにアクセスされた数を数えるカウンタを「アクセ スカウンタ」と呼び,CGIを利用するもっとも一般的な例のひとつです.ここで は,そのアクセスカウンタの中でもさらにもっともシンプルなテキスト表示のも のを練習してみます.
がスクリプト本体です.これを最後の拡張子 .txt を .cgi に変更して cgi-bin ディレクトリに置きます.名前がそのままではスクリプト として動作できませんので,注意して下さい.
アクセスカウンターと言っても非常に簡単な処理であることは中身を見て伺えるでしょう.読み 込むたびに,カウンターとして用意している数字に1加えるだけです.その結果 をファイルに書き込むと同時に,ブラウザにHTML言語でページ内容を出力してい ます.そして,カウンタとして,count.txt というファイルが用意さ れていないといけないことがわかります.そこで,そのファイルを用意しますが, 最初中身は空で構いません.中身の無いファイルを作成するには touch コマンドを利用します.
$ touch count.txt
後は,CGIスクリプト本体と count.txt の保護モードを適切に設定す るだけです.動くようになるまで,自分で試してみましょう.
アクセスカウンタのcgiスクリプトを動作させてみましょう.
授業の終了20分前くらいに小テストを実施します.アナウ ンスに注意してください.また,提出は電子メールにより行いますので,メール の送信準備は忘れないでいて下さい.
Aクラス小テスト |
Bクラス小テスト |
授業の終りに宿題の説明をしますので,アナウンスに注意してください.
Aクラス宿題 |
Bクラス宿題 |