会社の Windows に pLaTeX の環境を整えた

レジュメ的な文書を書く必要が出てきたので。あと、そういう文書であるならば某 Word よりキレイに出力できるためでもある。Windows 上では、TeX ファイルの編集を xyzzy で行う。学生時代に使っていた KaTeX の設定がそのまま残っていたので、明らかにおかしい所を修正してやるだけでそのまま利用できた。

jsarticle に代表される奥村先生の新ドキュメントクラスも入れたし、dvipdfmx の設定も終わった。GhostscriptCIDFnmap も何とかした。インタフェイスが壊滅的だが便利なのは確かな dviout も設定終了。

ぜんぶ TeX Wiki の情報をベースに何とかできるのがすごい。というか、TeX Wiki の内容が非常に丁寧なので楽なのだ。記事を編集した全ての人に感謝。

2008-10-28

Firefox の実験ビルド - Mac OS X マルチタッチのサポート

ちょいと古いネタだし、私は Mac OS X を持っていないのだが……。将来的には全てのプラットフォームで動くことを期待して(無理かなぁ)。Mozilla Links邦訳)によると、Mac OS X のマルチタッチ(タッチパッドで利用できる iPhone/iPod touch のようなアレ)をジェスチャとして組み込んだテストビルドが利用できるようになったという。このテストは Bug 456520 の一環として行われたものらしい。パッチの作者は Edward Lee 氏。

Linux と Windows でもサポートされないかなぁ……。まあ、デバイスの問題だから無理か。ひとつの可能性として、iPhone/iPod touch をタッチパッドにするアプリを利用して、拡張機能でマルチタッチをサポートする方法もあるだろうが、果たしてうまくいくのやら。

2008-10-25

HHK Pro 用キートップ販売が開始されていた

職場で愛用している HHK Pro。いつの間にか Pro2 でも使える交換用キートップの販売が開始されていた。お値段4500円。

そもそも、キートップを丸ごと全部交換するという発想自体が今までなかったような気がする。特に HHK Pro シリーズは本体が高額なので、キートップが壊れた場合にとても有用だったりする。

……年末になったらキーボードの掃除をしよう。キートップを外して掃除機をかけて、キートップ自体は中性洗剤で洗う。全体をアルコールで拭ってもいい。

今、家ではもっぱら ThinkPad の101キーボード。これもノートパソコン用のパンタグラフ式にしては非常に打鍵感がいい。惜しむらくは、Windows キーと右クリック用のキー(名前忘れた)があること。昔はなかったのに。その分 Alt を大きくしてほしい。

2008-10-23

Opera 9.61 Released

Opera の 9.61 がリリースされた。変更点の詳細は changelog から。セキュリティ Fix なので導入必須。

最近 CSS Transforms をちょいちょいいじり中。しかし現状 Firefox の Nightly がサポートしているのは transformtransform-origin プロパティぐらい。勿論 -moz- 接頭辞がつくため、それぞれ -moz-transform-moz-transform-origin になる。

JavaScript と組み合わせると、なかなかどうして面白いことができる。しかしながら今更になって重大な問題が発生。

線形代数わがんねー!(ベクトルと行列・行列式まわり)

……それでも少しは何とかした。例えば、原点 O を軸としたベクトル A, B がある時、この2ベクトルのなす角θを求める、とか。まさかここでアークコサイン (acos) を使うことになろうとは。そしてきちんと asin, acos, atan を用意している JavaScript の Math オブジェクトは超えらい。マジえらい。

もう少し勉強しておけばとは、よくある話。つーか数学の教官はこういうブツの実例を投影しながら「こういう時に使うんだぜ」と言ってほしかった。延々と眠くなるだけの証明を聞かされる方はつらい。

あと、数理論理学を齧った後だと逆関数の概念がとってもわかりやすく理解できる。当時は「なんじゃらほい」な感じだったのに。

まあ……数学者になるわけでもなし。「数学はツールだ」と言った教官が昔いたが、まさに至言だと思う。要は使えればいいのであって、証明は誰かがやっておいてくれればいい。

2008-10-22

CSS 3 Selectors を完全サポートする JavaScript ライブラリ Peppy 0.1 Beta

