『10日でおぼえる Python 入門教室』

最近は、Google App Engine や Django などが話題ですが、Python が分からないからと躊躇している人も多いのではないでしょうか?そんな人にお勧めなのが、この『10日でおぼえる Python 入門教室』です。

10日でおぼえる Python 入門教室
穂苅 実紀夫 寺田 学 中西 直樹
堀田 直孝 永井 孝
翔泳社

こういう本には、教科書的なものとハウツー的なものがありますが、この本は後者です。より実践的に Python を学んで行くことができます。内容も Amazon や Livedoor天気予報, Yahoo!翻訳などの API を使ってデータを取得したり、GUI の RSSリーダーを作ったりと、実際に動くものを作ることでプログラミングの楽しさを学べるようになっています。また、最後の10日目では流行の Google App Engine を使ってアプリケーションを作成することがテーマになっていて、この本を最後まで読み進めていけば、一気に最先端の領域まで駆け上がることができます。実際には、プロダクションレベルのアプリケーションを構築するには、データモデルの設計やセキュリティ対策、パフォーマンス改善などもっと体系的な知識が必要になってきますが、入門用としてはこれで充分です。Python で一通りのことが出来るようになることでしょう。

目次
第0日 オリエンテーション
第1日 Pythonはじめの一歩
第2日 Pythonを本格的に使ってみよう
第3日 Web APIを使ってみよう
第4日 日本語とファイルの扱いを学ぼう
第5日 便利なツールを作ってみよう
第6日 デスクトップアプリを作ろう
第7日 エラーとテストを学ぼう
第8日 データベースを操作しよう
第9日 Webフレームワークを使ってフォトログを作ろう
第10日 Google App Engineを使ってフォトログを作ろう

少し個人的な感想を書かせてもらうと、バージョンは Python 2.6を中心に扱っていて、現時点ではまだあまり一般的ではない 3.0 を参考程度にとどめている点に好感を持ちました。ちょっと残念な点としては、初学者には SQLAlchemy や Pylons の章が若干難し過ぎる印象を受けました。テンポ良くここまで進んできて、ここで躓いてしまう人がいないかどうかが心配になります。ちょっと難しいなと思ったら、第8日,第9日は飛ばしてしまっても構わないと思います。

それからもう一点、第3日目の Amazon API ですが、8月15日からはリクエストに署名を付けることが必須となるため、このサンプルは動かなくなるので注意が必要です。これは、執筆の時期の関係で仕方がないのかもしれませんが。

以上、この辺りを考慮しても『10日でおぼえる Python 入門教室』は自信を持ってお勧めできます。より体系的に学びたくなった場合は、教科書的な『みんなのPython』『初めてのPython 第3版』を手元に置いておくと完璧です。

V8 を使って Python で JavaScript を実行する

Google V8 JavaScript Engine の Python バインディングを試してみました。

直近で gumi Platform 上で簡単な OpenSocial ガジェットを動作させるのに使いたかったということが一番の動機ですが、サーバサイドで JavaScript を実行するというのは、これから当たり前の技術になると思っています。今後、モバイル・プラットフォームの台頭とクラウド・コンピューティングの進展により、非力なクライアントと強力なサーバという今までとは違ったパワーバランスになってきます。そこで重要になるのは、いかにクライアント側の処理をシンプルにするかということです。例えば、ブログパーツとかガジェットなんかは静的コンテンツを汎用的に表示させるためだけに JavaScript を使っています。最初からブログエンジン側でこの部分をレンダリングしてあげれば、非力なモバイル端末にとっては負担が減ります。このことは未だムーアの法則から取り残されているバッテリーの持ちにも影響してきます。

さて、早速試してみましょう。まずは、 bitbucket からソースコードをチェックアウトします。

$ hg clone http://www.bitbucket.org/dfdeshom/v8onpython/ v8onpython

次に libv8.so をビルドします。なお、ビルドには scons と Cython が必要ですので予めインストールしておきます。 scons は Ubuntu の場合はパッケージがあるので、 "aptitude install scons" (または apt-get)するだけです。 Cython も Python のパッケージ・システムを使って "easy_install Cython"するだけです。

$ cd v8onpython/v8-src
$ scons library=shared
...
scons: done building targets.

次に Python バインディングのビルドです。

$ cd..
$ python setup.py build_ext --inplace
running build_ext
building 'v8onpython' extension
g++ -pthread -shared -Wl,-O1 -Wl,-Bsymbolic-functions build/temp.linux-i686-2.5
/v8onpython.o -Lv8-src -lv8 -o v8onpython.so
$ mv v8-src/libv8.so .

正常に終了するとカレントディレクトリに v8onpython.so ができているはずです。それでは、実際に使ってみましょう。

