Google App Engine for Java (手嶋屋勉強会)

Preview:

DESCRIPTION

バレンタインまでに最速で彼女をつくる方法

Citation preview

GoogleApp Engine

for Java

~バレンタインまでに最速で彼女をつくる方法~手嶋屋 深町英太郎

•最近Clojureを始めました

•最近Clojureを始めました

•ClojureはJavaVMで動く大変クールなLisp

•最近Clojureを始めました

•ClojureはJavaVMで動く大変クールなLisp

•ただ動くサーバがない

•最近Clojureを始めました

•ClojureはJavaVMで動く大変クールなLisp

•ただ動くサーバがない

•「それAppEngineで動くよ」

•最近Clojureを始めました

•ClojureはJavaVMで動く大変クールなLisp

•ただ動くサーバがない

•「それAppEngineで動くよ」

•えっ

•Google App Engine始めました

•Google App Engine始めました

•Google App Engineとは

•Google App Engine始めました

•Google App Engineとは

•Googleが提供するWeb Application Platform

•Google App Engine始めました

•Google App Engineとは

•Googleが提供するWeb Application Platform

•略してGAE

•Google App Engine始めました

•Google App Engineとは

•Googleが提供するWeb Application Platform

•略してGAE

•読み方は がえ

Google App Engine

• Webアプリケーションを公開できる

Google App Engine

• Webアプリケーションを公開できる

•無料で (500万PV/月、容量500MBまで)

Google App Engine

• Webアプリケーションを公開できる

•無料で (500万PV/月、容量500MBまで)

• PythonとJavaのみをサポート

Google App Engine

• Webアプリケーションを公開できる

•無料で (500万PV/月、容量500MBまで)

• PythonとJavaのみをサポート

•もしくはJVMの言語、JRuby, Clojure, Scala, Groovy, Rhino,

Quercus...

Google App Engine

• Webアプリケーションを公開できる

•無料で (500万PV/月、容量500MBまで)

• PythonとJavaのみをサポート

•もしくはJVMの言語、JRuby, Clojure, Scala, Groovy, Rhino,

Quercus...

• http://en.wikipedia.org/wiki/List_of_JVM_languages

Google App Engine

何を作る?

•何か作ろうと思う

何を作る?

•何か作ろうと思う

•カヤックの外村さんのブログを読むなど

何を作る?

•何か作ろうと思う

•カヤックの外村さんのブログを読むなど

•「そうだ、彼女をつくろう」

何を作る?

だけど...

だけど...

•せっかくだから手嶋屋で使えるものがいいよね

だけど...

•せっかくだから手嶋屋で使えるものがいいよね

•手嶋屋で使えるもの...

だけど...

•せっかくだから手嶋屋で使えるものがいいよね

•手嶋屋で使えるもの...

•手嶋屋っぽいもの...

だけど...

•せっかくだから手嶋屋で使えるものがいいよね

•手嶋屋で使えるもの...

•手嶋屋っぽいもの...

•手嶋屋と言えば...

だけど...

•せっかくだから手嶋屋で使えるものがいいよね

•手嶋屋で使えるもの...

•手嶋屋っぽいもの...

•手嶋屋と言えば...

•手嶋屋と言えば、國忠さん だよね

だけど...

•せっかくだから手嶋屋で使えるものがいいよね

•手嶋屋で使えるもの...

•手嶋屋っぽいもの...

•手嶋屋と言えば...

•手嶋屋と言えば、國忠さん だよね

そうだ、國忠さんをつくろう

國忠さんとは

國忠さんとは•誰もが知る最速道を極める者

國忠さんとは•誰もが知る最速道を極める者

•最速道とは

國忠さんとは•誰もが知る最速道を極める者

•最速道とは

•抜く

國忠さんとは•誰もが知る最速道を極める者

•最速道とは

•抜く

•斬る

國忠さんとは•誰もが知る最速道を極める者

•最速道とは

•抜く

•斬る

•納める

國忠さんとは•誰もが知る最速道を極める者

