5月19日に、TAKuさんは書きました。 >5月19日に、Shigeさんは書きました。 > >> errors.txt使えてます www2h (^_^)v >> おかげさまで余所様で使っていただいてるスクリプトのトラブルシュートがかなり楽に・・・ >> > > うーん。errors.txtいつのまにか数十行書き込まれてました。 >が、どのHTMLからCGI呼び出しのかが分からない・・・。(^^; >もうちょっと情報があると、便利なのになぁ。 > >ところで、socketまわりを触っているところで、 >Connection refused at 〜 >というのが何十行もあるのですが、これは、evalで囲めばなんとかなるのかな? > >あと、こんなのもありました。これは一体・・・。 >〜: Exec format error > >ところで、STDERRをSTDOUTに回すようなスクリプトを通してCGIを走らせれば、 >エラーメッセージってブラウザから読めますよね。あと、syntax error類は、 >localにperlを用意して試した方が早いですよ〜。 > はい localで動くようにdebug用codeを加えて確かめてからUpしてますので Syntax Errorは滅多に・・・いや 偶にしか・・・ うーん 時々しか起こしません(^_^;) (修正して、その場ですぐUpすると よくやるのがdebug modeのままUpするミス) 最近のやつは途中経過をSTDERRに出力してるんですが OKなのにその先のMsgが出てこないのです。 (思いもよらないところに問題があるのでは? と考えてしまふ) >#結局、やっかいなのは、たまに起こるServer Error。 # ですよねぇ(-_-;)
5月19日に、Shigeさんは書きました。 >5月19日に、TAKuさんは書きました。 > >>ところで、STDERRをSTDOUTに回すようなスクリプトを通してCGIを走らせれば、 >>エラーメッセージってブラウザから読めますよね。あと、syntax error類は、 >>localにperlを用意して試した方が早いですよ〜。 > >はい localで動くようにdebug用codeを加えて確かめてからUpしてますので >Syntax Errorは滅多に・・・いや 偶にしか・・・ うーん 時々しか起こしません(^_^;) > やはり、CGIデバッグはlocalにhttpのサーヴァを立てて実行してみるのが 一番楽なような気がします。もちろんターゲットサーヴァの構成に近い物を 手元に持てばより楽ですが、Win32のサーヴァでも有ると無しとじゃずいぶん 違うのではないかしら。今ならWin32でもApache動きますからね。 # 一応手元には、Unix、Win95、Mac上の各種サーヴァ(笑)を取りそろえて居るので、 # 機種間互換性チェックなどには威力を発揮します。 >>#結局、やっかいなのは、たまに起こるServer Error。 ># ですよねぇ(-_-;) > 結局はサーヴァのエラーログを参照しなければならない事態というのは有りますね、やはり。 ボタン、ポン! でエラーログの最後を読めるようにしておくと便利ですね。(^^)
5月20日に、にあさんは書きました。 >やはり、CGIデバッグはlocalにhttpのサーヴァを立てて実行してみるのが >一番楽なような気がします。もちろんターゲットサーヴァの構成に近い物を >手元に持てばより楽ですが、Win32のサーヴァでも有ると無しとじゃずいぶん >違うのではないかしら。今ならWin32でもApache動きますからね。 > この辺は慣れや考え方の違いでしょうかね? 私の近所にもperlのdebuggerなんて使った事の無い人がいるし(^_^;) (彼はApacheユーザー) 私はperlのdebugger使ったほうが問題を直視できるから 簡単なように思えて・・・(頭の中で考えられない奴>私) # debug用のコードも、環境変数の設定さえ出来れば取り敢えずはOKなので # 一度作れば後は使い回しのようなもんだし # 動作確認までできれば、ちょっとしたミスを除いて # 概ね、一発で動くから なんかうれしい(*^.^*)
5月20日に、Shigeさんは書きました。 >5月20日に、にあは書きました。 > >>やはり、CGIデバッグはlocalにhttpのサーヴァを立てて実行してみるのが >>一番楽なような気がします。もちろんターゲットサーヴァの構成に近い物を > >私はperlのdebugger使ったほうが問題を直視できるから >簡単なように思えて・・・(頭の中で考えられない奴>私) > もちろん通常のプログラムとして見た時のデバッグはあらかた済ませた後、 CGIとしてデバッグをする時には、って言うことです。(^^) # サーヴァが生成するヘッダ類などをいちいち環境変数とか標準入力とかに # 設定してやるのが面倒なので。(^^;; あ、それとも、そう言うのも一渡り # セットしてから実行する環境を作っているのかしら? もっとも、あたしは滅多にデバッガって使わない(使えない)人なので...(^^;;; # デバッガが必要になるほど大きなプログラムを書いたことが無いともいふ。
5月23日に、にあさんは書きました。 >5月20日に、Shigeさんは書きました。 > >>私はperlのdebugger使ったほうが問題を直視できるから >>簡単なように思えて・・・(頭の中で考えられない奴>私) >> >もちろん通常のプログラムとして見た時のデバッグはあらかた済ませた後、 >CGIとしてデバッグをする時には、って言うことです。(^^) > ですよね(^_^;)(それでもdebuggerいらない人ってすごいと思う) ># サーヴァが生成するヘッダ類などをいちいち環境変数とか標準入力とかに ># 設定してやるのが面倒なので。(^^;; あ、それとも、そう言うのも一渡り ># セットしてから実行する環境を作っているのかしら? > 環境変数の設定もdebug codeとしてソースの中に入れています。 ただ,Postメソッドは面倒なのでGetでやっています。 その昔は(と言っても数ヶ月ですが)Parseする所まで飛ばして直接変数に設定 ・・・てな具合で評価してました。 >もっとも、あたしは滅多にデバッガって使わない(使えない)人なので...(^^;;; ># デバッガが必要になるほど大きなプログラムを書いたことが無いともいふ。 流石にHTTPに関わる所はオフラインでは出来ませんね(^_^;) 職場でNetworkモニターを使ってデバッグしてます。(仕事もしてます) TracePlus32ってのを最近Getしたんですが(まだ試用中) 使い方が良くないのか,ネスケとかはNGなのかパケットが見えませんでした。 もう少し使って見様とは思いますが・・・何か良いもの知ってますか? # でも,結局はServer Errorには悩まされる(ーー;
5月19日に、Shigeさんは書きました。 >> うーん。errors.txtいつのまにか数十行書き込まれてました。 >>が、どのHTMLからCGI呼び出しのかが分からない・・・。(^^; >>もうちょっと情報があると、便利なのになぁ。 自分で書いたスクリプトなのですが、www2bではちゃんと動いているのに、 www2sだとServer Errorが頻出します。必ずではなく、かなりの確率で出る という感じ。しかも、errors.txtには何も書かれていませんでした。 設定がまずいだけのことだけかもしれないのでなんとも言えませんけど、 全く同じ事をやっているのにうまく動くことがあるだけに、妙です。 >>ところで、STDERRをSTDOUTに回すようなスクリプトを通してCGIを走らせれば、 >>エラーメッセージってブラウザから読めますよね。あと、syntax error類は、 >>localにperlを用意して試した方が早いですよ〜。 >> > > はい localで動くようにdebug用codeを加えて確かめてからUpしてますので > Syntax Errorは滅多に・・・いや 偶にしか・・・ うーん 時々しか起こしません(^_^;) > (修正して、その場ですぐUpすると よくやるのがdebug modeのままUpするミス) local用のflagを手で書き換えるより、$ENV{'COMSPEC'}とか見る方が巧いかも。 確実な手ではないですが、自分でやる分には問題ないと思います。 #って、NTにはCOMSPECはあるのだろうか? 私の場合は、localで動作テストまですることはほとんどないですね。 パターンマッチングが期待通りに動くかどうか試すくらいで。 perl -cw foo.cgiとやると、syntax errorのチェックができます。
5月19日に、Hironobuさんは書きました。 >perl cgiの習作を兼ねた、拙作の掲示板にも、最近荒らしが来るように >なりました。 > # そ言えば、此処には荒らし来たこと無いなぁ、単発的な書き捨てはあったけど。 # まだ、一人前の掲示板とは言えないということだな。(笑) >webで調べたところ、 >HTTP_PROXY >HTTP_X_FORWARDED_FOR >HTTP_FORWARDED >あたりの環境変数をチェックすれば良さそうですね。 > どうなんでしょ? HTTP/1.1の規格に入っているのはViaのみですから、環境変数としては HTTP_VIA になりますが、proxyとしてよく使われているSquidが付けるヘッダが使われていると 言うことでしょうか。(HTTP_FORWARDEDはDeleGateも付けますね) # 残念ながらあたしはSquidは使ってないので内容は詳しくは知らないです。 >あと、HTTP_X_FORWARDED_FORというのがよくわからないです。何が入るんでしょうか。 > SquidのFAQによれば、元のクライアントのIPアドレスを保存した物のようですね。 ただし、FAQにも書かれている通り、HTTP_何たら と言うのはサーヴァに送られて来た リクエストヘッダを渡しているだけですから、幾らでもfakeが可能であることを仮定して 処理を考えなくてはいけないところがいまいちですね。 # まあ荒らし避けと言うことなら、ヘッダチェックは万全では無いと言うことを # 分かって使っている分にば構わないでしょうが。 >荒らしが使うってことは、誰でもつかえるproxyサーバってのがあるんですかね。 > 公開されているproxyサーヴァは多々あるようですね。 もちろんそれらの多くは広域cacheを行なうことでトラフィックの軽減を目的に 公開されているわけで、それを逆手にとってanonymizerとして使うというのは abuseに当たるのでしょうけど、悪いことに使う連中が後を絶たないため、 公開cacheサーヴァの方でも色々対策はしているようです。 例えばringer.etl.go.jpの広域DeleGateは、掲示板の匿名書き込みを 防ぐためにPOSTメソッドを通さない設定になっています。 # "305 Use Another Proxy"が返ります。
5月20日に、にあさんは書きました。 >>webで調べたところ、 >>HTTP_PROXY >>HTTP_X_FORWARDED_FOR >>HTTP_FORWARDED >>あたりの環境変数をチェックすれば良さそうですね。 >どうなんでしょ? HTTP/1.1の規格に入っているのはViaのみですから、環境変数としては >HTTP_VIA >になりますが、proxyとしてよく使われているSquidが付けるヘッダが使われていると >言うことでしょうか。(HTTP_FORWARDEDはDeleGateも付けますね) ># 残念ながらあたしはSquidは使ってないので内容は詳しくは知らないです。 たしかに、HTTP_PROXY,HTTP_X_FORWARDED_FOR,HTTP_FORWARDEDにはなにも値が入りませ んでした。 というわけで、さらに放浪してみたところ、HTTP_PROXY_CONNECTION,HTTP_CACHE_INFO, そして、HTTP_VIAを見るとよさそうですね。 HTTP1.1と書いてますが、サーバがHTTP1.1に対応していないとこれらの情報を受け取れ 無いということでしょうか。だとしたら、IIS3.0では無理ですねえ。 >ただし、FAQにも書かれている通り、HTTP_何たら と言うのはサーヴァに送られて来た >リクエストヘッダを渡しているだけですから、幾らでもfakeが可能であることを仮定して >処理を考えなくてはいけないところがいまいちですね。 らしいですね。不正なヘッダを送出できる、それ用のソフトも存在するようですね。 まあ、そこまでやるような人には最初からお手上げなのですが。 とりあえず、抑止効果が少しでも出ればなあ、って感じです。あ、逆に煽ったりして。 どうも、返答ありがとうございました。
5月20日に、Hironobuさんは書きました。 >HTTP1.1と書いてますが、サーバがHTTP1.1に対応していないとこれらの情報を受け取れ >無いということでしょうか。だとしたら、IIS3.0では無理ですねえ。 > 基本的には、サーヴァは自分の知らないリクエストヘッダを受け取ったら、 それを大文字にして HTTP_ を付けて環境変数にセットする、となっている 実装がほとんどでしょうから、サーヴァが知らない分には受けられると思います。 # サーヴァによっては、リクエストヘッダを選別する物もあるようですが。 チョットたちが悪いのは、サーヴァが知っているので処理するんだけど、 その処理が間違っている様なリクエストヘッダですね。 # 昔の Apache サーヴァでは Cookie に関するヘッダの処理が # おかしかったですね。 IIS3.0がチャンと渡してくれるかどうかは良く知らないですが... (^^;;
5月23日に、にあさんは書きました。 >基本的には、サーヴァは自分の知らないリクエストヘッダを受け取ったら、 >それを大文字にして HTTP_ を付けて環境変数にセットする、となっている >実装がほとんどでしょうから、サーヴァが知らない分には受けられると思います。 ># サーヴァによっては、リクエストヘッダを選別する物もあるようですが。 HTTP_VIAは空でした・・・。うむむ、IISはダメだなあ・・・。 もしかしたら、PerlIS.dllのせいかもしれませんね。次はISAPIをやめて普通の perl.exeでやってみます。 >IIS3.0がチャンと渡してくれるかどうかは良く知らないですが... (^^;; うむむ。ダメっぽいです。
5月23日に、Hironobuさんは書きました。 >HTTP_VIAは空でした・・・。うむむ、IISはダメだなあ・・・。 >もしかしたら、PerlIS.dllのせいかもしれませんね。次はISAPIをやめて普通の >perl.exeでやってみます。 HTTP_VIAですが、プロバイダからの書き込みでは入っていました。(Squid/1.1.20とありました) いわいる荒らしさんの使用しているproxyではHTTP_VIAは入りませんが、HTTP_USER_AGENTに via NetCache version 3.1.1d-Solaris via proxy gateway CERN-HTTPD/3.0 libwww/2.17 と入っていました。 ふむ。 というわけで、だからどうした?という感じですが、とりあえず、IIS3に濡れ衣を 着せたみたいなので、訂正させて頂きます。
なんか作ってみようと昨日始めたのですが、いきなりつまりました(笑) ソートについてです。 配列@DATAは複数のフィールドを持つとします。 例えばあるキーで3番目のフィールドをソートします。 ここまではいいのですが、この3番目のフィールドが同じ値を持ったときに 次のキーでソートしたいのです。 つまり複数のキーを用いたソート(優先順位はあります)です。 普通にやると個々のソートはうまくいくのですが、最初の結果に対して次のキーを かけても最初の結果が反映されないのです。何か良い方法はないでしょうか? これから本屋に行ってみます。 今まで参考にしている本はらくだ本だけです。 よろしくお願いします。
いしどう っす。 青本はお持ちですか? (^o^) 8月5日に、素人でGO!さんは書きました。 >ソートについてです。 >配列@DATAは複数のフィールドを持つとします。 >例えばあるキーで3番目のフィールドをソートします。 >ここまではいいのですが、この3番目のフィールドが同じ値を持ったときに >次のキーでソートしたいのです。 >つまり複数のキーを用いたソート(優先順位はあります)です。 > >普通にやると個々のソートはうまくいくのですが、最初の結果に対して次のキーを >かけても最初の結果が反映されないのです。何か良い方法はないでしょうか? 「複数のフィールドを持つ配列」というのがよくわからないんですが… # perlで多次元配列を使った事がないわたし (^^;; sort の比較関数をうまく作ってやればよさそうな気がします。
8月6日に、いしどうさんは書きました。 >青本はお持ちですか? (^o^) いえ、持ってないです(^^; >>ソートについてです。 >>配列@DATAは複数のフィールドを持つとします。 >>つまり複数のキーを用いたソート(優先順位はあります)です。 >「複数のフィールドを持つ配列」というのがよくわからないんですが… えーと、要するに多次元配列ってことでいいと思います。 >sort の比較関数をうまく作ってやればよさそうな気がします。 sort { $hoge{$a} <=> $hoge{$b} } みたいな感じでしょうか…一つのキーだとうまくいくんですけどね(;_;) 具体的な例を出します。 ある配列に ファーストフードの名前、セットの名前、価格、おいしさ、お姉ちゃんのかわいさ という内容が書かれているものがたくさんあるとします。 まずおいしいものを食べたいので、おいしさ順にソートします。 A〜Eの五段階だとします。 それでも同じものがある場合は価格が安い方がいいですよね。 というわけでさらに価格の安い順でソートします。 それでも同じならかわいい子がいる店の方がいいだろう(笑)ということで さらにソートします。 こんな感じで三段階(例えばですが)、ソートできるようにしたいわけですね。 で、第一段階のソートを @sorted とかに入れます。 それを第二段階のソートをかけると、第二段階のソート結果は出るのですが 第一段階の内容が反映されなくなっているのです。 それをどうにかしたいなぁと思ったのですが、意味は伝わりましたでしょうか?(^^; 二ヶ月ほど投稿がないので、誰も見ていないかもしれませんがどなたか教えて下さい。 よろしくお願いします。
8月6日に、素人でGO!さんは書きました。 >8月6日に、いしどうさんは書きました。 > >>青本はお持ちですか? (^o^) > > いえ、持ってないです(^^; > おや、それは残念。いしどうさんが「青本はお持ちですか」と聞いたのは 青本(Programming Perlの新版)のsort()の項には、その物ズバリの 例が載っているからのです(よね?) > まずおいしいものを食べたいので、おいしさ順にソートします。 > A〜Eの五段階だとします。 > それでも同じものがある場合は価格が安い方がいいですよね。 > というわけでさらに価格の安い順でソートします。 > それでも同じならかわいい子がいる店の方がいいだろう(笑)ということで > さらにソートします。 > この例で言えば、まず、 sub 良い店 { $おいしさ{$a} <=> $おいしさ{$b} or $安さ{$a} <=> $安さ{$b} or $かわいさ{$a} <=> $かわいさ{$b}; } と言う関数を作っておくと、おいしさの違いで決まりならそれが関数の値として使われ、 同じおいしさなら安さの違いが、同じ安さならかわいさの違いが、関数の値として 使われるので、 @sorted_shop = sort 良い店 @shop; とすれば、いきなりソート出来るわけです。 >二ヶ月ほど投稿がないので、誰も見ていないかもしれませんが > ぎくっ (^^;;
8月6日に、にあさんは書きました。 >青本(Programming Perlの新版)のsort()の項には、その物ズバリの >例が載っているからのです(よね?) 気になって立ち読み(汗)に行きました。 >sub 良い店 { > $おいしさ{$a} <=> $おいしさ{$b} > or > $安さ{$a} <=> $安さ{$b} > or > $かわいさ{$a} <=> $かわいさ{$b}; >} >@sorted_shop = sort 良い店 @shop; >とすれば、いきなりソート出来るわけです。 確かにそんなことが書いてありました。 そこで素人の質問になるわけですが…配列の中に名前を付けるにはどうすればいいのでしょうか? @店 の中に 5つ(見つけた日付、おいしさ、安さ、かわいさ、場所)項目があったとします。 そんな場合にこういうソートをするとき、どのように指定すればいいんでしょうか。 まだ始めたばかりなので基本ができてない!と叱られそうですが、よろしくお願いします。
8月6日に、素人でGO!さんは書きました。 >確かにそんなことが書いてありました。 >そこで素人の質問になるわけですが…配列の中に名前を付けるにはどうすればいいのでしょうか? > えーと、先の例はperl4でも使えるように、多次元配列は使わずに、個々の比較項目を 別個に連想記憶に入れてからソートするものでしたので、例えば、 #!/usr/local/bin/perl4 while (<DATA>) { chop; ($date, $tasty, $cheap, $cute, $key) = split(/,\s*/); push(@shop, $key); $date{$key} = $date; $tasty{$key} = $tasty; $cheap{$key} = $cheap; $cute{$key} = $cute; } @sorted = sort good @shop; foreach $key (@sorted) { printf("%s, (%s, %s, %s), %s\n", $date{$key}, $tasty{$key}, $cheap{$key}, $cute{$key}, $key); } exit(0); sub good { $tasty{$a} cmp $tasty{$b} || $cheap{$a} cmp $cheap{$b} || $cute{$a} cmp $cute{$b} || $a cmp $b; } __END__ 1998/04/23, D, B, E, 三茶のA 1998/05/10, B, C, A, 広尾のB 1998/05/11, C, A, B, 表参道のA 1998/06/26, B, A, C, 用賀のC 1998/07/05, D, B, A, 外苑前のA とかなっていると、出力は、 1998/06/26, (B, A, C), 用賀のC 1998/05/10, (B, C, A), 広尾のB 1998/05/11, (C, A, B), 表参道のA 1998/07/05, (D, B, A), 外苑前のA 1998/04/23, (D, B, E), 三茶のA とかになるわけです。 >@店 の中に 5つ(見つけた日付、おいしさ、安さ、かわいさ、場所)項目があったとします。 >そんな場合にこういうソートをするとき、どのように指定すればいいんでしょうか。 > perl5での多次元配列(まがい)を使ってデータを入れてるとすると、配列の添字で指定した方が やりやすいでしょうね。例えば、 #!/usr/local/bin/perl5 $tasty = 1; $cheap = 2; $cute = 3; while (<DATA>) { chop; push(@shop, [split(/,\s*/)]); } @sorted = sort good @shop; foreach $shop (@sorted) { printf("%s, (%s, %s, %s), %s\n", @$shop); } exit(0); sub good { a[$tasty] cmp b[$tasty] || a[$cheap] cmp b[$cheap] || a[$cute] cmp b[$cute] || $a cmp $b; } __END__ 1998/04/23, D, B, E, 三茶のA 1998/05/10, B, C, A, 広尾のB 1998/05/11, C, A, B, 表参道のA 1998/06/26, B, A, C, 用賀のC 1998/07/05, D, B, A, 外苑前のA でも同じ出力になりますね。 多次元配列では無くて、ハッシュの配列を使えば、 #!/usr/local/bin/perl5 while (<DATA>) { chop; ($date, $tasty, $cheap, $cute, $key) = split(/,\s*/); $shop = {date => $date, tasty => $tasty, cheap => $cheap, cute => $cute, key => $key}; push(@shop, $shop); } @sorted = sort good @shop; foreach $shop (@sorted) { printf("%s, (%s, %s, %s), %s\n", $shop->{date}, $shop->{tasty}, $shop->{cheap}, $shop->{cute}, $shop->{key}); } exit(0); sub good { $a->{tasty} cmp $b->{tasty} || $a->{cheap} cmp $b->{cheap} || $a->{cute} cmp $b->{cute} || $a->{key} cmp $b->{key}; } __END__ 1998/04/23, D, B, E, 三茶のA 1998/05/10, B, C, A, 広尾のB 1998/05/11, C, A, B, 表参道のA 1998/06/26, B, A, C, 用賀のC 1998/07/05, D, B, A, 外苑前のA な感じになりますか。もちろん出力は同じです。
丁寧な説明、本当にありがとうございます。 perl4しかわかりませんでしたが、精進します。 感動です〜(*^^*)
12月9日に、のりーさんは書きました。 >11月13日に、にあさんは書きました。 > >>>複数のgifのヘッダを取って、部分画像が複数ある一つのgifに再構成すれば >>>ヘッダ操作のみで(gifの圧縮/展開しなくても)軽いものができるような気がします。 >>> >>>絶対誰か作ってるにちがいない。 >>> > >>あ、npc.cgiなら、最初の画像だけ全桁出力して、あとはアニメーションする桁だけ >>出力する、と言うことが出来ますね。これだと、転送データ量が減ってうれしいかも。 >># 次の版でこのモードを導入してみよう。(^^) アイデアどうもです。>BEROさん > >はじめまして >私もアクセスカウンタCGIを作っているんですが、GIF形式で採用されている >LZW圧縮方式は確かUNISYSがパテントを持っているとかでライセンスを取 >らずに作られたソフトを配布する事は出来ない(たとえフリーソフトでも)と聞いた >ことがあるんですが、そのあたりはどのように処理されているんでしょうか。教え >て下さい♪ 古い話題でアレなんですが、GIFで特許が取られている部分はLZW圧縮だけで、 ヘッダ形式等は問題無いので、(ライセンスを取ったグラフィックツール等で作成された) 数字のGIF画像のヘッダを合成して新しいGIFにすれば、特許に触れるLZW部分が無くても カウンタが作れるのではないか? というのが当初の書き込みでした。
なおきです。 覚えてますか?1年ぶりくらいかなぁ。 久しぶりです。 ところで題名にも書きましたが パスワードを変更するプログラムを考えているのですが サーバーはLinuxサーバーです。 たとえば テキストファイルに userID Password naoki abcnao naoko cdenao というようなデータを作って パスワードを変更していくプログラムです。 たとえば # passwd naoki とやると会話型になってしまいますよね。 それを避ける方法みたいなのが知りたいんですが。 だれかわかる人いますかぁ? なおき
いしどう です。 8月20日に、なおきさんは書きました。 >ところで題名にも書きましたが >パスワードを変更するプログラムを考えているのですが [中略] ># passwd naoki >とやると会話型になってしまいますよね。 >それを避ける方法みたいなのが知りたいんですが。 >だれかわかる人いますかぁ? Linux だったら、passwd コマンドのソースを読めば パスワードの生成方法が分かるとおもうんですが… 勉強になりますよ (^^)
8月20日に、いしどうさんは書きました。 > >># passwd naoki >>とやると会話型になってしまいますよね。 >>それを避ける方法みたいなのが知りたいんですが。 >>だれかわかる人いますかぁ? > >Linux だったら、passwd コマンドのソースを読めば >パスワードの生成方法が分かるとおもうんですが… > >勉強になりますよ (^^) RESありがとうございます。 どこらへんにおいてあるんでしょうか? /usr/src/linux のあたりかなぁ。
8月20日に、いしどうさんは書きました。 >8月20日に、なおきさんは書きました。 > >>ところで題名にも書きましたが >>パスワードを変更するプログラムを考えているのですが > >Linux だったら、passwd コマンドのソースを読めば >パスワードの生成方法が分かるとおもうんですが… > Programming perl(旧版)の6章の"Real Perl Programs"の所にも passwd-Password Changing Programと言うのが有りますね。 これは直接パスワードファイルを書き換えるものです。 あと、既存のpasswdコマンドとの間でやり取りしてパスワードを書き換える プログラムの例として、poppassd-1.4.tar.gzがありますね。 Eudoraの「パスワード変更」などで使っているパスワード変更サーヴァです。 # どこから持ってきたか忘れてしまった。archieでもかけて下さい。>なおきさん
8月21日に、にあさんは書きました。 >8月20日に、いしどうさんは書きました。 > >>8月20日に、なおきさんは書きました。 >> >>>ところで題名にも書きましたが >>>パスワードを変更するプログラムを考えているのですが >> >>Linux だったら、passwd コマンドのソースを読めば >>パスワードの生成方法が分かるとおもうんですが… >> >Programming perl(旧版)の6章の"Real Perl Programs"の所にも >passwd-Password Changing Programと言うのが有りますね。 >これは直接パスワードファイルを書き換えるものです。 > >あと、既存のpasswdコマンドとの間でやり取りしてパスワードを書き換える >プログラムの例として、poppassd-1.4.tar.gzがありますね。 >Eudoraの「パスワード変更」などで使っているパスワード変更サーヴァです。 ># どこから持ってきたか忘れてしまった。archieでもかけて下さい。>なおきさん にあさんありがとう早速やってみてます。 サンキュウ!
皆さん、こんばんは。 早速質問なんですが、よくYahooやあちゃらNavi、Infoseek等でユーザーの ホームページで検索を使えるようにサーチエンジンのフォームソースを 公開してますよね。 しかし、複数のフォームをいくつもベタベタ貼り付けると邪魔くさいので、 一まとめにしたいんです。 具体的にはフォームの下にラジオボタンを設置して、そこに該当する サーチエンジンを全てリストにして、チェックされたサーチエンジンの 検索を使いたいと言う事です。 恐らくプログラム的には「○○がチェックされていたら○○の検索エンジン にキーワードを渡す」と言う感じになると思うんですが、プログラム経験が 全く無いのでわかりません。 どなたか、詳しく教えて頂けませんでしょうかm(_ _)m #コレって「作ってくれ」と言ってるのと同じですね(^^;
自己RESです。 >具体的にはフォームの下にラジオボタンを設置して、そこに該当する >サーチエンジンを全てリストにして、チェックされたサーチエンジンの >検索を使いたいと言う事です。 メッツと言うソフトメーカーのサイトで、まさに私がやりたい事をやっていました。 少し前にメールで質問したのですが、教えてもらえませんでした(T_T) 上記ページを見て、何となくわかった方は、是非ご教授お願いします。
10月6日に、ぱーまぁさんは書きました。 はじめまして ぱーまぁさん >皆さん、こんばんは。 > >早速質問なんですが、よくYahooやあちゃらNavi、Infoseek等でユーザーの >ホームページで検索を使えるようにサーチエンジンのフォームソースを >公開してますよね。 >しかし、複数のフォームをいくつもベタベタ貼り付けると邪魔くさいので、 >一まとめにしたいんです。 >具体的にはフォームの下にラジオボタンを設置して、そこに該当する >サーチエンジンを全てリストにして、チェックされたサーチエンジンの >検索を使いたいと言う事です。 >恐らくプログラム的には「○○がチェックされていたら○○の検索エンジン >にキーワードを渡す」と言う感じになると思うんですが、プログラム経験が >全く無いのでわかりません。 >どなたか、詳しく教えて頂けませんでしょうかm(_ _)m > >#コレって「作ってくれ」と言ってるのと同じですね(^^; 求めているものは大体分かりました。 しかし、一体 何から教えていいのやら さっぱり分かりません と言うことで まず、何でもいいから”ぱーまぁさんのプログラム経験”を 作ってみて下さい #因みに私は作ってあげません(^_^;) #だって 検索エンジンなんてそこら辺にゴロゴロしてるんだもの #見つけたお気に入りのやつにリンクを張ればそれで十分ではないのかな? #Webってそういうもんだと私は解しておりますが・・・
はじめまして。会社でNTをいじっているモノです。 (にあさんのnpc.cgiを使わせていただいてます) 今度、レスキューさんのperlスクリプトをNT+IISに移植しようと しているのですが、クッキーでつまづいています。 移植しようとしているのはレスキューさんのショッピングカートです。 とりあえずcgiは動くのですが、 クッキーが発行されないために、正しく動作しません。 (最初の画面で注文しても(個数1と入れても)、 次画面で「何も注文されていません」になってしまう) NT4.0+IIS3.0で、Perl5.003 ビルド306です。 過去の記事で、北澤@えぶあねっとさんが、れすきゅーさんの minibbsのクッキーに成功した、とありましたが、 どのように手を加えられたのでしょうか。 それとも、perlをビルド310以上にすれば cookie関連については手を加えなくても 動作するのでしょうか? よろしくお願いします。
10月19日に、emiさんは書きました。 >NT4.0+IIS3.0で、Perl5.003 ビルド306です。 >過去の記事で、北澤@えぶあねっとさんが、れすきゅーさんの >minibbsのクッキーに成功した、とありましたが、 >どのように手を加えられたのでしょうか。 呼ばれたようなので・・・ (^^; 本題ですが、すっかり忘却の彼方へ旅立ってしまいました ごめん。 ただ、クッキーの記述がいろいろ有るようで、にあさんのクッキーは 何の変更もなく使えるのですが、一部の方が提供されているスクリプトでは 使えない物もありました。 perlの勉強をすれば理解できるのかも知れない のですが、私には難解でした (^^; スクリプトを読めないのならば、別物を探した方が幸せになれます (^^)v で、我が家のサーバーはNTを捨てて UNIXに全面移行中です。 最初は敷居が高いと敬遠していたのですが、ちゃんと設定すれば素直に動く UNIXが気に入っています。 高い・分からない・融通が利かないNTくんとは これでお別れです。 ウェブサーバーだけでもUNIXには移行できないですか? NTが動かないスペックの機器でも十分に使えますよ。
10月23日に、北澤@えぶぁねっとさんは書きました。 >本題ですが、すっかり忘却の彼方へ旅立ってしまいました ごめん。 そうですか・・・。古い話題を持ち出してこちらこそすみませんでした。 >ただ、クッキーの記述がいろいろ有るようで、にあさんのクッキーは >何の変更もなく使えるのですが、一部の方が提供されているスクリプトでは >使えない物もありました。 perlの勉強をすれば理解できるのかも知れない >のですが、私には難解でした (^^; 同じくです。ラクダ本とか言うのを買ってはみたものの、 使いこなすに至っていません。 今のところにあさんやれすきゅーさんの提供してくださるものを 移植するのが精一杯です。 >ウェブサーバーだけでもUNIXには移行できないですか? >NTが動かないスペックの機器でも十分に使えますよ。 替えたいのはやまやまですが、会社のは所管が別なもので 簡単にはいかず。。。 自宅のだけでもLINUXなどにしてみたいと思っています。 こちらのようにインターネット上で無償で提供される サンプルやノウハウなどの情報量は明らかにUNIX系のほうが 質・量ともに豊富で、勉強もしやすいと思うし そのように訴えたりしてたんですが、 なぜか会社が購入するときはNTを買われてしまうんです。 何はともあれ、 コメントありがとうございました。
サーバー側でブラウザで入力したURLまたはIPを取得する方法があれば教えて下さい。 CGIかpearlで取得可能?
10月28日に、cobutaさんは書きました。 >サーバー側でブラウザで入力したURLまたはIPを取得する方法があれば教えて下さい。 >CGIかpearlで取得可能? #perlですね。(^^;; 何がやりたいのか、明確には分かりませんが、 とりあえず、サーバ側で実行されたCGIではブラウザから渡されたいろいろな情報を 環境変数という形で参照できます。 試しに私の所においてある環境変数表示用CGI(中身はいたって単純なperlのスクリプトです。(^^;;) を実行してみて下さい。 CGI側で参照できる環境変数の名前とその値が表示されます。 ブラウザによって、CGIに渡してくれる情報は異なるようですので、 参照できる環境変数も違ってくるということを覚えておいて下さい。 とはいっても、REMOTE_ADDR、HTTP_REFERER、HTTP_USER_AGENTなどよく利用されている ものはだいたいのブラウザは渡してくれるでしょう。 具体的な参照方法ですが、perlなんかだと以下の様に参照できます。 %ENV{'環境変数名'} ( 例:%ENV{'REMOTE_ADDR'} )
10月28日に、TADは書きました。 >具体的な参照方法ですが、perlなんかだと以下の様に参照できます。 > > %ENV{'環境変数名'} ( 例:%ENV{'REMOTE_ADDR'} ) 上記は '%'でなく、'$' でした。( 初歩的な間違いで、すみません。m(_ _)m ) 正しくは以下の通り。 $ENV{'環境変数名'} ( 例:$ENV{'REMOTE_ADDR'} )
こんにちは。 題名のとおりなんですが、Perlでフォームの内容をメール送信する CGIで、宛先と差出人を違うアドレスにしたとき、宛先がアドレス間違い などで届かなかった場合、そのままFromにはエラーが返って来ない ので、メールクライアントから送信した場合みたくエラーがFromに送信 されるようにしたいのです。 Webで調べてみましたがさっぱり見あたらなくて質問させていただき ました。 どなたかよろしくお願いいたしますm(_ _)m
11月4日に、でんでんさんは書きました。 >題名のとおりなんですが、Perlでフォームの内容をメール送信する >CGIで、宛先と差出人を違うアドレスにしたとき、宛先がアドレス間違い >などで届かなかった場合、そのままFromにはエラーが返って来ない >ので、メールクライアントから送信した場合みたくエラーがFromに送信 >されるようにしたいのです。 > メール配送においてヘッダに書かれた宛先とか差出人とかと情報はあまり 大きな意味を持ちません。配送時に重要なのは「エンベロープ」と呼ばれる MTA(メール配送を行なっているプログラム)に渡される実際の配送元/先の アドレスです。エラーが起こった時には、このエンベロープに書かれた 配送元アドレスに戻ってくるので、此処に正しいアドレスを設定しなくては なりません。 そのCGIの内容が分からないと詳細は分かりませんが、例えば sendmail を メールの送信に利用している場合、エンベロープの送信元アドレスは、 sendmail を起動したユーザになります。ですから、サーヴァが全て同じ wwwの様なユーザ権限で動いている場合、エラーメールがwww宛に戻って 来ることになります。 これだとチョット不便なので、sendmailに -f オプションを付ける事で エンベロープの差出人アドレスを変えることが出来ます。 つまり、 sendmail -fUSER として、起動すると、サーヴァ権限で動いている sendmail でも、エンベロープの 差出人を USER に出来ます。ただし、sendmail ヴァージョンが R5 などでは sendmail.cf で -f を利用できるユーザを設定しなくてはなりません。 現在普通に使われているような sendmail 8.7 以降のヴァージョンでは sendmail.cf に記載が無くとも -f が使えますが、その代わり、 X-Authentication-Warning: ヘッダでアドレスを差し替えていることが記載されます。 その他にも、昔は Errors-To: と言うヘッダがエラーが起きた時の戻りアドレスとして 使われていたことがありましたが、RFC822 と言うメール基本を定めている文書に 記載が無いため、現在は廃れつつあります。特に最近の sendmail.cf の設定では 省略時の設定が Errors-To: を解釈しないモードになっていることが多いので、 実質的に無意味になりつつあります。 # ちなみに、ヘッダ情報からエンベロープの宛先を決定するオプションは # sendmail -t です。 詳しくは、sendmail のマニュアルや CF 付属の文書などを参照すると良いでしょう。
レスありがとうございます。たいへんよく分かりました。 一応、Sendmailのmanは見てみて、-fあたりかなと思ってたの ですが、なにぶん英語ができないので詳しいことが分からない でいました。 分かりやすい説明ありがとうございました。 とりあえず試してみます。 m(_ _)m
おひさしぶりです。 アクセスログを取ることにしようと簡単なSSIを書いて、HTMLファイルに と書きこみ、UNIXのコマンドでCGIを呼び出そうとしたのですが、どうやらコ マンド使用が許可されていないらしくログが生成されません。CGI自体は直接 実行すればログを生成しますので動いているようです。HTMLからCGIを直接呼 び出すには他にどんな方法があるのでしょうか?
11月5日に、GGGさんは書きました。 > アクセスログを取ることにしようと簡単なSSIを書いて、HTMLファイルに > ><!-- #exec cgi="test.cgi" --> > >と書きこみ、UNIXのコマンドでCGIを呼び出そうとしたのですが、どうやらコ >マンド使用が許可されていないらしくログが生成されません。 > 書いた行はそのままですか? SSI構文は <!-- #exec の様に "--" と "#" の間にスペースを入れてしまうと 解釈されません。正しく <!--#exec と続けて書いて下さい。 # 続けて書いても解釈されないのなら、SSI が使えないのでしょうけど。
11月6日に、にあさんは書きました。 >> アクセスログを取ることにしようと簡単なSSIを書いて、HTMLファイルに >> >><!-- #exec cgi="test.cgi" --> >> >>と書きこみ、UNIXのコマンドでCGIを呼び出そうとしたのですが、どうやらコ >>マンド使用が許可されていないらしくログが生成されません。 >> >書いた行はそのままですか? > >SSI構文は <!-- #exec の様に "--" と "#" の間にスペースを入れてしまうと >解釈されません。正しく <!--#exec と続けて書いて下さい。 そうだったのですか。ありがとうございます。 あ、「HTMLを解釈しない」といっても、半角不等号は消えてしまうんですね… ># 続けて書いても解釈されないのなら、SSI が使えないのでしょうけど。 続けていろいろやってみたのですが、やはり呼び出されないようです。 SSIは許可されていないけれどもログが取りたい、という場合、どうすればよいのでしょ うか?参考になる書籍などでもよいのですが。 それから、うちのサーバーはにあさんのカウンタを置くことはできるのですが、これは 「SSI/CGIが使える」のとは関係しないのでしょうか?でもカウンタファイルはコンパイル してあるし…
お久しぶり〜、TAKuです。 Perlでちょっとしたプログラムを書いてるのですが、 パスワードの入力を促す際に、どうやっても入力がecho backされて 画面上に出てしまいます。Cで書いたプログラムでも呼べばOKなのでしょうが Perlのスクリプト単体でパスワードのプロンプトを作る事はできないでしょうか?
11月6日に、TAKuさんは書きました。 >Perlでちょっとしたプログラムを書いてるのですが、 >パスワードの入力を促す際に、どうやっても入力がecho backされて >画面上に出てしまいます。Cで書いたプログラムでも呼べばOKなのでしょうが >Perlのスクリプト単体でパスワードのプロンプトを作る事はできないでしょうか? > perl単体でデスか? うーんどうかな? そう言う機能は無い様な気がします。(^^; ではperlではパスワードの入力のようにエコーバックしない入力をする場合 どうするかと言うと、 system('stty', '-echo'); エコーバックしない処理... system('stty', 'echo'); の様に、sttyを呼び出して制御するのが一般的では無いかしら? あと、perl5 なら、ほぼ標準的に使われている Term::ReadKey と言うモデュールで 端末制御をすると、stty の様なプラットホーム依存な方法を使わなくて済みます。
11月6日に、にあさんは書きました。 >11月6日に、TAKuさんは書きました。 > >>Perlでちょっとしたプログラムを書いてるのですが、 >>パスワードの入力を促す際に、どうやっても入力がecho backされて >>画面上に出てしまいます。Cで書いたプログラムでも呼べばOKなのでしょうが >>Perlのスクリプト単体でパスワードのプロンプトを作る事はできないでしょうか? >> >perl単体でデスか? うーんどうかな? そう言う機能は無い様な気がします。(^^; > >ではperlではパスワードの入力のようにエコーバックしない入力をする場合 >どうするかと言うと、 > >system('stty', '-echo'); >エコーバックしない処理... >system('stty', 'echo'); > >の様に、sttyを呼び出して制御するのが一般的では無いかしら? > >あと、perl5 なら、ほぼ標準的に使われている Term::ReadKey と言うモデュールで >端末制御をすると、stty の様なプラットホーム依存な方法を使わなくて済みます。 sttyとTerm::ReadKeyですか。試してみます。 #Lynxでフォローアップを書くのは難しい・・・(^^;
発言者:三葉工房 タイトル:perl言語の最適の学習法 日時:98/11/19 13:54 こないだの,三葉工房です。今回は,もう1つのテスト構文も添えてサポート 依頼させていただきます。 私なりに,NIA様のおっしゃられた通り,一通りマニュアルを読みながら勉強 しています。しかしながら今日にいたり相変わらずperl習得と道は,足踏み のままです。1週間近く前に,名前の(JCODE無し)の表示が出来ましたが, それから先は,1人の場合だと相当苦労して出来るか出来ないかの気がしてな りません。いつまでも足踏みが続きとても悔しい気持ちです。 perl言語の勉強は,1人で勉強するのは,かなり厳しい感じがします。 学校でインストラクターと共に学ばなければマスターは難しい物なのでしょうか。 やはり,perl言語をマスターするのに孤独の環境は,かなりに困難な感じがします。 それでも私としては,どうしてもperlをマスターしたいです。一体どの様に学習すれば 確実にperl言語を覚えCGIプログラムに応用出来るのでしょうか。 そして,今回,訂正を加えても同じ結果のJCODEのソース文にもう1つ選択枝の応用して 未だ未成功のソース文の私の作成しました2種類のテストスクリプトも下記に記述いた します。出来れば,どうか改めてアドバイスよろしくお願いします。 後,パスワード等で使用するパスワード情報のファイルのpassword.txtは,どのように 記述作成するのでしょうか。それは,マニュアルには,書いてありませんでした。どうか お教え願います。 どうかよろしくお願い申し上げます。 スクリプト1 クライアントhtml=noer.html http://www.amy.hi-ho.ne.jp/nature-create/search/noer.html ================ <html><head><title>CGI Test</title></head><body bgcolor="pink"><form method="post" action="/cgi-bin/user/nature-create/noeroorhp.cgi"><font color="red" size=4>番号 登録者:<input type=text size=15 maxlength=90 name="nese"><p> <center> <input type=submit value="送信"> <input type=reset value="取り消し"> </center><p> </form></body></html> ***************************************************** cgiファイルnoeroorhp.cgi( NIA様のおっしゃられた通り構文の順序立てを私なり に行いましたが,相変わらずjcode.plの存在は無視され漢字文字が16進数コードで出てし まいます。) ================ #!/usr/local/bin/perl require './jcode.pl'; $|=1; read (STDIN,$in,$ENV{'CONTENT_LENGTH'}); ($parameter,$name)=split(/=/,$in); $value=($parameter,$name); &jcode'h2z_sjis(*value); &jcode'convert(*name,'sjis'); &jcode'convert(*value,'sjis'); print "Content-type: text/html\n"; print "\n"; print "<html>\n"; print "<head>\n"; print "<title>届きました</title>\n"; print "</head>\n"; print "<body bgcolor='#9acd32' text='#000000'>\n"; print "<font color='maroon' size='5'>こんにちは$nameさん</font>\n"; print "</body>\n"; print "</html>\n"; __END__ ******************** スクリプト2 クライアントhtml=test.html http://www.amy.hi-ho.ne.jp/nature-create/search/test.html ============================== <html><head><title>CGI Test</title></head><body bgcolor="pink"><form method="post" action="/cgi-bin/user/nature-create/noeroorhp.cgi"><font color="red" size=4>番号 登録者:<input type=text size=15 maxlength=90 name="nese"><p> <center> <input type=submit value="送信"> <input type=reset value="取り消し"> </center><p> </form></body></html> ****************************************************** cgiファイルtest.cgi(色々文章を変えてみたが結局最後までサーバーエラー500でした。) ================================================ #!/usr/local/bin/perl use lib './yourdir'; require './cgi-lib.pl'; $|=1; &ReadParse(*in_data); $nese=$in_data{'nese'}; print "Content-type: text/html\n"; print "\n"; print "<html>\n"; print "<head>\n"; if ($nese < 100){ print "<title>100以上!</title>\n"; print "</head>\n"; print "<body bgcolor="yellow">\n"; print "<font color="red"size=5>100以下!</font>\n"; } else { print "<head>\n"; print "<title>100以下!</title>\n"; print "</head>\n"; print "<body bgcolor="yellow">\n"; print "<font color="red"size=5>100以下!</font>\n"; } print "</body>\n"; print "</html>\n"; __END__ =========== 以上です。どうかよろしくお願いします。 関連URL:http://www.amy.hi-ho.ne.jp/nature-create/search/index.html この発言にコメントをつける場合は、下記に記入のうえ投稿してください。 (半角カタカナは使用しないで下さい) 発言者名 : E−Mailアドレス:(ここは省略可) タイトル : コメント : 関連URLアドレス:(ここは省略可)
11月23日に、三葉工房さんは書きました。 >perl言語の勉強は,1人で勉強するのは,かなり厳しい感じがします。 >学校でインストラクターと共に学ばなければマスターは難しい物なのでしょうか。 > うーん、今までに他の言語を知っている人がperlを憶えるのは、楽なんですが、 最初に憶える言語がperlだと、それなりに苦労するかも知れません。 やはり、初心者向けの本を見ながらでも、焦らず一歩づつやって行くしか無いんじゃ ないかしら。あたしはperlの入門書は読んだこと無いので、たしかではないのですが、 人の話では「初めてのperl (ISBN 4-900900-81-8)」が良い、と言うのは よく聞きますね。 >そして,今回,訂正を加えても同じ結果のJCODEのソース文にもう1つ選択枝の応用して >未だ未成功のソース文の私の作成しました2種類のテストスクリプトも下記に記述いた >します。出来れば,どうか改めてアドバイスよろしくお願いします。 > チョット見てみましたが、うーん、忌憚の無い所を言うと、残念ながら三葉工房さんは サーヴァ上でCGIスクリプトの試験をするには、まだ力不足だと思います。 WWWサーヴァは多数の人と共有するリソースですから、一人の簡単なミスでもその結果は 非常に多数の人に迷惑をかけます。まずは自分のパソコンなどの上で十分動作試験を行ない、 完璧だと自信が持てた所で、やっとサーヴァ上での実行が可能になります。 # それでも、サーヴァ固有の問題にあたってデバッグが必要になるものですが。 取りあえず、ご自分のパソコン上でperlの実行を行なう環境を整備することが 先決ではないでしょうか? 三葉工房さんのパソコンは何ですか? Windows マシンなら ActivePerl 辺りをインストールするのが良いかな? それとも、雑誌の付録にでも付いてるかしら? # パソコン雑誌と言うのも、ここ数年買ってないので良く分からないのですが... ## 役立たずだな。(^^;;;
いしどう@パソコン屋 (^^;; です。 11月25日に、にあさんは書きました。 >やはり、初心者向けの本を見ながらでも、焦らず一歩づつやって行くしか無いんじゃ >ないかしら。あたしはperlの入門書は読んだこと無いので、たしかではないのですが、 >人の話では「初めてのperl (ISBN 4-900900-81-8)」が良い、と言うのは >よく聞きますね。 そこらへんからはじめるのがいいと、わたしも思います。 あと、PerlとCGIの入門書っつーのも2・3冊出てますので、 大き目の本屋さんで探してみるといいと思いますよ>三葉工房さん >取りあえず、ご自分のパソコン上でperlの実行を行なう環境を整備することが >先決ではないでしょうか? 三葉工房さんのパソコンは何ですか? Windows >マシンなら ActivePerl 辺りをインストールするのが良いかな? 賛成です。とりあえず、手元に Perl で CGI を動かす環境を 構築してから、その上で本を読みながらいろいろ試してみる のが一番近道だと思います。 Windows用の Perl は、にあさんが紹介している ActiveState の Active Perl を入手すればいいですし、Web Server は、 AnHTTPd がフリーでWindows95/98/NT上で動くのでいいと 思います(説明も日本語だし) Macだと、どうなるんだろう…わかんない と、えらそーなことをいってるわたしとて、最初はインターネット 上のドキュメント(英語)を読みながら、わけもわからず CGI を書きちらかして(perlは知ってたけど)、動かなくって1ヶ月以上 無駄に過ごしてしまった経験がある(しかも仕事で (^^;;)ので、 ちゃんと本を読んで勉強する事を、強くお勧めいたします。
こんにちは、NKです。 >Macだと、どうなるんだろう…わかんない Macでは、MacPerlとMacHTTPの組み合わせで実現できます。 最近はこれでCGIのテストをしています。 では!
11月25日に、にあさんは書きました。 >11月23日に、三葉工房さんは書きました。 > >>perl言語の勉強は,1人で勉強するのは,かなり厳しい感じがします。 >>学校でインストラクターと共に学ばなければマスターは難しい物なのでしょうか。 >> >うーん、今までに他の言語を知っている人がperlを憶えるのは、楽なんですが、 >最初に憶える言語がperlだと、それなりに苦労するかも知れません。 > >やはり、初心者向けの本を見ながらでも、焦らず一歩づつやって行くしか無いんじゃ >ないかしら。あたしはperlの入門書は読んだこと無いので、たしかではないのですが、 >人の話では「初めてのperl (ISBN 4-900900-81-8)」が良い、と言うのは >よく聞きますね。 > 「初めてのperl (ISBN 4-900900-81-8)」でも プログラム経験が無い方には難しいようです。 とはいえ、この辺の本を参考にしながら経験を積むしかないように思えます。 身近な人で教えてくれる人を捕まえるとかなり楽になるのでは? Perlではありませんが、例えばCマガの後ろの方に初心者向けのコラムがあります。 #入門講座ではない 一見するとただの読み物のようにも見える その辺をCでなくPerlでやってみるのもいいかもしれませんね また、Perlでなくてもプログラミングと言うものを知りさえすれば なんでもいいように思えます。Perlならば
又,三葉工房です。 すみません,perlの習得はとても難しい物で。 質問する前にperlの習得は私はこう思います。 独学の場合 例えば10人がホームページを作成するとします。 もちろん,初歩的なhtmlページを作成し, すこし複雑なフォームまで作成します。 この段階までは,全員出来ます。 そして,高レベルのページを作成する為にcgiのページ を作成する為にperlの勉強をします。 cgiのページが満足に出来るのは,全員は難しく,マスター した人は,10人の中の3人位と言う気がします。 すみませんか,これは,あくまでも私の想像です。 やはり,にあ様のおっしゃられた通りperlの独学は,よほど の苦労が必要と思います。 1.C等のプログラムが出来る 2.推察力 3.面接形式でperlを伝授してくれる人やインストラクターが存在する がある事が私なりの多分perl習得の出来る条件なのでしょうか。 後,これは,とても痛い事なのですが私のマシーンはMACなので 使用できるperlコンパイラもMacPerlと限られます。そして, MachttpとMacPerlを関連利用して,自分のマシーン内にて, perlのテストをする(プラウザに反応させる事が出来ない。)事すら 出来ませんるだからテストは,確かに力不足なのですがネット上の サーバーで実行せざるを得ません。 そして,どうすれば,perlを習得できるのかを自分なりに考え,マニュアル本に 記述してある(今回は,ゲストブック)cgiスクリプトを丸写ししながら,変数や 関数の意味を1つ1つ調べ手書きで書き上げ,Kncov.pmをダウンロードしてcgi- binのサーバー上のフォルダーに入れてサーバーでテストをしてもあいかわらずサ ーバーエラー500のままです。また,そのソースー文を下に又記述させていただきます。 どうかサポート宜しくお願いします。どうしてもプロの方に頼らないとperlの習得 は究めて困難です。cgiが作動してperlの習得が成立すると私は思います。 perlの教則本が生かせないというのは,本当に悔しいと思います。 でもあきらめてはいけませんが,自分は,perlを習得するのに向いているのかを 考えなければならない気もします。 愚痴まで記述してすみません。これから何度もサポート依頼すると思いますが どうか宜しく御願いします。私は,本当にperlプログラミングのプロになって見たいです。 クライアント用html gestbook.html http://www.amy.hi-ho.ne.jp/nature-create/search/gestbook.html <html><head><title>Please input to the yourself.</title></head><body bgcolor="orange"> <form action="/cgi-bin/user/nature-create/gestbook.cgi" method="post"> <p><table bgcolor="#ffcc99" border=5><tr><th><font color="navy"size=4><b>Your name</b></font></th></tr></table><p><input name="name" size=45> <p><table bgcolor="#ffcc99" border=5><tr><th><font color="navy"size=4><b>Your mail adress</b></font></th></tr></table><p><input name="mail" size=45> <p><table bgcolor="#ffcc99" border=5><tr><th><font color="navy"size=4><b>Your comment</b></font></th></tr></table><p><textarea name="coment"rows=4 cols=60 wrap="hard"></textarea><p><center><input type="submit"value="Submit"><p><input type="reset"value="Reset"></center></form></body></html> gestbook.cgi #!/usr/local/bin/perl $|=1; use lib 'yourlib_dir'; require './cgi-lib.pl'; use './Kconv.pm'; $date=localtime(); $file="/nature-create/search/file/gestfile.html"; $url="/nature-create/search/gest/gestfile.html"; $entry_url="/nature-create/search/gestbook.html"; &ReadParse(*in); $coment=$in{'coment'}; $name=$in{'name'}; $mail=$in{'mail'}; if (not $name) { &CgiError("No writed to yourname!", "Please go back around inputpage!"); exit; } elsif (not $body) { &CgiError("No writed to sentence!", "Please go back around inputpage!"); exit; } $body=~ s/\r\n/<br>/g; $body=~ s/\r/<br>/g; $body=~ s/\n/<br>/g; &tosjis($body); &tosjis($name); open GUESTBOOK, ">>$file" or &Cgidie("This page can't Writtig!", "Please try to sumit in more time again!"); print GUESTBOOK <<"HERE"; <hr> <b>Dear $name</b><a href=\"mailto:$mail\"> $name</a> Writtng time:$date<p> $body HERE close GUESTBOOK; print <<"HEADER"; Content-type: text/html <html><head><title>Under stand writed the GUESTBOOK</title></head> <body bgcolor="yellow"> Thank you! writting to the GUESTBOOK! Your contents is ascertained in <a href=\"$url\">Entry input page</a>. Retarnnig to input page. <a href=\"$entry-url\">Input page</a> </body></html> HEADER exit 1; --END-- use kconv;
12月3日に、perl習得の才能が問われる三葉工房の管理者さんは書きました。 >例えば10人がホームページを作成するとします。 >もちろん,初歩的なhtmlページを作成し, >すこし複雑なフォームまで作成します。 >この段階までは,全員出来ます。 HTMLは少しくらい文法が間違っていても ブラウザがいいように解釈してくれてそれなりに表示してくれますから、 「HTMLなんて簡単さ」などと思ってしまいがちですが、(私もそうでした...(#^_^#)) ほんとに正しいHTMLが書けているかはあやしいものです。(私もまだまだですが...) >そして,高レベルのページを作成する為にcgiのページ >を作成する為にperlの勉強をします。 >cgiのページが満足に出来るのは,全員は難しく,マスター >した人は,10人の中の3人位と言う気がします。 perlは別にWEBページを作るためのものではないです。 あくまでもプログラミング言語です。 そこは正しく認識しておいた方がいいです。HTMLとは全く異質なものです。 プログラミング言語であるからには、 文法が間違っていたら絶対に動きませんし、(コンパイルなんかは通らない) プログラミングしたらその通りにしか動いてくれません。 (コンパイラが適当に補完したり、拡大解釈したりしたら、逆に怖い。) だから、プログラミング言語は正確に理解する必要があります。 >1.C等のプログラムが出来る 何らかのプログラミング経験(学習経験)はあった方がいいとは思いますが、 あとは 2.やる気 だけだと思います。 >どうかサポート宜しくお願いします。どうしてもプロの方に頼らないとperlの習得 三葉工房さんは、「サポート」を期待しているようですが、 誰もお金をもらっているわけではないですし、 暇を持て余しているわけでもありませんから、 何から何まで教えてもらえると思わない方がよいと思います。 プロによるサポートを期待するのでしたら、 しかるべきところでお金を払ってサポートしてもらって下さい。 先ずはどこかでプログラミングの勉強をした方がよいと思いますけど。
12月3日に、三葉工房さんは書きました。 >後,これは,とても痛い事なのですが私のマシーンはMACなので >使用できるperlコンパイラもMacPerlと限られます。 > Macの場合、当然MacPerlを使うことになるんですが、MacPerlと言うのは 一寸癖があって、「ふつーの」perlのテキストを読みながらだと、戸惑うことが あるかも知れませんね。 MacPerl自身やそれをCGIで使う場合に、UnixやWindowsのperlに対して、 どの辺が違っていて、どこに気を付けたらいいのか、と言うような事に付いては、 よしもとさんがまとめた「MacPerl Differences in CGI Programming」と言う 文書に詳しいですから、MacPerlを使う方は一度目を通してみるとよいと思います。 # まあ、この辺に書いてあることが、すらすらわかるのは、大分perlに慣れてから # だとは思いますが。 この文書に限らず、よしもと氏のMacPerl IslandはMacPerlに関するTipsが いっぱいですから、非常に参考になると思います。もちろん、自分のマシンで MacPerlのCGIスクリプトを動かす方法等も載っていますよ。 >そして,どうすれば,perlを習得できるのかを自分なりに考え,マニュアル本に >記述してある(今回は,ゲストブック)cgiスクリプトを丸写ししながら, > まず、perlによるCGIスクリプトはあくまでもperlのプログラムであることに 留意して下さい。perlによるプログラムが書けなければperlによるCGIは かけません。CGIは単なるプログラムに比べて考慮すべき点も多いですから、 一足飛びにCGIを作ることなく、まずは手元のperl環境でプログラムする事を 憶えて下さい。 まずはperlと言う言語自体を憶える事が先決ですね。自分の望む動作を 自在にperlで書けるようになったなら、実はCGIと言うのは全然難しい ものでは無い事にも気が付くでしょう。 それから、自分のMac上にサーヴァを立ててCGIの実験をする場合には、 福井県立大の田中先生のEasyBBSによる会議室「Web Scripter's Meeting」が 非常に参考になると思います。Mac上でNetworkサーヴァを立てている人が 集まっていますから、Mac固有の問題に付いても解決できるでしょう。
明けましておめでとうございます。 三葉工房です。 少しは,実行が出来るようになっています。 実は,条件指定がサブルーチンtoppage2に負けてしまって, スクリプト上部に近い方へ記述にされています条件指定文 if ($in{'inemit'} ge $pope) { ✓ &input; &toppage; } else {&toppage2;} が$popeに"登録"がプロンプトから代入(サブミットボタンを押すこと)されれば, 真となり,上記のif文が成立するはずですが,サブミットボタンを押して$pope に登録が代入されても何故か,偽になり,同じ&toppage2のhtml" ページタイトル(否定一体化掲示板(簡潔スクリプト))が繰り返しリロードされるだけで 他の3つのサブルーチン(✓&input;&toppage;)に実行権が渡りません。 そして,サブミットボタンも別スクリプトでテストした所,$in変数に変換可能な事が 確かめられています。 ところで,if文が99%成立してもいいのに関わらず,elseにされてしまうのは, 何故でしょうか。問題のスクリプトも下部にコピーいたします。どうかアドバイス宜しくお願いします。 (注)ちなみに,&toppageと&toppage2のhtmlページは,見た目は,同じですが,上記の if文の真と偽に関しての検証目的で,タイトル名とサブミット名を書き替えて,&toppage のコピーした&toppage2を同一スクリプト内に作成した訳で タイトルが &toppageは,一体化掲示板(簡潔スクリプト) &toppage2は,否定一体化掲示板(簡潔スクリプト) とやや異なるところと,サブミットボタン名が &toppageはsubmit &toppage2はinemitと違い 。その他は,全く同じです。 ================= 問題スクリプト=elpence.cgi http://www.amy.hi-ho.ne.jp/cgi-bin/user/nature-create/elpence.cgi ======================== #!/usr/local/bin/perl $|=1; require './cgi-lib.pl'; read (STDIN,$in,$ENV{'CONTENT_LENGTH'}); ($sec,$min,$hour,$day,$mon,$year,$wday)=localtime(time); $mon++; $seirei=($year+1900); $wareki=($year-88); $BaseDir = "$ENV{'HOME'}/html/search"; $NEWURL="http://www.amy.hi-ho.ne.jp/cgi-bin/user/nature-create/entlertg.cgi"; &ReadParse(*in); $coment=$in{'coment'}; $name=$in{'name'}; $mail=$in{'mail'}; $gurl=$in{'gurl'}; $hpagename=$in{'hpagename'}; $dre='grss.dat'; @week=("日","月","火","水","木","金","土"); $yobi=$week[$wday]; $date=sprintf ("%4d年(平成%2d年)%2d月%2d日 $yobi曜日%3d時%2d分%2d秒" ,$seirei,$wareki,$mon,$day,$hour,$min,$sec); &ReadParse(*in); $coment=$in{'coment'}; $name=$in{'name'}; $mail=$in{'mail'}; $gurl=$in{'gurl'}; $hpagename=$in{'hpagename'}; $maxcment="100"; $remaxcment="50"; $wordcnt=length($in{'coment'}); $wordbit=($wordcnt/2-1); $overtop=($wordbit-$maxcment); $overdown=($remaxcment-$wordbit); $pope="登録"; if ($in{'inemit'} ge $pope) { ✓ &input; &toppage; } else {&toppage2;} sub toppage{ open (SSTBOOK, "$BaseDir/$dre") || &CgiDie("This page can't Writtig!", "Please try to sumit in more time again!"); @Data=<SSTBOOK>; close SSTBOOK; print "Content-type: text/html\n\n"; print "<html>\n"; print "<head>\n"; print "<title>一体化掲示板(簡潔スクリプト)</title>\n"; print "</head>\n"; print "<body bgcolor=\"orange\">\n"; print "<p>\n"; print "<table bgcolor=\"black\" border=5>\n"; print "<tr>\n"; print "<th>\n"; print "<font color=\"orange\"size=5>\n"; print "<b>一体化掲示板</b>\n"; print "</font>\n"; print "</th>\n"; print "</tr>\n"; print "<tr>\n"; print "<td>\n"; print "<font color=\"yellow\"size=4>(注意!)此の試験実行掲示板のコメント文字数は,50文字以上100文字以内の範囲に制限されていますので,その範囲内の文字数で御記入願います。</font>\n"; print "</td>\n"; print "</tr>\n"; print "<tr>\n"; print "<th>\n"; print "<center>\n"; print "<a href=\"/nature-create/search/index.html\">\n"; print "<font color=\"yellow\"size=4>MISTUBA SEARCHPAGE</font>\n"; print "</a>\n"; print "</center>\n"; print "</th>\n"; print "</tr>\n"; print "</center>\n"; print "</table>\n"; print "<p>\n"; print "<form method=POST action=\"elpence.cgi\" >\n"; print "<p>\n"; print "<table bgcolor=\"#ffcc99\" border=5>\n"; print "<tr>\n"; print "<th>\n"; print "<font color=\"navy\"size=4>\n"; print "<b>登録者名</b>\n"; print "</font>\n"; print "</th>\n"; print "</tr>\n"; print "</table>\n"; print "<p>\n"; print "<input name=\"name\" size=45>\n"; print "<p>\n"; print "<table bgcolor=\"#ffcc99\" border=5>\n"; print "<tr>\n"; print "<th>\n"; print "<font color=\"navy\"size=4>\n"; print "<b>Eメールアドレス</b>\n"; print "</font>\n"; print "</th>\n"; print "</tr>\n"; print "</table>\n"; print "<p>\n"; print "<input name=\"mail\" size=45>\n"; print "<p>\n"; print "<table bgcolor=\"#ffcc99\" border=5>\n"; print "<tr>\n"; print "<th>\n"; print "<font color=\"navy\"size=4>\n"; print "<b>登録者のホームページ名</b>\n"; print "</font>\n"; print "</th>\n"; print "</tr>\n"; print "</table>\n"; print "<p>\n"; print "<input name=\"hpagename\" size=60>\n"; print "<p>\n"; print "<table bgcolor=\"#ffcc99\" border=5>\n"; print "<tr>\n"; print "<th>\n"; print "<font color=\"navy\"size=4>\n"; print "<b>ホームページのURL</b>\n"; print "</font>\n"; print "</th>\n"; print "</tr>\n"; print "</table>\n"; print "<p>\n"; print "<input name=\"gurl\" value=\"http://\" size=60>\n"; print "<p>\n"; print "<table bgcolor=\"#ffcc99\" border=5>\n"; print "<tr>\n"; print "<th>\n"; print "<font color=\"navy\"size=4>\n"; print "<b>コメント</b>\n"; print "</font>\n"; print "</th>\n"; print "</tr>\n"; print "</table>\n"; print "<p>\n"; print "<textarea name=\"coment\" rows=4 cols=60 wrap=\"hard\"></textarea>\n"; print "<p>\n"; print "<center>\n"; print "<input type=submit name=\"submit\" value=\"登録\">\n"; print "<p>\n"; print "<input type=reset value=\"リセット\">\n"; print "</center>\n"; print "</form>\n"; print "<hr size=5>\n"; print "<center>\n"; print "<font color=\"#330066\" size=5>\n"; print "<b>此れ迄の書き込み</b>\n"; print "</font>\n"; print "</center>\n"; print "<hr size=5>\n"; foreach $match(@Data){ @catchin=split(/&&/,$match); print "<a href=\"mailto:$catchin[0]\">\n"; print "<font color=\"#006600\" size=4>$catchin[1]</font>\n"; print "</a>\n"; print "<font color=\"#000066\" size=3>:$catchin[2]</font><br>\n"; print "<a href=\"$catchin[3]\" target=\"new\">\n"; print "<font color=\"#990066\" size=3>$catchin[4]</font>\n"; print "</a>\n"; print "<font color=\"#330000\" size=3>$catchin[5]</font>\n"; print "<hr size=5>\n"; } print "</body>\n"; print "</html>\n"; } sub toppage2{ open (SSTBOOK, "$BaseDir/$dre") || &CgiDie("This page can't Writtig!", "Please try to sumit in more time again!"); @Data=<SSTBOOK>; close SSTBOOK; print "Content-type: text/html\n\n"; print "<html>\n"; print "<head>\n"; print "<title>否定一体化掲示板(簡潔スクリプト)</title>\n"; print "</head>\n"; print "<body bgcolor=\"orange\">\n"; print "<p>\n"; print "<table bgcolor=\"black\" border=5>\n"; print "<tr>\n"; print "<th>\n"; print "<font color=\"orange\"size=5>\n"; print "<b>一体化掲示板</b>\n"; print "</font>\n"; print "</th>\n"; print "</tr>\n"; print "<tr>\n"; print "<td>\n"; print "<font color=\"yellow\"size=4>(注意!)此の試験実行掲示板のコメント文字数は,50文字以上100文字以内の範囲に制限されていますので,その範囲内の文字数で御記入願います。</font>\n"; print "</td>\n"; print "</tr>\n"; print "<tr>\n"; print "<th>\n"; print "<center>\n"; print "<a href=\"/nature-create/search/index.html\">\n"; print "<font color=\"yellow\"size=4>MISTUBA SEARCHPAGE</font>\n"; print "</a>\n"; print "</center>\n"; print "</th>\n"; print "</tr>\n"; print "</center>\n"; print "</table>\n"; print "<p>\n"; print "<form method=POST action=\"elpence.cgi\" >\n"; print "<p>\n"; print "<table bgcolor=\"#ffcc99\" border=5>\n"; print "<tr>\n"; print "<th>\n"; print "<font color=\"navy\"size=4>\n"; print "<b>登録者名</b>\n"; print "</font>\n"; print "</th>\n"; print "</tr>\n"; print "</table>\n"; print "<p>\n"; print "<input name=\"name\" size=45>\n"; print "<p>\n"; print "<table bgcolor=\"#ffcc99\" border=5>\n"; print "<tr>\n"; print "<th>\n"; print "<font color=\"navy\"size=4>\n"; print "<b>Eメールアドレス</b>\n"; print "</font>\n"; print "</th>\n"; print "</tr>\n"; print "</table>\n"; print "<p>\n"; print "<input name=\"mail\" size=45>\n"; print "<p>\n"; print "<table bgcolor=\"#ffcc99\" border=5>\n"; print "<tr>\n"; print "<th>\n"; print "<font color=\"navy\"size=4>\n"; print "<b>登録者のホームページ名</b>\n"; print "</font>\n"; print "</th>\n"; print "</tr>\n"; print "</table>\n"; print "<p>\n"; print "<input name=\"hpagename\" size=60>\n"; print "<p>\n"; print "<table bgcolor=\"#ffcc99\" border=5>\n"; print "<tr>\n"; print "<th>\n"; print "<font color=\"navy\"size=4>\n"; print "<b>ホームページのURL</b>\n"; print "</font>\n"; print "</th>\n"; print "</tr>\n"; print "</table>\n"; print "<p>\n"; print "<input name=\"gurl\" value=\"http://\" size=60>\n"; print "<p>\n"; print "<table bgcolor=\"#ffcc99\" border=5>\n"; print "<tr>\n"; print "<th>\n"; print "<font color=\"navy\"size=4>\n"; print "<b>コメント</b>\n"; print "</font>\n"; print "</th>\n"; print "</tr>\n"; print "</table>\n"; print "<p>\n"; print "<textarea name=\"coment\" rows=4 cols=60 wrap=\"hard\"></textarea>\n"; print "<p>\n"; print "<center>\n"; print "<input type=submit name=\"inemit\" value=\"登録\">\n"; print "<p>\n"; print "<input type=reset value=\"リセット\">\n"; print "</center>\n"; print "</form>\n"; print "<hr size=5>\n"; print "<center>\n"; print "<font color=\"#330066\" size=5>\n"; print "<b>此れ迄の書き込み</b>\n"; print "</font>\n"; print "</center>\n"; print "<hr size=5>\n"; foreach $match(@Data){ @catchin=split(/&&/,$match); print "<a href=\"mailto:$catchin[0]\">\n"; print "<font color=\"#006600\" size=4>$catchin[1]</font>\n"; print "</a>\n"; print "<font color=\"#000066\" size=3>:$catchin[2]</font><br>\n"; print "<a href=\"$catchin[3]\" target=\"new\">\n"; print "<font color=\"#990066\" size=3>$catchin[4]</font>\n"; print "</a>\n"; print "<font color=\"#330000\" size=3>$catchin[5]</font>\n"; print "<hr size=5>\n"; } print "</body>\n"; print "</html>\n"; } sub check{ if (! $name) { &CgiError("No writed to yourname!", "Please go back around inputpage!"); exit; } if($wordbit>130){print <<"MOROVER"; Content-type: text/html <html><head><title>かなりコメント数が$overtop個もオーバーしました!</title></head> <body bgcolor=\"\#cc0000\"> <font color=\"\#ffff66\" size=5><b>彼方の記入されたコメント数は $wordbit個で,当フォームは,コメント数が30も多い場合に時に当ページが出力されてしまいます。</b> </font><p> <font color=\"\#ccffcc\" size=5>そのコメント数は基準の50個に$overtop個ものかなりのオーバーです。 </font> </body></html> MOROVER exit;} if($wordbit>$maxcment){ print <<"OVER"; Content-type: text/html <html><head><title>コメント数が$overtop個越えています!</title></head> <body bgcolor=\"\#003399\"> <font color=\"\#ffff66\" size=5><b>彼方の記入されたコメント数は $wordbit個です。</b> </font><p> <font color=\"\#ccffcc\" size=5>そのコメント数は基準の100個より$overtop個オーバーしています。</font> </body></html> OVER } if($wordbit>1){if($wordbit<25){print <<"MORDOWN"; Content-type: text/html <html><head><title>かなりコメント数が$overdown個も足りません!</title></head> <body bgcolor=\"\#110000\"> <font color=\"\#ffff66\" size=5><b>彼方の記入されたコメント数は $wordbit個で,当フォームは,コメント数が25も少ない時に当ページが出力されてしまいます。</b> </font><p> <font color=\"\#ccffcc\" size=5>そのコメント数は基準の50個に$overdown個ものかなりの不足です。 </font> </body></html> MORDOWN exit;} if($wordbit<$remaxcment){print <<"DOWN"; Content-type: text/html <html><head><title>コメント数が$overdown個足りません!</title></head> <body bgcolor=\"\#660000\"> <font color=\"\#ffff66\" size=5><b>彼方の記入されたコメント数は $wordbit個です。</b> </font><p> <font color=\"\#ccffcc\" size=5>そのコメント数は基準の50個に$overdown個不足しています。 </font> </body></html> DOWN exit;}} elsif($wordbit==0){&CgiError("No writed to comment!", "Please go back around inputpage!"); exit;} $coment=~ s/\r\n/<br>/g; $coment=~ s/\r/<br>/g; $coment=~ s/\n/<br>/g; &namabbs; sub namabbs{ print <<"REPLAY"; Content-type: text/html <html><head><title>$in{'name'}さん:書き込みを御受け致しました。</title><meta http-equiv="refresh" content="5; url=$NEWURL "></head> <body bgcolor=\"\#cc66ff\"> <font color=\"\#660000\" size=5><b>$in{'name'}さん,彼方の記入なされたコメント数は,$wordbit個でコメント数規定に合致しました。</b></font><br><font color=\"\#ffff66\" size=5><b>それに伴い書き込みを御受け致しました。どうもありがとうございました。</b> </font><p> <font color=\"\#ccffcc\" size=5>御帰りのページは<a href=\"$NEWURL \">こちら</a>でございます。</font> </body></html> REPLAY exit 1;} exit;} sub input{ open (SSTBOOK, ">>$BaseDir/$dre") || &CgiDie("ファイルが開きません!", "何処かの構文が間違っています!"); print SSTBOOK "$mail&&$name&&$date&&$gurl&&$hpagename&&$coment\n"; close SSTBOOK; } __END__
1月11日に、三葉工房の管理者さんは書きました。 >少しは,実行が出来るようになっています。 プログラミングも慣れてきましたか? >実は,条件指定がサブルーチンtoppage2に負けてしまって, チョット詳細は見ていないんですけど、細かいところのデバッグで詰まってしまった時は 本当に「〜なはず」な所が期待通りに動いているのかきちんとチェックしてみることが大切です。 思いこみで動作を追っていくとなかなかバグは取れないものです。 例えばCGIなどの場合、スクリプトの最初の方で出力形式を text/plain にしてしまい、 出力をHTMLとして解釈させずにそのまま表示出来るようにしておいてから、変数の内容などを どんどん出力中に書き出していけば、スクリプトの特定場所での変数値などは簡単に確かめ られますから、どこで間違っていたのか? などもすぐに分かります。 つまり、問題のスクリプトならスクリプトを、 #!/usr/local/bin/perl $|=1; print "Content-Type: text/plain\r\n\r\n"; require './cgi-lib.pl'; . . の様に始めておけば、変数の内容を、 printf("***** inemit = '%s', pope = '%s'\n", $in{'inemit'}, $pope); if ($in{'inemit'} ge $pope) { ✓ . . などと書き出すだけでもブラウザに表示されます。 何だか分からなくなった時には、実際のスクリプトにこういう試験行を入れていくのが、 簡単に見えて一番効率的だったりします。(^^)
Kazです。 久々に投稿します。(^^ゞ 実はうちのホームページでは、うぇぶ会議室やゲストブックなどの 書き込みページが多いのですが、この各ページを一覧表にし、 その更新日付時刻を一覧表にして表示するページをCGIやSSIにして 作っています。 中身は、Perlで書いていますが、ファイルの日付・時刻を獲得するのに lsコマンドを使っています。 プロバイダは、FreeBSD+Apachなんですが、最近このようなUnixコマンド が、正しく実行されなくて、一覧表が全く役に立ちません。 プロバイダに問い合わせても「調査中」のまま。(^^;; 何かこういう現象をご存じないでしょうか? Perlだけでファイルの更新日付・時刻は取り出すことができるのなら とりあえずそれでもいいのですが・・・・ ちなみに、 http://ya.sakuraweb.com/%7Ekaz/test.cgi にて、lsの結果をHTML形式ではきだすCGIも作ってみましたが、lsの結果 をはきださず、lsコマンドでCGI自身も終わってしまっているようです。 「ソースを表示」にしても lsのあとにechoで出している /BODY /HTMLなどが 出てこないのです。(;_;) これは、lsコマンドだけではないようで、dateコマンドなども結果が出力されて こないようです。
1月12日に、Kazさんは書きました。 > 中身は、Perlで書いていますが、ファイルの日付・時刻を獲得するのに >lsコマンドを使っています。 > プロバイダは、FreeBSD+Apachなんですが、最近このようなUnixコマンド >が、正しく実行されなくて、一覧表が全く役に立ちません。 > > プロバイダに問い合わせても「調査中」のまま。(^^;; > 何かこういう現象をご存じないでしょうか? 本現象についての情報は持ってません。m(_ _)m プロバイダ側で何か設定を変えてたりしないですかねぇ。 何もしてないのに動作が変わるってのは考えにくいですよね。 > Perlだけでファイルの更新日付・時刻は取り出すことができるのなら >とりあえずそれでもいいのですが・・・・ できるだけ、機種依存のUNIXコマンドは使用せずにperlでやった方がいいんでしょうね。 ちゃんとperlにもstat関数というのがあって、引数としてファイルハンドルかファイル名を 渡してあげると以下のような配列を返してくれます。 stat FILEHANDLE stat EXPR Returns a 13-element array giving the status info for a file, either the file opened via FILEHANDLE, or named by EXPR. Returns a null list if the stat fails. Typically used as follows: ($dev,$ino,$mode,$nlink,$uid,$gid,$rdev,$size, $atime,$mtime,$ctime,$blksize,$blocks) = stat($filename); 今回必要なのは、10番目の$mtimeですが、以下のような手続きでファイルの更新日付を 得られますよ。 $mtime = (stat($filename))[9]; ($sec, $min, $hour, $mday, $mon, $year) = localtime($mtime); $mdate = sprintf("%02d%02d%02d", $year, $mon + 1, $mday); > http://ya.sakuraweb.com/%7Ekaz/test.cgi > >にて、lsの結果をHTML形式ではきだすCGIも作ってみましたが、lsの結果 >をはきださず、lsコマンドでCGI自身も終わってしまっているようです。 > 「ソースを表示」にしても lsのあとにechoで出している /BODY /HTMLなどが >出てこないのです。(;_;) > これは、lsコマンドだけではないようで、dateコマンドなども結果が出力されて >こないようです。 httpdのエラーログには、何か出てませんか?
TADさん、shigeさん、いしどうさん、どうもありがとうございました。 >本現象についての情報は持ってません。m(_ _)m > >プロバイダ側で何か設定を変えてたりしないですかねぇ。 >何もしてないのに動作が変わるってのは考えにくいですよね。 とりあえず、SSIのほうは、 update file1 file2 file3・・・ のように指定したファイルのうち一番最新のファイルの日付・時刻を printするっていう仕様で比較的簡単なのでこちらのほうをPerlだけで いけるようにしてみました。 会社のHPでは、ばっちし。(^o^; プロバイダに載せると、やっぱでません。(-"-;) #--exec cmd="update file1 file2 file3" だからだと思われます。 cgiのほうは、ひょっとしたら、Perlのみにすると動くかも知れません。 ただちょっと複雑なので・・・すぐできません。(^^;; また、できたら、ご報告します。 やっぱり、プロバイダ側の設定がまずいのでしょうね。 うぇぶ会議室とかは、ちゃんと動いているので・・・ >httpdのエラーログには、何か出てませんか? どこを見ればいいんでしょうか? 私でも見ることできますか?(^^;;
1月12日に、Kazさんは書きました。 > プロバイダに載せると、やっぱでません。(-"-;) > #--exec cmd="update file1 file2 file3" >だからだと思われます。 コマンドまでのパスが通っていないとか? > やっぱり、プロバイダ側の設定がまずいのでしょうね。 > うぇぶ会議室とかは、ちゃんと動いているので・・・ 違いは何でしょうね。 やっぱり、生のコマンドを使っているというところ? >>httpdのエラーログには、何か出てませんか? > > どこを見ればいいんでしょうか? > 私でも見ることできますか?(^^;; シェルアカウントありますよね。 ならばたぶん大丈夫だと思います。 psコマンドですべてのプロセス、できるだけ詳細な項目が表示されるように オプション指定して(Free-BSDのオプションはわかりませんm(_ _)m)、 httpdの実行ファイルを見つけてそのそばにあるだろうhttpdの設定ファイルを 突き止めれば、その中にログファイルの指定があります。 偉そうなことを言ってますが、実は昔、私もここで質問したことがあるので、 そちらの記事も参照してみて下さい。(^^;; ->Re: ちょっとおじゃまします
1月12日に、TADさんは書きました。 >> プロバイダに載せると、やっぱでません。(-"-;) >> #--exec cmd="update file1 file2 file3" >>だからだと思われます。 > >コマンドまでのパスが通っていないとか? パスは通っています。昨日まで動いてたし。 それに、こういうのも動かないんですよ。 #!/bin/sh echo Content-Type: text/html echo echo "" echo "" echo "date start" /bin/date echo "date end" echo "ls start" /bin/ls -l /bin/date echo "ls end" echo "" echo "" echo "" exit 0 /bin/dateで終わってしまってるんです。(;_;) プロセスが同時に複数発生するので問題があるんですかね? >シェルアカウントありますよね。 >ならばたぶん大丈夫だと思います。 > >psコマンドですべてのプロセス、できるだけ詳細な項目が表示されるように >オプション指定して(Free-BSDのオプションはわかりませんm(_ _)m)、 >httpdの実行ファイルを見つけてそのそばにあるだろうhttpdの設定ファイルを >突き止めれば、その中にログファイルの指定があります。 ちょっとうまく見つけられません。(^^;; psのオプション調べてみます。 ありがとうございました。
1月12日に、Kazさんは書きました。 >ちょっとうまく見つけられません。(^^;; 一般的に言って、エラーログを読めるようにするのは、CGIのデバッグに非常に有効ですが、 エラーの原因を探るのには、必ずしもエラーログを見なければいけないと言うことも無いです。 例えば、sh スクリプトの実行中にエラーになっているのなら、shのエラー出力を表示させる だけでもずいぶん色々な事が分かるはずです。 この辺のテクニックについてはYasu.Fさんの「CGIに関するTips」に詳しいですが、 Kazさんの場合なら、スクリプトを、 #!/bin/sh exec 2>&1 echo Content-Type: text/plain echo と始めるだけで、エラーの類もブラウザ画面に表示されますから、取りあえずは エラーログを探す必要はありません。
1月12日に、にあさんは書きました。 >例えば、sh スクリプトの実行中にエラーになっているのなら、shのエラー出力を表示させる >だけでもずいぶん色々な事が分かるはずです。 > >この辺のテクニックについてはYasu.Fさんの「CGIに関するTips」に詳しいですが、 >Kazさんの場合なら、スクリプトを、 > >#!/bin/sh > >exec 2>&1 > >echo Content-Type: text/plain >echo > >と始めるだけで、エラーの類もブラウザ画面に表示されますから、取りあえずは >エラーログを探す必要はありません。 なるほど。わかりました。 今日は復旧しています。 こんど、発生したらやってみます。 ただ、SSIのほうは、5つexecしているうち3つは、結果を表示していると 言う状況です。(^^;; やっぱ、負荷が高いというかプロセス数の問題なんでしょうかね?
Kazです。 > ただ、SSIのほうは、5つexecしているうち3つは、結果を表示していると >言う状況です。(^^;; > やっぱ、負荷が高いというかプロセス数の問題なんでしょうかね? SSI使うとキャッシュが利いてしまって、ファイルが更新されているけど 表示される日付が更新されない(つまり、SSIが動いていない)なんて ことになってしまうんですね。(:_;) キャッシュを無理矢理利かせないなんてできないですよね?(^_^;) やはり、CGIでやらないとダメですか? Shigeさんに教えてもらった readdir を使ったやつも作ってみたのですが、 実際うちのページで更新日付一覧を出しているのは、複数のファイルの うちの一番最新の日付・時刻を表示しているんです。 しかも・・・ ./bbs/*/*.dat のようなファイル構成のものも対象としていたので、 ls -lt で やらないとreaddirでは、むずかしそうです。 *など使わずに配列に全ファイル名を持っていればできるのか。 とりあえず、それでやるかなぁ。 なんか、いいアイデアあったら、教えてください。m(_ _)m
いしどう です。 1月14日に、Kazさんは書きました。 > *など使わずに配列に全ファイル名を持っていればできるのか。 > とりあえず、それでやるかなぁ。 > なんか、いいアイデアあったら、教えてください。m(_ _)m File::find(英語でごめんなさい) をお使いになられてはいかが でしょう。 UNIXの find(1) と同じような使い方が出来ます。 wanted() のなかであれこれしてやれば、配列に結果を返す事も 可能です。
1月15日に、いしどうさんは書きました。 >> なんか、いいアイデアあったら、教えてください。m(_ _)m > >File::find(英語でごめんなさい) をお使いになられてはいかが >でしょう。 例がわかりやすいので、英語でもなんとなくわかります。 手持ちのPerlの本には載ってない。(^_^;) >UNIXの find(1) と同じような使い方が出来ます。 >wanted() のなかであれこれしてやれば、配列に結果を返す事も >可能です。 findができれば、バッチリです。 これも試してみます。 SSIを1個のHTMLで乱発するのは、やめといた方がいいというのが、 今回わかりました。 会社のサーバでは、使いまくりでしたから。(^_^;)
1月12日に、Kazさんは書きました。 > Kazです。 > 久々に投稿します。(^^ゞ > > Perlだけでファイルの更新日付・時刻は取り出すことができるのなら >とりあえずそれでもいいのですが・・・・ > Perlのfunctionとしては stat が用意されています。 #んでも、似たような結果になりそうな気もしますが、、、 lsの代用としては readdir でファイル一覧を得て 個々に stat って事になりますかね #もっと便利な方法があれば私も知りたいp(^_^)q 詳細はPerlに付属されているマニュアルに書いてあります。 先を越されてしまった。。。
いしどう@会社 です。 1月12日に、Kazさんは書きました。 > Perlだけでファイルの更新日付・時刻は取り出すことができるのなら >とりあえずそれでもいいのですが・・・・ こちらをごらんください。 うう。おいらも先を越されてしまった。でも、Perlの日本語ドキュメン トへのポインタを出してるんで勘弁してね
にあ様 三葉工房です。 アドバイスありがとうございました。 もちろん,自分でも一生懸命問題のスクリプトを検証しています。 "Content-type: text/plain\r\n\r\n"; では,htmlが反映されませんでした。まだ,使いなれてないのでしょうね。 私に取りましては。ですが,"思い込みでデバックはいけない"まさにその通りです。 その結果,下の様にデバックに一応成功しました。 その結果,自分の知恵と,参考用にダウンロードした先輩のBBS スクリプトを照らし合わせて,ようやく,今回の書き込みと サブルーチンの振り分けが一応解決しました。 そして,今回2点の大切さに気付かされました。 1.f($ENV{'REQUEST_METHOD'} eq 'POST') {read (STDIN,$in,$ENV{'CONTENT_LENGTH'}); @pairs=split(/&/,$in); と言う環境変数の必要性。 環境変数があるとフォームからの内容を確実に反映しやすくなる そうです。それがなければ,サブミットのValue名の登録も認識出来 ず,input=submitのValue名も認識出来ずelseにされてしまった ようですし,後,驚いたのは,その環境変数により,コメント文字 数を正しくカウントする様になった事です。 2.思い込みのデバックを行わない。冷静にスクリプトを丁寧に調べ 上げて,素直な気持ちで行う事です。 実際に,これでデバックの解決が半日遅れました。それは,ifの 終わりのexitの使い分けで,print文がないのがeixtを使えなかった ようでifの終わりには,exitは必要なんだと思い込んでしまい, 書き込み出来る項目記述条件を満たした要求だけがエラーになって いました。そして,eixtを外して全条件実行成立となったのです。 まだ,そのBBSは完成された訳ではございません。 これからの学習予定は,記事数の制限,カウンタ,フォームツーメール ですね。 また,つまづく事があるかもしれませんが,その時は改めて宜しく お願いします。 後,よろしければ,参考ページのBBSに書き込みを行っても構いません。
こないだは,アドバイスどうもありがとうございました。 また,質問して済みません。 perlプログラミングは,始めはサーバーエラーの嵐で,むしゃくしゃしていた時期も 今は,htmlを書く様な感覚に徐々に近づきつつあります。 今日は,BBSの記事数を制限して掲示板から記事数制限で蹴られた古い書き込みを 同時に自動消去してしまう,unshiftやsplinceを利用しての実行テストが出来ました。 実は,私のperlプログラミングは,最終的には,バナー一体型のアクセスカウンタや 掲示板をダウンロードする事なく,ユーザー登録で,登録が成立すると,ユーザー番号 の書かれた(12575.html)と言う様なhtmlソース文が表示され,それを登録者がコピーして, 利用する,よく無料アクセスカウンタの提供サイトがよく行うスクリプトを公開する事なく 自分で管理しながらユーザにcgiをサービスを提供するという手段なのですが,私は, そのスクリプトを作成する事が目標です。 にあ様の紹介して下さったラクダ本も購入しましたが,もし,上級までのcgiスクリプト などが数多く記載されている上記の様な(私書箱と言う形なのだろうと思う。)と言う 上級スクリプトや多種のスクリプトが書ける様な本格的perlプログラマを目指すための cgiスクリプトを多種多様に記載したにあ様のお勧めの書籍やホームページがございましたら 紹介していただけないでしょうか。 後,ついでに,もしサーバーに関して詳しかったらお伺いしたいのですが,私の場合は, MACなのですが,サーバー構築を勉強するのは,独学でマスター出来るものなのでしょうか。 どうか質問攻めで大変申し訳ございませんが,アドバイス宜しくお願いします。
また,つまづいた点がありましたので,連続的に書き込んでよろしいでしょうか。 本当にすみません。 実は,今まで,cgi-libを利用して掲示板を開発していましたが,同一スクリプト内 においてのリンク設定に成功出来なかったので,cgi-libを外して,jcode.plに取り替えた ら,cgi-libのReadPaseと言うサブルーチンがフォームから発信されたフォームタグネーム を$in{' '}を支えていたおかげて,フォーム情報をcgiに渡していましたが,今度は, jcode.plに変更した以上,ReadPaseと言う後ろ楯が消えたので,自分で設定しなければ なりません。 そこで,ネット上からフォームを利用したスクリプトをダウンロードして,その構文を 参考にスクリプトを作成しましたが,トップページや従来の書き込みは,実行出来るものの サブミットをするとフォームからの情報を渡す事が出来なくなりサーバーエラーにされてしまいます。 色々と,ダウンロードして,既にサーバー上で実行が確認されているスクリプトと自分の スクリプトを照らし合わしてもおかしい箇所は見つかりません。 本来,以下の様に設定すれば,フォームからの情報を$in{' '}で当然渡せるはずでは ないでしょうか。 if($ENV{'REQUEST_METHOD'} eq 'GET') { @pairs=split(/&/,$ENV{'QUERY_STRING'});} elsif($ENV{'REQUEST_METHOD'} eq 'POST') {read (STDIN,$buffer,$ENV{'CONTENT_LENGTH'}); @pairs=split(/&/,$buffer); } else{&noname; } foreach $pair (@pairs) { ($name,$value)=split(/=/,$pair); $name=~tr/+/ /; $value=~tr/+/ /; $value=~s/ / /g; $name=~s/%([a-fA-F0-9][a-fA-F0-9])/pack("C",hex($1))/eg; $value=~s/%([a-fA-F0-9][a-fA-F0-9])/pack("C",hex($1))/eg; $value=~tr/+/ /; $value=~s/<!--(.|\n)*-->//g; $value=~s/<html(.|\n)*//ig; $value=~s/<script(.|\n)*//ig; $value=~s/<table(.|\n)*//ig; $value=~s/<form(.|\n)*//ig; $value=~s/<html(.|\n)*//ig; $value=~s/<xmp(.|\n)*//ig; $value=~s/\r\n/<br>//g; $value=~s/\r/<br>//g; $value=~s/\n/<br>//g; &jcode'convert(*value,'sjis'); &jcode'convert(*name,'sjis'); $in{$name}=$value; } とのスクリプトを見ても上記の様に記述しています。 ですから,私もその様に記述したのに関わらず,当然エラーは起こらないはずなのに もう奇蹟的にサブミットボタンを押すとフォームのinputタグと$in{$name}の関連が なおかつ結ばれていないらくサーバーエラーにされてしまいます。 どうして,上記の様な書き方でもエラーにされてしまうのでしょうか。 上記の様に記述してサブミットすればサーバーエラーなんか起こるはずはないのですが。 つまり,可笑しい箇所がないのにサーバーエラーなのです。 次に,ついでに質問したいのですが,同一スクリプト内においてリンクをする場合, (例えば,トップページから変更.訂正のページへ行くと言う感じ)で,私は,ある方の スクリプトを参照に if($in{'action'} eq $repage){&rever;} urlの書き方=golygth.cgi?action=repage (&reverには,そのリンクしたページのhtml文が記述されています。) と言う形の書き方をしたのですが,cgi-libでもリンクしたページは,サーバーエラーでした。 もし,同一スクリプト内においてリンクしたい場合は,どのように書けば,よろしいのでしょうか。 もちろん,問題のスクリプトを下部にコピーして,リンク先には,そのスクリプトのパスを書き込んでリンク出来る 様にします。 お忙しい所,いろいろと質問攻めで済みません。独学で,perlに詳しい人がいないもので。 perlには,真剣な熱意に自信がございます。どうか,アドバイス宜しくお願い申し上げます。 問題スクリプト=golygth.cgi ============= #!/usr/local/bin/perl $|=1; require './jcode.pl'; ($sec,$min,$hour,$day,$mon,$year,$wday)=localtime(time); $mon++; $seirei=($year+1900); $wareki=($year-88); $BaseDir = "$ENV{'HOME'}/html/search"; $NEWURL="http://www.amy.hi-ho.ne.jp/cgi-bin/user/nature-create/golygth.cgi"; $coment=$in{'coment'}; $yourname=$in{'yourname'}; $mail=$in{'mail'}; $gurl=$in{'gurl'}; $hpagename=$in{'hpagename'}; $newmg="newmg.dat"; @week=("日","月","火","水","木","金","土"); $yobi=$week[$wday]; if($man<10){$mon="0$mon";} if($day<10){$day="0$day";} if($hour<10){$hour="0$hour";} if($min<10){$min="0$min";} if($sec<10){$min="0$sec";} $date="$seirei年(平成$wareki年)$mon月$day日 $yobi曜日$hour時$min分$sec秒"; #最高コメント数制限 $maxcment="105"; #最低コメント数制限 $remaxcment="52"; #過剰コメント不足の最大数値 $mostsmall="28"; #過剰コメント超過の最小数値 $mostbig="128"; #過剰コメント不足の差不足設定エラー数値下限 $ersnall=($remaxcment-20); #過剰コメント超過の差不足設定エラー数値上限 $erbig=($maxcment+20); $dbsmall=($remaxcment-$ersnall); $dbbig=($erbig-$maxcment); if($mostsmall>$ersnall){print <<"MOTER"; Content-type: text/html <html><head><title>過剰コメント不足エラー</title></head> <body bgcolor=\"#ccffff\"> <center><font color=\"#550000\" size=6><b>過剰コメント不足エラー</b></font></center><p><font color=\"#000055\" size=5><b>過剰コメント不足の最低基準値$remaxcmentとの差が$dbsmall以内です。</b></font><p><center><font color=\"#663300\" size=5><b>適切な数値に書き直して下さい!</b></font></center></body></html> MOTER exit; } if($mostbig<$erbig){print <<"REMOTER"; Content-type: text/html <html><head><title>過剰コメント超過エラー</title></head> <body bgcolor=\"#ffff99\"> <center><font color=\"#550000\" size=6><b>過剰コメント超過エラー</b></font></center><p><font color=\"#000055\" size=5><b>過剰コメント超過の最大基準値$maxcmentとの差が$dbbig以内です。</b></font><p><center><font color=\"#663300\" size=5><b>適切な数値に書き直して下さい!</b></font></center></body></html> REMOTER exit; } $smallloss=$remaxcment-$mostsmall; $bigloss=$mostbig-$maxcment; $wordcnt=length($in{'coment'}); $wordbit=($wordcnt/2); $overtop=($wordbit-$maxcment); $overdown=($remaxcment-$wordbit); $pope="登録"; #1を選択で新規記事は,リスト最上段,それ以外は,リスト最下段 $enty="1"; #一度に掲載する記事数 $maxmsg="4"; $repage="repage"; if($ENV{'REQUEST_METHOD'} eq 'GET') { @pairs=split(/&/,$ENV{'QUERY_STRING'});} elsif($ENV{'REQUEST_METHOD'} eq 'POST') {read (STDIN,$buffer,$ENV{'CONTENT_LENGTH'}); @pairs=split(/&/,$buffer); } else{&noname; } foreach $pair (@pairs) { ($name,$value)=split(/=/,$pair); $name=~tr/+/ /; $value=~tr/+/ /; $value=~s/ / /g; $name=~s/%([a-fA-F0-9][a-fA-F0-9])/pack("C",hex($1))/eg; $value=~s/%([a-fA-F0-9][a-fA-F0-9])/pack("C",hex($1))/eg; $value=~tr/+/ /; $value=~s/<!--(.|\n)*-->//g; $value=~s/<html(.|\n)*//ig; $value=~s/<script(.|\n)*//ig; $value=~s/<table(.|\n)*//ig; $value=~s/<form(.|\n)*//ig; $value=~s/<html(.|\n)*//ig; $value=~s/<xmp(.|\n)*//ig; $value=~s/\r\n/<br>//g; $value=~s/\r/<br>//g; $value=~s/\n/<br>//g; &jcode'convert(*value,'sjis'); &jcode'convert(*name,'sjis'); $in{$name}=$value; } if ($in{'submit'} eq $pope) { ✓ &toppage; } else {&toppage;} if($in{'action'} eq $repage){&rever;} sub toppage{ open (SSTBOOK, "$BaseDir/$newmg") ||die "ファイルが開きません!\n, 何処かの構文が間違っています!"; @Data=<SSTBOOK>; close SSTBOOK; $cnturl=@Data; print "Content-type: text/html\n\n"; print "<html>\n"; print "<head>\n"; print "<title>進性能掲示板(V-up.スクリプト)</title>\n"; print "</head>\n"; print "<body bgcolor=\"orange\">\n"; print "<p>\n"; print "<table bgcolor=\"black\" border=5>\n"; print "<tr>\n"; print "<th>\n"; print "<font color=\"orange\"size=5>\n"; print "<b>進性能掲示板(V-up.スクリプト)</b>\n"; print "</font>\n"; print "</th>\n"; print "</tr>\n"; print "<tr>\n"; print "<td>\n"; print "<font color=\"yellow\"size=4>(注意!)此の試験実行掲示板のコメント文字数は,$remaxcment文字以上$maxcment文字以内の範囲に制限されていますので,その範囲内の文字数で御記入願います。<br> 現在時刻:$date</font>\n"; print "</td>\n"; print "</tr>\n"; print "<tr>\n"; print "<th>\n"; print "<center>\n"; print "<a href=\"/nature-create/search/index.html\">\n"; print "<font color=\"yellow\"size=4>MISTUBA SEARCHPAGE</font>\n"; print "</a>\n"; print "</center>\n"; print "</th>\n"; print "</tr>\n"; print "<tr>\n"; print "<th>\n"; print "<center>\n"; print "<a href=\"/cgi-bin/user/nature-create/golygth.cgi?action=repage\">\n"; print "<font color=\"yellow\"size=4>変更.削除</font>\n"; print "</a>\n"; print "</center>\n"; print "</th>\n"; print "</tr>\n"; print "</table>\n"; print "</center>\n"; print "<p>\n"; print "<form method=POST action=\"golygth.cgi\" >\n"; print "<p>\n"; print "<table bgcolor=\"#ffcc99\" border=5>\n"; print "<tr>\n"; print "<th>\n"; print "<font color=\"navy\"size=4>\n"; print "<b>登録者名</b>\n"; print "</font>\n"; print "</th>\n"; print "</tr>\n"; print "</table>\n"; print "<p>\n"; print "<input name=\"yourname\" size=45>\n"; print "<p>\n"; print "<table bgcolor=\"#ffcc99\" border=5>\n"; print "<tr>\n"; print "<th>\n"; print "<font color=\"navy\"size=4>\n"; print "<b>Eメールアドレス</b>\n"; print "</font>\n"; print "</th>\n"; print "</tr>\n"; print "</table>\n"; print "<p>\n"; print "<input name=\"mail\" size=45>\n"; print "<p>\n"; print "<table bgcolor=\"#ffcc99\" border=5>\n"; print "<tr>\n"; print "<th>\n"; print "<font color=\"navy\"size=4>\n"; print "<b>登録者のホームページ名</b>\n"; print "</font>\n"; print "</th>\n"; print "</tr>\n"; print "</table>\n"; print "<p>\n"; print "<input name=\"hpagename\" size=60>\n"; print "<p>\n"; print "<table bgcolor=\"#ffcc99\" border=5>\n"; print "<tr>\n"; print "<th>\n"; print "<font color=\"navy\"size=4>\n"; print "<b>ホームページのURL</b>\n"; print "</font>\n"; print "</th>\n"; print "</tr>\n"; print "</table>\n"; print "<p>\n"; print "<input name=\"gurl\" value=\"http://\" value=size=60>\n"; print "<p>\n"; print "<table bgcolor=\"#ffcc99\" border=5>\n"; print "<tr>\n"; print "<th>\n"; print "<font color=\"navy\"size=4>\n"; print "<b>コメント</b>\n"; print "</font>\n"; print "</th>\n"; print "</tr>\n"; print "</table>\n"; print "<p>\n"; print "<textarea name=\"coment\" rows=4 cols=60 wrap=\"soft\"></textarea>\n"; print "<p>\n"; print "<center>\n"; print "<input type=submit name=\"submit\" value=\"登録\">\n"; print "<p>\n"; print "<input type=reset value=\"リセット\">\n"; print "</center>\n"; print "</form>\n"; print "<hr size=5>\n"; print "<center>\n"; print "<font color=\"#330066\" size=5>\n"; print "<b>此れ迄の書き込み:$cnturl件が登録されています。</b>\n"; print "</font>\n"; print "</center>\n"; print "<hr size=5>\n"; if($enty eq "0"){@Data=reverse(@Data);} foreach $match(@Data){ @catchin=split(/&&/,$match); print "<a href=\"mailto:$catchin[0]\">\n"; print "<font color=\"#006600\" size=4>$catchin[1]</font>\n"; print "</a>\n"; print "<font color=\"#000066\" size=3>:$catchin[2]</font>\n"; print "<br>\n"; print "<a href=\"$catchin[3]\" target=\"new\">\n"; print "<font color=\"#990066\" size=3>$catchin[4]</font>\n"; print "</a>\n"; print "<br>\n"; print "<font color=\"#330000\" size=3>$catchin[5]</font>"; print "<hr size=5>\n"; } print "</body>\n"; print "</html>\n"; } sub rever{ print <<"MARCAR"; Content-type: text/html <html><head><title>変更.削除ROOM</title></head> <body bgcolor=\"#00ff00\"> <center><font color=\"#550000\" size=6><b>変更.削除ROOM</b></font></center><p> <font color=\"#000055\" size=5><b>今は,テスト中です。暫くお待ち願います!</b></font><p><center><a href=\"golygth.cgi\"><font color=\"#663300\" size=5><b>掲示板へ戻る</b></font></a></center></body></html> MARCAR exit;} sub check{ if ($in{'yourname'} eq "") {&noname;} sub noname{print <<"NONAME"; Content-type: text/html <html><head><title>名前が記入されていません!</title></head> <body bgcolor=\"#ffffcc\"> <center><font color=\"#550000\" size=6><b>名前が記入されていません!</b></font></center><p><font color=\"#000055\" size=5><b>名前をフォームに記入為無ければ登録出来ません。</b></font><p><center><a href=\"golygth.cgi\"><font color=\"#663300\" size=5><b>掲示板へ戻る</b></font></a></center></body></html> NONAME exit; } if($wordbit>$mostbig){print <<"MOROVER"; Content-type: text/html <html><head><title>かなりコメント数が$overtop個もオーバーしました!</title></head> <body bgcolor=\"\#cc0000\"> <font color=\"\#ffff66\" size=5><b>彼方の記入されたコメント数は $wordbit個で,当フォームは,基準値の$remaxcment~$maxcment個よりコメント数が$bigloss個以上も多い場合に時に当ページが出力されてしまいます。</b> </font><p> <font color=\"\#ccffcc\" size=5>そのコメント数は基準の$remaxcment~$maxcment個に$overtop個ものかなりのオーバーです。 </font> </body></html> MOROVER exit;} if($wordbit>$maxcment){ print <<"OVER"; Content-type: text/html <html><head><title>コメント数が$overtop個越えています!</title></head> <body bgcolor=\"\#003399\"> <font color=\"\#ffff66\" size=5><b>彼方の記入されたコメント数は $wordbit個です。</b> </font><p> <font color=\"\#ccffcc\" size=5>そのコメント数は基準の$remaxcment~$maxcment個より$overtop個オーバーしています。</font> </body></html> OVER exit;} if($wordbit>0){if($wordbit<$mostsmall){print <<"MORDOWN"; Content-type: text/html <html><head><title>かなりコメント数が$overdown個も足りません!</title></head> <body bgcolor=\"\#110000\"> <font color=\"\#ffff66\" size=5><b>彼方の記入されたコメント数は $wordbit個で,当フォームは,基準値の$remaxcment~$maxcment個よりコメント数が$smallloss個以上も少ない時に当ページが出力されてしまいます。</b> </font><p> <font color=\"\#ccffcc\" size=5>そのコメント数は基準の$remaxcment~$maxcment個に$overdown個ものかなりの不足です。 </font> </body></html> MORDOWN exit;} if($wordbit<$remaxcment){print <<"DOWN"; Content-type: text/html <html><head><title>コメント数が$overdown個足りません!</title></head> <body bgcolor=\"\#660000\"> <font color=\"\#ffff66\" size=5><b>彼方の記入されたコメント数は $wordbit個です。</b> </font><p> <font color=\"\#ccffcc\" size=5>そのコメント数は基準の$remaxcment~$maxcment個に$overdown個不足しています。 </font> </body></html> DOWN exit;} } elsif ($in{'coment'} eq ""){print <<"NOCMT"; Content-type: text/html <html><head><title>コメントが記入されていません!</title></head> <body bgcolor=\"#ffffcc\"> <center><font color=\"#550000\" size=6><b>コメントが記入されていません!</b></font></center><p><font color=\"#000055\" size=5><b>コメントをフォームに記入為無ければ登録出来ません。</b></font><p><center><a href=\"golygth.cgi\"><font color=\"#663300\" size=5><b>掲示板へ戻る</b></font></a></center></body></html> NOCMT exit;} $coment=~ s/\r\n/<br>/g; $coment=~ s/\r/<br>/g; $coment=~ s/\n/<br>/g; &resit; sub resit{ if(-e "$BaseDir/$newmg"){ open (SSTBOOK, ">>$BaseDir/$newmg") || die "ファイルが開きません!\n, 何処かの構文が間違っています!"; print SSTBOOK "$mail&&$yourname&&$date&&$gurl&&$hpagename&&$coment\n"; close SSTBOOK;} #掲載メッセージの処理 if(-e "$BaseDir/$newmg"){open (NEW, "$BaseDir/$newmg") || die "ファイルが開きません!\n, 何処かの構文が間違っています!"; @lines=<NEW>; close NEW;} unshift(@lines,"$mail&&$yourname&&$date&&$gurl&&$hpagename&&$coment\n"); splice(@lines,$maxmsg); open (NEW, ">$BaseDir/$newmg") || die "ファイルが開きません!\n, 何処かの構文が間違っています!"; flock(NEW,6); foreach(@lines){ print NEW;} close NEW; print <<"REPLAY"; Content-type: text/html <html><head><title>$in{'yourname'}さん:書き込みを御受け致しました。</title><meta http-equiv="refresh" content="5; url=$NEWURL "></head> <body bgcolor=\"\#cc66ff\"> <font color=\"\#660000\" size=5><b>$in{'yourname'}さん,彼方の記入なされたコメント数は,$wordbit個でコメント数規定に合致しました。</b></font><br><font color=\"\#ffff66\" size=5><b>それに伴い書き込みを御受け致しました。どうもありがとうございました。</b> </font><p> <font color=\"\#ccffcc\" size=5>御帰りのページは<a href=\"$NEWURL \">こちら</a>でございます。</font> </body></html> REPLAY exit;} } __END__
いしどう です。三葉工房の管理者さん、こんばんわ。 1月18日に、三葉工房の管理者さんは書きました。 >実は,今まで,cgi-libを利用して掲示板を開発していましたが,同一スクリプト内 >においてのリンク設定に成功出来なかったので,cgi-libを外して,jcode.plに取り替えた >ら,cgi-libのReadPaseと言うサブルーチンがフォームから発信されたフォームタグネーム >を$in{' '}を支えていたおかげて,フォーム情報をcgiに渡していましたが,今度は, >jcode.plに変更した以上,ReadPaseと言う後ろ楯が消えたので,自分で設定しなければ >なりません。 ReadParse() で得たフォームの内容を、jcode.plの中の関数でお望みの 漢字コードに変換する、という方法ではだめなのでしょうか。 たとえば、 &ReadParse(*in); $value=$in{'name'}; &jcode'convert(*value,'sjis'); というように。 (動作確認していませんので、上記のまま動くとは限りません) 動作確認と言えば、CGI を実行する前に、 perl -c CGIのファイル を実行して構文エラーがないかどうかを確認してから動作確認のテストす る事をお勧めします(申し訳ありませんが、MacPerlではどのようにする のかわたくしは知りませんので、調査して下さい)。 あと、CGIに関する書籍ですが、わたしの家の近所の少し大き目の本屋さん に5種類くらい置いてありました。 もし覚えていたら、出版社と書名をメモしてお知らせしたいと思います。 では、がんばってください。
いしどう です。 そうそう。少々手前味噌になりますが、わたしの勤め先の会社がやってる 教育センタで、PerlによるCGIプログラムのコースを開催しています。 もし業務でCGIプログラム作成を習得なければいけない、という 場合には、こちらを受講していただく、という手段もあるかと思います。
FTPで自分のアカウントのホームディレクトリー以外を 見られないように制限するにはどのような設定が必要ですか? たとえば、ホームページのアップロード時に 自分のホームディレクトリだけをアクセス可能にする方法です 環境はSunのSPARC station 20 で www、メール、anonymous FTP 各サーバーを テストしています anonymous FTP のような設定が必要なのか? 誰か教えて下さい。
1月19日に、みさっぺさんは書きました。 >FTPで自分のアカウントのホームディレクトリー以外を >見られないように制限するにはどのような設定が必要ですか? > >たとえば、ホームページのアップロード時に >自分のホームディレクトリだけをアクセス可能にする方法です ftpdの種類によりますが、アカウントに応じてchrootをかけるような機構を 用いれば良いです。 >環境はSunのSPARC station 20 で >www、メール、anonymous FTP 各サーバーを >テストしています 肝心のftpdの種類とヴァージョンが書いていませんが、現在一番一般的に使われている、 wu-ftpdの2.4以降を使っているものとします。その場合、ftpaccessでguestgroupを 設定すると、そのグループに属するアカウントはguestアカウントとして扱われます。 guestアカウントは、USER、PASSによる認証が済むと、指定のディレクトリに chrootされると共に、それ以上のUSER、PASSの発効が禁止されます。 ftpaccessでの制限もreal、anonymousと独立に、guestユーザに対する制限が 出来ます。 例えば、user1、user2と言うguestユーザを作る場合、まずは /etc/passwd で、 user1:パスワード:10:100:guest ftp user1:/home/guest/./user1:/bin/sh user2:パスワード:11:100:guest ftp user2:/home/guest/./user2:/bin/sh の様なエントリーを作ります。ここでユーザホームは /home/guest/./user1 の様に '/./' で区切られています。telnet ログインの時はそのまま使われますが、 ftpログインの場合、まず前半分(ここでは /home/guest)にchrootされてから 後ろ半分(ここでは /user1)にcdされます。 ここの例ではゲストユーザに共通の/home/guestにchrootしていますが、各ユーザの ホームディレクトリにchrootさせたいなら、/home/guest/user1/./ の様に なりますね。 次に /etc/group ファイルで、この user1、user2のグループを特定のグループ、例えば ここでは ftp と言うグループにします。 ftp:*:100:user1,user2 そして、ftpaccess で guestgroup ftp な設定をすればおしまいです。 もちろん、chroot していますから、anonymous ftp の設定と同じく、 chroot したディレクトリの下に bin、etc、lib 等を作って必要なファイル類を ハードリンクかコピーしておかなければなりません。 # 良く分からなかったら、wu-ftpのマニュアル辺りを見て下さい。
さきほどの三葉工房です。アドバイスありがとうごさいます。 いじとう様のおっしゃられた通り,cgi-libも利用してJ.code.plも利用しての スクリプトを実行しました。 cgi-libさえあれば,当然,inputからの情報を渡す事が出来ます。 (inputでは,なく***cgi?***=***と言うジャンプには,ReadParseは, 利用出来ないのですか。その同一スクリプト内においてのジャンプリンクの方法 も教えていただきたいです。) 実は,私がアドバイス願いたいのは,cgi-libを一切使用せず,jcode.plだけで フォームからの情報を渡す方法です。 その方法こそが,perlのプロを目指す為の最低限知っておかなければテクニック だと思うからです。 method=post情報を渡せない原因らしい原因を精一杯探りましたが,$_と=の間や$name =~ tr/+/ /; の~とtrの間も半角開けするのかと色々と試して見ましたが,やはり,method=post情報を渡せず サーバーエラー500にされる原因が全く見つけられず,ダウンロードしたBBSスクリプトも 私のと以下の文が全く同一の条件 if ($ENV{'REQUEST_METHOD'} eq 'GET') { @pairs = split(/&/, $ENV{'QUERY_STRING'}); } elsif ($ENV{'REQUEST_METHOD'} eq 'POST') { read(STDIN, $buffer, $ENV{'CONTENT_LENGTH'}); @pairs = split(/&/, $buffer); } else { &noname; } foreach $pair (@pairs) { ($name, $value) = split(/=/, $pair); $name =~ tr/+/ /; $name =~ s/%([a-fA-F0-9][a-fA-F0-9])/pack("C", hex($1))/eg; $value =~ tr/+/ /; $value =~ s/%([a-fA-F0-9][a-fA-F0-9])/pack("C", hex($1))/eg; &jcode'convert(*value,'sjis'); &jcode'convert(*name,'sjis'); $value =~ s///g; $value =~ s///g; $value =~ s/\r/
//g; $value =~ s/\n/
//g; $in{$name} = $value; } if ($in{'submit'} eq '登録') { ✓ &toppage; } else {&toppage;} なのに関わらずその先輩のダウンロードしたスクリプトは,ちゃんと動作しています。 ですが,何故,同じパラメータの設定なのに私のだけ情報をわたせないのでしょうね。 又,スクリプトに多少の訂正がございましたので,又,こないだの問題スクリプトを下部 にコピーいたします。 後,スクリプト関係の書籍のご紹介もお待ちしております。 どうか,改めましてアドバイス宜しくお願いします。 問題スクリプト=golygth.cgi **************** #!/usr/local/bin/perl $|=1; require './jcode.pl'; ($sec,$min,$hour,$day,$mon,$year,$wday)=localtime(time); $mon++; $seirei = ($year+1900); $wareki = ($year-88); $BaseDir = "$ENV{'HOME'}/html/search"; $NEWURL= "http://www.amy.hi-ho.ne.jp/cgi-bin/user/nature-create/golygth.cgi"; $coment = $in{'coment'}; $name = $in{'yourname'}; $mail = $in{'mail'}; $gurl = $in{'gurl'}; $hpagename = $in{'hpagename'}; $newmg = "newmg.dat"; @week = ("日","月","火","水","木","金","土"); $yobi = $week[$wday]; if($man<10){$mon="0$mon";} if($day<10){$day="0$day";} if($hour<10){$hour="0$hour";} if($min<10){$min="0$min";} if($sec<10){$min="0$sec";} $date = "$seirei年(平成$wareki年)$mon月$day日 $yobi曜日$hour時$min分$sec秒"; #最高コメント数制限 $maxcment = "105"; #最低コメント数制限 $remaxcment = "52"; #過剰コメント不足の最大数値 $mostsmall = "28"; #過剰コメント超過の最小数値 $mostbig = "128"; #過剰コメント不足の差不足設定エラー数値下限 $ersnall = ($remaxcment-20); #過剰コメント超過の差不足設定エラー数値上限 $erbig = ($maxcment+20); $dbsmall = ($remaxcment-$ersnall); $dbbig = ($erbig-$maxcment); if($mostsmall>$ersnall){print <<"MOTER"; Content-type: text/html過剰コメント不足エラー 過剰コメント不足エラー 過剰コメント不足の最低基準値$remaxcmentとの差が$dbsmall以内です。
適切な数値に書き直して下さい! MOTER exit; } if($mostbig<$erbig){print <<"REMOTER"; Content-type: text/html過剰コメント超過エラー 過剰コメント超過エラー 過剰コメント超過の最大基準値$maxcmentとの差が$dbbig以内です。
適切な数値に書き直して下さい! REMOTER exit; } $smallloss = $remaxcment-$mostsmall; $bigloss = $mostbig-$maxcment; $wordcnt = length($in{'coment'}); $wordbit = ($wordcnt/2); $overtop = ($wordbit-$maxcment); $overdown = ($remaxcment-$wordbit); #1を選択で新規記事は,リスト最上段,それ以外は,リスト最下段 $enty ="1"; #一度に掲載する記事数 $maxmsg ="4"; if ($ENV{'REQUEST_METHOD'} eq 'GET') { @pairs = split(/&/, $ENV{'QUERY_STRING'}); } elsif ($ENV{'REQUEST_METHOD'} eq 'POST') { read(STDIN, $buffer, $ENV{'CONTENT_LENGTH'}); @pairs = split(/&/, $buffer); } else { &noname; } foreach $pair (@pairs) { ($name, $value) = split(/=/, $pair); $name =~ tr/+/ /; $name =~ s/%([a-fA-F0-9][a-fA-F0-9])/pack("C", hex($1))/eg; $value =~ tr/+/ /; $value =~ s/%([a-fA-F0-9][a-fA-F0-9])/pack("C", hex($1))/eg; &jcode'convert(*value,'sjis'); &jcode'convert(*name,'sjis'); $value =~ s///g; $value =~ s///g; $value =~ s/\r/
//g; $value =~ s/\n/
//g; $in{$name} = $value; } if ($in{'submit'} eq '登録') { ✓ &toppage; } else {&toppage;} if($in{'action'} eq 'repage'){&rever;} sub toppage{ open (SSTBOOK, "$BaseDir/$newmg") ||die "ファイルが開きません!\n, 何処かの構文が間違っています!"; @Data=; close SSTBOOK; $cnturl = @Data; print "Content-type: text/html\n\n"; print "\n"; print "\n"; print " 進性能掲示板(V-up.スクリプト) \n"; print "\n"; print "\n"; print "\n"; print "
\n"; print "
\n"; print "\n"; print "\n"; print " \n"; print "\n"; print "\n"; print "進性能掲示板(V-up.スクリプト)\n"; print "\n"; print " \n"; print "\n"; print " \n"; print "\n"; print "(注意!)此の試験実行掲示板のコメント文字数は,$remaxcment文字以上$maxcment文字以内の範囲に制限されていますので,その範囲内の文字数で御記入願います。 \n"; print "
現在時刻:$date\n"; print "\n"; print " \n"; print "\n"; print " \n"; print "\n"; print "\n"; print "MISTUBA SEARCHPAGE\n"; print "\n"; print " \n"; print "\n"; print " \n"; print "\n"; print " \n"; print "\n"; print "\n"; print "変更.削除\n"; print "\n"; print " \n"; print "\n"; print "
\n"; print "
\n"; print "\n"; print "\n"; print "此れ迄の書き込み:$cnturl件が登録されています。\n"; print "\n"; print " \n"; print "
\n"; if($enty eq "0"){@Data=reverse(@Data);} foreach $match(@Data){ @catchin=split(/&&/, $match); print "\n"; print "$catchin[1]\n"; print "\n"; print ":$catchin[2]\n"; print "
\n"; print "\n"; print "$catchin[4]\n"; print "\n"; print "
\n"; print "$catchin[5]"; print "
\n"; } print "\n"; print "\n"; } sub rever{ print <<"MARCAR"; Content-type: text/html変更.削除ROOM 変更.削除ROOM 今は,テスト中です。暫くお待ち願います!
掲示板へ戻る MARCAR exit;} sub check{ if ($in{'yourname'} eq "") {&noname;} sub noname{print <<"NONAME"; Content-type: text/html名前が記入されていません! 名前が記入されていません! NONAME exit; } if($wordbit>$mostbig){print <<"MOROVER"; Content-type: text/html名前をフォームに記入為無ければ登録出来ません。
掲示板へ戻る $date かなりコメント数が$overtop個もオーバーしました! 彼方の記入されたコメント数は $wordbit個で,当フォームは,基準値の$remaxcment~$maxcment個よりコメント数が$bigloss個以上も多い場合に時に当ページが出力されてしまいます。そのコメント数は基準の$remaxcment~$maxcment個に$overtop個ものかなりのオーバーです。 MOROVER exit;} if($wordbit>$maxcment){ print <<"OVER"; Content-type: text/html
コメント数が$overtop個越えています! 彼方の記入されたコメント数は $wordbit個です。そのコメント数は基準の$remaxcment~$maxcment個より$overtop個オーバーしています。 OVER exit;} if($wordbit>0){if($wordbit<$mostsmall){print <<"MORDOWN"; Content-type: text/html
かなりコメント数が$overdown個も足りません! 彼方の記入されたコメント数は $wordbit個で,当フォームは,基準値の$remaxcment~$maxcment個よりコメント数が$smallloss個以上も少ない時に当ページが出力されてしまいます。そのコメント数は基準の$remaxcment~$maxcment個に$overdown個ものかなりの不足です。 MORDOWN exit;} if($wordbit<$remaxcment){print <<"DOWN"; Content-type: text/html
コメント数が$overdown個足りません! 彼方の記入されたコメント数は $wordbit個です。そのコメント数は基準の$remaxcment~$maxcment個に$overdown個不足しています。 DOWN exit;} } elsif ($in{'coment'} eq ""){print <<"NOCMT"; Content-type: text/html
コメントが記入されていません! コメントが記入されていません! NOCMT exit;} $coment =~ s/\r\n/コメントをフォームに記入為無ければ登録出来ません。
掲示板へ戻る $date
/g; $coment =~ s/\r/
/g; $coment =~ s/\n/
/g; &resit; sub resit{ if(-e "$BaseDir/$newmg"){ open (SSTBOOK, ">>$BaseDir/$newmg") || die "ファイルが開きません!\n, 何処かの構文が間違っています!"; print SSTBOOK "$mail&&$name&&$date&&$gurl&&$hpagename&&$coment\n"; close SSTBOOK;} #掲載メッセージの処理 if(-e "$BaseDir/$newmg"){open (NEW, "$BaseDir/$newmg") || die "ファイルが開きません!\n, 何処かの構文が間違っています!"; @lines =; close NEW;} unshift(@lines,"$mail&&$name&&$date&&$gurl&&$hpagename&&$coment\n"); splice(@lines,$maxmsg); open (NEW, ">$BaseDir/$newmg") || die "ファイルが開きません!\n, 何処かの構文が間違っています!"; flock(NEW,6); foreach(@lines){ print NEW;} close NEW; print <<"REPLAY"; Content-type: text/html $in{'yourname'}さん:書き込みを御受け致しました。 $in{'yourname'}さん,彼方の記入なされたコメント数は,$wordbit個でコメント数規定に合致しました。
それに伴い書き込みを御受け致しました。どうもありがとうございました。御帰りのページはこちらでございます。 REPLAY exit;} } __END__
いしどう です。 つい、デバッグしてしまいました (^^;; 三葉工房の管理者さんへの質問、と言う形でおこたえしたいとおもいます。 まず、サーヴァエラー、になると言う点に付いて。 三葉工房の管理者さんが参考にした、というスクリプトですが、 >if ($ENV{'REQUEST_METHOD'} eq 'GET') >{ >@pairs = split(/&/, $ENV{'QUERY_STRING'}); >} >elsif ($ENV{'REQUEST_METHOD'} eq 'POST') >{ >read(STDIN, $buffer, $ENV{'CONTENT_LENGTH'}); >@pairs = split(/&/, $buffer); >} >else { >&noname; >} > >foreach $pair (@pairs) >{ >($name, $value) = split(/=/, $pair); >$name =~ tr/+/ /; >$name =~ s/%([a-fA-F0-9][a-fA-F0-9])/pack("C", hex($1))/eg; >$value =~ tr/+/ /; >$value =~ s/%([a-fA-F0-9][a-fA-F0-9])/pack("C", hex($1))/eg; >&jcode'convert(*value,'sjis'); >&jcode'convert(*name,'sjis'); >$value =~ s/<!--(.|\n)*-->//g; >$value =~ s/<html(.|\n)*//ig; >$value =~ s/<script(.|\n)*//ig; >$value =~ s/<table(.|\n)*//ig; >$value =~ s/<form(.|\n)*//ig; >$value =~ s/<html(.|\n)*//ig; >$value =~ s/<xmp(.|\n)*//ig; >$value =~ s/\r\n/<br>//g; >$value =~ s/\r/<br>//g; >$value =~ s/\n/<br>//g; >$in{$name} = $value; >} > >if ($in{'submit'} eq '登録') { >✓ >&toppage; > >} >else {&toppage;} ほんとうに、まったく同じですか? 特に、foreachブロックの中(赤く示したところ)、どうみても写し間違い にしか見えない部分があるのですが(構文が間違っている)。 ひとつひとつの正規表現の意味、なにをしているか、を調べてみて下さい。 わたしが試した範囲では、それを修正すれば、まちがいなく連想配列 %in にフォームで入力した内容が渡っています。 次に、フォームで入力された値が変数に反映されない、と言う点。 $name や $mail という変数ですよね? 三葉工房の管理者さんのスクリプトで言えば、このへん。 >$coment = $in{'coment'}; >$name = $in{'yourname'}; >$mail = $in{'mail'}; >$gurl = $in{'gurl'}; >$hpagename = $in{'hpagename'}; この時点で、フォームから入力された内容が、連想配列 %in (という か、$name であれば $in{'yourname'}、$mail であれば $in{'mail'}) に反映されているでしょうか? スクリプトは、基本的に上から下へ順番に実行文が実行される事を思い 出して下さい。 最後に、同一の CGI で動きを変える方法に付いて(***.cgi?action=*** という方法) 三葉工房の管理者さんのやりかたで、あってます。わたしがテストした 範囲では動きました。 でも、スクリプトが出力する内容が変ですね。 三葉工房の管理者さんのスクリプトだと、action=repage のとき、まず &toppage が呼ばれて、次に &rever が呼ばれますね。 (本筋とは関係ないですが、rever とは何を示しているのですか? 将来 スクリプトを修正するときに何をさせている関数か忘れてしまって困る 事もあると思いますので、わかりやすい名前にしておいたほうがいいと 思います) そうすると、<head>タグが一つの HTML ページの中で2回現れる ことになり、HTML の内容をチェックしているようなヱブサーヴァでは エラーとして扱われる事になると思います(あ、答えを書いちゃった)。 あと、スクリプトで作成した HTML ページ内での、スクリプト自身への リンク先がちゃんと指定されていないところも見受けられました。 たまたまカレントディレクトリが移ってたんで動作していたんでしょうが、 HI-HO での CGI スクリプトの指定の仕方に合わせたほうが、将来サーヴァ 側の構成変更があったときに対応しやすいと思います。 1月19日に、三葉工房の管理者さんは書きました。 >実は,私がアドバイス願いたいのは,cgi-libを一切使用せず,jcode.plだけで >フォームからの情報を渡す方法です。 > その方法こそが,perlのプロを目指す為の最低限知っておかなければテクニック >だと思うからです。 わたしならば目的のスクリプトを手っ取り早く動かすことのほうを優先した いと思うので、道具(cgi-lib.pl や jcode.pl のような)があるのならば、 苦労してそのようなものを再創造するよりもそれらを使いますけれども…。 (大概において、自分で再創造するよりもどこかからみつけてきたものの 方が出来がよいですし (^^;;) まぁ、そのへんは個々人の考え方なんで、わたしの考え方を強制すること はできませんが (^^) そちらのほうが効率が良いと思いますがいかがでしょ う。 書籍の方は、もうしばらくお待ち下さい。 三葉工房の管理者さんも、書店で自分に合いそうな本をさがしてみてくだ さいね。 (2・3見てみたのですが、どうもプログラミングの経験がある人を対象 にしてるようなのしか見つからなかったんで…もうすこし探してみます) あと、スクリプトを引用するのであれば、HTML のタグとして使われるよ うな文字(「&」とか「<」、「>」)は、「&」 「<」「>」と書いて下さいね (^^) (一括未読表示 をしたら、三葉工房の管理者さんの発言のところで、存在しないページ へ飛んでいってしまいました(^^;;)
1月19日に、三葉工房の管理者さんは書きました。 > cgi-libさえあれば,当然,inputからの情報を渡す事が出来ます。 というか、jcode.plは変数中の文字列の文字コードを変換するライブラリですので、 inputからの情報を受け取ることはできません。 (なので、Subjectにあるような「jcode.pl一本で情報を渡してみたい」ということは できませんよ。) inputからの情報を受け取る場合は必ず、 cgi-libを使うか にあさん作のhttp.pl(うぇぶ会議室に付いています)を使うか 自分でコーディングする(ライブラリ等を使わずにその処理を直接書く) 必要があります。 >(inputでは,なく***cgi?***=***と言うジャンプには,ReadParseは, >利用出来ないのですか。その同一スクリプト内においてのジャンプリンクの方法 >も教えていただきたいです。) 三葉工房の管理者さんは特有の方言が多いですね。(^^;; 上記の文の「ジャンプリンク」というのはなんでしょうか。 なんとなく言いたいことはわかりましたので、少し解説しますと <FORM ACTION="xxx.cgi" METHOD="POST">でCGIを呼び出したときは <INPUT>で渡したデータはSTDIN(標準入力)にあるので、 if ($ENV{'REQUEST_METHOD'} eq 'POST') { $len = $ENV{'CONTENT_LENGTH'} + 0; read(STDIN, $args, $len); } 上記のような処理が必要になります。 で、<FORM ACTION="xxx.cgi" METHOD="GET">でCGIを呼び出したときや、 URLに "***cgi?***=***" を指定して呼び出したときは、 データは $ENV{'QUERY_STRING'}に入っています。 なので、データが両方にあるときは、両方のやり方でデータを取得すればいいのですが、 ReadParseでは、どちらかしかやっていないのではないですか。 その点、http.plのhttp_args関数はちゃんと両方からデータを拾ってくれるので 世話なしで便利です。(#^_^#)
いしどう様,TAD様アドバイスどうもありがとうごさいました。 わざわざ,貴重な時間をさいてデバックを済みません。 いしどう様のおっしゃられ通り,変換タグの$value =~ s/\n//g;が $value =~ s/\n// /g;とハイフンが1本余計と言うミスがございました。 それを訂正しただけで,フォーム未記入状態で,サブミットして,"名前が ありません"と言うページを出せました。 ですが,もう1つエラーがございました。 それは,コメント数をlangth関数が読めなかったり,$hensu=$in{'hensu'}の代入 が成立せず,コメント数が分からない以上,書き込み成立にされてしまい,なんと 記入時刻だけ出るという書き込みにされてしまいました。そして,名前が(今は, $youtrname)が$nameでフォームからの読み込み情報の変数も$nameなので,なんと 登録ボタンの名称,submitが名前として掲示板に書き込まれていました。 はらはらして,原因を調べた所,cgi-libでは,容赦してくれた事が,それを 無しで行ったら,厳しくなり,容赦してくれなかった事でした。 それは,サブルーチンや条件指定等の並べ方でcgi-libでは,ある程度適当に配置しても,あまり 行き違いはなく,コメントも読んで,コメント数に応じて,出るべき,ページ(コメント 数エラー等)が出てました。しかし,そのlibを外したらそれでは,許してはくれず, 実行すべき所のサブルーチン内に条件指定をしなければ,実行は,完全成立しないと 言う事でした。それを行い,ようやく,コメント数に合うべきページを出せる様になり ,例の同一スクリプト内でのリンクも出来ました。 今度は,そのリンク先のページに変更.削除のページを作成する学習に入りたいと思います。 後,perl参考本の件ですが,私の所にも1軒大きな本屋にコンピュータ関係の本が沢山置いて ございまして,そこでもperlのいいスクリプト関係の本は,ないかなと探しています。 今の所,購入済みの本は駱駝本と技術評論社の実践perl入門ですが,例えば,ソフトバンクの結城さんの著書 りperl入門.基礎編.応用編とかどうかなと思ったりします。いや分かりませんが。 それでは,又つまづいた所がございましたら,改めて宜しくお願いします。
又,質問して済みません。 毎日,これからの三葉工房の業務進展の為に,cgiの技術が 必要なのでperlを研究しています。 perlの現実は,よく確かめたこれでこのプログラムは,確実にまちがいなく 実行されるぞ! 実行を試みたが100%実行確実のプログラムが実行されない のが当り前な事だと思います。 そして,今回もこの様な事で,私なりに精一杯,実行成功の確かめられている ダウンロードした自動リンクプログラム(N.S.E2.75)の記事削除のルーチンと 自分の記述した同じ目的のルーチンを皿の様に確かめ続けた上での,質問です。 その様に精一杯どこが可笑しいのかを確かめましたが,可笑しい所は,どこにも ありません。本来ならば,100%実行成立のルーチンですが,奇蹟的に実行不正立 なのです。そのルーチンをN.S.Eの場合と,自分の場合の記事削除のルーチンを以下 にコピーします。 N.S.E2.75の記事削除のルーチン(N.S.E2.75は,http://www.cinovi.com/cgitips/から ダウンロード可能) $in{'Cat'}には,スポーツ,趣味娯楽等の自動リンクのカテゴリ名が入る。$in{'Cat'}.dat で書き込みファイル名です。 (if ($in{'action'} eq "delete") {&delete;} # 選択された項目を削除) の条件分岐文で,sub deleteに進む) *************************************************************** sub del_view {#修正するファイルの選択 &PrintHeader; print <<"EOF"; <html><head><title>修正するファイルの選択</title></head><body background="http://www.geocities.co.jp/SiliconValley-PaloAlto/6004/kkoyaku/ocahr.gif" text=#000000> <p><center><img src="http://www.geocities.co.jp/SiliconValley-PaloAlto/6004/mikoo/mitsubascp.gif"></center><p><form method="get" action="search.cgi"> <input type=hidden name="action" value="delete"> <input type=hidden name="Cat" value="$in{'Cat'}"> EOF open (DB, "$BaseDir/$in{'Cat'}.dat"); @shadow = <DB>; close DB; foreach $shadow (@shadow) { @Temp = split (/&&/, $shadow); print "<input type=radio name=\"target\" value=\"$Temp[0]$Temp[2]$Temp[5]\">\n"; print "$Temp[1]:<a href=\"$Temp[2]\">$Temp[2]</a><br>\n"; } print <<"EOF"; <p> <input type=submit value="削 除"> </form> </body></html> EOF exit; } #------------------------------------------# sub delete { # 選択した項目の削除 &PrintHeader; print <<"EOF"; <html> <head><META HTTP-EQUIV=REFRESH CONTENT="4;URL=$BaseURL/"> <title>作業終了</title></head> <body background="http://www.geocities.co.jp/SiliconValley-PaloAlto/6004/kkoyaku/ocahr.gif" text=#000000> EOF $Target = $in{'target'}; open (DB, "$BaseDir/$in{'Cat'}.dat"); @lines = <DB>; close (DB); open (DB, ">$BaseDir/$in{'Cat'}.dat"); foreach $edit (@lines) { @Temp = split (/&&/, $edit); if ("$Temp[0]$Temp[2]$Temp[5]" ne "$Target") { print DB "$edit"; } } close (DB); print <<"EOF"; 作業が終了しました。<br> <br> <a href="$BaseURL/">戻る</a><p> </body></html> EOF exit; } そして,以下のが自分の記事削除ルーチンです。こちらの$in{'Cat'}には,書き込みファイル名です。 (if ($in{'action'} eq "delete") {&cutplay;} の条件分岐文で,sub cutplayに進む) *************************************************************** sub passck{ open (CAT, "$BaseDir/$newmg") || die "ファイルが開きません!\n, 何処かの構文が間違っています!"; @Catdata=<CAT>; close CAT; $caturl = @Catdata; print "Content-type: text/html\n\n"; print "<html>\n"; print "<head><title>パスワードが一致しました。</title><head></head>\n"; print "<body bgcolor=\"#66ff00\">\n"; print "<center>\n"; print "<font color=\"#550000\" size=6><b>パスワードが一致しました。</b></font>\n"; print "<p>\n"; print "<font color=\"#000033\" size=5><b>パスワードが一致しました。消去したい記事にチェックを入れてサブミットして下さい。</b></font>\n"; print "<p>\n"; print "<a href=\"golygth.cgi\">\n"; print "<font color=\"#333300\" size=5><b>掲示板へ戻る</b></font>\n"; print "</a>\n"; print "</center>\n"; print "<hr size=5>\n"; print "<font color=\"#000066\" size=5><b>現在の掲載記事($caturl 件)</b></font>\n"; print "<hr size=5>\n"; print "<form method=POST action=\"golygth.cgi\">\n"; print "<input type=hidden name=\"action\" value=\"delete\">\n"; print "<input type=hidden name=\"Cat\" value=\"$newmg\">\n"; if($enty eq "0"){@Catdata=reverse(@Catdata);} foreach $rematch(@Catdata){ @catchin=split(/&&/, $rematch); print "<input type=radio name=\"target\" value=\"$catchin[0]$catchin[2]$catchin[3]\">\n"; print "<a href=\"mailto:$catchin[0]\">\n"; print "<font color=\"#006600\" size=4>$catchin[1]</font>\n"; print "</a>\n"; print "<font color=\"#000066\" size=3>:$catchin[2]</font>\n"; print "<br>\n"; print "<a href=\"$catchin[3]\" target=\"new\">\n"; print "<font color=\"#990066\" size=3>$catchin[4]</font>\n"; print "</a>\n"; print "<br>\n"; print "<font color=\"#330000\" size=3>$catchin[5]</font>"; print "<hr size=5>\n"; } print "<center>\n"; print "<input type=submit name=\"submit\" value=\"削除実行\">\n"; print "</form>\n"; print "</center>\n"; print "</body>\n"; print "</html>\n"; exit;} sub cutplay{ print "Content-type: text/html\n\n"; print <<"ALPS"; <html><head><title>削除処理完了</title><meta http-equiv="refresh" content="5; url=$NEWURL "></head><body bgcolor=\"#ff0000\"><p><font color=\"aqua\" size=4><b> $in{'target'}</b></font> ALPS open (CAT, "$BaseDir/$in{'Cat'}") || die "ファイルが開きません!\n, 何処かの構文が間違っています!"; @lines = <CAT>; close (CAT); open (CAT, ">$BaseDir/$in{'Cat'}") || die "ファイルが開きません!\n, 何処かの構文が間違っています!"; foreach $ereize (@lines){ @catchin=split(/&&/, $ereize); if("$catchin[0]$catchin[2]$catchin[3]" ne $in{'target'}) {print CAT "$ereize";}} close (CAT); print <<"ALPS"; <center><font color=\"#00ff00\" size=6><b>削除処理完了</b></font><p> <font color=\"#ffff00\" size=5><b>彼方のチェック為た記事を削除しました。</b></font><p><a href=\"golygth.cgi\"><font color=\"#ccffff\" size=5><b>掲示板へ戻る</b></font></a></center></body></html> ALPS exit;} いかがでしょうか,特にそれぞれサブルーチン2つに分かれていますが,特に下の記事の 削除を実行するプログラム,ファイルハンドル名は,N.S.Eのと,自分のとでは,違いますが プログラムの書き方は,全く同じです。全く同じなのに関わらず1つ違う点がございます。 それが,N.S.Eでは,in{'target'}のラジオボタンがチェックされたのが,消去されますが 自分のは,チェックしたのも消去されずに残ってしまってる所です。 何故,N.S.Eの書き方と全く同じなのに私のスクリプトでは,記事消去が実行出来ないのでしょうか。 何度も確認して,可笑しい所や構文ミスは,全く見つかりませんでした。それで,実行 出来ない事事態あまりにも不自然過ぎて納得行きません。 もちろん,問題スクリプトも下にコピーします。 御忙しい所,たびたびで済みませんが,どうかアドバイス宜しくお願いします。 問題スクリプトgolygth.cgi #!/usr/local/bin/perl $|=1; require './jcode.pl'; ($sec,$min,$hour,$day,$mon,$year,$wday)=localtime(time); $mon++; $seirei = ($year+1900); $wareki = ($year-88); $BaseDir = "$ENV{'HOME'}/html/search"; $NEWURL= "http://www.amy.hi-ho.ne.jp/cgi-bin/user/nature-create/golygth.cgi"; $newmg = "newmg.dat"; @week = ("日","月","火","水","木","金","土"); $yobi = $week[$wday]; if($man<10){$mon="0$mon";} if($day<10){$day="0$day";} if($hour<10){$hour="0$hour";} if($min<10){$min="0$min";} if($sec<10){$min="0$sec";} $date ="$seirei年(平成$wareki年)$mon月$day日 $yobi曜日$hour時$min分$sec秒"; #最高コメント数制限 $maxcment = "105"; #最低コメント数制限 $remaxcment = "52"; #過剰コメント不足の最大数値 $mostsmall = "28"; #過剰コメント超過の最小数値 $mostbig = "128"; #過剰コメント不足の差不足設定エラー数値下限 $ersnall = ($remaxcment-20); #過剰コメント超過の差不足設定エラー数値上限 $erbig = $maxcment+20; $dbsmall = $remaxcment-$ersnall; $dbbig = $erbig-$maxcment; if($mostsmall>$ersnall){print <<"MOTER"; Content-type: text/html <html><head><title>過剰コメント不足エラー</title></head> <body bgcolor=\"#ccffff\"> <center><font color=\"#550000\" size=6><b>過剰コメント不足エラー</b></font></center><p><font color=\"#000055\" size=5><b>過剰コメント不足の設定値が$mostsmallと最低基準値$remaxcmentとの差が$dbsmall以内です。</b></font><p><center><font color=\"#663300\" size=5><b>適切な数値に書き直して下さい!</b></font></center></body></html> MOTER exit; } if($mostbig<$erbig){print <<"REMOTER"; Content-type: text/html <html><head><title>過剰コメント超過エラー</title></head> <body bgcolor=\"#ffff99\"> <center><font color=\"#550000\" size=6><b>過剰コメント超過エラー</b></font></center><p><font color=\"#000055\" size=5><b>過剰コメント超過の設定値が$mostbigと最大基準値$maxcmentとの差が$dbbig以内です。</b></font><p><center><font color=\"#663300\" size=5><b>適切な数値に書き直して下さい!</b></font></center></body></html> REMOTER exit; } #1を選択で新規記事は,リスト最上段,それ以外は,リスト最下段 $enty ="1"; #一度に掲載する記事数 $maxmsg ="4"; #パスワード名 $password="jgtyhj88"; if ($ENV{'REQUEST_METHOD'} eq "POST") { read(STDIN, $buffer, $ENV{'CONTENT_LENGTH'}); } else{$buffer = $ENV{'QUERY_STRING'};} @pairs = split(/&/, $buffer); foreach $pair (@pairs) { ($name, $value) = split(/=/, $pair); $value =~ tr/+/ /; $value =~ s/ / /g; $value =~ s/%([a-fA-F0-9][a-fA-F0-9])/pack("C", hex($1))/eg; $value =~s/<!--(.|\n)*-->//g; $value =~s/\*//g; $value =~ s/</</g; $value =~ s/>/>/g; $value =~ s/\r\n/<br>/g; $value =~ s/\n//g; $in{$name} = $value; } &jcode'h2z_sjis(*value,'sjis'); &jcode'convert(*value,'sjis'); if($in{'action'} eq "delete"){ &cutplay; } if($in{'submit'} eq "仮実行"){ &erpass; &passck; } if ($in{'submit'} eq '登録') { ✓ &toppage;} else {&toppage;} sub toppage{ if($in{'action'} eq "repage"){ &rever;} if($in{'action'} eq "passch"){&passck;} open (SSTBOOK, "$BaseDir/$newmg") ||die "ファイルが開きません!\n, 何処かの構文が間違っています!"; @Data=<SSTBOOK>; close SSTBOOK; $cnturl = @Data; print "Content-type: text/html\n\n"; print "<html>\n"; print "<head>\n"; print "<title>進性能掲示板(V-up.スクリプト)</title>\n"; print "</head>\n"; print "<body bgcolor=\"orange\">\n"; print "<p>\n"; print "<table bgcolor=\"black\" border=5>\n"; print "<tr>\n"; print "<th>\n"; print "<font color=\"orange\"size=5>\n"; print "<b>進性能掲示板(V-up.スクリプト)</b>\n"; print "</font>\n"; print "</th>\n"; print "</tr>\n"; print "<tr>\n"; print "<td>\n"; print "<font color=\"yellow\"size=4>(注意!)此の試験実行掲示板のコメント文字数は,$remaxcment文字以上$maxcment文字以内の範囲に制限されていますので,その範囲内の文字数で御記入願います。<br> 現在時刻:$date</font>\n"; print "</td>\n"; print "</tr>\n"; print "<tr>\n"; print "<th>\n"; print "<center>\n"; print "<a href=\"/nature-create/search/index.html\">\n"; print "<font color=\"yellow\"size=4>MISTUBA SEARCHPAGE</font>\n"; print "</a>\n"; print "</center>\n"; print "</th>\n"; print "</tr>\n"; print "<tr>\n"; print "<th>\n"; print "<center>\n"; print "<a href=\"/cgi-bin/user/nature-create/golygth.cgi?action=repage\">\n"; print "<font color=\"yellow\"size=4>変更.削除</font>\n"; print "</a>\n"; print "</center>\n"; print "</th>\n"; print "</tr>\n"; print "</table>\n"; print "</center>\n"; print "<p>\n"; print "<form method=POST action=\"golygth.cgi\" >\n"; print "<p>\n"; print "<table bgcolor=\"#ffcc99\" border=5>\n"; print "<tr>\n"; print "<th>\n"; print "<font color=\"navy\"size=4>\n"; print "<b>登録者名</b>\n"; print "</font>\n"; print "</th>\n"; print "</tr>\n"; print "</table>\n"; print "<p>\n"; print "<input name=\"yourname\" size=45>\n"; print "<p>\n"; print "<table bgcolor=\"#ffcc99\" border=5>\n"; print "<tr>\n"; print "<th>\n"; print "<font color=\"navy\"size=4>\n"; print "<b>Eメールアドレス</b>\n"; print "</font>\n"; print "</th>\n"; print "</tr>\n"; print "</table>\n"; print "<p>\n"; print "<input name=\"mail\" size=45>\n"; print "<p>\n"; print "<table bgcolor=\"#ffcc99\" border=5>\n"; print "<tr>\n"; print "<th>\n"; print "<font color=\"navy\"size=4>\n"; print "<b>登録者のホームページ名</b>\n"; print "</font>\n"; print "</th>\n"; print "</tr>\n"; print "</table>\n"; print "<p>\n"; print "<input name=\"hpagename\" size=60>\n"; print "<p>\n"; print "<table bgcolor=\"#ffcc99\" border=5>\n"; print "<tr>\n"; print "<th>\n"; print "<font color=\"navy\"size=4>\n"; print "<b>ホームページのURL</b>\n"; print "</font>\n"; print "</th>\n"; print "</tr>\n"; print "</table>\n"; print "<p>\n"; print "<input name=\"gurl\" value=\"http://\" size=60>\n"; print "<p>\n"; print "<table bgcolor=\"#ffcc99\" border=5>\n"; print "<tr>\n"; print "<th>\n"; print "<font color=\"navy\"size=4>\n"; print "<b>コメント</b>\n"; print "</font>\n"; print "</th>\n"; print "</tr>\n"; print "</table>\n"; print "<p>\n"; print "<textarea name=\"coment\" rows=4 cols=60 wrap=\"soft\"></textarea>\n"; print "<p>\n"; print "<center>\n"; print "<input type=submit name=\"submit\" value=\"登録\">\n"; print "<p>\n"; print "<input type=reset value=\"リセット\">\n"; print "</center>\n"; print "</form>\n"; print "<hr size=5>\n"; print "<center>\n"; print "<font color=\"#330066\" size=5>\n"; print "<b>此れ迄の書き込み:$cnturl件が登録されています。</b>\n"; print "</font>\n"; print "</center>\n"; print "<hr size=5>\n"; if($enty eq "0"){@Data=reverse(@Data);} foreach $match(@Data){ @catchin=split(/&&/, $match); print "<a href=\"mailto:$catchin[0]\">\n"; print "<font color=\"#006600\" size=4>$catchin[1]</font>\n"; print "</a>\n"; print "<font color=\"#000066\" size=3>:$catchin[2]</font>\n"; print "<br>\n"; print "<a href=\"$catchin[3]\" target=\"new\">\n"; print "<font color=\"#990066\" size=3>$catchin[4]</font>\n"; print "</a>\n"; print "<br>\n"; print "<font color=\"#330000\" size=3>$catchin[5]</font>"; print "<hr size=5>\n"; } print "</body>\n"; print "</html>\n"; exit;} sub rever{ print <<"MARCAR"; Content-type: text/html <html><head><title>変更.削除ROOM</title></head> <body bgcolor=\"#00ff00\"> <center><font color=\"#550000\" size=6><b>変更.削除ROOM</b></font></center><p> <font color=\"#000055\" size=5><b>パスワードを御記入下さい</b></font><br> <form method=POST action="golygth.cgi" > <input type=text name="password" size=8 maxlangth=8><p><center><input type=submit name="submit" value="仮実行"><p><input type=reset value=\"リセット\"></form></center><p><a href="golygth.cgi"><font color=\"#663300\" size=5><b>掲示板へ戻る</b></font></a></center></body></html> MARCAR exit;} sub erpass{if($in{'password'} ne "$password") { print <<"ERPS"; Content-type: text/html <html><head><title>パスワードが違います!</title></head> <body bgcolor=\"#339966\"> <center><font color=\"#550000\" size=6><b>パスワードが違います!</b></font><p> <font color=\"#000033\" size=5><b>パスワードが違いますので,もう一度<a href=\"/cgi-bin/user/nature-create/golygth.cgi?action=repage\"><font color=\"#440000\" size=5>変更.削除</a></font>の部屋に御戻りに成り,パスワードを入れ直して下さい。</b></font><p><a href=\"golygth.cgi\"><font color=\"#333300\" size=5><b>掲示板へ戻る</b></font></a></center></body></html> ERPS exit;}} sub passck{ open (CAT, "$BaseDir/$newmg") || die "ファイルが開きません!\n, 何処かの構文が間違っています!"; @Catdata=<CAT>; close CAT; $caturl = @Catdata; print "Content-type: text/html\n\n"; print "<html>\n"; print "<head><title>パスワードが一致しました。</title><head></head>\n"; print "<body bgcolor=\"#66ff00\">\n"; print "<center>\n"; print "<font color=\"#550000\" size=6><b>パスワードが一致しました。</b></font>\n"; print "<p>\n"; print "<font color=\"#000033\" size=5><b>パスワードが一致しました。消去したい記事にチェックを入れてサブミットして下さい。</b></font>\n"; print "<p>\n"; print "<a href=\"golygth.cgi\">\n"; print "<font color=\"#333300\" size=5><b>掲示板へ戻る</b></font>\n"; print "</a>\n"; print "</center>\n"; print "<hr size=5>\n"; print "<font color=\"#000066\" size=5><b>現在の掲載記事($caturl 件)</b></font>\n"; print "<hr size=5>\n"; print "<form method=POST action=\"golygth.cgi\">\n"; print "<input type=hidden name=\"action\" value=\"delete\">\n"; print "<input type=hidden name=\"Cat\" value=\"$newmg\">\n"; if($enty eq "0"){@Catdata=reverse(@Catdata);} foreach $rematch(@Catdata){ @catchin=split(/&&/, $rematch); print "<input type=radio name=\"target\" value=\"$catchin[0]$catchin[2]$catchin[3]\">\n"; print "<a href=\"mailto:$catchin[0]\">\n"; print "<font color=\"#006600\" size=4>$catchin[1]</font>\n"; print "</a>\n"; print "<font color=\"#000066\" size=3>:$catchin[2]</font>\n"; print "<br>\n"; print "<a href=\"$catchin[3]\" target=\"new\">\n"; print "<font color=\"#990066\" size=3>$catchin[4]</font>\n"; print "</a>\n"; print "<br>\n"; print "<font color=\"#330000\" size=3>$catchin[5]</font>"; print "<hr size=5>\n"; } print "<center>\n"; print "<input type=submit name=\"submit\" value=\"削除実行\">\n"; print "</form>\n"; print "</center>\n"; print "</body>\n"; print "</html>\n"; exit;} sub cutplay{ print "Content-type: text/html\n\n"; print <<"ALPS"; <html><head><title>削除処理完了</title><meta http-equiv="refresh" content="5; url=$NEWURL "></head><body bgcolor=\"#ff0000\"> ALPS open (CAT, "$BaseDir/$in{'Cat'}") || die "ファイルが開きません!\n, 何処かの構文が間違っています!"; @lines = <CAT>; close (CAT); open (CAT, ">$BaseDir/$in{'Cat'}") || die "ファイルが開きません!\n, 何処かの構文が間違っています!"; foreach $ereize (@lines){ @catchin=split(/&&/, $ereize); if("$catchin[0]$catchin[2]$catchin[3]" ne $in{'target'}) {print CAT "$ereize";}} close (CAT); print <<"ALPS"; <center><font color=\"#00ff00\" size=6><b>削除処理完了</b></font><p> <font color=\"#ffff00\" size=5><b>彼方のチェック為た記事を削除しました。</b></font><p><font color=\"aqua\" size=4><b> $in{'target'}</b></font><br><font color=\"aqua\" size=4><b>$in{'Cat'}</b></font><p><a href=\"golygth.cgi\"><font color=\"#ccffff\" size=5><b>掲示板へ戻る</b></font></a></center></body></html> ALPS exit;} sub check{ if ($in{'yourname'} eq "") {&noname;} sub noname{print <<"NONAME"; Content-type: text/html <html><head><title>名前が記入されていません!</title></head> <body bgcolor=\"#ccff99\"> <center><font color=\"#550000\" size=6><b>名前が記入されていません!</b></font><p><font color=\"#000055\" size=5><b>名前をフォームに記入為無ければ登録出来ません。</b></font><p><table bgcolor=\"#000000\" border=5><tr><th><a href=\"golygth.cgi\"><font color=\"#ccccff\" size=5>掲示板へ戻る</font></a></th></tr><tr><th><font color=\"#00ff00\" size=5>$date</th></tr></table></center></body></html> NONAME exit; } $smallloss = $remaxcment-$mostsmall; $bigloss = $mostbig-$maxcment; $wordcnt = length($in{'coment'}); $wordbit = $wordcnt/2; $overtop = $wordbit-$maxcment; $overdown = $remaxcment-$wordbit; if ($wordbit>$mostbig) {print <<"MOROVER"; Content-type: text/html <html><head><title>かなりコメント数が$overtop個もオーバーしました!</title></head> <body bgcolor=\"\#cc0000\"> <font color=\"\#ffff66\" size=5><b>彼方の記入されたコメント数は $wordbit個で,当フォームは,基準値の$remaxcment~$maxcment個よりコメント数が$bigloss個以上も多い場合に時に当ページが出力されてしまいます。</b> </font><p> <font color=\"\#ccffcc\" size=5>そのコメント数は基準の$remaxcment~$maxcment個に$overtop個ものかなりのオーバーです。 </font> </body></html> MOROVER exit;} if ($wordbit>$maxcment) { print <<"OVER"; Content-type: text/html <html><head><title>コメント数が$overtop個越えています!</title></head> <body bgcolor=\"\#003399\"> <font color=\"\#ffff66\" size=5><b>彼方の記入されたコメント数は $wordbit個です。</b> </font><p> <font color=\"\#ccffcc\" size=5>そのコメント数は基準の$remaxcment~$maxcment個より$overtop個オーバーしています。</font> </body></html> OVER exit;} if($wordbit>0) {if($wordbit<$mostsmall) {print <<"MORDOWN"; Content-type: text/html <html><head><title>かなりコメント数が$overdown個も足りません!</title></head> <body bgcolor=\"\#110000\"> <font color=\"\#ffff66\" size=5><b>彼方の記入されたコメント数は $wordbit個で,当フォームは,基準値の$remaxcment~$maxcment個よりコメント数が$smallloss個以上も少ない時に当ページが出力されてしまいます。</b> </font><p> <font color=\"\#ccffcc\" size=5>そのコメント数は基準の$remaxcment~$maxcment個に$overdown個ものかなりの不足です。 </font> </body></html> MORDOWN exit;} if ($wordbit<$remaxcment) {print <<"DOWN"; Content-type: text/html <html><head><title>コメント数が$overdown個足りません!</title></head> <body bgcolor=\"\#660000\"> <font color=\"\#ffff66\" size=5><b>彼方の記入されたコメント数は $wordbit個です。</b> </font><p> <font color=\"\#ccffcc\" size=5>そのコメント数は基準の$remaxcment~$maxcment個に$overdown個不足しています。 </font> </body></html> DOWN exit;} } elsif ($in{'coment'} eq "") {print <<"NOCMT"; Content-type: text/html <html><head><title>コメントが記入されていません!</title></head> <body bgcolor=\"#ffffcc\"> <center><font color=\"#550000\" size=6><b>コメントが記入されていません!</b></font><p><font color=\"#000055\" size=5><b>コメントをフォームに記入為無ければ登録出来ません。</b></font><p><table bgcolor=\"#000000\" border=5><tr><th><a href=\"golygth.cgi\"><font color=\"#ccccff\" size=5>掲示板へ戻る</font></a></th></tr><tr><th><font color=\"#00ff00\" size=5>$date</th></tr></table></center></body></html> NOCMT exit;} &resit; sub resit{ if (-e "$BaseDir/$newmg") { open (SSTBOOK, ">>$BaseDir/$newmg") || die "ファイルが開きません!\n, 何処かの構文が間違っています!"; print SSTBOOK "$in{'mail'}&&$in{'yourname'}&&$date&&$in{'gurl'}&&$in{'hpagename'}&&$in{'coment'}\n"; close SSTBOOK;} #掲載メッセージの処理 if (-e "$BaseDir/$newmg") {open (NEW, "$BaseDir/$newmg") || die "ファイルが開きません!\n, 何処かの構文が間違っています!"; @lines = <NEW>; close NEW;} unshift(@lines,"$in{'mail'}&&$in{'yourname'}&&$date&&$in{'gurl'}&&$in{'hpagename'}&&$in{'coment'}\n"); splice(@lines,$maxmsg); open (NEW, ">$BaseDir/$newmg") || die "ファイルが開きません!\n, 何処かの構文が間違っています!"; flock(NEW,6); foreach(@lines){ print NEW;} close NEW; print <<"REPLAY"; Content-type: text/html <html><head><title>$in{'yourname'}さん:書き込みを御受け致しました。</title><meta http-equiv="refresh" content="5; url=$NEWURL "></head> <body bgcolor=\"\#cc66ff\"> <font color=\"\#660000\" size=5><b>$in{'yourname'}さん,彼方の記入なされたコメント数は,$wordbit個でコメント数規定に合致しました。</b></font><br><font color=\"\#ffff66\" size=5><b>それに伴い書き込みを御受け致しました。どうもありがとうございました。</b> <p> <font color=\"\#ccffcc\" size=5>御帰りのページは<a href=\"$NEWURL \">こちら</a>でございます。</font> </body></html> REPLAY exit1;} exit;} __END__
1月22日に、三葉工房の管理者さんは書きました。 >perlの現実は,よく確かめたこれでこのプログラムは,確実にまちがいなく >実行されるぞ! 実行を試みたが100%実行確実のプログラムが実行されない >のが当り前な事だと思います。 何事も思い込みはダメですよ。 プログラムが動かなかったとしたら、どこかがまずいんです。 それが現実です。(^^;; >そして,今回もこの様な事で,私なりに精一杯,実行成功の確かめられている >ダウンロードした自動リンクプログラム(N.S.E2.75)の記事削除のルーチンと >自分の記述した同じ目的のルーチンを皿の様に確かめ続けた上での,質問です。 目で見ただけでは、結構見落としがあるものですよ。 現にgolygth.cgiの13行目からの数行にバグが2つもありますし... >if($man<10){$mon="0$mon";} >if($day<10){$day="0$day";} >if($hour<10){$hour="0$hour";} >if($min<10){$min="0$min";} >if($sec<10){$min="0$sec";} >$date ="$seirei年(平成$wareki年)$mon月$day日 $yobi曜日$hour時$min分$sec秒"; 目で見て確認する事(机上デバッグ)は大切なことですが、その後に実際に動かして 確認することも必ず必要です。 にあさんが以前投稿した記事「細かいデバッグをする時は...」を参考にして 要所要所で 変数の値がどうなっているか や 意図している処理に分岐しているか を 確認した方がよいでしょう。 #全部に目を通している暇がないのでこのくらいで許して下さい。 #あと、プログラムをWEB上におけるのなら、全部引用しないでリンクしてもらえば #事は足ります。 #というより、記事を見るにもプログラムを見るにもその方が助かりますので、 #そうして下さい。 #(*.cgiファイルに直接リンクしないで下さいね。実行されてしまって中身はみれませんので... # *.plとかに名前を変えてそちらにリンクして下さい。) #もちろん、引用しないと説明できないときは引用してもらって構いませんよ。 では。
いしどう です。 1月22日に、TADさんは書きました。 >1月22日に、三葉工房の管理者さんは書きました。 > >>perlの現実は,よく確かめたこれでこのプログラムは,確実にまちがいなく >>実行されるぞ! 実行を試みたが100%実行確実のプログラムが実行されない >>のが当り前な事だと思います。 > >何事も思い込みはダメですよ。 >プログラムが動かなかったとしたら、どこかがまずいんです。 >それが現実です。(^^;; そのとーりです(^^) まず、自分を信用してはいけません。他人のプログラムのアラ探しをする くらいのつもりで見直しましょう。 >>そして,今回もこの様な事で,私なりに精一杯,実行成功の確かめられている >>ダウンロードした自動リンクプログラム(N.S.E2.75)の記事削除のルーチンと >>自分の記述した同じ目的のルーチンを皿の様に確かめ続けた上での,質問です。 > >目で見ただけでは、結構見落としがあるものですよ。 >目で見て確認する事(机上デバッグ)は大切なことですが、その後に実際に動かして >確認することも必ず必要です。 >にあさんが以前投稿した記事「細かいデバッグをする時は...」を参考にして >要所要所で 変数の値がどうなっているか や 意図している処理に分岐しているか を >確認した方がよいでしょう。 出力を text/plain にする、という方法ですよね。 わたしが CGI のような画面出力ができないスクリプトでよくやるデバッグの 方法は、どこを実行しているのかやその時点での変数の値を、ファイルへ出力 する、という方法です。 たとえば、三葉工房さんのスクリプトであれば、うまく発言の削除が出来ない (ですよね?)ということなので、削除をする関数 &cutplay に以下のよ うに追加をして以前試した環境で実行してみました(赤い字のところが追加し た部分です)。 >open (CAT, ">$BaseDir/$in{'Cat'}") || die "ファイルが開きません!\n, >何処かの構文が間違っています!"; >foreach $ereize (@lines){ >@catchin=split(/&&/, $ereize); ># >open(DEBUG,">>$BaseDir/debug.txt"); >print DEBUG "$catchin[0]$catchin[2]$catchin[3]\n$in{'target'}\n\n"; >close DEBUG; ># >if("$catchin[0]$catchin[2]$catchin[3]" ne $in{'target'}) >{print CAT "$ereize";}} >close (CAT); んで、このばあいは$BaseDir/debug.txt と言うファイルに比較する2つ の文字列が記録されますんで、中身を見て下さい(三葉工房さんの場合 には FTP でそのファイルをひっぱってきてテキストエディタで見るとい いでしょう) …ほら、確かにおかしいでしょう? なんでおかしいか、はスクリプト全体を見ないとわかんないと思います が、削除できてない原因は突き止められると思います。 ――――――――― Perl で CGI スクリプトを作る入門書ですが、今日書店に立ち寄って ぱらぱらと眺めてみました。 数種類見た中では、技術評論社の「CGIのための実践Perl入門」がよ さそうでした。 三葉工房さんも、見てみて下さい。 がんばってください。
1月22日に、いしどうさんは書きました。 >Perl で CGI スクリプトを作る入門書ですが、今日書店に立ち寄って >ぱらぱらと眺めてみました。 >数種類見た中では、技術評論社の「CGIのための実践Perl入門」がよ >さそうでした。 チョット脇道ですが、一応一通りはperlを憶えた人が、もっと上を目指す時に有効な本で お勧めのものがありますか? > ALL あたしはこの頃めっきり不勉強になってしまって、perl何かも適当に書いていたのですが、 どうも最近それでは拙いなぁと感じるようになってきたので、本屋をチョット物色して見たのですが なかなかこれと言ったものがない。(^^;; そしたら、この間fj.comp.lang.perlで似たような話題が出ていて、 Effective Perl Programming: writing better programs with Perl Joseph N. Hall, with Randal L. Schwartz Addison-Wesley ISBN 0-201-41975-0 を薦める人が多かったです。 # で、本当ならここで読んだ感想などを書くと良いのでしょうが、 # 取りあえず買ったは良いけどまだツン読状態なので。(^^; 他にも色々お勧めの本などありましたら、ご紹介願います。> ALL
メッセージがコンパイルされてしまいましたので再投稿します。 TAD様,いしどう様アドバイスどうもありがどうございます。 何故,deleteがうまく行かなかったのか,一昨日,質問メッセージを投稿してから 寝床の上で色々と考えました。そして,昨日は,出かけていましたので,パソコン を立ち上げなかったので,今日そのあまり期待出来ない,念の為と言うデバック法 を実行してみました。 それは, sub cutplay{ print "Content-type: text/html\n\n"; print <<"ALPS"; <html><head><title>削除処理完了</title><meta http-equiv="refresh" content="5; url=$NEWURL "></head><body bgcolor=\"#ff0000\"> ALPS open (CAT, "$BaseDir/$in{'Cat'}") || die "ファイルが開きません!\n, 何処かの構文が間違っています!"; @lines = <CAT>; close (CAT); open (CAT, ">$BaseDir/$in{'Cat'}") || die "ファイルが開きません!\n, 何処かの構文が間違っています!"; foreach $ereize (@lines){ @catchin=split(/&&/, $ereize); if("$catchin[0]$catchin[2]$catchin[3]" ne "$in{'target'}") {print CAT "$ereize";} } close (CAT); print <<"ALPS"; <center><font color=\"#00ff00\" size=6><b>削除処理完了</b></font><p> <font color=\"#ffff00\" size=5><b>彼方のチェック為た記事を削除しました。</b></font><p><font color=\"aqua\" size=4><b>$in{'target'}</b></font><p><a href=\"golygth.cgi\"><font color=\"#ccffff\" size=5><b>掲示板へ戻る</b></font></a></center></body></html> ALPS exit;} と言うサブルーチン内の open (CAT, "$BaseDir/$in{'Cat'}") || die "ファイルが開きません!\n, 何処かの構文が間違っています!"; @lines = ; close (CAT); と言うファイルを開いて読み込む実行文の@linesをforeachでhtmlで出力させて, $in{'target'}の内容の文字列と@lineの中のその変数と一致する内容の文字列を MACPERLのテキストにコピーして,それらを比較して見ました。 その結果,日付の1999年(平成11年)01月22日 金曜日12時19分47秒が 日と曜日の間の間隔が1間隔,@linesから読み込んだ方が空いていると言う違いがあり, コンパイルしてみると,それが元で異なる文字列にされてしまう事も確かめられました。 つまり,$in{'target'}のは,@lineから読み込んだ原版の文字列が先ほどの間隔の 幅は,半角2つと$value =~ s/ / /g;の文字変換にマッチしてしまい,その結果, $in{'target'}の方の間隔が2間隔から1間隔に変換されて,その結果,デリートするにも 一致文字列が無くなってしまい,失敗した事が分かりました。 その$value =~ s/ / /g;を~ s/ / /g;とマッチ条件を空白半角3つに改良して,デリート を実行したら,今度は,チェックを入れた記事がどんどん消されて行きました。 よく考えて見ますと,今回の実行不正立はデバックに苦労しても仕方がなかったと思います。 思い込みだと,その原因はなかなか気付かない事と思います。 後,その掲示板は,あくまでもテスト用なので勝手に書き込みしたり勝手に消去してみても 構いません。 いしどう様の紹介して下さった「実践入門perl」ですが,実は,私がperlを始める際に,まず 購入した書籍です。後は,駱駝本を持っています。 やれば出来ます。 又,つまづいた点が見つかりましたら改めて宜しくお願い申し上げます。
初めまして。私も近々飛行機模型専門の掲示板を作ろうと考えています。 ところで、ダウンロードした会議室のPerlプログラムの解凍を、 マッキントッシュで行う場合、良いツールはあるのでしょうか? 知っておられる方がおられれば、教えて下さい。
1月24日に、石井さんは書きました。 >ところで、ダウンロードした会議室のPerlプログラムの解凍を、 >マッキントッシュで行う場合、良いツールはあるのでしょうか? 定番の"StuffIt Expander" + "DropStuff with Expander Enhancer" では いかがでしょうか? StuffIt Expanderだけだとダメですが、DropStuff w/EEが 入っていると、*.tar.gz の展開も可能です。
1月26日に、にあさんは書きました。 >定番の"StuffIt Expander" + "DropStuff with Expander Enhancer" では >いかがでしょうか? StuffIt Expanderだけだとダメですが、DropStuff w/EEが >入っていると、*.tar.gz の展開も可能です。 それで http://download.goo.ne.jp/mac/1/00059/1062.html からDropstuff w/EEをダウンロードしたら、問題なく解凍できました。 ご教示、有り難う御座いました。 ただテキストファイルの中身を見たら、アップルはアップルIIの頃から、 改行がCR+LFでないと改行しないという癖がありまして、多分、テキストファイルに 改行しかないのでしょう、改行のところが変な字に化けていました(T_T) で、エディタで直しました。
にあさんお久しぶりです。 最近、考えてるんですけど 他のサイトのホームページのデータを httpプロトコルで自由に見れるということは Perlでも他サイトのWeb上のHTMLファイルを 自動巡回して落とせるんじゃないかなぁって。 こんなことってできますか? たとえばファイル元指定で www.aichinet.ne.jp/index.html て指定したらそのファイルを 別サーバーからHTTP経由でPerlで ダウンロードする? なんてことできるんですか? できてもおかしくないですよね。 よろしくお願いします。
1月26日に、なおきさんは書きました。 >にあさんお久しぶりです。 >最近、考えてるんですけど >他のサイトのホームページのデータを >httpプロトコルで自由に見れるということは >Perlでも他サイトのWeb上のHTMLファイルを >自動巡回して落とせるんじゃないかなぁって。 >こんなことってできますか? >たとえばファイル元指定で >www.aichinet.ne.jp/index.html >て指定したらそのファイルを >別サーバーからHTTP経由でPerlで >ダウンロードする? >なんてことできるんですか? >できてもおかしくないですよね。 > >よろしくお願いします。 リンク張るのと同じような感じがしますけど(?_?)>ファイル元指定で webget等でGETできるでしょうが, 素直に自動巡回ツールを使った方が手っ取り早いような気がしますね・・・
三葉工房です。いつもお世話になっております。 実は,私の出した質問「perlの書き方の基礎を覚えた人がこれからもっと上のスクリプト の技術を目指す為の参考書とは?」 ですが,実は,以下のページを見つけました。 チャレンジCGI http://www2.tomato.ne.jp/~yubin/cgi/cgi.shtml と言うページですが,あらゆる種類のCGIスクリプトを提供している サイトを紹介しているページで,そこから私はFree CGIスクリプト http://www2s.biglobe.ne.jp/~yasuu/cgi.html 言うページに進み,掲示板をダウンロードした結果,記事数が多くなった場合に, 一定の定数で何ページかに区切るプログラムの作成法を覚えました。 後,BBSスクリプトの書き込みテストの為には,あらゆるホームページ情報が必要で, 色々なページを書き込んでいます。 そこで,その試験運用のBBS(参考ページ)に,にあ様のホームページのURLとメールアドレス を書き込んでよろしいでしょうか。 逆にそのBBSは,テスト用なので,勝手に記事を書き込み及び消去しても構いませんが。 それでは,スクリプトのレベルアップの為のページを見つけたり,テスト用のスクリプト の機能アップをした事をお知らせして,又,つまづいた事が思いつきましたらアクセスさせて いただこうと思います。
又,質問させていただく三葉工房です。 始めに,質問するには,どの位の間隔を置いて質問するのが望ましいのでしょうか。 実は,例のBBSスクリプトの開発で,ユーザーパスワードを利用しての記事削除のプログラム を作成していますが,配列の不都合な性格が災いして完成出来ません。 うちの機種はMACなので,MAC-PERLを利用しての,色々と配列の実行実験を行いましたが 完成に結び付く実行結果が出ませんでした。書きのが,その配列実験の簡易スクリプトです。 簡易スクリプト(配列の性質) $frag=0; $mart="muraei banner kojima sonic oacice colonbia kingdam hyogo serax kureeiji morisawa charenge notenki tohoho goichi odakyu mailmg"; $mart="^$mart*"; $mart=~s/ /\'\,\'/g; $mart=~s/\^/\(\'/g; $mart=~s/\*/\'\)/g; @mart=$mart; $ggh=@mart; @mart=@mart; $nr=@mart; $sd='mailmg'; @newmart=('muraei','banner','kojima','sonic','oacice','colonbia','kingdam','hyogo','serax','kureeiji','morisawa','charenge notenki','tohoho','goichi','odakyu','mailmg'); $dfr=@newmart; @fft=@newmart; if($sd eq $mart) { $frag=$frag+1;} $dhy=@fft; if($frag==0) {print "NO\n";} else{print "YES\n";} print "$dfrのはずが$gghの$nrの$dhy\n"; print "@mart\n"; ===================================================== というスクリプトで,@newmartの配列の内容は,例のBBSスクリプトの書き込みファイル のパスワードをサーバー実行でブラウザにforeachで出力されたのを 出力された時は,値(パスワード名)と値の間が半角スペースでしたが 配列らしくするために,文字変換して('値','値')として,それを簡易スクリプトの @newmartの配列の所にコピーしたと言う訳です。 その結果,配列の不都合ん結果が出ました。 その不都合な結果とは,@newmartの場合は,スクリプトに配列の内容が生で記述されて いるので,$dfr=@newmartと言う形で,$dfrの値は,しっかり配列の値の合計値の16と 出力され,その配列を更に@fft=@newmartと言う記述で@fftに代入して,$dhy=@fft;で $dhyの値もそっくり配列の値の合計値の16と出力されました。 ですが,一度もスクリプトに配列の内容が('値','値')と言う形で記述されてなく $mart="muraei banner kojima sonic oacice colonbia kingdam hyogo serax kureeiji morisawa charenge notenki tohoho goichi odakyu mailmg"; $mart="^$mart*"; $mart=~s/ /\'\,\'/g; $mart=~s/\^/\(\'/g; $mart=~s/\*/\'\)/g; @mart=$mart; という書き方の様に$martの変換前の状態を文字変換タグで配列の('値','値')に変換して, 変数のみで配列に代入するだけだと,$ggh=@martと言う形で配列の合計値を算出すると 値は1で,@mart=@mart,$nr=@martとしても$nrの値は1で,スクリプトの終わりの方の print "$dfrのはずが$gghの$nrの$dhy\n"の出力結果は 16のはずが1の1の16 と出てしまいます。 書き込みファイルの内容をいちいち手書きで,配列構文で記述するのでは, 自動処理が特徴のCGIとしての意味を持ちません。 そして,本題の実行スクリプトの話しに移ります。 上記の様に書き込みファイルのパスワードをforeachで出力させてみましたが foreach $keymatch(@keymatch){ ($mail,$yourname,$date,$gurl,$hpagename,$coment,$password)=split(/&&/, $keymatch); if($in{'pawin'} eq $password){ $keyflag=$keyflag+1; last;}} だと,ファイルの最下段の記事のパスワード名(mailmg)しか出力せずに,そのパスワード 名の以外のパスワードは,一致しません。 詳しくは,BBSスクリプトの変更.削除で,パスワード入れてサブミットした,(パスワード が一致しません)のページに,$passwordの内容を foreach $keymatch(@keymatch){ ($mail,$yourname,$date,$gurl,$hpagename,$coment,$password)=split(/&&/, $keymatch); print "$password"; }でプリントアウトしています。foreachで直接プリントアウトすれば,$passwordで 全て出力されますが,それ以外の方法,例えば$passwordを@***に代入したりすると @***は,(mailmg)しか出力しません。 その様に,ユーザーパスワードを利用しての削除.変更を行うには,どうしても $in{'pawin'}($in{'pawin'}は,変更.削除のページのパスワードを入れる記入項目 から受け取った値)と$passwordの全ての値と一致させなければそれは出来ません。 どの様にすれば,$in{'pawin'}と$passwordの全ての値と一致される事が出来るのか どうかアドバイス願います。 後,if((fg == hy)&&(gh<55))とif((fg =hy)の意味はどう言う意味なのでしょうか。 後,今回から参考のURLには,問題のBBSスクリプトの実行されないソース文が出力 されるページを代入しています。そして,スクリプトの実行されたページは 進性能掲示板 から入れます。 度々だすみませんが御忙しい中大変恐縮ですがどうか宜しくお願いします。
いしどう@会社です。 三葉工房の管理者さんには不都合かもしれませんが、その他の大多数の人にとってはそうではない ので題名を変えました 文字列を配列へ振り分けるには、Perl の内蔵関数であるところの split を使用すればいいと思います。 具体的な方法は、書籍をご参照ください。
# いつもいつも「詩的な」題名には楽しませていただいているのですが、 # もう少し記事の内容が分かるようなものを付けられたほうがよろしいかと ## といいつつ、適当な題名が思い浮かばないのでそのままです(__) まず諺をひとつ: 「プログラムは、設計されたとおりではなく、書かれたとおりに動く。」 2月2日に、三葉工房の管理者さんは書きました。 >始めに,質問するには,どの位の間隔を置いて質問するのが望ましいのでしょうか。 いくら(マニュアルや本やWebなども利用して)調べてみても分からず、どうしても 質問しなければならなくなるごとに、でしょう:-) > 実は,例のBBSスクリプトの開発で,ユーザーパスワードを利用しての記事削除のプログラム >を作成していますが,配列の不都合な性格が災いして完成出来ません。 もちろん、これは「あなたにとって」不都合「に映る」というだけですよね。 # あらゆる問題に全て対応できる解決策は存在しません >簡易スクリプト(配列の性質) martとかgghとかsdとかdfrとかは何か意味のある単語や略語なんでしょうか。 何のための変数なのか、もっと分かりやすい名前を付けたほうが読みやすいし、 保守やデバッグが楽じゃないかと思うのですが…。 >print "$dfrのはずが$gghの$nrの$dhy\n"; というのをぱっと見て、どういう情報を出力しようとしているのか分かりますか? それと、ブロック("{" と "}" で囲まれた部分)などは sub hoge { if ($foo == $bar) { &baz(q{I said, "You said, 'She said it.'"}); } else { &zot('abc', 'def', 'xyz', $something[$foo + $bar] / $anythong{$qux . $quux}); } @sorted_array = sort { $a <=> $b } @array if $todo{'sort'}; } のように字下げして書くことを強くお勧めします。ブロックの中を全く字下げ していないと、プログラムの制御構造の流れが追いにくく、とても読みにくいです。 # 少なくとも、前に投稿された例えば「徹底的な…」などのスクリプトを # 目にしたときは、ぱっと見ではどこからどこまでがひとつのサブルーチン # なのかすらさっぱり分からず(今でもあまり把握していませんが)、読む気も # しませんでした ラクダ本の第2版(背表紙の青いほう)をお持ちなら、いちど「8.4 プログラミングの 書法」(pp.626-)あたりに目を通してみてください。 初版(背表紙の赤いほう)にも同じような内容があったはずですが、いま手許に 無いので何処に載っていたかはわかりません。 >いるので,$dfr=@newmartと言う形で,$dfrの値は,しっかり配列の値の合計値の16と >出力され,その配列を更に@fft=@newmartと言う記述で@fftに代入して,$dhy=@fft;で 16は「配列の値の合計値」ではなく、単に配列の要素の数ですね。 # 三葉工房の管理者さんにとってはそういう意味なのかも知れませんが、 # 少なくともプログラミング上の一般的な用語としては、両者は違うものを # 意味します # ちなみに、何故「17」ではなく「16」なのか理解してます? >という書き方の様に$martの変換前の状態を文字変換タグで配列の('値','値')に変換して, >変数のみで配列に代入するだけだと,$ggh=@martと言う形で配列の合計値を算出すると >値は1で,@mart=@mart,$nr=@martとしても$nrの値は1で,スクリプトの終わりの方の いくら文字列としてリスト(配列)に見えるように加工しても、依然として それは単なる文字列にすぎないからです。 # @array = $scalar という式が一体どういうことをやっているのか、 # よ〜く考えてみてください # @array = (123, 456, 789); # $scalar = @array; # @array = $scalar; # $scalar = @array; # とすると @array と $scalar の内容はそれぞれどうなるのか、それは何故なのか、 # よ〜く考えてみてください 同様に、 $program = "print 1 + 2;\n"; $program; print $program; は、3 とは表示せずに print 1 + 2; とだけ表示します。「プログラムっぽく 見えるもの」は、必ずしも「プログラム」ではありません。 # しかし、eval($program); は 3 と表示します # 何故なのかはマニュアルや本やWebをどうぞ では、どうやって文字列を配列に変換すればいいかは、いしどうさんの投稿を 参照してください(そしてマニュアルや本やWebを探してください)。 >foreach $keymatch(@keymatch){ >($mail,$yourname,$date,$gurl,$hpagename,$coment,$password)=split(/&&/, $keymatch); > >if($in{'pawin'} eq $password){ >$keyflag=$keyflag+1; >last;}} >だと,ファイルの最下段の記事のパスワード名(mailmg)しか出力せずに,そのパスワード >名の以外のパスワードは,一致しません。 # これだけだと、例えば @keymatch に何が入っているのか、もとのスクリプトを # 読まなければ分かりません。必要に応じてそれなりに説明を加えてください 「出力」というのは、何がどう「出力」されるのですか? 引用された部分には「パスワード名」の「出力」と呼べるような処理は含まれて いないようですが。 $keyflagの値が増えていたら「出力」されたことになるということでしょうか。 >}でプリントアウトしています。foreachで直接プリントアウトすれば,$passwordで >全て出力されますが,それ以外の方法,例えば$passwordを@***に代入したりすると >@***は,(mailmg)しか出力しません。 どういうふうに「代入」したのですか? @array = $password; なら、最終的に @array に入っているのは当然ひとつの要素だけでしょう。 代わりにpushなどを使ってください。詳細はマニュアルや本やWebを見てくださいね。 >その様に,ユーザーパスワードを利用しての削除.変更を行うには,どうしても >$in{'pawin'}($in{'pawin'}は,変更.削除のページのパスワードを入れる記入項目 >から受け取った値)と$passwordの全ての値と一致させなければそれは出来ません。 何故? $passwordの値は @keymatch の各要素(つまりはファイルの各行)に応じて変化 するのではないのですか? もしかしたら「一致」とは「比較」のことかも知れませんが、「全ての値」との 「比較」は(foreachループを使って)なされていますよね…。 # そもそも、目的の記事を「パスワード」をキーにして探すという仕様自体が # とても不自然に感じるのですが… >後,if((fg == hy)&&(gh<55))とif((fg =hy)の意味はどう言う意味なのでしょうか。 この質問の意味はどう言う意味なのでしょうか。 何が聞きたいのか、この文を読んだだけではさっぱり分かりません。 だいたい if((fg =hy) なんて中途半端な破片(括弧すら対応していない)だけを ぶった切って引用されても困ってしまうのですが。 質問というものは、他人が読んで理解できるように書かなければ、誰も答える ことができません。三葉工房の管理者さんに限ったことではありませんが、 「答えてもらいやすい質問をしてください。」 質問記事の読みやすさは、プログラムの読みやすさより数倍重要です:-) <PostScript> #606はPOSTの途中で切れてしまったようです。 投稿完了のページも確認できず、キャンセルコードも分からないので お手数ですが削除しておいてください(__)>にあさん </PostScript>
先程の三葉工房ですが,ユーザーパスワードのマッチング方法は,とても難しく 今だに謎に包まれたままです。 その難しくなる原因とは,foreachやfor等の好き嫌いな部分がある点です。 それらのループ関数は,print関数は,気に入っていますが,ifと言う条件指定 関数は気に入ってないようです。 ですから, $frag=0; $mart="muraei banner kojima sonic oacice colonbia kingdam hyogo serax kureeiji morisawa charenge notenki tohoho goichi odakyu mailmg"; @mart=$mart; @fft=@newmart; if($sd eq $mart) { $frag=$frag+1;} $dhy=@fft; if($frag==0) {print "NO\n";} else{print "YES\n";} foreach $df(@mart){ @fgh=split(/ /, $df); for($i=0;$i<10;$i++){ { print "奇蹟的とは言え,\$fgh[$i]の中味は$fgh[$i]で無い。\n";} } } の様な構文で,$fgh[$i]の内容が全て一括出力出来ますが,その結果を 条件指定には生かす事は出来ません。 つまり,for文の中のprint文を if(banner eq $fgh[$i])としても,条件指定の場合,同一のループ条件とは いえども$fgh[$i]は配列の全てにマッチせずに,配列の最初か最後の値のみか 空白にマッチしてしまいます。 そのループの性質に伴い,ユーザーパスワードのマッチングのプログラミングは おのずと非常に困難になります。 そのようにその壁を乗り越えるのは至難の業であるとは,言え身を粉にしてでも 自分の力で思い当たる苦労を味わうべきでは,ないかなと思います。 孤独こそ,自分の為だ! それでは,又 失礼します。
三葉工房さんは、いしどうさんやYasu.Fさんのアドバイスをどう捉えたのでしょうか? おふたりのアドバイスを全く聞いていない(読んでいない)ように思えるのですが... 理解できなかったのなら、どこがどうわからなかったのかさらに質問してはどうですか? そうしないとせっかくのアドバイスが無駄になってしまいますよね。 質問に対して回答をもらったなら、わかったのかわからなかったのか、 その回答に対して何か反応をした方が良いのではないでしょうか。 2月3日に、三葉工房の管理者さんは書きました。 >先程の三葉工房ですが,ユーザーパスワードのマッチング方法は,とても難しく >今だに謎に包まれたままです。 > >その難しくなる原因とは,foreachやfor等の好き嫌いな部分がある点です。 「foreachやfor等が好き嫌いをして」三葉工房さんの思うとおりに動いてくれない ということですか? そんなことある筈ないじゃないですか。 あくまでも 「プログラムは、設計されたとおりではなく、書かれたとおりに動く。」by Yasu.Fさん です。 ひとつ例を挙げると、 >$frag=0; >$mart="muraei banner kojima sonic oacice colonbia kingdam hyogo serax kureeiji morisawa charenge >notenki tohoho goichi odakyu mailmg"; > >@mart=$mart; この @mart=$mart; は何をしてるかわかりますか? $martのスカラー変数に入っている文字列を@martの配列の1番目(添え字は0番)に入れてるだけですよ。 勝手に「配列へ順番に格納してくれる」と思いこんでませんか? もしそういうことがしたいのであれば 「文字列を配列へ振り分けるには、Perl の内蔵関数であるところの split を使用すればいいと思います。」by いしどうさん ということです。 例えば、 $mart = "muraei banner kojima sonic oacice colonbia kingdam hyogo serax kureeiji morisawa charenge notenki tohoho goichi odakyu mailmg"; @mart = split(" ",$mart); このようにすれば、$mart変数の中の文字列が空白で分割されて、@mart配列の0番から16番に 格納できます。 これがやりたかったんですよね。 このことからも判る通り、三葉工房さんはまだ perl を正確に理解していないようですから もう一度参考書を読み直し、プログラムの1行1行が何をしているかを再確認した方が 良いと思いますよ。 それが判らないのに「ちゃんと動くものを作ろう」というのは無理な話です。 まずはいきなりプログラムを作るのではなく、焦らずに勉強し直しましょう。
今度は,全く別の質問です。 色々と,謙虚ない投稿ばかりで済みません。 実は,私もMACで,にあ様の会議室スクリプトをダウンロード させていただきました。 ちょうど,石井さんと言う方が,MACでの解凍方法の質問を 投稿していまして,私も,Drop StuffのWeeの名称の付いた 圧縮ファイルをダウンロード解凍してDrop Stuffで,その スクリプトの圧縮ファイル(tar,gzの拡張子)を一度それで 冷凍して,解凍しましたが同じダウンロードした時の圧縮 ファイルが戻って来ただけで,結局解凍出来ませんでした。 更に,stuff Expanderの4.5をダウンロードして,解凍を 試みましたが駄目でした。 Drop Stuffは,冷凍専用のソフトですよね。 そして,tarのMAC用のアーカイブソフトを探しましたが, 見つけられません。 Win系に比べてMAC系のソフトが遥かに少ない現状がとても残念 で成りません。 ところで,Drop Stuffのソフトで,その会議室スクリプトをどのように 利用して解凍したのでしょうか。 後,にあ様に1つお願いがございます。 私の所で,解凍可能な方式は,LHZとZIPとBin HEXです。 出来るならば,その方式でのダウンロード設定をお願い出来ませんでしょうか。 どうか宜しくお願いします。