レジュメ的な文書を書く必要が出てきたので。あと、そういう文書であるならば某 Word よりキレイに出力できるためでもある。Windows 上では、TeX ファイルの編集を xyzzy で行う。学生時代に使っていた KaTeX の設定がそのまま残っていたので、明らかにおかしい所を修正してやるだけでそのまま利用できた。
jsarticle
に代表される奥村先生の新ドキュメントクラスも入れたし、dvipdfmx
の設定も終わった。Ghostscript の CIDFnmap
も何とかした。インタフェイスが壊滅的だが便利なのは確かな dviout も設定終了。
ぜんぶ TeX Wiki の情報をベースに何とかできるのがすごい。というか、TeX Wiki の内容が非常に丁寧なので楽なのだ。記事を編集した全ての人に感謝。
ちょいと古いネタだし、私は Mac OS X を持っていないのだが……。将来的には全てのプラットフォームで動くことを期待して(無理かなぁ)。Mozilla Links (邦訳)によると、Mac OS X のマルチタッチ(タッチパッドで利用できる iPhone/iPod touch のようなアレ)をジェスチャとして組み込んだテストビルドが利用できるようになったという。このテストは Bug 456520 の一環として行われたものらしい。パッチの作者は Edward Lee 氏。
Linux と Windows でもサポートされないかなぁ……。まあ、デバイスの問題だから無理か。ひとつの可能性として、iPhone/iPod touch をタッチパッドにするアプリを利用して、拡張機能でマルチタッチをサポートする方法もあるだろうが、果たしてうまくいくのやら。
職場で愛用している HHK Pro。いつの間にか Pro2 でも使える交換用キートップの販売が開始されていた。お値段4500円。
そもそも、キートップを丸ごと全部交換するという発想自体が今までなかったような気がする。特に HHK Pro シリーズは本体が高額なので、キートップが壊れた場合にとても有用だったりする。
……年末になったらキーボードの掃除をしよう。キートップを外して掃除機をかけて、キートップ自体は中性洗剤で洗う。全体をアルコールで拭ってもいい。
今、家ではもっぱら ThinkPad の101キーボード。これもノートパソコン用のパンタグラフ式にしては非常に打鍵感がいい。惜しむらくは、Windows キーと右クリック用のキー(名前忘れた)があること。昔はなかったのに。その分 Alt を大きくしてほしい。
Opera の 9.61 がリリースされた。変更点の詳細は changelog から。セキュリティ Fix なので導入必須。
最近 CSS Transforms をちょいちょいいじり中。しかし現状 Firefox の Nightly がサポートしているのは transform
と transform-origin
プロパティぐらい。勿論 -moz-
接頭辞がつくため、それぞれ -moz-transform
と -moz-transform-origin
になる。
JavaScript と組み合わせると、なかなかどうして面白いことができる。しかしながら今更になって重大な問題が発生。
線形代数わがんねー!(ベクトルと行列・行列式まわり)
……それでも少しは何とかした。例えば、原点 O を軸としたベクトル A, B がある時、この2ベクトルのなす角θを求める、とか。まさかここでアークコサイン (acos) を使うことになろうとは。そしてきちんと asin, acos, atan を用意している JavaScript の Math
オブジェクトは超えらい。マジえらい。
もう少し勉強しておけばとは、よくある話。つーか数学の教官はこういうブツの実例を投影しながら「こういう時に使うんだぜ」と言ってほしかった。延々と眠くなるだけの証明を聞かされる方はつらい。
あと、数理論理学を齧った後だと逆関数の概念がとってもわかりやすく理解できる。当時は「なんじゃらほい」な感じだったのに。
まあ……数学者になるわけでもなし。「数学はツールだ」と言った教官が昔いたが、まさに至言だと思う。要は使えればいいのであって、証明は誰かがやっておいてくれればいい。
Ajaxian 経由で、James Donaghue 氏が CSS 3 Selectors を完全サポートする JavaScript ライブラリ Peppy 0.1 Beta をリリースしたことを知る。同様のライブラリである、John Resig 氏による Sizzle より高速に動作するという[1]。
CSS 選択子(セレクタ)を解析するには正規表現の使用が必須になる上、パフォーマンスを上げようとするとキャッシュその他諸々の面倒極まりない実装とテクニックが必要になってくる。DOM ツリーの走査、正規表現の動的生成[2]は、パフォーマンスのボトルネックになりやすい筆頭だろう[3]。
ひとまず、この Peppy と Sizzle はあとで軽く読んでおこう。
getElementsByClassName
互換機能の実装などがいい例だ。getComputedStyle
のパフォーマンスを上げてほしい。ある機能を書いたのだが、プロファイルをとってみたらこれが一番のボトルネックになっていた。はっきり言おう。これはひどい。スラッシュドット・ジャパンにタレコまれたように、楽天とドリコムが (X)HTML/DOM/CSS 仕様の盲点をついたターゲッティング広告のシステム「楽天 ad4U」を構築したと IT-PLUS が報道した。楽天のプレスリリースには技術情報がないのだが、先の IT-PLUS の記事、水無月ばけらのえび日記、Web 屋のネタ帳を参照すると、コレが非常に悪質かつ将来性のない方法であることが読みとれる。重要なのは「確実に訪問履歴の一部が第三者に漏洩しうる」という事実だ。私はとりあえずこの現象を Visited History Leak (VHL) と仮称し、話を先に進める。
VHL 問題をどうやって実装するのか、その方法を簡単に列挙してみよう。
a
要素を挿入するa
要素 href
属性値として、データベースから取得した任意の URI を与えるa
要素の文字色を取得する(getComputedStyle
メソッドや currentStyle
プロパティなどを利用):visited
疑似クラスと同一の文字色であるならば、XMLHttpRequest
などのサーバ・クライアント間通信を用いて調査側サーバに「情報」を送信するここで「情報」という書き方をしたのには理由がある。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 であると考えている(やっていることが下世話に過ぎる)。
あとワイリーステージのみ。まだ攻略してない。とりあえずチキンなので E 缶 M 缶残機はフルチャージしてから行くことにしよう。
それにしても、弱点武器使うとボスってあんなに弱かったのか。
今日はリリースが重なった。
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 サイトのみ)Mozilla Thunderbird のアルファ版である Shredder Alpha 3 がリリースされた。詳細はリリースノートやえむもじらの記事を参照のこと。
アルファ版なので一般ユーザは絶対にインストールすべきでない。
Adobe Flash Player 10 の正式版である 10.0.12.36 がリリースされた。詳細は製品ページ、ADC の Flash Player カテゴリ、Adobe Labs にある Flash Player 10 のページを参照のこと。
テスト目的のために旧バージョンを利用したい開発者向けに、ほぼ全ての旧バージョンをアーカイブ化したものが置いてある専用のダウンロードページが用意されている。バージョン10も追加されているので、こっちからダウンロードするのもひとつの手段。
Microsoft Silverlight 2 の正式版がリリースされた。旧バージョンを利用しているならば自動アップデートがかかるらしいが、ダウンロード&インストールでも問題はない。詳細はプレスリリースや silverlight.net などを参照のこと。
但し、ベータ版の Silverlight 2 をインストールしている人はアップデートに失敗するかもしれない(私は失敗した)。その場合は、一度インストールしている Silverlight をアンインストールしてから正式版を再度インストールしなおすと問題なくいけるはず。
また、日本独自のサイトは現時点 (2008-10-16T23:00:00+09:00) で情報が更新されていない。前述のダウンロードサイトからダウンロードをかければ問題ない。
この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
がイベントリスナとしてセットされている無名関数内で参照されているからだ。蛇足だが、Prototype の bind
[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" を得る
こんなん何がうれしいねん、という話もあるだろうが、実は関数のファクトリを作成する時には多用するテクニックである。条件が少し違うだけで、アルゴリズム自体は同じ関数を量産したい場合(特に、関数内で利用する値が実行環境や条件で異なる場合)にとても有用なのである。クロージャではちょっと都合が悪い場合に有用だったりする。
removeChilds
を innerHTML
で実装すると高速だった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 では誤差範囲の違いぐらいしか出なかった。
カレーなる辛口Javaな転職日記経由で、YouTube に投稿されてた「システムエンジニアになろう ~新入社員研修編~」を観る。ちなみにニコ動からの転載。
……ああ、とってもありがちなブラック企業のやり口[1]。それが素晴らしい字幕と的確な動画で見事に表現されている。
なんだか、大きなのっぽの古 PG (ニコ動版)を思い出した。これは学生時代に聴いてマジ泣きしてしまった苦い思い出がある。
プログラマに愛を。生活保護団体に寄付を[2]。
人類に愛を。火星保護団体に寄付を。が真。神林長平『言葉使い師』より。ちなみに、「生活保護団体」などという酔狂なものは存在しない。
getElementsByClassName
の複数クラス名指定最早珍しいものですらなくなった getElementsByClassName
。これが複数クラス名をとれることは、意外と知られていないのかもしれない。
having obtained the classes by splitting a string on spaces
とあるように、次のような指定ができる。
var elems = document.getElementsByClassName("foo bar");
MDC の記事も参考になる。
起きたのが 16:00 過ぎだったという罠。どうしようもないなぁ……。胡麻油などを買いにいくついでに、ふと鰻が喰いたくなったので近所の店へ。ちゃんと炭火で焼いて、関東らしく蒸しが入っている。タレは辛口薄目。上以上を頼むと漬物のランクが上がる(量が通常の約3倍になる)。漬物をつまみに日本酒をちびちびとやっていたという具合。
以前、誰かに「独りで酒とか呑みにいけるの?」と訊かれたことがある。答えは Yes。全然問題ない。むしろ静かに呑みたいときは独りのほうがいい。好きな店に行けるのもある。好きな酒、つまみ、読みかけの本があれば何時間でも。
鰻の欠点は予算が必要な点か。まあ……たまの贅沢ぐらいは。
現在、1日に少しずつ攻略中。実のところ、私はこの「ロックマン9」が初めてのロックマンシリーズ。やってみたところ、これはかなり記憶力を利用するゲームだとわかった。あとマップ、敵配置、中ボス攻略、ボス攻略を発見&記憶するためにどしどし「ティウンティウン」していく必要があるとも。たぶん、これまでに50体以上のロックが破壊されてるはず。まあこれからも着実にその数を増やしていくだろう。
さて……休日だし、それなりにやってみるか。