2013年9月30日

Google Spreadsheets APIを使ってマスタ管理

久しぶりにまとまった休暇が取れたので、Google Docsのスプレットシートに記述された表データにGoogle Spreadsheets API経由でアクセスしてマスタ管理を行う方法をまとめてみました。

マスタデータの用意

今回は例として、上記のようなマスタデータをGoogle Docs上に用意してあります。
この表は共有設定を行ってURLを伝えれば、関係者が同時に編集する事が可能です。そのURLのパラメータに"key="から始まる数十文字の英数字があるかと思いますが、これがこのドキュメントにアクセスするためのIDになるためメモしておきます。

OAuth 2.0クライアントIDの準備


Google Cloud ConsoleのRegisterd appsメニューより、上記マスタデータにアクセスするためのOAuth 2.0クライアントIDを新規登録します。今回、上記マスタデータへはコンソールプログラム(PHP)からアクセスするため、Platformには"Native"を選択します。登録が成功するとクライアントIDの他にクライアントシークレットやリダイレクトURIなどの情報が表示されます。

コンソールプログラムからのOAuth 2.0認証と実行

以下のコンソールプログラムを用意して実行すると、"authorization_url:"の下にURLが表示されます。これは、このプログラムからマスタデータにアクセスするための許可をユーザに求める画面のURLになります。これをブラウザに貼り付けて、表示された画面で【承認する】を選択すると、”このコードをコピーし、アプリケーションに切り替えて貼り付けてください”というメッセージに下に英数字のコードが表示されますので、それをコンソールに貼り付けてENTERを押すとAPIを経由してマスタデータへアクセス(TSVでデータをエクスポート)が実行されます。

<?php
$client_id = '(クライアントID)';
$client_secret = '(クライアントシークレット)';
$redirect_uri = '(リダイレクトURI)';
$scope = 'https://spreadsheets.google.com/feeds';
$key = '(マスタデータのキー文字列)';
$gid = array(
'od6' => 0, 'od7' => 1, 'od4' => 2, 'od5' => 3, 'oda' => 4, 'odb' => 5, 'od8' => 6, 'od9' => 7, 'ocy' => 8, 'ocz' => 9, 'ocw' => 10,
'ocx' => 11, 'od2' => 12, 'od3' => 13, 'od0' => 14, 'od1' => 15, 'ocq' => 16, 'ocr' => 17, 'oco' => 18, 'ocp' => 19, 'ocu' => 20,
'ocv' => 21, 'ocs' => 22, 'oct' => 23, 'oci' => 24, 'ocj' => 25, 'ocg' => 26, 'och' => 27, 'ocm' => 28, 'ocn' => 29, 'ock' => 30,
'ocl' => 31, 'oe2' => 32, 'oe3' => 33, 'oe0' => 34, 'oe1' => 35, 'oe6' => 36, 'oe7' => 37, 'oe4' => 38, 'oe5' => 39, 'odu' => 40,
'odv' => 41, 'ods' => 42, 'odt' => 43, 'ody' => 44, 'odz' => 45, 'odw' => 46, 'odx' => 47, 'odm' => 48, 'odn' => 49, 'odk' => 50,
'odl' => 51, 'odq' => 52, 'odr' => 53, 'odo' => 54, 'odp' => 55, 'ode' => 56, 'odf' => 57, 'odc' => 58, 'odd' => 59, 'odi' => 60,
'odj' => 61, 'odg' => 62, 'odh' => 63, 'obe' => 64, 'obf' => 65, 'obc' => 66, 'obd' => 67, 'obi' => 68, 'obj' => 69, 'obg' => 70,
'obh' => 71, 'ob6' => 72, 'ob7' => 73, 'ob4' => 74, 'ob5' => 75, 'oba' => 76, 'obb' => 77, 'ob8' => 78, 'ob9' => 79, 'oay' => 80,
'oaz' => 81, 'oaw' => 82, 'oax' => 83, 'ob2' => 84, 'ob3' => 85, 'ob0' => 86, 'ob1' => 87, 'oaq' => 88, 'oar' => 89, 'oao' => 90,
'oap' => 91, 'oau' => 92, 'oav' => 93, 'oas' => 94, 'oat' => 95, 'oca' => 96, 'ocb' => 97, 'oc8' => 98, 'oc9' => 99
);
$auth_url_base = 'https://accounts.google.com/o/oauth2/auth';
$params = http_build_query(array(
'response_type' => 'code',
'client_id' => $client_id,
'redirect_uri' => $redirect_uri,
'scope' => $scope,
));
echo 'authorization url:' . PHP_EOL;
echo $auth_url_base . '?' . $params . PHP_EOL;
echo PHP_EOL;
echo 'authorization_code: ' . PHP_EOL;
$authorization_code = trim(fgets(STDIN));
$token_url = 'https://accounts.google.com/o/oauth2/token';
$params = array(
'client_id' => $client_id,
'client_secret' => $client_secret,
'code' => $authorization_code,
'redirect_uri' => $redirect_uri,
'grant_type' => 'authorization_code',
);
$context = stream_context_create(array(
'http' => array(
'method' => 'POST',
'header' => 'Content-Type: application/x-www-form-urlencoded',
'content' => http_build_query($params)
)
));
$token = json_decode(file_get_contents($token_url, false, $context));
$api_url = 'https://spreadsheets.google.com/feeds/worksheets/' . $key . '/private/full';
$context = stream_context_create(array(
'http' => array(
'method' => 'GET',
'header' => 'Authorization: Bearer ' . $token->access_token,
)
));
$xml = file_get_contents($api_url, false, $context);
$xml = simplexml_load_string($xml);
foreach ($xml->entry as $entry) {
if (strstr($entry->id, $key) !== false) {
$worksheet_id = array_pop(explode('/', $entry->id));
break;
}
}
$api_url = 'https://docs.google.com/feeds/download/spreadsheets/Export?key=' . $key . '&exportFormat=tsv&gid=' . $gid[$worksheet_id];
$context = stream_context_create(array(
'http' => array(
'method' => 'GET',
'header' => 'Authorization: Bearer ' . $token->access_token,
)
));
$data = file_get_contents($api_url, false, $context);
echo $data;

