<?xml version='1.0' encoding='UTF-8'?><?xml-stylesheet href="http://www.blogger.com/styles/atom.css" type="text/css"?><feed xmlns='http://www.w3.org/2005/Atom' xmlns:openSearch='http://a9.com/-/spec/opensearchrss/1.0/' xmlns:georss='http://www.georss.org/georss' xmlns:gd='http://schemas.google.com/g/2005' xmlns:thr='http://purl.org/syndication/thread/1.0'><id>tag:blogger.com,1999:blog-2340686390336722114</id><updated>2012-01-11T01:30:54.703-05:00</updated><category term='Rx'/><category term='C++'/><category term='howstuffworks'/><category term='emacs'/><category term='python'/><category term='erlang'/><category term='fp'/><category term='unix'/><category term='optimization'/><category term='dsl'/><category term='microsoft'/><category term='memory'/><category term='msbuild'/><category term='book'/><category term='Rx Concurrency'/><category term='.NET'/><title type='text'>Privosoft LLC Blog</title><subtitle type='html'></subtitle><link rel='http://schemas.google.com/g/2005#feed' type='application/atom+xml' href='http://blog.privosoft.com/feeds/posts/default'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/2340686390336722114/posts/default?max-results=100'/><link rel='alternate' type='text/html' href='http://blog.privosoft.com/'/><link rel='hub' href='http://pubsubhubbub.appspot.com/'/><author><name>Privosoft LLC</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><generator version='7.00' uri='http://www.blogger.com'>Blogger</generator><openSearch:totalResults>31</openSearch:totalResults><openSearch:startIndex>1</openSearch:startIndex><openSearch:itemsPerPage>100</openSearch:itemsPerPage><entry><id>tag:blogger.com,1999:blog-2340686390336722114.post-8123758264619110699</id><published>2011-11-02T17:31:00.004-05:00</published><updated>2011-11-02T17:35:48.954-05:00</updated><title type='text'>Web conference software</title><content type='html'>Once in a while we have a need to do web conferences. This need does not come up very often; for most purposes we are quite happy with Skype. However if you have a real conference going on (ie multiple people), or you need to share your desktop with someone who does not have Skype installed a tool like Webex is quite handy, however it costs money. Being so very thrifty, we did a little searching and found this little nugget: &lt;font size="3"&gt;&lt;a href="http://vyew.com"&gt;http://vyew.com&lt;/a&gt;&lt;/font&gt;; this little guy has a quite capable free version of web conferencing. We were able to share a desktop quite nicely. The only thing you need installed on host/client PC is java; which most of us should have by now.

Let's just hope it does not get bought and killed like &lt;a href="http://dimdim.com"&gt;http://dimdim.com&lt;/a&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/2340686390336722114-8123758264619110699?l=blog.privosoft.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://blog.privosoft.com/feeds/8123758264619110699/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=2340686390336722114&amp;postID=8123758264619110699' title='1 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/2340686390336722114/posts/default/8123758264619110699'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/2340686390336722114/posts/default/8123758264619110699'/><link rel='alternate' type='text/html' href='http://blog.privosoft.com/2011/11/web-conference-software.html' title='Web conference software'/><author><name>Privosoft LLC</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-2340686390336722114.post-7054558460085400808</id><published>2011-06-01T18:46:00.001-05:00</published><updated>2011-06-01T18:47:11.139-05:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='.NET'/><title type='text'>nuget</title><content type='html'>&lt;p&gt;
&lt;div class="separator" style="clear: both; text-align: center;"&gt;
&lt;a href="http://www.nuget.org" style="clear:left; float:left;margin-right:1em; margin-bottom:1em"&gt;&lt;img border="0" height="140" width="200" src="http://nuget.org/Themes/NugetGallery/Content/Images/contribGraphic.png" /&gt;&lt;/a&gt;&lt;/div&gt;


Discovery of the week dependency and package management for .net: &lt;a href="http://www.nuget.org"&gt;NUGET&lt;/a&gt;
&lt;/p&gt;&lt;p&gt;
Actually using it on one of our WPF .NET 4 project, after 2 hours of using it so far looks looks pretty solid, with pretty good tooling support in VS 2010.
&lt;/p&gt;&lt;p&gt;
One caveat, the &lt;i&gt;Package Manager Console&lt;/i&gt; is kind of neat, but seems to be inferior to nuget.exe (especially when creating new packages).
&lt;/p&gt;&lt;p&gt;
A very solid, newer (may 2011) in depth video on use and features of nuget get is &lt;a href="http://channel9.msdn.com/Events/TechEd/NorthAmerica/2011/DEV338"&gt;on channel 9&lt;/a&gt;
&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/2340686390336722114-7054558460085400808?l=blog.privosoft.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://blog.privosoft.com/feeds/7054558460085400808/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=2340686390336722114&amp;postID=7054558460085400808' title='1 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/2340686390336722114/posts/default/7054558460085400808'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/2340686390336722114/posts/default/7054558460085400808'/><link rel='alternate' type='text/html' href='http://blog.privosoft.com/2011/06/nuget.html' title='nuget'/><author><name>Privosoft LLC</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-2340686390336722114.post-1023481417276415476</id><published>2011-01-13T11:18:00.002-05:00</published><updated>2011-01-13T11:19:00.167-05:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Rx Concurrency'/><title type='text'>Rx.net ObserveOn performance</title><content type='html'>I been playing with benchmarking performance of pushing small messages via Rx where message producer and message consumer are on different threads. With one producer and possibly many consumers.
&lt;br/&gt;&lt;br/&gt;
Rx has a useful operator called ObserveOn, which let's you process messages on the threadpool. However it seems to have a couple of shortcomings. 
&lt;br/&gt;&lt;br/&gt;
1. It does not process several messages concurrently, although it is using a thread pool, it will process messages serially. So if message post processing done by the consumer is time consuming, you may want fork and join type of semantics (spin off N tasks, where N is the size of the thread pool), and then assemble the results in the right order and forward (right order is very important for correct Rx operation).
&lt;br/&gt;&lt;br/&gt;
2. Rx seems to be slow! I wrote a little benchmark that pushes small messages as fast as it can (messages are preallocated, so little memory allocator overhead in the test timing), then I implemented a synchronized queue (user ReaderWriterLockSlim and Queue&lt;T&gt;) to do same produce/consume logic, and the results are dramatically different, tests we done on a 2 core, 3 Ghz machine.
&lt;br/&gt;&lt;br/&gt;
With Rx I am getting around 220k msg/sec, with my hand coded queue, I am getting a wopping (compared to Rx), 4m msg/sec, that is 20x faster than Rx.
&lt;br/&gt;&lt;br/&gt;
Source code for the benchmark is here (note to self, clean up):
&lt;br/&gt;
&lt;a href="https://gist.github.com/90983196d1a45e91d11e"&gt;https://gist.github.com/90983196d1a45e91d11e&lt;/a&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/2340686390336722114-1023481417276415476?l=blog.privosoft.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://blog.privosoft.com/feeds/1023481417276415476/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=2340686390336722114&amp;postID=1023481417276415476' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/2340686390336722114/posts/default/1023481417276415476'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/2340686390336722114/posts/default/1023481417276415476'/><link rel='alternate' type='text/html' href='http://blog.privosoft.com/2011/01/rxnet-observeon-performance.html' title='Rx.net ObserveOn performance'/><author><name>Privosoft LLC</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-2340686390336722114.post-2426001042363765515</id><published>2011-01-03T14:10:00.003-05:00</published><updated>2011-01-03T14:15:20.246-05:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='erlang'/><title type='text'>Erlang Ring Benchmark Part 3</title><content type='html'>In &lt;a href="http://blog.privosoft.com/2011/01/erlang-ring-benchmark-part-2.html"&gt;Ring Benchmark Part 2&lt;/a&gt; I presented a more compact solution to the ring benchmark. It's performance is about same as the original solution that was using pure recursion to setup the ring.

Both part 1 and part 2 were waiting for a message to go around the ring completely, before injecting the next message. 

In this version we will inject messages 1 through M as soon as the ring is setup, this considerably improves throughput. Line 10 below is the part where we spawn off a process to inject M..0 messages into the ring.

&lt;h3&gt;Timings Across Part 1-3&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;Part 1: N=1000, M=1000, Run Time = 600 ms&lt;/li&gt;
&lt;li&gt;Part 2: N=1000, M=1000, Run Time = 600 ms&lt;/li&gt;
&lt;li&gt;Part 3: N=1000, M=1000, Run Time = 400 ms&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;Code&lt;/h3&gt;
&lt;pre class="brush: c#"&gt;
-module(ring3_2).
-include("debug.hrl").
-export([start/2]).
%% ring benchmark using lists methods
start(N, M) -&gt;
    io:format("Starting ring benchmark on pid=~p, N = ~p, M = ~p.~n", [self(), N, M]),
    statistics(wall_clock),
    statistics(runtime),
    Last = lists:foldl(fun (X, Pid) -&gt; spawn(fun () -&gt; loop(X, Pid) end) end, self(), lists:seq(N-1, 1, -1)),    
    spawn(fun () -&gt; lists:foreach(fun (X) -&gt; Last ! X end, lists:seq(M-1, 0, -1)) end),
    wait(),
    {_, WC} = statistics(wall_clock),
    {_, RT} = statistics(runtime),
    io:format("Done running ring benchmark in Wall Clock = ~p, Runtime = ~p.~n", [WC, RT]).

wait() -&gt;
    receive
 Xm when Xm =:= 0 -&gt; 
     ?DEBUG("main node done waiting for x = ~p.~n", [Xm]),
     void;
 Xm -&gt; ?DEBUG("main node done waiting for x = ~p.~n", [Xm]), wait()       
    end.

loop(Nth, Pid) -&gt;
    receive
 X when X =:= 0 -&gt; 
     ?DEBUG("~p dying.~n", [Nth]),
     Pid ! X;
 X -&gt; 
     ?DEBUG("~p got message ~p.~n", [Nth, X]), 
     Pid ! X,
     loop(Nth, Pid)
    end.
&lt;/pre&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/2340686390336722114-2426001042363765515?l=blog.privosoft.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://blog.privosoft.com/feeds/2426001042363765515/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=2340686390336722114&amp;postID=2426001042363765515' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/2340686390336722114/posts/default/2426001042363765515'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/2340686390336722114/posts/default/2426001042363765515'/><link rel='alternate' type='text/html' href='http://blog.privosoft.com/2011/01/erlang-ring-benchmark-part-3.html' title='Erlang Ring Benchmark Part 3'/><author><name>Privosoft LLC</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-2340686390336722114.post-2839166313484516768</id><published>2011-01-03T14:02:00.002-05:00</published><updated>2011-01-03T14:03:31.958-05:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='erlang'/><title type='text'>Erlang Ring Benchmark Part 2</title><content type='html'>Using list comprehensions - results in more compact code.

&lt;pre class="brush: c#"&gt;
-module(ring3).
-include("debug.hrl").
-export([start/2]).
%% ring benchmark using lists methods
start(N, M) -&gt;
    io:format("Starting ring benchmark on pid=~p, N = ~p, M = ~p.~n", [self(), N, M]),
    statistics(wall_clock),
    statistics(runtime),
    Last = lists:foldl(fun (X, Pid) -&gt; spawn(fun () -&gt; loop(X, Pid) end) end, self(), lists:seq(N-1, 1, -1)),    
    lists:foreach(fun (X) -&gt; send(X, Last) end, lists:seq(M-1, 0, -1)),
    {_, WC} = statistics(wall_clock),
    {_, RT} = statistics(runtime),
    io:format("Done running ring benchmark in Wall Clock = ~p, Runtime = ~p.~n", [WC, RT]).

send(X, Pid) -&gt;
    ?DEBUG("sending X=~p to ring.~n", [X]),
    Pid ! X,
    receive
 Xm -&gt; ?DEBUG("main node done waiting for x = ~p.~n", [Xm])
    end.

loop(Nth, Pid) -&gt;
    receive
 X when X =:= 0 -&gt; 
     ?DEBUG("~p dying.~n", [Nth]),
     Pid ! X;
 X -&gt; 
     ?DEBUG("~p got message.~n", [Nth]), 
     Pid ! X,
     loop(Nth, Pid)
    end.
           