•最速道とは

•抜く

•斬る

•納める

•モテる

最速道はリア充に通ず。

@kunitada_bot

@kunitada_bot

•抜く : 手嶋屋のツイートからランダムに選ぶ

@kunitada_bot

•抜く : 手嶋屋のツイートからランダムに選ぶ

•斬る : 最速化(kunitadize)する

@kunitada_bot

•抜く : 手嶋屋のツイートからランダムに選ぶ

•斬る : 最速化(kunitadize)する

•納める : 結果をツイートする

@kunitada_bot

•抜く : 手嶋屋のツイートからランダムに選ぶ

•斬る : 最速化(kunitadize)する

•納める : 結果をツイートする

•モテる : フォロワーが増える

準備

準備

準備

•今回はJRubyを使うことに

準備

•今回はJRubyを使うことに

• RubyGems (v1.3.5) をインストールする

準備

•今回はJRubyを使うことに

• RubyGems (v1.3.5) をインストールする

• sudo gem install google-appengine

準備

•今回はJRubyを使うことに

• RubyGems (v1.3.5) をインストールする

• sudo gem install google-appengine

• mkdir kunitada-bot

準備

•今回はJRubyを使うことに

• RubyGems (v1.3.5) をインストールする

• sudo gem install google-appengine

• mkdir kunitada-bot

• cd kunitada-bot

準備

準備

• vi Gemfile

準備

• vi Gemfile

• vi config.ru

準備

• vi Gemfile

• vi config.ru

• vi main.rb

準備

• vi Gemfile

• vi config.ru

• vi main.rb

• appcfg.rb bundle .

準備

• vi Gemfile

• vi config.ru

• vi main.rb

• appcfg.rb bundle .

• JRubyやSinatraなどのGemモジュールなどを自動でDL

して同梱してくれる

構造把握

構造把握

構造把握

• GAE/Jではスクリプトを直接叩けない

構造把握

• GAE/Jではスクリプトを直接叩けない

• URLでアプリケーションの区別を行う

構造把握

• GAE/Jではスクリプトを直接叩けない

• URLでアプリケーションの区別を行う

• Sinatraを使って最速で記述

構造把握

• GAE/Jではスクリプトを直接叩けない

• URLでアプリケーションの区別を行う

• Sinatraを使って最速で記述

require 'rubygems'require 'sinatra'

get '/' do 'Hello World!!'end

get ‘/kunitadize’ do # 処理を記述end

(main.rb)

抜く

Twitter APIでTL取得

Twitter APIでTL取得

• GAE/Jで他のWeb上のリソースにアクセスするには

Twitter APIでTL取得

• GAE/Jで他のWeb上のリソースにアクセスするには

• URL Fetch APIを使う

Twitter APIでTL取得

• GAE/Jで他のWeb上のリソースにアクセスするには

• URL Fetch APIを使う

• res = AppEngine::URLFetch.fetch(url, params)

Twitter APIでTL取得

• GAE/Jで他のWeb上のリソースにアクセスするには

• URL Fetch APIを使う

• res = AppEngine::URLFetch.fetch(url, params)

• tweets = JSON.parse(res)

Twitter APIでTL取得

• GAE/Jで他のWeb上のリソースにアクセスするには

• URL Fetch APIを使う

• res = AppEngine::URLFetch.fetch(url, params)

• tweets = JSON.parse(res)

• tweets.shuffle.shift

斬る

kunitadizeする

kunitadizeする

•ツイートの適切な位置に「最速で」を追加する

kunitadizeする

•ツイートの適切な位置に「最速で」を追加する

• Yahoo!係り受け解析で形態素解析して判定

kunitadizeする

•ツイートの適切な位置に「最速で」を追加する

• Yahoo!係り受け解析で形態素解析して判定

•全裸botのソースコードを参考にして、

kunitadizeする

•ツイートの適切な位置に「最速で」を追加する

• Yahoo!係り受け解析で形態素解析して判定

•全裸botのソースコードを参考にして、

