日曜日, 4月 25, 2010

【Google App Engine】 Shin1Ogawa Nightから高速化テクまで このエントリーを含むはてなブックマーク


 普通にできることを何でこんなに苦労せにゃならんのか、制約がきつすぎるんじゃボケ~、とかいいながら、毎日毎日GAEの問題にへこまされて、ああ、とっても憂鬱な気分。今日はGAE Nightだけど、正直、GAEのことなんか考えたくないなあ。雨も降っているし。まあ、あれだね。GAEを使うヤシは、はっきりいってバカだね。みんな、Googleに騙されていることに早く気づこうよ。
 でも今日はshin1ogawa ja nightだし、teradaは楽しみにしているし、まあいいか、みたいな感じで出席。このやる気のなさが最近の私である。

魔法使い~shin1ogawa


 mavenを使った開発(gaejsimplequickstart)が便利そうなのと、面倒に思えるtestが意外と簡単に行えるということがわかったのは収穫だった。

 しかし、ライブコーディングをあんなに完璧にやってこなせるshin1ogawaははっきりいってすごいね。実際にやってみるとわかるけど、ライブコーディングはとっても難しいものなんだよ。私は単なるデモだって失敗することが多いというのに・・・、これではGAEの開発が簡単に見えてしまうではないか。

 テストの話題が少ないとおっしゃっていたが、自分にあてはめてちょっと考えてみた。
GAEの開発は特に、まだ機能レベルの検証というか、試行錯誤的にトライ&エラーをやることが多くて、システマチックにテストできないのが今の現状だと思う。テストするまでもなく、うまく動かない(あるいは極端に遅い)という現象に直面してしまって、それを解決するために、膨大な時間をかけて調査や試行錯誤を繰り返すという感じになってしまう。特にパフォーマンスは大事なので、そのためにEntityを何度も作り直したりしていると、サービスのAPIでさえ固められない。

 でもテストドリブンな開発は、品質を考えるうえで重要だと思うので、ある段階で取り入れる必要はあるとは思っている。

高速化テク


 AJAX化

 shin1ogawaもいっていたが、AJAX化は非常に重要だと思う。それから、JSPは基本使わず、セッションも使わないようにする。具体的には、appengine-web.xmlに下記を追加する。

