一括表示

− 野ざらし言 −

[4604] 掲示板スクリプトのバグ

としき 2022/01/23(Sun) 01:26
http://toshiki.la.coocan.jp/
最近、うちの掲示板のログをいろいろとサルベージする必要に迫られましてね。
結果、うちの掲示板スクリプトにバグがある事を見つけてしまいました。
具体的には、永続的URL対応の部分です。
そして、この部分にバグがあるということは、私がその機能を実装して納品
した、ここ野ざらし言のスクリプトにもバグがあるということです。
ごめんなさい。
あまり実害がないのは幸い。とはいえ、美しくないのは間違いのないところ。
私の公開したソースに基づいて実装しているkonnoさんのところにも混入して
いると思われます。

まず、バグがどうこうの前に、記憶を新たにするため、というか、永続的URLの
実装がどうなっているかというのは以下のURL参照。
toshiki.la.coocan.jp/computer/itabei/url.html
一括表示の部分を書き換えたわけですが、書き換えた部分の冒頭、ツリー表示の
部分のアルゴリズムをざっくり抽出すると、以下のとおり。

    $flag=0;
    while ($flag == 0) {
        もし過去ログなら
            過去ログ番号を取得
    
        ツリー表示の前処理
        ログファイルを開く
        while (ログファイルの終わりまで){
            該当のツリーがあれば{
                $flag=1;
                ページ冒頭のツリー表示
            ]
        }
        ログファイルを閉じる
        ツリー表示の後処理

        if ($flag == 0){
            もし現行ログを走査していたら
                次は過去ログ走査
            もし過去ログを走査していたら{
                過去ログ番号を次は1つ減らす
                過去ログ番号が0まで達したら
                    $flag=1;
            } else { #もし現行ログを走査していたら
                過去ログ番号を取得
            }
        }
    }

このコードの何が悪いか。
ツリー表示の部分で、該当のツリーがなければ当然、ツリー表示はなされま
せん。
そして、ループを回すことで、該当のツリーが見つかるまで探すわけですよ。
ところが、ツリー表示の前処理と後処理は、目的とするツリーが見つからなく
ても実行されます。
つまり、古い過去ログに入っている発言を表示させようとすると、何回もループ
を回るため、前処理と後処理が余分に何回も実行されてしまうわけですよ。
ただ、一般に、前処理と後処理はきちんとセットで実行されれば実害は生じま
せん。だから、こんな単純なバグに15年も気がつかなかったわけですよ。
また、開発当初は過去ログが1つしかありませんでした。その状況では当然、
ループは最大1回しか回らないわけですから、バグは発現しません。

解決策は簡単。
前処理と後処理の部分を、ループの外に出してやるだけです。
「$flag=1」を目印に探せば、該当のルーチンは簡単に見つかるでしょう。
めざらさんのところでは、前処理と後処理はそれぞれ「<ul>」「</ul>」を表示
しているだけだと思います。konnoさんのところは、フォントのサイズを変えて
いるようですね。
私のところでは、テーブルに押し込めているので、ちょっと派手かも。
現時点では酔いどれているので(だからバグを見つけられたのかも)、明日、
酔いが醒めてからコードを書き換える予定。
おそらく、そんなに手間もかからず副作用も発生しないことでしょう。
いや、そうであってほしいな。
 

[4605] Re: 掲示板スクリプトのバグ

めざら 2022/01/23(Sun) 18:21
[4604]へのコメント http://mezala.la.coocan.jp/
アルコールが入ると変に脳が活性化されて突然のようにいいアイデアが浮かぶこと有りますよね.
忘年会から帰ってきた晩にひらめきを感じて,ほぼ徹夜でゲームのマクロを書き上げたことがあります.
モグラたたきゲームなんてショボいものなのですけどね.(しかも286用で,今は速すぎて楽しめない.)

さて,これはバグというより最適化されていないということなのでしょうけど,制御構造のあるプログラムに近ごろ全く触れていないので,ソースを見てもなんだか犬が星を見るようです.(^o^;

最近よくやってしまうのですが,部屋を出るときに人がいるのに照明を消してしまって,慌てて点けたり,トイレに入って,換気扇が回っているのに逆に止めてしまって怒られたり,そういうのに似てますね.

ちょっと違うか…… (いや,だいぶ違うぞ)

[4606] Re^2: 掲示板スクリプトのバグ

としき 2022/01/24(Mon) 18:52
[4605]へのコメント http://toshiki.la.coocan.jp/
> さて,これはバグというより最適化されていないということなのでしょう

うん、まぁ、そうかもしれない。
とりあえず、製作者の意図した動きではない、ということ。
あと、先述のとおり、実害はないから放置でもかまわないでしょう。

うちの掲示板はスクリプトを書き換えました。
無事にこの問題は解消して、新たなバグも発現はしていない模様です。
これでしばらく様子を見ます。

[4607] Re^3: 掲示板スクリプトのバグ

konno 2022/01/25(Tue) 00:13
[4606]へのコメント
うう、ソースを見てみましたが、全然理解出来ません。(;_;)

> > さて,これはバグというより最適化されていないということなのでしょう
> うん、まぁ、そうかもしれない。
> とりあえず、製作者の意図した動きではない、ということ。
> あと、先述のとおり、実害はないから放置でもかまわないでしょう。

実害がなさそうなので、取り敢えずそのままにしておきます。(^^;
触らぬソースに祟りなし。(^^;;

[4608] Re^4: 掲示板スクリプトのバグ

としき 2022/01/30(Sun) 01:57
[4607]へのコメント http://toshiki.la.coocan.jp/
> 触らぬソースに祟りなし。(^^;;

御意。
なお、例えば

http://(略)/wforum.cgi?mode=article&no=22

などというURLを指定した場合に、ここ野ざらし言や今日のテーマのスクリプトが吐き出してきた結果のソースを見れば、私が一体なにをいっているか、おおよそ理解できるかもしれません。

↑ このページの先頭