Home > Latest topics

Latest topics 近況報告

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

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

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

Page 30/248: « 26 27 28 29 30 31 32 33 34 »

XUL/Migemoで、非表示の要素の中にマッチする文字列があったときに検索結果がおかしくなる問題で悩んでる - Dec 05, 2008

掲示板の方で障害報告を受けていた、正規表現にマッチするはずなのに強調表示される物とされない物があるという問題。原因を色々調べてみたら、非表示の要素が問題を引き起こしていた。

<fieldset>
<legend style="display:none">b</legend>
<p>a b a c</p>
</fieldset>

例えばこんな箇所を検索対象にして、a|bという正規表現で検索するとする。

XUL/Migemoはまず一旦検索対象の範囲をDOM Rangeで取得して、文字列に変換し、それに対して正規表現のマッチングを行う。この場合、Rangeからは「b a b a c」という風な文字列が得られ、最初にマッチした「b」がヒット箇所ということになる。

次に、この「実際にヒットした文字列」を使ってFirefox自身の持つ検索機能を呼ぶんだけど、ここで問題が起こる。Rangeの文字列化では要素が表示されてるかどうかというのは考慮されないんだけど、nsIFindのRange内検索では、ヒット箇所が非表示の要素の中だった場合はヒットしなかったものとして次候補を探してしまう。上記の例では、非表示のlegend要素の中に「b」という文字列を見つけても、非表示だからということでスルーされてしまい、実際には次のp要素内の「b」という文字列の方にヒットしてしまう。

XUL/Migemoで次候補を検索すると、次の(2つ目の)「a」にはヒットする。さらに次候補を検索すると、文書の終了に達して文書先頭から検索し直されるのだけれども、この時も上記のような事が起こって、p要素内の1つ目の「a」ではなくp要素内の「b」がヒットする。よって、普通の前方検索を行っている間は永久に、p要素内の1つ目の「a」にはマッチしないという現象が起こる。

Rangeを文字列化する時に、非表示の要素を除外できればいいんだけど……

ちなみに現在のところ、Rangeを文字列化する時は、DOM3 XPathを使ってscript要素などを検出してそこを避けるように文字列化してるんだけど、要素の表示・非表示をキーにしようとするとDOM2 TraversalのTreeWalkerを使わないといけないと思う。TreeWalkerではすべての要素ノードに対してJavaScriptの関数呼び出しと条件判定が行われるので、長いページだとヤバイくらいに速度低下が起こりそう……という懸念があって、手を出せずにいる。

追記。実際にそのように実装して試してみたところ、確かに正しく検索できるようにはなるんだけど、Rangeを文字列化する処理自体が10倍遅くなった。これはまずいなあ。

危険なアドオン、悪意あるアドオン、低品質なアドオン - Dec 05, 2008

FirefoxでAmazonの商品ページを見た時に違法ダウンロードのリンクを自動挿入するという、倫理的に宜しくないアドオンの話のコメントでタブブラウザ拡張の話が引き合いに出されていたので久しぶりに読み返してみた。

ああ、懐かしいなあ。こんな時もあったなあ。

この時はTBEが叩かれてTabMixが祭り上げられてたけど、今となってはTabMixPlusがこの時のTBEと同じような叩かれ方をしてる(TMPがアップデートされるまでFirefox 2から3に移行できない、とか、ロックインのような状態も発生してる)というのは、性格の悪い僕としては「ざまみろプギャー」と思わずにはいられません。

あの頃と状況が変わった点と言えば、当時はリリース版よりナイトリービルドの方を使うようなマニアな人の方が多かったから毎日のようにTBEが本体の変更の影響を受けてマトモに動かなくなって大問題になってたけど、今ではリリース版を使う人の方が多くてその手の「昨日は動いたのに今日はもう駄目になってる」という事態が発生することが減ったことと、あと、わりかしザル気味とはいえAMOのチェック機構のおかげで、入れた瞬間に必ずクラッシュするようなひどいアドオンにぶち当たることが少なくなったこと、あたりがあるでしょうか。他にも、Mozilla自体の作りがだいぶマシになって余計な危険なことをしなくてもよくなったとか、MDC等でドキュメントが充実してきて平均的な技術レベルが向上したとか、そういうのもあるのかも。

