aki note ≫ Google 電話面接を受けました orz (いまは消えてるけど)にて
割り算が壊れました。自分で実装してみてください
という質問が紹介されていた。
せっかく(?)の機会なので、割り算だけでなく、四則演算を全部壊してみて、JavaScript で実装して見ることにした。
JavaScript を選んだのは、コンパイル不要、ビット演算がある、Firebug で手軽に確認できる、という理由から。それ以上の深い意味はない。
ということで、次のような問題に一般化してみた。
四則演算を JavaScript で実装しなさい。
演算子は ==、!= およびビット演算子のみ使ってよいものとします。
例えば、for 文で
for(var i = 0; i < 10; i++){ // ... }
と書くためには、< 演算子と ++ 演算子を自前で実装しなきゃならない。
++ 演算子は次のように定義できる。
function increment(i){ var c = 1; while(c){ if(i & c){ i &= ~c; c <<= 1; } else{ i |= c; break; } } return i; }
一番右のビットから見ていって、1 である限りは 0 にしていく。0 ならそのビットを 1 して終わり。桁あふれなら終了、としている。
例を書くと分かりやすいかもしれない。
01001111 +) 1 ---------- 01010000
ソースコード中の while や if の条件式では != 0 を省略している。厳密にはいちいち書くべきなんだけど、めんどくさいし読みにくいので。
前置きが長くなったけど、まずは足し算から。
すごく簡単にやるなら、さっきの increment を使って
function add_simple(a, b){ while(b){ a = increment(a); b = decrement(b); } return a; }
と書いてしまえば終わり。decrement は increment とほぼ同じコードで実装できる。
ただ、この実装だと、b が -1 (0xffffffff) のときに42億回 while 文が回ってしまうのでダメすぎ、実用に耐えなさすぎ。
ということで、改良。
function add(a, b){ var sum = a; while(b){ var carry = (a & b) << 1; sum = a ^ b; a = sum; b = carry; } return sum; }
a ^ b で各桁単独の足し算を取得しつつ、a & b で繰り上げを計算。繰り上げがある場合は、繰り上げ部分を足して、それでも繰り上がればまた足して・・・の繰り返し。
a 01011010 b +)01001001 ---------- a 00010011 <- a ^ b b +)10010000 <- (a & b) << 1 ---------- a 10000011 b +)00100000 ---------- a 10100011 b 00000000 <- b が 0 なので終了
だいぶ早くなる。
Firebug で試してみる。
>>> add(1, 1) 2 >>> add(99, 1) 100 >>> add(99, -1) 98 >>> add(-3, 5) 2
負の数でもうまく理由が分からない人は2の補数(後述)を勉強してね。
これはだいぶ簡単。
// 正・負を入れ替える function reverse_sign(a){ return add(~a, 1); } function sub(a, b){ return add(a, reverse_sign(b)); }
2の補数って知ってる? で終わり。
2の補数は慣れるまで分かりにくい概念だけど、こう考えてみるのはどうだろう。
次は掛け算。桁あふれは無視してる。
function mul(a, b){ var product = 0; while(b){ if(b & 1){ product = add(product, a); } a <<= 1; b >>= 1; } return product; }
筆算のやり方を思い出せば簡単。
1010
x)0101
------
1010
0000
1010
+)0000
---------
0110010
b の i ビット目が 1 なら、a を i ビット左にシフトしたものを足す、というだけの実装。
上の実装は負の値を無視してしまってるので、まじめにやるならこうなる。
// 正の数かどうか調べる function is_positive(a){ return (a >>> 31) == 0; } function mul2(a, b){ if(!is_positive(a) && !is_positive(b)){ return mul(reverse_sign(a), reverse_sign(b)); } else if(!is_positive(a)){ return reverse_sign(mul(reverse_sign(a), b)); } else if(!is_positive(b)){ return reverse_sign(mul(a, reverse_sign(b))); } else{ return mul(a, b); } }
is_positive 関数で int が 32bit だと仮定しているあたりがかっこ悪いけど、これが一番シンプルかと。
長かった。いよいよ割り算。Google の電話面接で聞かれるだけあって複雑。
0 での除算や正負は考えずに実装した。
// 比較演算子の代わり function cmp(a, b){ var s = sub(a, b); return s == 0 ? 0 : is_positive(s) ? 1 : -1; } // MSB = 最上位ビット(Most Significant Bit) を取得 function msb(i){ var ret = 0; while(i){ i >>>= 1; ret = add(ret, 1); } return ret; } function div(a, b){ var quotient = 0; if(cmp(a, b) == -1){ return 0; } var i = sub(msb(a), msb(b)); while(is_positive(i)){ quotient <<= 1; if(cmp(a >> i, b) != -1){ a = sub(a, b << i); quotient = add(quotient, 1); } i = sub(i, 1); } return quotient; }
これも筆算をイメージして実装。でも複雑なので説明する体力なし。
もっとスマートな実装はないものか... もしくはもっとアクロバティックなの。
すごい人達に期待。改良案や別の言語での実装をお待ちしています。
こうやって記事にすると、私がすごくできる人間に見えるかもしれないけど、実はかなり苦しみました。
そんな中、非常に参考になったのが 基礎から学ぶコンピュータ というサイト。そこに書いてあることを理解して、JavaScript に移植しただけ、といっても過言ではない。
四則演算の実装といえば、コンピュータ・サイエンスの基礎中の基礎なんだけど、そこをちゃんと理解しているか聞いてくる Google 先生はさすが。普段からコンピュータの仕組みを理解した上で使っているかを問われているわけですね。
この辺の内容を基礎から勉強するなら、パタヘネがよいんじゃないでしょうか。
コンピュータの構成と設計~ハードウエアとソフトウエアのインタフェース 第3版 (上)
今Adobe 社に頼まれ、Apollo記事書いてるんですけど、Apolloについてポジティブかつ、具体的な期待とか展望とか一言位の感じで書ける人、書きたい人いますかー?
Twitter / muraken: 今Adobe 社に頼まれ、Apollo記事書いてるん ...
と言っていたのに食いついて、コメントを送ってみました。
で、さきほど、その記事が公開されたようです。
わたしのコメントは最後のほうにあるので、よければ読んでみてくださいませ。
Adobe 公式のメールマガジンに自分の発言が載ったわけで、うれしいような、はずかしいような、申し訳ないような。
タイトルが軽く煽りっぽいですが、行ってきました。Flash 勉強会@大阪の4回目。
今回は Flash ライブコーディング。
「Flash だからライブオーサリングじゃないの?」と思ってたけど、蓋をあけてみると、大部分がコーディング。Flash 8 はほとんど使わずに、ActionScript だけで SWF が出来上がっていく様子は、軽くカルチャーショックでした。
ソースは [Saq.] 第4回「大阪てら子」まとめ からダウンロードできますよ。
5時間にわたりコーディングしてくださった さくーしゃさん、ありがとうございます。そしてお疲れ様でした。ライブ配信と突っ込みシステムを作った hirossy さん、お疲れ様です。
ということで、今回、学んだポイントを10個にまとめてみましたよ、っと。ちょっと Tips じゃないのも含まれている気がするけど、そこはご愛嬌で。
png の書き出し部分では、Flash で画像の外側が崩れるバグに対応するために、
といったバッドノウハウが紹介されました。Flash 8 では問題なくなっている、という話も。
(感想)華やかなアニメーションの裏には、こんなにも地味な下準備があるのか! CS3 ではだいぶ改善するのかな?
筆で書いていくようなアニメーションはマスクの変形で行う。
マスクは、1フレームずつ手書き。
最後に「フレーム反転」で逆に並び替えて完成。
手書きの方が味がでるし、細かい調整ができるらしい。
ここからは Flash 8 は使わず、FDT (Development for Flash) という Eclipse プラグイン上でコーディング。
MC のステージへの配置や、アニメーションの設定は、全て AS2.0 でやってしまいます。
(感想)FDT(Development for Flash) の存在を初めて知りました。199ユーロだそう。(現在の日本円で 32,000円ぐらい)
ライブラリを1箇所にまとめておくと、バージョンを上げたときに、過去の遺産が動かなくなって悲しいので、各プロジェクトのディレクトリにライブラリを展開。
スタティックリンクの感覚に近い。
ステージの1フレーム目には
App.main(_root);
と書いておく。
App.main() の実装は次の通り。
static public function main(target:MovieClip):Void { target.__proto__ = App.prototype; Function(App).apply(target, null); }
何をやってるかというと...
ということ。__proto__ とか apply あたりは、かなり技術的に込み入ってるので、分からない人は おまじない と考えてもよいかも。
これで準備完了。残りは全部 AS でコーディングできる。
(補足)CS3 からは DocumentClass を設定できるようになるので、こういうバッドノウハウも必要なし。
var f:Fuse = new Fuse({...}) 形式でコンストラクタの中に全部書いちゃう。
var f:Fuse = new Fuse( { target:this.bg_mc, alpha:100, time:1, easing:'linear' }, [ { target:this._memberImg_mc, y:10, time:2, easing:'easeOutCubic' }, { target:this._mirrorImg_mc, y:130+120, time:2, easing:'easeOutCubic' } ] { target:this.name_mc, y:135, time:1, easing:'easeOutCubic' }, { target:this, alpha:0, delay:2, time:0.5, easing:'linear' }, { scope:_root, func:_root.showAllMembers } ); f.start();
それぞれの MC は Flash 8 で アルファ 0% にしておくのを忘れずに。
(感想)FuseKit は使い方を覚えたら簡単そうだ。Trick7 さんの Fuseアニメーションの実行順序 が分かりよい。
CASA フレームワークの MovieClipUtil.attachMovieRegisterClass() を使えば、MC とクラスを関連付けてステージに配置できる。
var mc:MovieClip = MovieClipUtil.attachMovieRegisterClass( LogoAnimation, // クラス名 this, // 親 MC 'Logo Animation', // リンゲージ名 '_logo' // インスタンス名 );
1つの MC に対して、複数の実装を割り当てられるわけで、これはちょっと面白い。
attachMovieRegisterClass は、内部で Object.registerClass を呼んでいるようだ。リンゲージプロパティの 「AS 2.0 クラス」をいじる関数の模様。なるほどなるほど。
CASA フレームワークの便利な関数。XML を受け取って、Object にして返してくれる。
var obj:Object = XmlUtil.xmlToObject(this._xmlLoad.getXml())
Perl で言うところの XML::Simple、JavaScript で言うところの JKL.ParseXML みたいなもの。
(補足)AS3.0 には E4X があるから、こういうのは不要かな。
またまた CASA フレームワークから。LoadGroup は URL を複数登録しておいて、まとめてロード、全部読み込み終わったら教えてもらえる。
1〜2個の画像なら手作業でも書けるけど、たくさんの画像を読み込む場合はかなり便利。
var loadGroup:LoadGroup = new LoadGroup(); for (var i:Number = 0; i < info.length; i++) { var mc:MovieClip = MovieClipUtil.createEmptyMovieClip(this, 'img' + i); loadGroup.addLoad(new MediaLoad(mc, 'images/' + info[i].image, false)); } loadGroup.addEventObserver(this, LoadGroup.EVENT_LOAD_COMPLETE, 'handleLoadComplete'); loadGroup.start();
途中、Saqoosha さんが、うまくいかずに30分ぐらい(?)、はまっていた。
問題解決までのプロセスまで知れるっていうのは、ライブコーディングの魅力。
個人的には、はまっているときが、みんな一番いきいきして見ていた気がする。ああ、さくしゃーさんでもはまることあるんだ、ちょっと安心、みたいな。
掲載してるサンプルコードは さくーしゃさん が公開してくれてるソースコード を、ちょっといじって分かりやすくしたものです。
改めて、手の内を明かしてくれた さくーしゃさんに感謝。
(追記) 参加者のレポートが続々と。
こういうレポートが、今の倍ぐらいは出てきたら素敵なのになぁ・・・>参加者各位(笑)
6月17日開催の Flash 勉強会第4回 大阪てら子「さくーしゃのFlashライヴコーディング」 が ライブ中継される ようです。
ライブコーディングしてくれるのは、さくーしゃさん。もはや説明は不要な気もしますが念のため。DARAO の作者でもあり、Web 業界でも超有名な制作会社 AID-DCC Inc. でバリバリに Flash 使ってる方です。
そうそう。ライブコーディングが見たい、との提案をしたのは私です。
というのも、思うところがあってですね、Flash って入門書はたくさんあるんだけど、中級以上の本ってなかなかないんですよね。それはプログラマの業界もそうなんだけど、プログラム業界では誰かが作ったサンプルとか OSS のソースコードがその役割をしてくれてると思うんですよ。
でも、Flash にはそれがない。fla ファイルを見る機会はほとんどないじゃない。製作過程なんてもってのほか。
第2回、第3回てら子で話を聞いてると、フレームワークの話は出たりするんだけど、結局のところどう作るかは共有できてなかったんですよね。それだと、結局みんな自己流でやってる現状は変わらないと思ったので、CSS Nite でやってるような、「ライブコーディング」が見たい、と思ったわけです。
長くなってしまったので強引にまとめると…
すごい人の Flash 使い方に興味がある人は、ライブ中継見てね! レイヤ構造どうしてるんだろう、FuseKit どう使うんだろう、Flash のカスタマイズはどうしてるんだろう、とか色々参考になるはず。遠隔からの質問も受け付けてるようなので、ばしばし質問・つっこみしちゃってください。
以上。
AIR ではアプリケーションの設定を app-storage:/ に保存することが推奨されています。
使い方はこんな感じ。
var file:File = new File("app-storage:/myfile.txt");
もしくは、File.applicationStorageDirectory を使って、次のようにもできます。
var file:File = File.applicationStorageDirectory.resolve("myfile.txt");
file:/ ではなく、app-storage:/ を使うことで、Windows でも Mac でも、ディレクトリ構造を意識せずに設定を保存できるというメリットがあります。
じゃあ、ファイルは一体どこに保存されるかというと...
だそうです。appId の部分は ADF(Apollo Descriptor File) で指定したものに置き換えてください。(参考:Apollo File Path Gotcha ≫ Brandon Ellis Dot Org、AMOSTYLE2.0 ≫ AIR の app-storage:/ はVistaではどこに保存される?)
例えば、先ほどのアプリケーションの appId が「com.nitoyon.sampleApp」だったとすると、app-storage:/myfile.txt に保存したファイルは XP では
C:\Documents and Settings\username\Application Data\com.nitoyon.sampleApp\Local Store\myfile.txt
に保存されるわけです。
ちなみに、AIR アプリケーションをアンインストールしても、app-storage に保存されたファイルは消えません。ちょっとお行儀は悪いところに注意が必要です。
app-storage と似たものとして、app-resource(もしくは File.applicationResourceDirectory)があります。app-resource は AIR アプリケーションがインストールされたディレクトリを表します。
app-resource にファイルを出力したとしても、アンインストール時に自動的に消えることはありません。
どうやら、アンインストール時には .air パッケージに含まれていたファイルのみを削除している模様です。
Flex Doc Team: Flex 3 Beta 1 (Moxie) Documentation にて、Flex 3 beta 1 のドキュメントファイルがまとめられています。また、AIR:Documentation - Adobe Labs にもまとめられています。
現在、3つの ZIP 形式のファイルが利用できるようです。もちろん、全て英語です。
それぞれの中身を簡単に眺めてみました。
(追記:2007/6/15) HTML 開発者向けのドキュメントの解説を追加しました。また、一部のリンク先が間違っていたのを修正しました。
Flex を利用して AIR を作る人のためのドキュメント。Flex 開発のドキュメントも含んでいる。
HTML+JavaScript で AIR を作る人向けのドキュメント。
Flex 3・AIR(Flex)・AIR(HTML) が分散していて、探し出すのが大変でした。今後は、ドキュメントの場所を分かりやすくしてほしい...
まだ途中のため、中途半端かもしれないけど参考程度に。
(2007.6.13 1:00 追記) Adobe AIRメモ さんが早速 AIR β版に対応しています。すばやい対応! ここよりも、Adobe AIRメモ さんのほうがお勧め。
Flex Builder 2 を使っている人は 3 を、Flex 2 SDK を使っている人は Flex 3 SDK を導入します。
Builder はどうか知らないけど、Flex SDK は共存できるので Flex 2 が必要な人は残しておいたほうがいいでしょう。
ADF(Apollo Descriptor File) と呼ばれるアプリケーションの情報を記述した XML ファイルの仕様が変更になっています。
手順はこう。
例。
Apollo α版でこうだとすると
<?xml version="1.0" encoding="UTF-8"?> <application appId="com.nitoyon.sample" version="0.1" xmlns="http://ns.adobe.com/apollo/application/1.0.M3"> <properties> <name>application name</name> <publisher>nitoyon</publisher> <description>sample application</description> <copyright>2007 nitoyon</copyright> </properties> <rootContent systemChrome="standard" visible="true">hoge.html</rootContent> </application>
AIR β版ではこうするよ。
<?xml version="1.0" encoding="UTF-8"?> <application appId="com.nitoyon.sample" version="0.1" xmlns="http://ns.adobe.com/air/application/1.0.M4"> <name>application name</name> <publisher>nitoyon</publisher> <description>sample application</description> <copyright>2007 nitoyon</copyright> <rootContent systemChrome="standard" visible="true">hoge.html</rootContent> </application>
あとは、仕様変更になったクラスを使っていなければ、そのままのソースで動くと思います。
再コンパイル(amxmlc)・パッケージング(adl) はまだ試してないので中途半端だけど時間切れ。
Apollo は AIR になるのでは?という記事を書いた途端に発表になって焦ってます。
それはそうと、Flex3 SDK を早速落としてみました。
http://labs.adobe.com/technologies/flex/sdk/flex3sdk.html
AIR(旧Apollo)の開発環境も含まれています。
langref のリンクが見つからなかったが、AIR SDK ダウンロードのページ の「Download Adobe AIR documentation for Flex developers (ZIP, 32 MB) 」に今までの langref に相当するドキュメントが含まれていました。
今まで、Adobe Labs などで個別に発表してきた技術が SDK に含まれて居ます。
さらに、frameworks フォルダの中には、今まで公開されていなかったソースが公開され始めており、オープンソース化に向けて、着々と準備が進んでいる印象です。
ファイル構成を簡単に覗いてみました。
Apollo というのは実は開発コードで、正式名称はまだ発表されていません。
この記事を公開した数時間後に、akihiro kamijo: Adobe Apollo 改め Adobe Integrated Runtime (AIR) パブリックベータ開始 というように、正式に AIR と発表されました。ということで、この予測は大正解でした。
β版の発表と共に正式名称も発表になるのでは?という話だったのですが、ここにきて、この正式名称が 「Air」になるのではないか、という噂が流れ始めています。
Adobe Apollo Developers Night に申し込みをしたユーザーからの声によると、自動返信メールのタイトルが
『Adobe Air Developers Night』仮登録完了書
だったようです。
Flex 3 の新機能を紹介する Ted On Flex: Flex 3 - Friday: Apollo という記事のスクリーンショットにぼかしが入っています。そして、ぼかしについて「そのうち、ぼかしの理由が分かるはず」と書いてあります。これは、正式名を隠しているとしか考えられません。
このぼかし、現在は修正されていますが、最初のころはかなりいい加減でした。いい加減なときのスクリーンショットが The Warp: New name for Apollo... に掲載されています。
うっすら、Adobe AIR Project と読めませんか?
AIR という名前のそれっぽい理由が考えられます。
誤報だったらすみません。
ちなみに、Apollo の前には Macromedia 時代に 2度の失敗があり、そのコードネームは Mercury、Gemini というものでした。どれもアメリカの有人宇宙飛行計画の名前に由来しています。(参考:Adobe Edge: Apolloの原点)
2度の失敗の後、ついに Apollo で空中(air)に飛び出した、と考えると感慨深いものがあります。
個人的には Apollo に慣れちゃったので、Apollo の方が愛着あります…。
Adobe エバンジェリストの Ted さんのブログ Ted On Flex にて、Flex 3 の新機能が続々紹介されていっています。
これらの記事を簡単に日本語訳して、FxUG に投稿してます。
ブログの記事にしてもいいかも!というぐらいの密度で書いてるので、ぜひご覧ください。
今のところ、気になる新機能は
といったところです。
そのうちまとめる(かも)。
先日の Google Gears の使い道 という記事用に既存のオフライン技術についてまとめていたのですが、長くなったので割愛してしまいました。とはいえ、もったいないので別エントリの形で公開します。
紹介するのは3つのオフライン技術と、それぞれの Google Gears への反応です。はじまりはじまり。
オフライン機能をいち早く実装したのは Dojo Offline というライブラリです。
Dojo という名前からも分かるように、JavaScript ライブラリ「Dojo」の Dojo.Storage という機能を活用して実装されているようです。Dojo.Storage は Cookie・SharedObject・ActiveX File API・XPCOM File API などの中から適切なものを選ぶ、という実装のようです。
Google Gears の発表を受け、Dojo Offline は Dojo.Storage を使うのをやめ、Google Gears を使うように修正する、と発表しています。また、この作業は Google と協力しながら行うことも明言されています。(斜め読みなので少し間違えているかも)
参考リンク:
Firefox 3 では目玉機能としてオフライン機能が実装されます。
Firefox 3 のオフライン機能って何だ? (えむもじら)が詳しいです。
Google は Firefox に Google Gears を組み込むことを提案しています。これに対し、Firefox の開発陣は「現在実装中のオフライン機能をそのまま使うか、Google Gearsを使うかは未定」と発言しているようです。(参考リンク:(6/3) Firefox 3 と Google Gears)
Google Gears と微妙にかぶっていて、でも、微妙に違うのが Apollo です。
Google Gears の3つの機能は Apollo では次のように対応します。
Apollo にしかない機能としては、
と、色々思いつきます。
とはいえ、Google Gears と Apollo は完全には競合はしません。
状況に応じて、Apollo の中から Google Gears を使う、Google Gears の中から Flash を使う、といったように、お互いのいいところをつまみ食いできる関係にあります。
3つの技術と Google Gears 側が協力関係を結ぼうとしているのが面白い。Google Gears がオープンソースなところからも分かるように、Google Gears の立場は「みんな、一緒にオフライン技術を作っていこうよ!」というものなのでしょう。
蛇足となりますが、オフライン機能を持ったサービスとしては Zimbra on your Desktop が挙げられます。インストール型でローカルサーバー・DB を持つ構造は Google Gears と同じのようです。
詳しくは、Zimbra Desktop、ローンチ―オンラインの機能をフルに移植(TechCrunch Japanese)で分かりやすかったです。日本では Zimbra はサイボウズの子会社フィードパスと組んで普及を狙っているようです。
Google Gears (BETA) が発表されました。
Google Gears はウェブサービスにオフライン機能を付け加えやすくするためのフレームワークです。
フレームワークが提供するのは次の3つの機能です。
開発者は、これら3つの機能を駆使して、オフライン機能を実装することになります。
ありがちな実装パターンはこうなるでしょうか。
利用者の立場から考えて見ます。
オフラインのときにも使いたくなるサービスって何があるでしょうか。RSS リーダーや GMail、Google Docs & Spreadsheets…。ここまで挙げたあと、続きが思いつきません。
日曜プログラマが開発するようなちょっとしたアプリケーションでは、オフライン機能を使いたくなるところまでいかないと思います。
また、オフライン中の操作を Database に保存したり、オンラインになったときに送信したりする部分の実装はかなり煩雑です。
ばっさり言ってしまえば、ユーザーからの需要は少ない上に、実装コストが高いのです。
では、Google Gears は不要な技術なのでしょうか。
いいえ、実は超絶に魅力的です。
3つの機能を単体利用するだけでも、実装効率は格段によくなりそうです。
1つ1つ説明していきます。
ブラウザのキャッシュ(一時ファイル)は、キャッシュする条件がブラウザによってことなるなど、アプリケーション側から完全にコントロールするのは不可能でした。
それを Google Gears の LocalServer 機能で解決します。
例えば、こんな使い方はどうでしょう。
重要なのは、アプリケーション側からブラウザのキャッシュを完全にコントロールできることです。
現状のブラウザベースのアプリケーションでは、ちょっとした設定データやセッションデータを Cookie に保存します。
しかし、Cookie には 4KB 容量制限が重くのしかかります。
この制限を克服するために、Flash の SharedObject や、DOM Storage(Firefox only)、userData(IE only)を利用する といったバッドノウハウがあるのですが、インターフェースもばらばらな上に、環境依存の問題も併発してしまいそうで、なるべくなら使いたくないのが現状でした。
そこで、Google Gears の Database です。
大容量な上に、検索も SQL ベースで高速なのです。
また、Apollo β版にも Gears の Database と同様に SQLite ベースのデータベースが付属することが決まっています。
Adobe の中の人のブログによると、Google Gears と Apollo はこの部分で連携していくようです。
Apollo アプリでもウェブアプリでも、同じようにローカル DB を使えるようなインターフェースがあったら便利だよね。Adobe と Google は、そのインターフェースを連携しながら考えていくよ。
I meant to add that we are working on aligning the Apollo DB and Gears DB apis, with the goal of making it easier to build applications and code that can leverage both API implementations (on the desktop and in the browser).
Apollo Beta will include SQLite Embedded Database at Mike Chambers
Google と Adobe の連携話からも SQL ベースのローカルストレージが流行っていくような予感がします。
JavaScript の実装をしていると、ちょっと複雑な処理が入ると、ブラウザが応答しなくなり、CPU 使用率が 100% になってしまいます。
これを解決するためには、実装すべき機能を細切れにして、setTimeout で呼び出さなければなりませんでした。
しかし、ソースの可読性が下がってしまうため、あまりやりたくない手段です。
そこで、Google Gears の WorkerPool です。
思い処理を WorkerPool に任してしまって、バックグラウンドで処理してもらいます。ついに、JavaScript でスレッドを手に入れられるのです。