Javascript はファイル間の依存関係を一切書けない。ロードする順番は結局 script 要素の出現順、つまり HTML 依存。どう考えても気持ち悪い。のでどうにかして require もどきを作りたい。

function createXMLHttpRequest() {
return this.XMLHttpRequest ? new XMLHttpRequest() : new ActiveXObject("Microsoft.XMLHTTP");
}
var __LOADED_FEATURES = {};
var Global = this; // this == window == Global
function require(lib) {
if (__LOADED_FEATURES[lib]) return false;
var req = createXMLHttpRequest();
req.open("GET", lib, false); // 同期
req.send(null);
if (req.status == 200) {
// IE ではグローバルコンテキストで実行してくれない。
Global.eval(req.responseText);
__LOADED_FEATURES[lib] = true;
} else {
throw Error("Load Error");
}
return true;
}
require("/ruby.js");
require("/mm.js");

Global という名前のオブジェクトが宣言されてなかったりするので強調をこめて宣言してある。それ以上の意味はないです。window.eval でも問題なし。見たとおり XMLHttpRequest を使って取得し、eval させてみる。

これは Firefox 1.0.7と Opera 8 ではうまくいくけど、IE 6 ではうまくいかない。

IE の場合 eval する部分のコンテキストが変わってくれない。つまり mm.js に var MottoMottoMeidosan = function () { .. } とかいう宣言があったとき、require 関数の変数オブジェクトに代入されやがるので、require のあとに new MottoMottoMeidosan() とか書くと「そんな変数宣言されてません」と怒られる。

解決法なんですが、さっぱりわかりません。誰か助けて。

