Home > Latest topics

Latest topics 近況報告

たまに18歳未満の人や心臓の弱い人にはお勧めできない情報が含まれることもあるかもしれない、甘くなくて酸っぱくてしょっぱいチラシの裏。RSSによる簡単な更新情報を利用したりすると、ハッピーになるかも知れませんしそうでないかも知れません。

萌えるふぉくす子さんだば子本制作プロジェクトの動向はもえじら組ブログで。

宣伝1。日経LinuxにてLinuxの基礎?を紹介する漫画「シス管系女子」を連載させていただいています。 以下の特設サイトにて、単行本まんがでわかるLinux シス管系女子の試し読みが可能! シス管系女子って何!? - 「シス管系女子」特設サイト

宣伝2。Firefox Hacks Rebooted発売中。本書の1/3を使って、再起動不要なアドオンの作り方のテクニックや非同期処理の効率のいい書き方などを解説しています。既刊のFirefox 3 Hacks拡張機能開発チュートリアルと併せてどうぞ。

Firefox Hacks Rebooted ―Mozillaテクノロジ徹底活用テクニック
浅井 智也 池田 譲治 小山田 昌史 五味渕 大賀 下田 洋志 寺田 真 松澤 太郎
オライリージャパン

Page 34/239: « 30 31 32 33 34 35 36 37 38 »

CSS Niteの講演者向け資料というか指示書というか注文書というかアレを見てブチギレた事について - Nov 13, 2009

公開されてる(されてしまっている)CSS Niteの講演者向けの様々な要求事項は、内容そのものの資料性(プレゼンはこういう流れで書いてくれ、質疑応答はこういう風に進めると良い、これくらいの余裕を持って資料を先に出してね、etc.)も、細かく付けられている注文事項(こういう口調でこういう雰囲気を作ってくれ、会場がアップルストアの時は絶対Macを使う必要があるよ、etc.)も、雰囲気作りを、大げさに言えばブランド戦略を、重視してるイベントだったらまああってもおかしくないよなと思う。自分が業界の振興と集客を狙ってイベントを主催するとしたら、勉強会の類のイベントに関心が薄い人達を引き付けて広く薄く知識の底上げを図るなら、ほっといたら先細りしていく所を広く一般寄りにアピールしていけるようにしようと思うなら、きっとこういう事を言いたくなるだろう。そこは分かる。というか僕自身、そういう事を言いたい場面に出くわしたことが無いわけではないし。

返す返す言うけど、なんといっても、そういうイベントで一番大事なのは、勉強それ自体ではないから。もちろん勉強になるのに越したことはないけど、でも極端な話「ブラック会社に……」の上原さんみたいな「ものすごく知識があるけど小汚いおっさん」と、「平均よりちょっと上くらいの知識を持ってる小綺麗な兄さん」の2者がいたら、スピーカーには後者を選ぶべきだろうなと、僕でも思う。そこがCSS Niteがいわゆる「勉強会」と一番違う所だと思ってる。

という風に頭では理解してるけれども、それでもカーッとなるのを抑えられなかったのは、なんでなんだろう。

劣等感を刺激されたからなのかな。

僕自身がスピーカーになったことがあるわけじゃないし、そもそもスピーカーとして呼ばれないだろうけど、自分が呼ばれてこれ見たとしたら、いちいちああしろこうしろと注文を付けてスミマセンの一言もないってお前何様やねん、と、ムカッと来るだろうなと思う。なんで、どれもこれも当然みたいに注文つけてるわけ? と。「いいイベントにするために一緒に考えて頑張りましょう。」じゃあなくて、「こっちで全部考えたから、これに黙って従ってくれ。あなたの好みとか考えなんかどうでもいいから。」って言われてるように、僕には感じられた。

そりゃあ自分はモテないし格好良くもないし喋りだって上手くないよ、でもそういうモテ要素から無縁だった代わりに人に物を教えても恥ずかしくないくらいの知識は身に付けたつもりだ、だからその事に対してくらいは尊敬してくれよと。そりゃああなた方から見ればこっちなんかぺーぺーのプレゼン初心者でしょうから、「見てらんねえなあ」と手取り足取りあれこれ世話を焼きたくもなるでしょう。でもそうやって世話を焼かれると、自分の惨めさを見せつけられてるようで苦しいんだよ。「どうせお前は技術バカだからこんな事も知らないんだろ、まあせいぜいこれ見て勉強して、ウチらのCSS Niteっていう看板に傷を付けずに済むくらいにはマトモになってから来なさいよ、それが嫌なら来るんじゃないよ、そもそもこっちだってどーしてもお前さんに来て欲しいと思ってるわけじゃないんだからね、お前さんなんかに頼らなくて済むならほんとは頼りたくないんだからね。」って言われてるみたいですげえ悔しかったんだ。いろんなものとひきかえにして育てた物の上前だけを持ってかれるようで、ムカついたんだ。

