[PR]Ll̋ʓ_c:L΍́H

綾小路龍之介の素人思考

Perl > サーバーにアップロードしたcgiのエラーチェック

「cgiはローカルで動作確認済みのものをアップロードしてください。」共有サーバに無用な負担がかかるのを防ぐために規約にかかれている文言だ。つまり、サーバにおける正常な動作が保証されていないスクリプトは、サーバで走らせてはいけない、ということだ。ローカルで正常動作したものが、サーバで正常動作するという保証は無い。なぜなら、ローカルとサーバでは環境が異なるからだ。では動作確認をどのようにすればいいのだろうか。サーバ上での正常動作を保証するには、サーバ上で動作確認するしかあるまい。なぜなら、正常な動作の保証は実行環境とテスト環境が全く同じであるからこそなされるからだ。この項では、Perlで書かれたcgiプログラムの異常終了を正常終了したものとし、エラーメッセージを表示するサブルーチンの導入を行うことで、サーバ上でも動作の確認ができるようにする。


目次


1.1 cgiのエラー云々の前に

エラーが出力されるようにせねば。まぁ致命的なエラーは何もしなくても出力されるんだけども、致命的なエラーはcgiが動かないのとほとんど同じ。まずはスクリプト1行目に下のようにおまじないを書いた。こう書けば、些細なことも注意してくれる。そのほうが、効率的なプログラムが書けるはずだ。gcc -Wallみたいなものだ。でもこのままでは、些細な注意のたびにcgiプログラムは終了してしまい、エラーがトレースできない。

#!/usr/local/bin/perl -wT

そこで、次の手段だ。CGI::Crapを使って、出力されたエラーをHTMLで書き出すようにする。


1.2 cgiの結果をwgetで取得

いちいちtelnetでhttpコマンドしゃべっていられんという場合には、cgiの結果をwgetで取得するといいかもしれない。HTTPレスポンスヘッダを標準出力する場合には-Sオプションを付ける。もう何でも表示してくれという場合はデバッグオプションである-dを付ける。デバッグオプションをつければ、リクエストヘッダ、レスポンスヘッダなどが標準出力される。cgiのエラーはHTTPヘッダにかかれるようなので、プロンプトにエラーが出力される。

$ wget -O /dev/null -d http://zatugakuou.hp.infoseek.co.jp/cgi-bin/0.cgi

perlで普通にlocationヘッダを出力するとiswebのサーバの場合は302が返る。301を返すために下のようにしてみたらそもそもページ遷移しなかった。

print "Status: 301 Moved Permanently\n";
print "Location: http://www.yahoo.co.jp/\n\n";

1.3 cgiの結果をtelnetクライアントで取得

telnetクライアントにHTTP要求を喋らせようということである。だからcgiの結果をtelnetで取得するという表現には違和感を覚える。なんとなくだけど。telnetというのはサービス、telnetクライアントはこのサービスに接続できるクライアントのこと。僕らはhttpサーバに接続するわけで、telnetサービスを提供しているtelnetサーバに接続するわけではないのだから、telnetクライアントの持つサーバとお喋りする機能を流用してhttpサーバとお喋りしようということなんじゃないかな。口上はこの程度にしておきましょう。

wgetを-Sオプションつきで呼び出すのもいいけれど、このとき画面に出力された内容がwgetによって加工されていないとも限らない。httpヘッダを覗く最もプリミティブな方法はtelnetを使う方法である。コマンドラインから下のようにコマンドを叩く。最後に2回改行するのを忘れない。あと、改行はCR+LFで送信するように設定。cgiのエラーは標準出力に出力されるので(多分)、受信するレスポンスヘッダ以降にエラー内容が書き込まれる(多分)。-w付きでcgiを起動させると結構エラーが出る。これをこまめに直すのも一興。

telnet zatugakuou.hp.infoseek.co.jp 80
GET /cgi-bin/foo/bar.cgi?foo+bar HTTP/1.0
Host: zatugakuou.hp.infoseek.co.jp

ここまで書いておいて不親切だと思ったので追記。サーバが受け付ける漢字コードがどんなものか知っているといいけどこれはほとんど問題ではないだろう。つまり僕らが入力した内容をどのような漢字コードでサーバに送出するかという点だ。なぜなら、僕らはいわゆるASCIIコードで定義された文字しか使わないから。UnicodeにせよEUCにせよShift_JISにせよ、多くのコード体系ではASCIIコードを踏襲している、言い換えれば、コード体系の最初の128文字はASCIIコードと被っているということだ。漢字コードの設定が意味を持っている例は、telnetサービスを供給しているサーバで仮想端末からemacsとかviを使って日本語を入力する場合である。

