SlideShare a Scribd company logo
1 of 28
Download to read offline
GAE/J&Slim3を業務で利用
してみて困ったこと、とか
     第13回勉強会@岡山
        2012/04/21
自己紹介

● 名前 : 佐藤 勇輔
● 出身 : 埼玉県
● 年齢 : 27歳(84生)
● 勤務先 : 某S社プログラマ(入社3年目)
  ○ Java & SAStruts(Seasar2)
  ○ GAE/J & Slim3
   
● Twitter/Facebook : o310yusuke
● Gmail : yusuke310
● 岡山Javaユーザ会:http://okajug.appspot.com/
本発表について

 本発表は、案件を通して経験し、困ったことと実
際に対応した内容・方法をご報告させて頂きます。
ここで紹介させて頂く内容や方法が
  ”必ず正しい”
とは限りませんので、ご了承ください。
 
発表予定

● GAE/J
● Datastore
● Slim3
 
 
そんな装備で大丈夫か・・・
大丈夫だ、問題ない。
             JavaとSeasarを
             知っているから
             GAE/JとSlim3は
             問題ない。
目次

1. 製造
   a. Datastoreとアプリとしての制約
  b. Datastoreからデータ一括取得とカーソル
   c. repackagedパッケージ
2. 単体テスト
   a. JUnitとWeb Applicationのタイムゾーン
  b. テストデータとModelRef
3. 結合テスト
   a. GAE環境でのテスト
  b. Indexのワナ
1.製造
1-a.Datastoreとアプリとしての制約

● Datastoreに設定できる制約:@Attribute
  ○   主キー(primaryKey = true)
  ○   インデックスを付けない(unindexed = true)
  ○   自動設定(listener = クラス名)
  ○   暗号化(cipher = true)
   
● Datastoreに設定できない制約
  ○ Not Null制約
  ○ 文字数、桁数制限

         アプリとして実装する必要あり。
弊社の基本設計書

● DB設計書            ● UI設計書
 ○ 論理名/物理名          ○ 画面入力項目
 ○ 型                  ■ 画面項目名
 ○ アノテーション            ■ 桁数
   ■ 主キー              ■ 表示フォーマット
   ■ バージョン
   ■ インデックス可否
 ○ アプリ制約
   ■ 桁数
   ■ Not null
   ■ インデックスのソート順
1-b.Datastoreからデータ一括取得とカーソル

● Datastoreへのアクセスしよう!
    → できるだけ少なくしたい
    → 必要なデータを一括取得
        1000件/回を超えるとパフォーマンス悪化
        ・処理速度の遅延
        ・メモリ使用率の上昇

        カーソルの利用
        ・1000件/回以下で取得を繰り返す
        ・1000件/回以下となるようページング
1-c.repackagedパッケージ

● ユーザのバスワードをBase64で暗号化しよう!
 ○ GAE SDKのバージョンがアップ(1.6.2)
 ○ EclipseのGAEプラグインがバージョンアップ

      これまでコンパイルできていたソースが、
      突然コンパイルエラーに!!

      Twitterでつぶやいてみた
1-c.repackagedパッケージ

● ユーザのバスワードをBase64で暗号化しよう!
 ○ GAE SDKのバージョンがアップ
 ○ EclipseのGAEプラグインがバージョンアップ
      これまでコンパイルできていたソースが、
      突然コンパイルエラーに!!

      <GAE SDK>
      ・Base64を含むパッケージがrepackagedへ
      <GAEプラグイン>
      ・repackagedパッケージがErrorへ

      <GAEプラグイン>
      repackagedパッケージをWorningに(一時しのぎ)
2.単体テスト
2-a.JUnitとWeb Applicationのタイムゾーン

● お知らせ掲示板を作ってみよう!
  ○ 【要件】設定した期間の間、お知らせ情報を表示する
  ○ たまたま0時を過ぎたときに動作テストを実施
    ■ 出るはずが出ない!and 消えるはずが出る!?
       ・期間設定は時刻を0時で登録
       ・システム日付取得処理はJavaのCalendarを利用
       ・日付判定はJavaのDateを利用
       ・JUnitでは動作確認済み
2-a.JUnitとWeb Applicationのタイムゾーン

