13 September '2005 - 23:26 | 技術動向 超巨大モニタを使えば解決
自分にはなにも問題がないし、自分が必要だったことはもう全てできるし、とっくに興味の対象外になっている StickyMemo。 後は、賞賛の声をときどき聞いて満足するだけで十分。と思いきや、ギャラリーの書き込みを見ると、気がついたらメモが全部消えてなくなってたりして困るという人たちがいる。
気がついたらそういうことが起きるという意味が分からん。StickyMemo は、タイマーを使って何かをしてるわけじゃないので、ユーザが何もしてなかったら、StickyMemo も何もしないので、何も起きたりしないはずなのだ。
なので、よく分からんし、Konfab のバグなんだろうなあと思って、おれには治せんよって書いていたら、再起動すると起きるとかスリープモードに入ると起きるとか、デスクトップの解像度を変更すると起きるとか、いろいろ書かれた。
で、いろいろと試してみたら、他の方法では再現できなかったけれど、解像度を変えるという方法ならば、現象が完全に再現できることが分かった。へー。本当に幽霊っていたんだ。すごい。
つまり、ほっとくとメモが消えるっていうのは、スクリーンセーバーとかがデスクトップの解像度を変更したりすることで発生するんだろうと思われる。
さて、再現できたら治せないと怒られるのがプログラマ。目の前で再現してもらえるまでは、「幽霊がいるなら見せてみろよ」ってふんぞり返ってられるのだけ れど、目の前に出されたらごめんなさいというしかない。というわけで、とりあえず、「消える」というのは何がおきてるかを調べてみた。
まず、メモが全部消えてもプロセスはちゃんと残ってる。メモの数分だけオブジェクトもある。つまり、プログラム的には、何も起きてない。なのにメモは見えない。うーむ。
次に、プロパティを順番に確認してみる。ウィンドウが不可視になってるわけでもないし、座標がおかしいわけでも… うおっ。座標が壊れてるじゃないか。なんだ、これは。
つまり、デスクトップの解像度を変更すると、メモウィンドウの座標関係のプロパティがぜんぶ勝手に書き換わることが分かった。勝手に変わってしまっているので、メモはそんなことを知らないし、だから変更は保存されない。なので再起動すると元通りにメモが復元する。
ちなみに、どう壊れたかというと、たとえば hOffset が 1005289862 になって vOffset が 137048415 という座標にかわったりしていた。思い切りメモリを破壊してて笑う。JavaScript でそんなことは意図的にはできないだろうし、おれが書いたコードがそんなことするわけないので、Konfab が壊してるのは明白。
しかし、やっぱりソースがないとデバグできないから面倒だね。Kofab のフリーな実装があればいいのになあ。
ちなみに、この壊れた座標のメモをふつーのモニタで表示しようと思うと、横幅が 270km で高さが 36km くらいあるモニタが必要になる計算。ぜんぜんふつーじゃないし。ま、なんにせよ、このくらい大きいモニタを使えば、解像度を変えてもとつぜんメモ は消えたりしない。ただ、かなり遠くに勝手に移動してしまうだけ。だから、メモが勝手に消えて困るとか文句を言う人は、もっと大きいモニタを使ってくれ。
さて、状況は分かったので、対応を考える。
とはいっても、解像度が変わったことを知れるイベントがないんで、定期的に座標値を調べて、異常な値になってたら保存されてる座標に戻すくらいしか思いつかない。くだらなさすぎる対処だけれど、簡単なんでさくっとハック。
問題が起きたことがない人はいらないけれど、一応、1.1.3 として置いておいた。必要な人はどうぞ。あと、ついでに ESC を二回押したら編集モードから抜けるようにしてみた。なるほど、ちょっと便利かも。