grails on gae/j
TRANSCRIPT
![Page 1: Grails on GAE/J](https://reader038.vdocument.in/reader038/viewer/2022110306/554a0f12b4c905825d8b48a9/html5/thumbnails/1.jpg)
Grails on GAE/J
![Page 2: Grails on GAE/J](https://reader038.vdocument.in/reader038/viewer/2022110306/554a0f12b4c905825d8b48a9/html5/thumbnails/2.jpg)
制限事項•Quotashttp://code.google.com/appengine/docs/quotas.html
• The Java Servlet Environmenthttp://code.google.com/appengine/docs/java/runtime.html
• Google App Engine for Java Questionshttp://code.google.com/appengine/kb/java.html
![Page 3: Grails on GAE/J](https://reader038.vdocument.in/reader038/viewer/2022110306/554a0f12b4c905825d8b48a9/html5/thumbnails/3.jpg)
LimitとQuota• Limit• 制限以上は使えない•例)メールのサイズは1Mまで•Quota•お金を払えば増やせる•例)メール送信 2,000 → 7,400,000
![Page 4: Grails on GAE/J](https://reader038.vdocument.in/reader038/viewer/2022110306/554a0f12b4c905825d8b48a9/html5/thumbnails/4.jpg)
Quotas
•無料でどれだけ使えるか•Daily LimitとMaximunRate (分単位)•各API単位とかで細かく指定されている
Request 1,300,000/day、7,400/min
DatastoreAPI 10,000,000/day、57,000/min
![Page 5: Grails on GAE/J](https://reader038.vdocument.in/reader038/viewer/2022110306/554a0f12b4c905825d8b48a9/html5/thumbnails/5.jpg)
The Java Servlet Environment
• 30秒ルール• Thread、FileSystem、java.lang.System、Reflectionの制限
• Request/Responseのサイズ、同時リクエスト数、アプリ内のファイル数/ファイルサイズ
![Page 6: Grails on GAE/J](https://reader038.vdocument.in/reader038/viewer/2022110306/554a0f12b4c905825d8b48a9/html5/thumbnails/6.jpg)
Datastore
![Page 7: Grails on GAE/J](https://reader038.vdocument.in/reader038/viewer/2022110306/554a0f12b4c905825d8b48a9/html5/thumbnails/7.jpg)
Bigtable
•分散ストレージ• RDBMSではない(SQL使えない)• JDO/JPAでアクセスする•使い方は後述
![Page 8: Grails on GAE/J](https://reader038.vdocument.in/reader038/viewer/2022110306/554a0f12b4c905825d8b48a9/html5/thumbnails/8.jpg)
Servcies
![Page 9: Grails on GAE/J](https://reader038.vdocument.in/reader038/viewer/2022110306/554a0f12b4c905825d8b48a9/html5/thumbnails/9.jpg)
用意されてるもの•Memcache• URL Fetch• Mail• Images• Google Accounts
![Page 10: Grails on GAE/J](https://reader038.vdocument.in/reader038/viewer/2022110306/554a0f12b4c905825d8b48a9/html5/thumbnails/10.jpg)
Memcache
•分散インメモリデータキャッシュ• JCache(JSR107)を(ほぼ)実装•完全なKey-Value
![Page 11: Grails on GAE/J](https://reader038.vdocument.in/reader038/viewer/2022110306/554a0f12b4c905825d8b48a9/html5/thumbnails/11.jpg)
Memcacheの有効期限
•デフォルトはメモリ残量がなくなるまでメモリがなくなれば古いのから消える
•有効期限の指定可キャッシュ時間(秒、ミリ秒)
キャッシュ有効期限(java.util.Date)
![Page 12: Grails on GAE/J](https://reader038.vdocument.in/reader038/viewer/2022110306/554a0f12b4c905825d8b48a9/html5/thumbnails/12.jpg)
Memcacheの使用例
•トップページの表示データを格納•マスタデータの格納•GAEっぽい使い方、募集!
![Page 13: Grails on GAE/J](https://reader038.vdocument.in/reader038/viewer/2022110306/554a0f12b4c905825d8b48a9/html5/thumbnails/13.jpg)
Create/Put Memcacheimport javax.cache.*
class BootStrap { def init = { def manager = CacheManager.getInstance() def cache = manager.cacheFactory.createCache([:]) def value = ... // from datastore cache.put('key', value) manager.registerCache('mycache', cache) }}
※あとはCron Jobで定期的にキャッシュ更新
![Page 14: Grails on GAE/J](https://reader038.vdocument.in/reader038/viewer/2022110306/554a0f12b4c905825d8b48a9/html5/thumbnails/14.jpg)
Get Memcache
import javax.cache.*
class CacheController { def index = { def manager = CacheManager.getInstance() manager.getCache('mycache').get('key') }}
![Page 15: Grails on GAE/J](https://reader038.vdocument.in/reader038/viewer/2022110306/554a0f12b4c905825d8b48a9/html5/thumbnails/15.jpg)
CacheManagerはBeanBuilderで定義すると便利
≪grails-app/spring/resources.groovy≫beans = { cacheManager(javax.cache.CacheManager) { it.factroyMethod = 'getInstance' }}
≪Controller≫class SampleController {def cacheManagerdef someMethod = {def cache = cacheManager.getCache(‘mycache’)
}}
![Page 16: Grails on GAE/J](https://reader038.vdocument.in/reader038/viewer/2022110306/554a0f12b4c905825d8b48a9/html5/thumbnails/16.jpg)
Quotas
http://code.google.com/appengine/docs/quotas.html#Memcache
![Page 17: Grails on GAE/J](https://reader038.vdocument.in/reader038/viewer/2022110306/554a0f12b4c905825d8b48a9/html5/thumbnails/17.jpg)
URL Fetch
•HTTP/HTTPSでWeb上のリソースにアクセス
•もちろん自身のアプリもフェッチできる•ファイアーウォールの中のシステムにもアクセスできるらしい
![Page 18: Grails on GAE/J](https://reader038.vdocument.in/reader038/viewer/2022110306/554a0f12b4c905825d8b48a9/html5/thumbnails/18.jpg)
URL Fetch
• java.net.URL、java.net.URLConnectionを使う
•Http(s)URLConnection はGoogle実装• connectTimeout、readTimeoutは変更できない(readTimeoutが5秒っぽい)
![Page 19: Grails on GAE/J](https://reader038.vdocument.in/reader038/viewer/2022110306/554a0f12b4c905825d8b48a9/html5/thumbnails/19.jpg)
URL Fetch
class URLFetchController { def fetch = { new URL(‘http://...’).text }}
![Page 20: Grails on GAE/J](https://reader038.vdocument.in/reader038/viewer/2022110306/554a0f12b4c905825d8b48a9/html5/thumbnails/20.jpg)
URL Fetchでやりたかったこと
•クライアントからPOSTされたJSコードをサーバで実行
• JSコードはもしかすると無限ループとかするかもしれないので3秒くらいでタイムアウトさせたい
•スレッド使えない → じゃあURL Fetchで
![Page 21: Grails on GAE/J](https://reader038.vdocument.in/reader038/viewer/2022110306/554a0f12b4c905825d8b48a9/html5/thumbnails/21.jpg)
URL Fetchでできなかったこと
•URL Fetchを使ってもreadTimeoutが設定できない(5秒)
•非同期リクエストはできない(Pythonの方にはAsynchronous Requestsってのがある)
![Page 22: Grails on GAE/J](https://reader038.vdocument.in/reader038/viewer/2022110306/554a0f12b4c905825d8b48a9/html5/thumbnails/22.jpg)
URL Fetchとは直接関係ないですが
• JSONデータをフェッチするときは、わざわざJSON-libを入れなくても、それっぽいAPIがGrailsにあります。
org.codehaus.groovy.grails.web.json.JSONObject
![Page 23: Grails on GAE/J](https://reader038.vdocument.in/reader038/viewer/2022110306/554a0f12b4c905825d8b48a9/html5/thumbnails/23.jpg)
FixdapFeed(URL Fetchの実用例)
•http://fixdapfeed.appspot.com/• URL Fetchでfixdapからデータ取得•HttpURLConnectionを使用• http://d.hatena.ne.jp/uehaj/20090620/1245470865
•上原さん@JGGUG
![Page 24: Grails on GAE/J](https://reader038.vdocument.in/reader038/viewer/2022110306/554a0f12b4c905825d8b48a9/html5/thumbnails/24.jpg)
Limit
http://code.google.com/appengine/docs/java/urlfetch/overview.html#Quotas_and_Limits
![Page 25: Grails on GAE/J](https://reader038.vdocument.in/reader038/viewer/2022110306/554a0f12b4c905825d8b48a9/html5/thumbnails/25.jpg)
Quotas
http://code.google.com/appengine/docs/quotas.html#UrlFetch
![Page 26: Grails on GAE/J](https://reader038.vdocument.in/reader038/viewer/2022110306/554a0f12b4c905825d8b48a9/html5/thumbnails/26.jpg)
• JavaMail APIを使ってメール送信•Mail Pluginが使える?// TODO 後で(ゲンゾウさんが)試す。
•開発サーバーではメール送信されない
![Page 27: Grails on GAE/J](https://reader038.vdocument.in/reader038/viewer/2022110306/554a0f12b4c905825d8b48a9/html5/thumbnails/27.jpg)
メール送信
From管理者
ログイン中ユーザ
To/Cc/Bcc どこでも
ReplyTo 管理者
![Page 28: Grails on GAE/J](https://reader038.vdocument.in/reader038/viewer/2022110306/554a0f12b4c905825d8b48a9/html5/thumbnails/28.jpg)
Limit
http://code.google.com/intl/ja/appengine/docs/java/mail/overview.html#Quotas_and_Limits
![Page 29: Grails on GAE/J](https://reader038.vdocument.in/reader038/viewer/2022110306/554a0f12b4c905825d8b48a9/html5/thumbnails/29.jpg)
Quotas
http://code.google.com/appengine/docs/quotas.html#Mail
![Page 30: Grails on GAE/J](https://reader038.vdocument.in/reader038/viewer/2022110306/554a0f12b4c905825d8b48a9/html5/thumbnails/30.jpg)
Google Accounts
•Googleアカウントによる認証と承認•ロールはユーザと管理者•Acegi Pluginみたいな感じ•ローカルテスト時は適当なメールアドレスでログイン可能
![Page 31: Grails on GAE/J](https://reader038.vdocument.in/reader038/viewer/2022110306/554a0f12b4c905825d8b48a9/html5/thumbnails/31.jpg)
Authentication
≪grails-app/Config.groovy≫google.appengine.sessionEnabled = true // default truegoogle.appengine.enableSsl = true // default truegoogle.appengine.security.useHttps = ["/secure"]google.appengine.security.requireAdmin = ["/admin", "notsecure"]google.appengine.security.requireLogin = ["/admin", "/"]
![Page 32: Grails on GAE/J](https://reader038.vdocument.in/reader038/viewer/2022110306/554a0f12b4c905825d8b48a9/html5/thumbnails/32.jpg)
local GAE
![Page 33: Grails on GAE/J](https://reader038.vdocument.in/reader038/viewer/2022110306/554a0f12b4c905825d8b48a9/html5/thumbnails/33.jpg)
com.google.appengine.api.users
• User(ログインユーザ情報)•UserService(ログインユーザ管理)•UserServiceFactory
import com.google.appengine.api.users.*def loginUser = UserServiceFactory.userService.currentUser
![Page 34: Grails on GAE/J](https://reader038.vdocument.in/reader038/viewer/2022110306/554a0f12b4c905825d8b48a9/html5/thumbnails/34.jpg)
Grails on GAE/J用のGoogleアカウント処理用タグリブ
• http://gist.github.com/125301• http://d.hatena.ne.jp/uehaj/20090607/1244376371
•上原さん@JGGUG
![Page 35: Grails on GAE/J](https://reader038.vdocument.in/reader038/viewer/2022110306/554a0f12b4c905825d8b48a9/html5/thumbnails/35.jpg)
Images
•画像データを処理サイズ変更、回転、左右反転、トリミング、etc.
• 全く触ってません。