&lt;/pre&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/2340686390336722114-2839166313484516768?l=blog.privosoft.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://blog.privosoft.com/feeds/2839166313484516768/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=2340686390336722114&amp;postID=2839166313484516768' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/2340686390336722114/posts/default/2839166313484516768'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/2340686390336722114/posts/default/2839166313484516768'/><link rel='alternate' type='text/html' href='http://blog.privosoft.com/2011/01/erlang-ring-benchmark-part-2.html' title='Erlang Ring Benchmark Part 2'/><author><name>Privosoft LLC</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-2340686390336722114.post-9142589166342940368</id><published>2010-12-28T14:46:00.004-05:00</published><updated>2010-12-29T23:22:58.460-05:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='erlang'/><title type='text'>Erlang Ring Benchmark</title><content type='html'>I am reading &lt;a href="http://goo.gl/PDLSA"&gt;Joe Armstrong's Programming Erlang: Software for a Concurrent World&lt;/a&gt;, in chapter 8 he poses a little challenge to create a ring benchmark:
&lt;blockquote&gt;Write a ring benchmark. Create N processes in a ring. Send a mes-
sage round the ring M times so that a total of N * M messages get
sent. Time how long this takes for different values of N and M. &lt;/blockquote&gt;

My solution is below... It was fun.

&lt;h3&gt;Usage from erlang command line&lt;/h3&gt;
&lt;pre&gt;
1&gt; c(ring2).
2&gt; ring2:start(100, 1000). % ring size = 100, send msg 1000 times round the ring
... sample below ...
42&gt; ring2:start(300, 2000).
Starting ring benchmark on pid=&lt;0.30.0&gt;.
Done initializing nodes.
Got X(600000) &gt;= M(600000) in pid=&lt;0.30.0&gt;.
Done running ring benchmark in Wall Clock = 437, Runtime = 391.
ok
&lt;/pre&gt;
&lt;br/&gt;
The results above were obtained on a Core 2 Duo E8400 @ 3.00GHz
&lt;br/&gt;
&lt;h3&gt;ring2.erl&lt;/h3&gt;
&lt;br/&gt;
&lt;pre class="brush: c#"&gt;
-module(ring2).
-include("debug.hrl").
-export([start/2]).

%% ring benchmark

start(N, M) -&gt;
    io:format("Starting ring benchmark on pid=~p.~n", [self()]),
    statistics(wall_clock),
    statistics(runtime),
    NextPid = node(N-1, N*M, self(), self()),
    NextPid ! 1,
    io:format("Done initializing nodes.~n"),
    wait(N*M, NextPid, self()),
    NextPid ! die,
    {_, WC} = statistics(wall_clock),
    {_, RT} = statistics(runtime),
    io:format("Done running ring benchmark in Wall Clock = ~p, Runtime = ~p.~n", [WC, RT]).
     
node(1, M, NextPid, DonePid) -&gt;
    Pid = spawn(fun () -&gt; wait(M, NextPid, DonePid) end),
    ?DEBUG("Creating final node: ~p.~n", [Pid]),
    Pid;
node(N, M, NextPid, DonePid) -&gt; 
    Pid = spawn(fun () -&gt; wait(M, NextPid, DonePid) end),
    ?DEBUG("Creating node ~p = ~p.~n", [N, Pid]),
    node(N-1, M, Pid, DonePid).

wait(M, NextPid, DonePid) -&gt;
    receive
 die -&gt;
     ?DEBUG("~p dying.~n", [self()]),
     if NextPid =/= DonePid -&gt; NextPid ! die;
        true -&gt; void
     end,
     void;
 X when X &gt;= M -&gt; 
     io:format("Got X(~p) &gt;= M(~p) in pid=~p.~n", [X, M, self()]),
     DonePid ! die,
     wait(M, NextPid, DonePid);
 X   -&gt;
     ?DEBUG("Got X = ~p in pid=~p, fwd to ~p.~n", [X, self(), NextPid]),
     NextPid ! X+1,
     wait(M, NextPid, DonePid)
    end.     

&lt;/pre&gt;
&lt;br/&gt;
I am using a little debugging macro to turn logging on/off.
At erlang shell: &lt;i&gt;c(ring2, {d, debug})&lt;/i&gt;. to turn debugging trace on.
&lt;br/&gt;
&lt;h3&gt;debug.hrl&lt;/h3&gt;
&lt;br/&gt;
&lt;pre class="brush: c#"&gt;
-ifdef(debug).
-define(DEBUG(Format, Args), io:format("~s.~w: DEBUG: " ++ Format, [ ?MODULE, ?LINE | Args])).
-else.
-define(DEBUG(Format, Args), true).
-endif.

&lt;/pre&gt;

here are some solutions from other people: &lt;a href="http://goo.gl/kE42w"&gt;http://goo.gl/kE42w&lt;/a&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/2340686390336722114-9142589166342940368?l=blog.privosoft.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://blog.privosoft.com/feeds/9142589166342940368/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=2340686390336722114&amp;postID=9142589166342940368' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/2340686390336722114/posts/default/9142589166342940368'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/2340686390336722114/posts/default/9142589166342940368'/><link rel='alternate' type='text/html' href='http://blog.privosoft.com/2010/12/erlang-ring-benchmark.html' title='Erlang Ring Benchmark'/><author><name>Privosoft LLC</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-2340686390336722114.post-7359821884277780600</id><published>2010-12-27T12:25:00.002-05:00</published><updated>2010-12-27T12:27:16.207-05:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='book'/><title type='text'>Book Review: Beautiful Architecture</title><content type='html'>&lt;br /&gt;
&lt;table cellpadding="0" cellspacing="0" class="tr-caption-container" style="margin-left: auto; margin-right: auto; text-align: left;"&gt;&lt;tbody&gt;
&lt;tr&gt;&lt;td style="text-align: center;"&gt;&lt;a href="http://www.blogger.com/goog_1748471108" style="margin-left: auto; margin-right: auto;"&gt;&lt;img border="0" src="http://ecx.images-amazon.com/images/I/51r1TGf4CYL._SL500_PIsitb-sticker-arrow-big,TopRight,35,-73_OU01_SS75_.jpg" /&gt; Beautiful Architecture: Leading Thinkers Reveal the Hidden Beauty in Software Design by Diomidis Spinellis&lt;/a&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class="tr-caption" style="text-align: center;"&gt;&lt;a href="http://amzn.com/059651798X"&gt;&lt;span class="productTitle"&gt;&lt;span class="productTitle"&gt;&lt;br /&gt;&lt;/span&gt;&lt;span class="byLine"&gt;&lt;/span&gt;&lt;/span&gt;&lt;/a&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;/tbody&gt;&lt;/table&gt;
&lt;div style="margin-bottom: 0in;"&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;div style="margin-bottom: 0in;"&gt;
&lt;span style="font-family: Calibri,sans-serif; font-size: small;"&gt;I
got a chance to review one of the books in OReilly's "Beautiful"
series, in this case it was &lt;a href="http://amzn.com/059651798X"&gt;Beautiful Architecture.&lt;/a&gt; &lt;/span&gt;&lt;/div&gt;
&lt;div style="margin-bottom: 0in;"&gt;
&lt;span style="font-family: Calibri,sans-serif; font-size: small;"&gt;One
of the attractions of the books in this series, is the premise that
you get to hear first-hand accounts, in an essay format, from the
people behind some of the more interesting projects out there. So the
book can be viewed as an opportunity to ask a bunch of innovative
technologists the question: how did you build it?&lt;/span&gt;&lt;/div&gt;
&lt;div style="margin-bottom: 0in;"&gt;
&lt;span style="font-size: small;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;
&lt;div style="margin-bottom: 0in;"&gt;
&lt;span style="font-family: Calibri,sans-serif; font-size: small;"&gt;On
the back cover the book claims that the contributors cover notable
and innovative software architectures. At first glance the table of
contents looked pretty promising, for example “The architecture of
the Facebook platform”. However, after spending some time with the
book and reading through 5 random chapters, it feels like there is
just not enough substance for the book to achieve what most people
are probably hoping to get out of the book: concrete blueprints or
solid design patterns to build systems demonstrating desired
characteristics. &lt;/span&gt;
&lt;/div&gt;
&lt;div style="margin-bottom: 0in;"&gt;
&lt;span style="font-size: small;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;
&lt;div style="margin-bottom: 0in;"&gt;
&lt;span style="font-family: Calibri,sans-serif; font-size: small;"&gt;For
the first 45 or pages of the book, the essays tended to meander
around the topics of general definition of architecture vs software
design etc, and general experience of people working on some
non-trivial projects. But somehow the conversation always feels more
academic than practical. So you kind of feel like you are sitting on
a plane waiting for it to disengage from the gate and move towards
the tarmac. And given the fact that this book is supposed to be about
“beautiful” architectures, I am not at all sure why we need to
spend time reading about “The Messy Metropolis”. Given the  title
and general back cover description of the book I was expecting the
narratives to be more specific and more parallels drawn with
real-world systems that people interested in this book could be
building.&lt;/span&gt;&lt;/div&gt;
&lt;div style="margin-bottom: 0in;"&gt;
&lt;span style="font-size: small;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;
&lt;div style="margin-bottom: 0in;"&gt;
&lt;span style="font-family: Calibri,sans-serif; font-size: small;"&gt;The
chapter “Architecting for Scale” by Jim Waldo, was also a bit
underwhelming. We basically get a pretty high level overview of a
system that was never really tested in the field, was not thoroughly
bench-marked, and is addressing a fairly narrow problem domain of
online gaming. Although some interesting ideas are presented, you
have a hard time agreeing that this is necessarily beautiful because
it does not seem that the system is proven to successfully solve
their scalability goals. The chapter about facebook platform also
failed to describe the thinking process and design trade-offs, you
get a description of general building blocks but you don't really get
any aha moments.&lt;/span&gt;&lt;/div&gt;
&lt;div style="margin-bottom: 0in;"&gt;
&lt;span style="font-size: small;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;
&lt;div style="margin-bottom: 0in;"&gt;
&lt;span style="font-family: Calibri,sans-serif; font-size: small;"&gt;I
did enjoy “Software Architecture: Object-Oriented versus
Functional” by Bertrand Meyer, however one might argue that the
book might have been better off focusing on systems architecture and
concrete examples of real-world projects as opposed to discussion of
type systems and other programming language esoterica, especially
when the Meyer makes it clear that he has not actually worked in
finance nor released production systems dealing with financial
contracts.&lt;/span&gt;&lt;/div&gt;
&lt;div style="margin-bottom: 0in;"&gt;
&lt;span style="font-size: small;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;
&lt;div style="margin-bottom: 0in;"&gt;
&lt;span style="font-family: Calibri,sans-serif; font-size: small;"&gt;I
think this book is decent read on your e-book reader, but if you have
limited bookshelf space and want to keep it filled with true
classics, this book is not it.&lt;/span&gt;&lt;br /&gt;
&lt;br /&gt;
&lt;span style="font-family: Calibri,sans-serif; font-size: small;"&gt;&lt;span style="background-color: #fce5cd;"&gt;3/5 stars. &lt;/span&gt;&lt;/span&gt;&lt;/div&gt;
&lt;div style="margin-bottom: 0in;"&gt;
&lt;br /&gt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/2340686390336722114-7359821884277780600?l=blog.privosoft.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://blog.privosoft.com/feeds/7359821884277780600/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=2340686390336722114&amp;postID=7359821884277780600' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/2340686390336722114/posts/default/7359821884277780600'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/2340686390336722114/posts/default/7359821884277780600'/><link rel='alternate' type='text/html' href='http://blog.privosoft.com/2010/12/book-review-beautiful-architecture.html' title='Book Review: Beautiful Architecture'/><author><name>Privosoft LLC</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-2340686390336722114.post-2286342453427928294</id><published>2010-12-18T15:15:00.000-05:00</published><updated>2010-12-18T15:15:43.849-05:00</updated><title type='text'>Big Cities Make People More Efficient</title><content type='html'>From a NY Times article:&lt;span style="font-size: small;"&gt; &lt;a href="http://www.nytimes.com/2010/12/19/magazine/19Urban_West-t.html?_r=3&amp;amp;ref=magazine&amp;amp;pagewanted=all#"&gt;A Physicist Solves the City&lt;/a&gt;&lt;/span&gt;&lt;br /&gt;
&lt;blockquote&gt;
&lt;i&gt;The first data set they analyzed was on the economic productivity of 
American cities, and it quickly became clear that their working 
hypothesis — like elephants, cities become more efficient as they get 
bigger — was profoundly incomplete. According to the data, whenever a 
city doubles in size, every measure of economic activity, from 
construction spending to the amount of bank deposits, &lt;em style="background-color: white;"&gt;increases&lt;/em&gt;&lt;span style="background-color: white;"&gt;
 by approximately 15 percent per capita&lt;/span&gt;. It doesn’t matter how big the 
