Hatena::ブログ(Diary)

外付Web海馬

08/16/2010

WebSocketをサクっと試すはずだった。

なのに

mod_pywebsocket 0.5.2 と Google Chrome 5.0.375.126 で echo_wsh が 動かない人(co-sche)へ。

# httpd.conf とか
PythonOption mod_pywebsocket.allow_draft75 On

これ、忘れてないっすか><

echo_client.pyなら動くのに…って時は要チェックです。

差分の内どこが原因なのかまでは確認出来ていないのですが、上記のバージョンの組み合わせだと

の違いによってデフォルトではハンドシェイクがウマくいかなくなっているみたいです。

最初っから、pydocちゃんと読めよ、俺…。

ちなみに

現時点でWebSocket Protocolの最新のドラフトhttp://www.whatwg.org/specs/web-socket-protocol/にあります。

07/29/2010

綺麗なバラにゃトゲがある

for (var i = 0, elem; elem = elems[i]; i++) { doSomething(elem) }って書き方見やすくていいな - JavaScriptとかPerlとかPHPとかさくらVPSとか勉強するで紹介されている記事に、ちょっとツッコミます。

元記事の紹介

ノードリストのイテレート - Google JavaScript Style Guide 和訳

var paragraphs = document.getElementsByTagName('p');
for (var i = 0, paragraph; paragraph = paragraphs[i]; i++) {
  doSomething(paragraph);
}

これはすべてのコレクション, 配列に対してうまく動きます. 要素がなくなるまでループし, 最後には false となりループが終了します.

落とし穴

代入文が値を返すことを利用した美しいコードで、getElementsByTagNameで取ってきたノードリストのイテレートには有用ですが、以下のような例では初っ端でコケちゃいます><

var list = [0, 1, 2, 3];
for (var i = 0, item; item = list[i]; i++) {
	doSomeThing(item);
}

なので…

Tips and Tricks - Google JavaScript Style Guide

This works well for all collections and arrays as long as the array does not contain things that are treated as boolean false.

↑の原文は

↓のように訳したほうがよさそうです。

[追記]現在は修正されています。コメント欄にも書いたように、本来は訳者のid:cou929_laさんにフィードバックを送るべきでした。[/追記]

これは、配列が真偽値のfalseとして扱われるものを含まない限り、全てのコレクションや配列に対してうまく働きます。

…って、原文にはちゃんと書いてありますね。

03/18/2010

Scalaめっちゃ気持ちいい

ECMAScript4の頓挫以来探し求めていた、サクッと書けそうな言語にようやく出会えました。
Scalaです。

希望していた特徴

おまけについてきて嬉しかった特徴

今ひとつな特徴

個人には非常に書きやすい言語なので、各OSネイティブの実装が出て来て(他力本願><)、Python並に普及してくれればとてもうれしいんですが…。
Programming in Scalaの邦訳書を購入したので、もうちょっと掘り下げて勉強してみます。

11/19/2009

in_arrayのややこしい版

仕事で必要に駆られて書いてみました。

イメージとしては、タイトル通りin_arrayに複雑な条件を指定出来るようにしたもので、
第一引数配列のネストレベルが深くなる毎に、and/orをトグルしながら検索していきます。

思い出しながらなので、こんなんだったかどうか微妙><

使い方

<?php
/* 検索条件 */
$needles = array(1, 2, array(3, array(4, 5)));

/* 検索対象を変えながらテスト */
echo in_array_ex($needles, array(1, 3, 2));	// true
echo in_array_ex($needles, array(1, 4, 2));	// false
echo in_array_ex($needles, array(4, 5, 1, 2));	// true

?>

ソースコード

<?php
function in_array_ex(Array $needles, Array $haystack, $logical_op = 1) {
	if (empty($needles)) return $logical_op;
	$needle = array_shift($needles);
	
	$tmp;
	if (is_scalar($needle)) $tmp = in_array($needle, $haystack);
	else if (is_array($needle)) $tmp = in_array_ex($needle, $haystack, !$logical_op);
	else throw new Exception(
		'The 1st argument must be an array of mixed in array, and scalar.'
	);
	
	if ($logical_op) return $tmp && in_array_ex($needles, $haystack, $logical_op);
	else return $tmp || in_array_ex($needles, $haystack, $logical_op);
}
?>

概要と使い道

眠いのでまた後日…><

10/30/2009

phpの可変長引数についていろいろ

仕事でphpを書くようになって、今まで触れていた言語とのいろんなお作法の違いによく躓く毎日です><
結構長時間ハマった部分があったので、メモメモ。

今回は、phpで可変長引数を受け取ったり渡したりする方法について、JavaScriptとの対比で見ていきます。

先ずは、受け取る方から。

これはいろんなWebページで紹介されてますねー。
addAllは、引数の総和を返す関数です。

JavaScript
function addAll() {
	var result = 0;
	var args = arguments;
	var i = 0;
	var imax = args.length;
	for (; i < imax; i++) {
		result += args[i];
	}
	return result;
}

console.log(addAll(1, 2, 3, 4));	// output 10
php
<?php
function addAll() {
	$result = 0;
	$args = func_get_args();
	$i = 0;
	$imax = count($args);	// ((func_num_args()との違いを後で調べる。))
	for (; $i < $imax; $i++) {
		$result += $args[$i];
	}
	return $result;
}

print(addAll(1, 2, 3, 4));	// output 10
?>

ここで、これらの関数引数配列ではありません

次、渡す方いきます。

渡す方と言っても、関数呼ぶだけならそのまま

addAll(1, 2, 3, 4);

で終わってしまいますね><

ここでは自身も可変長引数を取り、内部でaddAllを呼ぶ関数を書いてみます。*1
wappedAddAllは、引数の総和を3乗して返す関数です。

JavaScript
function wrappedAddAll() {
	var args = arguments;
	var sum = addAll.apply(null, args);
	return Math.pow(sum, 3);
}

console.log(wrappedAddAll(1, 2, 3, 4));	// output 1000
php
<?php
function wrappedAddAll() {
	$args = func_get_args();
	$sum = call_user_func_array('addAll', $args);
	return pow($sum, 3);
}

print(wrappedAddAll(1, 2, 3, 4));	// output 1000
?>

これが出来るとなにが便利か。

実はこのcall_user_func_array、組み込み関数(ビルトインファンクション・定義済み関数)やクラスメソッド、インスタンスメソッドにも使えてしまうんです。

例えば、mysqli_stmt::bind_param(このメソッドは可変長引数を取ります。)をラップして、多次元配列を受け取ってプリペアドステートメントに順次投げるなんてこともできます。
PDO::executeみたいな。

自分は、この"user"に惑わされてスルーしてしまったが為に、かなりの時間をロスしてしまいました。
何故わざわざ"user"なのか、ご存知の方がいらっしゃいましたらコメント下さい><

参考サイト

PHP: call_user_func_array - Manual

*1:参照渡しだの値渡しだの参照の値渡しだの、applyはthisがナンダカンダだのというのは今回の趣旨から外れるのでここでは言及しません。