そうそう。JavaScript の配列は扱いにくいんですよ。

JavaScript の暗黒面を覗く

というか Hash として活用しようとすると途端に扱いにくくなるって感じかな。確かに中身はハッシュテーブルかもしれないけど、Hash としては扱いにくい。けっきょく全部 for ( in ) でなめます、みたいな感じで書かざるを得ない。ださい。length プロパティもそうだけど他にもいくつかメソッドが期待したようには動作しない。少なくとも Firefox では。

で、どうせなら has_value() とか keys() とかほしいなと思ったので、自分は試しに Hash オブジェクトを作ってみた。すると JavaScript のオブジェクト周りの扱いにくさというかクセがよく分かる。

Object はプロパティの集合体でありハッシュテーブルなので、Object を作ってそこに obj[key] = val って放り込んでいくだけで Hash でござい、と言えてしまう。でも前述のように便利メソッドがないので Function を使ってオブジェクトを作って、そこにメソッドを足してみる。するとメソッドも変数と同じなので for ( in ) したときにそのまま列挙されてしまう1。そうか、じゃあ列挙するのはもうみんな中のメソッドでやることにして、if ( typeof key != 'function' ) とかやればいいんだ、と思って調子に乗ってメソッドを作って行く。するとハッシュキーに使える名前がどんどん減っていく2。それも困る。

そこでオレHash はこういう作りにしてみた。

var Hash = new funtcion() {
  return function() {
    this.obj = {};
  }
}
Hash.prototype = {
  method: function() {
  },
  ...
}

つまり実際のデータは hash.obj の中に詰め込んでいく。こうするとメソッドとデータの key で名前がぶつかることはない。しかしこの方法だと hash[key] = val とか for ( in ) とか普通の構文が一切使えなくなる。そこでずいぶん悩んだが、「ええいそんなもん禁止だ!」と開き直って Ruby からアイディアを拝借して fetch() とか store() とか merge() とかバンバン作っていく。そうするとなんとかそれっぽく使える状態になる。

ハッシュの中に Array を作るときは

hash.store( key, [] );
hash.fetch( key ).push( val );

てな感じ。まぁ正直これもどうだって感じではあるけど、練習にはいい題材だったと思う。

  1. ユーザーの定義したプロパティには DontEnum 属性がセットできないんだよな。 

  2. やってみれば分かるが、prototype.js の Hash では "keys" という名前のプロパティに値を代入すると keys() メソッドが壊れる。ところで prototype.js って prototype を使わないでプロパティをコピーして回ってるように見えるんだけど、これも富豪アプローチですか? 

firewall とりあえず解決

まず cvs も rsync も通らなくて fink の update ができなかった件。

cvs-proxy を入れてみても、http proxy を fink に設定してみても一向にうまくいかない1ので、

/sw/lib/fink/URL/cvs-repository

の中身を

localhost

に書き換えて、ssh で port forward して解決。まったく汎用に使えないノウハウになってしまった。今回の場合は訳あって firewall の外に出る ssh のルートがあらかじめ用意できてたから使えた方法。全部 apt-get で済めばいいんだけど、そうもいかないのが Fink の Fink たるゆえんというかなんというか。

このとき、fink は cvs に頑固に 2401 でアクセスしにいくので、

LocalForward 2401 cvs.sourceforge.net:2401

てな感じで port forward を掛けること。上の書き方は ssh_config な書き方だけど、Zebedee で別なホストからトンネル掘るときなんかも同様。

ところで、fink のサイトに紹介されている cvs-proxy と sra.co.jp の cvsproxy ってベツモノなんですよね? どうも cvs-proxy について全然情報が出てこなくて、いやになってやめちゃったんだけど、この辺は Fink プロジェクトの方でもあんまりテストしてないのかな。よく分からん。

待てよ。どうせ forward するなら別に cvs でなくても rsync でいいのか?orz でも rsync の接続先は複数あるから面倒くさいかも。

同様に cvsup は 5999 を forward すればよい。当座は。いずれ CTM にするなり、http だけでアップデートできるシステムに入れ替えるなりを判断すればいいかな。2

  1. その proxy が実は落ちてたとかいうまぬけな話ではないぞ 

  2. ftp は通るから差分とかセコイこと考えずにどかーんと全部落としてきてもいいんだけど。 

Intaglio いいかも

http://www.purgatorydesign.com/Intaglio/

2ch のどこかで見つけたような気がしていたけど、

http://slashdot.jp/comments.pl?sid=247230&cid=714649

でした。

クラリスワークスのドローからクリップアートなどがなくなったような、シンプルな OS X 用のドローソフト。OmniGraffle は自分で線を組み合わせてオブジェクトを作ったりするような使い方には向いてない(少なくとも 2 は)けど、これならクラリスワークスのようにもう少し自由度の高い図が描けそう。クラリスワークスにはなかった線と線を磁石で繋ぐような機能もあるし、使い勝手も OmniGraffle よりよさげ。日本語も普通に書ける。これいいかも。

Acrobat 7 Elements が1本から買えるのか

アドビ、4900円の廉価版PDF作成ツール「Acrobat 7.0 Elements」

日本だけなのかな。とりあえずありがたい。リンクとしおりは使いやすい PDF には必要なもんですからな。

あ。OS X 版はないのか。まぁ当然の判断なのかもしれないけど、Preview で作られる PDF ってでかいんだよなぁ。

へー 中原くんて今 MIT なんだ。

野心あるなぁ。(なんつーコメントだ。)

Mainichi はやはり見難くなった

MSN-Mainichi Interactive

すっかり忘れていた毎日と MSN の統合だが、予想通り見にくいサイトになってしまった。このいかにもなマイクロソフトブルーも個人的にはとても心象が悪いし、見出し部分の Luna のタイトルバーのような効果も目障り。デフォルトの文字サイズの設定もすごい。CSS でピクセル指定や 65%, 75% といった指定がてんこ盛り。

とても見にくい。

迷わず「もっと頑張りましょう」に投票したら、投票時点でブックマークしたい 16%、普通 10%、もっと頑張りましょう 73% と圧倒的な結果になっている。おいおい。すごいな、こりゃ。

久しぶりに納得のな。

100%正しいビデオカメラ論 (1/2) (@ITmedia)

素晴らしい。切れ味も鋭いし笑える。見習いたい。

オーディオプレイヤー

最近のものは mp3 以外のフォーマットも対応しているし、シリコンディスクばかりでもないし、どう呼ぶのがよいのだろう? と思ったら

iPodには真似できない「HDD交換」——マイクロドライブ対応MP3プレーヤー「WithC」 (1/2) (@ITmedia)

この記事では HDDオーディオプレイヤーと呼んでいる。やっぱメディアで分けるのが通例なのか。

しかしこの機械、仕組みとしてはかなり好みだ。

でも実際には iTunes + iPod の使い勝手というかお気楽具合に勝てないんだろうな。電源もストレージも自分でコントロールできるのはかなり魅力なんだけどね。ファイルベースで曲の管理したくないんだよね。

About

例によって個人のなんちゃらです