$ ipython
Python 2.5.2 (r252:60911, Jul 31 2008, 17:28:52) 
Type "copyright", "credits" or "license" for more information.

In [1]: import v8onpython
In [2]: v = v8onpython.Script()
In [3]: v.compile("(function(){return 'Hello World'}())")
Out[3]: 'Hello World'

関連リンク:
» v8 - Google Code
» dfdeshom / v8onpython / source — bitbucket.org

Django Middleware で Traceback をコンソールに出力する

Django は、コンソールにデバッグ情報を出力してくれません(クリティカルなエラーは除く)。普通に開発している分には、ブラウザに表示される Traceback が充実しているので十分なのですが、API などブラウザ以外からリクエストが飛んでくるアプリケーションを開発している場合に、かなり不便なので Middleware を使ってコンソールに Traceback を出力するようにします。

まず、以下を middleware.py としてプロジェクト直下に保存。 request オブジェクトの内容も出力したい場合は、コメントを外します。

import traceback
import sys

class TracebackMiddleware():
    def process_exception(self, request, exception):
        print '######################## Exception ##################'
        print '\n'.join(traceback.format_exception(*sys.exc_info()))
        #print '-----------------------------------------------------'
        #print repr(request)
        print '#####################################################'

settings.py に ConsoleExceptionMiddleware の設定を追加。

MIDDLEWARE_CLASSES = (
    'django.middleware.common.CommonMiddleware',
    'django.contrib.sessions.middleware.SessionMiddleware',
    'django.contrib.auth.middleware.AuthenticationMiddleware',
    'django.middleware.doc.XViewMiddleware',
    'myapp.middleware.ConsoleExceptionMiddleware',
)

これでプログラム中でエラーが発生した際に manage.py を実行しているコンソールに Traceback 情報が表示されるようになります。以下サンプル。

関連リンク:
Django snippets: Middleware for printing of exception to console

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 I/O 第1日目

Google のディベロッパー向けカンファレンス「Google I/O」がついに始まりました。この日は,朝7:30に集合して,Google 渡部さんの助けを借りて Registration を済ませました。そして,たぶんこれはIOの間違いだと思うのですが,バイナリで「GOOGLEKO」と書かれたTシャツをもらって,会場に用意されている朝食を食べました。海外のエンジニアは,どんな人達なのか興味津々だったのですが,日本のエンジニアと雰囲気が似ていて親近感を覚えました。この日,世界各国から集まった技術者は3,000人だそうです。すごい…

Just before key note Keynote Speech

幕開けは,Vice PresidentのVic Gundtra氏によるキーノートスピーチでした。初日のすべてのセッションの中でこれが一番良かったと思ったくらい,本当に上手で非常に分かりやすいものでした。

内容としては,Googleが目指すところのおさらいだったのですが,scalability, distribution, storage,…といったキーワードのタグクラウドで表現していて,直近のテーマとして「Make the cloud more accessible」を中心に考えているそうです。また,ウェブ・アプリケーションがクライアント・アプリケーションに追いつく日は近いということも言っていました。
考えてみると,Googleという会社が今していることは,インターネットを徹底的に活用してインフラ的な地位を築いていくという点で一本の筋が通っていて全くブレがないように見えます。僕が知らないだけでこのような会社は他にもあるのかもしれませんが,少なくとも日本にはここまでの先進性を持った企業は確実にないような気がします。

Android

次に一番の目玉だと思われる Android 新バージョンのデモが行われました。iPhoneのような指でドラッグするようなインタフェースと,新機能のガジェット,そして電子コンパスと連動したストリートビューのアプリケーションが紹介されていました。Androidはバージョンが変わるごとに大きな進化を遂げていて,今年一番の注目株であることは間違いないようです。

Google App Engine

Google App Engine についていくつかの発表がありました。有料オプションが提供されるようになったことと Memcache と Image Manipulation の機能が使えるようになりました。そして,ついにディベロッパー登録の制限がなくなり誰でも利用可能になりました。 Memcache は汎用的な技術でちょっと意外な印象を受けたのですが,画像操作ができるようになったのは大きいですね。今まではサムネイルも作成できませんでしたから。

Google Web Tollkit

いまいち日本では盛り上がっていないように見える GWT ですが,Java 5 への対応と20%のスピードアップを果たしているそうです。Google社員の方に聞いたところによると,Google社内のJavaScriptエンジニアが手で書いたコードよりも速くて,そのエンジニアはショックを受けていたそう。また,BlueprintというGWTで書かれたビジネスアプリケーションのデモをしていたのですが,これが Flash と見間違えるほどの良い動きをしていました。また,Eclipse上で,ブレークポイントを設定してDOMの内容を確認するデモは興味深かったです。

