google app engine for java (手嶋屋勉強会)

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

Upload: fukamachi

Post on 16-May-2015

2.875 views

Category:

Technology


2 download

DESCRIPTION

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

TRANSCRIPT

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

GoogleApp Engine

for Java

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

Page 2: Google App Engine for Java (手嶋屋勉強会)
Page 3: Google App Engine for Java (手嶋屋勉強会)

•最近Clojureを始めました

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

•最近Clojureを始めました

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

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

•最近Clojureを始めました

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

•ただ動くサーバがない

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

•最近Clojureを始めました

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

•ただ動くサーバがない

•「それAppEngineで動くよ」

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

•最近Clojureを始めました

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

•ただ動くサーバがない

•「それAppEngineで動くよ」

•えっ

Page 8: Google App Engine for Java (手嶋屋勉強会)
Page 9: Google App Engine for Java (手嶋屋勉強会)

•Google App Engine始めました

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

•Google App Engine始めました

•Google App Engineとは

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

•Google App Engine始めました

•Google App Engineとは

•Googleが提供するWeb Application Platform

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

•Google App Engine始めました

•Google App Engineとは

•Googleが提供するWeb Application Platform

•略してGAE

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

•Google App Engine始めました

•Google App Engineとは

•Googleが提供するWeb Application Platform

•略してGAE

•読み方は がえ

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

Google App Engine

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

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

Google App Engine

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

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

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

Google App Engine

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

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

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

• PythonとJavaのみをサポート

Google App Engine

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

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

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

• PythonとJavaのみをサポート

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

Quercus...

Google App Engine

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

• 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

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

何を作る?

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

•何か作ろうと思う

何を作る?

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

•何か作ろうと思う

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

何を作る?

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

•何か作ろうと思う

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

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

何を作る?

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

だけど...

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

だけど...

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

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

だけど...

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

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

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

だけど...

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

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

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

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

だけど...

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

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

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

•手嶋屋と言えば...

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

だけど...

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

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

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

•手嶋屋と言えば...

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

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

だけど...

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

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

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

•手嶋屋と言えば...

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

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

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

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

國忠さんとは

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

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

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

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

•最速道とは

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

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

•最速道とは

•抜く

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

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

•最速道とは

•抜く

•斬る

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

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

•最速道とは

•抜く

•斬る

•納める

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

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

•最速道とは

•抜く

•斬る

•納める

•モテる

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

最速道はリア充に通ず。

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

@kunitada_bot

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

@kunitada_bot

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

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

@kunitada_bot

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

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

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

@kunitada_bot

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

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

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

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

@kunitada_bot

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

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

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

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

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

準備

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

準備

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

準備

•今回はJRubyを使うことに

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

準備

•今回はJRubyを使うことに

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

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

準備

•今回はJRubyを使うことに

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

• sudo gem install google-appengine

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

準備

•今回はJRubyを使うことに

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

• sudo gem install google-appengine

• mkdir kunitada-bot

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

準備

•今回はJRubyを使うことに

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

• sudo gem install google-appengine

• mkdir kunitada-bot

• cd kunitada-bot

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

準備

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

準備

• vi Gemfile

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

準備

• vi Gemfile

• vi config.ru

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

準備

• vi Gemfile

• vi config.ru

• vi main.rb

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

準備

• vi Gemfile

• vi config.ru

• vi main.rb

• appcfg.rb bundle .

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

準備

• vi Gemfile

• vi config.ru

• vi main.rb

• appcfg.rb bundle .

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

して同梱してくれる

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

構造把握

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

構造把握

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

構造把握

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

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

構造把握

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

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

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

構造把握

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

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

• Sinatraを使って最速で記述

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

構造把握

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

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

• Sinatraを使って最速で記述

require 'rubygems'require 'sinatra'

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

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

(main.rb)

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

抜く

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

Twitter APIでTL取得

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

Twitter APIでTL取得

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

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

Twitter APIでTL取得

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

• URL Fetch APIを使う

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

Twitter APIでTL取得

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

• URL Fetch APIを使う

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

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

Twitter APIでTL取得

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

• URL Fetch APIを使う

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

• tweets = JSON.parse(res)

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

Twitter APIでTL取得

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

• URL Fetch APIを使う

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

• tweets = JSON.parse(res)

• tweets.shuffle.shift

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

斬る

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

kunitadizeする

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

kunitadizeする

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

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

kunitadizeする

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

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

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

kunitadizeする

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

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

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

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

