6月 102013
nekobatoがpythonからlindaを使いたいと言っていたので、JSONを標準入力するとwriteされて、read/take/watchするとJSONを標準出力するツールを作った。
Ruby以外の言語でもLindaが使えるようになった。
インストール
sinatra-rocketio-lindaのgemに付属している。% gem install sinatra-rocketio-linda
% linda-rocketio --help
使い方(基本)
write
% linda-rocketio write -tuple '["say","hello"]' -base http://linda.shokai.org -space test
改行区切りで複数write
% echo '["say","hello"]\n["say","world"]' | linda-rocketio write -base http://linda.shokai.org -space test
read
% linda-rocketio read -tuple '["sensor","light"]' -base http://linda.shokai.org -space test
使い方(応用)
JSONを標準出力するプログラムを作る。pythonで書くべきかと思ったけど面倒くさいからRubyで書いた。
arduino_sensor.rb
#!/usr/bin/env rubyRubyだと$stdout.sync = trueを設定しておかないとpipeがうまく動かない。
require 'rubygems'
require 'arduino_firmata'
require 'json'
$stdout.sync = true
arduino = ArduinoFirmata.connect
loop do
v = arduino.analog_read 0
puts ["arduino", "sensor", v].to_json
sleep 1
end
["arduino","sensor",数値]が毎秒出力されるので、pipeで接続する
% ruby arduino_sensor.rb | linda-rocketio write -base http://linda.shokai.org -space test -verbose[“arduino”,”sensor”,数値]がTupleSpaceに書き込まれる。json以外の行は無視されてwriteされない。
データが流れているのが http://linda.shokai.org/test/arduino/sensor で確認できる
JSONを読むプログラムも書いてみる。
pipe-say.rb
!/usr/bin/env ruby
require 'rubygems'
require 'json'
$stdout.sync = true
while line = $stdin.gets do
puts line.strip!
data = JSON.parse line rescue next
v = data[2].to_i
system "say #{v}" ## Macの音声読上げコマンド
end
JSONが出てくるのでpipeで渡して読ませる
% linda-rocketio watch -tuple '["arduino","sensor"]' -base http://linda.shokai.org -space test -verbose | ruby pipe-say.rb
その他の例
arduino_firmataコマンドを使う例。% echo "[\"sensor\", \"arduino\",`arduino_firmata analog_read 0`]" | linda-rocketio write --base http://linda.shokai.org --space test
twitterのuserstreamをlindaに書き込む
twにはjson出力があるので
% tw --stream --format=json | linda-rocketio write --base http://linda.shokai.org --space testこれだけでuserstreamが共有できたりする。