•全裸botとの完全互換を実現 (@sugyan++)

納める

Twitterにツイートする

Twitterにツイートする

• URL Fetch APIでTwitterのUpdate APIを最速で叩く

Twitterにツイートする

• URL Fetch APIでTwitterのUpdate APIを最速で叩く

•以上。

Twitterにツイートする

• URL Fetch APIでTwitterのUpdate APIを最速で叩く

•以上。

• $ dev_appserver.rb .

Twitterにツイートする

• URL Fetch APIでTwitterのUpdate APIを最速で叩く

•以上。

• $ dev_appserver.rb .

• http://localhost:8080/kunitadize にアクセス

定期的に実行

定期的にkunitadizeする

定期的にkunitadizeする

•一定時間ごとにkunitadize

するには?

定期的にkunitadizeする

•一定時間ごとにkunitadize

するには?

• GAEではちょっと変わったCronが使える

定期的にkunitadizeする

•一定時間ごとにkunitadize

するには?

• GAEではちょっと変わったCronが使える

• WEB-INF/cron.xmlに記述

定期的にkunitadizeする

•一定時間ごとにkunitadize

するには?

• GAEではちょっと変わったCronが使える

• WEB-INF/cron.xmlに記述

(WEB-INF/cron.xml)<?xml version="1.0" encoding="UTF-8"?>

<cronentries> <cron> <url>/kunitadize</url> <description>kunitadize a random tweet</description> <schedule>every 30 minutes</schedule> </cron></cronentries>

公開

アプリを公開する

アプリを公開する

•あらかじめGAEの開発者登録をしておく

アプリを公開する

•あらかじめGAEの開発者登録をしておく

•アプリケーション登録をする

アプリを公開する

•あらかじめGAEの開発者登録をしておく

•アプリケーション登録をする

• $ appcfg.rb update .

アプリを公開する

•あらかじめGAEの開発者登録をしておく

•アプリケーション登録をする

• $ appcfg.rb update .

•初回はE-mailアドレスとパスワードを聞かれる

アプリを公開する

•あらかじめGAEの開発者登録をしておく

•アプリケーション登録をする

• $ appcfg.rb update .

•初回はE-mailアドレスとパスワードを聞かれる

• https://appengine.google.com/ にアクセスして確認

AppEngine API

AppEngine API

AppEngine API

• Datastore

AppEngine API

• Datastore

• Memcache

AppEngine API

• Datastore

• Memcache

• URL Fetch

AppEngine API

• Datastore

• Memcache

• URL Fetch

• Mail (送受信)

AppEngine API

• Datastore

• Memcache

• URL Fetch

• Mail (送受信)

• XMPP通信

AppEngine API

• Datastore

• Memcache

• URL Fetch

• Mail (送受信)

• XMPP通信

• Image

AppEngine API

• Datastore

• Memcache

• URL Fetch

• Mail (送受信)

• XMPP通信

• Image

• Google Account認証

AppEngine API

• Datastore

• Memcache

• URL Fetch

• Mail (送受信)

• XMPP通信

• Image

• Google Account認証

• Task Queue

AppEngine API

• Datastore

• Memcache

• URL Fetch

• Mail (送受信)

• XMPP通信

• Image

• Google Account認証

• Task Queue

• Cron

AppEngineの制約

AppEngineの制約

AppEngineの制約

•ローカルへのファイル保存

AppEngineの制約

•ローカルへのファイル保存

•ソフトウェアのインストール

AppEngineの制約

•ローカルへのファイル保存

•ソフトウェアのインストール

• ffmpegとかFlash Compiler入れて動画サイトとかは無理

AppEngineの制約

•ローカルへのファイル保存

•ソフトウェアのインストール

• ffmpegとかFlash Compiler入れて動画サイトとかは無理

•アプリ間でDatastoreの共有はできない

AppEngineの制約

•ローカルへのファイル保存

•ソフトウェアのインストール

• ffmpegとかFlash Compiler入れて動画サイトとかは無理

•アプリ間でDatastoreの共有はできない

