自作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になる・・ read.cgi ver 07.5.0 2024/04/24 Walang Kapalit ★ | Donguri System Team 5ちゃんねる