X



トップページ運用情報
498コメント239KB
【雪だるま】bbsd⇔各cgi間のI/F仕様について考え・詰めていくスレッド
■ このスレッドは過去ログ倉庫に格納されています
0001root▲ ★
垢版 |
NGNG
雪だるま作戦において開発をすすめている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に持たせたい・持つべきな機能をあぶり出し、実装仕様を詰めていくことを目標にしています。
0049◆cZfSunOs.U
垢版 |
2005/10/29(土) 00:28:15ID:CK7XWoMC0
とりあえず,今までに挙がった要実装のものはこんなところでしょうか.

>>16
>[1-2] 1-A-b IDを作るための種ファイル 一
>>21
>[1-9] 1-A-c スレッド立てすぎです、のための記録用ファイル 一
>[1-10] 1-A-d timecount/timecloseのための記録用ファイル 一
>>23
>・立てようとしたスレッドキーじゃないキーでスレッドが立つケースの考慮要。
>>24
>[1-12] 1-B-c ●でスレッド立てすぎです、またにしてくださいの作業用ファイルとフォルダ 一
>[1-13] 1-B-d Samba24の作業用ファイルとフォルダ 一
>>25
>[1-3] 1-B-a index.htmlの広告ファイル1 四
>[1-4] 1-B-a index.htmlの広告ファイル2 四
>[1-8] 1-C-a bbspinkのみの広告ファイル 四
>>26
>・指定したdatをageる => スレッド924で使用
>・指定した板のdat数を得る => ごめんなさいリミッターで使用
>>29
>・指定したファイルをtouchする => キャップのあぶり出しで使用
>>40
>あとは、、、。各種呪文ですね。
0050root▲ ★
垢版 |
NGNG
>>41 >>43-44
板別のSambaの秒数データは、bbs.cgi が持っているです。
bbs.cgiを雪だるま仕様にしても、概ねそのまま動くと思っています。

>>42
Rock54のデータ従来通り、
>>16
> [1-7] 1-B-a Rock54用データファイル 三

は、個々のフロント側bbs.cgi(の船)で抱え込めばOKと思います。
つまり、既にbbs.cgiで抱え込んでいるので、
bbs.cgiを雪だるま仕様にしても、概ねそのまま動くと思っています。
0051root▲ ★
垢版 |
NGNG
>>45
> bbsd に機能を実装するものはフロント側に置いた CGI から bbsd を呼んで,
> bbsd に機能を実装しないものはバック側においた CGI を mod_proxy でそのまま呼ぶ,
> って感じでしょうか.まぁこの点はとりあえず今後のことですね.

そういうことになりますね。

> これは,bbsd で保持している subject データと実際の dat 数に
> 乖離が生じるのは,サーバダウン後復帰かける前など限られた条件下のみと
> 思われるので,subject データからカウントする方が軽そうですが,どうでしょうか?

それで問題ないと思います。
下記にもありますが、subject.txtが信用できるなら、そのほうが軽そうです。

> >スレッドの容量による制限(unless( -s $DATAFILE <= 512000))
> このチェックはすでに bbsd に入ってますね(EDQUOT に相当する
> エラーメッセージを返します).

了解です。
つまり雪だるま仕様では「書いてみて EDQUOT だったらこのエラーにすればよい」と。

> >>33-34
> 1000 レスや 512kB に到達した時点でパーミッションは 0555 にするようになってます.
> で,このパーミッションなら dat に書き込もうとすれば自ずと EACCES になりますね.

つまり雪だるま仕様では「書いてみて EACCESS だったらこのエラーにすればよい」と。
0052root▲ ★
垢版 |
NGNG
>>45 続き
> >>40
> >現在のbbsdで「常時かかえて握っている」ファイルは、
> >subject,txt / subback.html / index.html の3つだけで、よかったんでしたっけか。
> >それとも SETTING.TXT も抱えちゃうんでしたっけ。
> 「仮に他のプログラムが変更しても bbsd によって上書きされる」ということなら
> subject.txt / subback.html / index.html の3つですね.SETTING.TXT は
> 読み込み専用なのでそういうことはありません.ただ,設定読み込みのため
> mmap() したままにするので,更新時にはいったん別ファイル名でうpしてから
> rename という手順でやってもらった方がいいです.

