アーカイブ
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から使うのが良いと思います。
湘南台の男のらーめん500円の営業状態を調べるrubygems作った
昨日、男の店主がメルマガで、「急に三田二郎を食べたくなったから昼の営業は休みます」「今神保町で二郎食べたけど、これから用心棒も食べるから夜は19時からになります」と言っていて面白かったから作った。
■インストール
gem install otokonoramen500yen
■使う
gem installすると、otokonoramen500yenというコマンドが使えるようになる。
otokonoramen500yen実行すると、最新のメルマガの日時と本文が表示される。
これでterminalで作業している時に、ブラウザを開かなくても今日営業しているかパッと調べられるので便利です。
■開発者向け情報
一応gemなので、本文と発行日時を取得できるようにしておいた。
例えば、センサーで取得した自身の健康状態と、男のらーめんの営業状態とを連動させた健康促進システムの開発などへの応用が期待できる。
require 'rubygems'
require 'otokonoramen500yen'
o = Otokonoramen500yen.get
puts o.date
puts o.body
puts o.url
im.kayac.comのgem作った
im.kayac.comのAPIを使うためのgemを作った。
im.kayac.comは自分のアプリからiPhoneにpush通知したり、自分のgoogle talkにメッセージを送ったりするのに便利なwebサービスで、俺はよく使ってる。
研究室のwikiの更新情報を自分のケータイに通知したりとか、あとtwitter検索の結果を通知したりとかするアプリの中で使う為にこのgemを作った。Androidケータイがgoogle talkをすごいレスポンスで受信できるので、我ながらいいアプリ作ったと思っている。
■インストール
gem install im-kayac
■使う
require 'rubygems'
require 'im-kayac'
begin
p ImKayac.post("username", "hello world")
rescue => e
STDERR.puts e
end
im.kayac.comの設定でパスワード認証をしているなら、引数で渡す。
ImKayac.post("username", "hello world", {:password => 'your-password'})
秘密鍵認証の場合はこうする。
require 'digest/sha1'
message = 'hello world'
sig = Digest::SHA1.hexdigest(message + 'your-sig')
p ImKayac.post("username", message, {:sig => sig})
■ソースコードとか
hugeurlというgemを作った
ふげではなくヒュージ。
tinyurlやbit.lyなどの短縮URLを展開できる。
■インストール
gem install hugeurl
■使う
require 'rubygems'するとhttp://shokai.orgのURI::HTTPインスタンスが返ってくる
require 'hugeurl'
puts URI.parse("http://bit.ly/d4VYD2").to_huge
もしくは
Hugeurl.get("http://bit.ly/d4VYD2")
でもいい。展開には http://search.twitter.com/hugeurl?url= を使っている。
ShinagawaSeaside
tokyo tyrantのサーバーを起動したり終了したりするrake taskを作った。
名前は、tokyotyrantの周辺のライブラリがmiyazaki resistanceとかそういう名前ばかりだったのでそういう作法なのかなと思って天王洲アイルと迷いつつ品川シーサイドに決めた。
■インストール
sudo gem isntall shinagawaseaside
■使う
Rakefile
require 'rubygems'ShinagawaSeaside::set_tasks するとrake taskが追加される。
require 'shinagawaseaside'
ttdb = [ { :name => 'users', :port => 20010},
{ :name => 'videos',:port => 20011},
{ :name => 'comments', :port => 20012} ]
ShinagawaSeaside::set_tasks(ttdb, :basedir => File.dirname(__FILE__)+'/ttdb')
Rakefileのあるディレクトリの下に ttdb というディレクトリが作られて、
その中にusers.tch, videos.tch, comments.tch というDBができる。pidはusers.pid, videos.pid, comments.pidの中に入る。
% rake -T
rake ttrestart # restart TokyoTyrant server
rake ttstart # start TokyoTyrant server
rake ttstop # stop TokyoTyrant server
中身はRakeでTokyoTyrant serverを起動/終了 – 橋本詳解と大体同じ。(複数サーバー起動できるようにした)
tokyotyrantをソースからインストールすると一緒に入る ttservctl を参考にした。
タスクの名前は初期値がttstart, ttstopだけど、変更もできる
ShinagawaSeaside::set_tasks(ttdb,
:basedir => File.dirname(__FILE__)+'/ttdb',
:start => 'start', # set task name
:stop => 'stop',
:restart => 'restart'
)
俺はyamlで設定ファイルを書いてそこから読み込むようにしている。そうするとアプリからも、どのDBがどのportにあるか見つけやすい。
config.yaml
ttdb :
- name : users
port : 23240
- name : videos
port : 23241
Rakefile
require 'rubygems'
require 'yaml'
require 'shinagawaseaside'
begin
conf = YAML::load open(File.dirname(__FILE__)+'/config.yaml')
rescue
STDERR.puts 'config.yaml load error'
exit 1
end
ShinagawaSeaside::set_tasks(conf['ttdb'], :basedir => File.dirname(__FILE__)+'/ttdb')
■ソースコード
githubに置いた


最近のコメント