city is; the law remains the same. “This remarkable equation is why 
people move to the big city,” West says. “&lt;span style="background-color: #fff2cc;"&gt;Because you can take the same 
person, and if you just move them to a city that’s twice as big, then 
all of a sudden they’ll do 15 percent more of everything that we can 
measure.&lt;/span&gt;” While Jacobs could only speculate on the value of our urban 
interactions, West insists that he has found a way to “scientifically 
confirm” her conjectures. “One of my favorite compliments is when people
 come up to me and say, ‘You have done what Jane Jacobs would have done,
 if only she could do mathematics,’ ” West says. “What the data clearly 
shows, and what she was clever enough to anticipate, is that when people
 come together, they become much more productive.”        &lt;/i&gt;&lt;/blockquote&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/2340686390336722114-2286342453427928294?l=blog.privosoft.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://blog.privosoft.com/feeds/2286342453427928294/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=2340686390336722114&amp;postID=2286342453427928294' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/2340686390336722114/posts/default/2286342453427928294'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/2340686390336722114/posts/default/2286342453427928294'/><link rel='alternate' type='text/html' href='http://blog.privosoft.com/2010/12/big-cities-make-people-more-efficient.html' title='Big Cities Make People More Efficient'/><author><name>Privosoft LLC</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-2340686390336722114.post-755318832634953124</id><published>2010-12-16T13:29:00.002-05:00</published><updated>2010-12-16T13:31:00.805-05:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Rx'/><category scheme='http://www.blogger.com/atom/ns#' term='.NET'/><title type='text'>Rx.NET Subject useful for connecting decoupled components</title><content type='html'>Rx has a nifty abstraction called &lt;i&gt;Subject&lt;t1, t2=""&gt;&lt;/t1,&gt;&lt;/i&gt; shipped as part of the &lt;i&gt;System.Reactive&lt;/i&gt; assembly.&lt;br /&gt;
&lt;br /&gt;
It's basically a buffer with channel like capabilities rolling up an Obsever/Observable pattern into a single class.&lt;br /&gt;
&lt;br /&gt;
In cases where you have two or more classes that don't really know about each other but sometimes need to be connected (ie output of one should go into input of another), you can can inject an instance of a Subject class into both components, and then have them send messages. &lt;i&gt;Subject &lt;/i&gt;provides a standard Rx.NET friendly API to push/pull messages, this makes it quite powerful as you can use the full expressive power of Rx.NET to consume message from Subjects in different scenarios (one-to-one, one-to-many, filtering, Join, etc) .&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/2340686390336722114-755318832634953124?l=blog.privosoft.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://blog.privosoft.com/feeds/755318832634953124/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=2340686390336722114&amp;postID=755318832634953124' title='1 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/2340686390336722114/posts/default/755318832634953124'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/2340686390336722114/posts/default/755318832634953124'/><link rel='alternate' type='text/html' href='http://blog.privosoft.com/2010/12/rxnet-subject-useful-for-connecting.html' title='Rx.NET Subject useful for connecting decoupled components'/><author><name>Privosoft LLC</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-2340686390336722114.post-5396866106973160373</id><published>2010-11-17T13:04:00.000-05:00</published><updated>2010-11-17T13:04:20.679-05:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='.NET'/><title type='text'>Direct Edge stock exchange using .NET</title><content type='html'>Wow a major exchange, Direct Edge, is using .NET to run it's exchange.&lt;br /&gt;
&lt;br /&gt;
&lt;a href="http://blogs.technet.com/b/windowsserver/archive/2010/07/22/direct-edge-stock-exchange-launches-on-windows-server-sql-server.aspx"&gt;http://blogs.technet.com/b/windowsserver/archive/2010/07/22/direct-edge-stock-exchange-launches-on-windows-server-sql-server.aspx&lt;/a&gt;&lt;br /&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/2340686390336722114-5396866106973160373?l=blog.privosoft.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://blog.privosoft.com/feeds/5396866106973160373/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=2340686390336722114&amp;postID=5396866106973160373' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/2340686390336722114/posts/default/5396866106973160373'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/2340686390336722114/posts/default/5396866106973160373'/><link rel='alternate' type='text/html' href='http://blog.privosoft.com/2010/11/direct-edge-stock-exchange-using-net.html' title='Direct Edge stock exchange using .NET'/><author><name>Privosoft LLC</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-2340686390336722114.post-5178216335348106798</id><published>2010-11-17T12:50:00.003-05:00</published><updated>2010-12-29T08:40:00.228-05:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='.NET'/><category scheme='http://www.blogger.com/atom/ns#' term='C++'/><title type='text'>C++/CLI</title><content type='html'>Having spent a lot of time programming in C++ over the last few months, I have come to appreciate some of the features of the language, such as the powerful templating mechanism, which is quite a bit more powerful than the .NET generics. There are seem to be a few cases when one would have to resort to tricky reflection techniques in C#/VB.NET, which costs both in terms of runtime overhead and also in code mantainability.&lt;br /&gt;
&lt;br /&gt;
I have only recently became more acutely aware of the C++/CLI. Seems like it has a number of cool features that a worth a look:&lt;br /&gt;
&lt;ol&gt;
&lt;li&gt;template system similar to C++&lt;/li&gt;
&lt;li&gt;much cheaper mechanism to invoke native code (compared to PInvoke)&lt;/li&gt;
&lt;li&gt;possibility to mix and match managed and unmanaged memory pools for performance optimization.&lt;/li&gt;
&lt;/ol&gt;
There is a &lt;a href="http://msdn.microsoft.com/en-us/magazine/cc163681.aspx"&gt;pretty solid article from a solid C++ guy about C++/CLI.&lt;/a&gt;&lt;br /&gt;
&lt;br /&gt;
Here is an excerpt:&lt;br /&gt;
&lt;br /&gt;
&lt;blockquote&gt;
&lt;span style="font-family: &amp;quot;Trebuchet MS&amp;quot;, sans-serif; font-size: x-small;"&gt;C++/CLI represents a tuple. C++ refers, of course, to the C++ programming language invented by Bjarne Stroustrup at Bell Laboratories. It supports a static object model that is optimized for the speed and size of its executables. However, it doesn't support run-time modification of the program other than heap allocation. It allows unlimited access to the underlying machine, but very little access to the types active in the running program and no real access to the associated infrastructure of that program. Herb Sutter, a former colleague of mine at Microsoft and the chief architect of C++/CLI, refers to C++ as a concrete language.&lt;/span&gt; &lt;br /&gt;
&lt;span style="font-family: &amp;quot;Trebuchet MS&amp;quot;, sans-serif;"&gt;&lt;br /&gt;&lt;span style="font-size: x-small;"&gt;&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;
&lt;span style="font-family: &amp;quot;Trebuchet MS&amp;quot;, sans-serif; font-size: x-small;"&gt;CLI refers to the Common Language Infrastructure, a multitiered architecture supporting a dynamic component programming model. In many ways, this represents a complete reversal of the C++ object model. A runtime software layer, the virtual execution system, runs between the program and the underlying operating system. Access to the underlying machine is fairly constrained. Access to the types active in the executing program and the associated program infrastructure—both as discovery and construction—is supported. The slash (/) represents a binding between C++ and the CLI. The details surrounding this binding make up the general topic of this column.&lt;/span&gt;&lt;br /&gt;
&lt;span style="font-family: &amp;quot;Trebuchet MS&amp;quot;, sans-serif;"&gt;&lt;br /&gt;&lt;span style="font-size: x-small;"&gt;&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;
&lt;span style="font-family: &amp;quot;Trebuchet MS&amp;quot;, sans-serif; font-size: x-small;"&gt;So, a first approximation of an answer to what is C++/CLI is that it is a binding of the static C++ object model to the dynamic component object model of the CLI. In short, it is how you do .NET programming using C++ rather than C# or Visual Basic®. Like C# and the CLI itself, C++/CLI is undergoing standardization under the European Computer Manufacturers Association (ECMA) and eventually under ISO.&lt;/span&gt;&lt;br /&gt;
&lt;span style="font-family: &amp;quot;Trebuchet MS&amp;quot;, sans-serif;"&gt;&lt;br /&gt;&lt;span style="font-size: x-small;"&gt;&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;
&lt;span style="font-family: &amp;quot;Trebuchet MS&amp;quot;, sans-serif; font-size: x-small;"&gt;The common language runtime (CLR) is the Microsoft version of the CLI that is specific to the Windows® operating system. Similarly, Visual C++® 2005 is the implementation of C++/CLI.&lt;/span&gt;&lt;br /&gt;
&lt;span style="font-family: &amp;quot;Trebuchet MS&amp;quot;, sans-serif;"&gt;&lt;br /&gt;&lt;span style="font-size: x-small;"&gt;&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;
&lt;span style="font-family: &amp;quot;Trebuchet MS&amp;quot;, sans-serif; font-size: x-small;"&gt;As a second approximation of an answer, I would say that C++/CLI integrates the .NET programming model within C++ in the same way as, back at Bell Laboratories, we integrated generic programming using templates within the then existing C++. In both of these cases your investment in an existing C++ codebase and in your existing C++ expertise are preserved. This was an essential baseline requirement of the design of C++/CLI.&lt;/span&gt;&lt;br /&gt;
&lt;br /&gt;&lt;/blockquote&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/2340686390336722114-5178216335348106798?l=blog.privosoft.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://blog.privosoft.com/feeds/5178216335348106798/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=2340686390336722114&amp;postID=5178216335348106798' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/2340686390336722114/posts/default/5178216335348106798'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/2340686390336722114/posts/default/5178216335348106798'/><link rel='alternate' type='text/html' href='http://blog.privosoft.com/2010/11/ccli.html' title='C++/CLI'/><author><name>Privosoft LLC</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-2340686390336722114.post-6828158971280414873</id><published>2010-11-17T09:58:00.002-05:00</published><updated>2010-11-17T10:01:05.650-05:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='optimization'/><category scheme='http://www.blogger.com/atom/ns#' term='memory'/><category scheme='http://www.blogger.com/atom/ns#' term='howstuffworks'/><title type='text'>Memory Tour De Force</title><content type='html'>&lt;a href="http://lwn.net/Articles/250967/"&gt;What Every Programmer Should Know About Memory by Ulrich Drepper&lt;/a&gt;&lt;br /&gt;
&lt;br /&gt;
Fascinating, enlightening, extremely useful (memory speeds have not kept up with progress in raw computing power in modern computers see, beware of cpu stalling!). Expect it to take a couple of weeks to get through it and really digest all of it, it's a self-contained mini-course in electrical engineering...&lt;br /&gt;
&lt;br /&gt;
here is a diagram comparing memory access speed vs cpu speed evolution - notice the growing gap.&lt;br /&gt;
from another &lt;a href="http://research.scee.net/files/presentations/gcapaustralia09/Pitfalls_of_Object_Oriented_Programming_GCAP_09.pdf"&gt;excellent read showing how proper memory access&lt;/a&gt; can dramatically speed up your program. &lt;br /&gt;
&lt;div class="separator" style="clear: both; text-align: center;"&gt;
&lt;/div&gt;
&lt;div class="separator" style="clear: both; text-align: center;"&gt;
&lt;a href="http://1.bp.blogspot.com/_0sB_kfTI7ig/TOPt-HhRfwI/AAAAAAAAB_0/FB8E-yXGzMY/s1600/ScreenShot132.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="257" px="true" src="http://1.bp.blogspot.com/_0sB_kfTI7ig/TOPt-HhRfwI/AAAAAAAAB_0/FB8E-yXGzMY/s400/ScreenShot132.png" width="400" /&gt;&lt;/a&gt;&lt;/div&gt;
&lt;br /&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/2340686390336722114-6828158971280414873?l=blog.privosoft.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://blog.privosoft.com/feeds/6828158971280414873/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=2340686390336722114&amp;postID=6828158971280414873' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/2340686390336722114/posts/default/6828158971280414873'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/2340686390336722114/posts/default/6828158971280414873'/><link rel='alternate' type='text/html' href='http://blog.privosoft.com/2010/11/memory-tour-de-force.html' title='Memory Tour De Force'/><author><name>Privosoft LLC</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://1.bp.blogspot.com/_0sB_kfTI7ig/TOPt-HhRfwI/AAAAAAAAB_0/FB8E-yXGzMY/s72-c/ScreenShot132.png' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-2340686390336722114.post-7742703669401195783</id><published>2010-11-08T17:24:00.000-05:00</published><updated>2010-11-08T17:24:36.604-05:00</updated><title type='text'>Earth Equatorial Radius == 1.0 * Length Of Amazon River</title><content type='html'>Creepy coincidence or as-designed by aliens?&lt;br /&gt;
&lt;br /&gt;
&lt;a href="http://www.wolframalpha.com/input/?i=Earth%20equatorial%20radius"&gt;Earth Equator Radius&lt;/a&gt;&amp;nbsp;= &lt;a href="http://www.wolframalpha.com/input/?i=amazon+river+length"&gt;Amazon River Length&lt;/a&gt; = &lt;strong&gt;6400 km&lt;/strong&gt;&lt;br /&gt;
&lt;br /&gt;
Note, equator radius is not same as circumference (which is around 2*pi*r = 40,000 km)&lt;br /&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/2340686390336722114-7742703669401195783?l=blog.privosoft.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://blog.privosoft.com/feeds/7742703669401195783/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=2340686390336722114&amp;postID=7742703669401195783' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/2340686390336722114/posts/default/7742703669401195783'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/2340686390336722114/posts/default/7742703669401195783'/><link rel='alternate' type='text/html' href='http://blog.privosoft.com/2010/11/earth-equatorial-radius-10-length-of.html' title='Earth Equatorial Radius == 1.0 * Length Of Amazon River'/><author><name>Privosoft LLC</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-2340686390336722114.post-3341239267768870318</id><published>2010-11-02T15:23:00.004-05:00</published><updated>2010-11-17T13:07:25.955-05:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='emacs'/><title type='text'>And the best use of ASCII in a comment goes to ...</title><content type='html'>&lt;span style="background-color: #fff2cc;"&gt;Undo Tree Package For Emacs.&lt;/span&gt;&lt;br /&gt;
&lt;br /&gt;
The documentation comment is fantastic. One of the best uses of ascii I have seen in a while. &lt;a href="http://www.dr-qubit.org/undo-tree/undo-tree.el"&gt;http://www.dr-qubit.org/undo-tree/undo-tree.el&lt;/a&gt;&lt;br /&gt;
&lt;br /&gt;
The package is actually of great use for people working with version control system allowing non-linear change history, such as the increasingly popular &lt;span style="background-color: #fff2cc;"&gt;git&lt;/span&gt; and &lt;span style="background-color: #fff2cc;"&gt;mercurial&lt;/span&gt;.&lt;br /&gt;
&lt;br /&gt;
Here is a sample:&lt;br /&gt;
&lt;br /&gt;
&lt;div class="separator" style="clear: both; text-align: center;"&gt;
&lt;a href="http://2.bp.blogspot.com/_0sB_kfTI7ig/TNBzrjsg7OI/AAAAAAAAB_s/upi3BlHWbnU/s1600/ScreenShot114.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="640" src="http://2.bp.blogspot.com/_0sB_kfTI7ig/TNBzrjsg7OI/AAAAAAAAB_s/upi3BlHWbnU/s640/ScreenShot114.png" width="602" /&gt;&lt;/a&gt;&lt;/div&gt;
&lt;br /&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/2340686390336722114-3341239267768870318?l=blog.privosoft.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://blog.privosoft.com/feeds/3341239267768870318/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=2340686390336722114&amp;postID=3341239267768870318' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/2340686390336722114/posts/default/3341239267768870318'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/2340686390336722114/posts/default/3341239267768870318'/><link rel='alternate' type='text/html' href='http://blog.privosoft.com/2010/11/vim-inspired-undo-tree-package-for.html' title='And the best use of ASCII in a comment goes to ...'/><author><name>Privosoft LLC</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://2.bp.blogspot.com/_0sB_kfTI7ig/TNBzrjsg7OI/AAAAAAAAB_s/upi3BlHWbnU/s72-c/ScreenShot114.png' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-2340686390336722114.post-1950466794701368403</id><published>2010-11-02T12:51:00.001-05:00</published><updated>2010-11-02T12:51:29.252-05:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Rx'/><category scheme='http://www.blogger.com/atom/ns#' term='.NET'/><title type='text'>Rx Guidelines</title><content type='html'>Rx (Reactive Extensions for .NET) is very cool. However there is fairly limited documentation.

