絵茶

2020年7月9日

かれこれぐだまま用に絵茶を設置して1年以上経過していましたが
ぐだまま絵茶の突然落ちは未だに原因不明。
とはいえ、最近は日曜日に落ちる確率がとても高いので
日曜日に何かサーバーマシン側の
他のプログラムやらで悪さをしているのかなぁと思ったり。
といっても暴走するのはjava.exeだからjavaが悪いんかな・・・。
日曜日に何かするといってもせいぜい自動アップデート検索くらいしか思いつかない。
Windows Updateは曜日関係ないしね。
で、原因が特定できないので半年ほど前から
毎日夜中3時に自動再起動するようにしたわけだけど
それでも即落ちた場合、その日は使えないという事になるから
避難所を設けてみた。
ぐだまま絵茶が3.56に対してこちらのバージョンは3.66。
一応しぃ絵茶の公式最新版ではある(最新といっても5年以上前だが)
ぐぐってもあまり3.66に関しての不具合報告は無いけど
そもそも3.xx系が全部不安定っていう事くらいしか。
3.66は筆圧が使えないとか、フリーズするとかあるけど
自分のところで確認してないからわからない。
試しにJtablet入れてみたら動きました↓
pic_test100809.png
フリーズもしなかったので、やっぱり環境依存かもしれない。
自分なりに運営した結果、
3.56:アニメログヘッダ欠損、不特定絵茶暴走停止、ユーザー権限設定無し
3.66:今の所無し、入室できなかったりフリーズがぐぐった結果最も多いバグ?
3.66だとレイヤーの増減、全消し、塗り潰しも権限設定が出来るので
管理人以外のレイヤー増減、全消しが出来ないとかいった設定も可能。
たた自分では判らなかったけど利用者からは
レイヤーの透明度変えると全員に反映されるってのがあったけど
そもそも3.56ではどんな挙動していたのかが判らない。
むしろ個別でレイヤー濃度が変わってた方が変ではないだろうか。
他には重大な事があったので追記に。


3.56では入室ボタン押す前に、既に入っている人の名前が一覧に列挙されていますが
3.66では名前入力と入室ボタンがポップアップになり
利用者が表示されなくなりました。
その代わりに手前のページに設置する為のflashで作られたリストがあるのですが
こいつはFlashPlayer10以降から動かなくなってしまいました。
つまり、3.66は現状だと入ってからしか誰がいるかわからないのです。
これは不便すぎると思ってぐぐった結果
2chの絵茶スレ(現在は全部dat落ち)にJavaとJavaScriptの組み合わせで作られた
一覧リスト化するソースがあったのですが、既に2年前の産物なのでろだには残っておらず・・・。
次はRubyで作られた同じ機能のプログラム。
ruby利用環境が無いので却下。そもそもhtmlと組み合わせられるのかわからないし。
最後はphpで作られたもの。
これはヨーロッパ側で作られたものと、中華が作ったものの2つあったけど
どうも英国側のやつはポートスキャンまでするソースだったので却下。
中華のが最もシンプルだったのでそちらを引用し改造する事に。
引用しとあるけど、実際これってflashファイルでやってる事をphp化してるだけらしいけど。

<?php
$host = '絵茶が置いてあるマシンのIP’; // paintchat ip
$port = 絵茶を設置したポート(httpじゃなく絵茶の方ね); // paintchat port
$i = 1; → $i = 0;
if (!($tp = stream_socket_client(“tcp://{$host}:{$port}", $err, $str)))
{
exit(“ERROR: Failed to connent – {$err} – {$str}\n");
}
else
{
fwrite($tp, '<paintchat type="paintchat.infomation" request="userlist" />’."\0″);
while(!feof($tp))
{
echo “<div>" . $i . “:" . mb_convert_encoding(fgets($tp, 128), “SJIS", “UTF-8") . “</div>\n";
$i++;
}
fclose($tp);
}

$u_list = mb_convert_encoding(fgets($tp, 128), “SJIS", “UTF-8");
$volm = strlen(bin2hex($u_list)) / 2;
if($volm > 1){
$i++;
echo “<div>" . $i . “:" . $u_list . “</div>\n";
}
}
fclose($tp);
}
echo “<div>利用者数:" . $i ."人</div>\n";

?>

全然詳しくないので一部の命令文は意味を理解していない。
赤文字の部分で取得した利用者の名前を表示しています。
が、どうやら取得した内容はUTF-8でエンコードされてるらしいので
IEだとUTF-8がデフォルトで表示されないので(強制的にshift_jisにされる)
ここで仕方が無くSHIFT_JISにエンコードして
ページがshift_jisで表示されても問題が無いようにしてます。
これは日本以外だと関係ない問題だからねぇ・・・。
もちろん、これを使う場合はMETAタグ辺りでshift_jisを
使うようにしないとブラウザ次第では文字化けします。
現状の問題点は、取得した一覧を実際格納する変数が存在しないので
値がある無し(つまり取得しに行った現在利用者がいるかいないか)に関わらず
必ずwhile文を通るので、誰も居なくても「1:」が表示されてしまう事。
もし格納する変数があったら、それを条件式にかけてnullの場合
「現在利用者は居ません」といった表示に出来るんだけど
外部ファイルをファイルハンドラ使って取得するソースなので
その辺の改造方法が判りません。
ファイルハンドラになってる$tpってのを比較しようにも
こいつには「Resource id #3」っていうリソース型の内容しか入ってない。
っていうか、そもそも誰も居ない場合の値が「null」なのかもわからない。
だから「値が無い場合」っていう条件式が拾えないのよね・・・。
追記
消した部分から改造を加えて、青文字の結果になりました。
結局、取得出来ないなら変数そのまま代入したらどうなるかと思って突っ込んだら
文字そのままは受け取れたので、比較は出来るようになった。
けど、誰も居ない場合はnullにもならず空白でもないのに
ダンプ取ってみたら変数には1バイトのデータが入ってるらしく、比較できず。
仕方が無いので更に追加してバイト数を取得する変数を用意して
1バイト以上だったら文字がなんか入ってるから
(aでも1でもさっきの1バイト+半角文字1バイトで2バイトになる)
1バイト以上の場合は利用者一覧表示、
1バイトなら(何も入ってなかったら)利用者数0人ってだけ表示して終了。
副産物で改造前に「1:」だけに使ってた利用者人数を表示するように。
絵茶の仕様の問題かもわからんけど
退室して元のページに戻った場合、リフレッシュされてないのか
人数がそのまま表示されてる事もあるけど、ここは諦めよう。
せいぜいヘッダ部分で自動更新させてリフレッシュするくらいしか浮かばなかった。
引用してきて思ったけど、接続が出来なかった場合のエラーって
$errと$strに何が入るんだろう・・・。
普通接続できなかった場合、phpがそのままタイムアウトになって
php側システムのエラーになるから、このソースにあるエラー処理は実行されないのだよ・・・。
久しぶりにクソ長いエントリーになってしまった。