2014年9月15日

ConoHaオブジェクトストレージを使ってみた

今月上旬にVPSサービスのConoHaで、オブジェクトストレージのモニターを募集していたので応募してみたところ、当選の通知が来ておりました。

というわけで、まずは技術ブログの手順に従ってAPIユーザを作成し、別途ソフトウェアのインストールを伴わないcurlコマンドで触ってみました。
(さくらのBASE Storageと同様にs3cmdで、と説明も見ずにインストールしてたら、OpenStackのswiftというオブジェクトストレージを使っているというのを知ってcurlコマンドを使ったという。。)
APIユーザの作成が完了すると、テナントID/テナント名/ユーザ名/API Auth URL/オブジェクトストレージエンドポイントが発行されます。

トークンを取得

curlコマンドでオブジェクトストレージを操作するためには、前述のAPIユーザ情報を使ってトークンを取得する必要があります。
curl -i -X POST 'https://*****-*****.*****.jp/v2.0/tokens' \
  -H "Content-Type: application/json" \
  -H "Accept: application/json" \
  -d '{"auth":{"tenantName":"1234567","passwordCredentials":{"username":"1234567","password":"*******"}}}'
実行すると{"access":{"token":...から始まるJSONが返却されますが、この中の"token"オブジェクトに含まれる"id"がトークンになります。以後のAPI呼び出しは"X-Auth-Token"ヘッダにトークンをつけて呼び出す形になります。

コンテナの作成

オブジェクトをストレージに格納するためには、まず「コンテナ」を作成する必要があります。コンテナはAmazon S3でいうところのBucketになる概念かと思われますが、特に全サーバで共通の名前でないといけないような感じではありませんでした("hoge"とかでも作れた)。また、ConoHa独自の機能として、コンテナの中にフォルダを作成する事ができるようです。
curl -i -X PUT https://*****-*****.*****.jp/v1/3134..cdef/hoge \
  -H "X-Auth-Token: 0123..abcd"

オブジェクトのアップロード

コンテナを作成したらそこに対してオブジェクトをアップロードします。
基本的にはコンテナの作成で使用したエンドポイントの末尾にファイル名を指定し、curlコマンドの-Tオプションでアップロードするファイル名のパスを指定する事でアップロードができました。
curl -i -X PUT https://*****-*****.*****.jp/v1/3134..cdef/hoge/image.jpg \
  -T /Users/test/image.jpg \
  -H "X-Auth-Token: 0123..abcd"

オブジェクトのダウンロード

オブジェクトのダウンロードは、アップロードのPUTメソッドをGETメソッドに変えるだけです。
curl -i -X GET https://*****-*****.*****.jp/v1/3134..cdef/hoge/image.jpg -O \
  -H "X-Auth-Token: 0123..abcd"

オブジェクトのコピー

ちょっと珍しいと思ったのがオブジェクトのコピーで、COPYメソッドを指定してコピー先をDestinationヘッダで指定する方式を取ってました。「HTTPにコピーメソッドって定義されてたっけ?」と調べたら、WebDAV関連で定義されているようです。
curl -i -X COPY https://*****-*****.*****.jp/v1/3134..cdef/hoge/image.jpg \
  -H "Destination: hoge/image2.jpg" \
  -H "X-Auth-Token: 0123..abcd"

オブジェクトの削除

DELETEメソッドを指定する事でオブジェクトの削除となります。レスポンスヘッダが"204 No Content"と返ってくると削除成功となります。コンテナの削除も同様の手順で実行できますが、コンテナ下にオブジェクトがあると"409 Conflict"が返ってきて削除できませんでした。

感想など

以前試してみたさくらのBASE Storageと違ってAmazon S3互換が無いのはどうかなーと思っていたのですが、API自体はシンプルなので利用の障害にはならなそうな印象でした。しかもこちらの方は容量による課金でAPIコール数や転送量に対しては課金されないことから、用途によってはAmazon S3よりメリットがありそうです。

2014年9月6日

MQTT Meetup Tokyoに参加してきました

今日は仕事をちょっと早く切り上げて、株式会社ドワンゴさんで行われた「MQTT Meetup Tokyo」に参加してきました。実は先週同じイベントがあったのですが、そちらは人気があって急遽同じ会を行う事になったそうです。

今回は、ツキノワ株式会社の若山氏(@r_rudi)と、株式会社時雨堂の@voluntas氏の講演が行われました。

MQTTの機能概要 〜新仕様の紹介も少し〜


MQTT meetup in Tokyo 機能概要 from r_rudi

MQTTの特徴を、できたてホヤホヤのMQTTクライアントを使ったデモを交えてご紹介。特にWill/Retain/CleanSessionのデモは、「確かに遺言だー」「CleanSession復帰した瞬間送られてきたー」というのが分かりやすくてよかったです。

休憩の際にどら焼きを頂きました。

MQTTブローカーAKANEの実装にあたってつらかった話


時雨堂 MQTT ブローカー (AKANE)

先月末にサービスインしたばかりのMQTT as a ServiceのSangoで、Erlang製MQTTブローカーAKANEを実装するにあたって、仕様周りやそれに素直に従った際のつらみなどを面白おかしく聞かせて頂きました。

メモ


  • 固定ヘッダは2バイトだけど、ペイロードが大きければHTTPと変わらない
    • MQTTではクライアントが万単位で接続される世界を想像する
    • ペイロードにはJSONやMessagePackを積む事が多い
  • (PublisherがSubscriberにもなれる事から)Microservice的プロセス間通信に使えそう
    • TopicにUUIDを指定してPub/Subすれば一対一の通信ができる
  • NATを超えて双方向通信できる
  • Topicは#や+を使って特定の階層や合致するもの全てを対象とする事ができる
    • SNMPのMIBみたいな感じ?
  • 最新のMQTT仕様が今月27日に確定する予定
    • Topic名がUTF-8固定に
  • 商用MQTTブローカーは世の中に2製品しかない
  • Will/Retain/CleanSessionのクライアント側負担が小さい分サーバ側は負担が大きい
    • QoSダウングレード
    • リトライとRetain
      • これら全てQoSダウングレード&リトライ&Retaionの面倒見る必要あり
    • $SYS Topicの統計情報管理
  • github.comはWebhookで既にMQTT対応済み(!)
    • Facebookメッセンジャーの通信もMQTTらしい
  • Erlangはメッセージパッシングすると性能劣化する
  • 同期通信をやりたいならHTTPの方が向いている
  • サービス名であるsangoの由来は色
    • 他のプロダクトも色由来らしい
  • MQTTはエラー定義が少ない
  • クライアント側でもバッファ処理などはある程度必要
  • QoS2はDBの二相コミットと同じ

感想など


個人的な興味から参加した会でしたが、やはり文章で見るより面と向かって語られた方が可能性をより感じる事ができました。

元々はモバイルアプリの行動ログ送信や、リアルタイムチャットのプロトコルとして使ったら面白そうと思っていたのですが、ほとんどがQoS2の送達保証を選ぶ事になりそうで、HTTPとの差別化をどう出していくかが難しそうに感じました。

とりあえず、自宅で部屋の温度を測定し続けているRaspberry PiにでもMQTTをしゃべってもらって、引き続き可能性を探っていきたいと思います。
(ちなみに部屋の温度はXivelyに送っているのですが、普通にMQTTに対応してました。そりゃ"IoT Platform"を名乗るだけあって当たり前か^^;)

2014年8月10日

REST APIの認証方法を調べてみた

ある日、REST APIの認証方法をまとめる(という話を聞く)機会があったのですが、要件と各社の実装方法を照らし合わせるとさまざまなケースが存在して興味深かったので、ブログにまとめてみることにしました。

#OAuthは「認証」ではなく「認可」の機構であるとか、人の認証とプログラムの認証がごっちゃになってたり、いろいろツッコミどころの多い内容かと思いますがご容赦を。。

求められていた要件(と検討ポイント)

  1. Webアプリ以外にバッチプログラムからの利用も想定したい
  2. 通信経路中での盗聴や改ざんを防止したい
  3. APIトークンの発行などのアカウント管理の手間を軽減したい
  4. キーやトークンが漏れた場合の対策をどうするか
1については、特に後者の場合だとPINやOut-of-band(OOB)方式が使えそうですが、「それだと初回やセッション切れた時ににブラウザなど別の認証入るよね?」(いわゆる”火入れ”)とか、「HTTPS必須にすれば経路中の盗聴や改ざんは防止できるけど、本当に?」(まぁMITM攻撃とかありますしね。。)という会話の後、MAC(Message Authentication Code)トークン署名方式ならどうかという流れに。

署名付きリクエストはOAuth 1.0aでHTTP通信の時に使われますが、いかんせんデバッグが大変なのと、MACトークン署名方式でもkeyとsecretが漏れたら結局一緒の様な気がしてモヤモヤしてました。

#てかOAuth 2.0にMACトークン署名方式は無いでしょ、と思ったら一応仕様としてはあるらしい

既存REST APIの認証方法

前置きが長くなりましたが、ではネット上で既に提供されているREST APIはどのような認証方法を提供しているのかを調べてみたのが以下になります。

Twitter

dev.twitter.comでアプリケーションを登録して、そこで発行されるAPIキーまたはアクセストークンをプログラムで使う。OAuth1/OAuth2対応。

Facebook

developers.facebook.comでアプリケーションを登録して、そこで発行されるアプリケーションIDとアプリケーションキーをプログラムで使う。OAuth2のみ対応。

Google

console.developers.google.comでアプリケーションを登録して、そこで発行されるクライアントIDとクライアントシークレットをプログラムで使う。OAuth2のみ対応(OAuth1は非推奨)。

Amazon AWS

AuthorizationヘッダとHMACハッシュ署名による認証。最近、署名で使うアクセスキーはルートのものは取得できなくなった(IAMで権限を指定したユーザを作成する)。

GitHub

BASIC認証とOAuthトークンによる認証。OAuthトークンの発行はアプリケーション用と個人(アカウント)アクセス用?に分かれている。

Parse

アプリケーションIDとクライアントキーによる認証。クライアントキーはREST API用の他にJavascript用や.NET用など用途別に発行される。

OAuth2が多いものの。。

ざっと既存のREST APIでは、OAuth2 Bearerトークンによる認証が多く、”経路中の盗聴や改ざんはHTTPSで担保し、トークン漏れは生存期間を短くする事で対処する”というOAuth2のセキュリティ要件に従った形が多いようでした。
(加えて、管理コンソールからのキーのrevokeやregenerateなど)

ただ、認証ヘッダはAuthorizationやベンダープリフィックス(X-HOGEHOGE)を使う場合とさまざまで、キー名の呼び方も各サービスでまちまちでした。また、モバイルアプリなどHTTPS+OAuth2 BearerトークンとHTTP+OAuth1署名で通信のオーバーヘッドはどちらが軽いかなども検証する必要があるかもしれません。

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円弱で買えてしまうという事では、これから十分すぎるほど遊べそうな可能性を感じました。