0

Web版Lindaによる実世界コンピューティング

8/24(日)のプログラミングシンポジウム(夏)で発表してきたスライド。
少し修正したり、質疑応答の内容とかも追加した。

Lindaをnodeとsocket.ioで実装したら便利だったので、色々使ってるよという話をした。



俺の周囲ではLindaとは何なのか説明しなければならない人しかいなかったので、プレゼンの最初のほうで「Linda知ってる人〜」って言ったら15人ぐらい手あがって完全アウェーに来たと思った。

懇親会で、昔Linda使ってた人とかに褒められてうれしかった。

0

Node.jsで実世界UI

先週のReal.UIで発表してきたスライドです。ハードウェアとかNode.jsでやったほうが安定するしいいよという話をした。

会場のスマートニュース社は勉強会とかできる場所とオフィスとその真ん中にビールとか置いてあるカウンターがあってフロアがスコーンと抜けるように全部見えてて広々していた。ビール何種類もあってよかった。おいしかったです。



あと発表後にBlendMicroを買えるページがわからない、って言われて、その場で調べてみたらたしかにBlendMicroのサイトわかりづらい。

ここで買った。
Blend Micro [AH00007] – €25.40 : Arduino Store – community and electronics

通常のarduinoよりも低い3Vで駆動するので、太陽電池でも動かせたりする。面白い。

0

linda-socket.ioのjob-queueサンプルをherokuに置いた

前:NodeにLindaを実装した

linda-socket.ioはsocket.io上に実装してるので、herokuでも動く。


http://linda-job-queue-sample.herokuapp.com

ソースコード https://github.com/node-linda/linda-job-queue-sample
lindaなので、サーバー側でlindaにsocket.ioを読むだけで、サーバー側のコードまったく書く必要なくクライアント側だけでメッセージングできる。


完全にこれをnodeに移植しただけなので解説は割愛する
Lindaによるブラウザ上での分散処理の例

0

NodeにLindaを実装した

艦これの冬のイベントやりながらcoffee書いてたらLindaができた。おかげで三隈大和大鳳以外全部集まったけどコミケに行けなかった。

前にRubyで実装したこれ
Ruby上に並列言語拡張Lindaを実装してWebSocket/Cometで使えるようにした


Node+Socket.IOで実装しなおした。
https://npmjs.org/package/linda-socket.io

RubyよりNode+coffeeの方が並列処理書きやすい。特に本体よりもテスト、coffee+asyncにだいぶ助けられた。あとなんだかんだでEventMachineに気を使って書くのが疲れる。
Node版はタプルに配列が使えないようにした。全部Object(hash)にした。流れているデータを読んで意味がわかりにくいのと、request-response形式で返すタイプの時にマッチングがしにくいため。


インストール

npmでインストールできる。

npm install linda-socket.io


使う

Socket.IOのインスタンスを食わせると既存のSocket.IOの通信を邪魔せずにLinda機能が増える。


ふつうnodeでwebアプリ作るとしたらhttp.createServerとsocket.ioでやると思うけど、それらのインスタンスをLindaに渡せば使えるようになる。
var http = require('http');

var app_handler = function(req, res){
// your web app code
};

var app = http.createServer(app_handler);

var io = require('socket.io').listen(app);

var linda = require('linda-socket.io').Linda.listen({io: io, server: app});

app.listen(3000);
console.log("server start - http://localhost:3000");


詳しくはUsageに書いた。

0

Lindaによるブラウザ上での分散処理の例

いわゆる分散処理の例を作ってあってsinatra-rocketio-lindaのsampleの中に入れてあったんだけど、blogに書くのを忘れていたので書きます。
センサーのデータを流して受け取る、いわゆる「pub-sub」的な使い方の他にも、Hadoopがやっているようなタスク分散が簡単に書けるよという例です。


実行環境 http://hello-linda.shokai.org
ソースコード https://github.com/shokai/linda-hello-world


というのも昨日wise9さんに取り上げていただいて、そういえば全然サンプルコードとか整備・整理してない事を思い出したので書こうと思った。


PC遠隔操作編の拡張版みたいなやつです。


動かし方(ごく普通に実行)

clientworkerをそれぞれ開き、「request!」ボタンを押します。
worker側のウィンドウで式がevalで実行されます。

evalなのでclientに「alert(“hoge”)」とか書いてrequestすると、worker側でalertのダイアログがポップアップします。


動かし方(分散実行)

hadoop(map/reduce)がやっているような、仕事を複数のワーカーに分散実行させて結果を一箇所にまとめる処理をブラウザ上のJavaScriptだけで書けます。

まずclientを1つ開きます。
次にworkerを3つ開きます。
clientの「request!」ボタンを押すと、3つのworkerが順番に仕事してくれます。
webブラウザで実行されているので、workerのwebページを手持ちのスマホやタブレットで開けば分散実行に参加できます。



動かし方(仕事を貯めておいて実行)

仕事を貯めておいて、ワーカーが現れるまで待ちます。現れたら一気に実行されます。

まずclientを1つ開き、「requst!」ボタンを連打します。
次にworkerを1つ開くと、今まで溜まっていたrequestが一気に実行されます。



動作原理

3つとも同じコードです。Lindaのtake(削除しつつ読み出し)をうまく使うと、こういう処理が簡単に書けます


Lindaはだれでも読み書きできるタプルスペース(共有メモリ領域)を使った並列処理の実行環境です。

命令はwrite/read/take/watchという4種類しかありません。
writeは書き込み、readはマッチするタプル最新の1個を読み出し、takeはreadしながら削除です。
watchはマッチするタプルがwriteされた瞬間に通知されます。watchはセンサーデータをストリーミングする時などに便利です。

Lindaのタプル読み出しは少し特殊です。
takeとreadは要求しているタプル(データのこと。ArrayかHash)があれば即座に値を読み出しますが、見つからない場合、値が現れるまで待ちます。これが分散実行に使えます。

read/take/watchのマッチングは、「Arrayの前方一致」です。
つまり[“sensor”]は[“sensor”,”light”,20]にマッチするし、[“sensor”,”temperature”, 25]にもマッチします。
[“sensor”,”light”]に範囲を狭めると、[“sensor”,”light”,20]や[“sensor”,”light”, 123]にはマッチしますが、[“sensor”,”temperature”,25]等にはマッチしません。
「Arrayの前方一致」なので、1つ目の要素が”sensor”で2つ目の要素が”light”なタプルにしかマッチしないのです。

タプルの構造によってどんなデータが欲しいかを指定します。


タプルスペースはなんでも入れられるハブです。そこにクライアントをぶら下げるとread/take/watchを駆使してイベント駆動でデータを受け取ると便利だよという事ですね。

ちなみに「だれでも読み書きできる共有メモリ空間」なのですが、Lindaの実装はRubyのwebアプリケーションフレームワーク「Sinatra」のプラグインになっています。
Sinatraでログイン画面とか作れば、特定の人しか書き込みできないようにするとか、ユーザー毎にタプルスペースを分けるとかも可能です。


あとで書く

Lindaでの色々なパターンでのデータの流し方とその例をまとめる
  • pipeline
  • pub-sub
  • req-res
  • job-queue
  • broadcast
  • multisub