● お知らせ掲示板を作ってみよう!
  ○ 【要件】設定した期間の間、お知らせ情報を表示する
  ○ たまたま0時を過ぎたときに動作テストを実施
    ■ 出るはずが出ない!and 消えるはずが出る!?
       ・期間設定は時刻を0時で登録
       ・システム日付取得処理はJavaのCalendarを利用
       ・日付判定はJavaのDateを利用
       ・JUnitでは動作確認済み

       ・JUnitのタイムゾーン:JST
       ・WebApplicationのタイムゾーン:UTC(JST+9)
2-b.テストデータとModelRef

● 外部キー未設定のテストをしてみよう!
 ○ assertNull(model.getModelRef());
   ■ 失敗する!!
   ■ ModelRefを宣言する際にnewしている。。。
    
 ○ assertNull(model.getModel().getKey())
 ○ assertNull(model.getModel().getModel())
   ■ 成功する
   ■ ModelRefに外部キーが設定されているかの判断
      → ModelRefのKeyを確認!
ModelRef
http://code.google.
com/p/slim3/source/browse/trunk/slim3/src/main/java/org/slim3/datastore
/ModelRef.java
3.結合テスト
3-a.GAE環境でのテスト

● 結合テストをGAE無料環境でやろう!
 ○ 管理画面から初期データ登録
 ○ 10人程度で実施(Datastoreの読み書き)
     ・サーバ応答がない・・・
     ・Datastoreの書き込み回数が無料上限へ

     ・GAEの再起動は日本時間16時
     ・日本時間16時まで応答なし
     ・何も作業できず。。。

     ・別アカウントで同じアプリをデプロイ
     ・テスト開始前に課金しておく
3-b.Indexのワナ

● 改訂が入りインデックスを追加しなきゃ!
 ○ 既存データあり
 ○ 1KINDに複数のインデックスあり
     ・改訂後のアプリをデプロイした
     ・「Deployment completed successfully」が
      出たから動作確認してみた
     ・Exception。。。

     ・追加したインデックスが「building」
     ・約5時間ほど継続
     ・削除しようとしたが、Javaでは無理(?)

     ・時間帯によってbuidingの時間はまちまち
一番いいのを頼む
オススメ図書

● オープンソース徹底活用
  Slim3 on Google App Engine for Java
  ○ WebアプリのアーキテクチャであるMVCモデルの説明
  ○ Bigtable&Datastoreに関するAPIの説明
質疑応答&アドバイス

● 質疑応答
    ○ Not Null制約の実際の実装方法は?
      →画面入力値については、必須入力チェックで。
       マスターデータ参照については、システムエラー。
    ○ ユニークについての実装方法は?
      →入力された結果と一致するデータが
       既に登録されているか検索し、チェックする。

●   アドバイス
    ○ Not Null制約はアノテーションで実装するといいかも
     

More Related Content

Similar to 20120421中国gtug

Hadoopデータ基盤とMulti-CloudなML基盤への取り組みの紹介
Hadoopデータ基盤とMulti-CloudなML基盤への取り組みの紹介Hadoopデータ基盤とMulti-CloudなML基盤への取り組みの紹介
Hadoopデータ基盤とMulti-CloudなML基盤への取り組みの紹介MicroAd, Inc.(Engineer)
 
Django/Celeyを用いたデータ分析Webアプリケーションにおける非同期処理の設計と実装
Django/Celeyを用いたデータ分析Webアプリケーションにおける非同期処理の設計と実装Django/Celeyを用いたデータ分析Webアプリケーションにおける非同期処理の設計と実装
Django/Celeyを用いたデータ分析Webアプリケーションにおける非同期処理の設計と実装Satoshi Nagayasu
 
03 piggyback -by-simple-code-public
03 piggyback -by-simple-code-public03 piggyback -by-simple-code-public
03 piggyback -by-simple-code-publicSmz Nbys
 
株式会社インタースペース 清水様 登壇資料
株式会社インタースペース 清水様 登壇資料株式会社インタースペース 清水様 登壇資料
株式会社インタースペース 清水様 登壇資料leverages_event
 
Try_to_writecode_practicaltest #atest_hack
Try_to_writecode_practicaltest #atest_hackTry_to_writecode_practicaltest #atest_hack
Try_to_writecode_practicaltest #atest_hackkimukou_26 Kimukou
 
