~ひけらかし会~ Google App Engine(for Java)について 2009年8月4日火曜日
Oct 21, 2014
~ひけらかし会~Google App Engine(for Java)について
2009年8月4日火曜日
Google App
Engine2009年8月4日火曜日
Google App Engineとは
✓Google が提供するクラウド環境
2009年8月4日火曜日
クラウドって言うけど・・
✓Amazon EC2
- 仮想サーバ環境を丸ごと提供。
- EC2 ≒ VPS(Virtual Parallel Server)
- OSのインストール(OSイメージの選択)から実施
✓Google App Engine
- アプリケーション実行環境
- GAEの仕様に則ったアプリケーションのデプロイのみ可能(Python、Java)
2009年8月4日火曜日
Google App Engineの特徴
✓無償で使える
- 1アカウントあたり10アプリケーション登録可
- 使用可能なリソース(CPU、帯域等)の上限あり。
- お金を払えばリソースを拡張できる。
✓アプリケーション実行環境
- ミドルウェアのインストール不要
- Java/アプリケーションコンテナ/BigTable/memcached/メール/タスクキュー・・・
2009年8月4日火曜日
Google App Engineの特徴
✓デプロイが簡単
- Eclipseのプラグインがある
- ワンタッチで本番にアプリリリース
✓負荷増大に応じてかってにスケールしてくれる(はず)
✓充実した監理画面
- リソース使用状況/ログ/データ閲覧・・・
2009年8月4日火曜日
My Applications
2009年8月4日火曜日
Dashboard
2009年8月4日火曜日
Data Viewer
2009年8月4日火曜日
無償で使用可能なリソース(抜粋)
http://itpro.nikkeibp.co.jp/article/COLUMN/20090518/330180/?ST=cloud&P=2から引用
詳細は資料末
無償提供分 有償提供分の単価
ストレージ容量 1Gバイト $0.005/1Gバイト×1日
ネットワーク帯域(上り) 10Gバイト/1日 $0.10/1Gバイト
ネットワーク帯域(下り) 10Gバイト/1日 $0.12/1Gバイト
CPU時間 6.5時間/1日 $0.10/1時間
メール受信件数 2000件/1日 $0.0001/1件
2009年8月4日火曜日
GAE/Jの制約
2009年8月4日火曜日
GAE/Jは制約の強いServlet✓Java 6/Servlet API 2.5上で動作
✓30秒内にレスポンスを返さないと処理がアボート(割り込み発生)
✓ローカルファイルの読み書き不可- ファイルアップロードもtmp書き込み方式では不可
✓外部接続ソケット使用不可- URL Fetch API経由でのみ外部接続可能
✓スレッド起動不可
✓ClassLoader使用不可- jar参照は可
2009年8月4日火曜日
GAE/Jで使える・・・?
✓Struts- 使用可
✓Spring framwrodk- 無理っぽい
✓Seasar2- 無理っぽい
- Slim3はいける(DI機能は捨てたらしい)
✓ORマッパー系(Hibernateなど)- 無理っぽい
2009年8月4日火曜日
GAE/JAPIの紹介
2009年8月4日火曜日
便利なAPIが用意されている
✓Image API
✓Google Accounts API
✓URL Fetch API
✓Datastore API
✓Memcache API
✓Mail API
✓App Engine Cron Service2009年8月4日火曜日
Image API
✓画像の操作を行うAPI
- サイズ変更
- 回転
- 切り出し
- 画質自動調整
2009年8月4日火曜日
Image APIbyte[] data;
ImagesService service = ImagesServiceFactory.getImagesService(); //byte配列をImageインスタンスに変換Image img = ImagesServiceFactory.makeImage(data); //リサイズ用のインスタンスTransform resize = ImagesServiceFactory.makeResize(300, 50); //リサイズしてPNG形式に変換Image newImg =
service.applyTransform(resize, img, OutputEncoding.PNG);
//変換した画像データをbyte配列でbyte[] newData = newImg.getImageData();
2009年8月4日火曜日
Google Accounts API
✓Google App Engineで用意しているユーザ認証のためのAPI
- 認証処理
- アクセスコントロール(管理者/一般/未認証)
✓Googleアカウントでの認証処理をサポート
- App Engineアプリケーション作成者のアカウントはadmin(追加も可)
- それ以外のユーザは一般ユーザ
2009年8月4日火曜日
UserService service = UserServiceFactory.getUserService(); PrintWriter writer = response.getWriter();String url = request.getRequestURI();
//アクセスユーザの権限情報を取得Principal principal = request.getUserPrincipal();
if (principal != null) { //権限情報がある=ログイン状態 //ログアウト画面を表示 String urlLogout = service.createLogoutURL(url); out.println("<p>" + principal.getName() + "<a href=\"" + urlLogout + "\">logout</a></p>");
} else { //権限情報が無い=未ログイン状態 //ログイン画面を表示 String urlLogin = service.createLoginURL(url); out.println("<p><a href=\"" + urlLogin + "\">login</a></p>");}
Google Accounts API
2009年8月4日火曜日
Google Accounts API
ログイン画面(ローカルテスト環境)
ログイン画面(本番環境)
2009年8月4日火曜日
URL Fetch API
✓他サーバへ接続するためのAPI
- HTTP/HTTPSコネクション作成
- GET/POST/PUT/HEAD/DELETEメソッド
- HTTPリクエスト/レスポンス ハンドリング
✓これ以外の手段では外部接続は不可
✓java標準API(java.net.URLConnection)とgoogle独自API(com.google.appengine.api.urlfetch)が用意されている
2009年8月4日火曜日
PrintWriter writer = response.getWriter();BufferedReader reader = null;try { //接続先URLを開く URL url = new URL("http://hogehoge/"); reader = new BufferedReader(new InputStreamReader(url.openStream()));
//レスポンス内容を1行づつ出力 while (reader.ready()) { String line = reader.readLine(); writer.println(line); }} finally { reader.close();}
URL Fetch API(URLConnection)
2009年8月4日火曜日
URLFetchService fetch = URLFetchServiceFactory.getURLFetchService();
//リクエスト用のインスタンス生成HTTPRequest httpreq =
new HTTPRequest("http://hogehoge/", HTTPMethod.GET);//HTTP接続処理HTTPResponse httpresp = fetch.fetch(httpreq);//ステータスコードの確認if(httpresp.getResponseCode() >= 400){ throw new IOException();}//レスポンスデータの取得byte[] data = httpresp.getContent();return data;
URL Fetch API(com.google.appengine.api.urlfetch)
2009年8月4日火曜日
Datastore API
✓Google App Engine上のBigTableデータの操作を行うためのAPI
- CRUD
- データ取得時のソート
- トランザクション処理
✓JDO、JPA経由でのアクセスが可能
2009年8月4日火曜日
Datastore API(JDO)~Persistence~
//データの一意性の設定。APPLICATION/DATASTORE/UNSPECIFIED@PersistenceCapable(identityType = IdentityType.APPLICATION)public class Movie implements Comparable<Movie>{
@PrimaryKey //主キーとなるカラム @Persistent(valueStrategy = IdGeneratorStrategy.IDENTITY)//自動採番 private Long id; @Persistent private String title; @Persistent private Integer point;
public Movie(String title, Date update){ this.title = title; this.update = update; }}
2009年8月4日火曜日
Datastore API(JDO)~PersistenceManager~
public class MyPersistenceManagerFactory { //jdoconfigの設定内容を読み込み private static final PersistenceManagerFactory pmfInstance = JDOHelper.getPersistenceManagerFactory("transactions-optional");
private MyPersistenceManagerFactory() { }
public static PersistenceManagerFactory get() { return pmfInstance; }}
PersistenceManagerの生成はコストが高いのでsingleton監理に。
2009年8月4日火曜日
Datastore API(JDO)~データ取得~
//PersistenceManager取得PersistenceManager pm =
MyPersistenceManagerFactory.get().getPersistenceManager();try{ //GQL生成 String query = "select from " + Movie.class.getName() + " where title == " + title; //データ取得 List<Movie> result = (List<Movie>)pm.newQuery(query).execute(); if(result == null || result.size() == 0) return null; return result.get(0); }finally{ pm.close();}
2009年8月4日火曜日
Datastore API(JDO)~データ更新~
PersistenceManager pm = MyPersistenceManagerFactory.get().getPersistenceManager();
try{ //データ作成 pm.makePersistent(movie);}finally{ pm.close();
PersistenceManager pm = MyPersistenceManagerFactory.get().getPersistenceManager();try{ //データ削除 pm.deletePersistent(movie);}finally{ pm.close();
2009年8月4日火曜日
Memcache API
✓Memcachedのデータ操作を行うためのAPI
✓Java標準仕様に則ったAPI(JCache)とgoogleの独自API(com.google.appengine.api.memcache)が用意されている。
- データの有効期限設定はgoogle独自APIじゃないとできない
2009年8月4日火曜日
Memcache API(com.google.appengine.api.memcache)MemcacheService memcache = null;try {//memcaehに接続するサービスインスタンス取得memcache = MemcacheServiceFactory.getMemcacheService(); if(memcache != null){
//データ有効期限設定 Expiration expires = Expiration.onDate( new Date(Calendar.getInstance().getTimeInMillis() + 86400000));
//put memcache.put("hogehoge","hogehoge", expires);
//get Object data = memcache.get("hogehoge"); }} catch (Exception e) { ;}
2009年8月4日火曜日
Memcache API(JCache)
Cache cache;try { //memcaehに接続するサービスインスタンス取得 cache =
CacheManager.getInstance().getCacheFactory().createCache(Collections.emptyMap());
} catch (CacheException e) {}
// putcache.put(“hogehoge”, “hogehoge”.getBytes());
// getbyte[] value = (byte[]) cache.get(“hogehoge”);
2009年8月4日火曜日
Mail API
✓メールの送信を行うAPI
✓JavaMail(javax.mail)仕様を踏襲
- 添付ファイル付きのメールも送信可
- 添付可能なファイル拡張子http://code.google.com/intl/ja/appengine/docs/python/mail/overview.html#Attachments
✓メールの受信はできない
✓Transport/SessionにSMTP設定を追加しても無視される。
2009年8月4日火曜日
Mail APIProperties props = new Properties();//Session取得Session session = Session.getDefaultInstance(props, null);
//FROM/TOアドレスの設定InternetAddress address = new InternetAddress("[email protected]", "[email protected]", "ISO-2022-JP");
//メッセージ作成MimeMessage message = new MimeMessage(session);message.setFrom(address); message.addRecipient(Message.RecipientType.TO, address); message.setSubject("hogehogehogehoge", "ISO-2022-JP"); message.setText("hogehogehogehoge");
//送信Transport.send(message);
2009年8月4日火曜日
App Engine Cron Service
✓App EngineのServletを定期実行することができる機能
✓WEB-INF/cron.xml にcron定義を書いてdeployするとGAE上に設定が反映される。
✓「1時間ごと」実行の設定にした場合、毎時何分に実行されるかは指定できない。(0分に実行されるかもしれないし、59分に実行されるかもしれない)
2009年8月4日火曜日
#5分ごとに実行every 5 minutes#12時間ごとに実行every 12 hours#3月の第二、第三 月・水・木 17:00に実行2nd,third mon,wed,thu of march 17:00#毎週月曜日 9:00に実行every monday of month 09:00#9~11月の第一月曜日 17:00に実行1st monday of sep,oct,nov 17:00
App Engine Cron Service
<?xml version="1.0" encoding="UTF-8"?><cronentries> <cron> <url>/hogehoge</url> <description>every 1 hours</description> <schedule>every 1 hours</schedule> </cron></cronentries>
2009年8月4日火曜日
サンプル
2009年8月4日火曜日
favicon proxy
- http://faviconproxy.appspot.com/
- 指定したドメインのfaviconを返すproxy
- URL Fetch API、Memcache API
2009年8月4日火曜日
twitter bot
- http://just-do-twitterbot.appspot.com/
- 定期的にtwitterにつぶやくbot
- URL Fetch API、Memcache API、Datastore API、Cron Service
2009年8月4日火曜日
splog api
- http://splogapi.appspot.com/
- 渡されたURLがsplogかどうかを判定するAPI
- Memcache API、Datastore API
2009年8月4日火曜日
他有名アプリ
2009年8月4日火曜日
hookhub
- http://www.hookhub.com/
- GAE/J + Scale
- webhookからのフック内容をJSで加工するサービス
2009年8月4日火曜日
ご都合.com
- http://www.gotsugo.com/
- GAE/J + BlazeDS + Flex
- 共有カレンダーサービス
2009年8月4日火曜日
まとめ
2009年8月4日火曜日
まとめ
✓GAE/Jは無料で便利で手軽だから四の五の言わずに作りたいものがあったら作った方が良いよ。
2009年8月4日火曜日
ご清聴ありがとうございました。
2009年8月4日火曜日
無償で使用可能なリソース(リクエスト)
リソース無料のデフォルト割り当て無料のデフォルト割り当て 課金が有効な割り当て課金が有効な割り当て
リソース1 日当たりの限度 最大レート 1 日当たりの限度 最大レート
リクエストリクエスト 1,300,000 件
リクエスト 7,400 件/分
リクエスト 43,000,000 件
リクエスト 30,000 件/分
発信帯域幅(課金対象、HTTPS を含む)
10 GB 56 MB/分10 GB 無料、最大 1,046 GB
740 MB/分
受信帯域幅(課金対象、HTTPS を含む)
10 GB 56 MB/分10 GB 無料、最大 1,046 GB
740 MB/分
CPU 時間(課金対象)
46 CPU 時間 15 CPU 分/分46 CPU 時間無料、最大 1,729 CPU 時間
72 CPU 分/分
http://code.google.com/intl/ja/appengine/docs/quotas.htmlから引用
2009年8月4日火曜日
無償で使用可能なリソース(データストア)
リソース無料のデフォルト割り当て無料のデフォルト割り当て 課金が有効な割り当て課金が有効な割り当て
リソース1 日当たりの限度 最大レート 1 日当たりの限度 最大レート
Datastore API 呼び出し
10,000,000 呼び出し 57,000 呼び出し/分 140,000,000 呼び出し
129,000 呼び出し/分
保存データ(課金対象)
1 GB なし 1 GB 無料、最大値なし
なし
API に送信されたデータ
12 GB 68 MB/分 72 GB 153 MB/分
API から受信したデータ
115 GB 659 MB/分 695 GB 1,484 MB/分
データストア CPU 時間
60 CPU 時間 20 CPU 分/分 1,200 CPU 時間 50 CPU 分/分
http://code.google.com/intl/ja/appengine/docs/quotas.htmlから引用
2009年8月4日火曜日
無償で使用可能なリソース(メール)
リソース無料のデフォルト割り当て無料のデフォルト割り当て 課金が有効な割り当て課金が有効な割り当て
リソース1 日当たりの限度 最大レート 1 日当たりの限度 最大レート
Mail API 呼び出し 7,000 呼び出し 32 呼び出し/分 1,700,000 呼び出し 4,900 呼び出し/分
メール受信者(課金対象)
受信者 2,000 人 受信者 8 人/分 無料受信者 2,000 人、受信者最大 7,400,000 人
受信者 5,100 人/分
メールの送信先の管理者
メール 5,000 通 メール 24 通/分 メール 3,000,000 通 メール 9,700 通/分
送信されたメッセージ本文のデータ
60 MB 340 KB/分 29 GB 84 MB/分
送信された添付ファイル
添付ファイル 2,000 通
添付ファイル 8 通/分 添付ファイル 2,900,000 通
添付ファイル 8,100 通/分
送信された添付ファイル データ
100 MB 560 KB/分 100 GB 300 MB/分
http://code.google.com/intl/ja/appengine/docs/quotas.htmlから引用
2009年8月4日火曜日
無償で使用可能なリソース(URLフェッチ)
リソース
無料のデフォルト割り当て無料のデフォルト割り当て 課金が有効な割り当て課金が有効な割り当て
リソース
1 日当たりの限度 最大レート 1 日当たりの限度 最大レート
UrlFetch API 呼び出し
657,000 呼び出し 3,000 呼び出し/分 46,000,000 呼び出し 32,000 呼び出し/分
送信された UrlFetch データ
4 GB 22 MB/分 1,046 GB 740 MB/分
受信した UrlFetch データ
4 GB 22 MB/分 1,046 GB 740 MB/分
http://code.google.com/intl/ja/appengine/docs/quotas.htmlから引用
2009年8月4日火曜日
無償で使用可能なリソース(画像操作)
リソース無料のデフォルト割り当て無料のデフォルト割り当て 課金が有効な割り当て課金が有効な割り当て
リソース1 日当たりの限度 最大レート 1 日当たりの限度 最大レート
Image Manipulation API 呼び出し 864,000 呼び出し 4,800 呼び出し/分 45,000,000 呼び出し 31,000 呼び出し/分
API に送信されたデータ
1 GB 5 MB/分 560 GB 400 MB/分
API から受信したデータ
5 GB 28 MB/分 427 GB 300 MB/分
実行された変換 変換 2,500,000 回 変換 14,000 回/分 変換 47,000,000 回 変換 32,000 回/分
http://code.google.com/intl/ja/appengine/docs/quotas.htmlから引用
2009年8月4日火曜日
無償で使用可能なリソース(Memcache)
リソース
無料のデフォルト割り当て無料のデフォルト割り当て 課金が有効な割り当て課金が有効な割り当て
リソース
1 日当たりの限度 最大レート 1 日当たりの限度 最大レート
Memcache API 呼び出し
8,600,000 48,000 呼び出し/分 96,000,000 108,000 呼び出し/分
API に送信されたデータ
10 GB 56 MB/分 60 GB 128 MB/分
API から受信したデータ
50 GB 284 MB/分 315 GB 640 MB/分
http://code.google.com/intl/ja/appengine/docs/quotas.htmlから引用
2009年8月4日火曜日