11/19日

情報アプリケーション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行がプログラム
CGIが作ったデータがHTML形式で、
文字コードがShift-JISであることを表す補足情報
#!/usr/local/bin/perl
print "Content-Type: text/html; charset=sjis\n\n";
print "こんにちは";
\n\n は返信データの中の
ヘッダと本体を分ける空白行
CGI実行時の処理その1
ウェブサーバがCGIを実行した場合、以下のような
処理が行われる
CGIを無事実行できた?
YES
ウェブサーバはまず、ウェブページの
データを正しく返信できたことを表す
返信メッセージのヘッダの途中までを
作成し、その後に、CGIがPrint関数で
出力した文字列を付け加え、それを
送り返す
NO
ウェブサーバはエラーが起きた
ことを表す返信メッセージを
作成し、それを送りかえす
CGI実行時の処理その2
先ほどのCGIが無事に実行できた場合の処理
1.
2.
CGIが無事に実行できたので
返信ヘッダの一部を作成する
1.で作成したヘッダに、CGIの
print関数が出力した文字列を
追加し、できたものを返信メッ
セージとして送り返す
HTTP/1.1 200 OK
・・・(省略)・・・
Content-Type: text/html; charset=sjis
こんにちは
HTTP/1.1 200 OK
・・・(省略)・・・
ここまではウェブサーバが
自動的に作ってくれる
この部分が返信メッセージの
ヘッダ部分
ヘッダと本文を分ける空白行
この部分をウェブラウザが
表示する
CGIプログラムのアップロード(1)
法政大学の場合、Gドライブのwwwフォルダに作成した
CGIのファイルをコピーすれば良いが、一般的なプロバイダに
CGIをアップロードするには一般にFTPと呼ばれるソフトを
使用する。そこで本授業ではFTPを使ったアップロードの
方法を紹介する
FTPソフトには様々な種類があるが、本授業では演習室の
コンピュータにインストールされているFFFTP(フリーソフト)と
いうソフトを使用する
FFFTPを家で利用したい人は法政大学市ヶ谷情報センター
利用ガイドを参照すると良いだろう
CGIプログラムのアップロード(2)
以下の手順でアップロードを行う
1. FFFTPを実行する
2. ホスト一覧の中からファイルをアップロードするホ
ストを選択し、接続ボタンをクリックする
法政大学の場合は cs1.edu.i.hosei.ac.jp
プロバイダのウェブサーバにアップロードする場合は、
新規ホストボタンを押して設定を行えば良い
3. パネルにユーザIDとパスワードを入力する
法政大学の場合はログイン時のものと同じ
CGIプログラムのアップロード(3)
FFFTPの基本説明
•
画面の説明
ウィンドウの左部分:自分のコンピュータのフォルダ
ウィンドウの右部分:接続したウェブサーバのコンピュータのフォルダ
(法政大学の場合は、Gドライブの内容が表示される)
•
アップロードの方法
右のフォルダをアップロードしたいフォルダに変更し、
アップロードしたいファイルを右のフォルダにドラッグする
•
ダウンロードの方法
右のフォルダをダウンロードしたいファイルがあるフォルダに変更
左のフォルダをダウンロードしたいファイルを保存したいフォルダに変更
右のフォルダからダウンロードしたいファイルを左のフォルダにドラッグ
CGIプログラムのアップロード(4)
アップロード手順の続き
4.
5.
6.
7.
右のフォルダのwwwをダブルクリックし、ファイルの
アップロード先であるwwwフォルダを表示する
デスクトップの renshuu1.cgi をFFFTPの右のフォルダに
ドラッグする(これでアップロード完了)
右のフォルダに表示されているrenshuu1.cgiの上にマウス
カーソルを移動し、右クリックして表示されるメニューで
「属性変更」をクリックする
パネルの中で「実行」と表示されている3つのボタンをすべ
てクリックしてチェックをONにし、OKボタンをクリックする
CGIプログラムのアップロード(5)
属性変更の意味
ウェブサーバのコンピュータのように、不特定多数の人間が
利用する場合、そのコンピュータに保存されている各ファイル
に対して、「誰が」、「どのような」操作を行うことができるかに
ついて以下のような設定を行うことができる
これをファイルのアクセス権限と呼ぶ
誰が?
どのような?
オーナー
ファイルの作者
呼出
グループ
その他
特定のグループ 書込
上記以外の人
実行
読み込み可能
書込み可能
ファイルを実行可能
CGIプログラムのアップロード(6)
属性の設定
一般的には、自分が作ったファイルを勝手に他人に書き換えたり、
実行されては困るので、左下のような設定を行う
CGIの場合は、ファイルの中身を実行する必要があるので、右下の
ような設定を行う必要がある。なお、この設定は一度だけ行えば良い
通常の設定
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と等しくない場合に真となる
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)
・・・プログラムの続き・・・
elsif ($ransuu == 3) {
print "小吉";
}
else {
print "凶";
}
入力が完了したら、ファイルをFTPでウェブサーバにアップロードし、
ファイルの属性を変更し、ウェブブラウザでCGIが正しく動作しているか
確認すること