Home > Latest topics

Latest topics 近況報告

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

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

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

Page 27/248: « 23 24 25 26 27 28 29 30 31 »

ウィンドウ全体を覆い隠してゴニョゴニョするのは実は簡単だった - Apr 28, 2008

Firefox 2まででは、position:fixedな要素はz-indexを適切に指定すれば内容領域の上にも普通に表示できた。なので、ウィンドウ全体を覆い尽くすというのも簡単だった。

でもFirefox 3では仕様が変わって、常にサブフレームの内容が上に表示されるようになったため、CSSのポジショニングだけでは任意の要素を任意の位置に表示することはできなくなってしまった。仮にposition:fixed; top:0; left:0なボックスを置いても、その上にブラウズ領域の中身が表示されてしまう。ウィンドウの内容の上に何かを重ねて表示したい時には汎用のポップアップであるpanel要素を使え、というのがFirefox 3流のやり方らしい。

しかし古い拡張機能をアップデートするにあたってそこらへんのつくりを全面的に書き換えるのは大変な労力を要するし、果てしないregressionの嵐が発生しかねない。できれば最小限の労力で、今までのやり方に一工夫加えるだけで正常に動作するようにしたい。

ということでウィンドウ全体を覆い隠してゴニョゴニョするアレの時に試行錯誤して、CSSのポジショニングをどーしても使いたければサブフレームを新たに生成するしかないっぽいという結論に辿り着いていただけれども、その方法をタブカタログで使おうとしたところDOMDocumentの違いとかで死にそうになったので、諦めて別の方法をいくつか探ってみた。

で、結論としては、visibility:hiddenになったサブフレームの上なら、普通にCSSのポジショニングで要素を重ねられるようです。display:noneとかvisibility:collapseとかをサブフレームに使うとDocument Shell(nsIDocShellのオブジェクト)がぶっ壊れてしまってまともに動かなくなるので、この辺のプロパティをいじるのはヤバイと思って今まで全く触ってなかったんだけど、少なくともFirefox 3ではFirefox 2でもFirefox 3でも、visibility:hidden/visibleの切り替えではDocument Shellは破壊されないようだということに、ああでもないこうでもないといじってるうちにたまたま気がついたのですよ。

でもこれだとタブカタログのように、一旦全面を覆い尽くしてその上に全然別のコンテンツを表示するといった機能は作れるけど、InterNoteのようにページ上に任意の要素を置くっていうことはできそうにない。そういう場合はページ内のDOMDocumentを編集するしかないようだ。

自動テスト - Apr 25, 2008

regression(後退バグ。修正のために加えた変更が原因で新たな問題が発生すること)のせいで体力・精神力を消耗する事が重なり、自動テストドリブンな開発の重要さを身に染みて感じた。プレゼンでも言ったけど、「やってりゃ良かった」と後悔してばかりだ。まさかこんなに手こずる羽目になるとは当初は思っていなかったから。

自動テストはregressionの発生を防ぐ(正確には、regressionを残したままでいることを防ぐ)素晴らしいメソッドだ。と今になって改めて思う。

でも、どんなコードでも機械的に自動テストにかけられるわけではない。機械的に自動テストを実施するには、自動テストを実行しやすい設計になっていなければならない。自動テストを実行しやすい設計とは、粒度が小さい=オブジェクトやらメソッドやらが可能な限り細かい単位で分割されている設計のこと。テスト対象となる部品自体が可能な限り自己完結していて、外部的な要素は必要に応じてすべてパラメータとして与えるようになっていること。横着して一つの関数内からグローバル変数やら何やらを参照しまくっていると、その関数のロジックそのものをテストすることができない。

そういうわけで、自動テストドリブンな開発には気を遣わなければならない。気を遣わないといけないから気力を消耗する。だから、せずに済むのなら、しないままでいたい。でも、そう考えているうちに「自動テストを作成する&テストを実施しやすい設計にするコスト」と「やっつけで作って、その都度メンテナンスするコスト」の関係が、「前者>後者」だったのがいつの間にか「前者<後者」に逆転してしまうようになっていて、メチャメチャ後悔することになる。

今まで自分のやってきたことは9割方、自動テスト無しでもどうにかやってこれていたし、そもそも、自動テストの重要性とそのための設計の指針が分かった今改めて見返してみても、自動テスト化することが困難な物が多かった、と思う。だから、自動テストを前提にしてコードを書くという習慣が身についていない。自動テストが最初から不可能な事が多かったから、自動テストのできない設計にするしかなかったから、自動テストのできない設計にすることが当たり前になってしまっている。