このサンプルだと毎回OAuth認証を手動で行う必要があるため、$tokenの内容をファイルなどに保存しておいて次回以降のアクセスにはrefresh_tokenを使うなど改修を行えば、トークンが有効な間(結構長い)は認証なしでAPIを呼び出すことができるため、$dataをSQL文などに整形すればマスタデータの登録を自動化することも可能です。

参考:

2013年3月3日

Raspberry Piに温度/気圧センサーを取り付ける


去年、”35ドルPC”としてデビューしたRaspberry Piを発売と同時に購入したものの、Linuxを起動させてからはそのまま放置プレイされていたので、何か役目を与えようと温度/気圧センサー(BMP085)を取り付けてみる事にしました。

といってもほとんどnWorld: Raspberry PiにI2Cで気圧センサをつないでみたに書かれている手順をマネただけですが、一般的なUSB型温度センサーより安価(eBayで送料込みで\500弱。但し到着まで3週間近くかかった)に実現できたので、後はこれをGrowthForecastあたりに食わせてグラフ化でもしてみようと思います。

(本当はグラフ化までやりたかったけど、買ってくるケーブル間違えてそこまでやれなかった。。)

# BMP085をRaspberry PiのGPIOに接続
http://learn.adafruit.com/adafruits-raspberry-pi-lesson-4-gpio-setup/the-gpio-connector
- VCCを3.3Vに
- SDAをGPIO 0(SDA)に
- SCLをGPIO 1(SCL)に
- GNDをGND(GPIO 1の上)に

# i2c-bcm2708をコメントアウト
sudo vi /etc/modprobe.d/raspi-blacklist.conf
blacklist spi-bcm2708
#blacklist i2c-bcm2708

# i2c-devを追加
sudo vi /etc/modules
snd-bcm2835
i2c-dev

# 再起動
reboot

# python-smbusをインストール
sudo apt-get install python-smbus

# GPIOに接続されたBMP085を検出
sudo i2cdetect -y 0
     0  1  2  3  4  5  6  7  8  9  a  b  c  d  e  f
00:          -- -- -- -- -- -- -- -- -- -- -- -- --
10: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- --
20: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- --
30: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- --
40: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- --
50: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- --
60: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- --
70: -- -- -- -- -- -- -- 77

# サンプルプログラムをダウンロード
wget https://github.com/adafruit/Adafruit-Raspberry-Pi-Python-Code/archive/master.zip
unzip master.zip
cd Adafruit-Raspberry-Pi-Python-Code-master/Adafruit_BMP085

# 実行
sudo python Adafruit_BMP085_example.py
Temperature: 24.50 C
Pressure:    1015.02 hPa
Altitude:    -14.98

2013年2月18日

Windows Phone 8開発セミナーに行ってきた


今日はお休みを頂いて、品川の日本マイクロソフトさんで行われた「Windows Phone 8 アプリ開発セミナー ~Build 2012 Recap~」にお邪魔してきました。

内容は、二名のエヴァンジェリストの方によるWindows Phone 8の新機能についての講演で、国内ではまだ発売されていないWindows Phone 8の実機デモを交えながら行われました。以下はその内容のメモ書きです。

Windows Phone 8新機能
=======================
* 機能概要
- 新UI/Liveタイル
  - 人間行動に基づいたUI
  - Liveタイル
    - アプリを立ち上げずに最新情報にアクセス
  - Hub
    - その人にまつわる情報を集約(電話番号、Twitterアカウントなど)
  - 現在ストアアプリの数は約13万
    - そのうち日本からアクセスできるアプリは約8万
- 最新のハードウェアに対応
  - マルチコア対応
    - 物理的には64コアまで
  - 解像度
    - WVGA/WXGA/720に対応
    - 今までのアプリはOS側で自動的に調整表示される
  - microSD対応
    - Zuneを介さずエクスプローラから直接アクセスできるように
    - 保存スペースをユーザが設定可能