……いや、僕ごとき最初から呼ばれるわけもないんだけど。部外者もいいとこで、そもそも存在を認識すらされてない自分なんかが、こんな風に思い上がった憤りを感じてるっていうことが、とてつもなく滑稽だ。

まあでも百歩譲って、僕の知ってる人がスピーカーをやるとなった時にコレを突きつけられたと聞いても、やっぱり「僕の尊敬する誰某さんになんちゅう失礼なことをしやがる!!!!」と憤慨するよ。

なんでそんなに憤慨するのかな。

どうしても感情を抑えられなかった一番の理由は多分、この文書が一般に向けて公開されてたから、なんだと思う。主催者がどっかの何かの講演会で、「いや、これでも運営色々大変なんですよ。スピーカーには発表素人の人もいますし、ドレスコードも分かってない人までいますから、一から十まで教えてあげないといけませんしね。そこまでしてようやくこのクオリティでご提供できてるんですよ。」と言ってるようなイメージが、僕の頭にはぱっと浮かんだ。ああ、それを言っちゃうんだ。そーゆーこと言っちゃうんだ。言いふらしちゃうんだ。スピーカーの人をうっすら貶しても全然いいと思ってるんだ。と、カチンときたんだと思う。

という風に散々熱くなってたわけだけれども、そういう醜態を晒してフンガーフンガー息巻いてる僕を見かねてか、るりさんに「で、これってどっかからリンクされてんの?(→君は運営の意図という所を邪推してすごく気にしてるようだけど、どこからもリンクされてないんだったら、少なくとも運営は大々的に公開したがってたわけじゃないと判断できるんじゃないの? だとしたら君が怒ってるポイントは的外れってことになるよね? という風なニュアンスで)」と言われたり、kotarokさんに「noindex,nofollowになってるけど?(→だから、これをこうして無関係の人が見てる状態というのがそもそも運営の想定外の事態なんじゃないの? それじゃ非公開に全然なってないよねっていう事実はあるけど、それは別の問題だよね? という風なニュアンスで)」と言われたりして。それで渋々ソース見てみたら、確かに検索避けの指定が入ってて、そこで一気に熱が冷めまして。

「こういうものを一般にそのまま見せていいと思ってんのかよ」と憤ってたのに、そうじゃなくて実は、最初から一般向けに晒すつもりが無いものだったのかと。自分が身内向けにこういう資料を作るんだったら、「素人が見て喜びそうだっていう程度の意味しかないアニメーション効果を付けたりしないで、ていうかひょっとしたらCSSすら書かずになるべくシンプルな物で済ませる。」とか、「身内向けの資料はBasic認証とか閲覧権限を制限したGoogle Docsとかで共有して、誰でも見れるようにはしておかない。」とかそういう風にするだろうという先入観があったので、「そうではなくて、それなりの飾り付けがされてるって事は、きっと公に向けた物なんだろう。」と思い込んでしまってた。僕が一番カチンと来た部分が、なんだよただの勘違いだったのかよ、と。言ってみれば、パーミッション設定とかサニタイズとか(←サニタイズ言うな)を怠ってたせいでディレクトリ掘ったら顧客情報丸見えになってましてん、みたいなよくあるしょーもない話でしかなかったのかよ、と。

そういう、ショボーいオチ。

追記。そこら辺のことを考えてリンクはしてなかったけど、それはそれでシャドーボクシングみたいにしか見えなくて滑稽かもしれないなと思ったので、公平性のためにリンクすることにした。「一次ソースも明記せずに一方的に言いやがって、卑怯な奴だな。」と思われるよりは、この文書を見て、リンク先の文書を見て、「は? これのどこにブチギレる余地があるわけ? ワケわかんないんだけど。これを見る限りPiroは異常に歪んだ精神の持ち主であり境界性人格障害であり自己愛性人格障害であるとしか判断できず、こんな輩は糞便爆発して死ぬべきである。」とでも思われた方がまだマシだ。

HYPER-ANCHORの「選択範囲のRangeからXPath式を求める」処理を追いかけたらLine Markerに再会 - Nov 09, 2009

Firefox Developers Conference 2009、企業でアドオンを開発してる所でただの宣伝ではない技術的な話が聞けそうなセッションということで、A3 「ビッツにおける拡張機能開発 (Wired-Marker 他)」見たいなあと思ってたんだけど、15:40からのトークセッションの打ち合わせがあったので見れなかったんですよね。Webに上がってる感想を見ると、AMOで公開した後のやりとりについて色々話してたそうで、うわー分かる分かる!見たかったなあ!と、悔しい思いをしてたんです。

