68user's page 掲示板

Prev< No. 249〜252> Next  [最新発言に戻る] [過去ログ一覧]
No. 249 # 68user 1999/03/31 (水) 00:00
> よかったやっと見れるようになった。(^^ゞ
サーバの定期メンテがあって、落ちてたようです。

そもそもの
> ところで、wrapper.cgiでのurl指定方法のwrapper.cgi/hoge.cgi
> は、知ってはいたのですがどういう動作になるのですか?
からは、「何をわかっていて、何がわからないのか」が伝わって
こないのですよ。

> 私なりに理解できた部分は open(EXEC,"| .$ENV{PATH_INFO} 2>&1");
> .$ENV{PATH_INFO} の実行結果の標準&エラーを、openして標準入力
> から読込み、表示させているという事位ですが
でしょ? こちらもそれくらいはわかっているだろう、とは思うわけで、
一体何を説明すればいいのかわからんのです。ですが、例えば
    「PATH_INFOというのはいつどこで誰が設定してくれるのか」
という質問なら答えられるわけです。

wrapper.cgi/hoge.cgi にアクセスすると、
    ・apache が PATH_INFO に /hoge.cgi を設定する
    ・apache が wrapper.cgiを実行する
です。それだけ。

別に特別な動作をするわけでなく、wrapper.cgi?hoge.cgi と
似たようなものだと思ってください。?を/に変えると
QUERY_STRINGでなくPATH_INFOに値が入る、っていうくらいです。

という解説でいいですか? どうもそういうことを聞きたいんじゃ
ないような気もするんですが、聞きたいことと違っていたら
「何が知りたいか」を書いてください。

No. 250 # M.Masuda 1999/03/31 (水) 15:12
>そもそもの
大変申し訳有りませんでした。
言葉が足りませんでしたね。

今までの流れから、「print文を埋め込んで試してみませう」
の所に何らかの意味合いが有ると思い、その意味合いを聴く為
あのような表現となりました。

それとは別に、最近の私の書込みも自分の中での疑問が次々に
解けていく快感に、つい調子に乗ってしまいフリートークBB
Sの様な書込みをしてしまったことを、少々反省しています。

今回の場合は、解からないところ(自分の中での疑問点だった複
数箇所)が、同時に提示されたので私もどう理解を進めていけば
いいのかが解かりませんでした。

>極限まで発生条件を切り詰めた上で
そうですね、これはデバックやコーディングの上で大事な事で
すね。
自分で解決する努力がすこし足りなかったですね。
というより本業の作業の間に行っている事なので、手抜きして
いたのは事実ですね、反省してます。

>「何が知りたいか」を書いてください。
そうですね、デバック用に教えて下さったwrapper.cgiのコード
の中には、解からない事が沢山ありますが、本来はオライリーの
動物シリーズを揃えて自分で調べればすむ事かも知れませんが、

>wrapper.cgi/hoge.cgi にアクセスすると、
> ・apache が PATH_INFO に /hoge.cgi を設定する
> ・apache が wrapper.cgiを実行する
という機能が何の目的でapacheに実装されているのか?
デバック目的だけの機能では無いだろうし、本来の目的は何だろ
う、というのがあります。

それから、基本的な動作を完全に理解しているわけでは無いので、
open(EXEC,"| .$ENV{PATH_INFO} での .$ENV{PATH_INFO}の記述が
よく分かりません。
open(HANDLER,"shellcommand")とした時は""で囲まれた部分は、
シェルでの動作と、全く同じと考えていいのでしょうか。

そうするとPerlだと変数を結合するためのピリオドが、シェルの
場合頭にピリオドが付くと何を表すのか。
ちなみにecho `.$ENV{PATH}` としましたが、
./home/masuda/.bashrc{PATH}
と返り意味が分かりません。
と、こんなところです。

いろいろ他にもありますが、これから書込みの際は十分吟味した後
に書込みしたいと思います。
今後もよろしくお願いいたします。

No. 251 # 68user 1999/04/01 (木) 20:52
> デバック目的だけの機能では無いだろうし、本来の目的は何だろう
「なぜその機能があるのか」と考えるのは、「C言語にはなぜ構造体があるのか」
というのと同じで、結局想像するしかないと思います。

でも、なぜ僕が wrapper.cgi?file=hoge.cgi(A) でなく wrapper.cgi/hoge.cgi(B)
という引数の取り方をしたのかは説明できます。

hoge.cgiが ?data=content などと、GET方式でデータを取得する
CGIだった場合、(A)より(B)の方が hoge.cgiに与える影響が少なく、
さらに wrapper.cgi 自体のコードも短くなるからです。

あと推測するに、ユーザにCGIであることを意識させない、という
のもあるでしょう。例えばcgiwrapは
    /cgi-bin/cgiwrap/~username/hoge.cgi
というURLでアクセスすることで、所有者権限でCGIを実行できます。
    /cgi-bin/cgiwrap?user=username&cgi=hoge.cgi
だったとしたら…思いつく限りではSave Asでファイルをセーブした際、
全てのCGIプログラムはcgiwrapというファイル名で保存されるでしょう。

ついでに言えばディレクトリのような階層構造を、素直な形で表現できます。
例えば http://www.freebsd.org/cgi/cvsweb.cgi など。

> そうするとPerlだと変数を結合するためのピリオドが、シェルの
> 場合頭にピリオドが付くと何を表すのか。
そういう場合にprint文で値を表示してみてほしいわけです。例えば
    > open(EXEC,"| .$ENV{PATH_INFO} 2>&1");
の前に
    print "PATH_INFO = $ENV{PATH_INFO}\n";
と書いたとすれば、$ENV{PATH_INFO} eq "/hoge.cgi"であることが
わかるでしょう。ならば、".$ENV{PATH_INFO}" eq "./hoge.cgi" と
なります(これに確信がもてなければ print ".$ENV{PATH_INFO}\n";
を挿入してください)。で、「./hoge.cgi」とは何かと言うと、カレント
ディレクトリにある hoge.cgi というスクリプトを実行しているだけですね。

No. 252 # M.Masuda 1999/04/01 (木) 23:53
なるほど、やっと理解できました。
68Userさんがわからないと言っていた事や、自分の勘違いが。

理解したと思っていた事が、全然理解できていなかったのですね。
やはり他の仕事の片手間のように勉強しているのと、基礎からしっか
り勉強している人にはかないませんネ。

ちょっとプログラミングに深入りしすぎたかも知れません、web上で
よく見かけるプログラム程度なら書けるかもしれませんが、システム
や応用した機能みたいな部分(少なくとも私から見ると)は、ちゃんと
勉強しないと難しすぎます。

最近、業界では有名(らしい)なプログラマー人とファイルロックの
事で話しをする機会がありましたが、私とは基礎概念が違いました。

もう少し、時間をかけて基礎的な部分から修行したいと思います。
wrapper.cgi、ありがとうございました。

Prev< No. 249〜252> Next  [最新発言に戻る] [過去ログ一覧]