Google Developer Day 2008 - Google App Engine

Google App Engine  Google App Engine

基調講演の後に参加したのが、 Google App Engine のセッション。開発チームの Pete Koomen さんによる概要紹介が行われました。こちらは特に目新しい発表はなかったのですが、もう一人の方(名前が分からないのですが、右側の方 Brett Slatkin さんだそうです。Ianさんに教えてもらいました)のライブコーディングが面白かったです。ちょっと前に流行った「○○フレームワークで10分でアプリケーション作る」のノリで、みるみるうちに掲示板アプリができあがっていきました。それらと一つ違うのは、本番サーバへのデプロイが一瞬で終わること。そして、 Google のサーバ側に古いバージョンのプログラムも保存されているので、いつでもロールバックが可能なこと。この辺りはさすが、時代が一歩先に進んだ印象を受けます。

最後の Q&A も面白かったです。 Ruby や C# をサポートして欲しいという要望が会場からあがっていました。 C# は意外でした。 Java FX の質問は、翻訳者の勘違いか Flex の話になっていて PyAMF の話題が出ていました。あと、Googleなのに全文検索機能がないのはどうして?というのは、サンフランシスコの Google I/O でも質問されていましたが、どうやらもう少し時間がかかりそうな感じですね。また、セキュリティに関しては特に気を遣っていて、当然別のアプリケーションからあなたのデータにアクセスすることはできないし、Googleがそれをすることもないそうです。

関連リンク:
» Brett Slatkin Profile

Google Developer Day 2008 基調講演

6月10日にパシフィコ横浜で開催された「Google Developer Day 2008」に参加してきました。

基調講演は、Google Japan 村上社長の挨拶の後、サンフランシスコの Google I/O でご一緒させてもらった及川さんが登場。現在の状況とこれからどこに進もうとしているかを説明してくれました。内容は基本的に Google I/O での Keynote の資料を翻訳したものだったのですが、 Google らしいカジュアルな感じでとても分かりやすいものだったと思います。

  • インターネットは生活にかかせないものになっている。
  • クラウド・コンピューティング
    コンピューティングの場は過去にメインフレームからPCに移ったが、再びインターネット上に集約されつつある。
  • Google流のエコシステム
    リッチなアプリ→ユーザー増→頻度増→収益向上(ウェブ開発者を巻き込む)

Android

Android Home  Android Street View

Android のデモが Google I/O の時よりもパワーアップしていました。あちらでストリートビューのデモを行ったときは、会場から「おー!」という感嘆の声が上がったのですが、日本での反応は静かなものでした。皆さん、既にI/Oのビデオを見て知っていたからなんですかね…

  • オープンソース(※まだソースは公開されていませんが予定)
  • Webkit ベースブラウザで JavaScript, CSSは当たり前
  • スライドとガジェット、ドラッグダウンによるインタフェース
  • インターネットとのマッシュアップが可能
  • 顔認識でコンタクトの写真を登録できる

Google App Engine

Google I/O でお世話になった鵜飼さんによる Google App Engine の紹介。こちらもI/Oでのプレゼンがベースのようでした。今までは、 Linux の設定をして、Apache の設定をして、 MySQL の設定をして、 PHP の設定をしてというのが必要で、サービスが成長してきたらサーバの台数を増やして負荷分散をしてという作業が必要でした。それが、Google のインフラを使うことで心配する必要がなくなります。そして、アカウント制限が撤廃され誰でも利用可能になったことと、今後予定されている新機能の説明がありました。登録フリーになったとは言っても、携帯電話 SMS での認証が必要で、現状日本ではほぼ登録不可能といっていい状態です。こちらは早急に改善して欲しいところ。
今後予定されている機能追加は次の通り。

  • Offline Processing (スケジュールタスクなど)
  • More Language (Python 以外の言語への対応)
  • Rich Media Support (1MB以上の Large Object 対応)
  • Additional Infrastructure Services

OpenSocial

OpenSocial は、昨年の発表から7ヶ月でユーザー 2億7500万、開発者 2万、アプリケーション数 5000万に成長中。国内での適用事例として、リクルートの方が「ドコイク?」を OpenSocial 対応したという話をされていました。現在は、自由にアプリケーションを登録できないが、将来的には対応したいとのことです。また、 OpenSocial に対する要望として、セキュリティの向上と仕様の明確化を進めて欲しいと言っていて、確かにそうだなと思いました。

