Panda Express
鈴木さんと買い物に出たりした関係上、Panda Expressに鈴木さんを連れて行く、という暴挙に出てしまいました。すみません。
SqueakNihongo6 beta3
ひそかに作っていたSqueakNihongo6 beta3は、あまりにもお間抜けな間違いがあって正にがっくり。あまりにもがっくりきたので、最近良く見かけるがっくりAAを自分の日記に使いそうになるところであったが、とりあえず今回は踏みとどまった。危ない危ない。なにしろ、自分のところのテストでも分かるようなものをサボってはいけませんでしたな。
京都大学の盟友、某吉正君からのリクエストに対応しようとコードを追っかけているうちに、めでたいことにプロジェクト保存時に水色のバーがずっとぐるぐる回り続けていつまでもとまらない状態になってくれました。見てみたら、なるほど、このバグの原因はそういう理由だったわけですね。うーむ。やっぱり普通じゃないコンフィグレーションとかもいろいろ試さなくては駄目だよな。でも、一つバグつぶしできたような気がするので良かった良かった。
Alan Kay
もう昔のことであるが、とりあえずhttp://www.sciencefriday.com/pages/2004/Feb/hour1_022704.htmlというリンクを貼っておこう。
Short quantity
16-bitデータの配列がプラットフォームを越えて正しくセーブできないという問題は、一度直したつもりになっておきながら実はまったく直っていなくて、思ったよりはややこしい、ということだけは分かっていたわけだが、もう一度見直してみたところ、前回コードを書いたときに立てていた仮説が間違っていたのは無理もないよな、ということで納得。
squeak-harvestには、かっこつけて"But the margin of this email is too small to contain it."などと書いてみたが、せっかくだから書いておこう。
digitAt:はプラットフォームのエンディアンに関わらず、同じレシーバーと引数ならいつも同じ値を返す、つまり実質的にエンディアンを吸収するので、Stream>>nextWordsPutAll:がデータを書き出すときはバイトオーダーはどうであれ、常にワード内のLSBから書き出していくことになる。何でLSBからなんだ、という疑問もありうるわけだが、LargeIntegerとの互換性を考えればそのほうが便利なわけだな。ただし、ワード内のshortワードの順番はエンディアンによって変わっているので、objectForDataStream:ではshortとして16ビットの値を入れ替えたものを返すようにすれば、ビッグエンディアンのプラットフォームでもリトルエンディアンのプラットフォームでも同じ順番で書かれるようになる。
一方、読み込むときには基本的にBitBltがエンディアンを吸収してしまうのでワードないでのバイトスワッピングはしなくてよいのだが、16ビットワード内をみると、バイト順が狂ってしまっているので、0と1、2と3バイト目をそれぞれ入れ替えないと元に戻らない、という次第。
短くまとめれば、思わぬところに出てきたバイトオーダー変換の非対称性とでもいうべきだろうか。