第3回:平成19年11月

図書館情報システムの
ありがちな寓話
図書系職員のための
アプリケーション開発講習会
1
もくじ
• 第1話
– 動的なHPはどうやってつくられるの?
• 第2話
– 試行錯誤を楽しみたいな…
• 本当は怖くない「コンピュータ英語」
• CGIのバグとり大作戦
• 第3話
– CGIでありがちな寓話
• どうしてモジュールを使うの?
• URIエンコードと文字コード
• フォームの値を残すには
2
第1話
動的なHPはどうやってつくられるの? (1)
CGI(古典的な仕組み)の場合
常駐し
てアク
セス待
ち
HTML
Webサーバ
呼び出し
Webブラウザ
HTML
サーバマシン
HTMLを出
力できれば
プログラム
言語はなん
でもOK
HTMLを生成するプログラムを毎回起動
(「起動」に時間がかかり応答性は不利)
CGIプログラム
必要に応じて
プログラム起動
3
ひといきコラム
[最速を目指した(?)システム屋たち]
• たとえば、Webブラウザを起動するのに、少し時間がか
かりますよね。プログラムの起動は案外と時間がかかる
ものです。CGIはこのプログラムの起動を画面表示のた
びに行うため応答速度が不利といわれています。
• そこで、でてきたのが、動的なHPを生成するプログラム
を常時起動(常駐)しておく方法です。いわば、たとえば、
Webブラウザを最初から起動しておけば、あとは検索
キーワードを入力するだけですみますよね?
• これには、Webサーバ(最初から常駐している)と一体化
させる方法、Webサーバと別プログラム(プロセス)で起
動する方法の2種類があります。
4
第1話
動的なHPはどうやってつくられるの?(2)
Webサーバとプログラムの一体化の場合
(mod_perl, mod_php, mod_ruby, Tomcat, Jetty など)
HTML
常駐し
てアク
セス待
ち
Webサーバ
サーバマシン
Webブラウザ
常駐しているWebサーバプログラムの中に
プログラムも含めてしまう。
→ 常にアクセス待ち状態でプログラムが待
機しているため、動作は速い
プログラム
Webサーバで
連携設定
もしくは専用
Webサーバ
5
第1話
動的なHPはどうやってつくられるの? (3)
Webサーバと別にプログラムを常時起動する場合
(FastCGI, Tomcat, Jetty など)
常駐し
てアク
セス待
ち
HTML
Webサーバ
Webブラウザ
常駐し
てアク
セス待
ち
呼び出し
HTML
サーバマシン
Webサーバとは別に、CGIプログラムを常駐
させておく。動作は速い。
CGIプログラム
6
ふたいきめコラム
[簡易検索エンジン最速を目指した、某M氏の昔話]
• 「簡易検索エンジン(CGI)で最速を目指す」という、若気の
至り(いわゆる“認めたくはないもの”)をしてしまった某M氏の
昔話(実話)です。
– Perlのプログラムは組みようによっては、2倍、3倍の高速化もで
きてしまいます。細かいところのチューニングもいろいろと考えら
れるのですが、ボトルネック(最大の問題箇所)潰し以外は、通常
たいして効果ないので、あまり「はまらない」ようにしましょう。
– サーバマシンが年々高速化すると、PerlによるCGIとはいえ、ほ
ぼ瞬時に処理が終わるので、いままでの苦労がなんだったか、
すごーく考えることになります。ほどほどが大事です。
7
第1話
動的なHPはどうやってつくられるの? (4)
• Licsu-Web業務システムでも使っている
Tomcat(Java)では以下の方式を選択でき
ますが、基本はいままでの話と同じです。
– Apacheではなく、専用のWebサーバを使う
– Apacheと連携して動かす(2種あり)
• mod_perlと同じ方式(Webサーバと同プロセス)
• FastCGIと同じ方式(Webサーバと別プロセス)
8
第2話
試行錯誤を楽しみたいな… (1)
本当は怖くない「コンピュータ英語」(寓話編)
太郎くんは、英語が大の苦手です。コンピュータの
ドキュメントを見ようとしたら、英語で書かれていて
あきらめモード。
でも、英語が赤点のあきらくん(ここは微妙に実話)は、
なぜか外国製のソフトウエアを扱うことができます。
太郎くんは、ちょっと不思議に思いました。
9
第2話
試行錯誤を楽しみたいな… (1)
本当は怖くない「コンピュータ英語」(寓意編)
• まず、日本語の関連文献を読もう
– カタカナの専門用語とその意味だけでも事前にわかっていると、
文中の単語を拾うだけで意味がとれることがあります
• プログラムの例だけでも参照しよう
– プログラムのコード自体は、英語も日本語も関係ないので、読ん
だり試したりすれば意味がとれます
• わからなくなったら、あたりをつけて試してみよう
– 英文読解と違って、理解しているかどうかは、実地に試すことが
できます。わからないくなったら、あたりをつけて試してしまいま
しょう。
10
第2話
試行錯誤を楽しみたいな… (2)
• CGIのバグとり大作戦(寓意編)
– コマンドラインからテストする
• 文法エラーであれば、単に実行するだけで気付きます
• print文を随所にセットして、システムの状態を確認する
• テスト用のダミーデータをセットする(1)
– あらかじめ、コマンドラインからパラメータを渡せるようにCGIを
直しておき。
» $query = new CGI(\*STDIN);
– その上で、パラメータ込みでコマンドラインから実行する
» perl xxx.cgi title=test
• テスト用のダミーデータをセットする(2)
– ポイントとなる箇所の変数に、あらかじめダミーのデータを代入
しておく。
11
第2話
試行錯誤を楽しみたいな… (2)
• CGIのバグとり大作戦(寓意編)
– 実際にWebから動かして確認する
• print文を随所にセットして、システムの状態を確認する
– print文を最初に実行する箇所より先に、MIMEヘッダを出力す
る(以降のprint文の出力が、HTMLと認識される)
» print $QUERY->header( -type => 'text/html; charset=utf8' );
• テスト用のダミーデータをセットする
– ポイントとなる箇所の変数に、あらかじめダミーのデータを代入
しておく。
12
どうしてCGIではモジュールを
使うの?
• CGIの処理では、CGIモジュールを、他のWebサーバとの
やりとりでは、LWPモジュールを使うのが定番です。
• もともと、PerlにはWeb関係の機能が含まれておらず、当
初はTCP/IPによるネットワーク接続の部分から自作をす
る必要がありました。いつも、自作では大変ですよね。
• そこで、誰もが使える形でPerlプログラムをまとめたもの
が「モジュール」です。このモジュールを使うことで他の人
がプログラムを自作しなくてもすみますし、多くの人が使
う(チェックする)ため信頼性も確保できます。
前田も「TermExtarct」(専門用語自動抽出)、
「Lingua::LanguageGuesser」(言語自動判定)の
2つのPerlモジュールをネットで配布しています。
13
URIエンコードと文字コード
• 計算機上での「文字」
– 文字コード=ビットの並び=数値
– 文字コードは、文字一文字ごとに規定した計
算機管理用のユニークID
– 番号表の規格=文字コード規格
14
文字コード変換
Shift-JISの
EUC-JPの
テキスト
テキスト
UTF-8の
計算や対象表をつかい、
文字コード変換する
テキスト
15
URIエンコード/デコード(1)
• Webでの通信で使われるエンコード方式
• 処理としては(意味合いは全然ことなるが)、
暗号化のようなもの
– エンコード → 暗号化
– デコード → 暗号解読
• 表示形式を変更するだけで、文字コード番
号を変更するわけではない(文字コード変
換とは別)
16
URIエンコード/デコード(2)
「あ」一文字で
Google検索
16進数で
1バイトめ---- e3
2バイトめ--- 81
3バイトめ---- 82
「%e3%81%82」
とエンコードされ
たことが確認で
きる
つまり、UTF-8の
「あ」を意味する
17
URIエンコード/デコード(3)
ASCIIコードのみ
保障された世界(たぶん)を
通過!
Webブラウザ
Shift-JISの
CGIプログラム
URIエンコードさ
れたテキスト
テキスト
URIエンコード
Shift-JISの
テキスト
URIデコード
18
フォームの入力データを残す方法
• HTML::FillInForm を使う
– 定番の方法
– テンプレート(HTML)を用意し、そこにフォームのデー
タを簡単に書き戻すことができる
• Ajaxを使う
– 定番かどうかは不明(「ことわけWeb」でも使用)
– フォーム入力画面を値とともに、そのまま残すことが
可能
– 難易度はHTML::FillInFormより高め?
19
HTML::FillInForm
(Perlモジュール)
フォームを
含む
HTML
CGIパラメータ
CGIプログラム-1
確認画面
(CGIパラメータ埋め込み)
CGIパラメータを
Hiddenタグで隠しておく
CGIプログラム-2
HTML::FillInForm
フォーム
(値込)を
含む
HTML
確認完了
画面
20
Ajax
(JavaScriptライブラリ”Protptye.JS”を利用すると簡単)
HTMLのフォーム部分
CGIパラメータ
実行ボタン
入力確認部分
確認データを
含んだHTML
確認ボタン
CGIパラメータを
Hiddenタグで隠しておく
C
G
I
プ
ロ
グ
ラ
ム
1
C
G
I
プ
ロ
グ
ラ
ム
2
21