自作CGIを評価するスレ
自分の作ったCGIをみんなに評価してもらうスレだよ。言語は問わないよ。 よほどプログラムが短くないかぎりはアプロダにでもアップしてね。 ソース貼り用掲示板 http://do.sakura.ne.jp/ ~junkroom/cgi-bin/megabbs/lounge/index.html あぷろだはどこ使うよ? CGI版のPHPならOKてことだな>>4 Cで書くCGIスレも統合するか、ゴミだし。 >>5 モジュール版のPHPについて聞いたことぐらい気づけ。 >>9 あーなるほど、スマン。 っつーかそれもアリに決まってるじゃねーかよーヽ(TДT)ノ もうちょいスコープとか意識したほうがいいんじゃない? 殆どグローバル変数・・・ ・どっかからコピーした部分以外で使われる変数が全てグローバル ・関数名から内容が想像できない(re,fot,ur,re2,wr2lok,co.gc等 sub ge {} は結構引いた) ・スタイルに一貫性がない ・$FORMの扱いがキモイ ・symlinkロックしてるが解除はどこでやってんだ? >>14 5番目訂正しとく。 ・symlinkロックしてないから解除はやらなくてもいいんだけどロックしないってことか。 sub lok{ if($lock == 0){return;} local($wait) = 4; while (!symlink(".", $lock)) { if ($wait-- <= 0) { &error("$(B%m%C%/%U%!%$%k$,B8:_$7$F$^$9!#(B"); } sleep 1; } } $ grep '$lock' ch/* ch/sub.cgi: if($lock == 0){return;} ch/sub.cgi: while (!symlink(".", $lock)) { これじゃあ$lockは常に0だよ・・・ まあ$lockに値を入れたところで解除できんから1回しか書き込めんのだけどね。 tail -f /var/log/httpd/accesslog 見たけど誰もアクセスして来ないや。 皆臆病者だね。 お前がきもいから人気無いだけだろ。とんだ勘違い野郎だな。 よかったら批判ください。 もうちょいコード直してから、URL晒します。 批判以外もらってもどうしようもない.. ほめてもらったら何も意味がないっす。 >>17 ソース見たらDOCTYPEがXHTMLだったけどぱっと見ても明らかに間違えまくってたのでチェックしてみた。 チェックの結果は以下のとおりです。 http://oasis.minidns.net/ を XHTML1.0 Transitional としてチェックしました。 19個のエラーがありました。このHTMLは 4点です。タグが 9種類 14組使われています。文字コードは Shift JIS のようです。 先頭の数字はエラーのおおまかな重要度を 0〜9 で示しています(減点数ではありません)。少ない数字は軽く、9 になるほど致命的です。0 は減点対象外のごく軽度のエラーで (グレイのかっこつき) でメッセージされています。 9: line 1: このXML宣言は正しくありません。 → 解説 23 6: line 5: <html> には xmlns 属性が必要です。 → 解説 86 2: line 5: <html> には lang 属性を指定するようにしましょう。 → 解説 116 2: line 5: <html> には xml:lang 属性を指定するようにしましょう。 → 解説 116 0: line 6: (<head>〜</head> 内に <link rev="made" href="mailto:〜" /> が含まれていません。) → 解説 121 0: line 6: (<head>〜</head> 内に <link rel="next" href="〜" /> などのナヴィゲーション用のリンクが含まれていません。) → 解説 122 1: line 6: <p> と </p> の間が空です。 → 解説 51 1: line 6: <body> での色指定が不完全です。text 属性も含めるようにしましょう。 → 解説 149 0: line 7: (<input type="text"> には tabindex 属性を指定するようにしましょう。) → 解説 166 0: line 7: (<input type="file"> には tabindex 属性を指定するようにしましょう。) → 解説 166 1: line 7: <input type="text"> には value 属性で初期値となるテキストを指定しておきましょう。 → 解説 160 0: line 7: (<input type="text"> には tabindex 属性を指定するようにしましょう。) → 解説 166 0: line 7: (<input type="submit"> には tabindex 属性を指定するようにしましょう。) → 解説 166 1: line 7: <input type="text"> には value 属性で初期値となるテキストを指定しておきましょう。 → 解説 160 0: line 7: (<input> には accesskey 属性を指定するようにしましょう。) → 解説 167 0: line 7: (<input> には accesskey 属性を指定するようにしましょう。) → 解説 167 0: line 7: (<input> には accesskey 属性を指定するようにしましょう。) → 解説 167 0: line 7: (<input> には accesskey 属性を指定するようにしましょう。) → 解説 167 9: line 7: </html> の後にまだ何かテキストがあります。 → 解説 231 HTMLがDOCTYPE無し、気分によって大文字小文字が混じっている のはNGですか? あ、ゴメン。エラーのせいで最後の方が減点食らってるのね。 本来のドキュメント(最初の</html>まで)でチェックしてみた。 XHTML1.0 Transitional としてチェックしました。 19個のエラーがありました。このHTMLは 8点です。タグが 9種類 14組使われています。 先頭の数字はエラーのおおまかな重要度を 0〜9 で示しています(減点数ではありません)。少ない数字は軽く、9 になるほど致命的です。0 は減点対象外のごく軽度のエラーで (グレイのかっこつき) でメッセージされています。 9: line 1: このXML宣言は正しくありません。 → 解説 23 6: line 5: <html> には xmlns 属性が必要です。 → 解説 86 2: line 5: <html> には lang 属性を指定するようにしましょう。 → 解説 116 (以下略) >>27 別にいいんじゃねぇの?>>17 は自信作らしいから突っ込まれてるだけで。 ほう、今自分で見ててすでに数箇所突っ込みどころがあったよ。 もう少し。 >>31 ややこしいぞw じゃあPHPじゃないのか? ______________ /:\.____\ |: ̄\(∩´∀`) \ <先生!こんなのがありました! |:在 |: ̄ ̄ U ̄:| http://saitama.gasuki.com/aomori/ >>37 Perlの文法的な間違いはないみたいだけど、処理がいまいちな部分が 散見される。 効率を考えればもうちょい工夫したほうがいいだろう。 意見どうも。 もっとアルゴリズムを勉強しれってことですね? ・myが気になる。 ・一行書き出すのにヒアドキュメント使うのは何故? ・かと思えばqq連発で使ってたり… ・1.入力 2.処理 3.出力 という風に処理を分けよう ・自作自演防止はハッシュとかじゃ駄目なのかい? ・FORMの処理が2回書いてあったりして無駄 ・HEADリクエストは面白いね。 かなり恥ずかしいのですが、他人の意見を一度でも聞いてみたくて… http://kabocha.org/jelfe/ ↑のサイトの http://kabocha.org/jelfe/cgi/ybbs.html ↑のページに 山口_BBS2.00b1 ↑って言う私のCGIがあるのですが、いかがな物でしょうか。 ただし「携帯のEZ専用」なので皆様の中には意味を理解しかねる出力があるかもしれません。 ああ、ついに2ちゃんねるに晒してしまったよ… 冷静に考えると恥ずかしいけど…、プロの方(?)に見てもらいたい気持ちが上のようだ…。 変なところあったらけなしてくれてもけっこうです、むしろけなして下さい。 myもいいんだけど、実質グローバルと同じだな。 処理毎に{ }で囲んで使わなきゃ意味ないだろ。 ご意見どうも。 >・一行書き出すのにヒアドキュメント使うのは何故? エディタで折り返すのが気になるので.. >・かと思えばqq連発で使ってたり… Emacsなので、ヒアドキュメントだと表示する特殊によって 自動のタブがおかしくなるのです.. 全部個人的なことですね..修正します。 myに関しては、ちょっと調べてみます。 その他の意見に関しても、もう一度よく考え直してみます。 >>43 cperl-mode使ってる? myは変数のスコープを局所範囲に閉じ込めるためのもので、 mainパッケージでmy使ってもmainパッケージ全体から読み書きできてしまうので いやーんな感じ >>41 2193行目 $error_name = @_[0]; → $error_name = $_[0];でいいだろ あちこちの変数、もうちょっとスコープを考えてレキシカルに するとかしたほうがいい。 問題ないけど、読み取りopenに < をつけたりつけなかったりなどしてるのを 書き方統一したら? 他の部分なんかでも統一させる書き方をくせにしたほうが可読性良くなるし。 吐いてるhdmlはすぐにテストできないから見ていない。 >>45 サン Emacsは、普通にそのまま.plとして読んだ感じで使ってます.. mainで、my使うと、別の関数から書きかえれないのでは? それは意味ないのでしょうか? もしかして、mainで書いた関数は、mainに含まれますか..汗 勝手に、関数を覗いた部分がmail{}となるのかと思ってました。 >>47 >mainで、my使うと、別の関数から書きかえれないのでは? 「別の関数」が良く分からんが、mainパッケージに属している関数では my $a = 1; print $a,"\n"; &routine; print $a,"\n"; sub routine {$a = 3;} $ perl hoge.pl 1 3 となる。 #!/usr/bin/perl require "hage.pl"; my $a = 1; print $a,"\n"; &hage::routine; print $a,"\n"; # ↓はhage.pl #!/usr/bin/perl package hage; sub routine {$a = 3;} 1; では、 $ perl hoge.pl 1 1 となる(安全 >>48 main関数なんてもんはない。 mainパッケージ。この辺はちゃんと勉強した方が良かれと思われる。 >>46 御意見ありがとう御座います。 こんなに早く返って来るなんて…。感激です。 …と言うより、私の記述が雑なので簡単に変な所が見つかってるだけなのだろうか。複雑な気分…汗 もし、ヒマな方がいらっしゃいましたらまだまだ御意見をたくさんお聞かせ下さい。 >>53 Name "main::get_time_yday_2" used only once: possible typo at H:\Work\山口BBS200b1\ybbs.cgi line 2336. Name "main::get_time_isdst_3" used only once: possible typo at H:\Work\山口BBS200b1\ybbs.cgi line 2339. Name "main::get_time_isdst_2" used only once: possible typo at H:\Work\山口BBS200b1\ybbs.cgi line 2336. Name "main::get_time_wday_3" used only once: possible typo at H:\Work\山口BBS200b1\ybbs.cgi line 2339. Name "main::mail_jcph" used only once: possible typo at H:\Work\山口BBS200b1\ybbs.cgi line 2071. Name "main::get_time_yday" used only once: possible typo at H:\Work\山口BBS200b1\ybbs.cgi line 2333. Name "main::get_time_sec_3" used only once: possible typo at H:\Work\山口BBS200b1\ybbs.cgi line 2338. Name "main::get_time_wday_2" used only once: possible typo at H:\Work\山口BBS200b1\ybbs.cgi line 2336. Name "main::get_time_sec" used only once: possible typo at H:\Work\山口BBS200b1\ybbs.cgi line 2332. Name "main::get_time_wday" used only once: possible typo at H:\Work\山口BBS200b1\ybbs.cgi line 2333. Name "main::get_time_isdst" used only once: possible typo at H:\Work\山口BBS200b1\ybbs.cgi line 2333. Name "main::get_time_sec_2" used only once: possible typo at H:\Work\山口BBS200b1\ybbs.cgi line 2335. Name "main::main_user_agent" used only once: possible typo at H:\Work\山口BBS200b1\ybbs.cgi line 434. Name "main::get_time_yday_3" used only once: possible typo at H:\Work\山口BBS200b1\ybbs.cgi line 2339. >>55 まあtypoじゃないみたいだけどね。 ・2350行目〜sprintfですっきりと 他人が書いたソースって見てると面白いもんだねぇ・・・ つーか、でかっ 10KB超えるCGIなんて作ったこと無い・・・。 ・receive_error ifはいるのか? ・localの意味が分からないならmyを使おう ・クラックを気にするならcryptを使おう ・684行目はどういう意味? ・=はエスケープしなくていいよ ・PCと携帯を同時に扱うなら、途中までは両者に依存しない処理にしておいて 最後の最後いざ出力するという時に振り分けると綺麗になるよ ・最初(〜300行目)のqqはなんだ? まぁあとは4氏にも共通するけど、インデントがおかしいのと 記述に一貫性がないのが気になるね。 サブルーチンがそこそこ見られるのは良いと思う(ただ、もう少しstrictに書こう) これは個人的な趣味だけど、俺はグローバルなオプションはハッシュにする。 %option =(board_name => "hoge", max_mes => 50 ); みたいに。 >>61 なるほど。 今までファイルから読んだ設定なんかはハッシュにしてましたが、 CGIだと初心者設置者が混乱するかと思って、できるだけ 見た目で分かりそうにしたつもりでしたが、ハッシュのがイカス。 あと、自分的趣味をいうと、subの変数はことごとく局所変数にするほうがいいと思うなぁ sub ayaya{ my $num = shift; $num++; return($num); } みたいな形でやっとくほうが誤動作しにくい。 >>54-60 もう早こんなに…!ありがとう御座います。 最初はなんか晒すの恥ずかしいと思ってたけど、晒して良かったなぁ…(嬉 >>55-56 はい、タイムの所めちゃくちゃです。自分でもここは直さねば!と思ってました。 ありがたく直させてもらいます。 >>57 そうですか。私のレベルだと他人の記述は自分と進めかたが違うので見てると疲れてしまいます。 そんな私はperlしかできず、初めて1年くらいになります。面白いと言って頂けて幸いです。 >>58 >・receive_error ifはいるのか? はい、これは利用者のかたが「0」と設定した場合、 バイト数無制限にするため、判定にかけません。 >・localの意味が分からないならmyを使おう ごもっともです。言われてみると私もlocalの意味が分かりません。汗 >・クラックを気にするならcryptを使おう cryptって分からないので調べてみますね。今は取り敢えず返事を急いでます。 >・684行目はどういう意味? これは、携帯用なのでパケ代の節約です。 &nbsp;だと半角20文字で改行と同じになります。(多くの携帯は横が半角20文字) で、携帯はパケ代(受信料)が深刻なので、 &nbsp;20コ。つまり120バイトを<BR>とし、4バイトに抑えます。 これで受信料は1/30になります。相手が携帯ならではの記述です。 >・=はエスケープしなくていいよ はい。 >・PCと携帯を同時に扱うなら、途中までは両者に依存しない処理にしておいて > 最後の最後いざ出力するという時に振り分けると綺麗になるよ ついつい手抜きでガーッとコピーしてしまいました。汗 localは宣言した{}内から読んだ関数内からでも参照できる。かな.. $cry = crypt('passwd', 'sl'); で、DESというので暗号化します。slはsaltで2byteとります。 暗号化されてた文字列(13byte)の先頭2byteに入りますから、 パスワードを検査するときに、同じsaltでもう一度暗号化して、 暗号済みのものと同じになれば同じパスワードです。 ん、いい説明探したほうが早いか.. ハッシュを普通の変数のように使うのってだめですか? >>66 駄目ではない、用途によって使い分ける事が重要 #○ログファイル $def_log_file = q[./log.txt]; これは納得できるが #○一度に表示されるレスの件数。 #[3〜6]推奨。多く設定すると端末側で読み込めない場合があります。 $def_mess_page = qq[5]; こっちをダブルクオートで囲むのはなぜ? 数値をクオートで囲まれると変な気がする… myは本当は局所的に使うためなのはしってるんだけど どうしてもその前後で値が必要になったりすることが多いので サブルーチンなら先頭に全部まとめて書いてる・・・ >>70 余りいい設計じゃないなぁ・・・ subは位置に依存しないものであるべき >>61 >・最初(〜300行目)のqqはなんだ? qq自体の意味でしょうか…?qならシングルクウォートでqqならダブルです。 入力は、ご使用していただく方に任意で入力してもらいます。量が多くてめんどうな気がしますけど…。 >インデントがおかしいのと >記述に一貫性がないのが気になるね。 つまり見にくいと…。私の中では今までで1番気をつけた記述だったりしますが… 頑張ります。 サブルーチンがそこそこ見られるのは良いと思う(ただ、もう少しstrictに書こう) strictってなんだろう、汗。調べてみます。 >これは個人的な趣味だけど、俺はグローバルなオプションはハッシュにする。 >%option =(board_name => "hoge", max_mes => 50 ); みたいに。 そうですか、私はこの記述で 「グローバルな変数の先頭にmain」をつけ、 「ルーチンのみの変数の先頭にルーチン名」を付けたのですが、 名前が長くなりすぎて失敗してしまいました。 >>65 どうもです。 もしかしたら、返事を飛ばしてしまった方が居るかもしれませんがすみません。 明日からでも記述の整理をしたいと思います。 まだまだなにかありましたら、お願いします。ヒマな方は眺めてやって下さい。 当たり前ですが、全部読んで参項にさせてもらってます。 >>69 はい、これで行きます、トリップ。 >>68 もし、 #○一度に表示されるレスの件数。 #[3〜6]推奨。多く設定すると端末側で読み込めない場合があります。 $def_mess_page = 5; とした場合、どこに入力したら良いか目で確認しにくいかと思いまして…。 数字なのでシングルではなく、ダブルで囲んでます。 なんて言うのか、入力する場所を [ここ]; にしたら始めて設置する人でも分かりやすいと考えた結果こうなりました。 >>73 んー基本的なことを言わせてもらうと・・・ コメントでちゃんと書いとけば理解してもらえる範囲じゃないかと思うけどね・・・ それでわからないっていうのは相手する必要が無いような・・・(ぉ >>71 激しく意味不明なやつになっちまったけど sub saitama{ my ($value,$saitama,$hoge); foreach $value (@_){ ($saitama,$hoge) = split(/,/,$value); if($saitama == $hoge){ return 1; } } return 0; } こんなやつもだめ?ってこと って言うか最近多い「4」って香具師は「4番」ではなく、コテハン? 普通に紛らわしい。なんとかしてほしい。 このスレタイっておかしくない? × 自作CGIを評価するスレ ○ 自作CGIを評価してもらえるスレ ○ 自作CGIを評価していただくスレ じゃない? >>75 sub saitama{ my $ret = 0; foreach my $value (@_){ my ($saitama,$hoge) = split(/,/,$value); if($saitama == $hoge){ $ret = 1; last; } } return $ret; } 私ならこう書くかな まぁ意識しろって言われたら 漏れならこう書くんだけど sub saitama{ foreach my $value (@_){ my ($saitama,$hoge) = split(/,/,$value); if($saitama == $hoge){ return 1; } } return 0; } 78のコードと比べるとどっちのほうが 好まれるのかい?まぁ下らんと言えば下らないのだが・・・ >>73 use strict 使ってみたら? まぁ、書き捨てにするか後から見やすく書くかのレベルになる罠(w >>66 普通の変数も無名ハッシュっていう位置づけじゃなかったっけ? >>76 非常にすみません。 Perlの極意スレの4番です。 もう沈んでどこかに行ったスレです。 なんとなくそのまま4でした、改名します、37です。 >>79 漏れは 何回も使う関数的なやつは結構まともに書いてるけど 本体が長くなるからただ分けただけのサブルーチン的なものだと かなりだらしないわ。 一応strictなコードでmod_perlで動いてる 「出口は一つ」をかたくなに守るのは「gotoを意地でも使わない」と同様に愚行だ。 エラー処理でも if (真) { if (真) { if (真) { # 何か処理 } else { $ret = 0; } } else { $ret = 0; } } else { $ret = 0; } より if (偽) {return 0;} if (偽) {return 0;} if (偽) {return 0;} # 何か処理 の方が圧倒的に見やすいだろう。だから俺は>>79 だな。 「エラー処理を先にやれ」っていう格言をどっかで見た。 それ以上続けるのが無意味と分かっている場合に だらだらと引きずるのは良くない。すぱっとreturnすべき。 >>84 まぁ、別に好きなように書けばいいんだけど、 グローバル変数の値をサブルーチンから出力することもあるし・・・ それ以前に、どのレベルで言ってるかつーのが気になる所かもなぁ ちなみにgotoは使わないよ。必要ないから(w >>84 なるほど、私は上のほうの書き方しますね.. やはり、コードが見やすいというのもプログラムの重要な要素に はいるのでしょうか? >>84 それ書くなら if(真 && 真 && 真){何か}else{return 0;} だろうなぁ… まぁ趣味でやってるプログラミングなんで 動いたら嬉しいって程度なんだが(w >>83 関数だと割ときれいに書くな 漏れも >>87 習慣づけしとけばスパゲッティなソースにはなりにくいのが作れると思うけどねん returnは複数付けるのが一般的らしいな、覚えとこう >>37 貴殿のソースをみたんですが 653-669行・・・ これなんすか?(w >>89 さん そのためには1度しか使わない処理でも無駄にサブルーチン作って、 見やすくすることも必要でしょうか? 趣味で作るので、自分以外がソース読むことが無かったため とりあえず、自分が読めれば気にしなかったのですが。 >>90 エラー処理ですが、 if () { えらー1} if () { えらー2} if () { error } としたほうがいいですかね? >>91 慣れてない時は単純な処理にでもサブルーチンは作ってたけど、 今は、機能ごとにサブルーチンを作ってるって感じですね 同じ処理でも規模がおっきくないとそのまま書きなぐりすることがおおいです >>92 エラーで止める優先度あるの? unless ($a < 100){&error("$aが100以下じゃありません");} unless ($b eq 'GET'){&error("$bがgetじゃありません");} 〜〜 でいいと思うが・・・ >>92 @error =( err1, err2, ); $error[$code]; みたいなことを最近よくするな(w >>88 あっと、>>84 の例ではエラー処理が同一に書いてしまったのでおっしゃるとおりなんですが、 エラー処理が失敗した段階によって異なると考えてくださいませ ×エラー処理が同一に ○エラー処理の部分に同一の処理を プログラム言語の前に日本語勉強してきます。。。 >>93 なるほどー。 私は2度以上行う処理で引数と返り値が必要なものをサブルーチンに するようにしていますが、今回少し考え直そうかと。 つーか>>41 の掲示板でかッ! 携帯用だと処理が細かくなって増えるのか? 関係無いが・・・漏れはエラー処理の場合 第一引数は数値だよ第二引数になんかメモ sub error内でエラーログに記録する内容とかを振り分けることができる perlだけじゃないが でかいやつになると エラーメッセージ一覧表だけで数KBになる・・ >>94 さん 確かにその通りです。 優先順位などありません.. 基本的にエラーメッセージって書かないなぁ(ぉ 規定外の値だとデフォルト値になるようにしてるなぁ 人によってコーディングの仕方が かなり違うことがわかったんで 今日は寝るサラバ 起きたら局所変数を意識したプログラムを書いてみよう。 ちょっと修正しました。批判していただいた部分は まだすべて修正できていませんが、一応アド載せときます。 BBS: http://hex51.darktech.org/cgi-bin/the/bbs.pl SRC: http://hex51.darktech.org/the.txt 余談ですが、部屋がめちゃめちゃ寒いです.. my $mini_cgi = './mini.pl'; my $cntfile = './count.dat'; my $log_dir = './logs'; our $lock_name = 'lock'; <中略> my $t_h_width = 0; my $t_f_width = 70; my $name_size = $name_max - 4; my $title_size = $text_cols; この部分って全部グローバルだからourになっちゃうよん my $hoge #グローバルと同意で無意味 { my $hoge; #○ { my $hoge; #○ } } みたいにブラケットで括られた中(サブルーチンでもなんでもいいけど・・・)で宣言した部分じゃないと無意味 はい、実は上のほうですでに言われました。 さっさとourにしておきます。 my でスコープはファイル・パッケージ内に限定されるんだから意味はあると思うよ。 our にはならない。 別のパッケージから読みこんだりしてるのでなければ、 わざわざ our にする方が意味ないと思うけど? ┌┬┬┬┐ ―――┴┴┴┴┴―――――、 . . /  ̄ ̄ ̄//. ̄ ̄| || ̄ ̄ ̄||| ̄ || __________ ./ ∧// ∧ ∧| || ||| || / [/____(゚_//[ ].゚Д゚,,) ||___||| || < こんなのが有りますた . ||_. * _|_| ̄ ̄ ∪|.|. |ヽ.__|| \__________ . lO|o―o|O゜.|二二 |.| 救済病院 || .| ∈口∋ ̄_l__l⌒l_|___|_l⌒l._||  ̄ ̄`ー' ̄ `ー' `ー' `ー' http://saitama.gasuki.com/koumuin/ ∋8ノノハ.∩ 川o・-・)ノ <先生!こんなのがありました! __/ / / \(_ノ ̄ ̄ ̄\ ||ヽ|| ̄ ̄ ̄ ̄|| ...|| ̄ ̄ ̄ ̄|| http://saitama.gasuki.com/shinagawa/ [index.cgi:26:warn] Use of uninitialized value in concatenation (.) or string at /www/oasis/html/index.cgi line 26. [index.cgi:26:warn] Use of uninitialized value in concatenation (.) or string at /www/oasis/html/index.cgi line 26. ってでてるよ>116 書き方まずかったかな? >>71 はブロックの外で宣言すると、例えばサブルーチンの中からでも参照できてしまうので 変数宣言する時は、スコープを絞って適切なブロック内で宣言しよう…と言っているのだと思う。 修正というか、むしろ改悪されえてるような・・・。 our にしてしまうと、他のファイルからも値を参照出来る様になってしまうので、 # つっこみたかったのは、 # > この部分って全部グローバルだからourになっちゃうよん # my で宣言してるのに勝手に our にはならないよー。ってこと。 よくある方法だと、main関数(サブルーチン)を作るか、 単にブロックで囲む。(ラベルは別にいらないけど便宜上) MAIN:{ my $foo = 'bar'; ; } ちなみに、定数宣言なら変数にはせずに、 use constant LOG_DIR => './logs'; という風にしておくと、代入できないから グローバルとか関係なく中の値は保証されるよ。 >>118 >変数宣言する時は、スコープを絞って適切なブロック内で宣言しよう…と言っているのだと思う。 そいう意味.、言い方まずかったですな・・・ {}って while{} foreach{} for{} sub{} {} が?有効なの if{}はどうなるの? >>121 基本的に {}で囲ってる部分は全部スコープになりますよん if{}でも eval{}でも 一緒 ファイルの重複を避ける処理 { my %count; @array = grep(!$count{$_}++, @array); } これみたいに、スコープを作るために括る事もありますし 別に全部$hogehogeみたいなやつでいいじゃん なんで局所変数とかみんなつかうの???? >>124 見通しが悪くなるから。 誤動作の元にもなりかねんし >>125 でも配ってるやつってほとんどグローバル変数のみじゃん >>126 だから自分で組んでるんだが? グローバルがいいっていうなら、そうすればいいのじゃない? 自分だけでやっとればいいってのなら一向にかまわないけど、 複数の人がからんでくるとなるとそうもいかない 取り合えず少し直してみました。 今日はPHPで学校の掲示板を作るので あまり変更はないかもしれません。 >>71 さん 気をつけないと if ($hoge eq 'hoge') { my $foo = 'hoge!'; } print $foo; この場合マズイですよね? チョットmyについていろいろと試してみます。 >>128 それはスコープの外に print $fooがあるので動作しない if ($hoge eq 'hoge') { my $foo = 'hoge!'; print $foo; } コレが正解 >>129 さん OKっす。 要はCのautoですよね? myを使わなきゃダメって訳じゃない。 使った方が良いってだけで。 グローバルである必要がないならレキシカルを使うほうが 安全だし速度的にも有利だからね。 ありじゃないの? じゃなきゃそんなモジュール作らんよ。 すみませんがちょっと漏れのスクリプトを見てください。 ソートの練習なんです。 いちおう漏れの思っている動作しているのですが,突っ込むところがあれば,後学のために色々教えてください。 ソースはこちら, ttp://members.tripod.co.jp/angeldayan/ 使ったデータはこちら ttp://members.tripod.co.jp/angeldayan/data.txt 要 cgi-lib.pl です。 たいしたものじゃなくてごめんなさい。 初心者なんで,これでも1週間かかっちゃったんです。 よろしくお願いします。 >>137 myとかの使い方覚えたほうがいいかも まだはじめたばかりなのならPHPもいいかもよ でスクリプトに関しては ファイルをアップロードするわけでもないんだし 自前でデコードしよう。 my, our でも変数のスコープは同じなんだけどなぁ。 varsプラグマ(v5.6以降だと our)を使うのは、 use strict 'vars'プラグマを有効にした時に、 複数のパッケージである変数を別のパッケージから使いたい場合、等。 no strict は、場合によっては反則 ... そういえば、さっきmyとmyなしでベンチマークを行ったら myの方が3,4倍遅かったのだけど…。メモリ消費は解らない。 自分の趣味でリファレンスを使ってソースを書いてみた・・・ cgi-lib使ったことないからあてずっぽうだけど、かなりソース書きなおす事になったねぇ ttp://iwh15.hp.infoseek.co.jp/p/e/r/perldev/cgi-bin/upload/source/041.txt >>143 8-9行目 if ($in{'rev'}){ my $script = 'http://' . $ENV{'SERVER_NAME'} . $ENV{'SCRIPT_NAME'}; ココ逆だな・・・ my $script = 'http://' . $ENV{'SERVER_NAME'} . $ENV{'SCRIPT_NAME'}; if ($in{'rev'}){ >>138 > myとかの使い方覚えたほうがいいかも わかりました。勉強します。 > PHPもいいかもよ perlと心中しまつ。 > ファイルをアップロードするわけでもないんだし いやいや、今後画像をあぷすて貼り付けるつもりなので。。。 いつになるかわかりませんが。。。。。 >>144 うわぁ、ソースが綺麗でつ。 でも、動きません。。。。。 ローカルでは「ページを表示できません」で動きませんし、 サーバにあげてみた所、最初の画面は表示するものの、 情報のリンクのところが http:// サーバー名/$script?action=1&rev=1&n=0 って、$script そのままでつ。 結果は404でつ。 自分でも調べてみまつ。 >>145 動かしてないからねぇ(w 穴ありまくりであろうかと > そういえば、さっきmyとmyなしでベンチマークを行ったら > myの方が3,4倍遅かったのだけど…。メモリ消費は解らない。 根拠を示さずに結果だけ取り出して言われても…。誤解されないかな? my の何のベンチマークを行なったの? ループ・ブロック内で変数を宣言して、そのオーバーヘッドを測っていた なんて事はないよね?それとも、ホントに変数の参照・代入が3〜4倍もかかったりした? >>142 myのほうが遅いというのはちょっと信じがたいな。 ブロック外から参照される必要がないからシンボルテーブルにも 登録されないし、むしろ速くなるはずだが・・・ >>146 $html =<<'EOT'; を $html =<<"EOT"; でOKでした。 なお、ローカルで動かない件は、cgi-lib.pl へのパスが違っていたというアフォが原因。 >>149 シングルクオートよくやっちゃうんですよ〜(w 動いてよかったです cgi-bin.pl って 確か、CGI.pmがサポートしてたはず・・・ 標準モジュールだよ。 use CGI qw(:cgi-bin); ベンチマーク取って見たけど…明らかに my を使った方が高速。 -w と use strict 外して my も何も付けない場合とか、 our も試して見たけど。速度的には my < our < local って順番だったよ。 #! perl -w use strict; use Benchmark qw(:all); my $count = 100; my $code1="my \$code=1;"; map{$code1 .= "\$code++;\n"}(1..$count); my $code2="local \$code=1;"; map {$code2 .= "\$code++;\n"}(1..$count); timethese(1000,{ 'Lexical' => sub {eval $code1}, 'Dinamic' => sub {eval $code2} }); ---- Benchmark: timing 1000 iterations of Dinamic, Lexical... Dinamic: 11 wallclock secs (10.60 usr + 0.00 sys = 10.60 CPU) @ 94.34/s (n=1000) Lexical: 2 wallclock secs ( 2.14 usr + 0.00 sys = 2.14 CPU) @ 467.29/s (n=1000) >>153 追試。 --- bench --- use strict; use Benchmark; my $loop = 5000; my $code1 = 'my $code = 1;' . '$code++;' x 100; my $code2 = 'local $code = 1;' . '$code++;' x 100; timethese($loop, { '1_my' => sub { eval $code1 }, '2_local' => sub { eval $code2 } }); --- ● ActivePerl Build 522 on Win98SE Benchmark: timing 5000 iterations of 1_my, 2_local... 1_my: 4 wallclock secs ( 4.45 usr + 0.00 sys = 4.45 CPU) Global symbol "$code" requires explicit package name at (eval 5005) line 1. 2_local: 8 wallclock secs ( 7.75 usr + 0.00 sys = 7.75 CPU) ● Perl 5.005_03 on FreeBSD 4.8R Benchmark: timing 10000 iterations of 1_my, 2_local... 1_my: 6 wallclock secs ( 5.62 usr + 0.01 sys = 5.62 CPU) Global symbol "$code" requires explicit package name at (eval 10005) line 1. 2_local: 11 wallclock secs (10.92 usr + 0.02 sys = 10.94 CPU) ● Perl 5.8.0 on FreeBSD 4.8R Benchmark: timing 10000 iterations of 1_my, 2_local... 1_my: 4 wallclock secs ( 4.74 usr + 0.00 sys = 4.74 CPU) @ 2108.73/s (n=10000) 2_local: 18 wallclock secs (17.20 usr + 0.00 sys = 17.20 CPU) @ 581.55/s (n=10000) >>121 if ( ( my $aho = $query->param('hogehoge') ) eq 'hoge') { $a =~ s/a/b/; $nazoflag .= $a; } else { # $ahoは見える。 } # $ahoは見えない。 while ( defined ( my $line = <IN> ) ) { # $lineは見える } continue { # 見える } # 見えない こういう場合のスコープについては、その制御構文の最後までに限定される。←あいまいだな… 2行目が間違ってた。$aだとuse strictでエラーにならないから$ahoにしたんだけど、 これは、、sort用にこっそり、エラーにしないようになってるのかな。 追加、これはなかなか使える foreach my $hoge (@list) { } ”次のループに移る前に実行されるブロック”であってる? こんな制御構文あったんだ。知らなかった。Thx >> 158 うん。これは、nextとかを使うとき、行番号が確実に進むようにする、みたいに使う 再び。。。 すみませんがちょっと漏れのスクリプトを見てください。 前回のソートの練習に加え、ページの分割もしてみますた。 いちおう漏れの思っている動作しているのですが,突っ込むところがあれば,後学のために色々教えてください。 なお、前回指摘された “myとかの使い方” は。。。。。(^^A ソースはこちら, ttp://members.tripod.co.jp/angeldayan/test.txt 使ったデータはこちら ttp://members.tripod.co.jp/angeldayan/data.txt 要 cgi-lib.pl です。 たいしたものじゃなくてごめんなさい。 >>163 登録データの件数が増えるのならば sortの cmp と <=>のルーチンを考えたほうがいいかも foreach(@keys){ if($_->[$n] !~ /^\d*$/){ $num_flug =1; last; } } データ量増えていくと、cmpを使う場合処理が遅くなる。 if($n= 4){ if($rev){ @keys = @keys[ sort {$keys[$b]->[$n] <=> $keys[$a]->[$n]} 0 .. $#keys ]; }else{ @keys = @keys[ sort {$keys[$a]->[$n] <=> $keys[$b]->[$n]} 0 .. $#keys ]; } }else{ if($rev){ @keys = @keys[ sort {$keys[$b]->[$n] cmp $keys[$a]->[$n]} 0 .. $#keys ]; }else{ @keys = @keys[ sort {$keys[$a]->[$n] cmp $keys[$b]->[$n]} 0 .. $#keys ]; } } みたいな感じかになろうか・・・ >>164 if($n= 3){ だな、このデータの場合 >>164-168 さんくすでつ! > データ量増えていくと、cmpを使う場合処理が遅くなる。 初耳でつ メモメモ 〆(・_・。) >>168 全面的に書き換えてくださり、ありがとうございまつ! 感謝でつ! 乙でつ! さっそくテストしてみまつた! おー、動いているー。。 あれ(?_?) データ件数は88くらいあるはずなのに、80までしか表示されない。。。 でもがんばってスクリプト読み下して自分で修正したいと重い松。 >>169 初耳じゃなくて、そういうソースを組んでたから 指摘したまでなんだけど・・・ ソースちゃんと理解出来てますか??(o_ _)o >>170 > ソースちゃんと理解出来てますか 自分の>>163 のソースは理解してまつ。 >>168 さまのは、現在格闘中でつ。 苦戦しておりまつ。 >>171 では、 foreach(@keys){ if($_->[$n] !~ /^\d*$/){ $num_flug =1; last; } } lココの部分がどういう処理をしてたか説明してみそ foreach(@keys){ # @keysをforeachして if($_->[$n] !~ /^\d*$/){ # $_の$n番目の値が数字ではなかったら、 $num_flug =1; # $num_flugに1を入れまつ last; # foreachのループ抜けまつ } # ifを閉じまつ } # foreachを閉じまつ これでいいでつか? sortの cmp と <=> のどちらでやるかのフラグを立てているところっていったほうが良かったんでつか? >>168 修正できましたぁ〜! $lastpage++ unless @Record % $Pageview; を $lastpage++ if @Record % $Pageview; 俺敵には >>169 >> データ量増えていくと、cmpを使う場合処理が遅くなる。 >初耳でつ メモメモ 〆(・_・。) から、どうして >>170 >初耳じゃなくて、そういうソースを組んでたから >指摘したまでなんだけど・・・ のようなレスが付くのか良く分かりません。 cmp使うのが初耳だったんでしょ?なんで「初耳じゃなくて」なんだろう? ×cmp使うのが初耳だったんでしょ? ○cmp使うと遅くなるっていうのが初耳だったんでしょ? >>173 つまり、該当データが文字列ばっかりだとループ終わるまで抜けない。 -> 次の処理にいくまで時間がかかるという事で cmp処理のときに時間がかかるという理屈。 >>176 そのソース私の奴改造してるから聞いてみたのだけど変ですか? ところで、ソース組んだんだけどどっかアップしやすい所無いかのぉ >>178 あっ! そういう意味だったんでつね。。。. (^^ゞ んじゃ、メモを。。。消し消し. _□(. .。 んで、件のソースの改造 ttp://kiteline.net/imgbbs/img/137.txt この規模だと分ける意味がないとおもうんだけど・・・ >>178 ああ、そういう意味か。てっきりcmpと<=>の違いを言ってるのかと思った。スマソ >>181 改造さんくすでつ! でも、穴が多いッスね。 次のページを押し続けれないし、 前のページが表示されないし、 順番が0-9の固定だし。。。 勉強のため漏れが修正したいと重い松が。。。 >>181 さんの目から見て、>>168 さんのソートは処理が重そうでつか? >>168 さんのソースは今まで漏れが出会ったことのない書き方だからちょっと苦戦しておりまつ。 おっと、>>168 さんのソース、逆順ソートが出来ない。。。 あう〜 こちらも漏れが修正したいと重い松。 >>168 逆順ソートが出来ない件、修正しましたが。。。 $TableHeader .= qq|\t<th><a href="| . make_url(n => $_, action => 1) . qq|">$field{$_}</a></th>\n| for sort { $a <=> $b } keys %field; を if ($Param{'rev'}){ $TableHeader .= qq|\t<th><a href="| . make_url(n => $_, action => 1,rev => 0) . qq|">$field{$_}</a></th>\n| for sort { $a <=> $b } keys %field; }else{ $TableHeader .= qq|\t<th><a href="| . make_url(n => $_, action => 1,rev => 1) . qq|">$field{$_}</a></th>\n| for sort { $a <=> $b } keys %field; } っていうのにしましたが、もっと簡単になりまつか? >>183 別にいい悪いはないと思いますけどね。 どんな記述も出来るのがperlですし・・・ 自分が見やすければいいんじゃないでしょうか? あと、自分的には不要な変数を極力使わないぐらいですか・・・ >>184 なんだこりゃ? $TableHeader .= qq|\t<th><a href="| . make_url(n => $_, action => 1,rev => ($Param{'rev'} ? 0 : 1)) . qq|">$field{$_}</a></th>\n| for sort { $a <=> $b } keys %field; だろ? >>186 サンクス! こういう書き方は初めてなんで、かなり苦戦しておりまつ。 >>183 直した。 http://boobar.hp.infoseek.co.jp/refactoring/test.0.0.2.txt 文法的に分からんトコは、駱駝本なり perldoc なり見てね。 「何でこういう処理が必要なのか分からない」ってトコは聞いて。 >>190 う〜、感涙! 実際、かなり省略した書き方なので、文法的にわかんないところばっかりでつ。 だからどんな処理をしているのかわかんなかったりして…(^^; でも、がんばって自分で読み下して理解しまつ。 コメント文の多さに助かってまつ。 これからもご指導ご鞭撻のほどよろしくおながいしまつ。 >>188 あいた〜 苦情でつ! このスレででつまつ使ってるのって漏れだけでつ〜 こういうの使ってみたい年頃なんでつ〜 (゙ `-´)/ ヤメレ! って言う声が多ければ考えまつ。 >>190 漏れの思っている動作は、 各Info ボタンを押すと昇順にも降順にもなる。 この際順番(ここではOrder)昇順なら小さい方から1、降順なら大きい方から1がいいんでつ。 でも>>190 様、直さないでくださいね。 漏れがやるんでつ。 あと。。。 my @Field = qw(Info1 Info2 Info3 Info4); っていう所。 my @Field = qw{Info1 Info2 Info3 Info4}; my @Field = qw|Info1 Info2 Info3 Info4|; my @Field = qw(Info1 Info2 Info3 Info4(; my @Field = qw)Info1 Info2 Info3 Info4); my @Field = qw(Info1 Info2 Info3 Info4); my @Field = qw\Info1 Info2 Info3 Info4\; なんでもいいんでつね。 勉強になりまつた。 でも、 my @Field = qw(Info1 Info2 Info3 Info4); で良くて、 my @Field = qw)Info1 Info2 Info3 Info4(; でダメなのは納得いかなかったりして。。。(汗) こんなの作ったけど どうよ? http://ebrain21.com/ ~game/me/mai.cgi >>195 Internal Server Error が出たぞ マリモーマ、、リア厨かと思ってたらもっと年取ってた。爆 若いのは年齢だけだよ もう体がたがた そろそろプログラムも できなくなるかも? もーちょっとデザインなんとかならんのかね・・・ 掲示板、見にく(ry >>201 ∧_∧ ( ^^ )<じゃ どうすればいい?(^^) >>207 ・・・・とりあえず、他の掲示板とか見て回れ。 他の掲示板とか見たことあるだろ? 無駄なテーブル使いすぎ。 もっと、シンプルでいいと思うが・・・ それと、掲示板CGIの吐いてるHTML見たが・・・ HTML、間違ってないか??? 改行ナシの、汚いHTMLでちゃんと読めんかったが・・・。 もうひとつ。 ひとつDLさせてもらってソース見たが・・・ 謎な関数の名前ばかり。 関数作る悪い例として、そのまま本とかで出てきそうなのばかり。 後から拡張とかする時、関数の名前見ただけで、 どんな処理してくれる物か、判別できなくなる。 ・・・と、いろいろつっこむ所多いが・・・ 物自体は、結構良い物だと思う。 ・・・たぶん。・・・きっと。 ・・・かもしれない。 ・・・だといいな。 ども。ちょっとスレ違いかもしれないけど、お邪魔します。 CGIじゃないんだけど、Perlスクリプト内のコメントを削除するスクリプトを作りました。 使い方は、同封してるテキスト読んでも分かるけど、D&DでOKな、結構便利な感じです。 http://isweb25.infoseek.co.jp/computer/pcqa-2ch/cgi-bin/img/997.lzh 評価お願いします。 また、改造してくれてアップしてくれる人は、 それ見て勉強したいと思いますのでお願いします。 >>211 コメントが 笑った あと 抜いた行の 下の行を 上げたほうがいいかも あ やっぱり 「抜いた行の下を上げますか」と 聞いてきた方が いいかな? >>213 >>214 ご感想、ありがとうございます。 そういう事で、少し改造してみました。 改行を消すかどうか、質問されるようになりました。 http://isweb25.infoseek.co.jp/computer/pcqa-2ch/cgi-bin/img/998.lzh もし、どなたでも改造したら、できればアップしてくださいね。 ・・・と、言う訳で、またバグを見つけました・・・ HTML出力してて、色指定で#を使ってたら、それ以降が削られてました。。。 http://isweb25.infoseek.co.jp/computer/pcqa-2ch/cgi-bin/img/999.lzh ・・・今度こそ・・・ $a =~ s/#//g; としたら 消えた まあ これは実行したら エラーが出ると思うけど このコメント削除スクリプトはどんな役に立つんだぎゃ? ttp://isweb25.infoseek.co.jp/computer/pcqa-2ch/cgi-bin/img/1003.zip 実は211のやつ見て無いんだが 書いて見たよ 先頭のタブとかは消さないようにした 一応自分の書いたスクリプトではきれいに コメント部は消えた模様 書いてから211の試したんだが 漏れの書いたスクリプトでは 誤作動しまくりだ $hoge = '#000000';#hogehoge- こういうのが $hoge = ' になってるよ 漏れの書いたスクリプトを 211ので処理すると ってことね >>222 このコメント削除スクリプトは・・・ PerlでCGIをつくって、サーバに上げる時、 ソース内のコメント部分のファイルサイズが無駄なので作りました。 ちなみに、俺のCGIファイルで、23kあったのが、16kにまで落ちました。 自分のパソコン内で走らせるスクリプトなどについては・・・ コメント削除するメリットはありません。 >>225 どもども。 そう、後から気付いたんです。 シングルクォートで囲まれた#まで削ってしまうって・・・ これと言って、手がってもらえないので、自分のだけ修正してアップしてませんでした(ワラ http://isweb25.infoseek.co.jp/computer/pcqa-2ch/cgi-bin/img/1004.lzh これでどうです? また一歩まともに近づいてるはずです。 >>223 のソース、見せてもらいますね。 >>222 意味は無いよ コンパイル速度も変わらんしね ただimgboard.cgiとかむかつくようなコメントが たくさん載ってるやつには有効だ(ぷ 210KB→160KBになったよ まぁ漏れ的には容量はどうでもいいが うざすぎるコメント消すのが面白そうだったからなw >>226 それをimgboard.cgiで試したんだが コンパイルエラーするよ 容量的には漏れより小さくなってるんだが 余計なところまで消しすぎでは? >>228 マジっすか! なに消してるんだろ・・・ 消しちゃいけない所、特定できません? imgboard.cgiですか・・・ 探してDLして、ためしてみます。 ちなみに、>>223 の削除スクリプト試させてもらいました。 先頭にタブとかがあってのコメントは削除されない仕様ですね。 俺のは、とにかくコメントだと思われるような所は、すべて排除していく仕様なので・・・ 失敗したら、文法エラーとかコンパイルエラーとか出ます。 って事で、どこで削除されたらいけない所が削除されてるのか調べてみます。 ありがとうございます。 ttp://isweb25.infoseek.co.jp/computer/pcqa-2ch/cgi-bin/img/1005.zip 一箇所だけ修正 まぁ 文法一切見て無いので バグいろいろあるんだが 直す気もないので 終了。 製作時間2分+30秒ですた。 imgboardはimgboard.cgiでぐぐると一番上にでてくるよ >>229 先頭にタブがあっても消えるはずだが \t\t$hoge = 'hoge';#これはほげです が \t\t$hoge = 'hoge'; になるだけ 先頭のスペースやタブは削除しないってこと 7行プログラミングするわけでも無いしね 確かにimgboardのコメントはなんか むかつくところがあるな と、一応バグを見つけました。 imgboardは、作者が旅行中(?)らしく、DLできませんでした・・・ 違う貼り付け掲示板で、コメント削除するとエラーが出たので、 そこからバグを辿ってみました。 ttp://isweb25.infoseek.co.jp/computer/pcqa-2ch/cgi-bin/img/1006.lzh 今度こそ・・・いけるはず。たぶん。 ちーと気になったんだが・・・ ヒアドキュメントとか、変数内の#なんかはちゃんと排他処理するようになっとるんだろうか・・・ >>233 まだ駄目だね ttp://www.big.or.jp/~talk/t-club/soft/mini_r6/index.cgi ほれ コメント見ると面白いと思うぞ >>234 ヒアドキュメント検知したら そのなかは一切いじらないようにしてるけど 実際にはどうなるかは知らない。 一応漏れのは上記のimgboard.cgiのコメント あぼーんするのに成功したが(ワラ まぁ 3分スクリプトなんで あのimgboard.cgiのコメント無くなっただけでも 満足だ まぁマジレスするのなら 秀丸やEmediterなら そういうマクロ誰かが作ってるんじゃ無い? (;´Д`)あ 漏れのだめじゃん 頭のむかつくコメント集は消えてるけど スクリプト内で消えて無いところが 部分部分である 211よがんばってくれ 俺、思うんだけどよ。 「コメントを消す」んじゃなくて「コメント以外を残す」って発想はどうよ? これならヒアドキュメントや文字列中の#なども簡単に対応できそうだが。 >>238 それは難しすぎ Perlの構文全て判定しないとだめだ ちなみに漏れの場合は コメントを消すんじゃなくて 普通の構文らしきものがある場合は それを残すようにしてる >>235 ttp://www.big.or.jp/~talk/t-club/soft/mini_r6/index.cgi ここへ行くと、403で工事現場にいてるような、 おやっさんがお辞儀してる絵が出るのは俺だけですか? 俺がもってる貼り付け掲示板では、正常に動いてるんだけど・・・ やっぱ、imgboard.cgiのソースがないと、無理っぽいですよ・・・ ちなみに、ヒアドキュメント内は・・・ びしばし、コメント文(#から始まる文字)を探してます。 でも、HTMLとかの色指定の#は削られません。 ・・・が、普通の文章内で#使われてたら削っちゃうかも・・・ ヒアドキュメントを感知&スキップの処理を組んでみます。 >>240 チミだけ 漏れにはどうするアイフルの広告が見える 変なソフトいれてるのなら切って見るとか ttp://www.big.or.jp/~talk/t-club/soft/mini_r6/imgboard122r6.zip 一応アーカイブ ttp://isweb25.infoseek.co.jp/computer/pcqa-2ch/cgi-bin/img/1007.zip さっきの残しておくのはあまりにも恥ずかしいんで 修正しておいた 上記のimgboard.cgiなら全てのコメントが無くなった模様 正常に動いてるよん >>241 ぐあ! 初めて行くサイトで、アク禁くらってました! 串さしたら、行けた・・・ なんだー! 俺と同じプロバの人間が悪さしてるのかぁ〜??? ・・と、とにかく無事にソースをゲットできたようなので、 調べてみます。 ソースも、見せてもらいますね。 ありがとうございました。 スマソ さらに修正 "<<(.+)" -> <<"(.+)" '<<(.+)' -> <<'(.+)' もうだめぽ ttp://isweb25.infoseek.co.jp/computer/pcqa-2ch/cgi-bin/img/1008.zip バグとしては print <<HTML; とかやられた場合に処理がおかしくなる・・・ "HTML" 'HTML'はOK もういいや 飽きたw こんな状態なら、手作業でコメント文を削った方が速いし確実だといってみるテスト ちょっと改造してみました・・・ ttp://isweb25.infoseek.co.jp/computer/pcqa-2ch/cgi-bin/img/1012.lzh imgboard.cgiで、エラーは出なくなりました。 ・・・文法エラーはね。 実際に動かしてはないです。 また、所々コメントを排除できてない所があります・・・ この辺は、もーすこし改造してみようかと。 >>223 コメント削除フィルタ処理部分を改造して・・・正規表現、頭痛い。。。 POD (Plain Old Document) には対応しないの? たぶん、これで完璧にコメントが削除されると思う・・・ 勝手に、>>223 のコメント削除ルーチンを改造して使わせてもらってます(w オリジナルのままだと、完璧には削除されない場合があったので・・・ 一部、改造させてもらいました。 ttp://isweb25.infoseek.co.jp/computer/pcqa-2ch/cgi-bin/img/1013.lzh >>223 「おいおい、勝手に使わないでくれ」って時は削除しますので、 言ってください。 >>249 PODってなに? >>250 思い付きで書いただけだから 別にどうでもいいよw いいスクリプトは評価してもらう必要が無かったりする このスクリプトすごい。感動した。 ttp://sh.sakura.ne.jp/~obj/vector/toys/#sb 亀レスだけれども。 >>211 コメント解除スクリプト、B::Deparse 使っちゃだめなのかな。 $ perl -MO=Deparse foo.pl ━―━―━―━―━―━―━―━―━[JR山崎駅(^^)]━―━―━―━―━―━―━―━―━― えー。 単刀直入に言うとなぜか解凍できない。 俺のアプリケーションに異常が起きたのか、そのファイルが変なのかは知らん。 めんどうなので調べない。 >>265 通報したぞ 解凍するとGBになるファイル1個入りの(ry >>265 今度は正常にダウンロードできます。 ソースは汚いです。 ∧_∧ ピュ.ー ( ^^ ) <これからも僕を応援して下さいね(^^)。 =〔~∪ ̄ ̄〕 = ◎――◎ 山崎渉 C? 割とさくさく動くね。 HTMLはもうちょっとなんとかしてほしい。 >>279 あなたはまずこれを読んでコードを修正。 http://www.harukaze.net/ ~mishima/perl/man/perlstyle.1.html 次に #!/usr/bin/perl の次の行に use strict; を追加し、 perl -wc board.cgi 等としてエラーが出なくなるまで修正。 評価するのはその後だ。 まあHTMLのLintみたいなもんだな。 文法を正確にするのは最低限のラインだ。 あれ?>>279 のアカまだ削除されてないな もっかい通報してやるか >>279 では、一言。 GET情報でパスワードを入力するのは、 セキュリティ面に問題がある。 >>279 iframeの表示が「他のブラウザ」じゃ全く駄目。 コメント修正していないので違うことをしているかもしれません.. >>285 全然読んでないけど、インデントで空白とTABを使い分けられると 結構困る。 漏れはいつも4TABだから、8TAB & 4インデントだとずれる。 インデントを全部TABにしとくと、TAB幅に依存しなくていいよ。 んん、、EmacsだとTABがスペースになるのですが.. これはエディタの仕様だと思うので勘弁してください。 一応、設定で変えれるかもしれないので調べてみます。 --------------------- #!/usr/bin/perl while (<STDIN>) { s/\x09/"\x20" x 8/eg; print; } ---------------------- $ chmod 755 filter.pl $ cat the.cgi.txt |./filter.pl > sp_the.txt 一時凌ぎで.. >>290 いや、変換方法はどうでも良くて。 8 TAB 依存のコードを見せられた時に「('A`)マンドクセ」と 思ってそこで読むの止めちゃうから、大袈裟に言えば 「機会損失」になってるよ、と。 スクリプトができるだけ多くのプラットフォームで正常に 動くよう、環境依存の部分を減らしていくのと同様に、 スクリプトを読む人の「環境」にも配慮してくれていると 好印象になるって事で。 >>288 さん そうですね。 自分も、いきなりスペースやTABが消えたコードを掲示板に書かれて どこがおかしいですか ? と、言われるともっと見やすく示せ! と内心思ってしまいます。 TAB、気をつけてみます。 取りあえず、全部スペースにしておきました。 元々、サブルーチンの少ない読みにくいものだったのに申し訳ありません。 >>291 さん いいと思いますよ。 きちんと機能毎に処理を分けているし。 >>291 感想。 ソース汚くて読む気しない。 終わり。 >>298 ぐはぁ!ショック・・・。 精進してからまた来ます。 >>299 自己レス。 291=299=300です。 >>291 とりあえずソース、見せてもらった。 極悪に汚い・・・。 全部、もう少し見やすいように手入れた。 とりあえず、手入れて思った事。 1、goto文なんか使うな! 2、スペース2個じゃなく、タブ使っとけ。 3、引数などのコンマの後は、スペース一つ入れる事。 4、なんでもかんでも、ケツにif文を置かない! 5、ソース汚いから、自分でも気付いてないんだろうが・・・ ファイルロックの掛け忘れがある。 6、同じく、ソース汚いから気付いてないんだろうが・・・ ちゃんと明示的にファイルハンドルを閉じてない所がある。 とくに、「4」のケツにif文は、うんざり。 処理内容自体は、読んでない。 人に評価してほしいなら、 自分だけが読めるソースを書くんじゃなく、 もう少し読みやすいように書く工夫をしよう。 ttp://isweb25.infoseek.co.jp/computer/pcqa-2ch/cgi-bin/img/1141.zip ↑ここに、手入れたソース置いてるから。 まだ、俺が手入れたソースの方が読みやすいと思う。 >>301 >2、スペース2個じゃなく、タブ使っとけ。 だけおかしい。 タブを使うと4TAB<->8TABの違いでずれるから空白(個数は問わないが普通4個)で。 >>303 「TABだけ」ならいいんだがな。空白と混じってるとおかしくなる。 いちいちTABだけなのを確認するより最初から空白だけの方がいいだろ。 TABなんて今時ディスクの節約にもならん。 どっちにしろ(例えば)SUNもMOZDEVもタブ不使用規約になってんだから 合わせた方がいいんでないかい? 間違えた。SUNは推奨してるだけだった。以下引用 >インデントの単位として,4個分の半角スペースを推奨する. >そのインデントが実際に半角スペースによって行われるかタブによって行われるかについては,これを規定しない. >タブはすべて(4個ではなく)8個分の半角スペースでなければならない. eclipseだったかな。曖昧記憶でスマソ 自分が思ったのは 「CGIスクリプトしか書いたことない人にありがちなソースだな。」 ってこと。 リファクタリングとか色々なことを勉強してみては? >>302 タブは、インデント以外に使ってないから、 どんなタブ幅でもずれてないはずだけど・・・ ずれてる??? 291です。評価ありがとうございます。 >>301 さん わざわざ直してくださって、本当にありがとうございます! 指摘されたのに気をつけて書き直してから、また評価をお願いしに来ます。 でも、もう…直せるところが無いかもしれませんが(汗) >>306 さん そのとうりです。自分でCGIを作ってみたくなったので、perlを勉強しだしました。 色々なことを勉強するのもいいですけど、虻蜂取らずにはなりたくないので…。 >>285 ソース、今見てるけど・・・ えらくコメントの少ない・・・って言うか、コメントの無いソースだな・・・ わざと、コメント消したの? それとも、素でこれ? 素でコメント無いなら、コメント入れていった方が良いと思う。 >>309 これ以上コメント書かれたら、読みづらくないですか? と、素な意見。 >>310 う〜ん、本体(?)の方はコメントあるけど、 モジュールの方にコメントがないかな。 >>309 さん 基本的にコメントを一切書かないのです。 ただ、配布とか考えると書いた方がいいかなと思って、今回はちょっと書いてみました。 やっぱ少ないですかね.. 別にコメント書かないとかいう変なこだわりがあるわけじゃなくて、 ただ、自分はコメントなくてもすぐ分かるので人に見せる予定がないものに コメント書かなくてもいいかなと..今は勉強中ということですし。 ただ、今回は見てもらおうとここに載せたわけなので、 モジュールの方にもコメントを書くべきだったと思いました..すみません。 「未来の自分は他人です」という言葉を贈っておこう。 コメント無しでもいいような わかりやすいクラス名、変数名、関数名をつけるのが基本です。 コメントが無いとわからないってのは それだけ汚いソースだということです。 >>315 , >>316 なるほど. 自分は今、就職希望の会社からCのソース(50-500行,10枚くらい)を渡されて、 この説明を書いてこいとか言われているのですが、コメントなくても 関数名, 変数名が分かりやすいし、うまい具合にサブルーチンに分けてあるので コメント少ないですが、かなり読みやすいと思いました。 まあ、漏れのはコメントないと読みにくいかもしれませんが.. 自分で見ても読みにくいな、と思ったらコメントでカバーするようにしてみます。 >>316 # ■■■ 俺の意見 ■■■ 俺は、とにかくコメント入れるのに賛成派。 ルーチンの名前とか、変数の名前に意味を持たすのは当たり前だけど、 コメントあれば、コメントだけ読めば、何の処理してるのかわかるし。 # ■■■ ブロック毎にコメントを入れる ■■■ ブレスで囲って無くても、処理の単体が生まれる。 それ毎に、コメントを入れておけば、一行のコメント読めば数行理解できる。 # ■■■ ルーチンの使い方のコメントは重要! ■■■ とくに、ルーチンの使い方のコメント。 絶対後から見て助かる。 いくつ、どんな引数を取って、どんな処理してくれて、どんな値をどんな形で返してくれる。 そんなコメントがあれば、一発でそのルーチンの内容がわかるでしょ。 # ■■■ 最後に・・・ ■■■ ↑どう? こんな感じでコメント入れる訳よ。 全部の行読まなくても、#で始る一行読めば、 俺が、なにについて書き込みしてるか分かるでしょ。 これを、プログラムでも実践してる。 それと、空行無しに書き込みしてると読む気失せるでしょ。 そうそう、掲示板の書き込みでも、 結構その人のセンスが出る。 変な所で改行してる人や、 長文なのに空白行入れず、 だらだらとメリハリの無い書き込みする人とか。 そういう人って、プログラムも汚いんだよね・・・ はい、たしかに後で読む人がいるとすれば、 コメントは書いたほうがいいですね。 読む側と見るとありがたいものなので、自分でも書くようにします。 コメントが無いために間違った認識を受けたり、 重要な処理を 「これいらねぇんじゃね?」 とか思われて消されること減るはずだし。 >>318 さん 自分が言いたいのは 「コメントを書くな」 ではなく 「コメントが無くてもわかるようなキレイな設計を心がけよう」 ってことです。 コメント関係ならプログラム技術板のこっちのスレのほうがいいかも。 http://pc2.2ch.net/test/read.cgi/tech/1038414493/ >>321 スレタイにワラタ いや、もう終わってるっぽいスレなので、 もういいかな〜っと。 とにかく、コメントは思うように入れまくってみたら良いと思う。 そうしてる内に、どういう風にコメント書いたら分かりやすいとか、 こういうコメントは無駄だとか、分かってくるだろうし。 前に、冗談だろうけど・・・ $hoge++; #1を増加 ・・・こんなコメントを見た事がある。 こんなの、明らかに無駄。(w ただ、なぜ1を増やすかって事についてのコメントなら・・・ それは、意味を成すかもしれない。 実は、俺も無駄なコメントが多いんだよね・・・ ぜんぜんプログラムとは関係ないようなコメントとかある。 そういうのって、俺的に後から見たら面白かったり。 もちろん、人に見せる時は、そんなコメントは消すけどね。 OO なコード書いて POD 埋め込むようになってから 普通のコメントがかなり減った。スクリプトとドキュメント 同時に作るのは効率いいしオススメ。 http://do.sakura.ne.jp/ ~junkroom/cgi-bin/megabbs/lounge/file/1032435179_5/hoge.zip むかしいじってたやつ、もう要らないから使えると思った香具師 勝手に使ってくれ。コメント皆無だけどね。 でも最後に軽く評価を聞きたいけどな。 >>326 あぁ。今見直したら俺が書いたやつじゃないものが入っていた・・・ Text::WordIteratorとか。。。 あーあ。まぁ、いいや。 ども。 いつぞやのコメント削除スクリプト作った俺です。 今作ってるスクリプトが行き詰まりました。 ちょっとイライラしたので、 息抜きにコメント削除スクリプトのバージョンアップとかしてみました。 このバージョンで、サブディレクトリ内も検索可能になりました。 深さは、どんなに深いサブディレクトリでも処理可能です。 http://isweb25.infoseek.co.jp/computer/pcqa-2ch/cgi-bin/img/1160.zip ・・・リファクタリングが必要かもしれん・・・ >>329 >深さは、どんなに深いサブディレクトリでも処理可能です。 当方にはそのスタックをあふれさせる準備があるが良いのか? >>331 う〜ん。 スタックを溢れさせる準備があるって意味がわからんです・・・。 とにかく、かなり深いディレクトリでもOKなはず。 だって、Cのルートディレクトリから検索とか掛けてみたから。 とりあえず、試してみそ〜。 http://www1.neweb.ne.jp/wb/prof/index.htm 平成15年度 自作板 PC環境調査 ◆5月分の結果が出ました。現在は6月分に移行しています。 (参考) 平均年齢 25.4歳 ネット(2ch含) 78.7% ゲーム 59.0% Windows XP Family 46.9% Windows 2000 Family 34.4% Athlon 45.3% Pentium 4 29.7% nVIDIA 49.2% ATI 28.9% DVD-R/RW/マルチ 20.4% CD-R/RW 75.9% 光ファイバー 8.3% ADSL/xDSL 64.5% CRT 74.6% LCD 25.4% >>332 ソースは見てないが、再帰的な処理をしてるのにスタックについて知らないというのは ちょっとヤバくないか? >>334 再帰? 自分の中で自分を呼ぶアレ? ・・・いや、普通にwhile文とかでブン回してるだけだが・・・ ディレクトリ検索のアルゴリズム考えるの、 実はちょっと大変だったんだよね・・・ ひさびさに、フローチャートとか書いたもん。(w ちなみに、見てもらったら分かるけど、 メモリの使用も最小限に抑えてるし。 >>335 そうみたいね・・・書けちゃったから・・・。 whileでブン回しておいてメモリは最小限とはこれいかに。 >>336 確かにWhileで再帰のまねごとは出来る。 でも、どっちにしろスタック的なデータ構造がないと困るはずだけれど。 >>329 キモの部分 (Library_223.pm) 以外を書き換えてみた。 http://boobar.hp.infoseek.co.jp/refactoring/commentoff.pl.txt …まぁ、なんつか、もっと色々な人の話に耳を傾けて もっと上を目指して下され。今のレベルで固まられたら 正直痛すぎる。 漏れも人の事言えんけどなー。 >>337 簡単な話。 while文で、ブン回しながら、必要なデータか調べる。 必要なデータなら、ファイルへスワップ。 必要じゃなかったら、次のループで上書き。 つまり、メモリにデータを蓄えないようにしてる。 一通り調べ終わったら、次のステップでスワップしたファイルから データ読み出しって感じ。 >>338 そのスタックってのがよく分かてないんで・・・ どんなデータ構造なのか分からないけど・・・ 再帰処理は、一切使ってない、ただループさせてる処理をしてるよ。 DirTree.pmってファイルがディレクトリを走り回る処理部分だから。 一度、覗いてみてくださいませ。 >>339 ソース見せてもらいました。 再帰処理使ってるね。 こんな事言っても仕方ないし、 プログラム打つ人間としては失格かもしれないけど、 再帰処理って嫌いなんだよね。 逐次処理&反復処理だけで、すべてをこなせると思ってる。 いままでで、再帰処理を行わないといけない場面ってなかったし。 まぁ、ヘッポコな俺だから、 まだそんな場面に出くわしてないだけかもしれないけど。 それに、再帰処理に出くわすと、ソース読むのが大変。 俺的にね。 と、まぁこれは俺の哲学。 それと、これはD&Dに対応してないね。 それと、処理中&処理後のログが少ない。 この辺でも、俺と嗜好が違うね。 俺のは、そういうログがないと固まってるようでイヤだから。 結構うるさいソースになってる。 と、「正直痛すぎる」とかって言われたので、 ちょっと反抗してみました。(w 正直な感想は、無駄のないスッキリ仕上げなソースだと思います。 それと、俺の知らない組み込み関数とか使ってる。 もうちょっと、俺も勉強しないとね。 改造とかしてくれる人少なくってさ・・・ ソースみて勉強させてもらいます。 ありがとうございました。 久しぶりに覗いてみたら まだやってたのねご苦労さんw 実はあと風呂に入ってたらフィルターバグまだいくつかあるのを 気づいちゃったんだよね… 漏れ的ソースの書き方ならアレで問題ないんだけど 世の中には漏れの想像もできない書き方する人がいるんで 傑作にケチつけられて熱くなっちゃいました。 DirTree.pm直してやるから待っててな。 あ。再帰処理しか考えられない…止めよう。 今のやり方で、明らかにおかしい所は、ループ内で$tmpPathListを開いて閉じてる所。 ファイルハンドルが勿体無い。 それから、少し変な所で、メモリ使用量にこだわっている割には、readdirを リストコンテキストで呼んでる点。一つずつ調べればいいのに。 それから、趣味の問題だけど、変なインデントが気持ち悪い。スコープを分けたい(?)なら ブロックを作ればいいし。 あと、無駄な括弧。 if ( ($_ eq '.') || ($_ eq '..') ) { next; } こことか強烈なんだけど…このままでも条件の中身の括弧は無くてもいいんだけど、 十分に優先度が低いorを使えば、心配しなくてもいい。それに大括弧のインデントも変。 @filelistのスコープも変。とにかく変数は使用直前に宣言した方が楽。 それから、$countはハッシュのリファレンスにする価値は無い。普通のハッシュで十分。 >>345 ごちゃごちゃ言う前に書き直してそれがより美しいことを証明すればどうだ? >>342 うーん、忘れた頃に、またやってます(w そうそう、コメント削除のバグ。 俺も、2つほど気付いてました。 しかし、俺的に今の所実害がないので放置中。。。 今度、直してみます。 >>345 スクリプト自体は、すごくスッキリしてて、 本当、無駄がないと思います。 大半の人は、俺のスクリプトより>>339 のスクリプトを好むかと・・・ 俺の言ってる事は、ヘッポコの戯言だと聞き流してください。 指摘された部分。 ループ内でファイルを開いたり閉じたりしてる部分。 メモリ使用量最小限とか言ってるのに、 ディレクトリ内のファイル名を一発で取得してる部分。 この2つは・・・ 言い返す言葉がないです(w ファイルは、ループ前に開いて、ループが終わったら閉じるように変更。 ファイル名取得も、一つづつに変更してみました。 $countのハッシュリファレンスを使ってる。 これについては・・・ 戻り値は、今後の改良などで値が大きくなるかもしれない・・・ という理由から、俺が作るルーチンのほとんどはリファレンスが返ってきます。 しかし、ルーチン内でリファレンス使ってるのは意味ないですね。 と、言うことでルーチン内は普通にハッシュを使うように変更。 戻り値はリファレンスだけど・・・ インデントが変。 orを使わず、||を使って括弧の多様。 変数宣言は、使用直前に宣言した方が楽。 これらについては・・・ 好みってことで、許してください。 http://isweb25.infoseek.co.jp/computer/pcqa-2ch/cgi-bin/img/1166.zip aice.zive.net/index.jsp よろしくお願いします。 >>350 ここの人は低レベルだからJavaなんて理解できないよ。 >>351 言われてみれば、Javaスレってないね・・・ 難易の話をしているつもりかな? なら351はJavaを理解していないに430スイカ >>211 の人。 記述が馴れないような感じになって良いなら、gotoでルーチン使うと(ルーチンね)スタックがたまらなくて良いよ。 ただし、それは履歴自体プログラムが管理しないって事だから時には諸刃の剣。 スタックはほとんど何やってもたまるよ。 スタックがたまると言うか、スタックの中にいろんなもんがたまる。 もちろんループもしっかりスタックに残り管理されてる(当たり前)。 だから「再起じゃないから」、「サブルーチンじゃないから」スタックには全く関係ないてのはでっかい間違い。 どんな経過をたどって現在まで辿り着いたのかとか、捨てたと思った変数が実は残っているとか。 スタックにも色んな種類あるから調べて味噌。 >>356 うーん、無理にスタックを意識して、 goto文を使用しようとは思わないです・・・。 あまり、ソースがトリッキーすぎると、 未来の俺から苦情がきます。 それでなくても、結構トリッキーっぽいから・・・ スタックとは、何なのかはっきり分かってなかったのですが、 いろいろ調べ回って、何なのか、何となく分かりました。 スタックについて、勉強させてもらう機会をいただいた皆さんに感謝です。 さて、また一つヘンテコなスクリプトを組みました。 複数のファイルから、文字列を検索するスクリプト。 My_Grep。 http://isweb25.infoseek.co.jp/computer/pcqa-2ch/cgi-bin/img/1181.zip 使い方などは、同封してるテキストファイルを読んでください。 改造してくれる人は、できればアップして、ソース見せてください。 勉強させてもらいます。 また、今回も「DirTree.pm」を同封してますが、 >>349 の指摘された所は、直してます。 では、評価お願いします。 バージョンアップしました。 http://isweb25.infoseek.co.jp/computer/pcqa-2ch/cgi-bin/img/1184.zip このバージョンで、 複数の拡張子のファイル検索が可能。 ログで、先頭のインデントなどのスペースを削るようにした。 ・・・誰か、評価お願いします・・・ 誰も手がってくれない。寂しいね。 >>359 乙。 俺よりはるかにレヴェルの高いことやってらっしゃるので、 研究させてもらいます。 # 自作スクリプトを公開できるのはいつになることやら、、、 >>360 ども。 一応覗いてくれてた人がいてたんだね。 よかった。 まったく手がってもらえないから、かなり寂しかった(w やってる処理自体は、そんなにレベルの高い物じゃなかったりします。 俺も研究させてもらうので、何かスクリプト作ったらアップしてくれたら嬉しいです。 さて、また意味なくバージョンアップしました。 http://isweb25.infoseek.co.jp/computer/pcqa-2ch/cgi-bin/img/1189.zip このバージョンで、 結果ログファイルがHTMLファイルになって、 ヒットしたキーワードが強調表示されるようになった。 ファイルがバイナリファイルか調べるようにした。 拡張子指定で、ファイル名に拡張子と同じ文字列があったら、 そのファイルも検索対象になっていたバグを修正。 指定した拡張子のファイルが無かった時でも、 つづけて検索フェイズに移行してたバグを修正 Html.pmってファイルを書き換えると、 出力するログの見た目が変えられるかもしれません。 それと、今回のバージョンで謎なバグが一つ・・・ tmpファイルが、今までスクリプト終了と同時に、 削除されるようにしてたんだけど・・・ 今回のバージョンは、なぜかtmpファイルが残ります・・・。 何度も見直したんだけど、まったく原因がわかりませんでした。 どなたか、ご指摘いただけたら嬉しいです。 >>362 いい加減ウザイ。完成してから後悔してくれ >>363 あら。 何か主旨が変わってきたね。 評価貰えるよう、スレを上げるために、 何もなくスレ上げてたら荒らしだから、 何か無いかと、がんばってバージョンアップしてたんだけど・・・。 でも、いくつか勉強させてもらったし・・・ この辺が潮時かな。 じゃ、俺のスクリプト公開は終了します。 >>364 もう少し実用性のあるもので再チャレンジしてみたら? 今回のは正直言って使いたいと思えるものでなかったから 評価しなかった あれば便利とか使ってみたいと思えるものなら協力者も増えるのでは 自作CGIを評価するスレ このスレは終了いたしました。 みなさん書き込みありがとうございました。 投稿件数 : 365 最終投稿者: nobodyさん 最終投稿日: 03/06/19 ∧__∧ / ̄ ̄ ̄ ̄ ̄ ̄ ( ^u^) < 乙彼様でした☆ と つ \______ (__つ 丿 し' スレの趣向とは少し外れるんですが、 下記のロック、アンロックはどうでしょうか? # lock routine sub lock { $retry = 5; if (-e $lockex_file) { $mtime = (stat($lockex_file))[9]; if ($mtime + 600 < time) { rename($lockex_file, $lock_file) || &error("lock error"); } } while (1) { last if rename($lock_file, $lockex_file); if (--$retry < 0) { &error("lock error"); } } } # unlock routine sub unlock { if (-e $lockex_file) { rename($lockex_file, $lock_file) || &error("lock error"); } } 評価お願いします。 >>368 いいんじゃないかな。 while文の所は・・・ while ($retry--) { return 0 if rename($lock_file, $lockex_file); } &error( 'Lock error' ); こうの方が良いかな。 >>369 どうもありがとうございます。 他のスレでこういう書き方をみかけました。 while (!rename($lock_file, $lockex_file) { if (--$retry <= 0) { &error("lock error"); } } >>369 さんが書いてくれたものとどちらがいいんですかね? >>368 このルーチンだと穴がある。経験則だけど、アクセスが殺到すると簡単に壊れる。 説明するのめんどいので、 http://www.din.or.jp/ ~ohzaki/perl.htm#File_Lock この辺りでも読んでみて。 >>370 好みだと思う。 個人的には>>368 も>>369 も>>370 もループの最中にreturnやら&errorで関数の 外に飛んでるので気持ち悪い(これも好みの問題)。 あと、>>368 はテストが最大6回行われるのに大して、>>369 と>>370 は 5回なので等価なコードじゃなくなってる。 というわけで、個人的にはこう書くかな↓ my $retry = 5; for($retry++; $retry; $retry--){ last if rename($lock_file, $lockex_file); } error("lock error") if not $retry; >>371 ありがとうございます。 ロックが甘いということは分かりましたが、アンロックはどうでしょうか? まだ371さんがおっしゃったサイトは見てないのでなんとも言えませんが…。 もう少し勉強してみることにします。 指摘されたリトライですが、 if (--$retry <= 0) { こうですね。 >>371 > このルーチンだと穴がある。経験則だけど、アクセスが殺到すると簡単に壊れる。 > 説明するのめんどいので、 > http://www.din.or.jp/ ~ohzaki/perl.htm#File_Lock > この辺りでも読んでみて。 その辺り読んで、載ってるルーチンそのまま使ってテストした所、 ファイル壊れました。 俺は、>>368 くらいの簡単なロックで良いと思うけど。 このロックで壊れるようなアクセス受けてるって事は、 その説明に載ってるようなルーチンでも、ほぼ壊れる。 どんなロックしててもファイルは壊れるんだから、 小細工いれた重いロック処理するより、 簡単にロックする処理入れた方が良いような。 >どんなロックしててもファイルは壊れるんだから そんなことはないよ。ただ言えることは、この板ではまだまともにロックできて いるルーチンが1つも書かれてないな。 >>374 >そんなことはないよ。ただ言えることは、この板ではまだまともにロックできて >いるルーチンが1つも書かれてないな。 flock使っちゃだめ? >>374 どんなに集中アクセスを受けても、 絶対壊れないファイルロックってある訳ない。 あったら、ぜひ見て見たい。 >>375 あ、ちなみに、flockでも壊れるんで。ファイル。 ↓これでもこわれる?(CSVの処理はPerlメモ参考にしてます) use strict; use Fcntl qw(:flock); $tmpfile = "$datafile".".$$.". time() .".csv"; #万が一リネーム失敗したときのために、 #ユニークなファイル名にしておく open (LOCKF, ">$datafile"."_lockf") or die("cannot open:$!"); #ロックファイルを作成する #(★注:ロックファイルは、各CSVごとにユニークに) flock (LOCKF, LOCK_EX); #ロックファイルをflockする open(IN, "< $datafile") or die("cannot open:$!"); # 読みのみモードで開く open(TMP,"> $tmpfile"); #テンポラリファイルを作成 while ($line = <IN>){ $line .= <IN> while ($line =~ tr/"// % 2 and !eof(IN)); $line =~ s/(?:\x0D\x0A|[\x0D\x0A])?$/,/; @values = map {/^"(.*)"$/s ? scalar($_ = $1, s/""/"/g, $_) : $_} ($line =~ /("[^"]*(?:""[^"]*)*"|[^,]*),/g); #必要なものだけをEUCにして、出力時にSJISにする foreach $value (@values){ &jcode::convert(\$value, "euc"); }; #CSV形式に変換 $newline = join ',', map {(s/"/""/g or /[\r\n,]/) ? qq("$_") : $_} @values; print TMP "$newline\n" ;#テンポラリファイルに1レコード書き込み } close TMP; close IN; unlink $datafile; rename ($tmpfile, $datafile) or die ("cannot rename : $!"); close LOCKF; >絶対壊れないファイルロックってある訳ない この根拠がどこからくるのかわからないが、 少なくともとてつもないアクセス集中に対応できるように非ブロックモードで タイムアウトを備えてないとまず無理だということは教えておこう。 あ、EUCにしてからSJISにもどすの忘れてるけど、そこは気にしないで > どんなロックしててもファイルは壊れるんだから、 そんなことはない。 というか、上(大崎氏の)のルーチンでファイル壊れたんならファイルシステムに 不備があるか、打ち間違いがあるかパーミッションやらの設定を誤ってるかどれか。 ファイルシステム上でrenameが衝突しないという条件の元でならうまく行くはず。 アクセス集中でファイルが壊れるのはロックの機構に不備がある だけで、正しい状況下で行われたUNIX系OSでのflockでは、ファイルシステム にバグがあるか、ファイルシステム自体のクラッシュでもない限り壊れない。 >>375 flockはNFS越しの場合に失敗するから、ファイスシステムを予め 調べておく必要がある。 NFS越しだとPOSIXモジュール使うかfcntl使う必要があった気がする。 >>376 > どんなに集中アクセスを受けても、 > 絶対壊れないファイルロックってある訳ない。 > あったら、ぜひ見て見たい。 非ネットワークファイルシステム+UNIX系OSでのflock。stableなバージョン上で これで壊れたって話は逆にあったら見てみたい。 >>377 ネットワークファイルシステムを使ってる場合はね。 それ以外で壊れるという話は(ファイルシステム開発中のバグ以外は) 聞いたことない。再現できたら結構すごいと思うが。 変な憶測並べる前にFAQくらいみんな読もうよ。 http://elib.cs.berkeley.edu/ ~loretta/perl/nmanual/pod/perlfaq5/How_can_I_lock_a_file_.html >>384 2つのプロセスが同時に追加書込しようとしたら、 その部分は壊れるよ。 >>371 って言うかOSが関与しないファイルロックで信頼できるアルゴリズムってあるの? >>388 ええ、ばっちりシステムコールのflockがいらっしゃいますね。 >>386 symlinkにしろ、rewriteにしろ、mkdirにしろ、OSがファイルシステム上で衝突しないように 設計されているという大前提で作られてるし、実際衝突するかどうかはOS次第なので、 OSに非依存で汎用可能なアルゴリズムっていうのは原理的に不可能じゃないかと。 >>390 その意見には激しく同意。 じゃあ、議論するだけ無駄だと思うわけだ。 >OSがファイルシステム上で衝突しないように設計されているという大前提で作られてるし。 OS側でAtomicでもプログラム側がそうでなけりゃ・・・。 >>373-392 スレ違い。 ファイルロックについてのスレあるから、 そこで熱く語ってくれ。 require './my_flock.pl'; while (1) { while ( not defined ($lock = &my_flock()) ) {}; open (IN, "./count.txt"); $data = <IN>; close (IN); &my_funlock($lock); print ++$data. "\n"; while ( not defined ($lock = &my_flock()) ) {}; open (OUT, ">./count.txt"); print OUT $data. "\n"; close (OUT); &my_funlock($lock); if ($data >= 10000) { last; } } >>371 のその辺のファイルロックを別ファイルに取って呼び出してる。 これを、二つのプロセスで実行してみろ。 無事に10000までカウントなんぞできんぞ。 >>394 まともに使えないならいっそ使わないほうが・・・ >>395 はぁ? 全体に一度だけかけろとか言うのか? それでも壊れる。 何がまともに使えないだよ・・・ ルーチン呼び出すのに使えるも使えないもないだろヴォケ。 文句言う前に試せやハゲ。 試して、壊れなかったら文句言いにこいや。 ルーチンをまともに使えないヤシが晒されるスレはここでつか? >>397 だから。 試せってよ・・・。 試しもしないで、使えてねーとか、使い方悪いとか。 そんな事言われても、説得力ねーっちゅーの。 こういう使い方したらファイル壊れないとか、 このタイミングでルーチン呼び出したら大丈夫だとか、 まー試しもしないで語ってるヤツに、 ロクな答えなんて返ってきそうにないけどな。 >>396 > 全体に一度だけかけろとか言うのか? だってそうしないとカウントが飛んじゃうでしょ。 > 試して、壊れなかったら文句言いにこいや。 一度に5プロセス動かして1000までやってみたけど壊れないね。 FreeBSD2.2.2 + Perl5.6.0だけど。 OS何使ってて壊れるの? > 396 プロセスを7つに増やしてテスト中。 時々ロックファイルが消えるな・・・。renameしかしてないはずなので、 ファイルシステムのバグか? でもデータが壊れるということは今のところない模様。テスト続行中。 FreeBSD2.2.8 + Perl 5.6.0でも実験したところ、20000件超えてるけど、特に問題なし。 FreeBSD2.2.2の方も、10000件行ってエラーなし。 合計30000件実験してみたけど衝突は起こってない模様(プロセスの譲り合いで片方のプロセスが ブロックする現象は見られたが)。 単にrenameシステムコールが衝突するようなファイルシステムを持つOSを使ってるだけ とか、そういうオチじゃなくて?>>398 ファイルが消える現象は、ロックファイルをディレクトリにすることで回避 # mkdir lockdir/lockfile で、20プロセス同時起動で、30000件やってみたけど、全く問題なし。 さすがに30000回連続で20プロセスが同時に1つのファイルにアクセス する状況はありえないだろうから、少なくともウチの環境上では きちんとロック機構が機能してると思われる。 で、たった2プロセス同時起動で10000件持たないファイルシステムを 持つ環境がどんな環境なのかとても気になるので早く教えてください>>398 あなたの言う条件↓は満たしましたよ。 > 文句言う前に試せやハゲ。 > 試して、壊れなかったら文句言いにこいや。 おっと、ご苦労さん。 マジで? ファイル壊れない? こっちの環境は、Win2kだけど。 > 単にrenameシステムコールが衝突するようなファイルシステムを持つOSを使ってるだけ んな訳ない。 2kで、そんなバグ聞いた事ない。 ずっとテスト環境は2kだったからなぁ〜。 とりあえず、こっちもVineの環境があるから、そっちでも試す。 >で、たった2プロセス同時起動で10000件持たないファイルシステムを >持つ環境がどんな環境なのかとても気になるので早く教えてください>>398 煽りですか。 あんた、一言多いね。 > こっちの環境は、Win2kだけど。 多分そのせいじゃないかなぁ。ファイルシステム何になってます? こっちは今のところ30プロセス同時起動で30万件ノンストップで突破してるので、 スクリプト自体に問題があるとは思えない。 まぁ、このルーチンはrenameの堅牢性に頼ってるので、その点において汎用性は 薄いということを証明する形にはなったかも。 > 2kで、そんなバグ聞いた事ない。 1秒間に同じファイルを数十回renameする必要性ってあまりないからなぁ。 renameのファイルの取り合いって普通の状況だとまず起こりえないし。 ソース読んだら分かると思うけど、renameの空振り以外に原因は考えにくい ので、再現性あるなら追試してレポート出してみたら? >>404 ファイルシステムは、もちろんNTFS Vineで試してみた。 たしかに、2kの時は途中ファイルが壊れてカウントが1に戻ったりしたけど、 Vineはそんな事なかった。 ・・・が、おかしい。 3つのプロセスで動かしたが、ログがおかしい。 同じ数字のカウントをする場面がある。 3つのプロセスでカウントしていったら、 同じ数字がカウントのログとして出るのはおかしいでしょ? そっちでは、ちゃんとカウントしていってる? >>405 >>394 のソース直した?部分的でなく、全体をロックで囲まないと誤動作するよ。 print文の直上直下にあるunlockとlockの2行を外せばうまく行くと思う。 >>406 あ・・・悪い。 修正してなかった。 ちゃんと動いてる。 もっと沢山のプロセスと、もっと沢山のループで試したかったけど、 Vineが入ってるPCのCPUが弱いんでやめた。 なんだ・・・今回の実験で、2kがいかに糞なのかが証明されたのか・・・? 結果は、壊れないファイルロックが存在したって事か? ・・・俺が、間違ってますた。 スマソ >>407 > 結果は、壊れないファイルロックが存在したって事か? 昨日、あのまま30プロセス同時起動のまま寝て、今朝見たら400万件を 突破してました。もちろんノンストップで。 30プロセスが400万回連続で殺到しても平気だということなんで、 少なくともウチの環境では、ほぼ「絶対に壊れないロック機構」と言い切って 差し支えないと思う。 どうでもいいけど、このテストスクリプトだと、count.txtを書き込みオープンした 瞬間にプロセスが落ちるとカウンタリセットされるよね。堅牢なスクリプトを作ろうと 思ったらそこまで気を遣う必要があるかも。 >>377 flockに書き換えて同じ事やってみたけど、20プロセス10万件で壊れずに 行ってます。やっぱりOSの問題か、flock over networkが原因ではないかと。 スレ違いなようなので、この辺で。 >>393 さんがおっしゃってる通りたしかにスレ違いですが、 とても興味深い話題をありがとうございます。 >>402 さんがおっしゃってることを試す価値はありそうなので、 とりあえずファイルを使うロックから、 ディレクトリを使うロックに変えてみたいと思います。 >>414 お客さんでそういうトコ、多いんですよ(萎 だから仕事でflock使う際は、インストール先の OSとファイルシステムは必ず確認。 >>414 十分有り得るよ。うちの大学もそうだし。 別スレでrename失敗どうたらこうたら、言ってるんですが、 そんなにrename失敗することあるんですか? 将軍が彪の追い出しに成功してボリボリ食われちゃう一休さんの>422 __∧_∧_ |( ^^ )| <寝るぽ(^^) |\⌒⌒⌒\ \ |⌒⌒⌒~| 山崎渉 ~ ̄ ̄ ̄ ̄ ∧_∧ ∧_∧ ピュ.ー ( ・3・) ( ^^ ) <これからも僕たちを応援して下さいね(^^)。 =〔~∪ ̄ ̄ ̄∪ ̄ ̄〕 = ◎――――――◎ 山崎渉&ぼるじょあ それでは。 ttp://www.42ch.net/UploaderSmall/source/1060103401.zip 昔作った掲示板です。今ではもうこんなにかけません。 >>437 ぱっとみですが、スコープや、名前空間を理解していらっしゃるのでよく勉強されてると思われます。 私の趣味的にはグロブを使わないようにするともっとよさげかと・・・ ttp://www.42ch.net/UploaderSmall/source/1060108917.zip 良かったらお願いします。 使い方はcgi呼び出して?ってリンク見ると大体書いてあります。 典型的な我流でCGIしか書いたことの無い人のソースだとは思います。 非常識な部分があればご指摘頂きたいです。 #普段タブ使っているのですが、環境に依存しそうなので #アップの際に、全てスペースに変換しました。 #個人的な情報も消してあります。ご理解ください。 >>439 コーディングスレの469さんか。(w 名前空間の扱いに振り回されてる感じがする。 基本的にパッケージ名や定数のハードコーディングは避けた方がいいし、 依存し合うものを別ファイルに分けると見通しが悪くなるだけだよ。 どうしても分けたいのなら各パーツはもっと役割分担を はっきりさせて汎用性を上げ、OO なスタイルで組むが吉。 >>440 ここ過疎なので人すくなくてばれるだろうとは思ってました。。。 分けるのは、基本的に改造向けではじめました。 (HTML部分を分ける、とか。) あと、機能追加のたびに追加したりとかって感じです。 最初はあまり深く考えないで分けていたんですが 最近えらい悩むようになってしまって つきつめるとOOPにするしかないような気もしてきてしまします。 次になにか0から書くことがあったら、OOで書きたいとは思います。 これは今ある程度完成してしまってますし 身内で使ってくださる方がいるのであまりスタイルを変えるつもりはないです。 総書き直しでOOにしようとか毎晩のように思ったりするのですが なかなか手出しする気力も時間も・・・ やっぱOOかー しかもコーディングスレであとで言われたとこ 直す前のうpしてた ウワーン (⌒V⌒) │ ^ ^ │<これからも僕を応援して下さいね(^^)。 ⊂| |つ (_)(_) 山崎パン 52 名前:nobodyさん :03/08/30 20:46 ID:??? >>50 自作CGIを評価するスレ http://pc2.2ch.net/test/read.cgi/php/1049514428/ Blogの試作公開 http://ex.1000gex.net/blog.zip common.phpで初期設定。 排他制御も何も入れてないがとりあえず動いた。 これからトラックバックを盛り込むけど難儀するだろうなぁ ダメ出しきのん。 SAFE_MODEでさっそく引っかかったが こちら素人だが、ざっと読んで気づいた点を。 script書き始めなら上々の滑り出しだと思う。 ■L38の $ip のダブルクウォートは意図不明。 ■” と ’ が混在してるけど、このスクリプトで使われてる ” は上記をのぞいて ’ に統一可能。 ■L41は、$newdata = $newcont . '<>' . $_SERVER['REMOTE_ADDR'] ; と書けば十分なのでは。 ■関数名とレフトブラケットの間に半角スペースがあったり無かったりする。これは趣味だから どう書いてもいいと思うが、普通は入れない。制御語(ifとかforとか)の後には入れる。そうすることで 関数と制御構造を見分けやすくする。カラーリング機能のないエディタではこの方が見やすい気もする。 いずれにせよ、どっちかに統一したほうがよいと思われ。 ■切り詰めを忘れている。ので、現データが 13<>127.127.127.127 で上書きデータが、14<>25.25.25.25 だった 場合、14<>25.25.25.257.127 に。書き込んだ後で、ftruncate(); を使ってファイルを切り詰める必要あり。 ■L29の rewind(); は意図不明。 ログファイルが壊れる(例えば 8424<>127.0.0.1420<>127.0.0.8420<>127.0.0.842の ように)から 入れたのなら、アイディアとしては◎だが、スマートな処理とはいえないかと。 ■あと、排他制御にバグがあるのでは。 ロックがかかっていても、fopen(); も flock(); も、 warning や fatal error (noticeも) を吐かないため、 処理が続行する。排他制御になってもならなくてもこのスクリプトは処理を最後まで実行するので、flock(); は ちゃんと働いてない。 実際には起こらないかも知れないが、論理上、ロックがかかっているために L32 の fgets(); が失敗して $buf に false が入ってカウンターが0に戻る可能性がある。L26でロックが取れなかった場合、 つまり前のリクエストを処理中の可能性がある場合、書き込みをスキップするかスクリプトを終了 するかブロックモードで待機させる必要があると思う。http://jp.php.net/flock にあるとおり、flock(); は 失敗すると false を返す。 ■同じ理由で、前のロックが邪魔してロックがかかっていないのに書き込みに進行してしまうことがある。 書き込みがいくつも重なると、dat の内容がが妙なことになる予感。ここらあたりを rewind(); が力技で 解消しているように見える。 ちなみにサンプルページ http://s2.arigato3.net/ ~hon7/blog/ ハイブリッドP2Pによるトラックバックを考えてます >>452 詳しく指摘していただきありがとうございます。 とりあえず''に統一し、関数名とレフトブラケットの間のスペースを 制御構造のみ入れるようにしました。 また、書き込み処理を行った後に、 // ファイルを切り詰める ftruncate($fp, ftell($fp)); という処理を加えました。 ロックのバグについてなのですが、Googleで調べたところ、 flockはデフォルトでブロックモードになっているらしいのですが、 http://itbtech.itboost.co.jp/perl/perl_06.php よろしくお願いします。 >457 ああごめん。Manualみたらおもっくそそう書いてあった、、。 flockでとまるから一般の環境なら多分大丈夫だね。 こっちの検証スクリプトの間違いなのでflockとrewindの話しはなかったことに。 秒間50リクエストくらいでは問題なかったです(php4.3.0 apache1.3.27 RHLinux)。 ftruncate ( $fp , ftell ( $fp ) ) ; は ( $fp , strlen ( $newdata ) ) ; なんちゅう書き方もある。 なるほど、参考になりました。ありがとうございます。 とある会社の部活動のHPを管理している者です。 Web上で部の共有資産の貸し出し申し込み等の管理を行えるといいなぁ、と思いいろいろとCGIを探してはいるのですがなかなか見つかりません。 探しているのは、次のようなCGIです。 1.画面で借りたい物を選択・自分の名前・貸出期間等の入力、申し込み 2.画面上では「貸し出し中」等に表記が変化(それか削除されるなど、申し込みが行えない状態に変化) 3.sendmailが使えないサーバなので、申し込みがあったことをログに吐き出し、管理人が定期的にそれをチェックし貸し出す こういうものです。 サーバはinfoseekのiswebでPerl、Python、Ruby、PHPが使えます。 ショッピングカートCGIを活用してもいいなと思ったのですが、sendmailを利用する物がほとんどで、上記のようにログにのみはき出す物はあったことはあったのですがシェアウェア(\15K!)でした。 それほど資産の数が多いわけでもなく、貸し出し回数もそんなに多くないので、15000円もかけるわけにはいきません。 出来れば無料、もしくは1〜2千円程度で利用できるCGIがありましたら、教えてください。 よろしくおねがいします。 >464 463です え〜と。 スレ違いだ、ということですか…? …すいませんでした。 sageはmail欄でw。 どっかに「こんなCGI探してます」的なスレあったハズだよ。 >>465 >スレ違いだ、ということですか…? スレ違いじゃないと思うんだったら自作CGIへのリンク貼れよ。 自作CGIを評価するスレなんだからさ。 >>464 >>467 ご迷惑をおかけしました。 >>466 >>468 そこに行ってみます。ありがとうございます perlでRead-Write Lockを実装してみますた。 複数プロセスでの10,000件書き込み耐久試験もクリアしたっぽいです。 ただ、ちょっと遅いように感じるのですがどでしょ? http://do.sakura.ne.jp/ ~junkroom/cgi-bin/megabbs/lounge/index.html 知識ゼロからがんばってXML化にこぎつけました。 スタイルシートだけでWebデザインが可能です。 PHP4+MySQL http://arigato3.s36.xrea.com/x/bbs.php >>473 すごいね。どのくらいすごいのかいまいちわからんけど。 どのくらい時間かかった? >>473 ダメXMLの見本として宣伝してもいいですか?っていうくらいダメなXML。 > 知識ゼロからがんばって XML化にこぎつけました。 ___Λ____ |知識ゼロのまま| ●●●マスコミの 「盗聴/盗撮」 は許されるの?その4●●● http://natto.2ch.net/mass/kako/994/994602694.html 62 名前: 文責:名無しさん 投稿日: 2001/07/10(火) 12:21 小型盗聴器、電話盗聴、web(電子メール)盗聴、郵便物の開封、 集合住宅の隣に引っ越してきて壁に聴診器、または集音マイクを向ける。 関係者からの聞き込み、ごみあさり、ストーキングにより行動パーターンの把握、 行動パターンを調べた上での待ち伏せ。全部、人海戦術を使えば十分可能です。 323 名前: 文責:名無しさん 投稿日: 2001/07/30(月) 20:48 集団で盗聴なり、付きまといなり、身辺調査なりした後で、集めた個人情報を利用して、 メディアを通じて本人にしかわからないように「監視してる」とほのめかしたり。 待ち伏せや尾行などしておいて、本人の前で「監視してるぞお〜」と、嫌がらせをしてみたりする。 これを一定期間継続して繰り返す。 一定期間、上記の嫌がらせを繰り返すと、加害者がすでに嫌がらせをしていなくても、 被害者は、ずう〜っと嫌がらせが続けられてると思い込んでしまう。 (痴漢の被害者が、外であった人が全員痴漢だと思い込むのと同じ) それと同じように、ここのスレッドに書かれている、盗聴した情報を二次利用する嫌がらせを やっていないときでも、被害者は自分から自分と関わりがある 情報をメディアから探し出して自分に関係があるのではないかとこじつけてしまう(関係妄想)。 関係妄想を引き起こすように嫌がらせを行うそれ自体がマインドコントロールの一過程である。 被害者が関係妄想を引き起こした時点で今度は精神病にかかったと噂を流して、さらにからかう真似をする。 ノイローゼになるように追い込んで、更に自殺するように持っていこうとする。 被害者がこういった心理状態になるのを嫌がらせの関係者は経験的に知っているのだろう。 すいません、午前中探したんですけど、見つかりませんでした。 パソコンと携帯3社兼用の掲示板で、スレッドまたはツリー表示でかつ パスワードで入る人の管理が出来るCGIご存じありませんか? スレッド、パスワードどちらかだけだとあったんですが・・・。 箱庭諸島PHP版の改造版、箱庭諸島S.Eを今日公開配布開始しました。 http://erobon.e-un.jp/ これはどうでしょうか? デザイン以外は自分で作りました。 >>490 CGIです。 サーバーサイドで動いているのでCGIです。 もっと勉強してください。 >>491 titleタグはmetaの後に書いてくらはい >>492 いま検索して調べたら metaタグの後にtitleタグを書いてました。 >>491 あのね、見た目とかを評価してもらうスレじゃないの ソースを公開してちょうだい > サーバーサイドで動いているのでCGIです。 CGIは動いたりしない。 >もっと勉強してください。 悪代官が黄門様に無礼者と言ってるのを思い出しちゃったw >>496 CGIとはWEBサーバーがWEBブラウザからの要求に応じてプログラム を起動するための仕組みです。 ”CGIは動いたりしない。” 馬鹿か? CGIはシステムでも仕掛けでもない。 インターフィエスの一仕様。 モジュールからプロセス作ることもできるが、 あれもCGI? >>502 どうせperl=cgiとか まだ思ってるアフォだろ? unlessはほかの言語と混同するからやめれ とか書いてある本があった気がする ほかの言語を使わなければいいだけの話なのに・・・ >>504 マジ? それって、if ははほかの言語と混同するからやめれというのと同じことだよね 汎用的なプログラミングの作法を身につける為なんじゃないかな?if だと他の言語でも大抵応用が効く。 同じような理由でperlの$_(暗黙の代入)はなるべく使うなとか書いてる本もあったよ。 >>506 なんだそりゃ?(藁 じゃあ混同しやすい elsif は使わないほうがいいってことか? >>508 差別はイクナイ! 何国ってのがどこのことだか知らんが,何国の人に失礼だよ(藁 >>509 ハァ? あたまのよわいのがなんにんか・・ って書いてあるが、どう読んだら何国の人になるんだ? 502,504,506,508が(ry >>510 「なにじんか」って読んだんだろ。>>511 の言うように洒落だろうがつまらん。 表計算ができるランキングCGIを作ってみたので評価お願いします。 http://ssr.xrea.jp けっこういい出来に仕上がったと思うけど、初めての人は操作にとまどうかも >>513 落としたYo とりあえず使えそう・面白そうな物だったら、朴らせてもらうわ(w ところで、ちゃんと評価してるのって最初のほうだけだね。 >>521 ・ここは見た目じゃなくコードを評価するスレだ。 ・use strict; しろ。 ・perlstyle 読め。 ・デカいの持ってきても面倒だから読まんぞ。 …のどれかに該当していたら、まともなレスは返ってこない。 DirectoryIndexの設定をしているtoktokも問題かと思うが。 Forbiddenにしたみたいだけど、 せめてファイル名変えなよ。 誰も居ない……ケチつけるなら今のうち。 if-elsifの書き方、 if{ .. }elsif{ .. } より if{ .. } elsif{ .. } の方が俺にとっては読み易いんだコンチクショー。 >>522 perlstyleなんて知らなかった…ありがとう、勉強になったよ。 例えば既成の掲示板のCGIとかから require 'axlog.pl'; AxLog::getlog('ログファイル名','ログ最大記録数'); の用に呼び出して使うアクセス解析。 何となく作ったんですが評価お願いします。 アクセス解析 http://torihamlog.s55.xrea.com/search/axlog.pl.txt ログビューワー http://torihamlog.s55.xrea.com/search/axlogv.cgi.txt ここにログビューワを設置して、それにアクセス解析しこんでます。 リモホとかIPとか晒す事になるので困る人は見ないで下さい。 パスワードは 1234 です。 http://torihamlog.s55.xrea.com/search/axlogv.cgi 念のため…コレ呼び出すとログを削除します。 http://torihamlog.s55.xrea.com/search/dellog.cgi >>529 とりあえず axlog.pl をザッと見た感じ。 > 39: my $logfile = ($_[0]) ? $_[0] : "log.dat"; my $logfile = $_[0] || "log.dat"; か my $logfile = defined $_[0] && length $_[0] ? $_[0] : "log.dat"; > 48: $ENV{'TZ'} = "JST-9"; local するか、呼び出し元と条件を揃える (設定しない) 。 > 58 〜 62 my($path) = $ENV{'SCRIPT_NAME'} =~ m|^(.*/)|; ログに ASCII 以外の文字を吐くのはあまりお勧めしない。 あと axlog.pl.txt や axlog.cgi.txt でも「.pl」や「.cgi」は含まれて いるので CGI プログラムとして動く。Apache のマニュアル参照。 >>529 axlogv.cgi 。 > 6: use vars qw/$pw $logfile $gzip_send $gzip/; 不要。 > 47 〜 53: my $gzip = $^O =~ /Win/ ? "gzip.exe -1 -c" : "/bin/gzip -1 -c" ; > 69: if ($mode eq "css") { Style_Sheets(); } わざわざ CGI で吐かせる理由は? > 74: else { print "Status: 403 Forbidden\n\n"; exit; } エラーメッセージを吐いた方が親切。 > 256: Content-type: text/plain; charset=Shift_JIS text/css >>530-531 評価ありがとうございます。 色々参考になります。 cssについてはファイルを一つにまとめたかったからです。 やっぱあんまり良くないですか? >> 74: else { print "Status: 403 Forbidden\n\n"; exit; } >エラーメッセージを吐いた方が親切。 if ($mode eq "css") { Style_Sheets(); } elsif ($pass ne $pw) { Error('パスワードが違います。') } elsif (($pass eq $pw) && ($mode eq "view") && ($ENV{'REQUEST_METHOD'} eq "POST")) { View(); } else { Pass_form(); } こうゆう風にしようと思っています。 >>532 ・CSS を変更する為にスクリプトを編集する危険を冒す必要がある。 ・外部に CSS を持つのに対し、常に二倍の回数実行される。 ・CSS を使い回す時に悩む事になる。 これらのデメリットを考慮の上で、なお一つにまとめるメリットの方が 勝ると判断したならいいんじゃないか? >>532 自己レス すげー馬鹿なこと書いていた if ($mode eq "css") { Style_Sheets(); } elsif (($pass) && ($pass ne $pw)) { Error('パスワードが違います。') } elsif (($pass eq $pw) && ($mode eq "view") && ($ENV{'REQUEST_METHOD'} eq "POST")) { View(); } else { Pass_form(); } たぶんコレでいいかな… 作った動機はなんとなくなんだけど、実用性とかどうでせう? 一応CGIの設置とかできて、ほんのちょっとだけいじれる程度人向けのつもりです。 いろいろわからんことだらけで作りましたが 添削して下しさい。 【スクリプト】http://www.tcn.ne.jp/ ~majima/dog/quiz.txt 【動作例】http://www.tcn.ne.jp/ ~majima/dog/quiz/quiz.cgi >>535 とりあえず画像のファイル名を変えた方が良いよw 20点頂きました >>535 もじゅーるは使えない鯖なんでつか? 使えるんなら使ったほうがいいでつよ。 Image::Magick、CGI、Jcode等々 何に使うのかは自分で調べてね。 EUCで書いたり表示したりしたほうがいいと思うけど、Shift_JISでやりたいのなら反対しないさ。 所々myを付けているが、どうせなら全部に付けちゃいな。 strictしろってこった。 ついでにHTML的にも4.01strict すれば? タイトル::時刻::内容\n というようなデータが数行あるような場合 それらを読んできて切り分けるって処理を してます。 これの評価お願いします。 sub split_data{ my @ref,@tmp,%hush; @tmp = @_; for (@tmp){ chomp; ($hush{title},$hush{time},$hush{contents}) = split /::/; push (@ref,{%hush}); } return(@ref); } @tmp = ("a::b::c\n","d::e::f\n","g::h::i\n"); @ref = split_data(@tmp) for(0..$#ref){ print "title:".$ref[$_]->{title}; print " time:".$ref[$_]->{time}; print " contents:".$ref[$_]->{contents}."\n"; } >>540 myで複数宣言するときは()がいる hushじゃなくてたぶんhashね. 連想配列っていみなら ハッシュのスライスを使うとエレガントかも @hash{qw/title time contents/} = split /::/; foreachつかえよ for(...$#ref) 541> >ハッシュのスライスを使うとエレガントかも >@hash{qw/title time contents/} = split /::/; ありがと、参考になりました。 my は複数でも()いりませんよ。バージョンによるだろうけど 最後に、今更foreach使ってる人いるんですか?w >>542 #--- test.p --- use strict; my $foo, $bar, $baz; __END__ > /usr/local/bin/perl -v This is perl, v5.8.5 built for i386-freebsd-64int <snip> > /usr/local/bin/perl -wc test.p Parentheses missing around "my" list at test.p line 2. Global symbol "$bar" requires explicit package name at test.p line 2. Global symbol "$baz" requires explicit package name at test.p line 2. test.p had compilation errors. > /usr/bin/perl -v This is perl, version 5.005_03 built for i386-freebsd <snip> > /usr/bin/perl -wc test.p Parens missing around "my" list at test.p line 2. Global symbol "$bar" requires explicit package name at test.p line 2. Global symbol "$baz" requires explicit package name at test.p line 2. test.p had compilation errors. >>541 >foreachつかえよ >>542 >今更foreach使ってる人いるんですか?w for と foreach は単なるシノニムなので、その表現は正しくないな。 foreach (LIST) BLOCK を for (LIST) BLOCK と略せるのと同様に、 for (EXPR; EXPR; EXPR) BLOCK を foreach (EXPR; EXPR; EXPR) BLOCK と書いてもエラーにならない。 foreach ループを意味するところで foreach と「書け」という >>541 の アドヴァイスは論拠の確かな正しいものだ。しかし Perl では C 風の for ループを使う機会が foreach ループに比べて圧倒的に少ない上、 人間の目からも for ループと foreach ループの区別は容易なので、 砕けた流暢な Perl を目指すならこだわる必要のない部分だと思うな。 >>540 %hush(多分hash?)の宣言の位置。 GCのコストを考慮した場合に、変数の再利用をするはあるけど...、 ループないで初期化してないとフィールドの数が少ない時に困るよ。 split/::/の代わりに正規表現を使ってデータを切り出すと、 データのチェックとsplitを同時にできて便利。 chompはデータ格納前に済ませておいた方が良いんじゃないかな。chomp(@tmp) もしくは、大抵はファイルから読み込むだろうからその時に。 >>544 どうもありがとう。foreachは普通に使えるんだろうけど、 大抵forで済ませてしまうのです。言い方悪かったです、スイマセン。 >>545 ありがとうございます。 >ループないで初期化してないとフィールドの数が少ない時に困るよ。 というのは、forのループ内で undef(%hush); (ほんとはhashでしたw) でいいですか? あと、フィールドの数が少ない時というのはどういうことでしょうか? >split/::/の代わりに正規表現を使ってデータを切り出すと どう書いたらいいのか思いつきません。宜しかったらご教授下さい。 >chompはデータ格納前に済ませておいた方が良いんじゃないかな。 そうですね。 open(FH,"file_name"); @tmp = <FH>; chomp(@tmp); close(FH); 言いたかったのはforeach (@ref)にしろよってことね 別にfor (@ref)でもいいかもしれんが あと>>543 読んだか? myは複数宣言するときは()いる >>546 >ループ内で初期化 for(hoge){ my %hash; statement; } こういう事だと思う my () つけなくてもエラー出てないです。 という事は 省略も可って事ではないでしょうか? >>548 エラーにならないのは strict 'vars' 宣言が無いからだ。 my $foo, $bar, $baz; という文自体は文法的には間違いじゃないが、 my は , より優先順位が高いので、my($foo), $bar, $baz; と書くのと 等価になる。 #--- test.p --- my $foo, $bar, $baz; print defined $main::{$_} ? "'$_' is global.\n" : "'$_' is rexical.\n" for qw(foo bar baz); __END__ > perl -w test.p Parentheses missing around "my" list at test.p line 1. Useless use of a variable in void context at test.p line 1. Useless use of a variable in void context at test.p line 1. Name "main::bar" used only once: possible typo at test.p line 1. Name "main::baz" used only once: possible typo at test.p line 1. 'foo' is rexical. 'bar' is global. 'baz' is global. >>546 > あと、フィールドの数が少ない時というのはどういうことでしょうか? これは、今回のケースでは問題なかったです。 でも、変数を再利用する時は気を付けないと、前の値が残っていたり、 意図しない場所の値を書き換えてしまったりするので注意。 例えば、pushの所を \%hash とりファレンスを使うように変更した場合。 my (@ref, %hash); foreach (@_) { # @refの中の前の値を上書きすることになる # {%hash}とした場合は、@refにはいってる値はコピーなので影響ない @hash[qw/title time contents/] = split/::/; push(@ref, \%hash); } my (@ref); foreach (@_) { my %hash; @hash[qw/title time contents/] = split/::/; # {%hash} でも期待通りに動作するが、余分なコピーを生成 push(@ref, \%hash); } 速度とかを重視するなら >>540 が効率良さそうだけど、(多分) バグとかみつかった場合に変数のスコープが広いと特定するのが困難になる。 >>542 > my は複数でも()いりませんよ。バージョンによるだろうけど 他の方に指摘のある通り。 最低限 use strict; use warnings;(もしくは -w) を宣言してないとPerlは教えてくれない。 ここってものすごいでかいスクリプトでも細かい所まで見てくれるの? >>550 何かおかしな日本語だった。訂正 s/他の方に/他の方からも/ あと、正規表現を使った方法を書き忘れてたのでついでに、、 例えば time が整数の場合の例 if (/^(.+)::(\d+)::(.+)$/) { @hash{qw/title time contents/} = ($1, $2, $3) } >>551 読むに耐えうる書き方&内容ならな。 KENTレベルなら却下 >>553 オブジェクト指向とか頑張ってやってみたけど中途半端になったようなのでも大丈夫ですか? 何書いたって叩かれるんだから、結城出していいと思う ほんとにこんなに色々な方が、教えてくださるとは思ってませんでした。 どうもありがとうございます。 特にエレガントな方法を教えてくださった542氏 ハイレベルな(少なくとも今の私には)指摘をしてくれた 545=550=552氏には感謝します。 その他あのようなケチなコードに意見を下さった方々ありがとう。 またお世話になるかもしれません。m(_ _)m > my は複数でも()いりませんよ。バージョンによるだろうけど > 最後に、今更foreach使ってる人いるんですか?w こんなこと言うやつはもう来なくていい 誘導されてきました。 評価というか不具合の問題です 初めてperl書いてみました。 簡易的な計算のプログラムを作ってみたんですがうまく動作しません。 ちょっと見て頂き、不具合等御指摘下さい 特定の計算式で、入力(1項目だけセレクトボックスにより選択)した数値を計算するものです。 ソース http://tool-ya.ddo.jp/2ch/trash-box/contents.jsp?file=20050123003423509.txt URL http://sr-cafe.chu.jp/kok/calc.html >>563 ソースはマンドクサイのでちゃんと読んでないけど、 文字コードと改行コードの問題の様な希ガス。 >>563 calc.html × <SELECT name="set" name="s1"> ○ <SELECT name="s1"> >>563 ReadFormData(*FORM); → %FORM=&ReadFormData; print <<END_OF_DATA; → print <<"END_OF_DATA"; Content-type: text/html; → Content-type: text/html\n\n 以下 sub ReadFormDataの修正 local(*FORM) = @_; → my %FORM=(); local($buf, $tmp, $name, $value); → my($buf, $tmp, $name, $value); return %FORM; ← 最後に追加 >>566 改行コード2つとダブルクォーテーション必要無くね? \n\nはいらんね。 ヒアドキュメントのダブルクォートはどちらかというとあったほうが・・・ ありがとうございます。 >>566 サンの通りにしたり、色々試してるんですがまだ動かないです… printが閉まってなくてフォームの値を処理出来てないんでしょうか… >>569 うちのサーバでスクリプト試したんだけどちゃんと動くぜ。 おまい、サーバに嫌われてるんだ。きっと。 問題は print <<END_OF_DATA 〜 END_OF_DATA までか、 まさかと思うがパーミッションか、perlの指定。 一度 print <<END_OF_DATA 〜 END_OF_DATA を たいした行数じゃないんだし、print "〜\n"; に置き換えてみ。 それからコメント行やめろ。余計見づらくなる。 >>569 今試したら566の変更だけで動いたわけだが。 Content-typeの行はそのままでも良いみたい。 動かないとしたらCGIの設置方法の問題。 まさかとは思うがローカルでテストしてるよね? つーか563のソースのままでも、ちゃんと結果出るじゃん。 問題はコードではない予感。 >>573 経験で言うとさ、ヒアドキュメントはサーバの機嫌で、最初はうまく動作して くれないことがある。Cookieなんか入れるとどうも変なんだよな。 そういうとき俺はメンドーでも print "〜\n" に置換えてやる。すると、あとは 「ヒアドキュメントでも読込んでやるかぁ」ってことでサーバは折り合ってくれる。 いや、あるんだって。コード書く時も、こうした方が処理が楽だろ、とか ムリしなくっていいから、とか気を使ってやると機嫌よくなる。ほんとだぜ。 577はコード丸写しで自作CGIと称してるだろw。 多かれ少なかれ576のような感じはあるな。 皆さん本当スイマセンでした! パーミッションの所為だった… 元のままでも566のコードでもどちらでも動きました。 >>571-572 そのとおりです。 ローカルでテスト出来るという事すら知りませんでした。 勉強します。 ねるねるねるねは Ψ(`∀´)Ψイッヒッヒッヒッヒ _▲_ ねればねるほど ((φ(..。) 色が変わって _▲_ こうやってつけて р(゚Д゚ ) *_▲_* ウマイ━━━*━ヘ(゚∀゚)ヘ━*━━━━!!!! テ-レッテレ-♪ ttp://c.hibi.info/Apple-1.zip どなたか評価(清書?)お願いします_ _ 指定されたスレの中から前日から当日までの既定の時間にあるレスを抽出して、 そのレスから株価コードを抜き出し株価の前日比、前日比率でソートしランキングを作成した後スレに書き込むツールです。 2chへの書き込み時のCookiee処理に曖昧な点があるのと、処理の最適化をして貰えると嬉しいです。 宜しくお願いします_ _ 他のスレから来ました。 Perlで他のサイトを取得して表示したいと思っています。 (著作権侵害とかそういうことをしたいのではないです) お時間のある方にお願いしますが、次のコードで@niftyのトップページを取得してみたら どうなるか教えていただけませんでしょうか? print "Content-Type: text/html\n"; print "\n"; use LWP::Simple; print get( 'http://www.nifty.com/' ); 私のところだと、ブラウザ上での表示がぐちゃぐちゃになるんですが…。 簡易予定表のようなものを組んでみたんですが、なんだかモッサリしてる気がします。 もっと簡潔に書けるような気がするんですが自分ではこれが限界でした。 あと、ファイルロックのやり方が合っているのか自信がありません。 一応動いていることは動いているんですが、問題はないでしょうか。 改良すべき点、根本的にこういう書き方に直した方が良い、とかあればアドバイスお願いします。 大まかな内容は以下のようなものです。 予定として保存する内容は「予定日(月と日)」と 「予定内容(長くても200バイト程度)」の2つでフォームから渡します。 予定を保存するファイルは月単位で作成します。 例えば2006年6月の予定の場合なら「200606.txt」というファイル名です。 保存するファイルがないときはその都度作成し、 6月1日 6月2日 6月3日 . . . という風に日付だけを先に入れておきます。 保存するファイルがあるときは、 フォームから渡された「予定日」とマッチした日付の次の行に「予定内容」を書き込みます。 内容は以上です。次レスにコードを晒します。 # 保存するファイル名 $a = sprintf("%04d%02d",$YEAR,$MON) $file = "$a.txt"; # 月から日数を出す if($MON == 1|3|5|7|8|10|12){ $m = 31; }elsif($MON == 4|6|9|11){ $m = 30; }else{ if($YEAR % 4 ==0){ $m = 29; }else{ $m = 28; } } for($i=1;$i<=$m;$i++){ $date .= "$MON月$i日\r\n\r\n"; } # 該当する月のファイルがなければ作成 if(!open(IN,"$file")){ open(OUT,">$file") flock(OUT,2); print OUT $date; close(OUT); } open(IN,"$file"); flock(IN,2); @A = <IN>; close(IN); # 「予定日」とファイル内の「日付」をマッチングさせて該当日付に「予定内容」を書き込む $loop = @A; $i = 0; while($loop > 0){ if($A[$i] eq $plan_day){# $plan_day = "フォームからの情報(予定日)"; $A[$i] .= "$plan_value\r\n";# $plan_value = "フォームからの情報(予定内容)"; } $loop --; $i ++; } if(!open(OUT, "+< $file")){&error;}; flock(OUT, 2); truncate(OUT, 0); seek(OUT, 0, 0); print OUT @A; close(OUT); >>589 まだちゃんと読んでないが…。 >if($MON == 1|3|5|7|8|10|12){ >}elsif($MON == 4|6|9|11){ これって比べてるのは、両方とも $MON == 15 だよね。 どっちの条件にも入らないと思うけど…正しく動作してるの? >$a = sprintf("%04d%02d",$YEAR,$MON) セミコロンは? 動作するヤツうp switch文を使うと見やすいんじゃないかな? use Switch switch ($MON) { case [1,3,5,7,8,10,12] { $m = 31 } case [4,6,9,11] { $m = 30 } case [2] { $m = $YEAR % 4 ? 28 : 29 } else { print "そんな月知らん" } } レス遅くなりました。すみません。 該当部分を切り出して動作するコードをUPしてきます。 ttp://up.isp.2ch.net/up/b2611f9a934e.zip UPしました。パスは「589」です。 日付のところは594さんのアドバイスにしたがって書き換えました。 アドバイスの方よろしくお願いします。 >>591 >>592 コードの一部分だけ抜き出してできるだけ短く書こうとしたので 分かりにくかった&書き損じがありました。すみませんでした。 >>594 perlでもswitchが使えるとは知りませんでした。 Switch なんてモジュールがあるのか知らんかった。 PerlはPHPとは違ってCPANを探せば考えられる大体の車輪は既にある。 特定の板のスレタイ検索をして、選んだスレから画像とかのサムネイルを表示するスクリプトを書いてみまスた(・ω・`) 恐ろしく見づらいと重いまスが・・ http://vip.ty.land.to/image/ http://pc8.2ch.net/test/read.cgi/php/1160569533/ でボチボチいじくったり、新しいことやったりしていきたいと思ってまスが、評価して欲しいス(・ω・`) 勉強かねてるので、車輪の再開発なのは承知でス >>606 言葉遣い荒いけど、ばーっと書いた弊害なので許して。 取りあえずぱっとみてこんなもん。 ・一部のうpろだは、リファラが不味いと弾かれる。 ・画像がない場合の画像を一々作るのは無駄。 ・CGIモジュール使え。 ・グローバル変数も宣言しろ。 ・これは好みだけど、設定の変数はハッシュに纏めた方が分かりやすいこともある。 ・メインの流れはブロック作ってラベル付けた方が分かりやすいかも。 ・正規表現の|は案外コストがかかる。配列にしてマッチング。 ・先頭にrequire バージョン名; ・use warningsは〜? ・汚染チェックもきれい好きな方にはオススメ。 ・サブルーチンを先頭で宣言して欲しい。 ・変数名に日本語はいやん。 ・データーベースつかってほすぃ。 >>607 おぉぉぉレスもらえたス(;ω;`)アリガタイ 感謝しまス! >・正規表現の|は案外コストがかかる。配列にしてマッチング。 >・先頭にrequire バージョン名; >・use warningsは〜? >・サブルーチンを先頭で宣言して欲しい。 良くわからないス(・ω・`) >・変数名に日本語はいやん。 英語苦手ス・・・毎度翻訳スかね・・頑張るス >・データーベースつかってほすぃ。 現在勉強中でス! 生暖かい目で見守ってやってくださいス・・(・ω・`) やっぱレベル高い人の意見は参考になるス! 文句なし!って言われるようなものをいつか作りたいス(・ω・`)thnkス >>606 うる覚えなんだが if($i_m_f){ use Image::Magick; } これって意味ないんじゃなかったっけ? $i_m_fが真ならImage::Magickを使うって事なんだろうけど、 この書き方だと$i_m_fが偽でもImage::Magick呼ぶんじゃなかったっけ? 識者の方レスよろ ファイルハンドルは大文字で 最後から10行目くらい@cache[$i]は$cache[$i]じゃないの? print文中の"をエスケープするんならprint qq|ここに"文章"|; こーすりゃいちいちエスケープしなくておk >>609 サンクス >最後から10行目くらい@cache[$i]は$cache[$i]じゃないの? どちらも同じ意味だったはず (若干の差はあるかもだが、使い方に大差なしでは?) >print文中の"をエスケープするんならprint qq|ここに"文章"|; >こーすりゃいちいちエスケープしなくておk mjdsk!? 次から挑戦してみる 色々アドバイスやら素敵な解決策をありがとう useするかどうか切り替えたいなら BEGIN{}で囲ったほうがいいな。 >>609 >うる覚えなんだが http://www.tt.rim.or.jp/ ~rudyard/hirago014.html > これって意味ないんじゃなかったっけ? http://perldoc.jp/docs/perl/5.6.1/perlfunc.pod#item_use_Module_VERSION_LIST > ファイルハンドルは大文字で bareword で扱わず変数で取り回す方が今風。 http://www.kt.rim.or.jp/ ~kbk/perl-5.8/perlfaq5.html#how_can_i_make_a_filehandle_local_to_a_subroutine_how_do_i_pass_filehandles_between_subroutines_how_do_i_make_an_array_of_filehandles >>610 > どちらも同じ意味だったはず http://www.kt.rim.or.jp/ ~kbk/perl-5.8/perlfaq4.html#what_is_the_difference_between__array_1__and__array_1_ あちこちから routin をかき集めて自作しました : alter.s225.xrea.com/cgi/bbs/read.cgi?log=0 1. 評価と言うよりも bug の あぶり出しを希望します. 2. 操作がわかりづらいとの意見があります. 率直な ご意見をお願いいたします 3. 自信がないのが security 関連 ・ 念のため, 全ファイルを upload しておきます: alter.s225.xrea.com/bbs.zip >>612 URLが長すぎて横スクロールでた。 ふざけんな改行しろこのボンクラっ! IDなんだしもっと短く付けろよなw 文章そのままって酷すぎるw >>613 お返事ありがと〜. でも, どういう意味かしら ? 誘導されて来たのに いまだに誰も... どうなってるの ? >>617 「とても読めたもんじゃない」 ということではないでしょうか。 613は釣りとしか思えない。 CGI以前の問題ね。 >>618 >CGI以前の問題ね 確かに... JavaScrit の bug がぁ〜〜〜 (絶対に書き込めない) おまけに... WaMCom (Mozilla1.31) では問題とならなかった error が IE5.17(Mac版) では発生して処理が止まる〜〜〜. >613は釣りとしか思えない 釣りでは ありませぬ. 僕の環境で確認できる bug は退治しました. 引き続き あら探しをお願いいたしまする〜. つっこみどころが多すぎるなぁ…。 まず、「何を作ったのか」という概要や大まかな処理の流れすら書いてない。 >評価と言うよりも bug の あぶり出しを希望します. 評価するスレ。デバッグする所ではない。てか、デバッグなめすぎ。 >操作がわかりづらいとの... 具体的にはどういう操作? >自信がないのが security 関連 どのファイルの何行目のどういう処理? >JavaScrit の bug がぁ JavaScritのスレへどうぞ。 >WaMCom (Mozilla1.31) では問題とならなかった error が >IE5.17(Mac版) では発生して処理が止まる と書いていながら >僕の環境で確認できる bug は退治しました ってどうよ。 何より、CGIについて無学なのがバレバレです。 背伸びせずPerlからでもきちんとお勉強しましょう。 これさぁ、変数の検査とか書き込む条件とかまったくないじゃん。 最低でも変なファイル作られないようにするとか異常にでかい投稿は 書き込まないようにするとかしないと。 叩き専門の人にとっては叩く必要もないほどへなちょこだけど プログラムに日本語を含めないつくりはいいと思う。 プロでもソースのいたるところに日本語を埋め込む人はいるからね。 ぶっちゃけそれくらいしか褒めようがないんだけどw nullぽっぽはもしかしてOperaメインなの? >>613 まずはuse strict及びuse warnings、 また-Tオプションを付けてエラーが出なくなってから来てください。 nullはクラシックMacのiCab使いだった筈。 まず, 皆さんにお礼を... ありがとう ごぜ〜ますだ. >>620 一応, 掲示板 CGI script (のつもり) >デバッグする所ではない 言葉を間違えたかも ? debug を他人に依頼するようでは問題外だと思っております. 動作はするけれど server 利用者に迷惑を書けるような security hole に気づいていないかも知れない. そんな問題があったら指摘して欲しかったですだ. >>621 >変数の検査とか書き込む条件とかまったくないじゃん おおせの通りです. ようするに書きこみの部分を改良しなければならないのね ? で, read.cgi の方は どうでしょう ? 人に迷惑を書けるような security hole が あったなら ご指摘くださいませ. >CGIについて無学なのがバレバレです 弁解の余地もありません. でも, 半端者の僕が言うのもアレですが 拾って来れるものには満足できなかったのら. そもそも perl って できの悪い土台に無理な建て増しをした印象が... >>621 >プログラムに日本語を含めないつくりはいいと思う 日本語を書きこむと文字化けするのでwww (僕の環境は一般的でない) 僕なりに いろいろ拾って来て解読を試みました. その時, "皮肉にも comment が見通しを悪くしている" と思ったの. 徹底的に簡素化するのが先決だと... > nullぽっぽはもしかしてOperaメインなの? MacOS9.22 上で まともに動く Opera はなさそうです. 現在は WaMCom(Mozilla1.31+) がメインですだ. 動作確認に iCab, IE も立ち上げることがありますが, あくまでも参考程度です. >>622 メモメモ... >>623 今では動作確認の参考程度ですだ. 改良されたかと思うと別の不具合が発生するのが許せません. ところで rgst.cgi で変なファイルを作れる可能性って ? (これこそが最も知りたいところ) 量の制限は早急に対処したいと思いますが... 利用者から見えない変数名、関数名を縮める意味があるのかと小一時間。 Perlにケチつけるまえに自分の頭の程度を疑えよな 日本語のコメントを入れないのが良いって… なにその英語はカッコイイ、日本語はダサいっていう中学生wwwww それに、日本人なんだから直感的にわかりやすい日本語で注釈をつけておくのが、 あとを引き続く人へのマナーだと思うんだが。 予想していたとはいえ, ボロボロだなぁ. まあ, 他人様に使ってもらおうとするのなら それなりの配慮が必要だろう. しかし, 僕は自分のために作ったんだ. 最低限, 同じ server 利用者に迷惑を書けない配慮をすれば済む話なんだ. 僕が知りたかったのはその部分に問題があるかどうか なんだけど, 話は あらぬ方向に... 率直に言ってゴミ.基本から勉強し直した方がいい. というかまずは普通の学校の勉強を頑張った方がいい. ひとつだけヒントを. > read(STDIN,$u,$ENV{'CONTENT_LENGTH'}); たとえ寝ぼけて他としてもこの一行を書いてしまうようでは CGI 書くのは辞め た方がいい. プログラムの途中に文字列リテラルを埋め込むな、というなら解らないでもない。 ただ、それは日本語に限った事じゃないな。 >>634 んじゃ〜ゴミでない script を書いてくらはい. あっしは それを使わせていただきますだ. (イヒヒ) >>635 >この一行を書いてしまうようでは CGI 書くのは辞めた方がいい して, その理由は ? それと read.cgi に security hole は ないのかどうかが知りたいのだけどなぁ. ------------------------------------------------------------------- なんだか僕の質問に きちんと答えた回答はない. ここを当てにした僕が愚か者ってことですかい ? まだ分かってないみたいだね. >>この一行を書いてしまうようでは CGI 書くのは辞めた方がいい >して, その理由は ? セキュリティホールになるから.理由は自分の頭で考えなさい. >それと read.cgi に security hole は ないのかどうかが知りたいのだけどなぁ. 当然ある. >>637 よく分かっていないようだからキミがすべきことを具体的に言おう。 スクリプト冒頭の#!/usr/local/bin/perlを、 #!/usr/local/bin/perl -T use strict; use warnings; に書き換えてデバッグしなさい。 >>633 >>637 でカンマを多用したり、 >>638 でドットを使ったり、 キモチワルイ。流行ってるのか? というかプログラマのくせに 「、」や「。」の代わりに「,」「.」使う奴って なんだかなぁ… >read(STDIN,$u,$ENV{'CONTENT_LENGTH'}); この一行は書いてもいいよ。その前の行で$ENV{'CONTENT_LENGTH'}の最大値を 決めてチェックしていればね。 >>637 人に物事を頼む態度じゃないよね? こっちはみんな善意で見てるってこと忘れてる? 嫌なら他行ったら? 最初に自分で書いてたみたいだけど、他人のソースのつぎはぎスクリプトでしょ? 何の価値があるの? まずはダサくてもきちんと問題なく動く物を作ることからじゃない? 利用者のことを考えないスクリプトなんて糞だと思います。 ちなみにおいらのほうは、鯖が不調で繋がりません。 どうにもならんのでしばらく放置〜 まだ様子見てくれてる人とかいるのだろうか・・・ もし居たら感謝 自分がよく理解していない言語で書いたプログラムを なぜ共用サーバーで使おうと思えるのか、その神経が理解できない。 プログラムよりも、その意識や存在自体が危険。 >>637 >なんだか僕の質問に きちんと答えた回答はない 「きちんと答えた回答」があることにさえ気付けてないだけ。 自分の無知を棚に上げておきながら、 コードに目を通してマジレスしてくれた住人に対して >ここを当てにした僕が愚か者ってことですかい? とは随分とご挨拶だな。 ま、オレが見た限りでは お前の掲示板CGIscriptには何のsecurity holeもないよ。 安心して使って良い。オレが保証する。 でも実際「大丈夫、何の問題もないよ」としかレスされてなかったら、 ということを◆.PT9876/4Uは考えてみた方が良い。 645も指摘してる通り、今の時点では自分にその言葉が正しいのかどうかすらも 判断できないのに、共用サーバーで自作CGIを使おうとしていることがどれだけ危険か考えてみろ。 極端なことを言えば、それらしい説明があって「これを書き足した方が良い」と言われれば、 それが危険なコードであっても追記してしまうんじゃないのか? 少なくともこれだけマジレスしてくれたり お世辞にも読みやすいとは言えないようなコードを読んでくれただけでも感謝すべきなのに 「まずこれをやれ」と言われたことはやらず、 自分のレベルの低さを指摘されると反省するどころか逆ギレして 637のような皮肉と煽りに満ちたようなレスしかできないことを恥ずかしいとは思わないのか? うわっ, お祭りになってる〜 (~_~) (突っ込まれると思った global variable の突っ込みは なぜかないのね) >>639 なるほろ... さっそく確かめてみますだ〜. >>642 おありがとうごぜますだ〜. なんだか怒ってる人が居るみたいだけど, こういうときは百計逃げるにしかず... (ぴゅ〜) サブルーチンの宣言ってなんじゃらほい? スクリプトが見れないし何の事を言ってるのかわからんち。 >>641 理系の論文はそういう仕様らしいぞ。 情報系の大学院でまともな教育受けた人間なら気持ち悪いとは思わない気がする. 気持ち悪がるのは専門学校程度しか行けなかったやつか基本をろくに知らない文系プログラマじゃね? おかしいな、ここは日本語で話しをする場所じゃなかったのか? いつから自分の投稿を論文調で発表する場になったんだ? とりあえず、読みづらい。 読み手を考えないのは、物づくりで使い手を考えないのと同じ。 邪魔 あれだ、脳内補完で「,」も「.」も消し去っていた件 別にそんなに気にする程のことでもないだろ。 ウザイのは句読点じゃなくてnullの存在なだけなんだし。 どうい されて たまるか ! どうでもいいけど... いや, やめておこう... ... sub file_read { my $a = $_[0]; open( FH , $a ); while (<FH>) { print; } close FH; } こんなサブルーチンを作ったのですがうまく動きません なぜですか? >>660 スレ違いにも程がある。これはまぎれもなく板違いでもない! ドメイン違いの質問だ。よそのドメインいけ さすがに句読点でいちゃもんをつけるのはどうかと思う。 性懲りもなく, 評価依頼: ttp://homepage2.nifty.com/alter/ ・ 以前指摘された部分には一応, 対策を施したつもりっす. ・ CGI は perl script で, HTML の代わりに外部 js ファイルを吐き出す仕様. (Ajax と違って, web-browser の影響が なく, 文字コードの問題も回避できる) ・ script 内の HTML 記述が皆無なので見通しが良く, 動作も軽快. ただ, 注意して作ったつもりですが, 見落とした bug が潜んでいる可能性が大きいっす. そして誰にも相手にされず>>665 は1年が経ったのであった 糸冬わり | | ガガガッ | | 人 ∧_∧ < >_∧∩ ( ・∀・) 人`Д´)/ ←>>203 と ) < >_∧∩ Y /ノ .人`Д´)/ ←>>259 / ) < >_∧∩ _/し' //. V`Д´)/ ←>>433 (_フ彡 / 誰でも簡単にネットで稼げる方法など 参考までに、 ⇒ 『半藤のブブイウイウレレ』 というサイトで見ることができます。 グーグル検索⇒『半藤のブブイウイウレレ』 8CQR9BVF30 ☆ 日本の、改憲を行いましょう。現在、衆議員と参議院の 両院で、改憲議員が3分の2を超えております。 『憲法改正国民投票法』、でググってみてください。国会の発議は すでに可能です。平和は勝ち取るものです。お願い致します。☆☆ プログラミングを誰でも習得できる方法は、「前場アキドルのプログラミングマスター方法」というブログで見られるらしいよ。ネットで調べると見られるらしいです。 OT97Q read.cgi ver 07.5.1 2024/04/28 Walang Kapalit ★ | Donguri System Team 5ちゃんねる