2010-02-23

近況

WEB+DB PRESS の連載が最終回です. 今回は毛色をかえ, 外野として WebKit にパッチを投稿する様子を 書いてみました. 宗教上の理由など C++ を避けておられる方にも楽しめるかもしれない内容になっております. パッチが原稿目的だったのは内緒です. (バグはちゃんと直したよ...)

連載のポストモーテムとしては, もっとレイアウトまわりを集中して扱えばよかったかなと反省. 自分もそのへんをよく読みたかった. CSS はさておき parser とか loader とか割とこう, しんどいゾーンから入ってしまったせいで 興味深いであろう箇所が手薄になってしまった. あと HTML5 なんかの流行りっぽい話をいれた方が人目を引けたかもしれない. ただ HTML5 ってブラウザが本来より守備範囲を広げる話なので, ブラウザらしさを見るには面白くない気もして悩ましい. あとは Chrome などブラウザ側のコードを読んでもよかった. そのへんはぜんぶ入りの Mozilla 一味の方が話はしやすそう.

話題以外では, もうちょっと文章をなんとかしたかった. 8 ページは書いてみるとけっこう長い. その中で辻褄や話題を整理して見目麗しく保つのはやや私の能力を超えていた. 文筆業の人はえらい. アホ文の面倒をみてくださった編集者の D さま, ありがとうございました.

そういえば, 今月は番外編として 日経エレクトロニクス にも ちょこっと書かせてもらいました. 特集の題目から想像するファンクラブ活動系ではなく, WebKit の話です. 日経エレで WebKit に興味が湧いたら WEB+DB を, WEB+DB の連載が食いたりなかったら日経エレを読むとよいです. というのは我田引水にもほどがあります. どっちも会社に摂ってもらおう.

WebKit on webOS

番外編は連載の没ネタをかきあつめてでっちあげようかとも思ったけれど, それは両出版社および Kindle DX に失礼だと気をとりなおし調べもの. 日経エレ読者は HTML5 の話よりデバイスに WebKit を載せる話の方が興味深かろうと考え, 適当にいくつかのポートを物色した. 中でも Palm webOS のポートは割と面白かった.

WebKit の webOS ポートは本家のツリーに入っておらず, palm.com のサイト内にぽろっと パッチが置かれている. 全然やるきない. もっとも webOS 自体がネイティブコードにとってオープンな環境ではないので, 本家に入れようとしたところで誰もコンパイルできず, レビューもできない. 野良ポートなのは仕方ない気もする.

webOS は C++ で書かれているらしく, webOS の野良ポートも C++ だ. ただ割とじゃんじゃか STL などを使うので オレオレコレクションを持つ WebKit のスタイルではない. (webOS は Linux ベースながら C++ を基調としているようす. 彼らの C++ への情熱は判断に苦しむ. Linux 開発者向けの求人 には "No fear of C++ - but smart enough not to use it" とある. 誰がうまいこと言えと...)

webOS ポートにはいくつかの特徴がある. まず, 描画機能は移植に含まれていない. 既存のポート(たぶん gtk+ と cairo) を利用しているらしい. JS には V8 を使っている. Palm Pre のリリースが 2009/6, V8 つきの Android2.0 は 2009/10 リリースだから, Android より早く ARM に V8 を載せたのだろうか. なかなか地雷精神に溢れている.

Smart Zoom

(追記あり)

そんな冒険野郎の webOS 開発者がただ移植だけをするはずもなく, このポートには本家にはない Smart Zoom なる機能が追加されている. 画面が小さいケータイの画面で PC 向けのウェブサイトを見るために 各社は工夫をこらしている. (以前 Android の Fit Column To Screen を紹介した. Apple は画面をでかくすりゃいいとばかりに iPad をつくった. たぶん.) Smart Zoom はその系譜にある.

webOS のブラウザで表示されたページをタップすると, タップ位置に応じたほどよい(=smart)大きさでコンテンツを表示しなおす. エミュレータでも試せる. トントン, フニョンッ, トントントン, フワワンッてかんじの, なかなか気持ちいい操作感.

Smart Zoom にはいくつかの工夫がある. まず表示倍率を決めるアルゴリズムが凝っている. (パッチ内 WebView::smartZoomAuto() 関数などを参照.) Smart Zoom のアルゴリズムは, 表示しているコンテンツのレイアウト結果を利用する. タップ位置に重なる RenderObject (要は <div> や <span>) を全て列挙し, 矩形の中心がいちばんタップ位置に近い (などの怪しい heuristics で) RenderObject をひとつ選ぶ. そして選ばれた RenderObject の矩形にフィットするよう画面をズーム+スクロールする.

もう一つの工夫は, ズーム操作が状態を持っていること. タップでのスマートズームに成功すると, 状態が <ズーム済> になる. ズーム済状態でのタップはズームをキャンセルし, ページ幅にあわせたスケールに表示を戻す. ただし戻るのは倍率だけで, 位置はズーム中を基準にずれている. だから画面端でタップを繰り返すとスームインとズームアウトを往復しながらなんとなくページを読み進められる.

Smart Zoon は Yahoo! のようなマルチカラム構成のページで特に効果がある. タップしたカラムにあわせて画面がよるので, iPhone のピンチ操作より器用さを求められない. とはいえたまに意図しないズームもおこる. 心のインスペクタで <div> を見抜く必要はある, かもしれない.

webOS ポートはこのほかに, 小さい画面でクリックできないイライラを解消する 投機的クリック(?)や, ちょっとしたテキスト入力支援システム Smart Text Engine など, こまごまとした手を入れてがんばってる. がぜん Palm Pixi が欲しくなった. KDDI にはがんばってほしいです.

Android 端末で付加価値云々と苦慮している日経エレ読者諸兄はまず Smart Zoom をポートすると良い, なんてのは安直すぎですすみません...

追記

iPhone もタップで賢くズームした. あたりまえの機能らしい. ものしらずですすみません...