うっかりエンジニアのメモ

未来の自分に宛てたメモ

MonsterTV X3A(SK-MVX3A)でSplatoon録画環境を構築する

スプラトゥーンにガチハマリしているので、対戦の様子を録画したくなってきました。 デスクトップのWinマシンでWii Uの映像を録画(キャプチャ)する環境を構築する手順をまとめておきます。所要時間は30分位。

PCI-express接続のキャプチャボードを使用するので、ノートPCでは実現できません。あしからず。

流れ

  • 各種ハードウェア購入
  • 設置
  • Wii U画面解像度設定
  • ドライバ・動作確認用アプリインストール
  • (最低限の)動作確認
  • アマレコTVインストール

マシン環境

項目 内容
MB ASUS P8h77?
CPU Intel Haswell Core i7
memory 16GB
storage システム: SSD データ: HDD
OS Windows 7 64bit

各種ハードウェア購入

合わせて1万円くらいです。

設置・配線

MonsterTV X3AをPCI Expressのレーンに差し込みます。
WiiUから分配器に入力し、2つの出力端子をテレビとMonster X3Aに接続します。

※我が家ではもともとテレビでプレイしていたので、そうでない場合は読み替えてください。

Wii U画面解像度設定

Wii Uの画面解像度を 720p に変更します。
これに気づかなくて1時間消えました。皆様お気をつけ下さい。

ドライバ・動作確認用アプリインストール

ダウンロード|地デジチューナーやビデオキャプチャなどパソコン周辺機器の製造・販売ならエスケイネット

キャプチャボード開発元の上記ページからMonster X3A用のアプリとドライバをそれぞれダウンロードして適宜readmeにしたがってインストールします。

(最低限の)動作確認

開発元提供の視聴録画アプリで、Wii Uの画面をキャプチャできるかどうか確認します。

ただし、このアプリはあくまで動作確認用に留めます。私の環境では15分に1度程度、画面の横方向に乱れが発生する場合があり、ゲームプレイに支障をきたすためです。実際のプレイ・録画には後述の「アマレコTV」というアプリを使います。 (あと開発元提供アプリは起動時にWindows Aeroがいちいち無効化されるのも煩わしいです)

アマレコTVインストール

アマレコTV公式ホームページ から アマレコTVをダウンロード・インストールします。

Ctrl+Sでスクリーンショット、Ctrl+Zで録画開始できます。これらのショートカットは他のアプリをアクティブにしている状態でも効くので、とっさに画像をキャプチャするのがとても楽です。

イカ、よろしく~

Timezone情報の有無によるJackson Deserializerの挙動変化でハマる

timezoneに想いを馳せる1日となりました。

環境

REST APIサーバ + JavaScript MVWフレームワーク構成のWebアプリです。

サーバサイド

クライアントサイド

  • AngularJS 1.3.14

状況

ユーザがアプリの画面で入力した日時を、json形式でAPIサーバに送信するような状況です。

前置き: Date and Time API(JSR310)とは

Java SE 8から導入された日付・時刻を扱うAPIです。

アプリが動作するのがJava8ということもあり、ここではJava8以前からある java.util.Date は使いたくないので、日付・時刻はすべてこのJSR310で定義されたクラスのオブジェクトとして扱うことにします。

ということで、ユーザが入力した日時はサーバサイドで以下のいずれかのクラスにマッピングされることになります。

JacksonでJSR310のクラスにデシリアライズするには

サーバサイドはJavaなので、JavaJSONパーサライブラリが必要です。上で書いたとおり、ここでは定番のjacksonを使うことにしました。

サーバサイド

依存関係に com.fasterxml.jackson.datatype:jackson-datatype-jsr310 を追加します。jacksonのcoreライブラリにはJSR310のクラスのパーサは実装されていないため、この追加モジュールを加える必要があります。

Jackson support for Java 8 Date & Time API data types is automatically registered when Java 8 is used and jackson-datatype-jsr310 is on the classpath. Joda-Time support is registered as well when jackson-datatype-joda is part of your project dependencies.

