もどる TOP
--category "プログラミング等"

[PHP] サーバー上で任意のコマンドを実行して結果を出力する

 このサイト、レンタルサーバー (ミニバード改めスターサーバー) に乗っかっているんだけど、とあるコマンドが使えるかどうかを調べたかった。でもそのコマンドはレンタルサーバーのサイトには書いてないし、SSHで接続もできないし……。

 しかしPHPからコマンドを実行できることを思い出したので、無理やりペコペコ叩いてみた。

[JavaScript] for文中で作った非同期のコールバック関数にループカウンタ渡したい

 こういうことをやろうとしてダメだった。

javascript
var list = [
	{ path: 'image1.gif', img: null }, // ←imgにはロード済みのimgを設定したい
	{ path: 'image2.gif', img: null },
	{ path: 'image3.gif', img: null }
];

for (var i = 0; i < list.length; ++i) {
	var img = new Image();
	img.src = list[i].path;
	img.addEventListener('load', function() {
		list[i].img = img; // ←ロード完了時に設定させようとした
		// 実際にここが実行されるとき、何周目かにかかわらず i = 3 になっててダメ。
	});
}

 Imageonloadにしかけたコールバック関数にループカウンタiが渡ってくる頃には、iの値はループを走り抜けてとっくに3になってしまってるから。ここでonloadが発火するのは画像の読み込みが終わった後だから、そうなるのか……。

 そうじゃなくて、コールバック関数を作った時点での、そのときのiの値を使いたかった。

解決策

 コールバック関数を作るための別の関数を挟んであげたらうまくいった。

javascript
var list = [
	{ path: 'image1.gif', img: null },
	{ path: 'image2.gif', img: null },
	{ path: 'image3.gif', img: null }
];

for (var i = 0; i < list.length; ++i) {
	var img = new Image();
	img.src = list[i].path;
	img.addEventListener('load', createCallback(i, img));
}

function createCallback(i, img) {
	return function(event) {
		list[i].img = img;
		// 実際にここが実行されるとき、iはコールバック関数を作った時点のものとなっている。
	}
}

 ループカウンタの場所じゃなくて、値自体を別のものとして確定しておいて、それを関数に組み込んでおいてやる感じだと思う。

サイドバーを表示する
ブログ
Whiteday
Whiteday
尋ね人
尋ね人
かつてレレノイドは彼の瞳の中に希望を見ていたが、そのことをあっちこっちに言いふらしまくると、キリウ君は怒ってそれを燃えるゴミの日に出してしまった。