僕個人についても、自動テストを導入し始めたとか、他のアドオンとなるべく衝突しなくてすむようなやり方を色々考えるようになったとか、色々変わったとは思う。

しかしこういう(悪意有るアドオン云々の)話題だったらむしろ、以前にプレゼンしたCドライブを強制的にフォーマットするようなヤバイ拡張機能の話の方が適してるような気もするんだけど。でもこの時のはプレゼン資料しか公開してないんだよなあ。これだけ見ても意味分からんか。

リンクから開かれた新しいタブでも「戻る」を使えるようにするTab Historyがイイ - Dec 03, 2008

Firefoxタブ常用者のための最新エクステンションガイド - SourceForge.JP Magazine で「ツリー型タブを入れてるとTab History が無効になる」と書かれてたので「なに!」と思って入れてみたんだけど今の所特に不具合無く動いてるように見える。一応ソースも見てみたけど、特に衝突する点も無いような……一カ所「もしかして、ここか?」と思う所は無くもないんだけど。そこだけ次版で手を入れておくか……(追記:ツリー型タブ 0.7.2008120401で一応手を入れてみた)

その問題はさておき、Tab Historyは確かに良い。万人にお勧めできると思う。よくある「初心者ユーザがリンクをクリックした時に勝手に新しいウィンドウが開かれて、それが全画面表示になっているせいで、『元のページに戻りたいのに戻るボタンを押しても何も起こらないムキー!!!』となってしまう」という現象、のタブ版を防ぐ物だと言えるだろう。自分はよく、あるタブから子タブを開く→子タブを見ている間に親タブを閉じる→やっぱり親タブをもう一度見たくなる→閉じたタブを開き直す という操作をやるのだけれども、Tab Historyが入っていれば、子タブしか残っていない状態でも「戻る」ボタンで親タブで見てたページに戻れる。

ていうかソース覗いてみて思ったけど、これ作った人頭いいなー。タブが開かれる時に引数でリファラが指定されていたら現在アクティブなタブから開かれたタブであると見なしてセッションヒストリを引き継ぐ、という判定をしていて、最小限の変更で適切な動作になるようにしてる。まあリファラを偽装する系の他のアドオンと組み合わせた時には問題が起こるかもしれないけど。僕にもこういうピンポイントで問題を解決する力が欲しい。

あとPrint All Tabsにちょっと興味を引かれたので、マルチプルタブハンドラのタブ選択時のメニューに「選択したタブを印刷」を加えるようにしてみてる(Print All Tabsをバックエンドに使うので、Print All Tabsが入っていない場合は使えない機能となる)。

劣化品 - Dec 03, 2008

Ctrl-Tabタブカタログを比較して良し悪しを語るのはいいんだけど、2年近く先行して開発された(一覧の表示方法を現行の形式に変更した時で比較しても、約1年先行)物をとっつかまえて、後から出た物の劣化品呼ばわりは、さすがに無いと思うんだ。「時代遅れ」なら許せる。

あと、タブカタログが劣化品と言うなら、Ctrl-Tabのサムネイルの上で右クリックした時にタブの上と同じコンテキストメニューくらい出して欲しいです。

コンテキストメニュー拡張の機能を減らした - Dec 02, 2008

コンテキストメニュー拡張を久しぶりにアップデートした……けどアップデートの内容は実質デグレードみたいなものだ。外部アプリケーションでソースを表示する機能、mailto:のリンクをメールソフトやWebメールのサービスに渡す機能、ユーザスタイルシートを編集する機能、任意のスタイルシートを登録して切り替える機能、あたりをゴッソリ削除した。

  • ソースを他のアプリケーションで開く機能はFirefox 3本体にあるし、ソース表示タブあたりを使えばGUIで設定できる。もはや用済み。
  • mailto:の処理をコントロールする機能もFirefox 3に標準で付いてる。オプション→プログラム→mailtoで、外部アプリケーションを指定することもYahoo!メールやGmailを指定することもできる。もはや用済み。
  • スタイルシート関係の機能は、そもそもまともに動かなくなってからだいぶ経ってた。今ではStylishもあればuserstyle.orgもあり、そっち使った方が絶対にいい。

できれば無駄にRDFを使ってるバックエンドも全部捨てたいんだけど、これを捨てると旧版の設定が全部失われてしまうことになるというのが痛い。

Minefield 3.1b3preの、タブのドラッグ&ドロップへの対応 - Dec 02, 2008

