it's cafe : 下高井戸の無線LANが使えるカフェ

it's cafe は,下高井戸から歩いて1分のところにあるカフェです。フリーランスとして記事やプログラムを書く仕事をしていると,たまに気分を変えて違う場所で作業したいと思うときが多々あります。そんな時に it's cafe は,無線LANが無料で使えるのでおすすめ。ランチや夜ご飯セットもあるのでお腹が空いてもOK。

このカフェのオーナー,実は以前一緒に仕事をしていたのですが,エントランスをキャンバスにしたり,寄席を開いたり,いろいろ面白い企画をしています。女性客が多いというのもその人柄を見れば,うなずける気がします。それから,まだオーナーに確認していないのですが, Weboo! Returns. を見たと言えば,僕も ThinkPad に貼っている右のステッカーがもらえます!(いいですよね?)もらえます!


it's cafe[イッツ・カフェ]
- 東京都杉並区下高井戸1-2-14 1F
- open 12:00 / close 22:30 (L.O.21:30)
- ランチ 12:00 - 15:00
- 定休日:毎週水曜日

View Larger Map

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 %}

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

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

Ubuntu Hardy の青いテーマ「Blubuntu」

Ubuntu Hardy Heron をインストールして,デフォルトの茶色いテーマが気に入らなかったら,青くすると良いです。

» blubuntuをインストール

テーマの変更方法は,上のリンクをクリックして blubuntu-look パッケージをインストール。そして,[システム]-[設定]-[外観の設定]からテーマを「Blutuntu」にすればOKです。壁紙も付いてくるのでお好みに合わせてどうぞ。

また,いろいろカスタマイズするとどっかで見たような感じにすることもできます。まさか,このテーマを常用する人はいないと思いますが,見た目なんていくらでも変更できますよというサンプル。

「第10回 jQuery.js を読み解く」が掲載されました

ちょっとお知らせ。gihyo.jp で連載中の記事「jQuery.jsを読み解く」の第10回が公開されました。

jquery.jsを読み解く:
第10回 jQueryライブラリ(2183行目~2364行目)

$(document).ready()を実装している部分が出てきますが,ここのソースコードは非常に興味深いです。よくある実装方法としては,動的に scriptタグを挿入してJavaScriptコードを実行する方法がありますが,jQueryの実装はもっと複雑なものです。また,DOMContentLoadedを利用して,処理の開始をできるだけ早くして,ユーザの体感速度を向上するための工夫も大変参考になります。

何気なく使っていると分からないけど,その中には最高の技術と作った人の情熱が詰まっていて,分かる人にはそれが分かる。日本のもの作りって伝統的にこういう存在だったはずで,最近の自分はどうだろう,と自問してみるいいきっかけになりました。

anything.el が手放せなくなった

anything.el は,最近使ったファイルや locate の結果や Man や Info など様々なソースからインクリメンタルサーチを可能にする Emacs の拡張です。一度使ってしまうと,もうこれなしの Emacs は考えられません。自分は,携帯電話に予測変換が入ったときくらいのインパクトを感じていて,今後のモバイル端末の未来を暗示していると思っています。いや,冗談抜きで。

anything.el

こんな感じに設定しています。本当は,もっといろいろなソースを対象にできるみたいですが,使う頻度と速度から今のところこの設定で満足してます。

