アーカイブ
githubのリポジトリ数が100超えた
去年のゴールデンウィークの増井研合宿でgithubの使い方を山プルギス氏に教えてもらってから18ヶ月、ついに公開リポジトリ数が100個に達した。
ぜんぜんgithub上で他人のプロジェクトに首を突っ込んだりしていなかったので、100個のうちほぼ全てが自分で開始したプロジェクトという事になる。だいたい週1つのペースでリポジトリが増えていったわけか
100個目のプロジェクトは、notify-lightだった。
これは家の電灯が点いているかどうかを明るさのセンサーで監視して、Skypeのshokai_botというアカウントが俺に通知してくれるシステム。便利である。防犯的な意味で。
60行ぐらいのRubyスクリプト1ファイルだけで実装されている。
botからSkypeのグループチャットでこういうのが来る。
センサーを使うのもSkypeへの通知も、すでに便利なツールが作ってあって全部HTTPでできる。
ruby notify-light.rb -light http://localhost:8783/ -skype http://localhost:8787/という風に実行すればセンサーを定期的に監視してSkypeに送信できる。
■しくみ
CdSという明るさが検出できるセンサーをArduino等に適当に接続し、シリアル通信してMacやLinuxに送る。
serial-http-gatewayというプロジェクトを以前作ってあるので、これを使うとシリアルポートから受信したデータを溜めてjson形式で吐き出すHTTPサーバーが作れる。
読んだjsonにはタイムスタンプとセンサーの値(明るさが)入っているので、一定時間内の平均値を計算してノイズを消し、Skypeに通知する。
Skypeへの通知は先日作ったskype-chat-gatewayというのを使っている。
1年ぐらい前にskype-socket-gatewayというのを作ったけどwindows用だったのでもう使わなくなったし、socketよりもhttpから使えたほうが便利なのと、chat_idという概念がわかりにくいので1チャット1プロセス1portが対応するように作りなおした。
また、MacとLinuxでSkype APIを使う仕組みが違うので、それぞれ別々に実装した。
Linux版はまだちょっと微妙なんだけど、Mac版は出来がよくてWebブラウザからSkype Chatができるサーバーとかも付いているので便利です。
Rubyでcometサーバー作る
最近cometとかいう最新技術が流行っているらしいので、eventmachine_httpserverで作ってみた。
ここにサーバーとクライアントの例がある。どっちも50行ぐらいで実装できた。
comet at master from shokai/eventmachine-study – GitHub
サーバー起動して、タイムアウトを10秒に指定。
このサーバーは、POSTされた値を保持して、GETされたら返す。GETに対してはレスポンスを遅らせて返す。
ruby server.rb 8080 10
クライアントを起動。GETしてから25秒後にPOST
ruby client.rb 25
GET(comet) -> wait 25 sec -> POST
* GET
sleep 25 sec
404 ## 10秒経過、切断された
* GET ## 再接続
404
* GET ## 3回目
* POST kazusuke
POST success
200
kazusuke
200 ## 5秒待ってようやく値が返ってきた
kazusuke
* GET
サーバー側のログはこんなんなってた
http server start, port:8080, comet_timeout:10(sec)
load: 2.20 cmd: ruby 11481 waiting 0.45u 0.32s
request_method : GET
path_info : /message
query_str :
post_content :
request_method : GET
path_info : /message
query_str :
post_content :
request_method : POST
path_info : /message
query_str :
post_content : kazusuke
kazusuke
request_method : GET
path_info : /message
query_str :
post_content :
cometサーバー、接続が不安定なクライアントにpush通知するのに便利。
赤外線学習リモコンKURO-RSのWebコントロールパネル作った
赤外線学習リモコンをWebブラウザから使えるようにした。SinatraとMongoDBで、RubyでBuffalo/玄人志向の赤外線学習リモコンを操作するで作ったkuro-rs-serverを操作する。
shokai/kuro-rs-control-panel – GitHub
これでアプリから様々な機器を操作できる。家に帰る前に暖房つけたりとかNFCでテレビ動かしたりとか。
機能はこれだけ。全部GUIとJSON APIがある。
- 赤外線を読む
- 赤外線データに名前をつけて保存する
- 名前を指定して赤外線を発射させる
- データ内容を指定して赤外線を発射させる
■画面
保存した赤外線データの一覧と、新規データの保存ボタンがある

赤外線データのpermalink。 /ir/(名前) にある。
学習ボタンを押してすぐKURO-RSに赤外線を当てると

読み取られる。保存したりその場で試し撃ちしたりできる。

画面下にAPIのヘルプがあって、
curl -d 'name=tv/ch2' http://localhost:8787/kuro-rs.jsonのようにHTTP-POSTで名前を指定して赤外線発射、などの方法が書いてある。
■使ってみよう
Sinatraの他にMongoDBと、KURO-RSが必要。
このコントロールパネルはkuro-rs-serverと通信するので、サーバーとは別プロセスでkuro-rs-serverも起動して使う。
git clone git://github.com/shokai/kuro-rs-control-panel.gitconfig.yamlを編集する。kuro-rs-serverのアドレスぐらいしか編集する必要ない。
cd kuro-rs-control-panel
bundle install
cp sample.config.yaml config.yaml
kuro-rs-serverを起動する
kuro-rs-server /dev/tty.usbserial-00012a34b5 --port 8786
コントロールパネルも起動する
ruby development.rbもしくはpassenger使うとよい。
IO-DATAのNFCタグリーダーをHTTP、WebSocket、Socketから使えるようにした
NFCタグリーダーをサーバーにした。
shokai/nfctag-server – GitHub
特殊なデバイスはみんなサーバーにしてHTMLとJSから使えるようにすればいい。
1つのハードウェアにいくつもアプリをぶら下げれるし、アプリはハードウェアと別のマシンで動かせるし、JavaScript書けるし、とにかく楽だ。
下は以前作ったWebSocket clientでnfc-tag-serverに接続してtagを読んでいるところ。
タグがある時はhex dumpされた文字列が、無い時はfalseが送信されてくる。同じ値がHTTPや普通のTCP Socketでも取れるようになっている。

