Perl初心者の部屋

"Mashi" <mashi@poboxes.com>さんのご協力を頂き、 改題しました。

サルでもわかる Perl CGI 問題解決ガイド

あなたがニュースグループ上で大勢をしめる人々と同じように、 真の問題が何であるかを見抜く為の十分な背景を我々に提供しないまま、 CGI問題で:「動かない」と我々に述べてしまったとします。 たちまち、あちこちからカンカンに怒られてしまうでしょう。 あなたの担当すべき部分を全く調査しないで、ただでコンサルティングの 支援を求めている、涎を垂らしたおサルのようにあなたをみせてしまう からです。 これでは、本来であればあなたを支援していたはずの人々を遠ざけ、 既にひどく低くなっているS/N比を悪化させ、 さらにネットを不毛にしてしまいます。

手始めとして、下記の、答えを求めるいくつかの簡単な質問チェックリストに ざっと目を通す必要があります。 いくつかのサンプル回答は用意されていますが、自分自身で回答を 見つけ出さなければなりません。


Q:
スクリプトの所有者(オーナ)は誰ですか?
A:
私です。

Q:
スクリプトのバーミッション(権限)はどうなっていますか?
A:
それらは 0600ですが、実行権がないと今わかりました。 代わりに0755にすべきでした。
[訳注:これはunixに特有の記述です。所有者が読出/書込/実行権すべて、 グループユーザが読込/実行権、その他一般ユーザは読出/実行権を持つように すべきということです。ちなみに0600とは所有者のみが読出/書込権を持っており、 一般ユーザは全くアクセスできない状態です。Windowsではちょっと表記法が 違っています。]

Q:
あなたのスクリプトは適切なディレクトリにありますか?
A:
いいえ、/usr/local/etc/httpd/cgi-bin/に置くのを忘れてました。
[訳注:このディレクトリ名は架空のものです。 MS-IISなら\Scriptsでしょうか。 要はセキュリティ対策がしてあり、 WWWサーバで設定したディレクトリにあるかということですね。]

Q:
あなたのサーバでは、CGI 実行プログラムが 上記のディレクトリ及び/あるいはファイル拡張子で実行可能なように 設定されていますか?
A:
いいえ、うちの sysadmin がそのように設定するのを忘れてました。 その人はGET で十分だろうと考えて、 POST の可能性を考慮していませんでした。

Q:
サーバはどんなuid[訳注:ユーザID]のもとで、 CGIスクリプトを走らせるのですか?
A:
wwwuser (おっと、これじゃ私のファイルや ディレクトリに書き込むことができないぞ)。
[訳注:wwwuserだけでなく、wwwとかnobodyとかいろんなユーザIDと なっているでしょう。下記のように、書き込みたいファイル、ディレクトリに そんなユーザIDでも書き込めるように適切な権限が 設定してあるかということが問題になるわけです。 但し、セキュリティ上の問題が発生する恐れがあるので、 /cgi-binには書き込もうとするのは止めましょう。]

Q:
サーバのuidはあなたが書き込もうとしているあらゆる ファイルに書き込むことができますか?
A:
いいえ。−私がファイルを所有しているのですが、 WWWサーバは私のidとしては走ってませんし、 ファイルのパーミッション(権限)は 0666の代わりに0600となっています。 [訳注:自分(所有者)だけしか読出/書込ができない設定。] それが私自身のファイルをopenできない理由だと思います。

Q:
あなたがそれを対話的に実行する時、何が起きますか?
A:
対話的に実行できるとは知りませんでした。 なぜなら、 CGI.pmライブラリの文書は面倒で一度も読んだことがありませんので。