Community

今回の全体テーマとして「Cloud, Connectivity, Client」を掲げていたのですが、某社のプレゼンに習って"One more thing."として「Community」を取り上げていました。 Google Japan のディベロッパー交流会への取り組みやエキスパート認定制度など。
下記のように日本語でのグループもできているので、興味のある方は参加してみるといいかもしれません。特に Google-App-Engine-Japan はこの日に開設されてホヤホヤなのでお勧めです。


少し話がそれましたが、知っている人も多く来ていて、初めて会った人とも多く名刺交換をさせてもらいました。実際に顔を合わせて話をするというのはとても重要で、Web系以外の人とも話をするとてもいい機会になりました。お話しさせていただいた皆さん、どうもありがとうございました。

YAPC Asia 2008: クラウド・コンピューティングは現代の小作農か?

昨日ですが,YAPC Asia 2008 に行ってきました。セッション後の懇親会にも参加させてもらったうえに,じゃんけん大会で Joel さんの「BEST SOFTWARE WRITING」本までもらってしまいました。ありがとうございます! それにしても日本の Perl コミュニティは,やっぱり凄いですね。考えてみれば,国内のmixi,はてな,モバゲーといった大きなサービスはすべて Perl で出来ているわけで,それだけ優秀なエンジニアも日本に沢山いるということでしょうか。

そして,海外からも多くの人が参加していて非常に国際色豊かでした。3つあるうちの1つの会場は英語オンリーで,僕はずっとこの部屋にいたのですが, Ingy さんの vim プレゼンツールとか pQuery とかかなり興味深かったです。プレゼンもうまいし。
また,前の席にピンク色の頭をした人が座っていて,怖いからずっと目を合わせないようにしてたのですが,この人が Jesse Vincent さんだったのですね。後で知りました。で,この日の Jesse の次の一言がとても印象に残りました。

Cloud computing is sharecropping.(小作農)

Google App Engine や Amazon EC3/S3 のクラウド・コンピューティングは,地主から土地を借りて耕作する小作農でしかない,というんです。確かにそういった見方もできるし,いつか年貢を取られる日がくる可能性も否定できません。
でも,僕はそんなに心配する必要はないのではないかと考えています。「どこまでがインフラで,どこからがアプリケーションであるか」という定義が変わるだけで,思いついたアイデアを簡単に形にしてサービスとして公開できるというのは良いことだと思います。美味しいフランス料理のお店を開こうとした時に,電気,ガスや水道をすべて自前で用意しようという人はいません。シェフは,フランス料理をつくることに集中して腕をふるえばいいのです。もし,インフラの部分で他と差別化を図るようなビジネスモデルであれば,その時は自前で用意すればいいだけのことです。ちょうど炭火焼屋の炭火のように。

そんなわけで,僕はクラウド・コンピューティングを恐れる必要はないと思っているのですが,できれば一企業だけで運用されないプラットフォームがあるといいですね。 Facebook や MySpace もアプリケーション・プラットフォームという意味では,制限のきつい App Engine と捉えることができるかと思いますが, The Internet は今も凄い速度で発展中。これからどういうところに落ち着くのか非常に楽しみです。

追記:
Jesseさんの写真が竹迫さんのFlickrにあがっていました。絶対怖いって!

Google App Engine で JSON 出力

海外のブログを見ていたら,こんな記述をみつけました。

GAE doesn’t include ‘simplejson‘ in the Python container so you are going to have to include it with your application. I downloaded simplejson-1.8.1 and symbolically linked its simplejson directory into my application directory.

そんなことないですよね。 simplejson パッケージが django.utils に含まれているので,次のようにすれば JSON 形式で出力することができます。日本語文字列を含む場合は, ensure_ascii=False とするところがポイント。

# -*- coding: utf-8 -*-
import wsgiref.handlers
from django.utils import simplejson
from google.appengine.ext import webapp

