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

Google I/O 2008 前夜

Google I/O に参加するためにサンフランシスコに来ています。a2cさん,佐々木さんと一緒の飛行機だったのですが,SFO到着後にお二人とはぐれてしまうというトラブルもあったものの,ユニオン・スクエアのハートの下で再会を果たし,軽く市内観光と食事をして過ごしました。

San Francisco  Union Square

夕食は,Google Japanの方々(シニアプロダクトマネジャーの及川さん,鵜飼さん,渡部さん)と先に来ていたあんどうさん, Google API Gulu の松尾さんとダウンタウンで食事をして明日の予定の打ち合わせを行いました。どのセッションに参加するか考えていたのですが, Python, Google App Engine, Open Social そして Android と気になるものが目白押しです。しかも,部屋が6つくらいあって,同じ時間に行われるセッションが結構あってまだ悩んでいます。

とりあえず, Guido van Rossum のセッションはマストとして,Open Social を中心に攻めていこうと思います。

イー・モバイルのEMチャージを契約して Ubuntu Hardy から使う

D02NE

先日,イー・モバイルのEMチャージに加入しました。EMチャージは,月額基本料が無料で自分が使う分だけ支払いをするプリペイド形式のサービスです。1パケットあたりいくらという従量課金の他に,1日定額 630円,7日定額 2,205円を選択することができます。自分の場合は,だいたい週に1日くらい外出先で使いたいのと,たまに実家に帰った時に利用したいくらいなので,普通に月額5,000円とかで契約するときよりもお得だと判断しました。3ヶ月利用しないとチャージ金額が消滅するというよく分からない規則はあるものの,2年縛りがないのでいつでも解約できるというメリットもあります。

端末はEMOBILEアウトレットで,7.2Mbps PCカードタイプの D02NE を購入しました。キャンペーン期間中で10,000円分のチャージ付きで17,980円だったので,実質7,980円で買えたことになります。 試しに自宅でスピードを測定してみたのですが,大体このくらいはコンスタントに出るようです。若干IMAPアクセスで引っかかるような感じがあるものの充分満足できるスピードだと思います。

ブロードバンドスピードテスト 通信速度測定結果
http://www.bspeedtest.jp/ v3.0.0
測定時刻 2008/05/26 00:59:01
回線種類/線路長/OS:モバイル回線/-/Linux/
サービス/ISP:-/-
サーバ1[N] 2.09Mbps
サーバ2[S] 2.07Mbps
下り受信速度: 2.0Mbps(2.09Mbps,261kByte/s)
上り送信速度: 380kbps(385kbps,48kByte/s)

さて,Ubuntu 8.04 での利用方法ですが,D02NE を使うだけならば特に難しいことはありません。ただし,EMチャージで利用するためには,APNを"rpc.data"に設定する必要があります。このAPNは,初期状態では登録されておらず,ユーティリティソフトから端末に書き込む必要があるみたいです。おそらくATコマンドだけで書き込みできると思うのですが,僕はこの部分だけ付属マニュアル通りにWindows Vistaで設定を行いました。

1. gnome-ppp をインストール

Synaptic パッケージ マネージャもしくは,コマンドラインから次のようにインストールします。
$ sudo aptitude install gnome-ppp

2. カードを挿す

カード自体は挿せば認識します。参考までに dmesg の結果は次のようになっています。噂通り,USBコントローラーの上にUSBモデムが載っているというちょっと変態的な構成。
[10586.077431] pccard: CardBus card inserted into slot 0
[10586.176975] ohci_hcd: 2006 August 04 USB 1.1 'Open' Host Controller (OHCI) Dr
iver
[10586.177046] PCI: Enabling device 0000:06:00.0 (0000 -> 0002)
[10586.177056] ACPI: PCI Interrupt 0000:06:00.0[A] -> GSI 16 (level, low) -> IRQ
 18
