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 に代入された配列を削っていきます。ということで、この場合は、あ、い、う、と表示される。

当然。もっと自由に考えれば。
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()){}
なんてのも。
わざわざこんな処理に冗長な例ですが・・・。for 内の処理や条件を外部で、作成・変更できたりと、結構自由に使えます。ただ。やり過ぎると、深刻な混乱を招いたりするので、誰が見ても分かりやすい物にした方が無難かも。

私は遊びで使ったりします。ひょっとしたら嫌う人もいるかもしれない。
posted by HiFa at 03:01 | 🌁 | Comment(2) | TrackBack(0) | JavaScript雑感 | このブログの読者になる | 更新情報をチェックする

2007年02月21日

Javascript:Array オブジェクトの継承では length が予期しない値を返す

02/22 後尾に追記

アルファブロガー達※1が、一時取り上げていた3行の継承に関してですが、これで Array オブジェクトを複製しても組み込み済みのメソッドは、継承元でしか動作しないですね。

■ 試した関数
404 Blog Not Found さんより
javascript - プロトタイプ的継承

function object(o){
  function F(){}
 F.prototype = o;
 return new F();
}

※1 私だけの認識じゃないと思う。

続きを読む
posted by HiFa at 16:02 | 🌁 | Comment(0) | TrackBack(0) | JavaScript雑感 | このブログの読者になる | 更新情報をチェックする

2007年02月17日

Javascript:setTimeout による呼び出しは関数終了時ではない?

予定された時間になり、その時実行中の関数が終了すれば setTimeout/setInterval での呼び出しが実行されるという訳じゃないんですよね。

ネットでたまに見かけるのは、「function fn(){setTimeout(cb, 20); ・・・;} の場合、・・・の処理が終わって fn(); が終了していないと、20msec 経過しても cb は呼び出されない」などの内容で完結していることがありますが、実際は fn(); が終了していても呼び出されないことがあります。

ま。とある記事読んでいて、あれれ?と思ったので・・・。というか、自分自身も意識しないとそう言ってる。

続きを読む
posted by HiFa at 09:35 | 🌁 | Comment(0) | TrackBack(0) | JavaScript雑感 | このブログの読者になる | 更新情報をチェックする

2007年02月15日

Javascipt:関数ごとに終了状態をトレースしてゆく関数

関数終了時の変数の状態や arguments などを順次蓄積します。関数内の変数は簡易的にスキャンして、一括取得できるようになっています。
前回の「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() などを使って配列を詰めてもいいかも知れません。

■2009/04/24追記
変数を監視する場合はこちら
javascript:変数を監視する関数

続きを読む
posted by HiFa at 10:59 | 🌁 | Comment(0) | TrackBack(1) | JavaScript雑感 | このブログの読者になる | 更新情報をチェックする

2007年02月10日

Javascipt:関数が終了した後でもそのローカル変数が参照できる

2/15 追記:関数化はこちら「Javascipt:関数の状態をトレースする関数」

例えば、fn(){var v=1;}を起動・終了後に v が参照出来るんですが、さらにそれを汎用にしてしまったものです。元ネタは以下リンクですが、caller(呼出し元)も一応は記録しておくことが出来るんじゃないかと。

JavaScriptでDebugScreen、その2(最速インターフェース研究会さん)

1年前の古い記事です。つい今しがた見つけてw衝撃を受けましたんで色々イジってみる。いつも参考にさせてもらってます。m(_ _)m

続きを読む
posted by HiFa at 11:19 | 🌁 | Comment(0) | TrackBack(0) | JavaScript雑感 | このブログの読者になる | 更新情報をチェックする

2007年02月09日

Javascript:appendChild のタイミングで処理速度が変わる

createElemement や createTextNode で要素を生成して、すでに描画?されているオブジェクトに入れ込む場合、入れ込むタイミングによって処理速度が変わるようです。

1.生成した div 要素を、先に body へ appendChild してしまってから、div へテキストノードを入れ込む場合(bf とします)
01   obj = document.createElement('div');
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);

感覚的には、2の方が速いだろうと思うのですが・・・。
ちなみに div 要素ではなく createDocumentFragment の方が良いかも知れませんが、微妙に遅い感じです。ほとんど、誤差範囲内ではありますがw

テスト結果
posted by HiFa at 00:35 | 🌁 | Comment(0) | TrackBack(0) | JavaScript雑感 | このブログの読者になる | 更新情報をチェックする

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 で設定可能です。