今日になってチラシを改めて見ながら、僕の代わりにセッションを聞いてもらってた小野寺さんに「どんな発表だったん? 技術的に面白そうな所ありました?」と聞いたら、「ページ内の選択箇所の位置情報をXPathでURLに付与するとかなんとか」って言われて、「へぇーずいぶん前に僕も同じようなことをやったなあ、同じ事考える人がいるんだなあ。ひょっとして僕のコードコピペして使ったんかな?w 使われてたらちょっと嬉しいなあ。」と思って、でも公式サイト見てみても特に僕の名前とかLine Markerへの言及は無いし、「予想外したかなあ。でももし仮に僕のコードが入ってたらライセンス違反(笑)だよなあ。」と思いながらAMOの配布ページからXPIをダウンロードして中を見てみて、該当する箇所を見てみたんですよね。

わあ。懐かしいコードに出会ってしまった。

クリエイティブコモンズの表示-非営利-改変禁止ライセンス(ちなみにこのライセンスは、無料で見れる映像作品などに設定する場合に使われる「作者を明らかにしてタダで再配布しなさいよ、自分の物だと言い張ったりお金取ったりしたらあかんで、あと改造したり切り貼り素材に使ったりするのもあかんで」という性質のライセンスです)なので、具体的にコードの一部を引用して比較することは避けておきますが、content/hyperanchor/hyperanchor.jsの中で定義されてるgetXPathForNodeというメソッドと、Line MarkerのcontextMenuOverlay.jsの同名のメソッドを見比べると、変数の書き方とかループのラベルとか// fallback, for markers in another marker or other cases...というコメントとかを見る限り、Line Marker由来のコードと見て間違いないみたいなんですよね。どうも。

amachangとAzaと後藤さんと通訳の人と打ち合わせしてる隣で堂々とCopyright(c) BITS Co., Ltd. and Prof. Okubo. All Rights Reserved.なこのコードの解説が行われていたかと思うと、なんか笑えます。

まあそんなに独創性のあるアイデアでもないし、僕もコピペした後元のコードの作者の名前を書き忘れることがあるし、こういうのを作れる技術力のある人ならこの関数をスクラッチで書き直す(&改良する)のは大して苦じゃないでしょうから、このエントリに気付いて今後のバージョンでライセンス違反を解消してくれればいいねえと期待しつつ生暖かい目で見守りたいと思います。

で、皮肉るだけじゃあまりに非生産的なので、僕のコードに限らずMPL1.1/GPL2/LGPL2.1のTri-licenseなコード(Firefoxそのものもそうです)をこういう風に流用したい方へのアドバイスを書いておきます。トリプルライセンスなコードはトリプルライセンスまたはいずれか1つのライセンスを引き継げば問題無いので、

  • 全体をMPL1.1/GPL2/LGPL2.1のトリプルライセンスとする。
  • 引用したコードが含まれたファイル(今回の事例であればhyperanchor.js)だけMPL1.1にする(MPL1.1はファイル単位までしか感染しないので、こういうことができる)。
  • 引用したいコードだけ別ファイルに分けてそのファイルをMPL1.1にする。

のような感じにしておくと、僕のようなうるさい奴が「ライセンス違反じゃー!! 天狗のしわざじゃー!!!」とどや顔で騒ぎ立てることが無くて良いと思いました。逆に言うと、そのようにしておけば誰に文句を言われることもなくFirefox内部のコードでもなんでもパクれるもとい再利用できるので、みんなどんどんFirefoxの中からコードをコピペすると良いと思います。

イベントの感想エントリより前にこんなの書いてる僕って何なんでしょうね。

追記。コメント欄にも書き込まれていますが、先方からメールでもご連絡をいただきました。ライセンス上の問題が解消されるまで一時的に、当該アドオンの公開を停止されるとのことです。当該アドオン自体の有用性を否定するつもりはありませんので、早く再公開されればいいなあと、アドオン開発者の一人として思っています。

なんでこういう嫌らしいエントリを書いて晒し上げにするわけ? メールで連絡してなしのつぶてだったら初めて晒すのでも十分なんじゃないのか? 的な批判を裸電球さんからいただきましたので改めてよくよく考えてみましたが、今回の自分の「目的」というのはどうも、「ライセンス違反を解消してもらうこと」ではなく「尊敬されなかった事への不快感の表明・発露」だったのでしょうね。