でもいい加減、その悪習を断ち切らなければならない。25歳ももうすぐ終わりの、四捨五入すれば三十路の、今更も今更で手遅れ感がとても強いけれども、やらなければいけない。今まで自分がやってきた方法は通用しないということを自覚しないといけない。できて当たり前の事が今まで全くできていなかったという事、本当はこの面子の中で飛び抜けて一番遅れているという事、それなのに対等であるように勘違いして思い上がっているという事、今まで他人事だと思ってた「ダメな人の典型」に自分がまったく当てはまっているという事、全部認めないといけない。

そういうわけでとりあえずUxUはマジオススメ。

ブックマークのプレビューを保存するBookmark Previews - Apr 20, 2008

おお、これは……戻る/進むサムネイルでそのうちやりたいと思ってた事そのまんまだ。自前サムネイルを持つのをやめて、これのサムネイルを参照するようにしようかなぁ……

2 Pane BookmarksをFirefox 3に対応させた - Apr 07, 2008

2ペインブックマーク 0.4.2008040701

ブックマークまわりの仕様が変わってるから手こずりそうだなあと思ったけど、案外サックリ行けた。むしろPlacesベースの今の方が、ゼロから作るなら簡単に作れそうな勢いだった……

下のペインにフォルダが出るようにするかどうかで迷って、今は下のペインではフォルダは全く出さないようにしてしまった(Firefox 3のみ)。選択されたフォルダの直下にあるフォルダだけをレンダリングさせる方法が分かればそうしたい。

XUL/MigemoとC/Migemo - Mar 31, 2008

絶対に便器!: XPCOM+C/Migemo

今のXUL/Migemoでは

  • 辞書へのユーザによる単語登録を可能にしている
  • 生成する正規表現に、ひらがな・カタカナの同一視、発音記号付きのアルファベットも含めている

という改造を施しているので、その点で検索結果に差異が出ると思う。わりとどうでもいいと言えばどうでもいいことなんだけど。与える辞書、ローマ字の変換テーブルとかをDLLの外に置けるになってればいいんだけどなあ。まあ、中国語やハングルや発音記号のある他の言語にも対応できるとは言っても、実際にそれらの言語用のエンジンを開発してくれる人がいない現状では、日本語決め打ちでいいのかもだけど。

ページ内検索の速度の改善はもちろん重要なんだけど、それ以外の部分でもXUL/Migemoを使えるようにしてみると、そもそも正規表現でのマッチング自体が凄く重いということに気がつく。これはAutocomplete Managerとの組み合わせで特に感じられる。Thunderbirdのクイック検索に対応した時のように、なるべくマッチングの回数自体も減らすようにロジックを変更しないと、この問題は解決できないっぽい……

外部のスクリプトを読み込む - Mar 19, 2008

各地既報ですが、セキュリティ上の仕様変更によってmozIJSSubScriptLoaderで読み込めるスクリプトの置き場所がChrome内に限定されるようになった(File URLなどの読み込みは拒否されるようになった)そうで。まあ自分が作ってる拡張機能には外部のスクリプトを動的に読み込んでどうこうするものがあんまり無いのでそれほど影響は無いんですが、せっかくなので手持ちの情報を晒しときます。

実は僕、割と最近まで、mozIJSSuScriptLoaderで実行コンテキストを指定できるってことに気付いてなかったんですよね。だから、外部スクリプトは実行できてもその実行結果を取り出すとかはできないと思い込んでまして。Firefox 1.5以前から作ってたやつでデフォルト設定をdefault.jsとしてcontent内に置いてた物で、default.jsの内容を読み込ませるために、わざわざmozIJSSubScriptLoaderと同じ働きをするコードを書いてたんです。ああ車輪の再発明。そんなわけで以下の情報がもしかしたら参考になるかもしれません。

……あ。今気付いたけど(ぉぃ)、Chrome URL限定ってことはdata: URLもダメになったってことか。んじゃUXUもやっぱ影響受けるなぁ。さてどうしたものか。

とりあえずスクリプトを実行するだけだったら上記の方法で読み込んだファイルの内容をeval()するだけでいいので、その点では話は簡単なんですけどね。

