XMLHttpRequest を使って取得したバイナリーデータ(画像)をブラウザに表示してみました。firefox のみ。
JavaScriptでバイナリを扱う &
XPCOMを使ってローカルのデータベースにアクセス with Firefox
の記事を読んでいて、そういや Ajax ではどうなん?と思ってやってみた。
■ 他に参考にしたのは以下の記事。
[comp]JavaScriptでバイナリファイルの中身にアクセスできた
■ base64 エンコードには下記のコードを使いました。
JavaScript で Base64 の符号化と復号化
続きを読む
2007年02月28日
2007年02月26日
2007年02月25日
Javascript:for のちょっと変わった使い方
for(var i = 0; i < 10; i++){処理・・・}
for(var i in object){処理・・・}
なんてのは、よく目にしますが・・・。
for(var i = ['あ', 'い', 'う']; i[0]; i.shift()){ alert(i[0]); }
これでも。i に配列を代入して、i[0] が false を返すようなものではない間、shift で i に代入された配列を削っていきます。ということで、この場合は、あ、い、う、と表示される。
当然。もっと自由に考えれば。
わざわざこんな処理に冗長な例ですが・・・。for 内の処理や条件を外部で、作成・変更できたりと、結構自由に使えます。ただ。やり過ぎると、深刻な混乱を招いたりするので、誰が見ても分かりやすい物にした方が無難かも。
私は遊びで使ったりします。ひょっとしたら嫌う人もいるかもしれない。
for(var i in object){処理・・・}
なんてのは、よく目にしますが・・・。
for(var i = ['あ', 'い', 'う']; i[0]; i.shift()){ alert(i[0]); }
これでも。i に配列を代入して、i[0] が false を返すようなものではない間、shift で i に代入された配列を削っていきます。ということで、この場合は、あ、い、う、と表示される。
当然。もっと自由に考えれば。
var o = {
v : 2,
fn : function (){this.v = this.v * 2},
en : function (){
if(this.v < 10) return true;
alert(this.v);
}
};
for(; o.en(); o.fn()){}
なんてのも。v : 2,
fn : function (){this.v = this.v * 2},
en : function (){
if(this.v < 10) return true;
alert(this.v);
}
};
for(; o.en(); o.fn()){}
わざわざこんな処理に冗長な例ですが・・・。for 内の処理や条件を外部で、作成・変更できたりと、結構自由に使えます。ただ。やり過ぎると、深刻な混乱を招いたりするので、誰が見ても分かりやすい物にした方が無難かも。
私は遊びで使ったりします。ひょっとしたら嫌う人もいるかもしれない。
2007年02月21日
Javascript:Array オブジェクトの継承では length が予期しない値を返す
・ 02/22 後尾に追記
アルファブロガー達※1が、一時取り上げていた3行の継承に関してですが、これで Array オブジェクトを複製しても組み込み済みのメソッドは、継承元でしか動作しないですね。
■ 試した関数
404 Blog Not Found さんより
javascript - プロトタイプ的継承
※1 私だけの認識じゃないと思う。
続きを読む
アルファブロガー達※1が、一時取り上げていた3行の継承に関してですが、これで Array オブジェクトを複製しても組み込み済みのメソッドは、継承元でしか動作しないですね。
■ 試した関数
404 Blog Not Found さんより
javascript - プロトタイプ的継承
function object(o){
function F(){}
F.prototype = o;
return new F();
}
function F(){}
F.prototype = o;
return new F();
}
※1 私だけの認識じゃないと思う。
続きを読む
2007年02月17日
Javascript:setTimeout による呼び出しは関数終了時ではない?
予定された時間になり、その時実行中の関数が終了すれば setTimeout/setInterval での呼び出しが実行されるという訳じゃないんですよね。
ネットでたまに見かけるのは、「function fn(){setTimeout(cb, 20); ・・・;} の場合、・・・の処理が終わって fn(); が終了していないと、20msec 経過しても cb は呼び出されない」などの内容で完結していることがありますが、実際は fn(); が終了していても呼び出されないことがあります。
ま。とある記事読んでいて、あれれ?と思ったので・・・。というか、自分自身も意識しないとそう言ってる。
続きを読む
ネットでたまに見かけるのは、「function fn(){setTimeout(cb, 20); ・・・;} の場合、・・・の処理が終わって fn(); が終了していないと、20msec 経過しても cb は呼び出されない」などの内容で完結していることがありますが、実際は fn(); が終了していても呼び出されないことがあります。
ま。とある記事読んでいて、あれれ?と思ったので・・・。というか、自分自身も意識しないとそう言ってる。
続きを読む
2007年02月15日
Javascipt:関数ごとに終了状態をトレースしてゆく関数
関数終了時の変数の状態や arguments などを順次蓄積します。関数内の変数は簡易的にスキャンして、一括取得できるようになっています。
前回の「Javascipt:関数が終了した後でもそのローカル変数が参照できる」を発展させて、関数に eval(getChain()); と記述するだけで、トレース出来るようにしたものです。
機能は以下になります。
ie 5.0, 5.5, 6.0, 7.0
ff 1.0, 1.5, 2.0
ns 7.1
※ opera は caller が無いため動作しません。
参考:http://www.opera.com/docs/specs/js/ecma/
■ 注意点
対象とする関数が起動されるたびに延々と蓄積し続けます。
Array.shift() などを使って配列を詰めてもいいかも知れません。
続きを読む
前回の「Javascipt:関数が終了した後でもそのローカル変数が参照できる」を発展させて、関数に eval(getChain()); と記述するだけで、トレース出来るようにしたものです。
機能は以下になります。
- arguments, caller, callee を保存
- 終了時の変数の値を個別・一括で取得
- 複数の関数の終了時の状態を起動順序ごとに配列へ蓄積
ie 5.0, 5.5, 6.0, 7.0
ff 1.0, 1.5, 2.0
ns 7.1
※ opera は caller が無いため動作しません。
参考:http://www.opera.com/docs/specs/js/ecma/
■ 注意点
対象とする関数が起動されるたびに延々と蓄積し続けます。
Array.shift() などを使って配列を詰めてもいいかも知れません。
続きを読む
2007年02月10日
Javascipt:関数が終了した後でもそのローカル変数が参照できる
2/15 追記:関数化はこちら「Javascipt:関数の状態をトレースする関数」
例えば、fn(){var v=1;}を起動・終了後に v が参照出来るんですが、さらにそれを汎用にしてしまったものです。元ネタは以下リンクですが、caller(呼出し元)も一応は記録しておくことが出来るんじゃないかと。
JavaScriptでDebugScreen、その2(最速インターフェース研究会さん)
1年前の古い記事です。つい今しがた見つけてw衝撃を受けましたんで色々イジってみる。いつも参考にさせてもらってます。m(_ _)m
続きを読む
例えば、fn(){var v=1;}を起動・終了後に v が参照出来るんですが、さらにそれを汎用にしてしまったものです。元ネタは以下リンクですが、caller(呼出し元)も一応は記録しておくことが出来るんじゃないかと。
JavaScriptでDebugScreen、その2(最速インターフェース研究会さん)
1年前の古い記事です。つい今しがた見つけてw衝撃を受けましたんで色々イジってみる。いつも参考にさせてもらってます。m(_ _)m
続きを読む
2007年02月09日
Javascript:appendChild のタイミングで処理速度が変わる
createElemement や createTextNode で要素を生成して、すでに描画?されているオブジェクトに入れ込む場合、入れ込むタイミングによって処理速度が変わるようです。
1.生成した div 要素を、先に body へ appendChild してしまってから、div へテキストノードを入れ込む場合(bf とします)
2.生成した div 要素をにテキストノードを入れ込んだ後に、body へ appendChild する場合(af とします)
感覚的には、2の方が速いだろうと思うのですが・・・。
ちなみに div 要素ではなく createDocumentFragment の方が良いかも知れませんが、微妙に遅い感じです。ほとんど、誤差範囲内ではありますがw
テスト結果
1.生成した div 要素を、先に body へ appendChild してしまってから、div へテキストノードを入れ込む場合(bf とします)
01 obj = document.createElement('div');
02 document.body.appendChild(obj);
03 obj.appendChild(document.createTextNode('string'));
02 document.body.appendChild(obj);
03 obj.appendChild(document.createTextNode('string'));
2.生成した div 要素をにテキストノードを入れ込んだ後に、body へ appendChild する場合(af とします)
01 obj = document.createElement('div');
02 obj.appendChild(document.createTextNode('string'));
03 document.body.appendChild(obj);
02 obj.appendChild(document.createTextNode('string'));
03 document.body.appendChild(obj);
感覚的には、2の方が速いだろうと思うのですが・・・。
ちなみに div 要素ではなく createDocumentFragment の方が良いかも知れませんが、微妙に遅い感じです。ほとんど、誤差範囲内ではありますがw
テスト結果
2007年02月08日
php:バイト数の取得(strlen は mb_strlen にオーバーロードされる)
strlen が mb_strlen にオーバーロード(置換)されてしまっている場合でも支障なくデータのバイト数を取得する方法です。
環境によっては strlen は ms_strlen にオーバーロードされているんですが(マニュアル:XCIV. マルチバイト文字列関数)、そんな場合、データのバイト数を取得するのに通常はどうするのでしょう?
$volm = strlen(bin2hex($data)) / 2;
$data:バイト数を取得したいデータ
$volm:データ長(byte)
これでマルチバイトのテキストでも画像でも、バイト数を取得できます。当たり前ですが。
ちなみに関数のオーバーロードに関する設定(mbstring.func_overload)は、ユーザスクリプトからはできません。php.ini か .htaccess、httpd.conf で設定可能です。
環境によっては strlen は ms_strlen にオーバーロードされているんですが(マニュアル:XCIV. マルチバイト文字列関数)、そんな場合、データのバイト数を取得するのに通常はどうするのでしょう?
$volm = strlen(bin2hex($data)) / 2;
$data:バイト数を取得したいデータ
$volm:データ長(byte)
これでマルチバイトのテキストでも画像でも、バイト数を取得できます。当たり前ですが。
ちなみに関数のオーバーロードに関する設定(mbstring.func_overload)は、ユーザスクリプトからはできません。php.ini か .htaccess、httpd.conf で設定可能です。
ずっとこれで通してきてます。
んが。実は、一般的な手法を知りたかったんですが、調べてもちょっと見つからなかったので、私なりのやり方です。
うーん。普通にコア関数があるのだろうか、見落としてるハズないんだけどなぁ。
んが。実は、一般的な手法を知りたかったんですが、調べてもちょっと見つからなかったので、私なりのやり方です。
うーん。普通にコア関数があるのだろうか、見落としてるハズないんだけどなぁ。