Ajaxian 経由で、James Donaghue 氏CSS 3 Selectors を完全サポートする JavaScript ライブラリ Peppy 0.1 Beta をリリースしたことを知る。同様のライブラリである、John Resig 氏による Sizzle より高速に動作するという[1]

CSS 選択子(セレクタ)を解析するには正規表現の使用が必須になる上、パフォーマンスを上げようとするとキャッシュその他諸々の面倒極まりない実装とテクニックが必要になってくる。DOM ツリーの走査、正規表現の動的生成[2]は、パフォーマンスのボトルネックになりやすい筆頭だろう[3]

ひとまず、この Peppy と Sizzle はあとで軽く読んでおこう。

脚註

  1. 他にも、著名なライブラリよりも高速であるという。Prototype 1.6.0.3, jQuery 1.2.6, MooTools 1.2.1, Ext JS 2.2, dojo 1.2.0, YUI Library 2.6.0 を例として挙げている。
  2. ロード時に生成しておき、キャッシュするのが常套手段だが、それでは対応できない局面も沢山ある。IE における getElementsByClassName 互換機能の実装などがいい例だ。
  3. 個人的には、もっと getComputedStyle のパフォーマンスを上げてほしい。ある機能を書いたのだが、プロファイルをとってみたらこれが一番のボトルネックになっていた。

2008-10-21

仕様の盲点を使う訪問先サイトの取得 - Visited History Leak

はっきり言おう。これはひどい。スラッシュドット・ジャパンにタレコまれたように、楽天とドリコムが (X)HTML/DOM/CSS 仕様の盲点をついたターゲッティング広告のシステム「楽天 ad4U」を構築したと IT-PLUS が報道した。楽天のプレスリリースには技術情報がないのだが、先の IT-PLUS の記事、水無月ばけらのえび日記Web 屋のネタ帳を参照すると、コレが非常に悪質かつ将来性のない方法であることが読みとれる。重要なのは「確実に訪問履歴の一部が第三者に漏洩しうる」という事実だ。私はとりあえずこの現象を Visited History Leak (VHL) と仮称し、話を先に進める。

VHL 問題をどうやって実装するのか、その方法を簡単に列挙してみよう。

  1. 調査側は、予め URI と傾向(ジャンルなど)をひもづけたデータベースを用意しておく
  2. 調査側は、Web サイトに JavaScript ないし Flash といった、クライアントサイドで動作する言語を使い、次の動作をとるコードを記述する
    1. DOM ツリーに a 要素を挿入する
    2. a 要素 href 属性値として、データベースから取得した任意の URI を与える
    3. a 要素の文字色を取得する(getComputedStyle メソッドや currentStyle プロパティなどを利用)
    4. 得られた文字色が :visited 疑似クラスと同一の文字色であるならば、XMLHttpRequest などのサーバ・クライアント間通信を用いて調査側サーバに「情報」を送信する
  3. 調査側サーバが「情報」を受理したならば、少なくとも閲覧者の傾向──最悪の場合は訪問履歴──が漏洩したことになる

ここで「情報」という書き方をしたのには理由がある。IT-PLUS の記事によると、少なくとも「楽天 ad4U」では利用者側クライアントから調査側サーバに送信するのは「傾向」の情報であるからだ。無論、URI を送信することもできる。

履歴情報(ないし、それを基にした情報)を漏洩するにも関わらず、この「楽天 ad4U」はプライバシー保護にも優れていますという売り文句を使っている。何故か。その理由を IT-PLUS の記事から引用してみよう。

従来方式の行動ターゲティング広告では、クッキー(cookie)を用いて閲覧者にIDを割り振り、IDごとの閲覧履歴をサーバー側で追跡する必要があったため、これがプライバシー上問題であるとしてしばしば批判されることがあった。ad4Uの方式ではその必要がないため、「プライバシー保護にも優れています」というのだろう。(後略)

行動ターゲティング広告はどこまで許されるのか

IT-PLUS の記事では、前述した引用のように前置きした上で、実際は2つほど問題があるのだと指摘している。

(前略)しかし、ブラウザー側のバグを突くプログラムを配信するという手法は次の2つの点で問題があるのではないか。