「オープンソース」という言葉が生まれたのはGNUの思想と無関係にGPLなどのライセンスの恩恵を受けるためだった、という歴史がありますが、そういう意味では僕自身も、「自分の名前をどこかに残すため」「自分の痕跡を残すため」「称賛を得るため」「遺伝子を残せないなら、代わりにコードと名前を残す」という風な大目的のためにオープンソースにフリーライドしているという部分が大きいのだと思います。だからこそ、「フリーソフトウェアの思想のため」でもなければ「コードが適切に再利用されるため」でもなく、あくまで「リスペクトされなかった、自分が蔑ろにされた、成果から得られたはずの称賛を横取りされた(と、事実はともかく自分は感じて)、それによって傷付いた自分がここにいるのだということを世界に対し表明し、同情を買い、自分の心を慰めるため」という目的を意識した行動を真っ先に取ったのでしょう。即ち、twitterやここのような「自分のフィールド」で、間接的な嫌らしい書き方で、相手を非難する、という行動を。

だからおそらく、メールで知らせて人知れず修正されたとしても、あるいは淡々と事実のみを記しても、僕の「目的」は果たされることはなかった。また、その瞬間の僕の頭には「ああ可哀想な僕たん。こんなに可哀想なんだから同情されるよね間違いないよね。」というシナリオができあがっていたから、そのシナリオに沿った行動以外を取る気にはなれなかった。

しかし一通り吐き出してやっと、おそらく大方の第三者が冷静に考えて思うであろう「馬鹿だなあ、そんな書き方をしたら余計に嫌われるだけだろ」という結論に自分自身も辿り着いたため、何ともばつの悪い、しかし今更これを引っ込める事もできない、後味の悪さと、自分という人間の小者っぷりを最大限にアピールしてしまった事への後悔を感じたわけです。今となっては、自分に対しても本件に関わった誰に対しても、残念な思いしか感じられません。

Webページのアウトラインを目次風のリストで表示するJetpack feature - Nov 06, 2009

同ネタ既出の予感だけど。

amachangのHTML5のクションアウトライン解析ライブラリを使わせてもらって、HTML5ベースのセクションアウトラインに基づくページ内目次を生成し、ページの右上に貼り付けるJetpack featureを作ってみた。先日のCSS Niteの時にブツクサ言ってたのを形にした。

(スクリーンショット)

  • ページ内のリスト
    • ページ右上に固定表示される黒いタブをクリックすると、リストがするするっと出てくる。
    • セクション名をクリックするとその位置までスクロールする。
    • リスト上でのダブルクリックか、リストの外でクリックすると、リストがするするっと縮んでタブに戻る。
    • ステータスバー上の「Outline」のチェックを外すと、ページ内のタブは出てこなくなる。
  • スライドバー内のリスト
    • スライドバーに追加されたアイコンをクリックすると、リストがするするっと出てくる。
    • セクション名をクリックするとその位置までスクロールする。
    • スライドバー上からマウスのポインタを外すと、スライドバーが隠れる。

amachangのライブラリのライセンスが不明だったので、このJetpack featureもライセンスは明示してません。あしからず。ライブラリのライセンスはパブリックドメインとのことなので、これもパブリックドメインに……と言いたいところですが日本ではPDは存在しないので、とりあえず皆さん安心して使えるよう僕はMITライセンスが好きなのでMITライセンスとしておきます。

所感。

  • rgba()とか-moz-box-shadowとか使いまくってますよ。
  • jQueryのアニメーション機能を使えたので、楽にアニメーションを実現できた。これはいいわー。

追記。リクエストがあったので、スライドバーへの表示に対応してみた。また、ステータスバー上のチェックボックスで、ページ内のタブの表示・非表示を切り替えられるようにした。チェックボックスの状態はFirefoxを終了した後も保持される(storageのAPIの使い方がやっと分かったので使ってみた)。

左のタブ/右のタブ/他のタブを閉じるボタンを追加するJetpack feature - Nov 06, 2009

今度はJetpack用のスクラッチで。ステータスバー上に「左のタブを閉じる」「右のタブを閉じる」「他のタブを閉じる」ボタンを追加します。そんだけ。

この程度の物ならサクッと作れる。とても楽です。

追記。タブの順番を並べ替えていると期待通りに動かないバグがあったので修正した。

クリップボード監視のJetpack版を作ってみた - Nov 06, 2009

テキストリンクに続いてClipboard ObserverJetpackに移植してみた

テキストリンク同様に、普通のアドオンのClipboard ObserverのコードをJetpackで動くように手直しして、最後にJetpack用のコードを付け加えただけ……という感じ。今回は、テキストリンクでは使わなかったステータスバーへの項目追加のAPIを使ってる。

以下、詰まった点。

  • APIリファレンスが貧弱で、何ができるのかまるで分からない。
  • jetpack.storageの使い方が分からない、というか、Web上に書かれてる情報が古くて役に立たない。APIリファレンスに書いてある書き方を試したら「この方法は古いです、もうすぐサポートしなくなります」なんてメッセージが出る。
    • なので、起動する度に「Observe Clipboard」のチェックが入った状態になる。
  • ステータスバーに追加する内容の幅は、自動的には調整してくれない。ピクセル数できちんと指定してやる必要がある。これ、フォントが違ったら表示崩れるよねえ?

