たまに18歳未満の人や心臓の弱い人にはお勧めできない情報が含まれることもあるかもしれない、甘くなくて酸っぱくてしょっぱいチラシの裏。RSSによる簡単な更新情報を利用したりすると、ハッピーになるかも知れませんしそうでないかも知れません。
の動向はもえじら組ブログで。
宣伝。日経LinuxにてLinuxの基礎?を紹介する漫画「シス管系女子」を連載させていただいています。
以下の特設サイトにて、単行本まんがでわかるLinux シス管系女子の試し読みが可能!
とよく言われるんだけど自分の環境&自分の見てる範囲のWebサイトでは落ちないので原因が分からない、ということが多い。落ちるか落ちないかのギリギリの所をうまく突くようなコードを知らず知らずのうちに書いてしまっているのでしょうか。そんな能力いらなさすぎる。
タブのバインディングやスタイル指定のためのコードの削減のせいで、Firefoxのタブの拡張性は深刻なまでに低下した。ツリー型タブも情報化タブも動かなくなったし、Alice0775氏のスクリプトなども被害を被っているし、他にも被害を受けている拡張機能はあるんじゃないかと思う。
拡張機能がたくさんあるから云々ということを売り文句にしておきながら、このように拡張機能作者をいじめることにしかならないような変更を軽々しく入れてくる連中には、本当に腹が立つ。この詐欺的行為にあまりに腹が立ったので、自分でバグを立ててみた。
バグの報告文に書いたけど、この問題の要点は「拡張するためのあそびが全くなくなってしまった」という一言に尽きる。現行のFirefoxでは、スタイル指定のために用意された匿名要素のボックスや、そもそも今のFirefoxでは使われていないけれども今後実装されるかもしれない何らかの機能のために用意されていた(と僕は思っているけど確証はない)プレースホルダーがあって、それらの中に色々な要素を追加することができた。そのお陰で、タブの中にサムネイルを出したり、タブのロック状態などをアイコンで表示したりということが可能になっていた。ところが前述のバグで提出されたパッチによって、現在Firefoxの標準的な機能で使われている物以外の「あそび」は一掃されてしまった。
今の構造でも、バインディングを使えば要素を追加することはできるけれども、複数のアドオンでそれぞれ別々のバインディングを提供すればそれらは確実に衝突する。例えば、今までは情報化タブとツリー型タブを(それだけでなく、他のいろんなタブ系拡張機能を)好みに応じて組み合わせて使えていたのに、これからは、そのうちどれか一つしか使えなくなる、「組み合わせて使う自由」が失われるということだ。これでは、Firefox 1.5以前の暗黒時代に逆戻りだ。拡張性が高いことにFirefoxの価値を見出している者にとっては、こういう愚行は決して容認できるものではない。
でも英語力に自信がないしBugzillaの流儀にも詳しくないので、invalidとかworksformeとかそういう処理をされて、結局何も変わらないままFirefox 3正式リリースまでこの問題は解決されないまま放置されてしまいそうな気がする。誰か援護射撃してくれると嬉しいんだけれど……
ツリー型タブでずっと前から発生条件が分からなくて困ってた「一つもタブが選択されていない状態」になってしまうバグの原因がやっと分かったので、速攻で修正した。
この問題は、以下の条件がすべて揃った時に発生していた。
この時、内部的にどういう処理が行われていたかというと、以下のような感じだ。
この「TabCloseイベント」というのがFirefox 2以降で使えるAPIなんだけれども、問題は7のステップで起こっていた。7のステップで「次に選択するべきタブ」を決定するためのキーとして「現在開いているタブの総数」を使っているのだけれども、その値は1のステップの間に取得しているため、1から7までの間のどこかでタブの数が増減した場合、タブの選択状態が狂ってしまうのである。7のステップで「現在のタブまたはそれよりあとのタブ」が選択される場合、ここでは4のステップでタブの数が減少しているため、「次に選択するタブの番号」が「すでに削除されたタブ」のインデックスを指し示すことになり、selectedTabの値がundefinedとなりNull Pointer Errorが発生してしまう。……というのが事の真相だった。
ツリー型タブの側でselectedTabのセッタを上書きし、もし存在しないタブが選択されそうになった時は強制的に最後のタブを選択するようにしたところ、「一つもタブが選択されていない状態」は発生しなくなった。以下はそのためのコード。
// var b = gBrowser
var getter = b.__lookupGetter__('selectedTab');
var setter = b.__lookupSetter__('selectedTab');
eval('setter = '+setter.toSource().replace(
'{',
'{ if (!val) val = this.mTabContainer.lastChild;'
));
b.__defineGetter__('selectedTab', getter);
b.__defineSetter__('selectedTab', setter);
この部分ではなく、removeTabメソッドを上書きするという手もあるんだけど、ここはいろんなアドオンが上書きしたがるためコンフリクトの原因になると思ったので、「標準的な動作と変わってしまう」ことは仕方がないと割り切って、ほとんど誰も触らないであろうselectedTabの方を上書きするようにした。ちなみに、ゲッタとセッタ両方を定義し直しているのは、片方だけを再定義するともう片方が未定義になってしまうから。
表題の件に流れを戻すと、「タブを閉じる」という操作をイベントとして捕捉できるようにしたのなら、そのイベントをトリガーにして他のタブを連動して操作するという機能も当然登場してくるわけで、そういうことを考慮せずに「はいはいイベント発行すりゃいいんだろdispatchEvent っと!」と適当に設計してしまうとこういうトラブルが起こるので、APIを作る時にはもうちょっと慎重になった方がいいよね、という教訓を得たという話なのでした。
方針が明らかになったことを受けて、さらにいくつかのアドオンを追加で応募した。以下はその時に書いた紹介文。
今回追加エントリーした連中の方が一応僕にとっては「本命」なんだけど、これも箸にも棒にもかからなかったら泣けるね……
世間的には「ベータ版は機能を確定して細かい不具合のチェックに入った段階の云々」という風な説明がなされるようだけど、昔からずっと見てる限り、Firefoxの(というかMozillaの)それはただのリビジョン番号と変わらない気がする。RC(リリース候補版。問題がなければそのまま名前を変えて正式版になるかもしれないバージョン)と名付けてるくせにそこで平気ででかい変更を入れることも、メンテナンスリリースのはずの2.0.0.Xでセキュリティに関係ないでかい変更を入れてくることも、Mozillaではよくある話で、Mozillaのバージョン管理のいいかげんさは伝統的なものなんじゃないのという気がする。まあ「柔軟性がある」って言えばそれはそれでいいことなのかもしれんけど。
それか、もしかしたらこれは別にMozillaに限った話ではぜんぜんなくて、「ベータとは云々」という言葉の説明の内容自体が今の世の中の「ベータ」の多くの実態と乖離してるだけだ、という話なんでしょうか。
Mozilla Labsのアドオンコンテストに殴り込みをかけようとして不発に終わった件について、フォーラムに書いた質問に、Personasの作者でもあるクリス氏から回答があった。だいたい以下のような感じ?
先日、ツリー型タブのアピール文を英語で書くために人の手を借りながらああでもないこうでもないとやってるうちに思ったことなんだけど。図らずも、大学の卒業制作でやったWeb Mapで実現したかったことの一部を、僕はツリー表示とサムネイルによって手に入れていたようだということに、今頃気がついた。
タブのツリーは、今まで「ページ同士の関係性が分かる」という風に説明をしてきた。でも、実際にもたらされる効果の面から言い換えると、「あるページを基点にした閲覧の足跡をそのまま、興味が移り変わっていく様子=ツリーの分岐という形で保持し、好きな時点の興味の対象の間を容易に行ったり来たりできるようにする、視覚的な履歴」ということになると思う。
デスクトップ百景のスクリーンショットを見ての通り、僕はタブをたくさん開く方だと思うけど、べつに、多数のページを本当に平行して見ている訳ではない(そんな聖徳太子みたいなことはできない)。実際には、「後でもう一回読み返そう」「後でコメントしよう」「後で日記のネタにしよう」そう思った物を「読みかけ」「保留状態」で置いたままになっているだけだ。
そういう用途だったらブックマークを使えばいいじゃないかと言われるかも知れないけど、僕にとってはそれでは駄目なんだ。ブックマークはフォルダに放り込んでしまったらもう見えなくなる。画面がスッキリしていいんだけど、それはつまり意識の外に行ってしまうということで、「どこに何がある」ってことをちゃんと記憶しておかないとすぐに忘れてしまう。ソーシャルブックマークもそうだし、同様の理由で多分僕にはRead it Laterも使いこなせないと思う。
でもタブは、明示的に閉じない限りは視界の隅に残り続ける。他のことをし終わって一息ついた時、「ああ、そういえばこれがまだ未処理だった」という風に自分から主張してくる。そういう未処理のがスクが溜まって、タブがどんどん増えてくると、タブバーがだんだん狭苦しくなってきて、「ああ、そろそろ片付けなきゃな」って気になってくる。
ウィンドウ上部に水平に置かれたタブでは、勝手が悪い。たくさんタブを出そうと思ったら、一つ一つのタブが小さくなりすぎて何のタブだったかが分からなくなるし、タイトルが読めるような大きさでタブを表示すると、1画面の中に数個しかタブが表示されなくなる。これでは、自分のしていたことをざっと俯瞰することができない(「タブの一覧を表示」ボタンもあるにはあるけど、「モード」の切り替えを必要とするので、僕には馴染めない)。ある程度の情報を表示できる状態のタブを、10とか20とか表示できるのは、ウィンドウ左右での「縦置きタブ」ならではの利点だ。
単にタブを縦に並べただけでも不十分だ。確かにさっきは「自分のしていたことをざっと俯瞰できないから嫌だ」と書いたけど、でも、していたことの子細が全部一度に見える必要はない。全教科のノートの全ページを並べて見せられるより、それぞれのノートの表紙だけ並べて見せられた方が、余計な情報が少なくて、「ざっと見る」という目的に即しているだろう。そういう意味で、それぞれのツリーを折り畳んで、各ツリーの基点になった「親」のタブだけをざっと眺めることができるツリー型タブは、先ほどのノートの例え話にも似た効果がある。
こういう使い方をするにあたっては、それぞれの「タブ」が含んでいる内容を常時見ることができるようになっていると、なお良い。情報化タブでモードレスに常にサムネイルを見えるようにしているのは、そういうことだ。
最近仕事でRuby on Railsをやらないといけなくなって、MVC(データと、その表現形式と、制御)をきちんと分離するという考え方に今頃になって触れた。確かにプログラムを作る時はそれらは分離した方がうまく行きそうだけど、ユーザの目に見える時にはそれらが一体になっている方が多分いい。レバーを上げ下げすれば「操作できる」と同時に「データ(状態)が変わり」、さらには「今の状態が表現される」、という風に、原始的なUIはMVCが一体になっているからとても分かりやすい。プログラムを作る段階では構成要素ごとにMとVとCに分解しても、その後、それをユーザに見せる時にはもう一度統合するということが必要なんじゃないかと思う。
デスクトップ百景 第四十五景:カスタマイズしなきゃ気がすまない? 超・自分本位のデスクトップ……ということでBBWatchでデスクトップ晒してます。ハテナオヤ氏とか 碇シンジでおなじみの緒方恵美さんとかのビッグネームが並んでる中にぽつんとただのヲタが紛れ込んでて「だれやねん」という感じですが、石は投げないでください。
なお、LR-Menuのスクリーンショットでフォルダのショートカットがメニューにたくさん表示されていますが、これは、特定のフォルダをルートにしてエクスプローラを起動するようにしたショートカット群です。explorer.exeへのショートカットを作成して explorer.exe /e,/root,"C:\Documents and Settings\username\Application Data\Mozilla\Firefox\Profiles"
のようにリンク先を指定するだけで作れます。オプションの詳しい解説はMSのナレッジベースを参照してください。
の映像がフォクすけブログにあがってる。
<object width="425" height="355"><param name="movie" value="http://www.youtube.com/v/Kwi84-LAdu0&rel=1"></param><param name="wmode" value="transparent"></param><embed src="http://www.youtube.com/v/Kwi84-LAdu0&rel=1" type="application/x-shockwave-flash" wmode="transparent" width="425" height="355"></embed></object>
userChrome.jsに行った時点で余裕で初心者置いてけぼりな気がします!
まあブートキャンプというタイトルからは、ある意味当然の流れだとは思うんだけど。自動更新や簡単な管理、あるいは相互の組み合わせといった、エンドユーザが気軽に使えるようにするための配慮という贅肉をそぎ落として、必要なものだけが考えられる限りの最もシンプルな形で残る、というコンセプトだからヘビーユーザに大人気なのもよくわかる。alice0775氏のスクリプトとか高機能なものも多くて、似たような機能しか無いくせに色んな物をゴテゴテとくっつけざるを得ない拡張機能を作り続けてる僕涙目wwwwwwwwww という感じだ。