* Liveタイル
- ほしい情報に素早くアクセス
  - 対応しているアプリの方がDL数が多い
- タイルの種類
  - フリップタイル(7.5から)
    - WP8からは小タイルに対応
  - アイコンタイル(8から)
    - アプリアイコンとカウントを表示
  - サイクルタイル
    - 決められた画像を周期的に表示(カウントも)
    - どの画像で押されたかなどの情報は取得できない

* ロック通知と背景
- ロック画面にアプリからの情報を表示する事ができる
  - 最大5アプリまで
- ロック画面の背景画像をアプリ側から変更できる

* レンズアプリ
- カメラ起動中に対応アプリを起動する事ができる

* Rooms & Kids Corner
- Roomsにメンバーを招待して共同作業
  - メンバーに一斉にメール送信など
  - オーナーがWP8であればメンバーはiPhone/Android端末でもOK
  - 履歴をSkyDriveに保存など
- Kids Corner
  - 子供用ランチャー
  - 親が許諾したアプリのみ起動できる
  - アプリは通常ランチャーから選択
  - Kids Corner内でカスタマイズも可能

* スピーチ機能
- WP8から日本語に対応
- 音声コマンドによるアプリ起動
- 音声認識(Speech To Text)は日本語未対応

* NFC & Bluetooth
- WP8から標準で対応
- タップ&送信でアプリを相手の端末で送る(URL/画像/ファイルも)

* その他
- ストアを経由せずにアプリを公開(企業向け)
- iPhoneのPassbookみたいな機能を提供するウォレット
- アクセシビリティ
  - ハイコントラスト表示
  - 二本の指でダブルタップすると拡大表示
- フォントがYuGothicに統一
- アプリデザインについて公開中
  - http://aka.ms/wpuxprinciples

Windows Phone 8アプリケーション開発
========================================
* アプリケーション開発基盤
- Windows Phone 8 SDKはWindows 8 Proのみ対応
  - エミュレータがHyper-Vを使っているため
    - 仮想環境でWindows Phone 8 OSが動いている
  - 64bitのみ
  - SLATをサポートするCPU
- 7.0/7.1/8.0のアプリは全てWP8で動作可能
  - 7.5と7.8はほぼ同じ7.1カーネル
  - xapを暗号化するようになった
    - それを復号化するには7.5が必要
    - Windowsストア立ち上げの一環
  - 一部非対応アプリもある
    - 怒首領蜂が動作せず、など
- デバイスの解像度
  - アメリカではWP8の方が多い(世界全体ではまだ7.1が多い)
  - 400論理ピクセルを各端末の物理ピクセルに変換
    - 720の場合は80ピクセル分上部に黒枠が表示
  - WP8からWXGAと720に対応
  - WVGA/WXGAは15:9なのに対し720は16:9
  - この比率調整はOS側で自動調整される
  - 但しアプリ側でAuto Scaleにしていないと余白ができる可能性が
  - VSのデバイスタブから各解像度の表示が確認できる
  - 合わせてテーマの切り替えでフォントが同化して見えなくなっていないかチェック
    - 見えなくなっていると審査で落ちる
    - システムカラーを設定して対応する
- VSの7.8アップデートは遅くとも19日までには来る?
  - エミュレータの追加のみ
- 7と8ではエミュレータの動作自体が違う
  - ネットに繋がらない場合はHyper-Vの仮想スイッチマネージャを確認
- アプリケーションバーのコードはC#側に移動
  - Blendで追加もできる
- グリッド画像を使ってデザインを調整する
- WP8から標準で国際化対応できる
  - StaticResourceとデータバインドを使う
  - 最初の開発はXAML直書きで進めた方が効率的
- エミュレータのショートカット
  - F2はWindowsボタン
  - F12は電源ボタン
  - これらを利用してスクリーンショットを撮ることが可能
- Windows Phoneデベロッパーセンター
  - アプリDLはアメリカが4割、ヨーロッパが3割
  - ユーザコメントがTranslateされて一括表示できる
    - アプリを公開するなら多言語対応した方がいい

* Windows Phone 8ランタイム環境
- 今までの.NETに加えてWindows Phone RuntimeとNative環境(Direct 3D/Win32&COM)が追加
- Windows Phone RuntimeはWindows 8 Runtimeと一部互換性あり
  - 今後の拡張は.NETよりこちら側に行われていく?
- Native(C++)ではUIを書く事ができない
  - DLLのみ作ることができる
  - iPhone(Objective-C)のライブラリ移植など
  - そこまでスピード差も無い
- HTML5アプリ
  - WP8のIE10はWindows 8のエンジンを踏襲
  - アプリ画面はIEコンポーネントと戻る/進むリンク(ハードコード済み)があるのみ
  - 表示するコンテンツはアプリパッケージ内に持つ(HTML/CSS/画像など)
  - コンテンツをネットワークから取得するようなアプリは審査に落ちる
    - いわゆる「ガワネイティブ」はWindows Phoneではストア登録できない?

