GearsMonkey入門 -- Google Gears WorkerPoolのはまりどころ

Google GearsとGreasemonkeyをセットにして使うことをGearsMonkeyと名付けて紹介されているのをはてなブックマーク - miyagawaのブックマーク / 2007年11月22日で知りました。


Google Gearsの持っている機能をGreasemonkeyからも呼び出せるところを利用して、どんなウェブページでも(自分でコードを書けば)オフライン機能をくっつけることができたりするようになるわけです!というわけで、なにか作ってみようと思っていじったら思わぬところではまって進まず(MMgcに続いてまた)何もできあがらなかったため、以下はまりどころについてだけですが書いておきます...

Google Gearsの機能

まずはじめに、オフライン機能のほかにもGoogle Gearsにはいくつか機能があるので、まずはじめにそれをおさらいしてみます。 Google Gears API - Google Codeを見るとGoogle gearsには大きくわけて三つの機能があるのがわかります。
LocalServer
URLを指定してHTMLや画像をローカルにキャッシュします
Database
javascriptからsqliteを使うことができます
WorkerPool
非同期処理のためのしくみを提供してくれます

ひとつめのLocalServerは触っていませんがURLをキーにしてリソースをキャッシュしておいたりする機能を提供しているようです。

ふたつめのDataBaseはsqliteがjavascriptから呼べるようになっていて、FirefoxのmozIStorageService - MDCとおなじようにローカルにデータベースを構築、操作することができます。

今回はみっつめのWorkerPoolではまりました。
これはjavascriptにスレッドを提供するものですが、スレッドと聞いてふつうイメージするようなものとは大きく違っています。そしてなんか不安定です。

WorkerPoolの使い方

ふつうスレッドと聞いたら、スレッド間でアドレス空間が共有されていてほかのスレッドとひとつの変数を共有しているイメージがありますが、WorkerPoolはそうなっていません(だからスレッドという名前ではよんでいないのでしょう)。 そもそもjavascriptのオブジェクトにスレッドをまたいでアクセスできないので(なぜなのかはぜんぜん知りません。ガベージコレクションの実装が大変になるからとかなのでしょうか。Objective-C++でも同様に異なるスレッドが生成したオブジェクトにはアクセスできないという制限があるようです)、その制約と折り合いをつけつつなんとかした実装になっています。

まずWorkerPool Module API - Google Gears API - Google Codeを見ると、ワーカを作るAPIはint createWorker(scriptText)になっていてscriptTextには関数オブジェクトではなく、文字列としてjavascriptのコードを渡すことになっています。これは文字列であれば単純なCのポインタとして渡すことができてjavascriptのオブジェクトをスレッド間で参照するのはNGという制約をクリアできるからです。