第一に、将来、ブラウザー側のバグが修正されたら、この広告は機能しなくなる。バグの存在を前提にしたシステムをビジネスとして展開することにリスクはないのか。

このような利用が広く普及してしまうと、ブラウザー側でバグを修正する動きに対してブレーキをかけることにもなりかねない。その結果として、先に述べたブログでアダルトサイトの閲覧の有無を盗み見るような悪質な行為を防げなくなってしまう。

第二に、このような方法で閲覧履歴を参照するプログラムは、現在国会で継続審議となっている刑法改正案の「不正指令電磁的記録作成等の罪」(いわゆる「ウイルス作成罪」)のいう「不正な指令」に該当するおそれがあると筆者は考える。なぜなら、これは、人がブラウザーを使用するに際して「その意図に反する動作をさせる」プログラムだからだ。

行動ターゲティング広告はどこまで許されるのか

敢えて付け加えるならば、情報コントロールの問題がある。確かに ad4U の開発側が言っていることに矛盾はない。だがしかし、1つだけ Cookie と訪問履歴漏洩問題には大きな差異がある。情報コントロールの容易さだ。

通常、Cookie の授受にはある程度利用者側がコントロール可能である。IE6 ですらホワイト&ブラックリストを使い Cookie の利用を許可するドメインを決定することができる。

対して VHL は、履歴の削除ぐらいしか利用者にはコントロール可能な側面がない。(X)HTML/CSS の仕様も絡んでくる。どうしても細かなコントロールはやりづらいのだ。

VHL 問題は、以前から少なくとも Mozilla の一部開発者には認識されていた。既に太平洋標準時間 2002-05-28T21:29:14 の時点で Bug 147777 として報告されている。どうして今に至るまで修正されなかったかといえば、そもそも何をして修正とするべきかという定義が非常に難しい(考えようによっては不可能?)状態だったからである。この辺の事情については前述した「水無月ばけらのえび日記」が少しだけまとめている。

IT-PLUS の記事にある記述には疑問もある。そもそも VHL 問題はブラウザーの「バグ」ではなく、先も述べたように (X)HTML/DOM/CSS/サーバ・クライアント間通信の仕様が文書閲覧者の訪問先情報が漏洩する状態を想定していない点にある。更に言い添えるならば、クライアントサイドで動作するプログラミング環境による W3C DOM 仕様の実装と (X)HTML/CSS 仕様が組み合わさった結果、想定外の利用法が生まれてしまったと言うべきである。そのため、もし「バグ」という言葉を利用するのであれば、ブラウザーのではなく「 (X)HTML/DOM/CSS/サーバ・クライアント間通信仕様による」バグだと表現するべきだ。

いずれにせよ、非常に厭らしいこと仕様の隙間を突いてきやがった、という感じではある。個人的にはこの方法、Hack ではなく Crack であると考えている(やっていることが下世話に過ぎる)。

2008-10-20

ロックマン9はあと少し……

あとワイリーステージのみ。まだ攻略してない。とりあえずチキンなので E 缶 M 缶残機はフルチャージしてから行くことにしよう。

それにしても、弱点武器使うとボスってあんなに弱かったのか。

2008-10-16

怒涛のリリース連鎖 - Fx, Tb, Fl, Sl

今日はリリースが重なった。

Mozilla Firefox 3.1 Beta 1 Released

Mozilla Firefox 3.1 Beta 1 がリリースされた。詳細はリリースノートMozilla Developer News の記事MDCを参照のこと。

開発者向けのリリースなので、一般ユーザの常用には向かない。

因みに、各種ニュースサイトの記事からは JIT コンパイラが有効になっているような印象を受けるが、実際はデフォルトで OFF になっている。テスト用に JIT コンパイラを有効にするには about:config から次のオプションを true にすればよい(フィルタで jit を引っかけると楽)。

  • javascript.options.jit.chrome (Firefox 本体と拡張機能)
  • javascript.options.jit.content (Web サイトのみ)

Shredder Alpha 3 Released

Mozilla Thunderbird のアルファ版である Shredder Alpha 3 がリリースされた。詳細はリリースノートえむもじらの記事を参照のこと。

アルファ版なので一般ユーザは絶対にインストールすべきでない

Adobe Flash Player 10.0.12.36 Released