;; anything
(require 'anything-config)
(setq anything-sources (list anything-c-source-buffers
                             anything-c-source-bookmarks
                             anything-c-source-recentf
                             anything-c-source-file-name-history
                             anything-c-source-locate))
(define-key anything-map (kbd "C-p") 'anything-previous-line)
(define-key anything-map (kbd "C-n") 'anything-next-line)
(define-key anything-map (kbd "C-v") 'anything-next-source)
(define-key anything-map (kbd "M-v") 'anything-previous-source)
(global-set-key (kbd "C-;") 'anything)

(1) C-; で anything 起動
(2) 目的の文字を入力
(3) C-n および C-p で上下移動
(4) C-v および M-v でソース間を移動

anything.el を最初に試したときに recentf は使えないと思って,コメントアウトしていたのですが,なんのことはない anything-c-source-recentf の「c」が抜けていただけでした。


※自分と同じように感動した人たちの声をまとめてみました。

@junyaanything.elアツい!
@isseianything.el に驚愕しているところ
@okuparaanything.vimを作って、vimユーザにanything.elのすごさを教えてください。
@mincemaker今更だがAnything.el便利。すごい。
@hardfrostanything.el面白いな
@webooanything.el 便利やわー
@tomoyuki28jpemacsにanything.elを導入した。QuickSilver並みにヤバいかも。
@gan2anything.el はやっぱり便利だー
@okhra今更ながらanything.el使いはじめたけど、便利すぎてわろた
@pm11opanything.el すげー
@snj14ついでにemacsにもanything.elをいれた.今更だけどすげー.これやべー. 使命か、情熱かーー。!!
@kentaroいまさらanything.elの素晴しさに爆笑している。笑えるほどすごい。
@typesteranything.el使ってなかったとか今までどんだけ無駄な時間をすごしたのかという話である
@holysugaranything.el のすすめ
@Ashizawaいまさらだけどanything.elを入れて感激してる
@tactactad設定丸パクリで試してみた。感動した!<anything.el
@k1LoWanything.elやばい!!

Life Hacks PRESS vol.2

注文していた Life Hacks PRESS vol.2 が届きました。

LifeHacks PRESS
いまやビジネスパーソンにすっかり定着した“ライフハック”。しかし、実践したけど「思ったような結果や成果、生産性が上がっていない」人も多いのではないでしょうか? Vol.1の刊行より2年、多くの達人によりさまざまな切り口でライフハックが紹介されてきましたが、Vol.2ではライフハックで大切なものを「時間」と定義し、数々のハックを披露します。シゴタノ!の大橋悦夫氏による本田直之氏や勝間和代氏らとの対談をはじめ、「前倒し&スキマ時間でスピード仕事術」「自分を変えるライフハックの実践7つのロジックと12のテクニック」など、今日から結果を出せる仕事術が盛りだくさん。

中身を見ないで予約してしまいました。まだ詳しく読んでいませんが,今回のVol.2は,小手先のテクニックよりもライフハックのロジックに多くのページが割かれていて好印象。人気の勝間和代さんのインタビューなども載っています。

Design Wave 付録の ARM プロセッサ

Design Wave 2008年5月号を買ってきました。完全に付録目当てです。「ARMプロセッサ」と「3軸加速度センサ」が載った基板が付いてきて,USBインタフェースでいろいろ遊べます。 GAINER のキットが7,500円くらいするので,3軸加速度センサ付きで2,480円はかなりお買い得(だと思う)。

Design Wave ARM processor

早速, ThinkPad X61 に繋いでみます。 Windows だと付属の CD-ROM からドライバをインストールしなければいけないみたいですが, Ubuntu なのでいきなり繋いでOK。

[27799.659102] usb 2-1: new full speed USB device using uhci_hcd and address 6
[27799.836019] usb 2-1: configuration #1 chosen from 1 choice
[27799.978688] /build/buildd/linux-2.6.24/drivers/usb/class/cdc-acm.c: This device cannot do calls on its own. It is no modem.
[27799.978722] cdc_acm 2-1:1.0: ttyACM0: USB ACM device
[27799.981395] usbcore: registered new interface driver cdc_acm
[27799.981403] /build/buildd/linux-2.6.24/drivers/usb/class/cdc-acm.c: v0.25:USB Abstract Control Model driver for USB modems and ISDN adapters

ちゃんと認識されてました。'*'を送ると加速度センサの値が返ってくるようで,試してみたら簡単に値が取得できました。

% echo -n '*' > /dev/ttyACM0
% cat /dev/ttyACM0
4095,1835,4095
4095,2155,3985
4095,2393,3596
3609,2592,2711
2953,2751,2110
2210,2762,1479
1199,2581,837
3,2217,203
0,1696,3
0,1083,152
0,577,492
0,285,970
0,219,1476
0,369,2066
84,581,2575
1016,1067,2947
1985,1548,3244
3183,1899,3516
3963,1906,3863
4095,1937,4054

Python Developers Camp で GAINER の人たちがやってたみたいなことをするには,Javaを入れないといけないのかな。

参考リンク:DesignWave付録 Cortex-M3 ボード - 初学者の箸置

Phun が楽しすぎる

» http://www.phun.jp/

<img src="http://media.tumblr.com/uNu7vWvsj89bh893f5Huwalj_400.png" />
Phun とは、スウェーデンにあるUmea(ウーメオ)大学VRlab(Virtual Reality Laboratory)の学生、Emil Ernerfeldt氏が開発した物理演算ソフトです。重力をもったフィールドに、四角や円、手書きによる描画を直感的に操作することができ、自由な組み合わせによって様々な仕組みを作り出すことができる今までにない新しいゲームです。

これは面白い!窓の杜の記事だと対応OSは Windows のみと書いてありますが,Linux用のバイナリ(64ビット版も!)も用意されていて,解凍して実行するだけで動作します。あらかじめいくつかのシーンが登録されていているので,再生ボタンを押すだけで上の動画のような動きを実際に試せます。また,Phunデータアップロード掲示板にていくつかのデータが公開されています。面白いピタゴラスイッチができたら,ぜひ共有したいですね。

» ダウンロードはこちら

ブログに最近の訪問者を表示してみる実験

このブログの右側に最近の訪問者表示を追加してみました。バックエンドは, Google App Engine なんですが,たまにちょっとレスポンスが悪い時があるようでちょっと様子見。問題ないみたいです。時間のかかる処理をさせると,あっという間にブロックされるので,あとは統計処理的なのをどうするかだなぁ。

Ubuntu は金田のバイク


photo by Gen Kanai

Ubuntu が初心者にも使いやすくて,誰でも気軽に使える OS というのはうそです。
Ubuntu は金田のバイク。

Firefox3 用 Firebug プラグイン

Firefox3 用の Firebug プラグインが無い!と嘆いている人が結構いるようなので紹介。

僕も最近はこの Firebugプラグインがないと生きていけない体になっているのですが, Ubuntu Hardy は Firefox3 がデフォルトです。仕方なく,無理やり古いバージョンをインストールして使っていたのですが,やっぱり動作が不安定でした。でも,こちらで公開されている1.2アルファ版を使えば大丈夫。

» Firebug Releases

既に数週間前から使っていますが,Beta 5との相性が思いのほか悪くてブラウザが落ちまくりで大変でした。でも,一昨日くらいにリリースされた1.2.0a18Xから非常に安定するようになりました。

Firefox3 用 delicious プラグイン

Firefox3 用の deliciousプラグインが無い!と嘆いている人が結構いるようなので紹介。

僕も最近はこの deliciousプラグインがないと生きていけない体になっているのですが, Ubuntu Hardy は Firefox3 がデフォルトです。仕方なく,無理やり古いバージョンをインストールして使っていたのですが,やっぱりローカルとの同期が正常に動作していませんでした。でも,こちらで公開されているアルファ版を使えば大丈夫。ただし,ダウンロードにはユーザ登録が必要です。

» delicious-firefox-extension : Files

また,新機能として,ステータスバーにインジケーターが付くようになりました。

既に1週間くらい使っていますが,大きな不具合は起こっていません。でも,もし不具合を発見したら,開発者に報告することをお忘れなく。

Shell History

Ubuntu界隈で流行ってるので,自分も ThinkPad X61 でやってみた。
(サンプル数が多すぎると面白くないので,最近の1,000件にしました)

自宅サーバ上でもやってみました。

$ history|awk '{a[$2]++ } END{for(i in a){print a[i] " " i}}' |sort -rn|head
4959 ls
2070 cd
1602 sudo
575 vi
546 exit
421 ipython
406 svn
400 lv
285 ps
231 unset

なんでこんなに unset してるんだ。謎…

『DESIGN OFFICE - こんなオフィスで働きたい』

こないだ買った本。RealDesignという雑誌の記事をまとめたムックです。最近いろいろと話題の佐藤可士和さんのオフィスとかお洒落なオフィスが写真付きでいっぱい載っていて、とても参考になります。といっても、自分がこんなオフィスを構えられるはずがないので、机周りのレイアウトとかを参考にしています。
日本だけでなく、海外のお洒落なオフィスも紹介されているのですが、気に入ったのはスウェーデンのプロダクトデザイナーの方のこの言葉。

「紙とペン、そしてオレの頭があればいい。」


DESIGN OFFICE―こんなオフィスで働きたい。
DESIGN OFFICE―こんなオフィスで働きたい。
エイ出版社
売り上げランキング: 30285
おすすめ度の平均: 3.0

“なにかを作り上げるときに重要なのは、間違いなく仕事場の環境だ。 才能溢れるクリエイターたちは、その事実をよく知っている。
そんなクリエイターたちの「ワークスペース」を、あますことなく紹介しよう。 それぞれにこだわりのある空間やアイテムは、「いい仕事」のために欠かせないものだ。”

でも、やっぱりいつかこんなオフィスで働きたいなぁ

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 を使えると最高なんですけどね…

世田谷線

Setagaya Line boy's dream
Entrance Conductress
PASMO
変わるものと変わらないもの
エコとエゴをタッパーに詰めて
ゆっくりと急ぐ

そして今日,ダライ・ラマが日本にやってきた

Opera Mini for Android

» The story behind Opera Mini on Google Android

きたこれ。


試しにエミュレータで動かして,このサイトを表示してみたのですが,エラーで落ちてしまいました。安定度は,Palm版とおなじくらいでしょうか。

「第9回 jQuery.js を読み解く」が掲載されました

ちょっとお知らせ。
技術評論社のWebサイト gihyo.jp にて、「jQuery.jsを読み解く」という記事を連載させていただいてますが、その第9回が公開されました。

jquery.jsを読み解く:第9回 jQueryライブラリ(1962行目~2182行目)

暇なときにでも見てやってください。

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アプリケーションを開発できるエンジニアというのは世の中にたくさんいますが,スケール可能な設計にしたり,それを実際に構築したりすることができるエンジニアっていうのは割と少なくて,僕が前に在籍していたウノウでも,CTOの尾藤さんや最近退職したid:dandasoくらいだったと思います(俺もできるよって人がいたらごめんなさい)。しかしこれからは,サーバの知識がなくても「優れたアイデア」と「少しのプログラム開発力」さえあれば,魅力的なサービスの運営ができてしまうということになります。

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

Ubuntu Hardy Updates

ここ最近,毎日のように Ubuntu 8.0.4 (Hardy Heron) の自動アップデート通知が来て正式リリースが近いことを肌で感じる。今日は,なんと163個ものアップデート通知が来た。何年も前からLinuxデスクトップを使っているけど,こんなに活発なのは初めてかもしれない。
インストールされているソフトウェアのアップデートをまとめて管理できるのは,Linuxが最高に便利なところ。

4月8日のつぶやき

11:51 Google App EngineでPythonすげー人気
11:53 Google App Engineのページ見れない
11:55 Guidoが関わってるのか,こりゃ楽しみだ
11:59 Google App Engine + Python!
12:33 Google App Engineリリース間近,最初はPythonのみサポート http://tinyurl.com/5emvxo
12:37 @everes ブログに書きましたー
12:49 Django + WSGIらしいよー
13:08 @sett4 Djangoがベースらしいです
13:20 Google App Engine登録した。Django 0.96.1が最初から使えるよ!
13:23 悲しい事にこれから打ち合わせ,帰ってからのお楽しみとする
13:27 @michisu 「ドキュメントでも読んどけ,ボケが」と言われました…
17:02 帰ったら,Weboo! Returns.をGoogle App Engineで動かすよ!
17:17 @voluntas 勝負じゃなくて,Python + Djangoを使ってる幸せを噛み締めようよ!
19:57 帰宅った。でも、もうひとつ原稿が残ってるんだよ。うぅー
20:56 Just started my engines!
21:10 @androidzaurus 勢い余って、Google I/Oに申し込んでしまいました
22:12 @androidzaurus それはいい情報!燃料サーチャージ高いですね…
22:40 Pythonとは http://tinyurl.com/5edcpr

Powered by pyhabu

pyhabuでmixiに自動アップしているものをここにも載せておく。
どうりで仕事が進まないわけだ…

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が最初から使えるようです ↓

jQuery について語る12才

Google Tech TalksにてjQueryについて語る12才のDmitri Gaskin君。jQueryやDrupalにパッチをコミットし,いくつかのDrupalモジュールを管理しているDmitri君は,LogitechやDrupalcon,ラジオ番組にも登場したりする人気者だそう。アメリカってすごいなぁ

シカクいアタマをマルくする問題 その1

清水川さんのブログに書いてあったこの問題をPythonで解いてみました。

回文数

"121" や "3333" のように右から読んでも左から読んでも同じ並びになる数値を回文数とよぶことにします。この回文数について以下の問いに答えなさい。

問い1

5を掛けると回文数となる、3桁の数値のうち最大の数値を答えなさい。

できた。

>>> [x for x in range(100,1000) if `x*5` == `x*5`[::-1]]
[101, 103, 105, 107, 109, 111, 113, 115, 117, 119]

後から確認したら,清水川さんのコメント欄に書いてあるのと,ほぼ一緒でした。でも,コメント欄をさらに読み進めていくと,次のようにした方が速いと書かれています。

>>> (x for x in xrange(999,99,-1) if `x*5` == `x*5`[::-1]).next()
119

たしかに今回は3桁だからいいけど,もっと大きな桁数になった場合は,いちいちリストを生成せずにジェネレータ式を使った方が効率がいいですね。ジェネレータオブジェクトは,遅延評価なので値が必要になった時にしか生成されません。

勉強になるなぁ。ぼくのアタマも少しだけマルくなりました。

Adobe AIR for Linux Alphaを試してみた

Adobe AIR for Linux を Ubuntu 8.04 Hardy Heron の64ビット環境にインストールしてみました。runtime版は下記のようなエラーが出てインストールできませんでした。おそらく内部的にはdebパッケージを使っていて,たぶんインストール時に弾かれているだけなんじゃないかと思います。FLASH Playerもそうですが,Adobeは今のところ32ビット版しか提供していません。これは,なんとかして欲しいところです。

An error occurred while installing Adobe AIR. Installation may not be allowed by your administrator. Please contact your administrator.

仕方がないので,SDK版をインストールしたところ問題なく動作しました。まず最初に動かしてみたのが,twitterクライアントの twhirl。日本語表示もOKで動作も軽快,Compizの「ゆらゆらエフェクト」もばっちりです。ただし,AIR 1.0は日本語入力未対応で,他のOSと同様に日本語入力ができません。ひょっとしたら,Linux版はいけるかもと淡い期待をしてたのですが,やっぱりダメでした。

# Alphaにかけたのに誰も気づいてくれない…

Adobe AIR for Linux のアルファ版が公開

Adobe AIR for Linux Alpha がAdobe Labsにてリリースされました。
対応OSは,

  • RedHat Desktop Linux 4
  • RedHat Enterprise Linux v5
  • Novell Desktop Linux 9
  • SUSE Linux Enterprise Desktop 10
  • Ubuntu 6.06

えーっ,6.06ですか… まぁ,それ以降のバージョンでも動くと思うけど,きっと32ビット用だけなんだろうなぁ。後ほど試してみたいと思います。

a Linux version of AIR together with Mac and Windows so all three platforms will have the same release cycle.

今後は,Windows,Macとともに同じリリースサイクルで出してくれるそうなので,期待しましょう。

iPod touch で Android を動かすことに成功したよ!

4/2 追記:本日,間違えて iTunes と同期をしてしまったため,普通のiPod touchに戻ってしまいました。バックアップを取ってなかったため,元に戻すことができません。とっても残念 :-P

この感動を皆さんに伝えたくて,仕方がありません。ついに iPod touch 上で Android を動かすことに成功しました!実は,2ヶ月前からずっとこの作業をしていました。途中,もう何度諦めようと思ったことか。でも,今からちょうど1時間前に Android が動き出しました。動作は軽快そのものといってよく,このまま売り出してもいいくらいだと思います。

これが証拠のスクリーンショットです。

Android化の手順ですが,Safariと付属ヘッドフォンの脆弱性を利用するため,ここでは公開できません。興味がある方は,個人的に連絡をください。NDAにサインして頂いた上で,お教えします。
2008年後半に出荷が予定されているこのイリジウムiPhone(もちろん日本も圏内!)と合わせて最強のモバイル環境が手に入る日を楽しみにしていてください。

今日は4月1日。記念すべき日(エイプリルフール)です。