2010-07-27

近況

iPad も iPhone4 も新 mac mini も買わない私の信仰心に疑念の目を向ける心無い言葉を何度か耳にした. i5 が載ったら買うっていってるじゃん, といっても聞きやしない. ここは宣教プログラマとして信徒の鏡たれねば. 決意の末に LLDB のスライドを作り 説教に望んだ. I visited the mothership!

LLDB 所感

宣教の一環としてこの日記でもコードをウォークスルーしようと 1/3 くらい書いたんだけれど, 途中でやる気がなくなってしまった.

デバッガの面白さを大きく二手にわけると, 一つは他所のプロセスに横槍を入れる OS 密着部分のスリルがある. もう一つはプログラミングツールとしての強力さや柔軟性に挑むデザインへの興味. LLDB は, スリルの部分を "プラグイン" と呼ばれる サブクラスとしてうまく切り出している一方, デザインの部分はなんというか, 普通だった. だからスリルなプラグインをまとめて楽しんだあとは大して面白いところが残らない. スリルの部分にしても, 興味深いのは OS の機能だったりする. デザインも, 野心的な機能がないせいかあまり面白くない. 昔読んだ デバッガの理論と実装 (なぜか絶版. 捨てちゃったよ...) を超える発見はなかった気がする.

とはいえ見所はある. 個人的には Clang を使った式の評価が現段階でのハイライトだと思う. Clang 経由で LLVM からネイティブコードを出力し, それをターゲットプロセスに書きこんで呼び出すパス. DWARF Expression にコンパイルしてホスト側のインタプリタで実行するパス. 実行の主体がターゲットとホストにまたがるデバッガらしさを象徴している.

けれど残念なことに, これもちゃんと動いていない. たとえばローカル変数を評価してプリントするとエラーになるし, ターゲット側の関数を呼び出してもエラーになる. 構造体のプリントもなぜかエラー. 色々動いていないし, しょっちゅうクラッシュする. こんなに動かないと, ホスト/ターゲットハイブリッドの式評価というアイデアが ほんとに上手くいくのかいまいち信じることができない. デザインじゃなくて実装の問題だと言うかもしれないけれど, 外野には動いていないデザインの善し悪しなんてわからないでしょう.

もっとも 1-2 年前はぜんぜん動いてなかった Clang が 最近は色々ビルドできるようになっているらしいので, LLDB も 1 年後にはちゃんと動いてるのかもしれない... というか XCode4 に載せる以上, ちゃんと動くなるようにすると思う. そういえばコードのコメントに 2008 年頃の日付があった. 2 年くらいは歴史がある様子.

個人的には 21 世紀なのに単体テストがないとか(非公開なところにあるんだろうけどね) C++ のコードが生理的に受け付けないスタイルで書かれているといった理由から 熱心に追いかける気はない. でも小さいぶんデバッガの仕組みを眺めるには向いているし, 日曜に祈りのパッチを捧げても良いと思う. 信仰の形は人それぞれなのです.


2010-03-12

近況

2 月末でこれまでの勤め先を退職し, 3 月から渋谷のグーグルで働いています. 前職のみなさまお世話になりました. もうちょっとコードにコメントを書いておくんだったと後悔しつつ後の祭りです. ごめん. 新しい職場のみなさまよろしくおねがいします. というか既にだいぶよろしくされてます. ありがとうございます. 4 月から入ってくると思われる新卒社員の方, は読んでないと思いますが, ときどき研修に混じってくるおっさんがいても適当にスルーしてくださいませ.

カルマを高めてきたグーグルウォッチャー業は廃業です. 機会を頂いたのにすみません. でもさすがにウォッチャー社員はよくない. ドントビーイービル. 新しいウォッチ対象を探したい気もするけれど, その前にもうちょっと(というかだいぶ) コードを書いたり英語を話したりできるようにならないとまずそうで手いっぱい. 両隣の同僚が書くパッチの量に気圧され, 英語 Techtalk のジョークに笑えず, WebKit のとれないバグに悶絶する日々です. ぬぬぬ...

食生活とビルド時間は劇的に改善しました.

あとはええと, 今までもこれからもこのサイトの内容は私的なものであり, 私の勤務先の見解を反映するものではありません. まったく.

本日のツッコミ(全6件) [ツッコミを入れる]

Before...

omo [@kzys きわめて適切ですが縁起が悪いです。てか先輩にフラレるパターンは基本的に短編だけです。]

toshi_k [サシ飲み友達&kindle仲間が一人減って寂しい限り… 一段落したら飲み会でもやりましょや。 がんばれ〜]

omo [どうもです。 Kindle は不滅です!]


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 もタップで賢くズームした. あたりまえの機能らしい. ものしらずですすみません...