SOS 団に欠けているもの2006年07月07日 05時46分

涼宮ハルヒの憂鬱」シリーズは小説もアニメも面白いと思うのだが、どうも SOS 団に入りたいという気持ちはわかない。なぜだろうと考えていたら SOS 団には先輩・後輩がいないという点に思い当たった。もちろん朝比奈さんはハルヒたちよりも先に卒業していくわけだが、そこで何らかの引き継ぎがあるわけでもないだろうし、ハルヒが進級にあたって SOS 団に後輩を引き込んでくるというのも考えづらい。

マンガ・小説等に出てくる文科系クラブの中で私が一番好きなのはわかつきめぐみの「月は東に日は西に」(「わかつきめぐみの」と断らなければいけないこの哀しさ) に登場する楽描倶楽部だが、そこでは先輩から後輩へとクラブが引き継がれていく様が丁寧に描かれ、卒業した先輩もクラブのことを愛しているのが伝わってくる。クラブを愛する気持ちではハルヒたちも負けてはいないだろうが、彼らが卒業した後、北高に彼らの戻れる場所はないわけで、その点に少し寂しさを感じてしまう。

あるいは作品に出会った時期が関係しているのかもしれない。「月は東に日は西に」を読んだのはまさに私が高校 3 年生のときで、作中の出来事を自分の高校生活とリアルタイムに重ねてみたものだが、涼宮ハルヒシリーズを読み出したのはアニメ化が決まってからのごく最近のことで、もはや高校生活は遠いものになってしまっている。

……と書いておいて園原電波新聞部なら入りたいという事実に気づいてしまった。上に書いたことと完全に矛盾している。なぜだろう。ハルヒよりも水前寺のほうについていきたいんだよな。考えるのが面倒になったので結論なし。

Firefox と HTML ファイルのアイコン2006年07月07日 05時48分

Windows XP 上で Firefox をデフォルトブラウザとして使っていると、HTML ファイルのアイコンがなぜか Firefox のものではなくウィンドウズのデフォルトアプリケーションアイコンになってしまって困っていたのだが、Bug 268512 の情報を参考にレジストリから HKEY_CLASSES_ROOT\FirefoxHTML\ShellEx キーを削除し、その後フォルダオプションから HTML ファイルのアイコンを Firefox のものに関連付けなおすことできちんと Firefox のアイコンで表示されるようになった。(試される方は自己責任でお願いします。)

しかしこのバグ、パッチは出てるもののレビューされないまま放っておかれているのね。ぱっと見簡単な修正だし Firefox 2 にも間に合わせてほしいんだけど。

JavaScript でブロックスコープを実現する2006年07月08日 21時22分

JavaScript には基本的にブロックスコープというものが存在しない。どうしてもブロックスコープを扱いたいときは function 式を使ったりする。

var a = 10;
{
  var a = 20;
  print(a); // 20
}
print(a); // 20
var a = 10;
(function () {
  var a = 20;
  print(a); // 20
})();
print(a); // 10

だがやはりブロックスコープがあったほうが便利ということで JavaScript 1.7 では let 式、let 文、let 宣言が導入される。

var a = 10;
let (a = 20) {
  print(a); // 20
}
print(a); // 10

しかしこれでは対応するブラウザが Firefox 2 以降などに限られる。ところが、with 文とオブジェクトリテラルを使えばブロックスコープを実現できることを Bug 343765 に添えられたテストケースで知った。

var a = 10;
with ({ a: 20 }) {
  print(a); // 20
}
print(a); // 10

これは for ループ中でクロージャに使われる変数の値を束縛したいときなどに威力を発揮する。「ma2の日記 - Functionオブジェクト」の例ならば以下のように書ける。

var f = [];
for (var i = 0; i < 10; i++)
  with ({ i: i })
    f[i] = function (a) { return a + i; };

print(f[3](4)) // 7

with 文は入れ子にできるので以下のようにも書ける。

var f = [];
with ({ i: 0 })
  for (; i < 10; i++)
    with ({ i: i })
      f[i] = function (a) { return a + i; };

print(f[3](4)); // 7
print(i); // ReferenceError: i is not defined

また、with 文を使うことで prototype.js の bind のようなこともできる。

function E(element)
{
  ...
  // prototype.js を使う場合の
  //   element.onmouseover = this.show.bind(this);
  //   element.onmouseout = this.hide.bind(this);
  // とほぼ等価。
  with (this) {
    element.onmouseover = function () { return show(); };
    element.onmouseout = function () { return hide(); };
  }
  ...
}

E.prototype.show = function () { ... };
E.prototype.hide = function () { ... };

正直 with 文にこのような使い道があろうとは目から鱗だった。関係ないが、Bug 343765 comment 13send your tachyons という表現の意味がわからない。光の速さよりも速くスーパーレビューをしてということだろうか?

Bugzilla での疑問2006年07月23日 19時35分

mozilla.org Bugzilla でバグを立てるとき、ステータスを最初から NEW にできる権限というのを頂いた。パッチはおろかテストすら書けない人間によくくれるものだと妙な感動を覚える。

しかし Bugzilla の使い方というのはよくわからないことも多く、一番わからないのはステータスを RESOLVED から VERIFIED にする権限が誰にあるのかということだ。果たして単なる報告者が変更していいものか。テストの追加と共に VERIFIED にされるケースもあるのでとりあえず私は触らず放っといているのだが。

それから SpiderMonkey のバグというのはビルドがらみでもない限り OS はあまり関係ないような気もするのだが、やはり私が Windows 環境でしか試せない以上、プラットフォーム / OS は ALL / ALL ではなく PC / Windows から始めたほうがいいのかというのも気になる。もっとも私の場合、Cygwin 上で OS_ARCH=Linux と指定して SpiderMonkey をビルドしているので、そもそも OS が Windows でいいのかという気もしてくるが。