20日追記。最終的に、格好悪いやっつけの方法ではあるんだけど、こういう風な所に落ち着いた。UxU 0.2.6で採用した方法は以下の通り。

  1. 上記の方法でJavaScriptファイルの内容を文字列として取得。
  2. それをmozIJSSubScriptLoaderに渡すコンテキストオブジェクトのプロパティとして格納。
  3. そのコンテキストのプロパティとして格納されているスクリプトをeval()するだけのスクリプトをパッケージに含めておき、mozIJSSubScriptLoaderで読み込んで実行。

実際のコードはこんな感じ。

var loader = Components
     .classes['@mozilla.org/moz/jssubscript-loader;1']
     .getService(Components.interfaces.mozIJSSubScriptLoader);

this.include = function(aSource, aEnvironment, aEncoding) {
    var encoding = aEncoding || this.getPref('extensions.uxu.defaultEncoding')
    var script = this.readFrom(aSource, encoding) || '';
    var env = aEnvironment || this.environment;
    env._subScript = script;
    loader.loadSubScript(
        'chrome://uxu/content/test/helper/subScriptRunner.js?includeSource='+
            encodeURIComponent(aSource)+
            ';encoding='+encoding,
        env
    );
};

subScriptRunner.jsというファイルの内容は、たったこれだけ。

if (_subScript) eval(_subScript);

これで、mozIJSSubScriptLoaderで普通にスクリプトを読み込ませるのと同じような結果になる。

さらに追記。仕様が変更されて、file:とresource:は使えるようになったそうだ。でもdata:は相変わらずダメなので、今までdata:でやってたものはここに書いたような何らかの方法で代替するしかないと思う。

さらにさらに追記。evalInSandboxを使う方法もあるそうだ。

さらにさらにさらに追記。evalの機能についてFirefox 3.1でまた変更があったようだ

CSS3 Ruby Module - Mar 16, 2008

ruby-alignruby-overhangline-stacking-ruby(これはRuby ModuleではなくてLine Module)の仕様書を読みながらこれらを実装してみている。line-stacking-rubyはruby要素上下のマージンの動的設定でも使わないと再現できないので、display:inline-tableが使えるGecko 1.9(Minefield)でなければline-stacking-ruby:include-rubyで固定になる。

まぁ、どれだけ意味があるかは甚だしく疑問で、ほとんど意地(と現実逃避)ですね。

ということでその成果をXHTMLルビサポート 2.1.2008031701として公開した。設定項目とその効果は基本的に上記の仕様通り(各設定項目の初期値も仕様の初期値)なので、何がどう変わるのか分からんという人はそちらを見てください。

XHTMLルビサポートで文字の均等割り付けに対応したよ - Mar 13, 2008

XHTML Ruby Supportで、ルビベースよりルビテキストが短い時や、ルビテキストよりルビベースが短い時などに、均等割り付けを行うようにしました。 (スクリーンショット) このスクリーンショットはW3Cのテストケースの物ですが、下のルビの「言語」が今までなら中央寄せになっていたところ、ちゃんとルビベースに合わせて字間が広がってます。すぐ上にある「こうあるべき」という表示結果の例と比べても遜色ないことが分かってもらえるかと思います。このテストケースは複雑ルビも使っているので、ルビ実装の本家本元のIEでも表示できないですよ(多分)。

てか、W3Cのテストケースのテスト結果のページ見たら、このアドオンを使った場合の結果が妙に優秀でワロタ(テスト自体は昨年9月の物のようで、注釈で文字の均等割り付けに非対応であると指摘されてる)。

「均等割り付けなんてtext-align:justifyでやりゃいいじゃん、何を今更……」と思う人もいるかもですが、text-justifyのような均等割り付けのアルゴリズム変更の手段がないGeckoでは、段落の最終行は常に左寄せになってしまうので、こういう場面では使えないんですよ。なので、今回は自前で地道に字間を計算して調整してます。計算の仕方は、ずっと昔に中野さんがブログで書いてた本物のtext-align:justifyの実装の解説を参考にしてるつもりです。詳しく知りたい人はjustifyTextメソッドのコードを見てください。

@JOJOとかも、これで心おきなく楽しめます。

あー、しかし北村さんがCSSでルビを擬似的に表示する方法を発表されてから、もう7年も経つのか……その頃生まれた子が今じゃ小学生ですよ? 僕は相変わらず独りでこんな事ばっかやってるというのにねぇ。

タブバーを自動で隠す時の透過の様子のデモ - Mar 11, 2008

ツリー型タブでタブバーを自動で隠す設定の時に、うそっこ透過タブバーで下の物が見えるようにした、と書いたけど、その様子のデモを作ってみた。

