タグ: JavaScript

スポンサーサイト

上記の広告は1ヶ月以上更新のないブログに表示されています。
新しい記事を書く事で広告が消せます。

[JavaScript] Gears オブジェクトをプロトタイプ継承すると Firefox が即死する件

最近、Google Gears をいろいろといじっているんだけど、Gears のオブジェクトをプロトタイプ的に継承すると、Firefox がクラッシュしてしまって困っている。

どうすればいいんだろう。

再現方法

1. gears_init.js をロード
<script type="text/javascript" src="gears_init.js"></script>
2. Gears のオブジェクトをプロトタイプ的に継承
var mother = function() {};
mother.prototype = google.gears.factory.create('beta.database');
var child = new mother();
3. Gears オブジェクトのメソッドを呼び出す
child.open('mydatabase'); // crash

Firefox は問答無用でクラッシュするし、Chrome は NPObject deleted とかいう謎のエラーを出して止まるし、当然 IE も止まるし。

なんなんだろう、これ><

UUID.js を CodeRepos に放流しました

[追記] UUID.jsの最新版はGitHubで公開されています! (解説記事)

表題の通り、UUID.js を CodeRepos に放流しました!

root/lang/javascript/UUID.js - CodeRepos

まだまだ育て甲斐のある状態なので、どんどんいじっちゃってください!

続きを読む

UUID.js が UUID version 1 に対応しました

[追記] UUID.jsの最新版はGitHubで公開されています! (解説記事)

[追記] UUID.js の最新版は CodeRepos に放流しました。

今までは UUID version 4 にしか対応していなかった UUID.js を、UUID version 1 にも対応させてみました。

UUID.js

使い方

使い方はやっぱり簡単。

1. UUID.js をロードする
<script type="text/javascript" src="uuid.js"></script>
2. 引数に { version: 1 } を渡して生成する
var uuid = UUID.generate({ version: 1 });  // "3db93340-91f7-11dd-a2aa-69df78d74e01"

引数を渡さずに生成すれば、前回通り version 4 の UUID を生成するよ!

続きを読む

[UUID.js] バグがあったので修正しました><

[追記] UUID.jsの最新版はGitHubで公開されています! (解説記事)

[さらに追記] UUID.js の最新版は CodeRepos に放流しました。

[追記] 新バージョンを公開しました!

前回のエントリーで公開したばかりの UUID.js ですが、いきなりバグが出てしまったので修正版を公開しました><

UUID.js (修正済み)

バグの内容は、Math.random() の精度が 32 ビットしかないブラウザで、生成される UUID の下四桁が全部ゼロになってしまうという問題でした><

しかも、その「Math.random() の精度が 32 ビットしかないブラウザ」っていうのが、Opera, Safari, Google Chrome の 3 つで、IE と Firefox 以外では再現してしまうバグでした><

ちょっと確認すればすぐわかるはずの初歩的なミス><

バグの原因は、32 ビットの精度しかない乱数を 48 ビットとして扱ったことによるものだったので、乱数生成関数を工夫して 32 ビット精度の乱数から 48 ビットの乱数を生成できるように修正しました><

[JavaScript] UUID.jsを作成しました

[追記] UUID.jsの最新版はGitHubで公開されています! (解説記事)

[さらにさらに追記] UUID.js の最新版は CodeRepos に放流しました。

[さらに追記] 新バージョンを公開しました!

[追記] バグが見つかったので修正版を公開しました><

UUID (Universally Unique Identifier) を生成する JavaScript ライブラリを作ってみたので公開します。

UUID.js

UUID は、128 ビットの長さを持つ識別子です。普段使うときは↓のように 16 進法で表現されて、ところどころにハイフンが入ります。

e8783d5e-90dd-4af9-8aa6-371d43fcbcb4

UUIDは 128 ビットで 2128 = 3.4e+38 通りもあるので、偶然同じ ID が生成されることが (ほぼ) ないんです。だから、ID の一意性を維持するためにわざわざ統制する必要がなくて、面倒くさがりな人間にとっては便利すぎる ID なんですね!

