たまに18歳未満の人や心臓の弱い人にはお勧めできない情報が含まれることもあるかもしれない、甘くなくて酸っぱくてしょっぱいチラシの裏。RSSによる簡単な更新情報を利用したりすると、ハッピーになるかも知れませんしそうでないかも知れません。
の動向はもえじら組ブログで。
宣伝。日経LinuxにてLinuxの基礎?を紹介する漫画「シス管系女子」を連載させていただいています。
以下の特設サイトにて、単行本まんがでわかるLinux シス管系女子の試し読みが可能!
前にメモした気がしてたんだけどどうやらメモし忘れてたみたいなので……
WindowsでRapidSVNを使うときは、差分を表示するツールが付いてくるみたいなのでいいんだけど、UbuntuでRapidSVNをインストールすると、編集時のテキストエディタ、差分表示ツールのどっちも手動で設定しないといけない。テキストエディタはgeditでいいんだけど、差分表示ツールは普通にdiffを指定してもうまく動いてくれないので、GUIの物を入れて使わないといけない。
で、パッケージマネージャで「diff」をキーワードにして検索するとやたらたくさん引っかかるのでそれらしい物を片っ端から試してみたところ、どうも「xfdiff」が一番よさげな感じだった。日本語が化けないとかGUIがそれなりに綺麗とか、まあそんな理由からなんですが。
ということで、アップデートしました。余りに久しぶりの更新すぎて更新の手順を忘れてしまっていたのはここだけの秘密です。
やってることとしては、リンク先にも書いてるけど、まず検索対象のフォルダのメール全部を走査してヘッダ情報を収集。次に、それを文字列として連結して検索用のデータを作成。それに対してXUL/Migemoで生成した正規表現でマッチングを行い、ヒットした箇所を抜き出して、それを検索語句としてThunderbirdに渡す。という手順で、ローマ字入力でのメール検索を実現しています。今のところヘッダ情報しか収集していないので、本文内に含まれる単語は検索できません。要約とかをきちんとキャッシュするようにすればできるのかもしれないけど、そこまでやると大変そうなので今のところはここまで。
ハードディスクが逝ってしまった後に再構築した環境でテストしている都合上、大量のメールがある状況でどのくらい重くなるのかは未検証です。ヤバいくらい遅くなる場合は、設定ダイアログから「メールの検索でXUL/Migemoを使用する」のチェックを無効にしてください。
んぁ。意図したわけではなかったんだけど肉の日リリースになった……
XUL/Migemoでメールの検索をできるようにしてみたいな、と思って試してみた。
メールの検索はOR検索はできるようなので、キャラクタクラスやグルーピングを展開して単語のリストを生成してOR検索したらいけるかな?と思ってやってみたんだけど、ローマ字入力から単語のリストを作る所までで数百ミリ秒くらいの遅延というのはまあ許したとしても、そこから先の実際に検索にぶち込む所で重すぎてThunderbirdが落ちた。そりゃ9000ワードをOR検索とか、いくらC++で書かれた処理が速いといっても限度があるわ。
というわけで正攻法は無理なので別のやり方を考えないといかんですね。やっぱアレかな、検索対象のメールすべてのヘッダを一旦文字列に取り出してそこに検索をかけてから、ヒット箇所の単語を実際の検索に投げるという、いかにもXUL/Migemoらしい(plus7さんよくこんなやり方を思いついたもんだ)やり方で行くしかないのかな。
どーでもいいけどこの正規表現を単語のリストに変換する処理、自分で書いておきながら、どういう理屈で動いているのかさっぱり分からんです。
追記。前述したヘッダを一旦文字列に取り出して云々のやり方を実装してみたら、数十件程度ならわりとストレスなく動くようになった。1フォルダに数百件、数千件とかのメールが溜まってる環境だとやばいかもだけど。
DVDだけじゃなくてサントラも買っちゃったよ……まあ概ね第1話アバンタイトルと最後のメインテーマのためだけに買ったようなもんなんだけど。
オーケストラがたまんないです。
Firefoxの環境はデスクトップ百景を参照。
新マシンへの移行と同時にThunderbirdの本格的な利用を開始して、さっそく不満タラタラになったのでアドオンを漁ってみた。
スレッド表示してる時にソートできなくなる件について、あまりにあんまりだと思ってアドオンを作り初めてからふと「Thunderbird スレッド ソート」で検索してみたら、about:configでmailnews.thread_pane_column_unthreadsをfalseにすればよいと書かれた記事を発見した。こんなのデフォルトでfalseにしといてくれよ……
スレッドペインのコンテキストメニューで一番上の項目が「返信」じゃなくて「新しいウィンドウで開く」になってるせいで、無駄にウィンドウを開いてしまってイライラ。なのでuserChrome.cssで項目を消した。ついでにDOM Inspectorのインデントも減らしてみた。スレッド表示のネストが深くなったときに見にくくなるので、スレッドペインのインデントも変えるようにした。
#threadPaneContext-openNewWindow,
#threadPaneContext-sep-open {
display: none !important;
}
@-moz-document url(chrome://inspector/content/viewers/dom/dom.xul),
url-prefix(chrome://messenger/content/) {
treechildren::-moz-tree-indentation {
width: 9px !important;
}
treechildren::-moz-tree-twisty {
padding-right: 0px !important;
}
treechildren::-moz-tree-cell-text(colNodeName) {
margin-left: 1px !important;
}
}
仕事用マシンにしてた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でまた変更があったようだ。
やりたいこと云々の話にシロクマさんが私信を書いてくださっているのでそれを見てのコメントです。コメント欄に書かなかったのは、自分の所の文としてまとめておきたかったから。
迷惑をかけることを忌避する云々についてですが、自分の場合の根本的な動機を一言で言えば、「責められたくない」ということに尽きると思います。別の言葉で言えば「責任を追及されたくない」、「叱られたくない」、「怒られたくない」、「不愉快な思いをしたくない」、そんなとこでしょうか。
自分に非難の矛先が向く事態を可能な限り避けたい。迷惑をかければ非難されるし、かといって何もしなければそれも非難されるから、非難されないような無難な所を漂っていたい。と言いつつも、特別扱いされてちやほやされたいという感情には囚われている。それが僕なのだと思っています。結果的には同じ行動になっていたとしても、動機はまったく異なる。
だから僕の場合、責められないとひとたび分かればトコトン甘えて迷惑をかけまくります(あるいは何もしません)。そういう所を見ても、僕が忌避しているのがあくまで「責められること」でしかなくて、決して「迷惑をかけないこと」などという高潔・完璧主義的な考え方には基づいていないことは、まぁ、明らかでしょう。
公式サイトとかGyaoとかで見れるトレイラーはショボいので、ようつべとかにあがってる3分のトレイラーの方がオススメ。なんでこっちの方を公式に置かないんだろうねぇ……?
とりあえず先週後半にこれをチラッと見て「かっこEEEEEEEEEEEEEEE!!!!!」と思い、ニコ動とかで「これはDVDでこそ見るべき」とかコメントが付いてたし、「40周年」という売り文句もあってか、なんだろう、所有欲を物凄く刺激されてしまった。思わずDVD全6巻コレクターズエディション一気買いしちゃったよ。まあ定価じゃなくてマーケットプレイスとか使ったから2/3かそれくらいの値段で手に入れたんだけど(といっても4巻以外は新品だった)。公式サイト見たらコレクターズエディション全巻購入特典とやらの応募〆切が今月末とのことだったので、ギリギリのタイミングだ。トレイラー映像にこの時期に辿り着けたのは奇跡だね。貰える物はなんでも貰っとくよ。
とりあえずヒーロー物好きで未見の人は1話だけでも見ておいて損はない。作り手側が特に力を入れて作ったとコメントしているだけあって、劇場用どころの話じゃない激ハイクオリティだ。ストーリーはてんで分からんが(ぉぃ)、とにかく見せ場見せ場の連続でゲップが出るほど。何回も繰り返し見てしまいたくなる。
ストーリーの方は、特に4話の過去話とか6話の都知事の話とか陳腐やなぁと思わなくもないんだけど、それをさっ引いても僕にとっては十分面白かった。5話ラストのゆりね復活からのシークエンスは身震いしたよ。
映像は、いわゆる3DCGと2D作画の組み合わせなんだけど、これが丁寧に合わせてあって、3Dと2Dのいいとこ取りになってる。3DCGっていうとなんとなくオモチャっぽい印象を受けてしまいがちで、事実1巻特典ディスクに収録されてた2001年版トレイラーともなると「あー……」て感じなんだけど、本編映像では、単なるトゥーンシェードというわけでもなく、面カゲとかBLベタとか言われるクッキリハッキリした陰が描かれていて、レイトレーシングとかの「理屈的に正しい陰影」じゃなくて「画として魅せる陰影」になってるから、とても不思議な感じだ。
中二病と言われても構わない、ここまでガチで作り込んで作り抜いたことがもう賞賛に値すると思う。日本のアニメはホントに底が知れないな……
一応Amazonにリンクしとく。
北極だか南極だかから白毛の熊さんがやってきそうなので今のうちに自分で芽を刈っておく。
やりたいこととやってみたいことの違いの話を見てこういうことを脊髄反射的に書いたのは、冒頭に書いている自分の恋愛関係の悩みというか自分で自信を持てずにいて自己欺瞞で凌いできている部分について痛い所を突かれたからに他ならないと思う。仕事の事だのなんだのは後付に過ぎないと思う。つまり、僕は、自分自身が今の関係についてただの「やってみたい」の域を出ない程度の思いしか抱いていなかった可能性を自覚しており、その可能性が少なくないということも自覚しており、そうであるはずがないと信じたがっていて、あるいは、そうであったとしてもその先には望ましい未来があるはずだと信じたがっている、という事だと思う。自分のした選択が間違いではなかった「ということにしたい」がために一生懸命正当化しようとした悪あがきの結果が、こういうことなんだろう。