というわけでワーカで実行したい関数をworkerFuncとすると
var workerFunc = function () {
   var n = 0;
   google.gears.workerPool.onmessage = function(messageText,senderId,message) {
        switch( messageText ) {
           case: .....
           case: .....
   }
}
var workerID = unsafeWindow.google.gears.workerPool.createWorker( 
    "(" + workerFunc.toString() + ")" + "( )"
 );

というかんじで新しくワーカをつくることができます。 ワーカの中からは、一切DOMに触れることができません。ワーカからアクセスできるのはjavascriptのコアが持っているDateやArrayのようなオブジェクトとGoogle Gearsの持っている機能だけで、ウインドウの中を直接参照したりすることはできません。メインのウインドウとワーカとの間で値のやり取りをしたいときは
  1. createWorkerのコードに直接埋め込む
  2. sendMessage/onmessageを使う
のどちらかの方法でやるしかありません。 sendMessageは、メインのスレッドから生成したワーカに対して文字列を送信することができます。createWorkerの戻り値でメッセージを送りたいワーカを指定して送ります。
unsafeWindow.google.gears.workerPool.sendMessage(String("increment"), workerID);
ワーカの側で送られてきたメッセージを受け取るには google.gears.workerPool.onmessage に関数をいれておけばokです。ワーカの側からメインのスレッド側にデータを送りたいときも同様にsendMessageを使います。

が、ワーカの中からsendMessageを呼ぶところが不安定なようで、いっときは動いていたのにこの記事を書き始めたらFirefoxごと落ちてしまうようになってしまいました(OSX Firefox 2.0.0.9+Google Gears 0.2.4.0)... サンプルとしてResources and Tools - Google Gears API - Google Codeで公開されているコードのsample/primeを参考にして同じように書いて、やっと動くようになって、よーしと書き始めたんですけど...

primeはワーカを使って素数を求めていくサンプルで、ほかのワーカプールのサンプルコードに比べて圧倒的にエレガントなコードなので、これを読むのがいいと思います。動かすとこんなかんじでstartを押すとひたすら{p, p+2, p+6, p+8}の条件を満たす素数が計算されていきます。

ソースコードはgoogle-gears - Google Codeで公開されていて、配布されているバイナリもシンボル情報が含まれているので、すぐに原因を調べたりも(能力次第で)できたりします。

補足

あとWindows版はOSX版よりメンテナンスされていないようでバージョンが古く、はじめに

window.google.gears.factory.create('beta.workerpool', '1.1');
するところでバージョン指定をひとつ下げて1.0にしないとFailed to create requested object.と言われてワーカープールを作ることができませんでした。動かなくなっちゃったのてちょっと再試できてないのですが1.0だとワーカからsendMessageしてもメインのスレッドが反応してくれなかった気がします(Windows Firefox 2.0.0.9+Google Gears 0.1.54.0)。

"Gearsのワーカープールは気難しいところがあります"ぐらいのことしか書けずちっともGearsMonkeyの話になっていなくてごめんなさい。次回きちんとどうしたら落ちる/落ちないのかを押さえた上でGearsMonkeyでなにか作ってみたいと思います...

tags

  • google gears
  • greasemonkey
  • 「GearsMonkey入門 -- Google Gears WorkerPoolのはまりどころ」のはてなブックマーク数
  • 「GearsMonkey入門 -- Google Gears WorkerPoolのはまりどころ」deliciousブックマーク数
  • 「GearsMonkey入門 -- Google Gears WorkerPoolのはまりどころ」をはてなブックマークに追加
  • save "GearsMonkey入門 -- Google Gears WorkerPoolのはまりどころ" to del.icio.us
  • 「GearsMonkey入門 -- Google Gears WorkerPoolのはまりどころ」をリアルタイムブログ検索
  • permalink
  • E4Xっぽい記述でXPath式の文字列を作るXPathBuilder
  • Firefox3で動くGreasemonkeyを作る&新機能の@import @require

comments

TypeKey Enabled
スタイル用のHTMLタグが使えます。
*required

trackbacks

トラックバック元エントリにこのエントリへのリンクがない場合はトラックバックを受け付けません。

http://labs.gmo.jp/mt/mt-tb.cgi/180
Favicon for http://www.junglejava.jp/archives/2008/01/entry_563.htmlGoogle Gears + Greasemonkey = GearsMonkey
2008.01.07 23:53
Jungle Java
Google Japan Blog で、「Google Gears」 と 「Firefox」 のアドオンである 「Greasemonkey」 を組み合わせ...
©2010 Kentaro Kumagai, GMO Internet Labs., GMO Internet, inc.
bits and bytes
2007 .11. 22 19:07

tagcloud

  • API1
  • C/C++2
  • E4X1
  • FUSE2
  • Firefox18
  • HTML4
  • IE1
  • MySQL1
  • OSX4
  • Opera2
  • PHP4
  • XML1
  • XPCOM4
  • XPath3
  • apache2
  • binary2
  • book1
  • data11
  • debug4
  • design1
  • experiments3
  • extension10
  • google gears1
  • google maps API1
  • greasemonkey3
  • httpd5
  • javascript17
  • linux1
  • logging2
  • mobile3
  • perl4
  • tips4
  • tool11
  • vim2
  • visualization2
  • widget1
  • wii1
  • windows7
  • サービス6
  • 和訳1

Archives

  • 2008.02 (6)
  • 2008.01 (3)
  • 2007.12 (4)
  • 2007.11 (5)
  • 2007.10 (4)
  • 2007.09 (4)
  • 2007.08 (4)
  • 2007.07 (8)
  • 2007.06 (7)
  • 2007.05 (4)
  • 2007.04 (5)
  • 2007.03 (6)
  • 2007.02 (4)
  • 2007.01 (6)

about

  • bits and bytesのXML
  • 「bits and bytes」のCreative Commons
  • Powered by Movable Type
  • イベントと地図 - モグ
  • Use ecto to blog!
  • bits and bytesのはてなブックマーク数
  • bits and bytesをMy Yahoo!に追加
  • Subscribe with Bloglines