<object classid="clsid:D27CDB6E-AE6D-11cf-96B8-444553540000" width="300" height="283" codebase="http://active.macromedia.com/flash5/cabs/swflash.cab#version=5,0,0,0"> <param name="movie" value="/xul/_video/treestyletab_autohide.swf"></param> <param name="roop" value="false"></param> <param name="quality" value="low"></param> <embed src="/xul/_video/treestyletab_autohide.swf" width="300" height="283" quality="low" loop="false" type="application/x-shockwave-flash" pluginspage="http://www.macromedia.com/shockwave/download/index.cgi?P1_Prod_Version=ShockwaveFlash"> </embed> </object>

こうして見てみるとスタック型タブとあんま変わらんように見えるな……

そういや昨日これのためのコード書いてたら、Minefieldでタブバーの幅が300ピクセル以下にならなくて、おっかしーなーと思って色々詳しく調べてみたら、HTML Canvasの幅を0にしようとすると問答無用で300ピクセル幅(canvasの初期状態の幅)になってしまうようだった。さらに検証してみたらFirefox 2ではその逆に高さを0にできないという現象も……Bugzillaを検索してみてもクエリが「canvas width」だとやたらたくさん引っかかって同じバグがすでにあるかどうか分からなかったので、とりあえずバグを立ててみた。ガイシュツだったらすんません。ちなみに幅も高さも、最小値は1ピクセルまでだったらちゃんと指定通りに動くようです。というバッドノウハウ。

追記。しばらく使ってみたら、タブの下の何もないスペースを、タブバーがあることを忘れてうっかりクリックしてしまうということが頻発したので、タブバー部分はそうと分かるように色を変えるようにした。

差出人(送信者)情報を自動的に切り替えてほしい - Feb 29, 2008

Thunderbirdでは、複数のメールアカウントを設定している場合、メールを返信しようとすると、そのメールを受信したアカウントの差出人設定が自動的に選択されるそうだ。

しかし残念ながら僕は仕事用のアカウント一つだけしか作っていなくて、プライベートのアドレスで受信したメールを仕事用アドレスにも転送するという使い方をしている。差出人設定は仕事用とプライベート用の2つを設定してあるけど、返信する時は受信アカウントのデフォルトの差出人(=仕事用アドレス)が選択されてしまうので、手動で差出人を選択し直してやらなくてはならない。うっかりそれを忘れると、プライベートで受信したメールに仕事用アドレスで返信することになってしまう。(仕事中にプライベートでメール書くなよって? いや、仕事の時以外でもこのマシン使うんで……例えば出先とかね)

どがんせんといかんと思って検索してみたら、Correct Identityという拡張機能が見つかった。これを入れておくと、メールに返信する時、受信アカウントに関係なく、メールの宛先(CCでも可)に設定されたアドレスに対応する差出人が自動的に選択されるようになる。

ただ、転送メールを使っていて受信アドレスと返信アドレスが異なる、という僕のような人は注意が必要だ。

僕は公開してるアドレスはずっと piro@p.club.ne.jp で通してるけど、これは転送専用のアドレスで、昔はCC-Netのアドレスに、今はさくらのレンタルサーバ付属のアドレスに転送されるようになっている(それをさらにGMailで受信して、仕事用アドレス宛に自動転送する、ということをしている)。しかし、さくらのレンタルサーバのアドレスはFrom:フィールドのアドレスが上記転送アドレスになっているとメールを送れないので、差出人情報はそっちのアドレスで作ってある。このままだと、piro@p.club.ne.jpで受信したメールに対応する差出人が見つからないということになってしまう。

幸い、Correct Identityにはエイリアスの設定機能があった。ここに自分宛のメールの宛先に設定されることがあるアドレスを改行区切りで列挙しておく(これに気付かずスペース区切りやカンマ区切りで書いてしまって「なんで動かないんだ」としばらく詰まった)と、受信したメールの「宛先」がpiro@p.club.ne.jpになっていても、対応する差出人としてさくらのレンタルサーバのアドレスが設定された差出人が選択されるようになる。

ほんとに何でもあるね……なんか本気でThunderbirdから離れられなくなりそうだ。

ここまでのカスタマイズまとめは以前書いたエントリにある。

Page 27/248: « 23 24 25 26 27 28 29 30 31 »

Powered by blosxom 2.0 + starter kit
Home

カテゴリ一覧

過去の記事

1999.2~2005.8

最近のコメント

最近のつぶやき