<sessions-enabled>false</sessions-enabled>
(参考:AppEngineでsessionを有効にしていると遅くなる

セッションの代替については、JavaScriptでCookieに保存するか、Client-side Storageを使うのがいいと思う。
 AJAXを使えば、くるくるインジケータで、レスポンスの遅さを誤魔化せる(?)し、エラーハンドリングも楽ちんになる。メーリングリストのケースのように、ごくまれに起こるタイムアウトエラーの対処などにも、AJAXでリトライ実行してあげればよい。というか、エラーが出る前提で考えるべきで、佐藤さんもおっしゃっているように、リトライやスキップ等のロジックを書いておくのがお勧めである。

 Entity設計

 石井さんのSlim3 事例報告 運送コスト見積もりシステム mixcargoのチューニングの話は重要だと思った。
  一つ目は、Index爆発を起こさないよう、Entityの設計をシンプルにすること。また、DataStoreにおけるSelectを単純なものにし、InMemoryでfilterInMemory、sortInMemoryを実行すること。
  二つ目は、INSERTにおけるQuotaの上限が2500件/分(課金上げても上限は増やせない)なので、Entityの数を減らしてGETをがんばるという話。

 それから、Datastore書込については、ashigeruさん情報によると、TQを介さないより介したほうが2割程度PUTは速くなるとのこと。リモート実行におけるレイテンシの影響かもしれない。

 funyamoraさんのチューニングでは、複数のプロパティをBlobにまとめるということまでやっておられた。これはかなり速そうだ。

 静的コンテンツ

 静的ファイルとリソース ファイルによれば、<static-files>を追加することで、静的ファイルが専用のサーバー(フロントエンド?)のキャッシュから提供されるようになる。


<static-files>
<include path="/**.png"/>
<exclude path="/data/**.png"/>
</static-files>



 静的ファイルについては、jsやcssなどは複数個に分けず、なるべく1ファイルにした方が速いらしい。また、ブラウザキャッシュなども有効に使うとよい。

 funyamoraさんによれば、静的ファイルはServletから直接出力させた方が速いとのこと。(専用サーバキャッシュと比べてどれくらい速いかは検証が必要である。) 
 
 Spin up
 
 よく知られているが、appengine-web.xmlに<precompilation-enabled>を追加することでDeploy時にプリコンパイルしてくれるのでSpin upに有効。また、GAE/J、起動時間(spin up時間)短縮の試行錯誤によると、クラスローディングを減らすのが有効らしい。


<precompilation-enabled>true</precompilation-enabled>


 funyamoraさんによれば、以下をやることで時間短縮できたとのこと。


* Servletは複数に分けるのではなく1つにする
* ブランクのプロジェクトの方がSpin upが速かった(中身を軽くした方がよい(?))
* JSPを使わない


全体の感想



 shin1ogawaさんのプレゼンススキル、皆さんの積極的な濃い発言など、ajnは相当高いレベルになってきたなというのが全体の印象である。また、インパクトのある具体的な事例が出始めたのも大きい。
 帰り際、「なぜそんなにGAEにこだわるの?」と聞く輩に「制約があるから燃えるのさ」といって目をギラギラさせている自分がいた。

木曜日, 4月 08, 2010

【雑記】 限られた時間を有意義につかおう。そのためには・・ このエントリーを含むはてなブックマーク


お古の技術で潰した世界進出のチャンス. 5年以上の無駄を乗り超えられるかより


ホメオトシスのスレッドにも書いていますように(↑)、小生はこの10年間、ほぼ一人で日本市場のItanium翼賛体制に反攻してきました。そして小生の危憂が愈々顕在化してしまった。
ですから、それ見たことか!、と心が弾むかなと思っていた筈が、そうはならないのが悲しい。
悪い結果が予想通りになっても、耳を貸さなかった連中には、唯、虚しさを感じるだけです。
でも、ITの風景としては締めておかなければなりません。ステークホルダーに反省を促したい。
何故何回もこんな事を繰り返すのだろう。


 中島さんの話を理解するには、このビデオを見るのが一番はやい。
 Utilizationを上げることが重要というメッセージが含まれているが、これは、「1.3.2 の機能強化に見る方向性、それから議論のまとめ」で述べた資源の最適化と同じ意味である。(これは最近わかったこと)

 未来を予想できる慧眼の持ち主はなかなかいない。
 未来が予想できたとしても何か大きなビジネスチャンスを得られるわけではないのだが、少なくとも無駄なことに時間とお金をかけなくてすむ。限られた時間のなかでは、有意義なことにだけ時間とお金を費やすことが重要だと思う。
 
 そのためにも、これからはもっと素直に話を聞くことにしよう。(ほんとかよっていわれそうだけど)

火曜日, 4月 06, 2010

【Google App Engine】 開発環境で失敗するのにプロダクション環境で成功する件 このエントリーを含むはてなブックマーク


 先日、GDataAPI を非同期に実行するライブラリを公開したのだが、これを作っているときに不思議な現象に出くわしたのでメモっておく。


 * 開発環境ではちゃんと動くのにプロダクション環境では動かない。

  原因 => HTTPヘッダの判断をcase-sensitiveにしていたから。開発環境では、HTTPヘッダ Content-Type で返すが、プロダクション環境は content-type で返す。(o≧3≦o)


 これはまあ、100歩譲って許してもいいけど、問題は以下のケース。


 * プロダクション環境で動くのに開発環境では動かない

  原因 => problem in dev environment using PUT with java.net.HttpURLConnectionにあるように、PUTメソッドを発行すると、「Entity enclosing requests cannot be redirected without user intervention」が発生してエラーとなる。解決策は、commmons-httpclient-3.0のEntityEnclosingMethod.javaを修正して、lib/impl/appengine-api-stubs.jarに組み込めとのこと。(そんなん、やってられるかよ)
 GDataAPIを使ってコンテンツ登録に失敗している方がいたら、とりあえず、プロダクション環境でも試してみることをおすすめする。



 今後はプロダクション環境が私のテスト環境となる予定である。( ̄ー+ ̄) 

(参考) 開発環境ではちゃんと動くのにプロダクション環境では動かない 文字コード編



* 文字コードでハマったら、以下のコードを、appengine-web.xmlに追加してみる。


 <property name="file.encoding" value="UTF-8"/>
 <property name="DEFAULT_ENCODING" value="UTF-8"/>



HTMLには、


 <head>
 <meta http-equiv="content-type" content="text/html; charset=UTF-8">
 </head>



responseには、


resp.setCharacterEncoding("UTF-8");



requestには、


 req.setCharacterEncoding("UTF-8");



 を追加してみる。

 
© 2006-2015 Virtual Technology
当サイトではGoogle Analyticsを使ってウェブサイトのトラフィック情報を収集しています。詳しくは、プライバシーポリシーを参照してください。