-
001830
本日、DeviceOrientaion Event Specification という、W3C の Editor's Draft を知りました。
これは、デバイスの空間における向きと動きを、JavaScript からアクセスできるようにしようという仕組みです。 Geolocation API がデバイスの巨視的に地球上に占める位置を取得するものであったのに対して、こちらはもっとローカルで微視的にデバイスの空間における物理的状態を取得するものになります。 この Specification では "deviceorientation" と "devicemotion" という二つの window イベントを定義しており、それぞれデバイスの向きと動きに対応します。
向きを取得するコールバックに渡される DeviceOrientationEvent は alpha, beta, gamma という三つの属性をもっていて、それぞれ z 軸, x 軸, y 軸を中心とした回転を degree で保持しています。 なんで pitch, roll, yaw じゃないんだろうか。
動きを取得するコールバックに渡される DeviceMotionEvent では、向きに加えて、加速度を表す Acceleration も取得できるようです。 ぼくが試した環境では DeviceMotionEvent はうまく動かなかったので、「ようです」と歯切れが悪い書き方になっていることをお許しください。
この Specification の一部はすでに Google Chrome 9 に実装されているようなので、簡単なサンプル・コードを作ってみました。
動作確認済みの環境は、Chrome 9.0.597.84 / Mac OS X 10.6.6 / MacBook Pro という組み合わせです。
以下のように Event Lisnter を設定し、
function init() { window.addEventListener ("deviceorientation", move, true); }callback function を
function move (event) { *snip* ddx = G * Math.sin (event.gamma * Math.PI / 180.0); ddy = G * Math.sin (event.beta * Math.PI / 180.0); *snip* }のように定義することで DeviceOrientationEvent から傾きを取得しています。 傾きから地図の移動を求める辺りは DeviceOrientation Event とは関係がないので端折りますが、ざっくりとした流れは 傾きから重力加速度の水平成分を求め、摩擦係数を考慮の上で速度を計算して google.maps.Map#panBy() で地図をパンさせています。
スマートフォンなどのネイティブ・アプリケーションからは当たり前のようにアクセスできるデータですが、JavaScript から触ることができることで、またなにか面白い使い道が生まれるかもしれません。
[ permalink ] [ 0 comment(s) ] [ 0 trackback(s) ] -
001829
ハッシュ・アルゴリズムの SHA1 の仕様を調べていたら、RFC 3174 に C の実装例が載っていることを発見。 アルゴリズムの理解がてら、Javascript で実装しなおしてみました。
配列の参照に結果を埋めこんで戻しているなど、Javascript っぽくないところもあります。 反対に、8bit で足りるところを 32bit 使わざるを得なかったり、Javascript の仕様上の制約にも当たっています。 とはいえ、きちんと正しい値を返すようなので良しとしましょう(同じ RFC に含まれている Test Driver 参照)。
使い方はこんな感じ。
var context = new sha1.Context(); sha1.input(context, message /* array of byte */); var messageDigest = new Array(20); sha1.result(context, messageDigest);
このままの実装だとちょっと使いづらいので、ラッパーだけ追加してあります。
var digest = sha1.digest(message); /* String or array of byte */
-
001548
以前、測地系の変換ライブラリを PHP で実装しました。 今回これを JavaScript に移植しました。
以前書きましたが、Geolocation API により JavaScript から直接緯度経度を扱うことができる環境が整ってきています。
Geolocation API では次のように WGS84 を使うことが (non-normative ながら) 定められています。
This specification is limited to providing a scripting API for retrieving geographic position information associated with a hosting device. The geographic position information is provided in terms of World Geodetic System coordinates [WGS84].しかし、国産のサービスでは Tokyo を用いているものもまだいくつかあります。 こういったサービスをブラウザから直接利用する場合に、サーバー・サイドで変換を行う PHP では不十分なので、JavaScript で測地系の相互変換が行えるようにと考えました。 もともと PHP で書かれていたコードを JavaScript で書き直しただけなので、使用したデータは前回同様こちらです。
- Geodetic Datum Overview
- Reference Ellipsoids and Geodetic Datum Transformation Parameters (Local to WGS-84) From NIMA 8350.2 4 July 1977 and MADTRAN 1 October 1996
以下の環境で動作確認済みです。
- Firefox 3.5
- Internet Explorer 7
- Safari (iPhone OS 3.0)
使い方はこんな感じです。
// Datum クラス (測地系を表現) のインスタンス化 var WGS84 = new net.mizba.geo.Datum("WGS 1984"); // "WGS84" と "Tokyo" については定数も定義しています var TOKYO = net.mizba.geo.Datum.TOKYO; // Datum クラスのインスタンスから、 // GeoPoint (地球上の地点) のインスタンスを取得します var nemuroStation = WGS84.createGeoPoint(43.326774,145.58269); // 高さを指定することも可能です // var nemuroStation = WGS84.createGeoPoint(43.326774,145.58269, 0); // 測地系の変換を行います // WGS84 から取得した GeoPoint を TOKYO へと変換します var r_nemuroStation = TOKYO.transform(nemuroStation); // 結果はこのように取り出せます var result_lat = r_nemuroStation.lat; var result_lon = r_nemuroStation.lon; // Datum のインスタンスは再利用可能です var tokyoStation = WGS84.createGeoPoint(35.680838,139.76724); ...
正直なところ、WGS84 と Tokyo を扱うことができれば十分で、汎用的な測地系変換は不要かもしれませんが……。
-
000381
最近ちょっと思い立って,久し振りに JavaScript をいじっているのですが,JavaScript でいつも問題になるのが実行時のログ取得です.
Mozilla ならば,URI 欄に "javascript:" と入力して Enter を押すと JavaScript Console が起動してくれます. エラーや警告が順に表示されるので,これはこれで便利. でも,開発者が自由にログを表示させることは出来ません.
もうひとつ考えられる方法は alert 関数です. これは JavaScript のビルドインで,呼ばれるごとにメッセージウィンドウがポップアップします. alert 関数をコードの必要な箇所に埋めておけば,自由にログを表示させられます. しかし問題があって,このウィンドウが表示されるごとにいちいち実行が停止します. 大量のログを吐かせる用途には向きません.
そこで今回,ロギング用ユーティリティを作ってみました.
log4js.jsコードを覗いてもらえればわかるけれど,かなり単純かつ強引です. でもまぁ,ログ取得の目的は達せられますし,実行を止めることもありません. ただ,パフォーマンスにはかなり影響を及ぼすようです. ここは,今のところ対処しようがなかったのでご了承ください.
使い方はコード中にもコメントで書いてありますが,一応説明.
- コード中に
<script src="log4js.js" type="text/javascript" language="JavaScript"></script>
を記述. - 上記コードを記述したページを Web ブラウザで開く
- ログウィンドウがポップアップ
- log ( p_message ) 関数が呼ばれるごとにログを表示
[ permalink ] [ 0 comment(s) ] - コード中に
-
000246
修論も提出し終えたので,前から気になっていたこのサイトの "new" 表示のロジックを見直しました.そこで必要になったのが,java.util.Map に相当する機能です.Array が惜しかったのだけれど,マッピングの状態を保存できないので今回は使えません.
まぁ,この程度の機能ならそれほど手間はかからないだろうと思い,実装してみました.
Map.jsjava.util.Map の機能のうち,
- put
- get
- remove
- containsKey
- containsValue
- clear
今回はこれに加えて,キー,値がすべて文字列か数字の場合にのみ使える,マッピングの状態を保存する機能を実装しました.toString () でマッピングの内容を文字列化し,同じ文字列をコンストラクタの引数に与えることでマッピングを再現できます.あまり凝った使い方は試していませんが,Cookie に保存するくらいであれば大丈夫でした.
ニーズがないような気もしますが,もしよろしければ持っていってお使いくだされ.
[ permalink ] [ 0 comment(s) ] -
000234
先ほど酒の席で話した,ある標高から見渡せる距離の話です.文体が気取っていてこっぱずかしいのですが,ひとまず以前授業で書いた匿名コラムをアップします.どういうモデルで計算しているかはこれを参照してしてください.
初日の出を早く見たければ,山へ登ろう [2003-01-07]
で,実際に数字を入力して見渡せる距離を計算するスクリプトを組んでみました.裏のロジックは上の文章内にあるとおりです.
[ permalink ] [ 4 comment(s) ] -
000231
再び JavaScript で文字コードをいじってみました.
W3C XML1.0 の仕様の付録 などには,Unicode で記述された導出規則があるのですが,実際どんな文字にマップされているのかが判りにくいので,JavaScript で無理矢理表示させてみました.
テキストエリアに導出規則を貼ってください.現在のところ,対応しているのは以下の二つ書式のみです.
- #xN
- [#xN-#xN]
IE では動かないようです.mozilla1.6 で動作確認済み.
[ permalink ] [ 0 comment(s) ] -
000211
実験で文字コード表が必要になったのですが,
Google でうまく見つけられませんでした.
ならば,と,作ってみましたので,
よろしければお使いください.おそらく,
HTML 4.01 Specification
の
24 Character entity references in HTML 4
あたりに基づいているはずです.すべてクライアントサイドで生成するので,
ちょっと重いかもしれませんが,
落ちることはないはずです.[ permalink ] [ 5 comment(s) ]