class hoge(webapp.RequestHandler):
    data = {"cancam_models": [{"name": u"蛯原友里", "age": 28},
                              {"name": u"徳澤直子", "age": 23},
                              {"name": u"西山茉希", "age": 22},]}
    self.response.content_type = “application/json”
    simplejson.dump(data, self.response.out, ensure_ascii=False)

また,最後の行を次のようにすると,JSONP 形式で出力できます。

self.response.out.write("%s(%s)" %
    (callback, simplejson.dumps(data, ensure_ascii=False)))


関連リンク:
simplejson - Google Code

Google App Engine で1対多の結合をする

話題の Google App Engine ですが,やはり人気のようでまだアカウントが取得できていない人も多いようですね。アカウントがなくても,ローカルで開発は始められるので,これから始めようと思っている人は次の記事を参考にすると良いと思います(手前味噌ですが…)。

» 一番かんたんなGoogle App Engineの使い方 |gihyo.jp (技術評論社)

さて,本題の Google App Engine で1対多のジョインを行う方法に入っていきましょう。「BigTable」をバックエンドに利用できる Google App Engine ですが, RDBMS の考え方に慣れているとけっこう戸惑うことが多いです。 SQL に似た専用の GQL 言語は, OR や != が使えなかったりしてとても癖があります。親レコードと子レコードを JOIN する方法もわからずに最初は悩んだのですが,モデルを定義する際の ReferenceProperty に collection_name を定義しておくことで簡単にできます。正確には結合ではないかもしれませんが,親レコードから collection_name プロパティを参照することで関連する 子レコードのみを抽出することができるようになります。

以下のコードがそのサンプルになります。

# -*- coding: utf-8 -*-
import os,cgi
import wsgiref.handlers

from google.appengine.ext import webapp
from google.appengine.ext import db
from google.appengine.ext.webapp import template

class Group(db.Model):
    name = db.StringProperty(required=True)
    
class Person(db.Model):
    name = db.StringProperty(required=True)
    age = db.IntegerProperty(required=True)
    group = db.ReferenceProperty(Group, 
        required=True, collection_name='members')

class MainPage(webapp.RequestHandler):
    def get(self):
        # Group data
        group1 = Group(name="Perfume")
        group1.put()
        group2 = Group(name="Puffy")
        group2.put()

        # Person data
        person1 = Person(name=u"大本 彩乃", age=19, group=group1)
        person1.put()
        person2 = Person(name=u"樫野 有香", age=19, group=group1)
        person2.put()
        person3 = Person(name=u"西脇 綾香", age=19, group=group1)
        person3.put()
        person4 = Person(name=u"大貫 亜美", age=34, group=group2)
        person4.put()
        person5 = Person(name=u"吉村 由美", age=33, group=group2)
        person5.put()

        groups = Group.all()
        
        path = os.path.join(os.path.dirname(__file__), 'example.html')
        self.response.out.write(template.render(path, {'groups': groups}))

def main():
    application = webapp.WSGIApplication(
        [('/', MainPage)],
        debug=True)
    wsgiref.handlers.CGIHandler().run(application)
        
if __name__ == "__main__":
    main()

アイドルがグループに所属するというモデルを考えます。大貫亜美さんと吉村由美さんは Puffy というグループに所属します。また,大本彩乃さん,樫野有香さん,西脇綾香さんは Perfume というグループに所属します。上のコードだと, Group と Person というモデルを定義して, MainPage クラスでデータを登録しています。そして, groups という変数に全てのグループを格納して,テンプレートに渡しています。

そして表示に利用するテンプレートは,これです。 Group ごとにループ処理を行い,さらにそのグループに所属するメンバーでループ処理を行っています。

  {% for group in groups %}
     <h2>{{ group.name }}</h2>
     <ul>
     {% for member in group.members %}
       <li>{{ member.name }} ({{ member.age }}歳)</li>
     {% endfor %}
     </ul>
  {% endfor %}

以上のプログラムを実行した結果は,次のようになります。

ちゃんと,グループごとに分かれて表示されていますね。

Google App Engine で XML をパースする方法

誤解があるといけないので書きますが,「Google App EngineにXMLパーサが入っていない」ということはありません。 ElementTree という Python 標準モジュールがふつうに使えるので,特に App Engine だからといって意識する必要はありません。Pythonで書かれたpure Python版とCのライブラリを利用したものがありますが,どちらでもOKです。好きな方をインポートしてください。