OpenSocial

OpenSocial については,API v.0.8 が発表されたものの,内容についての詳しい説明はなくて,特に目新しい点はありませんでした。
OpenID, OAuth, OpenSocial の技術を軸に Web 上のあらゆる場所をソーシャルにしていくということ,現時点で2万人のディベロッパーがいるということを言っていました。あと,この Gundtra 氏は 「REST」を「リスト」と発音していましたが,他の人は「レスト」と言っていたので,レストでいいのだと思います。

Rapid Development with Python, Django and Google App Engine

そして, Python 言語の開発者で Google 社員の Guid van Rossam によるセッションを聞きました。Google App Engine で Django フレームワークを使うという内容で,正直そんなに面白くなかったのですが,生 Guido を拝めただけでも非常に感激でした。思わず,一緒に記念撮影をお願いしてしまいました。その時にGuidoが「日本人なのにRubyを使わないのか?」と言っていたのが,ちょっと面白かったです。

Guido at Python session  Guido

その後はパーティーに参加して,いろいろな人と名刺交換をしたりしたのですが,安藤恐竜さんの Android on Zaurus や佐々木さんのAndroidケータイが大人気で羨ましかったです。僕は英語が得意じゃないので,話をしていてもすぐにお互いに沈黙という状態になりがちなのですが,今度はそれを回避するためにも何かネタを用意していこうと思います。

その後,a2cさん,佐々木さんと Google App Engine の SDK1.1 を試したり,ホテル最上階のバーで軽く一杯飲んでから帰りました。

Google App Engine BoF  Blackberry and Night San Francisco

関連リンク:
Google I/O '08 Keynote: Client, Connectivity, and the Cloud

Python で wave ファイル生成

wave 形式の音声ファイルを出力する Python プログラム。

#!/usr/bin/env python
import wave, math, array
SAMPFREQ = 44100
LENGTH = 3

def wave_init(fname, sampf):
   f = wave.open(fname, 'w')
   f.setnchannels(1)
   f.setsampwidth(2)
   f.setframerate(sampf)
   f.setcomptype('NONE', 'not compressed')
   return f
 
def prepare_array(n):
   data = array.array('h')
   data.extend([0]*n)
   return data
 
def wave_write(f, data):
   f.writeframesraw(data.tostring())
   f.close()
 
def sin_wave(fname, freq):
   f = wave_init(fname, SAMPFREQ)
   data = prepare_array(SAMPFREQ * LENGTH)
   a = math.pi * 2.0 * float(freq) / float(SAMPFREQ)
   for i in range(SAMPFREQ * LENGTH):
      ft  = int(math.sin(a * float(i)) * 30000.0)
      data[i] = ft
   wave_write(f, data)
 
if __name__ == "__main__":
   sin_wave('sinwave.wav', 440)

実行すると,カレントディレクトリに sinwave.wav というファイルが出来上がります。
おもしろい。

参考文献:
千葉大学 情報通信システム 講義資料(PowerPoint)

そして,この資料で面白いと思ったのはこっちです。この授業受けてみたいなぁ。


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

3の倍数と3のつく数字(世界のナベアツ)

» 力試しにナベアツのような判定をするプログラムを作ろうとしたところ…

Pythonだとこんな感じで1行で書けるんだけど,これじゃだめなのかなぁ

(num % 3 == 0) or ('3' in `num`)
実行例:
>>> num = 12345
>>> (num % 3 == 0) or ('3' in `num`)
True

>>> num = 14
>>> (num % 3 == 0) or ('3' in `num`)
False

追記:
文字列として扱ってはいけない理由が分からないけど,あくまでも数値として扱うとこんな感じかな。やっぱりPythonはすっきりと書けて,他の人が読んだときに理解しやすい気がする。

def include3(num):
    if num % 10 == 3:
        return True
    if num > 10:
        return include3(num / 10)
    return False
実行例:
>>> num = 12345
>>> (num % 3 == 0) or include3(num)
True

>>> num = 14
>>> (num % 3 == 0) or include3(num)
False

追記:
後で調べたら,はてダでこの問題を解いてる人がけっこういたのですが,下の2つには強烈なセンスを感じました。世の中には面白い人がいるもんだなぁ。

» ナベアツ問題これは難しい・・・ - miura1729の日記
 BCD表現で解いてるw
» GPUで「世界のナベアツ」問題 - 桃の天然水
 GPUのシェーダ機能を使ってる

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 勉強会を開催できたらいいなぁなどと考えています。興味のある人がどれだけいるのかは分かりませんが,詳細が決まりましたらまた追ってお知らせしたいと思います。