68user's page 掲示板

Prev< No. 248〜266> Next  [最新発言に戻る] [過去ログ一覧]
No. 248 # M.Masuda 1999/03/30 (火) 18:31
よかったやっと見れるようになった。(^^ゞ

う〜んすいませんです。
>> すいません、オバカでよく分からないのですが具体的にどうすれば
>> 私にも理解できるでしょうか。
> 何を知りたいのかわからないので、全部は説明したくないです(結構な量になるので)。

>「print文を埋め込んで試してみませう ;-)」
この意味そのものが分からなかったのです。m(_ _)m

この文がどういう意味で書いたのか、何を言いたかったのか、
と言う意味で、単純に私の日本語理解度が足りないための質問でした。

> 何を知りたいのでしょうか? できれば
>  open(EXEC,"| .$ENV{PATH_INFO} 2>&1");
>「とりあえずPATH_INFOの値を見てみる」
> くらいは試してください。

setコマンドで環境変数を見てみましたが PATH_INFOは設定されてい
ませんでした。

私なりに理解できた部分は open(EXEC,"| .$ENV{PATH_INFO} 2>&1");
.$ENV{PATH_INFO} の実行結果の標準&エラーを、openして標準入力
から読込み、表示させているという事位ですが。

前に使い方を、教えてもらい(wrapper.cgi/script.cgi)このような
URL指定でscriptcgiを実行すると、コマンドラインでの結果の様な表示に
なりました。


まず最初に、wrapper.cgi/script.cgi この様な指定をすると(URLで)
httpdはどういう事を行うのでしょうか?
予想1:
$ENV{PATH_INFO}には、コマンドでの引数に当たるものが代入される?

予想2:
最初に出現したwrapper.cgiの引数に、script.cgiを与えて実行する?

$ENV{PATH_INFO}この環境変数自体が、いつどのように設定されるのかが
解からないので、動作の結果から推測だけですが....
スクリプトやコマンドの実行時に、コマンドラインでの引数を指定する
のと同じような動作になるのでしょうか?

仮に上記の予想が合っているとして、「print文を埋め込んで試してみませう ;-)」
この文は、どこにprint文を入れろと言っているのかが、解からなかったのです。

私にとってまだ頭の中では、wrapper.cgi/script.cgiの様な指定方法は、
掲示板等では話題としては知っていましたが、具体的な内容まではまだ
未解析でした、すいませんです。

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、ありがとうございました。

No. 253 # Tetsu [E-mail] 1999/04/07 (水) 15:31
    UNIXは初心者です、ここで質問して良いかもわかりませんが、よろしければお教え下さい。
OSはだいぶ古いSONY製のNEWS−OSというのを使用しています。相当古いマシンなので、また
UNIXなのでちょっと恐くてさわれないのですが、基本的なコマンドは少し勉強しました。

  前置きが長くなってしまいましたが・・・ハードディスクの空き容量を調べたいと思うのですが、どの
ようなコマンドを使えば良いのかよくわかりませんでした。どうぞ、お教え下さい。そういうコマンドとか
は無いのでしょうか?

No. 254 # 68user 1999/04/07 (水) 17:58
NEWS-OSはよく知りませんが、df -kで
    Filesystem 1K-blocks Used Avail Capacity Mounted on
    /dev/sd0s1a 118959 25837 83606 24% /
などという表示が出るんじゃないでしょうか。これだと
118M中 25M(全体の24%)を使用中ってことです。

No. 255 # チャパ王 1999/04/09 (金) 19:20
はじめまして。他にはないCGIスクリプトばかりで大変助かっています。
それでですが、.htaccessで
<files browser.log>
deny from all
</files>
<files referer.log>
deny from all
</files>
    :
    :
というような設定がありますが、
<files *.log>
deny from all
</files>
<files *.dat>
deny from all
</files>
とやるだけで全ての***.log、***.datファイルが見れなくなります。
どうぞお試しくださいませ。(知ってたらごめんなさい。(汗))

