たまに18歳未満の人や心臓の弱い人にはお勧めできない情報が含まれることもあるかもしれない、甘くなくて酸っぱくてしょっぱいチラシの裏。RSSによる簡単な更新情報を利用したりすると、ハッピーになるかも知れませんしそうでないかも知れません。
の動向はもえじら組ブログで。
宣伝。日経LinuxにてLinuxの基礎?を紹介する漫画「シス管系女子」を連載させていただいています。
以下の特設サイトにて、単行本まんがでわかるLinux シス管系女子の試し読みが可能!
仕事用マシンにしてたLet's note W2のHDDがハードウェア的にいかれてしまったらしい、ということで新マシンを買ってもらえました。Let's note W7です。Windows Vistaがプリインストールされてるんだけど、例によってLinux環境が必要なのでUbuntu 7.10 Gutsy Gibbonを入れました。
以下、詰まったところと設定。
Section "Module" Load "xgl" Load "dri" EndSection
#!/bin/sh
minimum=5
display='-display :0.0'
arg=`echo $1 | sed -r -e 's/([+-])([^ ])/\1 \2/'`
echo 'from' `xbacklight -get $display`
current=`xbacklight -get $display | sed -r -e 's/..+$//'`
new=`expr $current $arg`
if [ `expr $new \< $minimum` = '1' ]; then new=$minimum; fi
xbacklight -set $new $display
echo 'to' `xbacklight -get $display`
大体こんなところだろうか? あとは今まで使ってたソフトの類が全部入れ直しなので、設定がどうしようもなくめんどいです……
あと、これを機にThunderbirdをメインのメールソフトとして使い始めてみたんだけど、メールからフィルタを自動作成できないとか、フィルタを設定する時に移動先フォルダを先に作っておかないと選択できない(移動先フォルダをその場で新規作成できない)とか、いちいち細かいところで痒いところに手が届かなくてムキーとなる。Sylpheedはその辺よかったんだけどなぁ……って、自分でガンガン要望を挙げてそうしてもらったから当たり前なんだけど。あとスレッド表示を有効にすると他のカラムでソートできなくなるというのは致命的。アドオンでどうにかなるんだろうか?
UxUのことで悩み中。
テストケースを実行するとき、コンテキストオブジェクトを指定してスクリプトを実行しないといけないんだけど、色々問題があって悩ましい。
brazilさんが紹介されているとおり、ビルトイン関数のevalに第2引数を渡すか、Objectクラスのメソッドであるevalを使うと、コンテキストオブジェクトを指定してスクリプトを実行することができる。ただ、この両者は若干動作が異なる。
例えばこんなコードを考えよう。
var context = {};
context.eval('var val1 = true; this.val2 = false');
alert(context.val1); // => true
alert(context.val2); // => undefined
Objectクラスのメソッドだと、実行したスクリプトの中で変数として宣言した物がそのままそのオブジェクトのプロパティとなり、外部から後で参照することができる。でも、
var context = {};
eval('var val1 = true; this.val2 = false', context);
alert(context.val1); // => undefined
alert(context.val2); // => undefined
ビルトイン関数の方だと、そうはならない。また、どちらにしてもthisを明示した場合は外部からは参照できない。
言い換えると、「コンテキストオブジェクトを明示して実行したスクリプトの中でvarで宣言された値を外部から取得するには、Objectクラスのevalメソッドを使わないといけない」ということ。
ところが、Firefox 3ではObjectクラスのevalメソッドが存在しない。どうやらどこかの時点で削除されてしまったようだ。
元のMozLabではどうしていたかというと、evalを使う代わりにmozISubScriptLoaderを使っていた。
var context = {};
var loader = Components.classes['@mozilla.org/moz/jssubscript-loader;1']
.getService(Components.interfaces.mozIJSSubScriptLoader);
loader.loadSubScript(
'data:application/x-javascript,'+encodeURIComponent('var val1 = true; this.val2 = false'),
context
);
alert(context.val1); // => true
alert(context.val2); // => false
こちらは前二者のどっちとも結果が異なり、varで宣言した物もthisを明示した物も両方ともコンテキストオブジェクトのプロパティとして外部からアクセスできるようになる。
ところが。mozIJSSubScriptLoaderを使う方法だと、スクリプトの中に日本語などの非ASCII文字があると化けてしまう。
var script = 'alert("日本語")'; // Unicode
eval(script); // => "日本語"
({}).eval(script); // => "日本語"
loader.loadSubScript('data:application/x-javascript,'+encodeURIComponent(script), {}); // => 文字化けした文字列
encodeURIComponentによってUnicodeの文字列がUTF-8のバイト列に変換されてしまうのでこうなる、のか? とにかく、これではテストケースの説明を日本語で書けなくて(僕が)困る。UxUではこの処理の直前でUTF-8なりShift_JISなりで書かれたテストケースを読み込んで内部コードのUnicodeに変換しているのだけれども、せっかく変換したのに最後の最後で化けてしまうんじゃあしょうがない。
ということでああでもないこうでもないと試していて、以下のような方法に辿り着いた。
var script = 'alert("日本語")'; // Unicode
script = 'eval('+script.toSource().replace(/^\(new String\(|\)\)$/g, '')+')';
loader.loadSubScript('data:application/x-javascript,'+encodeURIComponent(script), {}); // => "日本語"
encodeURIComponentに放り込む前に、一旦全体を文字列リテラルとして評価可能な文に変換して(この時点で日本語などの非ASCII文字は「\uXXXX」のようなUnicodeエスケープに変換される)、encodeURIComponentを通過した後でevalで元に戻す、というトンネル抜けのようなやり方。これによって、日本語で書かれた説明もそのまま利用できるようになった。
でも、これにもまだ問題がある。この方法で実行したスクリプトの中でエラーが起こると、MozUnitテストランナーのUI上でソースを表示してもeval("(元のテストケースのスクリプト)")
という1行だけのソースになってしまって、エラー箇所がさっぱりわからない。これ、どうにかならんもんだろうか……
追記。エラーが発生した行の番号自体はこれでも正しく取れてるようなので、とりあえずやっつけ仕事で、MozUnitテストランナーのUI上でソースを表示する時にソースを元の文字列に復元するという方向で手を打とうと思う。
さらに追記。よく考えたら、わざわざ自分でソースを復元しなくても、変換前後で行数その他は変わってないんだから、ソース表示の時に元のファイルの方を読み込ませるようにしたらいいんだな……
さらにさらに追記。mozIJSSubScriptLoaderの仕様変更によってこの方法も使えなくなりました。現在何かいい手は無いか考え中。
さらにさらにさらに追記。上記内容と同じような結果になる代替案を考えてみた。
さらにさらにさらにさらに追記。evalの機能についてFirefox 3.1でまた変更があったようだ。
amachangの1000人スピーカプロジェクトの第1回でお披露目したUXU(うず)のこととか。書くのが遅くなったのは鴉見てたからです。
ニコ動に全プレゼンの映像が上がってて、僕の奴も見れるんですが、いやー、これはひどいプレゼンですね。
いや言い訳さしてもらうとですね、前日に仕事用マシン(Let's note W2)のHDDが逝ってしまいまして、前日夕方くらいからそれのせいであたふたして徹夜してて、あんまり頭働いてなかったんですよ。だからこの日はマシンは持参してたけどUbuntu 7.10のLive CDで起動してました。隣の人とか後ろの人とか多分CD-ROMドライブの音がぶんぶんうるさかったと思いますが、それはこのせいです。それにしてもUbuntuすごいね。CD起動なのに無線LAN使えちゃったよ。さすがにプロジェクターの認識は再起動が必要みたいだったからプレゼンの時だけamachangにマシンをお借りしましたが。
プレゼンでちゃんと言えてなかったことの補足。自分がテストという物の意義を理解したのがRailsのそれだったので、UXUを最終的にどういうものにしたいのかという目標も、今の所はRailsに置いてます。なので、今は実現できてないけどfixtureみたいな物もできるようにはしたいと思ってます。
それか、もっと根本的なところで、テスト専用のプロファイルにその時だけ切り替えて……みたいなこともできるようにしたいんですが、この辺になってくるとプラットフォーム用のバイナリを作らないといけないような気がしていて気が重いです。もしかしたらProfile Switcherが解決のヒントになるでしょうか?
yieldの読み方は「いーるど」でよかったんですね。でもそれ知ってもどうしても「いぇーるど」と読んでしまう……
昨年頭にごにょごにょしてたのはプレゼン中に書いたお蔵入りバージョンのUXU 0.1のことなんですが、その時は単にウェイトの秒数を指定するだけでした。つい最近になって奥さんのエントリを見て、そうか「復帰条件」と考えれば返り値は数値だけじゃなくてもっとなんでも渡してイイんだな、とインスパイアされて、フラグを保持するオブジェクトを渡すパターンをまず実装し、それから関数を渡すパターンも実装したという次第です。
UXUでやってることの工夫というか特徴的なところは、yieldの本来の用途であるところのジェネレータ・イテレータの生成という役割を隠蔽してしまって、「処理の一時停止」「再開」という部分だけに特化した見せ方をしているところではないでしょうか。内部的には昨年頭に書いた話にあるとおり、setUpとかテストケースとかの関数オブジェクトの返り値がジェネレータであればタイマーを使ってイテレーションを行う、というだけのことなんですが。
amachangが紹介していたJSDeferredの方がもっときっと便利でいろんな事ができるとは思うんですが、プレゼンでも言った通り僕はN88BASICの行番号の呪縛から未だに逃れられていないような人間ですので、これ以上の複雑なことは脳が拒否して受け入れてくれんのですよ……
昨年くらいに試した時、日通のWebサイトからペリカン便の再配送を申し込もうとしたら、Firefoxではフォームが機能しなくて往生こいた。Amazonで買い物をすると僕の所には必ずペリカン便で届くので世話になる頻度も高いのだけれども、僕の中では日通は「つかえねー」サイトの代表の一つになってた。でも今日ふとFirefoxでアクセスしてみたら普通に動くようになってた。いつの間に対応したんだ? ともかく、この件で僕の中では日通の株がかなり上がった。
第8回Mozilla拡張機能勉強会のプレゼン資料を公開した。
以下、内容を改めて整理してみる。
McCoyの改造を試みるために、XULRunnerアプリでもアドオンを使えるのかどうかという実験をしてみた。
これだけでいける。逆に、アドオンをアンインストールしたい時は、アドオンのID名が付いたフォルダをプロファイル内の「extensions」フォルダから削除する。
amachangさんはアプリやアドオンそのものの中身をガリガリ書き換えるやり方を紹介されてるけど、僕はこういうやり方はしない方がいいと思ってる。理由は以下の通り。
なので、これらの問題を回避するために、teramakoさんのようにそれ用のアドオンを作って使うか、userChrome.jsを使うかする方がいいと僕は思う。今回McCoy用の改造をアドオンという手法で行うことを試みているのも、そういう理由からだ。
第8回Mozilla拡張機能勉強会でFirefox 3で要求されるセキュアなアドオン提供方法について話すつもりですが、話すだけじゃ何なのでMcCoyを改造して何かできたらなぁと思ってますが、できるかどうか分からないのであんまり期待しないでください。と、宣伝になってるんだかなってないんだか分からない宣伝をしておきます。
緑のgoo版Firefoxが今日公開されました。緑のgooは収益の15%が環境保護団体に寄付されるという検索サービスで、緑のFirefoxを使うと普通に検索してるだけで環境保護に貢献できるYO、という物です。
詳しくは配布ページなりITmediaやCNET JapanやINTERNET Watchの記事なりに書いてありますが、要するに、デフォルトの検索エンジンが緑のgooになってて、緑のgooで検索した回数がツールバー上の「gooの木」ボタンに(gooの木の本数換算(検索100回=gooの木一本)で)出て、おまけに緑のgooっぽいテーマが適用されてる、というFirefoxです。導入済みのFirefoxに全く同じ機能を追加するアドオンも同時に公開されてます。
まあぶっちゃけ、タブが使いやすくなるとかそういう系の実用的なメリットは特に無いっちゃあ無いんですが、損したり面倒な手間をかけたりしないでも普通に検索するだけで環境保護にチョコっと貢献できる、社会的なメリットがあるアドオンというのは珍しいんではないでしょうか。緑のgooのWeb検索のバックエンドはGoogleなので普段ググりまくりの人にも特にデメリットは無いし。ということで僕も今のところデフォルトの検索エンジンは緑のgooにしてます。
なお、他の検索エンジンと併用するためにセカンドサーチも入れておくとより一層便利でしょう(宣伝)。
とよく言われるんだけど自分の環境&自分の見てる範囲のWebサイトでは落ちないので原因が分からない、ということが多い。落ちるか落ちないかのギリギリの所をうまく突くようなコードを知らず知らずのうちに書いてしまっているのでしょうか。そんな能力いらなさすぎる。