この日記はMozillaのプロダクトへの貢献者としての私の成果を中心に、気になったバグやWeb界隈の話題について書いていますが、 断り書きがある場合を除き、いかなる団体のオフィシャルな見解ではありません。あくまでも個人的なものです。 Mozilla Foundation、Mozilla Corporation、及び関連企業の公式情報ではないことに注意してください。

現在、XHTML 1.0 (もどき)から、HTML5なコンテンツに修正中です。古い日記は修正が完了していませんので表示が崩れます。 順次、修正していく予定ですのでしばらくお待ちください。

もずはっく日記(2009年10月)

2009年10月2日

Bug-org 513952 Refactor nsTSMManager 初回投稿日時: 2009年10月02日00時39分51秒
最終更新日時: 2009年10月02日00時45分10秒
カテゴリ: Mozilla Core バグ修正
固定リンク: id=2009100200
SNS: (list)

legacyなAPIを使いまくっていたnsTSMManagerでは64bit版をビルドできない、ということでCocoaのAPIと64bitでも利用可能なTSM APIを利用した新しい実装が必要、というバグです。ちなみにこのバグの修正でIMEの状態管理のコードを丸ごと書き換えたので、バグがあればbugzilla-jpにフィードバックをお願いします。

今回も[NSInputManager currentInputManager]と、::TSMGetActiveDocument()のふたつの変な仕様に苦しめられました。事実上、NSViewと1:1でIMEのコンテキストがあるくせに、フォーカスがあるときにしか、そのポインタを取得できなかったり、キャッシュしていても一部の機能が対応するNSViewにフォーカス無い時には機能しない、というへんてこ仕様のおかげで、(やろうとしていることからすると)非常に複雑な実装になっています。

今回の修正のキモはフォーカスが無いときに未確定文字列を確定しなくてはいけなくなった場合、Gecko内でのみ先に確定して、見た目の異常を消しておき、次にフォーカスを受け取った時に、実際にIMEの未確定文字列を破棄する、という処理順序にした点です。これを応用することで、パスワード入力欄がフォーカスを得た時にキーボードレイアウトを制限する処理も実現されています。

また、この修正で、ime-mode: active;ime-mode: inactive;の処理がよりWindowsの動作に近くなりました。

まず、ime-mode: inactive;の場合、現在選択されているのがIMEのモードの場合、TIS APIから変更すべきASCII capableなキーボードレイアウトに変更するようになりました。これにより、どのキーボードレイアウトが選択されるかはOSに依存することになります(今までは直前に利用されたASCII capableなキーボードレイアウトが使われていました)。

ime-mode: active;は少し複雑です。Firefoxが起動してから、キーボードレイアウトの選択を常に監視するようにしました。これにより、Firefoxが起動した後に、IMEを有効にした場合、そのIMEのモードを記憶します。これにより、最後に利用したIMEモードをオンにする、という動作が実現されています。

ですが、問題はIMEを一度も起動せずにime-mode: active;なエディタにフォーカスをあわせた場合です。この時は、Mac OS Xの環境設定で選択された言語の優先順位に基づき、順に各言語を入力するためのキーボードレイアウトを取得します。どの言語でどのキーボードレイアウトが返されるのかはMac OS Xに依存します。そして、返されたキーボードレイアウトがIMEのオンの状態にあたるモードだった場合、そのモードを選択します。もし、それが見付からなければ何もしません。

この最後の動作にはひとつ難点があり、ことえり以外のIMEをインストールし、ことえりを利用可能なキーボードレイアウトから削除していない場合、ime-mode: active;で意図しないモードが選択される可能性があります。私の環境では、常にことえりのlastnameというモードが返され、これを選択させると通常のひらがな入力になりました。常に、というのが問題で、ATOKの英数入力を選択していても、ことえりにスイッチされます。

悩ましい話ですが、ime-mode自体がそれほど利用されていないというのと、普段のブラウジング中に、他のアプリケーションも含め、一度もIMEを利用しないことはそうそう無いと思いますので、あまり問題ないかとは思いますが、もし発生すれば混乱を与えかねない動作だとは思います。