ツリー型タブマルチプルタブハンドラで、Firefox 3.1からの「ウィンドウ外にタブをドロップしたら新しいタブを開く」機能に対応した。子タブを持っているタブをウィンドウ外にドロップしたら子孫タブまで含めて新規ウィンドウに分離され、複数のタブを選択してウィンドウ外にドロップしたら選択されたタブすべてが新規ウィンドウに分離される。という感じ。ちょっと前の分割ブラウザの更新もこれに関係してる。

Minefield 3.1b3preでは、ブラウザのタブをドラッグした時はapplication/x-moz-tabbrowser-tabという型のデータがドラッグデータのリストの先頭に加わるようになった。今までは、ドラッグセッションの「ドラッグを開始した要素」をその都度参照していたようだったので、やっとまともな実装になったなーという感じだ。

分割ブラウザやツリー型タブでは、この型のデータも受け入れ可能なように修正した。そうしておかないと、「application/x-moz-tabbrowser-tab型のデータはドロップできないんだな」と判断されて、タブをタブバーや分割された領域にドロップできなくなってしまう。

Minefield 3.1b3preでの「ウィンドウ外へのドロップ」はどのように実装されているのかを調べてみた所、dragendイベント(ドラッグが終了した時に、「ドラッグが開始された要素」で発行されるイベント)のタイミングで、ドロップ操作に失敗した(ドラッグ操作終了時点でポインタの状態が「ここにはドロップできません」のポインタになっている)場合には「ウィンドウ外へドロップされた」と判断して、新しいウィンドウを開きそのタブとドラッグ元のタブを入れ替える、という風にして実現していた。

この時ドラッグ元のウィンドウでは、tabbrowser要素の_replaceTabWithWindow()メソッドにおいて、新規ウィンドウの第1引数にtab要素を渡して開くだけで処理を終えている。そこから先の「ドラッグ元のタブと新しいウィンドウの内容の入れ替え」は、新しく開かれたウィンドウの初期化処理(BrowserStartup()関数)の方でやってる。

なので、ツリー型タブとマルチプルタブハンドラでは、その両方の処理に割り込むようにした。_replaceTabWithWindow()を呼び出している_onDropEnd()メソッドで、_replaceTabWithWindow()メソッドを呼ぶ直前に割り込んで、切り離されようとしているタブの収集結果がそのウィンドウのタブ全部だった場合には操作をキャンセルしている。また、BrowserStartup()の方では、ウィンドウの第1引数がtab要素だった場合はまずツリー型タブとマルチプルタブハンドラに処理を渡して、何も行われなければ(渡されたタブが子タブを持っておらず、選択もされていないならば)Firefox本来の処理(単一タブの切り離し)に入る、という感じにしている。

ドラッグ元のタブ自身の上にドロップした時までウィンドウの切り離しになってしまうなど、Minefield 3.1b3preの当該機能自体がまだまだ作り込みが甘い感じなんだけど、そういう所にまで手を出すと収拾がつかなくなる&Firefox 3.1正式版までの間に手を入れられたらまた作業のやり直しになるので、そこら辺は基本的に放置してる。ただし複数のタブを同時に閉じようとした時の問題だけは、閉じるのに失敗したタブが永遠に閉じられなくなるなどの致命的な問題を引き起こすので、ツリー型タブの側で対処している(提出したパッチと同じ事をやってる)。

初パッチ - Dec 02, 2008

だいぶ前に報告した、TabCloseイベントの前後でタブの数が変わることを想定してないせいで複数タブを一気に閉じられない問題は、他のバグにおける変更の影響で結果的にFIXEDになったようだったんだけれども、今日あたりのビルドで試してみたらまた同じ問題が……「何故そうなるのか」と「何が問題なのか」が開発者に理解されてないとこうなるってことですかね。

とりあえずMozillaBuild入れて最新のソースをチェックアウトしてパッチ書いてモジュールオーナーと思われるmconner氏のメールアドレスをreview欄に書いてみた。

どっかで聞いたけど、こういうのって結局IRCで本人を突っつかないと放置食らう事が多いんですって? 英語チャットか……気が重いなあ。

ルーラーバーでエンコーディングの違いに対応したよ - Dec 01, 2008