なるほど。
「常時抱えて握っている」というのは、mmap() したままにする、とか、
open() したままにする、という意味でした。

個々の dat は、握らないのですね。

言い替えれば「bbsdにお伺いを立てずに今まで通り更新してもよいのか、
上記のようにアトミック性を考慮した更新をする必要があるのか、ということを
言っていました。

わかったこと: SETTING.TXT を変更する cgi は、変更する必要あり。
手でむぎゅる場合も、cp してそっちをいじって mv する必要がある。
0053root▲ ★
垢版 |
NGNG
>>45 さらに続き
> 以下,とりあえず現在実装されているものを列記します.
> 書き込み処理:
> my $errmsg = bbsd($bbs, $key, $datline, $footnote, "$logfilename:$logline");

これで、スレ立ても大丈夫なのかしら。
あと、それぞれのAPIの戻り値の意味を教えていただけると助かります。

> レスの通常あぼーん:
> my $errmsg = bbsd($bbs, "delete:$key", $range, "$logfilename:$logline");
> レスの透明あぼーん:
> my $errmsg = bbsd($bbs, "tdelete:$key", $range, "$logfilename:$logline");
> スレッドのゴミ箱逝き:
> my $errmsg = bbsd($bbs, "delete:$key", '*', "$logfilename:$logline");
> スレッドのファイル自体削除:
> my $errmsg = bbsd($bbs, "tdelete:$key", '*', "$logfilename:$logline");

削除系は、このへんを呼べばよいと。
subject.txt のつじつまは、合うのかしら。

あとは、スレスト処理ですかね。

> スレを subject から消す:
> my $errmsg = bbsd($bbs, 'purge', $keys, "$logfilename:$logline");

これは、スレ削除すると必要?