2009年10月18日

Bug-org 519631 nsBidiKeyboard.mm is still using KL APIs 初回投稿日時: 2009年10月18日01時13分46秒
カテゴリ: Mozilla Core バグ修正
固定リンク: id=2009101800
SNS: (list)

MacのnsBidiKeyboard.mmがまだKL APIを利用しているのでビルド時に警告が出ていた、というバグです。64bit時には問題の機能を捨てていたので、64bitビルドのためのブロッカーからは外されていました。

Geckoのキャレットはいろいろな条件から、現在のテキストがRTLだと判断した場合にキャレットに「髭」を生やしています。その条件のひとつに、現在のキーボードレイアウトの書字方向の確認がありますが、その検査にKL APIを利用していました。

最初はTIS APIでキーボードレイアウトの主要言語から判定しようとしました。しかし、Simon曰く、Appleが用意したキーボードレイアウトでなければ、返ってくる値がデタラメということで没になりました。そこで、任意のキーで入力される文字から言語を判定してはどうかと提案したところ、具体的な判定方法を教えてもらえたのでそのように修正しています。

ちなみに、結果をキャッシュするようにしたので、キャレット表示時の負荷が多少減ってるかもしれません。

Bug-org 520417 Redesign nsSound structure 初回投稿日時: 2009年10月18日01時37分25秒
最終更新日時: 2009年10月18日02時06分29秒
カテゴリ: Mozilla Core バグ修正
固定リンク: id=2009101801
SNS: (list)

いい加減に問題が山積していたnsSoundまわりを再設計するというバグです。

当初はシンプルにnsSoundのインスタンスを隠蔽して、全プラットフォーム、別のスレッドで再生することでUI操作を妨害しないように、というシンプルなパッチを出しましたが、色々な理由から却下されました。

rocの提案により、nsSoundの機能をシステム音再生機能とWAVEファイルの再生機能とに分割し、なおかつWAVEファイルの再生はaudio要素を使うように、という話になり、そのように実装しています。

nsISoundは今回の修正により、Gecko 1.9.3(つまりFx3.7以降)ではobsoleteとなりました。互換性のため、引き続きnsISoundはサポートされますが、新たなAPI、定数の追加等は行われません。

nsISound::init()は残っていますが、必要なくなったため、何もしないようになっています。

nsISound::play()nsISoundPlayer::play()に置き換わりました。

nsISound::PlaySystemSound()に相当する新しいメソッドは用意されていません。nsSound::Play()は各プラットフォームでできるだけ以前の動作と同じ結果になるように新しいインターフェースのメソッドを呼び出しますが、動作がプラットフォーム毎に異なっているため、あまり利用価値はありません。

nsISound::playEventSound()nsISystemSoundService::playEventSound()に置き換わりました。

nsISound::beep()nsISystemSoundService::beep()に置き換わりました。

nsISystemSoundService::playAlias()はWindowsと、OS/2でのみサポートされていたサウンドの別名による再生が実装されています。ですが、互換のためのものなので、利用機会はほとんど無いかと思います。

新旧のインターフェースの同名メソッドではパラメータに変更は無いため、利用側のコードは、nsISoundcreateInstanceしていた部分をnsISystemSoundServicensISoundPlayerのインスタンスをgetServiceで取得するように変更し、nsISoundの定数を使っていた部分はnsISystemSoundServiceに同じ定数を定義しているので、インターフェース名を書きかえるだけで新しいインターフェースを直接使うコードに書きかえることができます。

新しい二つのインターフェースは共にシングルトンで実装されていますので、createInstanceを利用してもgetServiceと同じ結果が返りますが、コードの意味上、よろしくないので、後者を使うようにしてください。

nsISoundは引き続き利用可能ですが、createInstanceを実行するとその度にインスタンスが生成され、さらに、その実行時に新しいインターフェースのインスタンスを取得して、同じメソッドを呼び出すだけなので効率が悪く、利用価値はありません。