で、そんな便利な UUID を JavaScript で使うためのライブラリを探してみたのだけれど、あまり良いものが見つからず。英語版 Wikipedia に書いてある JavaScript UUID Class というのも試してみたけれど、RFC 4122 に書いてある UUID の仕様とはちょっと違う感じの不思議な ID を生成するのでいまいち。ということで、自分で RFC を読みながら実装してみました。

使い方等は続きで。

続きを読む

[JavaScript] typeof arg == 'undefined' っていらないんじゃね?

以前にも JavaScript の null と undefined に関する記事を書いたことがあったが、またしても性懲りもなく null と undefined の挙動につまずいて、 ECMAScript 3 の仕様書まで調べ直したので、メモ代わりにエントリー化。

Abstract

このエントリーの内容をざっくりとまとめると、

something == null

がどういう値を返すのかが気になって、ECMAScript 3 の仕様書までさかのぼって調べてみると、

     null == null
undefined == undefined
     null == undefined
undefined == null

のパターンでのみ true を返すということがわかった、という話。細かい経緯は続きで。

続きを読む

[JavaScript] Activationオブジェクトらへんで誤解があったらしい

Activationオブジェクト周りでちょっと気になって、いろいろとコード書いてみて、ECMAScript 3の仕様書まで読み漁ったので、忘れないうちにメモ。

続きを読む

onclick属性のスコープチェインにthisが追加されてる?

onclick 属性問題について - IT戦記

これを onclick 属性なしで「神経質に」やると以下のようになる

ry

もちろん、これはおおげさな例だけど、 onclick 属性を使わないことによって本質的ではないことをたくさん書かないといけない

id:amachangの↑を見て、ロールオーバーのスクリプトを思い出した。時々こういう遊びをする人なのかな?

というのはどうでもいい話で、僕が関心を持ったのは↓のコード。

続きを読む

日付と時刻をTで結ぶ方式は普及していない

僕も ISO 8601 形式は大好きなんだけど、 YYYY-MM-DDTHH:MM:SS 形式は思いのほか通用しないので気をつけましょう。

日付と時刻の正しい表現方法 - Web屋のネタ帳

日付と時刻を両方表現したい場合は
2008-05-16T11:25:30+09:00
つまり日付と時刻をTでつなげる。

これが世界的スタンダードとしてISO8601とRFC3339に定められた日付と時刻の表現方法。有名どころの言語やらデータベースその他ミドルウェアはすべてこれに沿った表記を解釈し入出力できるようになっている。

JavaScript

とりあえず、JavaScriptではほとんど通用しません。

続きを読む

[メモ][Java][JavaScript] ユークリッドの互除法

よく使うので、ユークリッドの互除法で二つの整数の最大公約数を求める関数をメモ。

/** Java */
int gcd(int x, int y) {
    int g = Math.max(Math.abs(x), Math.abs(y));
    int l = Math.min(Math.abs(x), Math.abs(y));
    while (l != 0) l = g % (g = l);
    return g;
}
/** JavaScript */
function gcd(x, y) {
    var g = Math.max(Math.abs(x), Math.abs(y));
    var l = Math.min(Math.abs(x), Math.abs(y));
    while (l != 0) l = g % (g = l);
    return g;
}

再帰は使わない。再帰を使っていなければ、関数化しないでインラインで使うこともできて便利。大小関係がはっきりしている正整数が二つある場合、ユークリッドの互除法は本質的にはwhile (l != 0) l = g % (g = l);だけで表現できるんだね。

まずJavaで書いて、それをほぼそのままJavaScriptに移植したから、JavaScript側のコードは引数のチェックをしていない。必要な場合は整数かどうかのチェックをしておいたほうがいいと思う。

続きを読む

上記広告は1ヶ月以上更新のないブログに表示されています。新しい記事を書くことで広告を消せます。