* 新機能詳細
- プッシュ配信
  - WP8から制限がほぼ無しに
  - 配信からVoIPアプリを起動できるように(最大4アプリまで)
    - ただし配信からの通常アプリ起動は不可(セキュリティ上の理由)
- タイル
  - Iconic Tileテンプレート
    - カウント表示は1から99まで
  - タイルの後方互換性の持たせ方
    - Reflectionで判定する
- ロックスクリーン
  - 現在設定されている壁紙はAPIでアプリ側から取得可能
  - 通知情報はタイルの内容を流用
- Extensionタグは末尾に記述する
  - 前の方だとエラーになる
- アプリケーション間連携
  - カスタムスキーマを使った連携
    - Androidのインテントみたいな
    - "skype:call?01234567"でskypeアプリを起動して通話開始
    - SupportFileTypesを入れておくとストアアプリでレコメンドされる
    - ブラウザリンクからアプリ起動も可能
  - リッチメディアアプリ
    - アプリ側で宣言しておくとshare/editより上のメニューに表示されるように
  - Windows Phone 8 Imaging Platform
    - カメラの細かい制御を行いたい場合
  - Auto-Upload Background Agents
    - 写真を自動アップロード(Eye-Fi的な機能?)

* その他の新機能
- レジューム起動
  - 戻るキーでの操作は基本的にアプリ終了で最初から
  - レジューム起動だと終了直前から起動し直す事ができる
    - その際はバックスタックをクリアしてあげた方が良い
- バックグラウンド実行
  - 基本的にアプリは裏に回ると停止する
  - GPSログ取得など継続的に起動し続けたい場合に使う
    - 但し制約がある(4時間操作なければ終了、セキュリティ上カメラ/マイクは操作不可など)
- 近距離通信
  - WP8ではNFC/BluetoothはProximity APIとして抽象化されている
- 音声認識
  - テキストの読み上げは日本語対応
  - 音声からテキストを起こすのは英語のみ
  - 再生された選択肢のうちどれかを話して入力する事ができる
    - 選択肢はコーディングできる
  - アプリ起動音声はVCDファイルを登録
    - キーワード+引数の認識も可能("メモ 2ページ目を開く"など)
- SDカードアクセス
  - ファイル一覧はアプリ側で実装する必要あり
  - 本体側へのアクセスは不可

もろもろ
============
- セミナー後の懇親会で発売済みのWindowsPhone8実機(ほぼ私物!?)を触ることができました
- WindowsPhoneのネクタイを頂きました
- でも会場に傘忘れた。。

2012年7月28日

Raspberry Piで遊んでみた


今日は、6月に注文していたカードサイズPC「Raspberry Pi」が届いたので、とりあえず動かして遊んでみました。

DHLで届いた箱の中にはRaspberry Pi本体とQuick Start Guideの紙が2枚入っているだけのシンプルな構成で、電源供給はスマホなどで使われているmicroUSBを使います。

まず、公式サイトのダウンロードページからOSのイメージファイルとWindows上でSDカードにイメージファイルを書き込むソフトをダウンロードしSDカードの準備を行います。ウチではThinkPadについているSDカードリーダで作業を行いましたが、問題なく書き込み作業を行う事ができました。

後はSDカードをRaspberry Piに差し込み、HDMI/LAN/MicroUSBケーブルを繋げはいきなり起動します。パッと見電源ボタンは無さそうなのでmicroUSBケーブルの抜き差しで行うようです。

最初にインストールしたのはRaspberry Pi向けにDebianを最適化したディストリビューション「Raspbian」で、こちらは起動するとLXDEのデスクトップ環境が起動してGUIでの操作が可能でした。元は”教育用”なだけあってデスクトップにはPythonのIDEを起動するショートカットが設定されていました。またMidoriというブラウザも入っていますが、さすがに動作はもっさりで日本語表示する事はできませんでした(aptitudeでパッケージを入れれば可能)。

次にインストールしたのは、こちらもRaspberry Pi向けにメディアセンターアプリのhttp://xbmc.org/|XBMCの動作に最適化した「Raspbmc」。本当はRaspbian上でXBMCを稼動させようとしたものの、ビルド作業など一手間が必要だったので今回はこちらを利用してみました。期待していたXBMCの動作はこちらももっさりで、Sambaマウントして動画を再生しようとしても画面に表示されませんでした。。

スペック的にはPentium2 300MHzくらい(但しMP4動画再生支援あり)らしいので、凝った事やろうとするとすぐCPUリソースを使い切ってしまいますが、コンソールベースならそれなりに使えそうですしGPIO端子を使えばハードウェアの制御とかもできそうです。そして何よりこれが3000円弱で買えてしまうという事では、これから十分すぎるほど遊べそうな可能性を感じました。

2012年1月29日

PCでスマートフォンサイトを閲覧してみた


