たまに18歳未満の人や心臓の弱い人にはお勧めできない情報が含まれることもあるかもしれない、甘くなくて酸っぱくてしょっぱいチラシの裏。RSSによる簡単な更新情報を利用したりすると、ハッピーになるかも知れませんしそうでないかも知れません。
の動向はもえじら組ブログで。
宣伝。日経LinuxにてLinuxの基礎?を紹介する漫画「シス管系女子」を連載させていただいています。
以下の特設サイトにて、単行本まんがでわかるLinux シス管系女子の試し読みが可能!
ツリー型タブでずっと前から発生条件が分からなくて困ってた「一つもタブが選択されていない状態」になってしまうバグの原因がやっと分かったので、速攻で修正した。
この問題は、以下の条件がすべて揃った時に発生していた。
この時、内部的にどういう処理が行われていたかというと、以下のような感じだ。
この「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を作る時にはもうちょっと慎重になった方がいいよね、という教訓を得たという話なのでした。
方針が明らかになったことを受けて、さらにいくつかのアドオンを追加で応募した。以下はその時に書いた紹介文。
今回追加エントリーした連中の方が一応僕にとっては「本命」なんだけど、これも箸にも棒にもかからなかったら泣けるね……
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 という感じだ。
Mozilla Labsで行われているアドオンコンテストに乾坤一擲のエントリーを!!と思って人の手も借りながら超気合い入れて説明文を書いてツリー型タブあたりを投稿しようと思って送信ボタンを押したら説明文が最初の1/4くらいでゴッソリ切られてしまって激しく脱力した 字数制限があるなら最初から言ってくれよと……
しょうがないからヤケクソで小物を連投してみた。以下、実際に投稿した説明文。
あー……もしかしてinstall.rdfに書いた「homepageURL」のページに詳しい説明を書いとけということだったんだろうか?
元々はね。手持ちの弾を全部出し尽くして、説明もし尽くして、エントリーそれ自体に全力尽くすつもりだったんですよ。今までこういうコンテストからはずっと逃げてきてたから。実力を冷静に判断される機会をずっと避けてきてたから。
拡張機能について言えば、唯一参加したもじら組の拡張機能コンテストは参加者少なすぎてまともな体裁だったとは言えなかったようだし、こないだのMozilla 24のSOI Asia主催のコンテストは審査員だったから参加はハナからできなかったし。前回のコンテストの時はまだ英語の読み書きに今よりずっと抵抗が強かったこともあって参加しなかったけど、それは今から振り返ってみたらただの言い訳だったのかもしれない。CSSについてだって、2chのカスイケスレに晒すのが関の山で、ホントにハイレベルな連中が集まってたCSS Zen Gardenにはついぞ一歩も踏み入れられなかった。絵のことなんて言わずもがな。
僕のことを褒めてくれる人とかはいるけど、でもそれって客観的に見てどうなんだ、技能とか発想とか作り込みとか、ちゃんと冷静に比べたらどのくらいなんだ、ってことを評価される機会に今までちゃんと向き合ったことがなかった。だから、天狗になって「僕チンはすごいんだぞ! 日本で拡張機能作ってた人間の中では最古参の一人なんだぞ! タブブラウザ拡張では世界中から注目されたんだぞ!」なんて勘違いも甚だしい大言壮語の自慢話を、酒に酔った勢いでグチグチと垂れ流したりするわけですよ。
そんな自分にけじめを付ける機会にしたかったんです。いい結果が出たのなら、それを自信として、歪んだ自尊心なんかこれ以上膨らまさないようにしよう。応募作の中で最終的に箸にも棒にもかからないような物でしかなかったという結果が出たのなら、あるいは、何とも言えない微妙な結果だったのなら、自分の程度という物をきちんと自覚して、分をわきまえるようにしよう。
という風に物凄く強い思い入れがあってエントリーを考えていただけに、説明文の字数オーバーでアウトというのはなんとも言えずもにょってしまうのです。
……とまあ、こんな極東の島国で少数民族の使う言葉で愚痴っていたところで疑問が向こうに伝わる訳はないので、フォーラムで質問してみた。……他にまだ一件もコンテスト関係の書き込みがないから、空気の読みようがなくてガクガクブルブルだ。
需要がどれだけあるか分からんけど、ツリー型タブをTab Mix Plusと同時に使えるようにしてみた。といっても左右にタブバーを表示した場合限定で、それ以外の場合については全然まったく動作確認を行っていないので要注意。とりあえず多段タブの設定になってる時はそれを自動的にキャンセルするようにはしてあるけど、TMPの設定次第ではグッチャグチャになる可能性もある。
TMPによって改変された後のDOMツリーは旧TBEを思わせる混沌とした有り様で、解析するのにえらく骨が折れた……
自転車を買った時から突いていた前照灯、ON/OFF切り替えの操作が手元でできるので好きだったんだけど、気がつくと豆電球の電極の接触が悪くなって明かりがつかなくなってて、その都度ドライバーを持ってきて蓋を開けて電極を指でひん曲げるということをしなくてはならないのが難点だった。それでもめげずに使い続けてたんだけど、どこかにぶつけた時の衝撃か何かで歪んでしまったのか、どこかがこすれて異音を発するようになってしまって、あれこれいじってるうちに明かり自体が全然つかなくなってしまったので、諦めて新しい前照灯に付け替えることにした。
……というわけでLED5灯のものを買ったんだけど、取り付けてみて初めて「失敗した」ということに気がついた。ハンドルに取り付けるような構造の物だったんだけど、普通に付けると前カゴの中の物が照らされるばっかりで全然意味がない。カゴが空の時でもカゴに反射してギラギラ眩しいし。
かといってロクに使いもしないうちに買い換えて捨ててしまうというのももったいなかったので、前カゴの端っこにビニール紐でくくりつけて、前照灯として使い続けることにした。
Firefoxもそうなんだけど、自分で使う物は自分の使いやすいようにカスタマイズして当たり前だろという感覚が僕にはある。その根底にあるのは、「せっかく買った(導入した)んだし……」という「もったいない」の精神だったり、少々不格好でも便利な方がいいやという考え方だったりするんだろうなと思った。
表題の通り。やらなきゃいけないことが他にあるのに放っぽって巻き戻し/早送りボタンをいじっていました。
Rewind/Fastforward Buttonsは現在自分でも使ってる奴の中では最も初期の頃に書いたコードがそのまま残ってるアドオンの一つで、機能を加えるとかバグを直すだとかをやろうにもやる気が萎えるような作りだったので、長年放置してたんだけれども、現実逃避を兼ねて、ワリと最近作ったアドオンと似たようなスタイルになるようにコードを全面的に書き直したのですが、それだけじゃナンだったので、これまた前々から課題として残っていたAutoPagerizeのSiteInfoの自動インポートも実装してみました。
Wikiには次のページへのリンクの検出ルール(nextLink)しか書かれていないのですが、巻き戻し/早送りボタンは前のページへのリンクに対しても処理を行えるように作ってあるし、他のユーザースクリプトなりアドオンなりで前のページへのリンクの情報を使うような物もあるかもしれないし、ということでSiteInfoには前のページへのリンクの検出ルール(prevLink)も含めてもらえると主に僕が嬉しいです。でもそれだけのために圧倒的多数のAutoPagerizeユーザの人にとってはまったくゴミにしかならない情報をWikiに掲載してもらうというのはAutoPagerizeユーザの反感を買いそうな気もします。
自前で専用Wikiを立てるしかないのでしょうか……