[10586.177075] PCI: Setting latency timer of device 0000:06:00.0 to 64
[10586.177081] ohci_hcd 0000:06:00.0: OHCI Host Controller
[10586.177123] ohci_hcd 0000:06:00.0: new USB bus registered, assigned bus numbe
r 7
[10586.177141] ohci_hcd 0000:06:00.0: irq 18, io mem 0xc0000000
[10586.733539] usb usb7: configuration #1 chosen from 1 choice
[10586.734205] hub 7-0:1.0: USB hub found
[10586.734622] hub 7-0:1.0: 1 port detected
[10590.229012] usb 7-1: new full speed USB device using ohci_hcd and address 2
[10590.447178] usb 7-1: configuration #1 chosen from 1 choice
[10590.595858] cdc_acm 7-1:1.0: ttyACM0: USB ACM device
[10590.611456] usbcore: registered new interface driver cdc_acm
[10590.611464] /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

3. gnome-pppを立ち上げる

4. 設定をする

Setupから「Detect」をクリックして,次のようになっているか確認します。
 
Device: /dev/ttyACM0
Type: Analog Modem
Speed: 460800
Phone Line: Tone
Volume: High
Init Stringsを次のように設定します。
 
ATQ0 V1 E1 S0=0 &C1 &D2
イー・モバイルから指定されたユーザ名とパスワードを入力します。Phone number欄には「*99***2#」と入力します。EMチャージの場合は,rpc.dataに接続するために最後が「2#」になるので注意。

5. 接続する

「Connect」ボタンを押すと接続が開始されます。「Disconnect」ボタンで切断されます。「Details」を見ると通信量が見れるので,従量接続の際に参考にするとよいかもしれません。自分の使い方だと10MBなんてあっという間でした。

Google Developer Day サポーターになりました

突然ですが、「Google Developer Day サポーター」になりました。来る6月10日に横浜で日本のデベロッパー向けに「Google Developer Day 2008 Japan」というイベントが開催されます。Googleのエンジニアや我々サポーター11名がそれぞれのセッションに参加して、会場の模様などを紹介します。他のサポーターの方はこちら。

chris4403さんOPMLファイルを用意してくれているので、RSSでまとめて購読したい場合に使うと便利かもしれません。

先日,その打ち合わせのために渋谷のGoogleオフィスに行ってきました。どのセッションの担当になるのかを決めるためです。僕はGoogle App Engineのコードラボが希望だったのですが,やはり人気があってほぼすべての人が希望したため、担当を抽選で決めることになりました。結果は惜しくも抽選に外れてしまいました。でも,第2希望のOpenSocialのコードラボに参加することになりました。今関わっている仕事とも関係があるので,これはこれで良かったかもしれません。

それから,5月28〜29日にサンフランシスコで開催されるGoogle I/Oのチケットももらえることになりました(旅費は自己負担ですが…)。こちらは、プレス関係者として登録してくれるそうで、もしかしたら裏側なんかもレポートできるかもしれません。Guidoの話を生で聞けると思うと今から楽しみです。

追記:
Google Developer Day サポーター 一覧 が公開されました。

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にあがっていました。絶対怖いって!

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)

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


ThinkPad X61でAC電源のみにするとCPUクロック制限がかかる

自宅で ThinkPad を使うときには,いつもACアダプタを繋いでバッテリーを外しています。無駄な充放電を繰り返してると,バッテリーはすぐに劣化してしまうし,それは環境の事を考えてもよろしくない。
ところが,最近あることに気が付いてしまいました。僕の X61 は Core2 Duo 2.2GHz で負荷によってCPUスピードを切り替えるように設定してるんですが,なんと負荷がかかっても 1.2GHz までしか上がらない!このことについて Lenovo のページを見ると次のような説明がありました。