最近、iPhoneやAndroidの普及のおかげで主要なサイトではスマートフォン版のページが提供されるようになりました。ほとんどのサイトはUser-Agentヘッダをスマートフォンのそれに変更する事で、PC上でもスマートフォン版のページを閲覧する事ができます。
(ちなみにいわゆるガラケー版のページは、携帯各社のゲートウェイIPアドレスからしか閲覧できないようにされている事がほとんどのため、PC上からは閲覧する事はできません)

ただ、一部のスマートフォン版ページはUser-Agentヘッダを変更しただけでは閲覧ができないようになっているところがあり、ガラケーと違ってIPアドレス制限ができないスマートフォンでどうやって実現しているか気になり、今回はそのカラクリを調査してみました。

■サーバ-ブラウザ間の通信を書き換え
制限をかけているサーバ側でPCかスマートフォンかを判別するためには、接続元IPアドレスを除くとUser-Agentヘッダなどの情報から類推しているものと思われます。であれば、PCブラウザが出力するヘッダ情報をスマートフォンのそれと全く同一にすればPC上で表示ができるはずです。

そのためには、PCブラウザからサーバに送信するヘッダ情報を通信のタイミングで書き換えてやる必要があります。この辺の処理はProxomitronFiddlerなどを使えばいいのですが、今回は勉強も兼ねてRubyのWEBrickでプロキシサーバを実装して行いました。

■WEBrickでプロキシサーバ
とはいってもRuby初心者の自分がイチから作れるはずもないので、WEBrick::HTTPProxyServer で無理矢理リクエストヘッダを書き換えるプロクシサーバ - PARAGRAPHSのソースを拝借させて頂き、手持ちのスマートフォンが出力するヘッダ情報に書き換えるようにしてみました。
(手元のRuby1.9.2環境では、そのままだと通信時に"ERROR undefined method `each_line' for #<array:0x30865bc>"エラーが発生するため、@raw_headerを@raw_header.joinに修正して実行しました)

■閲覧できず。。
ところが、いざ対象のページにアクセスしてみたものの、「お使いの環境では閲覧できません」エラー表示。。ブラウザのデバッガを使って通信ステータスを確認してみましたが、リダイレクトなどの処理は行われていませんでした。となると次に考えられるのはjavascriptによる制御。ただ、PCブラウザならスマートフォンのそれをほとんど実行できるはずですし、とりあえずその処理を行っている箇所を探す事にしてみました。
(試しにjavascriptをOFFにしてアクセスしてみましたが同じ結果でした)

■タッチイベント
javascriptを使って制御を行うのであれば、ブラウザが最初にアクセスした時に取得したHTML上にその処理が記述されているはずなので、プロキシサーバに手を加えて通信結果をファイルに保存するようにして中身を確認してみたところ、なんと下記のような制御を行っていました!

  • javascriptがOFFの場合は、<noscript><meta http-equiv="refresh">タグでエラーページへ転送
  • ontouchstart/ongesturestartなど、タッチ系イベントがdocumentオブジェクトに宣言されているかチェック
  • その他もろもろの機能(端末の回転イベント)やFlash対応有無をチェック
  • 上記条件を満たしていない場合は、document.location.hrefでエラーページへ転送
  • <body>タグ内には正常ページへPOSTするフォームが記述されており、onloadイベントでsubmitするように記述

単純にjavascriptでごにょごにょやっているだけかと思いきや、javascriptをOFFにされた場合やFlash未対応機種の場合などもしっかり考慮されており、予想以上に複雑な事をやっていたのが驚きでした。というわけでカラクリが分かれば後はそれを回避すれば閲覧できるはずですので、今回はHTML中にdocument.location.hrefを見つけたら//(コメント)を挿入して無効化するようにしました。

■閲覧はできたものの
上記処理を加えて再度ページを開いてみたところ、やっとPCブラウザ上で閲覧する事ができました。とはいえ、ページを進めていくとFlashやHTML5の表示で進む事ができなかったりと、都度そういった箇所を回避する処理を記述していく必要がありそうです。本当はRubyの感想などをつらつら書くつもりだったのですが、なんかアングラな内容になってしまいました。。

2011年12月17日

PSVitaのブラウザのベンチマークを取ってみた



本日12月17日は、PSPの後継機「PlayStation Vita」の発売日です。10月に予約した店舗では朝8時からの早朝販売を実施していたので、早速受け取りに行ってきました。

開封の儀やセットアップをほどほどに済ませ、「アンチャーテッド」を早くプレイしたい気持ちを抑えつつ(笑)、ブラウザ周りのベンチマークを取ってみました。
(手書きで書いたので間違っているところがあるかも)

