2014-10-26

IRKitを使った簡易オレオレリモコンをHTMLとJavaScriptで作る

音声で家のテレビやオーディオを操作したいと妻からの要望があったので作る。100%仕様を満たす物は1日以上かかりそうなので、まずはiPhoneからタップでそれぞれ操作できるようにした。

完成図


学習リモコンの選定

まずは学習リモコンの選定。PlutoIRKitかどちらにしようか悩んだが、LANケーブルを引き回すのが困難なのでIRKitに決定。amazonで7,700JPY也。同時に無線LANを安定化させるために古い機器を引退させて、新たにAtermの無線LANルーターを導入した。

IRKitの設置

設置に必要な物はMicroUSBの電源供給のみ。適当な場所に設置してまずは自宅の家電が操作できるか試す。ここではApp Storeから入手したIRKit シンプルリモコンを使った。IRKitのwifiへの参加もやってくれて便利。
IRKitの赤外線は割と貧弱で、家具の配置や日光の影響を受けてしまう。設置場所は微調整を繰り返した。

HTTP APIのテスト

ここでは家にいる時に操作するユースケースのみを想定して、IRKit Device HTTP APIを使う。IPアドレス直指定で叩くため、ルーターの設定でIRKitのmacアドレスについて固定IPアドレスを割当するようにしておく。
% dns-sd -B _irkit._tcp
Browsing for _irkit._tcp
DATE: ---Sat 25 Oct 2014---
23:14:31.983  ...STARTING...
Timestamp     A/R    Flags  if Domain           Service Type     Instance Name
23:14:32.183  Add        2   4 local.           _irkit._tcp.     iRKitXXXXX

% dns-sd -G v4 irkitXXXXX.local
DATE: ---Sat 25 Oct 2014---
23:15:35.078  ...STARTING...
Timestamp     A/R Flags if Hostname            Address                  TTL
23:15:35.239  Add     2  4 irkitXXXXX.local.   192.168.10.4             10

# IRKItに向けて保存したいリモコンのボタンを押してから
% curl -i "http://192.168.10.4/messages”
HTTP/1.0 200 OK
Access-Control-Allow-Origin: *
Server: IRKit/2.1.2.0.g424fa95
Content-Type: text/plain

{"format":"raw","freq":38,"data":[5408,4107,640,4107,640,1738,663,1738,663,1738,663,4107,663,1738,640,1738,640,4107,663,1738,663,4107,710,1679,686,1679,686,1679,686,1679,686,50610,640,4107,640,4107,640,4107,640,1738,640,1738,640,1738,640,4107,663,1738,640,1738,640,4107,686,1738,640,4107,663,1738,640,1738,640,1738,640,1738,640,50610,640,4107,640,4107,640,4107,640,1679,640,1679,640,1679,640,4107,619,1738,640,1738,640,4107,640,1738,640,4107,640,1738,640,1738,640,1738,640,1738,640]}%

# 上で得られたIRデータをPOSTで投げて、リモコンと同じ動作になるかテスト
% curl -i "http://192.168.x.x/messages" -d '{"format":"raw","freq":38,"data":[686,41 ….'

HTTP/1.0 200 OK
Access-Control-Allow-Origin: *
Server: IRKit/2.1.2.0.g424fa95
Content-Type: text/plain
このあたりの手順は公式サイトに詳しくのっている。あとはここで得られたIRデータをIRKitに投げる画面を書けば良い。

UIを書く

IRKitのHTTP APIは Access-Control-Allow-Origin: * ヘッダを返してくるので、ブラウザのXMLHttpRequestで叩いてもレスポンスが確認できる。なのでHTMLとJavaScriptだけで完結する。コードはgithubにアップしました。
iPhoneのSafariで「ホームに追加」をしておくとSafariのタブの一つでは無く、個別アプリとして扱われるので便利。

音声認識の実装はどうしようかと悩みつつ今日はここまで。

IRKit - iPhone,iPadを使って外出先からエアコン等の家電を操作できる学習リモコンIRKit - iPhone,iPadを使って外出先からエアコン等の家電を操作できる学習リモコン
maaash.jp
売り上げランキング : 2255
Amazonで詳しく見る by AZlink

2014-09-15

PyCon JP 2014 オープンスペースでインタラクティブプログラミングについて発表しました

PyCon JP行ってきた。話せるネタはあったものの、事前にトークセッションのプロポーザルを出してなかったのでオープンスペースで細々とやりました。



共用IPython Notebookサーバーの運用

共用のデータ分析環境としてIPython Notebookを運用する場合、適度に再起動をかけたりと、気にしなければならない事が多々ある。現在のv2系にはマルチユーザー機能が無い*1ので、自ずとノーガード戦法となり、ある程度のリスクを許容しつつの運用となるが、その中でもやれる事はやろうという話です。

インタラクティブ環境を意識したメソッドの作り

折角のインタラクティブ環境なので、動作はサクサクしていた方が良い。データロード用のショートカットメソッドなんか特にdocストリングとレスポンスタイムが重要。あと不意の事故防止。

脚注:
*1: v3系で追加予定がある

2014-09-01

ハイパフォーマンスブラウザネットワーキング12章「HTTP 2.0」

社内のハイパフォーマンスブラウザネットワーキング勉強会、12章「HTTP 2.0」の担当をしたのですが、現在の仕様(draft 14)と異なる点がいくつかあったので資料にしました。



大きな所はヘッダ圧縮の手法として紹介されていた「ヘッダの差分だけ送る」という所が無くなった点かな。

 サーバープッシュのインパクト