Adobe Flash Player 10 の正式版である 10.0.12.36 がリリースされた。詳細は製品ページADCFlash Player カテゴリ、Adobe Labs にある Flash Player 10 のページを参照のこと。

テスト目的のために旧バージョンを利用したい開発者向けに、ほぼ全ての旧バージョンをアーカイブ化したものが置いてある専用のダウンロードページが用意されている。バージョン10も追加されているので、こっちからダウンロードするのもひとつの手段。

Microsoft Silverlight 2 Released

Microsoft Silverlight 2 の正式版がリリースされた。旧バージョンを利用しているならば自動アップデートがかかるらしいが、ダウンロード&インストールでも問題はない。詳細はプレスリリースsilverlight.net などを参照のこと。

但し、ベータ版の Silverlight 2 をインストールしている人はアップデートに失敗するかもしれない(私は失敗した)。その場合は、一度インストールしている Silverlight をアンインストールしてから正式版を再度インストールしなおすと問題なくいけるはず。

また、日本独自のサイトは現時点 (2008-10-16T23:00:00+09:00) で情報が更新されていない。前述のダウンロードサイトからダウンロードをかければ問題ない。

2008-10-15

JavaScript におけるクロージャとカリー化のメモ

この2つをいっぺんに尋ねられる質問をされたのでメモ。

クロージャと JavaScript は切っても切り離せない。特によく利用されるのは、DOM におけるイベントリスナの定義である。

次のコード断片は、window オブジェクトにイベントリスナを設定している例である。

function Test() {
    this.name = "TEST";
}

Test.prototype = {
    setEvent : function() {
        var obj = this;
        window.addEventListener("load", function() {
             alert(obj.name);
        }, false);
    }
};

ここで、イベントリスナとしてセットされている無名関数はクロージャになっている。何故ならば、本来なら関数スコープで消滅するはずの変数 obj がイベントリスナとしてセットされている無名関数内で参照されているからだ。蛇足だが、Prototypebind[1]bindAsEventListener を利用する場合もクロージャのお世話になっている(あと call ないし apply。詳細は略)。

カリー化については、既に詳細な解説や実装例があったりするので、ここでは軽く触れるに留める。次のコード断片は、先の詳細な解説に載っているカリー化関数 curry を使った例である。

// curry は関数のファクトリとして動作する
// curry(f) を実行すると「f を返す関数」が得られる
var getF = curry(function(a, b, c) {
    return a+" : "+b+" : "+c;
});

// 「f を返す関数」getF を実行して f を得る
// 但しカリー化によって f の第1引数は常に束縛される
var f1 = getF("F1"); // 第1引数を "F1" に束縛
var f2 = getF("F2"); // 第1引数を "F2" に束縛

f1("1", "2"); // 文字列 "F1 : 1 : 2" を得る
f1("A", "B"); // 文字列 "F1 : A : B" を得る
f2("1", "2"); // 文字列 "F2 : 1 : 2" を得る
f2("A", "B"); // 文字列 "F2 : A : B" を得る

こんなん何がうれしいねん、という話もあるだろうが、実は関数のファクトリを作成する時には多用するテクニックである。条件が少し違うだけで、アルゴリズム自体は同じ関数を量産したい場合(特に、関数内で利用する値が実行環境や条件で異なる場合)にとても有用なのである。クロージャではちょっと都合が悪い場合に有用だったりする。

脚註

  1. ECMAScript 3.1 のドラフト仕様には、15.3.4.5 に Function.prototype.bind として同等のメソッドが追加されている。これは実に嬉しい仕様……なのだが、DOM イベントモデルの仕様が相手の場合は自分でどうにかしろ、ってことなのか(addEventListener に渡すイベントリスナの第1引数には必ず Event オブジェクトが入ってくる)。

2008-10-13

removeChildsinnerHTML で実装すると高速だった

s がついて複数形なのに注意。まあ要するに指定ノードの子ノードを根こそぎ削除したいときに利用するシロモノ。これをふと思いつきで innerHTML によって実装してみたら……また随分と高速になったのだ。特に IE。Fx3 とほぼ同等か、もしかしたらそれ以上のパフォーマンスを叩き出しているかも。