とにかくドキュメント不足が深刻です。

追記。アウトラインリスト生成のやつでstorageの使い方がやっと分かったので、チェック状態を保存するようにした。

テキストリンクのJetpack版を作ってみた - Nov 06, 2009

いわゆる軽量アドオンであるところのJetpackについて今度の日曜のFirefox Developers ConferenceでAza氏とトークショーじゃなかったトークセッションを行うにあたって、「全くJetpackを触らないまま行くのはさすがに失礼すぎるだろ常識的に考えて」と思ったので、テキストリンクをJetpack featureとして移植してみた

以下、詰まった点。

  • Firebug使ってないからデバッグが面倒だった。
  • クリックされた箇所のURIっぽい文字列、のRangeを取得するにあたり、nsIFind(などのXPCOMコンポーネント)の支援を受けられないので、JavaScriptとDOM Rangeだけで強引に解決するのに手間取った。
  • XPCNativeWrapper同士を==で比較すると、ラップされてるノードが同じノードでもfalseになる。===!==で比較すればちゃんと意図通りに判定される。これは盲点だった。(普通にアドオンを作る時だと==で期待通りに判定されるので)今Jetpack 0.6で試したら問題なく動いた。アルェー?
  • APIリファレンスが貧弱で、何ができるのかまるで分からない。

やっつけ移植なので、URLっぽい文字列をダブルクリックしたら新しいタブを開く、という機能しかないです。そのくせ25KBもありやがる。

スクリプトの中身はぶっちゃけ普通のテキストリンクのコードのコピペです。というか、Jetpackで動かないであろう部分を削っていって残ったのがコレなんで。最後の方にちょこっとだけ、JetpackのAPIを使ってページの読み込み完了を監視する処理が入ってて、そこが本題です。

いいな、と思った点。

  • これは有り物の移植だからあんまり参考にならないけど、ゼロからスクラッチする場合を考えると、アドオンの時に比べて事前の準備が要らないので、確かに楽ではあるだろうなあ。
  • about:jetpackからスクリプトの管理を行えるんだけど、削除・再インストール・リフレッシュ(スクリプトを配布元から再取得する)まで行える。開発中は、仮登録→テスト→編集→リフレッシュ→テスト→... というサイクルになる。
    • 一旦アンインストールした物も、about:jetpack内にリストが残る。「消したけど、やっぱり使いたい」という風な心変わりがあっても大丈夫。
  • スクリプトの登録時に、自動更新のためのチェックボックスが表示される。多分自動アップデートできるということなんだろうけど、この機能はまだ試してない。(でも電子署名とか何も無いし、第三者攻撃に対する安全はどうやって確保するんだ?)
  • Firefoxの再起動無しで入れたり外したりできるのは楽でよい。気軽に試せる。

Ubuntu 9.04 Jaunty JackalopeからUbuntu 9.10 Karmic Koalaにアップグレードしてみた - Nov 02, 2009

マシンはLet's note CF-W7。Ubuntu 8.10→9.04の時もいくつかトラブルが起こっていたけれども、今回もやっぱりトラブルがついてきた。

  • アップグレードの途中、「console-setupを設定しています」と言われてキーボードのモデルを選ばされたけど、PanasonicとかLet's noteとかそういう風に書かれたキーボードが一覧の中になかったので、とりあえず「Generic 101-key PC」を選んでおいた。(今のところ特に不具合は起こってないのでこれでよかったみたい。)
  • 会社のネットワークの都合でIPv6を無効化してた件について、アップグレード中に「/etc/modprove.d/blacklist.conf」が書き換えられて、「blacklist ipv6」と書いてた行が消えたみたい。またなんかあったら書き加えるかも。

アップグレード後。

  • 前回はタッチパッドの外周のくるくるスクロールを機能させるために設定を追加で行わなくてはならなかったけれども、9.10では、「設定」→「タッチパネル」で設定を有効にし直せば特に他に面倒なことをしなくてもちゃんと動いてくれた。
  • ホットキーもちゃんと動いてる。明るさUP/DOWN、音量UP/DOWN、スリープ、ハイバネーション、電源の状態表示は確認済み。ディスプレイ切り替えは、再起動無しでできるかどうかまだ確認してない。
  • Thunderbird 2が何故か英語のままだった。thunderbird-locale-jaを手動で入れたら日本語になった。
  • ATOKは、前回は再インストールが必要だったけど、今回は特に何もしなくても普通に使えてる。
  • 無線LANが繋がらなくなった。Hidden SSID WLAN doesn't work under Ubuntu.9.10、ということで、ステルスモードのアクセスポイントに繋がらないというregressionだそうだ。既知のバグなのでそのうち直るらしいけど……
  • GNOMEパネルをデスクトップの左右に縦長にして置いてるんだけど、「自動的に隠す」にしてると、何故かそのパネルが置かれてる辺全体ではなく、上下の端でしか反応してくれない。デスクトップの上か下に横長表示で配置すると、上下の辺全体が反応するのに。これもregression?