Rx Team recently released a more structured effort to document the functionality (as opposed to trying to string together a complete picture of Rx functionality from many different blog entries).

It is available here: &lt;a href="http://blogs.msdn.com/b/rxteam/archive/2010/10/28/rx-design-guidelines.aspx"&gt;http://blogs.msdn.com/b/rxteam/archive/2010/10/28/rx-design-guidelines.aspx&lt;/a&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/2340686390336722114-1950466794701368403?l=blog.privosoft.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://blog.privosoft.com/feeds/1950466794701368403/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=2340686390336722114&amp;postID=1950466794701368403' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/2340686390336722114/posts/default/1950466794701368403'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/2340686390336722114/posts/default/1950466794701368403'/><link rel='alternate' type='text/html' href='http://blog.privosoft.com/2010/11/rx-guidelines.html' title='Rx Guidelines'/><author><name>Privosoft LLC</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-2340686390336722114.post-4338299043314925225</id><published>2010-10-26T14:53:00.005-05:00</published><updated>2010-10-27T10:30:41.981-05:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='.NET'/><title type='text'>Side Effect Of Type Constraints in .NET</title><content type='html'>&lt;h2&gt;Experimenting With Generic Constraints&lt;/h2&gt;
&lt;br/&gt;
As I was doing some experiments as exercise in reminding myself the difference between virtual and non-virtual method overloading behavior in C#, and stumbled on an unexpected side-effect of the constraint mechanism in Generics. 
&lt;br/&gt;&lt;br/&gt;
I have class B inherit from A, and wanted to write a generic test harness that would invoke methods f1 and f2 on an instance passed in, but with a generic capability to have the runtime cast the instance to the most specific type. So if I passed in B, the variable would be manipulated as B, etc. So I thought a generic method would deal with this quite nicely: &lt;i&gt;void Do&amp;lt;T&amp;gt;(T arg) { arg.f1(); arg.f2; }&lt;/i&gt;. Now, the declaration will not compile as is, the compiler insists to know the type of T so that it can figure out whether the class supports f1(), f2() functions, fine, i go ahead and add &lt;i&gt;where T : A&lt;/i&gt; to the signature, which turns out to introduce the side effect which is the subject of this blog entry.
&lt;br/&gt;&lt;br/&gt;
When I implemented this scheme (see code below) I was surprised that even when invoking &lt;i&gt;Do&amp;lt;B&amp;gt;(bInstance); &lt;/i&gt;, bInstance was treating as if it was A.
&lt;br/&gt;&lt;br/&gt;
So the generic behavior is very different from what one would thing to be logical, and in fact C++ template mechanism does do what one expects if you were to implement a similar method, bInstance will be treated as a B.
&lt;br/&gt;&lt;br/&gt;
&lt;pre class="brush: c#"&gt;
using System;
using System.Text;

namespace SimpleMethodInheritanceTest
{
    class A
    {
        internal virtual void f1() { System.Console.WriteLine(&amp;quot;f1 in A&amp;quot;); }
        internal void f2() { System.Console.WriteLine(&amp;quot;f2 in A&amp;quot;); }
    }

    class B : A
    {
        internal override void f1() { System.Console.WriteLine(&amp;quot;f1 in B&amp;quot;); }
        internal void f2() { System.Console.WriteLine(&amp;quot;f2 in B&amp;quot;); }
    }

    class Program
    {
        static void DoBase(A a)
        {
            System.Console.WriteLine(&amp;quot;======================== DoBase ========================&amp;quot;);
            a.f1();
            a.f2();
        }

        static void DoBBB(B a)
        {
            System.Console.WriteLine(&amp;quot;======================== DoBBB ========================&amp;quot;);
            a.f1();
            a.f2();
        }


        static void Do&amp;lt;T&amp;gt;(T a) where T : A
        {
            System.Console.WriteLine(&amp;quot;======================== Do&amp;lt;T&amp;gt; ========================&amp;quot;);
            var specificClass = a.GetType().Name;
            System.Console.WriteLine(&amp;quot;======================== Do&amp;lt;T&amp;gt;: T = {0}&amp;quot;, specificClass);
            a.f1();
            a.f2();
        }
        static void Main(string[] args)
        {
            var a = new A();
            DoBase(a);
            Do&amp;lt;A&amp;gt;(a);
            var b = new B();
            DoBase(b);
            Do&amp;lt;B&amp;gt;(b);
            DoBBB(b);
            System.Console.ReadKey();
        }
    }
}
&lt;/pre&gt;

&lt;h3&gt;Output&lt;/h3&gt;
&lt;br/&gt;
I expected &lt;i&gt;line 14&lt;/i&gt; to say f2 in B, since T = B, so I was expecting the argument to &lt;i&gt;Do&amp;lt;T&amp;gt;()&lt;/i&gt; to be treated as a B. But instead I get &lt;i&gt;f2 in A&lt;/i&gt;!!!
&lt;pre class="brush: xml"&gt;
======================== DoBase ========================
f1 in A
f2 in A
======================== Do&amp;lt;T&amp;gt; ========================
======================== Do&amp;lt;T&amp;gt;: T = A
f1 in A
f2 in A
======================== DoBase ========================
f1 in B
f2 in A
======================== Do&amp;lt;T&amp;gt; ========================
======================== Do&amp;lt;T&amp;gt;: T = B
f1 in B
f2 in A
======================== DoBBB ========================
f1 in B
f2 in B
&lt;/pre&gt;

&lt;h3&gt;Discussion&lt;/h3&gt;
&lt;br/&gt;&lt;br/&gt;
So we would expect D&lt;T&gt;: T = B to have &lt;i&gt;f2 in B&lt;/i&gt;, but we got &lt;i&gt;f2 in &lt;b&gt;A&lt;/b&gt;&lt;/i&gt; instead. So to investigate as to what might be going on under the covers, I decompiled the executable into IL using redgate's reflector.
&lt;br/&gt;&lt;br/&gt;
Let's take a look at the results below.
&lt;br/&gt;&lt;br/&gt;
&lt;h3&gt;Do&amp;lt;T&amp;gt; Dissassembled&lt;/h3&gt;
&lt;br/&gt;&lt;br/&gt;
If we dissasemble D&amp;lt;T&amp;gt; we see that on &lt;b&gt;Line 25&lt;/b&gt; f2 is explicitly invoked on class &lt;b&gt;A&lt;/b&gt;. This is causes the unexpected results of &lt;i&gt;f2 in A&lt;/i&gt;.
&lt;br/&gt;&lt;br/&gt;
&lt;pre class="brush: c#"&gt;
.method private hidebysig static void Do&amp;lt;(SimpleMethodInheritanceTest.A) T&amp;gt;(!!T a) cil managed
{
    .maxstack 2
    .locals init (
        [0] string specificClass)
    L_0000: nop 
    L_0001: ldstr &amp;quot;======================== Do&amp;lt;T&amp;gt; ========================&amp;quot;
    L_0006: call void [mscorlib]System.Console::WriteLine(string)
    L_000b: nop 
    L_000c: ldarga.s a
    L_000e: constrained !!T
    L_0014: callvirt instance class [mscorlib]System.Type [mscorlib]System.Object::GetType()
    L_0019: callvirt instance string [mscorlib]System.Reflection.MemberInfo::get_Name()
    L_001e: stloc.0 
    L_001f: ldstr &amp;quot;======================== Do&amp;lt;T&amp;gt;: T = {0}&amp;quot;
    L_0024: ldloc.0 
    L_0025: call void [mscorlib]System.Console::WriteLine(string, object)
    L_002a: nop 
    L_002b: ldarga.s a
    L_002d: constrained !!T
    L_0033: callvirt instance void SimpleMethodInheritanceTest.A::f1()
    L_0038: nop 
    L_0039: ldarga.s a
    L_003b: constrained !!T
    L_0041: callvirt instance void SimpleMethodInheritanceTest.A::f2()
    L_0046: nop 
    L_0047: ret 
}