pure Python版
from xml.etree import ElementTree
Cライブラリ版
from xml.etree import cElementTree

例えば,Twitter の XML を取得してきて,パースして名前と本文を表示するのは,こんな感じでできます。簡単ですね。

import xml.etree.cElementTree as etree
from google.appengine.api import urlfetch

url = 'http://twitter.com/statuses/public_timeline.xml'
xml = urlfetch.fetch(url).content
dom = etree.fromstring(xml)

for st in dom.findall('./status'):
    name = st.findtext('user/screen_name').encode('utf-8')
    msg = st.findtext('text').encode('utf-8')
    print "%s: %s\n" % (name, msg)

簡単に説明すると, status エレメントでループして,その中から screen_name と text エレメントのテキストを取り出して表示しています。ちなみに,Twitter public timeline の XML はこんな感じです。

<?xml version="1.0" encoding="UTF-8"?>
<statuses type="array">
  <status>
    <created_at>Fri Apr 11 14:36:25 +0000 2008</created_at>
    <id>787211133</id>
    <text>ニコニコ ドウガ ヲ ミテイマース</text>
    <source><a href="http://twitterfeed.com">twitterfeed</a></source>

    <truncated>false</truncated>
    <in_reply_to></in_reply_to>
    <in_reply_to_user_id></in_reply_to_user_id>
    <user>
      <id>7999382</id>
      <name>fileunder</name>
      <screen_name>fileunder</screen_name>

      <location>Amersfoort</location>
      <description>Regelneef van FileUnder. Al lijkt het soms ook wel eens een vorm van ehm ehm nu ja zoiets.</description>
      <profile_image_url>http://s3.amazonaws.com/twitter_production/profile_images/28244052/DSC00034_normal.jpg</profile_image_url>
      <url>http://www.fileunder.nl</url>
      <protected>false</protected>
      <followers_count>76</followers_count>

    </user>
  </status>
  <status>
  …
  </status>
</statuses>

# 本当は, lxml を使えると最高なんですけどね…

Google App Engine について知っておきたいこと

まだベータリリースではありますが,4月8日に Google App Engine が公開されました。ひと言でいうと,Webアプリケーションを簡単に公開することができる開発/ホスティング環境です。
特徴としては,

  • アプリケーションごとに500MBのストレージ,月に5,000,000ページビューまで利用可能
  • 無料(正式リリース後は有料オプションで上記の上限超過にも対応)
  • 現時点で開発言語は Python のみ対応(Djangoベース)
  • SDKをダウンロードすることでローカルで開発可能,デプロイも簡単
  • 管理用ダッシュボードが用意されていてCPU使用率,ログなどを閲覧可能

で,Google App Engineは何がいいのか?ということなのですが,僕は次のように考えています。

まず,個人や小さなベンチャー企業がWeb上でサービスを公開しようとした時に必要な初期投資がほぼ要らなくなります。現在は,さくらなどでレンタルサーバを借りてサーバをセットアップして…といった作業をしているかと思いますが,これが必要なくなります。

次に,サービス初期の段階ではサーバ1台で始めて,アクセス数が多くなってきたら負荷分散を考えるといった「小さく始めて大きく育てる」ということが,Googleの誇るインフラを使って非常に簡単にできます。通常はアクセス数が増えると,それに対応できるようにシステムに大幅な改修が必要になります。それが,Googleが培ってきた技術を用いることで,アプリケーション開発者が全く意識することなく,スケールと負荷分散を自動的に行ってくれます。数百人しか利用していないサービスが突如人気が出て,数万人規模になっても何もしなくてもGoogle App Engineのインフラがよきに計らってくれます。

ここの部分は非常に重要で,大手の会社でもこの作業に失敗して何日もサービスを止めるなんてことがざらにあります(昨年もありましたね…)。Webアプリケーションを開発できるエンジニアというのは世の中にたくさんいますが,スケール可能な設計にしたり,それを実際に構築したりすることができるエンジニアっていうのは割と少ないです。しかしこれからは,サーバの知識がなくても「優れたアイデア」と「少しのプログラム開発力」さえあれば,魅力的なサービスの運営ができてしまうということになります。

