2007年 12月 14日

Haiku

gerry++

2007年 12月 13日

..

人数が多いとそれだけ、嫌な人と遭遇しやすくなるんだから、ブログも日記も書いていない人がいっぱいいるところに、コミュニケーションを目的として行こうとなんて思えるはずがない……

id:cho45に嫌な人とマークされてるんじゃないかと思うと夜も眠れません><

http://b.hatena.ne.jp/ZIGOROu/20071213#bookmark-6783360

ちょw そんなわけない>< むしろ毎日会いたいw

殆ど知らない人いっぱいとあうのは絶対嫌だなぁというのを twitter の大規模なオフをやったという話を眺めながら思ったのでした……

事前に「あーこのひとはこういうひとかー」っていうのがわかってないとこわすぎる (知っていれば近づき/避けやすい)。そういうのは継続的な日記/ブログ (をどっちのスタンスで書いているか、とかも) がないとわからない……

要約すると、「ちんこちんこ言っても大丈夫なのかよくわからないのでめんどうくさい」

やったーゆのの絵かいたよー

2007年 12月 12日

JavaScript で Blosxom, Rhino

http://svn.coderepos.org/share/lang/javascript/blosxom.rhino/

Java との連動が結構たのしい。Java に足りない部分とかめんどうくさい部分と、JS にないシステムの部分とかをうまくくみあわせられてたのしい。

Java がよくわかんなくて文字化けしていたんだけど、結局 js.jar を叩くときの java コマンドに -Dfile.encoding=UTF-8 いれてうまくいった。ただこれって、プログラム側から設定しても反映されない? っぽくてよくわからない……

本体は完全に Rhino に依存してるけど、テンプレートエンジンは依存せずに書いてある

