【雪だるま】bbsd⇔各cgi間のI/F仕様について考え・詰めていくスレッド
■ このスレッドは過去ログ倉庫に格納されています
雪だるま作戦において開発をすすめているbbsdでは、
+- [ フロントエンドサーバlive22x1 ] -- ユーザは
[ バックエンドサーバlive22 ] -+- [ フロントエンドサーバlive22x2 ] -- live22xという代表名で
制御プログラムbbsd +- [ フロントエンドサーバlive22x3 ] -- これらにアクセス
| | | dat直読みや、
dat subject.txt subback.html bbs.cgiやread.cgiやofflaw.cgi、
書きこみログ(芋掘り)ファイルなど (こちらは基本的に書き込み操作なし)
(書き込み操作はこちらで)
# 復帰/削除cgiなどについては、さてどっちかな => 今後の課題
という形で「ユーザの相手」と「各種ファイル処理」を複数のサーバに分業することにより、
さらなるパフォーマンスの向上を目論んでいます。
つまりこの場合、dat/subject.txt/subback.htmlは
バックエンドサーバで動作するbbsdというプログラムがリクエストに応じて生成し、
更新や場合によっては削除する形となります。
ということで、bbs.cgiをはじめとする従来2ちゃんねるで動いているcgiでは、
これらが同じサーバにあるつもりでファイル操作をしていましたが、
上記に示すように、少なくとも元本は同じサーバにはなくなるため、
何らかの形で対策を考慮する必要があります。
また現在、ID生成の種やSamba24や
timcount/timeclose等の規制関係で使用している一時ファイル等、
複数のフロントエンドサーバが同じ情報を、
何らかの形で共有する必要があるものもあります。
このスレッドではこれらの処理方法や実装方法について考えながら、
bbsdに持たせたい・持つべきな機能をあぶり出し、実装仕様を詰めていくことを目標にしています。 >>56
情報提供助かります。
このへんは、対応APIを組み込めばいけそうなかんじですね。
呪文の名前とか使い方とか、全然知らない(というか、調べないようにしている)私。
# 各種呪文を誰が雪だるまに対応させるのかとか、、、。
# 呪文のを知っている人が自然にやってくれますよ、うん。
# …などと、奈良県のほうを向いて、唱えておこう。そうしよう。 編集長様降臨されませませ…
神様ほっとけ様あらいぐま様…
(;-人-)南無阿弥陀仏南無阿弥陀仏… >>65
雪だるまと言われたからこっちに来たのだろう、と ってここ雪だるまは雪だるまでも難民じゃないじゃん!
誤爆スマソ とりあえず,仕様がはっきりしていて実装も比較的容易なものから順次やっていきます.
----------------------------------------------------------------------
指定した板の dat 数を得る:
my $ndats = bbsd($bbs, 'getndats', "$logfilename:$logline");
指定した dat を age る:
my $errmsg = bbsd($bbs, 'raise', $key, "$logfilename:$logline");
指定したファイルを touch する:
my $errmsg = bbsd($path, 'touch', $mtime, "$logfilename:$logline");
# $mtime は Unix 時間(0 なら現在時刻にする)
スレ立ての成功時はスレッドキーを返すよう変更
----------------------------------------------------------------------
ここまで実装しますた.
で,以下のはどのような仕様にするのがいいんでしょう.引数・戻り値や処理内容など......
[1-2] 1-A-b IDを作るための種ファイル 一
[1-9] 1-A-c スレッド立てすぎです、のための記録用ファイル 一
[1-10] 1-A-d timecount/timecloseのための記録用ファイル 一
[1-12] 1-B-c ●でスレッド立てすぎです、またにしてくださいの作業用ファイルとフォルダ 一
[1-13] 1-B-d Samba24の作業用ファイルとフォルダ 一 >>70
おつです、おつです。
そのへんについては、bbs.cgiで扱っている情報の種別・内容などを
書ける範囲でここに書いていくです。
今日はちと遅いので、明日以降にでも。 壁|A`).oO(なんか面白そうなスレだな・・・・見守ってみるか さて、いよいよ「詰めていく」をはじめようかと。
まずは、
[1-2] 1-A-b IDを作るための種ファイル 一
についてです。
IDの種は、板ごとにファイル(以下、種ファイルと呼ぶことにします)で持っていて、
そのフォーマットは、
YYYY_MM_DD<>xxバイトのバイナリ
となっています。
# YYYY になったのは、今日からです(w。
<> はセパレータです。
ようは、「日付」と「xxバイトの種」を、
板ごとに一セット、ファイルで記録していると考えていただければ、よいと思います。
(続く) で、bbs.cgiは、このような動作をするようです。
まずbbs.cgi船が出航すると、
いっとう最初の初期化のところで、種ファイルのチェックにいきます。
で、種ファイルがない(最初の状態)、あるいは読み込んだ種ファイルの
日付が今日じゃなかったら、bbs.cgiは種ファイルを作り直して、
作った日付と新しい種をファイルに記録して、以降その種を使います。
この時、xxバイトの種が変わります。つまり、IDが変わります。
で、読み込んだ種ファイルの日付が今日だったら、
読み込んだ種をそのまま使います。つまり、IDは前と変わらないわけです。
で、このファイルは基本的にbbs.cgi船の出航時にしか読み込まないようになっています。
(おじさんならではの、無駄なI/Oをできるだけ少なくする工夫)
つまり、船の再利用(2回目以降の実行)の時は、既に読んでいる種ファイルの
日付(2回目以降の実行なので、既にメモリ上にあります)のチェックだけをして、
2回目以降に起動された時の日付と比較しています。
その結果「まだ同じ日付」だったら、今メモリ上にある種を使い回すことにして、
ファイルの作り直し・読み直しをしません。
日付が違っていたら、作り直しをします。
ということで、日付が変わったら、その時点で船が生きていてもIDだけは変わるように、
私の知らない間に、いつの間にか改良が施されていたようです。 で、雪だるま環境では、この種ファイルは、複数あるフロントエンドで
同じものを共有する必要があります。
でないと、担当したクライアントごとに、IDが変わってしまいます。
しかも、0:00になったことをbbs.cgiが検知すると、
ファイルを更新する操作がかかります(サブルーチンになっています)。
なので、雪だるま環境では、こんな動きになると思います。
・bbs.cgiは最初のいっぱつめでbbsdに「板名」「今日のID種ちょうだい」と言う
・bbsdは「その板の今日のIDの種はこれだよ」と、16バイトのバイナリをbbs.cgiに返す
・bbs.cgiはディスク上(メモリディスクがベター)に、今まで同様に記録する
・bbs.cgiの動き的には、あとは今までと一緒
(続く) ということでbbsdでは、
・bbs.cgi に該当リクエストを聞かれた時点で、
もしファイルがなければ、public_html/板名/md5.cgi などという名前で、
>>73 のフォーマットのファイルを作成する
・もし>>73のファイルが既にあり、今日の日付だったら、
その中身の種を返す
・日付が変わっていたら、ファイルを作り直して、作り直した結果の種を返す
のように動く API を、一つ用意していただくとよいと思うです。
種は例えば /dev/random いくばくか読むなどして、16バイトのバイナリを、
板ごとにユニークに作っていただければよいです。
まずはこんなところで。 >>76 補足
> ・bbs.cgi に該当リクエストを聞かれた時点で、
> もしファイルがなければ、public_html/板名/md5.cgi などという名前で、
> >>73 のフォーマットのファイルを作成する
作成したうえで、呼び出し元に種を返さないといけませんね。はい。
そんでは、今日はねるです。 > [1-9] 1-A-c スレッド立てすぎです、のための記録用ファイル 一
のところを少しずつ読みはじめています。
ふーむ、、、。 簡単にいえば、行単位でのスタック処理ですね、これ。
> [1-10] 1-A-d timecount/timecloseのための記録用ファイル 一
も、同じようなスタック処理の様子。
汎用スタックルーチンを bbsd 側で作ってもらうのが、よさげな予感。 スタックというか、FIFOか。
少なくとも [1-9] はそういう動き。 [1-9] 1-A-c スレッド立てすぎです、のための記録用ファイル 一
これは、以下のようなFIFO用汎用APIをbbsd側で作っていただければいけると思います。
・板別FIFOへのデータ登録・チェックAPI
- 「板名」「FIFOファイル」「FIFO段数」「登録キー」「登録データ」を引数として、bbs.cgiから呼び出し
(例)
* 板名 operate
* FIFOファイル ほにゃらか.cgi (バックエンド側で public_html/operate/ほにゃらか.cgi となる)
* FIFO段数 数字(整数)
* 登録キー 数字(整数)
* 登録データ 文字列
1) FIFOファイルがなければ作成する
2) FIFOファイルがあった場合、中を調べて、
2-1) 既にFIFO中に同じ「登録キー」があったら、「もうそのキーはあるよ」をbbs.cgiに返す、
FIFOの順番はいじらない
2-2) 「登録キー」がなかったら、指定された「登録キー」「登録データ」をFIFOファイルに記録し、
「正常に登録できた」をbbs.cgiに返す
指定されたFIFO段数を超えた分は、古いものから順にFIFOから削除する FIFOファイルは、以下のフォーマットにしていただけるとありがたいです。
登録キー,登録データ
登録キー,登録データ
...
(FIFO段数分これが存在)
登録キー,登録データ
登録データとしては、, や ( ) が入ったりすることもありえます。 これで、bbsd で「スレッド立てすぎです」のためのFIFOを一元管理し、
各フロントエンドの bbs.cgi からスレ立て時に問い合わせることになります。
まだきちんと読んでいませんが、timecount/timeclose のところも
基本的にはこれまたはこれのバリアントで、いけるような気がしています。 ただ、バリアントとはいえ、微妙なことはいくつかしているようです。
たぶん、FIFOとはいえ、[1-10] は [1-9] ほど簡単な構造ではないですね。
いずれにせよ、以降は明日以降とゆうことで。 で、基本路線を書いておこうと。
基本的には、
dat直読みやsubject.txtはApacheの機能で、
すべてのフロントエンドで共有しなければいけないデータで、
かつすばやい同期・反映・浸透が求められるものは bbsd で一元管理し、
すべてのフロントエンドで共有しなければいけないデータで、
バックエンドからゆっくり同期すればいいもの(例: SETTING.TXT やキャップデータ)は、
rsync とかでゆくーり配る
別のマスターから配布しているもの(Rock54のデータとか)は、基本的に今までどおり
といったかんじで。 >>73-87 乙です.ぼちぼちやっていきます.
ところで,各データについてリブートをまたいで保持する必要があるか否か
ということについてはどうなりますでしょうか.リブートをまたいだ保持が
不要なデータについては,ファイルに記録せずオンメモリで完結させてしまった方が
簡単かも知れませんので...... >>88
基本的には、これまでここで出たものはファイルを持たせる方向でお願いしますです。 うぉ、暴発。
IDの種やスレッド立て抑制のためのデータは、さすがに揮発するとまずいです。
IDが変わってしまったり、リブート後にスレッド立ちまくりになったりしてしまうんで、、、。
明日以降ぼちぼちやっていこうと思っている、timecount/timecloseとかは、
場合によってはオンメモリだけでもいいかもしんないです。
これは私もまだ読みきってないんで、別途考慮ってかんじですか。 [1-12] 1-B-c ●でスレッド立てすぎです、またにしてくださいの作業用ファイルとフォルダ 一
[1-13] 1-B-d Samba24の作業用ファイルとフォルダ 一
これやろうかと。 [1-2] 1-A-b IDを作るための種ファイル 一 (>>73-77):
my $md5seed = bbsd($bbs, 'getmd5seed', "$logfilename:$logline");
・ $DOCUMENT_ROOT/$bbs/md5.cgi がなければ作成("yyyy_mm_dd<>16bytes-seed"),あればそれを読み込む.
・ yyyy_mm_dd を現在の日付と比較し,同じならそのまま返し,違っていたら作り直した上で返す.
[1-9] 1-A-c スレッド立てすぎです、のための記録用ファイル 一 (>>81-82):
my $value = bbsd($bbs, 'chkthr', $file, $n, $key, $value, "$logfilename:$logline");
・ $DOCUMENT_ROOT/$bbs/$file があればそれを読み込む.
・ $key というキーを持つデータが存在すれば,それと対になって記録されていた $value を戻り値として返す.
FIFO データは変更せず.(FIFO の順番だけでなく $value も更新しないということでいいんですよね?)
・ $key というキーを持つデータが存在しなければ,それを FIFO の末尾に追加する.
FIFO 段数が $n より多ければ余剰分を先頭から順に削除.
更新結果をファイルに書き出す.空文字列を戻り値として返す.
----------------------------------------------------------------------
ここまで実装しますた.
で,念のため [1-9] の $value の最大サイズがどの程度になるか教えておいて下さい.
あと,[1-10], [1-12], [1-13] の記録データの最大サイズも同様におながいします. >>93
おつです。おつです。
> (FIFO の順番だけでなく $value も更新しないということでいいんですよね?)
よいです。
> で,念のため [1-9] の $value の最大サイズがどの程度になるか教えておいて下さい.
ホストネームの最大長 + α ぐらいでよいと思います。
安全をみて、512 Bytes とかでよいかと。
> あと,[1-10], [1-12], [1-13] の記録データの最大サイズも同様におながいします.
了解です。
仕様指定時に改めて指定させていただきますです。 >>75-76
日付を管理するサーバが複数あると誤動作の元。
bbs.cgi で日付を管理、bbsd はbbs.cgiからもらった日付と板名をキーにして
テーブル等から種を検索する方法を提案します。 >>95
bbs.cgi は複数のサーバ(live22x1〜live22x3)で動くんで、
それだと、かえって混乱しちゃうような。 >>96
live22x1〜live22x3とlive22はntpで時間合わせしてる前提なので
それほどサーバ間で時間に差があることはないので、レアケースですが、
例えば、以下の状況だと、live22x1だけ一日前の種を使うことにならない?
live22x1:
日付が変わったので bbsd を呼ぶ (2005年11月07日00:00:00)
live22:
まだ日付が変わっていない (2005年11月06日23:59:59)
他の対策としては、bbsd側の種の更新タイミングを、bbs.cgiより1分ほど
早く設定すれば回避出来なくはないかな。
>>97
なるほど、
だとすると、
> ・bbsdは「その板の今日のIDの種はこれだよ」と、16バイトのバイナリをbbs.cgiに返す
の時に、bbsdからbbs.cgiに日付と種を両方返すことにして、
bbsdから戻ってきた日付が万一bbs.cgiの意図したものじゃなかったら、
その結果は捨てることにすればいいのかな。 >>98
いい感じですね
bsd.cgi は返って来たものが意図したものと違ってたら捨てて、
何回かリトライさせればOKだと思う
ところで、bsd.cgi は絶対に種は必要なのかな。
bbsd が保持してるだけじゃ駄目?
; H"の回線が切れたので、ID変わってます bbsd が返すのは現状でも "yyyy_mm_dd<>16bytes-seed" になってますね.
# というか,最初の仕様は 16bytes-seed の部分だけ返すという意図だったんですか...... >>99-101
了解です。
該当部分は、
if(open(MD5FILE, "<$md5datefile"))
{
my $md5line = <MD5FILE>;
close(MD5FILE);
my ($a, $b) = split(/<>/, $md5line, 2);
if ($a eq $md5date) {return $b;}
}
return &foxCreateMD5id($bbs,$md5date) ;
という感じなので、現状の仕様でよいと思います。
# 私の仕様指定があいまいだったわけですが、ちゃんと意図どおりになっていてよかたです。 >>99
> ところで、bsd.cgi は絶対に種は必要なのかな。
> bbsd が保持してるだけじゃ駄目?
そういう仕様(毎回bbsdに伺う)でも悪くはないですが、
IDの種は1日に1回しか変わらないので(通常運用では1日に1回だけリフレッシュすればよい)、
キャッシュさせたほうがいいのかなと。
で、IDをbbsd側でつけるというのも、なんか微妙にセンス悪いとゆうか、
bbs.cgi側の都合で変えたくなった時に、微妙にフレキシブルじゃないとゆうか。 >>103
> 毎回bbsdに伺う
正確には「船出航時に毎回bbsdに伺う」ですね。
SpeedyCGIだから。 >>104
そういう意味ではなく、種が必要な処理は全てbbsdに任せて、bbs.cgiは
種を使った処理をしないという選択もありでは?
種を使う処理が仮に書き込み時だけだとすると、書き込み時に bbsd が
変換すればOKなので。
と、各々の細かい役割を知らないのに勝手なこと言ってすいません。
>>105
個人的にbbs.cgiは内容には一切触れずに規制処理(DNS系統:省Rock54+BBR)だけ行えば?なぁんて妄想もしていたりします。
単一bbsdでは負担が掛かるようなら子供を産んでも良さそうな。とかとか。。。 同じこと言ってましたね。
ちゃんと読んでませんでした、申し訳ない。
bbsdとのI/Fは変えずに、単純に、bbs.cgi を frontend/backend に役割を分けて
しまう手もありますね。
>>105
書きこみ時に bbsd で共通部分の処理をするというセンスは、
次の段階としては、ありなのかな。
ただ、基本的にファイルI/Oと共通データベース処理に専念してほしい予感も。
そもそも、bbsd.cgiのバックエンド的な位置づけなわけだし。 bbsdって1000超えした時って、どういう処理をするんでしたっけ。
1) このスレッドは1000を超えました。 <br> \
もう書けないので、新しいスレッドを立ててくださいです。。。
を書くかどうか
2) 板名/1000.txt を読むかどうか >>109 1000.txt が存在すればそれを用い,なければ 1) の内容で dat に書き込みます. 久しぶりに来たが、ぜんぜん進展してないの?
つうか、まとめサイトは?
テンプレすら張ってないし。 >>113
もうすこしかな。
Check_HardPosting (連続投稿ですか?) のところの
しくみの洗い出しと理解を、先にやりたいです。
それができると、雪だるまのためのbbs.cgi洗い出しは、
概ねできたことになるはず。 timecount/timeclose の処理も、FIFOですね。
ここに書こうと。 簡単にいうと、こんなかんじ。
1) timecount分のFIFOを準備しておく
2) 投稿に固有のID(*1)をキーに、FIFOを探す
3) FIFO内にそのIDがtimeclose個以上あったら「連続投稿ですか? (見つかった回数)回」エラー
4) IDをFIFOに積む、古いものからところてん式に押し出されていく
(*1)IPアドレスまたは携帯固有番号またはp2の番号
これなら、先だって用意していただいたものと同じようなのを
もひとつ準備していただければ、できそうですね。 [1-10] 1-A-d timecount/timecloseのための記録用ファイル 一
についてです。
ということで、bbsdでは、
・SETTING.TXTを読んで、板ごとにtimecount段数分のFIFOを準備する
・FIFOには、何か文字列(とりあえず256バイト以内ぐらい)が積まれる
・bbs.cgiは「板」「ID」を引数とし、bbsdに「これについて調べてちょ」と聞く
・bbsdは指定された板のFIFOを検索して、指定されたIDがtimeclose個以上見つかったら、
その旨をbbs.cgiに返す。ただし、このときはbbsdはIDをFIFOに積まない
=> bbs.cgi はエラー処理(連続投稿ですか)をする
・timeclose個未満だったら、そのIDをFIFOに積み、bbs.cgiには正常を返す
=> bbs.cgi は正常系の処理をする
という形のAPIをbbsd側で作っていただけると助かります。
で、これは「記録用ファイル」と書きましたが、bbsd的にはメモリ上のみでよいと考えます。 あとは、>>92 ですか。
これらは基本的には、データベースですね。
ID、時間の要素、回数の要素
というDBをbbsd側で作っていただき、フロントからはそれに登録したり、
参照したりするかんじになるかなと。
詳細は、読みきったところで。 >>115-119 乙です.そちらもぼちぼち実装していきます.
ところでふと思ったんですが,timecount / timeclose データの FIFO の段数は
SETTING.TXT の timecount 値ということですが,となるとスレッド立てすぎデータ (>>93)
の FIFO 段数 $n も,ひょっとするとやはり SETTING.TXT の BBS_THREAD_TATESUGI 値
だったりするのでしょうか? もしそうだとすると......当初仕様通り bbsd 呼び出し時の
引数として $n を渡すのがいいのか,それとも bbsd 側で SETTING.TXT から取得するのがいいのか,
どうなんでしょうね.微妙なところかも知れませんが...... >>120
おぉ、鋭い指摘。
ちょっと、該当部分見てみるです。 読み直しました。
ご指摘のとおり、段数はbbs.cgi側からは要らないですね。
> - 「板名」「FIFOファイル」「FIFO段数」「登録キー」「登録データ」を引数として、bbs.cgiから呼び出し
を、
> - 「板名」「FIFOファイル」「登録キー」「登録データ」を引数として、bbs.cgiから呼び出し
つまり、
> my $value = bbsd($bbs, 'chkthr', $file, $n, $key, $value, "$logfilename:$logline");
の、$n は bbs.cgi 側から指定しないことにして、
bbsd が SETTING.TXT から TATESUGI を読んで、それを使う
ことにしていただければと思います。 [1-10] 1-A-d timecount/timecloseのための記録用ファイル 一 (>>118)
my $n = bbsd($bbs, 'chktimecount', $id, "$logfilename:$logline");
・ 段数 timecount の FIFO をオンメモリで作成.
・ $id のデータ数が timeclose 以上ならば戻り値としてそのデータ数を返す.
FIFO データは変更せず.
・ $id のデータ数が timeclose 未満ならば戻り値として 0 を返す.
FIFO に $id のデータを追加.
[1-9] 1-A-c スレッド立てすぎです、のための記録用ファイル 一 (>>93, >>122)
my $value = bbsd($bbs, 'chkthr', $file, $key, $value, "$logfilename:$logline");
・ 引数 $n を廃止し,FIFO 段数として BBS_THREAD_TATESUGI 値を使用するよう変更.
----------------------------------------------------------------------
ここまで実装しますた. Samba24の処理
a) Samba24用DB初期化用API
bbsdはbbs.cgi船が起動する時に指令を受ける
(bbs.cgiは最初にこの指令を出すように組まれる)
入力: 板名bname、秒数s
bbsdが起動して最初に指令を受けたら板別にDBを作り、
秒数sや回数nが異なった指令を受けたら、DBをconfigしなおす。
ただし、DBに蓄えているものは保持する。
指令が既にあるものと同じ秒数や回数だったら、何もしない。
万一a)の前にb)を受けたら、常に正常終了でよい。
# 最大10分、Samba24のDBが作られなくなりますが、、、。
# HDD上にDBをダンプするなり作るなりして、そこに前にあったbnameやsを入れるのもありです。
# というか、そのほうがよさげか。そうすればa)が来なくてもサービスできるですね。
# 将来秒数sはSETTING.TXTになるとのこと。 (続き)
b) Samba24用DB登録&チェック用API
1) 書き込みリクエストがあると、bbs.cgi は投稿に固有のID(*1)をキーに、
Samba24用DBに問い合わせを出す
入力: bname、ID
(*1)IPアドレスまたは携帯固有番号またはp2の番号
2) bbsdは投稿に固有のIDをキーに、Samba24用DBを検索する
DBでは、
「そのIDで問い合わせを受けた通産回数」と「そのIDで問い合わせを受けた最後の時間」
を保持している
今まで1回もそのIDで問い合わせを受けたことがなければ、
DBに「ID、1回、その時間」を登録して、正常終了を呼び出し元に返す (続き)
3) そのIDで問い合わせを受けたことがある場合は、
3.1) もし、前に問い合わせを受けてからs秒以上経過していた場合には、
DBのそのIDのエントリをリセット(*2)して、正常終了を呼び出し元に返す
(*2)「ID、1回、その時間」にする
3.2) もし、前に問い合わせを受けてからs秒未満だった場合には、
DB側のそのIDのエントリの回数により、下記のように動作が分かれる
3.2.1) もし、そのIDでの通産問い合わせ回数が注意回数
(デフォルト3回、何かで変更可能になっているとうれしい)以下だったら、
DBの「ID、通産回数、最終時間」を更新し、
「異常ステータス1」を呼び出し元に返す
3.2.2) もし、そのIDでの通産問い合わせ回数が注意回数を超えているが、
規制回数(デフォルト5回、何かで変更可能になっているとうれしい)以下だったら、
DBの「ID、通産回数、最終時間」を更新し、
「異常ステータス2」を呼び出し元に返す
3.2.3) もし、そのIDでの通産問い合わせ回数が規制回数を超えたら、
DBを「ID、永久」にし、
「異常ステータス3」を呼び出し元に返す
3.2.4) 「ID、永久」の状態になった以降は、s秒以上の時間を空けた問い合わせが
あったとしても、すべて「異常ステータス3」を呼び出し元に返す c) Samba24用DBリセット用API
F22から呼ばれる。
これを呼ぶと、そのbbsdで管理しているSamba24用DBの中身は全部ゼロクリアされる
ただし、a) で初期化した値はそのまま残る
d) Samba24用DB状況調査用API
F22から呼ばれる。
これを呼ぶと、いくつのIDがSamba24用DBに登録されているかを返す …というかんじです。日本語が、微妙かもしれないですね。
変なところがあったら、書いてくださいです。> SunOSさん
日本語で説明を書き下すと、以外に複雑な形になってしまいましたが、
実際の中身は、それほどのものでもないです。
ようは、同じIDで短い時間の間に何度も何度もやると、だんだんと出世していって、
そのうち永久になっちゃいますよ、っていうかんじです。
それを、コスト低く実現していると。
今日は、こんなところで。 …と、ここまで書いて、
s秒をbbsdで管理するか、bbs.cgiで管理するか、
微妙なかんじもしてきました。
つまり、bbsdでは「回数」「前の問い合わせからの経過秒数」を戻りにして、
Sambaの判定は、bbs.cgiでやらせたほうがいいんじゃないかなと。
その路線だと、、、。ちょっと、再度考えてみるですかね。 >>131 は別途、明日以降考えてみるです。
そんでは、今日はおやすみなさい。 >>126-132 乙です.処理内容のイメージはだいたいつかめました.
問題は設定値(規定秒数・注意回数・規制回数)の扱いというところですか.
># 将来秒数sはSETTING.TXTになるとのこと。
というのを雪だるまを機に実施して,そうした設定値をすべて
SETTING.TXT から取得できるようにするのも一案かも知れませんが,
それができなければどうするかというところで......
「a) Samba24用DB初期化用API」と「b) Samba24用DB登録&チェック用API」
を別々にした場合,>>126 でも言及されているように a) より b) が
先に来るという可能性もあるのですが,それなら両者を統合して
「b) Samba24用DB登録&チェック用API」の引数でそれらの設定値も
一緒に渡すというのも一案かも知れませんね.いずれにせよ
秒数や回数の判定は登録&チェックの段階で行うことになりますし.
あるいは >>131 のように設定値に基づく判定は bbs.cgi 側が行って
bbsd は登録のみ行うということも考えられますが,その場合
規定秒数以上だった場合のリセットが行えないのが問題ですかね. あと,規定秒数以上経過していたエントリは消していかないと,DB がどんどん肥大化
していきそうな気もしますね(その対策として c) があるのだと思いますが,
その呼び出しが来る前の段階で肥大化を防げればその方が良さそうな気もします).
ということで,やはり規定秒数は何らかの形で bbsd が知っておいた方がいいかも知れません. >>133
どもです。
> 問題は設定値(規定秒数・注意回数・規制回数)の扱いというところですか.
そういうことですね。
なんか「ステートレス」「ステートフル」っていう話か。
> 「a) Samba24用DB初期化用API」と「b) Samba24用DB登録&チェック用API」
> を別々にした場合,>>126 でも言及されているように a) より b) が
> 先に来るという可能性もあるのですが,それなら両者を統合して
> 「b) Samba24用DB登録&チェック用API」の引数でそれらの設定値も
> 一緒に渡すというのも一案かも知れませんね.いずれにせよ
> 秒数や回数の判定は登録&チェックの段階で行うことになりますし.
これ、いいかもですね。
毎回bbsdに引数を全部渡せばいいのか。
>>134
そですね。DBのレコード毎にexpireできる仕組みを実装していただけると、
いいようなかんじで。
ちょっと、これらの路線で改めて仕様考えてみるです。 a+b) Samba24用汎用API、●でスレッド立て過ぎにも使用
書き込みリクエストがあると呼ばれる。
引数: bname, ID, s, w, k
bname: 板名
ID: IPアドレスまたは携帯固有番号またはp2の番号または●セッションID
(任意の文字列として取り扱えればOK)
s: 秒数 (s > 0)
w: 注意回数 (w >= 0)
k: 規制回数 (k >= w >= 0)
処理内容:
今まで1回もそのIDで問い合わせを受けたことがなければ、
DBに「ID、1回、その時間」を登録して、正常終了を呼び出し元に返す。
そのIDで問い合わせを受けたことがある場合は、
もし、前に問い合わせを受けてからs秒以上経過していた場合には、
DBのそのIDのエントリをリセット(*2)して、正常終了を呼び出し元に返す
(*2)「ID、1回、その時間」にする。
(続く) (続き)
もし、前に問い合わせを受けてからs秒未満だった場合には、
DB側のそのIDのエントリの回数により、下記のように動作が分かれる。
1) もし、そのIDでの通産問い合わせ回数が注意回数w以下だったら、
DBの「ID、通産回数、最終時間」を更新し、
「異常ステータス1」を呼び出し元に返す。
2) もし、そのIDでの通産問い合わせ回数が注意回数wを超えているが、 規制回数k以下だったら、
DBの「ID、通産回数、最終時間」を更新し、
「異常ステータス2」を呼び出し元に返す。
3) もし、そのIDでの通産問い合わせ回数が規制回数kを超えたら、
DBを「ID、規制発動」にし、
「異常ステータス3」を呼び出し元に返す。
4) 「ID、永久」の状態になった以降は、s秒以上の時間を空けた問い合わせで
あったとしても、すべて「異常ステータス3」を呼び出し元に返す。 (続き)
あ、「ID、規制発動」になおしてください。< 4)
「ID、規制発動」の状態になってから3600秒(1時間)経過したら、
あるいは最後の問い合わせから3600秒経過したら、
そのIDのエントリをDBからexpireする。 これで、bbs.cgi側から普段使うAPIはひとつにできそうです。
で、●でスレッド立てすぎです、にも、応用できるですね。
bname: 板名
ID: ●のID
s: 3600
w: 6
k: 6
とかやれば、1時間で6つまでしか同じ●でスレッド、立てられないはず。
<チラシの裏>
うまくやれば、●を使ったスレつぶしにも対応できそうな気がしますが、
それは同じIDでDBを複数持たせる必要があるのかな。
あと、このI/Fを利用して、他サーバのbbs.cgiからex14のbbsdに通信して、
news4vipに関するデータを参照するとか(以下略。
</チラシの裏>
で、これをすればF22での定期クリアは必要なさそうな気もしますが、
メンテナンス用に、以下のI/Fは準備いただけると。 以下というのは、あと >>129 のやつですね。
とりあえず、こんなところでどうでしょうか。 で、あと、
これまで出た中で、詰めなければいけない仕様って、あったっけか。 …で、私のほうでも、
bbs.cgi 見直してみるです。
この目的のために、かなり整理整頓したわけで。 >>135-142 乙です.で,確認しておきたい点としては,この API 用の DB は
オンメモリで完結ということでもいいのでしょうか,ということと,
Samba24 と ● のデータを1つの DB に混在させる形でもいいのでしょうか,
というところです.
あと,確認事項で残っているものはこれでしょうかね.
[1-3] 1-B-a index.htmlの広告ファイル1 四
[1-4] 1-B-a index.htmlの広告ファイル2 四
[1-8] 1-C-a bbspinkのみの広告ファイル 四 考えてみると,性質の異なるデータを1つの DB に混在させてしまうより,
別々の DB に分けた方が検索効率もアップしますし,>>139 のチラシの裏のような
用途への応用も考えると,複数の DB を作成できるようにした方が汎用性は高そうですね.
ということで「板名」以外に「DB名」という引数も設け,1つの板で複数の DB を
持てるようにするのもいいかも知れませんね. >>143-144
> この API 用の DB はオンメモリで完結ということでもいいのでしょうか
こういう仕様だといいかもです。
1) bbsdが終了する時に、HDDに吐き出して終了する
場所・場所は public_html/test/bbsdのDBとわかるもの.cgi あたりで
2) bbsdは起動時にそのDBがあるか調べて、あれば読み込んでスタート
あとはオンメモリで動作
> Samba24 と ● のデータを1つの DB に混在させる形でもいいのでしょうか,
これは >>144 のご指摘のとおり、DB名を指定できるとすばらしいです。
今後何か装置を開発した時に、DB名を変えていろいろとDBを増やせそうなので。
ということで、>>136 はこんな汎用APIになりますか。
(続く) (続き)
a+b) Samba24用汎用API、●でスレッド立て過ぎにも使用
書き込みリクエストがあると呼ばれる。
引数: DB, bname, ID, s, w, k
DB: 文字列(例: samba24)
bname: 板名
ID: IPアドレスまたは携帯固有番号またはp2の番号または●セッションID
(任意の文字列として取り扱えればOK)
s: 秒数 (s > 0)
w: 注意回数 (w >= 0)
k: 規制回数 (k >= w >= 0)
処理内容:
今まで1回もそのIDで問い合わせを受けたことがなければ、
DBで指定されたDBに「ID、1回、その時間」を登録して、正常終了を呼び出し元に返す。
そのIDで問い合わせを受けたことがある場合は、
もし、前に問い合わせを受けてからs秒以上経過していた場合には、
指定されたDBのそのIDのエントリをリセット(*2)して、正常終了を呼び出し元に返す
(*2)「ID、1回、その時間」にする。 >>143
あとは広告関係ですか。
ぼちぼち仕様出していきますが、このへんは実際に動かしながらでもいいかなと。 で、先回りして言っておくと、広告には「取り扱い的に」種類が大きく二つあるです。
a) 所定のファイルを読み込んでいる広告
b) bbs.cgiにハードコーディングで埋め込まれている報告
a) は、bbsdで無理なく対応可能ですが、
b) を、さてどうするかと。
というわけでこのへんは、動かしながら調整かなぁと。 ということで、今日はこのへんで二度寝するです。
なんか寝床からムニャーとしながら京ぽんでアクセスしたら、
何か漏れてたみたいで、PC出してごそごそと。 で、bbs.cgiに埋め込まれている広告問題ですが、
a) このさいだから、bbs.cgiから切り出す
b) bbs.cgi から bbsd に何らかの方法で渡す
の2つが考えられるですね。
でかいのは a) にするとして、b) もある程度残りそうな予感も少し。 >>145-150 乙です.では DB 用 API はそういう形で実装していきます.
これが完了すると,とりあえず bbsd 側では動かせる形になるってところですかね.
広告については,確かに大きく固まってる部分は切り出しも容易でしょうけど,
細かくちりばめられてる部分をどうするかってのは考えどころですね...... >>151
了解です。よろしくおねがいしますです。
で、それ(広告)をうまく切り出せるようにすることをめざして、
作業をすすめています。
しかし、
MakeWorkFile
MakeIndex4Keitai
MakeIndex4PC
いずれも、割と神の領域だったりするんだな、これが。 厳密にはスレ違いですが。
read.cgi と offlaw.cgi は、とりあえずmor_proxy経由でバックエンドで動かして、
mod_cache を通さないようにする、という、アドホックな路線でいってみようかと。
で、ひとつSunOSさんにというか、Apacheをわかっている方に質問なのですが、
<IfModule mod_cache.c>
CacheDisable /livejupiter/SETTING.TXT
CacheEnable disk /livejupiter/
CacheRoot /md/cache
CacheSize 65536
</IfModule>
なんて書いた場合、/md/cache のオーナーとかパーミッションって、
どうすればよかったんでしたっけか。
なんか、キャッシュされないみたいなんで。 LoadModule cache_module modules/mod_cache.so
が抜けているとか? Samba24 用汎用 DB チェック&登録:
my $statnum = bbsd($bbs, 'chkid', $dbname, $id, $seconds, $nwarn, $nkick, "$logfilename:$logline");
・ このような流れ:
if ($id エントリ存在) {
if ($id_entry->n == 規制発動)
$statnum = 3;
else if (現在時刻 - $id_entry->time >= $seconds) {
$id_entry->n = 1;
$statnum = 0;
}
else if (++$id_entry->n <= $nwarn)
$statnum = 1;
else if ($id_entry->n <= $nkick)
$statnum = 2;
else {
$id_entry->n = 規制発動;
$statnum = 3;
}
}
else {
$id エントリ作成;
$id_entry->n = 1;
$statnum = 0;
}
$id_entry->time = 現在時刻;
return $statnum;
・ (現在時刻 - $id_entry->time >= 3600 秒) のエントリは削除.
・ データは $DOCUMENT_ROOT/$bbs/bbsd_dbs/$dbname にストア.
次回起動時にそのファイルがあれば読み込んで利用.
bbsd_dbs ディレクトリが存在しなければ自動的に作成し,
その際 "Deny from all" という内容の .htaccess も自動作成.
# これでファイル名を *.cgi にしたりダミーの index.html を作成したりも不要かと.
Samba24 用汎用 DB チェック:
my $statnum = bbsd($bbs, 'peekid', $dbname, $id, $seconds, $nwarn, $nkick, "$logfilename:$logline");
・ エントリ登録・更新を行わないが,それ以外は chkid と同じ.
Samba24 用汎用 DB クリア:
my $errmsg = bbsd($bbs, 'clearids', $dbname, "$logfilename:$logline");
Samba24 用汎用 DB エントリ数カウント:
my $n = bbsd($bbs, 'countids', $dbname, "$logfilename:$logline"); スレスト:
my $errmsg = bbsd($bbs, "stop:$key", $datline, "$logfilename:$logline");
スレ再開:
my $errmsg = bbsd($bbs, "restart:$key", $datline, "$logfilename:$logline");
$datline は dat に追記する内容(通常書き込み時と同フォーマット).
スレ移動:
my $errmsg = bbsd($bbs, "move:$key", $newbbs, "$logfilename:$logline");
----------------------------------------------------------------------
以上実装しますた.別鯖へのスレ移動を除いて一通り実装できたかと思います.
>>153 乙です.
>/md/cache のオーナーとかパーミッション
httpd プロセスが読み書き可能なオーナ・パーミッションであれば Ok かと.
>なんか、キャッシュされないみたいなんで。
とりあえず "LogLevel debug" にしてみると手がかりが得られるかも知れません.
>read.cgi と offlaw.cgi は、とりあえずmor_proxy経由でバックエンドで動かして、
>mod_cache を通さないようにする、という、アドホックな路線でいってみようかと。
これやるなら,Last-Modified を吐くようにしてキャッシュを効かせる形の方が良さそうな気もしますけどね. >>154
ううむ、入っていると思うけど、、、。
>>155
おつです。
これで、bbsdの準備は整った、ということ、、、なのかな。
read.cgi の改良は、第二段階ですね。
で、たぶん将来的には、read.cgi/offlaw.cgiはlive22じゃなくて、
live22xで動かすようにするほうがよさげかなと。 で、live22のbbsdを更新しました。
いっぽ、いっぽ。 ■ このスレッドは過去ログ倉庫に格納されています