Download - appengine活用事例資料@TDDBC札幌2.1
![Page 1: appengine活用事例資料@TDDBC札幌2.1](https://reader035.vdocuments.pub/reader035/viewer/2022081516/556a5d56d8b42a7a138b5163/html5/thumbnails/1.jpg)
appengine 活用事例( Slim3,Scenic3,PirkaEngine,
TDD,etc
sue445
![Page 2: appengine活用事例資料@TDDBC札幌2.1](https://reader035.vdocuments.pub/reader035/viewer/2022081516/556a5d56d8b42a7a138b5163/html5/thumbnails/2.jpg)
@sue445 ( すえよんよんご / 末吉 剛 )
• 避暑のため東京から参戦o ただし福岡出身なので寒いのは苦手w
• レッドフォックス株式会社所属o SI で web アプリ中心に 1 人 TDD やってます
• Google App Engine/Slim3 クラスタo appengine は 1 年半くらい触ってますo appengine ja night には半分くらい参加o (一応) Slim3 のコミット権限所持w
• TDD 歴は 1 年くらいo 福岡、東京 1.5 に続き 3 回目の参加o 今回は ( も )Java の TA
Java や Slim3 のことなら何でも聞いてください!
![Page 3: appengine活用事例資料@TDDBC札幌2.1](https://reader035.vdocuments.pub/reader035/viewer/2022081516/556a5d56d8b42a7a138b5163/html5/thumbnails/3.jpg)
jubeat (ユビート)beatmania, DDR, ポップンミュージックに代表されるいわゆる KONAMI の音ゲー
![Page 4: appengine活用事例資料@TDDBC札幌2.1](https://reader035.vdocuments.pub/reader035/viewer/2022081516/556a5d56d8b42a7a138b5163/html5/thumbnails/4.jpg)
jubeat plus
• jubeat の iPad/iPhone アプリ版
• アプリ本体は無料• 楽曲パックが 4 曲入り 450 円• 現在まで 30 パック以上配信
![Page 5: appengine活用事例資料@TDDBC札幌2.1](https://reader035.vdocuments.pub/reader035/viewer/2022081516/556a5d56d8b42a7a138b5163/html5/thumbnails/5.jpg)
(ユビートプラスプラス)
• http://jubeatplusplus.appspot.com/ • jubeat plus のスコア登録サイト• iPhone Explorer で抽出した sqlite ファイルをサイトにアッ
プロードしてスコア登録(厳密には CSV ファイルを経由)• 登録したスコアを web に公開したり、平均スコアからの差
分を見ることができます
![Page 6: appengine活用事例資料@TDDBC札幌2.1](https://reader035.vdocuments.pub/reader035/viewer/2022081516/556a5d56d8b42a7a138b5163/html5/thumbnails/6.jpg)
jubeat++ のアーキテクチャ
• Google App Engine• Slim3 (+ ktrwjr)• Scenic3• PirkaEngine• Twitter4j• jQuery• Maven2• etc...
![Page 7: appengine活用事例資料@TDDBC札幌2.1](https://reader035.vdocuments.pub/reader035/viewer/2022081516/556a5d56d8b42a7a138b5163/html5/thumbnails/7.jpg)
Google App Enginehttp://code.google.com/intl/ja/appengine/
• Google が提供している PaaSo Python/Java/Go があるけど最終的には Ajaxにいきつくのでどの言語を使っても一緒
o 無料で始められて無料で続けられるのがウリだった(過去形)。料金体系の変更 (11/1 〜 ) により無料枠では厳しいか
o 他の PaaS や IaaS に比べて学習コストが多少高いのがネックか?
• 提供されている機能の一部o UserService, Datastore(BigTable), Memcache, cron,
TaskQueue, URL Fetch, Mail, Channel, etc...o http://code.google.com/intl/en/appengine/docs/java/overvi
ew.html
![Page 8: appengine活用事例資料@TDDBC札幌2.1](https://reader035.vdocuments.pub/reader035/viewer/2022081516/556a5d56d8b42a7a138b5163/html5/thumbnails/8.jpg)
appengine のサーバ構成
![Page 9: appengine活用事例資料@TDDBC札幌2.1](https://reader035.vdocuments.pub/reader035/viewer/2022081516/556a5d56d8b42a7a138b5163/html5/thumbnails/9.jpg)
静的コンテンツにアクセスがあった場合
• 静的コンテンツへのアクセスは FrontEnd Server だけ見に行くので爆速
• Google の過去の歴史からも FrontEnd Serverが落ちたことはほとんどないらしい
![Page 10: appengine活用事例資料@TDDBC札幌2.1](https://reader035.vdocuments.pub/reader035/viewer/2022081516/556a5d56d8b42a7a138b5163/html5/thumbnails/10.jpg)
動的コンテンツにアクセスがあった場合
• App Server は一定時間アクセスがないとインスタンスが落ちるため (spin off) 、起動に時間がかかる (spin up)
• 素の Servlet だけで spin up は 600ms くらい• 30 秒ルールがあるため spin up は速ければ速い方がいい• appengine 自体が 1 秒で処理する用に最適化されていて、スケール
アウトもされやすくなる
![Page 11: appengine活用事例資料@TDDBC札幌2.1](https://reader035.vdocuments.pub/reader035/viewer/2022081516/556a5d56d8b42a7a138b5163/html5/thumbnails/11.jpg)
spin up と戦うために• ライブラリへの依存は極力減らす
o jar がたくさんあると ClassLoader で読み込む時に時間がかかりボトルネックになる
o WEB-INF/lib にあるだけなら無害 (JUnit とか )o commons 系もできれば使わない方がいい
• JSP は使わないo Jasper の初期化だけで 5000 〜 6000ms かかるため
• オンプレで使ってるような FW は使わないo この手の FW は初期化に時間がかかるためo Spring だと最低限の初期化だけで 10000ms 以上かかるo FW は初期化の速い物だけを使う
![Page 12: appengine活用事例資料@TDDBC札幌2.1](https://reader035.vdocuments.pub/reader035/viewer/2022081516/556a5d56d8b42a7a138b5163/html5/thumbnails/12.jpg)
spin up と戦う方法【結論】 Ajax を使う• 画面はモック html を返し動的コンテンツは js で処理する• html なら FrontEnd Server から返されるので速く ,spin up
に影響されない• Server Side は json を返すだけにすれば純粋なデータだけを
返すので spin up の時間もそんなにかからない ( 素のServlet と同じくらい )
• appengine では Thread 生成はできないが Ajax から非同期で呼ぶことにより実質的にマルチスレッドで動かせる
参考資料:@higayasuo さんのブログ• App Engineではどの言語を使えばいいのか• AppEngine/Jのspin-upを劇的に改善する方法
![Page 13: appengine活用事例資料@TDDBC札幌2.1](https://reader035.vdocuments.pub/reader035/viewer/2022081516/556a5d56d8b42a7a138b5163/html5/thumbnails/13.jpg)
Slim3https://sites.google.com/site/slim3appengine/
• メインコミッタは Seasar2 の @higayasuo さん • appengine に特化した FW で appengine で Java ならこれが
デファクトスタンダード• spin up に強い( 1000ms前後) • Datastore周りだけでも使う価値あり
o S2JDBC のような流れるコーディング• テストの時は Datastore や Memcache のデータが setUp/
tearDown で初期化されるのが便利
![Page 14: appengine活用事例資料@TDDBC札幌2.1](https://reader035.vdocuments.pub/reader035/viewer/2022081516/556a5d56d8b42a7a138b5163/html5/thumbnails/14.jpg)
Kotori Web JUnit Runner (ktrwjr)http://code.google.com/p/ktrwjr/wiki/KotoriWebJUnitRunner
• @bufferings さん作 • appengine サーバ用の JUnit ランナー • slim3 にバンドルされている• 本番サーバやローカルサーバでテストケースを実行できる• 本番とローカルで挙動が違うのはよくあることなので本番
サーバでテストケースを動かせるのは嬉しい• テストとはいえ Datastore のデータは共通なので update 系
は要注意o 本番環境上では動かさないようにするか、ステージング
用にアプリを1つ作るのが吉
![Page 15: appengine活用事例資料@TDDBC札幌2.1](https://reader035.vdocuments.pub/reader035/viewer/2022081516/556a5d56d8b42a7a138b5163/html5/thumbnails/15.jpg)
Scenic3http://sites.google.com/site/aboutscenic3/
• @shuji_w6e さん作• Slim3 の Controller を薄くラップしたライブラリ• Controller クラスを複数集めた Page クラスを扱うのでクラ
スが増えすぎない。 Struts感覚で使えるo jubeat++ だと Page は全 17 クラス、 Controller に換算す
ると全部で 37個o 同じクラスにあった方がリファクタリングはしやすい
![Page 16: appengine活用事例資料@TDDBC札幌2.1](https://reader035.vdocuments.pub/reader035/viewer/2022081516/556a5d56d8b42a7a138b5163/html5/thumbnails/16.jpg)
1 画面を Slim3 で作るとこんな感じpackage net.sue445.jubeatplusplus.controller.home.user.update;
// 入力フォーム初期化public class InputController extends Controller{ public Navigation run(){ }}
// 確認ボタンpublic class ConfirmController extends Controller{ public Navigation run(){ }}
// 登録ボタンpublic class ExecuteController extends Controller{ public Navigation run(){ }}
![Page 17: appengine活用事例資料@TDDBC札幌2.1](https://reader035.vdocuments.pub/reader035/viewer/2022081516/556a5d56d8b42a7a138b5163/html5/thumbnails/17.jpg)
Scenic3 だとこんな感じpackage net.sue445.jubeatplusplus.page.home.user;
// ユーザ情報変更ページ@Page("/home/user/update")public class UpdatePage extends ScenicPage{ // 入力フォーム初期化 @ActionPath("input") public Navigation input(){ } // 確認ボタン @ActionPath("confirm") public Navigation confirm( @RequestParam("userId") String userId, @RequestParam("userName") String userName){ } // 登録ボタン @ActionPath("execute") public Navigation execute( @RequestParam("userId") String userId, @RequestParam("userName") String userName){ }}
![Page 18: appengine活用事例資料@TDDBC札幌2.1](https://reader035.vdocuments.pub/reader035/viewer/2022081516/556a5d56d8b42a7a138b5163/html5/thumbnails/18.jpg)
PirkaEnginehttp://docs.pirkaengine.org/
• @shuji_w6e さん作• scenic3 と連携することができるテンプレートエンジン• 普通の HTML ファイルをテンプレートとして使える
o モックとして作った HTML をそのままソースに組み込める (JSP に組み込む手間が省ける )
• レスポンスをアプリ側で管理できるのもメリットo 画面生成が重いページは HTML を Memcache に入れてお
くことで速くできるo 例 ) jubeat++のスコアページ
キャッシュ非使用時 : 7000ms キャッシュ使用時 : 100ms前後
![Page 19: appengine活用事例資料@TDDBC札幌2.1](https://reader035.vdocuments.pub/reader035/viewer/2022081516/556a5d56d8b42a7a138b5163/html5/thumbnails/19.jpg)
その他• Twitter4j
o Java 用 Twitter ライブラリで、 Java で Twitter やるなら定番
o appengine 用の jar を使えば appengine の非同期 API を使うのでかなり速い
• Maven2o appengine や slim3 は頻繁にアップデートされるため
pom を編集するだけですぐに jar を差し替えることができるのは便利
o アーキタイプもあるのでプロジェクト作成も楽々
![Page 20: appengine活用事例資料@TDDBC札幌2.1](https://reader035.vdocuments.pub/reader035/viewer/2022081516/556a5d56d8b42a7a138b5163/html5/thumbnails/20.jpg)
参考文献(スターターキット)
プログラミング Google App Engine
• 2009 年 11月出版ということで若干情報は古いが、 appengineについて広く深く網羅していて詳しい
• Java と Python についてほぼ半々記載されているので Pythonな人にもおすすめ
![Page 21: appengine活用事例資料@TDDBC札幌2.1](https://reader035.vdocuments.pub/reader035/viewer/2022081516/556a5d56d8b42a7a138b5163/html5/thumbnails/21.jpg)
参考文献(スターターキット)
オープンソース徹底活用 Slim3 on Google App Engine for Java
• Slim3 といいつつも Datastoreのインデックスの説明が中心なのでどの言語であっても有用
• Datastore はインデックスの構造が一番のキモなのでこれを読めばだいたい理解できる
![Page 22: appengine活用事例資料@TDDBC札幌2.1](https://reader035.vdocuments.pub/reader035/viewer/2022081516/556a5d56d8b42a7a138b5163/html5/thumbnails/22.jpg)
参考文献(実践編)オープンソース徹底活用 Slim3 による Web アプリケーション開発
• FW として Slim3 を使う実用的な 1冊
• Slim3+GWT を用いた実際のアプリ開発を元にしているのでEntity設計が参考になる
• Slim3 でのテスト手法についてあまり言及されてなかったのが難点 (´ ・ ω ・ `)
![Page 23: appengine活用事例資料@TDDBC札幌2.1](https://reader035.vdocuments.pub/reader035/viewer/2022081516/556a5d56d8b42a7a138b5163/html5/thumbnails/23.jpg)
参考文献(実践編)作ればわかる! Google App Engine for Java プログラミング
• Mashup 系中心で TwitterAPI, Google Maps, OpenID など周辺技術との連携が豊富なのでサンプルが非常に実用的
• appengine の機能に関しても一通り網羅している
• Servlet や JSP の基礎から書いてあるので新卒研修にも最適w
![Page 24: appengine活用事例資料@TDDBC札幌2.1](https://reader035.vdocuments.pub/reader035/viewer/2022081516/556a5d56d8b42a7a138b5163/html5/thumbnails/24.jpg)
分からないことがあったら
Twitter で #gaeja や #slim3 をつけて質問すれば誰か教えてくれるハズ
![Page 25: appengine活用事例資料@TDDBC札幌2.1](https://reader035.vdocuments.pub/reader035/viewer/2022081516/556a5d56d8b42a7a138b5163/html5/thumbnails/25.jpg)
おまけ (S3 Tiger)
• S3 Tigero Slim3 用のテスティングユーティリティを作りましたo https://github.com/sue445/s3tiger
![Page 26: appengine活用事例資料@TDDBC札幌2.1](https://reader035.vdocuments.pub/reader035/viewer/2022081516/556a5d56d8b42a7a138b5163/html5/thumbnails/26.jpg)
Slim3 だとpublic class SomeTest{ @Test public void ignoreOnlyProduction(){ if(AppEngineUtil.isProduction()){ return; } // 本番サーバだけでは動かしたくないテスト }
@Test public void ignoreOnlyDevelopment(){ if(AppEngineUtil.isDevelopment()){ return; } // 開発サーバだけでは動かしたくないテスト }}
![Page 27: appengine活用事例資料@TDDBC札幌2.1](https://reader035.vdocuments.pub/reader035/viewer/2022081516/556a5d56d8b42a7a138b5163/html5/thumbnails/27.jpg)
S3 Tiger だとimport net.sue445.s3tiger.Slim3;@RunWith(Slim3.class)public class SomeTest{ @IgnoreProduction @Test public void ignoreOnlyProduction(){ // 本番サーバだけでは動かしたくないテスト }
@IgnoreDevelopment @Test public void ignoreOnlyDevelopment(){ // 開発サーバだけでは動かしたくないテスト }}
![Page 28: appengine活用事例資料@TDDBC札幌2.1](https://reader035.vdocuments.pub/reader035/viewer/2022081516/556a5d56d8b42a7a138b5163/html5/thumbnails/28.jpg)
クラスにも OK
import net.sue445.s3tiger.Slim3;
// 本番サーバでは動かしたくないテストクラス@RunWith(Slim3.class)@IgnoreProductionpublic class OtherTest{ @Test public void someTest(){ 〜 }}
![Page 29: appengine活用事例資料@TDDBC札幌2.1](https://reader035.vdocuments.pub/reader035/viewer/2022081516/556a5d56d8b42a7a138b5163/html5/thumbnails/29.jpg)
アノテーションで DRY を排除
![Page 30: appengine活用事例資料@TDDBC札幌2.1](https://reader035.vdocuments.pub/reader035/viewer/2022081516/556a5d56d8b42a7a138b5163/html5/thumbnails/30.jpg)
ご清聴ありがとうございました!