HTML5のWebWorkersを使ってみた。
シングルスレッドのJavaScriptで並列処理を実現する技術。とりあえず並列処理の恩恵はないが、ごく簡単なサンプルで試してみた。Firefox4.0とSafari5.0.5でやってみたところ問題なく動作した。
workerとのデータのやり取りには"postMessage"と"onmessage(イベントリスナーを使う場合はmessageイベント)"で行う。
注意点としては、Worker側ではDOMが使えない点。prototype.jsやjQueryが使えないので注意。
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 3GSでSafariの位置情報の利用確認ダイアログを「許可しない」にしてしまった時のリセット方法。getCurrentPositionで緯度経度が取得できなくなって困った。「設定」→「一般」→「リセット」→「位置情報の警告をリセット」でいけました。