掲示板の最大記事処理を別のログへ移すには?

[上に] [前に] [次に]
徒歩 1999/12/10(金) 18:23:01
ラウンジが重いので簡単に・・・(^^;

BBSなど、最大記事数を超えてしまうと、
メッセージが古い順から削除されます。
そこで、自動的にログを作成して、古いものを順に、
そのログへ移動して行くと言うような、事をするには?
と言う質問です。
ちなみに、ログの自動作成はなんとか出来ました。

----------------実行イメージ------------------
最大記事数が、10だったとします。

現状
[No.1][No.2]...[No.8][No.9][No.10]・・・ 削除[No.11]

変換後
[No.1][No.2]...[No.8][No.9][No.10]・・・ログを自動作成・・・ 新しいログに書きこみ[No.11]
----------------------------------------------------

と言うわけであります。
よろしくお願いします。
ではー

アルプスの老人・おんじ 1999/12/10(金) 18:37:42
こんな感じでどうかな。

---------------------------------------
必要な変数
 ・デフォルト・ログファイル名(例:hogehoge)
 ・記事番号

必要なファイル
 ・ログファイル番号

必要な処理
 ・記事番号を最大記事数と比較し、イコールになったら、"hogehoge.ログファイル番号.html"をオープンし、記事全てを書き込み
 ・ログファイル番号ファイル内容を+1して書き込み
 ・記事番号を初期設定
 ・記事を初期設定

--------------------------------------------
ただし、気をつけないと悪意を持った人が書き込みまくって、ログをどんどん増やし、挙句の果てには容量オーバーでプロバイダから追加料金を徴収されるということがありうるのでご注意を。

徒歩 1999/12/10(金) 19:01:57
レスありがとうございます。
なるほど・・・で
どうやって記述するのですか?(^^;
ちょい初心者なので、
技術はわかりましたが。

> ログをどんどん増やし・・・

なるほど、確かに。

ではー

ふじ 1999/12/10(金) 19:20:06
>どうやって記述するのですか?(^^;

あなたの書いたスクリプトのログ書き出し部分を示してもらわないと、
具体的には書けません。
#想像して書くのは時間と労力の無駄になる可能性大です。

徒歩 1999/12/10(金) 19:29:24
すみません。

ログ書きこみの部分は

--------bbs.cgi-----------
# ファイルに書き込み
open(IN,"$log");
@newdata=<IN>;
close(IN);

open(OUT,">$log");
print OUT "$_\n";
print OUT @newdata;
close(IN);
-----------------------

ではー

ふじ 1999/12/10(金) 20:41:08
過去ログは old_log という名前で、1ファイルとして生成されるものとして、

># ファイルに書き込み
>open(IN,"$log");
>@newdata=<IN>;
>close(IN);

>open(OUT,">$log");
>print OUT "$_\n";

# @newdata の先頭から一つずつ要素を取り出して $line に代入
# 最大 $max 回繰り返す
$count = 0;
while(($count < $max) and ($line = shift(@newdata))){
    $count ++;
    print OUT $line;
}
>close(OUT);

# 残りがあれば、過古分のログに追加書き込み
if(scaler @newdata){
    open (OLD, ">> old_log");
    print OLD @newdata;
    close (OLD);
}

こんなのでどうですかね。
while ループは、@newdata が空になるか、$max 行書き出すと抜けます。
その後、 scalar @newdata で配列の要素数を調べて、
要素があれば(あっても一つのはずだけど)残りを過去ログに
追加書き込みします。

ただこれだと、普通のログと過去ログの時系列が逆になります。
それが嫌なら、追加書き込みしている部分を、通常のログ生成と
同じように処理しましょう。

徒歩 1999/12/10(金) 21:41:11
ありがとうございます。
早速試したところ、サーバーエラーが出ました。
文法チェックしたところ、次のように出ました。

---------------文法チェック----------------

Array found where operator expected at bbs.cgi line 53, at end of line
(Do you need to predeclare scaler?)
syntax error at bbs.cgi line 53, near "scaler @newdata"
syntax error at bbs.cgi line 57, near "}"
bbs.cgi had compilation errors.

--------------------------------------------------
それらしき、所をチェックして試したのですが、
やはり同じメッセージが出ます。
引き続き、調べて見ますが、原因がお解りになりましたら、
お手数ですみませんが、レスをお願いします。
ではー

J.Naka 1999/12/10(金) 21:46:24
多分、} が一個不足してるかも。
括弧の過不足は、エディタに標準機能とてチェック機能あると思うんだけど。

徒歩 1999/12/10(金) 21:52:33
レスありがとうございます。

・・・}は多分不足してないと思います。
というのも、いつもは、括弧が不足しているときには、違うメッセージでエラーが出るんです。

ちなみに、line53 57は、
ちょうど、53〜57で以下です。

-----------------line 53-------------

# 残りがあれば、過古分のログに追加書き込み
if(scaler @newdata){
    open (OLD, ">> $old_log");
    print OLD @newdata;
    close (OLD);
}

---------------line 57---------------

というわけです。
引き続き調査します。

ではー

B-Cus 1999/12/10(金) 22:07:42
「ヒントでなく解答を教えなさい」ということだけど、こういう場合に
そのまま教えるのは何だかなぁ。だって、質問者のスキルアップに
繋がってないもん。

結局、質問者は scaler の意味を考えようとしないので、
scalar のタイプミスだとは気が使いないわけ。

アルゴリズムを考えさせて、どうコーディングするかを考えさせないと、
意味がないでしょう。もし scalar を知らないとしても、
こういうとき if 文の意味を考えて、
 if ( @newdata ){
とか
 if ( $#newdata > -1 ){
とか
 if ( @newdata > 0 ){
と書き換えられるような人を育てるのが回答者の役目でないですかね。

ふじ 1999/12/10(金) 22:08:23
綴り間違いました。すみません。

> scaler @newdata
scalar @newdata

です。

ふじ 1999/12/10(金) 22:11:16
#いたたたた(;_;)

アルゴリズムは
> scalar @newdata で配列の要素数を調べて
等と書いたつもりだったんですけど。
以後気を付けます。

J.Naka 1999/12/10(金) 22:45:40
>こういうとき if 文の意味を考えて、
> if ( @newdata ){
>とか
> if ( $#newdata > -1 ){
>とか
> if ( @newdata > 0 ){
>と書き換えられるような人を育てるのが回答者の役目でないですかね。

一生懸命書き換えて、デバッグしてました。。
scalar 使ったことないもんで、、スペルミスに気づくのは最後になりました。
そです、今、原因解かって、それを投稿しようとしたら、既に原因判明済み。。
一つ勉強なりました。(_ _)

徒歩 1999/12/10(金) 23:25:49
皆さんありがとうございます。
実は(どうしてこう初心者なんでしょう(^^;)
バグか、そういう仕様なのかこちらの設置ミスか、解らないのですが、
Logが可笑しくなっているような気がします。
次の状態になっています。

---------------Log.log--------------------
<>**<>99年12月10日金曜日:23時15分29秒<>
<>**<>99年12月10日金曜日:23時15分32秒<>
<>**<>99年12月10日金曜日:23時15分34秒<>
<>**<>99年12月10日金曜日:23時15分36秒<>
<>**<>99年12月10日金曜日:23時19分27秒<>
------------------------------------------------

--------------------old.log---------------------
<>**<>99年12月10日金曜日:23時15分29秒<>
<>**<>99年12月10日金曜日:23時15分29秒<>
<>**<>99年12月10日金曜日:23時15分32秒<>
<>**<>99年12月10日金曜日:23時15分29秒<>
<>**<>99年12月10日金曜日:23時15分32秒<>
<>**<>99年12月10日金曜日:23時15分34秒<>
<>**<>99年12月10日金曜日:23時15分29秒<>
<>**<>99年12月10日金曜日:23時15分32秒<>
<>**<>99年12月10日金曜日:23時15分34秒<>
<>**<>99年12月10日金曜日:23時15分36秒<>
---------------------------------------------

というわけで、どうも、old.logが、エコーになっています。
ではー

#Chat状態になるので、他の質問もしますが、
#Log.logが、古い順から削除できません。

J.Naka 1999/12/10(金) 23:46:07
うーん、一つ案。
ソース改造の結果がおかしくなったら、どういう現象かというのも質問の際には必須ですが、ソース自体も見られるようにしてもらえると高率的なスキルアップになると思います、お互いに。
ソースの提示はURLのみがいいです。(原因と追われる行番号もあれば更にナイス)

徒歩 [HomePage] 1999/12/10(金) 23:56:32
解りました。
↑のHomepageに直接アクセスすれば、自動書き込みできるように、編集しました。

通常ログは
Log.log

古いログは
old.log

ではー

徒歩 [HomePage] 1999/12/10(金) 23:59:44
解りました。
↑のHomepageに直接アクセスすれば、自動書き込みできるように、編集しました。

通常ログは
Log.log

古いログは
old.log

ではー

徒歩 [HomePage] 1999/12/11(土) 00:01:10
解りました。
↑のHomepageに直接アクセスすれば、自動書き込みできるように、編集しました。

通常ログは
Log.log

古いログは
old.log

ではー

ふじ 1999/12/11(土) 00:16:36
# WinProxy 通してるのは私です(^^;

上記の私が書いたソース、そのまま写したのですよね?
$max の値は何を設定してますか? あと、
>open(OUT,">$log");

open(OUT,">>$log");
ってしてませんか?

新規投稿は Log.log の先頭に追加されるはずなのに、末尾に追加されてるし、
もし $max に値を設定してないなら while ループをいきなり抜けてしまって
過去ログに現在のログの内容が追加されて行くので、こういう状態になる気が。

??? 1999/12/11(土) 00:17:01
3重投稿になってしまいました。
すみません・・・(;;)

で、どうでしょうか?

徒歩 [HomePage] 1999/12/11(土) 00:29:10
[[解決]]
無事解決できました。
皆さんありがとうございました。
全部正常に無事作動中です。
本当にありがとうございました。

ではー

ふじ 1999/12/11(土) 00:33:02
あの、すみません、何が原因で不具合があって、
どうやって解消されたか教えてください。
# 自分のコードのバグなのか分からないと不安でしょうがないので(^^;

徒歩 1999/12/11(土) 00:35:30
[[解決]]
そうでした! (忘れてた・・・(^^;)

とんでもない(?)こちらのミスでした。
というのも、$maxを付けていなかったのでした。
>>も、ついていました。
どうもすみません。ありがとうございました。
ではー

#ふじさんのコードのバグじゃないのでご安心を(笑)

追記 1999/12/11(土) 00:52:48
たびたびすみません。
古いログも例えば、10たまったら古いログ2を作成するように出来ますか?
ではー

J.Naka 1999/12/11(土) 01:59:22
あのぉ、すいません、
記事数のカウントが無いような気がしますが(^^;

徒歩 1999/12/11(土) 02:12:41
といいますと、
bbs.cgiのですよね。
・・・
カウントえーと、(^^;
あまり聞きすぎているので・・・、
とほほさんのサイトに説明文ありますか?

徒歩 1999/12/11(土) 02:13:44
もしよろしければ教えてください。
お願いします。
ではー

J.Naka 1999/12/11(土) 02:26:10
---------------------------------------
# @newdata の先頭から一つずつ要素を取り出して $line に代入
# 最大 $max 回繰り返す
$count = 0;
while(($count < $max) and ($line = shift(@newdata))){
    $count ++;
    print OUT $line;
---------------------------------------
上の変数 $cout カウントのことです。

このコードでは行数のカウントでデータファイルの移動判定をやってますが、行数ではなく記事数で判断しないといけないのではないか?

という事です。(違ってるかな?)

---------------------------------------
おまけ:
このスレッド2つ目の「アルプスの老人・おんじ」さんの投稿が基本的な、仕様・ロジック・アルゴリズム、ではないのかと。

徒歩 1999/12/11(土) 02:34:38
$count = 10;にしてみました。
> 行数ではなく記事数で判断しないといけないのではないか?
どちらでも良いのですが、記事数の方が正確かなと思います。
ではー

J.Naka 1999/12/11(土) 02:43:21
>$count = 10;にしてみました。

駄目駄目すよ。10にするとどうなる?
$maxの値を10引いたのと同じになりますよ(^^;;;;

$countは何の役目がある?

----------------------------
#ふじさんは、もう寝ているか、現像でしもしているのだろうか?

徒歩 1999/12/11(土) 02:45:30
やっぱりそうですか(^^;
ずーっと何遍も見たいたのですがね、
Log.logが、1個しか、表示しないんです。
もういちど0に戻します。
ではー

#ふじさんは?

まだまだ→ 1999/12/11(土) 06:43:02
どうなんでしょう
解答まち中

J.Naka 1999/12/11(土) 08:55:36
取りあえず、行数カウンタでも、記事数カウンタでも、カウンタの動作自体は同じものなので(結果は違うけど)、次の課題に取り組んだ方が良いかもしれません。記事数カウンタはコードが少々ややこしくなるし。

>古いログも例えば、10たまったら古いログ2を作成するように出来ますか?

これは、過去ログへの書き込み数が10回になると、その過去ログのファイルを変えれば良いです。
前回のコード改造です。

-------------------------
# 残りがあれば、過古分のログに追加書き込み
$fileOldLog = "old_log";                    #古いログ名を変数とする
$MAXoldcount = 10;                          #カウンタリミット値
if(scaler @newdata){                        #
  open (OLD, ">> $fileOldLog");             #
  print OLD @newdata;                       #
  close (OLD);                              #

  open (OLDc,"$fileOldCount");              #カウント用ファイル OPEN
  @iOldCounter =<OLDc>;                     #カウント値その他 READ
  close(OLDc);                              #
  @iOldCounter[0]++;                        #カウント値インクリメント
  open(OLDc,"> $fileOldCount");             #

  if($MAXoldcount <= @iOldCounter[0]){      #リミット以上か?
    @iOldCounter[0]=0;                      #カウント値初期化
    @iOldCounter[1]++;                      #NewName用にインクリメント
    $NewfOld_Log = $fileOldLog . @iOldCounter[1];#NewName作成
    rename($fileOldLog,$NewfOld_Log);       #現在の古ログをリネーム
    open(OLD,"> $fileOldCount");close(OLD); #現在の古ログの新規作成
    while(<@iOldCounter>)                   #カウント値その他 WRITE
    {print OLDc $_;}
  }

  close(OLDc);                              #カウント用ファイル CLOSE
}
-------------------------

と、J.Nakaさんは半分寝ながら、こんな書いてみました(笑)
寝ながらなので当然、正解ではない可能性が非常に高い!(笑)きっちしバグ取りするように(笑)
味噌は、カウント記録用ファイルに、カウント値だけでなく、現在あるログファイル群も記録可能だということ、上では最新のログしか記録してないけど。

それと、カウンタ値の外部保存が上記のコード追加部分ですが、外部保存先を現在使用中のログファイル自体に記する方法もあります。そっちの方が open closeの回数少ない分だけすっきりするかも。その他にも方法は色々あります。

#これだけの量でもフォームに直書きは無理ですね。途中でエディタ開きました。
#あー眠たてーや(笑)

J.Naka 1999/12/11(土) 08:58:04
あっ最後に修正したところが修正してはいけないんだった(笑)
さっどこでしょうか?(笑)ヒント=カウント値が保存されない

とほほ 1999/12/11(土) 14:21:56
チャット状態はおやめください。

J.Naka 1999/12/11(土) 16:50:22
ストップ指示、有り難う御座います。

#「チャット状態」ってのは少し疑問ありますが、
#言語の基本的使い方に類する個人的質疑に走り過ぎましたね。
#言語の右も左も解からないが初端の「やる気」をカットするのは忍びがたいってのもあります。(^^;

徒歩 [HomePage] 1999/12/11(土) 20:59:07
ご苦労をおかけしてすみません。

> チャット状態はおやめください。

すみません>とほほさん

J.Nakaさんもご苦労をおかけしました。
> 半分寝ながら>(笑)

何でしたら本当にChatします?(笑)
↑の[HomePage]をクリックするとChatに行けますが。

> さっどこでしょうか?(笑)ヒント=カウント値が保存されない

@iOldCounter[0]=0;                      #カウント値初期化

かな?(笑)
全く解りません(笑)
保存・書き込み関係ですよね。
探して見ます。
ではー

徒歩 1999/12/11(土) 21:21:31
エラーチェックは、
--------------------------------------------------------
    $Newf $old_log = $fileoldLog . @ioldCounter[1]; #NewName作成
    rename($fileoldLog,$Newf $old_log);       #現在の古ログをリネーム
    open(old,"> $fileoldCount");close(old); #現在の古ログの新規作成

-----------------------------------------------------------

この付近があやしいといっています。

#これもChat状態なんですかね?

徒歩 1999/12/11(土) 21:43:39
無事出来ました。

で、カウンターはどこに表示されるのですか?

それと
SCALAR(0xbc864)
というファイルが出きるのですが

ということです。
ではー

徒歩 1999/12/11(土) 23:50:38
カウンターがどこにもみあたらないのです。

それに「SCALAR(0xbc864)」というファイルが出来てしまうのです。

ではー

B-Cus 1999/12/12(日) 00:36:38
元のスクリプトは不完全(アルゴリズム的にもperlの文法的にも)だし、
回答者はタイプミスさえチェックできない状況になっているし、
> 古いログも例えば、10たまったら古いログ2を作成するように出来ますか?
を実現しているBBSを紹介してあげたらどうですかね。
# 僕は知りませんので紹介できません。

それをよく読んで、その後 自作に挑戦してみては。

J.Naka [E-Mail] 1999/12/12(日) 01:33:37
あっ、それがいいと思います。
「出来合いのBBSのここを改造するにはどうしたら良いか?」
な質問だったら、キチットしたソースがあるわけだから的を射た回答がしやすいと思う。

------------------------
以下、別な話し。
 このスレッドのように言語取得をゼロからぶっつけ本番でやるのは無謀で非効率的です。回答側の負担も大きすぎるしラウンジの内容としてもチャットと表現されるような物になってしまう。

言語取得の最初は数行程度のサンプルの動作把握を根気良く続けていくしかないです>徒歩さん

そういった最低現のスキルが無いとプログラムソースに対する質疑応答は無理かと思います。

#さらに、そういった最初の展開を徒歩さん管轄の掲示板でやりたいと意欲あるのなら、応援する気持ちは僕はあります。
#だけど、最低限のスキルは自力突破できる根気と能力が無いと後が続かないと思うぞ。

#ともあれ、ふじさんのレクチャーに横槍風になってしまったことを後悔してます。。。

徒歩 [HomePage] 1999/12/12(日) 02:08:10
↑こんなところでしょうか。
cgiをtxtにしただけですが(笑)
ではー

B-Cus 1999/12/12(日) 02:39:43
> 回答者はタイプミスさえチェックできない状況になっているし、
あ、ごめん。「質問者はタイプミスさえ…」の間違い。
要は、あなたがタイプミスしてるってことです>徒歩さん

> を実現しているBBSを紹介してあげたらどうですかね。
こことか。http://www.kent-web.com/bbs/light.html

[上に] [前に] [次に]