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