Tuesday, 18 March 2014
Asynchronous download using Coroutine - Lua
require("socket")
function download()
local host, file, port = "www.w3.org", "/TR/REC-html32.html", 80
local connection = assert(socket.connect(host, port))
local count = 0 -- counts number of bytes read
connection:send("GET " .. file .. " HTTP/1.0\r\n\r\n")
while true do
local response, status = receive(connection)
if(response ~= nill) then count = count + string.len(response) end
--print(response)
if status == "closed" then break end
end
connection:close()
print(file, count)
end
--[[function receive(connection)
connection:settimeout(0)
return connection:receive(2^10)
end]]--
function receive(connection)
connection:settimeout(0) -- do not block
local response, status = connection:receive(2^10)
if status == "timeout" then
coroutine.yield(connection)
end
return response, status
end
threads = {} -- list of all live threads
function get ()
-- create coroutine
local co = coroutine.create(function () download() end)
-- insert it in the list
table.insert(threads, co)
end
function dispatcher()
while true do
local count = table.getn(threads)
if(count <= 0) then break end
for i = 1, count do
local status, ret = coroutine.resume(threads[i])
if not ret then table.remove(threads, i) break end
end
end
end
get()
get()
get()
get()
get()
dispatcher()
function download()
local host, file, port = "www.w3.org", "/TR/REC-html32.html", 80
local connection = assert(socket.connect(host, port))
local count = 0 -- counts number of bytes read
connection:send("GET " .. file .. " HTTP/1.0\r\n\r\n")
while true do
local response, status = receive(connection)
if(response ~= nill) then count = count + string.len(response) end
--print(response)
if status == "closed" then break end
end
connection:close()
print(file, count)
end
--[[function receive(connection)
connection:settimeout(0)
return connection:receive(2^10)
end]]--
function receive(connection)
connection:settimeout(0) -- do not block
local response, status = connection:receive(2^10)
if status == "timeout" then
coroutine.yield(connection)
end
return response, status
end
threads = {} -- list of all live threads
function get ()
-- create coroutine
local co = coroutine.create(function () download() end)
-- insert it in the list
table.insert(threads, co)
end
function dispatcher()
while true do
local count = table.getn(threads)
if(count <= 0) then break end
for i = 1, count do
local status, ret = coroutine.resume(threads[i])
if not ret then table.remove(threads, i) break end
end
end
end
get()
get()
get()
get()
get()
dispatcher()
Tuesday, 4 March 2014
Permutations using Coroutines in Lua
First let's look at the algorithm for Permutations using recursion
algorithm Permutation(array, count)
if array index is 0, display the array
for each item in array until count
swap last and first item
Permutation(array, count -1)
swap last and first item
end
end
now the code
function permuterate (a, n)
if n == 0 then
--printResult(a)
coroutine.yield(a)
else
for i=1,n do
--print("iteration=", i, "n=", n, "last=", a[n], "i th=",a[i])
-- put i-th element as the last one
a[n], a[i] = a[i], a[n]
-- generate all permutations of the other elements
permuterate(a, n - 1)
--print("i=", i, "n=", n, "last=", a[n], "i th=",a[i])
-- restore i-th element
a[n], a[i] = a[i], a[n]
end
end
end
function printResult (a)
for i,v in ipairs(a) do
io.write(v, " ")
end
io.write("\n")
end
function createPermuterate(list)
local pick = table.getn(list)
local co = coroutine.create(function () permuterate(list, pick) end)
return function()
local _, value = coroutine.resume(co)
return value
end
end
function createPermuterate1(list)
local pick = table.getn(list)
return coroutine.wrap(function () permuterate(list, pick) end)
end
for p in createPermuterate{"1","2","3";n=3} do
printResult(p)
end
for p in createPermuterate1{1,2,3;n=3} do
printResult(p)
end
algorithm Permutation(array, count)
if array index is 0, display the array
for each item in array until count
swap last and first item
Permutation(array, count -1)
swap last and first item
end
end
now the code
function permuterate (a, n)
if n == 0 then
--printResult(a)
coroutine.yield(a)
else
for i=1,n do
--print("iteration=", i, "n=", n, "last=", a[n], "i th=",a[i])
-- put i-th element as the last one
a[n], a[i] = a[i], a[n]
-- generate all permutations of the other elements
permuterate(a, n - 1)
--print("i=", i, "n=", n, "last=", a[n], "i th=",a[i])
-- restore i-th element
a[n], a[i] = a[i], a[n]
end
end
end
function printResult (a)
for i,v in ipairs(a) do
io.write(v, " ")
end
io.write("\n")
end
function createPermuterate(list)
local pick = table.getn(list)
local co = coroutine.create(function () permuterate(list, pick) end)
return function()
local _, value = coroutine.resume(co)
return value
end
end
function createPermuterate1(list)
local pick = table.getn(list)
return coroutine.wrap(function () permuterate(list, pick) end)
end
for p in createPermuterate{"1","2","3";n=3} do
printResult(p)
end
for p in createPermuterate1{1,2,3;n=3} do
printResult(p)
end
Labels:
coroutine,
Lua,
permutation
Location:
Bangalore, Karnataka, India
Coroutine in Lua - Consumer driven Producer-Consumer implementation
function send(task)
coroutine.yield(task)
end
function receive()
return coroutine.resume(co)
end
function consumer()
while true do
local _, task = receive()
if(task == nil) then break end
print("Processed item", task)
end
end
co = coroutine.create(function ()
local file = io.open("io.txt", "r")
while true do
local task = file:read("*line")
if(task ~= nil) then
send(task)
print("waiting for consumer to signal")
else
break
end
end
end)
consumer()
coroutine.yield(task)
end
function receive()
return coroutine.resume(co)
end
function consumer()
while true do
local _, task = receive()
if(task == nil) then break end
print("Processed item", task)
end
end
co = coroutine.create(function ()
local file = io.open("io.txt", "r")
while true do
local task = file:read("*line")
if(task ~= nil) then
send(task)
print("waiting for consumer to signal")
else
break
end
end
end)
consumer()
Location:
Bangalore, Karnataka, India
Friday, 14 February 2014
Closure, Coroutine, Idempotent and Reentrancy
Closure - First class function that have access to free variables in a lexical environment
Coroutine - is a subroutine that have multiple entry points for suspending and resuming at certain locations - ex, C# we can use yield.
Idempotent - is an operation that be called multiple times without changing the result beyond initial application - ex, Cancel Order/Change address are idempotent, but Placing an order is not.
Reentrant - a re-entrant block of code is one that can be entered by another actor before an earlier invocation has finished, without affecting the path that the first actor would have taken through the code. That is, it is possible to re-enter the code while it's already running and still produce correct results.
Virtual Machine - Software emulation of a computer, two types - System VM and Process VM. Process VM provides portability and flexibility, and is bound to a single process. Loads when process load, and unloads when process goes out of scope. Process will be restricted to the resources/abstraction provided by VM. CLR is an example of Process VM
Coroutine - is a subroutine that have multiple entry points for suspending and resuming at certain locations - ex, C# we can use yield.
Idempotent - is an operation that be called multiple times without changing the result beyond initial application - ex, Cancel Order/Change address are idempotent, but Placing an order is not.
Reentrant - a re-entrant block of code is one that can be entered by another actor before an earlier invocation has finished, without affecting the path that the first actor would have taken through the code. That is, it is possible to re-enter the code while it's already running and still produce correct results.
Virtual Machine - Software emulation of a computer, two types - System VM and Process VM. Process VM provides portability and flexibility, and is bound to a single process. Loads when process load, and unloads when process goes out of scope. Process will be restricted to the resources/abstraction provided by VM. CLR is an example of Process VM
Thursday, 13 February 2014
C# Closure
As per wiki, Closure is a first class function with free variables that are bound in the lexical environment.
First class function is function that are treated as variable. C# we have delegates.
Free variables, are ones that are accessible to function which are not either passed as argument or defined locally.
Lexical environment means scope.
We call it closure because, first class function closes the variable it refers. In the example below, though myVar goes out of scope after first inc(), it is closed by the first class function(inc). It would print 7 & 9.
First class function is function that are treated as variable. C# we have delegates.
Free variables, are ones that are accessible to function which are not either passed as argument or defined locally.
Lexical environment means scope.
We call it closure because, first class function closes the variable it refers. In the example below, though myVar goes out of scope after first inc(), it is closed by the first class function(inc). It would print 7 & 9.
static void Main(string[] args){ var inc = GetAFunc(); Console.WriteLine(inc(5)); Console.WriteLine(inc(6));}public static Func<int,int> GetAFunc(){ var myVar = 1; Func<int, int> inc = delegate(int var1) { myVar = myVar + 1; return var1 + myVar; }; return inc;}
Labels:
c#
Location:
Bangalore, Karnataka, India
Tuesday, 17 December 2013
The Network Device Enrollment Service received an http message without the "Operation" tag, or with an invalid "Operation" tag.
We were facing this issue on one of our Microsoft NDES server setup, when tried to enrol/request certificate. IIS logs(C:\inetpub\logs\LogFiles\W3SVC1) shows the http response code being returned is 404.15.
So server denies our request because while enrol/requesting certificate, we need to send the CSR(certificate response)in query string, so length is big. Checking the CertSrv/mscep's Request Filtering/Max Query String(bytes) setting on that erroneous server was 2048. Increasing this size to 65536 solved the issue. Between by default when you install NDES, the limit would be 65536, but looks like not always the case to be. We can also directly edit the values in applicatioHost.config(C:\Windows\system32\inetsrv\config)
HTTP Error 404.15 - Not Found
The request filtering module is configured to deny a request where the query string is too long.
So server denies our request because while enrol/requesting certificate, we need to send the CSR(certificate response)in query string, so length is big. Checking the CertSrv/mscep's Request Filtering/Max Query String(bytes) setting on that erroneous server was 2048. Increasing this size to 65536 solved the issue. Between by default when you install NDES, the limit would be 65536, but looks like not always the case to be. We can also directly edit the values in applicatioHost.config(C:\Windows\system32\inetsrv\config)
Labels:
CA,
Certificates,
Microsoft,
NDES
Location:
Bangalore, Karnataka, India
Subscribe to:
Posts (Atom)