英語で書かれた障害報告のメールに返信する時にルーラーがひどくずれていたのが気になってたけど放置してた件について、ルーラーバー 0.3.2008120101で修正した。

今まで、ルーラーの表示サイズの基準には編集領域のdocument.documentElementfont-sizeを使ってたけど、こちらはエンコーディングが変わっても値が変化しない。それに対して、document.bodyfont-sizeは、エンコーディングごとのフォントサイズの違いの影響を受ける。ということでbodyの方の値を参照するようにしたら、ルーラーの間隔はおおむね正しいものになるようになった。

ただ、これでもカーソル位置の強調表示のずれは残る。フォントサイズだけでなくフォント自体もエンコーディングによって変わる可能性があり、フォントサイズだけ合わせても、実際の編集領域とカーソル位置検出用の非表示のフレームとでフォントが違ったら、ピクセル単位で位置を拾った時に微妙にずれが発生する可能性がある。そこで、非表示のフレームの方にもエンコーディングの変化を適用させるために、SetDocumentCharacterSet()のタイミングで非表示のフレームの方のエンコーディングも変更するようにした。エンコーディングの動的な変更の方法はこんな感じ。

// this.calculator は非表示のフレームのbrowser要素
var docCharset = this.calculator.docShell
      .QueryInterface(Components.interfaces.nsIDocCharset);
docCharset.charset = aCharset;
var webNav = this.calculator.webNavigation;
webNav.reload(webNav.LOAD_FLAGS_CHARSET_CHANGE);
var self = this;
this.calculator.addEventListener('DOMContentLoaded', function() {
   self.calculator.removeEventListener('DOMContentLoaded', arguments.callee, false);
   // 読み込みが終わった段階でルーラーの表示を更新する(カーソル位置の検出をやり直す)
   self.updateRulerAppearance();
}, false);

最後にリロードしないと表示が変わらない、のかな?(リロードしなかった場合の挙動については未検証)

もっと良いAutoPagerize - Nov 25, 2008

新はてブとAutoPagerizeの競合のことで色々もめているようですが、個人的にはこの間Aza氏に見せてもらったUIデザインのモックアップみたいなのがいいなーと思いました。Azaはタブの代わりに使いたいと思ってたようだけど、AutoPagerize的な用途に使うのが現時点では有用なんじゃないかなあ。

イメージしづらいと思うけど、XULのbrowserとframesetとframeでそれっぽく表現するとこんな風になるかな。

<xul:browser height="600"><!-- ←この要素がスクロールバーを提供する -->
  <html:frameset rows="*,*,*" height="6000">
    <html:frame src="今見ているページ(ページ1):ページの長さ=2000px"
                 height="2000"/>
    <html:frame src="ページ1のrel=nextのリンク先のページ(ページ2):ページの長さ=2000px"
                 height="2000" />
    <html:frame src="ページ2のrel=nextのリンク先のページ(ページ3):ページの長さ=2000px"
                 height="2000" />
  </html:frameset>
</xul:browser>

本物のXHTML 1.0 Framesetとは違う嘘マークアップであることに注意。あくまで雰囲気だけ見て欲しい。こういう作りなら、AutoPagerizeの原理的な問題の一つである「ページを動的に継ぎ足すせいで、継ぎ足された内容に対してユーザスクリプトが実行されない」という問題は起こらなくなるはずだし、想定されない内容改変によるページのレイアウト崩れも起こらないはず。その代わり、広告が二度も三度も表示されるという問題は起こるけど。

ちょっと作ってみようかな、そういうの。

エイザを囲む会 - Nov 21, 2008

Aza Raskin飲み会行ってきた。

普段あまり顔を合わせることがないplus7さんが来られていた。plus7さんは最近タブレットPCを使われているそうなのだけれども、タブレットPCはキーボードが無い。そういう環境で便利に使えるUbiquity的なUIはどういうものか?という事についてのアイデアをAza氏に解説されてた。

それはどういうものかというと、逆ポーランド記法の計算が「演算対象のデータをスタックに溜め込」んでから「演算の種類を決定する」という形で行われるのと同じように、リンクやら文字列やらをドラッグ&ドロップでどんどん「スタック」に溜め込んでからコマンドを選択する、というものだ。溜め込まれるデータ自体が持つコンテキストであるとかメタデータであるとか(Microformatsもそう)をキーにすれば、その時提示される「コマンド一覧」について最も適切と思われるものをサジェストできるのではないか?とか、色々と夢が広がる。セカンドサーチで、ページ内の文字列を選択→検索窓にドラッグ→ポップアップが出てくるのを待つ→ポップアップから検索エンジンを選んでドロップ という風な操作をよくやってる僕としては、このUIが実現されれば結構使えるかも?と感じた。片手がふさがったままでも色々できるし。