&lt;/pre&gt;

&lt;h3&gt;DoBBB Disassembled&lt;/h3&gt;
&lt;br/&gt;&lt;br/&gt;
The helper method that specifies class &lt;b&gt;B&lt;/b&gt; as the explicit type of argument, works as expected (calling B::f2()). As we can see below in &lt;b&gt;line 12&lt;/b&gt;, compiler emits IL that specifies B::f2 explicitly.
&lt;pre class="brush: c#"&gt;
.method private hidebysig static void DoBBB(class SimpleMethodInheritanceTest.B a) cil managed
{
    .maxstack 8
    L_0000: nop 
    L_0001: ldstr "======================== DoBBB ========================"
    L_0006: call void [mscorlib]System.Console::WriteLine(string)
    L_000b: nop 
    L_000c: ldarg.0 
    L_000d: callvirt instance void SimpleMethodInheritanceTest.A::f1()
    L_0012: nop 
    L_0013: ldarg.0 
    L_0014: callvirt instance void SimpleMethodInheritanceTest.B::f2()
    L_0019: nop 
    L_001a: ret 
}
&lt;/pre&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/2340686390336722114-4338299043314925225?l=blog.privosoft.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://blog.privosoft.com/feeds/4338299043314925225/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=2340686390336722114&amp;postID=4338299043314925225' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/2340686390336722114/posts/default/4338299043314925225'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/2340686390336722114/posts/default/4338299043314925225'/><link rel='alternate' type='text/html' href='http://blog.privosoft.com/2010/10/side-effect-of-type-constraints-in-net.html' title='Side Effect Of Type Constraints in .NET'/><author><name>Privosoft LLC</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-2340686390336722114.post-9063988843028766937</id><published>2010-10-15T08:36:00.001-05:00</published><updated>2010-10-15T08:39:25.481-05:00</updated><title type='text'>CloudCamp NYC 2010</title><content type='html'>&lt;br /&gt;
&lt;a href="http://www.cloudcamp.org/ny/2010-10-21"&gt;&lt;/a&gt;&lt;br /&gt;
Cloud computing, and more specifically effecient virtualization is a very interesting topic.&lt;br /&gt;
&lt;br /&gt;
&lt;div style="border-bottom: medium none; border-left: medium none; border-right: medium none; border-top: medium none;"&gt;
Here is an opportunity to mingle and learn more if you are in NYC, on October 21st, 2010.&lt;/div&gt;
&lt;div style="border-bottom: medium none; border-left: medium none; border-right: medium none; border-top: medium none;"&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;div style="border-bottom: medium none; border-left: medium none; border-right: medium none; border-top: medium none;"&gt;
It's downtown, near Wall St.&lt;/div&gt;
&lt;div style="border-bottom: medium none; border-left: medium none; border-right: medium none; border-top: medium none;"&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;div class="separator" style="clear: both; text-align: center;"&gt;
&lt;a href="http://www.cloudcamp.org/images/logo_cloudcamp.gif" imageanchor="1" style="clear: left; cssfloat: left; float: left; margin-bottom: 1em; margin-right: 1em;"&gt;&lt;img border="0" ex="true" height="45" src="http://www.cloudcamp.org/images/logo_cloudcamp.gif" width="200" /&gt;&lt;/a&gt;&lt;/div&gt;
&lt;div style="border-bottom: medium none; border-left: medium none; border-right: medium none; border-top: medium none;"&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;a href="http://www.blogger.com/"&gt;&lt;/a&gt;&lt;span id="goog_719420231"&gt;&lt;/span&gt;&lt;span id="goog_719420232"&gt;&lt;/span&gt;&lt;br /&gt;
&lt;div style="border-bottom: medium none; border-left: medium none; border-right: medium none; border-top: medium none;"&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;div style="border-bottom: medium none; border-left: medium none; border-right: medium none; border-top: medium none;"&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;div style="border-bottom: medium none; border-left: medium none; border-right: medium none; border-top: medium none;"&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;div style="border-bottom: medium none; border-left: medium none; border-right: medium none; border-top: medium none;"&gt;
&lt;a href="http://www.cloudcamp.org/ny/2010-10-21"&gt;http://www.cloudcamp.org/ny/2010-10-21&lt;/a&gt; &lt;/div&gt;
&lt;div style="border-bottom: medium none; border-left: medium none; border-right: medium none; border-top: medium none;"&gt;
&lt;br /&gt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/2340686390336722114-9063988843028766937?l=blog.privosoft.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://blog.privosoft.com/feeds/9063988843028766937/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=2340686390336722114&amp;postID=9063988843028766937' title='1 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/2340686390336722114/posts/default/9063988843028766937'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/2340686390336722114/posts/default/9063988843028766937'/><link rel='alternate' type='text/html' href='http://blog.privosoft.com/2010/10/cloudcamp-nyc-2010.html' title='CloudCamp NYC 2010'/><author><name>Privosoft LLC</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-2340686390336722114.post-4216821736043209136</id><published>2010-10-15T08:33:00.000-05:00</published><updated>2010-10-15T08:33:35.247-05:00</updated><title type='text'>App Engine For The Enterprise?</title><content type='html'>&lt;div style="border-bottom: medium none; border-left: medium none; border-right: medium none; border-top: medium none;"&gt;
I like writing software, not the process of deploying it. The idea of&amp;nbsp;abstracting away configuration, hosting and&amp;nbsp;complex network setup&amp;nbsp;has always been very appealing to me.&amp;nbsp;This is one of the big promises of &lt;em&gt;cloud computing; s&lt;/em&gt;o I have been looking at and playing various cloud technologies as they have been popping up over the last 3-4 years.&lt;/div&gt;
&lt;div style="border-bottom: medium none; border-left: medium none; border-right: medium none; border-top: medium none;"&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;div style="border-bottom: medium none; border-left: medium none; border-right: medium none; border-top: medium none;"&gt;
Recently I have started using Google App Engine for non-trivial web apps. My experience so far has been a pleasure! You may say: What!? that's not a very precise description, true, but this is not meant to be a thorough analysis or comparison of every feature that one can think of or use in a real-world applications. What I can say, is that it's been painless to do all the regular things that you have to during a standard application development and deployment process. The API's are elegantly simple to learn and to use, and make it easy for you to start handling requests, persisting data, doing background processing, all on a scalable platform that can handle from 1 to thousands concurrent requests (at least in theory).&lt;/div&gt;
&lt;br /&gt;
&lt;div style="border-bottom: medium none; border-left: medium none; border-right: medium none; border-top: medium none;"&gt;
At the same time, having worked at a number of large corporations I have seen a number of good and bad attempts at streamlining the deployment processes and abstracting away architecture complexities. Again, I have mostly been in the end user role, not the implementor of the abstraction/automation frameworks and systems, so my view may be biased/limited/etc, but at least it represents an experience of a typical developer at a large organization. Typically it's been a rather arduous experience. Some firms are better than others, but in almost all cases you have to pay lots of attention to fairly low level architecture of your application. You can't just write a simple script and deploy it into the cloud.&lt;/div&gt;
&lt;div style="border-bottom: medium none; border-left: medium none; border-right: medium none; border-top: medium none;"&gt;
Given my recent experiments with the App Engine, and extensive experience with large enterprise IT environments, I have starting thinking about how cloud computing can apply to the enterprise.&lt;/div&gt;
&lt;br /&gt;
Low Level Infrastructure ------&amp;gt; High Level API&lt;br /&gt;
&lt;div class="separator" style="clear: both; text-align: center;"&gt;
&lt;a href="http://3.bp.blogspot.com/_0sB_kfTI7ig/TJd6bbTYZ-I/AAAAAAAAB_Q/RH47dacz63s/s1600/ScreenShot083.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" qx="true" src="http://3.bp.blogspot.com/_0sB_kfTI7ig/TJd6bbTYZ-I/AAAAAAAAB_Q/RH47dacz63s/s320/ScreenShot083.png" /&gt;&lt;/a&gt;&lt;/div&gt;
&lt;div style="border-bottom: medium none; border-left: medium none; border-right: medium none; border-top: medium none;"&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;br /&gt;
At the &lt;em&gt;low level&lt;/em&gt;, you have to worry about how you are going to scale your application and the &lt;u&gt;exact&lt;/u&gt; technology stack needed for your particular application. This is essentially what is being offered by various virtual machine cloud providers: &lt;a href="http://aws.amazon.com/ec2/"&gt;Amazon EC2&lt;/a&gt;, &lt;a href="http://www.rackspacecloud.com/"&gt;Rackspace Cloud&lt;/a&gt;, and others. &lt;u&gt;You&lt;/u&gt; have to figure out what VM you want to run (ie pick OS: linux flavor, windows), and what goes inside the VM (mysql/postgres/couchdb/other db, apache, lighthttpd, j2ee, IIS), how many nodes you want to have for failover and scalability, how many tiers you need to scale, etc. This gives you ultimate flexibility, but requires a LOT of extra architecture work. This comes at the expense of agility. &lt;br /&gt;
&lt;br /&gt;
At the mid level of the spectrum, you have something like &lt;a href="http://www.microsoft.com/windowsazure/getstarted/"&gt;Windows Azure&lt;/a&gt;. You get to use familiar development tools and components (SQL, asp.net). But you still have to think about the architecture: how many worker/web/db nodes you want to have, some design of the schema.&lt;br /&gt;
&lt;br /&gt;
At the highest level of architecture abstraction you will find &lt;a href="http://code.google.com/appengine/"&gt;Google App Engine&lt;/a&gt;. As a developer on this platform you don't have to worry about configuring VMs, figuring out the number and size of logical tiers. You are able to focus directly on solving your business problem.

To Be Continued...&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/2340686390336722114-4216821736043209136?l=blog.privosoft.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://blog.privosoft.com/feeds/4216821736043209136/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=2340686390336722114&amp;postID=4216821736043209136' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/2340686390336722114/posts/default/4216821736043209136'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/2340686390336722114/posts/default/4216821736043209136'/><link rel='alternate' type='text/html' href='http://blog.privosoft.com/2010/10/app-engine-for-enterprise.html' title='App Engine For The Enterprise?'/><author><name>Privosoft LLC</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://3.bp.blogspot.com/_0sB_kfTI7ig/TJd6bbTYZ-I/AAAAAAAAB_Q/RH47dacz63s/s72-c/ScreenShot083.png' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-2340686390336722114.post-8833250453979576541</id><published>2010-10-14T07:08:00.015-05:00</published><updated>2010-10-15T08:31:40.725-05:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='msbuild'/><title type='text'>MSBuild Environment Sandboxing</title><content type='html'>&lt;h3&gt;
Sandboxing 101&lt;/h3&gt;

In any non trivial, team oriented project you have multiple configurations:
&lt;ul&gt;
&lt;li&gt;team-member-one-sandbox, team-member-two-sandbox&lt;/li&gt;
&lt;li&gt;QA&lt;/li&gt;
&lt;li&gt;UAT&lt;/li&gt;
&lt;li&gt;PROD-Americas, PROD-Europe, PROD-Asia&lt;/li&gt;
&lt;li&gt;Etc&lt;/li&gt;
&lt;/ul&gt;

For each environment you want to configure database connection strings, web services, various limits and runtime settings; all possibly located across multiple configuration files.

It is also convinient to reuse some sane defaults for a lot of the settings, and have the option to override &lt;i&gt;some&lt;/i&gt; settings for a specific environment.

Conceptually you want to have the following hierarchy of settings, where the most nested overrides or adds to the properties defined at the previous level:
&lt;ul&gt;
&lt;li&gt;Defaults
&lt;ul&gt;
&lt;li&gt;PROD-Defaults
&lt;ul&gt;
&lt;li&gt;Americas&lt;/li&gt;
&lt;li&gt;Europe&lt;/li&gt;
&lt;li&gt;Asia&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
.NET/MSBuild Solution&lt;/h3&gt;
There are a couple of choices available:
&lt;ul&gt;
&lt;li&gt;T4&lt;/li&gt;
&lt;li&gt;MSBuild&lt;/li&gt;
&lt;li&gt;NAnt&lt;/li&gt;
&lt;li&gt;Custom PostBuild event scripts in Visual Studio&lt;/li&gt;
&lt;li&gt;An AdHoc combination of the above&lt;/li&gt;
&lt;/ul&gt;