> subject.txt 等の再生成:
> my $errmsg = bbsd($bbs, 'repair', "$logfilename:$logline");
> dat/*.dat から html/*.html を再生成:
> my $errmsg = bbsd($bbs, 'makehtml', "$logfilename:$logline");

このへんは復帰処理に組み込む、ってことですね。

> ステータス情報の取得:
> my $statmsg = bbsd($bbs, 'stat', "$logfilename:$logline");

これは、何が戻って来るんでしたっけか。
0055◆cZfSunOs.U
垢版 |
2005/10/29(土) 00:59:03ID:CK7XWoMC0
>>52
>個々の dat は、握らないのですね。

握りませんです.

>>53
> > 書き込み処理:
> > my $errmsg = bbsd($bbs, $key, $datline, $footnote, "$logfilename:$logline");
>
>これで、スレ立ても大丈夫なのかしら。
>あと、それぞれのAPIの戻り値の意味を教えていただけると助かります。

これはスレ立て・レス追加兼用ですね(どちらであるかは $datline 中のスレタイフィールドに
文字列が入っているか否かで判断しています).$errmsg とあるのはすべて,成功時は空文字列,
失敗時はそれを示すエラーメッセージとなります.ただし,スレ立ての成功時は
>>23によりスレッドキーを返すよう変更する方向となりますかね.

> > レスの通常あぼーん:
> > レスの透明あぼーん:
> > スレッドのゴミ箱逝き:
> > スレッドのファイル自体削除:
>
>削除系は、このへんを呼べばよいと。
>subject.txt のつじつまは、合うのかしら。

そうですね.subject も含めて処理します.

> > スレを subject から消す:
>
>これは、スレ削除すると必要?

上記 API によるスレ削除の場合は不要です.F22 による dat 落ちなどによる
利用を想定したものです.

> > subject.txt 等の再生成:
> > dat/*.dat から html/*.html を再生成:
>
>このへんは復帰処理に組み込む、ってことですね。

そうですね.

> > ステータス情報の取得:
>
>これは、何が戻って来るんでしたっけか。

これは各種 CGI の処理とは直接関係ないですが,チューニングなどの際に
参考になるように各種情報を返します.まぁ百聞は一見にしかずで
実際に呼んでみるとわかるかと思います.
0056削除屋@放浪人 ★
垢版 |
2005/10/29(土) 01:00:12ID:???0
>>53
中身を見てないで、動作だけのお話しですが、
スレッド移動は、恐らくdatを移動した後、subject.txtの
一番下に、直接スレッドキー+タイトルを書き込んでる
と思います(必ず移動後に、subject.txtの一番下に
移転したスレッドが現れますので)。

スレストは、subject.txtに対しては何もしてません(多分)。
スレ削除は、subject.txtからスレッドキー+タイトルも
削除しているようです。
0057root▲ ★
垢版 |
NGNG
>>55
> 握りませんです.

なるほど、F22は従来通りdatを落としてよいと。
# で、つじつま合わせのためのAPIもあると(下記)。

> (どちらであるかは $datline 中のスレタイフィールドに
> 文字列が入っているか否かで判断しています).

了解です。
新スレかどうかの判定部分ではこんなかんじ↓のことをしているので、
bbs.cgiとも親和性がよいです。

#subjectがあれば新規スレッド
if($GB->{FORM}->{'subject'} ne ""){

で、
> ただし,スレ立ての成功時は
> >>23によりスレッドキーを返すよう変更する方向となりますかね.

としていただけるとありがたいです。

> そうですね.subject も含めて処理します.

了解です。
であれば、削除後の復帰処理は要らないというか、
呪文を対応させる時はそういうふうにする必要があると。

> F22 による dat 落ちなどによる
> 利用を想定したものです.

さすがです。

> まぁ百聞は一見にしかずで実際に呼んでみるとわかるかと思います.

やってみます。
というか、ソース読んでみればいいのか。
0058root▲ ★
垢版 |
NGNG
>>56
情報提供助かります。

このへんは、対応APIを組み込めばいけそうなかんじですね。
呪文の名前とか使い方とか、全然知らない(というか、調べないようにしている)私。

# 各種呪文を誰が雪だるまに対応させるのかとか、、、。

# 呪文のを知っている人が自然にやってくれますよ、うん。
# …などと、奈良県のほうを向いて、唱えておこう。そうしよう。
0070◆cZfSunOs.U
垢版 |
2005/10/31(月) 02:06:22ID:4tjMop6J0
とりあえず,仕様がはっきりしていて実装も比較的容易なものから順次やっていきます.
----------------------------------------------------------------------
指定した板の 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の作業用ファイルとフォルダ 一
0071root▲ ★
垢版 |
NGNG
>>70
おつです、おつです。

そのへんについては、bbs.cgiで扱っている情報の種別・内容などを
書ける範囲でここに書いていくです。
今日はちと遅いので、明日以降にでも。
0072('A`) ◆jOBMANDKSA
垢版 |
2005/11/01(火) 04:13:44ID:lNSUZa7JO
壁|A`).oO(なんか面白そうなスレだな・・・・見守ってみるか
0073root▲ ★
垢版 |
NGNG
さて、いよいよ「詰めていく」をはじめようかと。
まずは、

[1-2] 1-A-b IDを作るための種ファイル 一

についてです。

IDの種は、板ごとにファイル(以下、種ファイルと呼ぶことにします)で持っていて、
そのフォーマットは、

YYYY_MM_DD<>xxバイトのバイナリ

となっています。
# YYYY になったのは、今日からです(w。

<> はセパレータです。
ようは、「日付」と「xxバイトの種」を、
板ごとに一セット、ファイルで記録していると考えていただければ、よいと思います。

(続く)
0074root▲ ★
垢版 |
NGNG
で、bbs.cgiは、このような動作をするようです。

まずbbs.cgi船が出航すると、
いっとう最初の初期化のところで、種ファイルのチェックにいきます。

で、種ファイルがない(最初の状態)、あるいは読み込んだ種ファイルの
日付が今日じゃなかったら、bbs.cgiは種ファイルを作り直して、
作った日付と新しい種をファイルに記録して、以降その種を使います。
この時、xxバイトの種が変わります。つまり、IDが変わります。

で、読み込んだ種ファイルの日付が今日だったら、
読み込んだ種をそのまま使います。つまり、IDは前と変わらないわけです。

で、このファイルは基本的にbbs.cgi船の出航時にしか読み込まないようになっています。
(おじさんならではの、無駄なI/Oをできるだけ少なくする工夫)
つまり、船の再利用(2回目以降の実行)の時は、既に読んでいる種ファイルの
日付(2回目以降の実行なので、既にメモリ上にあります)のチェックだけをして、
2回目以降に起動された時の日付と比較しています。
その結果「まだ同じ日付」だったら、今メモリ上にある種を使い回すことにして、
ファイルの作り直し・読み直しをしません。
日付が違っていたら、作り直しをします。

ということで、日付が変わったら、その時点で船が生きていてもIDだけは変わるように、
私の知らない間に、いつの間にか改良が施されていたようです。
0075root▲ ★
垢版 |
NGNG
で、雪だるま環境では、この種ファイルは、複数あるフロントエンドで
同じものを共有する必要があります。
でないと、担当したクライアントごとに、IDが変わってしまいます。

しかも、0:00になったことをbbs.cgiが検知すると、
ファイルを更新する操作がかかります(サブルーチンになっています)。

なので、雪だるま環境では、こんな動きになると思います。

・bbs.cgiは最初のいっぱつめでbbsdに「板名」「今日のID種ちょうだい」と言う
・bbsdは「その板の今日のIDの種はこれだよ」と、16バイトのバイナリをbbs.cgiに返す
・bbs.cgiはディスク上(メモリディスクがベター)に、今まで同様に記録する
・bbs.cgiの動き的には、あとは今までと一緒

(続く)
0076root▲ ★
垢版 |
NGNG
ということでbbsdでは、

・bbs.cgi に該当リクエストを聞かれた時点で、
もしファイルがなければ、public_html/板名/md5.cgi などという名前で、
>>73 のフォーマットのファイルを作成する

・もし>>73のファイルが既にあり、今日の日付だったら、
その中身の種を返す

・日付が変わっていたら、ファイルを作り直して、作り直した結果の種を返す

のように動く API を、一つ用意していただくとよいと思うです。

種は例えば /dev/random いくばくか読むなどして、16バイトのバイナリを、
板ごとにユニークに作っていただければよいです。

まずはこんなところで。
0077root▲ ★
垢版 |
NGNG
>>76 補足
> ・bbs.cgi に該当リクエストを聞かれた時点で、
> もしファイルがなければ、public_html/板名/md5.cgi などという名前で、
> >>73 のフォーマットのファイルを作成する
作成したうえで、呼び出し元に種を返さないといけませんね。はい。

そんでは、今日はねるです。
0078root▲ ★
垢版 |
NGNG
> [1-9] 1-A-c スレッド立てすぎです、のための記録用ファイル 一

のところを少しずつ読みはじめています。
ふーむ、、、。
0079root▲ ★
垢版 |
NGNG
簡単にいえば、行単位でのスタック処理ですね、これ。

> [1-10] 1-A-d timecount/timecloseのための記録用ファイル 一

も、同じようなスタック処理の様子。

汎用スタックルーチンを bbsd 側で作ってもらうのが、よさげな予感。
0080root▲ ★
垢版 |
NGNG
スタックというか、FIFOか。
少なくとも [1-9] はそういう動き。
0081root▲ ★
垢版 |
NGNG
[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から削除する
0082root▲ ★
垢版 |
NGNG
FIFOファイルは、以下のフォーマットにしていただけるとありがたいです。

登録キー,登録データ
登録キー,登録データ
...
(FIFO段数分これが存在)
登録キー,登録データ

登録データとしては、, や ( ) が入ったりすることもありえます。
0083root▲ ★
垢版 |
NGNG
これで、bbsd で「スレッド立てすぎです」のためのFIFOを一元管理し、
各フロントエンドの bbs.cgi からスレ立て時に問い合わせることになります。

まだきちんと読んでいませんが、timecount/timeclose のところも
基本的にはこれまたはこれのバリアントで、いけるような気がしています。
0084root▲ ★
垢版 |
NGNG
…さて、とりあえず今日はこのぐらいで。
0085root▲ ★
垢版 |
NGNG
ただ、バリアントとはいえ、微妙なことはいくつかしているようです。
たぶん、FIFOとはいえ、[1-10] は [1-9] ほど簡単な構造ではないですね。

いずれにせよ、以降は明日以降とゆうことで。
0086root▲ ★
垢版 |
NGNG
で、基本路線を書いておこうと。
基本的には、

dat直読みやsubject.txtはApacheの機能で、

すべてのフロントエンドで共有しなければいけないデータで、
かつすばやい同期・反映・浸透が求められるものは bbsd で一元管理し、

すべてのフロントエンドで共有しなければいけないデータで、
バックエンドからゆっくり同期すればいいもの(例: SETTING.TXT やキャップデータ)は、
rsync とかでゆくーり配る

別のマスターから配布しているもの(Rock54のデータとか)は、基本的に今までどおり

といったかんじで。
0088◆cZfSunOs.U
垢版 |
2005/11/01(火) 23:44:09ID:WRnidKIn0
>>73-87 乙です.ぼちぼちやっていきます.

ところで,各データについてリブートをまたいで保持する必要があるか否か
ということについてはどうなりますでしょうか.リブートをまたいだ保持が
不要なデータについては,ファイルに記録せずオンメモリで完結させてしまった方が
簡単かも知れませんので......
0089root▲ ★
垢版 |
NGNG
>>88
基本的には、これまでここで出たものはファイルを持たせる方向でお願いしますです。
0090root▲ ★
垢版 |
NGNG
うぉ、暴発。

IDの種やスレッド立て抑制のためのデータは、さすがに揮発するとまずいです。
IDが変わってしまったり、リブート後にスレッド立ちまくりになったりしてしまうんで、、、。

明日以降ぼちぼちやっていこうと思っている、timecount/timecloseとかは、
場合によってはオンメモリだけでもいいかもしんないです。
これは私もまだ読みきってないんで、別途考慮ってかんじですか。
0092root▲ ★
垢版 |
NGNG
[1-12] 1-B-c ●でスレッド立てすぎです、またにしてくださいの作業用ファイルとフォルダ 一
[1-13] 1-B-d Samba24の作業用ファイルとフォルダ 一

これやろうかと。
0093◆cZfSunOs.U
垢版 |
2005/11/05(土) 21:55:21ID:JPA5x/Zh0
[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] の記録データの最大サイズも同様におながいします.
0094root▲ ★
垢版 |
2005/11/05(土) 23:21:16ID:???0
>>93
おつです。おつです。

> (FIFO の順番だけでなく $value も更新しないということでいいんですよね?)

よいです。

> で,念のため [1-9] の $value の最大サイズがどの程度になるか教えておいて下さい.

ホストネームの最大長 + α ぐらいでよいと思います。
安全をみて、512 Bytes とかでよいかと。

> あと,[1-10], [1-12], [1-13] の記録データの最大サイズも同様におながいします.

了解です。
仕様指定時に改めて指定させていただきますです。
0095動け動けウゴウゴ2ちゃんねる
垢版 |
2005/11/06(日) 20:25:11ID:oVNuRozN0
>>75-76

日付を管理するサーバが複数あると誤動作の元。

bbs.cgi で日付を管理、bbsd はbbs.cgiからもらった日付と板名をキーにして
テーブル等から種を検索する方法を提案します。
0096root▲ ★
垢版 |
NGNG
>>95
bbs.cgi は複数のサーバ(live22x1〜live22x3)で動くんで、
それだと、かえって混乱しちゃうような。
0097動け動けウゴウゴ2ちゃんねる
垢版 |
2005/11/06(日) 22:58:29ID:yvSWRg1b0
>>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分ほど
早く設定すれば回避出来なくはないかな。
0098root▲ ★
垢版 |
NGNG
>>97
なるほど、

だとすると、

> ・bbsdは「その板の今日のIDの種はこれだよ」と、16バイトのバイナリをbbs.cgiに返す

の時に、bbsdからbbs.cgiに日付と種を両方返すことにして、
bbsdから戻ってきた日付が万一bbs.cgiの意図したものじゃなかったら、
その結果は捨てることにすればいいのかな。
009996
垢版 |
2005/11/06(日) 23:39:26ID:sDcfiRZ20
>>98

いい感じですね

bsd.cgi は返って来たものが意図したものと違ってたら捨てて、
何回かリトライさせればOKだと思う

ところで、bsd.cgi は絶対に種は必要なのかな。
bbsd が保持してるだけじゃ駄目?

; H"の回線が切れたので、ID変わってます
0101◆cZfSunOs.U
垢版 |
2005/11/06(日) 23:44:42ID:iq8V25O30
bbsd が返すのは現状でも "yyyy_mm_dd<>16bytes-seed" になってますね.
# というか,最初の仕様は 16bytes-seed の部分だけ返すという意図だったんですか......
0102root▲ ★
垢版 |
NGNG
>>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) ;

という感じなので、現状の仕様でよいと思います。

# 私の仕様指定があいまいだったわけですが、ちゃんと意図どおりになっていてよかたです。
0103root▲ ★
垢版 |
NGNG
>>99
> ところで、bsd.cgi は絶対に種は必要なのかな。
> bbsd が保持してるだけじゃ駄目?

そういう仕様(毎回bbsdに伺う)でも悪くはないですが、
IDの種は1日に1回しか変わらないので(通常運用では1日に1回だけリフレッシュすればよい)、
キャッシュさせたほうがいいのかなと。

で、IDをbbsd側でつけるというのも、なんか微妙にセンス悪いとゆうか、
bbs.cgi側の都合で変えたくなった時に、微妙にフレキシブルじゃないとゆうか。
0104root▲ ★
垢版 |
NGNG
>>103
> 毎回bbsdに伺う

正確には「船出航時に毎回bbsdに伺う」ですね。
SpeedyCGIだから。
0105動け動けウゴウゴ2ちゃんねる
垢版 |
2005/11/07(月) 22:43:28ID:KqEOS0ue0
>>104

そういう意味ではなく、種が必要な処理は全てbbsdに任せて、bbs.cgiは
種を使った処理をしないという選択もありでは?

種を使う処理が仮に書き込み時だけだとすると、書き込み時に bbsd が
変換すればOKなので。

と、各々の細かい役割を知らないのに勝手なこと言ってすいません。
0106 ◆TWARamEjuA
垢版 |
NGNG
>>105
個人的にbbs.cgiは内容には一切触れずに規制処理(DNS系統:省Rock54+BBR)だけ行えば?なぁんて妄想もしていたりします。
単一bbsdでは負担が掛かるようなら子供を産んでも良さそうな。とかとか。。。
0107105
垢版 |
2005/11/07(月) 23:36:28ID:qaYfXUl/0
同じこと言ってましたね。
ちゃんと読んでませんでした、申し訳ない。

bbsdとのI/Fは変えずに、単純に、bbs.cgi を frontend/backend に役割を分けて
しまう手もありますね。

0108root▲ ★
垢版 |
2005/11/08(火) 02:05:40ID:???0
>>105
書きこみ時に bbsd で共通部分の処理をするというセンスは、
次の段階としては、ありなのかな。

ただ、基本的にファイルI/Oと共通データベース処理に専念してほしい予感も。
そもそも、bbsd.cgiのバックエンド的な位置づけなわけだし。
0109root▲ ★
垢版 |
2005/11/08(火) 16:31:58ID:???0
bbsdって1000超えした時って、どういう処理をするんでしたっけ。

1) このスレッドは1000を超えました。 <br> \
もう書けないので、新しいスレッドを立ててくださいです。。。
を書くかどうか
2) 板名/1000.txt を読むかどうか
0110◆cZfSunOs.U
垢版 |
2005/11/08(火) 21:32:03ID:+RowFQSH0
>>109 1000.txt が存在すればそれを用い,なければ 1) の内容で dat に書き込みます.
0113動け動けウゴウゴ2ちゃんねる
垢版 |
2005/11/11(金) 14:27:16ID:lQB+cJ3w0
久しぶりに来たが、ぜんぜん進展してないの?
つうか、まとめサイトは?
テンプレすら張ってないし。
0115root▲ ★
垢版 |
2005/11/11(金) 14:54:00ID:???0
>>113
もうすこしかな。

Check_HardPosting (連続投稿ですか?) のところの
しくみの洗い出しと理解を、先にやりたいです。

それができると、雪だるまのためのbbs.cgi洗い出しは、
概ねできたことになるはず。
0116root▲ ★
垢版 |
NGNG
timecount/timeclose の処理も、FIFOですね。
ここに書こうと。
0117root▲ ★
垢版 |
NGNG
簡単にいうと、こんなかんじ。

1) timecount分のFIFOを準備しておく
2) 投稿に固有のID(*1)をキーに、FIFOを探す
3) FIFO内にそのIDがtimeclose個以上あったら「連続投稿ですか? (見つかった回数)回」エラー
4) IDをFIFOに積む、古いものからところてん式に押し出されていく

(*1)IPアドレスまたは携帯固有番号またはp2の番号

これなら、先だって用意していただいたものと同じようなのを
もひとつ準備していただければ、できそうですね。
0118root▲ ★
垢版 |
NGNG
[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的にはメモリ上のみでよいと考えます。
0119root▲ ★
垢版 |
NGNG
あとは、>>92 ですか。

これらは基本的には、データベースですね。

ID、時間の要素、回数の要素

というDBをbbsd側で作っていただき、フロントからはそれに登録したり、
参照したりするかんじになるかなと。

詳細は、読みきったところで。
0120◆cZfSunOs.U
垢版 |
2005/11/13(日) 19:10:56ID:s+Rpgd2P0
>>115-119 乙です.そちらもぼちぼち実装していきます.

ところでふと思ったんですが,timecount / timeclose データの FIFO の段数は
SETTING.TXT の timecount 値ということですが,となるとスレッド立てすぎデータ (>>93)
の FIFO 段数 $n も,ひょっとするとやはり SETTING.TXT の BBS_THREAD_TATESUGI 値
だったりするのでしょうか? もしそうだとすると......当初仕様通り bbsd 呼び出し時の
引数として $n を渡すのがいいのか,それとも bbsd 側で SETTING.TXT から取得するのがいいのか,
どうなんでしょうね.微妙なところかも知れませんが......
0121root▲ ★
垢版 |
NGNG
>>120
おぉ、鋭い指摘。

ちょっと、該当部分見てみるです。
0122root▲ ★
垢版 |
NGNG
読み直しました。

ご指摘のとおり、段数は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 を読んで、それを使う

ことにしていただければと思います。
0124◆cZfSunOs.U
垢版 |
2005/11/14(月) 22:24:59ID:tChr8Idl0
[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 値を使用するよう変更.
----------------------------------------------------------------------
ここまで実装しますた.
0126root▲ ★
垢版 |
NGNG
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になるとのこと。
0127root▲ ★
垢版 |
NGNG
(続き)

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回、その時間」を登録して、正常終了を呼び出し元に返す
0128root▲ ★
垢版 |
NGNG
(続き)

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」を呼び出し元に返す
0129root▲ ★
垢版 |
NGNG
c) Samba24用DBリセット用API

F22から呼ばれる。
これを呼ぶと、そのbbsdで管理しているSamba24用DBの中身は全部ゼロクリアされる
ただし、a) で初期化した値はそのまま残る

d) Samba24用DB状況調査用API

F22から呼ばれる。
これを呼ぶと、いくつのIDがSamba24用DBに登録されているかを返す
0130root▲ ★
垢版 |
NGNG
…というかんじです。日本語が、微妙かもしれないですね。
変なところがあったら、書いてくださいです。> SunOSさん

日本語で説明を書き下すと、以外に複雑な形になってしまいましたが、
実際の中身は、それほどのものでもないです。

ようは、同じIDで短い時間の間に何度も何度もやると、だんだんと出世していって、
そのうち永久になっちゃいますよ、っていうかんじです。
それを、コスト低く実現していると。

今日は、こんなところで。
0131root▲ ★
垢版 |
NGNG
…と、ここまで書いて、
s秒をbbsdで管理するか、bbs.cgiで管理するか、
微妙なかんじもしてきました。

つまり、bbsdでは「回数」「前の問い合わせからの経過秒数」を戻りにして、
Sambaの判定は、bbs.cgiでやらせたほうがいいんじゃないかなと。

その路線だと、、、。ちょっと、再度考えてみるですかね。
0132root▲ ★
垢版 |
NGNG
>>131 は別途、明日以降考えてみるです。

そんでは、今日はおやすみなさい。
0133◆cZfSunOs.U
垢版 |
2005/11/20(日) 08:54:55ID:EFjCcJ0V0
>>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 は登録のみ行うということも考えられますが,その場合
規定秒数以上だった場合のリセットが行えないのが問題ですかね.
0134◆cZfSunOs.U
垢版 |
2005/11/20(日) 10:01:50ID:EFjCcJ0V0
あと,規定秒数以上経過していたエントリは消していかないと,DB がどんどん肥大化
していきそうな気もしますね(その対策として c) があるのだと思いますが,
その呼び出しが来る前の段階で肥大化を防げればその方が良さそうな気もします).
ということで,やはり規定秒数は何らかの形で bbsd が知っておいた方がいいかも知れません.
0135root▲ ★
垢版 |
2005/11/20(日) 21:10:44ID:???0
>>133
どもです。

> 問題は設定値(規定秒数・注意回数・規制回数)の扱いというところですか.

そういうことですね。
なんか「ステートレス」「ステートフル」っていう話か。

> 「a) Samba24用DB初期化用API」と「b) Samba24用DB登録&チェック用API」
> を別々にした場合,>>126 でも言及されているように a) より b) が
> 先に来るという可能性もあるのですが,それなら両者を統合して
> 「b) Samba24用DB登録&チェック用API」の引数でそれらの設定値も
> 一緒に渡すというのも一案かも知れませんね.いずれにせよ
> 秒数や回数の判定は登録&チェックの段階で行うことになりますし.

これ、いいかもですね。
毎回bbsdに引数を全部渡せばいいのか。

>>134
そですね。DBのレコード毎にexpireできる仕組みを実装していただけると、
いいようなかんじで。

ちょっと、これらの路線で改めて仕様考えてみるです。
0136root▲ ★
垢版 |
2005/11/20(日) 22:11:01ID:???0
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回、その時間」にする。

(続く)
0137root▲ ★
垢版 |
2005/11/20(日) 22:13:42ID:???0
(続き)

もし、前に問い合わせを受けてから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」を呼び出し元に返す。
0138root▲ ★
垢版 |
2005/11/20(日) 22:16:23ID:???0
(続き)
あ、「ID、規制発動」になおしてください。< 4)

「ID、規制発動」の状態になってから3600秒(1時間)経過したら、
あるいは最後の問い合わせから3600秒経過したら、
そのIDのエントリをDBからexpireする。
0139root▲ ★
垢版 |
2005/11/20(日) 22:22:20ID:???0
これで、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は準備いただけると。
0140root▲ ★
垢版 |
2005/11/20(日) 22:23:41ID:???0
以下というのは、あと >>129 のやつですね。

とりあえず、こんなところでどうでしょうか。
0141root▲ ★
垢版 |
2005/11/20(日) 22:25:14ID:???0
で、あと、
これまで出た中で、詰めなければいけない仕様って、あったっけか。
0142root▲ ★
垢版 |
2005/11/20(日) 22:28:18ID:???0
…で、私のほうでも、
bbs.cgi 見直してみるです。

この目的のために、かなり整理整頓したわけで。
0143◆cZfSunOs.U
垢版 |
2005/11/21(月) 00:18:31ID:+sSOM0E80
>>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のみの広告ファイル 四
0144◆cZfSunOs.U
垢版 |
2005/11/21(月) 01:34:39ID:+sSOM0E80
考えてみると,性質の異なるデータを1つの DB に混在させてしまうより,
別々の DB に分けた方が検索効率もアップしますし,>>139 のチラシの裏のような
用途への応用も考えると,複数の DB を作成できるようにした方が汎用性は高そうですね.
ということで「板名」以外に「DB名」という引数も設け,1つの板で複数の DB を
持てるようにするのもいいかも知れませんね.
0145root▲ ★
垢版 |
NGNG
>>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になりますか。

(続く)
0146root▲ ★
垢版 |
NGNG
(続き)

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回、その時間」にする。
0147root▲ ★
垢版 |
NGNG
>>143
あとは広告関係ですか。

ぼちぼち仕様出していきますが、このへんは実際に動かしながらでもいいかなと。
■ このスレッドは過去ログ倉庫に格納されています

ニューススポーツなんでも実況