Home > Latest topics

Latest topics 近況報告

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

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

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

Page 16/31: « 12 13 14 15 16 17 18 19 20 »

分割ブラウザ、マルチプルタブハンドラの連携の改善 - Oct 19, 2008

Firefox 3.1からの変更への対応に関する技術情報の中に書いたけど、分割ブラウザマルチプルタブハンドラの連携を強化したり、分割ブラウザ側の「分割された領域」と「タブ」の連携を大幅に強化したりした。

ということをグダグダグダグダ書いてみても大して伝わらんだろうなあと思うので、実際に動いてる所のデモ動画を作ってみた。

<object width="425" height="350"> <param name="movie" value="http://www.youtube.com/v/-rfZNBy0jic"></param> <embed src="http://www.youtube.com/v/-rfZNBy0jic" type="application/x-shockwave-flash" width="425" height="350"></embed> </object>

Firefox 3.1上でなら擬似的な移動でなくホントの移動になるから、ストレスが無いし、書きかけのテキスト等が失われる心配も無いので、今以上にはるかに気軽に使えると思う。作った自分自身、これらの点がネックで今はほとんど使ってないので……

デモ動画自体の作り方もメモしておく。キャプチャはCamStudio、セッティングは「描いてみた」動画の作り方を参考に、ただしフレームレートは高めで。編集はNicoVisualEffectsでやった。CamStudio+ffdshowでH264でエンコードしたaviが読み込めなくて詰まったけど、Wikiに挙がってたDirectShowプラグインというのをを入れたらちゃんと読み込めた。そんな具合で、初めてなんでちょっと手こずったけど、DebugMode Winkを使って作るのに比べるとタイムライン操作がやりやすいので、今後はデモ動画を作る時はこのやり方でいこうと思う。

タブ系拡張機能 - Oct 16, 2008

そんなわけで(?)、TBE3に含まれる4つともアップデートした。

情報化タブの機能として、Firefox 3.1向けに、最後のタブのクローズボックスを強制的に表示させるオプションを加えた。本体の方でまた隠し設定がどうとか色々変わりそうな気もするけど、とりあえず現時点での仕様に合わせておく。不要になったら機能自体削除の可能性もある。

ソース表示タブは、機能は変わってないんだけど、動的に書き換えてるメソッド類がMinefieldでだいぶ変わってるようだったので、その修正が主。

マルチプルタブハンドラは、ツリー型タブの修正で書いたのと同じ要領でMenu Editorとの競合を解消したり、ツリー型タブと組み合わせた時の地味なトラブルを直したり、といった程度。

ツリー型タブ - Oct 15, 2008

ツリー型タブ 0.7.2008101501。前の版から4ヶ月も経ってた。使ってて見つけたバグはちまちま直してたんだけど他のユーザの人から英語で寄せられるバグ報告を放置放置でほったらかしてる間にまたずいぶん溜まってしまったのでちょっと頑張って処理してみた。FireGesturesの仕様変更への追従なんてもう何ヶ月も前の変更だから、もう意味が無くなってるかもしれないけど……まあ誰かに言われたら直そう(ぉぃ)。

Menu Editでタブのコンテキストメニューの項目が無限増殖する問題は、多分、分割ブラウザとの組み合わせを見越して各tabbrowser要素ごとにポップアップメニューの項目に一意なid文字列を生成するようにしていたせいだと思う。<tabbrowser id="content"/>なやつだけ特別に固定のidにするようにして、手元で試した限りでは無限増殖の問題は起こってない。マルチプルタブハンドラでも同じ問題が起こってるはずなので(報告すでに受けてたかも。あまりに多すぎて埋もれてしまってる可能性大。)、これは次のリリースで同じ修正を入れます。

Tab Mix Plusとの組み合わせで色々問題が起こってるという報告を受けてるけど、設定項目が多すぎてどの組み合わせで問題が起こるのか分からないのでお手上げです。とりあえず簡単に手元で試して再現しなかった物は放置。

ルーラーバーで折り返された行のカーソル位置を正しく表示できるようになったよ - Oct 11, 2008

ルーラバーだとやっぱり行ったことのある場所に行くあの呪文しか思い浮かばないという声があったので、日本語名をルーラーバーに変えた。

そのルーラーバーなんだけど、Rulerrrrrでもあった「折り返された次の行の先頭にカーソルがある時や行末にカーソルがある時にルーラー上の現在位置表示がおかしくなる(カーソル位置の計算に失敗する)問題」に真面目に取り組んで、0.2.2008101101でだいぶ改善した。

背景

ルーラーバーもRulerrrrrも、現在のカーソルの位置を計算するのには選択範囲を使っている。FirefoxやThunderbirdではカーソル位置をJavaScriptから直接取得することはできないんだけど、現在カーソルがある位置は長さ0の選択範囲として取得できるので、選択範囲が含まれているノードとか選択範囲の開始・終了位置などからどうにかこうにかして「カーソルより前に何文字あるか」を数えて、カーソル位置を割り出している。