When we were designing the solution described in this post, we wanted to keep the process as simple and as integrated with Visual Studio as possible, while at the same time making it simple to do automated builds from the command line. In the end, we were able to combine the &lt;i&gt;Configuration&lt;/i&gt; functionality within with Visual Studio, with targeting of specific environments in a fairly natural way; if you follow this approach you will be able to select a target environment within VS via the configuration drop-down.

At a very high level you will have the following:

1. One or more templated configuration files with ${setting1} for various configurable settings. For example you will have a bunch of settings in your &lt;i&gt;app.config&lt;/i&gt;.

2. A set of configuration files containing the settings that need to be replaced in your templated files:

The proposed solution will allow you to define your settings in the following configuration files:
&lt;ul&gt;
&lt;li&gt;defaults.cfg&lt;/li&gt;
&lt;li&gt;prod-americas.cfg&lt;/li&gt;
&lt;li&gt;prod-europe.cfg&lt;/li&gt;
&lt;li&gt;prod-asia.cfg&lt;/li&gt;
&lt;/ul&gt;

3. A couple of custom MSBuild tasks in your CoolApp.csproj file. We will utilize open source build task library: http://msbuildtasks.tigris.org/

4. A couple of custom Configurations set up within Visual Studion (these go into CoolApp.sln file)

&lt;h3&gt;
App.config&lt;/h3&gt;
&lt;pre class="brush: xml"&gt;&amp;lt;configuration&amp;gt;
  &amp;lt;appSettings&amp;gt;
    &amp;lt;add key=&amp;quot;setting_one&amp;quot; value=&amp;quot;${setting_one}&amp;quot;/&amp;gt;
    ${custom_settings}
  &amp;lt;/appSettings&amp;gt;
&amp;lt;/configuration&amp;gt;
&lt;/pre&gt;

&lt;h3&gt;
defaults.cfg&lt;/h3&gt;
&lt;pre class="brush: xml"&gt;&amp;lt;settings&amp;gt;
  &amp;lt;x key=&amp;quot;setting_one&amp;quot;&amp;gt;Hello World From DEFAULTS!&amp;lt;/x&amp;gt;
&amp;lt;/settings&amp;gt;
&lt;/pre&gt;

&lt;h3&gt;
debug.cfg (ie dev/qa/uat/etc)&lt;/h3&gt;
&lt;pre class="brush: xml"&gt;&amp;lt;settings&amp;gt;
  &amp;lt;x key=&amp;quot;custom_settings&amp;quot;&amp;gt;
    &amp;lt;add key=&amp;quot;custom_setting_1&amp;quot; value=&amp;quot;This is DEBUG custom setting ONE.&amp;quot;/&amp;gt;
    &amp;lt;add key=&amp;quot;custom_setting_2&amp;quot; value=&amp;quot;This is DEBUG custom setting TWO.&amp;quot;/&amp;gt;
  &amp;lt;/x&amp;gt;
&amp;lt;/settings&amp;gt;
&lt;/pre&gt;


&lt;h3&gt;
release.cfg&lt;/h3&gt;
&lt;pre class="brush: xml"&gt;&amp;lt;tokens&amp;gt;
&amp;lt;settings&amp;gt;
  &amp;lt;x key=&amp;quot;setting_one&amp;quot;&amp;gt;Hello World From RELEASE!&amp;lt;/x&amp;gt;
  &amp;lt;x key=&amp;quot;custom_settings&amp;quot;&amp;gt;
    &amp;lt;add key=&amp;quot;custom_setting_1&amp;quot; value=&amp;quot;This is RELEASE custom setting ONE.&amp;quot;/&amp;gt;
    &amp;lt;add key=&amp;quot;custom_setting_2&amp;quot; value=&amp;quot;This is RELEASE custom setting TWO.&amp;quot;/&amp;gt;
  &amp;lt;/x&amp;gt;
&amp;lt;/settings&amp;gt;
&lt;/pre&gt;

&lt;h3&gt;
MSBuild Task Detail&lt;/h3&gt;
&lt;pre class="brush: xml"&gt;&amp;lt;Import Project=&amp;quot;$(MSBuildExtensionsPath)\MSBuildCommunityTasks\MSBuild.Community.Tasks.Targets&amp;quot; /&amp;gt;
  &amp;lt;PropertyGroup&amp;gt;
    &amp;lt;ConfigOutDir&amp;gt;$(OutputPath)\cfg&amp;lt;/ConfigOutDir&amp;gt;
  &amp;lt;/PropertyGroup&amp;gt;
  &amp;lt;Target Name=&amp;quot;ProcessConfig&amp;quot;&amp;gt;
    &amp;lt;Message Text=&amp;quot;==&amp;amp;gt;&amp;amp;gt;&amp;amp;gt;&amp;amp;gt; CurrentEnvironment = $(EnvId)&amp;quot; /&amp;gt;
    &amp;lt;!-- BEGIN default (ie common) settings --&amp;gt;
    &amp;lt;XmlQuery XmlFileName=&amp;quot;$(MSBuildProjectDirectory)\cfg\defaults.cfg&amp;quot; XPath=&amp;quot;//settings/*&amp;quot;&amp;gt;
      &amp;lt;Output TaskParameter=&amp;quot;Values&amp;quot; ItemName=&amp;quot;DefaultSettingValues&amp;quot; /&amp;gt;
    &amp;lt;/XmlQuery&amp;gt;
    &amp;lt;ItemGroup&amp;gt;
      &amp;lt;Tokens Include=&amp;quot;%(DefaultSettingValues.key)&amp;quot;&amp;gt;
        &amp;lt;ReplacementValue&amp;gt;%(DefaultSettingValues._innerxml)&amp;lt;/ReplacementValue&amp;gt;
      &amp;lt;/Tokens&amp;gt;
    &amp;lt;/ItemGroup&amp;gt;
    &amp;lt;!-- END defaults.config --&amp;gt;
    &amp;lt;!-- specific environment --&amp;gt;
    &amp;lt;XmlQuery XmlFileName=&amp;quot;$(MSBuildProjectDirectory)\cfg\$(EnvId).cfg&amp;quot; XPath=&amp;quot;//settings/*&amp;quot;&amp;gt;
      &amp;lt;Output TaskParameter=&amp;quot;Values&amp;quot; ItemName=&amp;quot;SettingValues&amp;quot; /&amp;gt;
    &amp;lt;/XmlQuery&amp;gt;
    &amp;lt;ItemGroup&amp;gt;
      &amp;lt;Tokens Include=&amp;quot;EnvId&amp;quot;&amp;gt;
        &amp;lt;ReplacementValue&amp;gt;$(EnvId)&amp;lt;/ReplacementValue&amp;gt;
      &amp;lt;/Tokens&amp;gt;
    &amp;lt;/ItemGroup&amp;gt;
    &amp;lt;!-- Remove duplicates - this is important for &amp;quot;overrides&amp;quot; --&amp;gt;
    &amp;lt;ItemGroup&amp;gt;
      &amp;lt;Tokens Remove=&amp;quot;%(SettingValues.key)&amp;quot; /&amp;gt;
    &amp;lt;/ItemGroup&amp;gt;
    &amp;lt;ItemGroup&amp;gt;
      &amp;lt;Tokens Include=&amp;quot;%(SettingValues.key)&amp;quot;&amp;gt;
        &amp;lt;ReplacementValue&amp;gt;%(SettingValues._innerxml)&amp;lt;/ReplacementValue&amp;gt;
      &amp;lt;/Tokens&amp;gt;
    &amp;lt;/ItemGroup&amp;gt;
    &amp;lt;Message Text=&amp;quot;Parsed Tokens =&amp;amp;gt; %(Tokens.Identity): %(Tokens.ReplacementValue)&amp;quot; /&amp;gt;
    &amp;lt;MakeDir Directories=&amp;quot;$(ConfigOutDir)&amp;quot; /&amp;gt;
    &amp;lt;TemplateFile Template=&amp;quot;$(MSBuildProjectDirectory)\app.config&amp;quot; OutputFilename=&amp;quot;$(ConfigOutDir)\$(EnvId).app.config&amp;quot; Tokens=&amp;quot;@(Tokens)&amp;quot; /&amp;gt;
  &amp;lt;/Target&amp;gt;
  &amp;lt;Target Name=&amp;quot;BeginProcessConfig&amp;quot;&amp;gt;
    &amp;lt;ItemGroup&amp;gt;
      &amp;lt;EnvConfigFiles Include=&amp;quot;$(MSBuildProjectDirectory)\cfg\*.cfg&amp;quot; Exclude=&amp;quot;$(MSBuildProjectDirectory)\cfg\defaults.cfg&amp;quot; /&amp;gt;
    &amp;lt;/ItemGroup&amp;gt;
    &amp;lt;MSBuild Targets=&amp;quot;ProcessConfig&amp;quot; Properties=&amp;quot;EnvId=%(EnvConfigFiles.Filename)&amp;quot; Projects=&amp;quot;$(MsBuildProjectFile)&amp;quot; /&amp;gt;
    &amp;lt;!-- Copy over the correct file based on configuration in visual studio or command line --&amp;gt;
    &amp;lt;PropertyGroup&amp;gt;
      &amp;lt;EnvConfigIn&amp;gt;$(ConfigOutDir)\$(Configuration).app.config&amp;lt;/EnvConfigIn&amp;gt;
    &amp;lt;/PropertyGroup&amp;gt;
    &amp;lt;Message Text=&amp;quot;EnvConfigIn = $(EnvConfigIn)&amp;quot; /&amp;gt;
    &amp;lt;Copy SourceFiles=&amp;quot;$(EnvConfigIn)&amp;quot; DestinationFiles=&amp;quot;$(OutputPath)$(AssemblyName).exe.config&amp;quot; /&amp;gt;
  &amp;lt;/Target&amp;gt;
  &amp;lt;Target Name=&amp;quot;AfterBuild&amp;quot; DependsOnTargets=&amp;quot;BeginProcessConfig&amp;quot;&amp;gt;
    &amp;lt;Message Text=&amp;quot;This is the AfterBuild target: $(MSBuildToolsPath)&amp;quot; /&amp;gt;
  &amp;lt;/Target&amp;gt;&lt;/pre&gt;

