0

ドアノックで研究室の鍵が開くようになった

偶然の産物だったけどうまく動いている。




ピエゾ素子で作った振動センサーと、サーボモーターでドアをあけるやつ(最近Arduinoで実装しなおした)をLinda RocketIOで接続した。

もともとドア周辺の人間の歩行をセンシングしたくてセンサーを置いてみたのだけど、ドアのある場所をうまくノックすると反応していたのでノックで電子錠を開けれるようにした


これ
AndroidとNFCで研究室の鍵を開けるシステムができた
のどすこい認証バージョン

0

Lindaコマンド作った

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 ruby
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
Rubyだと$stdout.sync = trueを設定しておかないとpipeがうまく動かない。


["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が共有できたりする。

0

Lindaで離れた部屋の人々の活動を云々してリア充化する

Ruby上に並列言語拡張Lindaを実装してWebSocket/Cometで使えるようにした
の続き。


諸事情あって研究室がSFC内で3箇所に分散している。
しかし分散していても学食に誘ったりとかしたい。

その為には
– 別の部屋にいる気配を感じる手段
– メシに誘う手段
が必要なので、Lindaで作った。


shokai/linda-light-notify · GitHub

デルタ棟の部屋の電灯がon/offされたら、他の部屋のMacが「デルタ棟で電気が点きました」「消えました」と喋ったり、研究室のskype chatやtwitterに投稿したりする。
もちろん他の部屋で電気ついたり消えたりしたらデルタ棟にも通知される。
プログラムはこれ1つを動かしておくだけで、全部屋の装置が連携する。


RocketIO上に実装されたLindaは分散並列処理のための共有メモリであり、そこには各部屋に設置された光センサーのデータを毎秒書き込むプログラムや、
共有メモリを監視して各部屋のMacがしゃべったりskypeに投稿したりtwitterに投稿したりというプログラムがぶら下がっている。


つまり、光センサーを監視して(共有メモリをreadして)、各通知用プログラムに流す(共有メモリにwriteする)だけでいい。



メシに誘う手段としてはこういうボタンがあるWebページがLinda RocketIOでは作れる。押せば向こうの部屋で音が出る。

先生に言われてなんとなくLinda実装したんだけど、既に10種類以上のプログラムが物理的に別の場所のマシンで動いていてバリバリ連携してて、全然落ちないし落ちても勝手に復活するし、テスト用のダミーデータもWebから投入できるし、ようやくまともなユビキタスコンピューティング実装環境できたなという感想ある。

0

em-rocketio-linda-clientを作った

インストール

% gem install em-rocketio-linda-client

pure EventMachine実装なので高速。

Lindaで音楽を再生するやつでplayしながらstopタプルを待ち受けるのに使っている。

0

LindaRocketIOでチャットを実装した

http://dev.shokai.org/linda/chat/
http://sho.masuilab.org/chat/
どちらで喋っても同じチャットルームにつながる。


ソースコード
shokai/linda-chat · GitHubJavaScript29行でできた。


HTMLとJavaScriptだけで実装した。
サーバーは http://linda.shokai.org/ のタプル空間を使っていて、そこへの接続はlinda.jsを使っている。

linda.js(の中で使っているrocketio.js)はクロスドメイン接続ができるので、チャットサーバーを実装しなくても、汎用の共有メモリ空間であるlinda-baseに接続すればwebsocket/cometで高速でサーバープッシュなチャットが作れる。


次はLindaでジョブキューを実装する。