行末にカーソルがある時

行末にカーソルがある時にカーソル位置が0(行頭)と判定されてしまっていたのは、この選択範囲から選択範囲が含まれているノードを取得できないせい。どういう事かというと、行末にカーソルがある状態というのは「テキストノード」「改行のBR要素」「テキストノード」という順番にノードが並んでいてBR要素の直前に長さ0のRangeがあるという状態で、「選択範囲が含まれているノード」は前後の要素やテキストノードではなくいきなりBODY要素になってしまう、ということでカーソル位置の求めようがなくなっていた。

そこで、TreeWalkerを使って各行のテキストノードやBR要素を走査し、compareBoundaryPoints()でそのノードがカーソルに隣接しているかどうかを調べる、という風な処理を入れてみた。これにより、行末にカーソルがある時でもカーソルより前にある文字を数えられるようになった。

折り返された行の行頭・行末判別

折り返された行の処理はもうちょっと厄介だった。普通に考えたら、「カーソル位置より前の文字数÷折り返し文字数 の余り」でカーソルの現在位置が分かるはずなんだけど、実際にはこれだけじゃダメだった。FirefoxやThunderbirdのエディタ機能では、折り返された行の行末にカーソルがある時に右キーを押すと、次の文字(折り返された次の行の先頭文字)の後の位置にカーソルが移動するのではなく、次の文字の前・仮想的な改行文字の後にカーソルが移動してしまう。折り返された後の行頭で左キーを押した時も同様。なので、いくら文字数ベースで計算しても、今「折り返された行の折り返し直前にカーソルがある」のか「折り返された後の行の先頭にカーソルがある」のかは分からない。

幸い、選択範囲の変更(=カーソルの移動)を監視する時にはその選択範囲の変更が発生したユーザの操作の種類がある程度分かる。なので、マウス操作でのカーソル移動については、行の左の方でのクリックでカーソルが移動した時は行頭、そうでなければ行末と判定するようにした。また、キー操作でのカーソル移動については、「直前にいた位置が行頭・行の中程・行末のどれだったか」と「どのキーが押されたか」の組み合わせを元に、今カーソルがどの位置にあるかを推測するようにした。

英単語等があるせいで予定の文字数より前で折り返しが発生した時や、HTMLでプロポーショナルフォントが使用されている時、画像がある時などについてはもう完全にお手上げです。カーソルの位置をピクセル単位で取れるようなAPIが付いてくれないことには、もうどうにもなりません。

Thunderbirdにルーラーを表示する「ルーラーバー」を作ったよ - Oct 10, 2008

このサイトの方にまだ配布ページ作ってないのでとりあえずMozilla Add-onsに置いてみました。「ルーラ」と書くか「ルーラー」と書くか迷って「ルーラ」にしてしまいました。知ってる土地まで戻る魔法ではありません。→0.2で「ルーラーバー」に名前を変更したのでこのエントリの表記も「ルーラー」に統一しました。

見ての通り、Rulerrrrrのクローンです。公開終了しちゃってる上に特にオープンソースなライセンスが設定されていたわけでもないので、Rulerrrrrの改造ではなく一応フルスクラッチです。以下の点がちょっとだけRulerrrrrよりパワーアップしてます。

  • 折り返されたテキストの2行目以降にカーソルがある時は、ルーラー上の強調箇所も折り返し後の位置になります(設定でRulerrrrrと同じ動作にもできます)。
  • 改行箇所でテキストノードが分割されるせいでたまにルーラーの強調表示の位置がおかしくなる問題については対処済みです。
  • 設定ダイアログから目盛りの表示間隔とかをカスタマイズできます。フォントによってルーラーと文字がずれる場合は、適当に拡大率を調整してください。

空行から左キーを押して一つ前の行の末尾に移動する時に、ルーラー上の強調表示がちゃんと追従してくれないとか、右キーを押して行末→行頭に移動しても強調表示は行末側に残ってしまうとか、Rulerrrrrでも見られた問題がこいつにもあります。そのうちなんとかしたいですね。→0.2.2008101101で改善しました

ていうか誰かすでにクローンを作ってるんじゃないかと思ったら案外誰もやってなかったみたいで驚いた。

セカンドサーチに「一定時間後に元の検索エンジンに戻す」機能を付けないワケ - Sep 15, 2008

SearchLoad Optionsがすでにそういう機能を持っているから。以上。

まあそういう「車輪の再発明はもういいよ(しかも再発明するメリットがないし)」という理由以上に、自分の中では「その機能がヘドが出る程嫌いだから」っていう理由の方が大きいんですけどね。

