% telnet www.sega.co.jp 80 GET / HTTP/1.0(リターン) (もいっかいリターン) 実行したらHTMLが出力されました!!! ってことで、変数の定義の所の $proxy =以下と &download内の print OUT "level 1\n"; print OUT "httpproxy $proxy\n"; の2行を削除して、やってみます!!! |
はじめまして。 えっと、学校の端末でzipを解凍することはできないんですか? そもそもunixではzipはだめなのですか? おしえてください |
ROLさん: print OUT "level 1\n"; は削らない方がいいでしょう。これはリンクを1段階たどる、ということを 表しています。 ケースケさん: UNIXでZIPを扱えるアーカイバにはunzipというのがあります。 # ZIP形式は普段使わないのでよくわかりませんが、 # unzipは展開専用、zipは圧縮専用かなぁ? これはflute.cs.gunma-u.ac.jpで、ってことですよね? どうやらインストールされてないようですから、管理者にお願いしたり ソースからコンパイルする方がいいんでしょうけど、それがめんどくさいなら ( find / -name unzip >/dev/tty ) >& /dev/null などで探せます。数分待てばいくつか表示されるので、お好きな ものを使うといいでしょう。 |
やっと…、やっとDLまではこぎつけました、はぁ長かった… まぁまだまだ問題は山済み状態なんですが、一番大きな山はこえたのだと思ってます。 で、残された、私ではなんともならない問題… そう、自動化です。 以前、某氏から触りの部分だけ、聞いたはずなんですか さっぱり忘れてます。 なので、どういうファイル名のファイルか、 そしてそのファイルの中身でどういう指事をすれば 任意のCGIを任意の時間に自動的に動かすことができるのか… これを御教授ください。 |
まずは http://X68000.startshop.co.jp/~68user/unix/prgmemo.html#crontab をどうぞ。 ~/.crontabにいつどんなプログラムを実行するか書いてください。 毎日6時30分に実行するなら、 30 6 * * * command です。g2をどこに置いたかは知りませんが、ホームディレクトリからの ディレクトリ相対指定で動くはずです。例えば 30 6 * * * bbs/g2 など。わからなければ 30 6 * * * /home/user/bbs/g2 とフルパスで書いてください。 ~/.crontabに書いたら、 % crontab ~/.crontab で登録されます。 % crontab -l として 30 6 * * * bbs/g2 と表示されればOKです。 しかしその前にきちんと動くかどうか、簡単なテストをしてください。 #!/usr/local/bin/perl print "test OK!\n"; というスクリプトを書いて、chmod +x して、そのとき22:55なら 数分後、例えば23:00に実行されるようにしてください。~/.crontabに 0 23 * * * script と書いて、 % crontab ~/.crontab とします。 % crontab -l 0 23 * * * script となれば登録は正常に行われています。で、23:00になったら、test OK! という内容のメールが送られてきたらいいわけです。 crontabについて さらに詳しいことは http://www.jp.freebsd.org/cgi-bin/yoyaku/mroff.cgi?sect=5&bgcolor=%23ffffff&cmd=&lc=1&subdir=man&dir=jpman-2.2.8%2Fman&subdir=man&man=crontab をどうぞ。 わからなければまた聞いてください。 > 任意のCGIを任意の時間に自動的に動かすことができるのか… 細かいことですが、webサーバ経由で実行されるプログラムを CGIと言います(ほんとは、その仕組み自体がCGIなんですけど)。 今回はwebサーバは関与しませんから、プログラムとか スクリプトと言った方がいいですね。 |
お師さん、いつもすみませんです。 お教えいただいた crontab とその説明ってFreeBSDのですよね。 BIGのサーバーは Linux 2.0.36で動いてるようで まず「~/.crontab」って名前でファイルがおけなかったので 適当に名前を変えて、% crontab script を実行してみましたが 「bash: /usr/bin/crontab: Permission denied」っていわれて、ダメです。 んで、「whitch crontab」で crontabコマンドを探すと 「whitch: command not found」っていわれちゃいます。 どないしたらよいのでしょうか? あぁ、もうまったく手が出ない世界にアシを突っ込んでるな… |
僕の場合.crontabというファイル名にしているだけで、 他のファイル名でも全く構いません。 > 「whitch crontab」で crontabコマンドを探すと whichですよね。whitchじゃなくて。 > bash: /usr/bin/crontab: Permission denied ん〜、とりあえず、 % ls -l `where crontab` (「'」ではなく「`」で囲んでください) と % ls -l `which crontab` の結果を教えてください。あと、 % id の結果も。もしかしたらbigではcronは使えないように なってるのかもしれません。その場合は、管理者に お願いするしかないです。 |
え、それぞれの結果です ls -l `where crontab` bash: where: command not found total 1 lrwxrwxrwx 1 root root 22 Oct 30 16:29 ftp -> /home/ftp/pub/usr8 /rol/ drwxr-xr-x 5 rol users8 1024 Jan 10 18:08 html/ ls -l `which crontab` /bin/ls: which:: No such file or directory /bin/ls: no: No such file or directory /bin/ls: crontab: No such file or directory /bin/ls: in: No such file or directory /bin/ls: (/bin:/usr/bin:/usr/local/bin:/usr/X11/bin:/usr/andrew/bin:/usr/openwin /bin:/usr/games:.): No such file or directory id uid=14127(rol) gid=107(users8) groups=107(users8) てな所ですが、どうなるでしょ? |
もいっかい。 % ls -l /usr/bin/crontab でお願いします。 |
ls -l /usr/bin/crontab -rwx------ 1 root bin 9008 Aug 24 1997 /usr/bin/crontab* って結果です。 ってこれって、オーナーしか動かせないって事…(涙) |
その通りです。管理者にお願いしてみましょう。その結果ダメだと 言われたら残念ながらcronは不可、ということになります。 # ソース持ってってコンパイルとか…したいですか? |
だ、だめです、お師さん >自動起動系のものはサーバーの保守の関係上、 >いかなる理由があろうとも一切禁止です。 だそうです(涙) MacでAppleScriptで毎日サーバーにTelnet接続して スクリプト起動させるようにする…しかないか? (出来るかどうかは解らんけど…) |
うーん、仕方がないと言えば仕方がないですね。管理者が そういう方針を取ることは理解できます。 結局は6:30に起動するプロセスがあれば、その中で g2を実行すればいいわけです。内部にきっかけとなる プロセスを用意することができないなら、外部から 呼ぶという手もあります。AppleScriptも一つの手ですね。 他には ・6:30に自動的にbigの中のあるwebを取得するように して、その中でCGIを動かしておく。そのCGIの中で g2を実行(CGIは普通nobody権限で動くので、そこら へんに問題あり)。 ・6:30に自動的にbigにメールを送る。.forwardに メールが届くとあるプログラムが起動するように しておいて、現在時刻が6:30付近ならg2を実行 とかとか。 |
こちらでは、はじめまして。 「ネットワークプログラミングの基礎知識」を読ませて頂きました。 で、本題の方は、向こうで話題にしてしまったので(^^; ちょっとズレた質問で申し訳ないのですが、「inetdの役割」で 「UNIXでは現在実行中のプログラムのことをプロセスといいます」 という定義がありますよね。 この「プロセス」というものがもう一つよく分からないのです (inetdの説明上では理解できるんですが…)。 「実行中」というのは、1つのプロセスのプログラムがexecで 切り替わった場合も、プロセスとしては同じだという意味で 受け取っていいのでしょうか? また、プロセスというのは、カーネルがスケジュールに従って 実行時間を割り当てる単位と考えてもいいのでしょうか? それから、UNIXではプロセスを生成できるのはforkだけだと聞きますが、 forkって親プロセスのメモリイメージとレジスタを丸ごとコピーする んですよね。この場合、子プロセスが直ぐにexecでプログラムを切り替えても、 メモリ上には親プロセスのコピーがそのまま残るんでしょうか? (execで切り替わったプログラムが終了しても、子プロセスがまだ 実行を続けるかも知れないので、こんなコピーの残骸で一杯になりそうな 気がするのです…) それと、マルチプロセスと関連のありそうな言葉として、タスク、スレッド、 コンカレント、コルーチンなどとの相違も教えて頂ければうれしいです。 スレッドは、プロセス内プロセスみたいなもの…? コルーチンは、Windowsの3.1以前のアプリケーションみたいなもの…? なんか、ネットワークとぜんぜん関係ないなぁ…すいませんです(^^; |
mmさん、はじめまして(とか言ってみたりして(笑)) > execで切り替わった場合も、 > プロセスとしては同じだという意味で > 受け取っていいのでしょうか? #!/usr/local/bin/perl if ( $pid = fork ){ print "子プロセスは$pidです。\n"; sleep 2; system("ps aux|grep $ENV{USER}|grep perl"); print "\n"; sleep 4; system("ps aux|grep $ENV{USER}|grep -E '(perl|sleep)'"); wait; } else { sleep 4; exec("sleep 5"); } # fork、ps、子プロセスがexec(sleep)、psという順番で動くように、 # ところどころにsleepを入れてます。 を実行したところ、 子プロセスは714です。 zxr400 713 0.8 1.6 712 988 p2 S+ 7:25AM 0:00.02 perl fork (perl5.00404) zxr400 714 0.0 1.5 648 956 p2 S+ 7:25AM 0:00.00 perl fork (perl5.00404) zxr400 713 0.0 1.5 712 944 p2 S+ 7:25AM 0:00.02 perl fork (perl5.00404) zxr400 714 0.0 0.1 172 60 p2 S+ 7:25AM 0:00.00 sleep 5 となります。プロセス番号714の子プロセスが、exec sleep 5しても やはりプロセス番号は714のまま、ということだと思います。 > また、プロセスというのは、カーネルがスケジュールに従って > 実行時間を割り当てる単位と考えてもいいのでしょうか? 僕もそういうふうに理解しています。 > execで切り替わったプログラムが終了しても、子プロセスがまだ > 実行を続けるかも知れないので、こんなコピーの残骸で一杯になりそうな > 気がするのです… execが戻ってくるのはexecに失敗したときだけで、execの実行に成功すると 絶対に戻って来ません。だから元のプロセスのイメージを保持しておく 必要はないですから、OSが掃除してくれるんじゃないでしょうか。 > タスク、スレッド、コンカレント、コルーチン うーん、僕もよく知らないんですが…。スレッドに関しては、 > スレッドは、プロセス内プロセスみたいなもの…? でいいのかなぁ。 Javaではスレッドを使うことでプロセスの中で並列実行ができます よね。一方「マルチスレッド版echoサーバ」というのは、ただ単に 「並列処理ができるよ」くらいの意味ですが、別にスレッドを 使っているわけではなく、forkで実現しています。 また、FreeBSDではスレッドへの対応が進み、スレッドセーフな OSになりつつあるようです。 というわけで、「スレッド」という言葉はどの環境を指して 使うかで結構意味に違いがあるんじゃないかと思うんですが…。 あと、「タスク」はUNIXの用語でしたっけ。多分Winの用語かな と思うんですが、結局ここらへんはプロセスと呼ぶかタスクと 呼ぶかの違い、単純に呼称の違いではないかと思ってるんですが…。 コンカレント・コルーチンは初めて聞きました(^^; |
68user さん、どもです(笑い) >となります。プロセス番号714の子プロセスが、exec sleep 5しても >やはりプロセス番号は714のまま、ということだと思います。 そそ、そんなイメージでした(^^; 先のpsの時点と後のpsの時点では実行されているプログラムはちゃうけど、 プロセスとしては同じなんだという意味ですね。 >僕もそういうふうに理解しています。 安心しました(^o^;ゞ >Javaではスレッドを使うことでプロセスの中で並列実行ができますよね。 そのヘンがプロセスとスレッドとの違いかなと思っていたのです。 >というわけで、「スレッド」という言葉はどの環境を指して >使うかで結構意味に違いがあるんじゃないかと思うんですが…。 このヘンの用語は仰る通りだと思います。 で、一応UNIXでのことを伺ったつもりだったのですが、書いてませんでしたね(^^; 私にとっては、「スレッド」という言葉は少なくともコンピュータの分野では Javaで始めて聞いたような気もするんで(スレッドタイプの掲示板というのも ありますが…(^^;)、一応Javaのスレッドを想定していたのですが、 >一方「マルチスレッド版echoサーバ」というのは、ただ単に >「並列処理ができるよ」くらいの意味ですが、別にスレッドを >使っているわけではなく、forkで実現しています。 >また、FreeBSDではスレッドへの対応が進み、スレッドセーフな >OSになりつつあるようです。 ということは、一般的にはもっと広い意味がありそうですね。 >あと、「タスク」はUNIXの用語でしたっけ。多分Winの用語かな >と思うんですが、結局ここらへんはプロセスと呼ぶかタスクと >呼ぶかの違い、単純に呼称の違いではないかと思ってるんですが…。 あっ、UNIXでは「タスク」は使わないんですね。 確かに岩波の情報科学辞典なんかでも、「プロセス=タスク」としています。 ただ、「タスク」はWinの用語(その場合の意味は?)だけでなく、 もっと古くから使われているようで、その頃、「マルチタスク」と 「マルチプロセス」とは違うんだよ、というような話を 聞いたような気もしたもので…(^^; >コンカレント・コルーチンは初めて聞きました(^^; concurrent は、どうも並行という一般的な意味みたいです。 concurrent Pascalとかconcurrent CP/M なんてのを聞いたことが あったのですが、どのように並行してたのかは知りませんです。 (この並行と多重(multi)の違いもよく分からない(^^;) coroutinは、原始的な並行プロセスかな… 確か、各ルーチンごとに専用のスタックを持って、自分の処理が 一段落すると、レジスタなどの環境をスタックにpushして、 別のルーチンを呼ぶ。 別のルーチンも自分のスタックから環境をpopして処理を行い、 これが一段落すると、また環境をスタックにpushして元のルーチンや 別のルーチンを呼ぶ、ということを繰り返して並列処理を 実現するものだったと思います。 で、どれかのルーチンがCPUを独占してしまうと、 もう並行プロセスにならないってものなのです。 >execが戻ってくるのはexecに失敗したときだけで、execの実行に成功すると >絶対に戻って来ません。だから元のプロセスのイメージを保持しておく >必要はないですから、OSが掃除してくれるんじゃないでしょうか。 ありゃ…すいません、完全に誤解してました(^o^;ゞ execは戻らないんですね(MS-DOSとごっちゃにしてたかな?) 実は、シェルが一旦forkしてからexecするのも疑問だったのです。 |
ちょっと間違いです(^^; >execは戻らないんですね(MS-DOSとごっちゃにしてたかな?) MS-DOS でも exec は戻りませんでした。 (いずれにしても、単一プロセスのMS-DOSの感覚が なかなか抜けないみたいです…(^^;) |
AppleScript対応したtelnetソフトがないぃぃぃぃ… ってわけで、ここ1週間ほど、朝6時頃おきて、サーバーに繋いで コマンド打ち込んで…をくり返す毎日でございます。 ブラウザ上からCGI直接指定して、うまく動かせるようにできんかな… だったら、毎朝自動的に立ち上げてほっぽっときゃいいし(笑) |
下、ワシの発言です。 つい、名前のとこに「タイトル」を入れてしまった(笑) |
tarでファイルを一つにまとめて出来るファイル(% tar xf〜で指定)を直接いじって大丈夫でしょうか? ファイルの書き換えが面倒なので「% tar xf〜」で複数のファイルを一つにまとめ、一括して特定の文字列を置換したあと、 元に戻す…ってのをやりたいんですけど? |
すんません、お師さん。 下の質問は無視ぶっこいてください。 実験の結果、だめな事が立証できましたわ。 |
file1 file2を % tar cf file.tar file1 file2 でfile.tarにアーカイブして、file.tar自体をいじる、ってことですか? tarファイルはヘッダが付いてますので、一般的には無理です。 が、絶対不可能ってことはないんじゃないかなぁ。 エディタなどでは無理でしょうし、aをbに変換、なんてのは ヘッダを書き換えてしまう可能性があるのでダメでしょうが、 hogehogehogehogeをfugafugafugafugaに変換、ってのは たぶんできるんじゃないでしょうか。 とはいえ opendir(DIR,"."); @files = grep(/file\d/,readdir(DIR)); closedir(DIR); foreach $file (@files){ open(IN,$file); @buf = <IN>; close(IN); open(OUT,">$file"); foreach (@buf){ s/a/b/g; print OUT $_; } close(OUT); } なんてやる方をお勧めします(バックアップを忘れずに)。 # perlにファイル自体を書き換えるオプションがあったかな? |
># perlにファイル自体を書き換えるオプションがあったかな? perl -pi.bak -e "s/a/b/g;" file[0-9] では? |
> perl -pi.bak -e "s/a/b/g;" file[0-9] うーん、簡単ですねぇ。ちなみに僕は最近までオプションは -wと-e しか知りませんでした。でも最近-cを覚えました(^^; 分厚いマニュアルをめくってオプション調べるより自分で書いた方が 早いんで、なかなか覚えられないんですが、長い目で見るとさっさと オプション覚えた方がいいんでしょうけどね…。 # 一番悪いのは、青ラクダ本の目次。「オプション一覧」とか # 「スイッチ一覧」なんて項がない。どこに書いてあるかと # 言えば「コマンドインタプリタとの協調」。毎回オプション解説を # 探すのに苦労してます。…ま、言い訳ですな(^^; > ブラウザ上からCGI直接指定して、うまく動かせるようにできんかな… CGIはnobody権限で動きますので、CGI経由で作られるファイルは 全て所有者がnobodyとなります。ファイル消せなくなってあわてない ように(笑) |
># 一番悪いのは、青ラクダ本の目次。 青いラクダは、確かに読みづらいですよね。 私の場合、普段は「日本語 perl texinfo バージョン 4.0.19.2」のプレーンテキ スト版をオンラインマニュアルとしてを使ってます。高尾直弥さんという方の訳 ですが、リファレンス部分は赤いラクダとほぼ同内容だと思います。 ただ、今使ってるものはいろいろイジってて配布条件(GNU)上問題があるのと、 手元にオリジナルが見当たらないので、ちょっと探してみましたが、根性がない ので↓のようなHTML版しか見つけられませんでした(^^; http://www.cec.co.jp/usr/hasegawa/Docs/perl-jman/index.html でも、どこかに必ずオリジナルのtexinfo やプレーンテキスト版もあると思いま す(^o^;ゞ WindowsのヘルプやHTMLよりも、やっぱりエディタで正規表現検索が可能な普通の テキストが使い易い… |
日本語 perl texinfo の1頁ものがありました。 http://main.ipc.fukushima-u.ac.jp/fdai/man/perl.html テキスト版の前後を<pre></pre>で括っただけなので、ブラウザではちょっとヘンになりますが、 直ぐにテキストに戻せると思います。 |
どうもです。早速GETさせていただきました。 これでちょっとは賢くなれる…かな?(^^; |
はじめまして(^^; Perl関係で質問なのですが良いでしょうか。 Perlのみで画像(画像ファイル)の生成って出来ないんでしょうか? いろいろ書けるほど情報が集まってないので、簡単ですがこれで。 よろしくおねがいします。 |
はじめまして、SRM2さん(笑) うっとこの http://X68000.startshop.co.jp/~68user/cgi-bin/view-count.cgi?log=sum0+sum1+sum2+sum3 は、flyというプログラムを利用していますが、perl単体で ということなら、GD.pmというライブラリを使うといいでしょう。 http://www.genome.wi.mit.edu/pub/software/WWW/GD.html をどうぞ。英語ですが使い方は簡単にわかるはずです。 |
はじめまして、山口といいます。 いきなりの質問で失礼ですが、.forwardの中にメールアドレスを書くと、届いたメールはその書き込んだメールアドレス当てに転送されますが、その時もとのメールアドレスでもみれるようにするにはどうすれば良いでしょうか。 要するに転送する時に自分のところにオリジナルは置いておいて、そのコピーを転送するというぅような形にしたのですが。 どなたかアドバイスを下さい。 |
はじめまして 68userさん M.Masudaです。 いや〜こちらのページにはじめてよらせていただきましたが ずいぶんと勉強になります。 先ほど、CGIスクリプト関連をDOWNしたのでこれからおいおい 解析して勉強させていただきます。 にしても、PerlだけでなくUNIXやプロトコル・ネットワーク 関連の情報量には驚くばかりです。 これからも、宜しくお願いします。 ところで本題ですが。 自分で実験してみればいいのでしょうが、ファイルロックの アルゴリズムには、一般的にflockを採用している物や、ロッ クファイルを作成してスクリプト自身がロックを管理してい る物が有りますが、今までの68userさんの経験上どういう手 法が一番効果が高いでしょうか。 あと、下の山口さんの質問は私も興味ありです(笑) 本屋さんでオライリーのsendmailかmailの本でも買って勉強 すればいいのでしょうが、それだけのためにはオライリーシ リーズは高すぎる!!! ここでうなずいた方は、沢山いるはず(爆笑) #68userさんはレスの書込みの時間が遅い(早い?)ですが何 #をしてる方なのでしょうか? そろそろ中級に足のかかってきた私ですが、宜しく御教授下 さい。 |
はじめまして>山口さん、M.Masudaさん 山口さんのユーザ名がhoge、転送したいところがfoo@bar.com だとしたら、.forwardに \hoge,foo@bar.com と書けばいいです。カンマで区切ることで、複数の転送先を 指定できますから。しかし hoge,foo@bar.com と書いてしまうと、hoge宛に(つまり自分自身)転送されますが、 再度 .forwardが参照されて、またhogeに送ろうとして…という ふうに、無限ループに陥ります。 つまり、「\」を付けると「.forward を参照するな」という意味に なりますので、無限ループが防げるわけです。 # ただ「\」を付けなくても、大抵のメールサーバだと数回ループ # したら止まるでしょうし、最近のsendmailは賢いので一度もループ # しないかもしれません。でも、念のため \ を付けておいた方が # いいでしょう。 > 今までの68userさんの経験上どういう手法が一番効果が高いでしょうか。 特に詳しいわけではないんですが、選択肢としては 1.flock 2.mkdir 3.シンボリックリンク あたりでしょうか。うちのカウンタは3ですし、このBBSは2です。 flockはNFS環境では動かないところもある(動くところもある) ということで、使ったことは一度もありません。 ただ2も3も、たま〜にロックが残ったままになることはあるんですよね。 でもOSレベルでは完璧に排他処理はできているはずです。 ですから、webサーバがシグナルを送って、CGIのプロセスを止めたとき にロックが残るのではないかと思うんですが、本当にそうなのか、 どういう状況で起こるのか、などの検証はできていません。 完璧な方法があれば僕も知りたいです(^^; > #68userさんはレスの書込みの時間が遅い(早い?)ですが何 > #をしてる方なのでしょうか? ははは、生活リズムが不規則な ただの学生です(^^; |
どうもありがレスとうございます。 .forwardの設定早速指定してみます。 >完璧な方法があれば僕も知りたいです(^^; そうですか、まだ「これ!」ってセオリーは無いんですね(^^ゞ 今、flyを使ったカウンターを作ってるんですが、残ってしまった ロックファイルを削除する方法を考えてみます。 今までCUIはDOSしか触った事が無いのでUNIXのTABや矢印キーには 非常に驚き、非常によく作られたUNIXのシステムに感心しています。 おかげでキータッチがだいぶ早くなりました。(^_^)V この掲示板のタイトルに有る「UNIX,CGI,ネットワークの...」 は、今の私が求めているばかりで、ここは情報の宝庫です。 学生という事は、私よりだいぶ若いのにかなりの知識を持って いるようで恥ずかしいばかりですが、ぜひまた何かあったら教 えて下さい。m(_ _)m 宜しくお願いします。 |
訂正 誤:どうもありがレスとうございます。 正:どうもレスありがとうございます。 (^^ゞ |
68userさんご回答ありがとうございます。 68userさんの言う通りにやってみたところ、 ¥hoge,foo@bar.comのhogeにはメールが残らず、 すべてfooに転送されてしまいました。 何が行けないのでしょうか? hogeの前は「エンマーク」でいいのですよね。 |
僕が現時点で一番いいと思う方法は、シンボリックリンク自身に プロセス番号の情報を埋め込み、もしリンク作成できなかったら リンク先を調べて、さらに「/proc/プロセス番号」が存在するか どうかチェックする、ってのです。もし/proc/プロセス番号 が あれば、本当に実行中なわけですが、存在しなければ誤って ロック情報だけが残ってしまったわけで。 また、 $SIG{HUP}=$SIG{INT}=$SIG{QUIT}=\&finish; sub finish{ ロックファイルを削除;exit; } などと書くことで、誰か(WWWサーバなど)にシグナルを送られて プロセスを止められた場合にも、ロックファイルの後始末だけは 行って終了できます。 ただ、うちのカウンタはいろいろ試しているんですが、いまいち…です。 # CGIの場合、排他処理の失敗自体がたまにしか起きないので、 # 動作チェックしにくいですよね。 例えばこんな感じ。 BEGIN { &lock_on; } END { &lock_off; } sub lock_on { $SIG{TERM}=$SIG{INT}=$SIG{HUP}=$SIG{QUIT}=\&lock_off; my $lock_flg = 0; LOOP: foreach ( 1..3 ){ foreach ( 1..5 ){ $lock_flg = symlink("$$",$lockfile); if ( $lock_flg ){ last LOOP; } sleep 1; } if ( ! $lock_flg ){ if ( ! -f "/proc/".readlink($lockfile) ){ # なぜかロックファイルが残ってた 各種整合性のチェック; unlink($lockfile); } } } if ( ! $lock_flg ){ print "ロックファイルを作成できませんでした。\n"; exit; } } sub lock_off { unlink($lockfile); その他の後始末; exit; } > そうですか、まだ「これ!」ってセオリーは無いんですね(^^ゞ たぶんセオリーはあるんでしょうけど、僕が知らないだけです(^^; > hogeの前は「エンマーク」でいいのですよね。 全角の「¥」ではないですよ。半角の「\」です。 エンマークかバックスラッシュかは、表示される環境によります。 |
>たぶんセオリーはあるんでしょうけど、僕が知らないだけです(^^; いやいや、これだけ知ってれば十分じゃ....この概念は私的でした ね(^^ゞ 私のプログラミングは、BASICから入ってるのでいまだに構文の書 き方は、BASIC風です。(^^; しかも、Perlもフリーで配布しているCGIを解析して構文の記述を 勉強したりしてるので、Perl4やそれ以前の頃からプログラミング している人から比べたら、恥ずかしくって自分のプログラムなんて 公開できない。(T_T) まだまだ奥が深いPerlは、これだけを勉強して立派なPerl使いにな りたいんだけど、仕事柄これだけをやってるわけにいかないのが辛 いところです。(^^; 今同時進行で勉強してるのが、Perl,JavaScript,DHTNL,ネットワーク 関連、最近勉強を始めたDHTMLは、IEとネスケの互換性の無さにあき れています、ページを2重化したくないので同じページ内でIE・ネス ケそれぞれ3と4のバージョンで無難に表示させるのにてこずってま す。(^^; ところで以下の構文がまだよく分からないので、教えて下さい(T_T) 【1】 $SIG{HUP}=$SIG{INT}=$SIG{QUIT}=\&finish; ↑何をしているのか解からない(恥) シグナルハンドラをいじっているのは解かるんだけど、 hoge=foo=fuge=booの '=' の使い方の意味と、\&finishの'\'がリファ レンスを指す事は解かるんだけど、なぜ'\'そうするのかが解からない 【2】 my $lock_flg = 0; ←localとmyの使い分けがまだ理解できない アー恥ずかしかった。(^^ゞ この使い方は勉強になりました。 >$lock_flg = symlink("$$",$lockfile); >if ( $lock_flg ){ last LOOP; } こんなに簡単に書けるんですね!φ(._.) ># CGIの場合、排他処理の失敗自体がたまにしか起きないので、 ># 動作チェックしにくいですよね。 早いマシンより、遅いマシンに負荷が集中する時にエラーが出やす いんでしょうね。 ちなみに私の試験方法は、同じページ上に同じカウンタのURLを沢山 書いて、ブラウザのキャッシュを無効にしてリロードです。 #本当にこれでいいのか解からないけど、他に手段を知らない(^^ゞ ではまた。 |
>> $SIG{HUP}=$SIG{INT}=$SIG{QUIT}=\&finish; $a=$b=$c=100; print "$a,$b,$c\n"; の結果は100,100,100となります。つまり$a=100;$b=100;$c=100;と 等価なわけですね。そもそもperlの(Cもそうですが)代入文自体は 値を持っています。 print $a=100; の結果は100です。また=(イコール)演算子は右から順に 評価されますので、 $a=$b=$c=100; は $a=($b=($c=100)); と等価です。というわけで、 $a=($b=($c=100)); ↓$cに100を代入 $a=($b=100); ↓$bに100を代入 $a=100; という流れになっているはずです(たぶん)。 シグナルハンドラですが、perl4なら $SIG{HUP}="finish" ですけど、この書き方では 関数finishが別ファイルにあった 場合(それをrequireやuseで使っている場合)は呼べません。 というわけで、\&finishと書くわけです…と青ラクダ本に 書いてありました(^^; あとlocalとmyは local $local=1; my $my=2; &f; sub f { local $local=3; my $my=4; print "f: \$local=$local\n"; print "f: \$my=$my\n"; &g; } sub g { print "g: \$local=$local\n"; print "g: \$my=$my\n"; } 実行結果: f: $local=3 f: $my=4 g: $local=3 g: $my=2 ということでどうでしょう? > IEとネスケの互換性の無さにあきれています DHTMLはわかりませんが、Javascriptを使っていて、 Winでは動くのだろうけど FreeBSD+NetscapeNavigatorでは エラーが出まくるようなページが たくさんあるので、 こんな変なものには絶対手を付けまいと誓いました(笑) というわけで僕はJavascript、DHTMLに関しては全くの素人です(^^; |
詳しい解説ありがとうございます。 いまいちおバカな頭で理解できないけど、 local と my の違いは、 サブルーチンからさらにサブルーチンに呼ばれた時に。 local = 前のルーチンの値を保持する。 my = 最初のサブルーチンを呼ばれた時(定義した時)の値を示す。 と、解釈していいのかなぁ? もしそうなら、具体的に使う時は再帰呼び出しの様な使い方を した時に違いが出る。ということでしょうか? それならmainルーチンから普通にサブルーチンを呼び出した時 (初期化ルーチンの様な)さらにルーチンを呼び出さなければ、 同じ結果ですね。 #localやmyで指定されたサブルーチン内の変数に当てられた分の #メモリは、そのルーチンが終了すれば開放されるのだろうか? >$a=$b=$c=100; は理解できました。 やっぱBASICが最初だと、Perlの構文は簡単に記述できるけど、 理解に時間がかかる!、単におバカなだけだったりして((((^^; >というわけで、\&finishと書くわけです…と青ラクダ本に 何ページに載ってます? よく言う青ラクダ本は持ってますが、あんまり読んでると眠く なるので、必要な部分だけ拾い読みしてます。(^^; #にしてもラクダ本って、何が何処に書いてあるのか解かりづら #い...、しかもたまに書いてある英語のジョークが、真剣に読む #と腰を砕くし....(; ;) 私は、恥ずかしいけど請け負いでホームページ製作をしてるんで すが、製作作業と勉強に掛る時間が同じ位です。(>_<) >こんな変なものには絶対手を付けまいと誓いました(笑) すいませんこんな変なもの作ってます(爆) Javascriptは、クライアント側のプログラムなんで、アクセス環 境で動いたり動かなかったりなので、大手サイトやアメリカのH サイトで使用している物を、見ながら使ってます。 これは無断コピーの意味ではなく、「沢山のアクセスのあるサイ トで使われているコードはエラーが少ないだろう」を前提にして ます。もちろんそのまま使うのではなくコマンドの使われかたを 流用するだけだけど。 一応ネスケとIEは、3と4のバージョンで動作確認しながら作 ってますが、他のOSは環境が無いのでどうにもならないし..。 私のページも、68userさんの環境からアクセスすると、最悪かも しれない。(^^ゞ 暇なら来た時BBSに書込みでもしていって下さい。 |
ちょっと横ヤリです(^o^;ゞ local も my も、その宣言位置から、これを囲む最も内側のブロックの最後までが有 効範囲であるという点は同じです。ただし、この「ブロックの最後まで」というのが、 localの場合が時系列的に判断されるのに対して、my はスクリプトの見た目上のブロッ クの階層構造で判断されます。 つまり、my は、C言語などと同じで、ブロックの異なる階層に同じ名前の変数が my で宣言されている場合、その変数が現れた位置の最も内側のブロックで宣言されたも のが参照されます(ブロックスコープ)。 これに対して、local は、LISPなどと同じで(これはちょっと?)、系列や階層が異 なるブロックに同じ名前の変数が local で宣言されている場合、プログラムの実行に 伴って、この実行のステップがどのブロック内にあるか(また、どのブロック内から 呼び出されたか)ということによって有効範囲が判断され、既に有効範囲を外れたも のを除いて、現在有効である最も最近宣言されたものが参照されます(動的スコープ)。 なお、自分自身を呼ぶだけの単純な再帰呼び出しでは、myもlocalも変わりないと思い ます(たぶん)。 ただ、perl4の解説では、localをループ内で使うと、ループのたびにスタックが消費 されると書いてあったのですが、perl5ではこの説明がなくなってました。なんでかな ぁ…? a=b+c などは、一般のプログラム言語では文(代入文)となりますが、Cやperlなどで は単なる式となります( = は b+c の値を返すだけの演算子で、副作用としてこの値 を a に代入します)。で、どちらの場合も = の右側には式が書けるので、Cやperlな どの場合にのみ x=(a=b+c) というような記述が可能になります。また、= は右結合の 演算子なので、68userさんの仰るように ( ) が不要になります。 |
手元の青ラクダ本では、6.2.1 シグナル(P.389)に書いてありました。 あとmmさん、どうもです。 ああ、もうちょい長く書きたいけれど、風邪がつらいです。 時期が時期だけにインフルエンザかなぁ…。発熱・頭痛・ 体の節々の痛み・せき、などなどフルコースです。 というわけで、今日はこの辺で…。 |
あっ、おだいじに>68user さん …のいぬ間に、ちょっと訂正(^^; 副作用という用語は、単純な代入式では使わないようです。 また、「= は b+c の値を返す」と書きましたが、正確には a に代入した値を返すようです。 つまり、a と b+c の型が違う場合は、a の型になるそうです。 |
う〜ん.... やばい!あたまが... ばくはつしそうぅ... Perlだけでも、CぢゃなくてBASICから入ったので混乱してるのに、 やれJavaScriptだ、DHTMLだと私の頭はいま、知恵熱で300度位です。(笑) もう少し時間を掛けて、勉強してみます。(>_<) mmさんありがとう。 #名前が似てますねぇ(^_^)V ここの常連さんは、レベルが非常に高いのでお勉強には最適です。 言い訳だけど、青ラクダ本はホント辞書の様なので、初心者には 何かの事をさせたい時に、それがどこに書いてあるのか探すのが 一苦労です。(国外のジョークはそれを理解するのにエネルギーが 必要なので、訳者に削除して欲しいと思うのは私だけ?) やっぱ一度、全部を時間を掛けて読破しないと..... う〜ん時間が無い... 誰か一日を30時間にするライブラリ知りませんか?(爆) ちょっと忙しくなってきたのでしばらく来ないかもしれないけど しばらくしたら、またわからない所教えて下さい。>ALL それでは。 68userさんお大事に! |
ちょっと変な質問ですが、解かれば教えて下さい。 IE2(win)とApache/1.2.6なんですが。 サーバーネームは、www.web.domain.co.jp バーチャルでは、 www.damain.co.jpです。 サーバーの設定は、バーチャルをメインのwebとして使用していま す。つまり一つのIPで2つのwebを運営してます。 なにが起こるかというと、IE3,IE4,ネスケ3,ネスケ4で、 www.domain.co.jpにアクセスすると、コンテンツ内容は正常に www.domain.co.jpで設定した内容を返すのですが、IE2のアクセス の時だけ www.web.domain.co.jpに指定した内容を返します。 関係無いかもしれないですけど、hostコマンドで、2つのネームを 叩くと同じIPを返します。 今度は、そのIPを調べるとwww.web.domain.co.jpを返します。 ネーム解決は、ドメイン名→ネームサーバーにIPを問い合わす→ TCPの通信はそのIPで行なう。(解釈が違ってたらごめんなさい) この際に、もしかしてIE2は単純にIPの指すサーバーにリクエスト を発行してドキュメントを取得する。 推測ですがこういう手順なら納得いきます。 現にIPをhostコマンドで調べると、www.web.domain.co.jp を返し ます。 でもそんなことあるのでしょうか、もしそうならIE2はバーチャル サーバーのドキュメントを参照できない事になります。 サーバーの設定がが悪いのか、IEが悪いのか、それともネーム解決 が悪いのか私には解かりません。(^^ゞ もしこの現象が解かれば教えて下さい。 サーバー設定が原因でありませんように...アーメン(^^) |
>IE2のアクセスの時だけ www.web.domain.co.jpに指定した内容を返します。 私は、Apacheはよく知らないので、68userさんの方が専門だと思いますが…(^^; 寝込んでらっしゃるかも知れないので…、とりあえず、 ↓の「さらなる改善点・バーチャルホストに対応」が参考になるんじゃないでしょうか。 http://X68000.startshop.co.jp/~68user/net/http-5.html 原因は、IE2 だけが Host: ヘッダを送ってないということかな…? Apacheにとっては、ブラウザがwww.web.domain.co.jp と www.damain.co.jp の どちらで接続して来たかの区別はないハズです。ただ、ブラウザから送られて来る HTTPヘッダが Host: www.web.domain.co.jp Host: www.damain.co.jp のどちらになっているかで、送り返すページを区別しているのだと思います。 IE2が使えるのなら、一度送信ヘッダを調べてみてはいかがでしょう。 ↓で環境変数を調べて、HTTP_HOST がちゃんと設定されているかどうかを見てみて下さい。 http://X68000.startshop.co.jp/~68user/Cgi-room/printenv.cgi それから、my と local の件ですが、perl5 しか使わないというのであれば、 local は忘れてもいいんじゃないでしょうか( local は古いバージョンとの 互換性のために残ってるだけだと思います)。 ↓でブロックスコープの基本が理解できるんじゃないかなぁ…? Algol系の言語(Pascal,C,awk,perl,Java,JavaScript..)の有効範囲の基礎に なると思います(たぶん(^^;)。 $a = 0; { my $a = 1; { my $a =2; { my $a = 3; print "$a\n"; } print "$a\n"; } print "$a\n"; { my $a = 666; print "$a\n"; } print "$a\n"; } print "$a\n"; ↓実行結果です(なお、この場合は、myをlocalに替えても同じです)。 3 2 1 666 1 0 >やっぱ一度、全部を時間を掛けて読破しないと..... えっ? 私は、全然読破してませんです(^^; 参照用と、項目別にその部分だけを読んでます。 >#名前が似てますねぇ(^_^)V すいません、面倒なんでイニシャルの mm にしてしまってます(^^; ★再度訂正(^^; LISPが動的スコープと書きましたが、Common Lisp は動的はありませんでした。 でも、確か動的スコープの Lisp もあるハズです(^o^;ゞ |
★再再訂正(^^;;; JavaScript の var って、ブロックスコープじゃないんですね。 試してみたら、単に関数内でローカルなだけでした(^^; それと、awk も、仮引数リストの変数が関数内でローカルなだけで、 これも関係ありませんでした(^^;; マジメな話に慣れてないので、訂正が多くってスミマセンですm(_o_)m |
どもども。なんとか熱も下がったのですが、もうちょい安静にしときます。 > あとlocalとmyは > (snip!) > ということでどうでしょう? 実は言葉でうまく説明することができなかったので、 サンプルソースでごまかしたというのはナイショです(笑) M.Masudaさんからメールをいただきましたが(500エラーで 書き込みできなかったそうで)やはり >> IE2はバーチャルサーバーのドキュメントを参照できない事になります。 ということのようですね。 メールからの引用ですが、 > 「もうIE2なんて使ってる人いないよ」と言っても、それを実現して > くれなきゃ困るなんて言われるんで、とほほ状態です....。 社会とは理不尽なところですね(^^; ところでM.Masudaさんのwebですが、奥深くまで入っていったわけ ではないですけど、FreeBSD2.2.7+NC4.04で、Javascriptのエラーはでませんでした。 > 私のページも、68userさんの環境からアクセスすると、最悪かも > しれない。(^^ゞ というわけでご安心を。まぁ もしエラーになったとしても、minorityの 宿命ということであきらめてます。 # 別にわざとエラー起こしているわけではないですし。 |
500エラーで書けなかった内容です。 ====================================== どうもありがとう。影の68userさん(^^)/ ブロック...そう今日読んでたとこに有りました。 ああいった使い方は、Cとかに多いみたいですね。 なんかPerlて、底無し沼の様に奥が深くって、ちょっとビビッてま す。(笑) 個人的には、プログラミング好きなんでいろいろ試したいし、構文 の柔軟さは、すごくうれしい!\(^O^)/ だけど、ホント誰かrequireできる、一日を30時間いや48時間くら いにするルーチン書いてくれないかな(笑) 【86.9%本気】←どっかで見たなぁ Webで使うCGIでする事なんて割と簡単なので、今のレベルで良いか もしれないけど、この業界で生き残るにはちゃんと勉強せねば! と、最近つくづく感じてます。 #最終的にはDBとの絡みが有るだろうし IEの件はちょっと情報が入ったのですが、やはりだめブラウザのレ ッテルが張られているようですね。 まだ確認は取ってないですが、IE2はどうもバーチャルが見れない バグがあるらしいです。(未確認なので信用しないように!) サーバーを管理している人と連絡をとって、いくつか対応策を思案 中です。 「もうIE2なんて使ってる人いないよ」と言っても、それを実現して くれなきゃ困るなんて言われるんで、とほほ状態です....。 JavaScriptも結構面白いんだけど、環境によってブラウザの対応レ ベルが違うので、バージョンが違うとエラーが出たりはよくありま すね。 そろそろインターネット界も仕様をもっと統一してくれると、私み たいにこの世界で生きている人もやりやすいんだけどなぁ。 ブラウザ毎のルーチンって具合で、各ブラウザに合わせたスクリプ トを作ってると、たまに暴れたくなります。(^^ゞ でもこういう場所があって、私みたいな人間にはとても助かります。 なんか愚痴っぽくなってしまいましたがご勘弁を!(^^)/ ==================================================== なんで500エラーが出たんでしょうか? >というわけでご安心を。まぁ もしエラーになったとしても、minorityの >宿命ということであきらめてます。 私のページは、右側の部分(個人的な内容)でスクリプトを多用しています。 特にMusicとFavoriteのなかの部分で使ってますが、くだらないから見る 価値ないかも?(^^ゞ >原因は、IE2 だけが Host: ヘッダを送ってないということかな…? 通信パケットを見たら、全くそのとおりでした。 IE2のバカ! でもこれで、私の範疇では無い事が解かりましたので一安心です。 でわまた。 |
@68userさん >500エラーで 書き込みできなかったそうで あれま…そんなことが… >サンプルソースでごまかしたというのはナイショです(笑) ワタシの文章も分かりにくいとは思いますが、実は最初に書いた初版は もっとひどくて、自分で読んでもワケ分からんモノでした(^^; (一応、アレは改定第2版(^^;) JavaScript は、私も、IE/NN間の相違に加えてバージョン間の違いも多いので、 自分でちょっと使うとき以外は、あまり深入りしないようにしてます。 でも、M.Masudaさんの場合は、そんな悠長なコトも言ってられないのかな(^^; @M.Masudaさん >>原因は、IE2 だけが Host: ヘッダを送ってないということかな…? >通信パケットを見たら、全くそのとおりでした。 やはりそうでしたか… いや、もしそうだとすると、IE2ではバーチャルホストにアクセスできない ことになるので、まさかそんなことが?…って思ってたんです(^^; >ブロック...そう今日読んでたとこに有りました。 >ああいった使い方は、Cとかに多いみたいですね。 うーん、あまり積極的に使うことはないような気はしますが…? せいぜいループカウンタくらいかなぁ…、 カウンタは慣習的に i を使うので、不要な衝突を避けるために便利かな…とは思います。 perl の場合は、foreach $i (LIST) の $i がループ内でローカルになりますね。 C++ の for( int i = 0; ... でも、ループの直ぐ外のブロック内にローカルなので、 こういう場合には有用かもしれません。 ただ、Pascalは、Cとかと異なり、関数や手続きを入れ子にできるんで、 親のローカル変数との衝突を避けるために、もっと積極的に利用してるかも知れません。 |
>> 500エラーで 書き込みできなかったそうで > あれま…そんなことが… ログを見ると、ここのwwwboard.cgiは最近2ヵ月で20回くらい 500エラーが起こってます。ここは無改造なのですが、ロック用 ディレクトリが残ってしまうと500エラーになってしまうので、 はやいとこ改造せねばいかんなと思いつつ…めんどくさいし〜。 # ログがどんどん増えていくのもなんとかしないと。 > perl の場合は、foreach $i (LIST) の $i がループ内でローカルになりますね。 それは foreach my $i (LIST) とかの場合では?と思いつつ試してみたところ… foreach $i (LIST) でも $i はローカル変数扱いなんですねぇ。知らなかったっす。 |
> 500エラーが起こってます。ここは無改造なのですが、ロック用 > ディレクトリが残ってしまうと500エラーになってしまうので、 他のスクリプトで、ロックファイルのタイムスタンプを調べて、 10分以上前なら削除、てな方法がありましたよ。 ># ログがどんどん増えていくのもなんとかしないと。 レスキューさん所みたくページ表示行数を決めて、[次ページ] なんてしたら? #言うだけは簡単なんだよな〜(^^; >でも $i はローカル変数扱いなんですねぇ。知らなかったっす。 自分もさっき実験してはじめて知りました。(*_*) >JavaScript は、私も、IE/NN間の相違に加えてバージョン間の違いも多いので、 >自分でちょっと使うとき以外は、あまり深入りしないようにしてます。 >でも、M.Masudaさんの場合は、そんな悠長なコトも言ってられないのかな(^^; 本来ちゃんとした手続をすればある程度、エラーを減らしたり出来るらしいですが 、私もそこまで出来てませんし今のところクライアントにはわざといろいろと難し い説明で逃げ回ってます。(^^ゞ #でもDHTMLのスタイルシートやレイヤーの方がもっとたちが悪いですよ(互換性で) 厳密な処理を必要とする部分はCGIを利用して、それ以外の処理をJavaScript等に 行なわせる。といったところでしょうか。 ところでmmさんて何者?(^^ゞ >ワタシの文章も分かりにくいとは思いますが、実は最初に書いた初版は >もっとひどくて、自分で読んでもワケ分からんモノでした(^^; >(一応、アレは改定第2版(^^;) 何か執筆していらっしゃるんですか? |
BBSに関しては、本気でちゃんとしたシステム作るつもりは ないんで、まぁ…こんなもんで(笑) # 引用の色変えはmmさんとこのBBSのマネ(^^; あとは何かありますかねぇ…。タグの自動補完とか二度書き禁止とか… うーん、いまいちそそる機能がない。 |
もいっちょテスト! |
ああやっぱりやだなぁ。 メッセージ数はいつでも変更可能にしたいなぁ。 …よく考えずにいじると後悔するという、いい例でした(^^; |
>68user さん >はやいとこ改造せねばいかんなと思いつつ…めんどくさいし〜。 ワタシも、flockに書き換えるつもりで、ロック部分をコメントアウトしたんですが、 未だにそのままになってます…(^o^;ゞ > foreach $i (LIST) >でも $i はローカル変数扱いなんですねぇ。知らなかったっす。 こちらは、C++の場合もループ内ローカルだと思い込んでて、 perlの場合と並べて書いてたんですが、調べてみると違ってたので、 ちょっとヘンな文章になってしまいました(^^; >M.Masuda さん >他のスクリプトで、ロックファイルのタイムスタンプを調べて、 >10分以上前なら削除、てな方法がありましたよ。 とほほさんのコードも ($mtime) = (stat("lock/wwwboard.loc"))[9]; if ($mtime < time() - 600) { rmdir("lock/wwwboard.loc"); } となっていて、10分以上前なら削除されるハズなんだけど、 利いてないのかな? >本来ちゃんとした手続をすればある程度、エラーを減らしたり出来るらしいですが >、私もそこまで出来てませんし今のところクライアントにはわざといろいろと難し >い説明で逃げ回ってます。(^^ゞ ウチの場合は、手元にNN4とIE3しかないってのが一番問題になるようです。 でも、NN2,3やIE2,4があっても、やっぱり面倒そうではありますね(^^; >#でもDHTMLのスタイルシートやレイヤーの方がもっとたちが悪いですよ(互換性で) そのヘンは、もはや別物って気がします(^o^;ゞ もっとも、ウチでも簡単なスタイルシートは使ってますが… >何か執筆していらっしゃるんですか? ん? 「第何版」ってのは、単なる冗談です(^o^;ゞ ワタシは、単なるパソコン好きの素人にすぎません(^^; >68user さん ># 引用の色変えはmmさんとこのBBSのマネ(^^; ウチのも、他所のマネです(^^;;; でも、おかげで、空行を入れずに済みます。 >あとは何かありますかねぇ…。タグの自動補完とか二度書き禁止とか… >うーん、いまいちそそる機能がない。 タグの補完は、前にちょっと考えたことがありますが、面倒ですよね。 <TABLE>タグの<TR>とかが入れ子にならないし、引用符の中で ">" を使われると、 正規表現でのタグの切り出しができないし… |
> <TABLE>タグの<TR>とかが入れ子にならないし おろ、TABLEまで何とかしようという魂胆で? 志が高いですね(笑) 僕が昔に書いたのは http://X68000.startshop.co.jp/~68user/tmp/tag.txt です。今考えると、element(って言うのかな?)とか全く考えて ないんで、ヘボヘボですね。 うーん、でも真面目に実装したら、 TABLE-TAG := <TABLE> TR-TAG </TABLE> TR-TAG := <TR> [TD-TAG] [</TR>] TD-TAG := <TD> <chars> [</TD>] なんてBNF式に定義して、それに基づいてparseさせなきゃダメなのかしら。 # 昔 yaccとlexで組もうとした事があるけど、エラーから回復させる事が # できずに(=文法エラーにぶつかると止まってしまう)挫折しました(^^; |
ちょっと質問!です。 すいませんシェルコマンドのmailって有りますよね。 #みんな使ってます? 私が聞いたmailコマンドの使い方ですが、 ================= mail "送信先のメールアドレス" <ENTER> Subject: "メールタイトル" <ENTER> メール本文、etc. 最後に"."ピリオドのみで終了。 ================= ここまでを、聞きました。 #OSによっては違うかもしれないけど。 http://X68000.startshop.co.jp/~68user/unix/prgmemo.html#sendmail を見ると、sendmailとほぼ同じ操作ですよね。 シェルの場合、sendmailとmailコマンドの違いは、自動的にSubject:等 の文字がエコーされる事ぐらいなのですか? CGIで直接メールを出す場合、レスキューさんのWebFromを参考にすると sendmailに直接書込んでいますが、CGIで直接sendmailに書込みした場合 のエラーメッセージを取得したい時は、sendmail実行時にどんなオプシ ョンを付ければいいんでしょうか? 前にsendmailに実際に転送された手順を表示する様なオプションが ある事を聞いたのですが忘れました。(^^ゞ #man sendmailで調べたら -N dns ってのが怪しいのですが意味が #よく解からん。(ToT) ##前から思っていたけど、英語圏で生まれていたらもっと詳しくなっ ##ていたろうな。だってマニュアルって英語だもん(^^ゞ |
>おろ、TABLEまで何とかしようという魂胆で? 志が高いですね(笑) いや、入れ子構造だと決め付けて、作ってみてから気が付きました(^^; >僕が昔に書いたのは http://X68000.startshop.co.jp/~68user/tmp/tag.txt おお、ちゃんと < や > の対応もチェックしてあるんだぁ… なるほど、スタックを使うので、入れ子にならない例外的な処理も やりやすそうですね。 ウチのは、再帰を使ったので、スタックを直接操作できないんです(^^; 以前「とほほ」さんとこに書き込んだんですが、一応 http://www2s.biglobe.ne.jp/~cru/library/junk/tag.txt に置いときます。 例示した文字列では、</hr>の処理が 68user さんのとは違ってます。 ># 昔 yaccとlexで組もうとした事があるけど、エラーから回復させる事が ># できずに(=文法エラーにぶつかると止まってしまう)挫折しました(^^; yacc は私も挫折しました…ただし、68user さんよりはもっと手前でですが(^^; ところで、HTMLみたいなものも、yaccで解析できるんでしょうか? BNFで定義できれば問題ないのかな…? lexの方を独自の切り出しルーチンに替えればいいのかな…? |
crontabコマンドについて質問させてください。 あるプログラムAをcrontabで自動起動させたいのですが、 そのプログラムAはCシェルでしか動きません。 そこでcrontabで呼出すシェルスクリプトBを作成し、Bの先頭で Cシェルを指定し、次に必要な環境変数を設定し、 次にAを実行するようにしたのですが、 うまくいきませんでした。 Bにenvをいれて、環境変数を出力するようにしたら、 path等がshのデフォルトのままでした。 ちなみにAはオラクルに接続しSQL処理をおこないます。 どなたかご存知の方がいらっしゃいましたら、お知恵をお貸しください。 |
> http://X68000.startshop.co.jp/~68user/unix/prgmemo.html#sendmail > を見ると、sendmailとほぼ同じ操作ですよね。 うーん、mailコマンドっていうのはメーラーなんですよ。メールも 読めるし返事も書ける。低機能ながら立派なメーラーです。一方、 sendmailというのはSMTPサーバ兼(低レベルなら)SMTPクライアントって 感じでしょうか。 # しかし上のリンク先の「SMTPポートに繋げてメールを送る方法」って # のは大嘘ですね。誰だ、こんなの書いたのは。…俺か(^^; > CGIで直接sendmailに書込みした場合のエラーメッセージを取得したい時は、 宛先がなかった場合などに返ってくるメールを指して「エラーメッセージ」と 言ってらっしゃるなら、 http://www2e.biglobe.ne.jp/%7es-hasei/cgi-bin/wwwlng.cgi?print+99020031.txt など。 > #man sendmailで調べたら -N dns ってのが怪しいのですが意味が > #よく解からん。(ToT) -Nは-N failure,successなどと指定できます。manを読むときは、 日本語マニュアルを使って楽をしましょう。 http://www.jp.freebsd.org/cgi/mroff.cgi?subdir=man&man=sendmail&dir=jpman-3.0.0%2Fman > あるプログラムAをcrontabで自動起動させたいのですが、 > そのプログラムAはCシェルでしか動きません。 状況がよくわかりませんが、プログラムAがCシェルスクリプトなら プログラムAの1行目に #!/bin/csh -f などと書いてあるでしょうから、crontabにプログラムAのスクリプト名を フルパスで書いておけばいいです。PATHは、プログラムAの先頭で set path=(/bin /usr/local/bin /usr/sbin ....) と書いてもいいですし、crontabの設定ファイルの先頭に PATH=/bin:/usr/local/bin:/usr/sbin:... と書いてもいいです。例えば PATH=/bin:/usr/local/bin:/usr/sbin:... 0 * * * * /home/user/bin/hogehoge とか。 |
> yacc は私も挫折しました…ただし、68user さんよりはもっと手前でですが(^ こっちも挫折は早かったですよ〜。 http://X68000.startshop.co.jp/~68user/tmp/html.l http://X68000.startshop.co.jp/~68user/tmp/html.y うーん、短いなぁ。今見ると、どこがどういう意味なのかさっぱり(笑) |
どうもありがとう68userさん。(^^)/ > > CGIで直接sendmailに書込みした場合のエラーメッセージを取得したい時は、 > 宛先がなかった場合などに返ってくるメールを指して「エラーメッセージ」と > 言ってらっしゃるなら、 > http://www2e.biglobe.ne.jp/%7es-hasei/cgi-bin/wwwlng.cgi?print+99020031.txt > など。 直接行ってみたら、なんとよく行くページの中。 ここの所忙しく、あまり見に行って無かったらなんとリアルタイムな! 灯台下暗しとは、この事? > -Nは-N failure,successなどと指定できます。manを読むときは、 > 日本語マニュアルを使って楽をしましょう。 > http://www.jp.freebsd.org/cgi/mroff.cgi?subdir=man&man=sendmail&dir=jpman-3.0.0%2Fman こんな便利があるとは!なんともうれしい限りです。(^^ゞ でもうちの環境ではLinuxなので適当に、コンバート?しながら見てみます。 だけど、また暫く睡眠時間が少なくなりそう....(T_T) ちなみですが。 http://X68000.startshop.co.jp/~68user/Cgi-room/printenv.cgi で書いてあるなかで REMOTE_PORT を、「ポート番号とは全く関係なくて、httpdをforkした回数じ ゃないかなぁと思ったらこれも違うみたい。よくわからん。」と書いてありましたが、そのまんま です。(^^) つまりクライアント側が、webサーバーの80ポートにアクセスする際に使用する、クライアント側の ポートの番号です。 私の使用しているパケットモニターで確認しました。 クライアント側アプリケーションが、通信の際にソケットを生成するとその時に自動的に割り当て られるみたいです、アプリの処理方法はそれぞれでなんでしょうが、通信セッション(っていうのかな) が終わる毎にクライアント側のポートが変わりました。 #まじめに勉強した訳でなくパケットモニターでの通信内容をみて書いてます。(^^ゞ |
>http://X68000.startshop.co.jp/~68user/tmp/html.l >http://X68000.startshop.co.jp/~68user/tmp/html.y ありがとうございます。なんとなく雰囲気はわかるような気がします(^o^;ゞ ただ、lexでは"<BODY>"とかをトークンとして扱ってますよね。 こういう方法で <BODY GBCOLOR="#ffffff"> のような属性を持ったものも 扱えるのでしょうか? よくは分かってないんですが、lexではトークンを正規表現で切り出しますよね。 だから、<>内をまとめて切り出すのは難しいような気がするのです。 それとも、<>内はまた別のルールでトークンに切り分けるのかな…? |