2009062201

Keisan presentation!!
良い子は寝る時間だ






昔々、Webページを作るにはHTMLという言
語が必要でした。
今でも必要です。
ですが、それだとオウムのような反応しかしな
いので、人々はだんだん飽きてきました。
そこで現れたのがCGIです。
こいつは内容次第でいろんな反応を返したり
出来るので、飽きられませんでした。
めでたしめでたし。
CGIって何だよ!







Common Gateway Interfaceだよ!
中にPerl言語だのPython言語だのRuby言語だの
PHP言語だのいろんな言語で書けるあたりが
Commonって言われる要因?
どの言語で書かれていても(Common)アクセスする
と動作する(Gateway Interface)のがCGIの語源だ
と思いますよ。憶測ですけど
有名所では2ch等が使っている
日記系CGIはWeblogが大多数…
ブラウザゲームとかはCGIが多いか?
JavaServletとかでもあるかな…
まじめに知りたい人へ






CGIとは、Webサーバが、Webブラウザからの要求
に応じて、プログラムを起動するための仕組み。
従来、Webサーバは蓄積してある文書をただ送出
するだけであったが、CGIを使うことによって、プログ
ラムの処理結果に基づいて動的に文書を生成し、
送出することができるようになった。
現在ではほとんどのWebサーバソフトがCGIに対応
している。
CGIはどのような開発言語でも使用できるが、実際
にはPerlなどがよく使われる傾向にある。
http://e-words.jp/w/CGI.html
ここに掲載されていました。
It is like casting pearls
before swine.




CGIはいろんな言語で動かす事が出来るけど今日
はPerlって言語を使ってCGIを書いてみたい。
だから今日はPerlで書かれたCGIをアナタのPCでも
動かせるようにするよ!
つっても法政のPCだとサーバーさえ立てられたらも
う動くらしいよ。早速話せる事が一つ減ってしまった。
それでも解説します。
と思ったけど、サーバーも最初から入ってるPCもあ
るみたいです。そんな人は、これからの解説の間は
寝てて良いです。
サーバーを立てよう



まず、Perlで書かれたCGIの動作確認をする
為に、サーバーを立てる必要があります。
でも、Apacheはインストールがやだとかコマ
ンドラインがどうとかで触ってもいないのに拒
否する人がいると思います。もちろん私の思
い込みです。
そこで今回はexeファイルを1クリックするだけ
でサーバーが立ってしまう、とんでもねぇ~も
のを使います。
それは…
何だこれは!




AN HTTPD。それはzipファイルを解凍して中
身のexeファイルを1クリックするだけでサー
バーが立ってしまうとんでもねぇ~シロモノで
す(デジャヴ)。
こう見えてレジストリいじってるからアンインス
トールする時は面倒かもね。
本格的にサーバー立てたい人はApacheでお
k
大規模サーバーには向いていないです
AN HTTPDの設定(1/5)




http://www.st.rim.or.jp/~nakata/
ここにアクセスして、httpd142p.zipをダウン
ロードして下さい。
解凍先ですが、ここではC:\www\にしましょう。
自分でwwwというディレクトリを作って、そこ
に解凍したものをぶちまけましょう
解凍したら、httpd.exeをクリック!
AN HTTPDの設定(2/5)




タスクトレイのアイ
コンを右クリックし
て、オプション一般
を選びましょう
上から三行目のド
キュメントルートに
C:\www\publichtmlとでも書いて
おきましょう
AN HTTPDが置い
てあるディレクトリ
にpublic-htmlとい
う名前のディレクト
リを作りましょう
上から8行目のCGI
を実行するにチェッ
クを入れましょう
AN HTTPDの設定(3/5)


もし起動した時にこんなエラーが出たら、あなたの
PCには既にサーバーだかvmwareだか何かが動い
ています。
2007年度情科入学者向けPCのエラー回避法を解
説するよ
AN HTTPDの設定(4/5)



情科のコンピュータリテラシで1回だけやった…
見つからないなら、「vmnetcfg.exe」で探して下さい
もしそれでも見つからないなら、何かのサーバーが動いてい
ると思うんで何もしなくていいかも
AN HTTPDの設定(5/5)