• frontendとbackendでアプリ分割が不可能

AppEngineの制約

AppEngineの制約

• 30秒以上の実行はkillされる

AppEngineの制約

• 30秒以上の実行はkillされる

• JRuby on Rails + ActiveRecordは難しい

AppEngineの制約

• 30秒以上の実行はkillされる

• JRuby on Rails + ActiveRecordは難しい

• Sinatra + DataMapperで我慢

AppEngineの制約

AppEngineの制約

•一定時間アクセスがないとメモリキャッシュから消える

AppEngineの制約

•一定時間アクセスがないとメモリキャッシュから消える

•アクセスが遅くなる

AppEngineの制約

•一定時間アクセスがないとメモリキャッシュから消える

•アクセスが遅くなる

•定期的にcronでURLを叩くなどのハックが必要

AppEngineの制約

•一定時間アクセスがないとメモリキャッシュから消える

•アクセスが遅くなる

•定期的にcronでURLを叩くなどのハックが必要

• RDBMSが使えない (代わりにDatastore)

Datastore

Datastoreとは

Datastoreとは

•非リレーショナルなDB

Datastoreとは

•非リレーショナルなDB

• Table、Columnの概念がない

Datastoreとは

•非リレーショナルなDB

• Table、Columnの概念がない

•レコードはEntityと呼ばれ、kindとpropertyの値を持つ

Datastoreとは

•非リレーショナルなDB

• Table、Columnの概念がない

•レコードはEntityと呼ばれ、kindとpropertyの値を持つ

• kind ⇒ テーブル?

Datastoreとは

•非リレーショナルなDB

• Table、Columnの概念がない

•レコードはEntityと呼ばれ、kindとpropertyの値を持つ

• kind ⇒ テーブル?

• property ⇒ カラム?

Datastoreの特徴

Datastoreの特徴

•呼び方が違うだけじゃないの?

Datastoreの特徴

•呼び方が違うだけじゃないの?

•同じkindでも違うpropertyを持つことができる

Datastoreの特徴

•呼び方が違うだけじゃないの?

•同じkindでも違うpropertyを持つことができる

• 1つのpropertyに複数の値を持つことができる

Datastoreの特徴

•呼び方が違うだけじゃないの?

•同じkindでも違うpropertyを持つことができる

• 1つのpropertyに複数の値を持つことができる

•⇒ “スキーマレス

Datastoreの検索

Datastoreの検索

• DatastoreはKey-Value-Storeである

Datastoreの検索

• DatastoreはKey-Value-Storeである

•各EntityはユニークなKeyを持つ

Datastoreの検索

• DatastoreはKey-Value-Storeである

•各EntityはユニークなKeyを持つ

•そのKeyで検索するので無駄な走査がない

Datastoreの検索

• DatastoreはKey-Value-Storeである

•各EntityはユニークなKeyを持つ

•そのKeyで検索するので無駄な走査がない

•アクセス速度はEntity数に依存しない

Datastoreの検索

• DatastoreはKey-Value-Storeである

•各EntityはユニークなKeyを持つ

•そのKeyで検索するので無駄な走査がない

•アクセス速度はEntity数に依存しない

•最速。

Datastoreの困った所

Datastoreの困った所

• JavaのDatastore APIか、GQLでアクセス

Datastoreの困った所

• JavaのDatastore APIか、GQLでアクセス

•制約が多くて面倒

Datastoreの困った所

• JavaのDatastore APIか、GQLでアクセス

•制約が多くて面倒

• DataMapperを使えば自由にアクセス & 永続化

Datastoreの困った所

• JavaのDatastore APIか、GQLでアクセス

•制約が多くて面倒

• DataMapperを使えば自由にアクセス & 永続化

•あんまり問題ない?

参考

• http://tech.kayac.com/archive/gae-jruby-twitter-bot.html

• http://code.google.com/p/appengine-jruby/

• http://d.hatena.ne.jp/shibason/20091018/1255866012

•書籍 : Programming Google App Engine

Recommended