なんで無線LANが使えないのか分からなくて、池添さんや小野寺さんに色々助けて貰いました。自分で面倒見きれないくせに使うなって話ですよね。ごめんなさい。

銀座アップルストアのCSS Niteに行ってきた - Oct 30, 2009

こたせんせがHTML5の話をされると聞いて、全然追いかけてないからそろそろ情報仕入れとかなきゃなーと思って、お説教を聴きに行って参りました。

どちらかというとAPIの面に期待してたので、そっちは話さないよと冒頭でバッサリ切られちゃってとても残念でした……

聞いた中で「ほう」と思ったのはこの辺。

  • 昔のW3Cは、仕様が勧告されてから実装しろよ! 勧告になるまで実装すんなよ! というスタンスだったらしいけど、CSS2.1とかその辺の頃から方針が変わって、実装が出揃わないと勧告にしないよ! というスタンスになったらしい。(だからHTML5が勧告になるのはまだまだずっと先)
  • section, article, aside, nav あたりは、セクション系要素ということで、派生クラスとか同じインターフェースを備えたモジュールとか、そういう風な扱いなのだそうだ。アウトライン解析の時にはこれらを同一視してアウトラインを生成するのだと。
  • HTML5はHTML4ともXHTML(1.0?)とも互換性を保つよう配慮されてる。
  • navとかそういう語彙が出てきてる時点で、なんだよHTML3.2時代に逆戻りかよと思ってたけど、そういうベンダの思いつきのオレオレ拡張ではなくて、今世に溢れてるHTML文書の<div class="section">とかの用例を見て、その中でよく使われている物を逆に仕様に取り込んだような形だ、ということらしい。

質問タイムがなかったけど、あったら訊いてみたかったこと。

  • 「誰も使ってないし」という理由でMozillaはせっかく実装していたMNGやSOAPをドロップしたけど、こういう事についてどう思いますか。
  • 互換性を大事にといっても、videoのコーデックは結局実装依存なんですよね?(Ogg Theora派とH.264派……まぁ資本力っていうかブランド力っていうか、iPhoneやGoogle Chromeで使えるならってことでH.264の方が主流になるんでしょうけどね)
  • 仕様が固まる前の段階の実装が普及してしまった場合どうなるんですか。CSS2.1でrect()の仕様が変わったように、仕様の方をデファクトスタンダードに合わせて書き換えるというのが今後は基本になるんでしょうか。

会場に入って後ろで立って話聞いてたんだけど、前に立ってる人がしきりに「ふんふん」「うんうん」と頷いて、熱心にメモを取っているのを見て、ちょっとなごんだ。

続きを表示する ...

SSTabRestoring/SSTabRestoredイベントが、「ウィンドウ全体の復元」の時の物か「個別のタブの復元(または複製)」の時の物かを判別する - Oct 27, 2009

Firefoxでは、タブがセッション情報も伴って復元された時に、SSTabRestoringSSTabRestoredという2つのイベントが発行される。イベントのoriginalTargetはいずれも復元されたタブの要素で、SSTabRestoringはセッション復元処理が走ったけれどもタブの読み込みは完了していない段階、SSTabRestoredはタブの読み込みが完了した段階で発行される。

これらのイベントが発行される場面は、3つある。

  1. ウィンドウが復元された時(起動時のセッション復元、「最近閉じたウィンドウ」からの復元など)
  2. タブが個別に復元された時(「閉じたタブを元に戻す」など)
  3. タブが複製された時

この3つの場合を、特に1とそれ以外とを判別したい、その方法を考えてみたよ、というのがこのエントリの主題です。

どういう場面で必要か

例えばツリー型タブでは、タブの親子関係が変更された時のインデントの変更やツリーの折りたたみ時にアニメーション効果を適用している。しかしながら、Firefoxのセッション復元時に複数のタブのツリー構造を一気に変更する場合には、いちいちアニメーションしてたら重くてしょうがない。なので、この時だけはアニメーション効果を適用しないようにしたいと僕は思った。

しかしながら、前述のSSTabRestoringSSTabRestoredからは、そのイベントが発行されたのが上記の3つの場面のうちいずれなのかが分からない。どの場面でイベントが発行されたのかを判別するには、他の情報も参照する必要がある。

判別できそうで判別できない理由

実は1の場合については、セッションが復元される時にObserverServiceに登録したオブザーバに対してsessionstore-windows-restoredというメッセージが通知される。なので、これを監視すればいいんじゃないか?と、最初のうちは考えてた。