アプリケーションエンジニア目線だと実際の工数にインパクトがありそうなのはサーバープッシュだろうか。リソースの優先ロード、遅延ロードといった処理をブラウザと通信プロトコルが受け持ってくれれば、アプリケーションの開発者はその分楽ができて良い。画像のbase64インライン化やJSファイルの結合といった処理も、modpagespeedの様なミドルウェアにまかせるアプローチに徐々に移行していくかもしれない。

中間装置まわりの話

普段は意識していない所なので中間装置がどうといった話はイメージがつかみにくい。例えばTLSの終端がHTTP/2の終端なのかどうか、例えばロードバランサの中はもうHTTP1.1となるのか、あたりは疑問が残ったのでまた調べようと思う。

ハイパフォーマンス ブラウザネットワーキング ―ネットワークアプリケーションのためのパフォーマンス最適化ハイパフォーマンス ブラウザネットワーキング ―ネットワークアプリケーションのためのパフォーマンス最適化
Ilya Grigorik,和田 祐一郎,株式会社プログラミングシステム社

オライリージャパン
売り上げランキング : 94924
Amazonで詳しく見る by AZlink

2014-08-31

YAPCに行ってきた

YAPCに行ってきました。Perlのセッションを避けたつもりは無かったのですが、モバイルアプリ開発やデータ分析のセッションに出ていたらほとんどPerlの話はありませんでした、適材適所というか、普段Perlを書かない人間には参加の敷居がどんどん下がっている印象。

Google BigQuery で DWH 構築

BigQueryといえばGoogle Analyticsのプレミアムプランの印象が強くて、100万JPY/month払って使う物と考えていたが。自前DWHのストレージとして使うととても安く、どんなクエリでも高速に帰してくれる奴だと知った。今丁度データ分析プラットフォーム構築業をしているので、休み明けにでも検証したい。
https://speakerdeck.com/naoya/google-bigquery-falsehua-number-yapcasia

JSON SQLインジェクション脆弱性と、そこから学ぶセキュアプログラミングの原則

構造化されたクエリパラメータをパースできるようなおしゃれなWebアプリケーションフレームワーク、使ってみたいと思った。

そんなにビッグでもないデータ処理手法の話

fluentdの圧倒的人気。この分野は自分が素人なので、どんなミドルウェアがあるのか知れたのはよかった。BigQuery等の登場によりデータ保持コストとコンピューティングリソースコストがこのまま下がり続けると、サンプリング調査や信頼区間といった統計的な手法を忘れて常に全数調査で良くなる、みたいな話をHUBでssig33とした。
http://www.slideshare.net/tagomoris/handling-not-so-big-data

モバイルアプリとAPIのありかたを考える2014

良く見る画面だなと思ったらParse.comのデモだったり。
JSON-RPCのバッチリクエストの話は、これはシンプルさを捨ててパフォーマンス(バッテリー効率、処理速度)を取るというアプローチなので、モバイルアプリなら全然ありかなと思った。

curlでターミナルから打つのが大変になる等のデメリットはあるが、クライアントが任意にリクエストを一つに纏められるというのが大きい。アプリ起動時だとユーザーのステータスやイベントの有無を取得したり複数のAPIを叩くというのはよくあるし、バッテリー効率を考えたらユーザーの操作ログみたいな物は纏めて送れた方がいい。サーバー側の設計の話はあまり無かったけど、APIコールのコストをけちって、貪欲なレスポンスを返さなくても良いので、サーバーAPIの粒度を小さくできるのもメリットかな。

あと、この話を聞いてる最中に自前ライブラリのバッチリクエスト対応をした。

Mobile Application Development for Perl Mongers [ninjinkun x gfx]

いい話だった。アプリ開発にgit-flowを使うの、仕様フリーズしてQA期間がありつつも次のバージョンの開発もする場合は確かにそうだなと。MVVM重要、Reactive Cocoaは後でチェックする。

その他

YAPCサイトのトークスケジュールの画面、iPhoneから見ると [ビギナー]とか[レギュラー]の難易度表示が無いの、罠だった。
大学内にHUBがあるのやばい。

まとめ

CONBUとスタッフの皆さんありがとうございました。


2014-08-30

jquery-jsonrpc2.0のバッチリクエストとPromise対応

オレオレJSON-RPCライブラリがバッチリクエストに対応していなかったので対応した。こんな風に書けるようになった。
$.jsonrpc.defaultUrl = '/rpc';

// Send 3 requests at once.
$.jsonrpc([{
    method: 'getEventStatus'
}, {
    method: 'getUserStatus'
}, {
    method: 'sendLoginStatus',
    params: {status: 'login'}
}]).done(function(responses) {
    results.forEach(function(response) {
        if (response.result) {
            doSomething(response.result);
        } else {
            handleError(response.error);
        }
    });
}).fail(function(error) {
    // timeout or 503 or bad response
});
なぜ今になってメンテしたかというと、モバイルアプリはクライアントが任意に複数のAPIコールを一つのHTTPリクエストに纏められた方が良いよねと最近思う様になった*1 のと、今日のYAPCのセッションでJSON-RPCのバッチリクエストについて説明があったので。YAPCの感想はまた次のエントリで。

あとbowerのリポジトリを眺めていたら、WebSocketを使う物を見つけたのでこちらの方がおすすめです。

脚注:
*1: Orreily「ハイパフォーマンスブラウザネットワーキング」の影響