NATタブのNATサービスの停止を押して適用を押して下さい
もしかしたら、DHCPタブの方かも
サーバーだけ立っても俺のモチベ
が立たないぜ



ここで、一度サーバーを立ててCGIを動かして
みて下さい(サンプルは後述します)。学校の
PCだと何故かCGIが動いてしまうのもあるらし
いです(既にPerlがインストールされている)。
詳しい話はRATだか何処かに聞いて下さい。
動かし方ですが、public-htmlの中に
sample.cgiを入れてみて、IEだかFirefoxで
http://127.0.0.1/sample.cgiへアクセス。
CGIが動いてしまった人はこの次のページか
らは寝てていいです。
レジストリいじられるのやだなあ
(アレルギーの人がよく言う言葉)




次はActive Perlをインストールしよう。
これは、インストールしなきゃいけないんです。
インストールアレルギーの人ごめんなさい。
http://www.activestate.com/activeperl/
ここへアクセスしてみて下さい。
Active Perlの設定(1/5)


DOWNLO
AD NOW
をクリック
して保存
しましょう
クリックす
ると出てく
るアン
ケートみ
たいなの
は答えな
くていい
です
Active Perlの設定(2/5)

実行しましょう。適当にNextを押して先へ進みましょ
う
Active Perlの設定(3/5)

Browse
を押す
とインス
トール
先を指
定でき
ますの
で、好き
な所に
入れま
しょう
Active Perlの設定(4/5)


一番上は環
境変数の
PATHに書
き加えるっ
ていうもの
で、コマンド
ラインから
実行する時
どこからで
も実行でき
るようにす
るものです
上から二番
目は拡張子
plを関連付
けるオプ
ションです。
わからな
かったらは
ずしたほう
がいいかも
Active Perlの設定(5/5)


Install
で容赦
なくイ
ンス
トール
します
終わっ
たら
Finish
を押し
てね
You got Perl




これで晴れてPerlで書かれたCGIを動かす事
が出来ました!
ここまでで寝ていた人は起きてもいいし寝て
てもいいです
早速書いてみようぜぇ
せっかくだから、俺はHello worldを選ぶぜ!1!
Hello world with Perl(1/5)