元々セカンドサーチを作るより前にSearchLoad Optionsの存在を知って、「検索実行後に元の検索エンジンに戻す」という機能のことを知って、心の底から呆れた記憶がある。「ハァ? 何その発想。ありえねえ。理念も実装も全然スマートじゃない。『別の検索エンジンで検索しました。でもその後はその検索エンジンに切り替わったままです。普段使いの検索エンジンに戻ってなくて困ります。』オーケー、ユーザの声としてそういうのがあがってくるのは分かる。でもそこでどうして『じゃあ、検索し終わったら普段使いの検索エンジンに戻しましょう。』って発想になるわけ? そうじゃないだろ。そもそも『一時的に使いたいだけの他の検索エンジンに切り替えて(1)、検索して(2)、検索が終わったら普段使いの検索エンジンに戻す(3)』っていう風にやたらステップが多くてめんどくさい事が問題なわけだろ。その最後の(3)だけ省略できるようにしましたワーイワーイ!って、アホか。もっと頭使えよ。せっかくやるんだったら、その3ステップ全部省略しないと、時間かけて物を作る意味がないだろ。『文字を入力したら検索エンジンの一覧が自動的に出てきて、選択したら即検索される(1)』こうだろJK。その知的怠惰が気にくわない。」という感じである意味怒りに燃えて作ったのが、セカンドサーチなわけです。「これ以上ステップを省略するには脳にプラグ直結する以外無い」ってとこまで突き詰めて考えないと、ダメだと思うんだ、ホントに。

だから、僕がメンテナンスを行っているバージョンにおいては、セカンドサーチにその機能を付ける事はきっとあり得ない。すでに省略され消滅したはずのステップをわざわざ意識しないといけないようにする、なんて選択はよっぽどの事がない限りはしたくない。まあライセンスはMPL/GPL/LGPLなので、フォークしてそういう機能を持ったバージョンを誰かが作る事を止めはしませんけどね。

XUL/Migemo 0.11.2 緊急アップデート - Sep 12, 2008

XUL/Migemo 0.11.1を公開してAMOにアップロードしたら妙に早く承認されて「へえ」と思っていたら、新規インストール時に特に発生する致命的な問題が存在していたことがついさっき判明して、速攻でAMOにログインして当該バージョンを公開停止にしようとしたんだけど、これ今になって気がついたけどファイルの削除はできても特定のバージョンの「公開停止」という措置は取れないんか……公開ページ上の最新バージョンは0.11.1と表示されててダウンロードボタンも緑色なのにクリックするとファイルのダウンロードに失敗する、という妙な状況になってしまった。せめて前のバージョンをダウンロード可能にしてくれればいいのにぃ。

つい先ほど、修正を施した0.11.2をアップロードしたものの、これが公開を承認されるまではずっとこの状態なんだろうか。困った。

しかしまあ何というか、ちゃんとレビューされてなかったのね、ということを今更ながらに実感した次第です。苦笑……できない。

XUL/Migemo 0.11.0 - Sep 07, 2008

XUL/Migemo新版を公開した。

池田さんに教えてもらうまで存在を知らなかったSearch Markerのような、検索のヒット位置をスクロールバー横に表示する機能を追加した。Search Markerとは以下の点が異なる。

  • Search MarkerはDOM要素でマーカーを表示してるけど、XUL/MigemoではHTML Canvasで表示している。
  • Firefox 3.1での「すべて強調表示」の仕様変更に独自に対応しているので、Firefox 3.1でも動く。
  • クリックだけでなく、ドラッグ操作にも対応している。
  • フォーカスされている場所に対応するマーカーが強調表示される。

これの絡みで、選択範囲とか強調表示とかまわりの処理をだいぶ書き直した。強調解除で選択範囲が復元されなかったり、強調表示した状態での再検索がやたら重かったり、といった細かい問題が色々直ってるはず。

検索にヒットしてフォーカスされた箇所を画面中央に表示する機能は、以前実装してみたもののいざ使ってみるとウザくて全然使ってなかった。そのウザさの原因はどこにあったのかというと、多分、すぐ次の行とか近くにある語にヒットした時まで強制的に画面がスクロールして、ページのどこが表示されてるのか分からなくなってしまいがちという所だったのだと思う。というわけで、画面の端から30%内側のラインより外にある時だけスクロールするようにした。Safariとかはこういう動作になってたと思う。どうしてFirefoxの素の検索機能はこういう所で気が利いてないんでしょうね。

スクロールといえば、クイックMigemo検索中にページをスクロールしている間はタイムアウトのためのタイマーを止めるようにしてみた。スクロールして眺めてるのにハイライトが消えてしまってムカツク、ということが何度かあったので。

そんな感じの細かい改善が結構入ってます。

んげ。今LDRでふと検索を試してみたら、スクロール全然できなくなった。iframeではないCSSによるスクロール可能なボックスのことを考えるのを忘れていた。