ずっとこれで通してきてます。
んが。実は、一般的な手法を知りたかったんですが、調べてもちょっと見つからなかったので、私なりのやり方です。
うーん。普通にコア関数があるのだろうか、見落としてるハズないんだけどなぁ。
posted by HiFa at 11:54 | 🌁 | Comment(0) | TrackBack(1) | ときどきPHP | このブログの読者になる | 更新情報をチェックする

2007年01月30日

インラインフレームの読み込みに失敗することがある

HTML の a 要素で、onmousedown を使ってインラインフレームを読み込むと、読み込みに失敗することがあります。イベントが発生するタイミングが問題なのだろうと思いますが、href に何を入れるかによっても異なります

とりあえず、a タグでインラインフレームを書き換える場合、簡単に4つ試しました。
<a href="javascript:void(0);" onmousedown="func();">
<a href="javascript:void(0);" onclick="func();">
<a href="#" onmousedown="func();">
<a href="#" onclick="func();">


結局のところ、onclick を使えばいいのですが、世の中にはやっかいなプラグインがありまして・・・。全く関係の無い a タグを onclick してもページ遷移と誤解するのか、勝手に終了しちゃう奴があったりします。

続きを読む
posted by HiFa at 13:19 | 🌁 | Comment(0) | TrackBack(0) | JavaScript雑感 | このブログの読者になる | 更新情報をチェックする

2007年01月27日

php:配列の次元数を調べる関数

配列がもつデータ(配列)のうち最大の深度を調べる関数です。
配列の各要素をスキャンして、その値が配列だった場合に、再帰的に再度スキャンします。これを繰り返して最大の深度(次元数)を調べます。

値渡し/参照渡し、どちらが有利かまでは考慮してません。php バージョンによって異なる可能性もあります。必要であれば適宜改造してください。ま、この程度のもので気にすることもないですね。巨大な配列で無い限り問題にはならないと思います。

巨大な配列の場合はアルゴリズム自体も見直す必要があります。
コードを簡易化するために関数のオーバーヘッドが、1回余分に掛かかるような処理が入ってます。など。

続きを読む
posted by HiFa at 11:02 | 🌁 | Comment(0) | TrackBack(0) | ときどきPHP | このブログの読者になる | 更新情報をチェックする

2007年01月20日

Javascript:クエリストリングからパラメータ配列を生成する関数とその逆の関数

クエリストリング(URL の後尾 '?' 以降の文字列:Query String)を連想配列にする関数と、連想配列から Query String を作成する関数。

Javascript は「連想配列」ではありませんけど、この程度なら実質同じかなw
ま、知ってれば持ってる or サラっとやってのけられる関数です。

■ Query String について一応簡単に

http://www.google.co.jp/search?
   hl=ja&q=url+%E3%82%AF%E3%82%A8%E3%83%AA

など、上の場合 '?' 以降の文字列(QueryString)は、単に

 hl = ja
 q = url クエリ

と言う情報をネット上で使うのに問題の少ない文字列に直したものです。url にくっ付けてページ間で簡易なデータの受け渡しをしています。
続きを読む
posted by HiFa at 18:07 | 🌁 | Comment(0) | TrackBack(1) | JavaScript雑感 | このブログの読者になる | 更新情報をチェックする

2007年01月10日

Seesaa の 標準のアフィリエイト

って、ぜんっぜん眼中に無かったんですが、コンテンツにあわせてマッチしてくれるというコンテンツマッチ広告と言う物があるんですね。

なんか色々キャンペーンをやってるし、今までなんとなーく表示させていて気に留めていなかったんですよ。で。ふと見ると。
ステンレス製多目的ボックス!?全然マッチしてねー!!
なんで「癒しと健康をサポート」なんだよ。
正直、愕然としましたよ。これをマッチと言うのか!?と。。。

んで。一体何人がクリックしてんだろと見てみりゃトータルで1円・・・。
ははは。いくら眼中に無くってもね。1円って。自分でクリックした奴ジャン。

ま、ここの目的はアフィリエイトじゃないんだからいいけどね。んでも興味なくても見るべきだったよ。色々と。無意味〜な広告ずっと載せてたのよね。

役に立たんもんばかりUPしててもなぁ。消したら消したで寂しいし。
ということで。しゃーないので自分で選出しました。www(参考書籍)

もうアフィリエイトというより枯葉も山の賑わい状態だわw
posted by HiFa at 00:21 | 🌁 | Comment(0) | TrackBack(0) | よもやま | このブログの読者になる | 更新情報をチェックする