JS のテンプレートエンジンなんて腐るほどあるけど、自分で書いてみるのはやっぱ面白い。今回は new Function("stash", templatecode") みたいにして、ハッシュをわたすとテンプレートをプロセスする関数を動的に生成してみてる (toSource すればコンパイルされた結果をキャッシュできる)。new Function による eval はなんかなんともいえない楽しさがあるなぁと思った。

JS 1.6 相当の関数 (filter とか) ってほぼ必須だよなぁと思った……ないと書けない。

toSource と uneval の出力からわかる Object と Primitive

ためしてみるとすぐわかる違い。前提として、JavaScript では「全てオブジェクトというわけではない」ことを覚えておく必要があります (Ruby との違い)。

uneval("foo");
//=> "\"foo\""

"foo".toSource();
//=>  "(new String(\"foo\"))"

なぜこのような違いが生まれるか、というと 11.2.1 プロパティアクセス演算子 (Property Accessors) にある

生成規則 MemberExpression : MemberExpression [ Expression ] は次のように評価される:

  1. MemberExpression を評価。
  2. GetValue(Result(1)) を呼出す。
  3. Expression を評価。
  4. GetValue(Result(3)) を呼出す。
  5. ToObject(Result(2)) を呼出す。
  6. ToString(Result(4)) を呼出す。
  7. 基準オブジェクトが Result(5) でプロパティ名が Result(6) である Reference 型の値を返す。

の ToObject(Result(2)) がキモです。

JavaScript において

"foobar"

typeof "foobar" //=> "string"

は、typeof すればわかるように Primitive な String 型であって、String オブジェクトのインスタンス (Object 型) ではありません。プロパティアクセス演算子が使われると、そのつど String オブジェクトへ変換されます。

これは以下のようにすればすぐわかります。

String.prototype.returnThis = function () { return this };
typeof "foobar".returnThis(); //=> "object"

"foobar".returnThis() === "foobar".returnThis(); //=> false

レシーバは "foobar" にみえますが、上の結果と違っています。これはプロパティアクセス演算子の作用で ToObject された結果が this として渡されているからです。(ToObject は処理系の内部関数なので JS から直接はよべません)

ここでなんとなく気付くと思いますが、this は Object 型以外の型には絶対になりません。this を明示して渡せる call や apply でさえ this に対しては ToObject で変換がかかります。

そうなると、Object に変換されるまえの、Primitive な値がほしいときに (そんなケースあんまりありませんが)、ちょっと困るので、そういうときに valueOf() をつかいます。valueOf() って説明だけ読みとなにがしたいのがさっぱりわかりませんが、こいつを使ってやることで、本来のレシーバ (のようにみえる値) をとることができます。

"foobar".valueOf() //=> "foobar"

この valueOf() はどんなオブジェクトにも存在するので安心して本来のレシーバを取得することができます。(Primitive 値のラッパオブジェクトでは Primitive 値になるし、そうでなければ単に this をかえすだけです)

valueOf には Date オブジェクトみたいに this 以外をかえすのもあります。

JavaScript の型

前後しますが JavaScript には6個の型があります (処理系内部的/説明的には9個)。

  1. Undefined / undefined
  2. Null / null
  3. Boolean / true, false
  4. Number / 10, 0xff
  5. String / "foo", "fumino san love"
  6. Object / {foo: 123, bar: 456}

Object 型以外は Primitive であり、そう考えると Primitive vs Object の構造が想像できると思います。(リテラル undefined や null, 1, 2, "foo" とかは全部この型に対応しています) JavaScript における「オブジェクト」は Object 型の値のことで、Object 型以外は「プロパティ」や「メソッド」を持ったりはしていません。

プロパティアクセス演算子は Object 型へ必ず変換しますが、そのとき使われる ToObject は、undefined と null のときに TypeError をなげます。(この変換のおかげで Primitive 値の多くはオブジェクトのように扱うことができます)

割とよくみるであろう

TypeError: null has no properties
TypeError: undefined has no properties

は、この ToObject への変換時におきているものです (殆どないし全部)。もし JavaScript でも Ruby と同じように「全てがオブジェクト」であるならば、上のようなエラーは絶対に起きないはず (オブジェクトであれば no properties はありえない) ですし、Object に定義されているメソッドが null や undefined に対しても使えるはずです。

null.toString();
undefined.valueOf();

実行しなくてもわかるようにこのコードは TypeError がでます。JavaScript では「全てがオブジェクトというわけではない」ことは、この TypeError の背中が物語っています。

Tree Style Tab いい!

https://addons.mozilla.org/en-US/firefox/addon/5890 (SandBox にはいってる)

そろそろ Fx3 で縦おきタブデキナイカナーとおもってさまよってたら Tree Style Tab でできた……piroさん++

Mac のテーマだとタブの高さがちょっとたりなくてセレクトしたときに outline がはみだしてしまうので、Stylish で

@namespace url(http://www.mozilla.org/keymaster/gatekeeper/there.is.only.xul);

.tabbrowser-tab {
    height: 2.2em !important;
}

.tabbrowser-tab label {
    font-size: 90% !important;
}

こんなん書いた。

なんか Opera と同じようなレイアウトにしたら (Opera は左にタブ縦置きにしてる) Fx がはやくなったように感じるプラセボ

それにしてもツリーが思ったより便利><

>

Windows 再インストール

たいして使ってないのに再インストール…… Windows Update でエラーでて (なんか証明書関係のエラーで、対策もひとおりしてみたんだけどだめだった。)

http://subtech.g.hatena.ne.jp/cho45/20070927/1190891651

  • Chipset Driver Windows 2000 用のやつ (from SC440 付属CD)
  • reboot
  • イーサネットコントローラ (ドライバの更新で CD を検索させる)
  • reboot
  • nVidia GeForce 6 系のドライバをインストール (via Internet)
  • reboot
  • WPCRSET 自動起動 ( Bus=0 Device=28 Function=0 Register=05h Data=00h )
  • Windows Update (再起動しまくり)
  • Avast インストール
  • US Keyboard http://subtech.g.hatena.ne.jp/cho45/20070928/1190965320
  • Firefox 3b1
  • Lhaplus
  • mayu
  • SKKIME http://subtech.g.hatena.ne.jp/cho45/20070929/1191020138
  • ~/fonts/* を %fonts% へコピー
  • foobar2000
    • Columns UI
    • ~/foobar.fcs からインポート
    • Last.fm インストール
Windows Registry Editor Version 5.00

[HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\i8042prt\Parameters]
"LayerDriver JPN"="KBD101.DLL"
"OverrideKeyboardIdentifier"="PCAT_101KEY"
"OverrideKeyboardType"=dword:00000007
"OverrideKeyboardSubtype"=dword:00000000
"LayerDriver KOR"="KBD101A.DLL"
Windows Registry Editor Version 5.00

[HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\Keyboard Layout]
"Scancode Map"=hex:00,00,00,00,00,00,00,00,03,00,00,00,1d,00,3a,00,00,00,00,00