■ブラウザが出力するヘッダ情報
[Accept] => application/xml,application/xhtml+xml,text/html;q=0.9,text/plain;q=0.8,image/png,*/*;q=0.5
[Accept-Encoding] => gzip
[Accept-Language] => ja, en;q=0.5
[Cache-Control] => no-cache
[Connection] => Keep-Alive
[Host] => example.com
[User-Agent] => Mozilla/5.0 (PlayStation Vita 1.00) AppleWebKit/531.22.8 (KHTML, like Gecko) Silk/3.2

SunSpider 0.9.1の実行結果
===========================================
RESULTS (means and 95% confidence intervals)
-------------------------
Total: 40947.1ms +/- 0.0%
-------------------------

3d:                               4588.6ms +/- 0.1%
  cube:                           1318.7ms +/- 0.1%
  morph:                          1731.7ms +/- 0.1%
  raytrace:                       1538.2ms +/- 0.1%

access:                           5623.1ms +/- 0.0%
  binary-trees:                    500.0ms +/- 0.3%
  fannkuch:                       2931.3ms +/- 0.1%
  nbody:                          1268.6ms +/- 0.1%
  nsieve:                          923.2ms +/- 0.1%

bitpos:                           4713.1ms +/- 0.1%
  3bit-bits-in-byte:               823.5ms +/- 0.1%
  bits-in-byte:                   1179.5ms +/- 0.1%
  bitwise-and:                     993.8ms +/- 0.2%
  nsieve-bits:                    1716.3ms +/- 0.1%

controlflow:                       591.8ms +/- 0.1%
  recursive:                       591.8ms +/- 0.1%

crypto:                           2522.6ms +/- 0.1%
  aes:                            1141.7ms +/- 0.2%
  md5:                             696.0ms +/- 0.3%
  sha1:                            684.9ms +/- 0.2%

date:                             3018.4ms +/- 0.1%
  format-tofte:                   1415.1ms +/- 0.2%
  format-xparb:                   1603.3ms +/- 0.1%

math:                             6162.3ms +/- 0.1%
  cordic:                         1495.6ms +/- 0.1%
  partial-sums:                   3689.6ms +/- 0.1%
  spectral-norm:                   977.1ms +/- 0.1%

regexp:                           4643.3ms +/- 0.0%
  dna:                            4643.3ms +/- 0.0%

string:                           9083.9ms +/- 0.2%
  base64:                         1180.9ms +/- 0.1%
  fasta:                          1757.7ms +/- 0.8%
  tagcloud:                       1682.4ms +/- 0.1%
  unpack-code:                    2755.9ms +/- 0.1%
  validate-input:                 1707.0ms +/- 0.1%
===========================================

BrowserMarkの実行結果
スコア:11643(PC版Chrome16:185216)

C5Benchの実行結果
スコア:456(PC版Chrome16:1669)
--------------------
Timer=0.0 ms / 44550.0 fps
clearRect=0.8 ms / 1232.5 fps
drawImage 8bit=5.2 ms / 193.4 fps
drawImage 8bit transparent=6.7 ms / 150.2 fps
drawImage 24bit=5.2 ms / 193.5 fps
drawImage 24bit random=5.2 ms / 193.6 fps
drawImage 24bit alpha=14.5 ms / 68.8 fps
drawImage 24bit single sprite=0.7 ms / 1443.2 fps
drawImageSlice 24bit sprite=0.7 ms / 1478.5 fps
drawImageSlice 24bit sprite+background=6.3 ms / 158.9 fps
drawImageSlice 24bit 8xsprite+background=12.1 ms / 82.5 fps
Timer=10.1 ms / 99.2 fps
clearRect=32.1 ms / 31.1 fps
drawImage 8bit=33.2 ms / 30.1 fps
drawImage 8bit transparent=33.4 ms / 30.0 fps
drawImage 24bit=33.2 ms / 30.1 fps
drawImage 24bit random=33.1 ms / 30.2 fps
drawImage 24bit alpha=37.8 ms / 26.4 fps
drawImage 24bit single sprite=16.8 ms / 59.6 fps
drawImageSlice 24bit sprite=16.7 ms / 59.8 fps
drawImageSlice 24bit sprite+background=33.3 ms / 30.0 fps
drawImageSlice 24bit 8xsprite+background=33.5 ms / 29.9 fps
Score: 456

Acid3 Testの実行結果
99/100


■html5test.com http://html5test.com/ の実行結果
スコア:66 + 0 Bonus(PC版Chrome16:344 + 13 Bonus)
Parsing rules                                1/11
   triggers standards mode     Yes
  HTML5 tokenizer                              No
  HTML5 tree building                          No
  SVG in text/html                             No
  MathML in text/html                          No

Canvas                                         20
  canvas element                              Yes
  2D context                                  Yes
  Text                                        Yes

Video                                        0/31
  video element                                No
  Subtitle support                             No
  Poster image support                         No
  MPEG-4 support                               No
  H.264 support                                No
  Ogg Theora support                           No
  WebM support                                 No

Audio                                        0/31
  audio element                                No
  PCM audio support                            No
  MP3 support                                  No
  AAC support                                  No
  Ogg Vorbis support                           No
  WebM support                                 No

Elements                                     6/28
  Embedding custom non-visible data            No
  New or modified elements
    Section elements                           No
    Grouping content elements                  No
    Text-level semantic elements       Partial ○
    Interactive elements               Partial ○
Global attributes or methods
  hidden attribute                             No
  Dynamic markup insertion                    Yes

Forms                                       11/98
Field types
  input type=search                           Yes
  input type=tel                              Yes
  input type=url                       Partial ○
  input type=email                     Partial ○
  input type=datetime                          No
  input type=date                              No
  input type=month                             No
  input type=week                              No
  input type=time                              No
  input type=datetime-local                    No
  input type=number                    Partial ○
  input type=range                     Partial ○
  input type=color                             No
  input type=checkbox                         Yes
  input type=image                     Partial ○
  textarea                             Partial ○
  select                               Partial ○
  fieldset                             Partial ○
  datalist                                     No
  keygen                               Partial ○
  output                                       No
  progress                                     No
  meter                                        No
Fields
  Field validation                             No
  Association of controls and forms            No
  Other attributes                     Partial ○
  CSS selectors                                No
  Events                               Partial ○
Forms
  Form validation                              No

User interaction                            17/36
Drag and drop
  Attributes                                   No
  Events                                       No
HTML editing
  Editing elements                            Yes
  Editing documents                           Yes
  APIs                                        Yes

History and navigation                        0/5
  Session history                              No

Microdata                                     0/5
  Microdata                                    No

Web applications                             0/20
  Application Cache                            No
  Custom scheme handlers                       No
  Custom content handlers                      No
  Custom search providers                      No

Security                                     0/10
Sandboxed iframe                               No
Seamless iframe                                No

Related specifications
Geolocation                                  0/15
  Geolocation                                  No

WebGL
  3D context                                   No
    Native binary data                         No

Communication                                5/25
  Cross-document messaging                    Yes
  Server-Sent Events                           No
  WebSocket                                    No

Files                                        0/20
  FileReader API                               No
  FileSystem API                               No

Storage                                      0/20
  Session Storage                              No
  Local Storage                                No
  IndexedDB                                    No
  Web SQL Database                             No

Workers                                      0/15
  Web Workers                                  No
  Shared Workers                               No

Local multimedia                             0/20
  Access the webcam                            No

Notifications                                0/10
  Web Notifications                            No

Other                                           6
Text selection                                Yes
Scroll into view                              Yes

・システム情報で「電話番号」「IMEI」「ICCID」が確認できる(3G版のみと思われる)
・知的財産の表記で表示される製品一覧
Access NetFront
asiasoft AsiaFont
FONTFWORKS(日本語フォント/欧文フォントの一部)
MPEGLA(MPEG-4)
iWnn
楽ひら(手書き文字認識エンジン)
QUALCOMM
RSA
Skyhook Wireless
Sony Music Publishing
Fraunhofer IIS and Thomson(MP3)
blist
CyrusSASL
FLANN
FreeBSD
FreeType
giflib
libEtPan!
libjpeg
libtiff
MD5
NetBSD
OpenCV
squish
strlcpy

意外だったのはブラウザエンジンがWebKitだった事で、スマホ対応ページであれば問題なく閲覧できる事が予想されます。ただ、Geolocation APIやWebGLは未対応なので、PSVitaならではのWebアプリケーションを作るには対応を待つ必要がありそうです。後はjavascript周りで前面/背面タッチイベントや傾きセンサーを操作できるかですねー。

2011年11月1日

Google Developer Day 2011に行ってきた


今日はパシフィコ横浜で行われたGoogle社の開発者会議「Google Developer Day 2011」に出席してきました。
後日に全ての講演資料は公開されるかと思いますが、メモ書きをおこしてみました。

■基調講演
現状のGoogle社の各プロダクト別フィーチャーが語られました。特にモバイルについてはIce Cream Sandwichのデモやアプリ内課金など重点を置いて時間を割かれていたのが印象的でした。

- 今回は5000名が応募(そのうち2000名が参加)
- モバイルのプレゼンス
  - モバイルに賭けてきた
- 人々の関係 → 人中心に展開できるか
- セカイフォンのデモ:タブレットを見ながら対話的に翻訳
- キャリア課金を世界で展開
- in-App Billing → アプリ内課金(アイテム課金など)
- Ice Cream Sandwichのデモ
  - 新しいコンタクトリスト:SNSなどの情報を人に結び付けて一元管理
  - Android Beam:NFCを使った端末間での情報共有(デモではWebページを共有)
  - Face Unlock:顔認識によるアンロック
- Chrome
  - 世界で7割、日本で6割のシェア
  - 3D(WebGL)/デバイス/オフライン
  - クラウド側の威力
  - Web Intents/Native Client/DOM
  - forms
    - カラーピッカー
  - Developer Tools
    - ツール中で編集したソースのリビジョン管理
    - 上記ソースの書き戻し(保存)
  - Tokyo Teamでもコア開発している(WebSocketなど)
  - WebAudio APIデモ
    - WebAudio Drum Machine
      - ドラム音をブラウザ上で合成して再生
    - Plink
      - WebSocketで他の人と繋がって作曲を共同作業
- App Engine
  - Prediction API
  - Google Cloud Storage
  - Google Cloud SQLのデモ
- Google+
  - Hangoutsのデモ
- いいサービスを作るには?
  - 何事もエンジニアありき
  - 百聞は一デモに如かず
  - 日本でイケると思ったら世界のみんなも同感あるかも

■App Engine最新情報
勉強不足で拝聴したため後半が理解不足気味…Pythonも学習しないと(汗)

- Java/Python半々くらい
- 手軽、メンテナンスフリー、スケーラブル、高可用性、高セキュリティ
- ローカル上で開発可能 → デプロイ
- App Engineの健康状態を管理するエンジニア
- Enterprise Ready(もうすぐ発表)
- 月に一回リリースを保ちたい
- 各バージョンでの特徴
  - X-AppEngine-Countryヘッダ(アクセスしたユーザの国コード)
  - Proto RPC
  - HRDエミュレーション
  - ログビューアでタイムゾーンが選択可能に
  - スケジューラノブ
    - リクエストの処理方法を設定(インスタンス起動/待ち行列へ追加)
    - Min(Max) Idle Instances/Min(Max) Pending Latency
      - 課金が気になるなら要チェック
  - Task Queueでヘッダ/ボディ(ペイロード)が閲覧可能に
  - Backendsを変更可能に
  - App Identity API
  - Datastore Admin
  - Write Ops → 課金に関係
  - XG Transaction

■クラウド上でイケてるゲームを構築しよう
PlayNゲームライブラリを使ってPC/各種デバイス上で動作するゲームを開発するセッション。PC版のみでスコアが更新されないバグをその場で報告していましたw

■HTML5による最新ウェブアプリ
デスクトップアプリにひけを取らないアプリをブラウザ上で作るための開発方法を紹介。

- ユーザがアプリを使うには理由がある(意味を持っている)
  - リッチビジュアル
  - 既にユーザが知っているUIを使う
  - ユーザが試す前の障壁を無くす(情報入力など)
- History API
  - JavaScriptでページが書き換えられてもParmalinkが表示
- Drag & Drop API/File API
  - OS側とのファイルのやり取り
  - ブラウザ上でコマンドシェルをエミュレートも!
- Notification API
  - 通知バルーン表示
  - 内容はテキスト以外に動画なども可能
- パフォーマンス

■Android成功事例
福島でAndroidを接続したガイガーカウンターの開発を行っているGClueさんと、「なまず速報」というAndroidアプリを開発されているStridge Projectさんの事例紹介。

- GClueさん
  - ガイガーカウンターを作る勉強会を地元で開催
  - 機器との接続はAndroid ADKを使用
  - Internet Of Things
    - 全てをオープンソースにして情報交換
  - ガイガーミュラー管は1万円くらいするらしい
  - こういった知見から将来的には福島の新たな産業に
- Stridge Projectさん
  - 地震速報やサーバ費用は持ち出しの状態
    - マネタイズを考えたいが、サポート体制などで難しい
  - 開発体制は2名
  - アプリプラグインなどで拡張できるように
  - プッシュ通知
    - C2DM → 多数に送ると遅延(そのため現在は独自プロトコル)

■Googleの日常
Googleに入社してからどのような事が行われているか、また社内の開発体制などのご紹介。

- 入社直後
  - 一般的な研修
  - Google独自テクノロジの自習(教材はたくさんアリ)
  - エンジニア研修
  - 最初は小さなタスクから半年かけて一人前に
- 開発の流れ
  - チームの大まかな方向性
  - アイデア出し&目標設定
  - 先行調査
  - ドキュメント
  - 開発
    - チーム間でのやり取り(時には出張も)
    - コードレビュー
  - 評価
  - ローンチ
- 何をやるかはエンジニアが決める(ボトムアップ)
- Face to Faceでコミュニケーションが重要
- 使っているVCSはPerforceとgit
- ドキュメントは日本人同士でも英語で記述
  - コードには書かれていない情報を記述する

■Ignite(LT)
一人5分の持ち時間でプレゼンを行うのは一般的なLTと同じ。但しそれに加えてプレゼン資料が15秒で強制的に切り替わるルールが追加されていました。

■DevQuiz解説
今回のカンファレンス参加条件だったDevQuizの結果と問題の解説。

- 平均点は100.56点(危なかった…)
- 神経衰弱は人気(半分以上の方が参加)
  - AIDLは約1000人
  - Goは約500人(但しトライ&エラー回数が平均11回と多かった)
  - Apps Scriptは約600人
  - 一人ゲームは約800人
- スライドパズル
  - 解法や問題作成の解説…詳しくは公式資料を(難しすぎてお手上げorz)
  - C++/Javaで挑戦された方が多かった
  - Google社内でも満点はいらっしゃらなかったとか!(てか全問解かなかったw)

■その他
- NTTドコモのブースでは11月発売のNexus Prime実機が展示(人多すぎて手に取る事できず…)
- Google TVやChromeBookも展示

この規模のカンファレンス参加は久しぶりでしたが、どれも歯ごたえのあるセッションでとても刺激になりました!それとは裏腹に最新技術に自分自身がまだまだキャッチアップできていない事も分かったので、出来るところからコツコツと日々精進していかねば、と思った一日でした。