2007年01月09日

衝撃的なキーワード

ふと。どんなキーワードで検索されるのかと seesaa 付属のアクセス解析を覗いてみたんですが・・・。
オナニーがしたくなる動画 アクセス数 !?
なんじゃそりゃぁぁぁ!!!

ま、同一人物なのは間違いないんですが、一体どこでどう検索したらこうなるのだろうか。カウントされてた検索サイトでは実際に試しても出てこなかったよ^^;;;
なぞだ・・・。
posted by HiFa at 18:03 | 🌁 | Comment(0) | TrackBack(0) | よもやま | このブログの読者になる | 更新情報をチェックする

2007年01月06日

Javascript:ちょっと便利な String の拡張

String オブジェクト(文字列)のちょっと便利な拡張を4種類。
  1. 文字数のカウント。
  2. 文字列にある全ての文字列 s1 を s2に置き換える。
  3. 文字列を反転させる。
  4. 文字列から数値を全て抜き出す。(文字配列として返す)
どっかのライブラリに似たようなものあるかも知れんけど。ま、いいっしょ。続きを読む
posted by HiFa at 01:43 | 🌁 | Comment(0) | TrackBack(0) | JavaScript雑感 | このブログの読者になる | 更新情報をチェックする

2006年12月24日

php : 文字エンコーディング関連

イブ前夜に何やってんだか。って、あ、もう12時回ったかw
ま、所帯持ちにゃかんけーねーや。w
あー。なんかいーことしてぇー(爆)


最近、自分の文字エンコードに関する知識の浅さに打ちのめされて、再度勉強中なんですが・・・。はぁ。思ったとおり、めんどーですね。

スクリプトからできるだけ制御しようと思っているんですが、結構考慮すべき関数や設定値が多い。ということで、文字エンコードに関して考慮すべきことや覚え書き。

環境
windows xp sp2
apache 2.0.53
php4 version 4.4.2

続きを読む
posted by HiFa at 02:07 | 🌁 | Comment(0) | TrackBack(0) | JavaScript雑感 | このブログの読者になる | 更新情報をチェックする

2006年12月18日

PHP : オブジェクトメソッドを指定する可変関数について

オブジェクトメソッドを指定する可変関数について、前回流した分の補足です。
前回はこちら

例えば、$obj->ex = 'sleep'; として $obj->ex(); としても sleep は使えないですよね。ま、当然の話しで、オブジェクトメソッドを指定しているのに、オブジェクトにそのメソッドが無い。
※ $obj に sleep というメソッドがあれば call 出来ます。

実際に書いてみたのが以下のコード。書くまでも無くエラーになりますw

続きを読む
posted by HiFa at 17:10 | 🌁 | Comment(0) | TrackBack(0) | ときどきPHP | このブログの読者になる | 更新情報をチェックする

PHP4コアでメソッドの動的な追加

PHP4 コアのみで、PECLの runkit 関数を使わずにメソッドの動的な追加(っぽい事)をやってみます。

登録した関数をオブジェクト内部から呼び出す事と、メソッドの動的な生成です。

同日修正:コード修正しました。
すみません。ポカミスってました。呼び出される関数で $this に受け取っていたので、$slf へ受け取ります。

■ 2009/04/24追記
php:インスタンスのクラスを変えてしまう
こういうやり方でも擬似的に追加や変更が出来る

続きを読む
posted by HiFa at 03:55 | 🌁 | Comment(0) | TrackBack(0) | ときどきPHP | このブログの読者になる | 更新情報をチェックする

2006年12月15日

PHP のマニュアル

最近、久々に PHP 使ってるんですが、PHP のマニュアルってホント親切で分かりやすい

文字セットについて再確認しようとざーっと読んだんですが、かの Javascript 仕様書との違いに涙が出そうになるw  いやぁ。ビバ! PHPユーザ会!

ん!?javascript 仕様書面倒じゃない?
そんな意見は無視で。私的に相性が合わないんすよ。なんでかなー。

それでもスクリプト自体は Javascript の方が面白い!これ断然!

あのいい加減さじゃなくってw   柔軟性がたまらん。prototypeってのもいい(ちゃんと理解してるか怪しいもんだが・・・)関数ですら単なる値!としていじくり倒せるのが楽しい。
でも、クロスでめちゃめちゃな所はちょっとキライw

ま、このカチっとしてない得体の知れない感じが、嫌いな人も多いんだろーなぁ。