でも、話はそう単純には済まなかった。実際にイベントを監視してみると、セッション復元時には以下のような順番でイベントが発行されていることが分かった。

  1. 現在のタブのSSTabRestoringイベントが発行される。
  2. sessionstore-windows-restoredが通知される。
  3. 残りのタブのSSTabRestoringイベントが順番に発行される。
  4. それぞれのタブのSSTabRestoredイベントが読み込みの終わった物から発行される。

3と4はこの通りにならないこともあって、あるタブのSSTabRestoringが発行されてすぐに読み込みが完了したタブについては、次のタブのSSTabRestoringが発行される前にSSTabRestoredが発行される場合もある。

一番致命的なのは、複数タブのセッション復元が始まったことは通知されるのに、全部のタブのセッション復元が終わったことは通知されないという点だ。

  • 最初にsessionstore-windows-restoredが通知されたらその後に発行されたSSTabRestoringは全部ウィンドウ単位のセッション復元の一部なんだな、と判断してしまうと、例えば10個のタブを開いたウィンドウのセッションを復元した後、1つタブを開いて、閉じて、開き直した時、そのタブまで「ウィンドウ単位のセッション復元の一部」と誤爆してしまう。
  • SSTabRestoredが発行されるまでの間にSSTabRestoringが発行されたタブ」がウィンドウ単位のセッション復元なんだな、と判断してしまうと、後続のタブのSSTabRestoringよりも前にSSTabRestoredが発行された時に、セッション復元が終わってないのに終わったと見なされてしまう。

という具合で、「ウィンドウ単位でのセッション復元の終わり」がいつなのかが分からないと、誤爆しまくりで全然役に立たない。

また、重ねて困ったことに、sessionstore-windows-restoredの通知はsubjectがnullなので、どのウィンドウでセッション復元が開始されたのかすらオブザーバ側からは分からない。別のウィンドウでセッション復元がはじまった時に来た通知を見て「これからこのウィンドウで開き直されるタブは全部、ウィンドウ単位のセッション復元の一部なんだな」と判断してしまってはいけない。

強引に判別する

dump()をコードの中に埋め込んで調べたところ、nsSessionStore.js内の各処理とイベントは、以下のような順番で起こっているらしいということが分かった。

  1. nsSessionStore::restoreWindow()
    • ウィンドウの復元を開始
  2. nsSessionStore::restoreHistoryPrecursor()
    • 各タブの復元を開始
  3. nsSessionStore::restoreHistory() (選択されたタブ)
    • SSTabRestoringが発火
  4. sessionstore-windows-restoredが通知される
  5. nsSessionStore::restoreHistory() ×タブの個数分(他のタブ)
    • SSTabRestoringが発火×タブの個数分
  6. nsSessionStore::restoreDocument_proxy() ×タブの個数分
    • SSTabRestoredが発火×タブの個数分
    • 最後に復元されたタブのSSTabRestoredが発火したら、すべてのタブの復元が完了

このうちnsSessionStore::restoreHistoryPrecursor()やnsSessionStore::restoreHistory()やnsSessionStore::restoreDocument_proxy()は、タブを1つ復元するだけの時にも使われてる。 よくコードをよく読むと、nsSessionStore::restoreHistoryPrecursor()の中で「復元するタブの数だけ新しくタブを開く」「それらのタブのtab.linkedBrowser.parentNode.__SS_data._tabStillLoadingtrueにセットする」という処理が行われて、その後でsessionstore-windows-restoredがオブザーバに通知されていた。(このtab.linkedBrowser.parentNode.__SS_data._tabStillLoadingは、タブの復元が完了した段階でundefinedになる。)

ということは、sessionstore-windows-restoredが通知された時にウィンドウ内の全部のタブを調べて、tab.linkedBrowser.parentNode._SSdata._tabStillLoadingtrueであるタブが2つ以上ある(復元待ちのタブが複数ある)なら、そのウィンドウでこれからウィンドウ単位のセッション復元が行われようとしている、と考えてよいわけだ。

で、SSTabRestoredが発行される度に復元待ちのタブの数を確認して、復元待ちのタブの数が0になったら、ウィンドウ単位でのセッション復元が終わったと判断できる。

厳密には、「ウィンドウ単位でのセッションの復元中に別途タブを1個だけ復元した」という場合にもそのタブが「ウィンドウ単位のセッション復元の一環で復元された」と見なされてしまうので、この方法にも穴はある。たくさんのタブのツリー構造を一気に変更した時にアニメーションでクソ重くなるのを避けたい、という僕の目的ではこれで必要十分なので、これ以上は追求してない。

まとめ

以上をコンパクトにまとめると、こんな感じになる。

