Grails on GAE/J

35
Grails on GAE/J

Transcript of Grails on GAE/J

Page 1: Grails on GAE/J

Grails on GAE/J

Page 2: Grails on GAE/J

制限事項•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

LimitとQuota• Limit• 制限以上は使えない•例)メールのサイズは1Mまで•Quota•お金を払えば増やせる•例)メール送信 2,000 → 7,400,000

Page 4: Grails on GAE/J

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

The Java Servlet Environment

• 30秒ルール• Thread、FileSystem、java.lang.System、Reflectionの制限

• Request/Responseのサイズ、同時リクエスト数、アプリ内のファイル数/ファイルサイズ

Page 6: Grails on GAE/J

Datastore

Page 7: Grails on GAE/J

Bigtable

•分散ストレージ• RDBMSではない(SQL使えない)• JDO/JPAでアクセスする•使い方は後述

Page 8: Grails on GAE/J

Servcies

Page 9: Grails on GAE/J

用意されてるもの•Memcache• URL Fetch• Mail• Images• Google Accounts

Page 10: Grails on GAE/J

Memcache

•分散インメモリデータキャッシュ• JCache(JSR107)を(ほぼ)実装•完全なKey-Value

Page 11: Grails on GAE/J

Memcacheの有効期限

•デフォルトはメモリ残量がなくなるまでメモリがなくなれば古いのから消える

•有効期限の指定可キャッシュ時間(秒、ミリ秒)

キャッシュ有効期限(java.util.Date)

Page 12: Grails on GAE/J

Memcacheの使用例

•トップページの表示データを格納•マスタデータの格納•GAEっぽい使い方、募集!

Page 13: Grails on GAE/J

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

Get Memcache

import javax.cache.*

class CacheController { def index = { def manager = CacheManager.getInstance() manager.getCache('mycache').get('key') }}

Page 15: Grails on GAE/J

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

Quotas

http://code.google.com/appengine/docs/quotas.html#Memcache

Page 17: Grails on GAE/J

URL Fetch

•HTTP/HTTPSでWeb上のリソースにアクセス

•もちろん自身のアプリもフェッチできる•ファイアーウォールの中のシステムにもアクセスできるらしい

Page 18: Grails on GAE/J

URL Fetch

• java.net.URL、java.net.URLConnectionを使う

•Http(s)URLConnection はGoogle実装• connectTimeout、readTimeoutは変更できない(readTimeoutが5秒っぽい)

Page 19: Grails on GAE/J

URL Fetch

class URLFetchController { def fetch = { new URL(‘http://...’).text }}

Page 20: Grails on GAE/J

URL Fetchでやりたかったこと

•クライアントからPOSTされたJSコードをサーバで実行

• JSコードはもしかすると無限ループとかするかもしれないので3秒くらいでタイムアウトさせたい

•スレッド使えない → じゃあURL Fetchで

Page 21: Grails on GAE/J

URL Fetchでできなかったこと

•URL Fetchを使ってもreadTimeoutが設定できない(5秒)

•非同期リクエストはできない(Pythonの方にはAsynchronous Requestsってのがある)

Page 22: Grails on GAE/J

URL Fetchとは直接関係ないですが

• JSONデータをフェッチするときは、わざわざJSON-libを入れなくても、それっぽいAPIがGrailsにあります。

org.codehaus.groovy.grails.web.json.JSONObject

Page 23: Grails on GAE/J

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

Limit

http://code.google.com/appengine/docs/java/urlfetch/overview.html#Quotas_and_Limits

Page 25: Grails on GAE/J

Quotas

http://code.google.com/appengine/docs/quotas.html#UrlFetch

Page 26: Grails on GAE/J

Mail

• JavaMail APIを使ってメール送信•Mail Pluginが使える?// TODO 後で(ゲンゾウさんが)試す。

•開発サーバーではメール送信されない

Page 27: Grails on GAE/J

メール送信

From管理者

ログイン中ユーザ

To/Cc/Bcc どこでも

ReplyTo 管理者

Page 28: Grails on GAE/J

Limit

http://code.google.com/intl/ja/appengine/docs/java/mail/overview.html#Quotas_and_Limits

Page 29: Grails on GAE/J

Quotas

http://code.google.com/appengine/docs/quotas.html#Mail

Page 30: Grails on GAE/J

Google Accounts

•Googleアカウントによる認証と承認•ロールはユーザと管理者•Acegi Pluginみたいな感じ•ローカルテスト時は適当なメールアドレスでログイン可能

Page 31: Grails on GAE/J

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

local GAE

Page 33: Grails on GAE/J

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

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

Images

•画像データを処理サイズ変更、回転、左右反転、トリミング、etc.

• 全く触ってません。