&lt;h3&gt;
Demo Project&lt;/h3&gt;
&lt;br/&gt;
&lt;h4&gt;1. Install MSbuild Common Tasks&lt;/h4&gt;
&lt;br/&gt;&lt;br/&gt;
&lt;a href="http://msbuildtasks.tigris.org/"&gt;http://msbuildtasks.tigris.org/
&lt;/a&gt;
&lt;br/&gt;&lt;br/&gt;
&lt;b&gt;Note:&lt;/b&gt; the &lt;i&gt;easy&lt;/i&gt; way to experiment is to just install via .msi installer, alternatively you can download the .zip file with all the binaries, but then you will have to configure the &lt;i&gt;Import&lt;/i&gt; of msbuild tasks in the .csproj file - not difficult, and definitely something you want to do for self contain projects (typically you would include the binaries in some libs sub-folder of your project and reference it via relative paths from msbuild).
&lt;br/&gt;&lt;br/&gt;
&lt;h4&gt;2. Download Source&lt;/h4&gt;
&lt;br/&gt;&lt;br/&gt;
&lt;a href="http://drop.io/qvpto4h/asset/envcfgdemo-zip" title="envcfgdemo-zip"&gt;View envcfgdemo-zip&lt;/a&gt; or if you behind an evil firewall: &lt;a href="http://privosoft.appspot.com/static/EnvCfgDemo.zip" title="EnvCfgDemo.zip"&gt;Download Demo Visual Studio 2008 Project&lt;/a&gt;
&lt;br/&gt;
&lt;br/&gt;
When opening the project you will be prompted with a dialog telling you that the project file is using some external extensions and whether you want to trust it. This is normal and you have to do it just once.
&lt;br/&gt;
&lt;br/&gt;
Try selecting different Configurations in Visual Studio, or run from command line with
&lt;br/&gt;
&lt;br/&gt;
msbuild /p:Configuration=CustomEnv
&lt;br/&gt;
&lt;br/&gt;
or
&lt;br/&gt;
msbuild /p:Configuration=Debug
&lt;br/&gt;
&lt;br/&gt;
&lt;b&gt;Note&lt;/b&gt;: all of the configurations are built and placed into bin\$(Configuration)\cfg folder, you can examine the files and sometimes it's useful for further automatic deployments (ie you can copy over the right config file via a script at the time you deploy vs build time).&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/2340686390336722114-8833250453979576541?l=blog.privosoft.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://blog.privosoft.com/feeds/8833250453979576541/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=2340686390336722114&amp;postID=8833250453979576541' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/2340686390336722114/posts/default/8833250453979576541'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/2340686390336722114/posts/default/8833250453979576541'/><link rel='alternate' type='text/html' href='http://blog.privosoft.com/2010/10/msbuild-environment-sandboxing.html' title='MSBuild Environment Sandboxing'/><author><name>Privosoft LLC</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-2340686390336722114.post-2610314178776097918</id><published>2010-09-21T08:53:00.000-05:00</published><updated>2010-09-21T08:53:41.215-05:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='dsl'/><title type='text'>Language Semantics</title><content type='html'>&lt;blockquote&gt;
&lt;span style="background-color: white; color: #cc0000;"&gt;&lt;em&gt;Some 50 years ago, the renowned linguist Roman Jakobson pointed out a crucial fact about differences between languages in a pithy maxim: “Languages differ essentially in what they must convey and not in what they may convey.” This maxim offers us the key to unlocking the real force of the mother tongue: if different languages influence our minds in different ways, this is not because of what our language allows us to think but rather because of what it habitually obliges us to think about. &lt;/em&gt;&lt;/span&gt;&lt;/blockquote&gt;
&lt;blockquote&gt;
&lt;span style="background-color: white; color: #cc0000;"&gt;&lt;em&gt;... &lt;/em&gt;&lt;/span&gt;&lt;/blockquote&gt;
&lt;blockquote&gt;
&lt;span style="background-color: white; color: #cc0000;"&gt;&lt;em&gt;When your language routinely obliges you to specify certain types of information, it forces you to be attentive to certain details in the world and to certain aspects of experience that speakers of other languages may not be required to think about all the time. And since such habits of speech are cultivated from the earliest age, it is only natural that they can settle into habits of mind that go beyond language itself, affecting your experiences, perceptions, associations, feelings, memories and orientation in the world.&lt;/em&gt;&lt;/span&gt;&lt;/blockquote&gt;
From &lt;a href="http://lambda-the-ultimate.org/node/4062"&gt;http://lambda-the-ultimate.org/node/4062&lt;/a&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/2340686390336722114-2610314178776097918?l=blog.privosoft.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://blog.privosoft.com/feeds/2610314178776097918/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=2340686390336722114&amp;postID=2610314178776097918' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/2340686390336722114/posts/default/2610314178776097918'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/2340686390336722114/posts/default/2610314178776097918'/><link rel='alternate' type='text/html' href='http://blog.privosoft.com/2010/09/language-semantics.html' title='Language Semantics'/><author><name>Privosoft LLC</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-2340686390336722114.post-1057126185738989965</id><published>2010-09-10T07:52:00.000-05:00</published><updated>2010-09-10T07:52:33.894-05:00</updated><title type='text'>ZUI Presentations</title><content type='html'>Zoomable UI, definitely feels cool on first encounter - not convinced though that it's much better than regular slides. Nice implementation though
from &lt;a href="http://prezi.com/zvsqdyisrcgt/academy-prezi-workflow-in-15-minutes/"&gt;prezi.com&lt;/a&gt;
&lt;div class="prezi-player"&gt;&lt;style type="text/css" media="screen"&gt;.prezi-player { width: 450px; } .prezi-player-links { text-align: center; }&lt;/style&gt;&lt;object id="prezi_zvsqdyisrcgt" name="prezi_zvsqdyisrcgt" classid="clsid:D27CDB6E-AE6D-11cf-96B8-444553540000" width="450" height="400"&gt;&lt;param name="movie" value="http://prezi.com/bin/preziloader.swf"/&gt;&lt;param name="allowfullscreen" value="true"/&gt;&lt;param name="allowscriptaccess" value="always"/&gt;&lt;param name="bgcolor" value="#ffffff"/&gt;&lt;param name="flashvars" value="prezi_id=zvsqdyisrcgt&amp;amp;lock_to_path=0&amp;amp;color=ffffff&amp;amp;autoplay=no&amp;amp;autohide_ctrls=0"/&gt;&lt;embed id="preziEmbed_zvsqdyisrcgt" name="preziEmbed_zvsqdyisrcgt" src="http://prezi.com/bin/preziloader.swf" type="application/x-shockwave-flash" allowfullscreen="true" allowscriptaccess="always" width="450" height="400" bgcolor="#ffffff" flashvars="prezi_id=zvsqdyisrcgt&amp;amp;lock_to_path=0&amp;amp;color=ffffff&amp;amp;autoplay=no&amp;amp;autohide_ctrls=0"&gt;&lt;/embed&gt;&lt;/object&gt;&lt;div class="prezi-player-links"&gt;&lt;p&gt;&lt;a title="How to use Prezi - Interface and workflow" href="http://prezi.com/zvsqdyisrcgt/academy-prezi-workflow-in-15-minutes/"&gt;Academy: Prezi Workflow in 15 minutes&lt;/a&gt; on &lt;a href="http://prezi.com"&gt;Prezi&lt;/a&gt;&lt;/p&gt;&lt;/div&gt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/2340686390336722114-1057126185738989965?l=blog.privosoft.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://blog.privosoft.com/feeds/1057126185738989965/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=2340686390336722114&amp;postID=1057126185738989965' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/2340686390336722114/posts/default/1057126185738989965'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/2340686390336722114/posts/default/1057126185738989965'/><link rel='alternate' type='text/html' href='http://blog.privosoft.com/2010/09/zui-presentations.html' title='ZUI Presentations'/><author><name>Privosoft LLC</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-2340686390336722114.post-151345354005622702</id><published>2010-09-09T22:32:00.007-05:00</published><updated>2010-09-17T09:32:17.641-05:00</updated><title type='text'>Polyglot Programming</title><content type='html'>A typical week (and sometimes day) consists of a little bit of the following: C++, C#, Python, Javascript.&lt;br /&gt;
&lt;br /&gt;
&lt;span class="Apple-style-span"&gt;&lt;span style="background-color: white;"&gt;&lt;strong&gt;&amp;nbsp;&lt;/strong&gt;&lt;strong&gt;C#&lt;/strong&gt;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;
&lt;ul&gt;
&lt;li&gt;Asset-Backed Position Management UI in WinForms.&lt;/li&gt;
&lt;li&gt;Trade And PnL UI in WPF for a high frequency trading engine. Using RX for processing streams of incoming messages, hoping it can scale to &amp;gt; 1k ticks/sec.&lt;/li&gt;
&lt;/ul&gt;
&lt;span class="Apple-style-span" style="background-color: #d9d2e9;"&gt;&lt;span style="background-color: white;"&gt;&lt;strong&gt;C&lt;/strong&gt;&lt;/span&gt;&lt;span style="background-color: white;"&gt;&lt;strong&gt;++&lt;/strong&gt;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;
&lt;ul&gt;
&lt;li&gt;high frequency trading engine: position management, pnl calculations, high-performance messaging. Advanced use of templates, custom memory pooling, concurrency. Ahh, it's been a while since I cared so much about bits and bytes. But as Alan Kay once said&lt;span class="Apple-style-span" style="font-family: inherit;"&gt;&amp;nbsp;&lt;/span&gt;&lt;span class="Apple-style-span" style="line-height: 15px;"&gt;&lt;i&gt;&lt;span class="Apple-style-span" style="font-family: inherit;"&gt;"if a company is really&amp;nbsp;&lt;/span&gt;&lt;/i&gt;&lt;em&gt;&lt;span class="Apple-style-span" style="font-family: inherit;"&gt;serious about software&lt;/span&gt;&lt;/em&gt;&lt;i&gt;&lt;span class="Apple-style-span" style="font-family: inherit;"&gt;&amp;nbsp;they need to build their own hardware"&lt;/span&gt;&lt;/i&gt;&lt;span class="Apple-style-span" style="font-family: inherit;"&gt;, so I got myself a new book on top of the stack on my desk:&lt;/span&gt;&lt;span class="Apple-style-span" style="font-family: inherit;"&gt;&lt;a href="http://www.amazon.com/Bebop-Boolean-Boogie-Third-Unconventional/dp/1856175073/ref=sr_1_1?s=books&amp;amp;ie=UTF8&amp;amp;qid=1284088864&amp;amp;sr=1-1"&gt;&amp;nbsp;Bebop to the Boolean Boogi&lt;/a&gt;e - it's a fun book, even if at the expense of accuracy (for example the author claims that Perl is one of the first scripting languages, I am no expert on these matters but looks like sh predates perl by a decade, while I was fact checking I was shocked to discover that perl is now 23 years old! and python is almost 20).&lt;/span&gt;&lt;/span&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;span class="Apple-style-span" style="background-color: white;"&gt;&lt;strong&gt;Python&lt;/strong&gt;&lt;/span&gt;&lt;br /&gt;
&lt;ul&gt;
&lt;li&gt;Building a web app on&amp;nbsp;&lt;a href="http://code.google.com/appengine/"&gt;Google AppEngine&lt;/a&gt;. (using django templates, meta programming with &lt;a href="http://www.artima.com/weblogs/viewpost.jsp?thread=240808"&gt;decorators&lt;/a&gt;, &lt;a href="http://tim.oreilly.com/pub/a/python/2003/04/17/metaclasses.html"&gt;metaclasses&lt;/a&gt;, and other nifty python stuff that make it a very elegant language. Python is FUN; glad that the author of a book i am currently reading - &lt;a href="http://www.amazon.com/Programming-Collective-Intelligence-Building-Applications/dp/0596529325/ref=sr_1_1?ie=UTF8&amp;amp;s=books&amp;amp;qid=1284088161&amp;amp;sr=8-1"&gt;programming collective intelligence&lt;/a&gt; - opted to use py for the examples).&lt;/li&gt;
&lt;li&gt;&lt;a href="http://blog.privosoft.com/2010/08/curses.html"&gt;Curses UI&lt;/a&gt; in a Unix environment (initially it started out as a somewhat specialized file grep+tail, but, bam, a couple hundred of python lines later it's a multithreaded, curses-based powertool).&lt;/li&gt;
&lt;/ul&gt;
&lt;span class="Apple-style-span" style="background-color: white;"&gt;&lt;strong&gt;Javascript&lt;/strong&gt;&lt;/span&gt;&lt;br /&gt;
&lt;ul&gt;
&lt;li&gt;Mostly &amp;nbsp;using &lt;a href="http://jquery.com/"&gt;JQuery&lt;/a&gt;.&lt;/li&gt;
&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;
&lt;ul&gt;&lt;/ul&gt;
&lt;/ul&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/2340686390336722114-151345354005622702?l=blog.privosoft.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://blog.privosoft.com/feeds/151345354005622702/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=2340686390336722114&amp;postID=151345354005622702' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/2340686390336722114/posts/default/151345354005622702'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/2340686390336722114/posts/default/151345354005622702'/><link rel='alternate' type='text/html' href='http://blog.privosoft.com/2010/09/polyglot-programming.html' title='Polyglot Programming'/><author><name>Privosoft LLC</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-2340686390336722114.post-2628223441254644992</id><published>2010-08-24T01:14:00.005-05:00</published><updated>2010-08-24T19:54:41.928-05:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='python'/><category scheme='http://www.blogger.com/atom/ns#' term='unix'/><title type='text'>Curses</title><content type='html'>No I am not particularly angry - I am talking about ncurses text user interface programming. Surprisingly curses is a very nice solution when you are constrained by complex network paths from where you have data and where you need to display it; with curses all you need is an ssh connection. 
&lt;br/&gt;&lt;br/&gt;
Curses provides a simple abstraction of the terminal's coordinates, colorization, and some other&lt;i&gt; special effects&lt;/i&gt; - yes in the world of GPU accelerated toolkits, calling blinking text a special effect makes one smile, but some simple things are quite effective in real use.
&lt;br/&gt;&lt;br/&gt;
Python has excellent support for curses (it comes with a module that is a pretty complete wrapper of the curses api). I was able to whip up a multithreaded curses based position tracking script in a few evenings, works like a charm.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/2340686390336722114-2628223441254644992?l=blog.privosoft.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://blog.privosoft.com/feeds/2628223441254644992/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=2340686390336722114&amp;postID=2628223441254644992' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/2340686390336722114/posts/default/2628223441254644992'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/2340686390336722114/posts/default/2628223441254644992'/><link rel='alternate' type='text/html' href='http://blog.privosoft.com/2010/08/curses.html' title='Curses'/><author><name>Privosoft LLC</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-2340686390336722114.post-1562222018636740265</id><published>2009-11-25T19:32:00.015-05:00</published><updated>2009-11-25T20:29:22.063-05:00</updated><title type='text'>syntax highlighting</title><content type='html'>&lt;h2&gt;&lt;span style="font-size: medium;"&gt;Here is some C-Sharp code&lt;/span&gt;&lt;/h2&gt;&lt;pre class="brush: c-sharp"&gt;public static void Main() {
    Console.Out.WriteLine("test")
}
&lt;/pre&gt;&lt;br /&gt;
&lt;h2&gt;&lt;span style="font-size: medium;"&gt;And some F-Sharp code&lt;/span&gt;&lt;/h2&gt;&lt;pre class="brush: c-sharp"&gt;let xs = seq { for i in 1..10 yield (i, i*i) }
let result = 
   xs 
     |&amp;gt; Seq.iter (fun item -&amp;gt; printfn "%A" item)
