taiyoh's memorandum

@ttaiyoh が、技術ネタで気づいたことを書き溜めておきます。

iRKitを買ったお話

 lirc+lirc_webのシステムを作ったのが去年の話なのですが、肝心のエアコンの信号はlircでは認識できなかったし、今年に入って例のブレッドボードで組んだ回路が動かなくなったんですね。そもそもブレッドボードはそんな長く使うものじゃない筈なんですが。。。
 いい加減リモートでon/offできるシステムは復活させたかったので、作った回路は捨てて、先週やっとiRKitを買いました。
 結論から言うと、早く買っておくべきでした。
 部屋に無造作に置いてても問題なく機器に届くし、なによりエアコンの信号をちゃんと認識してくれたのが大きかった。小さくてかわいいし。
 そんなわけで、例のlirc_webのクライアント側も修正し、結果ただのhttp送信装置となり(iRKitのIPを直接指定して信号の文字列を送るだけになったので)、これでやっと外からエアコンのon/offも操作出来るようになりました。実に1年半越し。大塚さんには本当に感謝です><
f:id:sun-basix:20140827080948p:plain
 先週末時点でライトのon/offはできるようになってたんですが、エアコンがどうも動いてなくて、原因を調べたら単にヘッダのContent-Lengthが抜けてただけでした。

 → IRKit - Open Source WiFi Connected Infrared Remote Controller

Macじゃない環境でもIRCで流れてくる画像を表示したい人生だった

 MacLimeChatのサムネイル表示機能が羨ましすぎるのですが、今使ってるマシンがUbuntuだったりして、悲しみが募っていたわけです(Macに変えればいいじゃん、というのは根本的すぎるのでスルーします)。そんな悲しみを紛らわすためにずっとIRCツールを探し続けてたのですが、サムネイル表示できるのはどうもなさそう。
 でも、そんな時に見つけたのがweecloudというweb frontendでした。
 → eirikb/weecloud · GitHub
 このweecloudというツールはweechatのrelayという機能を使って機能拡張を行うもので、weechatとはnode.jsでデータのやりとりを行い、ブラウザとはsocket.ioを使ってやりとりをしてます。表示部分に特化していて、かつその表示はHTMLなので(正確にはjade)、HTML・js・cssをいじれば自分好みの表示ができるやん、ということに気づいたわけです。
 ということで、早速拙い英語でp-r送ってみました
 → insert thumbnail if message has image url by taiyoh · Pull Request #25 · eirikb/weecloud · GitHub
 実際採用されるかは謎ですが。
 あと、このweecloudは手元で動かすことを想定していて、認証関連は完全にスルーしてるんですね。なのでうかつにVPSに置くのは厳しいのですが、ここであのtypester師謹製のgateの出番となります。用意したサブドメインへのアクセスは一番表に置いたnginxで受け、gateに渡す。あとは認証はgateがやってくれて、通れば更にその後ろのweecloudに渡してくれます。gateはwebsocketにも対応してるので、リアルタイム通信も問題ないです。また、weechatの起動してるサーバと同じ所でweecloudを動かすので、relay用のポートを外に空ける必要がなく、weecloudとの通信をsslにしておけば、そこそこ安全性も確保できるのではと思います。
 この成果を後輩に言ってみたら「努力がすさまじいwww」と小馬鹿にされたわけですが、冒頭でも言ったとおりサムネイル表示を出来る方法を探してたのと、gateを使ってみる口実が欲しかったというのが今回の目的なので、もしかしたら数日たったら飽きて戻ってる可能性もだいぶあります。

(追記: 8/22)
上記p-r、早速マージされておりました。

radikoで聞ける番組をcronで録音したくなったので

 作った
 → taiyoh/p5-radiko · GitHub
 rtmpdump、swftoolsffmpegがないと動きません。あとPerl側の依存モジュールはFurlMIME::Base64、Class::Accessor::Lite::Lazyくらいか。

 → 簡易Radiko録音ツール。要swftools/rtmpdump/libxml/wget/ffmpeg/lame
 こちらの方の作ったシェルスクリプトを大いに参考にさせていただきました。

 以下、使用例。

電力モニター「はやわかり」に記録されているデータをgoで吸いだしてhogehogeする

 数年前にイギリスから発売された製品に「OWL+USB」というのがあります。ブレーカーから延びてるケーブルに同梱されている送信機についたクリップを取り付け、それを無線で飛ばして受信機で受け取った後、表示・記録する、というものです。各国対応版となっており、当然日本の電圧にも対応しています。日本の代理店を介した製品名は「はやわかり」です。

電力モニター
電力モニター
2 Save Energy Ltd
売り上げランキング : 44157


