2011年10月18日

javascript:関数で別の関数をクロージャ化してローカル変数を与える

関数をクロージャ化してローカル変数を与えてみる。
※ ローカル変数云々というより、関数を encloser でラップして、スコープチェーンを encloser につなげるって言った方がいいのかな。(同日追記)

function f(){
  alert(v);
}


辿れるスコープ内に v という変数が無ければ、v は当然 undefined。
で、以下の関数。

function encloser(){
  eval('var ' + arguments[1] + ' = "' + arguments[2] + '";');
  return eval('arguments[0] = ' + arguments[0]); // ※ () 追加では ie が ng
}

※ とりあえず string のみ対応。json 化すれば object でも。

この encloser関数にさきほどの f関数を渡してやると……。

f = encloser(f, 'v', 'I am closer!');
f(); // I am closer!


v に値が入れられる。

続きを読む


posted by HiFa at 14:01 | 愛知 ☀ | Comment(0) | TrackBack(0) | JavaScript雑感 | このブログの読者になる | 更新情報をチェックする

2011年10月12日

PHP:array_key_existsより array自体がヤバいんじゃないか?

互換性のために作った array_intersect_key を見直していて、ふと不思議な文をマニュアルに見つけた。それが下の一文。

「二つの要素は、 (string) $elem1 === (string) $elem2 の場合のみ等しいとみなされます。言い替えると、厳密なチェックが行われるため、文字列表現が同じである必要があります。」
(つたない英語力だが英語サイトも同様)
ref) http://www.php.net/manual/en/function.array-intersect-key.php

一瞬「え?」です。

ここで配列の基本の幾つか。

  1. key は、整数 または 文字列です。

  2. 整数の標準的な表現形式である場合、 そのように解釈されます (つまり、"8" は 8 として解釈されます。一方、 "08" は "08" として解釈されます)。


ref) http://www.php.net/manual/ja/language.types.array.php

つまり、厳密であろうと曖昧であろうと、key は「重ならない」と思っていたわけです。つまり array(1 => value1, "1" => value2) と定義しても array(1 => value2) と解釈される。そのため array_key_exists に strict が無くても問題はなく、isset のような恐ろしく曖昧なものより信用していたんですね。それなのに array_intersect_key の場合は、string への型変換後に厳密なチェック云々とはどういうこっちゃ? と。array の性質上すでに解決済みのハズ。

で、この前書いた。
PHP:array_key_exists のバグ?
http://zombiebook.seesaa.net/article/228944224.html
がまざまざと蘇る訳です。
しょーがなので、イヤイヤ試すと案の定といいますか……。
(※ 今回は Windows, php 5.2.4 のみで検査です)

array(
 '2147483647' => int 0,
 2147483647 => int 0,
);

あらまあやっちゃってるよ。コノ人。上記2のルールが解決されてない。そう思うと array_key_exists には strict だとどこにも書いてないが、strict だとしたらそっちのほうが正しい動きをしていた訳だ。むしろ array が悪い子じゃん。まあ、内部的にいつ解釈されるのか知りませんが、var_dump の結果です。

本来なら。
array(
 2147483647 => int 0,
);
になるはず。

これ放置するのオカシイよね? こんな基本的な事ホントに既知じゃないの? 5.2 までスルー? それとも私が何か読み落としてる?

既知かどうか、色々調べようかと思ったけど……。
なんだかどうでも良くなってきた。ハァ……。php 嫌いじゃないんだけどねぇ。なんだか型宣言が必要な言語が懐かしくなってきたよ。

ちなみに1
int max は設定できる。これを設定しなおすとどうなるか不明。

ちなみに2
キーが想定できない場合 $ary[$key] で走査する部分は危険かもしれない。具体的には for や foreach よりも each でペアを取った方が安全。もう調べる気力も試す気力もないが。

個人的に以下はエラーにすべきだと。検査してはいるが存在自体気分悪い。
key に浮動小数点数値を指定すると、 その値は integer に切り詰められます。キーとして TRUE を使用した場合、 整数型の 1 がキーとして解釈されます。 キーとして FALSE を使用した場合、 整数型の 0 がキーとして解釈されます。 キーとして NULL を使用した場合、 空の文字列として評価されます。


posted by HiFa at 00:31 | 愛知 ☁ | Comment(0) | TrackBack(0) | ときどきPHP | このブログの読者になる | 更新情報をチェックする

2011年10月08日

CSSハックは使わないようにしてます

タイトルは下請選定のための業者プレゼンが行われた時の発言。

主流はどうか分からないけれども、自分は CSSハックは極力使わない。むしろ cssハックを使ったスタイルシートを渡された時には、将来、不具合発生時に javascriptにあらぬ疑いをもたれるのが嫌で修正を提案するぐらい。それほど嫌。

でも「cssハックぐらい使えないとねぇ」と言われるとやっぱり凹む。

使えないんではなく使わない。ググってみれば cssハックのリストは幾らでも転がってる。それに自分はコーダーでもデザイナーでもなくプログラマ(請負わざる得ない低予算もかなり多いが^^;;;)ま、請負っている以上、プログラマ主張してもしょーがないがw

ただ、悪い事ではないハズなのになぜかテンパってしまうんだよね。プレゼン慣れしてないのが不味いんだろうけどね。デザインは良いとして、切り分けで意味不明な事して、苦し紛れに cssハック使ってる事って……、かなり多い。多分、コード見てイラっとする人も多いんじゃないかな?

cssハックは諸刃なのをもうちょっと意識して欲しいかな、なんて思う今日この頃。結局、小手先というかその場しのぎだもんねぇ。とはいえ、自分のコードも決して美しくない、というかむしろ汚いが……。言うか言わぬかいかんとも、ではあったりする^^;;;

古い記事だけども
CSSハックしてはいけない5つの理由
http://journal.mycom.co.jp/news/2009/03/05/040/index.html

posted by HiFa at 17:23 | 愛知 ☀ | Comment(0) | TrackBack(0) | よもやま | このブログの読者になる | 更新情報をチェックする

2011年10月06日

PHP:array_key_exists のバグ?

array_key_exists('2147483647', array(2147483647 => 1));

が true にならない……。(バグ?)
知っての通り array_key_exists は strict ではない。
ということで、2147483647 から 1 を引いた

array_key_exists('2147483646', array(2147483646 => 1));

では true になる。(期待通り)
そこで、面白いことに

array_key_exists('-2147483647', array(-2147483647 => 1));

も true。(期待通り)
これは 32bit 版固有の問題で、整数型の取りうる範囲が-2147483647〜2147483647までだから、「2147483647」という値に起こったのだと思う。これは既知のバグなのだろうか? 徹夜の追い込み中で調べる気力がないので、ここでメモw

一応調査した環境は
CPI Linux, php 5.1.6
Xserver Linux, php 5.1.6
XREA Linux, php 5.2.5
Windows, php 5.2.4

SAKURA FreeBSD, php 5.2.17

ただし! 最後の SAKURA は期待通り true になった! ふぅ。なんじゃそりゃ^^;;; php 5.3以上ではどうだろう。誰か知ってる人コメください。
ところで整数型で -2147483648 を作るには……

var_dump(-2147483647); // int -2147483647 <-- int 扱い
var_dump(-2147483648); // float -2147483648 <-- float 扱い
var_dump(1073741824 << 1); // int -2147483648 <-- int になったw
posted by HiFa at 05:10 | 愛知 ☔ | Comment(0) | TrackBack(0) | ときどきPHP | このブログの読者になる | 更新情報をチェックする