(再掲載)動かし方ですが、public-htmlの中にsample.cgiを入れてみて、IEだか
Firefoxでhttp://127.0.0.1/sample.cgiへアクセス。
sample.cgiの中身は以下のものを記述して下さい
#!/usr/local/bin/perl
print("Content-type: text/html\n\n");
print("<!DOCTYPE HTML PUBLIC \"-//W3C//DTD HTML 4.0
Transitional//EN\" \"http://www.w3.org/TR/REC-html40/loose.dtd\">");
print("<html><head><title>Sample cgi with
Perl</title></head><body>");
print("HELLO WORLD!");
print("</body></html>");
exit(0);
3行目のContent-typeってのが無いと、出力が出来ないのでとっても重要です。
4行目の長ったらしい奴は無いとHTML-lintですげー怒られます。詳しくはググっ
て下さい。
ダブルクォーテーションを出力したい時は\”(頭に円マークをつける)で出力します。
Hello world with Perl(2/5)

It’s a small world
Hello world with Perl(3/5)












出力部分に日本語が入っていても動くかどうか試してみましょう
#!/usr/local/bin/perl
print("Content-type: text/html\n\n");
print("<!DOCTYPE HTML PUBLIC \"-//W3C//DTD HTML 4.0
Transitional//EN\" \"http://www.w3.org/TR/REC-html40/loose.dtd\">");
print("<html><head><title>Sample cgi with
Perl</title></head><body>");
print("時よ止まれ! THE WORLD!");
print("</body></html>");
#コメント文は頭にシャープをつけるだけで良い
exit(0);
1行目はコメントではありません。これは、このCGIがPerlで書かれていますよって
言う宣言です。これが無いと動きません。
サーバーによっては、/localの部分を消さないと動かない場合もあります。理由は
ググったりヤフったりして下さい。
最後の行は処理を終えるっていう命令です。Javaで言うSystem.exit(0);です。中
身は0でも1でも何でもいいらしいですが怖いので0にします。
Hello world with Perl(4/5)

貴様はチェスや将棋で言う「詰み(チェック・メイト)」
にはまったのだッ!
Hello world with Perl(5/5)







…おかしいなあ。
実は昔のPerlでは出力部分に日本語が入っている
と文字化けしてしまうのだ
文字化けする場合、print文の前に
「require("./jcode.pl");」という一文を付け加えて、
http://www.srekcah.org/jcode/
ここからjcode.pl-2.13をダウンロードしてsample.cgi
と同じ所に入れて下さい。
最近のPerlでは標準装備されているらしく、jcode.pl
はいらないみたいです
もちろん、出力部分やコメント部分以外に日本語も
とい2バイト文字が入るとエラーが出ますよ
変数と関数(1/3)







変数の定義の仕方ですが、たとえばxという整数型
の変数を定義したかったら(下の例は1を入れておき
たい場合)
$x = 1;
と記述したら良いです。
yという浮動小数点型の変数を定義したかったら
$y;
と記述したら良いです。
実は、Perlには変数の型がありません。とっても曖
昧で、とっても直感的(はぁと)
変数と関数(2/3)








配列を宣言したい場合どうするのかと言うと
@x = {1, 1, 2, 3, 5, 8, 13, 21};
こんな感じ。この中から例えば7番目の要素を取り出したい
時は
print("$x[6]日の金曜日");と書けば、頭から7番目の要素、
ここでは13が出力されます(13日の金曜日)。つまり一番頭
は$x[0]って事ですなあ~
ちなみに、この後で$y = @x;の文を実行すると配列xの要素
数が返されますよ。この場合y = 8です
print文に変数を入れる時、変数に入っている値を出力させ
たい場合はダブルクォーテーションでくくって下さい。シング
ルクォーテーションだとドルマークが出てきますよ!
実はprint($x[6]."日の金曜日");でも出力されます
JavaだとSystem.out.print(x[6] + "日の金曜日");ですけど、
Perlじゃプラスではなくピリオドなんです
変数と関数(3/3)














Javaで言うメソッドですけど、Perlではサブルーチンって言います。どうでもいいで
すね。
書き方は以下の通り:
sub サブルーチン名前 {
my($1番目引数, $2番目引数, …) = @_;
何か処理;
return 返り値;
}
引数は{}の中に書かないといけません。Javaとは違うんです。
返り値の型とか書かなくていいんです。何と言う怠慢
my($変数の名前)というのは、{}で囲まれた所にしか通用しない変数ですぜって
事を宣言する物
local($変数の名前)というのもありますが、これはmyとは厳密には違ったもので、
処理する所で更にサブルーチンを呼んでも適用されると言う物です。
http://www.futomi.com/lecture/local/local.html
myとlocalの違いについて、ここの一番下の例とかがわかりやすいかと思います。
これを書かないとグローバル変数になると思います。詳しくはググったりヤフった
りして下さい。
if文とか







if文ですが、} else if($x == 1) {とか書こうと思った
らエラーが起きてしまいますよ
上の例では、} elsif($x == 1) {とするとおっけー
変数に文字が入っている場合、比較の仕方はif($x
eq "test") {みたいな感じ
値を条件にしたければ==, !=, >=, <=, >, <等
文字を条件にしたければeq(equal), ne(not equal)
等
あとはJavaだのCだのと似たような感じ…
コードは頭から読んでいきます。
Weblog重いんだよ…ブログパー
ツ付け過ぎだろ常考…




ファイル入出力とかする場合、ファイルのパーミッ
ション(許可)とか指定しないといけない
ゲーム系CGIは置けない所が多い(無料ページス
ペースの場合)
文法チェックとかしたい場合は「Perl check.cgi 文
法」とかでググればいろいろ出てくるはず
もし文法エラーがあるままアップロードしたりしたら
500 Internal server errorとか出てくると思うよ。他
の人に迷惑がかかるから速攻で削除しよう
今日やった奴以外の事



エターなった。
そのうち誰かがやるかもしれませんね。
だれかレポート自動作成するCGIつくってお
ねがい