なんだったら .php にでもして include() でもいいんだろうけど、これは完全に負けだよね(謎

卑怯な解決方法1を発見した。

eval(req.responseText.replace(/^var/g, ""));

インデント依存っていうか副作用がどれだけあるか不明すぎ。

JSAN つかえよバーカ。

JSAN はそもそもグローバルスコープで eval することなんて考えてない。指定したオブジェクトだけグローバルスコープに登録してる。つまり基本的に一個のファイルで一つの固まりしかロードできない。use は必要なのをグローバルスコープに登録するらしい。 DOM 定数とかをグローバルスコープに登録するなら全部 use/export の引数に書けってことなのか?

なんか素晴らしすぎて使いづらいなぁ。特定ファイルを単純にロードしたい。とくにディレクトリ構造を要求するのがなんともいえない。

疑問なんだけど JSAN は 291 行ものコードを最初から書いておけっていうだろうか?

script 要素二つ書けっていうんだったら目的が違うな。モジュールシステムが欲しいんじゃないし。

続きを書いた。

  1. トップ
  2. web
  3. Javascript で require もどき・eval の実行コンテキスト
  1. トップ
  2. script
  3. Javascript で require もどき・eval の実行コンテキスト

一回で10k以上使ったのはさりげなく初めてだな、と思った。

  1. Paradise Lost / ART-SCHOOL
  2. grandline / plane
  3. laundry / plane
  4. さよならリフレイン / Prof.Moriarty&Smiley-Todd
  5. BLACK STAR LUSTER / STRAIGHTENER (DVD)
  6. うたかた / 音速ライン

とりあえず Paradise Lost きく。

さよならリフレインのジャケットが素晴らしすぎて悶えるので是非紹介したかったんだけど、amazon にないっぽい。残念。傾向的にはメレンゲの初恋サンセット系。と思いきや公式ページにありましたよっと。

  1. トップ
  2. music
  3. CDs

for(;;) window.status = ""; がブラクラ。Firefox 1.0.7 と IE6 にて。Firefox はステータスバーを書き換えを許さないようにしたら死なない (スクリプトが遅い警告が出る) けど、他にもあるんじゃねぇの的な。

あと for(;;) alert(""); もある意味ブラクラ。止める方法が存在しない (するのかもしれないけど見つけられない)

Javascript 実行中ブラウザが止まるのはアレだなぁ? Gecko だと仕方ないのかなぁ? まぁ IE もだけどさ。

どうでもいいし関係ないけど俺は Bugzilla-jp が苦手だ。なんか雰囲気がおかしく感じる。何を基準に「おかしい」なのかはさておき、バグ報告したくない。報告しただけで怒られそう。ってか前報告したときなんか怒られたし。INVALID とか言われたとき「ハァ?」とか思ったと同時に諦めた。まぁそのときは他の人がフォローしてくれたけどさ。なんであんな「お前の報告が間違ってる」っていう感じをヒシヒシと出してくるんだろ。まぁどうせ100%俺の考えすぎなんだろう。被害妄想で申し訳ありません。

あーちなみに while (true) じゃないのは for (;;) のほうが可愛いから!

  1. トップ
  2. soft
  3. Fx x CPU 100%

ECMAScript でイテレータ なんてのを書いたことがあったけど、これ、each の中で break ができないのでちょっと気持ち悪い。ちまたで時々聞く ruby.js はどうやって解決しているんだろう?って思ってみてみたけど、特に何もしてなかった。つーか ruby.js 見つけるのが割りとめんどかったよ。

いろいろ考えたけどとりあえず動いたのをメモっとく。

function Array_each(func) {
try {
var context = {
escape : function () {
throw "break";
}
}
for (var i = 0, len = this.length; i < len; i++) {
func.apply(context, [this[i]]);
}
} catch (e) {
if (e != "break") throw e;
}
return this;
}
Array.prototype.each = Array_each;
[1, 2, 3].each(function (i) {
if (i > 1) this.escape();
Debug.dump(this);
});

Function.prototype.apply() の第一引数は関数の中での this なのでそれにメソッド設定してみる。ループから抜けるのに try - catch。投げるオブジェクトは "break" という文字列。"break" 以外の場合は例外を投げなおす。

ほんとはコンテキストの変数オブジェクトに直接関数を突っ込めるのがいいんだけど、ECMAScript では変数オブジェクトにアクセス方法はない (Activation オブジェクトは変数の実体化を目的とした変数オブジェクトとして使用される。Activation オブジェクトは純粋に仕様のメカニズムである。 Activation オブジェクトへのアクセスは ECMAScript プログラムには不可能である。 メンバ (変数) にはもちろんアクセスできるから eval つかえばいいけどスマートとは思えない。) のでこんな感じ。Global (window) は使いたくないし……

あとは eval(func.toString().replace(/\{/, "\{ var escape = function () { .. };")) とか?

  1. トップ
  2. prog
  3. Ruby's eash on ECMAScript
  1. トップ
  2. script
  3. Ruby's eash on ECMAScript

昨日なんとなくメレンゲのサイト見たら、なんか違和感を感じる文字列あって、注目したらSINGLE「すみか」のリリースが決定しました。来年1月下旬公の映画「最終兵器彼女」の主題歌です。とかなんとか書いてありふきだす。ちょ、おま的な何か。

ていうか実写なのね。最終兵器彼女殆ど読んだことないけどさ、実写って可能なんだ。グロそうなんだけど

  1. トップ
  2. music
  3. メレンゲ x 最終兵器彼女

はじまった。ラジオで ART-SCHOOL ははじめて。今回はメディア露出が多い気がする。気のせいか。

木下氏はアレか、風邪もしくは花粉症か。

ファッション経由で髪形 (マッシュ) について言及。わろた。

BLACK SUNSHINE

試聴済みだから特にアレもソレもなく。

ジャケは写るんです。

ダニー・ボーイ

すんごい綺麗

あと10秒での remix は「どうなの」なのか(w

ライブ中にマネージャーが片手で栗むいて食うのか。いや違うけど。

で、終わり。なんか微妙。宇野氏と櫻井氏の話が聞きたいな。謎すぎる。

  1. トップ
  2. music
  3. NHK FM - ミュージックスクエア ART-SCHOOL

  • レンタカーで公園を疾走
  • メガネの女性
  • F言語
  • 風呂記述言語
  • C
  • importNode().***().***();
  • ホテル
  • 営業
  • 失敗

ナレーション付神様視点の夢だった。つまり俺が俺の視界の中にいた。

  1. トップ
  2. life
  3. 夢:F言語

icho にデフォルトで搭載される予定らしい MetadataManipulator について。

とりあえず基本的に icho に依存しないので自分のサイトで実験することにする。Javascript 入れていれば左上になんか出てるはず。たぶん。

どこまで決めうちしていいか考え中なので、いまのところ MetadataManipulator 自体はソース生成しかやってない。ピョコピョコさせたり、CSS 的に欲しい要素を補完するのも外側。

link 要素の出現順に何も考えずにソース生成すると CSS が適用しずらいのでいくつか MetadataManipulator の外側で修正してある。内側に入れるか悩む。入れるんだろうけどどうやって入れるか悩む。

  1. あんまり役に立たない。next, prev はいいけど……
  2. in-page heading が役に立ちそうだけどうまいことナビゲーション生成するのがめんどい。汎用性云々。ながったらしいし。h2 だけ抽出とかにすればいいのか。
  3. 実装が定まらない。クラスっぽくするかモジュールっぽくするか。
  4. マルチリンガルじゃない。"in-page heading" っていう文字列を埋め込んでる。"ja-jp,ja;q=0.8,en-us;q=0.5,en;q=0.3" とかいう文字列を優先順位高い順に配列に突っ込む関数は書いたけど、どの時点で実行するか迷う。
  5. あんまりときめかない。

# IECSS の問題があるけど本質じゃないのでとりあえず放置

var mmul = document.getElementById("MetadataManipulator-Local-RelatedLinks-Dd").childNodes[0];
var fill = function (linkName) {
var ret = getElementsByClassName("MetadataManipulator-" + linkName, "li", mmul);
if (ret.length < 1) {
ret = document.createElement("li");
ret.className = "MetadataManipulator-" + linkName;
ret.appendChild(document.createTextNode(linkName));
} else {
ret = ret[0].parentNode.removeChild(ret[0]);
}
return ret;
}
// 順番を保証・これ以外の rel は copyright の次以降に。
var standard_link_rel = ["start", "prev", "next", "contents", "index", "glossary", "help", "copyright"];
var links = {};
standard_link_rel.each (function (i) {
links[i] = fill(i);
});
standard_link_rel.eachWithIndex (function (i, index) {
mmul.insertBefore(links[i], mmul.childNodes[0+index]);
});
with (mmul.parentNode) {
style.left = "-201px";
if (document.all && document.attachEvent) mmul.parentNode.addEventListener    = document_addEventListener;
addEventListener("mouseover", function (e) {
style.left = "0px";
}, true);
addEventListener("mouseout", function (e) {
style.left = "-201px";
}, true);
}

ながったらしい CSS との組み合わせです。see base.css

  1. トップ
  2. sw
  3. MetadataManipulator
  1. トップ
  2. web
  3. MetadataManipulator

alt="" になるような画像の存在意義がわからない。飾りとかは CSS の範疇だろうし、他に何かあったかなぁ……

  1. トップ
  2. web
  3. alt=""

前にツタヤにいったら音速ラインがちょっとだけピックアップされてて「へぇ~」とか思った。

少し前にツタヤいったらつばきがちょっとだけピックアップされてて「へぇ~」とか思った。

でもここで俺は思ったんだ。なんでメレンゲがピックアップされてないんだろう?って。ちなみに他にもマイナーアーティストがいくつかピックアップされてたけど、知っているのが音速ラインとつばきだけだった。

そして今日なんとなくツタヤいったら、メレンゲがちょっとだけピックアップされてた。軽く笑った。やっぱ同じクラスタなんだなぁ。っていうかこんなどうでもいいことが思い通りになってもなぁ……俺はもう一回小学校からやりなおしたいのに!

  1. トップ
  2. music
  3. ツタヤにて

あれってブラウザの表示領域のサイズじゃないんだよね。最近は 1280x1024 な解像度のモニタが多いけど、最大化してみてるやつなんて何割もいない気がする (あくまで想像)。だからアクセス解析で見られる解像度の割合なんて殆どあてにならないし、ましてはそれを参考にして 1280x1024 に最適化しました☆なんてやっちゃだめだ。なんの意味もない。

俺の場合表示領域を 900x600 ぐらいにして見ていることが多い。サイドバーを常時表示しているし、背面にある IRC クライアントを見たいのでこんな感じに。横幅広すぎると読みにくいしね。だから 1280x1024 推奨とか書いちゃってるページはよく横スクロールを求められる。やれやれ

あ、そもそも勘違いの可能性が。

っていうか RSS で読んでるサイトのトピックに「最適化しました☆」ってのがあったからなんとなく書いてみたんだけど、RSS で読んでるんだから関係ないな。頭おかしい

  1. トップ
  2. web
  3. アクセス解析で得る解像度の悪夢
  1. トップ
  2. css
  3. アクセス解析で得る解像度の悪夢

最近 Ruby 関連を経由して Io language を見ることが多くてなんかうれしい。別に Io 使ってるわけじゃないんだけど、好きだから。

  1. トップ
  2. prog
  3. Io and Ruby

ある日、爆弾が落ちてきて / 古橋秀之

とか友達に借りて読んでみた。

友達にはいろいろ借りまくっていて、この本についてだけ書くのは本に対して不平等だろ、とか思いつつ、まぁ、書くのにはそれなりの理由があるんじゃないかな、って誰かに聞いてみたりするんだけど、それは置いておくことにするよ。

某日記で時間系の話、と紹介さていて、しかも友達に聞いたら持っていて、なおかつ、「次会うとき貸すっていっただろ。このカスデコ野郎(意訳)」とか言われてそれなりに期待していたんだけど、期待していたわりに読んだ後気持ちいい (普通は期待ってのは裏切られるものなのだ) ので書くことにしたんだ、たぶんね。

「時間系」についてはあとがきで説明があるんだけど、実際それを感じるのは「むかし、爆弾がおちてきて」と「三時間目のまどか」ぐらいだ。他人の時間と、自分の時間との関係という点では全部だけど、それを言い出すと殆どの物語や小説は時間系になってしまうのでアレですね。

余計な設定を出さないで、ちゃんとぶっ飛んだ設定に必然性みたいなものを見出せるのがよかったと思う。こういう系の小説であんまりそういうの見かけない。

好きなのは後ろの三つ (出席番号0番・三時間目のまどか・むかし、爆弾がおちてきて) かな。とか思っていると、やっぱ俺はハッピーエンドが好きなのか?とか思っちゃうね。思ってるより俺は 単純なようだ。

  1. トップ
  2. book
  3. そうそう実はメガネ重要

今日見た夢。俺は女性だった。21歳。ちょっと前に書いたやつの効果?

  • サンダー
  • 小麦粉
  • 乳鉢
  • 日本地図
  • 自転車
  • 監視
  • 見つかる
  • 近道
  1. トップ
  2. life
  3. サンダーボルト

少し前にまた少しデザインが変わってたのは知っていたのだけど、ふと今日になって「 HTML ソースがまともな気がする」と俺の近くを浮遊している妖精さんが言ってきたので見てみたら、なんか普通によかった。

accesskey やら title 属性を活用しているし、CSS を切ると必要以上の画像はなし。デザイン的なものはちゃんと CSS に分離されてた。定義リスト使ったほうがよさげな部分があったりするけど普通的には関係ないところだろうなぁ。だがしかし、CSS ファイルの書き方は汚かった(謎

PLAN DE SENS っていう会社がデザインしているようだけど、コーディングもやってるんだろうか。謎だ。同じ会社の別のサイトを見てみたけど DreamWeaver で作られたと思わしき似非 HTML 4.01 なサイトばっかりだし、そもそも会社自体のページは Flash のみだし……

割とよく見る一般サイトがこういう風になってると感動しちゃうね。Valid であるぐらいはほんとは当たり前なのにね。

マイナーアーティストのウェブサイトとか作りたいなぁ。なんかこうかっこいいじゃん。

  1. トップ
  2. music
  3. www.bumpofchicken.com
  1. トップ
  2. web
  3. www.bumpofchicken.com

Audioscrobbler.net Web Services

気が付けばちゃんと profile 系のデータも提供されるように。でもさー、なんで Unix Time Stamp なんか出力するかなぁ。もったいない。ちょーもったいない。これのせいで直接 XSLT に入れても日付表示できん。いやできるの? 計算すればできるの? どんだけ面倒くさいの?

なんか微妙にズレてんなー。

どうでもいいけど Last.fm の tag 機能はいまいち使いづらいよっていつも思う。

あ、あと名前空間はつけて欲しいって思った。

  1. トップ
  2. web
  3. Last.fm webservice

Own your risk. の神ファーム (2.200) を入れてみる。

CD からアップデータをインスコ。update.txt に従い、本体の電池を抜いて、Play 押しながら USB 接続。新しいハードウェアのウィザードが起動するので Microsoft なんちゃらなドライバインスコ (インスコしていいかわからなくてハマった)。さらに Play 押しながらアップデータ起動してアップデート&フォーマット。

  • フォントは読みやすく。
  • 似非クロスフェード機能がなくなった。おかげで最初が切れなくなった。
  • USB はずしたあとになぜか起動されるのがなくなった。
  • SRS WOW - なんか気持ち悪い (ぬるぬるする(謎) のでたぶんあんまり使わない。
  1. トップ
  2. life
  3. YP-C1 ファーム入れ替え

俺は演算子の前後にスペースを入れない書き方が大嫌いなんだけど、for の括弧の中では例外的にスペースを入れないようにしていた時期があった。なんとなくまとまりのあるほうがいいかなぁって思っていたから。

でも最近 Javascript で var をちゃんと使うようにしてからはその変則的なルールをやめた。

for (var i=0; i<100; i++)
alert("pgr");
for (var i = 0; i < 100; i++)
alert("pgr");

var の後にはスペースがもちろん必須なわけで、そのあとに続く部分でスペースを空けないと var だけが浮いてしまう感じに見える。気持ち悪いのでスペースをあけるようにした。var とかない C でもスペースをあける。ほとんど同じ文法なのにスペースあける場所が違うとかは論外だからね。

  1. トップ
  2. prog
  3. for の括弧の中での演算子
  1. トップ
  2. script
  3. for の括弧の中での演算子

Color code のリファクタリング (というほどでもない)

やっぱり遅いので処理を見直し。なんだけどあんまりできそうなところがなかった。ちゃんとプログラム書ける人が見ればありそうだけど。

StringScanner 内 scan メソッドの無駄処理。作ったときから気になってた部分。scan メソッドはかなりの回数が実行されるので改善すればそれなりに効果があるはず……だけどあんまり変わらなかった。

// #改善前 2回正規表現マッチさせてる
var m = this.string.substring(this.pos).search(regexp);
if (m == 0) {
m = this.string.substring(this.pos).match(regexp);
// #改善後 一発で
var m = regexp.exec(this.string.substring(this.pos));
if (m && m.index == 0) {

ECMAScript の仕様を読み直してみたら Regexp.prototype.exec はマッチした位置をちゃんと設定してくれるらしい。はやく気付けと。

このスクリプトで有利なのは Opera8.5。実行途中でもちゃんとスクロールが効くし、上から順番に色が変わっていくのがわかる (遅いマシンでもストレスを感じない)。ただし速度は最悪。対して Firefox や IE は速度は Opera の数倍だけど実行中完全にブラウザごと固まる。ブラクラ候補。

かかった時間を pre や code の title 属性に入れてみることにした。[Time-Spend:66ms] とか出るよね? Perl がもっとも遅い (例のページの Perl の部分が Opera では10秒近くかかる)。なぜなら正規表現の数が多いから。同じクラスのやつを一つの表現にまとめれば早くなるだろうけど可読性が最悪中の最悪になるので見送り。

XML と Io はそこそこはやい。これは両方とも正規表現の数があんまりないから。XML はそれに加えて /[^<>\s]+/ を OTHER として読み飛ばしているのでループ回数が減ってる。

つーか、こんなことしなくても普通に正規表現だけかけて置き換えすればいいじゃんって話な気がしてきた。だめだこれ。

  1. トップ
  2. web
  3. pre, code の色づけ

音楽かけないで寝るとかなり高い確率で金縛りにあうというのを前に書いた気がする。金縛りっつうかいきなりレム睡眠的な睡眠導入。目をつぶった瞬間に体がずっしり重くなって、目を開けると部屋、まったく動けない。動け!!と何度か命令すると体が軽くなる。命令するというより勝手に命令される。

そんなこんなで眠れない感じのときに、別のことを想像しつつ目をつぶったらその場面そのまんまに自分が立っている状態になった。やべ、おもろいとか思いながらいろいろ (とても書けない) やってみたらいつのまにか寝てた。

状態を維持するには体が重くなるのを我慢しないといけない。ただし体が軽くなる感じがすると完全に寝てしまうのでぎりぎりで起きるように。うまくやれば1分ぐらい楽しい夢が見れる。結構バランスが難しい……

  1. トップ
  2. life
  3. 寝るか寝ないかのボーダー

いつのまにか Submission failed: Plugin bug: Not all request variables are set とか出ていた。サッパリ意味がわからないのでフォーラムを見てみると Submission failed: Plugin bug: Not all request variables are set - Foobar2000 - Last.fm とかいうスレがたっていた。んでその中にある ThePsycho 氏の投稿 の通りやってみたら、なおった。

  1. トップ
  2. music
  3. Audioscrobbler :Not all request variables are set
  1. トップ
  2. net
  3. Audioscrobbler :Not all request variables are set

やれやれ については再構築されて慣れたのだけど、今度は「ままならない」の意味がうまくとれなくなった……「ままならない」っていう語感は違和感がない。「ままならない」の意味が唐突に理解できなくなった。うむむ。ままならないなぁ?

  1. トップ
  2. life
  3. 今度は「ままならない」

新しい CSS を適用。ATH-W1000 をイメージして赤っぽく。

今までの CSS は昔書いたやつの流用だったのでちゃんと書いた。

Opera8.5 がなんかやたらぶっとんだ計算をしていて困った。のりさんCSS_Hacks を教えてもらい、CSS3 media queries を使うことに。このハックはいずれ Opera 以外のブラウザで表示が乱れるハックなので使いたくなかったけど……

ath-w1000.css。ファイル名のとおり ATH-W1000 イメージです。なんか色合いがスキなので。

デザイン自体は学校の講義一個潰して集中して作ったからなんともいえない感じに……しかも広いほうの端末室 (謎) で作ってたから覗かれていたかもしれない。覗かれていたらバレるかもしれない。何かが。

ほんとは、、、、へっどふぉんした、、、おんなのこの、、、しゃしんが、、、、つかいたかった!!!! (この写真男の子だよね? 外人よくわからん) とりあえず、だれか撮って Creative Commons で公開してけれ

ヘッドフォン娘 で検索すると2位にランクされるようになった。Cool URI のおかげ?

  1. トップ
  2. web
  3. Meta*Headphone-Girls の CSS