Q:
サーバのエラーログには何がありますか?
A:
一度も見ようと思ったことはありません。 おや、これかなぁ − 気にすることはないですよね。[訳注:(^^;]

Q:
サーバのログはどこにありますか?
A:
(知る方法はありません。それはシステムによります。 /usr/local/etc/httpd/logs/error_logで見つけられなかったら、 管理者に確認して下さい。)

Q:
Perl のバージョンおよび OS のバージョンは何ですか?
A:
Perl バージョン 5.002、SunOS バージョン
(確認するにはperl -v および uname -a を使ってみて下さい。 あなたのPerlが5.002以下のバージョンなら、 今すぐアップグレードしましょう!)

Q:
ライブラリのバージョンは何ですか?
A:
ライブラリでgrep -i versionとするか、 CGI.pm用にはこうして下さい。:
$ perl -le 'use CGI; print $CGI::VERSION'
2.21

Q:
サーバ上のperl実行プログラムへのパスはどうなってますか?
A:
/contrib/bin/perl

Q:
あなたのスクリプトに設定してある perl実行プログラムへのパスはどうなってますか?W
A:
/usr/bin/perl (おっと、これじゃぁ 見つけられないはずだ)

Q:
httpデーモンサーバのバージョンは何ですか? あなたを助けてくれる人達があなたのローカル環境についての よりよい手掛かりを持っているでしょう。
A:
NCSA 1.5

Q:
Perlの-wフラグを加えたとき、どんなことが起きていますか?
A:
それは愚かな間違いについて教えてくれます。 perldiag manページ の中で詳しくリストされています。私はそれを精を出して調べました。

Q:
Perlの-Tフラグを加えたとき、どんなことが起きていますか?
A:
perlsec manページに述べられているように セキュリティ問題について教えてくれます。 私はそれを十分注意して読み、理解したところです。 私は CGI Security FAQさえ読みました。

Q:
Perlのuse strictを加えたとき、何が起きていますか?
A:
変数を宣言し、文字列をクォートし、 my()の宣言やuse varsやクォートを使うとき、 念を入れて訂正していた愚かなエラーをすべて見つけてくれます。

Q:
他のいろんなnon-header出力 の前にMIMEタイプを出力するのを 覚えていますか? (他のヘッダはLocation:とか Set-Cookie:かもしれません)
A:
おお、そうでした。 それは有効なヘッダでなくてはならないし、 それから有効な本体部ですね。 私がやっていたのよりも早くこの内容を出力する必要があると思います。 改行を1つではなく2つ新規に出力するのを確認します。 print "Set-cookie: GroversDelight\n"; print "Content-Type: text/html\n\n"; # <-- 2つの改行 print "<TITLE>Sample Title<TITLE>\n";

Q:
いろんなエラーの前にMIMEタイプが出力されるように、 スクリプトの一番始めでSTDOUT(標準出力) をフラッシュするのを覚えていますか?
A:
いいえ。 爆発する前に出てこないのも無理はない! とほほ。 こいつを最初に付け加えるべきなのですね。
$| = 1

Q:
syscallの各々及びそれぞれの戻り値を確認した時、 何が起きていますか?
A:
早期に下記のようなものを付け加えるのは ちょっと手間がかかりすぎる方法のよう に見えますが、確実さは十分です。
open(FILE, ">some_file")
|| die("can't write some_file: $!");
エラーログは$!が``Permission denied''(権限がありません) あるいは ``No such file or directory'' (指定されたファイルあるいはディレクトリはありません) を含んでいることを示し、そして全てのことが明白になりました。

Q:
(ほんとに馬鹿な考えですが)手で文解析する代わりに、 あなたに代わってそれを行ってくれる 標準のCGI.pmモジュールを使いましたか? あるいは限定された機能の cgi-lib.pl[訳注:perl5ではCGI-Lite.pmですね。]ライブラリ を使いましたか?
A:
ええ、誰か他の人が実際にこんな事をやってしまったのですか? 自身でやる必要がないとは知りませんでしたが、 http://www.perl.com/cgi-bin/cgi_mod?modules=CGIから 適切なCGIモジュールの最新版を入手することができました。

Q:
ライブラリを使っている場合、 正しく見つけられるように、0644に パーミッションを設定して、 それを適切なシステムディレクトリ(@INCの中のどこか、 たいていは /usr/local/lib/perl/site_perl/CGI.pmのようなところ)に 置いてmake installと打鍵しましたか? あるいは、めくらめっぽうにマニュアルコピーをして、 パスやパーミッションを台無しにしませんでしたか?  あるいはその両方でしたか?
A:
makeって何ですか? 私は自分でcgi-binに馬鹿なコピーをする(ミス)インストールをして、 それから0700にモード変更しました。 これでは全然機能しないのですね?

Q:
あまりPerlに関係しない質問でcomp.lang.perl.*を台無しにする代わりに、 comp.infosystems.www.authoring.miscに投稿することを覚えてますか? [訳注:国内ではfj.lang.perl、 fj.net.infosystems.www.authorあたりでしょうか]
A:
いーえ、それが、有用な回答をもらえず、代わりに非難の集中砲火を 浴びた理由なんですね?

Q:
あなたが悪の帝国の、既に脳死状態になった、束縛と規律の (bondage-and-discipline) 仮想オペレーティングシステムを走らせている場合、 Windoze Perl FAQがWebについて言っていることを読むのを面倒だと 感じませんでしたか?
A:
はい、私は http://www.perl.hip.com/PerlFaq.htmについては知りませんでした。
[訳注:和訳はこちら

Q:
http://www.perl.com/perl/news/latro-announce.htmlおよび CERTから警告されている方法に従って、 インタプリタをあなたのcgi-binに置くことを避けていましたか?
A:
いいえ、それで何が問題なのですか? (背景で企業秘密が盗まれた後で削られてゴミになっていくディスクの音が 聞こえる)

もしあなたがこれらの質問にほとんど答えられず特定のステップを 実行していたのなら、わざわざ助力を頼みにきてNetを煩わせるべきではなく、 自分でまさに自分自身だけの問題を解決したほうがいいでしょう。

まず、自分でこれらの問題の全てを 徹底的に調査して、 それから談話室にいる相棒にそれについて何か知っていないか尋ね、 なお問題であることがわかった場合は、それからあらゆる手段で前進し、 投稿してください。 しかし、上記にリストした質問全て(あるいは少なくとも大半)に対する 自分自身の回答を含んだ、多くの詳細な事柄を私達に提供することを 確実に履行してください。

一方、これらの質問の大半が、ほんの少しでもあなたに意味をなさない場合、 あなたは既にあなたの理解力を越えた道にいるのです。 その場合は、しばらくCGIプログラミングを手控えた方がいいでしょう。 自分で近在のグル[訳注:O教のXXではなく教師の意]を見つけ、 下記にリストされている多くの本の中から何冊かを照査してください。

http://wwwiz.com/books/cgi-perl.html

IM!HO、 Addison-Wesley と O'Reilly の書籍は 最も徹底的である傾向にありますが、 それ以外にも自分でちゃんと調べるべきことが数多く残っています。 厚さが明快さや完全性や正しさを包含している必要はないということを 忘れずに。


ご意見、ご要望は、 電子メールまたは 投稿にお願い致します。

ホームページへ戻る。