bbs.cgi再開発プロジェクト6
レス数が1000を超えています。これ以上書き込みはできません。
peko鯖の稼動によりボトルネックの一つである事がより明らかになった
bbs.cgi作り直しプロジェクトです。
【開発環境の工事現場】
また挑戦。@2ch掲示板 http://dso.2ch.net/myanmar/
また挑戦2。@2ch掲示板 http://dso.2ch.net/yangon/
関連スレなどは >>2-5 くらい > 名前がデフォルト名無しさんの場合はDATに書き込まず、
> 表示するときにSETTING.TXTから読んで付けるようにしたら?
> 結構削減されるような気がスルですが。
でも、名無しさんの名前が変更になった場合、古い発言でも名前が変わるわけですよね。なんかそれは嫌な気が。 嫌モナにも、専ブラがSETTING.TXT読まなくちゃいけなくなるよそれ DATの削減ってそれほど優先度たかいの?
2005にしたのを考えてそうは思わないけど。
曜日を足したいなら2001年08月26日以前みたいに西暦を2桁にしてもよかったのに。
それなら、リンクつけないってのが最優先じゃない?
(read.cgiってSETTING.TXT読んでるんですか?) bbs.cgiの今後の方向性が示されてれば的外れな提案とかが無くていいと思うけど
そのへんはどうなんでしょ? >>6
そんじゃ、DATの頭にデフォルト名無しを取り込んでおいて、それ展開するとか。 >>10
スレッドの途中で名無しが変わった場合は?
スレ内で同じ名前を見つけたら参照するとかの方がまだマシかと。 >>11
いや、DAT頭にある名無しとSETTING.TXTのとが違ったら、それはちゃんと名無しの名前を書き込むのよ。
で、次スレからはDAT頭の名無しも変わって省略とする。
bbs.cgiの負荷コストがかかりそうなので、却下されそうだな〜。
単純な思いつきで書いたので流して〜。 DATとかSETTING.TXTやるぐらいならSQL使ったほうがましだと思うが? というか変にごちゃごちゃやると(ry
動いているものに手を入れたくな(ry 転送量をふやしたいから → 容量食うようにする
とか
人減らしたいから → ファイルopen数増やして全体にもっさりにする
とか
目的を書かなきゃ手段ばかりかかれても
混乱するばかりかな。 >を& amp;に変換するのって必要ある?
<側だけ処理すればタグは禁止できるような。
(ブラウザによっては駄目なのかな) 確かにブラウザの表示は問題ないかもしれないが、気持ち悪いな。
というか、URIの&は&に置換するべきだと思う。 http://なんとかかんとか?hoge=foo&amp=bar
とかなっているとアレだもんな 連投チェックに引っかかった時のメッセージ変わったんだね Perlのプロファイリング
http://naoya.dyndns.org/~naoya/mt/archives/001159.html
bbs.cgiの「どこが」重いのかを調べるのに、使えそう。 今は時間とれないので、とりあえず餌だけまいておこう。
qb6でやってみた(単にtestというレスの投稿)。
うーん、IsKoukokuがこんなに重いとは。
あと、jcodeの処理も結構重いのね。
Total Elapsed Time = 0.801193 Seconds
User+System Time = 0.175342 Seconds
Exclusive Times
%Time ExclSec CumulS #Calls sec/call Csec/c Name
58.1 0.102 0.125 1 0.1016 0.1252 main::IsKoukoku
35.3 0.062 0.055 2853 0.0000 0.0000 jcode::convert
26.8 0.047 0.024 2853 0.0000 0.0000 jcode::euc2euc
22.2 0.039 0.225 1 0.0390 0.2251 main::bbs_entryXXX
13.1 0.023 0.008 2853 0.0000 0.0000 jcode::h2z_euc
13.1 0.023 0.023 10 0.0023 0.0023 LWP::UserAgent::BEGIN
9.12 0.016 0.016 3 0.0052 0.0052 Net::DNS::Packet::dn_comp
9.12 0.016 0.039 2853 0.0000 0.0000 jcode::to
9.12 0.016 0.024 2853 0.0000 0.0000 jcode::euc
8.55 0.015 0.113 14 0.0011 0.0080 main::BEGIN
8.55 0.015 0.153 1 0.0155 0.1531 main::bbs_main
8.55 0.015 0.037 10 0.0015 0.0037 Net::DNS::Resolver::Base::BEGIN
4.56 0.008 0.008 1 0.0078 0.0078 Carp::shortmess
4.56 0.008 0.008 9 0.0009 0.0009 Socket::inet_aton
4.56 0.008 0.008 15 0.0005 0.0005 HTTP::Message::_elem >>27
きたきた(w。
これから外出してしまうので、あとで、これやりませんか。
IsKoukokuのコストを半分にするだけで、相当効果あるらしいです。 sub IsKoukoku
{
my ($GB) = @_;
my $In_Strings = $GB->{FORM}->{'MESSAGE'}; # shift or return ''; # 入力無しなら (・∀・) カエレ
# 読み込む。。。
my @Rock_word = @FOX_Ro54;
# EUC に変換して半角カナ→全角カナにしてして。
# まず対象となる文字列を変換。
$In_Strings = jcode::euc($In_Strings , 'sjis', 'z');
# NG ワードも変換。ついでに NG ワード、MD5値、フラグの 3 要素だけにしてリファレンスにしてして。
@Rock_word = map { [ (split /<>/)[5,6,7] ] } map { &jcode::euc($_, 'euc', 'z') } @Rock_word;
# では NG ワードのチェック。
foreach my $NG_word_ref (@Rock_word){
my $NG_word = $NG_word_ref->[0]; # リファレンスから NG ワードを取り出す。
eval { $In_Strings =~m<$NG_word> }; # NG ワード自体をチェック。以前の失敗を繰り返さないために。。。
return '' if $@; # 不正 NG ワードがあったときは OK とする。
if ($In_Strings =~m<$NG_word>) { # NG ワードをチェック。
$NG_word_ref->[0] = &jcode::sjis($&, 'euc'); # 該当すれば NG ワードを sjis に戻して。。。
return $NG_word_ref; # リファレンスを返す。
}
}
return '';
}
jcodeを2853回も呼ぶのは妥当なの?みたいなw ではラムを飲みつつ待機していまつ♪
Shift_JIS のを丁稚どんにお渡しするようにすれば桶ですよね? 1) Shift Jis でリストを作る
2) リストには上限を作る (たとえば 200)
ですなぁ
ex10, live20 で Iskoukoku するーにしてみた
>>32
> 2) リストには上限を作る (たとえば 200)
構造上「さくら」のみになるかもかもですです♪ リニアサーチしているからO(n)オーダになるのはしょうがないな……
Perlバインディング使ってcdbサーチにするとか、ハッシュサーチにするとか、
B-Treeサーチにするとか。 ん、まてよ。
「書き込みの中にNGワードが有ればTrue」
というのと
「NGワード自体をリファレンスで返す」
という処理があるのね。
前者だけでも既存のモジュールで追い出せばO(log n)の速度になると思うけど。 http://www.lr.pi.titech.ac.jp/~abekawa/perl/perl_bigdata.html#cdb
今日のex10の様子を見る限り、
この部分のチューニングは、すんごい効果あるってことすね。 NGワードが普通の文字列だったなら。。。
正規表現文字列だからちょと難儀かもかも。@「検索」に関してはむちむち♪
とりあえず、Jcodeを外したものを用意しておりますです。 軽くなったところで。
本文だけじゃなく名前欄やメール欄をIsKoukokuのチェック対象にするのは難しいでしょうか。 >>40
単純に考えると3倍界王拳になるので却下の悪寒。。。 名前欄・メール欄・本文を連結したバッファを作って一回でチェックならどうでしょう。
(連結による誤判定も起こる可能性はありますが) >>39
まずはjcodeをはずすだけで、相当効果あると思います。
酩酊じゃなくなった時点で、おじさんとも調整しながら。 まぁ Shift JIS でやるという方向ならどうでもいいかも知れませんが,
もし文字コード変換するとしたら,Text::Iconv モジュール使えば
ネイティブの iconv() 使う分 Perl で書いてある jcode よりは軽いかと. >>43
名前欄にURL貼るタイプの広告は現状報告→ログ掘り→プロバイダ規制と人手をかけ
かつ巻き添え規制もあるんで、例えば>>42みたいなやりかたで簡略化できないかなと。 >>44
あにやんが戻るのは夜更け頃ですよね(苦笑)
ってことで、とりあえず「改正IsKOUKOKU」部を晒しておきますですです。
>>45
文字コード変換のメインは、実のところ「半角カナ→全角カナ」だったりしますので、その部分を超ーwwwwwwっ簡略化してみたですです♪ ●改正IsKoukoku
sub IsKoukoku
{
my ($GB) = @_;
my $In_Strings = $GB->{FORM}->{'MESSAGE'}; # shift or return ''; # 入力無しなら (・∀・) カエレ
# 半角カナ→全角カナ変換テーブルの作成(むずかしいことはしない♪けれども直接書くと0x5Cが出てくるから16進文字列に)
# qw|。 「 」 、 ・ ヲ ァ ィ ゥ ェ ォ ャ ュ ョ ッ ー ア イ ウ エ オ カ キ ク ケ コ サ シ ス セ ソ タ チ ツ テ ト
# ナ ニ ヌ ネ ノ ハ ヒ フ ヘ ホ マ ミ ム メ モ ヤ ユ ヨ ラ リ ル レ ロ ワ ン ゛ ゜|;
my @Z_kana = (
'8142','8175','8176','8141','8145','8392','8340','8342','8344','8346','8348','8383','8385','8387','8362','815B',
'8341','8343','8345','8347','8349','834A','834C','834E','8350','8352','8354','8356','8358','835A','835C','835E',
'8360','8363','8365','8367','8369','836A','836B','836C','836D','836E','8371','8374','8377','837A','837D','837E',
'8380','8381','8382','8384','8386','8388','8389','838A','838B','838C','838D','838F','8393','814A','814B'
);
# ハシュにしてして。
my %Kana2Z = map +($_, pack("H4", $Z_kana[$_ - 0xA1])), (0xA1 .. 0xDF);
# 読み込む。。。
my @Rock_word = @FOX_Ro54;
# まず検索対象となる文字列を半角カナ→全角カナ変換。
$In_Strings =~ s/([0xA1-0xDF])/$Kana2Z[$1 - 0xA1]/g;
# NG ワード要素を NG ワード、MD5値、フラグの 3 要素だけにしてリファレンスにしてして。
@Rock_word = map( [ (split /<>/)[5,6,7] ] ), @Rock_word;
# では NG ワードのチェック。
foreach my $NG_word_ref (@Rock_word){
my $NG_word = $NG_word_ref->[0]; # リファレンスから NG ワードを取り出す。
$NG_word =~ s/([0xA1-0xDF])/$Kana2Z[$1 - 0xA1]/g; # 半角カナ→全角カナ変換。
eval { $In_Strings =~ m<$NG_word> }; # NG ワード自体をチェック。以前の失敗を繰り返さないために♪
if ($@){ return '' } # 不正 NG ワードがあったときは OK とする。
if ($In_Strings =~ m<$NG_word>) { # NG ワードをチェック。
return $NG_word_ref; # 合致したるらリファレンスを返す。
}
}
return '';
}
添削激しくキボンヌですm(_ _)m
ただし、リスト側もeuc→Shift_JISしなきゃなので、いきなり全鯖に導入しちゃうと気持ちよく叩かれるですです♪ >>45
たしかに、でかいすね。
今ならText::Iconvのほうがよさげ。
でも、いわゆるWindowsの機種依存文字、大丈夫かしら。
>>47
了解です。 おぉ。 >>48
で、入れるならリスト側と同時にやる必要ありと。 あ、そっか。
つまり、ロックなシステムのほうも、いじる必要があるってことすね。
やはり同期とって、すすめるが吉かなと。 >>48
# NG ワード要素を NG ワード、MD5値、フラグの 3 要素だけにしてリファレンスにしてして。
@Rock_word = map( [ (split /<>/)[5,6,7] ] ), @Rock_word;
↓
@Rock_word = map( [ (split /<>/)[5,6,7] ], @Rock_word);
こうだよなぁ。。。
Text::Iconv って標準では入っていないのね(泪)
Encode.pmって使ってみようかなぁ@Rock54基地 >>51
登録/変更・削除部分とリスト更新部分は非同期になっているので前者を無効にすれば、テスト的運用が出来るかと思いますです♪
このあたりは秘密基地をご案内してみようかしら。。。 >>53
えっと、さしあたっては、大丈夫かと思いますですです。
でもってもし必要になればそのときって事でm(_ _)m深謝 プロファイリング見て効果を確認しながらやってみては。
釈迦に説法ですが >>56
はい、そのつもりです。
でも、プロファイルする時はspeedycgiをいったん素のperlに戻さないとだめみたいですね。
speedycgi + >>25 のやつで qb6 でやったら、バックエンドが core dump しました。 >>55
了解です。
でも、とりあえず入れておきました。 >>57
あー手間がかかるんですね。失礼しました。こうゆうのワクワクしますよね >>59
するですね。でも私よりも、FOXさんがするんじゃないかな。
qb6でのプロファイリングの方法を書いておこう。
これで、おじさんもりっぱなプロファイラー。
1)bbs.cgiの1行目を、
#!/usr/local/bin/perl -d:DProf
に変える
(qb6のbbs.cgiの3行目に既に書いてあるので、それを1行目に移すだけ)
2)普通に書き込みやスレ立てをする(bbs.cgiを起動する)
3)同じディレクトリに tmon.out というファイルができるので、それに対して、
dprofpp tmon.out
を実行すると、プロファイリングの結果が画面に表示される へぇ、数字で与えるとその数字にあたるキャラクタにマッチして
マッチしたキャラクタが数字になって出てくるのか。
初めて知った。よーし、パパ早速使っちゃうぞーっ!! 処理が前とあんまり変わっていない上に半角カナ以外も変換しちゃってるけど
少しでも軽くなってればいいってことかな。 >eval { $In_Strings =~ m<$NG_word> }; # NG ワード自体をチェック。以前の失敗を繰り返さないために♪
>if ($@) { return '' } # 不正 NG ワードがあったときは OK とする。
>if ($In_Strings =~ m<$NG_word>) { # NG ワードをチェック。
> return $NG_word_ref; # 合致したるらリファレンスを返す。
>}
この部分はこうすると regex match の実行1回だけで済むかな......
my $matched = eval { $In_Strings =~ m<$NG_word> }; # NG ワード自体をチェック。以前の失敗を繰り返さないために♪
if ($@) { return '' } # 不正 NG ワードがあったときは OK とする。
if ($matched) { # NG ワードをチェック。
return $NG_word_ref; # 合致したるらリファレンスを返す。
} 私もまたまた酩酊ってことで
あした読んでみます、、、 読み返してみるとボロボロだったり、、、(汗)
●改訂IsKoukoku改訂1版
→変換テーブルを単純配列にした(ハシュにする必要はなかった)
→不正NGワードがあったとき、そのままOKとしていたところを次のNGワードを探索するようにした
→不正チェックと正式チェックをまとめて1回にした( >>63 )
sub IsKoukoku
{
my ($GB) = @_;
my $In_Strings = $GB->{FORM}->{'MESSAGE'}; # shift or return ''; # 入力無しなら (・∀・) カエレ
# 半角カナ→全角カナ変換テーブルの作成(むずかしいことはしない♪けれども直接書くと0x5Cが出てくるから16進文字列に)
# qw|。 「 」 、 ・ ヲ ァ ィ ゥ ェ ォ ャ ュ ョ ッ ー ア イ ウ エ オ カ キ ク ケ コ サ シ ス セ ソ タ チ ツ テ ト
# ナ ニ ヌ ネ ノ ハ ヒ フ ヘ ホ マ ミ ム メ モ ヤ ユ ヨ ラ リ ル レ ロ ワ ン ゛ ゜|;
my @Kana2Z = (
0x8142,0x8175,0x8176,0x8141,0x8145,0x8392,0x8340,0x8342,0x8344,0x8346,0x8348,0x8383,0x8385,0x8387,0x8362,0x815B,
0x8341,0x8343,0x8345,0x8347,0x8349,0x834A,0x834C,0x834E,0x8350,0x8352,0x8354,0x8356,0x8358,0x835A,0x835C,0x835E,
0x8360,0x8363,0x8365,0x8367,0x8369,0x836A,0x836B,0x836C,0x836D,0x836E,0x8371,0x8374,0x8377,0x837A,0x837D,0x837E,
0x8380,0x8381,0x8382,0x8384,0x8386,0x8388,0x8389,0x838A,0x838B,0x838C,0x838D,0x838F,0x8393,0x814A,0x814B
);
# 読み込む。。。
my @Rock_word = @FOX_Ro54;
# まず検索対象となる文字列を半角カナ→全角カナ変換。
$In_Strings =~ s/([\xA1-\xDF])/$Kana2Z[$1 - 0xA1]/g;
# NG ワード要素を NG ワード、MD5値、フラグの 3 要素だけにしてリファレンスにしてして。
@Rock_word = map [ (split /<>/)[5,6,7] ] , @Rock_word;
# では NG ワードのチェック。
foreach my $NG_word_ref (@Rock_word){
my $NG_word = $NG_word_ref->[0]; # リファレンスから NG ワードを取り出す。
$NG_word =~ s/([\xA1-\xDF])/$Kana2Z[$1 - 0xA1]/g; # 半角カナ→全角カナ変換。
if (my $matched = eval{$In_Strings =~ m<$NG_word>}) { return $NG_word_ref } # 合致したるらリファレンスを返す。
elsif ($@) { next } # 不正 NG ワードがあったときは次の NG ワードへ。
}
return '';
}
ねえねえ、疑問なんですけど2chはなんでdat使ってるんですか?
頻繁にアクセスされるスレは、
データベース使って、全部メモリテーブルに入れちゃったらいいじゃないですか。
メモリに入れておくと、ディスクまで取りに行くより全然速いですよ。
それに、ファイルのオープンクローズばかりだと
ファイルディスプリプタの消費が凄いだろうし、非効率じゃないですかねぇ。 >>66
http://qb5.2ch.net/test/read.cgi/operate/1103495887/965 :動け動けウゴウゴ2ちゃんねる :sage :2005/04/08(金) 23:30:02 ID:OLl7UjV20
「bbs.cgiスレでXML化を言い出す奴=Java屋の会社に入った新入社員」
「bbs.cgiスレでMySQL化を言い出す奴=オープンソースWebASPを聞きかじった新入社員」
http://qb5.2ch.net/test/read.cgi/operate/1103495887/971 :ひろゆき@どうやら管理人 ★ :2005/04/09(土) 04:27:14 ID:???0 (p)?###
>>965
同意。
へー、マッチして出てきた文字列からそのまま数字を引けばその差の数値がでてくるのか。
初めて知った。よーし、ママも早速つかっちゃうぞー!! >>67
DB化といえばそうだけど、ただ単にDB使った掲示板みたいに
データをDBに入れるわけじゃないからねぇ。
メモリテーブルを使うメリットないとは思えないけど、
まあ、いろいろ考え方はあるからねぇ。 >>68
じゃあ貴方が作ってください。
期待してます。頑張ってくださいね。 せっかくアイデア出しても煽られるだけで終わったか、、、
なんというか寂しいね。 劇的な結果が出るようならばやってみたいですよねぇ。
例えば、今ある50近い鯖がたった10台のTigerに収まっちゃうとかとか。 >>65
濁点・半濁点を含むNGワードを半角で書かれると
ヒットしなくなる予感(「ガ」は「カ゛」ではなく「ガ」) man perlcompile
man perlcc
/* perl を C に変換して */ コンパイルしてみては。
「完璧なアイデアを出すよりも、動くコードを出す奴が評価される」
プログラマ世界の鉄則。
コンパイルしてある場合でも、evalの部分はやっぱりPerlで解釈しながら動くのかな。
forechループをevalにする例
http://x68000.q-e-d.net/~68user/webcgi/search-1.html >>72
そういったノーマライズ(正規化)って、そのためのライブラリがあるかも。 例えばIDN::Nameprepとかが使えるのかもしれないけど、UTF-8ベースだし。
で、そういった正規化が必要なのは、濁点・半濁点と、あと何かあるのかしら。 全角カタカナと半角カタカナを区別なく処理したいときは、
全角カタカナを半角カタカナにして情報量減らすんだっけか。
ガ→ガ ガ→ガ カ゛→ガ カ゛→ガ >> 74
perl がどんな C を吐くかわからないが、あんまりよくなさげだったら、
IsKoukoku や IsKoukoku の中の"半角カナ→全角カナ変換"だけでも C で書いて、
入れ換えてみるのは。
1.言いだしっぺルール
2.メンテナンスコスト
3.perlはちゃんと書けば速い ちゃんと書いてある部分もあるだろうし、ちゃんとしていない部分もあるだろう。 bbs.cgiってフォーム処理とDAT出力くらいしかやってないように
見られるんだけど、めんどいことやってるのかな?
C+++FastCGIとかでわりと簡単に書き直せたりしたりとかしない?
・・・と思ってたけど、Perlで十分なら必要ないか。 >>86
実はいちばんめんどいのが各種チェックや統計処理だったり。
DNS化している部分もあるけど、やっぱり問題なのはディスクI/Oなのでしょうな >>87
>実はいちばんめんどいのが各種チェックや統計処理だったり。
各種チェックってアクセス禁止IPのチェックとかDATファイルの1000オーバチェック
とかですかね・・・?確かにめんどそうだなぁ。
>DNS化している部分もあるけど、
素でDomain Name Systemかと思ったw
Digital Nervous Systemって抽象的でなにを言っているのかわからんけど、
高速にアクセスできるシステムって解釈でいいのかな
スレ汚しすいません DNSはDomainNameSystemの意味だよ。
つまり、書き込みが規制対象かどうかをDNSのプロトコルでリクエストして
その結果で判定しているということ。 ・書き換えがあまり発生せず
・反映速度の要求もシビアで無い
・複数ホストから同一データを参照する
というようなデータの場合はDNSを転用するってことでしょ。
スパムフィルターとしてRBLという実績がある方法。 分散データベースである必要はあるのか?って気はするが、あるんだろうな DNSって名前解決ぐらいにしか使われないんだと思ってたけど、
>>89-90でわけわかんなくなりましたorz
勉強して出直してきます・・・ DNSを転用するのはキャッシュが効くから元サーバーの負荷が減るってのもある。 ググってみました。
2ch運用サーバの中に、禁止ホストのブラックリストを保持していて、
リクエストがある度にそのリストを参照している、
という解釈でよろしいのでしょうか? >リクエストがある度にそのリストを参照している、
このへんが細かい点で違うが、まぁ結果的にはそういうことになるからいいか。 一番大きなコストなのはRockのチェックのはず。
ここをウィルスチェッカー級の早さでチェックできればいうことないんですがねー
シマンテックあたりに相談したらおもしろいかもと煽ってみる 待ちガイルがソニックブームを出すか、サマーソルトを出すかみたいにすれば速くならね?
必殺技が多すぎて大して速くなる訳でもないか。 / `、 \ ___|_|」
/ ̄ ̄\ | ヽ / |__ |
'" ̄ヽ ヽ!! |,," ヘ < | |
ヽ ゙!!!、 ,,-' iヽ── / 丿 /
|||l ゙゙ヽ、ll,,‐''''"" | ヽ||||||||| ヽ/
|||l ___,,,,,, ゙l ,,,,, \||||||||| _
||!' /ヽ、 ;::''“”“~`゙>┴<;''“”~` /\ |'" ̄| | |
\ / |ミミヽ──‐'"ノ≡- ゙'──''彡| |、 | | | |
 ̄| |ミミミ/"~( ,-、 ,:‐、 ) '彡|| |、/ / | |
ヽ、l| |ミミミ| |、─\\\\ |彡l| |/ /_ | |
\/|l |ミミミ| \_/ ̄\\\\''|l/  ̄/ | |
\ ノ l|ミミミ| \二二\\\\ フ | |
 ̄\ l|ミミミ|  ̄ ̄ ̄\\\\ \ | |
| \ ヽ\ミヽ  ̄ ̄"' \\\\ / |_|
/ \ヽ、ヾ''''ヽ、_____//\\\\ /
/ ヽ ゙ヽ─、──────'/| \\\\ ̄/
. / ゙\ \ / / \__\\\\
───'''" ̄ ̄ ゙゙̄ヽ、__,,/,-'''" \\\\
subject.txtの1行分を256バイト固定長とかにしたら、ランダムアクセスやソートを速くできるかな。 >>100
資源の問題はおいといて、
\0 で埋める -> そういうのを考えてない処理系でバグが出る(特にC)。バカなエディタでは開けない
デリミタで区切って空白で埋める -> カラムの拡張性を殺す
というデメリットはあるんではないかと。
可読テキストデータを固定長にするメリットってそんなに大きい?
今までその手の試みが吉と出たことがないんだよな、経験上。
>>97
時間ができたら見てみます。 >> 101
固定長で Index を付けられるシステムを見たけど、すごいよ。
open(file, index, ...)
write("AA");
write("CC");
write("BB");
index をレコード全体に設定したとして、と上のように書くと、
open(file, index, ...)
read(buf);
read(buf);
read(buf);
とやると、
"AA"
"BB"
"CC"
って読み出せる処理系だった。
データベースなんか要らないわけだ。
UNIX 系ではないのでここでは全く関係ないのではあるが。
投稿時の並び替えとかレス数の書き換え等が、
アドレス決めうちのメモリコピーのみで可能になるのがメリット?
subject.txtの書き換えなんて元々大したことなさそうだから意味内科。 >>102
ごめん、丸一晩考えたんだが何が凄いのかさっぱり分からん。
>>103
ベンチ取ってみりゃ分かるけど、固定長にしようが\n区切りにしようが
一旦ドカっとバッファに溜めたヤツを切り分けることに違いないんだから、
減らせる負荷なんて知れてる。regexをバンバン使ってるような処理系で
そんなことしても全く無意味どころかデメリットの方が大きいと思う。 実際のシステム開発でもそうだけど、運用(障害対応等)や移行を無視した案ってのは、机上の九龍なんだよね
たとえば、datに依存したツールが2ch内外に何本あるのかとか まず、はじめに、perl少ししか読めません。スマソ。
文字コード問題。
例えば、WinXPだと、ベースをunicodeで処理すると、高速なんです。
>>45>>49>>52にも指摘があるのですが、その辺の最適化どうでしょうか。
次に、
NGワード.txtを正規表現にする案
-----NGWord.txt------
(?:ぬる|だめ)ぽ
^(?:.\w{2,3}|厨房|てっここ|こっこて|保守|ジュ|て(?:st|すと?)|テスト?|[あ-ん]っ(?:かり|くる)|さいたま)$
fusianasan
tanasin
unko
ウザッ
ウゼェ
うぜぇ
お(?:ま[いえ]|前)ら
---------------
で、これを
a = LineToArray("NGWord.txt"); // 読み込む
r = eval("(" + a.join("|") + ")");
$matched = r.match($In_Strings);
こういうのはどうでしょう。
あと、ぜんぜん関係ないけど、
逆保守(糞スレを保守)ツールに弱すぎると思います。
とりあえず、厨房板をサンプルにしますよ。
具体的には、レス数は適当ですけど、
・130レス以上位に伸びたスレは(伸びるごとに5段階ぐらいで)より落ちないように措置をする。
・20レス以下のものをもっと優先的に落とす。 わざわざ毎回TXTを読んでるなら、改善の余地あり。
if (fileIsUpdate($NGWordTXT))
rNGWord = makeR($NGWordTXT);
$bufFileLm = ""; // LastModified
function fileIsUpdate(file)
{
$lm = GetFile(file).DateLastModified;
if (fileLm == lm)
return false;
fileLm = lm;
return true;
} r = eval("/(" + a.join("|") + ")/ig"); // >>108の訂正 WinXPだと、List.TXT を unicode で保存しておくと読み書きが早い。 dat落ちに関しては、準良スレが圧縮ごとにポロポロ落ちていきますよ。 そか、過疎板のdat落ちを調整すれば、もっと人が増えると思う。 eval で 正規表現を使うとき、
空白行を飛ばしておく。
つまり、そうしないと /a||b/ とかになって、
つまりすべての表現にマッチしてしまう。(すべて規制してしまう)
同じように、間違った行を追加するリスクがあります。
たとえば、(?:a||b)とか、
[a-z{2,12}\.dqn\.co\.jp ([a-z]{2,12}\.dqn\.co\.jp )
これを eval すると、危険です。
テスト追加してから、本追加すべきです。 毎回読み込み問題。
→Speedyのおかげ?で船が自爆すると再読込になっているのかな。
うにコード処理。
→Perl5.8.x以降、内部ではそうなっています。なので、euc-jpにしたりしても同様な負荷が掛かるかも。
正規表現の誤登録。
→配布する前。登録/変更の際にチェックしています。(なんでもRockチェック)
|(or)の利用。
→BBRの絡みがあるので現状では。。。 @Rock_word をグローバルにして LastModified 使うってのはどうです? >>118
船が出航する際に取得するだけなので、そこまで厳密でなくてもよいのかな。
更新がなければ無駄にはなるけれども、そこまでまだシビアな状態ではないような悪寒も。 とりあえずISBN4-87311-130-7のフクロウ本は読んでないだろ。この人。 毎回読み込み問題。
→Speedyのおかげ?で船が自爆すると再読込になっているのかな。
なってるなってる なるほど、Rockリストも出航時に読み込みですか。
>>29 >@Rock_word = map { [ (split /<>/)[5,6,7] ] } map { &jcode::euc($_, 'euc', 'z') } @Rock_word;
ここで bbs.cgi が呼び出されるたびに jcode を呼びまくっていると思いました。
具体的には、 Rockリストの数 x3回以上、最低でも600回以上は呼んでいると理解しています。
>>32 >リストには上限を作る (たとえば 200)
jcode も船が出航する際にだけ呼びまくればいかがでしょうか。
それとも、>>65 の改訂IsKoukoku は既に稼動済みですか?
>>119
未承諾広告※ ◆TWARamEjuA さん、丁寧なレスをありがとうございます。
で許せ
>>120 悪夢で目が覚めて気づいたらこんなところでレスをしていました。
>>122 教唆thx スマソ そんな鈍器みたいな本は読んだことないんですけど、
明示的な指摘をお願いします。あと、ID がウキョー。 http://www.toshinari.net/ここのCGIを改造してサブスクライバIDや固体情報を取得してみる方法はある? >>124
<q cite=" >>29 ">@Rock_word = map { [ (split /<>/)[5,6,7] ] } map { &jcode::euc($_, 'euc', 'z') } @Rock_word;</q>
あーこれは、IsKoukokuの外でやっちゃうと桶ですね♪
@FOX_Ro54 = map { [ (split /<>/)[5,6,7] ] } map { &jcode::euc($_, 'euc', 'z') } <リストのファイルハンドル>; 出航時に、ついでに、
# 不正 NG ワードがあったときは splice関数で除去しておく♪
eval { $In_Strings =~m<$NG_word> };
splice(@Rock_word, i, 1); # i は配列のインデックス
とかどうでしょう?
perlがわからないのですが、
@Rock_word に splice が使えると解釈しています。
当然、上記のコードは雰囲気だけ醸し出しているってことでお願いします。
ほかには、[5,6,7]は[5]にしてもいいように見えますけど、合ってますか? 外でやると、
splice(@FOX_Ro54, i, 1); # i は配列のインデックス
です。 偽perl言語で書くとこんな感じですよ。
i = 0, n = @FOX_Ro54.length;
while (i < n)
if (eval { $In_Strings =~m<@FOX_Ro54[i][0]> })
splice((@FOX_Ro54, i, 1);
else
i++;
もしくは
for (i = 0; i < n; i++) {
if (eval { $In_Strings =~m<$@FOX_Ro54[i][0]> }) {
splice(@FOX_Ro54, i, 1);
i--;
continue;
} 違った、n にすると配列の長さの変動に対応できないので、
n は全部 @FOX_Ro54.length に置き換えですね。 >>133
やってますやってます(照)
# NG ワードのエラーチェック
eval {
my $Test_String = "This is a TEST.";
$Test_String =~ m<$FORM{$key}>;
};
if ($@) { # エラーがあればエラー
my $message = $@;
$message =~ s/^(.*) at .*$/$1/;
Error('22',$message);
}
# code は危険だから鰓に。
Error('23') if $FORM{$key} =~ /\(\?+?\{.+}\)/;
# コメントだけやん(汗)@2004/11/13
Error('26', <<"EOS") if $FORM{$key} =~ /^\(\?#[^\)]+?\)?$/;
<dl>
<dt>登録しようとしたNGワード
<dd><span class="NG_word">$FORM{$key}</span>
</dl>
EOS
# なんでも NG をチェックしてみる。改
my $Match_over = eval {
my $count;
my $Test_Strings =<<"EOS";
長いので省略。。 >>133-134 なーるほど
$FOX_Ro54 と @Rock_word を分けたままで、[5,6,7]のmanmarで、作ってみました。
例によって、perlっぽいやつになっております。
# 外で、 @Rock_word を regExpでコンパイルしておく。
foreach (@Rock_word)
$_[0] = qr/$_->[0]/;
# では NG ワードのチェック。
my $n = $Rock_word;
foreach my $i ( 0 .. $n )
if ($In_Strings =~ /$Rock_word->[$i]->[0]/)
return $i; # インデックスを返す。
return -1;
}
$nKoukoku = IsKoukoku();
if (0 <= $nKoukoku) # NG ワードを含む
$FOX_Ro54->[$nKoukoku]->[5]; # NG ワードを参照する
else # 入力要素の体裁(コントロールコードや<>を除く)
ここの正規表現もコンパイルするといいかもしれません。
文字列が1000文字以上の場合があるからです。 FOX Cawaii
投稿内容が大きすぎます!") if $ENV{'CONTENT_LENGTH'} > 16000;
ここは、シビアに、
256 FROM 256 mail 4096 MESSAGE 256 subject 10 key 10 time
足して4884
6000-7000ぐらいでどうかと思います。 >>139はそういえばクロール規制が入ったから、効果不明です。 クロールbarbon > bbq&bbm(焼済) > カキコbarbon(焼) でもbarbonはリスト数が少ないからそれいいのか。スマソ では、bbq&bbmの正規表現のコンパイルをする。 # POST入力情報を取得($FORM{}に格納)
ここの正規表現も>>137と同じですね。 無駄に消費するなら纏めてかけ。
独り言はチラシの裏 「纏めて書くと見やすいよ。少しづつ挑戦してみなよ」
とでも励まされれば、この世代は喜んで挑戦すると思います。
反対に、「どうして纏めて書けないんだ。この人。」
などと、具体的な指摘や理由がなく、怒り・呵責な表現の場合には、
誰しもが、毎回イヤイヤ纏めるか、その必要がない場合には反発すると思います。
コーチングなどうまく人を参加させるマネージャーの基本だと思います。 別に励ますつもりも無い。それに俺には君のマネージャじゃない。
チャット感覚で連投するくらいならまとめた方がいいし、
独り言のようにさえ見えてしまう。
最初の意見
やった事
結果
それからでてきた疑問
それに対する自分なりの考察
それだけ書けば十分だろう。
自分ひとりで完結することなら、わざわざ>>143のように宣言する必要も無いし。 >>149僕はその指摘を貴重な意見としてよく考させてもらいます。
ID:bxf7r0yz0さんも>>145-150のプロセスをもう一度見直してもらえると何か進展できると思います。
ブレインストーミングについても調べてみてください。 なるほど。自分に足りないものが良くわかるな。どうも。 どうでもいいが、ブレストとかコーチング以前に「協調性」を常識レベルにしてくれ。
協調性がある人間になってからブレストだとかを言い出すもんだ。 >154
・「cgiからphp」って何ですか? perlからphpにしてみたらというなら意味が分かりますけど
・mod_perlとmod_phpの速度差が大して無いことについて説明して
│ ,
│ /⌒⌒⌒\
│ ≡ /∽∽∽∽∽\
│ ∽∽∽∽∽∽∽∽
│≡ , ⌒⌒ヽ ||
│ リノヽ、卯) |
│ ≡ ,9、゚ ヮ゚ノミ |
│ Oミi本iミつノ
↓ ノ(_リ⊃⊃ |
| _ ∩
| ⊂/ ノ )
| / / ∨
↓ し'⌒∪ 考察としては、その辺がコンパイルしてあれば、
サイバーシンドロームとかから串を2000本位集めてきて、
マルチスレッド型でDOS攻撃しても屁でもなくなるだろうってことですよ。
>>153 協調性でググッたら余計に混乱しました。
協調性度チェックテスト ポイント:40/100
http://www.heartful-smile.com/07/07-342.html
ちょっとマイペースで気分屋さん的なところがあるかも >>162
協調性でググってみれ。
協調性のあるやつは使えねーって順番に言ってるぞ。 .,, ,, __ ,,,_ _,,,
,i´'i、 ./ヽ | | ,、 | │ 〔'l、ヽ
ヽ. ,〉,/` / r、| | ,,i´ ゙l _ノ .゙l--,, |,,》,ヾ
゙'ジ ,/` l゙ ゜ ド .、 | | ゙l| |
,,--′ ‘"゙"゙゙l `'i、 .,イ l └I |゙゙゙} .|| |
|、 ,,,---" / / | | | │ .| |l゙ .l
ト'ア ./ ,/ | | | | l゙ | |゙l .| .
| l゙ 、 'i、 | | | _、 | l゙ l゙ .| }-'''.
| ヽ,,--'゙゙| ll! | | '" | .l゙ .l゙ ノ |
ヽ _,ノ | | ゙l │〈,. | l 丿
゙'''ー'''" ‘゙゙" ゙"″ ゙""'''"
/.──┬ /⌒ヽ
/| ┌─┐| ノ
| └─┘| |
| J ○
こうやって関係の無いどうでもいい話を保身のために持ち込むのが荒らしなんだよな。 運営に気に入られようったって他所で荒らしやってんじゃ意味無いんだぞ<雑音先生 もう2年ぐらい荒らしやってないけど、
あなたは運営板の古い人なの? どっちかっていうと、気に入られたっていうより、
率直に削除人が連携して荒らしを煽る風土をどうにかできないかって思ったね。
うまく提示できたね。 この程度もスルーしないのに提示したとか言っちゃってるのが笑える。
積み重ねてきたものが無い奴ほど 〜は使えない とか言うのを信じて自分はそうじゃないと安心することでしか
自分の中での自分の地位を確立出来んのだよな。 他の板まで連携したまま煽りに行く人を数人認識してるからさ。
つまり、ID:wiySXr/N0の何か行動を変化させたいんだよ。
そこが凄く引っかかってここに来てみたわけ。
あと、トオルさんになにか力を貸したい。 何でもいいけど雑談なら下げて。朝忙しいのに読んじゃうから。 俺がそいつだとでも思ってんのかね。
煽ってる奴は同一人物でいつもまとまって行動しているとでも言うのか。 >>174 OK
>>172 もうオレはこのスレの糞荒らしでいいからさ、
何が気に入らないのオレの?ぶっちゃけちゃってよ。 いつの間にやら、変なのに居付かれてしまいましたなぁ('A`) >>162が自分の事だと勘違いして荒らしてしまう所と
荒らしと自分でわかってる者の相手をしてしまう所>>161>>163
こんなのもスルーできないなら、迷惑をかけるだけだから運営で作戦に参加しようなんて
思わんほうがいい。 とにかくオレを2年以上前のことを持ち出して、
ウォッチしてたまに煽る削除人が何人かいるわけだろ?
オレの何が君を一番傷つけたの? あー、恒例の人格批判かー('A`)
どっか行ってー 訳がわからん。
俺は君のことなんぞここでしか見てないし、
煽ってる奴は削除人だなんてなんて短絡思考だ。 >>181
そうか。じゃあ、俺もなぜ運営の人に煽られまくるのか訳がわからんけど、
僕は荒らしという人格としてここに参加したのだけれど、
それが気に入られなかったということですよね。
煽ってる奴は削除人だなんての、ここの96とか、
http://ex.2ch.net/wall/kako/1005/10056/1005649648.html
他板で、こういうこともあったんですよ。
972 名前: 妄想 04/07/19 14:23 ID:1u1bJEHx
もし俺に恨みがあるとしたら、あぼーん砲のボケカスしかいないし、
そいつの名前は今いる人★の可能性が高い。
975 名前: 名無しさん 04/07/19 14:25 ID:???
>>972
憶測でもの言うな
976 名前: 名無しさん 04/07/19 14:25 ID:???
>>972
何言ってんだこのアホは? 俺は運営の人じゃないし、他板で972のような書き込みを見たら975と同じ反応をするだろうな。
それに96がどうして君を煽ってるのは削除人だっていう証拠になる。 とりあえずスレ違いな話題は移動ヨロ
一個聞きたい>>182
漏れはperlとか良く判らんけど,>>135 で「perlっぽいやつ」でどういうことやねん。
「ぽいやつ」で作らんといてくれるー?
はよねーよー 転載しておきます
408: ◆TWARamEjuA 2005/05/30 00:22:59 in+4hgAJ0 [sage]
さてさて。
Rock54にて仮に対応をしてきたのですが、そろそろBBRが破綻しそうになって参りました(滂沱)
といいますのも、BBRに登録されているクエリの大半が、このウイルス関連のものに埋まってきましたものでして。
実のところ、DB_File::BTREE にしているにもかかわらずその容量が300MBにも達しております。
そこで願わくば、このウイルス対策として個別のルーチンにて対応頂けるとありがたいかと思いまして。。。>bbs.cgiの中の人
さて如何なものでしょうか。いろいろなご意見をお待ちしておりますm
思い切ってPHPにしてみては?
ApacheにPHPモジュールを組み込んだ状態でコンパイルしてしまえば
オーバヘッドも少なくなりますし。 SpeedyCGI にする前なら、それもありかもだったんですけどね。>>188 今ってDSOでしたっけ?
1.bbs.cgiをApacheの組み込んでしまう
2.httpデーモンをカーネルに入れてしまう
今みたいな山田君の襲撃が今後起こらないとも限らないので
汎用性を考えればPHPですね・・・(とPHPを強く推してみる。
PHPをコンパイルして組み込めば更に早くなりますしね。
Denyテーブルってどれぐらいの容量(レコード数)を管理されてるのですか?
今の攻撃で正規表現で弾いてれば、これまたレスポンスが悪くなりますし。。 >>191
言葉が悪かった。
×汎用性
○メンテナンス性 >>187
転載、ありがとうですm(_ _)m
あと、IsKoukoku問題。 >>127 (リストの変換を出航の時だけにする)を実施すれば、ひとまず負荷は半減するかと思いますです。 >>193
それからそれから、リストの並びを「ヒット率の高いもの順」に替えてみました。
引っかかるのは簡単に引っかかるようにと。
でも「善良な書き込みほど負荷が掛かる」に対してはなにも太刀打ち出来ないでいます(泪) >>187
RockDBは何かしらの形でストライピングがいりますねぇ >>187
協力したいんだけど、bbs.cgiは随分長いこと見てなくてRock54って何?
って状態なんですが、どの辺りのスレから追えばみなさんに追いつけます? ということで、また、じわじわと増えてきたですね。
http://mumumu.mu/mrtg/mrtg-rrd.cgi/bbqbbx/bbr.html
Rockは「最後の手段」なので、そこに行く前に止める
(こないだおじさんがやった対症療法みたいに)必要がありそう。
あわせて >>187 >>193-194 が当面の課題か。 とりあえずいつもの「ハンマーをもらった子どもは何でも釘に見える」の啓蒙だよー
PerlよりPHPの方が軽くて速いは本当?(CGI編)
http://www.hippo2000.info/perl/tbench.htm
「Perlは遅いし大規模開発に向かない」というのはPerl4時代の話。
PHPだから早いわけでもない。
どちらかというと「どっちに慣れた人がたくさんいるか」という運用面での話しになる。 >>199
10回程度のループテストでは参考にならないでしょう。。。
>>200
じゃ数百回のループテストを公開でやってみたら? phpってソケット使える?
もし使えるなら実験してもいいよ
注意:php単独で使えるという前提 ( =~ apache等のwebを使用しない) >>201
数百じゃ話にならんよ。。。
日曜プログラマでシコシコやる分には良いが。。
24時間との単位で負荷テストしないと。
>>202
ソケットもサポしてます。
Ver4以降からコマンドラインもサポしてますよ。 亜種の出る速度から考えて正直対症療法に意味があるとは思えないけど 参考になる実験結果も持ってないのにどうしてそんなphpを力いっぱい押せるんだか っていうか、どんな言語でも(たとえ水平マイクロアセンブラでも)、今から新規に作り直せば、
今のbbs.cgiよりきれいに違いない
そんなの自慢にもならん 作り直せというのは大分前からのこと。
仕様変更だって、1ヶ月前から告知したら専ブラも対応できるのに。
面倒なんですと。 個人的な負荷実験結果でこの際100万アクセスって言われてる
ここでPHPの有効性を実際に実験したいってのが本音です。 どのみち山田対策のからみもあって大幅な仕様変更やらなきゃいけないような悪寒がするけど・・・・ PHP使ってるサイトを良く見ますけど、どのサイトもクソ重いです…。
いかにPHPが優れていようと今の2chのcgiより重かったら何にもならないです。 phpも便利な言語だし好きだけどperlと比べてそれほどメリットはないよ。
perl捨ててphpにしようとかphp妄信者の寝言はもうたくさん。
それでもphpにしようとかいうひとはphpでbbs.cgi,read.cgi相当の祖体ぐらいだしてからにしてくれよ。 >>212
大抵のところはphpを生で使ってるから重い。
スクリプトはそのままで、アクセラレータエンジン入れればだいぶ軽くなるんだがね。 同じような手法として、perlccなんてのがあったりするです。
live系はそうしているんだっけ? >>216 >>213と>>214は間違いなく漏れな訳だが。 確かにphpは3.0が出た当時はまだperlに比べてアドバンテージがあった。
apacheモジュール実装然り、初心者にわかりやすく多くのDBとの連携のあるAPI群。
この当時ってperl5がでるかでないかぐらいじゃなかったかしら。
基本的にperlとjavaの弟分みたいなところがあるし、
両者がチューンがすすみ、PerlもSpeedyCGIやmod_perlなどのラッパーが充実してきた今、あまりアドバンテージは感じられないな。 スクリプト言語の位置づけとコンパイル言語の位置づけを比較すると
shはアセンブラ
perlはC
rubyはC++/Java
phpはVB
ってところなのかな。 >>219
それは激しく異論があるぞ。
VBなんぞと一緒にするなよ。というかそれだけ言語じゃなくて処理系名かよ:p
だいたいどういう視点での位置づけなんだ? 言語の優位性語るスレじゃないのに
根本的な解決策にはならんでしょ >>220
単に初心者のとっつきやすさという観点からくっつけただけです
異論も出るのも当然ですね、スマソ吊ってきます >>215
今は全部、speedycgiにしました。
perlccはしょせん、単なる毎回ロードするバイナリ。
で、ここでは「中身を何で書くか」といった、手段のことを言うんではなくて、
まずは目的のことを話してほしいなと。
まずは目的があったうえで、それにあった手段を選ぶわけで。 で、現状の問題点
・より確実な山田対策
・IsKoukoku
違ったら指摘よろ
あとなんかありましたっけ? cgi 外部での対策
ウイルスの対策告知・啓蒙
http://tmp5.2ch.net/download/ の head.txt に、
山田ウイルスなんとかかんとかですです。。 とか。
# この板書けるのかしらはグローバルに
YamadaBarbon() # ブロック10回超えたら 12時間 これにかかると閃き。パラメータ適当
barbon
bbq bbm
samba
@GB # 格納
@GB =~ # 変換 重いと思われる。
# 一般的なエラーはここでまとめて
IsKoukoku # 重いと思われる。
# このスレッド書けるのかしら
# 書き込み確認/書き込み警告
負荷対策として
正規表現と文字列と eval の処理コストが高いので、
正規表現はコンパイルし、文字列はグローバルにする。
eval は外に出す。
# speedycgi のご利益はこういう風に受けるものだろうと思われる
@rMESSAGE = (qr/\r//g,
qr/\n/ <br> /g;
);
if (/MESSAGE/) {
$FORM{$_} =~ /@rMESSAGE[0]/;
$FORM{$_} =~ /@rMESSAGE[1]/; 山田ワクチンを作り、
重いところを軽くして山田耐性を上げる。 スラッシュ入りとそうでないのにリストを分けて、入ってないレスの時はスラッシュ入りを回さないとか。 rockのファイルってジンギスカンしてます?
まあそれ以前の問題かもしれませんが・・・
関連でこんなんはっときます
ttp://www.oracle.co.jp/interactive/Techniques/VLDB/Basic/step08.html メアドやドメイン名だけだとスラッシュ入らんな。ドットでチェックすればいいのかな。 NGワードを「スラッシュ入り」「スラッシュ無しドット入り」「スラッシュ無しドット無し」の3つにあらかじめ分けておく。
「スラッシュ無しドット無し」のNGワードチェック。
本文にドットがあるかチェックして入ってたら「スラッシュ無しドット入り」のNGワードチェック。
本文にスラッシュがあるかチェックして入ってたら「スラッシュ入り」のNGワードチェック。
問題は正規表現と整合性がとれるかなんだが、俺はPerlわからんから予想できん。 とりあえず、仕組みやコードについてアドバイスしたいのなら、
Rock54プロジェクト関連の全ての過去ログに目を通してから語った方が
ええよ。
そうしないと話がループして不毛になるから。
過去ログや関連スレを探すのも2chのプロジェクトに参加するための最低限の
スキルだから、どこにあるか分からないとか言わないでね。 じっけん結果。
RegExpのコンパイルは、あまり効果がなかったみたい。
Benchmark: timing 5 iterations of a, b, c...
a: 46 wallclock secs (42.39 usr + 0.01 sys = 42.40 CPU) @ 0.12/s (n=5)
b: 43 wallclock secs (25.86 usr + 0.03 sys = 25.89 CPU) @ 0.19/s (n=5)
c: 28 wallclock secs (26.54 usr + 0.02 sys = 26.56 CPU) @ 0.19/s (n=5)
s/iter a c b
a 8.48 -- -37% -39%
c 5.31 60% -- -3%
b 5.18 64% 3% --
#!/usr/local/bin/perl
use strict;
# use warnings;
use Jcode;
use Benchmark qw(:all);
########
# めいんるーちん
MAIN:
{
# 主要ファイル名
my $Rock54_PATH = qq|./|;
my $Rock54_List = qq|$Rock54_PATH/Rock54.txt|;
my $Rock54_List2 = qq|$Rock54_PATH/Rock54-1.txt|;
my $Rock54_DAT = qq|$Rock54_PATH/000.txt|;
my $reply = timethese( 5, {
'a' => \&IsKoukoku1,
'b' => \&IsKoukoku2,
'c' => \&IsKoukoku3,
});
cmpthese $reply;
exit; # 従来の方法?
sub IsKoukoku1 {
# bbs.cgi の初めのところみたいところ。
# NGファイルの読み込み
open Rock54, $Rock54_List or die "$!:[$Rock54_List]";
# NG ワード要素を NG ワード、MD5値、フラグの 3 要素だけにしてリファレンスにしてして。
my @Rock_word = map [ (split /<>/)[5,6,7] ] , <Rock54>;
close Rock54;
# 索敵ファイルを読み込み(operate/1064936147.datを利用[820レス/504KB])
open DAT_File, $Rock54_DAT or die $!;
my @DAT = map((split /<>/)[3], <DAT_File>); # 本文だけ抽出。
close DAT_File;
# ここからがIsKoukokuの本体みたいなところ。
# 総レス数(820)を10倍界王拳
foreach my $In_Strings ((@DAT) x 100){
# では NG ワードのチェック。
foreach my $NG_word_ref (@Rock_word){
$In_Strings = jcode->euc($In_Strings , 'sjis', 'z'); # 本文を半角カナ→全角カナ変換。
my $NG_word = jcode->euc($NG_word_ref->[0], 'euc', 'z'); # リファレンスから取り出して半角カナ→全角カナ変換。
if (my $matched = eval{$In_Strings =~ m<$NG_word>}) { last } # 合致したら。。。
elsif ($@) { last } # 不正 NG ワードがあったら。。。
}
}
}
# あらかじめ、カナ変換をしておく。
sub IsKoukoku2{
# bbs.cgi の初めのところみたいところ。
# NGファイルの読み込み
open Rock54, $Rock54_List or die $!;
# NG ワード要素を NG ワード、MD5値、フラグの 3 要素だけにしてリファレンスにしてカナ変換してして。
my @Rock_word =
map [ jcode->euc($_->[0], 'euc', 'z'), $_->[1,2] ],
map [ (split /<>/)[5,6,7] ],
<Rock54>;
close Rock54;
# 索敵ファイルを読み込み(operate/1064936147.datを利用[820レス/504KB])
open DAT_File, $Rock54_DAT or die $!;
my @DAT = map((split /<>/)[3], <DAT_File>); # 本文だけ抽出。
close DAT_File;
# ここからがIsKoukokuの本体みたいなところ。
# 総レス数(820)を10倍界王拳
foreach my $In_Strings ((@DAT) x 100){
# では NG ワードのチェック。
foreach my $NG_word_ref (@Rock_word){
$In_Strings = jcode->euc($In_Strings , 'sjis', 'z'); # 本文を半角カナ→全角カナ変換。
my $NG_word = $NG_word_ref->[0]; # リファレンスから取り出し。
if (my $matched = eval{$In_Strings =~ m<$NG_word>}) { last } # 合致したら。。。
elsif ($@) { last } # 不正 NG ワードがあったら。。。
}
}
}
# あらかじめ、カナ変換してRegExpをコンパイルしておく。
sub IsKoukoku3{
# bbs.cgi の初めのところみたいところ。
# NGファイルの読み込み(RegExpコンパイル済み)
open Rock54, $Rock54_List or die $!;
# NG ワード要素を NG ワード、MD5値、フラグの 3 要素だけにしてリファレンスにしてして。
my @Rock_word =
map [ qr|$_->[0]|, $_->[1,2] ],
map [ jcode->euc($_->[0], 'euc', 'z'), $_->[1,2] ],
map [ (split /<>/)[5,6,7] ],
<Rock54>;
close Rock54;
# 索敵ファイルを読み込み(operate/1064936147.datを利用[820レス/504KB])
open DAT_File, $Rock54_DAT or die $!;
my @DAT = map((split /<>/)[3], <DAT_File>); # 本文だけ抽出。
close DAT_File;
# ここからがIsKoukokuの本体みたいなところ。
# 総レス数(820)を10倍界王拳
foreach my $In_Strings ((@DAT) x 100){
$In_Strings = jcode->euc($In_Strings , 'sjis', 'z'); # 先に、本文を半角カナ→全角カナ変換。
# では NG ワードのチェック。
foreach my $NG_word_ref (@Rock_word){
my $NG_word = $NG_word_ref->[0]; # リファレンスから取り出し。
if (my $matched = eval{$In_Strings =~ m<$NG_word>}) { last } # 合致したら。。。
elsif ($@) { last } # 不正 NG ワードがあったら。。。
}
}
}
}
__END__ ○えんばいろめんと
jcode.plがうまく動かなかったのでJcode.pmで。
$ uname -a
Linux tierra.baila6.jp 2.4.27-0vl7.5 #1 Tue May 17 13:33:27 JST 2005 i686 unknown
$ dmesg | grep Hz
Detected 1050.026 MHz processor.
ide: Assuming 33MHz system bus speed for PIO modes; override with idebus=xx
なキカイで。。。 ということは perl での正規表現のコンパイルは意味がないけれど、
文字列をあらかじめ宣言しておくことは効果があるってことですよね ここで良いのか分からないけど、、、
「スレッドストッパー」が働いたときに、subback.html等に
レス数の増加が反映されないのはどうなんでしょうか?
http://qb5.2ch.net/test/read.cgi/operate/1117803694/l50
↑スレッドストッパーを入れて28だけど、、
http://qb5.2ch.net/operate/subback.html
↑ここでは27となっている。 >>248
スレッドストッパーとか無関係にそうなることがあると思ってたけど。
時々更新をサボるみたいね。しかもいつ更新されるかわからないw >>248
単純に、スレッドストッパーさんはsubject.txtやsubback.htmlの更新、
場合によってはindex.htmlの書き換えといった、
とってもコストのかかる重い処理を、一切やってないってことですね。
そもそも正直、必要性を感じないし。 IsKoukokuの軽量化が急務っぽいので、
やろうと思うです。
ex11とanimeのbbs.cgi船の重さが15倍ぐらい違うのを見たら、
決断せざるを得ないすね。で、これをせめて10倍ぐらいにはしたいなと。
で、すみませんがこれって今どんな状況で、どう進めればいいんでしたっけか。 1) まず 山田関係は全部外す
2) 上限を設定する
3) すべて ShiftJis に変更したものを bbs.cgi で回す >>252
どもです。反応はや。
Perlぜんぜんだめなひと(Cならまぁぼちぼちですが)ですが、
やれることをやってみようかと。
1) 3) は、脳内にあったです。
で、2) は「登録できるデータの上限」を設定するっていうことかしら。 そうですー
せいぜい 200とか
広告爆撃対策だとこれくらいでたりるんでは? (推測) >>254
今、2753行あるみたいです。
中身見てみないとですが、200じゃぜんぜんたりなさげな予感。 で、SJISでやるのと、マッチングするところのコストを下げる(上限とか、場合によってはdbにするとか)のが、
鍵なのかしら。 まったくそうは思っていなかったり、
Rockにたよりすぎですよ
url 以下のは全部外すべきかと 本当は 半角英数字だけだから
マッチングにこまるとは全く思っていないです >>257
> Rockにたよりすぎですよ
ふむ。
ざっと中身見てみましたが、目視で8割ぐらいがURLっぽいかんじですかね。
そうじゃないのは意外に少ないみたい。
あとは、そのURLっぽいのが本当に全部必要なのかとか、
もし必要ならハッシュ入れたりしてそこのコストを下げられないかとか、
そういう話ですか。
で、マッチングは正規表現使ってるですね。
regexpの高速なやつがあれば、相当変わるような予感も。 だいたい 50% を撃退するのに 10円かかるとします。
20円かければ 100% 撃退できる? そんなばかな事はありません。
残り 50% の50%だから 75% ですね、期待できるのは、
さらに 10円かける(都合30円)かけると 87.25% 、
まだ 100% ではありません。
これを 100% にしようとして、1500円くらいかけている段階かしら?
わたしは 30円くらいでいいと思っています。
あとはポリシーの問題化と、
あくまで100%を目指すなら、それもありかと。たんたんとやるだけ。
まずは、EUC→SJISに変えてみるだけで、相当効果ある気がするです。
前にやったプロファイリングの結果では、jcodeが相当重かったような。
もう1回qb6でプロファイリングしてみるです。 登録数を下げる方法としては強制時限消去ってのはどうでしょうか?
例えば登録後、30日でデータベースから強制削除
※システムに負担がかかっているのなら新システムの構築か人的資源の投入のどっちが
いいかってところですね これかな、
%Time ExclSec CumulS #Calls sec/call Csec/c Name
58.1 0.102 0.125 1 0.1016 0.1252 main::IsKoukoku
35.3 0.062 0.055 2853 0.0000 0.0000 jcode::convert
26.8 0.047 0.024 2853 0.0000 0.0000 jcode::euc2euc
22.2 0.039 0.225 1 0.0390 0.2251 main::bbs_entryXXX
13.1 0.023 0.008 2853 0.0000 0.0000 jcode::h2z_euc
13.1 0.023 0.023 10 0.0023 0.0023 LWP::UserAgent::BEGIN
9.12 0.016 0.016 3 0.0052 0.0052 Net::DNS::Packet::dn_comp
9.12 0.016 0.039 2853 0.0000 0.0000 jcode::to
9.12 0.016 0.024 2853 0.0000 0.0000 jcode::euc >>260
同じこと考えてたです。
ETCが米国の同じようなシステムと比べて、バカ高になったのと同じですね。
ポリシーの問題なんで、1500円かける道もあるかと。
まずはできることをやってみて本当は1500円じゃなかったら、
とりあえず問題を先送りはできるのかしら。
>>264
あ、Perlできるやつがきた。 >>267
あ、それそれ。
jcode: がすごいですね。
実はSJISでデータ持たせるだけで、解決すると言ってます? jcode が主な要因っぽいですね。
EUC to SJIS は効果がありそうな予感。 rock word検索毎に毎回jcodeを呼び出してたときのデータじゃなかったっけ? >>271
今も変えてないんではないかしら。
それとも、変わったんだっけ。 で、内部データをSJIS化するには、どういう手順でやればいいのかしら。
丁稚どんの改良が必要?
あと、いわゆる「表」みたいな字の対策も入れる必要があるような予感も。 レスにurl入ってるかどうか調べて、入ってない場合はチェックを一部省略するってやってますか? #################################################################################################
#罠、罠、罠、罠、罠に
#入力:
#IsKoukoku(対象文字列[Shift_JIS],Rock54のファイル名) 現状は無し。sub で定義中。
#返り血ぶしゅー:
#OK ならば 空文字列(偽)
#NG ならば (規制文字列(真)[Shift_JIS], MD5値, フラグ)の配列へのリファレンス
sub IsKoukoku
{
my ($GB) = @_;
my $In_Strings = $GB->{FORM}->{'MESSAGE'}; # shift or return ''; # 入力無しなら (・∀・) カエレ
# 読み込む。。。
my @Rock_word = @FOX_Ro54;
# EUC に変換して半角カナ→全角カナにしてして。
# まず対象となる文字列を変換。
$In_Strings = jcode::euc($In_Strings , 'sjis', 'z');
# NG ワードも変換。ついでに NG ワード、MD5値、フラグの 3 要素だけにしてリファレンスにしてして。
@Rock_word = map { [ (split /<>/)[5,6,7] ] } map { &jcode::euc($_, 'euc', 'z') } @Rock_word;
# では NG ワードのチェック。
foreach my $NG_word_ref (@Rock_word){
my $NG_word = $NG_word_ref->[0]; # リファレンスから NG ワードを取り出す。
eval { $In_Strings =~m<$NG_word> }; # NG ワード自体をチェック。以前の失敗を繰り返さないために。。。
return '' if $@; # 不正 NG ワードがあったときは OK とする。
if ($In_Strings =~m<$NG_word>) { # NG ワードをチェック。
$NG_word_ref->[0] = &jcode::sjis($&, 'euc'); # 該当すれば NG ワードを sjis に戻して。。。
return $NG_word_ref; # リファレンスを返す。
}
}
return '';
}
>>272-273
あ、いや別に今は変わってると言いたいのではなくて
単なる説明のつもりでした。
それより書き込みのURLらしき部分だけ処理してみるとか? >275
この辺ですか?
(5.8以降限定ですけど)
ttp://www.fl.reitaku-u.ac.jp/~schiba/perl/perlEncoding.html#shiftjis ちと、めし落ち。
改めて眺めてみましたが、
>>278 のうち、コード変換部分がなくなるだけでも、相当かもすね。 正規表現を使う必要のあるNGワードって意外と少ない気もするが
Rockだとそうでもないのかな?
固定文字列の検索なら工夫の余地が大きいと思うんだけど map { &jcode::euc($_, 'euc', 'z') } @Rock_word
これは単なる半全角変換だっけ? まずは、>>243 の方法ってのはいかがでしょうか?
>>240 にて、
s/iter a c b
a 8.48 -- -37% -39%
c 5.31 60% -- -3%
b 5.18 64% 3% --
と、対比64%との数値が出ていることですので。。。
IsKoukokuの中で、NGワードファイルのeuc→Shift_JISを行っているものを、
NGワードファイルを読み込んできたときに変換しておくという手法です。
(参照:>>127)
あと、リストのShift_JIS化はかなり躊躇しております。
いかんせん、Shift_JISによる文字化けを回避するために、
登録所ではすべてをeuc-jpで処理をしていることもありまして。
(登録者がエスケープを気にしなくても良いようにとの思いで登録所を作成した経緯もありますのでm(_ _)m深謝)
それからそれから。
NGワードリストの並びですが、以前は、有効期限が長い物順に並べておりましたが、
現在では、BBRからの返りが多い物順に替えてあります。
ので、多少減らしても大丈夫かもしれないです。
しかし、200という数ではかなり漏れが出てしまうかもしれないです。。。
BBRの返りを見ても、最低でも、1500近くは必要かもです。 >>284
ご本尊、こられましたか。
ちと、お風呂入ったりしてからで。 rockリストに変更があったときに、NGワード・MD5値・フラグだけをShiftJIS化したサブセットも作ることにして、それを元にして判定しましょ……ってこと? >>285
自鯖のperl入れ替えであたふたしている最中なのでレスポンスが悪いかもしれないですm(_ _)m
>>286
実は既に、管理用と配布用とで分けてありますです。(配布用は3要素のみ/管理用のファイルの半分の量です) 対象リストに載っているデータを
SJISに直すと共に、べた書きのPerlプログラムに直すスクリプトを作る。
そして、bbs.cgiではこれをソースとして動かす。
SpeedyCGIでコンパイルは10分に1回なんだから無問題。
とか。 ちといろいろ忘れたので復習が寺
各サーバの丁稚どんは原本を定期的に引っ張ってくる
1) 原本ってどこにあるんでしたっけ? bbq.2ch.net ?
2) 原本を出力するときに \t 区切りの Shift Jis にしておけば一番お特?
>>288
いっそうの船が10分に一回では?
ちがうのかな、、 そうだけど
毎回ファイルに載ってる全部を読みながら正規表現のコンパイルをして云々・・・と比べて
1/((呼び出される回数/10分)/プロセス数)・・・見込みで1/10-1/100程度にはなるかと。 さて。
>>284
ということは、6割ぐらいにはなるってかんじですか。
anime サーバで、しこんでみるです。 あ、まずエラーにならないことをqb6で確認するです。 読み込んだときに変換するのは激しく反対。
配布前になされるべきです ふむ。
ということは、各サーバに置かれる時点でSJISもので全角半角もなされたものにすべきと。
つまり、丁稚側でやるべきってことかな。 系の入り口or最終段階で encode , decode が入るのは
当然ですが、途中段階で interpliter がはいるなんてシステムは
激しく反対。
中身は「ただのブツ」意味の無いものであるべきです リストのおおもと EUC
↓
配布用マスター SJIS
↓
各サーバに配布
↓
そのまま利用
っていうふうにすれば、いいような。 そうすれば
改修するところは
1) マスター作り部
2) IsKoukoku内の処理
ということになり、今後の改修もここだけになるッス NG_wordに正規表現使ってないならEUCに変換なんてしないで
index()でいいんだけどな あり得る手段としては、「DATをeuc-jpにする」というのもある香奈♪
それはさておき、、、
となると、かなり大変だよなぁ。。。
●Rock54側でやるべき事。
・配布用リストを変換しておく。
1. 全角カナ→全角カナ+半角カナにしてor設定(ex.がんばる→(が|ガ|(ガ))(ん|ン|ン)(ば|バ|(バ))(る|ル|ル)
2. euc-jp→Shift_JISする際に、誤認をするものにエスケープを施す(「表」とか「ー」とか)
3. euc-jp→Shift_JISにする。
こんな感じかな?
#banana238から追い出されそうな悪寒(苦笑)@負荷増大 >>302
1. って、やらなくてもいいようになるといいなと。
「がんばる」は「がんばる」だけRockできれば、それでいいんじゃないかなと。
で、「ガンバル」もRockしたければ、単にもう1行入れればいいんではと。 >>302
と、書いてみたものの、、、
→1. 全角カナ→全角カナ+半角カナにしてor設定(ex.がんばる→(が|ガ|(ガ))(ん|ン|ン)(ば|バ|(バ))(る|ル|ル)
こんなことしてたら、ますます負荷が「お互いに(Rock54基地でも各鯖でも)」掛かるよなぁ。。。
やっぱりいっそのこと、リストには半角英数記号以外禁止にしちゃおうよ♪ #banana238から追い出されそうな悪寒(苦笑)@負荷増大
この部部が理解できなかったり、
投稿毎に(bananaで 5万/day) 処理していることが
どうして出来ないのかがわからないのだ。 >>304
あ、かぶったですね。
全角と半角をそこまでやらなくても、正規表現パターンが減るだけで、
かなり負荷下がるような予感。 >>303
荒らす人は徹底的に荒らしたいらしいので、もっといろんな描き方をしてくるですです(苦笑)
がんばる
ガんばる
がンばる
:
:
が ん ば る
:
(わはは)
URIとmailアドレスと思しきもの、電話番号と思しきものに限定しちゃって、無差別コピペは別管轄にしちゃうとかとか。 マルチバイト文字非対応でいいなら、それが一番楽そうですね Rock54 はあらし撃退にも使えるけど
広告爆撃対策が本業かと、 >>308
まぁ、>>310 すね。
あとは、正規表現の高速なやつを入れてみるぐらいか。
いずれにせよ、なるはやで>>298にしたいなと思うです。 >>306
banana238さんではRock54以外にもBBXやBBR、別プロセスとなるf22baseや、headline、itadaki、statsが同居していますから、
多少不安があったりもしまして。
単純にbbs処理とは異質なものでもありますし。
>>310
本来の本業に専念した方が、問題を切り分けるのには適しているですよね。
荒らしさんには、専属の特殊部隊を結成してみるとか。 >>308
それはログで実証されていますか?
Rockに限らず「これこれこういう方法で回避できるから無駄だ」とやりもせずに
決めつける人大杉ですが実際に「これこれこういう方法」を使う人は意外と少ないものです。
そして「これこれこういう方法」を実際に使われてくると破綻します(例: 山田) うーん
一所懸命考えたけど、やっぱりわからん
現在は 240万投稿 x 2700 回 変換しているですよね、
それを bbs.cgi 船進水時にやるとして
どれくらいになるかな、10万 x 2700 回くらい?
それを配布元でやれば、データが一日に100回更新されたとして
100 x 2700 回だけで済むようになると思うんだが
何が違うんだろう・・・
>>314
bbs.cgiが動いている鯖での変換「以外」の負荷の掛かり具合がよく判っていないので、
ただ単にbanana238でも大丈夫なのかな?と危惧しているところです。
(bbs.cgiが動いている鯖でのpsやtopコマンドの値は知りうることが出来ませんから)
ひとまず「案ずるより産むが易し」ってことで、変換作業をしているですですm(_ _)m >>315
最終行に、同意っすね。
うむ、うむ。
# ちと、今日はおねむかも。
# ちょっと別のスレで別のじっけんしてくるです。 基地の方では、切り替える準備が出来ました。
>>278 を以下のようにスキーリさせることができるかと♪
#################################################################################################
#罠、罠、罠、罠、罠に
#入力:
#IsKoukoku(対象文字列[Shift_JIS],Rock54のファイル名) 現状は無し。sub で定義中。
#返り血ぶしゅー:
#OK ならば 空文字列(偽)
#NG ならば (規制文字列(真)[Shift_JIS], MD5値, フラグ)のリストへのリファレンス
sub IsKoukoku
{
my ($GB) = @_;
my $In_Strings = $GB->{FORM}->{'MESSAGE'}; # 長いので代入
# 読み込む。。。
# my @Rock_word = @FOX_Ro54; # メモリの無駄なので省略してみました。
# では NG ワードのチェック。
foreach my $NG_word_ref (@FOX_Ro54){
if (my $matched = eval{$In_Strings =~ m<$NG_word_ref->[0]>}) { return $NG_word_ref } # 合致したらリファレンスを返す。
# 不正 NG ワードがあったり引っかからなければスキップ
}
return '';
}
配布が始まりましたら、基地の方でもリスタートを掛けていきますです。
(多少のタイムラグは致し方ないですよね(苦笑)@しばらくは文字コードの違いでスルーされる現象) if (my $matched = eval{$In_Strings =~ m<$NG_word_ref->[0]>}) { return $NG_word_ref } # 合致したらリファレンスを返す。
ここで 500 error になるっす >>318
あ、、、
丁稚どんがそのままなので、全鯖に配布されちゃうです(汗)
ので、qb6用の丁稚どんも用意しましょうか? つまり 正しく動くかどうかじゃなくて
動くかどうかの確認をしたいと、 @qb6 >>320 の行をコメントアウトすると動く(書き込める)です >>320
if (my $matched = eval{$In_Strings =~ m<$NG_word_ref->[0]>}) { return $NG_word_ref } # 合致したらリファレンスを返す。
を、以下の2行に。。。m(_ _)m深謝
my $NG_word = $NG_word_ref->[0]; # リファレンスから取り出し。
if (my $matched = eval{$In_Strings =~ m<$NG_word>}) { return $NG_word_ref } # 合致したらリファレンスを返す。
>>324
そのままですと、全部の鯖にいる丁稚どんを呼び出してしまいますので(汗)
ひとまず基地からはqb6の丁稚どんだけを呼び出すようにしますですです。 >>327
うごいたー @qb6
全サーバに配布していいですか? >>328
→ひとまず基地からはqb6の丁稚どんだけを呼び出すようにしますですです。
スタンバイ出来ました。 ひとまずqb6「だけ」配布完了した模様です。@新ファイル 指示にしたがいますー
まだ全サーバ配布はやってません ちょと様子見しています。
船が自爆しないからかな? qb5.2ch.net<>200 OK<>Sat, 04 Jun 2005 17:34:18 GMT<>236589<>
qb6.2ch.net<>200 OK<>Sat, 04 Jun 2005 17:59:09 GMT<>236544<>
リストは行き渡っています。。。 rockテストやってきて吸い込まれるのは確認しましたがエラーメッセーが出ないですね。 >>336
花が咲くとき以外は、エラー出ないはず。 >>338
× エラー
○ エラーメッセージ
>>337
通常 ただ吸い込まれる
いっぱつもの さくらが咲いてますよ 了解しますた。
さくらが咲くurlはわからないのでそっちの検証は無理ですけど無事に稼働しているよう
です。
あとはコストの削減具合の観察ですね。 BBX チェック(2ちゃんねるで広告爆撃したホストなどが、登録されています。)
La ROCA es la vida.(-_-)
;; ANSWER SECTION (1 record)
227.33.105.220.bbx.2ch.net.2048INTXT"shutouted by BBX: 220.105.33.227"
ひっかかりました(照) >>341
今は、それコメントアウトされてたような。 >>347
配布が終わったら、animeサーバあたりの様子と、
qb6 でのプロファイリングを再度やってみるです。 もしかして、qb6ではIsKoukokuを呼び出しているところが他のとはちょと違うのかな?
・さくらか咲かない。
・BBRが返ってこない。
という症状が現れています。 スルーするかどうかの違いはありますが
他には制御に違いはないようです >>351
了解ですー
とりあえずやっちゃてみます?@全鯖配布 あっ anime が IsKoukoku するーになってる
配布しなおしますー animeサーバの船を爆破しました。
なんか、うそみたいに軽いかも。
一桁数値が低くなった、、、。
PID USERNAME PRI NICE SIZE RES STATE C TIME WCPU CPU COMMAND
22033 ch2anime 96 0 10508K 9796K select 3 0:01 1.03% 0.83% speedy_back
22031 ch2anime 96 0 10740K 9992K select 0 0:01 0.48% 0.39% speedy_back animeサーバ、IsKoukokuが有効になったやつが入ったのを確認しました。
確認中。 いいかんじみたい。
時間帯を比較しないとわからないけど、
やはり、一桁負荷が低くなったようです。
コード変換って、すごく重いのね。 animeサーバ、SJISバージョンに切り替わったようです。 んでは、qb6でプロファイリングしてみるです。
メインのほうではなく、もとの1行目をさわるです。とお知らせ。 わーい。
%dprofpp tmon.out
Total Elapsed Time = 0.773049 Seconds
User+System Time = 0.242963 Seconds
Exclusive Times
%Time ExclSec CumulS #Calls sec/call Csec/c Name
12.7 0.031 0.045 11 0.0028 0.0041 Net::DNS::Resolver::Base::BEGIN
9.47 0.023 0.107 1 0.0234 0.1069 main::bbs_entryXXX
9.47 0.023 0.030 10 0.0023 0.0030 LWP::UserAgent::BEGIN
9.47 0.023 0.041 1 0.0233 0.0411 main::bbs_main
6.59 0.016 0.128 19 0.0008 0.0067 main::BEGIN
6.59 0.016 0.015 1 0.0156 0.0154 LWP::Protocol::implementor
3.29 0.008 0.008 49 0.0002 0.0002 Exporter::import
3.29 0.008 0.008 6 0.0013 0.0013 Exporter::heavy_export
3.29 0.008 0.008 1 0.0078 0.0078 main::initFOX
3.29 0.008 0.008 1 0.0078 0.0078 main::MakeWorkFile
3.29 0.008 0.008 1 0.0078 0.0078 vars::BEGIN
3.29 0.008 0.008 4 0.0019 0.0019 HTTP::Response::BEGIN
3.29 0.008 0.060 6 0.0013 0.0101 Net::DNS::Resolver::BEGIN
3.29 0.008 0.007 6 0.0013 0.0012 CGI::BEGIN
3.29 0.008 0.008 1 0.0078 0.0077 BSDPAN::Override::import で、>>362 は元に戻しました。
>>26 と比較すると、効果は明白ですね。
コストが 1/10 以下になったんではないかと。 >26と>363の簡単な比較データ(何故か円換算)
>26のコスト 14330円
>363のコスト 118円
※ここまで下がれば大成功ですね。 1/10と言っても1が0.1になったというよりは10が1になったような感じだけど 最初、計測したときにIsKoukokuスルーされてるんじゃないかと、心配になりました。
でも、そんなことはないみたいです。 ちょっと、ヤバ目の不具合発見
rockに引っかかった時に本来ならばrockワード以外は書けるはずなのに全く書けなく
なってます。
(引っかかった以降全て吸い込まれて書けない)
ケーブルでこれ出ちゃうと該当回線が書けなくなって巻き添えが大量に出てしまいます。
(既に引っかかってるところも出てます。) >369
多分、>368で巻き添えが大量に出ているかも
改善するまでqb6以外は元に戻した方がいいかも # では NG ワードのチェック。
foreach my $NG_word_ref (@FOX_Ro54)
{
my $NG_word = $NG_word_ref->[0]; # リファレンスから取り出し。
if (my $matched = eval{$In_Strings =~ m<$NG_word>}) { return $NG
_word_ref } # 合致したらリファレンスを返す。
# 不正 NG ワードがあったり引っかからなければスキップ
}
return '';
ここが、いまいちな予感。 で、直ったら、
BBXの登録アドレスを1回クリーンアップしないと、いけなそうっすね。
そのへんは、ぼちぼちと。 直し方待ちで。
なんか、本文内にNGワードがなくてもNGワードがあったことにされているみたい。 # NG ワードも変換。ついでに NG ワード、MD5値、フラグの 3 要素だけにしてリファレンスにしてして。
@Rock_word = map { [ (split /<>/)[5,6,7] ] } map { &jcode::euc($_, 'euc', 'z') } @Rock_word;
この部分が抜けていました、、、(汗)
でもってこの部分は出航の時だけで桶のはずなので、、、
# Rock54リストを読みこむ
open Rock54_List, "ファイルの場所";
@FOX_Ro54 = map { [ (split /<>/)[5,6,7] ] } <Rock54_List>;
close Rock54_List;
のように入れてもらえればー スルー版配布完 10min まつ
qb6 だけ on にします >>382
おじさんの間違いを防ぐために、もう1度サブルーチン全体をばさっと貼りましょー。 open(ADFILE,"内緒");
@FOX_Ro54 = <ADFILE>;
close(ADFILE);
現在の読み込み部 open(ADFILE,"内緒");
#@FOX_Ro54 = <ADFILE>;
@FOX_Ro54 = map { [ (split /<>/)[5,6,7] ] } <ADFILE>;
close(ADFILE);
にしてみた @qb6 >>382 >>387
…ということは、これで OK なのかしら。 >>386
open(ADFILE,"内緒");
@FOX_Ro54 = map { [ (split /<>/)[5,6,7] ] } <ADFILE>; # ここで変換
close(ADFILE);
ですー
あー、このあたりもスキーリさせれば良かったのか、、、orz... さっき、qb6でテストしましたけどまだ吸い込まれてます。 >>390
ということは、
・いったん BBX の IP アドレスリストをクリアする
・このバージョンを配布する
・ようすをみる
でいいのかな。 落着いて待ってます…
=≡= ∧_∧
/ (・∀・ )
〆 ┌ | | .∈≡∋
|| γ ⌒ヽヽコノ ||
|| .| |:::|∪〓 ||
./|\人 _.ノノ _||_. /|\ >>392
> ・いったん BBX の IP アドレスリストをクリアする
を、やってきます。 で、
> ・このバージョンを配布する
お願いします。>FOXさん また書けなくなりそうのでキャップ使うか
>402
クリアした状態でもう一度テストしてきます。
(わざとrockされてからの通常書き込み) >402
rockした後で正常に書き込みは出来ましたけど一発サクラになってます。
(IP変えた後なのにrockワード書いただけで吸い込まれた) テストして報告してるのが漏れしかいないので更にテスター募集
運用情報(金)で改善版動いているのでよろしくお願いします。 >>405
ん?
またいつぞやのように「未承諾広告は氏ね」とかけばええのか? 募集したらテストしてもらっているようです。
※テスターの人へ
不具合報告等はこちらまで 現在、glist / klist とも、初期化した状態です。>未承諾広告さん、ALL さくら、非さくら、BBR共に正常に取れていますですです。
(吸い込み動作も確認取れました。)
BBX チェック(2ちゃんねるで広告爆撃したホストなどが、登録されています。)
La ROCA es la vida.(-_-)
;; ANSWER SECTION (1 record)
48.33.105.220.bbx.2ch.net.2048INTXT"shutouted by BBX: 220.105.33.48"
Monazilla/1.00 MAKA/1.0b DNS側、正常に見えます。
異常なパケットの増加等、観測されていません。
DB登録部分も正常。 >>413
# ./main/bbxdump.pl -kC | grep 220.105.33.48
220.105.33.48 Sat Jun 4 13:03:16 2005 で、今 220.105.33.48 を bbxdel しておきました。 >>415
お、お、お大事にです(汗)
>>416
NG ワード履歴。
履歴。[総数 5]
トラップ日時 IPアドレス フラグ サブスクライバ 鯖名/板/
2005/06/05/(日) 05:03:16 220.105.33.48 Normal none http://qb6.2ch.net/operate2/
2005/06/05/(日) 05:02:53 220.105.33.48 Normal none http://qb6.2ch.net/operate2/
2005/06/05/(日) 05:02:44 220.105.33.48 Normal none http://qb6.2ch.net/operate2/
2005/06/05/(日) 05:02:34 220.105.33.48 Normal none http://qb6.2ch.net/operate2/
2005/06/05/(日) 05:00:48 220.105.33.48 Normal none http://qb6.2ch.net/operate2/
桶みたいですよね♪
>>418
よさげですね。
しばらく観察するです。
>>415
お帰りをお待ちしております。 上手いこと動いてる悪寒。qb6
IP繋ぎなおしても動作正常に見えました。
Monazilla/1.00Hotzonu/2.0 >>420
# ./main/bbxdump.pl -kC | grep 219.98.185.135
219.98.185.135 Sat Jun 4 13:10:03 2005
これも、これから消しておきます。 で、Rock54で登録されたIPアドレスのリストをいったんクリアしたので、
一時的に広告貼られるかもですが、
業者さんが自ら貼ろうとしていくことにより、
時間を追って、正常に戻っていくかと。 暫し観測ってところでしょうか。
何だかモヤモヤしていたのがすっきりとした感じです。
みなさんありがとうございましたですですm(_ _)m深謝
何だか、次の目標みたいなのが見え隠れしてきたような♪ 落ち着いたら、再度 bbs.cgi をプロファイリングしてみるです。@ qb6 順調に(普通のペースで) klist が増えていっているようなので、
問題なさげですね。
Rock54システム側は、どんなかんじかしら。>未承諾広告さん これでようやく一段落かな
作業してくれた人、乙でした〜〜〜
※もし直せる人が寝た状態だったら恐ろしいことになってた悪寒
(報告によると公式p2はおろか携帯も巻き添えが及んでいたらしいです。) >>429
おおむね順調です。
細かいところの修正点などは仮眠を取ってからにしようかと(苦笑) 了解です。>>431
で、今のままだと統計見るのに影響があるので、
今日のはずかしい記録(wを、これから消しておくです。>未承諾さん
http://mumumu.mu/mrtg/mrtg-rrd.cgi/bbqbbx/bbr.html >>430
デリファレンス出来ない状態でしたので、
eval{$In_Strings =~ m<>}
となっていて何もかも捕獲される状態になっていましたから、、、(汗) さっきのは、ちゃんと通ってなかったっぽいです。
こんどのは、それっぽいです。
確実に、コストは下がってるですね。
%dprofpp tmon.out
Total Elapsed Time = 0.599639 Seconds
User+System Time = 0.302764 Seconds
Exclusive Times
%Time ExclSec CumulS #Calls sec/call Csec/c Name
12.8 0.039 0.039 1 0.0391 0.0391 main::initFOX
10.2 0.031 0.031 1 0.0312 0.0312 main::IsKoukoku
10.2 0.031 0.125 1 0.0312 0.1251 main::bbs_entryXXX
7.60 0.023 0.128 19 0.0012 0.0067 main::BEGIN
5.28 0.016 0.023 10 0.0016 0.0023 LWP::UserAgent::BEGIN
4.95 0.015 0.059 1 0.0155 0.0592 main::bbs_main
4.95 0.015 0.037 11 0.0014 0.0034 Net::DNS::Resolver::Base::BEGIN
2.64 0.008 0.008 1 0.0078 0.0078 Carp::shortmess
2.64 0.008 0.008 5 0.0016 0.0016 DynaLoader::dl_load_file
2.64 0.008 0.008 49 0.0002 0.0002 Exporter::import
2.64 0.008 0.008 8 0.0010 0.0010 Net::HTTP::Methods::my_readline
2.64 0.008 0.008 4 0.0020 0.0019 Net::DNS::Header::new
2.64 0.008 0.008 3 0.0026 0.0026 HTTP::Message::content
2.64 0.008 0.008 1 0.0078 0.0077 Fh::BEGIN
2.64 0.008 0.008 4 0.0019 0.0019 HTTP::Response::BEGIN >>434
>>26 と比較すると、目視で 1/4 ぐらいにはなったのかな。
かなり、いいかんじだと思われ。 で、
@FOX_Ro54 = <ADFILE> ;
を、
@FOX_Ro54 = map { [ (split /<>/)[5,6,7] ] } <ADFILE>;
にした分、initFOX のコストが少し上がったと。
でも、全体のコストは下がったと、そんなかんじか。 …でも、initFOX は上のほうにもあるように、船が出港する時しか通らないから、
全体としては、大幅にコスト下がってるですね。
1回目で 1/4 ということは(>>434-435)、
常駐型なら、ほんとに 1/10 にはなっている気がするです。
というわけで、関係した方々、おつでした。
これで、某サーバのスレ保持数を 700 でキープできるといいなと。
(ちょっと、500にするのは負けっぽいなと) 現時点でIskoukokuスルーになっている鯖は? 4時頃にいきなり公式p2でdat取得済みのスレのスレタイのみが文字化けしてしまったのもこれが原因でしょうか?
ちなみに面白news板でdat取得済みのスレに起こった不具合のようですが
この場合、一旦ログを削除してdatを再取得しなければ直りませんかね? >>438
live16 live20 live21
ex9 ex10 ex11
tmp5
>>439
違うような気がするです。 >>440
コストが減った事でその鯖群に戻す予定はないの? >>441
live16 20 21 ex11 は、私は戻す気ないです。
他は、状況を見ながらかなと。 >>436
その部分
外部に出せないかな?
と本気で思う root▲ ★ さん、明け方まで乙でした。
いつも運営ありがとうございます。
どうぞお体にお気をつけて・・・。 >>308
$blacklist{$allunID} += 1 if ($chatMsg =~ /[Mm][Oo][Rr][Ee]/);
$blacklist{$allunID} += 1 if ($chatMsg =~ /[Mm][Oo][Nn][Ee][Yy]/);
$blacklist{$allunID} += 1 if ($chatMsg =~ /[Pp][LlIi][SsZz]/);
$blacklist{$allunID} += 2 if ($chatMsg =~ /[Pp][LlIi][EeSsZz][SsZz]/);
$blacklist{$allunID} += 5 if ($chatMsg =~ /[Pp][LlIi][EeSsZz][SsZz][SsZz]/);
$blacklist{$allunID} += 10 if ($chatMsg =~ /[Pp][LlIi][EeSsZz][SsZz][SsZz][SsZz][SsZz]/);
(chat)荒らしくたばれ(謎 >>440-443
試しに負荷試験やってみれば?
すぐ止められる状況じゃないとだめだろうけど。 >>447
今日は日曜(負荷高い日)なんで、時間とれたらコソーリやるかも。 1時間ばかり前から、ex9 ex10 の IsKoukoku 有効にしてみた。 現在2chで使用されているPerlは5.6より前のものなんですか? いろいろじゃないかなぁ
version 意識したことはないっす
banana601(etc3)
This is perl, v5.6.1 built for i386-freebsd
5.6以上なのであれば、
文字コードの変換にはXSのJcodeが使えたのでは。
PurePerlのjcode.plよりは負荷も少ないと思われますが。 >>450
banana - FreeBSD 5.2.1R/5.3R - Perl 5.6.1/5.8.5
tiger - FreeBSD 5.3R/5.4R - Perl 5.8.5/5.8.6
cobra - FreeBSD 5.4R - Perl 5.8.6
>>452
Jcodeは前に頼まれて、全サーバに入れてあるです。 そうでしたか。失礼。
上のソースを見たところ&jcode::*となっていたので
てっきりjcode.plを使っているものかと思いこんでいました。 >>454
jcode.pl 「も」使っているようですよ。
何せ、つぎはぎのソースなんで。
昨年のSpeedyCGI対応の時、
おじさんががんがってきれいにしてくれたので、前よりは「読もうかなぁ」という気にはなるですけど。 と言うと、大本の開発陣は運営側には回ってはいないのでしょうか。
このスレッドをみる限り、リアルタイムで、
それも高頻度でソースの書き換えが行われている様ですが
不特定多数が半端な理解で改造チックな改変を繰り返していると
いずれ対応出来なくなる可能性もあるのでは。
せめて構文チェックくらいはサーバに上げる前に:P まぁ今ちゃんと動いてるんだし、書き直ししなくてもとりあえずは問題ないんじゃない? なんか偉そうなこと言っちゃいましたが
まあ、なんだ、その。頑張って下さい。( ̄∀ ̄)
私も一Perlerとしてこのスレッドに貢献出来るよう
身勝手ながら努めさせていただきます。
では。よい夜を。 >>444
リファレンスをファイルに書き出してそれを配布して、、、読み込んでも使えないよね?@やってみたけれどもやっぱりダメだった。
でも、わざわざcsv形式にするよか、リファレンスにした方がsplitしないぶん楽になれるかなぁと。
>>453
Jcodeも0.88から2.00に一気に変わったので、要チェックかもです♪@Encodeのwrapperに
>>455
.plと.pmをごちゃ混ぜにするとまずいかもです。。。
.pmは下位互換があるので、.plは外した方がよいかも。。。
require './jcode.pl';
の行で読み込んでいます。
>>456
use strict;
use warnings;
を入れて、あにさんを悩ましてみたい衝動はいつもありますwwwWwww
>>462
よろしくですですm(_ _)m深謝
# Shift_JIS にしたことで、4,50個ほどエラーが出ているもよりです(苦笑)@NGワード JcodeがEncodeのラッパーになるのは5.8.1から。
というかPerl5.8.2を入れて
use encoding
use Encode qw/encode decoge/
した方がJcodeより速い希ガス ふと思いついたんだけど、過去の突発的な荒らしなどに対して、bbs.cgiに細工をして対処をしたことがあったと思うんだけど、
もう不要な処理については削除すれば、軽くなったりしないのかな。
思いついたもの
1.レスアンカーを付けまくる嵐が出たから、レスアンカーの数を制限した
2.一部の広告荒らしに対し、自動的にそのURLを消去し、名前をfusianaにする
bbs.cgiの朗読会を開こう
1行目から読んでいって
「この規制なんで入れたんだっけ?」
「あ、あの祭りのときだ」
「もういらないよね」
「じゃあ外そう」 おつdeath death。。
直感的レスを発動させます。
>>311 >正規表現の高速なやつを入れてみるぐらいか。
対象 : IsKoukoku 10.2
>>452-455 >>464 >jcode.pl をはずす。
対象 : 全体 弱い
>>465 >というかPerl5.8.2を入れて use encoding use Encode qw/encode decoge/
対象 : 全体 強い
>>468 >bbs.cgiの朗読会
対象 : main::BEGIN ? 7.60
>>434
UserAgent::BEGIN 5.28 もIsKousokuみたいなことになってるかもと”予測”。 UserAgent::BEGIN は関係なかったです。 IsKoukoku の eval を外してみて計測してみるとかいかがでしょう。 Shift JIS で起こる問題は、
バイトに変換して末尾が5Cの文字は、
エスケープする必要があるということです。
リストのメンテナンスがめんどくさくなる。
対策として、
euc-jp だったリストを unicode にして、
initFOX で変換してみる。
unicode の配列を Shift JIS に変換 # こっちのほうが変換が早いかもしれない。
euc-jp の配列を Shift JIS に変換 # 以前
Shift JIS の CSV型.txt(エスケープに問題がある) を読み込む # 現在 >>472
それはencodingプラグマで解決出来ませんでしょうか?
@IsKoukokuネタ
過去ログにあったアイデアなのですが、正規表現を一つにまとめてみるのはどうでしょう。
例:
use warnings "uninitialized"; #リストが空の時の警告回避
$Ro=qr/@{["(".join(")|(", map {$_->[0]} @FOX_Ro54).")"]}/o;
...
過去ログ内の話によると、やや効果があったようです。
よろしかったらお試ししあれ。
(チェックしてませんが。) >>464
Shift_JISがどの段階でエラーを起こしているのか分からないが、
ファイルの読み込みの段階なら、Shift_JIS1文字にマッチする正規表現を
使って切り分ければ良いし、(エンコードよりはコストが安いはず)、正規表現の段階なら
Shift_JIS文字列だけquotemetaすれば良いし、Perlスクリプト内の埋め込み文字列に問題があるなら、
chop($a = <<'EOF')
aaaa
EOF
でOK。 >>476
正規表現の所でえらー
アルファベットだけの所で巻き添えも出やすくなりそう > 正規表現の段階なら
> Shift_JIS文字列だけquotemetaすれば良いし、 >>477
NGワード内って正規表現交じりですか?そうでないならばっさりquotemetaすれば良いし、
Shift_JIS部分だけquotemetaするコードくらいなら書きますよ。
あと、済んだことだけど、
# 読み込む。。。
# my @Rock_word = @FOX_Ro54; # メモリの無駄なので省略してみました。
こういう場合は参照使えばメモリ食わないんではないかと。
性能には一切貢献しないと思うけど、
my $In_Strings = $GB->{FORM}->{'MESSAGE'}; # 長いので代入
こういうのも
my $In_Strings = \$GB->{FORM}->{'MESSAGE'}; # 長いので代入
こうして$$In_Stringsで使った方が若干メモリ(と文字列コピーにかかるコスト)はお徳。
もう一点。eval使ってるのは正規表現エラー回避のトラップでしょうか?
コケるような正規表現が混じってる可能性があるなら、
>>474
の策は、@FOX_Ro54に1つでも不備があると全部のチェックがコケますね。
NGワードに正規表現が一切ないという仮定なら、事前に@FOX_Ro54の中身を
丸ごとquotemetaすれば、正規表現でコケないはずなのでevalは外せるのでは。 > Shift_JIS部分だけquotemetaするコードくらいなら書きますよ。
とか言うほどの事じゃなかった。むしろテストの方が大変だった。
必要な作業だったのかどうか謎だけど一応上げておきます。
perl5.00503でテスト。
(票表十){2}
とか問題ありそうなShift_JIS + 正規表現交じりでやってみたけどOKでした。
foreach my $NG_word_ref (@FOX_Ro54){
my $NG_word = $NG_word_ref->[0]; # エスケープしたままじゃ他で使えないのでコピー
next unless $NG_word; # 空文字列ならスキップ
$NG_word =~ s/((?:[\x81-\x9F\xE0-\xFC][\x40-\x7E\x80-\xFC])+)/quotemeta($1)/geo;
if (my $matched = eval{$In_Strings =~ m<$NG_word>}) { return $NG_word_ref } # 合致したらリファレンスを返す。
# 不正 NG ワードがあったり引っかからなければスキップ
}
○チェック文字列1 - (票表十){2}
○チェック文字列2 - 十予約表
○In_Strings - ああ票表十票表十予約表いい
■裸の場合。
> /([\){2}/: unmatched [] in regexp at ./check.pl line 22.
> /\驅/: trailing \ in regexp at ./check.pl line 22.
■正規表現を噛ませた場合
> found.
> found.
リストは、正規表現文字列が連なっております。
例えば。
(\.|.|/|/)(3|3|4|4|6|6|8|8|9|9 ...長いので省略。
↓Shift_JISですと、こうなります。
Unmatched ( in regex; marked by <-- HERE in m/( <-- HERE .|.|/|/)(3|3|4|4|6|6|8|8|9|9 ...長いので省略。
/が、バけていますよね♪([/] = 0x815E)
→こういう場合は参照使えばメモリ食わないんではないかと。
それ以前に、IsKoukokuでしか利用されていませんので、そのまま利用しました。
リファレンスにしろグローバルを触っちゃいますし。
→こうして$$In_Stringsで使った方が若干メモリ(と文字列コピーにかかるコスト)はお徳。
でもって、こう書いちゃうと中の人が呑み屋さんに繰り出しちゃう恐れがあるので避けていたりもしますです(w
→もう一点。eval使ってるのは正規表現エラー回避のトラップでしょうか?
ですです。
発行元でもチェックを行っていますが、以前と同じ失敗(すべてRockされる)を繰り返さないようにと、あえてそのようにしてあります。 >>481
その文字列でチェックしてみたんですが、
5.00503ではエラー起きませんね。省略部分に何かあるんではないでしょうか?
> (\.|.|/|/)(3|3|4|4|6|6|8|8|9|9
これの8ビット目が立ってるバイトを「#」に置き換えると↓こんな感じです。
(.|#D|/|#^)(3|#R|4|#S|6|#U|8|#W|9|#X
「^」は一応メタキャラですが文頭にないので素通りのようです。最後、括弧が閉じてないので
勝手に閉じ括弧付けて実験しました。
もし全文か、他のお題があればこっちでチェックしますよ。
でもこの手のエラーはおそらく>>480のコードで全部解決するんじゃないかと思います。
参照とevalに関しては了解です。 evalってコスト高いんじゃ……?と思ったのでベンチ取ってみた。
@FOX_Ro54が2048個のチェックを1000回。
Benchmark: timing 1000 iterations of with_eval, with_noeval...
with_eval: 159 wallclock secs (158.80 usr + 0.02 sys = 158.82 CPU) @ 6.30/s (n=1000)
with_noeval: 155 wallclock secs (154.28 usr + 0.05 sys = 154.33 CPU) @ 6.48/s (n=1000)
誤差の範囲内なので、運用上の安全を考えると現状維持で良いと思った。>>480のコードのベンチも取ってみた。
ついでにJcode.pmで双方ともEUCに変換した時の結果も。
Benchmark: timing 1000 iterations of with_jcode, with_noreg, with_reg...
with_jcode: 493 wallclock secs (490.95 usr + 0.07 sys = 491.02 CPU) @ 2.04/s (n=1000)
with_noreg: 124 wallclock secs (123.99 usr + 0.04 sys = 124.03 CPU) @ 8.06/s (n=1000)
with_reg: 159 wallclock secs (158.80 usr + 0.02 sys = 158.82 CPU) @ 6.30/s (n=1000)
割と予想通りの結果。落としどころとしては悪くないんでは。>Shift_JISのquotemeta
"Rock54_List"ファイルにquotemetaしたものを突っ込んでおくというのもアリだけど、目視やエディタでの編集ができなくなります。
IsKoukokuでしか使わないのなら、Rock54読み込み時に先にquotemetaしとくってのはアリかも知れません。 >>483
エロエロとありがとうですm(_ _)m深謝
ただ、、、今、家にあるメインの林檎機が昇天されましたので、対応が出来ないで居ますですぅぅぅ(滂沱)
♪実はすべての作業を林檎機でやっているものでして・・・ quotemetaを使わずに
s/(?<=[\x81-\x9F\xE0-\xFC])[\[\\\]\^\{\|\}]/\\$&/g
とかでも(やってることはあんまり違わないか) >>485
それだとエラーが出ますね。例えば、
"ワ[a]"
だと「ワ」は2バイト目も8bitが立っているので検索がスキップされますよね。
で、2バイト目と3バイト目の組み合わせをShift_JISの「充」と間違えて開き角括弧
「 [ 」をエスケープしてしまいます。 もしかしてこうすればいいのか?(未テスト)
s/([\x81-\x9F\xE0-\xFC])([\[\\\]\^\{\|\}\x81-\x9F\xE0-\xFC])/$1\\$2/g >>488
30秒考えた限りでは問題なさそう。ただ、ベンチ取った結果、quotemetaとほとんど
コスト同じなんだよね。2、3回やってみたけど誤差前後1秒以内。
with_reg1: 146 wallclock secs (144.33 usr + 0.05 sys = 144.38 CPU) @ 6.93/s (n=1000)
with_reg2: 145 wallclock secs (144.18 usr + 0.05 sys = 144.23 CPU) @ 6.93/s (n=1000)
となるとquotemetaの方が安全かなとは思う(自分贔屓ですんません)。 >>489
はやさの問題ではなくて気分の問題だったり.
>quotemetaの方が安全かなとは思う
同意w >>483ナイスゥ
中の人が呑み屋さんに繰り出しちゃわないようにまとめてみます。
Shift_JIS の場合、エスケープする必要あり。
エスケープしておくと、リストの編集がはげしくめんどい。
解決方法
1、encodingプラグマでエンコードする
2、Shift_JIS文字列だけquotemetaする (エンコードよりはコストが安いはず)
後者のほうが処理コストが安い。 >>484
ご愁傷さまです。早い復活を祈ってます。
>>480
あと若干ソースを変更。空文字チェックは直前の方がより安全ってのと、evalの結果の代入は
必要ないかと。
foreach my $NG_word_ref (@FOX_Ro54){
my $NG_word = $NG_word_ref->[0]; # エスケープしたままじゃ他で使えないのでコピー
$NG_word =~ s/((?:[\x81-\x9F\xE0-\xFC][\x40-\x7E\x80-\xFC])+)/quotemeta($1)/geo;
next unless $NG_word; # 空文字列ならスキップ
eval{$main::In_Strings =~ /$NG_word/} and return $NG_word_ref; # 合致したらリファレンスを返す。
# 不正 NG ワードがあったり引っかからなければスキップ
} × eval{$main::In_Strings =~ /$NG_word/} and return $NG_word_ref; # 合致したらリファレンスを返す。
○ eval{$In_Strings =~ /$NG_word/} and return $NG_word_ref; # 合致したらリファレンスを返す。
失礼。 えっと、エスケープ処理は基地側で執り行おうと思っておりますので、IsKoukokuはそのままで桶になるかと♪ >>494
お疲れ様です。とりあえず、
next unless $NG_word; # 空文字列ならスキップ
これはevalの直前に入れた方がいいと思うです。evalと同じくfail safeってことで。
極端な話、use strictしてないんだったら、quotemetaをtypoしただけで
NG_wordが全部空文字列(投稿が全部エラー)になるわけで。 s/([\x81-\x9F\xE0-\xFC][\x40-\x7E\x80-\xFC])(?<!\\[^$\$\(\)\*\+\-\.\?\[\|\]\^\{\|\}])/quotemeta $1/ego;
が、今のところいー感じです♪ >>497
が、今のところいー感じです♪→×
が、今のところいー感じです♪@基地内での実験 >>498
んでは、エスケープされたリストを配布する段取りをしてみるです。
不具合が出たらでたで。。。 >>499
エスケープされたリストを配布してみました。
何かあるようでしたら何かしらのレスポンスよろしこですですm(_ _)m klistに不具合がでていたその要因がわかりました。
IsKoukouの中にある、、、
if (my $matched = eval{$In_Strings =~ m<$NG_word>}) { return $NG_word_ref } # 合致したらリファレンスを返す。
を、、、
if (my $matched = eval{$In_Strings =~ m<$NG_word>}) { $NG_word_ref->[0] = $&; return $NG_word_ref; } # 合致したらNGワード部分の摘出とリファレンスを返す。
のように$&を返すようにしていただけるとありがたいですm(_ _)m 【Project peko】2ch特化型サーバ・ロケーション構築作戦 Part18
http://qb5.2ch.net/test/read.cgi/operate/1115133136/741 より
741 名前:root▲ ★[sage] 投稿日:2005/06/12(日) 17:17:42 ID:???0 BE:3831067-##
bbs.cgi 暴走対策として、RLimitCPU を 10 から 5 に変更。
どうも、スレ立てに暴走へと繋がる爆弾がひそんでいるような気がするですね。
だそうですが。 今は subject.txt や index.html の更新時にロックしてないらしいので,
競合した時に意図せぬ動作につながっている,とかも考えられなくもないですね.
subject.txt のレス数について,単純にインクリメントするだけだとずれてくので
dat 中のレス数を毎回数え直さないといけないってのも,ロックしてない故の
競合によって起きてるような気もします.
で,対策ですが,まず考えられるのはきちんとロックするということですね.
それ以外の方法としては,message queue を利用して,bbs.cgi からは
subject.txt 等の更新要求を mq に放り込んで,別途走らせておく
更新用デーモンが mq から要求を取り出して処理する,って感じでしょうか.
mq を利用する方法なら,ロックしなくても処理がシリアライズされますし,
その更新用デーモンを C で書いて subject の並べ替えを例えば mmap() して
memmove() するような処理にすれば,今の Perl の処理よりも軽くできると思います. >>501
BBS.CGI - 2005/06/13 移動しました。
>>499-500
なるほど、これですか(今頃気づくやつ)。
さて、まずは原因をつかまないと。 さて、どうも配布用DBがこわれてるっぽいと。
で、配布用DBを作っているやつがおかしくなったらしいと。
質問・雑談スレ174@運用情報板
http://qb5.2ch.net/test/read.cgi/operate/1118562549/625-646 >>501
if (my $matched = eval{$In_Strings =~ m<$NG_word> ? return $& : return undef}) {
$NG_word_ref->[0] = $matched; return $NG_word_ref
} # 合致したらNGワード部分の摘出とリファレンスを返す。
もしかするとこうかもしれませんですm(_ _)m深謝 >>509
訂正前に送信しちゃってごめんなさいです。
if (my $matched = eval{ return $In_Strings =~ m<$NG_word> ? $& : undef }) {
$NG_word_ref->[0] = $matched; return $NG_word_ref
} # 合致したらNGワード部分の摘出とリファレンスを返す。
ですm(_ _)m深謝 >>510 を qb6 に入れて試して、エラーがなかったら配布するです。 if (my $matched = eval{ return $In_Strings =~ m<$NG_word> ? $& : undef }) {
$NG_word_ref->[0] = $matched; return $NG_word_ref;
} # 合致したらNGワード部分の摘出とリファレンスを返す。
これを配布しました。 >>512
今のところ無事そうですよね。。。
よかた・・・(泪) 名前欄に山崎渉が入ってるとfusianaになる機能とか、
そんな感じのいろんな過去の遺物を取り払ったら負荷が減ったりしないかな >>514
塵も積もれば(りゃ ってかんじですか。
また暇を見てプロファイリングしてみて、重いところを重点的に、
ってかんじですかね。 ちなみに某京ぽんから「む山崎渉」って名前欄に入れているので、
この機能なくなると、ちょっと困っちゃったりして(w。 だったら
fusianasanでリモホ表示を無くし、
もっと簡単な文字でリモホ表示ができるようになれば良いじゃないか、とか思った。
誰も使わんような文字とかで、被害が出ない程度に。 >>518
> fusianasanでリモホ表示を無くし、
それをやった場合、
・メリット = もしかしたら軽くなるかもしれないが、不明
・デメリット = もしかしたら何が起きるか、不明
最低限でもメリットがデメリットを下回らないことが確実であることが
開発の条件だと思うです。 >>518
・デメリット = たくさん考えられたフューザネイザン等のコピペが意味を成さなくなる。 >>520
それは過去の遺物として残ったりして良いんじゃないのかな・・・? Perlのできない私が(りゃ。
とりあえず、LAとれそうなことはわかった。
#! /usr/local/bin/perl
use strict;
sub mumumuGetLA
{
use Sys::CpuLoad;
my ($GB) = @_;
my @load;
@load = Sys::CpuLoad::load();
$GB->{LOADAVG} = $load[0];
}
my $GBX = {};
$GBX->{LOADAVG} = 0.0;
mumumuGetLA($GBX);
print $GBX->{LOADAVG}, "\n";
exit 0; #! /usr/local/bin/perl
use strict;
sub mumumuGetMaxLA
{
my ($GB) = @_;
my $servertype = "";
if($servertype = /cobra/) { $GB->{MAXLOADAVG} = 30.0; } # cobra
elsif($servertype = /tiger/) { $GB->{MAXLOADAVG} = 20.0; } # tiger
elsif($servertype = /banana/) { $GB->{MAXLOADAVG} = 4.0; } # banana
else { $GB->{MAXLOADAVG} = 4.0; } # unknown
}
sub mumumuGetServerType
{
use Sys::Hostname;
my $hostname = "";
$hostname = hostname();
if($hostname =~ /cobra/ ||
$hostname =~ /oyster/) { return "cobra"; }
elsif($hostname =~ /tiger/) { return "tiger"; }
elsif($hostname =~ /banana/) { return "banana"; }
else { return "unknown"; }
}
# main
my $GBX = {};
$GBX->{MAXLOADAVG} = 0.0;
&mumumuGetMaxLA($GBX);
print $GBX->{MAXLOADAVG}, "\n";
exit 0; こんな感じか。
サーバタイプとってくるところは、外出ししといたほうがよさそうだから、
ちょっと冗長だけど、こうしておこう。
#! /usr/local/bin/perl
use strict;
sub mumumuGetMaxLA
{
my ($GB) = @_;
my $servertype = "";
$servertype = &mumumuGetServerType;
if($servertype =~ /cobra/) { $GB->{MAXLOADAVG} = 30.0; } # cobra
elsif($servertype =~ /tiger/) { $GB->{MAXLOADAVG} = 20.0; } # tiger
elsif($servertype =~ /banana/) { $GB->{MAXLOADAVG} = 4.0; } # banana
else { $GB->{MAXLOADAVG} = 4.0; } # unknown
}
sub mumumuGetServerType
{
use Sys::Hostname;
my $hostname = "";
$hostname = hostname();
if($hostname =~ /cobra/ ||
$hostname =~ /oyster/) { return "cobra"; }
elsif($hostname =~ /tiger/) { return "tiger"; }
elsif($hostname =~ /banana/) { return "banana"; }
else { return "unknown"; }
}
# main
my $GBX = {};
$GBX->{MAXLOADAVG} = 0.0;
&mumumuGetMaxLA($GBX);
print $GBX->{MAXLOADAVG}, "\n";
exit 0; >>525
乙です。
全体に言えることなんだけど、$GBみたいなグローバル変数的な参照変数を
あちこちの関数で持ちまわるよりも、関数はLoadAve. だけ返すようにして、
呼び出し元で明示的に$GB->[MAXLOADAVG]などに格納してやる方が
トレースはしやすいかと思います。
&mumumuGetMaxLA($GBX);
だと、$GBXのどこをどういじられたのか見当つかないわけでして、
$GBX->[MAXLOADAVG] = &mumumuGetMaxLA();
の方が明示的かな、と。それから
if($servertype =~ /cobra/) { $GB->{MAXLOADAVG} = 30.0; } # cobra
elsif($servertype =~ /tiger/) { $GB->{MAXLOADAVG} = 20.0; } # tiger
elsif($servertype =~ /banana/) { $GB->{MAXLOADAVG} = 4.0; } # banana
else { $GB->{MAXLOADAVG} = 4.0; } # unknown
おせっかいだとは思うんだけど、こういう書き方はタイプミスで泣きやすいです。
連想配列のキーの場合、綴りが間違っていてもwarningが出ないので。
perl5であることが前提だけど、理想的には$GBのようなものは用途別に分けて
それぞれblessしてやって、getMaxLAのような関連関数はパッケージに全部突っ込んで、
new関数でイニシャル時にガツガツ値を入れていく方がすっきりするとは思うんだけど、
1から作り直しになるやね。んでもそろそろClassの概念を入れる時期には来てるかと。あと
mumumuGetMaxLA
mumumuGetServerType
mumumuGetLA
こういう命名規則に頼るならpackage宣言しちゃった方が早いんではないかと思います。 MAXLOADAVGは1回だけ調べればいいので、ぐろーばるー(FOX)のほうに入れよう。 >>526
うわあ。ありがとうです。
Perlって、ぜんぜんやったことないんですよ。
shで暮らしていたので。 >>528
つか、場合によってはshでも十分でしょう・・・ >>528
Perlの前はawk使いだったのでshは苦手ですw
参加できるのか分からないけど、できることがあればやりますよ。言い出しっぺの法則ですし。
全体のソースは見てないのですが、グローバル変数をあちこちに引きずる方式で
拡張を続けるといずれ破綻するような気がします。 $FOX->{MAXLOADAVG} = &mumumuGetMaxLA();
にしました。
これは、船が出港する時に1回だけ実行。
で、$GB->{LOADAVG} (こっちは毎回調査)と $FOX->{MAXLOADAVG} を比較して、
$GB->{LOADAVG} 以上だったら、特殊処理っていうかんじで。 で、
$GBX->{LOADAVG} = &mumumuGetLA();
にした。
確かにこのほうが、わかりやすいですね。 で、mumumuMaxLACheckを作った。
sub mumumuMaxLACheck
{
my ($GB) = @_;
if($GB->{LOADAVG} ge $FOX->{MAXLOADAVG}) { return 1; }
else { return 0; }
}
これで、処理部分からこれを呼んでチェック。 基本的に、$FOX が船が出航する時に1度だけ作られて、
$GB が船に乗る客ごとに作られているようです。
何せ、ドキュメントも仕様書も何にもないので(そういうもんらしいです)、
ソースからおじさんの心を、読み取っていくしかないわけで。 >>533
> if($GB->{LOADAVG} ge $FOX->{MAXLOADAVG}) { return 1; }
数値比較なら
if($GB->{LOADAVG} >= $FOX->{MAXLOADAVG}) { return 1; }
にしないとマズいんではないかと。
>>534
なるほど。ソースは基本的に非公開なんでしょうか? >>535
そうなんですか(何も知らないのです)。
変えておきます。
>>534
ひ(りゃ の方針により、全面公開することは控えています。
広告チェック部分とか、公開できるところは公開していますです。 geだと文字列比較になるね。(>=が一般の数字比較)
例えば、$aaaが'100'、$bbbが'25' だとしたら、
($aaa >= $bbb) は真になる(100のほうが25より大きい)けど、
($aaa ge $bbb) は偽になっちゃう。('1'より'2'のほうが辞書で後に出てくる) >>537
直したです。
というか、私がいじるようじゃ、まずいんですよ。(す)
BBS.CGI - 2005/06/17 >>536
というより、クリティカルなところは公表しないほうが無難かと >>539
むろんひ(りゃ の「公開しない」は、そういう方針からですね。 >>538
│_A
│・−・) ふふふ。。。(無表情で
↓ ⊂) >>543
あ、プログラミングをしたさそうな人が。 >>530
…下2行は、確かにそうですね。
というかこの問題は、なかなかに難しい(テクニカルにじゃなくて)のかもなと。 >>545
グローバル変数はまだ使い慣れてないので、
頃合いの勘が働かないです。
たった数ファイルなのに「どこで定義されているんだー!」状態です。
>>546
まみらですよ。 >>545
経験上、一度拡散したグローバルスコープな変数や関数は収拾するのが大変だし、
それで破綻しちゃったシステムもたくさん見てるので……。
スコープを意識せず書かれたソースコードは、全体を見渡さないと構造が把握できないように
なっているものが多く、ソースコードの総量が1人の人間が把握しきれる量を超えた時点で
誰も理解できない代物になってしまい、保守が不可能に→破綻となっちゃったりするわけです。
>>547
グローバルスコープな書き方の欠点がまさにそれですよね。てことは、グローバル変数は
実装上止むを得ず使ってるんでしょうか? >>548
携帯用c.2chのphpを解読中でーす。 >>550
ん?私の事ですか?
人員を増やしても良いと思ってはいます。 >>551
人員増やすなら立候補したいんだけど、その場合どうればいい?
携帯は経験浅いが、Perlなら10年以上Webプログラムとして書いてる。 >>553
Web自体はもっと前からあったけど、Mosaicの普及で一気に火がついた頃です。
>>554
大きくは裏切らないと思う。 KヨNTさんとかRes9ueとかですよねぇ。。。@グロ引きずりまわして破綻
この辺の改造依頼は基本的には断っていたりしてして(苦笑)
さてと、そろそろ林檎機がくるのでまずは基地の修繕かなぁ。。。
(SweepさんとBBRさんがごきげんななめ@coreをエレエレ中) >>556
上がってないと専用ブラウザでも見れないっすね……。
>>557
お疲れです。
いや、Webに限っては大手企業でも結構そういう事があるんですよこれが。
まあ自分で蒔いた種なんですが、保守しきれなくなったプログラマが夜逃げとか。
……で、今その夜逃げしたプログラマが書いたとされるWebプログラムの再構築を
やってたりしますw
あとフリーウェアの開発が途中で止まっちゃって、かといってソースコードも開示しないって
事例が多いのもそういうのが原因だったりすることが多いんじゃないかな。 >>558
再構築おつです。
人の書いたPerlの保守って、Cとかと比較してもなんか相当大変みたいですね。
(「みたい」っていうのは、感覚では理解しているが単に自分が体験していないってことです)
本業方面の知り合いのところに約10年近く「つぎはぎんぐ」されてきた
約37,000行のPerlとかありますが、もう、すごい状態みたいです。
ブログにも少し書きましたが、もう「神の領域」ってやつらしく。
そのPerlは主に書いたやつ(二人)が現役だそうで、
今でもきちんとメンテされてるみたいですが、
その二人がいなくなると(以下略。 >>559
> 約37,000行のPerlとかありますが、もう、すごい状態みたいです。
・・・・・・・・・すげぇ>その知り合い ・LAが基準値以上なら、IsKoukokuを船が死ぬまでスルーにした。
・animeサーバは、subject.txt/subback.htmlさぼりを発動させるレベルを
他のtigerサーバよりやや低めにした(基準値に対する率が違う) >>559
> 人の書いたPerlの保守って、Cとかと比較してもなんか相当大変みたいですね。
CはCで大変だと思うけどね。C書く人ってPerlに比べてトリッキーなコード好む人多いし。
> 約37,000行のPerlとかありますが、もう、すごい状態みたいです。
すごいっちゃーすごいけど、その前になんとかならなかったのかなあ……。
しかし今目の前にある「破綻しちゃった」大量のコードを読んでると、多分どうにもならなかったんだろうなあ
という空気が伝わってきたり。
>>561
乙です。ここじゃスレ違いだとは思うんだけど、Apacheのセッションタイムアウトって
やたら長いけどこれ攻撃に使われたりしない?あるいはブラウザの誤動作でゾンビコネクションで
MAX_CONNECTが埋まっちゃったりとか。
さっきqb5.2ch.netに繋いだまま放置プレイ食らわせたら7分50秒も回線あけて待っててくれたよ。 >>562
>C書く人ってPerlに比べてトリッキーなコード好む人多いし。
いやいや、一行でいかに複雑なコードをかけるか競ってるのなんてPerlだけですし。 │_A
│・−・) なんかローカルルールのリンク変更をしても、
↓ ⊂) livenhkのindex.htmlがちっとも更新されないんだけど(head.txtは更新されてる)
LAが高い時にindex.htmlも更新されないようになってますか?
(この時間のlive16のLAはそんなに高くない気もするけど)
ちなみにdomeも微妙にしばらくindexが更新されてなかったっす。 >>561
LA見て制御変えるの実装されてるのか。
なら、Sambaの時間をLAに応じて可変にできないかなあ >>565
これ?
http://qb5.2ch.net/test/read.cgi/operate/1103495887/843
843 :FOX ★ [sage] :2005/03/23(水) 03:46:03 ID:???0
index.html subback.html の更新をたまにサボるようにした。
subject.txt は従来どおり更新してます
対象サーバ
ex10 live20 live16 live15 >>567
│_A
│・−・) うん、、まぁ、本当はそのルーチンを流用してると思うんだけど、
↓ ⊂) subback.htmlとsubject.txtって書いてあるし、
なんかLAがそんなに高くなさそうなのにそうなったのが気になって、 >>568
subject.txtは更新されてるみたいだったから>>567は生きてるんじゃないかと思った
どういう基準でサボるんでしたっけ、これ? >>568
>>567 ということですね。はい。
私はそこの部分に、LAが高い時という処理を「追加」したので、
>>567 はやはり生きているです。
>>562
セッションタイムアウトについては、peko作戦スレでやりますか。 で、subject.txt / subback.html ではなく index.html / subback.html なので、
bbs.cgi の私が書いたコメントを直しておいたです。
なにせ、Perl も bbs.cgi も、未知の世界がたくさん。 │_A
│・−・) あれ、>>567が原因ってことっすか?
↓ ⊂) いちおう言っておくと、昨日は22:30になっても、index.htmlが22:01ころのままずっと変化なしだったのね、、
その間に700レスくらいついてたはずだけど、index.htmlは更新されてなかったと。。
で、それ全部が>>567起因とは考えにくいので追加したが効いてるのかなぁ、、と。
でもその時間のlive16のLAが、1.0以上な様子もなかったので。 >>440-443
tmp5のIskoukokuですが
戻す予定はないのでしょうか
板の性質上(というと語弊があるかな?)
どうしても大量になりがちなので、、
まだ、様子見筒という
段階でしょうか? live系は、pidをある一定数で割った余りが0の時だけindex.html/subback.htmlを書き換える、
という実装になっているようです。
>>573
わたし的にはシステム負荷以外に特に止めておく理由はないので、
今夜あたりに復活してみるかも。 tmp5のIsKoukokuを復活しました。
山田ウイルスを撃退した、おじさんに感謝で。 >>575
│_A
│;・−・) 了解いたしました、pidが10で割り切れるとき、ですか、、
↓ ⊂) なんか更新される時はとことん更新されなくなるのね、、
秒数がint(LA+1)とかで割り切れたとき、とかそんな感じのほうがいいような気がするけど、、まぁいいか、、
>>576
感謝感謝。。 >>577
なるほど。
でもLAは所詮リアルタイムじゃないんで、
こっち(index.html / subback.html)は、あまりこれではやりたくなかったり。
(そもそもlive20等はIsKoukokuチェックなし) そういえばやっているかもでしょうけど、
スレ立てやdat落ちのタイミングとindex/subback更新を同期にできませんかね?
・sageなしスレ立てまたはdat落ちがあったらindex/subback更新
・sageスレ立てしたらsubbackのみ更新
・sageレス投稿時に更新しない
スレ立てはふつうに同期になっているはず。
sageレス投稿時更新しないというのは、cha2でやってるんでしたっけか。
dat落ちは別の人(f22)がやっているからなぁ。 同じ●で1時間あたりに1サーバに立てられる最大スレッド数を制限できる機能を
qb6のbbs.cgiに実装してみたんですが、これって需要ありますかね。
主に、●でのスレ立て荒らし対策の一つになるかなと。
ちなみに、★(φ ★含む)とIsKoukokuを切っている状態
(live系/ex11や負荷が高い時)の場合、この処理はスキップ。
スレ立てでも●じゃない時や、スレ立てじゃない時は従来通り。 最大数は可変ですが、とりあえずデフォルトは10(1時間に10個まで立てられる)ぐらいかしら。 おじさんと若者へ(馴れ合いごめん):
・Sambaのアレと同じ場所にカウントのファイルを作るです。
・ファイル名に使うときに、/ は _ に変えているです。
・先頭に "." つけているので、あれを数えているところには影響しないはずです。 鯖単位だよね? 10個どころか5個くらいでもあんまり困る人はいないような。
そもそもスレってそんなに短時間にたくさん立てるもんじゃないと思うですよ。
荒らし以外で1時間に5本以上同一鯖内でスレが立てられなくて困る人なんて
●を使ってスレ立て代行をやっている人くらいしか思いつかない。★はスルー
だから記者とかは関係ないわけだし。 例えば、●荒らしが横行しているらしい(あまり確認していないのでよくわかりません)
news だけ5個にするとかも技術的にはできなくはないわけですが、さて。
れふぃさんとかの意見が、聞きたいかも。 N速のスレ立て魔ですけど、ここ見ると傾向がわかると思います。
(最近、建てている傾向)
時間当たりのスレ立て数制限はある程度効果があると思いますがそれだと今度は制限
いっぱい建ててまた次の時間帯に建てるとかやってきそうなので何処まで効果があるか
疑問です。
やっぱり地道に●停止が一番効果があると思います。
●による荒らし報告専用スレッド8
http://qb5.2ch.net/test/read.cgi/sec2chd/1114660322/580- 10個で困る人はー、まずいないと思いますー。
まー、荒らす人は10本立てていくでしょうけどー。
けど、あんまし細かい数字まで出さない方がいいと思いますー。
その制限いっぱいで立てようとするはずですからー。
そいで毎日、せっせと立てて増やして保守するかなーと。 >>587-588
まぁ、負荷はそれほどでもないし、とりあえずやってみて考えますか。
今のやつを配ります。 >589
了解しました。
多分、殴り込みがある可能性が高いのでそれだけは覚悟した方がいいですよ(苦笑 >>590
殴り込みですか。
とりあえず、管理人はこう↓言っているのと、
スレッドの「立てやすさ(TATESUGI値に対する)」は変わらないわけで、
まずは、実験かなと。
http://qb5.2ch.net/test/read.cgi/sec2chd/1118208864/85
85 名前: [―{}@{}@{}-] ひろゆき@どうやら管理人 ★[] 投稿日:2005/06/08(水) 16:24:41 ID:??? ?###
書き込みの機能は、●の価格の対価ではないので、
自由に止められるわけで、
お金の問題とは無関係です。 携帯のID生成と同じルーチンを使って●IDからID精製できないかな?
これだと●+串の組み合わせでもIDが固定になるような気がするんだけど。 ●をタネにIDを作るというアイディアですか。>>594
ちと、微妙かも。あんまり魅力を感じないような。 >>595
IDに●を使っているという証拠をしこめればいいんとちゃいますか?
0:PC
O:携帯
m:●PC
M:●携帯
という封に。 駄目っすか?
規制議論板でよく●+串で荒らしてるって報告がよく来るんですけど、(実際はいろんな人がスレたてたりレスしたりしてる)
そういう主張で報告しにくる方々の動きを止めれるかなあと。
>>597
そういうのよく見るんで、とりあえずリミッター入れてみたと。
今見る限りでは、あんまり文句出てなさげで。
設定値は、機を見てぼちぼち調整してみようかなと。 噂を信じちゃいけないよ〜♪
規制情報板の報告を実際に食べてみて
自分で実態を感じ取ってすすめた方が良いと思います。
かくいうわたしも噂を流している張本人ですが、
噂であらしが止まるのだ !!
うっひっひ >>600
果実をもっと食わないとだめですか。
おじさんが戻ってくるまでの「鬼の井沼」だと思っていたんですが、、、。
今回のはここ見て、なんかなぁと思って、入れてみたです。
↓
●による荒らし報告専用スレッド8
http://qb5.2ch.net/test/read.cgi/sec2chd/1114660322/ >>602
そのスレで●からのあらしを探すのは至難の業だったりします。 >>603
…みたいですね。(それも読んだです)
というか今回のターゲットは主にnews板と、●+p2(= 讃岐荒らし)なわけで。
普段見ない >>602 のスレをついふらふらと見てしまって、
newsの●でのスレ立て荒らしってすごいんだなぁとか、ついふと思っちゃったわけで。
(newsの●でのスレ立ては、ご存知のように明らかにそれとわかるようになっている)
そう思っちゃった時点で、既にかなりの割合で「負けている」わけなんですが(なんかねぇ)。
今は「ふと思いついて、使えそうな道具を作ってみた」状態ってってかんじですかね。 作るのは一向に構わないというか、みんな大歓迎かと。
いざというときの武器ですし、
newsでやっているのはほんの一握りで、またnews板はほっておけば
どんどん落ちるくらいのパワーがあるです。
一番気にかけなきゃならないのは 投稿数で300位以下の板たち
2ちゃんねるで一番重要な板たちと思っています。
ほんの小さな爆撃でも壊滅します。
たとえば、スレ潰しが実況板であったとしてもたいした被害ではないです。
それを跳ね返すだけのパワーを持っています。 >>605
なるほど、第三段落は非常に重要ですね。
私は「大きい板」のサーバについ目が行きがちなのですが(そんなことばかりしているし)、
そういった「普通の板」「相対的に小さな板」こそ手厚くすべきというのには、同意します。
そういえば、Rock54やSamba24を作るきっかけになったのも、
そのへんの板のためだったような(特にRock54)。
news4vipとか、Rock54がなくても、場合によってはSamba24すらなくても、
板としては機能するわけで(何をもって「機能」とするかは議論の対象外で)。 だらだらと、案を書いておいたり。
「さる」と「かに」でしたっけ。
「さる」 = サルのように1回覚えたことを何度も何度も繰り返す = 1スレにどかどか爆撃
「かに」 = カニのように横歩きで多数のスレを荒らしたり(かにA)、スレ立て爆撃をしたりする(かにB)
●での「かにB」行為についてはある程度歯止めができたわけですが、
「さる」と「かにA」にも、おんなじようなことするのは、ありやなしや。
「さる」「かにA」に対して何かするとすれば、
1時間にレスできる数とか言う実装になるのかしら、やっぱ。
とすると例えば、
・●での1レス = 1ポイント
・●でのスレ立て = 15ポイント
とかにして、1時間で例えば150ポイントまで使えるようにするとか、そんな実装なのかしらね。 比率はあくまで「仮定」なので、考え方だけです。>>607
そもそもほんとにやるのかどうかも、よくわからないし。 で、個人的な意見を書いておくと、>>607 みたいなのは、
今の bbs.cgi 側ではあんまりやりたくないかもですね。
フロント側(例えば公式p2とか)で実装するのは、面白いかもしれないですけど。 そのあらしが起こっている頻度が重要かと、
「2ちゃんねるが大変になるほど起っていない」といサンコンかと思っとります。
つまりほとんどあらされていない!! あと、何かをやるとメリット(目的の達成)を得られる代わりに
デメリット(失われるもの)も当然付いてきます。
Rockで URL だけに絞っていたりするのもそれが理由だったり、 >>610
ふむ。
「困っているものから手をつける」ってことですか。
ここ関連はまた何か、思いついたらってかんじで。 >>611
そですね。
メリットとデメリットを秤にかけて、考えるってかんじで。
例えば Rock の処理はご存知のように相当重いわけですが、
あれは「重くてもやる必要がある」から、やっているってことですね。
で、その必要がないとか相対的に薄いところは、
そういうところを手抜いたりすると。
例えば正直、今のnews4vipに業者ががんがって広告をどんどんぶち込んだとしても
「業者クオリティタカス」とか何とか言って、遊びの対象になるだけだったり(適当な推測)。 同じIPアドレスだと、同じ日には同じIDが出る、というのは、ほんとなのかどうなのか。 違うのですか?
種が同じでホストも同じならIDも同じになるとしか思えないのですが。 質雑見て気がついた。
今は種が違うから違う月の同じ日では同じにならないのではなかったでしょうか。 >>616 が正しいと思っているわけだけど、
ほんとにそうなのかどうか。 sports2は、どうも常に同じIDが出るみたいですね。
例えば公式p2とか、毎日同じだとか、なんとか。 sport2鯖は放置されているから。
質問者の方が背景を詳しく説明してくれなかったら状況はよくわかりません。
1ヶ月の時間をいただけるのなら実験してもいいですが、ソースを覗いた方が早いと思いますよ。(;^ ^
オイオイ!●規制直せよ!鯖強化に貢献しているんだろ!(#゚Д゚)ゴルァ!! >>624
スレを一時間に10っこいじょうたてるのですか(汁 newsの自治スレにおじゃましてきました。
>>626
今、newsは4ですね。5つ目でひっかかると。
で、この値はもっと適切な値があれば、変更できるです。 >>628
いまのところ、まだ超実験中なので、まだいらないっす。
たぶんほとんどの板は安全側に振った一定値にしておけばよくって、
2、3の特殊な板だけ別途特別な値を設定するかんじになると思っているので、
たぶん、ほとんど設定変更の必要もないかなと。 >>584
あの、別に今のままでもそんなに問題無いんだけど
初心者板http://etc3.2ch.net/qa/って立ってるスレのほとんどが糞スレで
実際機能してるスレってあんまり無い状況です
一番消費してる『もの凄い勢いで誰かが質問に答えるスレ』は
住人が少なくなる時間だとスレ立てれる人がいなくなることがあって
しばらく待ってる間に人がいなくなるのを防ぐために、
一辺に大量にスレを立てておくことがあるんだけど
それをやるのに初心者板の規制解除して欲しいのだけれども駄目ですか?
この板はスレ立て荒らしされても迷惑する人いないと思うのだけど スレがものすごい勢いで立ってるVIPとかは
逆にログインしない方がスレ立てしやすかったりして
>>630
住人が少ないのに消費が早いってのはどうなんだろ 別のことの副産物だったりするのですが、BBS_SLIP=checkedな板で、
AIR-EDGE PHONEからだと"H"と表示っていうのが出ると、うれしい人っているのかしら。
(今この機能はオフになっています)
ほんとは"O"にしたいところなんですが、
携帯で言う固有番号みたいなのって送ってくるんでしたっけ。 >>633-634
そですか。
んじゃ、取り扱いの都合上、O にはできないですね。
かと言って、ちょっと 0 なのはいまいちなのですよね。いろいろと。
で、識別子そのものはつけておきたかったりするわけですが、
H でいいのかしら。 ダブルクォートはちと特殊な文字だから、ちょっといやん。
W = WILLCOMですか。
メーカー名由来は、ちと微妙かも。 つか何をもってAIR-EDGE PHONEと判定するわけ? IPアドレス?
AIR-EDGE PHONEて、センター以外の一般ISPに繋ぐことが出来るんだが。 >>643
> AIR-EDGE PHONEて、センター以外の一般ISPに繋ぐことが出来るんだが。
知ってるですよ。京ぽんユーザなんで。
その時は当然PCと判断されるわけですが、
味ぽんや京ぽんのブラウザはリファラ吐いてくれないから、ここには書けないっすね。 PCと、はちと不適切ですね。
「携帯でも公式p2でもない」と判断されるってことです。 端末がAIR-EDGE PHONEであることの判別ではなく
アクセス元のIPがAIR-EDGE PHONEセンターであるという判別ですね >>647
ですね。
で、>>632 の第2段落を再確認したわけで。
ということで、>>641 を採用するです。 えーと、そのセンターにH"以外からも接続出来るのですか?
#やり方を教えろというわけではありません。 荒らしの出自判別がしやすくなるですね。>>651
>>650
わからないです。
もしそういうことができて、それを利用した荒らし行為が多く出回ったら、
AIR-EDGE PHONEからの書き込みは全面的に(りゃ にするしかないかと。 >>652
特殊な例(出来る出来ないはおいといて)を除き、o=H" という解釈でOKですね? AIR-EDGE PHONEセンター経由ってことですね。
もしそうなってなかった場合、
ここで報告いただけると助かるです。 >>645
京ポンのブラウザはリファラ吐きますよ。
UAがOperaじゃなくても。 まあ、単純なprin一括規制から脱皮する可能性があるなら応援してもよさげ>識別 PCからでも、AIR-EDGEで(というかH"のPIAFSでも?)PRINで接続したらIPは同じになるのでは? P2がPなんだからHでもいいやんと思うのは俺だけ?
o→激しくダサい >>652
携帯の識別の場合PCとは規制方法が違うので意味があるというのはわかるんだけど
AIR-EDGE PHONEとPCって規制方法って違ったりするの?
(単なるISPの違いとの区別がよくわかってなかったり。) パピコ記念のテスト
Mozilla/3.0(DDIPOCKET;JRC/AH-J3001V,AH-J3002V/1.0/0100/c50)CNF/2.0 そりゃUA違うしな
Monazilla/1.00 kage/0.99.1.1153 (1000) おぉ、そですか。
であれば、味ぽんを切ってしまえば、この特殊処理しなくていいのね。
でも奥様が味ぽんのうちは、絶対そんなことできないわけで。 >>657
ならないですよ
PCからはAIR-EDGEPHONEセンターへはAIR-EDGEPHONE接続経由でも
接続できません
AIR-EDGEPHONE単体専用です きたくで。
>>659
今は prin.ne.jp が規制されれば、出自に関係なく巻き添えですね。
それ(規制の方法論)も含めてよりうまくできる道はあるのか、
あるいは実は携帯荒らしみたいに京ぽん荒らしがいたりするのかとか、
そういうことを、知っておきたいわけで。 >>640
エッジって濁点じゃなかったっけ
>>667
>>663 >>668
確かにそうかもですね。
というか、公式p2以外のものをサービス名やメーカー名にバインドした名前にするのは
やはりいまいちだなと、>>641 を読んでおもたわけです。
これまでもIだったのがaになったり、
JだったのがVになったり、ことによるとVからYにさらに変わる(これはないか)
とかいうことは、常にあるわけで。 >>669
ほほう。
/25 のところのチェックを、きちんと実装しないといかんかもですね。
今は(もともとbbs.cgiがそうだったように)、まじめにやってないです。 テストはテストスレで
名前欄にはなるべくtasukeruyoで というわけで、あるIPアドレスがあるCIDRブロックに入っているかを、
Perlでうまく調べる方法って、どうすればいいのかしら。
具体的にはあるIPアドレスが、61.204.3.0/25 に入っているかいないかを
さくっとコール一発で、調べたいわけです。 http://ex10.2ch.net/test/read.cgi/morningcoffee/1119539572/47
>47 :ZC******.ppp.dion.ne.jp :2005/06/24(金) 00:33:59 o
>ふしあなしてみた
これはなにですか >>674
ふむ。
もうちょっと、調べてみるです。 prinとdionは同じ施設使ってるですよ
ソースはwhois 続報
58 47 2005/06/24(金) 00:36:43 0
繋ぎ直したらでなくなったみたい
だそうです ははぁ、虫ですね。
つまり、もともと虫がいたと。
(判別部分のアルゴリズムは、前のバージョンと変えていません)
221.119.26.185 が、221.119.2 にマッチしちゃってるわけね。
なんだかなぁ。 質雑のFAQ修正はこんな感じですか。
Q.IDの後ろに付いてる0とかOとかPとかoってなに?
A.書込み手段を区別する目印です。
PC等が 0 (ゼロ) 、携帯が O (大文字のオー)、 P は公式p2( http://p2.2ch.net/ )
それ以外(Air H"等)が o (小文字のオー)からです。
荒らし対策の一環として、一部の板に便宜上導入されています。 >>679
携帯が O (大文字のオー)、 公式p2( http://p2.2ch.net/ )が P、
AIR-EDGE PHONEが o (小文字のオー)、
それ以外が 0 (ゼロ)です。
が、正しいです。 とりあえず、IR-EDGEPHONEセンターとPRINは
課金条件とかが違うから名前を変えているけれど
中身は同じなんじゃないかと。だからIPも同じになると。
憶測なんだけど。
でもAPの電話番号は違うんだよね
Mozilla/5.0 (Macintosh; U; PPC Mac OS X; ja-jp) AppleWebKit/312.1 (KHTML, like Gecko) Safari/312 >>673
ttp://search.cpan.org/~mrsam/Net-CIDR-0.10/CIDR.pm
これのNet::CIDR::cidrlookupでよさげ >>680
それは一瞬考えたんですが、今の目的(荒らしの出自判定)からは、
その必要ないと思っているです。
なんでかというと「xxのキャリアからの荒らしだ」ということは規制方法論的には全く
区別していなくて、いずれの携帯キャリアも全く同じ方法で、規制しているからですね。
もしが「auだけ特殊な規制処理」とか「DoCoMoだけ特殊な規制処理」とかしているんであれば、
区別する意味はあるわけですけど。 で、今入っている o 判定ルーチンにはバグがあるです。
(もともとあったのが、今回判明した)。
ということで今出る o は、必ずしも正確なものではないです。
めしくったら、ちと直してみるか。 うむ。
末尾「o」はいい感じですね。
それよりも、root氏って京ぽなー?? >>683
どもです。すばらしい。
さくっと入れてもらう必要ありですね。
これ入れると規制方面では応用範囲が広そうですね。
いいかんじかなと。 >>686
…です。
というわけで、ぼちぼちおかずがテーブルに並び始めた模様。 ではこんな感じで。(種別の並びをあわせてみました)
Q.IDの後ろに付いてるOとかPとかoとか0ってなに?
A.書込み手段を区別する目印です。
携帯が O (大文字のオー)、 公式p2( http://p2.2ch.net/ )が P、
AIR-EDGE PHONEが o (小文字のオー)、
それ以外が 0 (ゼロ)です。
荒らし対策の一環として、一部の板に便宜上導入されています。 Oと0の分け方は大雑把なのに、AIR-EDGE PHONEセンター経由だけ識別されるのは、ちょっといやーかもです。
0→Oへ分類変えされるならいいけど。
AIR-EDGE PHONEセンターからの荒しって多いんですか?
>>689
いいかんじ。
>>690
それも含めて、現状を知りたいなと。< 荒らしが多いかどうか
で、端末固有情報が来るなら、Oでも問題ないわけですが、、、。 >>683
http://search.cpan.org/dist/Net-CIDR-Lite/
こっちのほうが、軽くて速いらしいです。
とりあえず、試してみるか。
今の o 表示は、これからとりあえずいったんオフにするです。 >>692
そのようですね
おいらもNet::CIDRを試してみて重いと感じたから
Liteも試してみて、軽くて速いからLiteにしるって書きにきたとこです >>695
どもです。
軽いといってもちょっとコストのかかりそうな処理なので、
SpeedyCGIの特性を生かして、$cidr->add() は出航時の1回だけにしました。
こうしておけば、重い初期化と登録は1回だけで済むはずかなと。
こんなかんじで。$FOX は出航時に初期化して使う一連のグローバル変数群。
use Net::CIDR::Lite;
$FOX->{AIREDGECIDR} = Net::CIDR::Lite->new;
# IPアドレスブロック一覧(CIDR形式)
# アドレスレンジが追加された場合、ここに加えていく
# http://www.willcom-inc.com/p_s/products/airh_phone/ip.html
my @airedgecidr = (
"61.198.142.0/24",
"61.198.249.0/24", "61.198.250.0/24",
"61.198.253.0/24", "61.198.254.0/24", "61.198.255.0/24",
"61.204.0.0/24",
"61.204.3.0/25",
"61.204.4.0/24",
"61.204.6.0/25",
"210.168.246.0/24", "210.168.247.0/24",
"211.18.235.0/24",
"211.18.238.0/24", "211.18.239.0/24",
"219.108.0.0/24", "219.108.1.0/24", "219.108.2.0/24", "219.108.3.0/24",
"219.108.4.0/24", "219.108.5.0/24", "219.108.6.0/24", "219.108.7.0/24",
"221.119.0.0/24", "221.119.1.0/24", "221.119.2.0/24", "221.119.3.0/24",
"221.119.4.0/24", "221.119.5.0/24", "221.119.6.0/24", "221.119.7.0/24",
"221.119.8.0/24", "221.119.9.0/24" );
# CIDRリストをあらかじめ登録しておく
# こうしておくことで、重い初期化はbbs.cgi出航時の1回で済む
for (my $i = 0; $i < @airedgecidr; $i++)
{
$FOX->{AIREDGECIDR}->add($airedgecidr[$i]);
} で、チェック用サブルーチンはこんなふう。
#############################################################################
# AIR-EDGE PHONEセンターのIPアドレスかどうかチェックする
#############################################################################
sub mumumuIsIP4AirEdgePhone
{
my ($raddr) = @_;
# CIDRリストに該当があるかどうかチェックする
$FOX->{AIREDGECIDR}->find($raddr);
} こうだった。
#############################################################################
# AIR-EDGE PHONEセンターのIPアドレスかどうかチェックする
#############################################################################
sub mumumuIsIP4AirEdgePhone
{
my ($raddr) = @_;
# CIDRリストに該当があるかどうかチェックする
return $FOX->{AIREDGECIDR}->find($raddr);
} >>696
NetCIDRは、配列の参照受け取ったりはしないの?
まあ、数十回のコピーならさしてコストかかんないだろうけど。
# CIDRリストをあらかじめ登録しておく
# こうしておくことで、重い初期化はbbs.cgi出航時の1回で済む
for (my $i = 0; $i < @airedgecidr; $i++)
{
$FOX->{AIREDGECIDR}->add($airedgecidr[$i]);
}
↓の方がPerl的かも。処理速度は殆ど変わらんと思うけど。
foreach my $cidr (@airedgecidr){
$FOX->{AIREDGECIDR}->add($cidr);
}
>>697-698
Perlの世界では暗黙に最後の評価値がretrurn値になるので、
どっちでもOKですよ。前者の記法を好む人も多い。
こちらは完全に好みの問題だけど。
しかしこれ関数化する意味あるの?@FOXが呼び出し元のスコープにないとか? >>696-699
乙です
ちなみに>>697と>>698は等価です
もちろん明示的にreturnした方が読みやすいのでbetterですけどね >>700
下の3行のほうがよさげですね。それにしてみるです。
(そのへんの作法にくわしくなかったりします)
で、SpeedyCGI 化している今の bbs.cgi では、
出航時に1回しか設定しないところ(SETTING.TXT / 広告チェック用リスト / ローカルルール等)は、
まとめて一発関数呼んで(initFOX)、そこでやっているです。
で、上記は、initFOX内に追加したと。 >>705
できるだけ「おじさんのインデント」とか「おじさんの書き方」に合わせるようには、
しているわけです。サブルーチンやら変数の使い方やらも。
…しかし、難しい問題ですね。
心が通じ合わないと、だめなのかしら。 >>700
自己レス。
> NetCIDRは、配列の参照受け取ったりはしないの?
http://search.cpan.org/~dougw/Net-CIDR-Lite-0.17/Lite.pm
しないっぽい。
$FOX->{AIREDGECIDR} = Net::CIDR::Lite->new(@airedgecidr);
ってのはできるらしいが、全部add_any()に投げられちゃうらしいので
プログラマ的にはちょっと気持ち悪いかな。
>>703
んーとよく分からないんだけど、mumumuIsIP4AirEdgePhone()の呼び出し元からは
@FOXが参照できないってこと? わたしにあわせる必要はまったくなく、、、
でも return は明示的にすべきでしょ
Perl の良さである「だれでもできる」を殺していると思う >>708
あぁ、そういう意味ですか。
つまり、
if(&mumumuIsIP4AirEdgePhone($raddr)) {
なんちゃら;
}
じゃなくて、
if($FOX->{AIREDGECIDR}->find($raddr)) {
なんちゃら;
}
ていいんじゃないかってゆうことですね。
確かにそうですが、どっちが作法としていいのか、っていう話なのかなと。 >>709
> でも return は明示的にすべきでしょ
私も、そう思っているです。
で、>>698 と。
で、おじさんに合わせているというよりか、
今主にいじっている人の流儀に合わせるみたいなかんじですね。
私が間違って中身をいじってしまうぐらいですから、それなりにきれいになっているわけですが、
今でも「たぶんこことこことここは、書いた人が違うんだろうなぁ」みたいなところは、
たくさんたくさんあるようです。 俺も暗黙の返り値ってのはあんま好きじゃないなー
古いタイプなのかも >Perlの世界では暗黙に最後の評価値がretrurn値になるので、
これをやられると、みんなが辛いということなんですが、 >>714
…と私もおもたので、今のは前者になっているです。
で、難民のほうで頼んだ例のPerlモジュール入れていただけると、qb6のを配ることができるですね。
(qb6ではqw()でローカルに読ませてテストしたので、今配ると他で動かないです) >>710
そゆことです。
何やってるのか関数名で見通したい、というのなら前者って感じですかね。
全体構造が分からないんで的違いな話になる可能性大ですが、どちらにせよ
$FOX->{AIREDGECIDR}は同じファイル内でだけ呼ぶようにしたらいいんじゃ
ないかなと思うです。その結果が前者なんであれば前者がベターですね。 >>716
なるほどです。
この辺の作法はプログラミング言語が違っても、
そんなに変わるところじゃないですしね。
「その結果」ということで、問題ないです。 qb6 の bbs.cgi は全サーバに配っちゃダメなんですよね? >>719
あ、今はまだだめです。
配る必要、あるですか?
あるなら、緊急に対応することになるです。 >>721
おぉ、了解です。
で、私からの愛をメールで送っておいたです。
よろしければ、受け取っていただけると。 そう言っていただけると、信じてました。
愛があれば、年の差なんて。 今はギクシャクしてますけど、少しずつ仲良くなっていきます、、
えぇ、サーバとですよ。 すんげーどうでもいいけど、
foreach (@airedgecidr){
$FOX->{AIREDGECIDR}->add($_);
}
こうすると0.01マイクロ秒くらい速くなったり。。 >>721 も含め、bbs.cgi を全サーバに配布。 >>735
こんどはうまくいっているみたい。
0 O o P 関連でもし誤判定があったら、ここに報告よろしくです。 0 O o P がおっぱいに見えたから、
題して「おっぱい作戦」だな 実装済:
subject.txt, subback.html, dat/*.dat 更新
あぼーん
dat/*.dat から subject.txt, subback.html 再生成
未実装:
index.html, html/*.html 更新
他板へのスレ移動 etc...
とりあえず↑ってところですが http://sunos.saita.ma/bbsd.c
全部実装すると雪だるま対応仕様になりますが,とりあえず今の段階でも
subject.txt 更新等の重い処理を bbs.cgi から抜き出して軽量化にはなると思います.
使用法: bbsd [-cfh] [-b bindaddr] [-d docroot] [-i subjects_interval] [-I setting_interval] [-n nthreads] [-p port] [-s servername]
-b bindaddr: UDP ソケットを bind するアドレスを指定 [default: 127.0.0.1]
-c: 入力のバイトシーケンスチェックを行う (環境変数 LANG/LC_CTYPE/LC_ALL に依存)
-d docroot: httpd の document root [default: /usr/local/apache2/htdocs]
-f: フォアグラウンドで実行
-h: ヘルプ表示
-i subjects_interval: subject.txt 等の更新間隔(秒) [default: 5]
-I setting_interval: SETTING.TXT のチェック間隔(秒) [default: 60]
-p port: UDP ソケットのポート番号 [default: 2222]
-s servername: httpd のサーバ名 [default: www.example.com]
-DUSE_THREADS 付きでビルドするとマルチスレッド版になり,このオプションが追加.
-n nthreads: worker スレッド数 [default: 4]
んで,例えばこんな感じで起動する,と.
su ch2qb5 -c 'LANG=ja_JP.SJIS bbsd -c -d/home/ch2qb5/htdocs -sqb5.2ch.net'
bbs.cgi からの呼び出し法は
----------------------------------------------------------------------
use Socket;
use constant BBSD_HOST => inet_aton('127.0.0.1');
use constant BBSD_PORT => 2222;
use constant BBSD_TIMEOUT => 1;
sub bbsd {
my ($rfd, $str) = ('', '');
my $sin = sockaddr_in(BBSD_PORT, BBSD_HOST);
socket(SOCK, AF_INET, SOCK_DGRAM, 0) || return "$!";
send(SOCK, join('/', @_), 0, $sin) || return "$!";
vec($rfd, fileno(SOCK), 1) = 1;
if (select($rfd, undef, undef, BBSD_TIMEOUT)) {
recv(SOCK, $str, 256, 0) || return "$!";
}
else {
$str = "書き込みを受理しましたがサーバが混雑しています.書き込みが反映されない場合もあります.";
}
return $str;
}
---------------------------------------------------------------------- で,書き込み処理はこんな感じで.
my $errmsg = bbsd($bbs, $key, $datline);
$bbs は板の指定(operate),$key はスレッドキー(1113117347),
$datline は *.dat への出力と同じ形式の文字列.
name<>email<>date etc.<>message<>[title]
正常に処理されると $errmsg は空文字列で,エラーが発生した場合は
それを示す文字列になります.
この bbsd は subject データをオンメモリで保持するため,
他のプログラムが subject.txt 等を変更しても bbsd によって
上書きされてしまうので,あぼーんや subject 再生成等の機能も
搭載しました.
レスの通常あぼーん:
my $errmsg = bbsd($bbs, "delete:$key", $range);
レスの透明あぼーん:
my $errmsg = bbsd($bbs, "tdelete:$key", $range);
スレッドのゴミ箱逝き:
my $errmsg = bbsd($bbs, "delete:$key", '*');
スレッドのファイル自体削除:
my $errmsg = bbsd($bbs, "tdelete:$key", '*');
$range は例えば "2-19,22,24,26-29" のようなレス番指定.
subject.txt 等の再生成:
my $errmsg = bbsd($bbs, 'repair');
この処理は時間がかかりそうなら BBSD_TIMEOUT はもっと長い方がいいかも知れません.
もっとも,UDP ソケットキューがあふれてリクエストが破棄されているとかでない限り
タイムアウトになっても処理自体は行われますが. >>740
これはハァハァするべきものですねー
◆cZfSunOs.U さんGJ! でぇもん君かぁ。。。
うん。おそらく最終形態かなぁ。。。 おっと >>738 close() 入れないと......
sub bbsd {
my ($rfd, $str) = ('', '');
my $sin = sockaddr_in(BBSD_PORT, BBSD_HOST);
socket(SOCK, AF_INET, SOCK_DGRAM, 0) || return "$!";
send(SOCK, join('/', @_), 0, $sin) || (close(SOCK), return "$!");
vec($rfd, fileno(SOCK), 1) = 1;
if (select($rfd, undef, undef, BBSD_TIMEOUT)) {
recv(SOCK, $str, 256, 0) || (close(SOCK), return "$!");
}
else {
$str = "書き込みを受理しましたがサーバが混雑しています.書き込みが反映されない場合もあります.";
}
close(SOCK);
return $str;
} ああ、和菓子職人が仕上げていく様子を、横で(口を緩めて)眺めている感覚。 ID末尾の識別子について
WILLCOMの「端末だけ」を識別することに何の意味があるのでしょう?("ポン厨"とか言われるのですが)
味/京ポンのような接続環境は、ダイアルアップ接続なPDA/モバイルなどもそうでしょう。
そして、コピペに不自由なWILLCOM端末を使うより、PDA/モバイルなどを使う方が悪質な荒らしが可能と思います。
繋ぐたびにIDが変わるISPのくくりで識別するというなら、まだ納得できます。
要はprinならセンターと分ける必要はなくて、同じ識別をしたらということです。dionとかも。 >>748
技術的には bbs.cgi での「特別扱い具合」を示しているですね。
つまり、bbs.cgi 内で他の端末よりも手厚く取り扱っているわけです。
で、私自身も京ぽん使いで、o が出る板(こことか)にちょくちょく書いているですが、
あんまりそうゆうこと言われたことないです。 >>749
あなたは名無しでレスしないから,気にならないのは当たり前です.
ここが匿名掲示板だということをもう少し考慮していただけると嬉しい. >>750
確かにな
荒らし&言い掛かりを付けたい奴には、どんなしょーもない手掛かりでも
鬼の首を取ったものだからな > 0 O o P の識別
>システム用件と業務用件を切り分け出来ていない見本で砂
そうですねっ
* 挑発には乗らない。挑発するような人の意見は、たいてい誰も重要視しません。 どうせ識別されるとマズいようなレスばっかりしてるんだろ >>749
あーなるほど・・・、味ポンのブラウザがリファラ吐かないってやつですか。
しかし、京ポンはリファラ吐くにもかかわらず、味ポンルートで処理されるようになってしまったのですね。
なまじリファラ吐くせいで、クラシックから書こうとすると弾かれてましたっけか。
そのためリファラを無視するようにしたんじゃなかったですかね。なんか本末転倒…。 >>750
そうか。
でも、それで著しく不公平になったとは思えないんで
(AIR-EDGE PHONEユーザが日本全体で1000人しかいないとかだったら、
ひょっとすると不公平なのかもかもだけど)、
変える気は今のところないです。すんません。 >>755
で、2ちゃんねるではだいぶ前からリファラの有無のチェックはしているので
(少なくとも味ぽんや京ぽんが出るのよりも前から)、
なので、
> なまじリファラ吐くせいで、クラシックから書こうとすると弾かれてましたっけか。
> そのためリファラを無視するようにしたんじゃなかったですかね。
というのは正確ではなくて、
味ぽんからの書き込みに対応するために、AIR-EDGE PHONEセンターからの
アクセスではリファラを無視するようにした
というのが、たぶん正しいと思われるです。
当時、不動楽さん(= クラシックさん)がそのように対応したはず。 >>757
それは味ポン互換のUAの場合ですね。
UAがOperaの場合はPCルートなので、クラシックから書き込みしようとするとリファラで書けませんでした。
で、具体的には分からないのですが、味ポンと同じようにリファラを無視するようにしたのではないでしょうか。
リファラがi2ch.netの場合の書き込みをOKにしたわけではないようですし。
↓このあたり
携帯→2ch運用情報スレッド12
http://qb5.2ch.net/test/read.cgi/operate/1094575260/346-
京ポンに関しては必要以上に面倒なことをやってる気がするですよ。 >>758
ふむ。
そのスレの384にこんな書き込みがあるので、確かに当時、何かしているようですね。
384 名前:不動楽 ★[sage] 投稿日:04/09/19 23:07:56 ID:???
>>381
IP帯域及びリファラエラーの調整してみました。
どうでしょ?
今のbbs.cgiでは、
・AIR-EDGE PHONEセンターのIPアドレスレンジからの接続だったら(*1)、
・リファラの扱いは他の携帯電話と同じ扱いにするけど、
・識別情報が来ないので、ID生成やSamba24はPCと同じに扱う
って、なっているです。
ようは、携帯とPCの中間みたいな扱いですね。
AIR-EDGE PHONEも識別情報を送ってきてくれると、楽なんですが。
(*1)http://www.willcom-inc.com/p_s/products/airh_phone/ip.html (以下余談)
そういえば、AIR-EDGE PHONEでできるゲームか何かで、
識別情報を送ってこないのを悪用(?)して、
1台の電話機で複数個参加するとかやっている人が横行しているとか、いないとか。
次の京ぽんでは識別情報を送るようになってほしいなぁと、ゆっておこう。 なんでわざわざ何で書き込んでるとかわかるようにするの prin規制が掛かりました。今回の原因はPC用のprinが原因の様です。
AIR-EDGEセンター接続かどうかが判別できるようなった今、センター接続を規制の対象から外して頂くことはできないものでしょうか? 再確認でーす
IsKoukoku は bbspinkや2ch のbananaサーバで
するーする事は絶対にない
あってますか? │_A
│・−・) >>522-561を見る限り、
↓ ⊂) LAが高かったらIsKoukokuスルーはどの鯖にも入ってそうっすね ○ 現在のbbs.cgiにおける、IsKoukokuを実行するかを決めるアルゴリズム:
1) まずIsKoukokuを実行するかどうかは、
bbs_mainの最初のほうで、mumumuIsIsKoukoku関数を呼んで
その結果をもとに決めている。
2) 1) は1投稿ごとに呼ばれ、チェックされる
3) 2) でいったん「IsKoukokuを実行しない状況」と判断したら、
mumumuIsIsKoukokuの呼び出しそのものをキャンセルし、
その船が自爆するまでの間、ずっと「IsKoukokuを実行しない状況」になる
4) mumumuIsIsKoukokuでは、以下のアルゴリズムにより判断する
a) リストにあるサーバ(特別サーバ)かどうか調べ、もしそうならIsKoukokuは実行しない
現在の特別サーバのリスト:
live16, live20, live21, ex11
b) その瞬間のサーバのLAを調べ、一定の閾値以上だったらIsKoukokuは実行しない
現在の閾値:
cobra 30.0
tiger 20.0
banana 4.0
5) 現在IsKoukokuを実行している状態かそうでない状態かは、
各板のindex.htmlに「+Rock54」と出ているかいないかで判断できる
している状態:
BBS.CGI - 2005/07/05 (SpeedyCGI) +Rock54 +BBQ/BBM +Samba24=10
していない状態(例: news4vip)
BBS.CGI - 2005/07/05 (SpeedyCGI) +BBQ/BBM +Samba24=15 ということで、>>765 の結論ですが、
2ちゃんねる/PINKちゃんねるのいずれも共通に、
1) 負荷が上がって、サーバが苦しくなってきた場合、
自動的にIsKoukokuをするーするようになる
2) 負荷が下がると、順次船が入れ替わっていくことにより
自動的にIsKoukokuをするーしなくなる
という動作をします。
これにより特にサーバに書き込み集中で負荷がかかった時に
「手でbbs.cgiやread.cgiを止めて冷やさなければいけない」とか、
「bbs.cgiの爆発時にbbs.cgiの処理が転んでしまう」
といったことの回数が、減ったように思います。
animeサーバもこれともうひとつの安全装置を入れてから、
例の「土曜夕方のどーん」にも、耐えられるようになりました。 ということで、以上です。
なお、もうひとつの安全装置は
・LAが閾値を超えたら、index.html / subback.html の更新をある程度さぼる
となっているです。 広告爆撃が増加してきたんで
ISKoukoku はスキップしないでくださいー
したとしても、live系だけかと、
2ch&bbspink の banana サーバは絶対にスキップしないでください >>771
了解です。
これから、LAでのIsKoukoku閾値チェックの部分をはずします。 in bbs.cgi
ex11 (news4vip) は、どうしましょうか。 ただし、animeサーバでのLA=20でのIsKoukokuスキップだけは、
従来どおりとさせていただきます。
これが働くのは、1週間のうちの5分だけのはずです。 あと 通称形態バーボンの早期投入が望まれています。 from 規制議論板 >>776-777
若者の動向を、どうこうしないといけないのかしら。
# 大学生は、そろそろしけーんのシーズンかも。 BBS.CGI - 2005/07/12
- banana サーバではLAに関係なく、常にIsKoukokuを実行
- ただし「特別サーバ」に指定したらするー game10
game9
etc4
life7
hobby7
もスルーして欲しくないです。 携帯Rock54ってのも、ありなのかな。
自動バーボンというか、自動BBMか。 >>780
了解です。
tiger では LA=20 で発動なので運良くこれまで一度も起こっていませんが、
ex/anime/news以外は、bananaと同じ処理にしておきます。 でもetc4は、電車男の時がちょっぴり心配かもね。
ま、いっか。その時はその時ということで。 >>781
ネタ的には暖めているですです。
・自動でBBR→BBM うーん
基本的には、、、全部onにして欲しいんだが、
なぜかというと、on/off は私たちには通常わからないので
効いているのか/いないのか
設定したのが あっているのか/あっていないのか
等がわからないのだ、「あぁ スルーしているから仕方ないんだよね」
で話しは終わってしまって、だれもそれ以上は深く考えないで
結局効いていないという風になってしまうのだ、
liveとex11以外は効かせて欲しいです
(anime は shar だかを ex11 に移転すればいいのかな?)
規制情報板まわりのコストがはげしく上昇しています。 >>785
> (anime は shar だかを ex11 に移転すればいいのかな?)
(ノ∀`)アチャー あと、ex10&ex11のBBMが動いてない気がするんですけど… ・bananaサーバでは必ず実行
・他の該当するサーバ(live系とex11)では必ず実行しない
・それ以外は必ず実行
にしました。
>>788
ex10とかex11のように常時投稿数が多いサーバは、
たまに自動的に止まる(安全装置が働く)ようです。
理由は、、、ううむ。
live系ですらこのような状況で止まることはないようなので、
単なる投稿数ではない、何か別の理由を疑い始めています。 ・bananaサーバでは必ず実行
・他のサーバ(tiger/cobra)のうち該当するサーバ(live系とex11)では実行しない
・それ以外のサーバは必ず実行
にしました。
IsKoukoku周りでLAで動的に判定する部分のコードは、全てコメントアウトしました。
# いったん、オフライン。 >>789 は、>>790 の上三行の説明を明確化で。 はーい
今晩 bbs.cgi さわります
samba値を SETTING.TXT で指定 SETTING.TXTを変更するCGIも忘れずにー >>794
F22のように、一元管理をすると楽かもね♪
各鯖にそれぞれログオンするよりも、どこかの鯖で全板を管理しちゃうとかとか。
でも700板以上あるのよねぇ(汗)@SETTING.TXTの数 ん?
変更人さんのお仕事を、サーバの管理者に一元して移してしまうということですか?
というわけで、携帯バーボンは若者にがんがってもらっちゃうてして、
私は凄腕さんと、Rock54の携帯用拡張、名付けてRock54Mをやることにしよう。
で、Rock54Mからは将来的に、自動的にBBMに突っ込んでしまうようにしよう。 Rock54Mはbanana238に作ることになるわけだけど(今のRock54に同居)、
その作業は、システムの検査が終わった後で。
基本的には、今まで「無駄弾」を撃っていた
携帯からの広告投入に対応する器を作って、そこに入れ込むってかんじで。 で、banana238のシステムそのものは健康であることが判明したため、
こっちは、たんたんと。 で、ネットワーク的には、
今までBBXに行っていた携帯からの広告投げの弾(無駄弾)を、
BBN(仮称)にとばすようにするだけなので、238の負荷は変化ないです。
あとは、単独スレ立ててそっちでやるかな。 >>805
Rockに登録されてる広告をマルチしてる携帯を自動的に永久アク禁にするシステム。 BBSが止まってますと表示されますが、何が原因でしょうか? >>811
掲示板システムの意味のBBSじゃないから気にしないで由 >>522
糞コードだけど、これはダメ?
use strict;
print "Content-type: text/html\n\n";
chomp (my $uptime = `uptime`);
$uptime =~ /load average: ([0-9\.]+), ([0-9\.]+), ([0-9\.]+)/;
print "1min:$1, 5min:$2, 15min:$3";
お忙しいところすみません、一般民としてなのですが…
Over1000したときに出る『Over 1000 Thread』
に、日付と時刻を入れるのがよいかと思ったのですが。
普通のレスと同じ様な要領でも結構ですし。 だとread.cgiで1000の日時を表示するようにした方が・・・
ってこれはread.cgiスレ行きだなw >>815
> `uptime`
このコストがもったいないべ >>818
そうなのか?
read.cgiはdat表示するだけだからいじるならbbs.cgiかと思ってこっちに誘導したんだけどw >>802
1001に組み込むならbbs.cgi、
1000も表示するならread.cgiかとw >>821
そういうことか
read.cgiで1と1000と1001を表示するってことか
ならread.cgiだね それ以前になぜ弄る必要があるかって話しだな
そのままでも不都合はないのに 同意、1000の日時とほとんど同じだから変える必要ないよ 1001行ったスレは1000の日時が●無しでは分からないと思われ。 >>819
んじゃこれは?
…と思って書こうと思ったスクリプトがCpuLoad.pmとそっくりだった(´・∀・`) >最終時刻の件
1000未到達スレとの区別をしないといけなくなるし、
1001連続で終わるケースを考えるとさらに複雑に。。。
よって実現させるならbbs.cgiをいじる方がいいと思う >>815
Linuxだと
# uptime ; cat /proc/loadavg
05:37PM up 321 days, 20:27, 2 users, load average: 0.01, 0.03, 0.05
0.01 0.03 0.05 1/71 25924
とかあるんだがポータビリティ考えると使わない方が良いのかな? 確かに普通だと完走したスレはいつ完走したのかわからんかった >>828
つ ttp://search.cpan.org/src/CLINTDW/Sys-CpuLoad-0.03/CpuLoad.pm >>815
→print "Content-type: text/html\n\n";
print "Content-type: text/plain\n\n";
ですね♪ open LA, 'uptime |';
$la = <LA>;
close LA;
んーわざわざモジュールを使わなくてもいいような。。 >>832とCpuLoad.pmの中身が実質同じである件
my $fh=new IO::File('/usr/bin/uptime|');
if (defined $fh) {
my $line = <$fh>;
$fh->close();
if ($line =~ /(\d+\.\d+)\s*,\s+(\d+\.\d+)\s*,\s+(\d+\.\d+)\s*$/) {
return ($1, $2, $3);
} # if we can parse the output of /usr/bin/uptime
} # if we could run /usr/bin/uptime ・ FreeBSD / OpenBSD は getloadavg() 実行
・ Linux は /proc/loadavg 読み出し
・ それ以外は /usr/bin/uptime 実行
ってなってますね<Sys::CpuLoad
っていうか Solaris でも getloadavg() あるんで......
--- README Tue Mar 19 08:24:02 2002
+++ README Tue Mar 19 08:24:02 2002
@@ -9,7 +9,7 @@
TO-DO
- - Better getloadavg() support. Currently FreeBSD and OpenBSD
+ - Better getloadavg() support. Currently FreeBSD, OpenBSD and Solaris
are supported. To improve upon this, see the next item below.
- Instead of hard coding preprocessor macros around getloadavg(),
try to compile C code snippets to see if getloadavg() is supported.
--- CpuLoad.pm Tue Mar 19 08:41:39 2002
+++ CpuLoad.pm Tue Mar 19 08:41:39 2002
@@ -54,8 +54,8 @@
sub load {
- # handle bsd getloadavg(). Read the README about why it is freebsd/openbsd.
- if ($cache eq 'getloadavg()' or lc $^O eq 'freebsd' or lc $^O eq 'openbsd' ) {
+ # handle bsd getloadavg(). Read the README about why it is freebsd/openbsd/solaris.
+ if ($cache eq 'getloadavg()' or lc $^O eq 'freebsd' or lc $^O eq 'openbsd' or lc $^O eq 'solaris') {
$cache = 'getloadavg()';
return getbsdload()
}
--- CpuLoad.xs Tue Mar 19 08:16:14 2002
+++ CpuLoad.xs Tue Mar 19 08:16:14 2002
@@ -18,7 +18,7 @@
PREINIT:
double loadavg[3];
PPCODE:
-#if defined(__FreeBSD__) || defined(__OpenBSD__)
+#if defined(__FreeBSD__) || defined(__OpenBSD__) || (defined(__sun__) && defined(__svr4__))
getloadavg(loadavg, 3);
#endif
EXTEND(SP, 3); 手元のlinuxでもgetloadavg()ありますな 一応貼り。
830 名前:マァヴ(゚赫゚;) ◆jxAYUMI09s :2005/07/25(月) 00:37:05 ?###
HNに顔文字入れようと思うと、「;」から先がクッキーに残らないのでめんどくさいんだな(^_^;)これが
835 名前:▲ ◆cZfSunOs.U :2005/07/25(月) 00:44:26
>>830
>「;」から先がクッキーに残らない
index.html や read.cgi 出力での JavaScript コードを http://www2.2ch.net/snow/index.js
に入れ替えて,bbs.cgi での NAME, MAIL の Cookie 設定を JavaScript 側に移管すると,
それも解決しますけどね.
http://qb5.2ch.net/test/read.cgi/operate/1123079563/891-897n
に出ているような不正バイトシーケンスが含まれたカキコは,
bbsd で LANG=ja_JP.SJIS にして -c オプションを有効にすれば弾けます.
バックエンド (live22) 側に余力があるならご検討を...... >>840
んと、携帯の顔文字とかSJISの範囲外の文字とかは、どうするのがよいかしら。
あ、bbsdさんがSETTING.TXTのUNICODEのやつを読んで、セットされていたら
はじくのをスキップすればいいのかな。 >>841 弾くのは Shift JIS のバイトシーケンスとして矛盾がある場合なので
(実際上は FreeBSD のロケール / mbstowcs() の実装に依存しますが),
例えば &#xxxx; の形式(実体参照)であれば無問題ですね. >>842
なるほどです。
んじゃ、丸付き数字とかののたんの口とかはイカンのではないかしら。 >>843 ん〜と......細かい部分は OS のロケール実装に依存するかとは思いますが,
機種依存文字か否かということとバイトシーケンスとして正当か不当かというのは
必ずしも同一ではないですね.機種依存文字というのはベンダ定義文字や
ユーザ定義文字に該当するのでしょうが,その部分は単に opaque に扱うだけで,
個々のコードがどんな文字を表しているかまでは関知しないので.
不正バイトシーケンスというのは例えば Shift JIS の1バイト目で
文字列が途切れているなどの場合ですが,機種依存文字であっても
Shift JIS の1バイト目・2バイト目のペアの並びとして矛盾がなければ,
それは不正バイトシーケンスということにはならないです. >>845
なるほど、確かにそうですね。
SJISの「ルール」で合格であれば大丈夫という実装も、ありえるです。
帰国後落ち着いたらいろいろと動かし始める皮算用なので、その時にでも。 AIR-EDGE PHONEマーク "o" って意味あるんですか?
全規制が回避できないのなら、やめて欲しいです。 >>847
Q.IDの後ろに付いてるOとかPとかoとか0ってなに?
A.書込み手段を区別する目印です。
携帯が O (大文字のオー)、 公式p2( http://p2.2ch.net/ )が P、
AIR-EDGE PHONEが o (小文字のオー)、
それ以外が 0 (ゼロ)です。
荒らし対策の一環として、一部の板に便宜上導入されています。
テンプレ貼れないの人はチェック
http://sv2ch.baila6.jp/chk_proxy.cgi
下の方のBBXチェックで
La ROCA es la vida.( ̄ー ̄)ニヤリッ
と出てる人はその書き込みを諦めましょう
諦めず連投しているとアク禁等になります 機種依存文字ってのはこのあたりですかね.
http://www.freebsd.org/cgi/man.cgi?query=mskanji
The first ranges ......
0xED - 0xEE (not JIS: NEC-selected IBM extended characters),
0xF0 - 0xF9 (not JIS: user defined), or
0xFA - 0xFC (not JIS: IBM extended characters).
sunos.saita.ma で拝借している tiger 上で確認したところ,
そのあたりのレンジのキャラクタもちゃんとパスするようです.
ただ,FreeBSD の mbstowcs() では,"\x81<" のように < が Shift JIS の
2バイト目として食われてしまうケースを弾けないということもわかったので
(< は Shift JIS の2バイト目としては不正なので弾くべきではあるんですが),
mbrlen() でもうちょっと細かくチェックするように変更しました.
----------------------------------------------------------------------
で,bbsd の方もマターリと改良を加えていました.live22 姉妹再稼働の際には更新をお願いします.
http://sunos.saita.ma/bbsd.c
・ -b オプションで IP アドレスだけでなくホスト名も使用可能に.
(今後雪だるま系鯖が増えた場合,プライベートアドレスも
ホスト名で管理できた方が便利と思われるため)
・ worker スレッド数を可変式に.-n オプションでの指定は
-n [nthr_min-]nthr_max (デフォルト: max = 32, min = ceil(max / 8))
・ ステータス情報を取得可能に.
my $statmsg = bbsd($bbs, 'stat', "$logfilename:$logline"); # Perl スクリプト中
bbs.pl 板名 stat logfilename:logline # コマンドライン
("$logfilename:$logline" として : を含まない文字列を適当に指定すればログ出力せず)
ただ,sub bbsd {} 中で
recv(SOCK, $str, 256, 0) || (close(SOCK), return "$!");
となっている部分を
recv(SOCK, $str, 2048, 0) || (close(SOCK), return "$!");
ぐらいにしておかないと,返ってきた文字列が尻切れになってしまいます.
その部分を修正した bbs.pl, bbs_load.pl:
http://sunos.saita.ma/bbsd/bbs.pl
http://sunos.saita.ma/bbsd/bbs_load.pl >652 >666等を読むと、AIR-EDGE PHONEセンターのID識別子導入は、
荒らし調査のための暫定的な措置のように感じるんですが、外すことはないですか?
その識別子導入の元ネタであろうと思われる、
AIR-EDGE PHONEセンターとその他のPRINの個別規制の方はどうでしょうか?
あと、携帯関連板での荒らしへの予防策として、
携帯キャリア(通信方式やIP接続サービス)別の識別子を携帯関連4板への導入を提案します。
そのときはAIR-EDGE PHONEセンターも区別されるべきですね。
>>850
携帯からの荒らしだと(運営が)分かりやすくするための識別ですよ。
荒らし「予防」のための識別じゃないと思いますがね。 確かキャリア識別はする必要無いと言明していたな。
それが分かった所で規制する側には何もメリットは無いし、抑止効果のための識別じゃないからね。
パソコンのOSを識別するようなもん。 0とPは荒らし対策、oはbbs.cgi内で一寸特殊な処理をしているので
rootさんが参考に入れてるんじゃなかったっけ >>853
Pも特殊処理(全規制スルー)だったような。 AIR-EDGE PHONEユーザーだけど、早くID末尾のoを外して欲しい。 BBS.CGI - 2005/09/09
222.13.35.0/24 だったら Client_IP: を調べて、あればログに残す。
これで、Willcomへの通報は可能になったはず。 Client_IP をログに残すなら
判定しなくてもいいのでは? >>859
最初はそう思ってたんですが、どうもGoogleしてみると、Client_IP: = HTTP_CLIENT_IP は、
非常に簡単に偽装できるらしいんですよ。
で「ここから来るHTTP_CLIENT_IPだけは信用する」っていうふうにしたと。
判定を増やすコストは、例のCIDRのパッケージを使っているので、
現在のbbs.cgiの合計コストから考えて、十分に小さいと判断したです。 で、以下余談なので帽子脱ごうと。
私が今回対応している理由のひとつは、自分も奥様もAIR-EDGE PHONEというか、
prinユーザだったりするからだったりします。
ppp.prin.ne.jpを永久全規制とかされたら奥様に何て言われるだろうか、、、
と思うと、書けないperlも書けたりするようです。 やっぱり自分に都合のいいことはやるんだね。
グローバルIPをもってない人はもってください、と同じで、全規制されたら違う手段を使ってください、だろうに。 個人サイトですべての利用者が平等な必要があるのかと Client_IPをログに残すだけなら判定は後回しでもいいんじゃ?と思った
(とりあえず記録しといて問題が起きたときに信用できるか調べる) オレもAIR-EDGE PHONEユーザーだから応援する。
しかしJRCやめて早く新しい機種でないかなぁ。 >>861
あのーp2経由で2ちゃんに参加するってぇのは駄目なの? >>867
私の名義の2枚のクレカで1つずつ買って、そのうちのひとつを奥様が占有使用しているです。
(奥様はクレカ作ってないんで) 本人が別々のクレカで二つ買ったのをひとつ与えてるんだろう。
というかスレ違い。粗探しはよそで。 叩きたいわけじゃないよ
何かあった時保障がないんじゃないかとちょっと心配しただけ
今は本人確認うるさいし
本人が良いならそれでいいんだけど >本人が良いならそれでいいんだけど
余計なお世話と分かっているのに続けるのは粘着への第一歩かと。 愛があれば大丈夫です。
でも、愛が無くなった時が大変です。 >>875
コラッ!本人を目の前にしてそんなこと言うんじゃありません! BBS.CGI - 2005/10/21
live16/20/22 を対象に、緊急時に発動するしかけを投入。 しかけを投入 => しかけの暫定版をとりあえず投入。>>884 「書きこみ&クッキー確認」の画面で、
[上記全てを承諾して書き込む]を押さずに、ブラウザの「戻る」機能で戻った場合、
次回以降、確認画面が出ずに、いきなり書き込めてしまいます。
このバグを悪用して、
俺は2chに書き込んではいるが、投稿確認に書かれた事項は承諾していない
と主張している困ったさんがいます。
簡単に直せるなら、直してもらえないでしょうか。
(そうすると、その人は書き込まなくなるでしょうから、
その人によるスレの話題の激しい脱線・罵り合いから、
スレが救われます。) >>887
この話は前から出ているですね。
クッキー使っているわけですが、
*技術的に*、どうするのがいいんだべか。 [上記すべてを承諾して書き込む]じゃなくて、
ワンクリみたいに強制的に承諾させちゃえばいいんじゃない?w >>889
ポチっとな♪する前に食わせちゃっているからかな。
ポチっとな♪したあとに食べさせれば。。。 専ブラ側でも対応が必要になってきますね、この問題。
cookieがセットされていないなら承諾画面を出してformに
「bbs.cgiしか知らないテンポラリキー\0名前欄\0メールアドレス欄\0本文」
のハッシュ(md5かなにか?)をhiddenで入れておく。
でもって、実際の書き込み時にcookieをセットする、という形にならざるをえないのではないかと。
コスト削減のためにID算出と同じ種を使っても良いかも。 あ、リモホを入れていないのは携帯など毎回代わってしまうところを考慮に入れているからです。 対応策として・・・
・クッキーに承諾したフラグを入れる入れないの問題
・カキコボタンにtarget=newを仕込むようにして新しい開くようにしてブラウザでバックできなくする
なんかがおもいつきでかけますが・・・どうでしょう>rootさん >>894
あっと、これの後者はw3mとかのテキストブラウザの場合には使えませんね・・・
テキストブラウザでどれだけカキコがあるかにもよると思いますが、
かなり多いようであればnewWindow案は棄却だと思います。 >>894
二番目は意味がないです。
このケースではブラウザのバックボタンがつかえるかどうかはさしたる意味を持ちません。
それだけなら元のwindowでもう一度書き込みボタンを押せば突破できてしまいます。 >>897
やっぱそうでしょうねぇ
やはりクッキーで承諾フラグをつけるのが望ましいということですか。 >>889
「この画面を表示させた後の書き込みは、すべて上記内容を承諾したものとみなします。」の
一文でも書き加えればいいと思われ。
で、そうするとボタンのキャプションがくどいから、ボタンは「書き込む」だけに変更。
大人の世界の内容なんだからシステムで解決できないなら
大人らしく承諾させる内容だけで勝負を。 >>899
ゴネ厨がそれで納得するかどうかは難しいと思います。
法的に無効な契約とされかねませんし。 ボタンを押させる事が重要なのか。
それなら表示されるのと同じ内容をどこかにまとめておいて、
初回は強制表示で、2回目以降は表示させなくする判定をread.cgiで読み取って
read.cgiの書き込みボタンのキャプションを「○○を承諾して書き込み」に置き換えて、
承諾させる内容をまとめたページへの○○ってリンクを表示させるとか。
専用ブラウザは使うこと自体承諾したようなものだと思うし。 今
U) bbs.cgiにアクセス
B) クッキーが無い
B) 確認画面&クッキー発行(←表示した段階で発行!)
U)承諾ボタン押して送信 or 承諾ボタン押さず再度投稿
B) クッキーがある&その他問題無し
B) 投稿完了
変更案
U) bbs.cgiにアクセス
B) クッキーが無い
B) 確認画面
U) 承諾ボタンを押す
B) もし($FORM{'submit'} が "承諾云々")なら {クッキー発行};
&他各種投稿の処理
B) 投稿完了 or 何かエラー(←この返事の段階で発行!)
U = ユーザーの操作
B = bbs.cgiの処理 >>902
手元に承諾form同等の機能だけもったform置いたら突破できますよ、それ。 承諾するとは言ったがその利用規約を承諾した覚えは無い。
というのが通用するならね。 投稿規約を承諾するとは言ったが投稿規約を承諾した覚えは無い
の方が良いかな。 荒らし対策じゃないんで、投稿を防ぐ必要は無いんだよね、別に。
承諾さえされれば。 承諾したくない困った人は、これを改良したとしても、
前回は承諾フォームが出て承諾して書き込んだが、
今回は承諾フォームが出なかったので、表示されもしない内容に承諾できるわけがない、承諾していない
と言い出すと思う。
書き込む度に、確認・承諾フォームを表示しないようにするのは、なぜでしょう。
転送量が厳しいから、その節約のためでしょうか。 つまりクッキーを持ってると表示されない・書き込めるということなら、確認画面を表示したことを
クッキーで確認していることとクッキーとともに書き込むデータをそぅしんしてきたら
自動的に確認画面の内容を承諾したとみなすと確認画面に書いてしまえばいいかも。 つーかシステム側で対応しなくても http://info.2ch.net/guide/ あたりに
2chは以下の条件を承諾した方のみ書き込み可能です。
・投稿者は、投稿に関して発生する責任が全て投稿者に帰すことを承諾します。
・投稿者は、話題と無関係な広告の投稿に関して、相応の費用を支払うことを承諾します
こんな感じの項目を作ればいいんじゃないの? >>910
「そんなところまで見てないから知らなかった」とか嘘でも言う奴が出るから
いろいろ話し合ってるわけで、 【きちんと】設置された承諾画面を【わざわざ】回避する措置を講じる者は
その時点で、それ相応の責任を負うと言わざるを得ないかと 何というか 一つの方法は、承諾ボタンと同時に、拒否ボタンを作っておくことかな
そして「拒否ボタンを押す以外の否認の方法はありません」とでも書く。
いずれにせよ、言い逃れができない形にしないと、たとえば2ch発の
書籍を作ったりする際にいろいろ問題が発生してしまいそうな気もする。 >>914
建前…っても、
http://www.itmedia.co.jp/news/bursts/0204/15/13.html
みたいに、書籍の出版・販売差し止めと賠償を認めた判決もあるし。
2ちゃんねる編の書籍もある以上、あまりないがしろにするのもどうかと。
「拒否ボタン」いいね。 通常の利用ではありえない方法で、規約に同意したかのような
データを送信して、そうであるから規約には同意していないのだ、
というのが通用するかどうかのな。
掲示板での議論ではなく、裁判で。
だから、まあ、建前を通していれば、不利になる事態は
そうは無いかな、とか。
そういった点で、通常の利用方法で、承諾しなくても承諾と
見なされている現状の改善が議題なわけだね。 承諾を回避して「そんな規約シラネ」というなら、拒否ボタンが
有ろうが無かろうが「そんな規約シラネ」なだけじゃん。 承諾メッセージは送信時に明示されるからいいとして、
裁判だと、「不具合があるのを知っていたにも関わらず対策をとらなかった」
式の判断で負けちゃう場合もありますよ。(心配性)
無理でなければ、なんらかの対策をとってほしいです。 承諾が必要な事を知りながら承諾を偽装した
と判断される事を心配しようよ。 荒らし対策と規約承諾を別々のクッキーで扱うのが面倒なら、
>>910をしつつ、投稿ボタンを全て「規約を承諾して書き込む」
にして、
もし ($FORM{'submit'} が "承諾云々" ではない) なら
{DispError("ERROR!","規約を承諾しないと投稿できません!");}
とか
専ブラが全滅だけどね。対応されるまで。 >>919
2ちゃんねる側が原告ならそれはありだけど、
被告側ではその意見はあまり意味がないな。
裁判ネタはこれ以上はスレ違い。 まあ、最近インスパイアのこともあってぴりぴりしてるから
これを機に徹底的に話し合って詰めた方がいいかもね。 >>920
専用ブラウザに対しては、UserAgentを見て従来通りの動作にする、というのはどうでしょう。
それを恒久策にするか、移行が済むまでにするかは、考えないといけないけど。 というか、あんなに防御していたのに、
スレッドが80超えちゃってたのがなぁ。
たぶんほとんど同時に何十本とスレ立て要求が来て、一気に追い込まれたんだと思われ。
何か、工夫が必要ですね。
スレ立て処理を実行中の船は、スレ立て処理をしないようにするとか。
グローバル変数でできるような気がするので、後で、考えてみよう。 うーむ、同じスレッドキーのスレができないようにするところって、
激しくうーむなような。 安易なロック方式として、スレを立てるところで
どこか(板単位で分離が好ましい?)にunixtime%閾値をファイル名として/dev/nullからでもsymlinkを貼ってみて、
失敗したらスレたて拒否。成功したら建てる。
ガベージコレクトのタイミングで一番新しいヤツ以外を削除するようにすればおっけ。
マルチスレッド/タスクを考慮するならこれが一番コストがかからないと思いますがどうです?
閾値はスレたての最大間隔ね。最小1秒になることもあるけど2スレ連続ならまぁ許容範囲内ではないかと。 ん?
Perlでのまともなlockの方法って、2年ほど前の再開発スレでrootさんが話題にしてましたよね。
そのレベルは脱した上で「うーむ」なことに成っているのだと解釈。 ほぼ同時にスレ立て要求→同時に数十本もスレ立っちゃった→スレッドキーみんな同じだ→しかも今夜が山だ
こんなところ? 今の bbs.cgi は、同じスレッドキーのやつが立たないようにするコードが
ちゃんと入っているです。
ようは、その実装方法がうーむだと。 do {
#サブジェクトがあれば新規スレなのでキーを現在に設定
$GB->{FORM}->{'key'} = $GB->{NOWTIME};
#.datファイルの設定
$DATAFILE = $GB->{DATPATH} . $GB->{FORM}->{'key'} . ".dat";
} while ( -e $DATAFILE ) ;
これって、$DATAFILE が既に存在してたら、無限ループに陥るんではないかしら。 不動楽さんが入れたやつですね
2chの動作報告はここで。 パート15
http://qb5.2ch.net/test/read.cgi/operate/1090485214/676-685
==========================================
676 削除車 ★[sage] 04/11/01 23:25:56 ID:???
お疲れさまです。ちょっとご相談があります。
最近ニュース速報(VIP)が、非常に板飛び回数が多いです。
少しお話を窺ったところ、同じタイミングでスレが立ったときに合体を起こして、板が飛ぶみたいです。
お手数ですが、ちょっとcgiの方を確認していただけますか?
(それとも一般的なことで、VIPでたまたま多く発生しているだけなんでしょうか)
よろしくお願いします。
★板のスレ一覧復帰&修正依頼21★
http://qb5.2ch.net/test/read.cgi/operate/1096548247/677-682
679 不動楽 ★ [sage] 04/11/02 00:45:12 ID:???
>>676
原因らしき個所は炙り出せたのですが、
その変数にからむ処理を上から眺めていきますので、
少しお時間を頂きたいです。
>(それとも一般的なことで、VIPでたまたま多く発生しているだけなんでしょうか)
ex7だけでなく、全板のbbs.cgiで同じことが起こる可能性があるようです。
684 root▲ ★ [sage] 04/11/02 02:08:27 ID:???
直すときには、安易な flock() は控えてほしいなぁと強くおながいしておきますです。
685 不動楽 ★ [sage] 04/11/02 02:13:12 ID:???
>>684
排他処理をしていないのが原因、というわけではないので大丈夫かと思うです。
========================================== それについて書こうと思ったら、>>933 が。
それは、これですね。
上記よりも後、最後ところでやっているです。
if($GB->{FORM}->{'subject'} ne "" && -e $DATAFILE){
&DispError2($GB,"ERROR!","ERROR:板飛びそうなので、またの機会にどうぞ。。。");
}
ということで、それはクラシックさんが入れたところではないと思います。
昔からあったところだと思う。
*以下推測*
たぶん、昔は do 〜 while のところでもtime; していたんでしょう。
それなら、1秒経てば条件が変わります(ループを抜けるかは別)。 コピペみすった。
コメントつきなので、ほぼ間違いないです。
#==================================================
# 板飛び回避策
#==================================================
if($GB->{FORM}->{'subject'} ne "" && -e $DATAFILE){
&DispError2($GB,"ERROR!","ERROR:板飛びそうなので、またの機会にどうぞ。。。");
} で、ここの制御を変えようと思うわけです。
安易に、
・live系は既にあったらごめんなさい
・他はスレッドキーを+1しながら、最大3回ぐらい試してみる
ってことにしようかなと。 BBS.CGI - 2005/10/26
$GB->{FORM}->{'key'} = &mumumuAllocateThreadKey($GB);
$DATAFILE = $GB->{DATPATH} . $GB->{FORM}->{'key'} . ".dat";
にした。
で、mumumu AllocateThreadKeyの中身は >>936 にしたつもり。
これで、
・bbs.cgi謎の暴走
・スレ立て混雑時にサーバ劇重
が、少しでも改善されるといいかなと。 スレッドキーは毎秒かわるんでしたっけ、でしたらこんなのはどうですか?
0. ロックの待ち番号を0で初期化
1. ロックの待ち番号をファイル名にして/dev/nullからsymlinkしてみる
成功; → 6へ
2. ロックの待ち番号を1カウントアップ
3. ロックの待ち番号最大値を超えてるかチェック
超えてる: → 建てたい人大杉表示にして諦める
4. 1秒まつ
5. 1へ
6. ロックの待ち番号が0か?
はい: 9へ
7. 0.5秒待つ。
8. ロックの待ち番号-1をsymlinkしてみる
失敗: → 7へ
成功:
ロックの待ち番号をunlink
ロックの待ち番号を-1
6へ
9. スレたて処理
>>938
最初はそういうのを考えていたんですが、
1秒とか0.5秒とか待つのが、いやだったです。
スレッドキーは所詮本当の時間とあっている必要はないので、
・live系はごめんなさい
・通常系は 0 +1 +2 を試して、だめならごめんなさい
ぐらいのいい加減さにして、一刻も早くbbs.cgiに終わっていただくことにしました。 それだと、多台数とかからスレたて攻撃が同時に来たときにやっぱり被害が起こることは避けれないと思いますがどうでしょう。
計算量がO(n * log n)で収まれば収束しないか? メモリ上に前回のスレキーを持たせたファイルを置いてそれを参照
とかは無理だろうしなぁ…
(素人案だし毎回読み込みとか(ry) >>940
if ( ! -e datファイル ) {
return それでOKよん;
} elsif ( ! live系 ) {
for ( $i = 0; $i < $maxtries; $i++) {
スレッドキーを一つずつ増やして存在チェックし、なかったやつを
return これ使ってちょ;
}
&error(ごめんなさい);
って、なっています。
というわけでおっしゃるとおり、タイミングにより突破もありえます。
その場合は、>>935 でひっかかると。
でもそれにしても、ほんとうは完璧じゃないです。
雪だるま作戦では、このへんはバックエンドプロセスに依頼する形になるので、
その時に、きちんと対応することになるかなと。 てなわけで、-e でdatファイルの存在をチェックしていたり、
924の処理のところみたいに utime でdatのタイムスタンプ更新したりすることは
雪だるま環境ではそのままではむりぽなわけで、
そういったAPIを、入れ込んでほしいということなわけです。
一つ海外出張がキャンセルになってちょっと落ち着いたので、
このへんを、ぼちぼちあっちですすめようかなと。> SunOSさん で、>>937 により「ごめんなさいリミッター第二弾」が実装されました。
どのくらい、発動しているんだろうか。 ん〜と,現在の bbsd ではスレ立て時の key をインクリメントしながら一定回数(現在は16)
リトライするようになっています.その際,open() を O_CREAT|O_EXCL フラグ付きで
呼び出しているため,ファイルの存在確認と生成はアトミックになっているはずです.
当初はスレ立て時の key としては bbsd 側の現在時刻を用いていましたが,
それだと headline に渡す key とのずれが生じる問題も発生したため,
現在は bbs.cgi 側から渡された key を使用するようになっています.
ただ,上記の key のインクリメントが発生するとやはりずれが生じることに
なるので,そこの調整をする仕組みが必要になりますかね. 単純に,bbsd 側ではリトライせず,key をインクリメントした上でのリトライは
bbs.cgi 側に任せるという形でもいいんですかね.同じ key を持つ dat が
存在した場合,bbsd は EEXIST に相当するエラーメッセージを返すことになるんで. >>946-947
なるほど、なるほど。
bbsdについては、そのうちoperateにスレ立てるかも。
(いろんな意味でhtml化されてほしいし) で、スレ立てのAPIの戻りで、実際に立ったスレのキー(だめなら-1)を、
戻すとかすればいいと思うです。>>946-947 ロックのループにはまった時はスレキーとかに使うUNIX時間なんかを
新たに取り直した方がよくね?
でもスレ立て処理は排他ロックさせずに複数同時進行してそうだし、
ロックのループが1秒待ちでもなさそうだから関係ない話か。 >>949 成功時は key,失敗時はエラーメッセージを返し,戻り値が
数値か文字列かを bbs.cgi 側で判定してもらうというのはどうでしょうか?
スレ立てが失敗する原因は EEXIST 以外にもあり得るので
(といっても実際はまれでしょうが),エラーの内容がわかった方が
異常発見もしやすくなるかと思いますし. >>951
悪くないと思いますです。
週末あたりから、APIを詰めていくスレをoperateに立てようかと。
ほんじつは、ここまで。 ということで、立てました。
【雪だるま】bbsd⇔各cgi間のI/F仕様について考え・詰めていくスレッド
http://qb5.2ch.net/test/read.cgi/operate/1130482779/
ぼちぼち、すすめていこうかと。 キャップの▲ってなんか意味あるとですか?
2ch全板で合計して 平均何秒ごとくらいにスレが立っているのでしょうかえ? うーむ、
$GB->{MD5DATE} = sprintf("%04d_%02d_%02d",
substr($year + 1900, -2), $mon + 1, $mday);
これ、substrのところがたぶん -4 の間違いなんだと思うけど、
ここを変えるとこのあとのIDの種ファイルを更新するところで、
「日付変わった」と思われて、IDが変わっちゃうですね。
まずoperate2で試して、ID変わっちゃうとしたら、
23:00過ぎに、やることにしよう。そうしよう。 これ直したら、SunOS さんのからの質問 [1-2] のところの仕様が確定すると。 そもそも-4というよりは、
× substr($year + 1900, -2)
○ $year + 1900
みたいなかんじっぽいな
%04dに文字列渡してどうするんじゃと >>960
そのように変更するです。
# Perl、にがて。 その直上のここは、どうすればいいべか。
$GB->{DATE} = sprintf("%02d/%02d/%02d %02d:%02d:%02d",
substr($year + 1900, -2), $mon + 1, $mday, $hour, $min, $sec); >>957
2chが西暦10000年まで存在してるとは考えにくいし
substrする必要はないと思います ってか $GB->{DATE} って何に使うんですか? >>957が -4 だと思ったのはなぜ?
その部分だけ見た場合は、現実的(2chがいつまで存在するか)に考えて、 -4でも-2でも変わんないと思うし >>962
ん?なんだそら?それ現在dat及びに出力される形式と違ってるみたいけど
どっかべつのところでつかってるんだろか
どうしてもそれで直したければ
substr($year + 1900, -2) → $year % 100
てところじゃないんすかね >>965
IDを格納するところで、YYYY_MM_DD を日付として使っているです。
で、0005_10_31 というのは「自然じゃない」ので、
2005_10_31 を格納したかったに違いないと。
>>966
なるほど、100で割ったあまりにすればいいわけか。
そうするです。 もすかすて、$GB->{MD5DATE} ってば、ID生成のためだけに使われているのならばそのまま放置しても良さそうな♪ 気づいたときに自然な方法に修正しないと、バグが仕様化して後で痛い目を見る。
……と、厳密なのって日本人エンジニアとポーランド人数学者の特徴だよな。そのノリは好きだけど。 >>971
後で何か日付が必要になった時に、
「あ、ここで取得してるじゃん、これ使っちゃえ」
ってのはよくある話。 >>972
いへいへ、いつも私はそうしています(哀)@気が付いたらゴニョゴニョ
>>973
そういう発想がいちばん痛い目に遭うって気もしますですです(照)@そういうのからはもう足を洗いました♪
やっぱり一度は整理整頓してみたいよなぁ(苦笑)@bbs.cgi あるスレッドの次スレという物が立ったらあるスレッドを速攻で足切りにできませんかねぇ?
スレを立てた人間によるスレストというか。
次スレが立った、じゃあ(無駄なレスで)埋めるって流れが嫌いなだけですけどね。 次スレ立ての競争が無意味に苛烈になるだけなのでとても賛成できない。
めちゃめちゃなスレを立てておいて「次スレ」と主張し、現行スレを無理矢理
足切りに…なんて事をする輩が湧くのが目に見えているぞ。
「スレッドは1000ぎりぎりまで使い切ってから移行しましょう」という運動でも
立ち上げる方がまだ現実的だよ。 >>975も>>977も、ちょっと考えればシステム的にどうやっても無理ってわかりそうなもんだけど。
自動的に正しい判断ができる拠り所がない。
個人がきっちり常に管理してる掲示版であれば可能かもしれんけど。
>>975
正式な次スレが立ったという判定はどうするん?
スレ立てた人って常駐してるわけじゃないし、そもそも立てる人って単に立てられる人なだけ場合も多々ある。
代行する人もいるんだし。
またその人が正しい判断をする人かどうかもわからん。
>>977
次スレが必要あるかどうかの判断は?
必要な場合だとしも、スレタイは?テンプレは?汎用的にやろうとすると無理。 そもそもそんなシステムが必要な理由からしてわからないですよ。
そろそろスレ違いなんで、雑談スレへでもどうぞって感じ >>980
すんません、投げるところを間違えたみたいですね。
とにかく、このスレッドみたいに980を超えた後、埋めるかとか言い出す奴とか
実際に埋めてしまう奴とかを撲滅できればいいんですよ。
終わり際に見苦しいというか。 見苦しいのは同意。でも撲滅しなきゃいけないという使命感は要らないと思われ。
そーゆー使命感ばかりに凝り固まると、潔癖君になっちゃうぞ。 >>981
わかってないね
975みたいな機能つけたら糞次スレ立てまくりスレストしまくりの
荒らしに利用されるのが目に見えてる
提案内容がお粗末過ぎるんだよ 新機能の要望ならこっちのはずだが
◆新機能をねだるスレ@運用情報◆ Part2
http://qb5.2ch.net/test/read.cgi/operate/1112024113/
関係ないスレでいろいろ喚くのも荒らしと変わらんよ 友人の話では、Perl では /i の処理がめちゃんこ遅いという話があるらしい。
つまり、
if($ENV{'SERVER_NAME'} =~ /2ch\.net/i)
みたいなのも、ちりも積もれば山となる可能性ありと。 >>989
多くはないみたいですが、いくつか散見されるようです。
(>>988 は実際のソースからのコピペ) 気づいたところは、私のほうでも取っておくです。
今ざっと見直してみましたが、たぶん、もうそんなにないと思いますです。
で、次スレの予感か。 Pで書くならCを知っていた方がよい。
Cで書くならAを知っていたほうが良いってことで、
一行(1ステップ)は一行なんだけど
使うと払わなきゃならない料金が違うのよネ
1円のもあれば 100万円のもある
正規表現は1,000万くらいか、 >>995
そですね。
なんか、組み込み系をやってた人の発想っぽいですね。それ。
そうゆう人かしら。
1000万は(いつものように)誇大表現ですけど、
方向性はそのとおりかもです。
# 知能によって船を作ったり爆破したりするあのサブルーチン群と、
# トラックバック系のサブルーチン群を、
# そのうち別ファイルにするかも、かも。 >>997 は、どっか(dsoとか?)で、
占有するメモリとかが節約できるかどうか試してみてから、判断しようかなと。 トラックバック系については、ソースの可読性ですね。
どうせ全部で使うので、単純に可読性だけです。
ということで、そろそろ1000か。 このスレッドは1000を超えました。
もう書けないので、新しいスレッドを立ててくださいです。。。 レス数が1000を超えています。これ以上書き込みはできません。