引用: Latest Jackson integration improvements in Spring

私はビルドシステムとしてGradleを使っているので、以下の記述をbuild.gradleのdependenciesに追加します。

compile("com.fasterxml.jackson.datatype:jackson-datatype-jsr310:2.5.1")

日付情報を受け取るクラスを決める

先に書いたとおり、JSR310には日時を表現する3つのクラスがあります。

  • java.time.LocalDateTime
  • java.time.ZonedDateTime
  • java.time.OffsetDateTime

今回

  • DB(MySQL)に datetime 型で日付を格納している
  • ORマッパー(Doma)がデフォルトで、MySQLdatetime 型のカラムを LocalDateTimeマッピングする

ということで、 LocalDateTime クラスとしてユーザの入力した日時を受け取ることにします。

問題発生

ユーザが入力した日時データをPOSTすると、サーバ側のアプリ上で例外が発生してアプリが停止しました。

原因

jacksonの LocalDateTimeDeserializer ではデシリアライズできないフォーマットでjsonが送られてきたことが原因でした。

何が起きていたのか

たとえば「2015年1月1日0時0分0秒」という日時データをjsonで送るとき、サーバ側には

{date: "2015-01-01T00:00:00.000Z"}

のようなフォーマットの文字列で送られていました。
このTやらZやらが謎です。ということでぐぐると、ISO-8601形式を知りました。

ISO-8601形式

詳しくはWikipedia先生をどうぞ。

ISO 8601 - Wikipedia

中ほどを見ていくとありました

  • 日付と時刻の間にTを挟んで表記する
  • 時刻の末尾にZを加える事で協定標準時(UTC)を表現できる

さらに調べると、JavaScriptにはまんま toISOString() 関数がありました。

Date.prototype.toISOString() - JavaScript | MDN

toISOString(new Date()) みたいなことをすると、確かにISO-8601形式で日時が表示されました。

Jackson Deserializerでデシリアライズ可能なフォーマット

JacksonでjsonをLocalDateTimeにマッピングする時に使われるDeserializerは LocalDateTimeDeserializerクラス です。このクラスがデシリアライズ可能なフォーマットがわかれば良いと思い、とりあえずソースコードを見ていたら、ありました。

jackson-datatype-jsr310/LocalDateTimeDeserializer.java at master · FasterXML/jackson-datatype-jsr310

    private LocalDateTimeDeserializer() {
        this(DateTimeFormatter.ISO_LOCAL_DATE_TIME);
    }

コンストラクタの引数 DateTimeFormatter.ISO_LOCAL_DATE_TIME がめちゃくちゃ怪しいですね。

この時点でうすうす原因に気づいた感じがしてきましたが DateTimeFormatter.ISO_LOCAL_DATE_TIME はJSR310のクラスなのでリファレンスを読んでみると

フォーマッタ 説明
ISO_LOCAL_DATE_TIME ISOローカル日付および時間 '2011-12-03T10:15:30'

DateTimeFormatter (Java Platform SE 8 )より引用

Zがない

LocalDateTimeDeserializerは文字通りローカルな時刻(=タイムゾーンを持たない時刻)を扱うので、ケツZなぞ知らん、というわけです。

例外発生までの流れ

ユーザが日付を入力する
-> Dateオブジェクトが作られる
-> DateオブジェクトをPOSTする時、Angular内部で toISOString() 関数によりISO-8601形式に変換される(たぶん)
-> ケツZがついたフォーマットでPOSTされる
-> LocalDateTimeDeserializerからみたらデシリアライズできないケツZ
-> \(^o^)/

解決策の前に前提条件

  • JavaScriptのDateオブジェクトをAngularJSで送信しようとすると、ISO-8601形式で送信される
  • jacksonの LocalDateTimeDeserializer ではISO-8601形式の文字列をデシリアライズできない

解決策

クライアントかサーバか、どちらかで頑張るということになります。。。

解決策1: clientで日時のフォーマットを整形してから送信する