No. 256 # R-N 1999/04/11 (日) 02:30
ども、おひさしぶりです。
お元気でしょうか? 私は相変わらずです。(^_^;
何度もここで色々聞こうと思っては思いとどまり何とか自分で解決してきたんですが、
とうとういきずまりました...。
データのチェックで
foreach $line (@lines) {
($a,$b,$c,$d) = split(/\,/,$line);
if ($d ne '') { $dd++; }
}
とした時の @line の値(?)が
22,,55,
23,1,25,
というような時、$dd に+1されてしまいます。
本当は何か値が入っていたら+1したいのです。
なんとなく「22,,55,(改行)」となっていて $d ne '' で改行が判断できないからかなと思うのですが...。
そんなモノなんでしょうか?
$d ne '' ではないなら式はどうなるのでしょう?

なんか解りにくくてすみません。
説明下手なんですが...そこを何とか...。(-_-;

No. 257 # 68user 1999/04/11 (日) 07:11
> とやるだけで全ての***.log、***.datファイルが見れなくなります。
どうもです。本当は *.log というファイルだけではなく、
/~j5306050/log/ 以下を見られないようにしたいんです。
    <directory /home/95s/j5306050/public_html/log/>
        deny from all
    </directory>
とか
    <location /~j5306050/log/>
        deny from all
    </location>
などと書いても、
    500 Internal Server Error
    The server encountered an internal error or misconfiguration and
    was unable to complete your request.
になっちゃうんで、仕方なくああいう風にしました。
これって書き方間違ってるんでしょうか?

あと、試しているうちに、
    <files browser.log>
        deny from all
    </files>
と書いても、/~j5306050/log/browser.log は見ることができるのに気がつきました。
ずっと誰かに見られてたかも…(^^;
    <files log/browser.log>
だとうまくいきましたけど。

> というような時、$dd に+1されてしまいます。
おそらく$lineの最後に改行コードが付いているからだと思いますので、
    foreach $line (@lines) {
        chop $line;
とするか、
    if ( $d =~ m/\d/) { $dd++; }
と、$dに数字が入っているかどうかを調べてはどうでしょう。ちょっと変ですけど、
    if ( $d ne "\n" ) { $dd++; }
もアリかも。

No. 258 # R-N 1999/04/12 (月) 05:14
なるほど(?)、ありがとうございます!
Perl の専門書を買わないと駄目ですね...、コマンド(?)が全然解らない...。
唯一理解できたのが、
if ( $d ne "\n" ) { $dd++; }
ですが...、そっか!
改行コードって \n でしたね...、普段使ってるのにすっかり忘れてました...。
また勉強してきます!!

No. 259 # M.Masuda 1999/04/12 (月) 12:52
68Userさん、皆さんこんにちは。
横やりですが...

>/~j5306050/log/ 以下を見られないようにしたいんです。
www.cs.gunma-u.ac.jp は Apache1.2.6ですよね。
<Directory>ディレクティブは.htaccess では使えません。
この場合<Limit>を使ってこんな感じでできると思います。

##### .htaccess内 ######
<Limit POST GET>
order deny,allow
deny from all
allow from HOSTNAME
</Limit>
### .htaccess 終了####

外してたらごめんなさい。

No. 260 # 68user 1999/04/12 (月) 17:02
> <Directory>ディレクティブは.htaccess では使えません。
なるほどなるほど、確かにdirectoryやlocationは、server configだけ
でしか使えないみたいですね。それは知りませんでした。というわけで、
    <files log/*>
        deny from all
    </files>
にしました。public_html/log/.htaccessに deny from allと書いても
いいんでしょうけど、設定ファイルが分散するのが嫌だったので
一つにまとめました。

> Perl の専門書を買わないと駄目ですね...、コマンド(?)が全然解らない...。
前にROLさんにも同じような事を書きましたが、はっきり言って 本を買わずに
プログラミング言語を理解しようとするのは時間の無駄です。数千円の金を
惜しむあまり、結果的に数十/数百時間の貴重な時間を無駄にしています。

手元に本があれば数分でわかるのに、BBSで丸1日かけて質問するのは
とても非効率的ですよね。

悪いことは言いませんから、早く本を買いましょう。オンライン版がいいなら
    http://www.cec.co.jp/usr/hasegawa/Docs/perl-jman/index.html
    ftp://ftp.mei.co.jp/free/others/Languages/perl/perl5/perl5.000/perljref-5.000.0.tar.gz

No. 261 # M.Masuda 1999/04/13 (火) 19:59
すいませんまたまた教えて欲しいのです。
下のスクリプトでおかしい所は無いでしょうか。

#!/usr/bin/perl -w

use Net::Ping;
print "Content-type: text/plain\n\n";

$hostname = 'pingコマンドの返らないホスト';
print "Checking $hostname\n";
if (pingecho($hostname,$timeout)){print "Echo on\n"}
else{print "Echo off\n"}

$hostname = 'pingの返るホスト';
print "Checking $hostname\n";
if (pingecho($hostname,$timeout)){print "Echo on\n"}
else{print "Echo off\n"}
exit;
リャマ本のP531でのNet::Pingを試しているのですが、
上記の試験結果は両方ともEcho offです。
もちろんホストの指定の間違いもありません。

初めて use コマンドを使うので、何か他に間違いがあるのかと
use行をコメントアウトしたり、他のコマンドを使ってみましたが
(use Cwdの結果は正常に表示)原因が不明です。
最初このコマンドを知らずに、自分で`ping -c1`とararmを使って
コーディングしましたが、シグナルを受け取った後の制御がうまく
できずにリャマ本を調べていたら、「なんだこんな便利なものがあ
るじゃないの!」と思い使ってみましたがこれもまたうまく行かず
原因が分かりません。

Net/Ping.pmも存在しますが、その記述内容は私には高度すぎて
全然分からずお手上げ状態です。

どうかご教授よろしくお願いします。

No. 262 # M.Masuda 1999/04/13 (火) 20:02
下には書き忘れましたが、$timeout=2;も指定してあります。

No. 263 # 68user 1999/04/13 (火) 23:59
リャマ本って、「プログラミングPerl改訂版」ですよね?
ラクダ本じゃなくてリャマ本が正式名(というか通称)なんですか?
それとも「ラクダ本=旧版」「リャマ本=新版」?

何も試さずに書きますが、リャマ本にも書いてある通り、pingechoは
「TCPのechoプロトコル」を使って ホストが生きているかどうか調べます。
が、少くともFreeBSDのデフォルトでは echoポートは閉じられていますので、
一般的に「echoが通る=生きている」とは言えないでしょう。

echoプロトコルってのは
    http://X68000.startshop.co.jp/~68user/net/echo-1.html
です。だから、telnet hostname echoでお話しできたら、pingechoでも
正しい答えが返ってくるはずです。

No. 264 # 68user 1999/04/14 (水) 00:08
追加。これまた何も試さずに書きますが、さらっとNet.Pmを見た限りでは
適切な引数を渡せば ICMPのecho も使えるようです。これを使えば
/sbin/ping と同じ挙動をさせられると思います。

No. 265 # 68user 1999/04/14 (水) 01:38
> さらっとNet.Pmを見た限りでは
Net/Ping.Pm の間違いですね。で、ちーと試してみました。結論から言うと、
    use Net::Ping;
    $p = Net::Ping->new("icmp",$timeout);
    $p->ping($hostname);
ですかね。でも、root権限が必要です。Ping.Pm の
    croak("icmp ping requires root privilege") if $>;
を外せば、一般ユーザ権限でもいけるかも(試してません)。

No. 266 # M.Masuda 1999/04/14 (水) 14:34
>リャマ本って、「プログラミングPerl改訂版」ですよね?
すいません誤解を招くような書き方をして(^^;
そうです「プログラミングPerl改訂版」を指しています。
他でそのような表現があったので、安易に使ってしまいましたが
>ラクダ本じゃなくてリャマ本が正式名(というか通称)なんですか?
私も正式には不明です。
#ラウンジで聞いてみようかな...

> croak("icmp ping requires root privilege") if $>;
> を外せば、一般ユーザ権限でもいけるかも(試してません)。
そうですか、確かに icmp ping requires root privilege
と言われました。
suidや、Ping.pmを編集する事まではしたくないのです。

やはり「なんだこんな便利なものがあるじゃないの!」の認識は
ちょっと甘かった様ですね。

一発での`ping -c1 $hostname`とararmの方法はわかりますので、CGI単体
で行おうとせず他の方法を組み合わせて試してみます。

ちなみにあのスクリプトの目的は、普通のサーバーではなくダイアルアップ
サーバー?(プロバイダーでユーザーの電話回線経由の接続を受け取るヤツです)
が生きてるかどうか、つまり一般的にいうPPPxxx.domain.ne.jpとかが
接続状態かどうかを調べるツールを作ろうとして、そのための動作確認
用の試験スクリプトでした。

>http://X68000.startshop.co.jp/~68user/net/echo-1.html
これからの課題なので勉強します。

それから、ちょっと違うとは思いますがBASICの場合でいう割り込み処理から
復帰する際のリジュームコマンドの様な事はできないのでしょうか。
つまりラベル等で復帰先の指定をするという事です。
最初がBASICだったものでこういう表現しかできませんが、68Userさんがその
辺(BASIC)詳しくなければ無視してください。

ありがとうございました。

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