PETROOM大改造
【萌え萌えキャラクターズと遊ぼー。】

謎の名前重複を強引に修正しよう

更新:2002年8月21日

この件に関しましては、原因を突き止めることが出来、対策方法が判明しております。

「ユーザーデータの読みこみ」の上の方に、

&unlock;

という行があると思いますので、そのすぐ下に、

undef @new;

という一行を追加してくださいませ。
これで謎のお名前重複は発生しなくなります。

ただし、このページをご覧になっているということは、
すでにお名前重複が発生してしまったあとだと思います。
重複してしまったユーザーデータを修正する方法は、
ユーザーデータをダウンロードして、テキストエディタ(メモ帳など)で、
手動で修正するしかありません。

どこからどこまでが重複しているのか、
重複した後に、新規で登録した人はどこからどこまでか、
また二重ではなく、三重、四重に重複している場合もあります。
こればかりは、データとにらめっこして修正していくしかありません。

…頑張ってください(涙)



…一応、過去のあがき(笑)を下に残しておきますが、
下記の改造はしないでくださいませ。



この解説文を書いている時点では、まだ「遊ぼー。」にはそのような現象は起こっていませんが、
PETROOMには、同じ名前の人が増殖してしまうという、謎の現象があります。
MissingLinkさんでも、ことねっつでも、いくつかご報告を頂いたことがあります。

プログラムをどうひっくり返して解析してみても、その原因となるような箇所はありません、多分。

考えられるのは、同時アクセスによる不具合なのですが、これもあくまで推測です。
実際おいらも、同時アクセスとはどういう状態のことなのか、いまいち知りません(爆)

ウチの改造を施したことにより、処理が長引いて、それが原因になっているのかもしれません。
が、ウチの改造を施していない方でも発生していますので、なんとも言えません(笑)

つまり、原因が分からないので、完全な修正というのが出来ない状態です。

なので、ある結論に達しました。


発生してから、直そう!


そうです、修正ではなく、対策です(爆)

改造はとっても簡単で、掲載するプログラムを指定の場所にコピペするだけなんですが、
ここから先、重要ですので、必ず読んで下さい。


今回の対策は、例の現象が発生した場合に、あとで自動修復するプログラムを追加します。
自動修復と言っても、同じ名前があった場合に、ファイルの上の方にあるのを1つだけ残して、
残りの同じ名前のデータを消すだけです。

ですが、データを消すという行為を行いますので、
不具合により全てのデータが消える可能性もありますし、
全然効果がないかもしれません。

もちろん、こちらで動作を確認し、正常に動くことは確認していますが・・・。

ですので、導入の際には充分ご注意下さい&覚悟して使ってください(^^;



最も良い導入方法としましては、
その現象が発生するまでは、プログラムを組み込まないでください。
発生するまで待てる人か、すでに発生している人以外は、
余計な改造はしない方がよいでしょう、特にこれは。

例の現象が発生しましたら、まずユーザーデータのバックアップを取って下さい。
FTPでuser.datをダウンロードして、名前を変えて保存しておきましょう。
次に、pet.cgiに、後ほど示す改造を施して、アップします。
そして、1回コマンドを選んでみて下さい。
ランキング表示で、名前が同じ人がいないか、同じ人がいなかったのに消えてしまっている人がいないか、
確認してみてください。

もし不具合がありましたら、pet.cgiuser.datは元に戻してください。


ではでは、改造方法を。
ユーザーデータの読みこみ(openinuserdata)の下の方、
改造してある人は、ちょっと分かりづらいかもしれませんが、
同じところになるように、挿入してください。

# ------------------------- #
# Sub Open In User Data
# ユーザーデータの読みこみ
# ------------------------- #
sub openinuserdata {
    if ($lockkey == 1) { &lock; }
    open(IN,"$userdata") || &error("Can't open $userdata");
    @lines = <IN>;
    close(IN);
    &unlock;

    foreach $line (@lines) {
        ($name,$pass,$gdate,$love) = split(/<>/,$line);

        if ($_[0] eq 'checkname') {
            if ($FORM{'name'} eq $name) {
                $flag = 1; # データの中にユーザーを確認
                if ($FORM{'pass'} ne $pass)
                    { &error("パスワードが間違っています"); }
                last;
            }
        }
        if ($_[0] eq 'action') {
            if ($FORM{'name'} eq $name) {
                $gdate = time;
                push(@new,"$FORM{'name'}<>$FORM{'pass'}<>$gdate<>$newlove<>\n");
            } else {
                if ($gdate >= $goodbye) { push(@new,$line); }
            }
        }
        if ($_[0] eq 'ownerlist') {
            if ($love >= $loved) {
                @lovelist[$lovenum] = "$name";
                $lovenum++;
                if ($bestlove < $love)
                    { $bestowner = "$name"; $bestlove = $love; }
            } elsif ($love <= $disliked) {
                @hatelist[$hatenum] = "$name";
                $hatenum++;
            } else {
                @otherlist[$othernum] = "$name";
                $othernum++;
            }
        }
    }

    if ($_[0] eq 'action') {
        foreach $line (@new) {
            ($name,$pass) = split(/<>/,$line);
            $newflg = 0;
            foreach $line1 (@new1) {
                ($name1,$pass1) = split(/<>/,$line1);
                if ($name eq $name1) {
                    $newflg = 1;
                }
            }
            if ($newflg == 0) {
                push(@new1,$line);
            }
        }
        @new = @new1;
    }

# 改造してある人は、
# この辺りに
# 何か追記されています。

}

# ------------------------- #
# Sub Open Out User Data
# ユーザーデータの書きこみ

追記する場所がよく分からない時は、無理に追記しないで下さい。
データを消してしまう可能性があります。
改造サポートBBSにて、お問い合せ下さい。
その際、施した改造を教えていただけると説明しやすいです。