試してみたが、他プロセスでファイルをopenしているときでも、chmodは効く。 パーミッションはopen時に判定で、print時は関係無いみたい。 となると、以下の部分で1000越えのメッセージいくつも書かれるのが納得いかないが、 もしかして別のところでchmodで書き込み可能にしてない? if(-w $dattemp && $lognum > 999){ open(OVER, ">>$dattemp"); print OVER "1001<><>Over 1000 Thread<>このスレッドは1000を超えました。 <br> もう書けないので、新しいスレッドを立ててくださいです。。。 <>\n"; close(OVER); chmod(0555, $dattemp);
>>229 サブルーチンなので、変数名が変わってるだけかと。
>>228 あるbbs.cgiが「1000を超えました」を書いて、
そのbbs.cgiがdatをクローズして、chmodするまでのわずかな時間に、
別のbbs.cgiが書いていると。
典型的な競合状態ってやつではないかなと。
つまり、プログラミング的には「腕の見せ所」のはず。
228じゃないけど あるプロセスがchmodを行って、完了する前に別のプロセスが書き込みモードでopenしてしまう。 すると、最初のプロセスのchmodが完了せず、別のプロセスの書き込み完了まで待たされる。 その間に、さらに別のプロセスがオープンして、、 という感じで、全プロセスがファイルをcloseしない限り、chmodが完了しないのかな。
>>233 のリンク先にこんなのがありますね。
http://www.dd.iij4u.or.jp/~okuyamak/Documents/NetworkFileSystem.Tune.4.html より引用:
File System は、実は、順序による結果の一意決定性の保証をしなくても File System と
して動作するものを作ることができる。 たとえば、2つの process がほぼ同時に write() と
chmod() を リクエストしてきたとしよう。 一応、順序的には『write→chmod』だとする。
この場合、File System は、
「んー。なんかこの write、時間がかかりそうだな。 先に chmod やるか」
と言って、内部で順序を入れ替えてしまっても、 実は バレナイ 。 ばれないということは
(公平性には欠けるかも知れないが)、 File System の実装としては「あり」だと言うことになる。
しかし、write() と chmod() の間の時間が十分に離れていれば、 そしてこの間にこれ以外の
リクエストがいっさい来なければ、 write() と chmod() はこの順序通りに実行される。
仮に、同一のファイルに対する write() 並びに chmod() で、 しかも chmod() されると
write() が実行できなくなるような場合、 外部から観察した場合のリクエスト順序 と
内部でのリクエスト順序 が一致しなくなる。 しかも、常に一定の結果になれば良いのだが、
その保証が無い場合、journal を利用しても結果が再現できなくなる。 上の例だと、
wirte と chmod が十分時間間隔を開けて到着したので write->chmod の順で
ファイルシステムに反映した結果を client に返したのだが、 この直後に system down
を起こしたとしよう。 journal を実行する際には write と chmod は十分短い間隔で
要求されるので、 chmod->write の順で実行してしまったら、 同じ結果を得ることはできない。
つまり、
>>234 の例とは逆に、chmod()が(コストが高いから等の理由で)
なかなかスケジュール(実行)されないということも、当然ありうるということになりますね。
コンピュータさんも、いやなことは後回し♪
chmodの後の >$lognum++; って、subject.txtに書き込むレス数で使われるはずで、実際subject.txtには 1000以上の数値が書き込まれているから、chmodで待つということは無いと 思うんだけど。
238 :
197 :04/02/29 01:00 ID:7x47pFWz
えと、
>>197 あるいは
>>212 (←これは俺と別の人)の方法はどうでしょう。
これなら over 1000 判定されたら、 すでに 8) 以降にある別プロセスは蹴れないけれど
8) 以前のプロセスは蹴ることができるので、まあ 1050 位で止まると思う。
>>212 の人が言うように泥縄的アプローチではあるけれど。
>>238 chmodに成功しているけど反映に時間がかかると仮定すると
> ・chmod --- 成功したらロックディレクトリ消去
はマズいような。
>>238-239 >213-214にあるが
ファイルを作らないでやる方法を考える方が先らしい
241 :
197 :04/02/29 01:16 ID:7x47pFWz
>>239 じゃ、
>>212 の方法で、ロックファイル(ディレクトリ)はそのまま残して
後で適当に消すってことで。
>>240 それは I/O 負荷的問題?それともポリシーの問題?
気になったんで、さらっとカーネルソースを読んでみた。
ひさしぶりなんで感覚がよみがえらないけど(ctagsの作り方をすっかり忘れていた私)、
chmod()やfchmod()すると結局、
setfmode()っていうカーネル内の関数が呼ばれて、
その中でvn_start_write(vp, &mp, V_WAIT | PCATCH)して、
それが正常終了しないとVOP_SETATTR(chmodの本体部分)に
いきつかないようになってるみたい。
vn_start_write()のコメントを読んでみると、
/*
* Preparing to start a filesystem write operation. If the operation is
* permitted, then we bump the count of operations in progress and
* proceed. If a suspend request is in progress, we wait until the
* suspension is over, and then proceed.
*/
int
vn_start_write(vp, mpp, flags)
なんてことが書いてあって、V_WAITといういやーなフラグ立ててるみたいだから、
すべてのペンディングになっているwrite()がいったん(カーネル的に)一区切りつかない限り、
VOP_SETATTR()が行われないような予感。
つまり、fchmod()にしても(
>>139 )だめっていうことになるすね。
というか、カーネル的にこうなっているということは、chmod()するアプローチでは絶対だめってことじゃん。
うーむ。
>>242 それって今までの処理(書込み禁止のチェック)は破綻ってこと?
だとしたら
(>212に処理順番を入れて書いた) >213を実行?
>>241-242 >>91 もそうなんだけど、だからこそストップ(ロック)ファイルを作成してはと書いてみた。
あらかじめ作っておいてストップするときにリネームするという方法もあるが
ディレクトリ内のファイル数が増えるのが難点だなあ。
あと、I/Oを減らしたいなら1001以降のレス数を
subject.txtに反映するのを止めるという手もある。
245 :
239 :04/02/29 01:33 ID:fntZHoXb
chmodが完了して帰ってくるまでに時間がかかるとすると > ・chmod --- 成功したらロックディレクトリ消去 がイイような。
>>243 超多数のwriteが超同時多発的に出たりすると、vn_start_write()でブロックされて、
VOP_SETATTR()に行かなくなるような気がします。
でも、今10分ぐらい読んでみただけなんで、
このへんは、もっと中身をよく知ってる人に確認すべきな気がしますが。
個人的には、書き込みできないことの判定=ファイルモードが555、というのは
いまのままでいいから、1000超えのところだけでも、NNNNNNNNNN.dame とかいう
ファイル「も」作ることにして、
書き込めない または そのファイルがあったら 書き込み禁止とかにすべきかなとも思ったり。
今日はそろそろ、おやすみの時間。
読んでみたのはFreeBSD 5.2.1-RELEASEのカーネルなんで、 Linuxでは同じところをどうやってるか、誰かおしえていただけるとうれしいかも。 おやすみなさり。
厳密に必ず1001で止めなきゃ行けないシステムならatomicなアプローチが絶対必要だけど
2chでは10や20オーバーする程度は全然平気なんだから
素直に「書き込む前にレス数を数えて、1000を超えてたら書き込まない」がよろしいかと。
つまり
>>122 系統のアプローチで、1001OVER書き込みではなく
レス内容の書き込みの前にレス数を判定すると。
問題は、追記モードでopenした場合に読み込みがうまく出来るかだけど、どうだったかな?
読み込みが可能なら問題なしだけど、不可能な場合、書き換えモードでopenしなくちゃいけない。
この場合、排他モードに(又はlock)しないと
レスを書き込む前に.datの末尾にseekしてから実際に書き込むまでの間に
別プロセスでの書き込みがはさまってしまうかもしれない。
すると末尾にゴミがついたり書き込みが消えると言うことが頻発してしまう。
で、perl全然知らないんだけど
>>122 を元に
if (open(OUT, "+>>$DATAFILE")) {
@logdat = <OUT>;
if (scalar @logdat > 999) {
print OUT "$outdat\n";
print OUT "1001<><>Over 1000 Thread<>このスレッドは1000を超えました。 <br> もう書けないので、新しいスレッドを立ててくださいです。。。 <>\n";
close(OUT);
chmod(0555, $DATAFILE);
} else {
print OUT "$outdat\n";
close(OUT);
}
}
print $outdatやclose(OUT)が複数箇所で出て非常によろしくないけど
とりあえずwindows上では動作した。
で、そのchmodがうまく効いてくれないのが問題じゃなかったっけ? 1000レスを大幅にオーバーしちゃうのは。
だから、chmod完了待ちの間に大量のwriteリクエストが来ちゃうことが問題なの。 writeがあまり来なくなる(一段落する)と、chmodが完了するから大丈夫。 ↑で動作したと書いたけど、 競合状態(複数プロセス)でどうなるかはテストしてない。 FreeBSD上でどうなるかも。
あ、違う。 すみません。私がアホでした。 さらに if (1000over) { そのままclose(); } を入れないと意味無いんだった。
まとめ。 ・chmodによるロックは高負荷時に効かなくなる。 対策案 まともな対処 ・トランザクション処理をするDBDなどで1000ロック処理をする 分かりやすい対処 ・ファイルシステムでロックファイルを使う 提案 ・泥臭い処理を書くとバグるから、出来るだけCPANの.pm(Perl Module)を流用しよう
255 :
仕事人 ★ :04/02/29 02:36 ID:???
>>249 if (open(OUT, "+>>$DATAFILE")) {
ってのがあるんだ。
入れてみよう。
256 :
仕事人 ★ :04/02/29 02:43 ID:???
#open(OUT, ">>$DATAFILE"); #print OUT "$outdat\n"; #close(OUT); if (open(OUT, "+>>$DATAFILE")) { print OUT "$outdat\n"; my @logdat = <OUT>; if(scalar @logdat > 999) { print OVER "1001<><>Over 1000 Thread<>このスレッドは1000を超えました。 <br> もう書けないので、新しいスレッドを立ててくださいです。。。 <>\n"; close(OUT); chmod(0555, $DATAFILE); } else { close(OUT); } }
257 :
仕事人 ★ :04/02/29 02:44 ID:???
>>256 版を全サーバに入れました
live5 を除く
live8/9 は root★さんのもじもじが必要
if(scalar @logdat > 1000) { close(OUT); } この文も入れたほうがいいかと、、
$lognum = @logdat を入れなくて大丈夫?
1000 OVERに広告つけたら凄そうだなぁw
if (scalar @logdat > 1000) { DispError("ERROR!", "ERROR:このスレッドには書き込めません。"); }
262 :
仕事人 ★ :04/02/29 03:06 ID:???
こうか? #open(OUT, ">>$DATAFILE"); #print OUT "$outdat\n"; #close(OUT); if (open(OUT, "+>>$DATAFILE")) { print OUT "$outdat\n"; my @logdat = <OUT>; $lognum = @logdat; if($lognum > 1000) { DispError("ERROR!", "ERROR:このスレッドには書き込めません。"); close(OUT); } if($lognum > 999) { print OVER "1001<><>Over 1000 Thread<>このスレッドは1000を超えました。 <br> もう書けないので、新しいスレッドを立ててくださいです。。。 <>\n"; close(OUT); chmod(0555, $DATAFILE); } else { close(OUT); } }
こうかな? #open(OUT, ">>$DATAFILE"); #print OUT "$outdat\n"; #close(OUT); if (open(OUT, "+>>$DATAFILE")) { print OUT "$outdat\n"; my @logdat = <OUT>; $lognum = @logdat; if($lognum > 1000) { close(OUT); DispError("ERROR!", "ERROR:このスレッドには書き込めません。"); } elsif($lognum > 999) { print OVER "1001<><>Over 1000 Thread<>このスレッドは1000を超えました。 <br> もう書けないので、新しいスレッドを立ててくださいです。。。 <>\n"; close(OUT); chmod(0555, $DATAFILE); } else { close(OUT); } } $lognum が宣言してない変数なら、 $lognum = @logdat; ↓ my $lognum = @logdat; でたぶんいいかと。
264 :
仕事人 ★ :04/02/29 03:10 ID:???
こうだった #open(OUT, ">>$DATAFILE"); #print OUT "$outdat\n"; #close(OUT); if (open(OUT, "+>>$DATAFILE")) { print OUT "$outdat\n"; my @logdat = <OUT>; my $lognum = @logdat; if($lognum > 1000) { DispError("ERROR!", "ERROR:このスレッドには書き込めません。"); close(OUT); } if($lognum > 999) { print OVER "1001<><>Over 1000 Thread<>このスレッドは1000を超えました。 <br> もう書けないので、新しいスレッドを立ててくださいです。。。 <>\n"; close(OUT); chmod(0555, $DATAFILE); } else { close(OUT); } }
たまに「このスレッドは1000を超えました〜」が書き込まれないような気はしますが、 1000を超えて書き込まれることはなくなるはずです。 ……いいんだろうか。
266 :
仕事人 ★ :04/02/29 03:15 ID:???
わくわく どきどきってことで、
if($lognum > 999) ↓ elsif($lognum > 999) はなおしてもらわんと結局意味がないような、、
>>267 あー、DispErrorはexitしちゃうんで……。
269 :
仕事人 ★ :04/02/29 03:17 ID:???
さらに修正 #open(OUT, ">>$DATAFILE"); #print OUT "$outdat\n"; #close(OUT); if (open(OUT, "+>>$DATAFILE")) { print OUT "$outdat\n"; my @logdat = <OUT>; my $lognum = @logdat; if($lognum > 1000) { close(OUT); DispError("ERROR!", "ERROR:このスレッドには書き込めません。"); } if($lognum > 999) { print OVER "1001<><>Over 1000 Thread<>このスレッドは1000を超えました。 <br> もう書けないので、新しいスレッドを立ててくださいです。。。 <>\n"; close(OUT); chmod(0555, $DATAFILE); } else { close(OUT); } }
270 :
仕事人 ★ :04/02/29 03:19 ID:???
またまた修正 #open(OUT, ">>$DATAFILE"); #print OUT "$outdat\n"; #close(OUT); if (open(OUT, "+>>$DATAFILE")) { print OUT "$outdat\n"; my @logdat = <OUT>; my $lognum = @logdat; if($lognum > 1000) { close(OUT); DispError("ERROR!", "ERROR:このスレッドには書き込めません。"); } if($lognum > 999) { print OUT "1001<><>Over 1000 Thread<>このスレッドは1000を超えました。 <br> もう書けないので、新しいスレッドを立ててくださいです。。。 <>\n"; close(OUT); chmod(0555, $DATAFILE); } else { close(OUT); } }
>>268 あ、DispErrorでexitするから結局elsifにしなくてもいい、ってことね、、
何か気味悪いなw
print OUT "$outdat\n"; を1000over判定の後にして$lognumを++する方が。 もし書き込めなかったら狂っちゃうけど chmod問題の原因はそっちっぽいから。
>>270 1000以上でも書き込みするような気がするけど?
274 :
名無し募集中。。。 :04/02/29 03:27 ID:Khv3Ivk3
狼で1000いったスレに 1001<><>Over 1000 Thread<>このスレッドは1000を超えました。 <br> もう書けないので、新しいスレッドを立ててくださいです。。。 が書きこまれないです。 1000で止まってますけど
あ、@logdatをhtml/*.html作成とかで使ってるのかな。
>>271 そうです。だから実はcloseも要らないです。
……まあたしかに行儀は悪いですが。
277 :
仕事人 ★ :04/02/29 03:28 ID:???
chmod(0555, $DATAFILE); したファイルには書けないんだから 次のbbs.cgiは早めに判定した方がいいなぁ 512 超え判定と同時にやるのがいいのだろうか? どやってやるの? これはbbs.cgiのかなり前半 my $datsizeis =(stat("$DATAFILE"))[7]; unless( $datsizeis <= 512000){ DispError("ERROR!","ERROR:このスレッドは512kを超えているので書けません!"); }
>>272 あ、それ思った。
if (open(OUT, "+>>$DATAFILE"))
{
my @logdat = <OUT>;
my $lognum = @logdat;
++$lognum;
if($lognum > 1000)
{
close(OUT);
DispError("ERROR!", "ERROR:このスレッドには書き込めません。");
}
print OUT "$outdat\n";
if($lognum > 999)
{
print OUT "1001<><>Over 1000 Thread<>このスレッドは1000を超えました。 <br> もう書けないので、新しいスレッドを立ててくださいです。。。 <>\n";
close(OUT);
chmod(0555, $DATAFILE);
}
else
{
close(OUT);
}
}
あと、各所で1001が消えてるみたいだけど、気にしない方向で。
279 :
仕事人 ★ :04/02/29 03:35 ID:???
変更 if (open(OUT, "+>>$DATAFILE")) { my @logdat = <OUT>; my $lognum = @logdat; ++$lognum; if($lognum > 1000) { close(OUT); DispError("ERROR!", "ERROR:このスレッドには書き込めません。"); } print OUT "$outdat\n"; if($lognum > 999) { print OUT "1001<><>Over 1000 Thread<>このスレッドは1000を超えました。 <br> もう書けないので、新しいスレッドを立ててくださいです。。。 <>\n"; close(OUT); chmod(0555, $DATAFILE); } else { close(OUT); }
>>277 それって
unless( -s $DATAFILE <= 512000){
DispError("ERROR!","ERROR:このスレッドは512kを超えているので書けません!");
}
でよいような気がする。。あとで$datsizeisを別に使うならまだしも。
で、ファイルのパーミッションを取得するのは
(stat("$DATAFILE"))[2]
だそうです。
>>277 if (!-w $DATFILE) {
DispError("ERROR!","ERROR:このスレッドには書き込めません。");
}
とか?
>>281 あっ、そっちのほうがスマートだね、、じゃあ、
unless( -w $DATAFILE){
DispError("ERROR!","ERROR:このスレッドには書き込めません。");
}
unless( -s $DATAFILE <= 512000){
DispError("ERROR!","ERROR:このスレッドは512kを超えているので書けません!");
}
こうだとよいのかな?(下はどうでもいいけど、、)
283 :
仕事人 ★ :04/02/29 03:47 ID:???
入れてこますか unless( -w $DATAFILE){ DispError("ERROR!","ERROR:このスレッドには書き込めません。"); } unless( -s $DATAFILE <= 512000){ DispError("ERROR!","ERROR:このスレッドは512kを超えているので書けません!"); } でも 二回実行するより stat とったほうがいいのかな?
284 :
仕事人 ★ :04/02/29 03:49 ID:???
× 入れてこますか ○ 入れてみますか
unless (-w $DATAFILE) { DispError("ERROR!","ERROR:このスレッドには書き込めません。"); } unless (-s _ <= 512000) { DispError("ERROR!","ERROR:このスレッドは512kを超えているので書けません!"); } でどうでしょ。
書き込み可能かの判定はaccess()でも出来るけど サイズの判定はstat()じゃないと駄目なので、結局stat()は呼ばれる。 と思うのでstat()1回に一票。
>入れてこますか ヒソヒソヒソ・・
289 :
仕事人 ★ :04/02/29 04:02 ID:???
つまり if($lognum > 1000) { close(OUT); DispError("ERROR!", "ERROR:このスレッドには書き込めません。"); } これは保険で unless( -w $DATAFILE){ DispError("ERROR!","ERROR:このスレッドには書き込めません。"); } が通常のルートですなぁ メッセージ変えておこうかな、
>>286 だと2回目の判定で前回のデータから読み込むんだね、、
statじゃなくてもそれが一番よさげ。
292 :
仕事人 ★ :04/02/29 04:04 ID:???
>>290-291 ( ・∀・)つ〃∩ヘェーヘェーヘェー
if($lognum > 1000)
{
close(OUT);
DispError("ERROR!", "ERROR:このスレッドには書き込めません。緊急緊急緊急!!");
}
『1001』が書き込まれてないスレって、パーミションが 落ちてないような気がするけど大丈夫かな? 圧縮の時にパーミション見てたりしていない?
>>293 ニュー速の1001がいないスレにテスト書き込みしてみたけど、
「ERROR:このスレッドには書き込めません。」でした。
パーミションはちゃんと落ちてる模様。
>>294 パーミッションじゃなく1000overではじかれてるんじゃない?
1001の書き込みとchmodはセットでしょ?
大丈夫なの?
>>292 のメッセージ入りバージョンなら、外から判別できるみたいよ。
なにやら1001ストッパーがかかっているスレッドはsubject.txtに記録されているレス数が微妙に少ないような。 print OUT "1001<><>Over 1000 Thread<>このスレッド〜 のところに $lognum++ が必要な気がする……。
>>297 狼をしばらく見てたけど、どうやら
subject.txtに1001と書いてある→1001ストッパーがいない
subject.txtに1002と書いてある→1001ストッパーがいて、普通通り止まっている
になってるみたいです。
>>299 あ、多くなるんですか……。なんだろう。
1001がないスレをJaneで取得するとDATサイズエラー警告が出る。
試しに狼の1000超えスレッド15本を見ると、 subject.txtは1002、datは1001、1001ストッパーあり:8スレッド subject.txtは1001、datは1001、1001ストッパーあり:3スレッド subject.txtは1001、datは1000、1001ストッパーなし:4スレッド でした。subject.txtの勝率2割。 Live2chだと実害はありませんが、 「新着あり」→「レス取得」→「新着あり」の永久コンボです。 そろそろ雑質スレや専用ブラウザスレが騒がしくなってきました。
live9も、もじもじ。
ここのやりとりを起き抜けでぼおっと読みました。 作戦の趣旨は理解できたです。 あとは、超高負荷になった時にどうなるかということで。
>306 live8に入れないと分からない 1.( 1001 < $lognum) && ($lognum < 2000)の範囲内 2.datファイルが壊れる 3.鯖が落ちる のどれか
924もパーミッションで止めるようにできるね(もうやってるのかな
そもそも高速処理が要求されるのに 高コストなライトパーミッションクローズでとめられるのかというと・・・ キャッシュがされないDNSのようなしくみがあればいいんですが。
>>310 訂正。
>>191 の案1で1000を越えていたときのみキャッシュするようにする。
たとえばこのスレを例にとり、
1076666901.oparete..qb3.tts.2ch.netなるホストの逆引きで
1000を越えているいないでキャッシュの許可権限を動的に変換できないかということ。
まずいなぁ 2chブラウザ大幅見直しか…
313 :
仕事人 ★ :04/02/29 14:22 ID:???
>>279 のどこが悪いんだ?
ここじゃなくて他のところが悪いの?
状況が飲み込めてないおいら。 過去ログ読もう。
>>313 >>279 だと、
確実に書き込みは止まると思うけど、
高負荷だと「このスレッドは1000を超えました」を誰も通らないことになると思う。
…つか、実際になってるか。
>>313 >>279 多分、
if($lognum > 999)
{
print OUT "1001<><>Over 1000 Thread<>このスレッドは1000を超えました。 <br> もう書けないので、新しいスレッドを立ててくださいです。。。 <>\n";
close(OUT);
chmod(0555, $DATAFILE);
}
の部分を誰も通ってないのではないかと。。
かぶった。。。
今、live8/livecxのチェックを番組を未ながらやってるです。 この内容じゃ、速いの当たり前か。
未ながら => 見ながら
subject.txtに書かれるレス数と実際のレス数が違うのなんでだろ〜
キャップ(★)とは被るものですから。
やっぱり根本的に作り直さないとダメなのかなぁ、、
324 :
仕事人 ★ :04/02/29 14:36 ID:???
325 :
仕事人 ★ :04/02/29 14:37 ID:???
(1) bbs.cgi の序盤 unless( -w $DATAFILE){ DispError("ERROR!","ERROR:このスレッドには書き込めません。"); } unless( -s $DATAFILE <= 512000){ DispError("ERROR!","ERROR:このスレッドは512kを超えているので書けません!"); }
326 :
仕事人 ★ :04/02/29 14:38 ID:???
(2) bbs.cgi の中盤の最後 (datへの追記) if (open(OUT, "+>>$DATAFILE")) { my @logdat = <OUT>; my $lognum = @logdat; ++$lognum; if($lognum > 1000) { close(OUT); DispError("ERROR!", "ERROR:このスレッドには書き込めません。緊急緊急緊急!!"); } print OUT "$outdat\n"; if($lognum > 999) { print OUT "1001<><>Over 1000 Thread<>このスレッドは1000を超えました。 <br> もう書けないので、新しいスレッドを立ててくださいです。。。 <>\n"; close(OUT); chmod(0555, $DATAFILE); } else { close(OUT); } }
327 :
仕事人 ★ :04/02/29 14:39 ID:???
(3) bbs.cgi の終盤の始め #================================================== # ファイル操作(subject.txt & subback.html) #================================================== { #サブジェクトパスを作成 my $rnd = int(rand(99999)); my $subject = $PATH . "subject.txt"; my $subtemp = $PATH . $rnd . $FORM{'time'} . ".tmp"; my $keyfile = $FORM{'key'} . ".dat"; use vars qw($FILENUM); use vars qw($SUBLINE); use vars qw(@newsub); #サブジェクトファイルを読み込む unless(-e "$subject"){ makesub(); } open(SUBR,"<$subject");#SUBJECTを開く my @SUBJECTLIST = <SUBR>;#内容を全て読み込む close(SUBR);#閉じる $FILENUM = @SUBJECTLIST; MakeWorkFile($FORM{'key'}); if($FORM{'subject'} ne ""){ #subjectがあれば新規スレッド my $subtm = "$keyfile<>$FORM{'subject'} (1)\n"; @newsub = ($subtm, @SUBJECTLIST); ++$FILENUM; }else{ my (@tempsub, $transub, $frontsub, $rearsub); if($FORM{'mail'} =~ /sage/){ $transub = join('<<>>', @SUBJECTLIST);#一本につなげる ($frontsub, $rearsub) = split(/$keyfile<>/, $transub);#keyでぶったぎる @tempsub = split(/<<>>/, $rearsub);#後半ぶつ切り $transub = shift(@tempsub);#タイトルを取り出す $transub = $keyfile . "<>" . $SUBLINE;#タイトル入れ替え @newsub = (split(/<<>>/, $frontsub), $transub, @tempsub); }else{ $transub = $keyfile . "<>" . $SUBLINE; @newsub = ($transub, grep(!/^$FORM{'key'}/, @SUBJECTLIST)); } } if(@newsub){ #SUBJECTに書き込む open(SUBT, ">$subtemp"); #flock(SUBT, 2); foreach(@newsub){ print SUBT $_; } #flock(SUBT,8); close(SUBT); my $resuc = 0; until($resuc){ $resuc = rename($subtemp, $subject); } }else{ @newsub = @SUBJECTLIST; } }
328 :
仕事人 ★ :04/02/29 14:40 ID:???
関連するサブルーチンに makesub(); MakeWorkFile($FORM{'key'}); この二つがある
329 :
仕事人 ★ :04/02/29 14:41 ID:???
#================================================== # subject.txtの補完 #================================================== sub makesub{ my $bbs = $FORM{'bbs'}; my $path = "../"."$bbs"; #$where{$bbs}; my $datpath = $path."/dat"; open(DIR, "ls $datpath/|") || print HTM " cant' ls."; my @dir = <DIR>; close(DIR); my %time; my @pagefile; foreach(@dir){ chop(); my $mtime; my $pagemax; my $mt = "$mtime"."$_"; ($mtime) = (stat("$datpath/$_"))[10]; $time{"$mt"} = $_; ++$pagemax; } my @mtime = keys(%time); my @sorting = sort by_number @mtime; my $filenum; foreach(@sorting){ push(@pagefile,$time{"$_"}); #print $time{"$_"}; ++$filenum; } #@pagefile = reverse(@pagefile); my $num; my $subject; while($filenum>=$num){ my $showpage = @pagefile[$num]; if($showpage eq ""){ } open(IN, "$datpath/$showpage")||die ""; my $resnum = 1; my $rr = 0; while(<IN>){ $resnum++; if($rr == 0){ $_ =~ s/\n//gi; $_ =~ s/\r//gi; my ($name,$mail,$time,$message,$subject); ($name,$mail,$time,$message,$subject) = split(/,/,$_); $rr = 1; } } close(IN); open(OUT,">$path/subject.txt"); print OUT $showpage .","; print OUT "$subject($resnum)\n"; ++$num; close(OUT); } }
330 :
仕事人 ★ :04/02/29 14:41 ID:???
#================================================== # ファイル操作(HTML作成用作業ファイル更新) #================================================== #HTML用DATを作成 #MakeWorkFile(KEY-NUMBER) sub MakeWorkFile{ my $key = @_[0]; my $workfile = $TEMPPATH . $key . ".html"; my $dattemp = $DATPATH . $key . ".dat"; my (@messx,@content,@logdat); my ($lognum,$mailto,$time,$brmax,$topnum,$firstlog,$name,$mail,$subject,$message); open(RDAT,"<$dattemp"); @logdat=<RDAT>;#ログを配列に読み込む close(RDAT); #ログのカキコ数を取得 $lognum = @logdat; if(-w $dattemp && $lognum > 999){ #open(OVER, ">>$dattemp"); #print OVER "1001<><>Over 1000 Thread<>このスレッドは1000を超えました。 <br> もう書けないので、新しいスレッドを立ててくださいです。。。 <>\n"; #close(OVER); #chmod(0555, $dattemp); $lognum++; if(-w $dattemp){ my $datdat = $DATPATH . $key; my $tmpdat = $DATPATH . $key . ".tmp"; my $success; open(COPY, "cp $dattemp $datdat |"); close(COPY); $success = 0; until($success){ $success = rename($datdat, $dattemp); } chmod(0555, $dattemp); unlink($tmpdat); } } #1つ目の要素を読み込む $firstlog = $logdat[0]; #改行カット chomp($firstlog); #1つ目の要素を加工する ($name,$mail,$time,$message,$subject) = split(/<>/,$firstlog); $SUBLINE = $subject . " (" . $lognum . ")\n"; open(SHTM,">$workfile");#ログテンポラリを開く #flock(SHTM,2); #サブジェクトテーブルを吐き出す(ここは必ず1行にまとめること(処理効率)) #----------------------------------------------------------------------- print SHTM <<EOF; <TABLE border=1 cellspacing=7 cellpadding=3 width=95% bgcolor="$SETTING{"BBS_THREAD_COLOR"}" align=center><TR><TD><DL><a name="\$ANCOR"></a><DIV ALIGN="right"><a href ="#menu">■</a><a href="#\$FRONT">▲</a><a href="#\$NEXT">▼</a></DIV><B>【\$ANCOR:$lognum】<FONT size=5 color="$SETTING{'BBS_SUBJECT_COLOR'}">$subject</FONT></B> EOF #----------------------------------------------------------------------- #1つ目のメールへのリンクを作成 if($ENV{'SERVER_NAME'} =~ /bbspink\.com/i) {#if(bbspink) unless($message =~ /2ch\.net/ || $message =~ /bbspink\.com/){ $message =~ s/(https?|ftp|gopher|telnet|whois|news)\:\/\/([\w|\:\!\#\$\%\=\&\-\^\`\\\|\@\~\[\{\]\}\;\+\*\,\.\?\/]+)/<a href=\"http\:\/\/pinktower\.com\/$2\" target=\"_blank\">$1\:\/\/$2<\/a>/ig; }else{ $message =~ s/(https?|ftp|gopher|telnet|whois|news)\:\/\/([\w|\:\!\#\$\%\=\&\-\^\`\\\|\@\~\[\{\]\}\;\+\*\,\.\?\/]+)/<a href=\"http\:\/\/$2\" target=\"_blank\">$1\:\/\/$2<\/a>/ig; } } else {#if(!bbspink) unless($message =~ /2ch\.net/ || $message =~ /bbspink\.com/){ $message =~ s/(https?|ftp|gopher|telnet|whois|news)\:\/\/([\w|\:\!\#\$\%\=\&\-\^\`\\\|\@\~\[\{\]\}\;\+\*\,\.\?\/]+)/<a href=\"http\:\/\/ime\.st\/$2\" target=\"_blank\">$1\:\/\/$2<\/a>/ig; }else{ $message =~ s/(https?|ftp|gopher|telnet|whois|news)\:\/\/([\w|\:\!\#\$\%\=\&\-\^\`\\\|\@\~\[\{\]\}\;\+\*\,\.\?\/]+)/<a href=\"http\:\/\/$2\" target=\"_blank\">$1\:\/\/$2<\/a>/ig; } }### if($mail ne ""){ $mailto = "<a href=\"mailto:$mail \"><b>$name </b></a>"; }else{ $mailto = "<font color=$SETTING{'BBS_NAME_COLOR'}><b>$name </b></font>"; } #1つ目の要素を吐き出す print SHTM "<dt>1 名前:$mailto $time<dd>$message <br><br><br>"; #ログ数から、表示コンテンツをチェック if($lognum > $SETTING{"BBS_CONTENTS_NUMBER"}){ #ケツの要素を0〜9番までコンテンツに格納 @content[0..$SETTING{"BBS_CONTENTS_NUMBER"}-1] = @logdat[@logdat-$SETTING{"BBS_CONTENTS_NUMBER"}..@logdat-1]; $topnum=@logdat-($SETTING{"BBS_CONTENTS_NUMBER"}-1); }else{ #アタマの要素を1〜10番までコンテンツに格納 @content[0..($SETTING{"BBS_CONTENTS_NUMBER"}-1)] = @logdat[1..$SETTING{"BBS_CONTENTS_NUMBER"}]; $topnum=2; } foreach(@content){ chomp($_);#改行をカット #要素を加工する ($name,$mail,$time,$message,$subject) = split(/<>/,$_); unless($_){ $topnum++; next; } #要素のメールへのリンクを作成 if($ENV{'SERVER_NAME'} =~ /bbspink\.com/i) {#if(bbspink) #if(bbspink) unless($message =~ /2ch\.net/ || $message =~ /bbspink\.com/){ $message =~ s/(https?|ftp|gopher|telnet|whois|news)\:\/\/([\w|\:\!\#\$\%\=\&\-\^\`\\\|\@\~\[\{\]\}\;\+\*\,\.\?\/]+)/<a href=\"http\:\/\/pinktower\.com\/$2\" target=\"_blank\">$1\:\/\/$2<\/a>/ig; }else{ $message =~ s/(https?|ftp|gopher|telnet|whois|news)\:\/\/([\w|\:\!\#\$\%\=\&\-\^\`\\\|\@\~\[\{\]\}\;\+\*\,\.\?\/]+)/<a href=\"http\:\/\/$2\" target=\"_blank\">$1\:\/\/$2<\/a>/ig; } }else {#if(!bbspink) unless($message =~ /2ch\.net/ || $message =~ /bbspink\.com/){ $message =~ s/(https?|ftp|gopher|telnet|whois|news)\:\/\/([\w|\:\!\#\$\%\=\&\-\^\`\\\|\@\~\[\{\]\}\;\+\*\,\.\?\/]+)/<a href=\"http\:\/\/ime\.st\/$2\" target=\"_blank\">$1\:\/\/$2<\/a>/ig; }else{ $message =~ s/(https?|ftp|gopher|telnet|whois|news)\:\/\/([\w|\:\!\#\$\%\=\&\-\^\`\\\|\@\~\[\{\]\}\;\+\*\,\.\?\/]+)/<a href=\"http\:\/\/$2\" target=\"_blank\">$1\:\/\/$2<\/a>/ig; } } ## if($mail ne ""){ $mailto = "<a href=\"mailto:$mail \"><b>$name </b></a>"; }else{ $mailto = "<font color=$SETTING{'BBS_NAME_COLOR'}><b>$name </b></font>"; } print SHTM "<dt>$topnum 名前:$mailto :$time<dd>"; my @messx = split(/<br>/,$message);#メッセージを行でカット my $messy = @messx;#行数を計算 if($messy > $SETTING{"BBS_LINE_NUMBER"}){ my $messz = join('<br>',@messx[0 .. $SETTING{'BBS_LINE_NUMBER'}-1]); print SHTM "$messz <br>"; print SHTM "<font color=\"$SETTING{'BBS_NAME_COLOR'}\">(省略されました・・全てを読むには<a href=\"../test/read.cgi/$FORM{'bbs'}/$key/$topnum\" target=\"_blank\">ここ</a>を押してください)</font><br>"; }else{ my $messz = join('<br>',@messx[0 .. $messy-1]); print SHTM "$messz <br>"; } $topnum++; print SHTM "<br>\n"; } #----------------------------------------------------------------------- #flock(SHTM,8); close(SHTM); #パーミッション調整 umask(0); chmod(0666,$workfile); }
>>325 -w $DATAFILE or ( -s $DATAFILE <= 512 * 1024) or DispError("ERROR!","ERROR:このスレッドには書き込めません。");
エラーの単純化っでどうかしら?理由はどうあれ書き込めないのですから(^-^)
chmodはされているのにOver1000がprintされていない、、、?
そういえば、gethostbyaddr を二回やってるのはどうなんだろう。。。
>>331 追記および訂正。
our $Log_line = 1; # グローバル扱いで。以後レス数はこれを参照するとか。
if (open(OUT, "+>>$DATAFILE")) { $Log_line = join '', <OUT> =~ tr/\n/\n/ }
-w $DATAFILE or ( -s $DATAFILE <= 512 * 1024) or ($Log_line > 1000) or
DispError("ERROR!","ERROR:このスレッドには書き込めません。");
if (open(OUT, "+>>$DATAFILE")) { my @logdat = <OUT>; my $lognum = @logdat; if($lognum > 1000) { close(OUT); DispError("ERROR!", "ERROR:このスレッドには書き込めません。緊急緊急緊急!!"); } print OUT "$outdat\n"; ++$lognum; if($lognum > 1000) { print OUT "1001<><>Over 1000 Thread<>このスレッドは1000を超えました。 <br> もう書けないので、新しいスレッドを立ててくださいです。。。 <>\n"; close(OUT); chmod(0555, $DATAFILE); } else { close(OUT); } }
336 :
仕事人 ★ :04/02/29 14:58 ID:???
>>334 条件が無茶苦茶ですね。ごめんなさい。
(-w $DATAFILE and ( -s $DATAFILE <= 512 * 1024) and ($Log_line < 1001)) or
DispError("ERROR!","ERROR:このスレッドには書き込めません。");
>>335 むしろそうするくらいなら、
++$lognum; を削除
だけで済むような。
質問。subject.txtに記録されるレス数は
>>326 の $lognum ですか?
>>339 うん。今そのことについて議論してるところかと。
>340 漏れも多分そうだと思って一応++$lognum;は残しておいてもた
>342 もた→みた ヽ(`Д´)ノウワァァン
344 :
仕事人 ★ :04/02/29 15:10 ID:???
if($lognum > 1010) { close(OUT); DispError("ERROR!", "ERROR:このスレッドには書き込めません。緊急緊急緊急!!"); } にしてみた。
345 :
仕事人 ★ :04/02/29 15:11 ID:???
というか、datの書き込みのあとには、 #パーミッション調整 umask(0); chmod(0666, $DATAFILE); がきてますよー。
if($lognum > 1000) { ++$lognum; #←これもいるかも print OUT "1001<><>Over 1000 Thread<>このスレッドは1000を超えました。 <br> もう書けないので、新しいスレッドを立ててくださいです。。。 <>\n"; close(OUT); chmod(0555, $DATAFILE); }
ただ、
>>344 みたいなアプローチがどのぐらい効果あるかだけど、、、。
それで、1001ストッパーが書かれるような気は、あんまりしないかも。
ちょっとお出かけ。
350 :
仕事人 ★ :04/02/29 15:15 ID:???
#MakeWorkFile(KEY-NUMBER) sub MakeWorkFile{ my $key = @_[0]; my $workfile = $TEMPPATH . $key . ".html"; my $dattemp = $DATPATH . $key . ".dat"; my (@messx,@content,@logdat); my ($lognum,$mailto,$time,$brmax,$topnum,$firstlog,$name,$mail,$subject,$message); open(RDAT,"<$dattemp"); @logdat=<RDAT>;#ログを配列に読み込む close(RDAT); #ログのカキコ数を取得 $lognum = @logdat; if(-w $dattemp && $lognum > 999){ #open(OVER, ">>$dattemp"); #print OVER "1001<><>Over 1000 Thread<>このスレッドは1000を超えました。 <br> もう書けないので、新しいスレッドを立ててくださいです。。。 <>\n"; #close(OVER); #chmod(0555, $dattemp); #$lognum++; ← コメントにした
>>330 の
#ログのカキコ数を取得
から
#1つ目の要素を読み込む
の前までがいらない。
この中の$lognum++;が最終的にsebject.txtに書かれているので
実際より+1された数が入ってしまう。
352 :
仕事人 ★ :04/02/29 15:16 ID:???
353 :
仕事人 ★ :04/02/29 15:18 ID:???
変更 if (open(OUT, "+>>$DATAFILE")) { my @logdat = <OUT>; my $lognum = @logdat; ++$lognum; if($lognum > 1010) { close(OUT); DispError("ERROR!", "ERROR:このスレッドには書き込めません。緊急緊急緊急!!"); } print OUT "$outdat\n"; if($lognum > 999) { print OUT "1001<><>Over 1000 Thread<>このスレッドは1000を超えました。 <br> もう書けないので、新しいスレッドを立ててくださいです。。。 <>\n"; close(OUT); chmod(0555, $DATAFILE); } else { close(OUT); #パーミッション調整 umask(0); chmod(0666, $DATAFILE); } }
>chmod(0666, $DATAFILE); レス数が1000を超える原因と思われ
解決した? 最終的に subject <= 実際のカウント になればいいような
datの読み込みを2回やってるんですね〜……。
レスの書き込みとレス数の取得を同時にやる(
>>353 の処理を
>>350 に持ってくる)のがいいかも。
……大手術(汗)。
357 :
サザン ★ :04/02/29 15:24 ID:???
>>354 おいらもそう思ったですよ。
chmod 0555 しても、追っかけてきてるプロセスが chmod 0666 しちゃって、
そのプロセスが、chmod 0555 しても。。。
chmod 0666 を消したら解決だったりして。
>>357 chmodが効かないって変だと思ったんだよね。
でかける前に見た。
こりゃ、
>>354 がビンゴな気が。
でなきゃ、いくらひどいじょーきょーでも、4000とかいく原因とは考えにくい。
しばらくオフライン。たまーにPHSでチェックするかも。
360 :
サザン ★ :04/02/29 15:40 ID:???
というわけで、live8,9に chmod(0666, $DATAFILE); を消したやつを入れてみてくださいですー。
>>353 処理の順番が。。
これでどですか。
if (open(OUT, "+>>$DATAFILE"))
{
my @logdat = <OUT>;
my $lognum = @logdat;
if($lognum = 1000) #正常処理
{
print OUT "1001<><>Over 1000 Thread<>このスレッドは1000を超えました。 <br> もう書けないので、新しいスレッドを立ててくださいです。。。 <>\n";
close(OUT);
}
if($lognum > 1000) #非常時処理
{
close(OUT);
DispError("ERROR!", "ERROR:このスレッドには書き込めません。緊急緊急緊急!!");
}
print OUT "$outdat\n";
chmod(0555, $DATAFILE);
}
else if($lognum < 1000) #1000未満時処理
{
close(OUT);
#パーミッション調整
umask(0);
chmod(0666, $DATAFILE);
}
++$lognum;
}
訂正。。 if (open(OUT, "+>>$DATAFILE")) { my @logdat = <OUT>; my $lognum = @logdat; ++$lognum; if($lognum = 1000) #正常処理 { print OUT "1001<><>Over 1000 Thread<>このスレッドは1000を超えました。 <br> もう書けないので、新しいスレッドを立ててくださいです。。。 <>\n"; close(OUT); } if($lognum > 1000) #非常時処理 { close(OUT); DispError("ERROR!", "ERROR:このスレッドには書き込めません。緊急緊急緊急!!"); } print OUT "$outdat\n"; chmod(0555, $DATAFILE); } else if($lognum < 1000) #1000未満時処理 { close(OUT); #パーミッション調整 umask(0); chmod(0666, $DATAFILE); } }
#ERROR! #ERROR:このスレッドには書けません! #修正ここまで。 # "ERROR:このスレッドには書き込めません。緊急緊急緊急!!" が出てこないけど今ソースはどうなってるのだろう。。 if (open(OUT, "+>>$DATAFILE")) { my @logdat = <OUT>; my $lognum = @logdat; ++$lognum; if($lognum = 1000) #正常処理 { print OUT "1001<><>Over 1000 Thread<>このスレッドは1000を超えました。 <br> もう書けないので、新しいスレッドを立ててくださいです。。。 <>\n"; close(OUT); chmod(0555, $DATAFILE); } if($lognum > 1000) #非常時処理 { close(OUT); DispError("ERROR!", "ERROR:このスレッドには書き込めません。緊急緊急緊急!!"); } print OUT "$outdat\n"; } else if($lognum < 1000) #1000未満時処理 { close(OUT); #パーミッション調整 umask(0); chmod(0666, $DATAFILE); } }
>>364 それから、1001ストッパーを書き込む「前」に$outdatを出力しないとだめです(でないと書き込みが吸い込まれる)。
367 :
仕事人 ★ :04/02/29 19:27 ID:???
なぜ 1,001 が書き込まれないんだ?
1001ストッパーが書き込まれないのは
・プロセスAが
>>353 で1000レス目を書き込む
・プロセスBが
>>330 で(1000レス以上なので)chmodする
・プロセスAが1001ストッパーを書き込もうとするもEPERM
と予想してみる。
ということで、
>>353 を
if ($lognum > 1010) {
close(OUT);
chmod(0555, $DATFILE);
DispError("ERROR!", "ERROR:このスレッドには書き込めません。緊急緊急緊急!!");
}
にして、
>>330 の chmod(0555, $dattemp); を削除する、というのはどうでしょ。
……って、writeはEPERMなんか返さないか……。
370 :
仕事人 ★ :04/02/29 19:48 ID:???
これ全部いらないのか? if(-w $dattemp && $lognum > 999){ #open(OVER, ">>$dattemp"); #print OVER "1001<><>Over 1000 Thread<>このスレッドは1000を超えました。 <br> もう書けないので、新しいスレッドを立ててくださいです。。。 <>\n"; #close(OVER); #chmod(0555, $dattemp); #$lognum++; if(-w $dattemp){ my $datdat = $DATPATH . $key; my $tmpdat = $DATPATH . $key . ".tmp"; my $success; open(COPY, "cp $dattemp $datdat |"); close(COPY); $success = 0; until($success){ $success = rename($datdat, $dattemp); } chmod(0555, $dattemp); unlink($tmpdat); } }
371 :
仕事人 ★ :04/02/29 19:49 ID:???
いったい何をしているルーチンなんだろぅ
ファイルロックの名残? 総帥に事情聴取してからにしてください。 こないだのiスクリプト消滅騒ぎのような事態は避けないと。
あらためて
・複数のプロセスが999レス目のつもりで書き込む→1000オーバー(ただしストッパーは書かれない)
・1000オーバーなので
>>330 でchmod
と予想してみる。
ってことで、
>>330 の1001ストッパー書き込みも復活すれば……。
……泥縄だなぁ。
線を一気に飛び越えちゃうわけか。
ええとこれとまったく同じメッセージが書いてある部分のソースがないのですがどの部分でしょうか ↓ ERROR:このスレッドには書けません! あと $outdat っての値が代入されている部分のソースもないし。。
376 :
仕事人 ★ :04/02/29 20:19 ID:???
ええとこういう風になっているはずなのですけど。 DispError("ERROR!","ERROR:このスレッドには書き込めません!"); ---- ERROR! ERROR:このスレッドには書けません!
378 :
サザン ★ :04/02/29 20:26 ID:???
>>377 なんか重複してるけど、一緒です。
#.datが存在してないか書けないならばいばい
unless(-w $DATAFILE){
DispError("ERROR!","ERROR:このスレッドには書けません!");
}
#my $datsizeis =(stat("$DATAFILE"))[7];
#unless( $datsizeis <= 512000){
#DispError("ERROR!","ERROR:このスレッドは512kを超えているので書けません!");
#}
unless( -w $DATAFILE){
DispError("ERROR!","ERROR:このスレッドには書き込めません。");
}
unless( -s $DATAFILE <= 512000){
DispError("ERROR!","ERROR:このスレッドは512kを超えているので書けません!");
}
あ間違えたました、、こうです DispError("ERROR!","ERROR:このスレッドには書けません!");
381 :
サザン ★ :04/02/29 20:29 ID:???
>>370 chmod 0555 が失敗したときか、
chmod 0555 の後に書き込めるようになっちゃったときの処理ですかねー、
あんまり意味がないような気もする、、
>>378 別にどうでもいいんだけど
512k超えの処理ってunlessでやる意味あるんだろうか
>>370 でunlinkしている $DATPATH . $key . ".tmp" というファイルはどこで作ってるんでしょ?
384 :
仕事人 ★ :04/02/29 20:52 ID:???
謎がなぞ呼ぶ殺人事件〜
こんなに謎だらけでもなんとなく動いているところがすごい・・・(´Д`;)
386 :
仕事人 ★ :04/02/29 20:56 ID:???
>386 (;゚∀゚)<…
388 :
仕事人 ★ :04/02/29 20:58 ID:???
ようし、外してみよう。 #if(-w $dattemp && $lognum > 999){ ##open(OVER, ">>$dattemp"); ##print OVER "1001<><>Over 1000 Thread<>このスレッドは1000を超えました。 <br> もう書けないので、新しいスレッドを立ててくださいです。。。 <>\n"; ##close(OVER); ##chmod(0555, $dattemp); ##$lognum++; # #if(-w $dattemp){ #my $datdat = $DATPATH . $key; #my $tmpdat = $DATPATH . $key . ".tmp"; #my $success; #open(COPY, "cp $dattemp $datdat |"); #close(COPY); #$success = 0; #until($success){ $success = rename($datdat, $dattemp); } #chmod(0555, $dattemp); #unlink($tmpdat); #} #}
どきどき……。
一回整理しましょうよホント>bbs.cgi
392 :
仕事人 ★ :04/02/29 21:02 ID:???
>>391 何人の人がそう思いチャレンジしてきたことか・・・
いまだ勝者は一人としていない、暗黒の世界から生還したものはいない。
>>390 たぶん
/dat/key.dat に書き込んで
/dat/key.dat を /dat/key にコピーして ←たぶん無駄
/dat/key を /dat/key.dat にリネームして ←たぶん無駄
/dat/key.dat を書込み禁止にして
/dat/key.tmp をあぼーんしている ←たぶん無駄
かと……。
>>392 まぁチャレンジできる人が限られてるし…。
ここの暇人たち(←おい)なら軽く片付けちまいそうな気も…w
>>392 というか、ソースが(NDAでもいいから)完全公開されれば(ry
398 :
Vsw ◆OoVswP.T/I :04/02/29 21:20 ID:qAGI7Tit
400 :
仕事人 ★ :04/02/29 21:21 ID:???
うーむ 別の土俵で戦っていたのか。。。
>>400 で、どうするんです?
と聞いてみるテスト。
各板、片っ端から1000overしてるようです。
404 :
仕事人 ★ :04/02/29 21:25 ID:???
これが期待通りの動作をしていないってことっすね if (open(OUT, "+>>$DATAFILE")) { my @logdat = <OUT>; my $lognum = @logdat;
あわわ。。
うわー……。
407 :
仕事人 ★ :04/02/29 21:26 ID:???
408 :
動け動けウゴウゴ2ちゃんねる :04/02/29 21:26 ID:kaI5hUlb
テストとしてだけど1000を超えたらあらゆる変数を出力しまくってみては
409 :
動け動けウゴウゴ2ちゃんねる :04/02/29 21:26 ID:JvRnpXfA
1001復活きぼんぬ
1010のやつを生かしておいて,変数を色々出力して検証してみてはどうでしょ?
(ノ´∀`*)
412 :
動け動けウゴウゴ2ちゃんねる :04/02/29 21:30 ID:CtJQij/n
うはwwwwwwwwwww
現状
>>403 が一番凄い。
3000突破してる・・・
でもどうやら止まったみたいですね。
416 :
仕事人 ★ :04/02/29 21:32 ID:???
thinking time..... どぞ↓
ストッパーが外れちゃったのか…
どこも泊まって書き込めん買ったな
>>403 は、他の人が書きこめたてた時もオレはユーザー情報が消失してますとか言われて書き込めなかった
420 :
動け動けウゴウゴ2ちゃんねる :04/02/29 21:33 ID:Oky00rr1
いっそのこと1001ストッパー廃止でいいじゃん。
うーん。。。とりあえず各種変数を出力するようにしてみたら?
こんなところに誤爆していたとは・・・スマソ
>>416 >>404 を確かめるために
試験的に
>>353 の if($lognum > 1010) を if($lognum > 300) とかにして
300を超えたスレッドに書き込んでみて
「緊急緊急緊急!!」が出るかどうかを見てみるのはどうでしょか。
>>424 それは危険過ぎるとおもうなぁ>300にする
>>425 いや、いきなり全鯖に配るわけじゃなくて、(金) でテストするだけでも、と……。
qbのbbs.cgi更新すると一気に全鯖いくんじゃなかったっけ?(わからん
428 :
動け動けウゴウゴ2ちゃんねる :04/02/29 21:50 ID:Oky00rr1
>>426 (金)ではやり辛いでしょ。
いっそのことN速で実験しましょ。
金で1000取りやるですか。協力はしますが、、、
つーか老体にムチ打つなんておまいら最強だな
431 :
動け動けウゴウゴ2ちゃんねる :04/02/29 21:52 ID:kaI5hUlb
いろんなとこにフラグ立てまくって出力させてみてほしいです どこが実行できていて、どこができてないのかよく分かんない
433 :
仕事人 ★ :04/02/29 22:19 ID:???
ん? もう解ったんでないのか? 違うところで戦っていたということが、
434 :
動け動けウゴウゴ2ちゃんねる :04/02/29 22:23 ID:kaI5hUlb
ひょっとしたら my @logdat = <OUT>; の前に seek(OUT, 0, 0); を入れるといいかも(←自信なし)。
うちのwindowsだと、 if (open(OUT, "+>>$DATAFILE")) { #この時点でファイル末尾にseekされてる my @logdat = <OUT>; my $lognum = @logdat; これだと@logdatは空になっちゃうんだけど、、、 if (open(OUT, "+<$DATAFILE")) my @logdat = <OUT>; my $lognum = @logdat; じゃないすかね
>>436 うちのcygwinだと"+>>"でopenした時点でファイル先頭にseekされてました。
あと、追記モードじゃないと書き込みがぶつかったときにヤバいです。
なんか…ニュー速+も1001ストッパー壊れてるのね。 なにがなんだか…
今試したら、Windows(ActivePerl)でもsysopen使ったら先頭だった。
>>249 だけど、
>>438 と同様、
cygwin+perl5.8.2で、読み込み時は先頭から
同じくlinux(redhat8かな)+perl5.8.0でも。
と思ったら違ってたぽい。
思ったんだけど bbs.cgiを置き換えちゃうと不具合が出たときに面倒だし 変数を表示しようとしてもなかなか難しい。 そこで、bbs_test.cgiにして実験する。 で、こいつにPOSTするのも面倒だから POST先だけを変えたread_test.cgiを作り テスト用の鯖に入れる。 で、書き込みテストはそっちでやって、内部の変数や状態をずらずらと表示する。 ただ、1000到達時のテストは難しいかな。
446 :
仕事人 ★ :04/02/29 23:00 ID:???
open(OUT, ">>$DATAFILE"); print OUT "$outdat\n"; close(OUT); dat 追記部分は元にもどす。
447 :
仕事人 ★ :04/02/29 23:01 ID:???
そして、 ここに持ってくる sub MakeWorkFile{ my $key = @_[0]; my $workfile = $TEMPPATH . $key . ".html"; my $dattemp = $DATPATH . $key . ".dat"; my (@messx,@content,@logdat); my ($lognum,$mailto,$time,$brmax,$topnum,$firstlog,$name,$mail,$subject,$message); open(RDAT,"<$dattemp"); @logdat=<RDAT>;#ログを配列に読み込む close(RDAT); #ログのカキコ数を取得 $lognum = @logdat; if($lognum > 1010) { DispError("ERROR!", "ERROR:このスレッドには書き込めません。緊急緊急緊急!!"); } if($lognum > 999) { open(OUT,"<$dattemp"); print OUT "1001<><>Over 1000 Thread<>このスレッドは1000を超えました。 <br> もう書けないので、新しいスレッドを立ててくださいです。。。 <>\n"; close(OUT); chmod(0555, $dattemp); } else { #パーミッション調整 umask(0); chmod(0666, $dattemp); }
448 :
仕事人 ★ :04/02/29 23:01 ID:???
これを ニュー速に入れてみよう
はらはら……。
ぉぃ(汗
土器土器。
452 :
仕事人 ★ :04/02/29 23:05 ID:???
>>447 を見て気づいたこと。
・「緊急緊急緊急!!」が書き込み終わった後になる
・1001ストッパー書き込み時のオープンモードが読み込みモード
いきなり突っ込むとは…
455 :
動け動けウゴウゴ2ちゃんねる :04/02/29 23:07 ID:JvRnpXfA
ニュー速1000きっちりで終わったよ
457 :
仕事人 ★ :04/02/29 23:08 ID:???
>>453 ども 、
直してみた
if($lognum > 1010) # ここはこないと予想
{
DispError("ERROR!", "ERROR:このスレッドには書き込めません。緊急緊急緊急!!");
}
if($lognum > 999)
{
open(OUT,">>$dattemp");
print OUT "1001<><>Over 1000 Thread<>このスレッドは1000を超えました。 <br> もう書けないので、新しいスレッドを立ててくださいです。。。 <>\n";
close(OUT);
chmod(0555, $dattemp);
}
else
{
#パーミッション調整
umask(0);
chmod(0666, $dattemp);
}
458 :
仕事人 ★ :04/02/29 23:09 ID:???
>>447 open(OUT,"<$dattemp");
print OUT "1001<><>Over 1000 Thread<>この
鰓がでるよね?
もっと餅付いてくだちい。。。
chmod(0666, $dattemp);がchmod(0555, $dattemp);よりあとに実行されるとは考えにくいけど、 念のため、 if($lognum > 1010) { chmod(0555, $dattemp); DispError("ERROR!", "ERROR〜"); } としてもいいかも。
ウスターの一部しか開示されないので 処理の流れがわからない。。。 あと、別のところで問題がある場合も 思い込んでる場所のみを開示&思考なので発見が遅れる。。。 な予感('-')
463 :
仕事人 ★ :04/02/29 23:26 ID:???
if (open(OUT, "+>>$DATAFILE"))
{
my @logdat = <OUT>;
my $lognum = @logdat;
----
この部分ですけど実際にファイルをopenしているのはどこなんだろう、、
そして$outdat には何が入っているのだろう、、
こんな風に変更したら、どですか。
>>330 と思ったらまたやり直し、、、
465 :
1001 :04/02/29 23:26 ID:BbcWiVlz
やったー
ヽ( ・∀・)ノ● ウンコー
あとは、実況にいれて様子見だな。
subback.htmlが1000になってるのはいいのかな?
1000超えたスレッドをreadonlyにするってことですかな。
>>468 あー、1001ストッパー書き込み時に++$lognum;が必要ですね……。
472 :
仕事人 ★ :04/02/29 23:33 ID:???
473 :
仕事人 ★ :04/02/29 23:34 ID:???
open(RDAT,"<$dattemp"); @logdat=<RDAT>;#ログを配列に読み込む close(RDAT); #ログのカキコ数を取得 $lognum = @logdat; if($lognum > 1010) { DispError("ERROR!", "ERROR:このスレッドには書き込めません。緊急緊急緊急!!"); } if($lognum > 999) { open(OUT,">>$dattemp"); print OUT "1001<><>Over 1000 Thread<>このスレッドは1000を超えました。 <br> もう書けないので、新しいスレッドを立ててくださいです。。。 <>\n"; close(OUT); chmod(0555, $dattemp); $lognum++; } else { #パーミッション調整 umask(0); chmod(0666, $dattemp); }
>>457 #パーミッション調整
umask(0);
chmod(0666, $dattemp);
って必要なの?
475 :
仕事人 ★ :04/02/29 23:35 ID:???
$SUBLINE = $subject . " (" . $lognum . ")\n"; $SUBLINE がグローバルになっていて あとで subject.txt を更新するのに使うと予想。
476 :
仕事人 ★ :04/02/29 23:35 ID:???
477 :
動け動けウゴウゴ2ちゃんねる :04/02/29 23:35 ID:tbK47Xxd
仕事人ほかいろいろな人お疲れさんです
478 :
仕事人 ★ :04/02/29 23:37 ID:???
配ってみる
480 :
仕事人 ★ :04/02/29 23:48 ID:???
全部にくばった
いい加減オープンソース検討しませんか?
ひろゆきがダメと言う悪寒
中がぐちゃぐちゃだから
オープンソースは荒らしに利用されるからダメだそうな
恥ずかしいから見ないでっ
>>445 実況板だったらテストでいちなり導入してもOk。
というのが2chノリ
未承諾さんあたりを拉致して缶づmうwあおまえなにすrあwせdrftgyふじこlp;@
作り直したほうが性能よくなるけど管理人が弄れなくなるからいまのやつ使ってるんだよな>bbs.cgi
live8はroot ★さん待ちじゃない?
たぶんバイナリ化せずにソースを入れてるんじゃないかと。 バイナリ化するのはroot ★さんの仕事。
494 :
動け動けウゴウゴ2ちゃんねる :04/02/29 23:58 ID:w3wmhyN7
悪いことは言わん。 1000チェックだけでも、別ロックファイルとして*.dat以外にしないとchmodヘルになると思う。 ファイルI/Oを嫌って1ファイルでゴニョゴニョしているほうがパフォーマンスが悪くなると思う。
ERROR!
ERROR:このスレッドには書けません!
---
>>491 のスレは1000のチェックではなくてパーミッションチェックで弾かれている予感。
あとは高負荷がかかった時でも大丈夫ならOKなのかな、、
↑ 1000行ってしまった後にあらため書き込もうとした時の話です。 なんかあまり役に立てなかった悪寒 _| ̄|○
>>498 subject.txtが1002になってる
>>498 subject.txtではレス数が1002になっている……。
ミナカッタコトニシヨウ
501 :
動け動けウゴウゴ2ちゃんねる :04/03/01 00:19 ID:KZO/IjMi
age
1000越え判定の時の$lognumに直接1001を叩き込んじゃだめですか?>判るひと
>>502 それ以前に本文書き込み動作が畳み込まれているので、、、(哀)
if($lognum > 999)
{
if (open(OUT,">>$dattemp")) {
print OUT "1001<><>Over 1000 Thread<>このスレッドは1000を超えました。 <br> もう書けないので、新しいスレッドを立ててくださいです。。。 <>\n";
close(OUT);
$lognum++;
}
chmod(0555, $dattemp);
}
これでどうでしょ。
>>502 レス数がきっかり1000で止まる保証がないので、直接1001をいれるとマズいです。
506 :
仕事人 ★ :04/03/01 00:36 ID:???
>>504 そね
#ログのカキコ数を取得
$lognum = @logdat;
if($lognum > 1010)
{
DispError("ERROR!", "ERROR:このスレッドには書き込めません。緊急緊急緊急!!");
}
if($lognum > 999)
{
if(open(OUT,">>$dattemp"))
{
print OUT "1001<><>Over 1000 Thread<>このスレッドは1000を超えました。 <br> もう書けないので、新しいスレッドを立ててくださいです。。。 <>\n";
close(OUT);
$lognum++;
}
chmod(0555, $dattemp);
}
else
{
#パーミッション調整
umask(0);
chmod(0666, $dattemp);
}
507 :
仕事人 ★ :04/03/01 00:44 ID:???
まとめ(メモメモ) 処理の流れは 1) とにかく色々チェック。 2) dat に追記。 3) MakeWorkFile で html/xxxxxx.html を作る この時に 1,000 超えを判定、 1,001 を書き 0555 にする。 この関数内で $SUBLINE = $subject . " (" . $lognum . ")\n"; を作りあとで subject.txt の書き換えに使う。 4) subjext.txt 書き換え 5) ふぅ終了。
508 :
仕事人 ★ :04/03/01 00:46 ID:???
問題は 2) で追記したあと 0666 にしていたので せっかく 0555 で書き込めなくしたのに書き込めていた。 あと bbs.cgi の最初のほうで unless( -w $DATAFILE){ DispError("ERROR!","ERROR:このスレッドには書き込めません。"); } を行い、なるべく負荷をさげようと。
509 :
仕事人 ★ :04/03/01 00:53 ID:???
大幅なオーバーランはなくなったか → たぶん 前よりも処理は軽くなったか? → たぶん 要観察ですなぁ
なんか、あまり変わってない気がするのは気のせいに違いない。 #dat追記部分 if (open(OUT, ">>$DATAFILE")) print OUT "$outdat\n"; close(OUT); } else { DispError("ERROR!", "ERROR:このスレッドには書き込めません。緊急緊急緊急!!"); } #ログのカキコ数を取得 if($lognum > 1010) { chmod(0555, $dattemp);#念のため } elsif($lognum > 999) { if(open(OUT,">>$dattemp")) { print OUT "1001<><>Over 1000 Thread<>このスレッドは1000を超えました。 <br> もう書けないので、新しいスレッドを立ててくださいです。。。 <>\n"; close(OUT); $lognum++; } chmod(0555, $dattemp); } else { #パーミッション調整 umask(0); chmod(0666, $dattemp); } にしたほうがいいかも。
最大書き込み数がてんでばらばらなのはなんとか ならないのか? 全レス取得できたのかどうか,すっきりしないんだが。
>>484 >オープンソースは荒らしに利用されるから
誤解されるようなことを振りまかないでー。
ApacheやFreeBSDはオープンソースですが荒らしに利用されていますか?
>513 穴だらけの(ryを出したらd(ry
515 :
仕事人 ★ :04/03/01 02:18 ID:???
こうしたらどうなる? open(RDAT,"<$dattemp"); @logdat=<RDAT>;#ログを配列に読み込む close(RDAT); #ログのカキコ数を取得 $lognum = @logdat; if($lognum > 1010) { DispError("ERROR!", "ERROR:このスレッドには書き込めません。緊急緊急緊急!!"); } if($lognum > 999) { if(open(OUT,">>$dattemp")) { print OUT "1001<><>Over 1000 Thread<>このスレッドは1000を超えました。 <br> もう書けないので、新しいスレッドを立ててくださいです。。。 <>\n"; close(OUT); #$lognum++; open(RDAT,"<$dattemp"); @logdat=<RDAT>;#ログを配列に読み込む close(RDAT); $lognum = @logdat; } chmod(0555, $dattemp); } else { #パーミッション調整 umask(0); chmod(0666, $dattemp); }
>>515 レス数のカウントがより確実になって、ちょっと重くなる?
517 :
動け動けウゴウゴ2ちゃんねる :04/03/01 09:41 ID:33tLVDgR
各種cgiテスト専用の板を作ったほうがよさげな悪寒。
>>517 いちおう運用情報(金)がそれにあたってます。
でも、1000レスとかそういった実験にはむかんとですよ。
>>515 その「ログのカキコ数の取得」ルーチンがレス書き込みより後にある限り
はほとんど変わらないと見た
悪い 上のログ読まずに書いてしまった いろいろいじった後だったのね
if($lognum > 1010) { DispError("ERROR!", "ERROR:このスレッドには書き込めません。緊急緊急緊急!!"); } if($lognum > 999) { if(open(OUT,">>$dattemp")) { ここを if($lognum > 999) { if($lognum > 1010) { DispError("ERROR!", "ERROR:このスレッドには書き込めません。緊急緊急緊急!!"); } else { if(open(OUT,">>$dattemp")) とかだめかな。
>>521 if($lognum > 999)
{
DispError("ERROR!", "ERROR:このスレッドには書き込めません。緊急緊急緊急!!") if($lognum > 1010);
if(open(OUT,">>$dattemp"))
{
・・・書いてみたかっただけなの
昨日は本業超多忙につき、
>>360 から未処理。
急ぎで何かしなきゃいけないことある?live8/live9のbbs.cgiの更新とか。
12:00ごろまた来るので、誰かレス番で教えてちょ。
# 午後は少し時間とれる見込み。
ERROR! ERROR:このスレッドには書き込めません。緊急緊急緊急!! ホスト* 名前: 2chtubo愛用者〜ヘ(゚д゚ヘ))))))〜61 ◆2CHTUBOC5A E-mail: 内容: きねんかきこ。 こちらでリロードしてください。 GO! 分からないことがあったら2ちゃんねるガイドへ。。。 ------------------------------------------------------- ちゃんとでてるね。。。
>>522 前 if と後ろ if を混ぜたらややこしいがな
と、思ったら、書きこまれてるし。だめじゃん、仕事人。
つまり
>>519 かつ 999 判定より 1010 判定が前にあるせいで
書き込まれてから緊急緊急が出てるわけだな
>>523 急ぎで society の bbs.cgi を元に戻してくださいw
>>528 society(=oyster17)って、私ログインできるのかな。
ログインできにゃいのか? つーかもしかして全板この仕様なのか?
でもよく読むと 515 のとおりなら 1010 判定のあとに 999 判定も 通ってるはずだから、止まるんじゃないのかな? &DispError って、中で exit してるのかな
534 :
仕事人 ★ :04/03/01 12:57 ID:???
変更してみる #ログのカキコ数を取得 $lognum = @logdat; if($lognum > 1010)#念のため暴走ストッパー { chmod(0555, $dattemp); DispError("ERROR!", "ERROR:このスレッドには書き込めません。緊急緊急緊急!!"); } if($lognum > 999) { if(open(OUT,">>$dattemp")) { print OUT "1001<><>Over 1000 Thread<>このスレッドは1000を超えました。 <br> もう書けないので、新しいスレッドを立ててくださいです。。。 <>\n"; close(OUT); $lognum++; } chmod(0555, $dattemp); } else { #パーミッション調整 umask(0); chmod(0666, $dattemp); }
close(OUT); chmod(0555, $dattemp); DispError("ERROR!", "ERROR:このスレッドには書き込めません。緊急緊急緊急!!"); のほうがいいかも
_| ̄|○スマンカッタ
(´-`).。oO(いつdatに書き込んでるんだろう…)
>>537 (´-`).。oO(たぶん別の場所でやってて、そこは今大人の都合で書いてないだけなんだよ、とか言ってみるテスト。)
539 :
仕事人 ★ :04/03/01 16:27 ID:???
>>539 ご苦労様です。
お茶でもどうぞ。
ζ
旦 ⊆⊇
541 :
仕事人 ★ :04/03/01 17:13 ID:???
んで 現状は 1,000行ったスレッドは dat = 1,001 まである index.html = 1,000 までしか出ない(以前と使用違うけど、がまんの方向で) subject.txt = 1,001 まである 今回の改修の目的は 2,000 とか 3,000 まで書き込めてしまうのを 1,000 近辺で止める。 なのでどうなるか観察しよう。
>>541 >2,000 とか 3,000 まで書き込めてしまうのを 1,000 近辺で止める。
何が何でも1,000ぴったりで止めるのか
1050ぐらいまで放置するか決めよう
>>542 1,000 「近辺」というぐらいだから1050でもアリじゃないかな……。
ちょっとくらいはオーバーしてもいいという方針だったと思うのだが、、 過去ログorソースコード読んだ?
1000を書いたbbs.cgiさんが、責任持って1000ストッパーを書いて、 chmod/fchmodしてから終わる、というのはどうなんでしょう。
>543 それなら一週間何も弄らず観察しよう。
547 :
仕事人 ★ :04/03/01 17:31 ID:???
それに挑戦したのが
>>255 あたりからだったりして、
>>545 それだと「999を書いたbbs.cgiさん×2+1001以降を書くbbs.cgiさん」な場合に
ストッパーが効かなくなる気がするです。
>>548 そっか。当然そうだよね。
なんだか、某DJBに「フーン」って笑われそうな議論だよなぁ。ここでのあがきって。
もちろん、私も含めて。
550 :
仕事人 ★ :04/03/01 17:39 ID:???
1000 近くになると my @logdat = <OUT>; のコストがバカにならないんだよね 読み進めてる間に他のプロセスがガンガン書いてる やっぱ 1 レスにつき 1 バイト追記するレス数ファイルを 持つのがいいんじゃなかろうか
*.datでなんでもかんでもやろうとしないで、専用ロックファイルに任せたほうがかえって早くなるに一票。
物質からようこそ また騙されたんだな^^
ひよこの癖に生意気だぞー
暇だから騙されてやったぜ
558 :
354 :04/03/01 18:48 ID:8AAPGFOi
大改造しているところ大変申し訳ないのだが、 単純に最初のソースの #パーミッション調整 umask(0); chmod(0666, $DATAFILE); の部分を if($FORM{'subject'} ne ""){#新規スレ立て時 #パーミッション調整 umask(0); chmod(0666, $DATAFILE); } とすればいいような気がする。
なんでだ?
>>559 >>534 かと。
それなら一回555にしたパーミッションが戻ることもないし。
とPerlよく知らないけど口出ししてみる。
>>558 なるほど。パーミッション調整って新規作成したときのものだったのか。
>>558 もとのソースだと書きこみが失敗したときでもchmod(0666,)が実行されてたみたい?なので、
if (open(OUT, ">>$DATAFILE"))
print OUT "$outdat\n";
close(OUT);
} else {
DispError("ERROR!", "ERROR:このスレッドには書き込めません。緊急緊急緊急!!");
}
これだけでもいいかもしれない。
565 :
354 :04/03/01 20:27 ID:8AAPGFOi
DATファイル作成後、DATファイルが666で変わらなければ、レス追加時に666を
設定するのは意味が無いし、
>>357 >>508 にもあるように、555にしたファイル
が666に戻るのは元々想定していないと思います。
DATファイルが666で変わらないことは、実際のDATファイルや全てのソースを
見ないと分からないので、分かる方お願いします。
くぁw背drftgyふじこlp;@:「
567 :
仕事人 ★ :04/03/01 20:30 ID:???
>>563 FTP で入って chmod 555 しようとおもったら
permition ないって怒られた。
だれの持ち物になっているんだ?
良く起こることなのか?
たまたまなのか?
1000を超えていることを示すファイルを別に作るのは駄目ですか? if (1000越ファイルアリ) { } else { if (1000超えた) { 1000越ファイル作成 } }
1000超えファイルを物凄い勢いで更新する悪寒(素)
>>567 cgiから作成されたファイルはcgi経由でないと変更出来ない場合ありです。
普通にスレストかければいいのかしらん。
>>562 は{が抜けてた。
if (open(OUT, ">>$DATAFILE"))
{
print OUT "$outdat\n";
close(OUT);
}
else
{
DispError("ERROR!", "ERROR:このスレッドには書き込めません。緊急緊急緊急!!");
}
CGI のプロセス ID 付き書き込みデータを、書き込みやさんに渡す。 書き込みやさんから、その結果を SIGNAL として呼ばれるのを待つ。 成功したら SIGUSR1 とか失敗したら SIGTERM とか。(現状の bbs.cgi では SIGNAL は単純に exit; ですよね?) でもって 10 秒以上経過しても結果が帰ってこなかったら、DispError("ERROR!","ERROR! (゚∀゚)アヒャヒャヒャヒャ") せっかくのうに環境なんだから。。。
>>573 OJDでテストしてみたら、書けちゃいました・・・
これを試してみてくれないかなぁ。。。 ---- #ログのカキコ数を取得 $lognum = @logdat; if($lognum > 1010)#念のため暴走ストッパー { chmod(0555, $dattemp); DispError("ERROR!", "ERROR:このスレッドには書き込めません。緊急緊急緊急!!"); chmod(0555, $dattemp);#←ここに、これ入れたらどですか } if($lognum > 999) { if(open(OUT,">>$dattemp")) { print OUT "1001<><>Over 1000 Thread<>このスレッドは1000を超えました。 <br> もう書けないので、新しいスレッドを立ててくださいです。。。 <>\n"; close(OUT); $lognum++; } chmod(0555, $dattemp); } else { #パーミッション調整 if($lognum < 1000)#666は1000以下で { umask(0); chmod(0666, $dattemp); } }
>>578 DispErrorはexitするので、2つ目のchmodは実行されないです……。
>>579 あらら直前にあるのに今気がついた。。。
もう少し考えてみますです。。
if($FORM{'subject'} ne ''){#新規スレ立て時 #パーミッション調整 umask(0); chmod(0666, $DATAFILE); } これも組み込んだらいいかと
>>558 でいいと思うんだけど、通常の書きこみ時にsubjectが送られたときのことを考えて、
>>562 と合わせて、
if(!-e $DATAFILE){
1の書きこみ&パーミッション調整
}elsif(open(OUT,">>$DATAFILE")){
通常の書きこみ
}else{
エラー
}
でどうか。
ところで、今どれが入っているの?
if($lognum > 1010)#念のため暴走ストッパー { chmod(0555, $dattemp) or DispError("ERROR!", "ERROR:chmodできないよ?緊急緊急緊急!!"); DispError("ERROR!", "ERROR:このスレッドには書き込めません。緊急緊急緊急!!"); } chmod(0555, $dattemp)が失敗してるのか、 それともどこかで666にchmodされてるのか調べてみるとか
>>567 suexecって、たまに「抜けてくる」ことがあります。
ひょっとして、chmod()できないのって、それが原因?
chown、chgrpも銅像?('-')
586 :
仕事人 ★ :04/03/02 03:20 ID:???
うーん
実況の各板たらーっと見てきたけど 1,001 で止まっているなぁ
>>563 のスレッドだけの問題なのかどうなのか。
588 :
仕事人 ★ :04/03/02 03:48 ID:???
警察板 は呪われているのか?
589 :
動け動けウゴウゴ2ちゃんねる :04/03/02 03:51 ID:oQ+yX4a+
590 :
仕事人 ★ :04/03/02 03:52 ID:???
もちろんまずは自分を疑えってことで それは見てみたのでしたー
591 :
動け動けウゴウゴ2ちゃんねる :04/03/02 03:56 ID:oQ+yX4a+
>>590 もしかしてnews6/news7配り忘れていない
592 :
仕事人 ★ :04/03/02 03:59 ID:???
どうだろ、、 自動で配布しているからなぁ version 番号付けて配ってみるです < こんど
警察板 ERROR:このスレッドには書き込めません。緊急緊急緊急!! のエラーはでますが、いくらでも書けますよ
595 :
動け動けウゴウゴ2ちゃんねる :04/03/02 08:27 ID:TSOc+dgc
>>567 oyster100/200/900番台ならroot師におながいしてchownしてもらえばいいのではないかと。
if (-e $DATFILE && (!-w $DATFILE || -s _ > 512 * 1024)) { DispError("ERROR!", "ERROR:このスレッドには書き込めません。"); } #中略 my $lognum = 0; if (open(IN, "< $DATFILE")) { $lognum = (join('', <IN>)) =~ tr/\n/\n/; close(IN); } if ($lognum > 1010) { chmod(0555, $DATFILE); DispError("ERROR!", "ERROR:このスレッドには書き込めません。緊急緊急緊急!!"); }else{ if (-w $DATFILE && open(OUT, ">>$DATFILE")) { print OUT "$outdat\n"; ++$lognum; if ($lognum > 999) { print OUT "1001<><>Over 1000 Thread<>このスレッドは1000を超えました。 <br> もう書けないので、新しいスレッドを立ててくださいです。。。 <>\n"; ++$lognum; close(OUT); chmod(0555, $DATFILE); } close(OUT); }elsif (!-e $DATFILE) { # スレ立て処理 chmod(0666, $DATFILE); }else{ DispError("ERROR!", "ERROR:このスレッドには書き込めません。"); } } #(´-`).。oO(テストまでしちゃったよ…)
>>534 http://society.2ch.net/test/read.cgi/police/990121724/ >"ERROR!", "ERROR:このスレッドには書き込めません。緊急緊急緊急!!"
↑これが出ているのに上のスレに書き込めるということは bbs.cgi の序盤のここ↓を通り抜けているということなので
パーミッションがどこかで再変更されているはず。
>#.datが存在してないか書けないならばいばい
>unless(-w $DATAFILE){
>DispError("ERROR!","ERROR:このスレッドには書けません!");
>}
----
http://society.2ch.net/test/read.cgi/police/1040783990/ このスレは現在パーミッションではなくてここ↓で止まっているもよう。
>unless( -s $DATAFILE <= 512000){
>DispError("ERROR!","ERROR:このスレッドは512kを超えているので書けません!");
>}
なので一番ぁゃιぃここをこの↓ように追加修正すれば現在書き込めるものも含めて
再度パーミッション変更されるので書き込み出来なくなるはず。
#パーミッション調整
umask(0);
chmod(0666, $dattemp);
}
if($lognum > 1010)#1011以上なのに666の暴走ストッパー
{
chmod(0555, $dattemp);
DispError("ERROR!", "ERROR:このスレッドには書き込めません。禁止禁止禁止!!");
}
#禁止と表示されればここ↑で再設定されたはずなので書き込めていないはず。。
WebProg板だと「情報を小出しにするな」って怒られるんだな 規制とかクリティカルな部分を除いて公開、でもダメ?
まぁ普通はブラックボックス部分は除いて公開するのが良いよね。 規制のあたりはサブルーチン化してパラメーターと返り値だけ提示すりゃいいんじゃないの。
601 :
動け動けウゴウゴ2ちゃんねる :04/03/03 03:55 ID:Y4XzXAw3
602 :
動け動けウゴウゴ2ちゃんねる :04/03/03 14:01 ID:/mj7DhWo
603 :
仕事人 ★ :04/03/03 20:20 ID:???
現在の bbs.cgi の version 20040301
どこがどう変わったのか変更点がよくわからないですがまだ書き込めます
605 :
仕事人 ★ :04/03/03 20:41 ID:???
全部のサーバが同じかどうかの指標。
そうですか。。 ではまたしばらく待機しておきます。。。
>>606 そこで確認できる範囲では、news7だけ更新されませんね。
live5はまた別だろうし。
609 :
仕事人 ★ :04/03/03 20:53 ID:???
おおーっ news7 も配布先リストに加えました。
てすつ
>>606 そこ新しくできたnews10が入ってないね。
>596 みたいにdatに書き出すタイミングを考慮しないとだめぽ?
datディレクトリをls -lで見てみたらなにか分かるかしらん。
∧_∧ ( ・∀・) <忙しそうだし、催促せずに待ちますね。。 ( つ旦) と__)__)
ためしになつかしドラマ板の1000近いスレをいくつか埋めてみたんだけど どれも1000突破した。もしかして板、というか鯖によって突破したり突破しなかったりするのか?
620 :
仕事人 ★ :04/03/05 18:11 ID:???
ccccc
右、右、右、下、右。
622 :
仕事人 ★ :04/03/05 18:22 ID:???
0.7 です。 お薬貰っていってくださいー
1.0
624 :
仕事人 ★ :04/03/05 18:27 ID:???
sub MakeWorkFile{ に最後の手段を追加してみた。
625 :
仕事人 ★ :04/03/05 18:27 ID:???
my $key = @_[0]; my $workfile = $TEMPPATH . $key . ".html"; my $dattemp = $DATPATH . $key . ".dat"; my (@messx,@content,@logdat); my ($lognum,$mailto,$time,$brmax,$topnum,$firstlog,$name,$mail,$subject,$message); open(RDAT,"<$dattemp"); @logdat=<RDAT>;#ログを配列に読み込む close(RDAT); #ログのカキコ数を取得 $lognum = @logdat; if($lognum > 1020)#最後の手段 { if(-w $dattemp){ my $datdat = $DATPATH . $key; my $tmpdat = $DATPATH . $key . ".tmp"; my $success; open(COPY, "cp $dattemp $datdat |"); close(COPY); $success = 0; until($success){ $success = rename($datdat, $dattemp); } chmod(0555, $dattemp); unlink($tmpdat); } DispError("ERROR!", "ERROR:このスレッドには書き込めません。最後の手段!!"); } if($lognum > 1010)#念のため暴走ストッパー { umask(0); chmod(0555, $dattemp); DispError("ERROR!", "ERROR:このスレッドには書き込めません。緊急緊急緊急!!"); } if($lognum > 999) { if(open(OUT,">>$dattemp")) { print OUT "1001<><>Over 1000 Thread<>このスレッドは1000を超えました。 <br> もう書けないので、新しいスレッドを立ててくださいです。。。 <>\n"; close(OUT); $lognum++; } umask(0); chmod(0555, $dattemp); } else { #パーミッション調整 umask(0); chmod(0666, $dattemp); }
とまった気がする、、、
628 :
サザン ★ :04/03/05 18:46 ID:???
何故か bubble サーバは、 昔立てられたスレッドの所有者が nobody になっているもより。 ということは・・・ ↓
>>628 chmodは一切効いてなかったってことね…
引っ越したときに所有者が変わっちゃったのかな?
632 :
仕事人 ★ :04/03/05 19:21 ID:???
引越し時に chmod で 777 にするんじゃなく chown(でしたっけ?) 後 666 にすべきなのか? ということは、引越し後の正しい呪文は ↓
chown("ch2あぼんあぼん"); chmod($filename,0666);
一般ユーザ(にsuexecされたCGI)がchownなんてできないと思うなぁ。
1000越えて書き込めていたのは確認した範囲では
去年以前に建立てられたスレのようだったし
今年に入ってから立てられたもので、1000ストッパーが
効いていないものってなかったような、、
サザンさんの
>>628 あたりに謎の答えがありそう、、、
古いスレを中心に、オーナーがおかしいやつがあるから、そいつら修正すればいいってこと? (ストッパーが効かない原因のひとつ) ディレクトリの持ち主がその人であれば「消す」ことはできるから、 例えばnobodyとかが持ち主のファイルを探して、一斉にこんなかんじにすればいいのかな。 (1000000000.dat のオーナーがおかしいとする) cp -p 1000000000.dat tmp1000000000.dat rm -f 1000000000.dat mv tmp1000000000.dat 1000000000.dat 2行目でいきなりmv -fしてもいいけど、なんだかいやな予感がするんで。 find -user nobody とかして、該当のファイルについて一斉にやればよさそうな気がする。
FreeBSDでは、 cp -p 1000000000.dat tmp1000000000.dat mv -f tmp1000000000.dat 1000000000.dat でOKでした。Linuxでもやってみるか。
あ、そっか。Linuxでsuできる環境もってないや。 どなたか、実験きぼんぬ。 % mkdir test % cd test % sudo touch A % cp -p A A.tmp % mv -f A.tmp A で、そのユーザのAになれば無問題。
640 :
仕事人 ★ :04/03/05 20:14 ID:???
>>637 古いスレでオーナーがおかしいやつの中で
1000間近なスレのURIがいくつか分かりますか?
642 :
動け動けウゴウゴ2ちゃんねる :04/03/05 20:51 ID:zMD0nJk9
>>641 例えばbubbleサーバのnatsumeloj板なら、
find ./public_html/natsumeloj -user nobody -name \*.dat -print
なんてのを流せば、すぐわかるかと。
これをサーバの数分、板の数分やればいいかな。
ひまをみて、_service/を見て板名とってきてfindかけて、
オーナーをfixするためのshell scriptでも書いてみましょ。
できたら、各マシンで手分けして流していただくということで。
止まらなかった原因は単にchmodが効いてなかったってだけなのかー。
>>644 引っ越しのときにdatをchownするだけではダメですか?
移転の時は普通にファイルを移動してるだけなので、chownしなくてもいいはずです。
>>647 というか、普通はこんなこと起きない気がしますね。< オーナが違う
途中でsuexec環境に変わった場合にのみ、起こるはず。
あるいはsuexecがバグっていて、「httpdのオーナーが抜けてきちゃった」場合とか。
# 経験したことあります。
移転しても移転しても書き込めるもよう。
>>645 これは「調子の悪い」とは違うと思うが。
>>648 補足。
> 移転の時は普通にファイルを移動してるだけなので、chownしなくてもいいはずです。
>>647 理由: マシンをまたいだファイル移動の時に、オーナーが変わるから。
>649>651 ここで同じような報告を繰り返されてもご迷惑になるだけかと
>>639 drwxr-xr-x 2 (・∀・)ニヤニヤ users 4096 Mar 5 21:13 ./
drwxrwxrwx 15 root root 4096 Mar 5 21:11 ../
-rw-r--r-- 1 root root 0 Mar 5 21:12 A
-rw-r--r-- 1 (・∀・)ニヤニヤ users 0 Mar 5 21:12 A.tmp
[(・∀・)ニヤニヤ test]$ mv -f A.tmp A
[(・∀・)ニヤニヤ test]$ ls -la
合計 8
drwxr-xr-x 2 (・∀・)ニヤニヤ users 4096 Mar 5 21:14 ./
drwxrwxrwx 15 root root 4096 Mar 5 21:11 ../
-rw-r--r-- 1 (・∀・)ニヤニヤ users 0 Mar 5 21:12 A
[(・∀・)ニヤニヤ test]$
>>644 色々と考えられる事はあるのですが順番にやっていかないと
どれが原因か分からなくなりそうなので、まずこれから。。
見つかったスレに1000番目を書き込んだ時にこれ↓が表示されるかどうかが知りたかったんですよ。
>"ERROR!", "ERROR:このスレッドには書き込めません。最後の手段!!"
で、おそらく表示されるだろうとは思うのですが
1000 over を判定しているのはこれ↓を書き込む為にしているような、、
>"1001<><>Over 1000 Thread<>このスレッドは1000を超えました。 <br> もう書けないので、新しいスレッドを立ててくださいです。。。 <>\n"
cgiの最初の方でこれ↓しか見ていないのは負荷軽減の為だと思うのですが
1000を越えているかどうかを最初に見ればパーミッションがどうなっていようと
1000を越えているスレには書き込めないと思うのですけど、既出の問題なのかしら、、
>#.datが存在してないか書けないならばいばい
>>653 drwxr-x--- 24 root root 4096 Mar 5 21:09 ./
drwxrwxrwx 21 root root 4096 Feb 25 12:56 ../
[(・∀・)ニヤニヤ root]$ mkdir test
mkdir: ディレクトリ `test' を作れません: 許可がありません
[(・∀・)ニヤニヤ root]$
>>653 さんくす。Linuxでも問題なさそうですね。
んじゃ、shell script作ってみます。
今日はJimさんデーの2日目なんで、明日以降になるかもしれませんが。
ここまで読んだ 引越し屋バンバンが地方営業なのがわかった
902のカーネルだけ、5.2.1-RELEASE-p1に上げてみた(i386モード) しかし、状況は変わらず。
options AAC_DEBUG=3 とか入れてみるか。
banbanって引越屋のことだったのか
バンバンってデカレッドじゃないの?
バンバンギシギシ
料理番組?
ズンズンパンパン?
さぁ〜ちこぉ〜♪ 思いどうりにぃ〜♪
ギコナビで書き込もうとしたら ERROR:このスレッドには書き込めません。緊急緊急緊急!! と表示されているが実際には書き込まれてます。
672 :
仕事人 ★ :04/03/11 16:37 ID:???
自動で止まった?
こっちに誘導されて来ました yournet.ne.jpの規制が先ほど解除されたのですがlive10の規制が解除されていないようです。 解除の方よろしくお願いします。
ここじゃないとおもう
まとめると1001突破するけどそのうち止まるってこと?
そのうち、じゃなくて1021で止まる、ですね。
>>625 ソース
>if($lognum > 1020)#最後の手段
↑
これを超えたら
>DispError("ERROR!", "ERROR:このスレッドには書き込めません。最後の手段!!");
それ以降は↓になるわけです。
>DispError("ERROR!", "ERROR:このスレッドには書き込めません。緊急緊急緊急!!");
最後の手段が効いてるけど緊急緊急緊急は効いてないってことか 最初から$lognum > 1000で判定しない理由は何だっけ?
効いてないのは古いファイルが chmod(0555, $dattemp); 出来ていないから。 そこで 1020を超えた時点で条件に引っ掛けて、datファイルを新しいファイルにコピーして そのファイルを chmod(0555, $dattemp); している。 その後今までの古い datファイルは消去。 新しいファイルはパーミッションが 0555 になっているので今度は「緊急緊急緊急」で分岐するというわけ。
>>685 たぶん移転するためのcgiはbbs.cgiじゃないから
ここじゃないほうがいいかなぁ、、
まあ、もう書いちゃってるんで言ってもしょうがないですが。
う〜ん、ここで1000ストッパーの改造がはじまってから、
>>685 の現象が多発するようになったので、
関係あるのかな?って思ったんですが、、、
ハテサテ
スレスト、ゴミ箱移転跡が移転すると書き込めるようになるのは仕様です
1000ストップの判断をしたあとで書き込んだ方がいいと思うんだけど そうしない理由って何かあるの?
691 :
動け動けウゴウゴ2ちゃんねる :04/03/14 22:21 ID:UADx2/NY
Perlで書けよな。 高速だし、柔軟性あるし、大抵のサーバーで動くし、機能的にも問題ない。 PHPでは絶対書くな。
>>691 2chのスクリプトはCじゃありませんでしたか?
俺の勘違いなのかのぅ。
bbs.cgiはPerl read.cgiはC
実況鯖だけかもしれないけど、bbs.cgi は perlcc で C にしてたような。
perlcc って C になるの?
ひぇ〜ごめんなさい。C というよりはバイナリ実行形式でした < perlcc ちなみにオプションをつければ C のコードも出せるようで。半可通でスミマソン
>>695 (巨大な).cファイルに変換されて、Cコンパイラでコンパイルされますです。
.cファイルも取り出せますが、読めたもんじゃありません。
停止済みのスレッドの移転の場合は再停止(もってなければお願い) 停止前のスレッドの停止+移転の場合は移転してから停止。 が正しい措置と思われ。
699 :
動け動けウゴウゴ2ちゃんねる :04/03/15 13:39 ID:mog12nGi
>>697 そーなるとperlccで吐くコードではまだまだ無駄がありそうでつね。
やはりC(++)で最適コードを書いたほうがいいのかな・・・?
>>699 ひ(ry がさわれなくなるからCで書くのはダメ、なんじゃなかったかな。
ただ、トラックバック機能のためにread.cgiをちょっと改造してたところを見ると
もしかしたらCもさわれるのかもしれないけど。
ひろゆきがいじれなくなるというデメリットが
むしろ触らせないようにするほうが正解かも
>>689 >>698 >>687-688 の意味がちゃんと伝わってない希ガス
>スレスト、ゴミ箱移転跡が移転すると書き込めるようになるのは仕様です
「移転すると」ってのは鯖移転だと言いたいようだけど、
>>687-688 の指摘はそうじゃなくて
削除人が移転やスレスト呪文唱えた直後のスレッドなのに、スレストが効いてない
=パーミッションが書き換わってない ってことです。
>>686 に同意しつつも一応念押し。
>>702 触らせないようにすれば、その人に全面的にお任せ になるだけかと。
>>700 なるほど。
>>702 の意見も正解かもしれませんな。
C言語版のしっかりしたメンテナがいればひ(ryは触る必要はないと思われ。
>>703 マジで多いです
スレ移動した後、移転後をさらに停止させなきゃならないので
2回スクリプトを走らせなきゃならないし、ログも2倍溜まってるような・・・・・
ソースは無くて感覚だけど、ここで1000ストッパーいじりがはじまってから
増えたのは確かだと思う
>>686 だとしても、どこに書きゃいいんだか
管理人に連絡か?
>>707 安定性に問題があるだろ、氏ね。ウザイ。
ここまで斜め読みでカキコ。 dat書き込み時にレス数を数えて1000達成したら、 その場でストッパーかけないと本来はダメでしょうね。 理由は、数える→1001スレストの間に 他のプロセスがdatに書き込む可能性がありますから。
flockくらいかけなさいよね
flock 禁止になっんですよ。
何で?ぜんぜん書き込めなくなったから?
>>712 flock処理周りの実装バグったんじゃねーの?
過去のバグを前提にシステムのポリシー決めてたら
ろくな方向に向かわんぞ。
「OSによって問題がある」とかなら
symlinkで代替してもいいしさ。
そもそも書き込みは排他を前提にしないと
単純に設計がおかしいってことになる罠
排他無しは
ときどきリセットされるアクセスカウンターと同じ設計で
それは直すべきもの
715 :
動け動けウゴウゴ2ちゃんねる :04/04/01 23:20 ID:50q0Uk4B
そもそもサーバー構成がまともじゃねぇよ。 表側に位置するCGIサーバー群は全て同じ仕様と内部構造にして DNSラウンドロビンにて負荷分散。 データ管理は裏方のDBサーバー。 DBはMySQLみたいな汎用RDBMS使ってもいいし、 NFS使ってUnix FSだけで管理してもいいし(その扱いは今とほとんど同じ) 裏と表の間でやりとりする専用プロトコルと専用メソッドを開発してもいいし。
でもって、クライアント側からのリクエストが閲覧だけのとき(書き込みではないとき) の処理を徹底的に減らす必要があるな。 閲覧処理で行われる「いつもやってる計算」の中の「いつも結果が変わらない処理」 は書き込みのときに全て終らせてキャッシュさせておく。 主にHTMLに対する整形があるだろう。 書くレス番ごとのHTML整形されたファイルを作ったり 1-100を選ばれた場合の整形済HTMLを用意したり。 あと最も激しい負荷の矢面に立たされる読込処理のCGIは C/C++で書いておく。そしてstatic link。 もしくはC/C++で書かれたプログラムをapache module化する手もある。 ここ数年仕様がほとんど変わってないんだから これからも仕様は変わらないだろう。 「変更容易だが速度は遅い」という特性のスクリプティング言語を使っても あまりメリットないよ。 「えー。Cわかんないよ。Perlならわかるけど」 とかいうなら、おまえんちのApacheはPerlで書かれてるのかと問いたい。
CGIとしてのperlを高速化したいなら mod_perlにするかprelinkを使うのをおすすめ。 prelinkツールにてperl本体を前処理しておけば perlの起動が高速化される。
鳥インフルエンザキャリアの人?(w だったら焼却漏れがありますよと伝えなきゃ(嬉)@T波町
最近過去ログ周りに注力しているせいか放置されている最寄ですが、 bbs.cgiのmod_perl化は検討されています。 ただ今はperlccによるバイナリ化で それなりに効果を挙げているようなので現状でとまっているようです。 しかし吐くCコードとバイナリが巨大なので メモリを圧迫しているということはあります。 理想はC化なのですが、そうするとひ(ryが扱えないということらしいです。 read.cgiは既にCです。 I/Oのはげしいスレはdatは常時オンメモリです。 NFSマウントはセキュリティ上あまり好ましいものではありません。 余計なポートを空けることになるからです。 # NFS over HTTPはできそうですが、結局負荷増につながりそう。
>>719 続き。
2chにおける一番の負荷はディスクI/Oです。
そして一プロセスあたりで一番使うのがbbs.cgiです。
root師の言葉を借りるならば、「1にI/O、2にI/O・・・」だとか。
>理想はC化なのですが、そうするとひ(ryが扱えないということらしいです。 こうゆうところがひろゆ子らしいとゆーかなんとゆーか。。。
後このスレで議論されまくっていますが、 bbs.cgiは仕様変更が多いのでチューンがめちゃくちゃ甘いですね。 コードの整理とC化で倍速になりそうな悪寒。
>>722 1,000倍になると思われ、
で、現在不具合はあるのかな? < bbs.cgi
>>723 個人的には、サーバ落ちによるものを除いても、復帰依頼の回数がやや増えた気がしますね。
ただ、復帰屋さんにまめに動いていただけているので、運用でカバーできているような気もします。
現行のbbs.cgiのソース公開は無理でも、Cで一から作り直すのは駄目なんですか? それこそ、オープンソースで遣れば荒らし対策とかもちゃんと出来そうな気もするし。 ひろゆきの気持ちとしては、弄れなくなるのは「嫌」なのかも知れないけど、運用とし ては別に良いんじゃないかぁ。現行だって随分人任せみたいだし(w
>>725 そこは管理人から何回も名言されているので
私はその言葉を聴いて私として行動していくだけです。
あなたはあなたの道を行けばいいだけかと、
誰も邪魔しないと思います。
前進あるのみ。
ひ(ry はPerlしか使えないんだっけ? でも最近「弄った」とか言っているの見たことないし、 ひそかにC化しちゃってもいいんじゃないの?ばれないって (w で、flockが使えないから 排他処理全くしていないって本当なの? 本当ならすごいね。
ひはPHPもつかえます
あれ、男爵生きてたのか。>729
732 :
動け動けウゴウゴ2ちゃんねる :04/04/03 00:10 ID:FQCdjyRh
1ディレクトリーの中にファイルは多くて何個ある? 数千個越えてくるとディスクI/Oの負荷が高くなりやすい。 それを防ぐために1階層か2階層はサブディレクトリーによる分類が必要。 squidのキャッシュディレクトリーを参考にな。 メモリ搭載を増やしてディスクキャッシュに頼るという逃げもあるが 根本的には「必要とされないデータをディスクから読む」という 動作を減らす設計が必要。 URLの末尾"l50"でアクセスするユーザーが大半なのに 毎回読まれるたびに1番レスから全部読んでいたら無駄が大きい。 その場合l50専用のファイルを「書き込み時」に生成するとか 逃げ方はいろいろある。 インデックスファイルと本文ファイルを分けて インデックスファイルを読むことによってレス番からオフセットを求めて 本文ファイルを読むときはオフセット使って一気にfseekする手もある。 mysqlでも使っておけとと言いたいところだが、 ファイル使うにしてもおかしな設計だと その負荷の大半は「無駄な負荷」になるんだよ。 ていうかflockはしておかなきゃ。
733 :
ひろゆき@どうやら管理人 ★ :04/04/03 04:34 ID:???
flockを使わない実装のほうが負荷が低いですよ。
734 :
動け動けウゴウゴ2ちゃんねる :04/04/03 07:11 ID:NW9nxuLR
ボッキage
735 :
動け動けウゴウゴ2ちゃんねる :04/04/03 08:39 ID:Lo74GCgh
$ /usr/bin/time perl -e 'open(F,">>/tmp/xxx");for($i=0;$i<100000;$i++){flock(F,LOCK_EX);flock(F,LOCK_UN)}' 0.16user 0.07system 0:00.22elapsed 100%CPU (0avgtext+0avgdata 0maxresident)k flockはたいした負荷じゃないべ
736 :
動け動けウゴウゴ2ちゃんねる :04/04/03 08:51 ID:Lo74GCgh
>>719 > NFSマウントはセキュリティ上あまり好ましいものではありません。
> 余計なポートを空けることになるからです。
NFS通信するホストは物理的に近隣に配置して
それぞれLANカードを1枚余計に搭載してプライベートアドレスを割り当てて
HUB経由直結でプライベートネットワークを構築して
そちら側からだけ通信許可すれば外向きにポートが開かないので
セキュリティー上の問題は無いと考えて良い。
それが困難ならipchains等によるフィルターも有り。
737 :
動け動けウゴウゴ2ちゃんねる :04/04/03 09:05 ID:Lo74GCgh
ていうかbbs.cgiとread.cgiのソースはどこよ?
非公開
bbs.cgiはひどいスパゲティソースで、見た人が次々に消えてしまう
らしいから、一から作ったほうが早いかもよ。
ということで、がんばれ。
>>736
>>736 いわゆるNASなどを使ったソリューションではよくある形ですね。
10.0.0.0/8とかつけとけばいいと。
でも、NFSとflockって大抵の場合、きわめて仲が悪かったり。
(私は何度も痛い目にあいました)
いずれにせよ、細かなI/Oが多数発生するような系では、
flockはともかくNFSを使う気は全くないですね。
NFSだと、Apache的にEnableMMAPやEnableSendfileとかがうまくないので、
パフォーマンス的に激しくつらいです。
例えばhome directoryの共有みたいな用途には便利だし、
うまくやれば管理も楽なので、NFSという技術そのものを否定するものではありませんです。
単純にライブな掲示板システムには、ちょっとなぁというだけで。
で、flockは
>>735 みたいなやり方の負荷は、確かに高くなりません。
でも、他の人を「待たせる」ことが、そもそも負荷というか、重荷というか、コスト高になります。
掲示板システムって、もう、待たせちゃいけない。システムも、ユーザも。
待たせるぐらいなら、他の手段(rename()をうまく使うとか)を使うですね。
某氏じゃないけどNFSはこういう用途に使う場合には、
Network Failure Systemだぐらいに思っていたりして。
741 :
動け動けウゴウゴ2ちゃんねる :04/04/03 09:21 ID:Lo74GCgh
>>740 またせちゃいけないからflockはつらいってか。
じゃあ手段1。書き込む先のファイルを分けることだな。
$thread_num = スレ番号;
$pid = $$;
open(WRITE,">$base_directory/$thread_num/$pid");
でもって、これらをマージするのは別のデーモンが行う。
もしくは手段2。デーモンがunixソケットの口を開けて待っていて
bbs.cgiはそのデーモンに向かって次々と書き込みリクエストを投げつける。
実際のファイルへの書き込みはデーモン1プロセスが行うので
排他処理は不要。
ていうか俺が作れってか
>>741 > ていうか俺が作れってか
期待してますです。
私は「作られたものの性能をできるだけ発揮させる」とか
「既にある仕組みを用途に合わせて適用する」とかいうのは
なんとかやれますけど、スクラッチから作るのは正直苦手なんで。
NFSとflockの両方を提案したがこれは両方の組み合わせを提案したわけじゃないのであしからず。 NFSは「読込負荷の分散のためラウンドロビン化された表向きCGIサーバー群」が データを抱える裏方のサーバーに読みに行く場合のみ。 flockは書き込みに関してだけで、これは単一のホストがローカルドライブに対して行う。 俺が考えている構成は以下のような感じ。 まず表向きのCGIサーバー群を用意してラウンドロビン化。 裏方サーバーはデータの管理専用で板ごとに分散。 表と裏の通信はTCP上の独自プロトコル。 表サーバーについて: read.cgiは直接裏のサーバーに問い合わせるのではなく 表サーバー内で動作するキャッシュ機能提供のデーモンを経由する。 キャッシュ能力を持つデーモンは逆proxyの効果を上げる。 裏サーバーについて: 読込と書込の2つのデーモンを走らせてTCP listen。 書込デーモンはTCP口のところである程度バッファ能力を持たせておけば 過去flockを使ったとき発生した「待ちのための負荷増加」を減らせるはず。 読込デーモンの処理を極限まで減らすため、 HTML化やl50分の切り出し等、読込時によくある動作は書込デーモンが あらかじめ行ってファイルへ書き出す。 本当は読込デーモンと書込デーモンを一体化させて できるだけファイルを経由しないオンメモリ動作にした方がさらに効率的なのだが 開発に時間がかかるしバグ取りが大変だしメンテできる人が減ってしまうことになる。
743続き 書込時の流れ: [表鯖]bbs.cgi ↓ [表鯖]書込デーモン (チェックやフィルタなどはこことbbs.cgiだけで行い裏の負荷を下げる) ↓ [裏鯖]書込デーモン 読込時の流れ: [表鯖]read.cgi ↓ [表鯖]読込デーモン (キャッシュ能力を持たせて逆proxy状態に) ↓ [裏鯖]読込デーモン 表鯖はデータを抱えない同一構成のマシンを大量に並べてラウンドロビン化。 そうすりゃ表鯖にいくら負荷をかけても数の力でごまかせる。 ていうかこれだとNFSは不要か。
そうそう、書きこむ人 (bbs.cgi) がイパーイいるから 3000 超えちゃったり。 dat 直読みも表面的には「直読み」だけど本当は DB アクセスにしちゃうとかね。 AddTypeapplication/x-httpd-cgi.dat AddHandlercgi-script .dat とかとか。
そして次の世代の2ちゃんねるが生まれて来るんですね、 みんながんがれ
途中で書き込みしてしまいました。1時間ほど前からhuman3dでます、対策よろしく
見習い▲ = 仕事人 = 夜勤 = Z社員 でしたっけ? ラウンジとかの人の多いところには排他入れたいけど、 入れると負荷が高まるというトレードオフをどう克服するか 楽しみに待っていますよ
書き込みデーモンの話題とか見ると、去年の暮れから話がループしているな。 実際のコードを書くためには、bbs.cgiをサブルーチン単位で公開できるところだけでも提示してくれないと書けないと思う。 どうなんですか? root★氏やひろゆき氏的にそのあたりの書き込みサブルーチン公開は?
753 :
750 :04/04/08 04:30 ID:p5k2zZLN
>>751 んー、だから鶏と卵問題で前進していないから、いいかげん最初の一歩を踏み出しましょうということで。
wikiに公開できる部分を張ってもらうのがいいと思う。
まあ予想されるひろゆき氏の答えは「どの部分を非公開にしなくちゃいけないかも分からない」だったりして。
>>753 その程度もわからないのだったら、いっその事c化しても問題なさそうだな(w
で、ひ(りゃはPerlは読み書きできるのか?
>>755 みたいですよ。
もっとも、公式見解が聞きたいところだけどw
さみだれフォーメイションだったかな?
>>757 一応連携しているはず、と信じたい。
見習い師いわく、「bbs.cgiは完全な挙動をしている」。
しかしながら、
・perlccの吐くCソースとバイナリが大きいのでシェイプアップの余地がある。
・スパゲティソースであることが過去の議論から明白なので、
処理過程も見直せば大幅な負荷軽減が期待できる。
・ディスクI/Oまわりの見直しでディスク負荷が軽減可能。
今のソースはコストのかかるfopen()コールが不必要に多い模様。
などの理由から、私はCでやれるんならそうしたほうがいいんじゃない?という意見。
結局1から作り直すことも出来ず ソースを全部公開することも出来ず 一部分を公開して→直すの繰り返しで スパゲティ状態を直すことも出来ず これじゃとても再開発とは呼べない気がします と禿外な事言ってみる
運営が欲しいのは 沢山のプログラマーではなく一人の天才プログラマー
(o ̄ー ̄)ノ < タクシー
とりあえず use warnings; use strict; つけて動くようになったら mod_perl化…
じゃあ、オブジェクト指向で書き直してみるとかw 以後、部分公開も楽になるかな
765 :
FOX ★ :04/04/13 15:57 ID:???
サザン★さん お呼び出しです F22 で proxy999 を取っていると思いますが 全く同じルートで proxy998 も取ってください。 各サーバが BBQ の proxy998 も取りに行きます。
766 :
サザン ★ :04/04/13 21:58 ID:???
>>765 かんりょうでーす
999 と同じ場所に 998 がおいてありますー
767 :
FOX ★ :04/04/13 21:59 ID:???
>>766 どもども
中身はなにもしなくていいですー
たぶんなにもしていないとおもうけど
768 :
サザン ★ :04/04/13 22:05 ID:???
769 :
FOX ★ :04/04/13 22:06 ID:???
はいー
某ぶぇらさんみたいな喋り口の人が来て、改造案で気を吐いていますね ここじゃ押してばっかりだと、オシモドサレマスヨーヾ('-')ノ
771 :
FOX ★ :04/04/14 00:47 ID:???
for some reason bbs.cgi を更新したので peko サーバよろしくー > root★さん
>>771 live8/9/10/news11 done.
773 :
FOX ★ :04/04/14 01:36 ID:???
>>768 あうーん
やっぱりあちこち欠けて(編集されて)配られるので
F22(各サーバ)が直接 qb4 の 998 を見るようにしました。
ということで、 bbq 側(f22本体)からは 998 はずしてくださいー
774 :
FOX ★ :04/04/14 01:37 ID:???
>>772 どもです
これで ほとんど bbs.cgi を更新しなくても済むようになりました。
>729 そんなしょぼいコードを参考にしたら2ちゃんねるは壊滅しますよ、と。
777ゲトー! (・∀・)ニヤニヤ
GoogleもUTF-8が標準になったことだし2ちゃんねるも ログとかhtmlとかUTF-8にしてみましょうYO! 別にメリット無いっすね…(´・ω・`)
別に無い事もないけどUTF8への変換ってコストかかるしやめといた方が良いんでは。 あとサイズもでかくなるような。
2chブラが全部作り直しですよ もしShift_JISのログとUTF-8のログが混じるとその判別も必要になるし
メリットが無いどころかデメリットが特盛りなのだった
3バイトUnicodeまで待て
そいやスクリプト側でわざと負荷かけてディスクI/Oの負荷を減らそうって話が 途中出てなかったっけか。
Unicodeは好きになれない。 でも、そこに未来があるのは否めない。
786 :
ピロリ :04/05/08 22:33 ID:WjDFAjOs
サザン★さんに質問でーす qb2 にある板は他の板との共存は可能ですか? つまり何を目論んでいるかというと BBQ , qb2 ,qb3 qb4 等を一台のサーバでまかなおうと、 BBQ , qb5(qb2+qb3) qb6(qb4) ってな感じで、
初めて書き込みするのでこっそり怖がりながら書き込みます。 # 某所で鯖管理をやっていた関係でつい提案したくなってしまって。 2chのサーバはなんとなくホストによって板が分割されていますが 実際には一つのホスト名で、全すれが運用できるように思えます。 たとえば、 +--------------+ +---------+ | | | | | 負荷分散装置 |------| L3switch |------- ....多数のread.cgiサーバ(Apache) | (LVS) . | | | +--------------+ +---------+ | | +------------------+ | Cluster NFSサーバ | | OpenAFS・Coda | | もしくはRawDB関係 |(もちろんこれも多数) +-----------------+ ・LVS-DR(Linux Virtual Server Direct Routing)構成でL3switchにデータ負荷分散を 行い ・dat関係は、ClusterNFSもしくはOpenAFS、Codaを利用して分散ファイルシステム化 もしくは、データベースを利用してHDDアクセスの効率化。 ・データベースもPostgreSQL系であれば(最近MySQLもそうかな)、負荷分散構成をくめたと 思います。 ・すべての書き込みは負荷分散装置を利用すること。 このようになると、ハードディスクのアクセス速度が落ちると思われるようですが、 実際にはIDEのサーバであれば一般的なL3スイッチの処理速度以上に処理を行うなんてこととは 難しいようですし(というよりプログラムの効率あげないと無理)。 などというのはどうでしょうか? 詳しく構成をくむ必要があればもう少し考えますが・・・。
>>786 このへんは、何度となく提案されてますね。
たぶん、「お、こりゃいいかも」と思えるような*具体的な*システム構成
(
>>787 のような概念図レベルではなくて)を提案できるとよいのかも。
特に管理人が納得できるようなのだと、より望ましい気がするです。
板移転がうざいと言う人が少なからずいるわけで(これが原因でメインをギコナビへ移行中) p://鯖名.2ch.net/板名/〜ではなく p://板名.2ch.net/板名/〜にした方がいい感じ 板移転した場合はDNS側でIP(鯖)変更する
791 :
動け動けウゴウゴ2ちゃんねる :04/05/09 02:11 ID:JJgF7R6d
>>791 D:\katjusha_2ch\log\pc2.2ch.net\mysv\
D:\katjusha_2ch\log\pc5.2ch.net\mysv\
D:\gikoNavi\Log\2ch\mysv\
D:\jane\log\ネット関連\mysv\
*janeは多言語環境の場合(削除不可能な)文字化けフォルダを作る為論外
何か?
( ゚д゚)ポカーン
DNSはたーん
>>794 なじぇ〜?
と聞くのはやめよう
なんとなく分かった
それなら
www.2ch.net の鯖を大量に作る
*download.windowsupdate.com をnslookupして下さい
これが外部と接続できる鯖
リダイレクトで内部鯖の内容を返す
www.2ch.net/sec2ch/ => qb3.2ch.net/sec2ch/の内容を出す
www.2ch.net/mysv/ => pc5.2ch.net/mysv/の内容を出す
この時qb3.2ch.net・pc5.2ch.netは外部から直接の接続不可
( ゚д゚)ポカーン
( ゚Д゚)ポカーン 鯖分割するいみないじゃん。
そのためのL3switchなわけだが
>>799 >板移転がうざいと言う人が少なからずいるわけで(これが原因でメインをギコナビへ移行中)
これでしょ。負荷分散の考えとは別かと
801 :
:04/05/09 08:47 ID:yaHv/z05
確かにユーザとしては板移転への対応はわずらわしい。 板移転はユーザの手間を考えると、管理側としてもおいそれとは できないんじゃないかな。 DNS 使えば解決できるよね。
かちゅーしゃのために2chが存在するのかよ、という話ですな、、
>>790 >>792 これじゃあ反感もたれてもしゃあない。
>>787 とは別の話ですよ、
>>787 これをやろうとすると2chの現状のアーキを相当いじくらないといけない予感。
bbs.cgiの話じゃないな。 批判要望板にでもスレ立ててね。
805 :
787 :04/05/09 11:38 ID:gJuMGeKB
意見ありがとうございます。 そですね、もう少し具体的な案にしてから持ち寄りたいかなと思います。 私が一番メリットとしたいのは、負荷分散装置を介することによって、 プログラム的には一つのホストに対しての書き込みを行うのみ(クッキーとかありゃあしますが・・・) を行うように見せるだけでよく、言ってみればread.cgiやbbs.cgiを すべてシングルソース化が行うことができるように思えます。 つまり、多数のサーバ環境を考えるのではなくて、 一つのソースコード(実行ファイル)が複数のホストにコピーされているだけで 2chの運営が行えればいいかなと。 そうなれば、削除人分担とかサーバ管理分担とかすごく楽になると思います。 機能的には、HTTPサーバとファイルサーバ(DB?)の二つになるだけですから。 あと、負荷分散機にかかる負荷はほとんど無いと思ってください。 実際テストしている環境の中では、6000セッションを行った場合でも 負荷率は0.00でした。平均アクティブセッションはだいたい300を越えることもあまり無かったですが。 えーとというわけなんですが、スレをたてるほど意見も固まっていないので いちど意見が固まってからもう一度投稿します。 そのときにスレたての話と言うことで・・・・。
806 :
787 :04/05/09 11:41 ID:gJuMGeKB
あと、どうせアーキテクチャとインフラ周りをいじるなら 可能な限り現状を無視しつつ、可能な限り互換性(データぐらい?)を 取ろうぜというのが方針だったりもします。 どうせなら早く・管理楽のほうがあとあといいもーんといい感じです。 ではでは。
787氏 とりあえず2chのデータまわりで一番重要なのがdatの互換性ですからね。 そのあたりさえどうにかなれば後はいかにして負荷を減らすかという問題になりますから。 直接メールであなたの提案を総帥に伝えたほうがいいかも。
808 :
787 :04/05/09 12:05 ID:gJuMGeKB
どうもです。 >> ▲:/usr/local/bin/ch2 -o i686 ◆P8fXJj6wwo さん いやぁ、そこまで行くようなものでは・・・。 本気でやるなら死ぬほど本気でやりますが、 まだそこまでのこととは思っていませんので。 今のところせいぜい土日の暇つぶし程度のものです。 それに現状がよくわかっていない中で特攻かけてもこわいし。 あと、アーキテクチャとネットワーク周りについてですが たぶんデータ周りについての互換性保証はまぁー時と場合によるかと。 面倒ならば、分散ファイルシステムで共有フォルダでも作った方が早いし、 データベースの限界を試すのなら、データベースを作った方がいいし。 その辺はもう少し2chのサーバ現状知ってからかなぁと。 ではでは。
he.netのスイッチの帯域問題について検索したか? L3バランサーの超具体的な設定法(confファイルをそのままソースで貼るぐらいのレベル) このあたりを解決して提案するのはいかがだろうか?
だんだん関係ない方向に言っているような悪寒
>>810 見習い師いわく、「8月までにheからは撤退」だそうで。
812 :
サザン ★ :04/05/09 18:05 ID:???
>>786 削除系の板(saku、saku2ch)とそれ以外の普通の板を同じサーバ置くってことですかー?
sakud は 廃止?
814 :
ピロリ :04/05/09 18:36 ID:fxy1sLJ/
>>812 qb5 = qb2 + qb3 をやろうかなって思っているけど
ちゃんと動くかな? が知りたいのです
qb2 削除要請/削除整理/削除議論 qb3 運用情報/規制情報/規制議論 がqb5配下に集約するわけですね。
816 :
サザン ★ :04/05/09 21:12 ID:???
>>814 qb2 の bbs.cgi は他のサーバと統一しているので、いけるはずですー
そのサーバには sakubbs.cgi 入れないといけないですけど、
817 :
ピロリ :04/05/09 21:12 ID:fxy1sLJ/
>>809 誰がやってるのかと思ったら本7でワロタ
>>740 利用者を(見かけ上)待たせない小技。
処理の最初で標準出力と標準エラー出力を閉じると
利用者のブラウザには結果がすぐに表示される。(htttpd依存?)
成否が分からないのが難点ですが...
-----------------
#!/usr/bin/perl
print "Content-Type: text/html; charset=shift_jis\n\n";
print "処理を受け付けました";
close STDOUT;
close STDERR;
# 時間の掛かる処理
821 :
ひろゆき@どうやら管理人 ★ :04/05/12 17:37 ID:???
>>819 書き込み後にウエイトを置いてるように、
利用者をわざと待たせるようにしていたり、、、
>最近のbbs.cgi
>>821 途中経過を表示させるってのはいかが?
アクセス規制チェック中。。。 OK
連投規制チェック。。。 OK
ごにょごにょチェック中。。。 NG
ERROR!
お布団干したままですよ( ̄ー ̄)ニヤリッ
みたいな。
823 :
ひろゆき@どうやら管理人 ★ :04/05/12 17:50 ID:???
途中経過を表示することになんか意味あるのかなぁ、、、
>>822 エラーメッセージ全部で何種類あるんだ…
>>823 リロード抑止にならないかなって。
何も表示されることなくただ待たされるとなると F5 押したくなるっていうのが一般的心理かと。
あと蛇足になるんだけれども、書き込み後の自動ジャンプは切れないかな? わざわざ100KB以上もある板トップに強制移動したところで無駄な転送が発生するし、 誰もが板トップに戻ることを期待していない(書き込み元のスレッドに戻りたい場合もある)かもしれないし。 板トップの広告に関しては、「書きこみました」画面に入れてもいいんじゃないかな?
それだったら 「書き込み処理しています、しばしお待ちください。。。」 (エラーならここで表示) (処理が終わった) 「終わりました。5秒後にトップページへ飛びます」 (直後にmetaタグを仕込む) (終わり) でいいような気がしますが。>提案者&総帥
828 :
ピロリ :04/05/12 18:32 ID:Co1qIlT3
「歯みがいたか?」 ↓ 「宿題やったか?」 ↓ 「風呂はいったか?」 ↓ 「妹の様子はどうだい?」 ↓ 「肛門の調子はどうよ?」 でいいような気がしますが。
ボクの肛門も閉鎖され(ry
肛門は晴れ 所により一時血が出るでしょう
>>825 少しくらい表示してもイイが、ひろゆきの嫌いな広告スクリプトにも情報を提供することになるわけで。
自動じゃんぷきれー、 っつのは前からさんざんがいしゅつきしゅつだった希ガス元素。
本題とは逸れるが自動ジャンプなんて要らないと思う。 ------------------------- 書き込みが終了しました。 ・○○板(リンク) ・にちゃんねる(リンク) ------------------------- これくらいで良いっしょ。
>>825 2ちゃんブラウザーには効かないぜ
書き込みウィンドウが固まって本体まで固まる奴があるからイライラするだけさ
835 :
nobody :04/05/16 18:42 ID:iQGerbOS
>805 そこそこ使えるL4 ロードバランサって300万円ぐらいするよね、Alteonとか F5とかServer Ironとか。 それを海の向こうに設置して運営するコストは馬鹿にならんと思う。 このての保守契約は24h365dayにすると極端に高くなるから
836 :
787 :04/05/17 23:48 ID:xGAOnJKQ
838 :
とんすけ ◆MytskeE.Vg :04/05/21 12:47 ID:psZQ4yMs
>>827 seikou=0
sippai=1
era=1
if(kakikomi=0)
{
mes "書き込み処理しています、しばしお待ち下さい。。。"
seikou=seikou+1
}
elseif
{
mes "エラーですよん。。。( ̄ー ̄)ニヤリ"
}
if(seikou=2)
{
wait 500
mes "終わりました。五秒後にトップページへ飛びます。"
goto *top
}
stop
119 名前:サザン ★ 投稿日:04/05/27 23:15 ID:???
むぅ
bbq.2ch.net
148 processes: 1 running, 147 sleeping
120 名前:動け動けウゴウゴ2ちゃんねる メェル:sage 投稿日:04/05/27 23:15 ID:ThpJLAhB
C:\WINDOWS\デスクトップ>ping bbq.2ch.net
Pinging bbq.2ch.net [206.223.147.35] with 32 bytes of data:
Reply from 206.223.147.35: bytes=32 time=118ms TTL=46
Reply from 206.223.147.35: bytes=32 time=119ms TTL=46
Reply from 206.223.147.35: bytes=32 time=120ms TTL=46
Reply from 206.223.147.35: bytes=32 time=137ms TTL=46
Ping statistics for 206.223.147.35:
Packets: Sent = 4, Received = 4, Lost = 0 (0% loss),
Approximate round trip times in milli-seconds:
Minimum = 118ms, Maximum = 137ms, Average = 123ms
?
121 名前:南アルプス ◆28UfbftxkA 投稿日:04/05/27 23:16 ID:AFwyjLAs
>>119 それは直ってないとの見解で宜しいでしょうか?
123 名前: ◆f0.zuburi6 メェル:sage 投稿日:04/05/27 23:17 ID:Wg2kMH9n
>>119 一度に一個しかプロセスが走らない?
124 名前:動け動けウゴウゴ2ちゃんねる メェル:sage 投稿日:04/05/27 23:18 ID:K2FslckF
BBQが止まったなら、、、(ry
125 名前:未承諾広告 ◆TWARamEjuA メェル:sage 投稿日:04/05/27 23:19 ID:JtwbarS8
>>119 media: Ethernet 10baseT/UTP <full-duplex>
これってまずくないですかねぇ(汗)
127 名前: ◆Reffi/bQ.c メェル:sage 投稿日:04/05/27 23:21 ID:nGsxpDn8
>125
あ〜ひゃひゃひゃ
それじゃぁ、めちゃくちゃ重くて当たり前のような(滝汗
128 名前:動け動けウゴウゴ2ちゃんねる メェル:sage 投稿日:04/05/27 23:22 ID:l+Xr0uKn
なんでmulch-proccessingができないんかな・・・。<bbq
rootさんはいないのかな。
超カメレスで悪いが、随分前にあった「IO::File使え」という意見。 IO::FileをuseするとIO::SeekableだのFile::Specだの余計なモジュールを 中で読みまくるので、激しく重くなるよ。 open my $fh, '<', './unko.txt'; ... close $fh; オブジェクト指向でファイル操作するのは諦めて、こうやった方が軽い。
それ以前に、mod_perlしていなけりゃ起動コストがアホみたいにかかる
>>843 mod_perlはhttpdプロセス一つごとにcgiが起動するからメモリ食う。
FastCGIの方がいいよ。
保守
>>844 read.cgi以外の*.cgiを処理するmod_perl有効のhttpdと。
*.gif|*.htmlなどの固定ファイル専用のSTATICビルドしたhttpd。
その二つを別ポートもしくはaliasした別IPで立ち上げて。
poundで分岐するってのはどうだ?
おそらく
>>844 は理解できていないか失敗した厨房
Apache拡張ガイドでも嫁
>>846 2chにそのような運用を期待するのは浅はかだと思わんかね
そもそも、httpd数とプロセス(コネクション)数は1対1にする必要ないんだけどね。 httpdが数百個も動いてメモリが気になるなら、マルチスレッドで動かせばいいだけでしょ。 apache2を使っているんだから。
>>848 MPM workerで安定動作しているところってどこか知ってる?
ヤフーとかgoogleとかはどうなんだろうなぁ。
my $ripfile = $PATH . "内緒"; my (@IP, @IIP, $TIP); if($FORM{'subject'} ne ""){ #スレッド立てすぎチェック my (@IP, @IIP, @ZIP, $TIP, $VIP, $SIP, $JIP, $HIP); $TIP = $HOST; $TIP =~ s/<(.*)>//g; $VIP = $TIP; if($FLAG == 5){ $TIP = $FORM{'sid'}; $TIP =~ s/\W/\\$&/g; }else{
my @ippart = split(/\./, $TIP); $JIP = $ippart[0]; if($TIP !~ /[a-zA-Z]/o){ $TIP =~ s/[0-9]+$//o; $TIP = "^" . $TIP; }elsif($JIP =~ /[x\-\.\d]{12}/o){ $TIP =~ s/([x\-\.\d]{5})([x\-\.\d]*)/$1\.\*/o; }elsif($JIP =~ /\d{8}/o){ $TIP =~ s/(\d{3})(\d*)/$1\.\*/o; }else{ if(@ippart < 5){ $TIP =~ s/\d+/\.\*/g; }else{ if(($ippart[@ippart-6] =~ tr/\d/$&/) > 4){ $TIP = $ippart[@ippart-6]; $TIP =~ s/\d.*/\.\*/g; }else{ $TIP = ""; } $TIP .= "$ippart[@ippart-5].$ippart[@ippart-4]"; $TIP =~ s/\d+/\.\*/g; $TIP .= ".$ippart[@ippart-3].$ippart[@ippart-2].$ippart[@ippart-1]"; } } $HIP = "$ippart[@ippart-3].$ippart[@ippart-2].$ippart[@ippart-1]"; }
# 書き込みログファイル open(RIP,"<$ripfile"); @ZIP = <RIP>; close(RIP); # 書き込みホスト保存 open(WIP,">$ripfile"); #flock(WIP,2); print WIP ("$HOST,$FORM{'sid'},$FORM{'key'}\n", @ZIP)[0..$SETTING{'BBS_THREAD_TATESUGI'}-1]; close(WIP); }
RIPファイル内緒って。。。(汗 普通に知られてると思うんだけどな。。。(汗
858 :
動け動けウゴウゴ2ちゃんねる :04/06/12 14:58 ID:8VflbAB0
あげとく
>856 なんか他の色々なところに使ってて、 すれたて規制には使ってないらしらし、
112 名前:FOX ★[] 投稿日:04/06/12(土) 17:25 ID:??? bbs.cgi に入れることに成功した んじゃ 実際に呼んでみよう。。。
861 :
動け動けウゴウゴ2ちゃんねる :04/07/07 18:38 ID:o8lB/EVs
もう開発しないのか?
862 :
動け動けウゴウゴ2ちゃんねる :04/07/09 16:34 ID:xo7Sweag
cgi以外に、通常ブラウザを制御できるプログラムはないのですか?
>>862 どうぞこちらへ
WEBプログラミング@2ch掲示板
http://pc5.2ch.net/php/ サーバーサイドプログラミング関連の話題を扱っています。
Perl, PHP, Java, Ruby, C, Tcl といった言語処理系の話、
Apache, CGI, JSP/Servlet, ASP, ColdFusion といったアプリケーション実行環境の話、
Oracle, PostgreSQL, MySQL といったデータベースの話などをテーマにしています。
スレタイトルは言語がハッキリわかるようにしてください。(言語を特定する場合)
配布中止/配布元不明スクリプトが欲しい人はダウンロード板へ
JavaScript、VBScript等クライアントサイドの話題はWeb製作板へ
864 :
動け動けウゴウゴ2ちゃんねる :04/07/09 16:40 ID:xo7Sweag
865 :
:04/07/11 03:05 ID:g55t+9Ba
test
で、質雑スレで bbs.cgi が云々と宣ってた香具師はどうした?(哀)
867 :
本7 :04/07/24 10:41 ID:j1AbFFVk
Apacheモジュールのmod__bbsならあるけど2chで使うにはコアすぎるかな?
868 :
本7 :04/07/24 11:51 ID:j1AbFFVk
てか新bbs.cgiってもう完成したんだっけ?
869 :
動け動けウゴウゴ2ちゃんねる :04/08/07 16:35 ID:+FhTqV9+
NGワードのことだけんども "&r"を削除するんでなくて、"&r"に変えるようにできないかな。 現状の抜け穴対策と、通常の投稿として"&r"がある時の救済策。 スレッドタイトルのNGワードも同様の処理にして欲しい。 現在の、"&"を全て削除する方法では誤爆が多すぎる。
それは専ブラじゃないか
1行目しか読んでない悪寒
一応書いとくと、bbs.cgiにもNGワードがございまして、 特定の文字列があると投稿できなかったり、或いは 別の文字列に変えられたり、削除されたりするのですね。
&rが削除されるのは、名前欄だけじゃないのか? ここに→&r←来た
そだよ
875 :
保守 :04/08/12 11:50 ID:ZidxCuc8
保守
2chブラウザ使えや
bbs.cgiがdatに記録するのは素のURLで リンクにしてるのはread.cgi(or専用ブラウザ)ですね
881 :
:04/09/17 13:41:16 ID:I3k6ObmZ
bbs.cgiが処理するvalue値、形式は何なんでしょか? <input type=hidden name=time value=1095940962> 初歩的な質問ですみませんが、どなたか <(_)>
timeはUnix時間だったっけ?
884 :
882 :04/09/24 08:49:47 ID:QH62aZR5
ですね (_)m
885 :
:04/10/13 14:31:35 ID:topL7/m/
.
スレ一覧生成するときに、1行1スレにして、可読性を高めることはできますか?
専用ブラウザを使う。
Perlわからんのに下手なことやる★がいるからな。 2chにワケワカランおまけ機能つける奴とか
それで負荷がどうのこうの言って制限とかやめてよ 先にやることあるでしょ
それがわかるぐらいならこんなことになっていない
思ったんだがPerl使うより サーバサイドJAVA使ったほうが比較処理早いと思うんだが・・・
誰が組むの?
オレオレ
ひろしかい?
やっぱりバイナリ(C/C++)でしょう
とりあえずさ、どう考えても今のやつに手を加えるのが現実的ではないだろうか 誰か有能な人を雇用してよ。 俺とか。
その謳い文句のままIT企業に売り込んでみれば?
不動楽さんが手を入れて、明らかに板飛びが減ったですね。
共有メモリ使ってはいかがですか? 共有メモリ上にスレッド毎のメッセージ数入れておいて、共有メモリを更新する数msecだけ SYSVセマフォ(若しくはPOSIXのセマフォ)で排他。 1000を多少越えても良いのだから参照に排他は不要。 SYSV共有メモリで足りなければmmapの共有メモリで。 処理フロー 1.規制確認 2.レス数確認 3.共有メモリロック 4.レス数インクリメント 5.共有メモリロック開放 6.datにアペンド。
mod_cgidso入れさせてテストさせて見たいといってみるテスト
せっかく5.3Rもでたことですし、exで実験!と振ってみるテスト
>>900 つーことは今のbb.cgiソース管理者は不動楽さんということでFA?
>>901 mmapはかなりコストを食うということで却下された経緯があったはず
>>902 管理者というか、いじっている人の一人かと。
>>903 ふむ、では今いじれるのはrootさんを除くと(一部はその気になればいじれるため)
ひ(りゃ(ほとんど触っていなさそうだけど)
見習い
不動楽
あとだれがいましたかね。
read.cgi はともかく bbs.cgi で mod_cgidso を使うとなると,
普通の実行可能バイナリじゃなくて共有オブジェクトにしなきゃいけないとか,
自前でリソース解放してくれないとどんどんリークしていっちゃうとかで,
perlcc で直接バイナリ作るんじゃなくて,生成された C コードを
手作業で直さなきゃならないんでしょうけど......
まぁ bbs.cgi に関しては,fork() させないようにするなら
mod_perl の方が現実的かなとは思います.
あとは,suExec の代替措置も必要なんでしょうけど,
perchild MPM よりも安定して動くと言われているのがこれ.
Metux MPM
http://nibiru.borg.metux.de:7000/wiki.mpm/ **********************************************************************
個人的に bbs.cgi 関連で気になっているのは,まずは ftp のリンク URL が
おかしくなること (ex.
ftp://core.ring.gr.jp/pub/ ).これは ime.nu で
ftp リンクを扱えるようになっていなければ,ime.nu を入れず直リンに
した方がいいのかも知れませんけど.
あとは,NAME/MAIL の Cookie の問題ですね.設定がサーバサイド,
読み出しがクライアントサイドという不整合のため,Mozilla 等では
文字化けしてしまうと.現状では Set-Cookie ヘッダで設定していますが,
これを JavaScript の方で設定すればいいのではないかな,と.
とはいえ,bbs.cgi 出力に Cookie 設定用 JavaScript コードを入れると,
" や \ を \ でエスケープさせる必要がありますが,Shift JIS だと
漢字等の2バイト目が \ になることもあるんで,この判定をきっちりやるのも
結構大変か......むしろ bbs.cgi 出力では行わず,投稿フォーム側の
onsubmit() でこの処理をやらせた方が安全ですかね.
その場合の各板トップ及び read.cgi 出力の JavaScript コード変更案. ---------------------------------------------------------------------- onload = function(e) { var N = getCookie("NAME"), M = getCookie("MAIL"), i; with (document) for (i = 0; i < forms.length; i++) if (forms[i].FROM && forms[i].mail) { forms[i].FROM.value = N; forms[i].mail.value = M; if (forms[i].addEventListener) forms[i].addEventListener("submit", setCookie, false); else forms[i].onsubmit = setCookie; } }; if (!Date.prototype.toUTCString) Date.prototype.toUTCString = Date.prototype.toGMTString; function setCookie(e) { var exp = new Date(); exp.setMonth(exp.getMonth() + 1); document.cookie = "NAME=" + escape(this.FROM.value) + "; path=/; expires=" + exp.toUTCString(); document.cookie = "MAIL=" + escape(this.mail.value) + "; path=/; expires=" + exp.toUTCString(); } function getCookie(key, tmp1, tmp2, xx1, xx2, xx3, len) { tmp1 = " " + document.cookie + ";"; xx1 = xx2 = 0; len = tmp1.length; while (xx1 < len) { xx2 = tmp1.indexOf(";", xx1); tmp2 = tmp1.substring(xx1 + 1, xx2); xx3 = tmp2.indexOf("="); if (tmp2.substring(0, xx3) == key) return unescape(tmp2.substring(xx3 + 1, xx2 - xx1 - 1)); xx1 = xx2 + 1; } return ""; }
わかるひとそんなにいないんじゃないの?
910 :
動け動けウゴウゴ2ちゃんねる :04/11/22 23:29:27 ID:lGHEU7j1
もう今はスクリプト配布してないんだっけ? 4.2ぐらいのころのは持ってるよ。
MySQL使えないんでしょうか? ファイルシステムでこの規模なんて自分では考えられないです。 DATを返すインターフェイス作っておけば問題ないと思うのですが・・・。
DBとの連携ってどこらへんで×だったんだっけ。 過去ログ引っ張り出すのもまんどくせ。
別に技術的な理由で×というのは無かったような。 強いて言えばめんどくさいってだけ。
beのbbs.cgiって新規物だよね。
>>914 DMDM と MDMD の MD5 を算出して、DB(MySQL) と照らし合わせて合致すれば桶だと思うので、
その部分以外は使い回しかと思われんこん。
>>915 そもそもMD5があやしい疑惑があるんだが・・・・
>>911 過去ログ検索とかではDBは有効だけど、ライブスレッドなら
ファイルのが負荷少ないしベストな選択のように思うけど、
どうなんだろう。
負荷ってどうなるのかなぁ・・・ PHPで試しに作ってみる。
>917 ファイルシステムにするとキューだのロックだのを同期する必要がある。 MySQLだと、そのあたりはデータベースに任せられる。 また、MySQLをバックエンドにして、閲覧系を複数にして負荷分散するのが非常に楽になる。
920 :
917 :04/11/29 00:10:17 ID:h4Qkpn0t
そうか書き込みのことを忘れてた・・・スマソ MySQL速いらしいいいかもね。
ひ(ryがいぢれないと採用してもらえなかった希ガス
>>920 というかbbs.cgiはそもそも書き込み用途のはずではw
datをDBにするとread.cgiも変えざる得ないから、読み書き両方を考える必要があるのか・・・
そーゆーんじゃなくってさ、 bbs.cgi の改良でだいぶよくなる気がする。 だって何あのソース?? おっきく仕様変えなくても。。
>923 Perl DBIでインターフェースを作っとけば、仮にCで書きなおしたりしてもインターフェース部分だけ変えればよいと。 んでDBはDBで切り離してチューニングが出来ると。 閲覧系のキャッシュ同期とかがけっこうノウハウあるらしいので高負荷サイトはそれなりに難しいらしいけど。
関連ページをクリックして、Pingを発射したとき どう足掻いてもスレッドのURLの末尾の/が相手先に送れないのですが この問題もこちらでよろしいでしょうか? 2ちゃんねるpingβのスレがあるといいのですが、見あたらないので・・・
929 :
FOX ★ :04/12/02 14:59:24 ID:???
これから質問しまくるんで 優しく教えてください。 つまり Perl を知らないぼんくらなんです
930 :
FOX ★ :04/12/02 15:02:26 ID:???
sub bbs_main { our$version = "BBS.CGI - 2005 (for SpeedyCGI)"; &DispError2("FOX ★","<font color=green>FOX ★ ふふふっ</font>"); return; } とやって $version を DispEooro2 というサブルーチンで参照したいのですが どうすれば参照できるんですか? $version は SpeedyCGI に対応した、いわゆるグローバルな変数ではなく ローカルな変数です。 ちなみにこうやって失敗しています(500 error) print <<EOF; version = $version EOF
>>930 この例だと
-------------------
#! /usr/local/bin/speedy --r1
our $version = "BBS.CGI - 2005 (for SpeedyCGI)";
sub bbs_main
{
&DispError2("FOX ★","<font color=green>FOX ★ ふふふっ</font>",$version, $errnum);
return;
}
-----------
Dispの第2引数にversionを渡すようにしています。
errnumはエラー番号(たとえばapacheのエラーコードとか)
FOX ★ FOX ★ ふふふっ ホストHOST FORM{'subject'} 名前: FORM{'FROM'} E-mail: FORM{'mail'} 内容: FORM{'MESSAGE'} こちらでリロードしてください。 GO! 分からないことがあったら2ちゃんねるガイドへ。。。 アクセス規制・プロキシー制限等規制は、2ちゃんねるビューアを使うと回避できることがあります。BBS.CGI - 2005 (for SpeedyCGI) が出る時と、出ないで500 Internal Server Errorになる時がありますね。
>>930 あ、まちがい、ローカル変数だったですね。スマソorz
# 実は私もperlはあまり詳しくない・・・むしろPHPのほうが強い
printはdisperror内でですかね。
現時点での全ソース晒せ〜
936 :
FOX ★ :04/12/02 15:53:29 ID:???
いやー まったく たいへんたいへん
なんかゴソゴソやっとるな
938 :
FOX ★ :04/12/02 15:58:54 ID:???
939 :
FOX ★ :04/12/02 16:10:39 ID:???
>>939 1分以上バックエンドにリクエストがないと、バックエンドをexitするようにしてあるので、
その時には元に戻ります。
やめる場合、bbs.cgiの1行目の-t60をやめればよいです。
941 :
FOX ★ :04/12/02 16:14:49 ID:???
なるほど、 -t60 なしでデバッグしたほうがいいっすね、
942 :
FOX ★ :04/12/02 16:15:43 ID:???
#!/usr/local/bin/speedy -- -b1048576 にした
> グローバル変数の初期化をしてないようなので my $NOWTIME = time; ↓ my $NOWTIME; $NOWTIME = time;
945 :
FOX ★ :04/12/02 16:53:42 ID:???
946 :
FOX ★ :04/12/02 17:01:01 ID:???
PID=$$ も書くようにした 当然のことながら、いつも同じPID、、、 さてさて〜、どうすればいいやら
なるほど、、、。 常識的に(というか半ば無意識に)使っていたものが、使えなくなるですね。 代替手段は大体あるに違いないけど、こむずかしそうだ。
948 :
FOX ★ :04/12/02 17:08:27 ID:???
Time::time なんてのもあるんですか? < Perl
こういうノリではいかがでしょうか。
&bbs_main;
exit;
sub bbs_main {
my $GB = {};
$GB->{version} = "BBS.CGI - 2005 (for SpeedyCGI)";
$GB->{NOWTIME} = time;#現在時刻
$ENV{'TZ'} = "JST-9";#日本
#$ENV はそのまま使う
my %FORM;
$GB->{FORM} = {};
&foxReadForm($GB);#$FORM を読み込む
&DispError2($GB, "FOX ★","<font color=green>FOX ★ ふふふっ</font>");
return;
}
sub DispError2
{
my ($GB, $title, $topic) = @_;
print "Content-type: text/html; charset=shift_jis\n\n";
#-----------------------------------------------------------------------
print <<EOF;
<html>
<head>
<title>$GB->{title}</title>
<meta http-equiv="Content-Type" content="text/html; charset=Shift_JIS">
</head>
<body bgcolor="#FFFFFF"><!-- 2ch_X:error -->
<font size=+1 color=#FF0000><b>$GB->{topic}</b></font>
<ul>
<br>ホスト<b>HOST</B><br><b>GB->{FORM}->{'subject'} </b><br>
名前: $GB->{FORM}->{'FROM'}<br>E-mail: $GB->{FORM}->{'mail'}<br>
内容:<br>$GB->{FORM}->{'MESSAGE'}<br><br>
</ul>
<center>こちらでリロードしてください。<a href="../$GB->{FORM}->{'bbs'}/index.html"> GO! </a><br>
分からないことがあったら<a href="
http://info.2ch.net/guide/ ">2ちゃんねるガイド</a>へ。。。<br><br>
アクセス規制・プロキシー制限等規制は、<a href="
http://2ch.tora3.net/ ">2ちゃんねるビューア</a>
を使うと回避できることがあります。
</center>
<p>
time=$GB->{NOWTIME}<br>
$GB->{version}
</body>
</html>
EOF
#-----------------------------------------------------------------------
exit;
}
950 :
FOX ★ :04/12/02 17:30:39 ID:???
>>949 おおっ そういうほうが好き好き
$GB は構造体(クラス)と思えばいいのかな?
要素(メンバー)を追加するのは、たんに $GB->なんとか
とやれば追加されるのかな?
んで my で宣言されていても使い方がグローバルなら
結局はグローバルな変数になっちゃうということなのかしら?
sub init_onceを書いて、初期化ルーチンを押し込めましょう。 そして初期化ずみフラグを見てrace condition回避も忘れずに。
>>949 my %FORM; を消し忘れた……。
>>950 よくは分からないですけど
外側のmy変数はコンパイル時に実体が作られるんでしょうか。
SpeedyCGIインストール完了 なんとなく離してみた なぜか動いた なぜだ〜〜〜 my $NOWTIME;#現在時刻 &bbs_main; exit; ######################################################### sub bbs_main { my $version = "BBS.CGI - 2005 (for SpeedyCGI)"; $NOWTIME = time;#現在時刻
954 :
FOX ★ :04/12/02 17:53:42 ID:???
>>952 なんでしょうねぇ
my しても、実際に使い方が悪かったらどっかに(CS?) 実態が
作られちゃうんでしょうねぇ
んもう、書き直すならオブジェクト指向で書き直せばいいのに。 オブジェクト指向ならmod_perlの道が見えるのに。
956 :
FOX ★ :04/12/02 17:58:44 ID:???
>>955 それは大変すぎるですよ、私にとっては
次の世代の方々への贈り物ということで、
SpeedyCGI でかなり改善することが知りたいというのが目的なもんで
「かなり改善」が望めないならお蔵入りという話し。
957 :
FOX ★ :04/12/02 18:00:25 ID:???
>>957 foxReadFormの頭で
my $FORM = $GB->{FORM};
として、代入の方は
$FORM->{$name} = "$value";
とするのがよいかと。
959 :
FOX ★ :04/12/02 18:12:56 ID:???
やってみるです
960 :
FOX ★ :04/12/02 18:16:02 ID:???
sub foxReadForm { my ($GB) = @_; my $query_string = undef; my (@m_elements, $m_element, $name, $value); my %FORM = $GB->{FORM}; で駄目だった。 (my $FORM だと 500 error だった)
うひょ。 sub foxReadForm { my ($GB) = @_; my $query_string = undef; my (@m_elements, $m_element, $name, $value); my $FORM = $GB->{FORM}; #環境変数からPOSTのでーたをもらう〜 if ($ENV{'REQUEST_METHOD'} eq "POST") { read(STDIN, $query_string, $ENV{'CONTENT_LENGTH'}); @m_elements = split(/&/, $query_string); foreach $m_element (@m_elements) { ($name, $value) = split(/=/, $m_element); $value =~ s/\0//g; $value =~ tr/+/ /; $value =~ s/%([0-9a-fA-F][0-9a-fA-F])/pack("C", hex($1))/eg; $value =~ s/</</g; $value =~ s/>/>/g; $value =~ s/\r\n|\r|\n/<br>/g; $value =~ s/<br>/ <br> /g; $value =~ s/[\0\x00-\x1f]//g; $FORM->{$name} = "$value"; } } #1行データからは改行を削ってタグを閉じます $FORM->{'subject'} =~ s/\#//g; $FORM->{'subject'} =~ s/ <br> //g; $FORM->{'subject'} =~ s/&//g; $FORM->{'FROM'} =~ s/"/"/g; $FORM->{'FROM'} =~ s/ <br> //g; $FORM->{'mail'} =~ s/"/"/g; $FORM->{'mail'} =~ s/ <br> //g; $FORM->{'bbs'} =~ s/\|//g; $FORM->{'bbs'} =~ s/\\//g; $FORM->{'key'} =~ s/\|//g; $FORM->{'bbs'} =~ s/\.//g; $FORM->{'key'} =~ s/\.//g; $FORM->{'bbs'} =~ s/&//g; $FORM->{'key'} =~ s/&//g; $FORM->{'time'} =~ s/\D//g; $FORM->{'bbs'} =~ s#/##g; $FORM->{'key'} =~ s#/##g; $FORM->{'subject'} =~ s/&r//g; $FORM->{'FROM'} =~ s/&r//g; $FORM->{'mail'} =~ s/&r//g; }
962 :
FOX ★ :04/12/02 18:18:47 ID:???
勘違いしているかな? もう一回挑戦
963 :
FOX ★ :04/12/02 18:19:32 ID:???
964 :
FOX ★ :04/12/02 18:21:55 ID:???
わーい うまくいった。 次へ行こう。
965 :
▲:/usr/local/bin/ch2 -o i686 ◆P8fXJj6wwo :04/12/02 18:22:08 ID:WBZMaSLu
>>955 さすがにつらすぎるでしょう。
でも最終手段としての書き直しは軽く心に留め置いておいたほうがいいかもしれないと振ってみる
966 :
FOX ★ :04/12/02 18:31:09 ID:???
sub bbs_main { use CGI::SpeedyCGI; my $sp = CGI::SpeedyCGI->new; my $spv = $sp->i_am_speedy ? 'yes' : 'no' ; $ENV{'TZ'} = "JST-9";#日本 #$ENV はそのまま使う my $GBX = {}; $GBX->{version} = "BBS.CGI - 2005 (SpeedyCGI = $spv)"; $GBX->{NOWTIME} = time;#現在時刻 $GBX->{PID} = $$;#pid $GBX->{FORM} = {};# &foxReadForm($GBX);#$FORM を読み込む require "./bbs-main.cgi"; &DispError2($GBX,"FOX ★","<font color=green>FOX ★ ふふふっ</font><br><br>これが表\示されるということは・・・<br>本体requireしたのにそっちへ行かないと、、、"); print "Content-type: text/html; charset=shift_jis\n\nWOWOWOWOWOW-----\n"; return; }
967 :
FOX ★ :04/12/02 18:32:14 ID:???
require "./bbs-main.cgi"; で本体に処理を移そうとしたら・・・ 最初の起動時は本体へ行った しかーし、二回目以降はだめだった、、、 どうする?
>967 >951
bbs-main.cgiの処理を関数に括りだしておいて その関数を陽に呼び出せばいいような。
970 :
FOX ★ :04/12/02 18:49:18 ID:???
>>968 わたし・・・
理解不能なんです
>>969 そんなふうにしてみた
sub bbs_honati
{
my ($GB) = @_;
&DispError2($GBX,"FOX ★","<font color=green>FOX ★</font> いよいよ本体");
}
1;
んで &bbs_honati ; で呼び出してみた。
971 :
風俗王 :04/12/02 18:55:14 ID:lxr8SelU
今栃木県の宇都宮でトップのでりは???
ホストが違う・・・ ERROR:ユーザー設定が消失しています! ホストU178***.ppp.dion.ne.jp 名前: E-mail: 内容: こちらでリロードしてください。 GO! 分からないことがあったら2ちゃんねるガイドへ。。。 アクセス規制・プロキシー制限等規制は、2ちゃんねるビューアを使うと回避できることがあります。
あ、オレオレ。
どうも前にエラーを出した人のを出してるような・・・ まあゴニョゴニョしてる途中だからかな
僕ちんは ERROR:サブジェクトが存在しません!だた。
hostでなくなった(−−;
978 :
FOX ★ :04/12/02 19:15:53 ID:???
いろいろやっているだす sub bbs_hontai { my ($GB) = @_; my $FORM = $GB->{FORM}; my $NOWTIME = $GB->{NOWTIME}; &DispError2($GB,"FOX ★","<font color=green>FOX ★</font> いよいよ本体($GB->{FORM}->{bbs} , $FORM{'bbs'})"); $FORM{なんたら} ってのが沢山あるんで my $FORM = $GB->{FORM}; と関数に入ったところで宣言してそのまま使おうと思ったんだが・・・ うまくいかんのだ どすればいいのだろう
my %FORM = $GB->{FORM}; とか? といい加減に答えてみる
$GB->{FORM} は「ハッシュ」じゃなくて「ハッシュへの参照」なので $FORM{なんたら} を $FORM->{なんたら} に変えないとダメっす。
981 :
FOX ★ :04/12/02 19:31:37 ID:???
>>979 やったけどだめだったっす、、
>>980 やっぱそうなんすか・・・
死ぬほどあるんだよなぁ
一気に置き換えるのは恐いしなぁ
>>981 50%乙
FOX★氏はiijか・・・
ERROR:ユーザー設定が消失しています!
ホストh***.p***.iij4u.or.jp
名前: FOX ★
E-mail:
内容:
ffffcce
ffffcsvxxxxx
fffff
gggg
hhhh
983 :
FOX ★ :04/12/02 19:37:21 ID:???
ぐおっ こわっ
my %FORM = %{$GB->{FORM}}; # として # ここで$FORM{hoge}に対してごにょぎょんして %{$GB->{FORM}} = %FORM; # として返すとか?
難産ですねー……。
986 :
FOX ★ :04/12/02 19:40:12 ID:???
987 :
FOX ★ :04/12/02 19:40:50 ID:???
かけた〜〜 乙乙
989 :
FOX ★ :04/12/02 19:44:58 ID:???
しかーし 結局 ホスト情報やらhtml名やらは元々グローバルだったから ちゃんと $GB に入れてやら無いとまずいという話しかな、 結構大変そうだ、 まずは HOST 関係だけやってみよう。
次スレ!次スレ!
>990 じゃああたすが代表して立てましょ
おお、なんか面白い状況
995 :
FOX ★ :04/12/02 20:00:41 ID:???
たたけ たたけ たたけ〜♪
おいらにゃー 狐のー 血がー さわーぐー
・●はまだかな ・本文梨でも書き込める ・IDが??? がんばれ〜〜
るーるるーるるるる
1000(^_^;)
ワロタ どのような形の削除依頼であれ公開させていただきます 2ちゃんねる(+Samba) アニメ | CM | ゲーム | 映画 | 音楽 | テレビ | 日記(+Samba) アニメ | CM | ゲーム | 映画 | 音楽 | テレビ |
1001 :
1001 :
Over 1000 Thread このスレッドは1000を超えました。 もう書けないので、新しいスレッドを立ててくださいです。。。