次のコード断片は、removeChilds の実装例。

// 本来は疑似名前空間用オブジェクトのプロパティに突っこみたいところ
var removeChilds = (function() {
    // Gecko であることを判定できればいい
    if (window.Components) {
        return function(target) {
            // 一旦 target をレンダリング対象から外して
            // 描画にかかるコストを軽減
            target.style.display = "none";
            target.innerHTML = "";
            target.style.display = "";
        };
    } else {
        return function(target) {
            target.innerHTML = "";
        };
    }
})();

ちなみに、プロファイルをとってみると Gecko は要素を ViewPort に表示状態のままだと非常にコストがかかる。非表示状態にしてやると軽減できる。他の UA では誤差範囲の違いぐらいしか出なかった。

2008-10-08

偽装ハケンの憂鬱

カレーなる辛口Javaな転職日記経由で、YouTube に投稿されてた「システムエンジニアになろう ~新入社員研修編~」を観る。ちなみにニコ動からの転載。

……ああ、とってもありがちなブラック企業のやり口[1]。それが素晴らしい字幕と的確な動画で見事に表現されている。

なんだか、大きなのっぽの古 PGニコ動版)を思い出した。これは学生時代に聴いてマジ泣きしてしまった苦い思い出がある。

プログラマに愛を。生活保護団体に寄付を[2]

脚註

  1. 動画中には、有名ブラック企業が伏せ字(笑)で登場。2ch の某スレには信憑性に欠ける一覧表があったりする。信憑性に疑問が残るとはいえ、就職活動時にとても役立ったのは言うまでもない。そういえば、同じ研究室だったある人物は、危うくブラックリスト内の企業に就職しそうになったという。
  2. 人類に愛を。火星保護団体に寄付を。が真。神林長平『言葉使い師』より。ちなみに、「生活保護団体」などという酔狂なものは存在しない。

2008-10-07

getElementsByClassName の複数クラス名指定

最早珍しいものですらなくなった getElementsByClassName。これが複数クラス名をとれることは、意外と知られていないのかもしれない。

having obtained the classes by splitting a string on spaces とあるように、次のような指定ができる。

var elems = document.getElementsByClassName("foo bar");

MDC の記事も参考になる。

2008-10-06

久々の鰻

起きたのが 16:00 過ぎだったという罠。どうしようもないなぁ……。胡麻油などを買いにいくついでに、ふと鰻が喰いたくなったので近所の店へ。ちゃんと炭火で焼いて、関東らしく蒸しが入っている。タレは辛口薄目。上以上を頼むと漬物のランクが上がる(量が通常の約3倍になる)。漬物をつまみに日本酒をちびちびとやっていたという具合。

以前、誰かに「独りで酒とか呑みにいけるの?」と訊かれたことがある。答えは Yes。全然問題ない。むしろ静かに呑みたいときは独りのほうがいい。好きな店に行けるのもある。好きな酒、つまみ、読みかけの本があれば何時間でも。

鰻の欠点は予算が必要な点か。まあ……たまの贅沢ぐらいは。

2008-10-05

結局「ロックマン9」買ってしまった……

現在、1日に少しずつ攻略中。実のところ、私はこの「ロックマン9」が初めてのロックマンシリーズ。やってみたところ、これはかなり記憶力を利用するゲームだとわかった。あとマップ、敵配置、中ボス攻略、ボス攻略を発見&記憶するためにどしどし「ティウンティウン」していく必要があるとも。たぶん、これまでに50体以上のロックが破壊されてるはず。まあこれからも着実にその数を増やしていくだろう。

さて……休日だし、それなりにやってみるか。

2008-10-03

Prototype 1.6.0.3 Released

この Blog を書くのも、本当に久し振りだなぁ……。そんなわけで Prototype が 1.6.0.3 になったという話。詳細は公式の記事を参照。

最近は Prototype 使ってない。もっぱら jQuery。あと Pi をちょいちょいと読んでる。それから JSLab DOM Correction も中身を読みだしてるが、これがまた時間とられそうな予感。

ロックマン9」買おうかなぁ、と考え出している今日この頃。……この間バーチャルコンソールの「イース III」買ったばかりだし、どうしよう。

2008-10-01