dabbrev-expand-multiple による動的略語展開

この週末に tokyo-emacs なんていう勉強会があったんですね。完全にノーチェックでした。もし次回があったら参加したいのですが、あるのかな… (追記:あるみたいです。次回は絶対参加しよう。)

せっかくなので、 Emacs についてなんか書いてみることにします。僕は単語の補完に dabbrev-expand-multiple を愛用しています。動的略語展開の候補を tooltip もしくはインラインで複数表示してくれるものです。単語を途中まで入力して、 M-/ を押すと補完してくれるのですが、ここでさらに / を押すと他の候補一覧がツールチップで表示されます。で、それらの候補は SKK 風に a,s,d,f,g で選択することができます。

こういうのは実際に使ってみないと便利さがなかなか伝わらないのですが、おすすめ。

;; dabbrev-expand-multiple
(require 'dabbrev-expand-multiple)
(global-set-key "\M-/" 'dabbrev-expand-multiple)

;; 補完候補を一度に5つにする
(setq dabbrev-expand-multiple-select-keys '("a" "s" "d" "f" "g"))
;; 複数候補表示に移るキーに / を足す
(add-to-list 'dabbrev-expand-multiple-multi-selection-keys "/")
;; 複数候補表示時に次の候補表示に使用するキーに n を足す
(add-to-list 'dabbrev-expand-multiple-next-keys "n")
;; 複数候補表示時に前の候補表示に使用するキーに p を足す
(add-to-list 'dabbrev-expand-multiple-previous-keys "p")
;; ツールチップを表示する秒数
(setq dabbrev-expand-multiple-tooltip-timeout 2000)
;; 10秒で消えるように設定する
(setq dabbrev-expand-multiple-tooltip-timeout 10)
;; 最初に展開した文字列に highlight をかける.
(setq dabbrev-expand-multiple-highlight-face 'highlight)
;; インライン表示のときに使用するフェイス.
(setq dabbrev-expand-multiple-inline-show-face 'underline)
;; インライン表示の見た目の変更 (アンダーラインをなしにする)
(setq dabbrev-expand-multiple-inline-show-face nil)

関連リンク:
» anything.el が手放せなくなった
» emacs-snapshot-gtk

WaterMark System Information

最近はだいぶ暑くなってきて、PCの温度が気になるようになりました。そんな人には、 WaterMark System Information がお勧めです。CPU負荷の他に、メモリ使用量、CPU温度、ファン回転数、HDD温度などをまとめて監視できます。

Android 勉強会 第4回に参加してきました

6月16日に秋葉原ダイビルで開催された「Android勉強会 第4回」に参加してきました。定員を大きく超える応募があったそうで、抽選に当選して何とか参加することができました。副都心線の影響(?)で少し遅れて会場に到着したため、既に席はほとんど埋まっていて100人くらいはいたんじゃないかと思います。

Google I/O, Developer Day ともに参加したのですが、 Android のセッションにはほとんど出なかったので、安藤恐竜さんのプレゼンはかなり参考になりました。それから、やはり動いている実機でプレゼンというのはインパクトがありますね。懇親会にも参加させてもらったのですが、いろいろなメーカーやゲーム業界の人などもいて楽しかったです。Android については、単に携帯電話のプラットフォームと捉えていると判断を誤りそうな感じがします。

ブリリアントサービス 近藤さん

  • Armadilloの実機でAndroidを動かして、自作アプリケーションでプレゼン!
  • Androidデバイスが巷に溢れるはず
  • 一年後がどうなっているかは想像が付かない(いい意味で)
  • メモリ64MBでは厳しいのではないか?
  • サウンドは? - 鳴ります。PCM 48kHz,ALSA
  • 3Dアクセラレーション対応ボードを買えばもっと性能が出るかも

日立ソフトさん

  • モバイルこそセキュリティが重要 → SELinux
  • 実際にlibpngの脆弱性があった
  • カーネルの対応、ユーザランドの移植、セキュリティポリシーの準備が必要
  • 組み込み用でも数万ルールの設定が必要
  • カーネルのチューニングをして、500kbyte以内に抑えている
  • SELinux Policy Editorオープンソースで公開している
  • Android on Zaurus SL-C3200
  • privateとbusinessのセキュリティ権限設定の確認

安藤恐竜さん

  • Binder:
    shared memory方式によるパフォーマンス改善
    プロセス単位のスレッドプール
  • Power Management:
    バッテリーが最大のボトルネック
    Linux PMの上に拡張
    FULL_WAKE_LOCK(cpu,lcd),PARTIAL_WAKE_LOCK(cpu)
  • Bionic:
    カスタマイズされたlibc、組み込み用に最適化
    BSDライセンス(GPLの混入を嫌がった?)
    pthread, setprop/getprop
    POSIX完全準拠ではない
    glibc互換ではない
  • HAL:
    上位層をハードウェアから分離
    pmap
  • Dalvik:
    200-500MhzのCPU
    RAM 64MB ROM 64MB
    バッテリー
  • Dexファイルの構造:
    データをタイプごとに整理
    データにidを付けてポインタのみ上部に格納
    ファイルサイズをjarの半分以下に
  • Zygote:
    ダーティーでシェアードメモリ
    クラスをプリロードし初期化
  • Dalvikはレジスタマシン、通常のJava VMはスタックマシン
  • Androidアプリを開発する上での心得:
    賢くループ
    先にlimitを計算しておく
    CPUとメモリはボトルネックではない、バッテリーがボトルネック
    バッテリーにムーアの法則は成り立たない

IIIMECF + ATOK X3 を Emacs の日本語入力に使う

僕は、emacs-snapshot-gtk をメインのエディタとして使っています。そのままでも日本語入力はできるのですが、入力時のフォントがどうしても気に入らないので、 Emacs では IIIMECF を使って、IIIMサーバと直接通信するようにしています。

インストール方法

IIIMECF-0.75.tar.gz (2007/1/10)
$ tar zxvf IIIMECF-0.75.tar.gz
$ cd iiimecf
$ emacs -q --no-site-file -batch -l iiimcf-comp.el
# mkdir /usr/share/emacs/site-lisp/IIIMECF
# cp lisp/* /usr/share/emacs/site-lisp/IIIMECF

.emacs の設定

UNIXソケットのデフォルトは、 /tmp/.iiim-username/:1.0 のようですが、自分の場合は :0.0 だったので次のように設定しています。これで Shift+space で IIIMECF 経由で ATOK が利用可能です。

;; iiimecf
(setq iiimcf-server-control-hostlist (list
          (concat "/tmp/.iiim-" (user-login-name) "/:0.0")))
(setq iiimcf-server-control-default-language "ja")
(setq iiimcf-server-control-default-input-method "atokx3")
(setq default-input-method 'iiim-server-control)
(require 'iiimcf-sc)
(global-set-key [?\S-\ ] 'toggle-input-method)

GNOMEランチャの設定

emacs 起動時の環境変数に XMODIFIERS="@im=none" を渡すようにします。GNOMEのランチャから起動する場合は、次のように設定すればOKです。

env XMODIFIERS="@im=none" emacs-snapshot-gtk

ATOK X3 を Ubuntu Hardy(x86_64)にインストール

ATOK X3 for Linux

一ヶ月くらい前ですが、 ATOK X3 for Linux を購入しました。前の MacBook の時も ATOK を使っていたので、Anthy だと若干ストレスが溜まるのです。昔の Canna とかに比べたら、Anthyは遙かに良くできていると思うのですが、一度 ATOK を使ってしまうと他のIMEが使えなくなってしまいます。というわけで、AAA優待版のダウンロード販売が安かったので、これを購入して ThinkPad にインストールしました。ThinkPad の Ubuntu Hardy は i386 版なので、下記のジャストシステムのページにある通りにインストールすればOKでした。

» [サポートFAQ]Ubuntu 8.04 LTSでのインストール方法

そして今回、Intel Xeon のデスクトップにも ATOK をインストールをしたのですが、こちらは x86_64 環境だったのでかなり面倒でした。Red Hat/Fedora 用には x86_64 のRPMがあるのに、なぜか deb パッケージはないので、手動でインストールしなければなりませんでした。一応ジャストシステムに64ビット版もお願いしますとメールしておいたので、次回のアップデートモジュールから対応してくれると嬉しいのですが。さて、こういうのはメモっておかないと完全に忘れるので、次回インストールのために記録を残しておきます。

1. ATOK本体のインストール

setupatok_tar.sh を使ってインストールします。

$ tar xzvf atokx3.tar.gz
$ cd ATOKX3
$ sudo -s
# export LANG=C
# touch /etc/gtk-2.0/gtk.immodules
# bash ./setupatok_tar.sh
This software is furnished under an end user agreement and may be used
or copied only in accordance with the terms of such license.
If you accept the terms of the license agreement,Please select "Yes".
If you do not accept the terms of the license agreement,Please select "No".
? (yes/no)yes
Input path of gtk-query-immodules-2.0 for 64bit application:
/usr/bin/gtk-query-immodules-2.0
Input path of gtk.immodules for 64bit application:
/etc/gtk-2.0/gtk.immodules
…
"/etc/gtk-2.0/gtk.immodules" will be changed.
"/etc/gtk-2.0/gtk.immodules" will be changed.
tar xfz /home/hide/Download/ATOKX3/bin/tarball/ATOK/atokx-20.0-1.0.0.i386.tar.gz
tar xfz /home/hide/Download/ATOKX3/bin/tarball/ATOK/atokx-64-20.0-1.0.0.x86_64.tar.gz
Installation has been completed.

2. 32bitライブラリのインストール

残念ながらいくつかのライブラリが足りなくて起動できないので、手動でインストールします。

# cd bin/tarball/IIIMF
# tar xzvf iiimf-client-lib-trunk_r3104-js1.i386.tar.gz
# tar xzvf iiimf-protocol-lib-trunk_r3104-js1.i386.tar.gz
# mv ./usr/lib/* /usr/lib32/

3. libwrap0 インストール

libwrap0 の32ビット・ライブラリが必要なのでインストールします。(参考:Won't Fix - my life won't fix: ATOK X3 for Linuxを買った

# wget http://ftp.ussg.iu.edu/linux/ubuntu/pool/main/t/tcp-wrappers/libwrap0_7.6.dbs-14_i386.deb
# dpkg --fsys-tarfile libwrap0_7.6.dbs-14_i386.deb | tar xf -
# mv ./lib/libwrap.so.0* /usr/lib32/
# /sbin/ldconfig

4. アップデートモジュールの適用

あらかじめ ATOK X3 for Linux アップデートモジュール をダウンロードしておきます。

# tar xzvf atokx3up1.tar.gz
# cd atokx3up1/bin/ATOK/
# tar xzvf atokxup-20.0-2.0.0.i386.tar.gz -C /
# cd ../IIIMF/
# tar xzvf iiimf-server-trunk_r3104-js2.i386.tar.gz --exclude='./usr/lib' -C /
# tar xzvf iiimf-server-trunk_r3104-js2.i386.tar.gz ./usr/lib
# mv ./usr/lib/* /usr/lib32/

5. 起動設定

# sudo bash /opt/atokx3/sample/setting_debian4.sh

以上で一度ログアウトして、ログインし直すと ATOK が使えるようになっているはずです。
こんな感じで日本語の間違いも教えてくれます。

このままでも充分ですが、少しだけ自分用にカスタマイズします。

Shift+space で入力モードを切り替え

デフォルトの Ctrl+space はEmacs の範囲選択とかぶってしまって問題なので、/etc/iiim/js_triggerkeys.conf を編集します。

Shift+space yes

ウィンドウ下に表示される[ATOK]を非表示にする

IIIMF ステータス非表示ツール をダウンロードして、/opt/atokx3/bin/ に展開します。そして、/etc/X11/xinit/xinput.d/iiimf の最後に以下を追加します。
/opt/atokx3/bin/iiimf_status_hide

関連リンク:
» FAQ検索-トップ[ATOK X3 for Linux(サポートFAQ)] - ジャストシステム

Google Developer Day 2008 - 「OpenSocial」コードラボ

Google Developer Day の午後はオープンソーシャル・コードラボに参加しました。コードラボとは何かというと、何人ずつかのチームに分かれてテーマを決めて開発をするものです。あるいはHackathonといったほうが分かりやすいかもしれませんが、Google社内でもこのような形式で定期的に行われているそうです。今回は事前申し込みが必要だったのですが、だいたい30名くらいの方が参加していました。

まずはじめに、Chris Schalk氏から OpenSocial についての概要説明がありました。今思うと、なかなか直接質問できるチャンスはないので、ここでいろいろ細かいことを聞いておけばよかったと後悔しています。

Tender Surrender のえーじさんと二人でチームを組んで、MyBlogLog のような「あしあと+ともだちリコメンド」アプリを作ることになりました。えーじさんがガジェットを作って、僕がサーバサイドをGoogle App Engineで作るという役割分担。

ちょうどこの一週間前に OpenSocial 0.8 の仕様が公開されたのですが、現時点で実装しているコンテナはなく、0.7ベースで進めていくことになりました。最初は Orkut の Sandbox を使って開発していたのですが、どうもキャッシュし過ぎ問題(サーバ負荷を減らすために積極的にXMLをキャッシュしている)に悩まされて途中から Partuza! という Chris Chabot さんが公開されているオープンソーシャル・エンジンを利用しました。

OpenSocial Code Lab  OpenSocial Code Lab

そして、最期に各チームの成果発表会が行われました。結局、いろいろと想定外のトラブルが発生して2時間の時間内に完成させることはできませんでした。やはり事前準備が重要という感じがしました。くりすさん達の友達にタグ付けをするアプリとか、 aodag さんのフィードを集約するものとか、ユーザのプロフィール情報からカバラ占いをするというアプリの完成度が高かったです。

今回かなり楽しかったので、機会があったらぜひまた参加したいです。現時点で、 OpenSocial は日本では今ひとつ盛り上がりに欠ける感がありますが、サンフランシスコでの Google I/O ではかなりの注目を集めていました。これからのインターネットを考える上で一つのキーになる技術だと思いますので、今後も引き続きウォッチして行きたいと思います。


関連リンク:
» Google Developer Day 2008 Japan レポート (でぃべろっぱーず・さいど)
» CEO Blog » Blog Archive » Google Developer Day 2008 Android Hack-a-Thon
» "電脳網潜水" ("ネットダイブ" NetDive): Android のハッカーソン
» Google App Engine コード ラボ (Hackathon)レポート - IT+

谷中の猫

僕は基本的に犬派なんですけど、こいつには心を奪われてしまいました。
顔もハンサムだけど、前足がたまらん。

Cat in Yanaka, Tokyo
 
handsome guy

OAuth Consumer Request の処理フローと実装

OpenSocial の RESTful API では、OAuth を利用して権限の確認を行います。ただし、コンシューマが完全にユーザに成り代わって処理をするため、コンシューマとプロバイダ二者間の信任フロー(2-legged OAuth)になります。この方法については、まだドラフト段階ですが次の文書に記されています。

» OAuth Consumer Request 1.0 Draft 1

処理フローを以下に説明します。コンシューマは次のパラメータをプロバイダに送信することになります。

oauth_consumer_keyコンシューマキー
oauth_signature_methodHMAC-SHA1
oauth_signatureシグニチャ
oauth_timestampUNIXタイムスタンプ
oauth_nonceランダムな文字列
oauth_version1.0 (オプション)

ここで、 oauth_signature は以下のようにして生成されます。まず、ベース文字列を生成するために次の値を用意します。

  1. GET
  2. http://provider.example.net/profile
  3. oauth_consumer_key=dpf43f3p2l4k3l03&oauth_nonce=kllo9940pd9333jh&oauth_signature_method=HMAC-SHA1&oauth_timestamp=1191242096&oauth_version=1.0

これらをURIエスケープした後に & で連結して、ベース文字列を生成します。

GET&http%3A%2F%2Fprovider.example.net%2Fprofile&oauth_consumer_key%3D
dpf43f3p2l4k3l03%26oauth_nonce%3Dkllo9940pd9333jh%26oauth_signature_method
%3DHMAC-SHA1%26oauth_timestamp%3D1191242096%26oauth_version%3D1.0

そして、このベース文字列を HMAC-SHA1 によってダイジェスト値を生成し、BASE64 でエンコードすることによってシグニチャが生成されます。この際、利用する共有キーは cosumer_secret と 空のToken Secret を & で連結したものになります。例えば、 consumer_secret が kd94hf93k423kf44 なら kd94hf93k423kf44& になります(Token Secretは空のため)。こうして、ダイジェスト値は以下のようになります。

SGtGiOrgTGF5Dd4RUMguopweOSU=

こうして生成されたパラメータをリクエスト時の Authorization ヘッダに付加します。プロバイダ側でも同様にダイジェスト値を生成し、シグニチャが合っていればプロバイダが持つリソースへのアクセスを許可します。また、タイムスタンプが5分以上前の場合にはエラーとすることで、リクエストURLが漏れた場合でもセキュリティを確保しています。

Authorization: OAuth realm="http://provider.example.net/",
               oauth_consumer_key="dpf43f3p2l4k3l03",
               oauth_signature_method="HMAC-SHA1",
               oauth_signature="SGtGiOrgTGF5Dd4RUMguopweOSU%3D",
               oauth_timestamp="1191242096",
               oauth_nonce="kllo9940pd9333jh",
               oauth_version="1.0"

さて、以上の処理を Django で実装してみました。コンシューマ側は、普通のPythonスクリプトですので、コンソールから実行することができます。

プロバイダ側

import oauth
from django.shortcuts import *

class MockOAuthDataStore(oauth.OAuthDataStore):
    def __init__(self):
        self.consumer = oauth.OAuthConsumer('key', 'secret')
        self.nonce = 'nonce'

    def lookup_consumer(self, key):
        if key == self.consumer.key:
            return self.consumer
        return None

    def lookup_nonce(self, oauth_consumer, oauth_token, nonce):
        return None

def auth_test(req):
    os = oauth.OAuthServer(MockOAuthDataStore())
    os.add_signature_method(oauth.OAuthSignatureMethod_HMAC_SHA1())

    # build from request
    base_url = req.is_secure() and 'https://' or 'http://' + req.get_host()
    try:
        os.oauth_request = oauth.OAuthRequest.from_request(
            req.method,
            base_url + req.path,
            headers={'Authorization': req.META.get('HTTP_AUTHORIZATION')},
        )

        consumer, token, params = os.verify_request(os.oauth_request)
    except oauth.OAuthError, err:
        return HttpResponse(err.message, status=401)

    return HttpResponse('OK!')

コンシューマ側

import oauth
import urllib2

CONSUMER_KEY = 'key'
CONSUMER_SECRET = 'secret'

def oauth_request(method, url, parameters=None):
    consumer = oauth.OAuthConsumer(CONSUMER_KEY, CONSUMER_SECRET)
    signature_method_hmac_sha1 = oauth.OAuthSignatureMethod_HMAC_SHA1()

    # access protected resources
    oauth_request = oauth.OAuthRequest.from_consumer_and_token(
	                consumer,
			token=None,
			http_method=method,

			http_url=url,
			parameters=parameters)
    oauth_request.sign_request(signature_method_hmac_sha1, consumer, '')

    headers = oauth_request.to_header()
    
    r = urllib2.Request(url, headers=headers)

    try:
        print urllib2.urlopen(r).read()
    except urllib2.HTTPError, e:
        print e

if __name__ == '__main__':
  oauth_request('GET', 'http://localhost:8080/auth_test/')

Leah Culverさんが書いたOAuthライブラリを利用しているのですが、空の Token だとエラーになるので、一箇所だけソースに手を加えています。

--- oauth.py.org   2008-06-14 11:52:33.000000000 +0900
+++ oauth.py       2008-06-14 12:01:44.000000000 +0900
@@ -311,7 +311,10 @@
         version = self._get_version(oauth_request)
         consumer = self._get_consumer(oauth_request)
         # get the access token
-        token = self._get_token(oauth_request, 'access')
+        try:
+            token = self._get_token(oauth_request, 'access')
+        except:
+            token = ''
         self._check_signature(oauth_request, consumer, token)
         parameters = oauth_request.get_nonoauth_parameters()
         return consumer, token, parameters

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系以外の人とも話をするとてもいい機会になりました。お話しさせていただいた皆さん、どうもありがとうございました。

アルカトラズ島

サンフランシスコ湾に浮かぶアルカトラズ島(Google Maps)は別名「ザ・ロック」と呼ばれ,連邦刑務所があったことで有名。アル・カポネも服役していた。脱獄不可能といわれていたが,1962年に通気口を使った脱獄が敢行され,この刑務所は翌年にロバート・ケネディの命令で閉鎖された。この脱獄劇は,クリント・イーストウッド主演の「アルカトラズからの脱出」という映画になっている。インディアンによって占領されていた時期もあって,壁にはその名残のメッセージも見ることができる。

prison  Al Capone  ceiling  ceiling  Administration building  Indian's message  Alcatraz  Escape from Alcatraz

アルカトラズ島へは船で行く必要があるのですが,けっこう人気らしいので前もって公式サイトで予約して行った方がいいです。本当は9:30出航の船を予約していたのですが,9:00のに乗せてもらえました。アルカトラズ島ツアーなるものもあるようですが,もともと無料で日本語の音声ガイド機を借りられるので,手数料を取られるだけ損かと。
この音声ガイドは,服役囚や看守が登場したり,ストーリー仕立てになっていてかなり楽しいです。よくある再現ドラマののりで,声優さんがアル・カポネとかになりきって説明してくれます。

Google I/O 翌日

Google I/O の翌日は,あんどうさん佐々木さんと一緒にある場所へと向かいました。レンタカーを借りて,初めてアメリカで運転しました。カリフォルニア州では,国際免許証が無くても日本の免許証で運転できるそうです。右側通行は30分くらいあれば慣れる,と誰かが言っていたけど,全然慣れませんでした。無事に帰って来れて良かった…

Wi-Fi at Mountain view GPS Navigation  Freeway Exit 

どこに行ったかについては,ブログに書いてはいけないことになっているので,ご想像にお任せします。

関連リンク:
TIME: Life in the Googleplex Photo Essay

Google I/O 第2日目

Google I/O の第2日目は,特に集合したりはせず,一人で会場に行って朝食を取りました。下の写真のようなビュッフェ形式の朝食でなかなか美味しかったです。

Google I/O Lobby  Breakfast

ここで,たまたま隣に座った人と話をしたのですが,彼はサンフランシスコのエンジニアで,これから OpenSocial 関連のプロジェクトを立ち上げたいと言っていました。また,JavaScript に関して,僕は jQuery がお気に入りだという話をしたのですが,彼は jQuery を知らないようで,「何だそれ。何がいいんだ?僕はDojoを使っているよ。」と言っていました。jQuery のすばらしい点を説明しておいたんだけど,うまく伝わったかなぁ…
他に何人かと話した感じでは,日本ではあまり話題に上らない OpenSocial の動向について,こちらでは多くの人が注目しているようです。それと LinkedIn の評価が高いようで,彼らはスマートだと口々に言っていました。

Marissa Mayer
Keynote from Marissa Mayer at Google I/O 2008
Photo by jwowens

この日のキーノートは,副社長の Marissa Mayer さんでした。とても美しい女性で鵜飼さんによると,新しいプロダクトは必ずこの人の承認を受けなければならないとか。彼女については,a2cさんがブログにまとめているので参考にしてください。全く持って同感です!「マリッサは大変なものを盗んでいきました」 後から聞いたら,自分と同い年だそうで,軽くショックを受けました。

少しだけ僕が分かった範囲で補足しておくと,Google Products の UI について語っていました。"Split A/B Testing"の手法を使って,ユーザごとに微妙に異なるデザインのページを表示して変化を調べているそうです。サンプルとして挙げていた検索結果ページのデザインの場合だと,微妙にロゴの周りのスペースが違うだけなのですが,このレベルでテストを行っているようです。また,検索トップページを作ったのはセルゲイ・ブリンで,彼に聞いたら "We didn't have a Webmaster, and I don't do HTML." (参考)と答えたそうです。会場は爆笑。

Even Faster Web Sites by Steve Souders

Steve Souders

キーノートの後は,『ハイパフォーマンスWebサイト』の著者で,YSlow を作った Steve Souders のセッションを聞きました。なるほど,この人,Yahoo! から Google に転職してたんですね。会場に対する「みんな YSlow を使っているかい?」との問いかけに,20%くらいの人しか手をあげていなかったのが意外でした。 YSlow は全人類が使うべきだと思います。

内容については,箇条書きで申し訳ないですが,次のような感じでした。 Facebook を名指しでパフォーマンスが悪いサイトの例に出していたのに驚きました。さすがアメリカ。

  • iGoogle ではほとんどページのレンダリングに時間がかかっている
  • empty cache と prime cache の違いを知る
  • Google と LiveSearch は 0% になる
  • 80-90% はフロントエンドにかかっている
  • Facebook はほとんどスクリプトの読み込み。ひどい
  • JavaScript のブロックを回避することが重要
  • cuzillion ← Webページ構造によるパフォーマンス・テストツール。これ面白い!
  • スクリプトはレンダリングに必要なものとそれ以外を分けるべき
  • MSN はスクリプトを動的に挿入してパラレル読み込みを実現している
  • evalよりscript挿入の方がいいよ
  • <script defer> IE only, different domain
  • document.write only IE パラレル
  • パフォーマンス測定には IBM Page Detaierを使っていた
  • 実行順序とインジケーターで切り分けを行う
  • don't scatter inline scripts

OpenSocial

OpenSocial に関するセッションも slide.com の人のプレゼンなどいくつか聞いたのですが,残念ながら,あまりピンと来るものはありませんでした。一応,こちらもメモ程度のものをあげておきます。以前からブログを読ませて頂いていたえーじさんと,こちらで初めて会うことができた(Twitterのおかげ)のですが,やっぱり目新しい情報はあまり無かったと言っていました。OpenSocial に対する日本とは違った盛り上がり方を肌で感じることができたのが一番の収穫かなと思います。

  • lane liabraaten's opensocial - appengine
  • save users from re-registration hell
  • ユーザは,どのSNSにするか選ぶ必要がない
  • 適用範囲はSNSだけじゃないよ
    • profiles,homepage
    • personal dashbords
    • site based social object
    • corporate CRM systems
    • aay web site
  • profile pages - owner,
    home pages - owner is viewer (must be logged in)
    のパターンで表現できる
  • viewer friends are your firend to visit the web site
  • 言語には依存しない Pythonも歓迎
  • socialsite by SUN (powered by shindig)
  • Orkut, Myspace, hi5, Netlog open to 200M useres now
  • container to containerの通信はRESTful APIで実現可能になる

発表の中にFacebookの話題が全く出てこなくて,質問タイムに誰かが「Facebook?」と質問していたのですが,スピーカーの人の答えは「Next questions.」のみ。これには会場の皆も苦笑い。後から少し補足はしていましたが。
Plaxo の Joseph Smarr 氏のプレゼンは,別のを聞きに行っていて見逃しました。えーじさんによると,これは面白かったそう。残念ですが,a2cさんのブログに YouTube とスライドのリンクがあるので,後で見ようと思います。

# MySQL のことをみんな「マイシーケル」って呼んでいた。