組長に、現状のUbiquityにおける日本語対応用コードの内容というのを教えてもらった。曰く、「で」とか「に」とかの助詞をデリミタとして文を分割するという物だそうな。単純に作るとそうなるよなあと思うんだけど、実際の日本語の文章ではこれはまずマトモに動かないことが予想されるわけで……やはりきちんとした形態素解析の仕組みは欠かせないと思う。それか、ローマ字入力で分かち書き入力するという前提で、XUL/Migemoの応用によって、例えば「miru」という入力に対してマッチするコマンドをコマンド一覧から探し、「見る」と「診る」の両方をサジェストの候補として出す、という風にするとか。

ATOKダイレクトのAPIがオープンになっていること、PerlとRubyに対応していてSDKが公開されていることをAzaに伝えると、「Pythonは無いの?」とAza。そこから、何故Pythonが日本であまり流行らないのかという話になった。最初に出た訳本が微妙だったからじゃないかとか、名前の元になったモンティ・パイソンが日本であまり知られてないからじゃないかとか、PHPやPerlやRubyがすでにデファクトスタンダードとなってしまっているからじゃないかとか……

モンティ・パイソンの話から、コメディは文化に強く依存するのかもしれないという話にもなった。Azaが紹介してくれた「far side」というアメリカの漫画は、日本人に見せても「何が面白いのかよく分からない」と言われがちだという。モンティ・パイソンも組長曰く「ギーク受けするような内容」とのことで。でもサウスパークは日本人にもウケてる気がする。直接的なギャグ、は日本でも受け入れられるということなんだろうか?

日本語入力といえば、IME上でEnterで変換を確定するとUbiquityのコマンド実行として扱われてしまうという問題。これにはAza本人も参っているとか……誰かパッチを公開してたはずだ、という話をその場でもしてたけど、今調べたらFireMobileSimulatorの堀川さんだった。このあたりの、キー入力とIMEの組み合わせの問題を回避するノウハウは、Find As You TypeがC++からJavaScriptに移植された後に中野さんが頑張って直したFindToolbarの実装(今だったらfindbar.xml)に詰まっているので、Azaにもおすすめしておいた。

Azaは日本語がしゃべれるということで、みんな普通に日本語ベースでしゃべっていたけど、日本語ネイティブでないAzaにはちょっと辛いんじゃなかろうか? と、勝手に気を回してしまって僕はなるべく英語を使うようにしようとしてみたんだけど、基本的な語彙力がないからやっぱり日本語混じりの怪しい英語にしかならなくて、あの場では僕が一番アホな喋りになっていたんじゃないかという気がする。

その後、終電までの短い時間だったけどカラオケにも行った。Azaは「津軽海峡冬景色(石川さゆり)」「花火(AIKO)」「First Love(宇多田ヒカル)」を歌ってた……って、ちょ、どこで憶えるんだそんなラインナップ?!

そんな感じの会。いろんな人が色んな知識やアイデアを持ち寄って話すのも大事だなということを改めて思った。こういう機会を設ける提案をしてくれた組長に感謝せずにはいられない。組長はかなりの量のウィスキーにビールにワインに色々飲んでいてカラオケの時には呂律も回らなくなってヤバイ状態に見えたけど、無事会社まで辿り着けたんだろうか。心配だ。

ところで、帰ってきてから気付いたけど、ATOKダイレクト開発者ブログ前のエントリが紹介されてる。UbiquityにはATOKダイレクト開発者の方も以前から興味を持たれてたとのことで、みんな似たようなことを考えるものなんだなあと感慨を憶えた。……ATOK 2008(for Windows)買いそびれててすみませんすみません ATOK X4(?)での改良に期待してます。

Page 30/248: « 26 27 28 29 30 31 32 33 34 »

Powered by blosxom 2.0 + starter kit
Home

カテゴリ一覧

過去の記事

1999.2~2005.8

最近のコメント

最近のつぶやき