Amazonで詳しく見る
by G-Tools
 これをraspiとつないで、データを取り出してサーバに送るとかなんか色々できたらいいなぁ、と思っていたのですが、提供されてるLinux版のツールが軒並み動かず、githubに転がってる野良ツールも期待した動作をしてくれないので、自分で書きました。
 → taiyoh/go-cm160 · GitHub
 参考にしたのは、Cで書かれた野良ツールの「eagle-owl」というものです。これをリファレンスにして、同じメッセージがのやりとりができればデータが取得できるはずで、あとの処理はまた別のレイヤーに任せる形にしよう、という考えの下進めていきました。内部でlibusbとやりとりするgo-libusbというライブラリも使っていて、これも一緒にインストールしておく必要があります。

# libusbの開発パッケージもインストールしておく
$ go get github.com/taiyoh/go-libusb
$ go get github.com/taiyoh/go-cm160

 テストとか全然用意できてなくて申し訳ないですが、実機を伴うのはとてもやりづらい。。。下にこれを使ったツールのサンプルを添えておきます。

 Waitメソッドの引数のコールバックに任意の処理を入れるような形にすれば、用途を限定せずにいろんなことができるようになるかな、と思いました。また、電圧も外から入力できるようにしたので、国が変わる度にワット数の計算が合わなくなることも避けられるはず。。。

cgoでのバイト列の受け渡し・受け取りについて

 (今年、まだ更新するネタがあったぞ)
 先週末くらいからGoをちょっと触り始めました。まだ始めて通算3日目くらいなんですが、なぜか色々すっ飛ばしてcgoなんてやっております。。。どうぞお手柔らかにお願いします。
 諸事情あって、Goで定義したバイト列をC側で操作して、その結果をGoで受け取ってほにゃららする、って操作がしたくて調べてみました。低レイヤーなライブラリーをいくつか読んでみて、こんな検証コードを作成しました。

 これ、完全に黒魔術や。。。目的のデータのポインタを型に依存しない形で取り出してそのポインタの指すデータをreflect.SliceHeaderでキャストして任意の型で操作できるようにして*1、その構造体のDataのポインタを改めて型に依存しない形で取り出してCにおけるunsignded char *でキャストしてC側の関数に放り込む、ってことらしいですが、自分でも何言ってるかわからない><いや、落ち着いて考えれば「あー」程度には思うのですが、深い理解にはなってないですね。。。
 もともとはあるUSBデバイスのデバイスドライバ+アプリ的なものを作りたくて、当初はnode.jsで目的のことをやろうとしたんですが、結局深いところでの操作はC++が書けないと難しい感じだったんですね。なので、直接C/C++を触る気力のない、というか、デバドラ部分以外はなるべくLL的なものを使いたいゆるふわな僕は、Goを選択した次第であります。Goは、程よく堅くて程よくシンプルに書けるのがいいですね。勿論適材適所だとは思っていますが。

*1:元ページに"Package reflect implements run-time reflection, allowing a program to manipulate objects with arbitrary types."って書いてあるので、よっぽど誤訳してなければ大体そんな感じのはず。。。 http://golang.org/pkg/reflect/

IFTTTのiOS版での位置チャンネルを使って、家のリモコンを操作する

 (なんか、半年ぶりにここに書くけど今年最後のエントリな気がする)
 承前lirc_webを使ってどこからでも赤外線リモコンの操作ができるようにする - taiyoh's memorandum
 表題以上のことはなにも無いんですが、やってみましたよ、ということで。
 f:id:sun-basix:20131216005909p:plain
 今IFTTTの僕のアカウントで登録しているレシピです。位置情報にバッチリうちの座標が入ってるので公開できないですが。
 そもそもなんですが、本来IFTTTって予め決められたところとしか連携できない、という制約があって、野良サーバにリクエストを送るとかは出来ないので非常に難しいのですが、一つ抜け道があります。IFTTTはwordpressサービスとの連携も行っているのですが、そのwordpressサービスは自分のドメインを登録することができます。つまり、そこの認証さえ通れば、IFTTTから指定したサーバにリクエストを飛ばせるようになるということです。
 → captn3m0/ifttt-webhook · GitHub
 この方がその辺の処理をまとめていて、xmlrpcのリクエストを変換して所定の場所に送るということをやっています。readmeにも「とりあえずここ使ってみて」というドメインが紹介されているので、お試しでやってみるのはありかも。というか、僕は今はそこ経由でやってます。でも、怪しいことこの上ないのは承知でやってるので、どっかのタイミングで自分とこのドメインを登録するか、そもそもこの連携をやめるかは考えております。。。
 そして何よりつらいのは、家の周囲そこそこの距離で検知されて動作してしまうので、そもそもホントに電気が消えたり灯いたりしてるのか、確認がとりづらいんですよね。いや、サーバのログとかは見てるんですが、最後の最後のリモコンの操作が正常に動作したかどうかを確認するのはなかなか難儀なもんでして。。。

earthquake.gemのnotifyをim.kayac.comに向けてみる


 これを使って、緊急地震速報のアカウントだけ通知するようにしてみた。最近地味に地震増えてきてて、揺れた瞬間にtwitter見て揺れたところを確認するのが面倒になってきたので、これでアプリとか開かないでも速報が確認できる。