■NFCタグリーダー
これ使ってる。USB接続で、けっこうどこででも売ってる。これじゃなくてもlibnfcで動くデバイスならいけるはず。
ただしlibnfcでFeliCaが読めなかった。MIFAREタグなら読めた。
売り上げランキング: 12161
■インストール
git clone git://github.com/shokai/nfctag-server.git
cd nfctag-server
Macの場合
brew install libnfcこれで必要なライブラリがインストールされる。
gem install nfc eventmachine eventmachine_httpserver em-websocket ArgsParser
Mac以外はlibnfcを自分でインストールすればたぶんok。Ubuntuは意外にもaptにlibnfc無かった。
■起動
./nfc-tag-server --http_port 8080 --websocket_port 8081 --socket_port 8082
これでHTTPとWebSocketと普通のTCP Socketのサーバーが同時に起動する。
それぞれ
HTTP-GET
curl 'http://localhost:8080'
WebSocket
## JavaScriptwebsocket clientを使えばすぐ試せる
var ws = new WebSocket("ws://localhost:8081");
ws.onmessage = function(e){
Console.log(e.data);
};
Socket
telnet localhost 8082
のような感じに接続して、tagのIDが読める。
RubyでBuffalo/玄人志向の赤外線学習リモコンを操作する
11月22-23日にSFC ORFというSFCの研究室の発表会があって、そこでデモするブツに使う部品としてBuffaloの赤外線学習リモコンのRubyラッパーを書きました。これで家に帰る前に暖房つけたりできてうれしいですね。
玄人志向のKURO-RSとBuffaloのPC-OP-RSを操作できます。
MacとLinuxと、試してないけどたぶんWindowsでも動く気がする。コードはgithubに置いてる。
学習リモコン/KURO-RS/(1)使ってみる – 脳みそ沸騰中!のPerlのコードを参考にしました。
■PC-OP-RSを買う
気がついたらKURO-RSがどこにも売ってないんだけど、PC-OP-RSがKURO-RSと同じハードウェアで箱と付属ソフトが違うだけなのでどちらでも動かせます。
売り上げランキング: 4538
■インストール
gem install kuro-rs
そしてKURO-RSをMacやLinuxに刺す。
Windowsの人はドライバを入れてBuffaloアプリが動くことを確かめてからUSBポートに刺す。
KURO-RSはUSBポートに接続するとシリアルデバイスとして認識されます。MacやLinuxなら/dev/tty.usb****という名前になる。WindowsならドライバをインストールしていればCOM1とかCOM2とか名前がつく。
■赤外線リモコンを学習する
kuro-rsというコマンドがgemと一緒にインストールされています。
terminalで実行する
% kuro-rs /dev/tty.usbserial-0012a3b4そして15秒以内に赤外線をKURO-RSの本体に当てると、termialに16進数で赤外線データが出力されます。
学習した赤外線を発射しましょう
% kuro-rs /dev/tty.usbserial-0012a3b4 ffffffff0300f0e0018083...のように第二引数に16進数でデータを与えます。
これでテレビのチャンネルが切り替わるはず。
■自分のプログラムから使う
こんな感じでIOっぽく使えます。くわしくはexamplesディレクトリを見るといい。
require 'rubygems'
require 'kuro-rs'
# open KURO-RS
kr = KuroRs.open('/dev/tty.usbserial-0012a3b4')
# read
puts kr.read
## => hex dump (ffffffff0300f0e0018083...)
# write
kr.write 'ffffffff0300f0e0018083'
# close
kr.close
# block
KuroRs.open('/dev/tty.usbserial-0012a3b4'){|k|
k.verbose = true
puts k.read
## => hex dump (ffffffff0300f0e0018083...)
}
■Webアプリから使う
シリアルポートは複数プロセスで共有できないし、また複数スレッドから同時に書き込んだりもできないのでRailsやSinatraアプリにkuro-rs gemをそのまま組み込むのはオススメできません。
そういう時はkuro-rs-serverを使いましょう。
こうすると8080番portでhttpサーバーが起動します
% kuro-rs-server /dev/tty.usbserial-0012a3b4 --port 8080
curlから赤外線読み書きしてみる
# readreadもwriteも正常に行われるとstatus 200が返ります。失敗すると200以外。
% curl 'http://localhost:8080'
# => hex dump (ffffffff0300f0e0018083...)
# write
% curl -d 'ffffffff0300f0e0018083...' 'http://localhost:8080'
kuro-rs-serverを内部APIとしてRailsやSinatraから、あるいはAjaxから使うのが良いと思います。



最近のコメント