言語ゲーム

とあるエンジニアが嘘ばかり書く日記

Twitter: @propella

SuperSwiki プロジェクト・コードリーディング・解決編

何の面白みも無い日記で申し訳ありませんが、解決しました。業務連絡モードです。

問題: SuperSwiki を日本語で使うためのパッチを蜂須賀さんと阿部さんから頂いたのだが、どうやら上手く動かなかったり凄く遅い時があるらしい。

原因: 阿部さんのパッチでは、クライアントからサーバに送る文字列の一部に MultiString が混ざる。蜂須賀さんのコードでも再現すると思ったのは単なる勘違い。

String と MultiString を連結すると、答えもまた MultiString になるという動作から発生したバグ。

SqueakNihongo で内部的に利用される MultiString をソケットから出力したとき、なんか良くわからんエンコーディングで出力される。MutiString は 8 ビット境界の情報じゃないので、エラーになっても良さそうな物だが通ってしまう(そもそもサイズを必ず間違う)。サーバの側では勿論わけが分からずその情報を無視する。クライアントはサーバが何らかの返事をくれるのを期待し、タイムアウトまでじっと我慢する。

クライアントも適当な物で、タイムアウトで止まってもエラーとして処理せず何も無かったかのように動作し続けるので、遅いだけで一見動いているように見えてしまうが、実はこの時点ですでに問題が発生している(この問題というのが、単に gif のアップに失敗するなど、致命的で無い場合も多い)

というわけで、蜂須賀さんのコードをそのまま使えば良いんじゃないかと思います。もし問題が起これば sendCommand: あたりにデバッグコードを仕込んで、Project current storeOnServerWithProgressInfo を実行すれば良い(フラップから保存すると、技に溺れたコードのせいで上手く Transcript が使えません)。