CPU を最大速度で動作させ、消費電力の高い周辺装置 (CardBus カード、USB デバイスなど) を接続している場合、必要な電力が一時的に AC アダプターの容量を超えることがあります。バッテリーを取り付けている場合、一時的な電力のピーク時にバッテリーから電力を供給できます。
ThinkPad コンピューターからバッテリーを取り外すと「Battery Optimized Performance Mode」速度 (低い速度) に切り替わり、ピーク電力の要求を減少させ、ThinkPad コンピューターの電源が切れる原因となる入力電圧の著しい低下を防ぎます。

なるほど,本体付属のACアダプタは 65W のポータブルタイプのもので,これだと一時的に電力が足りなくなる可能性があるそうです。で,ACアダプタを繋いでバッテリを外した際に,この「Battery Optimized Performance Mode」になってしまって 1.2GHz 以上のクロックにならない。Android エミュレータのベンチマーク(安藤恐竜さん作 Kubench)を取った時に遅くておかしいなと思っていたら,このCPU速度制限にひっかかって1.2GHzしか出ていなかったというオチでした。

また,これはまだ未確認情報ですが,別売りの 90W のACアダプタを使えば電力が足りなくなることはないので,CPUのスピード制限は起こらないようです。さて,バッテリーを付けたままにするか90WのACアダプタを購入するか,どっちがいいかなぁ…

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

conky

バッテリー駆動時には使いませんが。

Fedora や CentOS でRPMのアップデート情報をメール通知する

Fedora や CentOS などパッケージ管理に yum を使っているディストリビューションで,アップデートパッケージがあることをメールで通知するには, /etc/yum/yum-updatesd.conf を編集します。
emit_via = dbus はデスクトップ用の設定なので email に変更し, run_interval と updaterefresh を適当な間隔に変更します。

[main]
# how often to check for new updates (in seconds)
run_interval = 86400
# how often to allow checking on request (in seconds)
updaterefresh = 3600

# how to send notifications (valid: dbus, email, syslog)
emit_via = email

デフォルトでは, 通知メールの From: と To: はそれぞれ root になっているので,変更したい場合は次の設定を追加します。

email_to = root@example.com
email_from = yum-updatesd@example.com

設定が完了したら,忘れずにサービスを再起動。

# /sbin/service yum-updatesd reload

設定した宛先に下記のようなメールが送られてくれば成功です。

Subject: yum: 1 Updates Available (on example)
From: yum-updatesd@example.com
To: root@example.com

Hi,
This is the automatic update system on example.
There are 1 package updates available. Please run the system updater.

Packages available for update:
    traceroute.x86_64        3:2.0.10-1.fc8         updates

Thank You,
Your Computer

はずなんだけど,うまく動かない…
yum-updatesd は各所で評判が悪いみたいなので,後でソースを見ることにして, yum-cron をインストールします。

# yum install yum-cron

デフォルトだと勝手にパッケージをアップデートしてしまうので,チェックを行うだけにします。 /etc/sysconfig/yum-cron を編集。

# Don't install, just check (valid: yes|no)
CHECK_ONLY=yes

サービスを自動起動するように設定して完了。

# /sbin/chkconfig yum-cron on
# /sbin/service yum-cron start
夜間 yum 更新の有効化中:                                   [  OK  ]

アップデートパッケージがある場合は, Cron Daemon から送られてくるメールに次のようなメッセージが表示されるようになりました。

/etc/cron.daily/yum.cron:

New updates available for host example

traceroute.x86_64            3:2.0.10-1.fc8         updates

伊豆・修善寺

伊豆・修善寺に行ってきました。本当は,友人たちと天城山に登ろうとしたのですが,生憎の天候により登山は断念して修善寺温泉に立ち寄ることに。5月の修善寺は,新緑がとても綺麗で,朝一のためほぼ貸切の温泉に入って思いっきり癒されてきました。
帰りがけに御殿場から見た富士山もとても綺麗でした。

Tokko foot spa Shuzenji Izu
Fresh green ojizou-sama
Shuzenji Map Mt. Fuji in Japan