XUL/Migemoで使ってる機能についてFirefox 3.1で色々変わってた事の調査結果 - Sep 03, 2008

前のエントリの追記が多くなったので分ける。

「すべて強調表示」の強調箇所がspan要素ではなくnsISelectionになった件については、nsISelectionControllerの選択範囲の型の中にSELECTION_FINDというのが増えていて、ユーザの選択範囲や検索で現在フォーカスがあたってる箇所を表すSELECTION_NORMALとは別に管理されていることが分かった(nsISelectionControllerのメソッドを使うとこれらの型別に選択範囲の一覧を取ることができる)。ということで、「どっちも同じ選択範囲だったらどうやってフォーカス箇所を取ればいいんだ!」という問題は杞憂だったと判明した。

あとはパッチと実際の新しい実装を見ながらFirefox 3.1用のコードを書いて、Safari風強調表示を有効にしてる時だけFirefox 3.0までと同様のspan要素を使うハックを復活させるようにしたところ、アニメーション効果も無事動くようになった。元々、XUL/Migemoでは正規表現にマッチする箇所をまとめて強調しないといけない関係上、span要素を使うハックの処理のほとんどを自前で再実装してたので、思った程には大規模の改修はしなくて済んだ。

一個だけ躓いた所として、XPCOMコンポーネントの新しいメソッドをIDL定義に追加して引数にnsISelectionController型のオブジェクトを渡すようにしていた所、XPIDLでのコンパイルは通るんだけど実際に使う時にNS_ERROR_XPC_CANT_GET_PARAM_IFACE_INFOというエラーが出てにっちもさっちもいかなくなってしまった。ダメ元で、引数の型をnsISupportsにして受け取り側でQueryInterfaceするようにしてみたところ、ちゃんと動いてくれた。一体何だったんだろうこれは。

textbox要素のsearch型については、パッチを見た限りでは今の所サイドバーの「ブックマーク」と「履歴」でだけ利用されていて、XUL/Migemoのやってるハックには影響しないようだった。

ロケーションバーの方もテストしてみようと思ったらこれが全然動かなくなってて、調べてみたらmozIStorageServiceのopenDatabase()メソッドでplaces.sqliteを指定して開く所で「ファイルがロックされてるぞゴラァ」と怒られていた。ななななななんてこった!!! SQLite Managerで見ようとしてもやっぱりロックされてて見れないと言われる。どうも不用意な書き換えでデータベースが破壊されないようにロックがかかるようになったようだ。これはやばい。PlacesデータベースにSQLでアクセスできなくなったらXUL/Migemoのロケーションバーまわりの実装の苦労が全て水の泡になる上に、Firefox 3 Hacksで物凄いページ数使って書いた内容がまるっきり無駄になるじゃないか。マジで一瞬気が遠くなった。

精神的に半泣きになりながらmozilla-centralでスマートロケーションバーまわりのコードを調べていたら、いくつかの箇所でDBConnectionとかStorageConnectionとかそういう文字列が登場していて、それをキーに調べてみたらnsPIPlacesDatabaseというインターフェースDBConnectionプロパティからPlacesデータベースへのコネクションオブジェクトにアクセスすることができるらしいということが分かった。このインターフェースはPlaces API関係のサービスが実装していて、以下のようにすればアクセスできるという事も分かった。

var dbConnection;
if ('nsPIPlacesDatabase' in Ci) { // Firefox 3.1 の場合
  dbConnection = Cc['@mozilla.org/browser/nav-history-service;1']
                  .getService(Ci.nsINavHistoryService)
                  .QueryInterface(Ci.nsPIPlacesDatabase)
                  .DBConnection;
}
else { // Firefox 3.0.x の場合
  const DirectoryService = Cc['@mozilla.org/file/directory_service;1']
                            .getService(Ci.nsIProperties);
  var file = DirectoryService.get('ProfD', Ci.nsIFile);
  file.append('places.sqlite');
  if (file.exists()) {
    const StorageService = Cc['@mozilla.org/storage/service;1']
                            .getService(Ci.mozIStorageService);
    dbConnection = StorageService.openDatabase(file);
  }
}

ホント焦った……4日のトークセッションで土下座せなあかんかと思ったよ。

ちなみにその4日のトークセッションですが引き続き参加者の方絶讃募集中です。9月4日19:00から池袋ジュンク堂にて開催。参加費1000円ワンドリンク制(多分)で定員40名、電話か店頭で申し込む必要があります、としつこく宣伝しておきます。どうかよろしくお願いします!!!!

Page 16/31: « 12 13 14 15 16 17 18 19 20 »

Powered by blosxom 2.0 + starter kit
Home

カテゴリ一覧

過去の記事

1999.2~2005.8

最近のコメント

最近のつぶやき