Linda implementation on Sinatra RocketIO
Ruby JavaScript
Fetching latest commit…
Cannot retrieve the latest commit at this time.
Permalink
Failed to load latest commit information.
bin
lib
sample
test
.gitignore
Gemfile
Gemfile.lock
HEADER.erb
History.txt
LICENSE.txt
README.md
Rakefile
linda.js
linda.min.js
sinatra-rocketio-linda.gemspec

README.md

sinatra-rocketio-linda

Installation

% gem install sinatra-rocketio-linda

Requirements

Linda

Linda is a coordination launguage for parallel programming.

TupleSpace

Shared memory on Sinatra.

Tuple Operations

  • write( tuple, options )
    • put a Tuple into the TupleSpace
  • take( tuple, callback(tuple) )
    • get a matched Tuple from the TupleSpace and delete
  • read( tuple, callback(tuple) )
    • get a matched Tuple from the TupleSpace
  • watch( tuple, callback(tuple) )
    • overwatch written Tuples in the TupleSpace

see details on https://github.com/shokai/linda-ruby#usage

Usage

Setup

Server Side

require 'sinatra'
require 'sinatra/rocketio'
require 'sinatra/rocketio/linda'
set :linda, :expire_check => 60

run Sinatra::Application

Client Side

<script src="//ajax.googleapis.com/ajax/libs/jquery/1.9.1/jquery.min.js"></script>
<script src="<%= linda_js %>"></script>
var io = new RocketIO().connect();
var linda = new Linda(io);

client / worker

client side

// create tuplespace
var ts = new linda.TupleSpace("calc");

// request
$("#btn_request").click(function(){
  ts.write(["calc_request", "1-2+3*4"]);
});

// wait result
var take_result = function(){
  ts.take(["calc_result"], function(tuple, info){
    var result = tuple[1]; // from 'worker' side
    console.log(result);
    take_result(); // recursive call
  });
};
io.on("connect", take_result); // RocketIO's "connect" event

worker side

// create tuplespace
var ts = new linda.TupleSpace("calc");

// calculate
var calc = function(){
  ts.take(["calc_request"], function(tuple, info){
    var query = tuple[1]; // => "1-2+3*4"
    var result = eval(query);
    console.log(query+" = "+result); // => "1-2+3*4 = 11"
    ts.write(["calc_result", result]); // return to 'client' side
    calc(); // recursive call
  });
};
io.on("connect", calc); // RocketIO's "connect" event

worker side (Ruby)

require 'rubygems'
require 'sinatra/rocketio/linda/client'

## create tuplespace
linda = Sinatra::RocketIO::Linda::Client.new 'http://localhost:5000'
ts = linda.tuplespace["calc"]

## calculate
calc = lambda{
  ts.take ["calc_request"] do |tuple, info|
    query = tuple[1] ## => "1-2+3*4"
    result = eval(query)
    puts "calc: #{query} = #{result}" ## => "1-2+3*4 = 11"
    ts.write ["calc_result", result]  ## return to 'client' side
    calc.call ## recursive call
  end
}

linda.io.on :connect do  ## RocketIO's "connect" event
  puts "connect #{io.session}"
  calc.call
end

linda.wait

linda-rocketio command

% lidna-rocketio --help
% linda-rocketio write -tuple '["say","hello"]' -base http://example.com -space test
% linda-rocketio read  -tuple '["say","hello"]' -base http://example.com -space test

JavaScript Lib for browser

Download

Usage

<script src="//ajax.googleapis.com/ajax/libs/jquery/2.0.0/jquery.min.js"></script>
<script src="/linda.min.js"></script>
var io = new RocketIO().connect("http://example.com");
var linda = new Linda(io);

var ts = new linda.TupleSpace("calc");

io.on("connect", function(){
  alert(io.type + " connect!! " + io.session);
  ts.write([1, 2, 3]);
});

Generate JS Lib

% npm install -g uglify-js
% gem install bundler
% bundle install
% rake jslib

=> linda.js and linda.min.js

Test

% gem install bundler
% bundle install

start server

% rake test_server

run test

% rake test

Contributing

  1. Fork it
  2. Create your feature branch (git checkout -b my-new-feature)
  3. Commit your changes (git commit -am 'Add some feature')
  4. Push to the branch (git push origin my-new-feature)
  5. Create new Pull Request