20120616i phonedeveloperworkshop
20120616i phonedeveloperworkshop20120616i phonedeveloperworkshop
20120616i phonedeveloperworkshopYoichiro Sakurai
 
2010年11月27日土曜日FlexUserGroup勉強会 第125回 京都 Flex & Google App Engine for Java & ...
2010年11月27日土曜日FlexUserGroup勉強会 第125回 京都  Flex & Google App Engine for Java & ...2010年11月27日土曜日FlexUserGroup勉強会 第125回 京都  Flex & Google App Engine for Java & ...
2010年11月27日土曜日FlexUserGroup勉強会 第125回 京都 Flex & Google App Engine for Java & ...Sadao Tokuyama
 
Java ORマッパー選定のポイント #jsug
Java ORマッパー選定のポイント #jsugJava ORマッパー選定のポイント #jsug
Java ORマッパー選定のポイント #jsugMasatoshi Tada
 
JavaでWebサービスを作り続けるための戦略と戦術 JJUG-CCC-2018-Spring-g1
JavaでWebサービスを作り続けるための戦略と戦術 JJUG-CCC-2018-Spring-g1JavaでWebサービスを作り続けるための戦略と戦術 JJUG-CCC-2018-Spring-g1
JavaでWebサービスを作り続けるための戦略と戦術 JJUG-CCC-2018-Spring-g1Y Watanabe
 
JSR 352 “Batch Applications for the Java Platform”
JSR 352 “Batch Applications for the Java Platform”JSR 352 “Batch Applications for the Java Platform”
JSR 352 “Batch Applications for the Java Platform”Norito Agetsuma
 
Jjug 20140430 gradle_basic
Jjug 20140430 gradle_basicJjug 20140430 gradle_basic
Jjug 20140430 gradle_basicTakuma Watabiki
 
OpenJDKのコミッタってどんなことしたらなったの?解決してきた技術課題の事例から見えてくる必要な知識と技術(JJUG CCC 2023 Spring)
OpenJDKのコミッタってどんなことしたらなったの?解決してきた技術課題の事例から見えてくる必要な知識と技術(JJUG CCC 2023 Spring)OpenJDKのコミッタってどんなことしたらなったの?解決してきた技術課題の事例から見えてくる必要な知識と技術(JJUG CCC 2023 Spring)
OpenJDKのコミッタってどんなことしたらなったの?解決してきた技術課題の事例から見えてくる必要な知識と技術(JJUG CCC 2023 Spring)NTT DATA Technology & Innovation
 
GrowthForecastことはじめ
GrowthForecastことはじめGrowthForecastことはじめ
GrowthForecastことはじめMakoto Taniwaki
 
これからのJDK/JVM 何を選ぶ?どう選ぶ?
これからのJDK/JVM 何を選ぶ?どう選ぶ?これからのJDK/JVM 何を選ぶ?どう選ぶ?
これからのJDK/JVM 何を選ぶ?どう選ぶ?Takahiro YAMADA
 
前回のCasual Talkでいただいたご要望に対する進捗状況
前回のCasual Talkでいただいたご要望に対する進捗状況前回のCasual Talkでいただいたご要望に対する進捗状況
前回のCasual Talkでいただいたご要望に対する進捗状況JubatusOfficial
 
Rocroにおけるgcp活用事例
Rocroにおけるgcp活用事例Rocroにおけるgcp活用事例
Rocroにおけるgcp活用事例Kishin Yagami
 
事例紹介「なうまぴおん」
事例紹介「なうまぴおん」事例紹介「なうまぴおん」
事例紹介「なうまぴおん」Eiji Iwazawa
 
Example of exiting legacy system
Example of exiting legacy systemExample of exiting legacy system
Example of exiting legacy systemTakamchiTanaka
 

Similar to 20120421中国gtug (20)

Hadoopデータ基盤とMulti-CloudなML基盤への取り組みの紹介
Hadoopデータ基盤とMulti-CloudなML基盤への取り組みの紹介Hadoopデータ基盤とMulti-CloudなML基盤への取り組みの紹介
Hadoopデータ基盤とMulti-CloudなML基盤への取り組みの紹介
 
Django/Celeyを用いたデータ分析Webアプリケーションにおける非同期処理の設計と実装
Django/Celeyを用いたデータ分析Webアプリケーションにおける非同期処理の設計と実装Django/Celeyを用いたデータ分析Webアプリケーションにおける非同期処理の設計と実装
Django/Celeyを用いたデータ分析Webアプリケーションにおける非同期処理の設計と実装
 