次に開発環境の話になりますが,現時点で対応している言語は Python のみです。開発用のフレームワークとしては,標準で Django が利用可能です(実はこのブログもDjangoで動いています)。ただし,Google のインフラを利用するために Model まわりに大きく手が入っていて,既存の Django アプリケーションをそのまま移行することはできません。データの取得方法も慣れ親しんだO/Rマッパー方式ではなく,ほぼ SQL と同一ではありますが独自の GQL という形式で記述が必要です。この辺りは,少しだけネックになるかもしれません。一度,Google App Engine用に作ってしまうと,他の環境に移すことが難しくなります。また,開発効率の高さから一部では盛り上がっている Django ですが,まだまだ開発者がそんなに多いわけではないのも少し問題です。しかし,これは逆にエンジニアにとっては新たなチャンスになるかもしれません。Django は比較的習得が容易ですし,ちょっとやる気を出すだけで Google のインフラを使って差別化ができるわけですから。

最後に,あまりよく知られていないであろう部分をまとめておきます。


■ Django以外のPythonフレームワークも使える

標準でサポートしているのは,Djangoベースのものになりますが,他のPython製フレームワークが使えないわけではありません。WSGIに準拠したCherryPy, Pylons, web.pyなどが利用可能です。
利用可能なんですが… 後述するようにネイティブCの一部ライブラリが使えないために例えば Pylons を簡単に動かせるかというとちょっと難しいようです。 

■ 独自ドメインも使える

登録したアプリケーションは,***.appspot.comという名前がデフォルトですが,Google Appsの設定をすることで独自ドメインも使えます。詳細はこちら。

» http://code.google.com/appengine/articles/domains.html

■ 1アカウントで3アプリケーションまで登録可能,ただし削除できない

開発用のアカウントを登録すると,***.appspot.comといったアプリケーションを3つまで登録可能です。でも,今のところ削除することができません。もし,ミスタイプして変なidを取ってしまったら最悪です。注意しましょう。

■ socketやftplibなどのライブラリは使えない

「Google App Engine Python Library Support」に記載されている一部のネイティブCのライブラリが利用可能です。他にピュアPythonで記述されたライブラリはだいたい使えるようです。ただし,子プロセスやスレッド機能は使えません。また,imp, ftplib, select, socket, tempfileなどのモジュールも使えません。HTTP/HTTPS以外で通信したり,動画変換などを行うサービスはできないと考えたほうがよいです。

■ 何から始めたらいいか

まずはチュートリアルを順番にやってみることをお勧めします。Web開発をしたことがある人であれば,Pythonの知識がなくても分かりやすいと思います。次に Datastore APIUsers API に目を通してみましょう。そして,一通り使えるようになったら,Samples for Google App Engineを見ると,さらに発見があるかもしれません。


以上で,自分なりにまとめてみた Google App Engine の概要は終わりです。近々,ウノウに会場をお借りして,Google App Engine 勉強会を開催できたらいいなぁなどと考えています。興味のある人がどれだけいるのかは分かりませんが,詳細が決まりましたらまた追ってお知らせしたいと思います。

Google App Engine リリース間近,最初は Python のみサポート

Googleが月曜日に何か大きな発表をする,と噂されていたものの正体は「Google App Engine」というサービスのようです。TechCrunchに記事が上がるやいなや,かなりの盛り上がりを見せています。Googleが誇るBigTableとGFSが利用可能なアプリケーション用の実行環境で,Amazon EC2に対抗するようなもののようです。ベータリリース時には10,000人限定で公開するようですが,サポートされる言語はPythonのみ。今後,他の言語もサポートしていくようですが,Python開発者のGuido van RossumがいるGoogleは,Pythonにフォーカスしていくということでしょうね。非常に楽しみです。

» Google App Engine

※まだ上のリンクを辿っても何もありませんが,日本時間の13時頃に例のキャンプファイヤーで公開される模様です。

関連リンク:
» Live From Google Campfire One - TechCrunch
» App Engine: Host Your Apps with Google - O'Reilly Radar


追記:Guidoの動画が公開されました。Django 0.96.1が最初から使えるようです ↓