結局、ドキュメントオブジェクトとの関連やコードの軽量化のためにあーなってるんだろうと推測しているんですけどね。
そんなのは、どーでもいい事です。楽しけりゃw

なんて言ってても、カチっとした所にくると、それはそれでホッとするのもまた事実。いやぁ。結局はどっちも楽しいんだろーなw。
posted by HiFa at 13:30 | 🌁 | Comment(0) | TrackBack(0) | よもやま | このブログの読者になる | 更新情報をチェックする

2006年12月12日

php : mbstring.encoding_translation って痛いかも?

mbstring.encoding_translation って意外と曲者

例えば php.ini で。
mbstring.internal_encoding = EUC-JP
mbstring.encoding_translation = On


なんて感じになっていると、php コードの頭に
mb_internal_encoding("UTF-8");

と指定しても POST されたデータなんかは UTF-8 にならない。
当たり前だけど、時すでに遅し。プロセスがデータ受け取る時にはすでに EUC にエンコードされちゃってる。

EUC でしかドキュメント作らねーなんて今までが平穏&ラッキー過ぎた。こんなしょーもないことでえらい事悩んでしまった・・・。

デフォじゃ off だけど、有効にしてるレンサバって多いのかなぁ。
ini_get で、mbstring.encoding_translation 見て動作変えるのって、結構重要かも。

ひっさびさの php だ。
何ヶ月ぶりだろ。このブログじゃ初だわw

今までなんとなーく EUC を使ってたんだけど、やっぱ UTF-8 っしょってな具合で重い腰を上げたんですけどね。(重すぎかぁ!?)
やっぱ場当たり的な対応で逃げてるとダメですね。文字にゃ苦労してる割に身になってない・・・。
posted by HiFa at 23:34 | 🌁 | Comment(0) | TrackBack(0) | ときどきPHP | このブログの読者になる | 更新情報をチェックする

2006年11月17日

動的な JavaScript の生成と読み込み&入れ替え

以前 src や text を使って javascript の動的な読み込みや書き込みをしたんですが、そのサンプルと安全性?クロス?な調査です。

前回の記事はこちら
トウヘル さんから safari の情報を頂いています。

関数(09/12/26)
javascript:同期/非同期で動的なjavascriptの読込み3種
※ コードは url 指定


実際の所、createElement なんぞしなくても空の script タグ書いて、getElementsByTagName や、getElementById で取得したエレメントに src や text を突っ込んでやれば幾らでも「動的な読み込み」や「書き込み」は可能です。

ちなみに ie は、何度も書換えられますが、FireFox はどうやら1回だけ。1度読んでしまうと上書きのようなことは出来ないようです。実際、スクリプトエレメントを削除しても生きているようです。


続きを読む
posted by HiFa at 00:18 | 🌁 | Comment(0) | TrackBack(0) | JavaScript雑感 | このブログの読者になる | 更新情報をチェックする

2006年11月14日

最終形態?自由に繰返す関数として複製(遅延/繰返し/回数指定して function を複製する3)

1,2を包含して、さらに機能アップした機能過多w関数を作成しました。
但し、最初一回目は遅延させません。

繰り返しの場合は、1回目の遅延なんてやはりレアケースですねw
機能的には以下です。

  1. インターバル時間、呼出回数を指定して関数を複製する。
  2. 関数に現在の呼出回数を渡すことができる。
  3. 関数に予定された呼出回数と呼び出し間隔を渡すことができる。
  4. 関数から、予定された呼出回数と呼び出し間隔が随時変更できる。
  5. 終了時に他関数を起動できる。
  6. 関数が false を返せば、止められる。
  7. 関数が false を返さず、回数指定もなければ延々と繰り返す。
  8. 入れ子でも、this.self で this を取得できる。
  9. 入れ子でも、各段階の予定された呼出回数と呼び出し間隔が、関数から取得・変更できる
※ 上記での「関数」とは、複製された関数になります。

前回、ほぼ最終形とのたまったのは誰だったのか・・・
ま、色々いじってるとどんどん欲が出てくるw


■ 動作確認
IE 4.0/5.0/5.5/6.0
FF 1.0/1.5
NS 6.2/7.1
OP 7.02/8.53/9.01
Sleipnir 2.30

続きを読む
posted by HiFa at 16:38 | 🌁 | Comment(0) | TrackBack(0) | JavaScript雑感 | このブログの読者になる | 更新情報をチェックする