たまに18歳未満の人や心臓の弱い人にはお勧めできない情報が含まれることもあるかもしれない、甘くなくて酸っぱくてしょっぱいチラシの裏。RSSによる簡単な更新情報を利用したりすると、ハッピーになるかも知れませんしそうでないかも知れません。
の動向はもえじら組ブログで。
宣伝。日経LinuxにてLinuxの基礎?を紹介する漫画「シス管系女子」を連載させていただいています。
以下の特設サイトにて、単行本まんがでわかるLinux シス管系女子の試し読みが可能!
ということでXUL/Migemo 0.10.0やっとリリース。
スクリーンショットを見ると分かるとおり、なにげにAND検索にも対応してます。仕掛けは単純といえば単純で、入力された文字列をスペースで区切ってそれぞれについて正規表現を生成した後に、それらの順列組み合わせを全展開した正規表現をさらに生成する(これを使ってマッチングするので、各単語の順番が入れ替わってもマッチする)という、ものすんごい力業。単語数が増えると組み合わせの数が爆発的に増えて正規表現がクソ長くなってマッチングがクソ重くなるので、実用的な速度が出るのはだいたい3語くらいまでが限界だと思います……
ちなみに順列組み合わせの展開には無駄にMozStorageを使ってます。JavaScriptで一体どーいうアルゴリズムでやりゃぁいいのかちっとも分からんかったのでググってみたら、順列組み合わせの総数を求める方法ばっかり引っかかる中で一つだけSQLの自己結合を使った解き方が見つかったので、それをそのまま使わしてもらいました。pIXMigemoTextUtilsのgetANDFindRegExpFromTermsというメソッドがそれなので、興味ある人は見てみてください。
しかしまあ、今回のこれはFirefox 3 HacksのためにPlacesのことを詳しく調べてたからやっと実現できたようなもんで、つまりFirefox 3 Hacksを読めばこんなことは楽勝でできるようになるかもねということで、皆さんゼヒ買って下さい、と宣伝しておきます。オライリーから8月発売予定です(再掲)。
5日追記。ページ内検索では考慮しなくてもよかった問題が表面化してフリーズする(全角スペース1文字だけにヒットした場合に無限ループに陥ってしまう)という現象が起こってしまっていて焦った。対策を入れて早速更新した。
前者は「ねんどろいど」等で有名なグッドスマイルカンパニーのブログ、後者はアイマスの双海亜美・真美役の下田麻美さんのブログ。まさかこんな所でFirefoxを見かける日が来るとは思わなかった。
どうでもいいけど、再販分のねんどろミク早くこないかなー……クオリティ落ちてないといいんだけど。
places.sqliteが数十MBを超えているのりさんやdrryさんの環境では分単位で固まってしまって使い物にならん、ということだったので、お二人に協力してもらって各段階での処理の所要時間を調べてみた。
そしたらどうも、Placesデータベースから文字列をぶっこ抜いて正規表現でマッチングしてるところがものすごく重いらしいということが判明した。ログによると500万文字ある文字列に対してマッチングをかけようとしてたんだから、そりゃあ固まるわ、と。
固まる問題だけでもとりあえず何とかしよう、ということで数千件単位で文字列を取り出し→マッチング→取り出し→マッチング……という風に分割処理するようにしてみたところ、とりあえず固まる問題は何とかなったんだけど、でも検索結果が出るまで延々待ち続けないといけないのは相変わらずで。
と、そこでやっと気づいたんだけど、べつに正規表現でのマッチングとポップアップの内容の更新とを完全に分けて実行する必要はないんですよね。ちょっとずつマッチングしてちょっとずつ検索結果を取得してちょっとずつ結果のリストを更新していけば、全体ではものすごく時間がかかるようであっても、とりあえず最初の方の結果だけは見えるからストレスにはならない。必要な数だけ結果を取り出せたらそこで処理を打ち切ってしまえばいいんだし。
というわけであちこち書き直してみた結果、最初の実装に比べるとびっくりするほど快適に動くようになった。スレッド使ってなくてもそんなに重くない。のりさんにも「これなら常用できそう」と言ってもらえたし。
最終的にやってることは同じなんだけど、やり方を変えるだけでこんなにも体感速度に違いが出るものなんだなあ、ということをこれ以上ないほど実感した日でした。
それはそうと、途中の段階で分割処理を行うようにしたときのログを見てて気がついたんだけど、SQLite(というか RDBMS)ってすごいね。テストしてもらったのりさんの環境の場合、スマートロケーションバーの検索対象になる物だけでも46000件近く、そうじゃない物も含めればきっともっと大量のレコードがあるのに、「並べ替え後の順番で任意の箇所を取り出す」のに1秒もかからないというのには驚いた。今までちゃんとしたデータベースを触ったことがなかったから、こんなの未知の世界だ。世界規模のデータベースと世界規模の処理環境に憧れてグーグルを目指す人の気持ちが、少しは分かったような気がする。
こないだから少しずつ取り組んでる。
当初は皆目見当も付かなかったけど、Firefox 3 Hacksを書くために調べた知識が早速役に立って、Places APIを使ってる「履歴とブックマークの管理」と「ブックマーク」「履歴」の各サイドバーについてはワリとあっさり実装できた。
ロケーションバーについては残念ながら普通のAPIを使っておらず、オートコンプリートの実装の中でガチガチに書かれてて、まともにやっても手出しできない。OR検索さえできればMigemoが使えるのに。ということで、まず最初は、オートコンプリートのコントローラに複数の単語を順番に渡して結果のリストを生成させてそれを最後にまとめる、という事をやってみた。これは結構イイ線いったんじゃないかと思ったんだけど、履歴の件数が増えたりヒットした単語数が増えたりするとえらい事になってしまって、実用的な速度は出なかった。
そこで諦めて腹をくくって、無い知恵絞ってSQL文書いて、なるべく効率よく処理するようにしてみた。これで速度はだいぶ上がって、3文字以上入力した先あたりならかなりサクサク動くようにはなったんだけど、1文字2文字程度しか入力していないとやっぱりズシッと重い感じがある。
XPCOMのスレッドを作る機能を使ってみた所、Firefoxが落ちたし。
組長が書いている本に僕も書いてます、っていうかやっと今日書き上がりました。ここのところ全然寝れてなかったけど、これでやっとゆっくり寝れる。
僕の担当パートは例によってアドオンがらみで、FUELとPlacesとJavaScriptコードモジュールとMcCoyあたりについて出せる物をすべて出し尽くしました。というか出せる物以上を書かないといけなかったのでFirefox 3のコードを追いかけて調べながら書きました。ATOK X3買ったのもこれのため。最終的に書いた物はサンプルのソースコードも含めてテキストファイルで360KBくらい? UTF-8だから何文字とかちょっとわかんない……
書いた内容はどれもまあソースコードを順番に読んでいけば分かる事っちゃ分かる事ばかりなんですが、まとめのようなものという事でどうか許してください。オライリーから8月発売予定です。
のっぴきならない事情があってUbuntu(8.04LTS)でたくさん文章を書かなきゃいけなくなったんだけど、SCIM+Anthyでの変換効率が悪すぎてお話にならないので、カッとなってATOK X3 for Linuxをその場でダウンロード購入した。AAA優待版(他のプラットフォームでATOKを使ってる人向けの割引)で4252円。
ていうか仕事で一応メイン環境としてずっとLinux使ってきてたのに、我ながらよく今までずっと我慢してたなあ。いかにロクに仕事をしていないかがバレバレ……じゃなくて、だいたいLinuxだけで仕事することは少なくて特に文章を書く必要があるときは無意識のうちにいつも横にあるWindowsマシン(当然ATOK入り)で作業をしてたから、いざそれが使えない状況になって初めてそのありがたみを実感したわけですよ。
ご丁寧にもUbuntu 8.04LTSでのインストール手順がFAQとして公開されてたので、この通りに操作してサクッとインストールできた。
何で今まで入れなかったんだろうってくらい快適だ……もうAnthyには戻れない。
ソース表示タブを更新して「やったー」と思ってたらFirefox 3では動くけどFirefox 2では動かないという状態になっていて焦った。0.2.*からFirefoxのブラウザのUIによりシームレスに統合するべく、「view-source-tab:(元のURI)」という独自プロトコルでソース表示するようにして、Chrome URLをユーザの目には見えないようにしてみたんだけど、この際に使ったリダイレクトの方法だとFirefox 3では動くのにFirefox 2では動かないという現象が起こってしまっていた。基本的には過去に訳した記事の通りにやったんだけど、思わぬ所で嵌ってしまった。
この情報、元々はURNサポートの実装を改善するために調べたんだけど、その時は、訳した記事の指示の通りにやるとブラウザ上で表示されるURIがリダイレクト前のURNのままになるのは望んでいなくて、結局nsIContentPolicyを使うようにしていた。
しかし今回はむしろその逆で、about:configみたいにユーザには実体のChrome URLを見せないまま機能させたいというのが目標だ。というわけで元記事のやり方ほぼそのままでnewChannel()で生成するURIだけChrome URLにしてみた所、Firefox 3でのテストでは問題なく動いたのでそのままリリースしたんだけど、これがFirefox 2では動かなかったという次第で。
viewSource.xul等を「リダイレクト先」にした場合、ブラウザ上に表示されるURIとしてはあくまでリダイレクト前の「view-source-tab:(URI)」という物になって、Firefoxからもあくまでそのリダイレクト前のリソースであるという風に見えるようになる。userChrome.cssでabout:configの表示をいじりたかったら 実体のChrome URLの方ではなく@-moz-document url(about:config) { ... }
と書かないと機能しない、ということからもそれが分かる。そのため、viewSource.xulにクロスパッケージオーバーレイで機能を追加していた場合、viewSource.xulにリダイレクトするとその表示結果のURIのもとではクロスパッケージオーバーレイは適用されず、タブの中でうまく動かすためのパッチを当てられないことになる。
しかしこの場合でも<?xul-overlay href="..."?>
で書かれていたオーバーレイは適用される。なので、ソース表示タブで用意したXULドキュメントからオーバーレイでviewSource.xulを読み込んでやれば問題なく動くようになる。というのがFirefox 3上でテストした時の結果だった。
Firefox 2では、クロスパッケージオーバーレイが効かないのはもちろんのこと、上記のように直接ヘッダ部分に書いて指定したオーバーレイも全然読み込まれないということが、リリース後に試してみてやっと分かった。ソース表示タブで用意したXULドキュメントを読ませても何もオーバーレイが適用されないので、画面は真っ白のまま……という状態になっていた。なんてこった。
ちょっと試した限りでは上手くやる方法が見つかりそうにないと思ったので、もう諦めて、Firefox 2の時はドキュメントのURIがリダイレクト先の物に完全に切り替わるnsIContentPolicyを使った方法を使うようにした。今のソース表示タブは、Firefox 3で「view-source-tab:http://...」などと入力するとそのURIのままでソースを表示するけど、Firefox 2の場合は「chrome://viewsourceintab/content/viewer.xul?http://...」という風にChrome URLが丸見えになる。その代わりちゃんと動く。という状態。
既出だと思うけど。userChrome.cssに以下の内容を書けば、ロケーションバーにフォーカスしてURIを入力しようとして日本語入力になっててムキー!!!となる事態を防げる。
#urlbar *|input {
ime-mode: inactive !important;
}
ただし副作用として(というか当たり前だけど)毎回必ず日本語入力をONにしないといけなくなる。スマートロケーションバーでポップアップされた候補を上下キーで選び始めてから「やっぱり別の入力で」と思ってロケーションバーにフォーカスを戻してもう一度入力をやり直す、という場合でも日本語が勝手にOFFになる。これを解決しようと思ったらスクリプト(userChrome.jsかアドオン)で動的に上記のスタイル指定を与えたり外したりしないといけない。
ちなみに、XUL/Migemoは直接入力でローマ字入力を行わないとまともに動かないので、最近のバージョンでは検索バーのテキストボックスに対してそういう処理(スクリプトで一時的にIMEを無効化する)をしている。
19日追記。というわけで作ってみた(Auto Disable IME 0.1.2008061901)。動的にIMEのON/OFFを切り替えるので、上のスタイル指定と違い、スマートロケーションバーで候補を表示した後にフォーカスを戻した時などはそのままIME ONの状態が維持される。たったそれだけのアドオンです。WindowsとMac OS XのFirefox 3以降専用で、Linuxでは動かない。
公開してから気付いたけど、IME and DiMENSiONにも同じ機能があったのね……まあFx3以降のネイティブ機能によるミニマム実装ということでどうかひとつ。
正式リリースされたということでオフィシャルのダウンロード数に貢献したあと入れてみた。まあすでに3プラットフォームともRC3(リリース版と同じバイナリ)でさんざんテスト済みなんですけどね!! 切り替えのタイミングはあくまで気分の問題。
Firefox 2の頃からのプロファイルからパスワードやCookieやアドオン類をコピーして起動してみたら、自宅環境ではなぜだか急にCPU使用率が100%になって固まりまくるという現象が発生してげんなりした。とりあえず怪しげなアドオンを外した状態でテストしてみるも、あまり状況に変化が無くて、まだはっきりとした原因の特定には至っていない。思い当たる節が多すぎる。
それに比べると会社の環境の方はわりかしすんなり移行できた。
履歴とか余計なファイルがプロファイル内にあったのがまずかったんだろうか。
リリース直後くらいにともしびを見てみたら東京に一人だけでワロタ。すぐに他のとこにも人が増え始めたけど。ものすごい勢いでダウンロード数が伸びていって日本中がぺかぺか光ってる様子は綺麗だった。話に聞く限りはこのともしびはしばらく公開され続けてるらしいので、たまに見てみるとおもしろいかもしれない。
追記。Firefox 3も正式にリリースされたことだし、と思ってUbuntuを7.10から8.04にアップグレードした(Ubuntu 8.04LTSではFirefoxは3がデフォなので)ら、ここでも固まる問題が起こってしまった。ああでもないこうでもないといじくり回してみたところ、どうもGreasemonkeyスクリプトのどれかが悪さしてるみたいだという結論に達した。後でちゃんと調べてみないと。
いやーしかしFx3いいわ。FirefoxはUIまで全てJavaScriptで動いてるから、JSエンジンの改善があらゆるところに渡って効いてる。自作アドオンを大量に入れてたFirefox 2ではもっさりなんてもんじゃなかった(機能>速度 な人なのでそれはそれで構わないんだけど)のが、未対応のアドオン2~3個を除くとほぼ同じ環境ではっきり違いが分かるくらいに軽くなった。今までテスト用にちょっとだけ動かしてみることはあったけど、なるべくクリーンな環境でテストする必要があるから、ここまでアドオンいれて動かしたことなかったんだよね。
会社のサイトのコンテンツが一新され、コンテンツにブログが加わりました。何をやってる会社なのか(何ができるのか)分からんと言われがちなようなので、みんながちまちまやってる内容をここに書いていって、「当社ではこういうことができます」的な宣伝材料にする、というのが一応の目的のようです。
で、自分もアドオン開発者向けの自動テストツールであるUxUの使い方の解説なんかを書いてみました。ツールの使い方というよりは、「はじめての自動テスト」みたいな感じになってしまってますが。自分自身がまだ自動テストのことをよく分かってなくて須藤さんとかにしょっちゅう「何考えてんだ(全然分かってねえな)……」的な指摘を受けてばかりなので、自分の理解レベルに合わせるとこんな感じになってしまいました。技術力とか実績とかのアピールの場のはずなのに、こんな低レベルな記事を載せてしまうと却って会社の印象に泥を塗ってしまうんじゃなかろうか、ということをamachangのエントリとか見て思いもしましたが、もう後の祭りです。
UxUのマニュアルのつもりで、またそのうちXUL/Migemoのテストでの利用例の解説の続きを書くかもしれません。
あと、サービス→Mozillaサポート 実績紹介→Thunderbird用アドオンと辿ったページでThunderbird用の地味なパッチもいくつか公開しています。中にはもしかしたら同種のアドオンがすでに世の中にある車輪の再発明な物もあるのかもしれませんが、探すより作った方が早かったんで……