03 piggyback -by-simple-code-public
03 piggyback -by-simple-code-public03 piggyback -by-simple-code-public
03 piggyback -by-simple-code-public
 
株式会社インタースペース 清水様 登壇資料
株式会社インタースペース 清水様 登壇資料株式会社インタースペース 清水様 登壇資料
株式会社インタースペース 清水様 登壇資料
 
Try_to_writecode_practicaltest #atest_hack
Try_to_writecode_practicaltest #atest_hackTry_to_writecode_practicaltest #atest_hack
Try_to_writecode_practicaltest #atest_hack
 
Google Product
Google ProductGoogle Product
Google Product
 
20120616i phonedeveloperworkshop
20120616i phonedeveloperworkshop20120616i phonedeveloperworkshop
20120616i phonedeveloperworkshop
 
2010年11月27日土曜日FlexUserGroup勉強会 第125回 京都 Flex & Google App Engine for Java & ...
2010年11月27日土曜日FlexUserGroup勉強会 第125回 京都  Flex & Google App Engine for Java & ...2010年11月27日土曜日FlexUserGroup勉強会 第125回 京都  Flex & Google App Engine for Java & ...
2010年11月27日土曜日FlexUserGroup勉強会 第125回 京都 Flex & Google App Engine for Java & ...
 
Java ORマッパー選定のポイント #jsug
Java ORマッパー選定のポイント #jsugJava ORマッパー選定のポイント #jsug
Java ORマッパー選定のポイント #jsug
 
JavaでWebサービスを作り続けるための戦略と戦術 JJUG-CCC-2018-Spring-g1
JavaでWebサービスを作り続けるための戦略と戦術 JJUG-CCC-2018-Spring-g1JavaでWebサービスを作り続けるための戦略と戦術 JJUG-CCC-2018-Spring-g1
JavaでWebサービスを作り続けるための戦略と戦術 JJUG-CCC-2018-Spring-g1
 
0621 ndk game
0621 ndk game0621 ndk game
0621 ndk game
 
JSR 352 “Batch Applications for the Java Platform”
JSR 352 “Batch Applications for the Java Platform”JSR 352 “Batch Applications for the Java Platform”
JSR 352 “Batch Applications for the Java Platform”
 
Jjug 20140430 gradle_basic
Jjug 20140430 gradle_basicJjug 20140430 gradle_basic
Jjug 20140430 gradle_basic
 
OpenJDKのコミッタってどんなことしたらなったの?解決してきた技術課題の事例から見えてくる必要な知識と技術(JJUG CCC 2023 Spring)
OpenJDKのコミッタってどんなことしたらなったの?解決してきた技術課題の事例から見えてくる必要な知識と技術(JJUG CCC 2023 Spring)OpenJDKのコミッタってどんなことしたらなったの?解決してきた技術課題の事例から見えてくる必要な知識と技術(JJUG CCC 2023 Spring)
OpenJDKのコミッタってどんなことしたらなったの?解決してきた技術課題の事例から見えてくる必要な知識と技術(JJUG CCC 2023 Spring)
 
GrowthForecastことはじめ
GrowthForecastことはじめGrowthForecastことはじめ
GrowthForecastことはじめ
 
これからのJDK/JVM 何を選ぶ?どう選ぶ?
これからのJDK/JVM 何を選ぶ?どう選ぶ?これからのJDK/JVM 何を選ぶ?どう選ぶ?
これからのJDK/JVM 何を選ぶ?どう選ぶ?
 
前回のCasual Talkでいただいたご要望に対する進捗状況
前回のCasual Talkでいただいたご要望に対する進捗状況前回のCasual Talkでいただいたご要望に対する進捗状況
前回のCasual Talkでいただいたご要望に対する進捗状況
 
Rocroにおけるgcp活用事例
Rocroにおけるgcp活用事例Rocroにおけるgcp活用事例
Rocroにおけるgcp活用事例
 
事例紹介「なうまぴおん」
事例紹介「なうまぴおん」事例紹介「なうまぴおん」
事例紹介「なうまぴおん」
 
Example of exiting legacy system
Example of exiting legacy systemExample of exiting legacy system
Example of exiting legacy system
 

20120421中国gtug