&lt;/pre&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/2340686390336722114-1562222018636740265?l=blog.privosoft.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://blog.privosoft.com/feeds/1562222018636740265/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=2340686390336722114&amp;postID=1562222018636740265' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/2340686390336722114/posts/default/1562222018636740265'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/2340686390336722114/posts/default/1562222018636740265'/><link rel='alternate' type='text/html' href='http://blog.privosoft.com/2009/11/public-static-void-main-console.html' title='syntax highlighting'/><author><name>Privosoft LLC</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-2340686390336722114.post-7091968170859165995</id><published>2009-11-25T19:23:00.002-05:00</published><updated>2009-11-25T19:29:07.320-05:00</updated><title type='text'>the wonderful world of .net</title><content type='html'>love the innovation in programming language design happening in the world of .net.&lt;div&gt;
&lt;/div&gt;&lt;div&gt;with powershell, now even have a very respectable command line.&lt;/div&gt;&lt;div&gt;
&lt;/div&gt;&lt;div&gt;with windows7 now finally have a modern OS? may be, the jury is still out, i have been using it on my home install, so far so good.&lt;/div&gt;&lt;div&gt;
&lt;/div&gt;&lt;div&gt;i have been slowly but surely moving towards doing more and more hacking in F#. &lt;/div&gt;&lt;div&gt;have even been using it to get real work done - but so far these have been scripts in the 30 - 100 line range. even did a presentation at work about it!&lt;/div&gt;&lt;div&gt;
&lt;/div&gt;&lt;div&gt;
&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/2340686390336722114-7091968170859165995?l=blog.privosoft.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://blog.privosoft.com/feeds/7091968170859165995/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=2340686390336722114&amp;postID=7091968170859165995' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/2340686390336722114/posts/default/7091968170859165995'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/2340686390336722114/posts/default/7091968170859165995'/><link rel='alternate' type='text/html' href='http://blog.privosoft.com/2009/11/wonderful-world-of-net.html' title='the wonderful world of .net'/><author><name>Privosoft LLC</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-2340686390336722114.post-1518917863684550456</id><published>2008-01-04T12:12:00.000-05:00</published><updated>2008-01-04T12:15:06.515-05:00</updated><title type='text'>blue brain</title><content type='html'>a group of researchers in switzerland have been &lt;a href="http://www.spiegel.de/international/spiegel/0,1518,466789,00.html"&gt;growing an artifical brain&lt;/a&gt; via simulated (virtual) neurons on a petaflop supercomputer. very cool stuff... yes indeed the &lt;a href="http://www.google.com/search?hl=en&amp;amp;client=firefox-a&amp;amp;rls=org.mozilla:en-US:official&amp;amp;hs=XQV&amp;amp;sa=X&amp;amp;oi=spell&amp;amp;resnum=0&amp;amp;ct=result&amp;amp;cd=1&amp;amp;q=kurzweil+singularity&amp;amp;spell=1"&gt;cingularity described by ray kurzweil&lt;/a&gt; may be coming sooner than we think.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/2340686390336722114-1518917863684550456?l=blog.privosoft.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://blog.privosoft.com/feeds/1518917863684550456/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=2340686390336722114&amp;postID=1518917863684550456' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/2340686390336722114/posts/default/1518917863684550456'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/2340686390336722114/posts/default/1518917863684550456'/><link rel='alternate' type='text/html' href='http://blog.privosoft.com/2008/01/blue-brain.html' title='blue brain'/><author><name>Privosoft LLC</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-2340686390336722114.post-1984047366417674989</id><published>2008-01-04T12:09:00.000-05:00</published><updated>2008-01-04T12:10:31.800-05:00</updated><title type='text'>very cool .net 3 based mind mapper</title><content type='html'>a very cool and &lt;span style="font-style: italic;"&gt;free&lt;/span&gt; mind mapping tool. playing with it now; first impression is very nice &lt;a href="http://cayra.net/screenshots"&gt;http://cayra.net/screenshots&lt;/a&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/2340686390336722114-1984047366417674989?l=blog.privosoft.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://blog.privosoft.com/feeds/1984047366417674989/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=2340686390336722114&amp;postID=1984047366417674989' title='1 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/2340686390336722114/posts/default/1984047366417674989'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/2340686390336722114/posts/default/1984047366417674989'/><link rel='alternate' type='text/html' href='http://blog.privosoft.com/2008/01/very-cool-net-3-based-mind-mapper.html' title='very cool .net 3 based mind mapper'/><author><name>Privosoft LLC</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-2340686390336722114.post-4025400496223489014</id><published>2007-05-21T09:17:00.001-05:00</published><updated>2007-05-21T09:24:58.724-05:00</updated><title type='text'>progamming language book sales</title><content type='html'>interesting analysis of book sales by programming language.

in a nutshell scripting languages are spiking up in popularity.
given that most of the scripting languages encourages functional style (list comprehensions, map, apply) of programming this bodes well for encouraging people to look at more robust (type enforcement), functional languages (F#, boo, nemerle, scala, ocaml, haskell).

gut feeling is that functional and domain specific languages are gaining momentum. may be eventually DSL's will replace the multitude of framework API's.


&lt;a href="http://radar.oreilly.com/archives/2007/05/state_of_the_co_10.html"&gt;http://radar.oreilly.com/archives/2007/05/state_of_the_co_10.html&lt;/a&gt;

&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://radar.oreilly.com/languages_q1_07_vs_06.jpg"&gt;&lt;img style="margin: 0px auto 10px; display: block; text-align: center; cursor: pointer; width: 320px;" src="http://radar.oreilly.com/languages_q1_07_vs_06.jpg" alt="" border="0" /&gt;&lt;/a&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/2340686390336722114-4025400496223489014?l=blog.privosoft.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://blog.privosoft.com/feeds/4025400496223489014/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=2340686390336722114&amp;postID=4025400496223489014' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/2340686390336722114/posts/default/4025400496223489014'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/2340686390336722114/posts/default/4025400496223489014'/><link rel='alternate' type='text/html' href='http://blog.privosoft.com/2007/05/books-sales.html' title='progamming language book sales'/><author><name>Privosoft LLC</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-2340686390336722114.post-4621814399460138535</id><published>2007-05-04T08:34:00.000-05:00</published><updated>2007-05-04T08:41:39.984-05:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='fp'/><title type='text'>new york functional programmers meeting</title><content type='html'>met a bunch of very good people. great to see that functional languages are used in real projects at leading financial services institutions.

haskell and ocaml appears to be very popular.

people seem to like the idea and implementation of F#, but a quite concerned about licensing issues. The main fear is that microsoft will stop development related to F# and won't release the implementation to public domain, so the language will be stillborn. i think such worries are a little premature. Microsoft also has a fairly decent record with regard to using public domain for it's CLR and C# specification (enabling success of projects like mono). Given enough interest and requests to F# team, surely it will be in everyone's interest to make the language implementation available for the public.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/2340686390336722114-4621814399460138535?l=blog.privosoft.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://blog.privosoft.com/feeds/4621814399460138535/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=2340686390336722114&amp;postID=4621814399460138535' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/2340686390336722114/posts/default/4621814399460138535'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/2340686390336722114/posts/default/4621814399460138535'/><link rel='alternate' type='text/html' href='http://blog.privosoft.com/2007/05/new-york-functional-programmers-meeting.html' title='new york functional programmers meeting'/><author><name>Privosoft LLC</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-2340686390336722114.post-7991032134323089775</id><published>2007-04-26T17:44:00.000-05:00</published><updated>2007-04-26T17:56:16.310-05:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='microsoft'/><title type='text'>microsoft financal services tech conference 2007</title><content type='html'>spent 2 days at the conference.

this is my first time going to a microsoft-centric technology conference, having spent a good 6-7 years in the java camp.

here are some takeaways for me personally, in no particular order:
&lt;ul&gt;&lt;li&gt;although this was a financial services specific &lt;strong&gt;technology &lt;/strong&gt;conference, there was not a whole lot of technology being discussed that would be terribly useful for an enterprise type of application. there was only one session covering microsoft financial services related application block (unfortunately i did not make it to this one - oops).&lt;/li&gt;&lt;li&gt;ms is trying real hard to push wpf (winfx, xaml, etc). there were a couple of session focused almost exclusively on use of this technology for building thick clients.&lt;/li&gt;&lt;li&gt;given the poor tooling in visual studio 2005 for xaml based development i am surprised ms is pushing this technology to financial services audience. right now, it seems the only audience for this would be software tools builders and hackers (ahhh, fond memories of mozilla XUL development on one of the past projects we did).&lt;/li&gt;&lt;li&gt;apperantly microsoft HPC addition is cheap to deploy (about $400 per cpu). need to follow up on this, i have been itching to start utilizing grid computing.&lt;/li&gt;&lt;li&gt;sadly, there are still plenty of people who tend to think that writing hundreds of lines of convoluted xslt is a much nicer option to QA's c# code. apperantly there is not need to qa a 50 line block of inlined/recursive called to insane string manipulation routines and just release it right into production. just because a particular technology does not need to be compiled into an EXE does not mean it has to go through a different release process. Even configuration changes should be heavily QA'd before making changes in production.&lt;/li&gt;&lt;/ul&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/2340686390336722114-7991032134323089775?l=blog.privosoft.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://blog.privosoft.com/feeds/7991032134323089775/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=2340686390336722114&amp;postID=7991032134323089775' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/2340686390336722114/posts/default/7991032134323089775'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/2340686390336722114/posts/default/7991032134323089775'/><link rel='alternate' type='text/html' href='http://blog.privosoft.com/2007/04/microsoft-financal-services-tech.html' title='microsoft financal services tech conference 2007'/><author><name>Privosoft LLC</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-2340686390336722114.post-8407474921731372256</id><published>2007-03-29T06:27:00.000-05:00</published><updated>2007-03-29T10:05:59.490-05:00</updated><title type='text'>wisdom of many to rate my credit</title><content type='html'>prosper.com is an peer-to-peer lending site. fantastic concept. wave of the future.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/2340686390336722114-8407474921731372256?l=blog.privosoft.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://blog.privosoft.com/feeds/8407474921731372256/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=2340686390336722114&amp;postID=8407474921731372256' title='1 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/2340686390336722114/posts/default/8407474921731372256'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/2340686390336722114/posts/default/8407474921731372256'/><link rel='alternate' type='text/html' href='http://blog.privosoft.com/2007/03/wisdom-of-many-to-rate-my-credit.html' title='wisdom of many to rate my credit'/><author><name>Privosoft LLC</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>1</thr:total></entry></feed>
