Skip to content
master
Go to file
Code

Latest commit

 

Git stats

Files

Permalink
Failed to load latest commit information.
Type
Name
Latest commit message
Commit time
bin
 
 
lib
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 

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

About

Linda implementation on Sinatra RocketIO

Resources

License

You can’t perform that action at this time.