kunitadizeする

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

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

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

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

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

納める

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

Twitterにツイートする

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

Twitterにツイートする

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

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

Twitterにツイートする

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

•以上。

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

Twitterにツイートする

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

•以上。

• $ dev_appserver.rb .

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

Twitterにツイートする

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

•以上。

• $ dev_appserver.rb .

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

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

定期的に実行

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

定期的にkunitadizeする

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

定期的にkunitadizeする

•一定時間ごとにkunitadize

するには?

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

定期的にkunitadizeする

•一定時間ごとにkunitadize

するには?

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

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

定期的にkunitadizeする

•一定時間ごとにkunitadize

するには?

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

• WEB-INF/cron.xmlに記述

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

定期的に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>

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

公開

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

アプリを公開する

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

アプリを公開する

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

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

アプリを公開する

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

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

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

アプリを公開する

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

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

• $ appcfg.rb update .

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

アプリを公開する

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

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

• $ appcfg.rb update .

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

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

アプリを公開する

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

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

• $ appcfg.rb update .

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

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

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

AppEngine API

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

AppEngine API

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

AppEngine API

• Datastore

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

AppEngine API

• Datastore

• Memcache

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

AppEngine API

• Datastore

• Memcache

• URL Fetch

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

AppEngine API

• Datastore

• Memcache

• URL Fetch

• Mail (送受信)

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

AppEngine API

• Datastore

• Memcache

• URL Fetch

• Mail (送受信)

• XMPP通信

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

AppEngine API

• Datastore

• Memcache

• URL Fetch

• Mail (送受信)

• XMPP通信

• Image

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

AppEngine API

• Datastore

• Memcache

• URL Fetch

• Mail (送受信)

• XMPP通信

• Image

• Google Account認証

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

AppEngine API

• Datastore

• Memcache

• URL Fetch

• Mail (送受信)

• XMPP通信

• Image

• Google Account認証

• Task Queue

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

AppEngine API

• Datastore

• Memcache

• URL Fetch

• Mail (送受信)

• XMPP通信

• Image

• Google Account認証

• Task Queue

• Cron

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

AppEngineの制約

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

AppEngineの制約

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

AppEngineの制約

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

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

AppEngineの制約

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

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

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

AppEngineの制約

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

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

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

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

AppEngineの制約

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

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

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

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

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

AppEngineの制約

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

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

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

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

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

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

AppEngineの制約

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

AppEngineの制約

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

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

AppEngineの制約

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

• JRuby on Rails + ActiveRecordは難しい

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

AppEngineの制約

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

• JRuby on Rails + ActiveRecordは難しい

• Sinatra + DataMapperで我慢

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

AppEngineの制約

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

AppEngineの制約

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

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

AppEngineの制約

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

•アクセスが遅くなる

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

AppEngineの制約

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

•アクセスが遅くなる

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

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

AppEngineの制約

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

•アクセスが遅くなる

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

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

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

Datastore

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

Datastoreとは

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

Datastoreとは

•非リレーショナルなDB

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

Datastoreとは

•非リレーショナルなDB

• Table、Columnの概念がない

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

Datastoreとは

•非リレーショナルなDB

• Table、Columnの概念がない

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

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

Datastoreとは

•非リレーショナルなDB

• Table、Columnの概念がない

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

• kind ⇒ テーブル?

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

Datastoreとは

•非リレーショナルなDB

• Table、Columnの概念がない

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

• kind ⇒ テーブル?

• property ⇒ カラム?

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

Datastoreの特徴

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

Datastoreの特徴

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

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

Datastoreの特徴

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

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

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

Datastoreの特徴

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

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

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

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

Datastoreの特徴

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

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

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

•⇒ “スキーマレス

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

Datastoreの検索

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

Datastoreの検索

• DatastoreはKey-Value-Storeである

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

Datastoreの検索

• DatastoreはKey-Value-Storeである

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

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

Datastoreの検索

• DatastoreはKey-Value-Storeである

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

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

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

Datastoreの検索

• DatastoreはKey-Value-Storeである

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

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

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

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

Datastoreの検索

• DatastoreはKey-Value-Storeである

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

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

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

•最速。

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

Datastoreの困った所

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

Datastoreの困った所

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

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

Datastoreの困った所

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

•制約が多くて面倒

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

Datastoreの困った所

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

•制約が多くて面倒

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

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

Datastoreの困った所

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

•制約が多くて面倒

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

•あんまり問題ない?

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

参考

• 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