var ObserverService = Cc['@mozilla.org/observer-service;1']
                        .getService(Ci.nsIObserverService);

var observer = {
  restoringWindow : false,

  getRestoringTabsCount : function() {
    return Array.slice(gBrowser.mTabContainer.childNodes)
             .filter(function(aTab) {
               var owner = aTab.linkedBrowser;
               var data = owner.parentNode.__SS_data;
               return data && data._tabStillLoading;
             }).length;
  },

  observe : function(aSubject, aTopic, aData) {
    if (aTopic == 'sessionstore-windows-restored')
      this.restoringWindow = this.getRestoringTabsCount() > 1;
  },

  handleEvent : function(aEvent) {
    switch (aEvent.type) {
      case 'load':
        window.removeEventListener('load', this, false);
        window.addEventListener('unload', this, false);
        gBrowser.addEventListener('SSTabRestoring', this, false);
        gBrowser.addEventListener('SSTabRestored', this, false);
        return;
      case 'unload':
        ObserverService.removebserver(this, 'sessionstore-windows-restored');
        window.removeEventListener('unload', this, false);
        gBrowser.removeEventListener('SSTabRestoring', this, false);
        gBrowser.removeEventListener('SSTabRestored', this, false);
        return;

      case 'SSTabRestoring':
        this.onTabRestoring(aEvent);
        return;
      case 'SSTabRestored':
        this.onTabRestored(aEvent);
        return;
    }
  },

  onTabRestoring : function(aEvent) {
    var tab = aEvent.originalTarget;
    if (this.restoringWindow) {
      // ウィンドウ単位でのセッション復元時の処理
    }
    else {
      // タブが個別に開き直された時の処理
    }
  },

  onTabRestored : function(aEvent) {
    if (this.restoringWindow)
      this.restoringWindow = this.getRestoringTabsCount() > 0;
  }
};

window.addEventListener('load', observer, false);
ObserverService.addObserver(observer, 'sessionstore-windows-restored', false);

セッションストアAPIを使ってタブにいろんな情報を紐付けて、その情報に基づいてあれこれしたい人には、役に立つんじゃないでしょうか。(でもそんな変なことやってる人はほとんどいないんだろうなー)

ツリー型タブでタブバーの表示・非表示をキーボードショートカットで切り替えたい(How to show/hide the tab bar by a keyboard shortcut?) - Oct 26, 2009

Q

I would like to see a shortcut assigned to show/hide the tab bar with the next update. That would be very useful since I reckon, since I have to click every time I want to show/hide it, which every time I want to read some thing on the web, which is way too frequent.

次のアップデートで、タブバーの表示・非表示の切り替えのためのキーボードショートカットを追加して欲しいです。私が思うにそれはきっととても便利でしょう。Webで何かを読もうと思う度に、タブバーの表示・非表示を切り替えるために今は(タブバーを?)その都度クリックしていますが、この操作が頻繁すぎて面倒です。

A

I'm very sorry, currently I have no idea to add new shortcut to show/hide tab bar. Instead, if you press "Ctrl" key for a while, collapsed tab bar will be expanded while you press the key. I hope it helps you.

If you like, you can call internal methods to show/hide tab bar from keyboard shortcuts defined by keyconfig or KeySnail. For example:

// toggle mode shown <=> hidden (shown <=> shrunken)
TreeStyleTabBrowserAutoHide.toggleMode();

// set to "shown"
TreeStyleTabService.setTreePref('tabbar.autoHide.mode',
   TreeStyleTabBrowserAutoHide.prototype.kMODE_DISABLED);

// set to "hidden"
TreeStyleTabService.setTreePref('tabbar.autoHide.mode',
   TreeStyleTabBrowserAutoHide.prototype.kMODE_HIDE);

// set to "shrunken"
TreeStyleTabService.setTreePref('tabbar.autoHide.mode',
   TreeStyleTabBrowserAutoHide.prototype.kMODE_SHRINK);

Note: These examples work on Tree Style Tab 0.8.2009100101 or later.

すみません、今の所タブバーの表示・非表示を切り替えるショートカットを加える予定はないです。その代わり、Ctrlキーを長押しすると、非表示になっていたタブバーがCtrlキーを押している間表示されるという機能があります。これが助けになることを願っています。

お好みで、タブバーの表示・非表示を切り替える内部的な機能をkeyconfigKeySnailで定義されたショートカットから呼ぶこともできます。例は上記の通りです(ツリー型タブ0.8.2009100101以降で動作します)。

Page 34/239: « 30 31 32 33 34 35 36 37 38 »

Powered by blosxom 2.0 + starter kit
Home

カテゴリ一覧

過去の記事

1999.2~2005.8

最近のつぶやき

オススメ

Mozilla Firefox ブラウザ無料ダウンロード