Bug-org 479822 Use <audio> Wave decoder to replace platform specific Wave playback in nsSound 初回投稿日時: 2009年10月18日01時47分25秒
最終更新日時: 2009年10月18日01時48分21秒
カテゴリ: Mozilla Core バグ修正
固定リンク: id=2009101802
SNS: (list)

nsISound::playaudio要素と同じ実装にしよう、というバグです。Bug-org 520417で修正されています

nsISoundPlayerで、直接audio要素を内部で生成して利用するという形をとっています。ほとんどオーパヘッドがないのと、メンテナンス性を考慮した結果です。

同時に実装したnsISystemSoundServicensISoundPlayer経由で再生されたサウンドをシステム音(ビープ音除く)を再生する直前に、自動的に停止することに注意してください。Javascriptからシステム音と重なってでも再生しつづけたいものを再生する場合は、このインターフェースを利用せず、new audio()で直接audio要素にアクセスしてください。

Bug-org 110385 Sound is not asynchronous on linux 初回投稿日時: 2009年10月18日01時53分12秒
カテゴリ: Mozilla Core バグ修正
固定リンク: id=2009101803
SNS: (list)

Linuxのサウンドの再生がメインスレッドで行われるため、環境によっては操作を妨害してしまうというバグです。

この当時はcanberraを利用していなかったので、Bug 479822のための修正で、問題のコードは丸ごと削除されました。

nsISystemSoundService::playEventSound()が引き続き、メインスレッドでの再生を行いますのでもし、canberraの実装に問題があれば同様の問題が発生し続ける可能性があります。その場合、新しくバグを報告して私をCCに追加しておいてください。

Bug-org 504670 Firefox hangs on first menu access 初回投稿日時: 2009年10月18日01時56分33秒
最終更新日時: 2009年10月18日01時59分45秒
カテゴリ: Mozilla Core バグ修正
固定リンク: id=2009101804
SNS: (list)

Linuxで最初にメニューを開こうとすると固まる、というバグです。これもBug-org 520417の修正で修正されているはずです。

他の人の見立てでは、esdの初期化に問題があるようなので、これを削除した今、問題はなくなっているはずです。また、初期化処理もアプリが起動し終わったら、メインスレッドで自動的に行うようにしていますので、ユーザのアクションを妨害する、ということにはならなくなっているはずです。

ちなみに、nsISystemSoundServiceはこの初期化処理が行われる前に利用しようとしてもエラーを返すのみで、システム音は再生されません。せいぜい、起動と同時にダイアログを開く時に音が鳴らない、というバグがあるかもしれませんが、起動時間を犠牲にするほどのものではないのではないかと思います。

2009年10月22日

開発環境をWindows7に移行中…… 初回投稿日時: 2009年10月22日15時10分13秒
カテゴリ: 雑談
固定リンク: id=2009102200
SNS: (list)

Ultimateのアップグレード版は高すぎるし、もはや意味もないので、HDDとともにDSP版のProfessionalを購入し、丸ごと環境作り直し中です。深夜販売で買ったのですでに一日ついやしてますが、まだもう一日ぐらいかかりそう。

サーバゲット 初回投稿日時: 2009年10月22日16時13分28秒
カテゴリ: Anime 雑談
固定リンク: id=2009102201
SNS: (list)

サーバにネットブックがほしいなぁと思ってたところに、これが発売することがわかったため、即決定。

音々PC(ネットブック)

深夜販売ではのいぢさんに手渡ししてもらえるという思わぬサービス付きでした。

ちなみに、外箱はさすがに地味です。

音々PC(ネットブック)の外箱

あふぃるちゃーん 初回投稿日時: 2009年10月22日16時30分27秒
カテゴリ: 旅行 雑談
固定リンク: id=2009102202
SNS: (list)

先月末に友人と行ってきたときの写真が出てきたので掲載。コラ画像ではなく、リアルです。

でかいアヒル

アヒルのおしり

アヒルの顔

アヒルと人間の比較

高層ビルとの比較

ロケ地: 大阪・天満橋