- コンテキストが作られる
- narwhalの(engine個別の/ここではrhinoの)bootstrap.jsが実行される
ここでNARWHAL_HOMEはWEB-INF/packages/narwhalと決め打ち
その中で(NARWHAL_HOMEの)narwhal.jsが実行され環境が作られる - jackのservletハンドラ(proessメソッド)がrequireされる
アプリは(serviceメソッドから呼ばれ)このハンドラ内で実際に実行される - アプリのWEB-INF/src/jackconfig.jsがrequireされる
(web.xmlの)appとenvironmentに合わせた変数がexportされる - 上記exportされた変数(environmentとapp)を使ってアプリが初期化される
月曜日, 3月 22, 2010
appenginejsのアプリ初期化過程
最初のリクエストが飛んできたときに、appenginejsに同梱されているJSGIServlet.javaで行われていることをまとめておきます。
月曜日, 3月 08, 2010
hotデプロイなGAE開発!
appenginejsでは、war\WEB-INF\jackconfig.jsの中でlocalとhostedという2つの稼働方法をexportしている。
そして、同ディレクトリにあるweb.xmlの中でenvironmentという名前で指定して利用するのだが、これをlocalにしておけば、ソース修正が(jettyの再起動を行わずとも)反映できるようになる。
なお、jackconfig.jsというファイル、何かの設定ファイルのようだけどなんのことはなく、このファイルが、jack経由でJettyで実行されているだけである(このファイルのexports.app)。
そして、同ディレクトリにあるweb.xmlの中でenvironmentという名前で指定して利用するのだが、これをlocalにしておけば、ソース修正が(jettyの再起動を行わずとも)反映できるようになる。
なお、jackconfig.jsというファイル、何かの設定ファイルのようだけどなんのことはなく、このファイルが、jack経由でJettyで実行されているだけである(このファイルのexports.app)。
日曜日, 3月 07, 2010
appenginejsでtimezone
blog-gaeでのtimezone設定のやり方が分からず、ずっと時間表示がUTCだった。
調べてみると起動するservletであるjack-servletを最新ソースではこの設定が可能になっていたので差し替え。
ソースを落としたら、D:\work\blog-gaeに展開して、
調べてみると起動するservletであるjack-servletを最新ソースではこの設定が可能になっていたので差し替え。
ソースを落としたら、D:\work\blog-gaeに展開して、
ant runserverとするだけで、開発用サーバが8080ポートで上がります。ちなみに、WEB-INF\packages\narwhal\lib\sandbox.jsの6行目にある以下を修正すれば、配置場所は変更可能です(Windowsのディレクトリ記述がうまくパースできないようなので、このファイルは無理に改造しています)。
var zzWork = 'd:\\work\\blog-gae\\war\\WEB-INF\\';
土曜日, 3月 06, 2010
火曜日, 2月 23, 2010
appenginejsでrunInTransaction!!
appenginejsで、どうしても出来なかった同一トランザクションでのdb登録がやっとできた。GAEでは同一トランザクションでのデータ更新は、
・同じエンティティグループのエンティティ群しかダメ
・(そのためには先に作ってる同一に入れたい)エンティティからキーをもらう必要あり
このための記述が、昔はModelをnewするときの第一引数にキーを渡す方式だった(よう)だが、
×(昔)var objCom = new Comment(msg.key(),{
msgRef:msg.key(),
content: "This is test comment"
});
今のバージョンではプロパティにparentと切ってそこにキーを渡すことになっている。
○(今)var objCom = new Comment({
parent:msg.key(),
msgRef:msg.key(),
content: "This is test comment"
});
これで、以下のような一括更新が成功するようになる!!
ちなみに、
agl0ZjAwNTQtMDZyDQsSB01lc3NhZ2UYCQw
というキーを与えたら、
agl0ZjAwNTQtMDZyGgsSB01lc3NhZ2UYCQwLEgdDb21tZW50GAoM
というキーを持った(同一エンティティグループに入った)エンティティができている。
・同じエンティティグループのエンティティ群しかダメ
・(そのためには先に作ってる同一に入れたい)エンティティからキーをもらう必要あり
このための記述が、昔はModelをnewするときの第一引数にキーを渡す方式だった(よう)だが、
×(昔)var objCom = new Comment(msg.key(),{
msgRef:msg.key(),
content: "This is test comment"
});
今のバージョンではプロパティにparentと切ってそこにキーを渡すことになっている。
○(今)var objCom = new Comment({
parent:msg.key(),
msgRef:msg.key(),
content: "This is test comment"
});
これで、以下のような一括更新が成功するようになる!!
db.runInTransaction(function() {
db.put([objCom,msg]);
});
ちなみに、
agl0ZjAwNTQtMDZyDQsSB01lc3NhZ2UYCQw
というキーを与えたら、
agl0ZjAwNTQtMDZyGgsSB01lc3NhZ2UYCQwLEgdDb21tZW50GAoM
というキーを持った(同一エンティティグループに入った)エンティティができている。
土曜日, 2月 13, 2010
App Engine JavaScript SDK
GAEのアプリをJavascriptで書けるSDK"appenginejs"というのがあるのだけど、公開されているサンプルアプリ(blog-gae)をWindowsで動かすのにえらく苦労したのでメモ。
"app is not function"とかエラーがでるがこれはウソ。
で、やることは大きく2つ。
パスがうまく取り込めないので置換する(配置場所に合わせて適宜変えて下さい)。
変更するファイルは"blog-gae\war\WEB-INF\packages\narwhal\lib\sandbox.js"の1つだけ。
"\blog-gae\war\WEB-INF\src"は本来classesへのシンボリックリンク。
なのだけど、Windowsなのでこれはclassesをsrcという別名でコピーしておく。
これで、起動はやはり重いけど動くことは動く。日本語も使えている様子。
"app is not function"とかエラーがでるがこれはウソ。
で、やることは大きく2つ。
パスがうまく取り込めないので置換する(配置場所に合わせて適宜変えて下さい)。
変更するファイルは"blog-gae\war\WEB-INF\packages\narwhal\lib\sandbox.js"の1つだけ。
loader.find = function (topId) {
if(topId.match(/\-gae/)){
var zztmp = new Array();
//zztmp = topId.match(/([^\\]+)$/);
zztmp = topId.match(/INF\\(.+)$/);
topId = 'd:\\work\\blog-gae\\war\\WEB-INF\\'+zztmp[1];
}
...
self.find = function (topId) {
if(topId.match(/\-gae/)){
var zztmp = new Array();
zztmp = topId.match(/INF\\(.+)$/);
topId = 'd:\\work\\blog-gae\\war\\WEB-INF\\'+zztmp[1];
}
...
"\blog-gae\war\WEB-INF\src"は本来classesへのシンボリックリンク。
なのだけど、Windowsなのでこれはclassesをsrcという別名でコピーしておく。
これで、起動はやはり重いけど動くことは動く。日本語も使えている様子。
登録:
投稿 (Atom)