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) で、エディタで直しました。
1月29日に、石井さんは書きました。 >ただテキストファイルの中身を見たら、アップルはアップルIIの頃から、 >改行がCR+LFでないと改行しないという癖がありまして、多分、テキストファイルに >改行しかないのでしょう、改行のところが変な字に化けていました(T_T) 改行はOSによって違いますね。 UnixはLF、DOS(Windows)はCR+LF、MacはCRです。 # HTTPのtext/*なentityでは上記3種のどれでも良いことになっています。 ## HTTP自体ではCR+LFですが。 ちなみに simple text 等ではCR改行しか扱えませんが、Jedit等では上記3種の 改行を扱えますから問題無いでしょう。 # うぇぶ会議室のスクリプトはUnix(HP-UX)上で開発しているので、 # スクリプト中の改行はLFの物を配っています。
にあさんお久しぶりです。 最近、考えてるんですけど 他のサイトのホームページのデータを 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>
三葉工房です。既に5日前の投稿ですが,YASU様の御質問にお答えします。 A.に続く文章が回答です。 色々と,本当の礼儀の大切さについていい勉強になりました。 どうもありがとうございました。 >>簡易スクリプト(配列の性質) > >martとかgghとかsdとかdfrとかは何か意味のある単語や略語なんでしょうか。 >何のための変数なのか、もっと分かりやすい名前を付けたほうが読みやすいし、 >保守やデバッグが楽じゃないかと思うのですが…。 A.これは,MacParl上のテスト用で,適当にmartとかgghとかの名前を付けただけです。 >>print "$dfrのはずが$gghの$nrの$dhy\n"; > >というのをぱっと見て、どういう情報を出力しようとしているのか分かりますか? A.適当な称号を使っているので,自分か,若くは,よほど簡単なプログラムでなければ 分からないと思います。 >それと、ブロック("{" と "}" で囲まれた部分)などは > > 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'}; > } > >のように字下げして書くことを<STRONG>強く</STRONG>お勧めします。ブロックの中を全く字下げ >していないと、プログラムの制御構造の流れが追いにくく、とても読みにくいです。 > ># 少なくとも、前に投稿された例えば「<A href="00580.html">徹底的な…</A>」などのスクリプトを ># 目にしたときは、ぱっと見ではどこからどこまでがひとつのサブルーチン ># なのかすらさっぱり分からず(今でもあまり把握していませんが)、読む気も ># しませんでした A.そうですね。プログラムは,分かり易く書くべきと思います。だんだん,プログラミングに 慣れるに従ってメチャクチャになりましたので。 > >ラクダ本の第2版(背表紙の青いほう)をお持ちなら、いちど「8.4 プログラミングの >書法」(pp.626-)あたりに目を通してみてください。 >初版(背表紙の赤いほう)にも同じような内容があったはずですが、いま手許に >無いので何処に載っていたかはわかりません。 A.プログラミングの書き方の基礎が記述されていました。 $dfr=@newmartと言う形で,$dfrの値は,しっかり配列の値の合計値の16と >>出力され,その配列を更に@fft=@newmartと言う記述で@fftに代入して,$dhy=@fft;で > >16は「配列の値の合計値」ではなく、単に配列の要素の数ですね。 > ># 三葉工房の管理者さんにとってはそういう意味なのかも知れませんが、 ># 少なくともプログラミング上の一般的な用語としては、両者は違うものを ># 意味します > ># ちなみに、何故「17」ではなく「16」なのか理解してます? A.配列は,C Languageと同じく0から数えるから。17は,$arrycnt=@arryと言う 形の配列の値の合計値を数えている。 >>という書き方の様に$martの変換前の状態を文字変換タグで配列の('値','値')に変換して, >>変数のみで配列に代入するだけだと,$ggh=@martと言う形で配列の合計値を算出すると >>値は1で,@mart=@mart,$nr=@martとしても$nrの値は1で,スクリプトの終わりの方の > >いくら文字列としてリスト(配列)に見えるように加工しても、依然として >それは単なる文字列にすぎないからです。 > ># @array = $scalar という式が一体どういうことをやっているのか、 ># よ〜く考えてみてください > ># @array = (123, 456, 789); ># $scalar = @array; ># @array = $scalar; ># $scalar = @array; ># とすると @array と $scalar の内容はそれぞれどうなるのか、それは何故なのか、 ># よ〜く考えてみてください A.上記の >同様に、$scalar = @array;をMacperlで実行してみました。 @arrayを$scalarへの1回目の代入は,@arrayの配列が記述されていますので, 3が返ります。 しかし,更に@arrayの入った$scalarから更に配列へ代入すれば,それは,単なる 1要素に過ぎないとみなされますので,@arrayを$scalarへの2週目の代入で値は 1が返ります。 > > $program = "print 1 + 2;\n"; > $program; > print $program; > >は、3 とは表示せずに print 1 + 2; とだけ表示します。「プログラムっぽく >見えるもの」は、必ずしも「プログラム」ではありません。 > ># しかし、eval($program); は 3 と表示します ># 何故なのかはマニュアルや本やWebをどうぞ A.MacPerlで実行してみたら3が返ってきました。$evalは,プログラムの要素と要素 の計算をする関数らしいですが,駱駝本を読んだらやや初心者には,難解な解説が 書かれていました。ちなみに,駱駝本の他に購入したperl本は,技術評論社の 「CGIのための実践入門perl」ですが。 >では、どうやって文字列を配列に変換すればいいかは、いしどうさんの<A href="00605.html">投稿</A>を >参照してください(そしてマニュアルや本や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ループを使って)なされていますよね…。 > ># そもそも、目的の記事を「パスワード」をキーにして探すという仕様自体が ># とても不自然に感じるのですが… A.上記の質問は,黒幕的存在という記事で答えました。本来は foreach $keymatch(@keymatch){ ($mail,$yourname,$date,$gurl,$hpagename,$coment,$password)=split(/&&/, $keymatch); if($in{'pawin'} eq $password) { $keyflag=$keyflag+1; last;} } で全ての$password)にマッチしますが,mailmgを除いてのパスワードに改行文字が付加 されていて,一致せずにそのような結果になりました。$keyfragは,パスワードが マッチすれば,1たされ,削除or変更の対象記事が出力されます。 ですから,$passwordの値は @keymatch の各要素(つまりはファイルの各行)に応じて 変化します。 > >質問というものは、他人が読んで理解できるように書かなければ、誰も答える >ことができません。三葉工房の管理者さんに限ったことではありませんが、 > > 「<EM>答えてもらいやすい質問をしてください。</EM>」 > >質問記事の読みやすさは、プログラムの読みやすさより数倍重要です:-) A.その様に次回から心がけます。(これだけ無作法な行為をして投稿する資格は あるはずないのですが。) 後,余談なのでずか,もし手が空いていたら教えて下さい。本来とは,関係の ない質問もございますが,関心がありますので,失礼な事聞いて済みません。 1.YASU様は,perlを始めて何年になりますか。 2.perlのプログラミングで一番つまづいた経験はなんですか。 3.回答者の方々は,ふだんは,どんな事をしているのですか。そして, TAD様とかにあ様と石堂様とかはかお知り合いですか。 にあ様と石堂様は,文章から見て女性の方だと思いますが。
いしどう です。 とりあえず、関係あるとこだけ (^^) 2月8日に、三葉工房の管理者さんは書きました。 >2.perlのプログラミングで一番つまづいた経験はなんですか。 正規表現でしょうか。 Perlを使い始める前に UNIX を使ってたもんで、その時のクセが抜けずに 何回もPerlに文句をいわれた記憶があります。 >3.回答者の方々は,ふだんは,どんな事をしているのですか。 とりあえず、わたしはここの会社に勤めてます。企業ユーザの 皆様にコンピュータを売る仕事をしてます。 >そして,TAD様とかにあ様と石堂様とかはかお知り合いですか。 えと、ここの会議室の上だけでの知り合いです (^^) (多分) 直接あった事はないはずです。 >にあ様と石堂様は,文章から見て女性の方だと思いますが。 いちおー、わたし、男ですけれど (^^;; (一人称が「わたし」だからかなぁ。でも、昔っからこういう風に 書いてるもんで)
2月8日に、三葉工房の管理者さんは書きました。 >3.回答者の方々は,ふだんは,どんな事をしているのですか。そして, >TAD様とかにあ様と石堂様とかはかお知り合いですか。 他の方はともかく、にあは計算機とはあまり関係の無い職場ですね。 # 業務以外でサーヴァの面倒を見てたりはしますが。(^^; 「お知り合い」と言うのが、会って酒飲んだりする関係だとすると、答えはNoです。 この会議室とか、オンラインでのコミュニケーションを取るだけの間柄ですね。 あたしはそう言うのも十分「お知り合い」だとは思っていますが。(^^) >にあ様と石堂様は,文章から見て女性の方だと思いますが。 ...では無いですね。(^^; # 自分では、まだまだ若いつもりではいますが、世間一般の基準からすると、 # 既におじさんの部類に入りつつある、と言ったところでしょうか。(^^; ## 石堂さんもあたしより1つ上だから、やはり (以下自粛) ちなみに、三葉工房さんはMacユーザなのでご存じ無いのでしょうが、石堂さんは Windowsでは定番のニュースリーダ、WinVNの日本語化などもなさっている方ですよ。(^^)
2月8日に、三葉工房の管理者さんは書きました。 >>martとかgghとかsdとかdfrとかは何か意味のある単語や略語なんでしょうか。 >>何のための変数なのか、もっと分かりやすい名前を付けたほうが読みやすいし、 >>保守やデバッグが楽じゃないかと思うのですが…。 > >A.これは,MacParl上のテスト用で,適当にmartとかgghとかの名前を付けただけです。 テストとはいえやはりわかりやすい名前を付けた方が良いと思いますよ。 あるいは、せめて他人に質問するときだけでもわかりやすい名前に変えるとか。 >>というのをぱっと見て、どういう情報を出力しようとしているのか分かりますか? > >A.適当な称号を使っているので,自分か,若くは,よほど簡単なプログラムでなければ >分からないと思います。 そうです。そこが、「他人に分かりやすい記事」ではないとYasu.Fさんも言っているところですね。 >># そもそも、目的の記事を「パスワード」をキーにして探すという仕様自体が >># とても不自然に感じるのですが… > >A.上記の質問は,黒幕的存在という記事で答えました。本来は そういう仕様だと同じパスワードを設定しているものがあったら、 先にヒット(キーが一致)したものが目的の記事となってしまいますが、 そういう動きはおかしいですよね。 普通(というか絶対に)、ある項目をキーにして目的のひとつのものを探す場合、 そのキーにする項目というのは、ユニーク(一意)な値でないとダメです。 普通は記事番号とかを設定してそれをキーに使うでしょう。 >1.YASU様は,perlを始めて何年になりますか。 ちなみに私は1年半くらいです。 はじめは他の人の書いたスクリプト(perlプログラム)を参考に、どんな風に プログラミングされているのか見てみたのですが、perlは見ただけでは何をしている のか判りにくい言語だったので、まずは「perl入門」を一通り読みました。 >2.perlのプログラミングで一番つまづいた経験はなんですか。 一見記述は簡単に見えて、その実すごい処理をしているところですか。 $aaa = @bbb; なんて、最初見たときは何してるのか判りませんでした。 >3.回答者の方々は,ふだんは,どんな事をしているのですか。そして, 一応、コンピュータメーカ系グループの会社でSEやっています。 仕事上でのプログラミングはもう4、5年やってません。 C言語経験はゼロです。(^^;; >TAD様とかにあ様と石堂様とかはかお知り合いですか。 他の方がすでに書いているとおりです。 #ちょっと遅かったか。(^^;;
丁寧な回答をありがとうございます。 フォローが遅くなってしまって申し訳ないです。 2月8日に、三葉工房の管理者さんは書きました。 >A.これは,MacParl上のテスト用で,適当にmartとかgghとかの名前を付けただけです。 ちょっとした(簡単な、短い)コードのテストでしたらこれでも問題は無い でしょうけど、少し込み入ったことをしようとすると途中で何が何だか わからなくなる可能性もありますので、 - 適切な名前を考える手間 - いい加減に付けた名前が何を意味しているのか考える手間 - 上記のどちらのほうがコストが掛かるか考える手間:) などを比べたうえでのバランス感覚でしょうね。 # いつでも適切な名前を考えろ、と言っているわけではないです # わたしもone-liner(“一行野郎”、シェルのコマンドラインで、 # "perl -e" の引数として直接入力して実行するような単純なプログラム)を # 書くときなどは、面倒くさいので変数には大抵いい加減な名前を付けます >A.適当な称号を使っているので,自分か,若くは,よほど簡単なプログラムでなければ >分からないと思います。 それだと、他人に見せるためのプログラムとしては不親切ですよね。 相手が知りたいのは、「あなたがどんな文字列をタイプしたか」ではなく、 「あなたがどんなコードを実行しようとしたのか」なのですから。 >A.そうですね。プログラムは,分かり易く書くべきと思います。だんだん,プログラミングに >慣れるに従ってメチャクチャになりましたので。 たぶん逆だと思います。というより、逆でないと将来きっと困ることになります。 よい癖でも悪い癖でも、身に付けるのは簡単ですが、取り除くのは至難の 技です。同じ癖なら、よい癖のほうを最初から身に付けておいたほうが幸せに なれるでしょう。 >># ちなみに、何故「17」ではなく「16」なのか理解してます? > >A.配列は,C Languageと同じく0から数えるから。17は,$arrycnt=@arryと言う >形の配列の値の合計値を数えている。 # 「配列の値の合計値」って、どういう意味で使ってます? # 「配列に含まれる要素の数」ではないですか? そうではありません。 元の記事のプログラムを、目を凝らしてよぉ〜く読んでみてください。 # ヒント: # $foo = "one # two" . # "three"; # $bar = "four"; # print $foo, # $bar; # は何を表示するか? >A.上記の >>同様に、$scalar = @array;をMacperlで実行してみました。 # まずご自分で考えてみて、それから実際に実行して、結果を比較して # いただけると、もっとよかったのですが;) >@arrayを$scalarへの1回目の代入は,@arrayの配列が記述されていますので, >3が返ります。 >しかし,更に@arrayの入った$scalarから更に配列へ代入すれば,それは,単なる >1要素に過ぎないとみなされますので,@arrayを$scalarへの2週目の代入で値は >1が返ります。 だいたい合っていると思います。 # キーワード: 「スカラコンテキスト」「リスト(配列)コンテキスト」 >A.上記の質問は,黒幕的存在という記事で答えました。本来は >foreach $keymatch(@keymatch){ (snip) # おや、「プログラミングの書法」はどうなりましたか? ;) >A.その様に次回から心がけます。(これだけ無作法な行為をして投稿する資格は >あるはずないのですが。) そんなことはありません。 ほんとうに嫌がられるのは、間違った内容を投稿することでも、分かりづらい 文章を投稿することでもありません。 それらを指摘されても改善しようとせず、同じような投稿を繰り返すことです。 「過つは人の常」。大事なのは、そのあとどうするか、です。 >1.YASU様は,perlを始めて何年になりますか。 最初にPerlに触れたのは、NEC PC-9801DAという古いマシンで動く、MS-DOSという これまた今となっては古くさい(しかし何故かWindows98の根幹を成している:) OSに移植された 日本語化Perl 4.036 というバージョンです。 これが、既に曖昧になってきている記憶を辿ると、1995年のことだったと 思います。 ですから途中のブランクを無視すれば、Perl歴は約4年ということになる でしょうか。 >2.perlのプログラミングで一番つまづいた経験はなんですか。 そうですね… いちばん苦労したのは、Perlの「TMTOWTDI (There's More Than One Way To Do It; それには何通りもの方法がある)」というスローガン そのものを体に馴染ませること、でしょうか。 自由度が高いということは、裏を返せばそれだけ節操の無い書き方ができると いうことでもあります。TMTOWTDIだからといって、「どれでも結局同じ なんだから適当に選んどけばいいや」とやってしまうと(もちろんこれでも いい局面もありますが)、あとで誰かが(あるいは自分自身が)プログラムを読む ときに、作者がどういう意図を持ってそのコードを書いたのかが伝わりにくく なってしまいます。 # ある意味では、「名前の付け方」と同じ問題がここにもある、とも言えます 例えばPerl5では、次の3つの文はほぼ同じ働きをしますが、それぞれの持つ 「意味合い」は少しずつ異なっています: foo("bar") or baz($zot, @qux); baz($zot, @qux) unless foo("bar"); baz($zot, @qux) if not foo("bar"); 「TMTOWTDI、じゃあこの局面ではどうするのがベストだろう?」そういった 自分なりのプログラミングスタイルを見出すまでの間、たくさんの「読み出し 不能な」プログラムが、ハードディスクの中に現れては消えていきました。 >3.回答者の方々は,ふだんは,どんな事をしているのですか。そして, 普段はhacking(と自分では思っている行為)をやってます:) ほかに、とあるISP(いわゆるプロバイダ)のサーバのお守りをしていることも あります。 >TAD様とかにあ様と石堂様とかはかお知り合いですか。 知り合いといえば知り合いです。もちろんお互いの顔や声も、ひとによっては 本名も全く知りませんが、立派な知り合いです。 ―そして、三葉工房の管理者さんとも「知り合い」なのかも知れません(^^)
興味本位の質問に回答者の方達全てからお返事をいただきました。 ありがとうございます。 回答者の方達は,にあ様のサイトに遭遇して,perlの質問に対して,回答コメント をお書きになっているだけという関係ですね。全員男性の方で? ちなみに,私は,N.S.E2.75のプログラムの検索処理のサブルーチンの辺りに, にあ様のサイトのURLが記されていてそれで知りました。 >ちょっとした(簡単な、短い)コードのテストでしたらこれでも問題は無い >でしょうけど、少し込み入ったことをしようとすると途中で何が何だか >わからなくなる可能性もありますので、 > > - 適切な名前を考える手間 > - いい加減に付けた名前が何を意味しているのか考える手間 > - 上記のどちらのほうがコストが掛かるか考える手間:) > >などを比べたうえでのバランス感覚でしょうね。 > ># いつでも適切な名前を考えろ、と言っているわけではないです ># わたしもone-liner(“一行野郎”、シェルのコマンドラインで、 ># "perl -e" の引数として直接入力して実行するような単純なプログラム)を ># 書くときなどは、面倒くさいので変数には大抵いい加減な名前を付けます >それだと、他人に見せるためのプログラムとしては不親切ですよね。 >相手が知りたいのは、「あなたがどんな文字列をタイプしたか」ではなく、 >「あなたがどんなコードを実行しようとしたのか」なのですから。 >たぶん逆だと思います。というより、逆でないと将来きっと困ることになります。 > >よい癖でも悪い癖でも、身に付けるのは簡単ですが、取り除くのは至難の >技です。同じ癖なら、よい癖のほうを最初から身に付けておいたほうが幸せに >なれるでしょう。 A.それ通りだと思います。一番分かり易く一番のてっとり早い。 もちろん,人に見てもらうのに適切な変数名では。 >>># ちなみに、何故「17」ではなく「16」なのか理解してます? > ># 「配列の値の合計値」って、どういう意味で使ってます? ># 「配列に含まれる要素の数」ではないですか? A.そうですね。要素数です。合計値は,私の場合,掲示板の記事数のカウント する目的で算出して使っています。 > ># ヒント: ># $foo = "one ># two" . ># "three"; ># $bar = "four"; ># print $foo, ># $bar; ># は何を表示するか? A.one twothreefour ># まずご自分で考えてみて、それから実際に実行して、結果を比較して ># いただけると、もっとよかったのですが;) > >>@arrayを$scalarへの1回目の代入は,@arrayの配列が記述されていますので, >>3が返ります。 >>しかし,更に@arrayの入った$scalarから更に配列へ代入すれば,それは,単なる >>1要素に過ぎないとみなされますので,@arrayを$scalarへの2週目の代入で値は >>1が返ります。 > >だいたい合っていると思います。 > ># キーワード: 「スカラコンテキスト」「リスト(配列)コンテキスト」 > >>A.上記の質問は,黒幕的存在という記事で答えました。本来は >>foreach $keymatch(@keymatch){ >(snip) > ># おや、「プログラミングの書法」はどうなりましたか? ;) A.foreachの構文の書き方が荒かったですか?駱駝本の8.4は読みました。 勉強になりました。どの様に構文を書くべきかですね。 > >>A.その様に次回から心がけます。(これだけ無作法な行為をして投稿する資格は >>あるはずないのですが。) > >そんなことはありません。 > >ほんとうに嫌がられるのは、間違った内容を投稿することでも、分かりづらい >文章を投稿することでもありません。 >それらを指摘されても改善しようとせず、同じような投稿を繰り返すことです。 > >「過つは人の常」。大事なのは、そのあとどうするか、です。 A.いくらなんてだも折角御忙しい時間をさいてコメントしたいただいた方達へ の口答え的な,「報告のつもりだったのに」と言う投稿には非常に反省してます。 > >>1.YASU様は,perlを始めて何年になりますか。 > >最初にPerlに触れたのは、NEC PC-9801DAという古いマシンで動く、MS-DOSという >これまた今となっては古くさい(しかし何故かWindows98の根幹を成している:) >OSに移植された 日本語化Perl 4.036 というバージョンです。 >これが、既に曖昧になってきている記憶を辿ると、1995年のことだったと >思います。 A.私は,3か月です。 >>2.perlのプログラミングで一番つまづいた経験はなんですか。 > A.ユーザーパスワードの設定法(こないだの黒幕的...というforreach文,とか 実行しはじめの頃,何百回ともサーバーエラー500を食らった事です。あの時は, 本当に辛かった。(多分,サーバーのバージョンが4.036なので,perl5の orやnotでの条件指定が出来なかった事らしい。)。 あの時は,本当にperlプログミングの才能があるのかとも感じました。 そのorやnotをそれぞれ||と!に変えてから,macperlのエラーチェックも 行う様になり,サーバーエラーに遭う確率も減りました。 > ># ある意味では、「名前の付け方」と同じ問題がここにもある、とも言えます > >例えばPerl5では、次の3つの文はほぼ同じ働きをしますが、それぞれの持つ >「意味合い」は少しずつ異なっています: > > foo("bar") or baz($zot, @qux); > baz($zot, @qux) unless foo("bar"); > baz($zot, @qux) if not foo("bar"); > >「TMTOWTDI、じゃあこの局面ではどうするのがベストだろう?」そういった >自分なりのプログラミングスタイルを見出すまでの間、たくさんの「読み出し >不能な」プログラムが、ハードディスクの中に現れては消えていきました。 A.じっくり研究してみます。 > >>3.回答者の方々は,ふだんは,どんな事をしているのですか。そして, > >普段はhacking(と自分では思っている行為)をやってます:) >ほかに、とあるISP(いわゆるプロバイダ)のサーバのお守りをしていることも >あります。 > >>TAD様とかにあ様と石堂様とかはかお知り合いですか。 > >知り合いといえば知り合いです。もちろんお互いの顔や声も、ひとによっては >本名も全く知りませんが、立派な知り合いです。 > >―そして、三葉工房の管理者さんとも「知り合い」なのかも知れません(^^) ================= 最後に perlでCGIのスクリプトを作成する上で,一番大切な事の1つは,私なりの私的 な意見で,済みませんが,配列を必要に応じて,全方向から動かせる様になる 事だと思います。それが,出来かによって,スクリプトも作成しやすくなる。 色々と全方向からperlを推察して,上達の為に全力をつくそうと思います。 これからも色々とお世話になりますが宜しくお願い申し上げます。
先程の三葉工房ですが,ユーザーパスワードのマッチング方法は,とても難しく 今だに謎に包まれたままです。 その難しくなる原因とは,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行が何をしているかを再確認した方が 良いと思いますよ。 それが判らないのに「ちゃんと動くものを作ろう」というのは無理な話です。 まずはいきなりプログラムを作るのではなく、焦らずに勉強し直しましょう。
#605や#607や、その他あなたの一連の投稿に対する多くの方々のフォロー記事に 目は通されているのでしょうか? この記事の内容を読む限り、どうもそのようには見受けられないのですが…。 自分は独り言を言っているだけだから返事はしなくていい、ということでしたら そうおっしゃってくださいね。 # でも、ここは独り言を書き連ねるのに適した場所とは言えません 2月3日に、三葉工房の管理者さんは書きました。 >その難しくなる原因とは,foreachやfor等の好き嫌いな部分がある点です。 > それらのループ関数は,print関数は,気に入っていますが,ifと言う条件指定 >関数は気に入ってないようです。 # Perlのif構文やforeachなどのループ構文は「関数」ではありません 「好き嫌い」「気に入る」などという「詩的」な表現では、いったい何が 言いたいのか分かりません。 あなたはここで文学作品を発表しているのですか? そうではないのでしたら、もっと他人に意味が伝わりやすいような文章を 書くように努力してください。 # それに、ここは文学作品を発表するのに適した場所とも言えません >ですから, > >$frag=0; (snip) プログラムを例示するときは、それ自身では整合性の取れていないようなコードの 断片ではなく、目的の処理を行うための最小限かつ完全な形のコードを示して ください。 @newmartや$sdはどこから登場したのですか? このコードだけを提示されても、結局どういう処理を行ってどういう結果が 期待されているのか分かりません。 > つまり,for文の中のprint文を >if(banner eq $fgh[$i])としても,条件指定の場合,同一のループ条件とは >いえども$fgh[$i]は配列の全てにマッチせずに,配列の最初か最後の値のみか >空白にマッチしてしまいます。 bannerとは? print "..."; をそのまま if(banner eq $fgh[$i]) なる文に置き換えて、Perlで 正しく実行されるのですか? 「マッチ」したかどうか(何に「マッチ」するのか上の文からでは全く 分かりませんが)は、どういうふうに判断したのでしょう? >そのループの性質に伴い,ユーザーパスワードのマッチングのプログラミングは >おのずと非常に困難になります。 厳しい言い方をするようですが、プログラミングの困難さを生み出しているのは 「ループの性質」などではなく、あなたのPerlに対する理解不足にほかならないと 思います。 思い込みでプログラムは書けません(それでもPerlは、プログラマの思い込みに 対してとても肝要な言語です)。日本語の文法を少しくらい間違ったところで コミュニケーションが全く不可能になることはありませんが、プログラミング 言語は少しでも文法を誤れば絶対に思いどおりには動作しません。 > そのようにその壁を乗り越えるのは至難の業であるとは,言え身を粉にしてでも >自分の力で思い当たる苦労を味わうべきでは,ないかなと思います。 それはそうなのかも知れませんが、CGIプログラムは貴重なサーバ資源を消費し、 また使い方を一歩誤れば重大なセキュリティ上の問題を引き起こす可能性も あることを忘れてはなりません。 わたしがことあるごとに「CGIプログラミングは難しい、『自称初心者』が CGIプログラムを利用するのはあまり好ましいことではない」と主張して いるのも、そういう理由からです。 手許のマシンでPerlを実行できる環境があるのであれば(MacPerlに多少癖が あるのは否めませんが)、まずは徹底的にその環境を使い込んで、Perlの 「作法」を手に馴染ませるのがよいと思います。 # そうすれば、「PerlはCGIプログラムのための言語である」といった # 偏見を抱くことも無いでしょう
今度は,全く別の質問です。 色々と,謙虚ない投稿ばかりで済みません。 実は,私も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です。 出来るならば,その方式でのダウンロード設定をお願い出来ませんでしょうか。 どうか宜しくお願いします。
関連する話題は、新たにスレッドを起こさずに、フォローアップ記事として書いて下さい。 本来このスレッドは、記事603『Re: 解凍方法』辺りにつなげるものでしょう。 2月3日に、三葉工房の管理者さんは書きました。 >私も,Drop StuffのWeeの名称の付いた >圧縮ファイルをダウンロード解凍してDrop Stuffで,その >スクリプトの圧縮ファイル(tar,gzの拡張子)を一度それで >冷凍して,解凍しましたが同じダウンロードした時の圧縮 >ファイルが戻って来ただけで,結局解凍出来ませんでした。 そりゃま、単に圧縮/展開をやった時に、他のファイルが出来てきたらまずいでしょう。(^^;; >更に,stuff Expanderの4.5をダウンロードして,解凍を >試みましたが駄目でした。 いえ、これが正解です。 単に *.tar.gz なファイルを、普通に StuffIt Expander で展開してやれば良いです。 >Drop Stuffは,冷凍専用のソフトですよね。 Drop Stuff はそうです、が、ここで利用しているのは、後ろに付いている "Expander Enhancer" の部分で、Drop Stuff with Expander Enhancerが 正常にインストールされていれば、StuffIt Expander 単体では展開できない何種類かの アーカイヴ形式が展開できるようになります。 >Win系に比べてMAC系のソフトが遥かに少ない現状がとても残念 >で成りません。 確かにこの頃Windowsのソフトウェアは非常に多くなりましたから、単に数で比べれば 負けているかも知れませんが、基本的なものは揃っていますよ。取りあえず、日常的な 事をするのに不便する事はあまり考えられないのですが... # あたしがドーネイトしているシェアウェアはWindows用よりMac用の方が多いかも知れず。 ## Mac本体は持ってないくせに。(^^;;
Drop Stuff with Expander Enhancerの Expander Enhancer に関すると思われる Stuff Enginは機能拡張に入っております。 Drop Stuffの環境設定を見ても,tarやzip等の選択枝はございません。 bin-hex方式でも試して見ましたが,やはり,同じtar.gzの白紙テキスト が戻って来て,解凍出来ません。 逆に Stuff Expander4.5を立ち上げてそのtar.gzの白紙テキストを解凍しようと しても,解凍方式が合わないせいか,表示されず選択出来ません。 一体のそのソフトをどの様に使えばその「うぇぶ会議室のスクリプト」を 開けるのですか。 石井さんがそのソフトで解凍に成功して何故私は,解凍出来ないのでしょうか。 どうか,宜しくお願いします。
エラーの原因(黒幕的存在がいた!)
エラーの原因(黒幕的存在がいた!) 先程の三葉工房です。色々とアドバイスありがとうございます。
ようやく,ユーザーパスワードのエラーの原因を突き止めました。 foreach文 foreach $keymatch(@keymatch){ ($mail,$yourname,$date,$gurl,$hpagename,$coment,$password)=split(/&&/, $keymatch); $password=~ s/\n//g; if($in{'pawin'} eq $password){ $keyflag=$keyflag+1; }} という形の投稿前の書き方で正しかったです。では,何がいけなかったか? それは,全く予想のない存在でした。 それは,キーワードでした。 私の場合, "$in{'要素1'}&&$in{'要素2'}&&$in{'要素3'}\n"で,unshift方式で いきなり,書き込みファイルから新規記事が最上段にプリントされる書き方を してますが,パスワードの要素の位置がラストと$in{'要素3'}に当り, その要素の右側に改行コードが書かれてして,それを,ボードに出力する場合, foreach文とsplitを使いますが,splitの分割対象が"&&"で"\n"では,無く, それにより,$in{'要素3'}に\nと一体になった要素が作られてしまい,そして, その要素の一番最後のにだけ\nがないので,その最後のパスワードだけしか マッチせず,他のは,"要素3"と"要素3\n"なので,一致せず,それに気付く事 なく,数日も立ち往生していました。 それに,気付きのその\nを$password=~ s/\n//g;で省いて目的のユーザーパスワード システムは,動かす事が出来る様なりました。
今は,変更システムの研究に励んでいますが,変更記事をunshiftを利用して, トップに新たに上書きする形は簡単に出来るそうです。 それでは,又,不明な点がありましたら,今度こそ謙虚な態度で,投稿させていただこうと 思います。
御迷惑お掛けしました。
余計なHTMLタグは書かないでください。非常に読みにくいです。 以下、邪魔なタグは全て削除して引用します。 それから、#614でにあさんがおっしゃった | 関連する話題は、新たにスレッドを起こさずに、フォローアップ記事として書いて下さい。 という文章はお読みになったのですか? 理解できないなら質問してください。 これに従うことができないのであれば、何故できないのか説明してください。 もしくは、ひとの話を聞く気が無いのならそうおっしゃってください。 そうすれば、今後わたしがあなたの投稿なさった記事を一切読まずに無視する ことができます。 わたしは#607や#613で、「あなた」に対して、「三葉工房の管理者さんに対して」、 いくつかの質問を投げかけているのですが、あなたはそれに対して何ひとつ 答えようとしませんね。 2月5日に、三葉工房の管理者さんは書きました。 >先程の三葉工房です。色々とアドバイスありがとうございます。 そのアドバイスを生かそうという気は起こらないのですか? >foreach文 もういちど、#607で書いたことを引用します。 | それと、ブロック("{" と "}" で囲まれた部分)などは | | 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'}; | } | | のように字下げして書くことを強くお勧めします。ブロックの中を全く字下げ | していないと、プログラムの制御構造の流れが追いにくく、とても読みにくいです。 こうすると不都合であるという理由があるのでしたら、後学のためにもご教示 いただければ幸いです。 >という形の投稿前の書き方で正しかったです。では,何がいけなかったか? あなたが、Perl(というより、プログラミングに必要な基礎知識そのもの)を ほとんど理解できていないのに、いきなり本格的なCGIプログラミングを 始めてしまったことでしょう。 >それは,キーワードでした。 何の「キーワード」ですか? >"$in{'要素1'}&&$in{'要素2'}&&$in{'要素3'}\n"で,unshift方式で 「unshift方式」とは? >してますが,パスワードの要素の位置がラストと$in{'要素3'}に当り, 何の「ラスト」? 「要素の位置」がハッシュ(連想配列)の要素に「当る」とは? >その要素の右側に改行コードが書かれてして,それを,ボードに出力する場合, どの「要素の右側」? 「要素」の「右側」ってどこ? >それにより,$in{'要素3'}に\nと一体になった要素が作られてしまい,そして, >その要素の一番最後のにだけ\nがないので,その最後のパスワードだけしか どの「要素の一番最後」? どの「最後のパスワード」? >マッチせず,他のは,"要素3"と"要素3\n"なので,一致せず,それに気付く事 「"要素3"」と「"要素3\n"」って、それぞれどこから出てきた文字列? …お願いですから、あなただけが理解できるような暗号や隠語や暗喩や 略記表現を乱発するのはやめてください。 # いや、何が言いたいか何となく分かる部分もあるのですが、 # 日本語として意味不明な個所が多すぎます ## 言うなれば「-wで警告がぼろぼろ出るPerlプログラム」のようです:) >それに,気付きのその\nを$password=~ s/\n//g;で省いて目的のユーザーパスワード 別にそれでもいいですけど、まずラクダ本を chop や chomp などを キーワードに探してみてください。 >今は,変更システムの研究に励んでいますが,変更記事をunshiftを利用して, Perlの「研究」には励まないのですか? ラクダ本を読むとか、そこに書いてあることを手許のマシンにインストール されたPerlで試してみるとか、参考書のコード例をちょっとずつ変えて実行 してみるとか、変更前後で実行結果が変化したら(あるいは変化しなかったら) それはなぜなのか考えてみるとか、他人の書いたコード(例えばうぇぶ会議室)を 読んでみるとか、そこで使われているテクニックを盗むとか。 >それでは,又,不明な点がありましたら,今度こそ謙虚な態度で,投稿させていただこうと >思います。 まずは「Perlに対して」もっと謙虚になったほうがいいような気がします;)
エラーの原因(黒幕的存在がいた!)と言う記事は,今回の質問の対象であった 長い事完成出来なかったユーザーパスワードのマッチプログラムが出来る様に 成った事をただ,アドバイスをしていただいた方達へ御報告の為だけの投稿です。 配列の此処が不都合な性格と言う自分本位にプログラムが出来ない感情的な 記事とは,全く違います。 不明な点を質問して,それが出来る様になった事を報告するのは,質問者と しての礼儀です。ですから,ただそれだけの事を行っただけです。 アドバイスを提供していただいた方達に対して,礼儀でもある御報告を 投稿して何がいけなかったのでしょうか。 確かに,まだ駱駝本は,うまくなじめませんが,それを読み学ぶと言う意見には, 私も賛同で,片道1時間以上の電車の中でも読んでいます。 そして,split(" ",$hoge)=$rehogt;と言う関数の使い方も試して見ました。 改行で区切られている配列には,有効です。 確かに,プログラムが出来ないからって,配列の此処が不都合な性格と言う様な 記事を投稿するのは,悪かったと反省してます。 それでは,失礼します。
2月7日に、三葉工房の管理者さんは書きました。 > 不明な点を質問して,それが出来る様になった事を報告するのは,質問者と >しての礼儀です。ですから,ただそれだけの事を行っただけです。 > > アドバイスを提供していただいた方達に対して,礼儀でもある御報告を >投稿して何がいけなかったのでしょうか。 どうも勘違いなさっているようですね。 わたしが言っているのは「報告記事なんて書くな」ということではありません。 「他人に分かりやすい記事の書き方をしてほしい」ということと、もうひとつは 「自分に向けられた質問には答えてほしい」ということです。 「他人に分かりやすい記事」というのは、例えば「分かりやすい日本語で書く」 「自分たちの周囲だけでしか通じないような "方言" は、なるべく使わない」 「相手が自分と同じ知識や価値観を持っていることを前提にしない」などと いったことはもちろんですが、それだけではありません。 例えば、 ○○というソフトをインストールしてみましたが動きません。 どうすれば動くようになるのでしょうか? 教えてください。 という質問記事は「最悪」なもののひとつです。 この記事の中には、有用な情報が何ひとつ含まれていません。 # これは極端な例ですが、しかし最もよく見られる「悪い質問記事」の一例でも # あります この手の質問を受けた場合、それに答える側にとっては、 1. 質問に対する適切な回答を、いろいろな資料の中から探すなどして調べる 2. それを、質問者にも分かりやすいような形の文章にまとめる という通常の手順の前に、 0. 「どういう環境で、どういう操作をしたら、どう動かないのか」などの、 回答を見つけるために必要な情報を、質問者とやりとりしながら引き出す という余計な手間が増えてしまうことになります。 質問者が最初から必要な(必要だと思われる)情報を提供していれば、こんな 手順は発生しないのですから、これは「質問者としての礼儀」に欠けています。 答える側としては、いちいちこんな非生産的なことのために労力や時間を浪費 したくはない、ということで 1'. 答えない という手順を踏むひとも少なくありません。これでは、質問する側にとっても 結局損ですよね。 「読みづらい質問記事」に関しても同じことが言えます。 もうひとつ。あなたは#618の | わたしは#607や#613で、「あなた」に対して、「三葉工房の管理者さんに対して」、 | いくつかの質問を投げかけているのですが、あなたはそれに対して何ひとつ | 答えようとしませんね。 という「*あなた*への」問いかけにも、全く応じようとしませんね。 そして、#614の | 関連する話題は、新たにスレッドを起こさずに、フォローアップ記事として書いて下さい。 という要請(あるいは「アドバイス」)も、相変わらず無視したままですね。 あなたは「質問者」、「質問をする側」なのだから、自分が受けた「質問」に 答える必要は無い、ということでしょうか? せっかく受けた「アドバイス」を 無視しても構わない、ということなのですか? あなたは相手に対して質問しているのですから、相手があなたに質問した ときには、可能な範囲で答える、というのが、「質問者としての」最低限の 「礼儀」ではないですか? > 確かに,まだ駱駝本は,うまくなじめませんが,それを読み学ぶと言う意見には, >私も賛同で,片道1時間以上の電車の中でも読んでいます。 おお。がんばってください。 ラクダ本にはPerlの非常に多様な機能のほぼ全てが記述されているため、 他の解説書と比較してもレベルが高く、難解な一面もありますが、それだけに 有用な情報がぎっしり詰まっています。 読破は大変でしょうが、健闘を祈ります:) ちなみに、いきなりラクダ本ではきつい、という向きのために、姉妹篇として R.L.Schwartz,T.Christiansen,近藤嘉雪訳,「初めてのPerl 第2版」, オライリー・ジャパン,1998,ISBN4-900900-81-8 という入門書もあります(わたしは別にO'Reillyの回し者ではありません)。 ラクダ本自体は、プログラミングなどに関するそれなりの基礎知識を必要と しますので、まずはこちらで基本的なPerlプログラミングの手法を身に 付けてからラクダ本に進む、という手順もいいかも知れません。 > そして,split(" ",$hoge)=$rehogt;と言う関数の使い方も試して見ました。 よくわかりませんが、splitって代入式の左辺に置けるものなんですか? おそらく、やりたいのは @fields = split(" ", $hoge); では?
YASU様へ, 三葉工房です。 つい,この様な記事を投稿して済みません。 投稿後,もう一度,YASU様の記事を読み,おっしゃってる事が理解出来たので 消去しようとしましたがパスワードをメモしなかったので,そして,にあ様へ も昨日の午前中にこの記事を消去する様に頼んだのですが,結局,一日中残っ てしまいYASU様の目に触れてしまう結果なりました。 おっしゃてる事は良く理解出来ました。 1.質問に答える 2.次の処理プログラムの開発の前にPerlについての勉強会(学習)を行い perlの基礎を理解する。 3.分かり安い記事で投稿する ですね。 時間を作り,"例えば,変更システムの$***が出来ない"と言う様な質問を 投げかける前に,質問に関しての回答を必ずしようと思います。 自分本位のコメントばかりで本当に済みませんでした。
2月8日に、三葉工房の管理者さんは書きました。 >YASU様へ, > >三葉工房です。 YASU様の御質問への回答コメントを2月3日の辺りにフォロー投稿しました。 わかににくい位置投稿されたので,それをお知らせする為だけに投稿しました。
Mail送信用のscriptを刷新して localでのTest(と言ってもsendmailはtestできないが)を終えて いざ upして動作確認に入るとcore dumpを吐いて死んでしまいます。 問題と思われる個所までは特定できたのですが、 何故NGなのかが分からない・・・ 同一のサブルーチンを2回callしているところがあって 一回目はOKなのに二回目で死んでしまう。 順番を入れ替えると2回目で死ぬところから引数には関係していないと思われる そのサブルーチンの中で怪しいと見られるのが jcode'convert()とMIME::Base64::encode_base64()の使い方です。 jcode'convert()は他にも多数同script内でcallしていますし encode_base64()は単体では問題無し(直前のjcode'convertをコメントアウト) 因みにerror.txtには Attemp うんたら とかで開放しようとしたら既に参照カウントが0だった というメッセージが残ります ラクダ本を参照しましたが ???です Perl onlyのscriptなのに・・・ 今のところは次のような事を疑っています ・しょうもない文法ミスを犯している(ありがち・・・) 先の被疑サブルーチンにreturnを追加しただけで少し進んだ所からして怪しい ・メモリ不足?(通常はout of memoryのlogが残るはず) ・応答時間が遅い?(他にもっと遅いものもある Benchmarkで確認した) 動作確認は ActivePerl 5.005?とCPANからWin95へportingされていた5.004を使用し 両方で問題なさそうに動いています サーバーのPerlは 5.003です #・・・5.003に戻せば再現できるんかな? 以上 長々と書きましたが、問題解決するには情報不足で ほとんどグチみたいなもんですねf(^_^;) でも、これでもう少し頑張ってみようという気になれました。
2月22日に、Shigeさんは書きました。 >Mail送信用のscriptを刷新して >localでのTest(と言ってもsendmailはtestできないが)を終えて >いざ upして動作確認に入るとcore dumpを吐いて死んでしまいます。 > > 略 > >そのサブルーチンの中で怪しいと見られるのが >jcode'convert()とMIME::Base64::encode_base64()の使い方です。 > これが当たりでした jcode.plのsubroutineの使い方を変えたら dumpを吐かなくなりました。 なんとなくそんな気はしていたんですが認めたくなかった(^_^; で,具体的には 「jcode subの引数となる変換またはチェック対象となる文字列変数の参照を レキシカル変数の参照からグローバル変数の型グロブに全て変えた」 です。オプション等はレキシカル変数のままです。 (どっかのFAQにも書いてありそうな結末ですね) どうしてそうなるのかまでは面倒なので調べていませんが 2回目のコールにおいて既に開放されたデータを参照しようとしたため dumpを吐いたのかな?と考えています が ちょっと違うような気もします #jcode.plを見てもその様な所は私には分かりませんでした。 > >因みにerror.txtには >Attemp うんたら とかで開放しようとしたら既に参照カウントが0だった >というメッセージが残ります こちらは何故か Biglobeにcore dumpについて質問を投げかけたら でなくなっちゃいました。 因みに core dumpはPerlの場合は見てもしょうがないよ と言うような解答でした。 #にあさんからも以前そのような事を教えてもらったような・・・ #でも,手がかりがないとすがりたくなる・・・
お世話になっています。三葉工房です。 今日まで,アクセスカウンタの製作に取りかかって来ました。 実は,私のperlスクリプト製作の今回の最終地点は,バナー一体型アクセス カウンタです。 それは,画像を連結させ, <img src="****.cgi">と言うタグで出力する技術が必要です。 ちなみににあ様のアクセスカウンタも画像一体型カウンタですが,ダウンロード して解凍いたしました所,C言語で記述されていた様です。こないだの「うぇぶ 会議室」は,ようやく解凍出来ました。日本版のエクスパンダーでなければ, 開けない様です。 残念ながら,うちのサーバーでC言語のスクリプトは,不可です。 ですから,perlでそれを実行させてます。 いろいろと,その画像一体型アクセスカウンタのスクリプトを探し回った所, T's CGI-BIN Tools - TcounT Ver.4.XX からgif-cat.plと言うGIFファイル連結ライブラリをコピーで,手にする事が出来,それ を自分で記述したスクリプトと併用すれば,簡単に画像一体型アクセスカウンタの実行が出来ます。 そして,ログファイルも作成しました。 その,アクセスカウンタのスクリプトは,cgi-libと gif-cat.plとそして,自分で 作成したライブラリで動いています。ライブラリの末尾に1;がなければエラーにされ てしまうのですね。面白い事に,そのスクリプト内に3つ程のサブルーチンが記述され ていまして,その実行記号(&サブルーチン名;)をスクリプト本体に記述せず例の手作り のライブラリに記述されていてそのライブラリを呼んで,実行記号も読み取って本体の サブルーチンを実行してしまうプログラムです。 本題に戻ります。実は,そのログファイルの件ですが,そのログのページを見て頂ければ 分かると思いますが,日別カウントの 2月27日のカウントが有りません。スクリプトが実行されない(訪問無し)日のカウントは書かれません。つまり,日が変わると日別カウント のファイルに新たな日付けの行が追加され,その日(今日)のカウントが実行の度に増えて 行く方式です。ですから,実行の無い日のカウントは記録されないのです。その 実行の無い日のカウントも0でファイルに記録する方法ですが,それには,日付の引き算 が出来る事が必要になると思います。よく表計算では,dateと言う関数でA年月日からB年月日までは,どれくらいの日数があるかを計算出来ます。しかしperlでは,どうやらdate と言う関数は無いようです。localtimeでは,実行した時の時間情報しか手に出来ません。ところで,その様にperlにてA年月日からB年月日までどれくらいの日数があるかと 言う計算はどのように行うのでしょうか。 ちなみにそのログのページは下記からリンク出来ます。 ログファイル 次に,バナー一体式アクセスカウンタの作り方の件ですが,よく上がアクセスカウンタ で下がバナーというカウンタとバナーが一体になっているのを見かけますよね。 それを作りたいのです。そのスクリプトは何処にも公開されていません。 ですが,画像連結プログラムを理解して,イメージマップも理解すれば夢では無いと思います。 先程のgif-cat.plの内容を読んだところ処理が数多く書かれていまして,どうやらGIF を連結するプログラムの技術は大変らしいです。 ですが,その話しは別にしてperlプログラムで,GIFファイルを連結して,一体化 されたGIFを作成するには,どの様に行うのでしょうか。 後,アクセスカウンタの貼られている掲示板は,こないだ悪質ないたずらがあった様な ので,スクリプト名を変更してアクセス出来ない様にして公開出来ない事をお詫び申し上げます。 御忙しい所,度々すみませんが,どうか御回答宜しくお願いします。
2月28日に、三葉工房の管理者さんは書きました。 >実行の無い日のカウントも0でファイルに記録する方法ですが,それには,日付の引き算 >が出来る事が必要になると思います。よく表計算では,dateと言う関数でA年月日からB年月日までは,どれくらいの日数があるかを計算出来ます。しかしperlでは,どうやらdate >と言う関数は無いようです。localtimeでは,実行した時の時間情報しか手に出来ません。ところで,その様にperlにてA年月日からB年月日までどれくらいの日数があるかと >言う計算はどのように行うのでしょうか。 localtime()の逆関数でtimelocal()と言うのがあります。 前に記事268でも書いたことがありますが、perlの標準添付ライブラリにありますので、まず、 require "timelocal.pl"; で、timelocal.plを使えるようにしておいてから、 $time = &timelocal($sec, $min, $hour, $mday, $mon - 1, $year - 1900); の様にして、指定時間の内部的な値(秒数)を得ます。 日付の引き算がしたいなら、得られた秒数で引き算して、日にちに換算すれば良いでしょう。 >次に,バナー一体式アクセスカウンタの作り方の件ですが,よく上がアクセスカウンタ >で下がバナーというカウンタとバナーが一体になっているのを見かけますよね。 >それを作りたいのです。そのスクリプトは何処にも公開されていません。 以前、記事455でのりーさんが紹介してくれたカウンタがまさにそれだったのですが、 今見たらリンク先が無くなっていますね。 # のりーさんペーヂ移っちゃったのかなぁ >先程のgif-cat.plの内容を読んだところ処理が数多く書かれていまして,どうやらGIF >を連結するプログラムの技術は大変らしいです。 > ですが,その話しは別にしてperlプログラムで,GIFファイルを連結して,一体化 >されたGIFを作成するには,どの様に行うのでしょうか。 gifcat.plでは同じ大きさのGIFファイルを横につなげる機能しか提供していない様ですが 画像を横につなげるのもバナーの下に並べるのも、単に置く場所の指定を変えるだけで同じ事です。 まあ、その辺を変えるためにはGIFのフォーマットに付いて知っておかなければならないので チョット面倒ですが、トホホさんのgifcat.plはそんなに見づらいソースでは無いので ソースとGIFフォーマットの規格とを見比べていけば変更できると思います。 ちなみにGIFフォーマットに付いては、GIF89M規格の日本語訳などを見ると良いでしょう。 # って、さっき見つけたばかりなのだが。(^^)
三葉工房です。 にあ様のおっしゃられた通り timelocal.plを取り寄せました。しかし,1つ問題が 有りました。それは,更に3つのライブラリを入手しなければならない点です。 timelocal.plに更に取り込まなければライブラリは下記の3ライブラリです。 require 5.000; require Exporter; use Carp; Exporterと Carpはどうにか簡単に入手出来ましたが 5.000は,サーチエンジンで 探しても難しいです。もし,そのライブラリの入手方法がお分かりでしたらお教え 願います。 後,例のgif-cat.plですが,上級レベルなのでじっくり時間を掛けて勉強しようと 思います。 色々と画像一体型アクセスカウンタスクリプトのページを見ましたが,やはり誰もが gif-cat.plとサーフレスキューと御プログラムnpc.cgiの3スクリプトのいずれかを ライブラリとして行っている様です。 gif-cat.plは等幅横一列のみ実行可能条件らしく,それに合致するイメージなら下の 様に画像連結出来ます。 ところで,にあ様のnpc.cgiと言う御スクリプトの画像結合処理プログラムも, GIFイメージの仕様を勉強してスクリプトを作成されたのですか。 私としては,GIF連結プログラムをどのようにして作成されたか一番知りたい所です。 後は,最終的には,バナー一体型カウンタを目指しているので,そのタイプのカウンタ を提供しているサイトへ「スクリプトを譲って頂けませんか」とメールしました。 結構,GIFイメージの仕様 自体も色々と習得しなければならない点があり覚え切るには大変だと思いますが面倒くさがらず学んで行こうと思ってます。 最後に余談ですが,perlと言う言語は,情報処理用語とは,あまり関係の薄い言語 だと思いますが,その言語は,どの様な言語のジャンルに当てはまるのでしょうか。 (例えば,高水準言語,手続き型言語等の振り分け方) そして,perl言語に関する検定試験等あればいいですね。 最後に,去年の暮れからperlを学び始めた訳ですが,ここまで日が経つとある程度 スクリプトが出来る様になりました。 最近では,掲示板の変更記事を従来と同じ位置に書き直せる処理プログラムが出来る様に ました。つまり,書き込みファイルの途中に上書きする処理です。 そして,先日紹介したログファイルも先輩のプログラムを見ず今まで覚えたperlの知識 を活用するプログラムを自分で発案して出来る様になりました。始めの頃,サーバエラー 100回とかのたうち回ってましたが自分なりのperlへの熱意でここまで出来るようになった のも,にあ様をはじめとするアドバイザの方達のおかげてもあると思っています。 それでは,色々,perlに関する話題を書いて済みません。 宜しくお願いします。
3月8日に、三葉工房の管理者さんは書きました。 >timelocal.plに更に取り込まなければライブラリは下記の3ライブラリです。 >require 5.000; >require Exporter; >use Carp; > >Exporterと Carpはどうにか簡単に入手出来ましたが 5.000は,サーチエンジンで >探しても難しいです。もし,そのライブラリの入手方法がお分かりでしたらお教え願います。 requireの後ろは、文字列なのかパッケージ名なのか数なのかで意味するところが違います。 文字列とかパッケージ名とかはお分かりでしょうが、数が指定された時は、その名前の ライブラリが有るわけではなく、perlのバージョンがその数以降で有ることを指定しているのです。 つまり、 require 5.000; なら、perl5.000 やそれより新しい perl を使いなさい、と言うことなのです。 古いヴァージョンを使うと正常動作しないような場合に、必要最低限のヴァージョンを 指定するものです。 >ところで,にあ様のnpc.cgiと言う御スクリプトの画像結合処理プログラムも, >GIFイメージの仕様を勉強してスクリプトを作成されたのですか。 えーと、どちらかというと逆ですね。(^^;; 以前PC-9801用のGIF loader/saverを作っていたこともあって、GIFの仕様については 良く知っていたので、Netscapeがserver pushと言う機能をサポートして、画像の アニメーションが可能になった時に、すぐにカウントアップアクセスカウンタというネタで プログラムが書けるな、と思いついたわけです。 # と言うわけで、元々 npc.cgi は自分が技術的困難さ無しに簡単に書ける、 # 単なる一発ネタの冗談プログラムだったわけです。(^^;; もちろん、GIF loader/saverを作っていた時には、GIFの規格について必死になって 調べましたけど、実は肝の部分のLZW圧縮については、昔々学生の頃にいじり倒した事が あるので、これまた、良く知っていたのでした。(^^) # と言うことで、効率良くプログラミングを進めるためには、自分が今どこまで理解していて、 # どれだけのものを加えれば上手く行くかを把握出来る事が大切なんじゃないかと思います。 >最後に余談ですが,perlと言う言語は,情報処理用語とは,あまり関係の薄い言語 >だと思いますが,その言語は,どの様な言語のジャンルに当てはまるのでしょうか。 まあ、分類で言えば、手続き型の高級言語、でしょうね。 >そして,perl言語に関する検定試験等あればいいですね。 ああ言う検定試験って実際役に立つんですかねぇ まあ、自分の実力を何らかの形で 評価してみたい、と言う用途には向いているとは思いますし、試験があれば包括的な 勉強はするでしょうけど。 # あたしも仕事では、X線取り扱い主任者なんちゃら、とか、レーザ取り扱いなんちゃら、 # とかの資格を取らされたけど、そう言う機会でもないとチャンと勉強しないからなぁ (^^;; ## 何て書いて良いのか? (笑)
お世話になります。 にあ様のおっしゃられた通り,reuire5.000の事情が分かりましたので, 早速,MacPerl5.0で実行して見ましたが,結局エラーにされて成功出来ません。 require 'timelocal.pl'; $time =&timelocal($sec,$min,$hours,$mday,$mon,$year); print "現在時刻:$time\n"; 様に記述しましたが,エラーにされました。 駱駝本の591ページを読んで見ましたが, $time =&timelocal($sec,$min,$hours,$mday,$mon,$year); を理解する事も困難で,plを利用出来ません。 テストスクリプトの&timelocalの文の上に例の ($sec,$min,$hour,$day,$mon,$year,$wday)=localtime(time);を付け加えて見ても &timelocal の後にprint "現在時刻:$mon\n";と変えても require Exporter; use Carp;を外しても やはりうまく行きません。 $time =&timelocal($sec,$min,$hours,$mday,$mon,$year); をその後,どの様に使えばよろしいのでしょうか。 何度も質問責めで済みませんがアドバイス宜しくお願いします。
3月14日に、三葉工房さんは書きました。 >$time =&timelocal($sec,$min,$hours,$mday,$mon,$year); >print "現在時刻:$time\n"; >様に記述しましたが,エラーにされました。 良く間違えるのは、$mon の範囲が[0〜11]であることと、$yearが(西暦-1900)な 事でしょうか。他は特にハマリそうな所は無いですね。
3月13日に、にあさんは書きました。 こん%チャチャです。 ># あたしも仕事では、X線取り扱い主任者なんちゃら、とか、レーザ取り扱いなんちゃら、 ># とかの資格を取らされたけど、そう言う機会でもないとチャンと勉強しないからなぁ (^^;; >## 何て書いて良いのか? (笑) 公の場では・・・。(笑) 私も本職の方の勉強は「そういう」機会がないと最近は、勉強しないな〜。 # でも「そういう」機会はない・・(^^;A 不況だしな〜、ちゃんと勉強しないと、、。(笑)
度々質問して申し訳ございません。 色々とお世話になります。 始めにtimelocal.plのアドバイスありがとうございます。 報告は後にしようと思います。 実は,1つ思い当たった事がございましたが,私の加入しているプロバイダ はPanasonic Hi-Hoですが,本格的にCGIスクリプトの運営を考えています。 ですが,Panasonic Hi-Hoでは,perl4.036が装備されて自分の作成したプログラム を実行出来ない事はないのですが,以下の出来ない機能もございまして,本格的 なCGIスクリプトの運営(BBSやアクセスカウンタをユーザー登録形式で提供する等) するには,少し向かないかなと思います。 Panasonic Hi-Hoで使用出来ない機能は以下の通りです。 perl5は無し sendmailがコンパクト化(機能を限定)された ssendmaiiにされている。 c言語プログラムは無し NACAのサーバーサイド方式のクリティカルプログラムが装備されていない。 nkf,シェル不可 SSIの<!--#exec cmd="./cnt.pl"-->不可 以上の理由から,本格的にCGIスクリプトを運営するには,やはり,CGIプログラミング の能力をフルに生かせるCGIに関する装備が多いプロバイダに変えようかなと思っています。色々と,CGIに関するサイトを見た所,にあ様の所もそうなのですが biglobeが一番多いみたいですね。そして,Infowebも色々とCGI機能が充実していました。 私は,1.CGI機能が充実,2.アクセスポイントが充実,3.料金が手頃,4.CGIスクリプト の読み書きファイルを別サイトのサーバー(どこのサーバーにでも格納可能)に格納可能 なサーバーを提供するプロバイダを探しています。 もし,CGI機能 とインターネット接続機能の精度の優れた充実したお勧めのプロバイダがございましたら御紹介願います。 宜しくお願いします。
3月17日に、三葉工房さんは書きました。 >を実行出来ない事はないのですが,以下の出来ない機能もございまして,本格的 >なCGIスクリプトの運営(BBSやアクセスカウンタをユーザー登録形式で提供する等) >するには,少し向かないかなと思います。 >以上の理由から,本格的にCGIスクリプトを運営するには,やはり,CGIプログラミング >の能力をフルに生かせるCGIに関する装備が多いプロバイダに変えようかなと思っています。色々と,CGIに関するサイトを見た所,にあ様の所もそうなのですが biglobeが一番多いみたいですね。そして,Infowebも色々とCGI機能が充実していました。 その前に、通常、Web領域の又貸しは出来ないような契約になっているところが多いのじゃ 無いかしら? そうでなくても、他のユーザに BBS 領域の貸し出し等をする予定があるなら、 あらかじめプロヴァイダに連絡とって許可をもらっておいた方が良いのでは? # ここのカウンタ(npc.cgi)のお試しが、biglobeユーザに限定されているのも、 # そう言う理由です。
3月17日に、三葉工房さんは書きました。 >以上の理由から,本格的にCGIスクリプトを運営するには,やはり,CGIプログラミング >の能力をフルに生かせるCGIに関する装備が多いプロバイダに変えようかなと思っていま >す。色々と,CGIに関するサイトを見た所,にあ様の所もそうなのですが biglobeが一番 >多いみたいですね。そして,Infowebも色々とCGI機能が充実していました。 以上のような条件なら,レンタルサーバー/ホスティングサービスを選択肢にいれられたら いかがでしょうか? YAHOO! Japan ウェブサービス
三葉工房です。 プロバイタに関してのアドバイスありがうございます。 やはり,どこもセキュリティの事情にて,書き込みファイルの別サーバ 参照は不可の様です。 自分も色々とプロバイダを考えた結果,Inter-Qメンバーを第一に検討して います。そこは,無料ホームページ50MBで,商用ページOKで,perl5とsendmailが用意 され,最寄りのアクセスポイントも設置されているからです。 又度々,質問して済みません。こんなに,しょっちゅう質問されては, 嫌になるかと思います。自分で考えろと言う感じに! ですから,私もその記事についてサーチエンジンで探索しましたが 難しかったです。その探している記事の内容は以下の通りです。 CGIの配布を行う上で,アクセスの頻発に対する排他対策は大事な 問題なので,是非とも知りたいです。 やたらと質問が多すぎて大変済みませんが,よろしければお教え願い ます。 実は,アクセスカウンタやバナークリックカウンタ等の開発を行って おりまして,1つ問題があります。 それは,もしアクセスが頻発した時のことです。そこで,私は,同じ ページファイル(htmlページやcgiスクリプトの事)を複数作成して, アクセスの排他対策を考えておりまするつまり,ミラーサイトを作る と言う事です。もし,それをする場合,同じサーバにそのページファイル を複数おく場合,同一サーバに,複数のページが存在して,もし,その サーバ内のある人は,Aページ,もう一人は,Bページをアクセスした場合 同じサーバの場合,どのような処理をするのかが大きな問題になります。 同じサーバ内でも同時アクセスしたページが別々なら,並列処理をしてく れるのか,それとも,別々のページとは言え,サーバが同一なので,アク セスの早い方から処理するのかを知りたいです。 サーバの性質により,これからの作業をどうするかも2分岐されます。 お忙しいところ,恐れ入りますが,サーバの排他処理について宜しくお願いします。
にあさん、皆様こんばんは〜。 ここで質問させて頂くのは久々です(^^) さて、うちの久石譲&宮崎駿フォーラムで、「ダイジェストニュース機能」という いわゆるJavaScriptで小窓を開いてそこに情報を表示するっていうプログラムを使 っているんですが、ネスケ2.02(Mac)の方から上手く動かないと言う報告を 頂きまして色々やっていたんですが、手詰まりになってしまいました(^^;; 元々JavaScriptなんてあまり知らない自分がいじっているので、も〜お手上げです (^^; --- function news(loc) { var wnd="news"; var width='350'; var height='300'; var myWindow = window.open("", wnd, 'resizable=yes,scrollbars=yes, status=0,width='+width+',height='+height);location.href=loc; } --- <A href="javascript:news('news.html')">ダイジェストニュース</A> --- こんな風に(実際はもうちょっとあるのですが)したらうまくいきませんでした。 ネスケ2のwindow.openにはバグがあって、URLの部分にURLを書いても上手く動か ないということらしいので、ネスケ2では上の通りの処理になるようにしてみたん です。上の例ではウィンドウは開きますがそこに内容が表示されず、元になるウィ ンドウにURL記述した部分が反映されるようです。 うまく動くにはどうしたらよいのでしょうか?或いはもしかするとネスケ2では小 窓開いて云々って元々無理なのでしょうか?お教えいただければ幸いです。 尚、「久石譲&宮崎駿フォーラム」の「Testの部屋」443〜454番目の記事でこの問 題について問答やっていますので参考にしていただければ・・・と思います。初歩 的な質問かもしれませんが、よろしくお願いしますm(_ _)m
4月25日に、nezさんは書きました。 >元々JavaScriptなんてあまり知らない自分がいじっているので、も〜お手上げです >(^^; わたしもJavaScriptにはあまり明るくないのですが…(^^; >--- >function news(loc) { > var wnd="news"; > var width='350'; > var height='300'; > var myWindow = window.open("", wnd, 'resizable=yes,scrollbars=yes, > status=0,width='+width+',height='+height);location.href=loc; myWindow.location.href = loc; じゃないでしょうか。 せっかく「新しく開いた窓」(というオブジェクト)に myWindow と名付けたのです から、それに対して何かをしてもらうときは myWindow に対して呼びかけなくちゃ いけないと思います。 もちろん、myWindowという変数を介さずに直接 window.open(...).location.href = loc; と書いても(「myWindowよ」ではなく「新しく開いた窓よ!」ってな具合に 呼びかけても)いいはずですが。 >} > >--- ><A href="javascript:news('news.html')">ダイジェストニュース</A> >---
4月25日に、Yasu.Fさんは書きました。 >わたしもJavaScriptにはあまり明るくないのですが…(^^; 十分明るいですよ〜(笑) > myWindow.location.href = loc; > >じゃないでしょうか。 ああ、やはり初歩的ミスだったんですね(^^;; 早速変えてみたところ、ネスケ4.5では上手く動いているようです。2ではまだ 確かめてはいませんが多分うまく行くと思います。有り難うございます!!! ・・・で、ついでにもう一つ質問させて下さい(^^; 自動的に別窓を開くために。 −−− <SCRIPT language="JavaScript"> <!-- function WinOpen(){Wina02=window.open('news.html','news','scrollbars=1, resizable=1,width=350,height=300'); if(navigator.appVersion.charAt(0)>=3){Wina02.focus()} } //--> <body onLoad="WinOpen()">; −−− こんな感じで記述しているのですが、ネスケ2ではうまくいかないみたいです。何 故なんでしょう・・・?(^^; onLoad="..."ってダメなんでしょうか・・・。
また三葉工房です。 お世話になります。 たびたびすみませんが,投稿させていただきます。 SSIではなくCGIでの<img src="***.cgi">でのイメージ出力では 1度きりしか再読み込みをしてくれません。ですから,ランダム イメージが3点以上ある場合は,普通にネットスケープで,リロ ードボタンを押しただけでは,1度目の読み込みから数えて,2 点目までしか読み込みません。私もランダムイメージを作成して いますが,今後は,ネット上に公開する予定なので,ネットスケープ で,shiftキーも押さなければ,ランダムイメージが1度しか読み込め ないのは,ちょとみっともないので,SSIでは無いCGI方式で普通にネ ットスケープで,リロードボタンを押しただけで,1度きりではなく 無限にランダムイメージを入れ替えられるプログラムをCGIスクリプト に記述する方法をどうかお教え願います。
5月4日に、三葉工房さんは書きました。 >SSIではなくCGIでの<img src="***.cgi">でのイメージ出力では >1度きりしか再読み込みをしてくれません。 通常、画像読み込みは文書に比べてバイト数が多いので、極力再読み込みを しないような作りになっていることが多いようですね。 [Reload]ボタンの押下で再読み込みさせたいなら、画像出力のヘッダ部に Expires: Mon, 10 May 1999 16:08:27 GMT のような、コンテンツが無効になる時間を入れておけば良いと思います。 もちろん、その時間には現在の時間等を入れておけば、[Reload]を押した時には 既に過去の時間になっているので再読み込みされるでしょう。 # よく Expires: 0 とすれば良い、などと言う解説がありますが、文法的に # 間違っていますので、ダメです。また、現在時より昔の時間が Expires に # 入っていると無効になる/誤動作する、と言う話があるので、現在時を入れて # おくのが無難でしょう。
5月11日に、にあさんは書きました。 >5月4日に、三葉工房は書きました。 > >>SSIではなくCGIでの<img src="***.cgi">でのイメージ出力では >>1度きりしか再読み込みをしてくれません。 > >通常、画像読み込みは文書に比べてバイト数が多いので、極力再読み込みを >しないような作りになっていることが多いようですね。 > >[Reload]ボタンの押下で再読み込みさせたいなら、画像出力のヘッダ部に > >Expires: Mon, 10 May 1999 16:08:27 GMT > >のような、コンテンツが無効になる時間を入れておけば良いと思います。 >もちろん、その時間には現在の時間等を入れておけば、[Reload]を押した時には >既に過去の時間になっているので再読み込みされるでしょう。 > ># よく Expires: 0 とすれば良い、などと言う解説がありますが、文法的に ># 間違っていますので、ダメです。また、現在時より昔の時間が Expires に ># 入っていると無効になる/誤動作する、と言う話があるので、現在時を入れて ># おくのが無難でしょう。 ********************************************* アドバイスどうも有難うございます。 失礼もうしああげて,申し訳ございませんが, Expires: Mon, 10 May 1999 16:08:27 GMT をどのように画像出力のヘッダ部に記述するか分かりません。 色々と試してみました。 Expires: Mon, 10 May 1999 16:08:27 GMT print "Content-type: image/gif\n"; 様に書いたり,これは,COOKIEの設定にもでて来ますので,いままでのライプラリの"Cookie.pl"に頼るCOOKIE設定をやめて$ENV{'HTTP_COOKIE'}と手書きに変更して print "Set-Cookie: $cookname=imgID\:$Cookies{'imgID'}; Expires=Mon, 10 May 1999 16:08:27 GMT\n"; print "Content-type: image/gif\n"; と しかしながら,今までと変わらず,"再読み込みボタン"だけのCGIからの処理による <img src="***.cgi">の画像出力では,2回までしか,画像を 取り直してはくれません。 ところで, Expires: Mon, 10 May 1999 16:08:27 GMT 年月日付の境目に半角の変わりにハイフンを用いた書き方 Expires: Mon, 10-May-1999 16:08:27 GMT (ちなみに私は,"Monday"と言う様に週の欄は,フル書きで記述して,月の欄は, 上記の書き方と全く同様に英語の月名を3文字に省略して,書いています。) は,どのように画像出力部に記述するのか,もしくは,COOKIE設定の中で, 記述するのかを大変くどい様で済みませんが,もう少し詳しくお教えいただけません でしょうか。 どうか宜しくお願い申し上げます。
5月13日に、三葉工房さんは書きました。 >失礼もうしああげて,申し訳ございませんが, >Expires: Mon, 10 May 1999 16:08:27 GMT >をどのように画像出力のヘッダ部に記述するか分かりません。 あー、CGIで独自のヘッダを生成したり、サーヴァが付けるはずのヘッダを変更したり する場合は、Content-type: 等と同じ所、つまり、コンテンツ自体を出力する前に 入れます。 例えば現在時刻を Expires: にセットしたいなら、 @wday = ('Sun', 'Mon', 'Tue', 'Wed', 'Thu', 'Fri', 'Sat'); @mon = ('Jan', 'Feb', 'Mar', 'Apr', 'May', 'Jun', 'Jul', 'Aug', 'Sep', 'Oct', 'Nov', 'Dec'); ($sec, $min, $hour, $mday, $mon, $year, $wday) = gmtime; $ctime = sprintf("%s, %02d %s %04d %02d:%02d:%02d GMT", $wday[$wday], $mday, $mon[$mon], $year + 1900, $hour, $min, $sec); print "Content-Type: image/gif\r\nExpires: $ctime\r\n\r\n"; などとしてから画像を出力すれば良いですね。 # Expires: は必ず GMT なのに注意。 >(ちなみに私は,"Monday"と言う様に週の欄は,フル書きで記述して,月の欄は, >上記の書き方と全く同様に英語の月名を3文字に省略して,書いています。) HTTP手順で用いられる日時の書き方に関してはチョット前に「うぇぶ会議室の部屋3」の 2000年問題に関する記事でふれたのでそちらを参照して下さい。
三葉工房です。 報告が遅れて済みません! アドバイスどうもありがとうございました。 とても分かり易かったです。 下記の通り >print "Content-Type: image/gif\r\nExpires: $ctime\r\n\r\n"; で,色々と,$ctimeのフォーマット(WEEK_NAMEを3文字略(san等),若くはフル書きに したり等),色々とRCEのフォーマットを替ながら,そのスクリプトのHTMLで出力される サブルーチンにフォーマットその物をプリントアウトして確認出来る様にして,フォーマットのミスが無い事を確認しながら試して見ましたがやはり無理でした。 おそらく,NET-SCAPE4.5では,Expires: $ctimeの実現は,ちょっと難しい気がします。 ですから,残念ですがその再起動ボタンのみでイメージをネット上から読み直せる処理は,潔くあきらめようと思います。 後,余談ですがスクリプト処理で気付いた事に関してお話しさせていただこうと思い ます。 最近は,ファイルの読み書きの際に,ファイルの内容を読み落としたまま,配列に代入 して,処理を完了してそのファイルに上書きする際に空白のリストを書き込むトラブル が起こっています。ですから,自分もアクセスが多くなるのに踏まえて色々と, ファイルの排他制御について勉強しなければいけないと思っています。 後,こんなのもありました。 perl4.306では,print文での文字列の末尾が"表"等の文字化け処理だとサーバエラー になるそうです。"\表"で出力出来る様になりました。 そして,SENDMAILの処理は,随分と処理時間を費やすものですね。一度に,7つの メッセージを作成する処理がありましてつくづくそう感じました。 それでは,又質問がありましたら投稿させていただきます。 失礼します。
5月21日に、三葉工房さんは書きました。 >で,色々と,$ctimeのフォーマット(WEEK_NAMEを3文字略(san等),若くはフル書きに >したり等),色々とRCEのフォーマットを替ながら,そのスクリプトのHTMLで出力される >サブルーチンにフォーマットその物をプリントアウトして確認出来る様にして, >フォーマットのミスが無い事を確認しながら試して見ましたがやはり無理でした。 うーん、どんなスクリプトになったのか分かりませんが、例えば以下のように (大胆にエラー処理などを削除してある(^^;;)簡単なスクリプトを実行してみましょうか。
#!/usr/local/bin/perl @wday = ('Sun', 'Mon', 'Tue', 'Wed', 'Thu', 'Fri', 'Sat'); @mon = ('Jan', 'Feb', 'Mar', 'Apr', 'May', 'Jun', 'Jul', 'Aug', 'Sep', 'Oct', 'Nov', 'Dec'); srand; ($sec, $min, $hour, $mday, $mon, $year, $wday) = gmtime; $ctime = sprintf("%s, %02d %s %04d %02d:%02d:%02d GMT", $wday[$wday], $mday, $mon[$mon], $year + 1900, $hour, $min, $sec); print "Content-Type: image/gif\r\nExpires: $ctime\r\n\r\n"; open(IMG, sprintf('%s/ba%d.gif', '/home3/nir/public_html/icons/ball', int(rand(6)))); $/ = undef; print <IMG>; close(IMG); exit(0);
これを実行すると、ba0.gif〜ba5.gifのどれかが「」の様に表示されます。 どうですか? リロードしても違うボールになりませんか? (^^)
www2s.biglobe.ne.jpから他のWeb Serverへのアクセスは 禁止されているんでしょうかね? connectionが確立できないみたいなんですが、 スクリプトの問題かどうか切り分けがちょっと面倒だなぁって (^_^;; 他のサーバーや自宅マシンからの動作テストではうまく行ってるので 抑止されているんだと信じたい所 Biglobeに問い合わせて薮蛇になってもアレだし・・・ どなたかご存知無いでしょうか?>ALL
5月14日に、Shigeさんは書きました。 >www2s.biglobe.ne.jpから他のWeb Serverへのアクセスは >禁止されているんでしょうかね? うーん、どうでしょうか? S号機は分かりませんが、すくなくとも1号機からは問題無く出られますが... Shigeさんとこの会議室はログ取ってましたっけ? こんな感じで読めました。 |$ ./Kagami -a 'http://www2s.biglobe.ne.jp/%7Et_shige/cgi-bin/forum/index.cgi' | |HTTP/1.0 200 OK |Server: Netscape-Enterprise/2.01b |Date: Fri, 14 May 1999 15:32:29 GMT |Expires: Fri, 14 May 1999 15:47:29 GMT |Last-modified: Fri, 14 May 1999 15:12:26 GMT |Content-type: text/html | |<HTML> |<HEAD><TITLE>井戸の蛙</TITLE></HEAD> | ...以下略 meshsv14.tk.mesh.ad.jpからのKagami/0.5とか言うユーザエージェントが残るはずですが。 # って、1号機の事書いてもしょうがないのかな? (^^;
5月15日に、にあさんは書きました。 >5月14日に、Shigeさんは書きました。 > >>www2s.biglobe.ne.jpから他のWeb Serverへのアクセスは >>禁止されているんでしょうかね? > >うーん、どうでしょうか? >S号機は分かりませんが、すくなくとも1号機からは問題無く出られますが... > >Shigeさんとこの会議室はログ取ってましたっけ? こんな感じで読めました。 > >|$ ./Kagami -a 'http://www2s.biglobe.ne.jp/%7Et_shige/cgi-bin/forum/index.cgi' >| >|HTTP/1.0 200 OK >|Server: Netscape-Enterprise/2.01b >|Date: Fri, 14 May 1999 15:32:29 GMT >|Expires: Fri, 14 May 1999 15:47:29 GMT >|Last-modified: Fri, 14 May 1999 15:12:26 GMT >|Content-type: text/html >| >|<HTML> >|<HEAD><TITLE>井戸の蛙</TITLE></HEAD> >| ...以下略 > いえ うぇぶ会議室ではログを取っていません #誰がアクセスしているか見えちゃうと気になって記事が書けなくなる(^_^;) >meshsv14.tk.mesh.ad.jpからのKagami/0.5とか言うユーザエージェントが残るはずですが。 > ># って、1号機の事書いてもしょうがないのかな? (^^; そうですねBiglobeでもwww2hは接続出来る事を既に確認しています。 #www2hは私のアカウントではないので色々やるにはちょっと手間が掛かり #先方(素人)にも手を煩わせてしまふ
ファイルのアップロードについて質問させてください。 ファイルのアップロードについてHTML本をみながら作成しているのですが、 トリガーボタンが”参照”と日本語でブサイクにでてきてしまいます。 どうやら、HTMLの仕様のようですが、 INPUTタグで、TYPEをFILEにすると 日本語版Windowsでは参照...ボタンになり 英語版Windowsでは英語になるようです。 <INPUT TYPE=”FILE” VALUE=”ABC”>と入力しても ボタンには「ABC」とではなく、「参照...」ボタンになってしまいます。 どなたかよい解決方法をしりませんでしょうか? 突然お邪魔して申し訳ございませんがよろしくお願い致します。