HTML5のWebWorkersを使ってみた。

シングルスレッドのJavaScriptで並列処理を実現する技術。とりあえず並列処理の恩恵はないが、ごく簡単なサンプルで試してみた。Firefox4.0とSafari5.0.5でやってみたところ問題なく動作した。

workerとのデータのやり取りには"postMessage"と"onmessage(イベントリスナーを使う場合はmessageイベント)"で行う。

注意点としては、Worker側ではDOMが使えない点。prototype.jsjQueryが使えないので注意。


html

<!DOCTYPE html>
<html>
<head>
<script type="text/javascript">
function $(id) {
	return document.getElementById(id);
}

var worker = new Worker("worker.js");

function messageHandler(event) { 
	alert(event.data); 
}

function errorHandler(error) {
	alert(error.message);
}

window.onload = function() {
	if (typeof(Worker) !== "undefined") {
		worker.addEventListener("message", messageHandler);
		worker.addEventListener("error", errorHandler); 
	        setTimeout("worker.postMessage('worker')", 1000);
	} else {
		alert("Web Workersが利用できません。");
	}
}

</script>
</head>
<body>
</body>
</html>

worker.js

function messageHandler(event) { 
	postMessage("Hello, " + event.data + " !");
}

addEventListener("message", messageHandler);

Rubyで緯度経度から距離を計算するメモ

緯度経度を使って2地点間の距離を算出する必要があったので調べた内容をメモ。
地球は平面じゃないので少々計算式が面倒。
Google Mapの距離測定ツールでチェックしたので概ねOKなはず。

※コードの利用は自己責任でお願いします。

#緯度経度から距離を計算する
def get_distance(lat1, lng1, lat2, lng2)
	y1 = lat1 * Math::PI / 180
	x1 = lng1 * Math::PI / 180
	y2 = lat2 * Math::PI / 180
	x2 = lng2 * Math::PI / 180
	earth_r = 6378140
		
	deg = Math::sin(y1) * Math::sin(y2) + Math::cos(y1) * Math::cos(y2) * Math::cos(x2 - x1)
	distance = earth_r * (Math::atan(-deg / Math::sqrt(-deg * deg + 1)) + Math::PI / 2) / 1000
end

iPhone版Safariの位置情報利用確認ダイアログのリセット方法

iPhone 3GSSafariの位置情報の利用確認ダイアログを「許可しない」にしてしまった時のリセット方法。getCurrentPositionで緯度経度が取得できなくなって困った。「設定」→「一般」→「リセット」→「位置情報の警告をリセット」でいけました。