次の注意点はサーバから送られてきたデータの漢字コードである。先に述べたのと同様に、僕らがサーバから受け取った内容が全てASCIIコードの範囲だったら受け取り漢字コードに注意する必要はほとんどないといってもいいだろう。ただし日本語が含まれる結果を出力するcgiを仮想端末で受け取る場合はその結果に即した文字コードを受け取り文字コードとして設定しなければいけない。ブラウザは受け取ったデータから勝手に文字コードを判定して、結果に即した文字コードに変えてくれるからブラウザで受け取り文字コードを明示的に設定する必要はなかったわけだ。どちらにせよここの設定は受けとったデータをどのような漢字コードで書かれたデータと解釈するかという設定である。だから、クライアントが解釈できない文字コードを受け取った場合は、端末にブラウザで表示されるような文字は見えず、文字化けして見える。たとえば、Tera TermはJIS、Shift_JIS、EUC、に対応しているが、Unicodeには対応していないためUTF-8で書かれたWebページを上記の方法で取得しても文字化けして見える。

もう一つ忘れてはいけないことがあった。それは送出改行コードと受け取り改行コードの設定だ。上で送出改行はCR+LFにしろと書いたけど、これには理由があるんだ。理由はhttpの勧告文書にそう書いてあったから。つまり標準化を押し進める団体がそうしろといっているからで、多くのwebサーバはその規格に準拠するように作られているからだ。長いものには巻かれろってことかな。受け取り漢字コードはサーバが送ってきた改行コードを僕らがどう解釈するかという話なんだけど、ここの設定はあまり気にする必要はないと思う。多分、さっき言った標準化団体はサーバから送出されて僕らが受け取るデータも改行コードはCR+LFに決めていたと思う。だから、設定はCR+LFでいいんじゃないかなと思う。


1.4 参考文献

わからないことがあったら最もよいリファレンスはRFCなんだな。ここを参照すれば技術的な不明点が明らかになることが多い。下手に検索サイトで探すと時間の割りに実りの少ない結果になることのほうが多い。

RFC2616 : Hypertext Transfer Protocol -- HTTP/1.1
http://www.w3.org/Protocols/rfc2616/rfc2616.html

サイトマップ

  1. CSS > Webサイトのレイアウトの話
  2. DVDリッピングしてaviファイルにするときの計算方法
  3. Debian > インストールメモ
  4. Memo > One Line Diary
  5. Memo > To-Doリスト
  6. Memo > iswebの自動挿入広告の文字コードに関する考察
  7. Memo > リンクとメモ
  8. Memo > 物理屋の独り言
  9. Misc > High Performance Computing(HPC)
  10. PC過去の遺物集
  11. Perl > 1行スクリプト覚書 with Active Perl
  12. Perl > Perl実験室でWeb雑考
  13. Perl > XML::TreePPでXMLサイトマップファイルを生成
  14. Perl > e.cgi のページ ProjectRotation8
  15. Perl > クエリを連想配列で受け取るスマートな方法
  16. Perl > サーバーにアップロードしたcgiのエラーチェック
  17. Perl > ブリコラージュ的 cgi
  18. Programing > プログラムの素人が不思議に思ったこと
  19. Services > Gmail Tips
  20. Services > YourFileHostダウンローダ
  21. Services > twitterはじめました。
  22. Tech > MathMLを使ってみる
  23. Tech > Windows 2000 Professional でLaTeX組版システムを使う
  24. Tech > coLinuxの導入
  25. Tech > サイトのミラーリング
  26. Terapadで作るLaTeX統合環境
  27. Tools > Opera > 設定の諸々
  28. Tools > bashのメモ
  29. Tools > lit2ptoのページ
  30. Tools > vimの設定とtips
  31. Tools > よく使う機能のメモと設定のメモ
  32. VMware > ホストOSがWindows XP Home SP2でゲストOSがVine Linux 4.1
  33. Vine > SSHの暗号化経路を経由してSambaサーバの共有ディレクトリをマウント
  34. Vine Linux > LaTeXでpdf文書作成
  35. Vine Linux > Libretto L1に載せる
  36. Vine Linux > SSH関係の諸々メモ
  37. Vine Linux > サーバを立てたときのメモ
  38. Vine Linux > ソフトウェアRAID
  39. Vine Linux > デスクトップとして使う場合に必要な設定
  40. Wanderlust > inter7でIMAP4
  41. Web Etcetera > サーバー上でファイルを直接編集することについて
  42. Web Etcetera > 検索エンジンが自分のサイトをどのように認識しているか
  43. Web Etcetera > 無料ホームページスペースの広告削除は真か偽か
  44. Winamp > StreamRipperで全自動リッピング
  45. Winamp > タスクマネージャを使って目覚まし時計
  46. Windows > robocopyでフォルダ間同期
  47. Windows > 手動でコーデックをインストールする
  48. gnuplotのプロットギャラリー
  49. rsyncでディレクトリの内容を同期する
  50. wgetのメモ
  51. ネットワーク上にメモ帳を置く
  52. ハードウェア > HDDの再利用
  53. ハードウェア > 安定で快適なマシンはハードから
  54. ブリコラージュ的メールマガジン一括登録解除方法
  55. 初めに
  56. 情報基礎演習UNIX
  57. 窓たちと正く付き合うにはショートカットキーから

コメント


pin

[PR]I肢ŎdӒ:lCI肢wق̊فx