AngularJSなら、dateフィルタに処理させる。

$filter('date')(new Date(), "yyyy-MM-dd'T'HH:mm:ss")

これでDateオブジェクトのケツZが除かれた状態で送信されるので、何の問題もなくLocalDateTimeDeserializerでデシリアライズできます。ただし、この対処はタイムゾーンなしデータへの変換作業をclient側に寄せています。この方法ではすべての箇所で変換してから送らないといけないのでだるいです。

解決策2: serverでZonedDateTime型にデシリアライズする

ZonedDateTimeに対応したDeserializerである InstantDeserializerタイムゾーン情報付きのISO-8601形式のフォーマットをデシリアライズすることができます。 なので、ユーザの入力を一旦ZonedDateTime型で受け取り、内部でLocalDateTime型に変換します。 DBに格納する前にZonedDateTime型のオブジェクトをLocalDateTime型のオブジェクトに変換すればOKです。 幸い、それ用のAPIが用意されていました。( ZonedDateTime#toLocalDateTime() )

まとめ

解決策2を採用して、めでたく日時情報をやりとりできるようになりました。おしまい。

参考

sublime text 3をWindowsにインストールしたらやること

Markdownとpythonソースコードの編集に利用することを想定しています。

  • package control
  • package
  • font
  • key bindings

package control

なにはともあれ、package controlをインストール

Installation - Package Control

package

下記パッケージをインストール

パッケージ名 機能
Anaconda Pythonの自動補完、lint、pep8警告表示
IMESupport Windows環境下で日本語入力したときのインライン入力窓の位置を正しくする
Markdown Extended markdown中に書かれたソースコードのsyntaxhighlighting
Monokai Extended markdown文書のsyntaxhighlighting
OmniMarkupPreviewer markdown文書をCtrl+Alt+Oでブラウザプレビューできるようにする
Package Control パッケージ管理ツール
Table Editor markdownでテーブルを簡単に記述できるようにする
Theme - itg.flat フラットなsublime textテーマ

Anaconda settings

Anacondaのpep8警告表示を利用するための設定。 Preferences > Package Settings > Anaconda > Settings - Userで開かれる Anaconda.sublime-settings を以下のようにする。

{
    "python_interpreter": "C:/Python27/python.exe",
    "pep8_max_line_length": 99,
    "anaconda_linter_mark_style": "none",
}

1行当たりの文字数制限を99文字にしているのは私の好み。(あと最近はpep8の制限が緩和されたらしい)
3つ目の設定で、pep8警告が控えめな表示になる。(デフォルトは行全体が枠で囲まれる)

OmniMarkupPreview settings

デフォルトのmarkdown文書のブラウザプレビュー時のフォントが美しくないので、cssをいじる。
Preferences > Browse Packages... で開かれるExplorerのウィンドウで C:\...\OmniMarkupPreviewer\public\github.css を開く。
私はメイリオConsolasが好きなので、以下のように編集する。

  • 1行目付近の body のfont-family指定に Meiryo を追加する
  • 334行目付近の .markdown-body code, .markdown-body tt のstyleに font-family: Consolas を追加する
  • 349行目付近の .markdown-body .highlight pre, .markdown-body pre のstyleに font-family: Consolas を追加する

font

Ricty Diminishedを13ptで使う。

yascentur/RictyDiminished

Preferences > Settings - Userで開かれる Preferences.sublime-settings に下記を追加する。

{
    "font_face": "Ricty Diminished",
    "font_size": 13.5,
}

key bindings

Sublime TextはデフォルトではCtrl+Tabの挙動が直感と異なる。
(右のタブに移動してほしいが、「開いた順にタブを移動」する)

これを直感通りに変更したい。Preferences > Key Bindings - Userで開かれるファイルに下記を追加する。

[
    { "keys": ["ctrl+tab"], "command": "next_view" },
    { "keys": ["ctrl+shift+tab"], "command": "prev_view" },
]

参考

悪徳不動産屋にカモられそうになった話

12月に都内某所に引っ越しました。
本当は、11月に引っ越しするはずでした。

某不動産屋で物件が決まり、さて初期費用払って契約という段で、不動産屋が送ってきた精算書がこちら

f:id:entropiajp:20141231233531p:plain

室内抗菌処理代?

ネットで調べてみると出るわ出るわ。
抗菌処理系の項目をしれっと初期費用に忍ばせて入居者から金を巻き上げる事例。
入金はせず、不動産屋に電話してみた。

「この【室内抗菌処理代】というのは、どういう初期費用ですか?」
「入居前に室内を消臭などさせていただく代金となっております」
「これ必須の費用でしたっけ?」
「いえ、任意です」
「そういう説明受けていませんでしたけど」
「え?そうでしたっけ?(すっとぼけ)」
「不明瞭な費用が含まれているので、契約はできません」
「…それなら、抗菌処理代は無料にできますよ(悪びれず)」
「あの〜こういった経緯がありますし、契約にあたって信頼を失っておりますので、契約はなしです。申込金は明日15時までに私の口座に返金してください。着金確認できない場合は、こちらも用意が有ります」
「…はい、わかりました」

翌日、無事に申込金の返金があり、ようやくゴタゴタも終わり。疲れた。。。

「部屋を押さえるには必要なんです」
とか言われて、前もって申込金とか取るのも本当はアレなんだってね。
別の不動産屋にこの経緯説明したら

「まだやってるとこあるんですねw」

って言われました。

以下、あくまで参考資料としてツイートを挙げておきますね。

免許番号とか、どこそこのマーケット上場とか、企業の真摯さを測る指標としてはまったく意味を成しません。。。皆様もお気をつけを。

こんな記事が2014年の締めになってしまいましたが、それでは皆さま良いお年を。

【会ったことある人限定】こやさんフリマ ~2014 Winter~

引越に伴いまして、いくつかフリマします。
興味のある方、@entropiajp までご連絡ください。

最新情報

  • 2014/12/03 02:20 液晶モニターRDT191WLMは譲り先が見つかりました
  • 2014/12/31 23:15 MBP、MacBay、Intel SSDは譲り先が見つかりました

お願い

  • 対象はこやと直接会ったことがある方に限定します
  • すべて中古です。それなりに使用感がありますが、完動品です
  • 急ですが、12/5午前中で〆切とさせていただきます
  • 極力、銀行振り込み&ゆうパック着払いでお願いします
  • 別所でも譲り先を募集しているため、お譲りできないことがあります
  • 同梱など相談OK

【完売】MacBook Pro (15-inch, Mid 2010) [35000円]

f:id:entropiajp:20141202020602j:plain

f:id:entropiajp:20141202020541j:plain

2011年春にヤマダ電機で14万円くらいで買いました。メモリは4GB->8GBに増設してあります。
OS Xは10.10(Yosemite)が入っていますが、購入時のOS X 10.6(Snow Leopard)を入れて譲ることもできます。

スペックはこちら
MacBook Pro (15-inch, Mid 2010) - 技術仕様

【完売】林檎派 MacBay [1000円]

f:id:entropiajp:20141202021000j:plain

上記のMacBook ProのDVDドライブを外して、代わりにSSDなどのストレージに換装できるようにするパーツです。

【完売】Intel SSD 320 120GB [3000円]

f:id:entropiajp:20141202015837j:plain

IntelSSD 320シリーズの容量が120GBのモデルです。

Plextor PX-128M2P SSD 128GB [3000円]

f:id:entropiajp:20141202015905j:plain

PlextorSSD 容量128GBのモデルです。

スペックはこちら
PX-128M3P【終息】 | コンピュータ関連製品の代理店事業 l 株式会社リンクスインターナショナル

【完売】三菱電機 RDT191WLM [1000円]

f:id:entropiajp:20141202020722j:plain

19インチのPC用液晶モニターです。DVIまたはVGAで接続できます。

スペックはこちら
三菱 ディスプレイ

【完売】GLADIAC GTS 250G 1GB [1000円]

f:id:entropiajp:20141202020141j:plain

低消費電力なグラフィックボードです。DVI2個ついているので、マルチディスプレイ用にいかがでしょうか。

スペックはこちら
価格.com - ELSA ELSA GLADIAC GTS 250G 1GB (PCIExp 1GB) スペック・仕様

PS2ゲームソフト Kanon [100円]

f:id:entropiajp:20141202015748j:plain

全年齢版ですので、子供から大人まで安心して遊べます。
レターパックライト(360円)で送付可能です。

Macをインターネットリカバリしようとしたらエラー

来月引っ越すので、普段目の届かない場所にある物も、発掘されてしまいます。

春にMBPr 13inch (Late 2013)を買った結果、4年間使っていたMBP 15inch (Mid 2010)が本棚で埃を被っていることに気づきました。ソフマップ買い取り価格見たらmax5万!急にやる気が出てきてこの機会に売ってしまおうと奮起し、筐体を綺麗にしてさぁリカバリ掛けてクリーンインストールだ、と思ったら、意外と苦戦したので顛末を記録しておきます。

状況

  • 購入当時、HDD320GBと光学ドライブがついていた
  • 自分でパーツ交換して、HDD320GBをSSD256GBに、光学ドライブをSSD128GBに換えていた
  • 外したHDDは自作Win機に載せてサブストレージとして利用していた
  • 売却にあたって、パーツ構成を元に戻した(HDDのデータはそのまま)
  • 手元にSnow Leopard(購入当時のプリインストールOS)のインストールCDは無い

つまり、戻したHDD320GBにはMac OSは無いし、NTFSでフォーマットされている。

まずはPRAMリセット

ハードウェア構成を変えたので、PRAMリセット(⌘+option+P+R同時押しで起動)した。

謎のメッセージ「インストールの準備中にエラーが起きました」

Apple公式ドキュメントOS X:OS X での復元について - Apple サポートにしたがって、クリーンインストールを進めることにした。今はインストールCDが無くても、インターネットリカバリというものが利用できるらしい。

手順通り、⌘+R押しながら起動するとインターネットリカバリが開始される。AppleのサーバからミニマムなMac OSがダウンロード・展開される。しばし待つ。

やがて復元メニューへ。ディスクユーティリティから、HDDを正常認識していることを確認。HDDを検査したところ異常なし。NTFSでフォーマットされているので、Mac OS拡張でフォーマットする。

さてYosemite入れちゃうぞ、とOS再インストールをぽちぽち進めていったところ、

「インストールの準備中にエラーが起きました」

あれ…

何度やっても同じ。再起動しても変わらず。

完全にこれと同じ状況。困った。
OS X再インストールについて〜初心者 | Apple サポートコミュニティ

ヒントになるツイート

インターネットをさまよっていると、何やら気になるツイートが…

これか!!!!

早速ターミナルを起動して確認すると2001年!!なるほど、この時刻を見てインストーラYosemiteのインストール可否を判断しているのか。(PRAMリセットでシステム時刻がリセットされたっぽい)

dateコマンドで現在時刻を設定

インターネットリカバリモードにおけるタイムゾーンはPST(Pacific Standard Time:太平洋標準時)なので、日本の時間から17時間引きます。

たとえば現在時刻を日本時間2014年11月24日23時50分に設定したい場合は

% date 112406502014

となります。

できた

ターミナルを閉じて、再びOSの再セットアップを進めると、、、できました!

30分位でログインして利用できるようになりました。めでたし、めでたし。

twitterでエアコンの電源on/off

日本の夏。暑すぎる。

帰ってきてドア開けた時の「もわっ」っていう熱気。しんどい。

このしんどさを減らすべく、帰宅30分前くらいにエアコン付けられたらいいなぁということで、Twitterで自分宛てに命令をつぶやいて自宅のエアコンをon/offするような仕組みを作りました。

つくったもの

  • 赤外線を送受信する電子回路
  • 赤外線を受信して記憶するArduinoスケッチ
  • Twitterのつぶやきに応じて赤外線を送信するArduinoスケッチ

ソースコードはgistに公開しています。(記事下部に埋め込んであります)

必要なもの

Arduino UNO R3 (参考市価: 3,000円)

Ethernetシールド(参考市価: 4,700円)

各種電子部品

  • 赤外線LED OSI5LA5113A
  • 赤外線受信モジュール OSRB38C9AA
  • OSRB38C9AA
  • 抵抗 47Ω
  • ジャンパワイヤ沢山
  • USBケーブル
  • LANケーブル

開発用マシン: MacBook Pro(Mac OS X 10.9.3)

エディタはsublime text 2です。
StinoというArduino開発向けプラグインが最高です。

配線

配線図は後ほど公開します。
以下のように部品とピン番号が対応しています。特にこの番号である必要はないです。

  • 赤外線LED 2番
  • 赤色LED 5番
  • タクトスイッチ(デバッグ用に赤外線を送信するため) 6番
  • 赤外線受信モジュール 7番

ただし、公式ドキュメントにあるようにArduino UNOでは10-13pinは使えないので注意。

Arduino communicates with the shield using the SPI bus. This is on digital pins 11, 12, and 13 on the Uno and pins 50, 51, and 52 on the Mega. On both boards, pin 10 is used as SS.

Arduinoスケッチ

マイコンに書き込むプログラムは以下の2つです。

  • リモコンの赤外線を受信して記憶するArduinoスケッチ
  • Twitterのつぶやきを一定時間おきに確認して、テキストに応じて赤外線を送信するArduinoスケッチ

ほんとは同時にできるといいのですが。

リモコンの赤外線を受信して記憶するArduinoスケッチ

橋本商会で有名な橋本翔さんのこちらのソースコードを若干改変させていただきました。

全然関係ない話ですみません、橋本翔という同姓同名の小学生の同級生がいるので驚きました。彼は地元で居酒屋を開業しているはずなので、タンジブルテバイスの研究に携わっているはずがなかった。

Twitterのつぶやきに応じて赤外線を送信するArduinoスケッチ

以下の記事を参考にしました。

赤外線リモコンの通信フォーマット

参考記事によると、フォーマットは3種類あります。

  • NECフォーマット
  • 家製協フォーマット
  • SONYフォーマット

うちのエアコンは日立製なのでSONYフォーマットはありえないとして、NECフォーマットか家製協フォーマットかは、実際にリモコンが送信するコードを調べてみないことにはわかりません。

赤外線を受信するスケッチをArduinoに書き込んで、エアコンの起動ボタンを押して受信モジュールで記録したコードを見てみます。

340,161,48,120,48,35,48,35,48,36,48,36,48,36,...(省略)

送っているコードのonの長さとoffの長さが交互に並んでいます。単位は10μsです。

どちらのフォーマットであっても最初の2つのコードはleader code(これからデータを送信しますよ、というのを受信側に伝えるためのコード)なので、この送信時間をもとに判別することにします。

**** NECフォーマット 家製協フォーマット
T 562μs 425μs
リーダコードのonの長さ 16T (= 8992μs) 8T (= 3400μs)
リーダコードのoffの長さ 8T 4T

一目瞭然。onの長さがぴたり一致したので、エアコンは家製協フォーマットでした。

赤外線でデータを送信する

赤外線リモコンの通信フォーマットはよく考えられていて、単純に赤外線が飛んできたら1、飛んでない時は0という表現ではありません。 というのも、赤外線はリモコンだけでなく様々な物体が発しているため、すべての赤外線に反応した場合、リモコンから送信される赤外線はそれらノイズに埋もれてしまい、正常に動作することはかないません。

そこでノイズ対策として、38kHzで赤外線を高速に点滅させてデータを表現する方式になっているようです。まず38kHzで一定時間送信された場合がon、一定時間何も送信されない場合がoffと定義されています。そして家製協フォーマットの場合、1T(=425μs)のonのあと1Tのoffが連続した時1、1Tのonのあと3T(=1275μs)のoffが連続した時0という具合です。

38kHzで赤外線を点滅させる

これが辛い。1/38kHz ≒ 26.3μsということはおおよそ半分の13μsごとにon/offを変えればいいと思うのですが

digitalWrite(PIN_IR_OUT, HIGH);
delayMicroseconds(13);
digitalWrite(PIN_IR_OUT, LOW);
delayMicroseconds(13);

とかやっても、エアコンはぴくりとも反応しません。
なんでかなーとwebを彷徨うとこんな記事が。

Arduinoの高速化 | なんでも独り言

digitalWrite命令は実行に44サイクル掛かるらしいです。Arduino UNOのCPUクロックは16MHzであることを考えると、44/16MHz = 2.75μsなので、2回のdigitalWriteで5.5μsのずれということになります。なかなか無視できない数値だと思います。

そこで、同じ記事中で紹介されていたレジスタ操作を利用したピンの状態変更を採用しました。この方法ならピンのon/offに掛かる時間は3クロックに大幅に短縮されます。実際、13μsずつのdelayでうまくいきました。

twitterのつぶやきを取得する

赤外線送信部分が実装できたら、あとはtwitterのつぶやきを取得する部分です。
TwitterREST APIを公開しているので、HTTPでレスポンスを受け取ることができれば何とかなりそうです。

ここでTwitter APIを利用するためにOAuth認証というものが必要になりますが、 このOAuth認証はなかなかリソースを食うのでArduinoの貧弱なハードには荷が重いです。

そこで、どこか外部に丸投げしようと思っていたら、素晴らしいサービスがありました。

StewGate Uはひとことで言うと、Twitter APIのプロキシサービスです。アプリ登録時にStewGateがトークンを発行してくれるので、以後そのトークンとTwitterへの命令をセットにしてStewGateのサーバにリクエストを送ると、StewGateが代わりにTwitter APIからデータを取得してこちらに返してくれます。

そしてStewitterは@arms22さん作の、Arduino向けにTwitterアクセス機能を提供するライブラリです。もちろんStewGate Uを内部で利用しています。

さて、Twitterからtweetを取得しましょう。
実はStewGate Uの制約で、2014/8現在実行できるアクションは「ツイートを投稿する」か「自分宛ての最新のmentionを取得する」の2つのみとなっています。おうふ。

ということで自分宛ての最新のmentionを取得して、自分が自分宛てに「on」とつぶやいていたら、エアコンを起動するように実装します。この辺りはソースコードを見てください。フォロワーが自分宛てに「on」とつぶやいてエアコンを起動できることがないように注意。

また、Twitter APIはrate limitといって、時間あたりのAPI問い合わせ回数に制限を設けているのでこちらも注意します。StewGate Uの内部実装は公開されていませんが、おそらくmentionの取得はTwitter APIGET statuses/mentions_timelineで行われているので、15分辺り15回が制限値です。つまり、mentionを確認する頻度が毎分1回を超えないようにします。

このスケッチのソースコード

ということで実装したソースコードがこちらです。
Stewitterのトークン(Stewitter twitter("xxxxxxxxxxxxxxxxxxxxxxxxxxxxxx");)は適宜変更してください。

ハマったこと

赤外線送信時に終端コードの送信を忘れない

こんなのハマるの私だけかもしれませんが。。
家製協フォーマットは終端コードが定義されているんですね。なので、全てのデータを送信した直後に '1'を1回送信する必要があります。実装中にこれを忘れてしまい、一向にエアコンが反応しないことがありました。

赤外線LEDの角度が意外とシビア

ほんのちょっとでもエアコンの受光部から外れると信号が届きません。どうやら許容角度が5度くらいらしいです。
こういうLEDキャップ買うと許容角度が拡がるらしいので今度アキバ行ったら秋月で調達しておこう…

現状の課題

帰宅前にtwitterでつぶやくのを忘れる。

人間が一番信頼性低いっていう。
iPhoneGPSと連動させるくらいしないとダメですね。

おつかれさまでした。