情報アプリケーション1 2008年 11月 19日 第二回資料 担当 重定 如彦
目次 CGIとプログラム言語 Perlの基礎知識1-5 サンプルCGI CGIのアップロード 占いCGI Perlの基礎知識6-13
CGIとプログラム言語 CGIを作成する為にはプログラムを記述する必要がある プログラム言語には様々な種類があるが、CGIには一般的にPerlやPHPというプログラム言語が良く使われている PerlはCGIを作成する際に頻繁に必要となる文字列の処理の記述が得意なプログラム言語で、法政大学だけでなく、 多くのプロバイダでサポートされている この授業でもPerlを使ってCGIを作成する
Perlの基礎知識1 PerlをCGIで使う場合、1行目にCGIを設置するウェブサーバ上にインストールされているPerlの実行ファイルのパスを #! の後に記述する(すべて半角で記述すること) 法政大学の場合は、 #!/usr/local/bin/perl と1行目に記述すれば良い 他のプロバイダでPerlを使ってCGIを記述する場合に何を記述するかはそのプロバイダのCGIに関する解説文章を参照すること(Windowsと異なりパスでは \ ではなく / を使う点に注意)
Perlの基礎知識2 プログラムの記述と実行順序 基本的に、1行に一つずつ命令を記述する 各行の最後に ; (セミコロン)を記述する 各行の最後に ; (セミコロン)を記述する 基本的に、上の行から順番に1行ずつ プログラムは実行される (ただし、1行目の#!/usr/local/bin/perl は実行されない) プログラムを記述する際にはテキストエディタ(メモ帳や Emeditorなど)を使用すること。ワープロ(Wordや一太郎)を 使ってプログラムを記述すると余計なデータが保存されて しまうため、プログラムがうまく記述できない
Perlの基礎知識3 文字に関する注意事項 基本的に、半角文字しか使えない 特に全角のスペースを記述しないように注意! 以下の場合のみ全角文字を使っても良い “ と ” (ダブルクオーテーション)記号で囲まれた部分 “ と ” で囲まれた部分は文字列として認識される # 記号(半角)より後ろに記述された文字 #の後ろに記述された文字はコメント(注釈)とみなされ、 プログラムの実行に影響を与えない (注:“ と ”の間に記述された # は除く) 例えば #!/usr/local/bin/perl は注釈なので実行されない
Perlの基礎知識4 関数 Perlでは、プログラムで利用することが可能な、 様々な動作を行ってくれる道具が用意されている 関数には名前があり、名前を記述することで利用できる 関数名の後に () を記述する ( と )の間に関数に渡すデータを記述することができる。このデータのことを引数(ひきすう)と呼ぶ 引数が複数ある場合は、引数と引数の間を , で区切る Perlの場合、()を省略することも可能(以下省略する) 注意: () や , はすべて半角で記述すること
Perlの基礎知識5 print関数 print 出力する文字列; のように記述する printは文字を出力する関数であり、()の中に出力する文字列を引数として 記述する。CGIでprint関数を実行した場合は、ウェブブラウザに送り返す 返信メッセージに文字列が出力(書き込まれる)される。 文字列は基本的に “ ” 記号の間に記述する 記述例: print “こんにちは”; 上記の行が実行されると、 こんにちは という文字列が出力される
サンプルCGIその1 画面にこんにちはと表示するCGIプログラム例 以下の作業を行うこと メモ帳を実行する 下記のプログラムをそのまま入力する 注: \n は改行を表す記号 「renshuu1.cgi」という名前でファイルをデスクトップに保存する 注意:URLには基本的に半角文字しか使えないという決まりがあるので、 CGIを記述したファイルの名前は必ず半角文字でつけること 以下の3行がプログラム #!/usr/local/bin/perl print "Content-Type: text/html; charset=sjis\n\n"; print "こんにちは"; CGIが作ったデータがHTML形式で、 文字コードがShift-JISであることを表す補足情報 \n\n は返信データの中の ヘッダと本体を分ける空白行
CGI実行時の処理その1 ウェブサーバがCGIを実行した場合、以下のような処理が行われる CGIを無事実行できた? YES NO ウェブサーバがCGIを実行した場合、以下のような処理が行われる CGIを無事実行できた? YES NO ウェブサーバはまず、ウェブページのデータを正しく返信できたことを表す 返信メッセージのヘッダの途中までを 作成し、その後に、CGIがPrint関数で 出力した文字列を付け加え、それを 送り返す ウェブサーバはエラーが起きた ことを表す返信メッセージを 作成し、それを送りかえす
CGI実行時の処理その2 先ほどのCGIが無事に実行できた場合の処理 CGIが無事に実行できたので 返信ヘッダの一部を作成する 先ほどのCGIが無事に実行できた場合の処理 CGIが無事に実行できたので 返信ヘッダの一部を作成する 1.で作成したヘッダに、CGIの print関数が出力した文字列を 追加し、できたものを返信メッ セージとして送り返す HTTP/1.1 200 OK ・・・(省略)・・・ ここまではウェブサーバが 自動的に作ってくれる この部分が返信メッセージの ヘッダ部分 HTTP/1.1 200 OK ・・・(省略)・・・ Content-Type: text/html; charset=sjis こんにちは ヘッダと本文を分ける空白行 この部分をウェブラウザが 表示する
CGIプログラムのアップロード(1) 法政大学の場合、Gドライブのwwwフォルダに作成した CGIのファイルをコピーすれば良いが、一般的なプロバイダにCGIをアップロードするには一般にFTPと呼ばれるソフトを 使用する。そこで本授業ではFTPを使ったアップロードの 方法を紹介する FTPソフトには様々な種類があるが、本授業では演習室のコンピュータにインストールされているFFFTP(フリーソフト)というソフトを使用する FFFTPを家で利用したい人は法政大学市ヶ谷情報センター 利用ガイドを参照すると良いだろう
CGIプログラムのアップロード(2) 以下の手順でアップロードを行う FFFTPを実行する 以下の手順でアップロードを行う FFFTPを実行する ホスト一覧の中からファイルをアップロードするホストを選択し、接続ボタンをクリックする 法政大学の場合は cs1.edu.i.hosei.ac.jp プロバイダのウェブサーバにアップロードする場合は、 新規ホストボタンを押して設定を行えば良い パネルにユーザIDとパスワードを入力する 法政大学の場合はログイン時のものと同じ
CGIプログラムのアップロード(3) FFFTPの基本説明 アップロードの方法 右のフォルダをアップロードしたいフォルダに変更し、 アップロードしたいファイルを右のフォルダにドラッグする ダウンロードの方法 右のフォルダをダウンロードしたいファイルがあるフォルダに変更 左のフォルダをダウンロードしたいファイルを保存したいフォルダに変更右のフォルダからダウンロードしたいファイルを左のフォルダにドラッグ
CGIプログラムのアップロード(4) アップロード手順の続き アップロード手順の続き 右のフォルダのwwwをダブルクリックし、ファイルの アップロード先であるwwwフォルダを表示する デスクトップの renshuu1.cgi をFFFTPの右のフォルダに ドラッグする(これでアップロード完了) 右のフォルダに表示されているrenshuu1.cgiの上にマウスカーソルを移動し、右クリックして表示されるメニューで 「属性変更」をクリックする パネルの中で「実行」と表示されている3つのボタンをすべてクリックしてチェックをONにし、OKボタンをクリックする
CGIプログラムのアップロード(5) 属性変更の意味 ウェブサーバのコンピュータのように、不特定多数の人間が利用する場合、そのコンピュータに保存されている各ファイルに対して、「誰が」、「どのような」操作を行うことができるかに ついて以下のような設定を行うことができる これをファイルのアクセス権限と呼ぶ 誰が? どのような? オーナー ファイルの作者 呼出 読み込み可能 グループ 特定のグループ 書込 書込み可能 その他 上記以外の人 実行 ファイルを実行可能
CGIプログラムのアップロード(6) 属性の設定 通常の設定 CGIの場合の設定 オーナー グループ その他 呼出 ○ 書込 × 実行
CGIプログラムの実行と確認 ウェブブラウザを開いて以下のアドレスを入力し、以下のようなウェブページが表示されれば成功 http://www.edu.i.hosei.ac.jp/~ユーザID/renshuu1.cgi また、メニューで「表示」→「ソース」を実行して、このウェブページのソースが どのようになっているか確認すること
占いCGI 先ほどのCGIは単に「こんにちは」と表示するだけで、あまりCGIっぽくなかった。そこで次は、アクセスする毎に「大吉」「中吉」「小吉」「凶」のいずれかを表示するCGIを作成する このようなCGIを作るには以下のような知識が必要である 乱数の発生方法 乱数とはサイコロの出目のように出たらめな数のこと 上記の占いをつくるには1から4までの乱数を発生させる必要がある 変数 変数とはプログラムで使用する数字などのデータを格納する入れ物のこと このCGIでは発生させた乱数を変数に格納して後で利用する 条件分岐 条件(このCGIの場合は発生させた乱数の数字)によって異なる動作を行う プログラムの書き方のことを条件分岐と呼ぶ
Perlの基礎知識6 変数と代入 Perlに限らず一般的なプログラム言語では、数字や文字など のデータを変数と呼ばれる入れ物に格納することができる Perlの変数の特徴は以下のとおり 変数には好きな名前をつけることができる(半角英数字を使用可) なお、変数名はその変数に何を入れるかがわかるような 名前をつけるのが一般的である(注:一部使用できない記号あり) 変数は名前の前に $ 記号をつける決まりがある 変数には、数字や文字列を代入することができる。代入は、 $変数名 = 式; のように記述する 式には + - * / のような四則演算記号を使うことができる 式には変数や関数を記述することもできる その場合、変数の中身や関数の計算結果を使って式の計算が行われる
Perlの基礎知識7 変数の代入の記述例 $width = 5; $height = 10; $menseki = $width * $height; 上記の3行のプログラムを実行すると、mensekiという変数に 5*10=50 が代入される $myname = “重定”; 文字列を代入する場合は、“ ” 記号で囲む必要がある
Perlの基礎知識8 乱数の発生方法 乱数を発生させるにはrandという関数を使う rand(式) randは 0 から 式 未満までの乱数を発生させる $ransuu = rand(4); 上記のようなプログラムを実行すると $rannsuu という変数に 0以上4未満の数字が代入される ただし、randは小数点以下の値も含むので上記の プログラムでは、 1.234 や 2.345 のような整数ではない 数字が$rannsuuという変数に代入されてしまう 注:引数が数字の場合は()がないと 間違えやすいので()をつけている
Perlの基礎知識9 整数の乱数の発生方法 発生させた乱数を整数に変換するにはintという関数を使う int(式) intは 式の値を切り捨てるという操作を行う $ransuu = int(rand(4)); 上記のようなプログラムを実行すると、右辺のrand(4)が 実行された後、その結果をintが整数に変換するので結果 として0,1,2,3のいずれかの数字が $rannsuu に代入される 0,1,2,3ではなく、1,2,3,4の乱数を発生させたい場合は $ransuu = int(rand(4)) + 1; と記述すれば良い
Perlの基礎知識10 条件分岐 条件によって実行する内容を変化させるには、条件分岐と 呼ばれる方法を使う。条件分岐は以下のように記述する なお、{ から } の間には何行プログラムを記述しても良い if (条件式) { 条件式が真(正しい)の場合に実行するプログラム } else { 条件式が偽(正しくない)場合に実行するプログラム }
Perlの基礎知識11 条件式の書き方 条件式の部分は以下のように記述する 式1 比較演算子 式2 比較演算子には以下のものがある 条件式の書き方 条件式の部分は以下のように記述する 式1 比較演算子 式2 比較演算子には以下のものがある 数値の比較 > 式1が式2より大きい場合に真となる >= 式1が式2以上の場合に真となる < 式1が式2より小さい場合に真となる <= 式1が式2以下の場合に真となる == 式1が式2と等しい場合に真となる <> 式1が式2と等しくない場合に真となる 文字列の比較 eq 式1と式2が同じ文字列の場合に真となる ne 式1と式2が同じ文字列でない場合に真となる
Perlの基礎知識12 条件分岐の記述例 下記のプログラムは変数$scoreの中身が50以上の場合は$seisekiという変数に 合格 、そうでなければ 不合格 という文字列を代入する if ($score >= 50) { $seiseki = “合格”; } else { $seiseki = “不合格”; }
Perlの基礎知識13 3つ以上の条件分岐 3つ以上の条件分岐を行いたい場合は以下のように記述する if (条件式1) { 条件式1が真の場合に実行するプログラム } elsif (条件式2) { これより上の条件式がすべて偽で、 条件式2が真の場合に実行するプログラム } elsif (条件式3) { これより上の条件式がすべて偽で、 条件式3が真の場合に実行するプログラム } ・・・ 注: elsif の部分は必要なだけ記述できる ・・・ else { 上記のすべての条件式が偽の場合に実行するプログラム }
占いCGI(1) メモ帳を実行し、以下のプログラムを記述し、「uranai.cgi」という名前でファイルをデスクトップに保存すること #!/usr/local/bin/perl print "Content-Type: text/html; charset=sjis\n\n"; $ransuu = int(rand(4)) + 1; If ($ransuu == 1) { print "大吉"; } elsif ($ransuu == 2) { print "中吉"; ・・・次のスライドに続く・・・
占いCGI(2) 入力が完了したら、ファイルをFTPでウェブサーバにアップロードし、 ・・・プログラムの続き・・・ elsif ($ransuu == 3) { print "小吉"; } else { print "凶"; 入力が完了したら、ファイルをFTPでウェブサーバにアップロードし、 ファイルの属性を変更し、ウェブブラウザでCGIが正しく動作しているか 確認すること