<?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-17362732</id><updated>2011-07-07T16:12:08.055-07:00</updated><category term='script'/><category term='ruby'/><category term='rails'/><title type='text'>Structurally yours</title><subtitle type='html'>Information technologies, sex, and rock'n roll</subtitle><link rel='http://schemas.google.com/g/2005#feed' type='application/atom+xml' href='http://technofinance.blogspot.com/feeds/posts/default'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/17362732/posts/default?max-results=100'/><link rel='alternate' type='text/html' href='http://technofinance.blogspot.com/'/><link rel='hub' href='http://pubsubhubbub.appspot.com/'/><author><name>Nicolas</name><uri>http://www.blogger.com/profile/03434148024010872285</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://2.bp.blogspot.com/_vbz7u92h91c/SJ6emBHBXjI/AAAAAAAAAC8/R27sE5IMTms/s1600-R/me.jpg'/></author><generator version='7.00' uri='http://www.blogger.com'>Blogger</generator><openSearch:totalResults>49</openSearch:totalResults><openSearch:startIndex>1</openSearch:startIndex><openSearch:itemsPerPage>100</openSearch:itemsPerPage><entry><id>tag:blogger.com,1999:blog-17362732.post-5181697827006986900</id><published>2008-12-06T21:30:00.001-08:00</published><updated>2008-12-06T21:34:51.114-08:00</updated><title type='text'>a simple script to install remotely plugins and theme to wordpress</title><content type='html'>when I want to install a plugin or a theme on my distant server, I merely copy the URL in the clipboard and type in the terminal of my macbook
&lt;blockquote&gt;
&gt;plugin www.../theplugin.zip
&lt;/blockquote&gt;

To do this,  just add to your .bashrc :
&lt;blockquote&gt;
plugin ()
{
ssh nrolland@xquant.net "cd /var/www/xquant.net/subdomains/blog/httpdocs/wp-content/plugins; wget -O toto  $1; unzip toto; rm toto"
}

theme ()
{
ssh nrolland@xquant.net "cd /var/www/xquant.net/subdomains/blog/httpdocs/wp-content/themes; wget -O toto  $1; unzip toto; rm toto"
}&lt;/blockquote&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/17362732-5181697827006986900?l=technofinance.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://technofinance.blogspot.com/feeds/5181697827006986900/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=17362732&amp;postID=5181697827006986900' title='42 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/17362732/posts/default/5181697827006986900'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/17362732/posts/default/5181697827006986900'/><link rel='alternate' type='text/html' href='http://technofinance.blogspot.com/2008/12/simple-script-to-install-pugins-and.html' title='a simple script to install remotely plugins and theme to wordpress'/><author><name>Nicolas</name><uri>http://www.blogger.com/profile/03434148024010872285</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://2.bp.blogspot.com/_vbz7u92h91c/SJ6emBHBXjI/AAAAAAAAAC8/R27sE5IMTms/s1600-R/me.jpg'/></author><thr:total>42</thr:total></entry><entry><id>tag:blogger.com,1999:blog-17362732.post-8080981387169497202</id><published>2008-08-10T00:55:00.000-07:00</published><updated>2008-08-10T05:06:02.842-07:00</updated><title type='text'>unix pipe at work</title><content type='html'>&lt;div&gt;I wanted to copy a large amount of files into my iTunes library.&lt;/div&gt;&lt;div&gt;Bummer, a computer got disconnected right in the middle, after 5 hours of copy...&lt;/div&gt;&lt;div&gt;
&lt;/div&gt;&lt;div&gt;how do I resume where it stopped ?&lt;/div&gt;&lt;div&gt;
&lt;/div&gt;&lt;div&gt;I saw that every directory u until letter D was already copied.&lt;/div&gt;&lt;div&gt;After a few tinkering, I finally found how to not repeat the copy already made :&lt;/div&gt;&lt;div&gt;
&lt;/div&gt;&lt;div&gt;
&lt;/div&gt;&lt;div&gt;find . -maxdepth 1 |  | grep '^..[C-Z]+*' |  tr '\012' '\000' |  xargs -0 -Ifrom cp -Rvf from /bibliotheque/music &lt;/div&gt;&lt;div&gt;
&lt;/div&gt;&lt;div&gt;There you go&lt;/div&gt;&lt;div&gt;
&lt;/div&gt;&lt;div&gt;edit : added the | tr '\012' '\000' | xargs -0 step that permits to circumvent the old misunderstanding between \n and null terminated entries&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/17362732-8080981387169497202?l=technofinance.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://technofinance.blogspot.com/feeds/8080981387169497202/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=17362732&amp;postID=8080981387169497202' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/17362732/posts/default/8080981387169497202'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/17362732/posts/default/8080981387169497202'/><link rel='alternate' type='text/html' href='http://technofinance.blogspot.com/2008/08/unix-pipe-at-work.html' title='unix pipe at work'/><author><name>Nicolas</name><uri>http://www.blogger.com/profile/03434148024010872285</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://2.bp.blogspot.com/_vbz7u92h91c/SJ6emBHBXjI/AAAAAAAAAC8/R27sE5IMTms/s1600-R/me.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-17362732.post-7534366991073695425</id><published>2007-09-22T14:41:00.000-07:00</published><updated>2007-09-22T14:51:42.150-07:00</updated><title type='text'>Fuse rocks</title><content type='html'>FUSE enables you to mount a remote filesystem locally.
It is common knowledge that computers are done for lazy people to spend 2 hours to find a way to save 5 minutes. I therefore mount my dedibox to ~/dediboxfs and, magic, I can publish and access all the remote files as if they were just there.

For macs it's a gift from google, &lt;a href="http://code.google.com/p/macfuse/"&gt;to be found there&lt;/a&gt;  for &lt;a href="http://code.google.com/p/macfuse/"&gt;MacFuse&lt;/a&gt; , and there for &lt;a href="http://fuse.sourceforge.net/sshfs.html"&gt;SSHFS&lt;/a&gt;, other FS are available elsewhere (ftp, gmail, etc... )&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/17362732-7534366991073695425?l=technofinance.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://technofinance.blogspot.com/feeds/7534366991073695425/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=17362732&amp;postID=7534366991073695425' title='1 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/17362732/posts/default/7534366991073695425'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/17362732/posts/default/7534366991073695425'/><link rel='alternate' type='text/html' href='http://technofinance.blogspot.com/2007/09/fuse-rocks.html' title='Fuse rocks'/><author><name>Nicolas</name><uri>http://www.blogger.com/profile/03434148024010872285</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://2.bp.blogspot.com/_vbz7u92h91c/SJ6emBHBXjI/AAAAAAAAAC8/R27sE5IMTms/s1600-R/me.jpg'/></author><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-17362732.post-4548837046443071998</id><published>2007-08-26T11:11:00.001-07:00</published><updated>2007-08-26T11:11:38.060-07:00</updated><title type='text'>enough is enough : carry trade</title><content type='html'>All those hedge fund borrowing money in low interests places and investing them in high interests countries is immoral.
It's unfair that they are making money, and that I am not.


Mais que fait la HALDE ??&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/17362732-4548837046443071998?l=technofinance.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://technofinance.blogspot.com/feeds/4548837046443071998/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=17362732&amp;postID=4548837046443071998' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/17362732/posts/default/4548837046443071998'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/17362732/posts/default/4548837046443071998'/><link rel='alternate' type='text/html' href='http://technofinance.blogspot.com/2007/08/enough-is-enough-carry-trade.html' title='enough is enough : carry trade'/><author><name>Nicolas</name><uri>http://www.blogger.com/profile/03434148024010872285</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://2.bp.blogspot.com/_vbz7u92h91c/SJ6emBHBXjI/AAAAAAAAAC8/R27sE5IMTms/s1600-R/me.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-17362732.post-252300552530113332</id><published>2007-08-26T11:10:00.000-07:00</published><updated>2007-08-26T11:11:12.483-07:00</updated><title type='text'>Small victory</title><content type='html'>xxxxx@sd-8517:~$ uptime
20:29:25 up 36 days,  6:04&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/17362732-252300552530113332?l=technofinance.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://technofinance.blogspot.com/feeds/252300552530113332/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=17362732&amp;postID=252300552530113332' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/17362732/posts/default/252300552530113332'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/17362732/posts/default/252300552530113332'/><link rel='alternate' type='text/html' href='http://technofinance.blogspot.com/2007/08/small-victory.html' title='Small victory'/><author><name>Nicolas</name><uri>http://www.blogger.com/profile/03434148024010872285</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://2.bp.blogspot.com/_vbz7u92h91c/SJ6emBHBXjI/AAAAAAAAAC8/R27sE5IMTms/s1600-R/me.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-17362732.post-585311470369175144</id><published>2007-08-25T06:36:00.000-07:00</published><updated>2007-08-25T06:37:22.093-07:00</updated><title type='text'>Ripping off investors</title><content type='html'>Looking into ways of making a few personnal investments, I stumbled upon http://www.currencyshares.com/ from Rydex Investments.
Those funds offers to invest in foreign exchange currency. You buy euro, euro goes up, you win money. quite simple.

So where is the said ripoff? The catch is that those funds don't pay you interests on the foreign currency you invest into.
To see how bad this is, consider the fact that an entire class of trading strategy (fx carry trade) is placed to grab the interests rate *differential*

Now just removing the whole interest rate of one currency is bold.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/17362732-585311470369175144?l=technofinance.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='related' href='http://www.currencyshares.com/' title='Ripping off investors'/><link rel='replies' type='application/atom+xml' href='http://technofinance.blogspot.com/feeds/585311470369175144/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=17362732&amp;postID=585311470369175144' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/17362732/posts/default/585311470369175144'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/17362732/posts/default/585311470369175144'/><link rel='alternate' type='text/html' href='http://technofinance.blogspot.com/2007/08/ripping-off-investors.html' title='Ripping off investors'/><author><name>Nicolas</name><uri>http://www.blogger.com/profile/03434148024010872285</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://2.bp.blogspot.com/_vbz7u92h91c/SJ6emBHBXjI/AAAAAAAAAC8/R27sE5IMTms/s1600-R/me.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-17362732.post-4265100154043502591</id><published>2007-06-17T01:47:00.000-07:00</published><updated>2007-06-17T01:54:43.109-07:00</updated><title type='text'>dedibox and awstats</title><content type='html'>My dedibox kept crashing because of awstats apparently.
Every 2 or 3 days, I needed to reboot it electrically.
I advise you to deactivate this module in the cron jobs, unless you have time to deal with it.

On another subject, I posted a nice video from Google on &lt;a href="http://blog.xquant.net"&gt;xQuant&lt;/a&gt;
 that talks about a practical use of inference to unsupervisely discover structure among texts.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/17362732-4265100154043502591?l=technofinance.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://technofinance.blogspot.com/feeds/4265100154043502591/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=17362732&amp;postID=4265100154043502591' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/17362732/posts/default/4265100154043502591'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/17362732/posts/default/4265100154043502591'/><link rel='alternate' type='text/html' href='http://technofinance.blogspot.com/2007/06/dedibox-and-awstats.html' title='dedibox and awstats'/><author><name>Nicolas</name><uri>http://www.blogger.com/profile/03434148024010872285</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://2.bp.blogspot.com/_vbz7u92h91c/SJ6emBHBXjI/AAAAAAAAAC8/R27sE5IMTms/s1600-R/me.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-17362732.post-8474479182370789997</id><published>2007-06-09T02:47:00.000-07:00</published><updated>2007-06-09T03:33:20.429-07:00</updated><title type='text'>Blogs et dépendances</title><content type='html'>If I look at my subscription habits, I mostly subscribe to blog that are either
&lt;ul&gt;&lt;li&gt;Very specialized on a technical subject&lt;/li&gt;&lt;li&gt;At a forking point on a topical and applicative subject
&lt;/li&gt;&lt;/ul&gt;
That is why I prefer to split my blogs between
&lt;ul&gt;&lt;li&gt;my technical geeky posts about Linux, MacOs, and other system-oriented issues on &lt;a href="http://technofinance.blogspot.com/"&gt;Technofinance &lt;/a&gt;&lt;/li&gt;&lt;li&gt;my math and theoretical posts on &lt;a href="http://blog.xquant.net/"&gt;xQuant&lt;/a&gt;, which intends to be more of an applicative forking point&lt;a href="javascript:void(0)" onclick="return false;" tabindex="7"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/a&gt;&lt;/li&gt;&lt;/ul&gt;
I would be interested to know better about the way readership actually perceives and structures its reading...&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/17362732-8474479182370789997?l=technofinance.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://technofinance.blogspot.com/feeds/8474479182370789997/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=17362732&amp;postID=8474479182370789997' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/17362732/posts/default/8474479182370789997'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/17362732/posts/default/8474479182370789997'/><link rel='alternate' type='text/html' href='http://technofinance.blogspot.com/2007/06/blogs-et-dpendances.html' title='Blogs et dépendances'/><author><name>Nicolas</name><uri>http://www.blogger.com/profile/03434148024010872285</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://2.bp.blogspot.com/_vbz7u92h91c/SJ6emBHBXjI/AAAAAAAAAC8/R27sE5IMTms/s1600-R/me.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-17362732.post-6927360802012506806</id><published>2007-06-03T14:20:00.000-07:00</published><updated>2007-06-03T14:26:40.363-07:00</updated><title type='text'>Wikimedia, Ruby, php, plesk, Apache all working together and being friendly to each other</title><content type='html'>&lt;p&gt;In a brilliant demonstration of technical expertise and non-conformist brio, that is, of utter elegance, &lt;a href="http://www.xquant.net" title="xQuant"&gt;xQuant&lt;/a&gt; is now equipped with a &lt;a href="http://maths.xquant.net" title="Wiki"&gt;Wiki section&lt;/a&gt; that will enable users to render their thoughts in plain English and Latex.
&lt;/p&gt;&lt;p&gt;This &lt;a href="http://maths.xquant.net" title="Wiki"&gt;Wiki&lt;/a&gt; is particularly meant to be used to develop themes including inference, categories, and stochastic finance.
&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/17362732-6927360802012506806?l=technofinance.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://technofinance.blogspot.com/feeds/6927360802012506806/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=17362732&amp;postID=6927360802012506806' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/17362732/posts/default/6927360802012506806'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/17362732/posts/default/6927360802012506806'/><link rel='alternate' type='text/html' href='http://technofinance.blogspot.com/2007/06/wikimedia-ruby-php-plesk-apache-all.html' title='Wikimedia, Ruby, php, plesk, Apache all working together and being friendly to each other'/><author><name>Nicolas</name><uri>http://www.blogger.com/profile/03434148024010872285</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://2.bp.blogspot.com/_vbz7u92h91c/SJ6emBHBXjI/AAAAAAAAAC8/R27sE5IMTms/s1600-R/me.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-17362732.post-2835385399174550581</id><published>2007-05-12T07:52:00.000-07:00</published><updated>2007-05-12T08:47:10.931-07:00</updated><title type='text'>A probability problem and some Ruby</title><content type='html'>&lt;span style="font-family:arial;"&gt;A thoroughly honest game-show host has placed a car behind one of three doors. There is a goat behind each of the other doors. You have no prior knowledge that allows you to distinguish among the doors. "First you point toward a door," he says. "Then I'll open one of the other doors to reveal a goat. After I've shown you the goat, you make your final choice whether to stick with your initial choice of doors, or to switch to the remaining door. You win whatever is behind the door." &lt;/span&gt;
&lt;span style="font-family:arial;"&gt;You begin by pointing to door number 1. The host shows you that door number 3 has a goat.&lt;/span&gt;  &lt;p style="text-align: left; font-family: arial;"&gt;Do the player's chances of getting the car increase by switching to Door 2?&lt;/p&gt;The answer is yes.
There are different ways of looking at the pb.
One is to go on with computation after having a clear view of what to compute.
In situations like this, you need to deal with the information given to you, namely the door opened for you. Then one has to always pick the door with the highest probability &lt;span style="font-style: italic;"&gt;conditioned &lt;/span&gt;to all the information given.

In this case, we just know the result of some operation the host did.
This is typically where to use the Bayes theorem, as it enables us to revert the conditioning to a probability we know, since &lt;span style="font-weight: bold;"&gt;we know the process followed to pick the opened door&lt;/span&gt;.


So if we compute the probability of each possibility we have :

c1, c2, c3 denote that the corresponding door has a car behind
o2 denotes the fact that the door 2 has been opened
p1 denotes the fact that you picked the door 1 in the first place


&lt;ul&gt;&lt;li&gt;P (c1 | o2, p1)  = P ( o2 | c1, p1) * P(c1 | p1 ) / P(o2 | p1  )  =  1/2 * 1/3 / 1/2 = 1/3&lt;/li&gt;&lt;li&gt;P (c2 | o2, p1)  = P ( o2 | c2, p1) * P(c2 | p1 ) / P(o2 | p1  )  =     0 * 1/3 / 1/2 = 0&lt;/li&gt;&lt;li&gt;P (c3 | o2, p1)  = P ( o2 | c3, p1) * P(c3 | p1 ) / P(o2 | p1  )  =     1 * 1/3 / 1/2 =  2/3&lt;/li&gt;&lt;/ul&gt;

The first equality is just Bayes theorem.  then if we explain in plain english the results :
&lt;ul&gt;&lt;li&gt;P ( o2 | c1, p1) = 1/2 because if p1 happens, the host will have to pick between door 2 and door 3 to open, and since the car is behind door 1, he has no other constraints. chance are therefore 1/2 he'll pick up door 2.&lt;/li&gt;&lt;li&gt;P ( o2 | c2, p1) = 0 because if the car is behind door 2, there is no way he'll ever open door 2. Also, P ( c2 | o2 )  = 0 so that P (c2 | o2, p1)  = 0 too so we don't even have to compute this.&lt;/li&gt;&lt;li&gt;P ( o3 | c2, p1) = 1 because if p1 happens, the host will have to pick between door 2 and door 3, but the car being behind door 2, he'll have no choice but to pick the door 3&lt;/li&gt;&lt;/ul&gt;So we see through Bayes that we have an incentive to switch the door we choosed.
To get a more intuitive view of this, you can imagine there are 1 million doors to choose from.
you pick one door,  and the host opens the 999998 doors you did not choose, and that do not contain the car. what are the chance your pick was good in the first place ? it's far more likely the remaining door you did not choose has the car.



A different approach is through raw computation. A clever Rubyist, &lt;strong&gt;Daniel Martin, &lt;/strong&gt;&lt;a href="http://blade.nagaokaut.ac.jp/cgi-bin/scat.rb/ruby/ruby-talk/206299"&gt;posted &lt;/a&gt;a nice illustration to this.

&lt;pre&gt;puts('===Monty Hall, classic version===')
ProbabilityTree.runreport(1.to_r) { |u|
treasuredoor = u.choose(1,2,3)
guessdoor = u.choose(1,2,3)
remaining_doors = [1,2,3].select{ |x|
   x != treasuredoor and x != guessdoor }
showdoor = u.choose(*remaining_doors)
if (treasuredoor == guessdoor)
  u.report "You should stay"
else
  u.report "You should switch"
end
}.display&lt;/pre&gt;
&lt;pre&gt;Produces:

===Monty Hall, classic version===
You should switch
==&gt;     2/3
You should stay
==&gt;     1/3&lt;/pre&gt;
This piece of code illustrates the flexibility of lambda function, as it enables to completely dissociate a &lt;span style="font-style: italic;"&gt;particuliar drawing &lt;/span&gt;(you win, you loose) to the &lt;span style="font-weight: bold; font-style: italic;"&gt;context &lt;/span&gt;in which it is used ( here, it is used to draw up a certain number of simulations, and accumulate the results to see which is more likely)&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/17362732-2835385399174550581?l=technofinance.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://technofinance.blogspot.com/feeds/2835385399174550581/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=17362732&amp;postID=2835385399174550581' title='1 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/17362732/posts/default/2835385399174550581'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/17362732/posts/default/2835385399174550581'/><link rel='alternate' type='text/html' href='http://technofinance.blogspot.com/2007/05/probability-problem-and-some-ruby.html' title='A probability problem and some Ruby'/><author><name>Nicolas</name><uri>http://www.blogger.com/profile/03434148024010872285</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://2.bp.blogspot.com/_vbz7u92h91c/SJ6emBHBXjI/AAAAAAAAAC8/R27sE5IMTms/s1600-R/me.jpg'/></author><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-17362732.post-4571694736989854244</id><published>2007-04-30T08:53:00.000-07:00</published><updated>2007-04-30T08:55:18.768-07:00</updated><title type='text'>Real real estate market</title><content type='html'>&lt;object width="425" height="350"&gt;&lt;param name="movie" value="http://www.youtube.com/v/kUldGc06S3U"&gt;&lt;/param&gt;&lt;param name="wmode" value="transparent"&gt;&lt;/param&gt;&lt;embed src="http://www.youtube.com/v/kUldGc06S3U" type="application/x-shockwave-flash" wmode="transparent" width="425" height="350"&gt;&lt;/embed&gt;&lt;/object&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/17362732-4571694736989854244?l=technofinance.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://technofinance.blogspot.com/feeds/4571694736989854244/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=17362732&amp;postID=4571694736989854244' title='1 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/17362732/posts/default/4571694736989854244'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/17362732/posts/default/4571694736989854244'/><link rel='alternate' type='text/html' href='http://technofinance.blogspot.com/2007/04/real-real-estate-market.html' title='Real real estate market'/><author><name>Nicolas</name><uri>http://www.blogger.com/profile/03434148024010872285</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://2.bp.blogspot.com/_vbz7u92h91c/SJ6emBHBXjI/AAAAAAAAAC8/R27sE5IMTms/s1600-R/me.jpg'/></author><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-17362732.post-1309209915187139495</id><published>2007-04-08T03:17:00.000-07:00</published><updated>2007-04-08T03:22:01.738-07:00</updated><title type='text'>Rubyfu</title><content type='html'>Those wanting to learn Ruby and increase their ruby-fu would find an great help in a gem called &lt;a href="http://facets.rubyforge.org/"&gt;facets&lt;/a&gt;. Written by the most prominent rubycists it cristalizes (sic) the best of ruby.
Apart from being a useful library, its code is a delight to study.


the usual command applies here : sudo gem install facets&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/17362732-1309209915187139495?l=technofinance.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://technofinance.blogspot.com/feeds/1309209915187139495/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=17362732&amp;postID=1309209915187139495' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/17362732/posts/default/1309209915187139495'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/17362732/posts/default/1309209915187139495'/><link rel='alternate' type='text/html' href='http://technofinance.blogspot.com/2007/04/rubyfu.html' title='Rubyfu'/><author><name>Nicolas</name><uri>http://www.blogger.com/profile/03434148024010872285</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://2.bp.blogspot.com/_vbz7u92h91c/SJ6emBHBXjI/AAAAAAAAAC8/R27sE5IMTms/s1600-R/me.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-17362732.post-7760639223390070635</id><published>2007-03-21T15:50:00.000-07:00</published><updated>2007-03-21T16:05:20.802-07:00</updated><title type='text'>Rails and spoonerism :  www.contrepeteur.com</title><content type='html'>In those days of heavy political election in what's left of France, let us celebrate the lightness and purity of Ruby programming langage.  What else could such a nice and sleek website for spoonerism like &lt;a href="http://www.contrepeteur.com"&gt;www.contrepeteur.com&lt;/a&gt; be propelled with ?

Let's not understate the immense contribution that Ruby and rails provided to the fine art of spoonerism.  Such a spirited art could only be moved by a langage equally elevated among the most elitist minds.

So for all spooners and jolly puners, when the pun is slow to come, here is a lightspeed  fastway to come up with a pun.

I must mention for the sake of completeness that each pun has been professionnaly tested, in compliance with the last and most advanced methodology of web application design.


Yours truly,
Nicolas&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/17362732-7760639223390070635?l=technofinance.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://technofinance.blogspot.com/feeds/7760639223390070635/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=17362732&amp;postID=7760639223390070635' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/17362732/posts/default/7760639223390070635'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/17362732/posts/default/7760639223390070635'/><link rel='alternate' type='text/html' href='http://technofinance.blogspot.com/2007/03/rails-and-spoonerism.html' title='Rails and spoonerism :  www.contrepeteur.com'/><author><name>Nicolas</name><uri>http://www.blogger.com/profile/03434148024010872285</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://2.bp.blogspot.com/_vbz7u92h91c/SJ6emBHBXjI/AAAAAAAAAC8/R27sE5IMTms/s1600-R/me.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-17362732.post-4023918232459818476</id><published>2007-02-26T14:21:00.000-08:00</published><updated>2007-02-26T14:36:11.085-08:00</updated><title type='text'>dedibox</title><content type='html'>After installation of my &lt;a href="http://www.dedibox.fr/"&gt;dedibox&lt;/a&gt;,  which is a dedicated linux server hosted by Free, a famous french ISP, I noticed on my logs many brute force attempts to login to my little box : 13000 connections attemps in one day!

Without a minimal security, I have few doubts that this computer would have been taken over in less that 15 minutes.

I strongly advise any linux server to install the following components :
&lt;ul&gt;&lt;li&gt;logwatch : gives you a readable reports of your logs, which are not really for human consumption otherwise&lt;/li&gt;&lt;li&gt;logcheck : sends you the new infos in your logs
&lt;/li&gt;&lt;li&gt;fail2ban : takes active steps to ensure would be attackers get banned from accessing your machine
&lt;/li&gt;&lt;li&gt;portsentry : more evolved active protection against hackers&lt;/li&gt;&lt;/ul&gt;
Setting at least one of each category is minimal, if a computer is to be connected permanently on the internet.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/17362732-4023918232459818476?l=technofinance.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://technofinance.blogspot.com/feeds/4023918232459818476/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=17362732&amp;postID=4023918232459818476' title='1 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/17362732/posts/default/4023918232459818476'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/17362732/posts/default/4023918232459818476'/><link rel='alternate' type='text/html' href='http://technofinance.blogspot.com/2007/02/dedibox.html' title='dedibox'/><author><name>Nicolas</name><uri>http://www.blogger.com/profile/03434148024010872285</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://2.bp.blogspot.com/_vbz7u92h91c/SJ6emBHBXjI/AAAAAAAAAC8/R27sE5IMTms/s1600-R/me.jpg'/></author><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-17362732.post-3600423769790501867</id><published>2007-02-24T03:07:00.000-08:00</published><updated>2007-02-24T03:11:04.437-08:00</updated><title type='text'>Simplicite</title><content type='html'>Une  tres belle application..
Ses elements sont un a un dans leur domaine sont relativement simple, mais composés ensemble ils s'unissent de facon extraordinaire. Qui a dit que l'intelligence reside dans les connexions?

&lt;object width="425" height="350"&gt;&lt;param name="movie" value="http://www.youtube.com/v/mTBPGuPLI5Y"&gt;&lt;/param&gt;&lt;param name="wmode" value="transparent"&gt;&lt;/param&gt;&lt;embed src="http://www.youtube.com/v/mTBPGuPLI5Y" type="application/x-shockwave-flash" wmode="transparent" width="425" height="350"&gt;&lt;/embed&gt;&lt;/object&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/17362732-3600423769790501867?l=technofinance.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://technofinance.blogspot.com/feeds/3600423769790501867/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=17362732&amp;postID=3600423769790501867' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/17362732/posts/default/3600423769790501867'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/17362732/posts/default/3600423769790501867'/><link rel='alternate' type='text/html' href='http://technofinance.blogspot.com/2007/02/simplicite.html' title='Simplicite'/><author><name>Nicolas</name><uri>http://www.blogger.com/profile/03434148024010872285</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://2.bp.blogspot.com/_vbz7u92h91c/SJ6emBHBXjI/AAAAAAAAAC8/R27sE5IMTms/s1600-R/me.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-17362732.post-7694809132589840735</id><published>2006-12-28T12:03:00.000-08:00</published><updated>2007-01-01T11:13:57.300-08:00</updated><title type='text'>functional programming, json, mochikit</title><content type='html'>Through a javascript one liner, Delicious allow to retrieve tagged content  ( via JSON, &lt;a href="http://technofinance.blogspot.com/2006/05/json-web-20-esperanto.html"&gt;previously discussed&lt;/a&gt;)
&lt;pre class="csharpcode"&gt;
&lt;span class="kwrd"&gt;&amp;lt;&lt;/span&gt;&lt;span class="html"&gt;script&lt;/span&gt; &lt;span class="attr"&gt;type&lt;/span&gt;&lt;span class="kwrd"&gt;="text/javascript"&lt;/span&gt; &lt;span class="attr"&gt;src&lt;/span&gt;&lt;span class="kwrd"&gt;="http://del.icio.us/feeds/json/nrolland?count=20"&lt;/span&gt;&lt;span class="kwrd"&gt;&amp;gt;&amp;lt;/&lt;/span&gt;&lt;span class="html"&gt;script&lt;/span&gt;&lt;span class="kwrd"&gt;&amp;gt;&lt;/span&gt;&lt;/pre&gt;
The format under which data are received is the following :
&lt;pre&gt;Delicious.posts =
[{"u":"http://www.napyfab.com/ajax-indicators/",
 "d":"AJAX Activity Indicators",
 "t":["web2.0","javascript","design","graphics","webdesign","ajax","icons"]}]&lt;/pre&gt;
If those tagged posts are to be processed, functional programming can help reduce &lt;span style="font-weight: bold; font-style: italic;"&gt;significantly&lt;/span&gt; the amount of code needed.
Example : Let's say I want to retrieve &lt;span style="font-style: italic; font-weight: bold;"&gt;only &lt;/span&gt;those posts tagged with selected categories, and have them accessible through those categories. My navigation box on the right here is a simple  example of that.
Here's how I might do it in javascript, starting from imperative constructs to functional ones :

&lt;div style="width:82%"&gt;
//v1
&lt;textarea name="code" class="js" rows="15" cols="50"&gt;
    arfctFilterOnValue     = [      function (item) {     return item["t"].contains("emergence"); },
                                function (item) {     return item["t"].contains("learning"); },
                                function (item) {     return item["t"].contains("diffusion"); },
                                function (item) {     return item["t"].contains("products"); },
                                function (item) {     return item["t"].contains("entrepreneurship"); },
                                function (item) {     return item["t"].contains("software"); } ];
   
    var mainCategoriesPosts = [];
    for (i = 0;i &lt; 6; i++) {
            mainCategoriesPosts[i] =     filter(arfctFilterOnValue[i], Delicious.posts);
    }
&lt;/textarea&gt;

//v2
&lt;textarea name="code" class="js" rows="15" cols="100"&gt;
    fctFilterOnValueAbstract     = function (value, item) { return item["t"].contains(value);    }
    arfctFilterOnValue     = [ partial(fctFilterOnValueAbstract, "emergence"),
                            partial(fctFilterOnValueAbstract, "learning"),
                            partial(fctFilterOnValueAbstract, "diffusion"),
                            partial(fctFilterOnValueAbstract, "products"),
                            partial(fctFilterOnValueAbstract, "entrepreneurship"),
                            partial(fctFilterOnValueAbstract, "software")     ];

    var mainCategoriesPosts = [];
    for (i = 0;i &lt; 6; i++) {
            mainCategoriesPosts[i] =     filter(arfctFilterOnValue[i], Delicious.posts);
    }
&lt;/textarea&gt;

//v3
&lt;textarea name="code" class="js" rows="15" cols="100"&gt;
    applier = function(arg1) { return function (fctn) { return partial(fctn,arg1); } ;}
    fctFilterOnValueAbstract     = function (value, item) { return item["t"].contains(value);    }
    arfctFilterOnValue     = [ applier(fctFilterOnValueAbstract)(partial)("emergence"),
                            applier(fctFilterOnValueAbstract)(partial)("learning"),
                            applier(fctFilterOnValueAbstract)(partial)("diffusion"),
                            applier(fctFilterOnValueAbstract)(partial)("products"),
                            applier(fctFilterOnValueAbstract)(partial)("entrepreneurship"),
                            applier(fctFilterOnValueAbstract)(partial)("software")     ];

    var mainCategoriesPosts = [];
    for (i = 0;i &lt; 6; i++) {
            mainCategoriesPosts[i] =     filter(arfctFilterOnValue[i], Delicious.posts);
    }
&lt;/textarea&gt;

//v4
&lt;textarea name="code" class="js" rows="15" cols="100"&gt;
    var mainCategories          = [ "emergence", "learning", "diffusion", "products", "entrepreneurship", "software" ];
    fctFilterOnValueAbstract = function (value, item) { return item["t"].contains(value);    }
   
    applier = function(arg1) { return function (fctn) { return partial(fctn,arg1); } ;}
    arfctFilterOnValue = map(applier(fctFilterOnValueAbstract)(partial),mainCategories);
   
    var mainCategoriesPosts = [];
    for (i = 0;i &lt; 6; i++) {
            mainCategoriesPosts[i] =     filter(arfctFilterOnValue[i], Delicious.posts);
    }
&lt;/textarea&gt;

//v5
&lt;textarea name="code" class="js" rows="15" cols="100"&gt;
    Object.prototype.toArray = function() {
        ret = [];
        for (var i=0; i &amp;lt;this.length;i++)
            ret.push(this[i]);            
        return ret;
    }   
    applier     = function(arg1) { return function (fctn) { return partial(fctn,arg1); } ;}
    reverseargs = function(fct) { return function () { return fct.apply(this, arguments.toArray().reverse()); };};

    var mainCategories          = [ "emergence", "learning", "diffusion", "products", "entrepreneurship", "software" ];
    fctFilterOnValueAbstract = function (value, item) { return item["t"].contains(value);    }

    arfctFilterOnValue = map(applier(fctFilterOnValueAbstract)(partial), mainCategories);
   
    var mainCategoriesPosts = [];
    for (i = 0;i &lt; 6; i++) {
            mainCategoriesPosts[i] =     reverseargs(filter)(Delicious.posts, arfctFilterOnValue[i]);
    }
&lt;/textarea&gt;

//v6
&lt;textarea name="code" class="js" rows="15" cols="100"&gt;
      applier     = function(arg1) { return function (fctn) { return partial(fctn,arg1); } ;}
    reverseargs = function(fct) { return function () { return fct.apply(this, arguments.toArray().reverse()); };};

    var mainCategories          = [ "emergence", "learning", "diffusion", "products", "entrepreneurship", "software" ];
    fctFilterOnValueAbstract = function (value, item) { return item["t"].contains(value);    }

    arfctFilterOnValue = map(applier(fctFilterOnValueAbstract)(partial), mainCategories);
   
    var mainCategoriesPosts = [];
    for (i = 0;i &lt; 6; i++) {
            mainCategoriesPosts[i] =     applier(Delicious.posts)(reverseargs(filter))(arfctFilterOnValue[i]);
    }
&lt;/textarea&gt;

//v7   
&lt;textarea name="code" class="js" rows="15" cols="100"&gt;
    applier     = function(arg1) { return function (fctn) { return partial(fctn,arg1); } ;}
    reverseargs = function(fct) { return function () { return fct.apply(this, arguments.toArray().reverse()); };};

    var mainCategories          = [ "emergence", "learning", "diffusion", "products", "entrepreneurship", "software" ];
    fctFilterOnValueAbstract = function (value, item) { return item["t"].contains(value);    }

    mainCategoriesPosts = map(applier(Delicious.posts)(reverseargs(filter)), map(applier(fctFilterOnValueAbstract)(partial), mainCategories));
&lt;/textarea&gt;
&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/17362732-7694809132589840735?l=technofinance.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://technofinance.blogspot.com/feeds/7694809132589840735/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=17362732&amp;postID=7694809132589840735' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/17362732/posts/default/7694809132589840735'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/17362732/posts/default/7694809132589840735'/><link rel='alternate' type='text/html' href='http://technofinance.blogspot.com/2006/12/functional-programming-json-mochikit.html' title='functional programming, json, mochikit'/><author><name>Nicolas</name><uri>http://www.blogger.com/profile/03434148024010872285</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://2.bp.blogspot.com/_vbz7u92h91c/SJ6emBHBXjI/AAAAAAAAAC8/R27sE5IMTms/s1600-R/me.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-17362732.post-6959661845293619360</id><published>2006-12-14T12:37:00.000-08:00</published><updated>2006-12-14T13:13:16.322-08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='ruby'/><category scheme='http://www.blogger.com/atom/ns#' term='rails'/><category scheme='http://www.blogger.com/atom/ns#' term='script'/><title type='text'>RailsDay goodness at your fingertip</title><content type='html'>Who's going to thank Nicolas ?
Now you can get all the wonderful applications crafted at the &lt;a href="http://www.railsday2006.com/"&gt;RailsDay &lt;/a&gt;in a single command.
And they are ready for you to import into your RadRails environment too..
&lt;a href="javascript:expandcollapse('railsday')"&gt;[railsday.rb]&lt;/a&gt;
&lt;span class="posthidden" id="railsday"&gt;
&lt;pre class="csharp"&gt;
def team_to_project(team)
    `mkdir "RadRails#{team}"`
    puts "Start fetching SVN for Team #{team}"
    `svn co  "http://svn.railsday2006.com/railsday/team#{team}" "RadRails#{team}`
        radrailsproject  =  &lt;span class="kwrd"&gt;&amp;lt;&amp;lt;&lt;/span&gt;&lt;span class="html"&gt;-end_eval&lt;/span&gt;
&lt;span class="kwrd"&gt;&amp;lt;&lt;/span&gt;?&lt;span class="attr"&gt;xml&lt;/span&gt; &lt;span class="attr"&gt;version&lt;/span&gt;&lt;span class="kwrd"&gt;="1.0"&lt;/span&gt; &lt;span class="attr"&gt;encoding&lt;/span&gt;&lt;span class="kwrd"&gt;="UTF-8"&lt;/span&gt;?&lt;span class="kwrd"&gt;&amp;gt;&lt;/span&gt;
    &lt;span class="kwrd"&gt;&amp;lt;&lt;/span&gt;&lt;span class="html"&gt;projectDescription&lt;/span&gt;&lt;span class="kwrd"&gt;&amp;gt;&lt;/span&gt;
        &lt;span class="kwrd"&gt;&amp;lt;&lt;/span&gt;&lt;span class="html"&gt;name&lt;/span&gt;&lt;span class="kwrd"&gt;&amp;gt;&lt;/span&gt;RadRails#{team}&lt;span class="kwrd"&gt;&amp;lt;/&lt;/span&gt;&lt;span class="html"&gt;name&lt;/span&gt;&lt;span class="kwrd"&gt;&amp;gt;&lt;/span&gt;
        &lt;span class="kwrd"&gt;&amp;lt;&lt;/span&gt;&lt;span class="html"&gt;comment&lt;/span&gt;&lt;span class="kwrd"&gt;&amp;gt;&amp;lt;/&lt;/span&gt;&lt;span class="html"&gt;comment&lt;/span&gt;&lt;span class="kwrd"&gt;&amp;gt;&lt;/span&gt;
        &lt;span class="kwrd"&gt;&amp;lt;&lt;/span&gt;&lt;span class="html"&gt;projects&lt;/span&gt;&lt;span class="kwrd"&gt;&amp;gt;&lt;/span&gt;
        &lt;span class="kwrd"&gt;&amp;lt;/&lt;/span&gt;&lt;span class="html"&gt;projects&lt;/span&gt;&lt;span class="kwrd"&gt;&amp;gt;&lt;/span&gt;
        &lt;span class="kwrd"&gt;&amp;lt;&lt;/span&gt;&lt;span class="html"&gt;buildSpec&lt;/span&gt;&lt;span class="kwrd"&gt;&amp;gt;&lt;/span&gt;
            &lt;span class="kwrd"&gt;&amp;lt;&lt;/span&gt;&lt;span class="html"&gt;buildCommand&lt;/span&gt;&lt;span class="kwrd"&gt;&amp;gt;&lt;/span&gt;
            &lt;span class="kwrd"&gt;&amp;lt;&lt;/span&gt;&lt;span class="html"&gt;name&lt;/span&gt;&lt;span class="kwrd"&gt;&amp;gt;&lt;/span&gt;org.rubypeople.rdt.core.rubybuilder&lt;span class="kwrd"&gt;&amp;lt;/&lt;/span&gt;&lt;span class="html"&gt;name&lt;/span&gt;&lt;span class="kwrd"&gt;&amp;gt;&lt;/span&gt;
                &lt;span class="kwrd"&gt;&amp;lt;&lt;/span&gt;&lt;span class="html"&gt;arguments&lt;/span&gt;&lt;span class="kwrd"&gt;&amp;gt;&lt;/span&gt;
                &lt;span class="kwrd"&gt;&amp;lt;/&lt;/span&gt;&lt;span class="html"&gt;arguments&lt;/span&gt;&lt;span class="kwrd"&gt;&amp;gt;&lt;/span&gt;
            &lt;span class="kwrd"&gt;&amp;lt;/&lt;/span&gt;&lt;span class="html"&gt;buildCommand&lt;/span&gt;&lt;span class="kwrd"&gt;&amp;gt;&lt;/span&gt;
        &lt;span class="kwrd"&gt;&amp;lt;/&lt;/span&gt;&lt;span class="html"&gt;buildSpec&lt;/span&gt;&lt;span class="kwrd"&gt;&amp;gt;&lt;/span&gt;
        &lt;span class="kwrd"&gt;&amp;lt;&lt;/span&gt;&lt;span class="html"&gt;natures&lt;/span&gt;&lt;span class="kwrd"&gt;&amp;gt;&lt;/span&gt;
            &lt;span class="kwrd"&gt;&amp;lt;&lt;/span&gt;&lt;span class="html"&gt;nature&lt;/span&gt;&lt;span class="kwrd"&gt;&amp;gt;&lt;/span&gt;org.rubypeople.rdt.core.rubynature&lt;span class="kwrd"&gt;&amp;lt;/&lt;/span&gt;&lt;span class="html"&gt;nature&lt;/span&gt;&lt;span class="kwrd"&gt;&amp;gt;&lt;/span&gt;
        &lt;span class="kwrd"&gt;&amp;lt;/&lt;/span&gt;&lt;span class="html"&gt;natures&lt;/span&gt;&lt;span class="kwrd"&gt;&amp;gt;&lt;/span&gt;
    &lt;span class="kwrd"&gt;&amp;lt;/&lt;/span&gt;&lt;span class="html"&gt;projectDescription&lt;/span&gt;&lt;span class="kwrd"&gt;&amp;gt;&lt;/span&gt;
    end_eval

    File.open("RadRails#{team}/.project","w") do |f|
        f &lt;span class="kwrd"&gt;&amp;lt;&amp;lt;&lt;/span&gt; radrailsproject
    end
end

def fetch(range)
    range.entries.each do |team|
        team_to_project team
    end
end
&lt;/pre&gt;
&lt;/span&gt;
After, just run an irb session and type in 
&lt;pre&gt;
require 'railsday'
fetch(1..183)
&lt;/pre&gt;
And there you go !&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/17362732-6959661845293619360?l=technofinance.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://technofinance.blogspot.com/feeds/6959661845293619360/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=17362732&amp;postID=6959661845293619360' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/17362732/posts/default/6959661845293619360'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/17362732/posts/default/6959661845293619360'/><link rel='alternate' type='text/html' href='http://technofinance.blogspot.com/2006/12/railsday-goodness-at-your-fingertip.html' title='RailsDay goodness at your fingertip'/><author><name>Nicolas</name><uri>http://www.blogger.com/profile/03434148024010872285</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://2.bp.blogspot.com/_vbz7u92h91c/SJ6emBHBXjI/AAAAAAAAAC8/R27sE5IMTms/s1600-R/me.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-17362732.post-7929391116717339009</id><published>2006-12-14T01:40:00.000-08:00</published><updated>2006-12-27T14:33:12.983-08:00</updated><title type='text'>singleton class in ruby</title><content type='html'>A central concept in Ruby metaprogramming is the &lt;span style="font-weight: bold;"&gt;singleton class&lt;/span&gt;.
Here is a short illustration for you to chew of how the singleton class opens up metaprogramming possibilities.
&lt;pre&gt;
&lt;verbatim&gt;
class A
 def self.thing
   @thing
 end
 def self.thing=(x)
   @thing = x
 end
end
&lt;/verbatim&gt;
&lt;/pre&gt;This is equivalent to
&lt;pre&gt;&lt;verbatim&gt;
class A
 class &lt;&lt;&gt;
&lt;/verbatim&gt;&lt;/pre&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/17362732-7929391116717339009?l=technofinance.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://technofinance.blogspot.com/feeds/7929391116717339009/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=17362732&amp;postID=7929391116717339009' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/17362732/posts/default/7929391116717339009'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/17362732/posts/default/7929391116717339009'/><link rel='alternate' type='text/html' href='http://technofinance.blogspot.com/2006/12/singleton-class-in-ruby.html' title='singleton class in ruby'/><author><name>Nicolas</name><uri>http://www.blogger.com/profile/03434148024010872285</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://2.bp.blogspot.com/_vbz7u92h91c/SJ6emBHBXjI/AAAAAAAAAC8/R27sE5IMTms/s1600-R/me.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-17362732.post-5204343639685553852</id><published>2006-12-13T09:58:00.000-08:00</published><updated>2007-01-01T11:13:57.276-08:00</updated><title type='text'>Have it all : Ruby, irb, autocompletion, autodocumentation</title><content type='html'>Ruby users live long and happy with irb. But everything is not rosy under default irb's sun.
One generally wishes :

&lt;ul&gt;&lt;li&gt;documentation at your fingertip. what's available from the expression I just started to type ?
&lt;/li&gt;&lt;li&gt;just.. standard auto completion
&lt;/li&gt;&lt;li&gt;also correct handling of keys like "[" and "]" (which fails if you are under French or other keyboard layouts) is of occasional use
&lt;/li&gt;&lt;/ul&gt;
So for all this, here is a irbrc file, working under windows and Unix.

&lt;ol&gt;&lt;li&gt;You need to create a file named .irbrc (for windows user, call it toto.txt then rename it .irbrc from the command line)&lt;/li&gt;&lt;li&gt;Then create an system environment variable called IRBRC, containing the complete path to your .irbrc file.&lt;/li&gt;&lt;li&gt;Then just install the fastri gem and strat the documentation server using the command&lt;/li&gt;&lt;ol&gt;&lt;ol&gt;&lt;ul&gt;&lt;li&gt;gem install fastri&lt;/li&gt;&lt;li&gt;fastri-server
&lt;/li&gt;&lt;/ul&gt;&lt;/ol&gt;&lt;/ol&gt;&lt;/ol&gt;That'll get you started with everything you need to truly enjoy IRB goodness

PS: Credits to &lt;a href="http://eigenclass.org/hiki.rb?irb+ri+completion"&gt;eigenclass &lt;/a&gt;
and the other Rubyist for all this goodness


[Updated at 19/12/06]

You can either &lt;a href="http://www.esnips.com/doc/1db515da-74ba-4f81-a3a8-1e8169cd5a4d"&gt;download the file&lt;/a&gt; , of copy it from down there

&lt;a href="javascript:expandcollapse('ircrbconfig')"&gt;[Click to display the .ircrb file]&lt;/a&gt;
&lt;span class="posthidden" id="ircrbconfig"&gt;
&lt;pre&gt;&lt;span class="ident"&gt;require&lt;/span&gt; &lt;span class="punct"&gt;'&lt;/span&gt;&lt;span class="string"&gt;irb/completion&lt;/span&gt;&lt;span class="punct"&gt;'&lt;/span&gt;
&lt;span class="ident"&gt;require&lt;/span&gt; &lt;span class="punct"&gt;'&lt;/span&gt;&lt;span class="string"&gt;rbconfig&lt;/span&gt;&lt;span class="punct"&gt;'&lt;/span&gt;

&lt;span class="keyword"&gt;module &lt;/span&gt;&lt;span class="module"&gt;Kernel&lt;/span&gt;
  &lt;span class="ident"&gt;include&lt;/span&gt; &lt;span class="constant"&gt;Config&lt;/span&gt;

  &lt;span class="keyword"&gt;def &lt;/span&gt;&lt;span class="method"&gt;r&lt;/span&gt;&lt;span class="punct"&gt;(&lt;/span&gt;&lt;span class="ident"&gt;arg&lt;/span&gt;&lt;span class="punct"&gt;)&lt;/span&gt;
 &lt;span class="punct"&gt;(&lt;/span&gt;&lt;span class="constant"&gt;CONFIG&lt;/span&gt;&lt;span class="punct"&gt;[&amp;quot;&lt;/span&gt;&lt;span class="string"&gt;target_alias&lt;/span&gt;&lt;span class="punct"&gt;&amp;quot;]&lt;/span&gt; &lt;span class="punct"&gt;==&lt;/span&gt; &lt;span class="punct"&gt;&amp;quot;&lt;/span&gt;&lt;span class="string"&gt;i386-mswin32&lt;/span&gt;&lt;span class="punct"&gt;&amp;quot;)&lt;/span&gt; &lt;span class="punct"&gt;?&lt;/span&gt;  &lt;span class="punct"&gt;(&lt;/span&gt; &lt;span class="ident"&gt;puts&lt;/span&gt; `&lt;span class="ident"&gt;fri&lt;/span&gt;&lt;span class="punct"&gt;.&lt;/span&gt;&lt;span class="ident"&gt;cmd&lt;/span&gt; &lt;span class="punct"&gt;&amp;quot;&lt;/span&gt;&lt;span class="string"&gt;&lt;span class="expr"&gt;#{arg}&lt;/span&gt;&lt;/span&gt;&lt;span class="punct"&gt;&amp;quot;`&lt;/span&gt; &lt;span class="punct"&gt;)&lt;/span&gt; &lt;span class="punct"&gt;:&lt;/span&gt; &lt;span class="punct"&gt;(&lt;/span&gt;&lt;span class="ident"&gt;puts&lt;/span&gt; `&lt;span class="ident"&gt;fri&lt;/span&gt; &lt;span class="punct"&gt;&amp;quot;&lt;/span&gt;&lt;span class="string"&gt;&lt;span class="expr"&gt;#{arg}&lt;/span&gt;&lt;/span&gt;&lt;span class="punct"&gt;&amp;quot;`)&lt;/span&gt;

  &lt;span class="keyword"&gt;end&lt;/span&gt;
  &lt;span class="ident"&gt;private&lt;/span&gt; &lt;span class="symbol"&gt;:r&lt;/span&gt;
&lt;span class="keyword"&gt;end&lt;/span&gt;

&lt;span class="keyword"&gt;class &lt;/span&gt;&lt;span class="class"&gt;Array&lt;/span&gt;
  &lt;span class="keyword"&gt;def &lt;/span&gt;&lt;span class="method"&gt;filter&lt;/span&gt;&lt;span class="punct"&gt;(&amp;amp;&lt;/span&gt;&lt;span class="ident"&gt;predicate&lt;/span&gt;&lt;span class="punct"&gt;)&lt;/span&gt;

      &lt;span class="constant"&gt;self&lt;/span&gt;&lt;span class="punct"&gt;.&lt;/span&gt;&lt;span class="ident"&gt;each&lt;/span&gt; &lt;span class="keyword"&gt;do&lt;/span&gt; &lt;span class="punct"&gt;|&lt;/span&gt;&lt;span class="ident"&gt;item&lt;/span&gt;&lt;span class="punct"&gt;|&lt;/span&gt; 
          &lt;span class="keyword"&gt;if&lt;/span&gt;&lt;span class="punct"&gt;(&lt;/span&gt;&lt;span class="ident"&gt;predicate&lt;/span&gt;&lt;span class="punct"&gt;(&lt;/span&gt;&lt;span class="ident"&gt;item&lt;/span&gt;&lt;span class="punct"&gt;))&lt;/span&gt;

           &lt;span class="keyword"&gt;yield&lt;/span&gt; &lt;span class="ident"&gt;item&lt;/span&gt;
           &lt;span class="keyword"&gt;end&lt;/span&gt;
      &lt;span class="keyword"&gt;end&lt;/span&gt;
  &lt;span class="keyword"&gt;end&lt;/span&gt;
&lt;span class="keyword"&gt;end&lt;/span&gt;

&lt;span class="keyword"&gt;class &lt;/span&gt;&lt;span class="class"&gt;Object&lt;/span&gt;
  &lt;span class="ident"&gt;include&lt;/span&gt; &lt;span class="constant"&gt;Config&lt;/span&gt;
  &lt;span class="keyword"&gt;def &lt;/span&gt;&lt;span class="method"&gt;puts_ri_documentation_for&lt;/span&gt;&lt;span class="punct"&gt;(&lt;/span&gt;&lt;span class="ident"&gt;obj&lt;/span&gt;&lt;span class="punct"&gt;,&lt;/span&gt; &lt;span class="ident"&gt;meth&lt;/span&gt;&lt;span class="punct"&gt;)&lt;/span&gt;

    &lt;span class="keyword"&gt;case&lt;/span&gt; &lt;span class="constant"&gt;self&lt;/span&gt;
    &lt;span class="keyword"&gt;when&lt;/span&gt; &lt;span class="constant"&gt;Module&lt;/span&gt;
      &lt;span class="ident"&gt;candidates&lt;/span&gt; &lt;span class="punct"&gt;=&lt;/span&gt; &lt;span class="ident"&gt;ancestors&lt;/span&gt;&lt;span class="punct"&gt;.&lt;/span&gt;&lt;span class="ident"&gt;map&lt;/span&gt;&lt;span class="punct"&gt;{|&lt;/span&gt;&lt;span class="ident"&gt;klass&lt;/span&gt;&lt;span class="punct"&gt;|&lt;/span&gt; &lt;span class="punct"&gt;&amp;quot;&lt;/span&gt;&lt;span class="string"&gt;&lt;span class="expr"&gt;#{klass}&lt;/span&gt;::&lt;span class="expr"&gt;#{meth}&lt;/span&gt;&lt;/span&gt;&lt;span class="punct"&gt;&amp;quot;}&lt;/span&gt;

      &lt;span class="ident"&gt;candidates&lt;/span&gt;&lt;span class="punct"&gt;.&lt;/span&gt;&lt;span class="ident"&gt;concat&lt;/span&gt;&lt;span class="punct"&gt;(&lt;/span&gt;&lt;span class="keyword"&gt;class &lt;/span&gt;&lt;span class="punct"&gt;&amp;lt;&amp;lt;&lt;/span&gt; &lt;span class="constant"&gt;self&lt;/span&gt;&lt;span class="punct"&gt;;&lt;/span&gt; &lt;span class="ident"&gt;ancestors&lt;/span&gt; &lt;span class="keyword"&gt;end&lt;/span&gt;&lt;span class="punct"&gt;.&lt;/span&gt;&lt;span class="ident"&gt;map&lt;/span&gt;&lt;span class="punct"&gt;{|&lt;/span&gt;&lt;span class="ident"&gt;k&lt;/span&gt;&lt;span class="punct"&gt;|&lt;/span&gt; &lt;span class="punct"&gt;&amp;quot;&lt;/span&gt;&lt;span class="string"&gt;&lt;span class="expr"&gt;#{k}&lt;/span&gt;#&lt;span class="expr"&gt;#{meth}&lt;/span&gt;&lt;/span&gt;&lt;span class="punct"&gt;&amp;quot;})&lt;/span&gt;

    &lt;span class="keyword"&gt;else&lt;/span&gt;
      &lt;span class="ident"&gt;candidates&lt;/span&gt; &lt;span class="punct"&gt;=&lt;/span&gt; &lt;span class="constant"&gt;self&lt;/span&gt;&lt;span class="punct"&gt;.&lt;/span&gt;&lt;span class="ident"&gt;class&lt;/span&gt;&lt;span class="punct"&gt;.&lt;/span&gt;&lt;span class="ident"&gt;ancestors&lt;/span&gt;&lt;span class="punct"&gt;.&lt;/span&gt;&lt;span class="ident"&gt;map&lt;/span&gt;&lt;span class="punct"&gt;{|&lt;/span&gt;&lt;span class="ident"&gt;klass&lt;/span&gt;&lt;span class="punct"&gt;|&lt;/span&gt;  &lt;span class="punct"&gt;&amp;quot;&lt;/span&gt;&lt;span class="string"&gt;&lt;span class="expr"&gt;#{klass}&lt;/span&gt;#&lt;span class="expr"&gt;#{meth}&lt;/span&gt;&lt;/span&gt;&lt;span class="punct"&gt;&amp;quot;}&lt;/span&gt;

    &lt;span class="keyword"&gt;end&lt;/span&gt;
    &lt;span class="ident"&gt;candidates&lt;/span&gt;&lt;span class="punct"&gt;.&lt;/span&gt;&lt;span class="ident"&gt;compact&lt;/span&gt;&lt;span class="punct"&gt;.&lt;/span&gt;&lt;span class="ident"&gt;each&lt;/span&gt; &lt;span class="keyword"&gt;do&lt;/span&gt; &lt;span class="punct"&gt;|&lt;/span&gt;&lt;span class="ident"&gt;candidate&lt;/span&gt;&lt;span class="punct"&gt;|&lt;/span&gt;
      &lt;span class="comment"&gt;#puts &amp;quot;TRYING #{candidate}&amp;quot;&lt;/span&gt;

      &lt;span class="ident"&gt;desc&lt;/span&gt; &lt;span class="punct"&gt;=&lt;/span&gt;  &lt;span class="punct"&gt;(&lt;/span&gt;&lt;span class="constant"&gt;CONFIG&lt;/span&gt;&lt;span class="punct"&gt;[&amp;quot;&lt;/span&gt;&lt;span class="string"&gt;target_alias&lt;/span&gt;&lt;span class="punct"&gt;&amp;quot;]&lt;/span&gt; &lt;span class="punct"&gt;==&lt;/span&gt; &lt;span class="punct"&gt;&amp;quot;&lt;/span&gt;&lt;span class="string"&gt;i386-mswin32&lt;/span&gt;&lt;span class="punct"&gt;&amp;quot;)&lt;/span&gt; &lt;span class="punct"&gt;?&lt;/span&gt;  &lt;span class="punct"&gt;(&lt;/span&gt; `&lt;span class="ident"&gt;fri&lt;/span&gt;&lt;span class="punct"&gt;.&lt;/span&gt;&lt;span class="ident"&gt;cmd&lt;/span&gt; &lt;span class="punct"&gt;&amp;quot;&lt;/span&gt;&lt;span class="string"&gt;&lt;span class="expr"&gt;#{candidate}&lt;/span&gt;&lt;/span&gt;&lt;span class="punct"&gt;&amp;quot;`&lt;/span&gt; &lt;span class="punct"&gt;)&lt;/span&gt; &lt;span class="punct"&gt;:&lt;/span&gt; &lt;span class="punct"&gt;(&lt;/span&gt; `&lt;span class="ident"&gt;fri&lt;/span&gt; &lt;span class="punct"&gt;&amp;quot;&lt;/span&gt;&lt;span class="string"&gt;&lt;span class="expr"&gt;#{candidate}&lt;/span&gt;&lt;/span&gt;&lt;span class="punct"&gt;&amp;quot;`)&lt;/span&gt;

      &lt;span class="keyword"&gt;unless&lt;/span&gt; &lt;span class="ident"&gt;desc&lt;/span&gt; &lt;span class="punct"&gt;==&lt;/span&gt; &lt;span class="punct"&gt;&amp;quot;&lt;/span&gt;&lt;span class="string"&gt;nil&lt;/span&gt;&lt;span class="punct"&gt;&amp;quot;&lt;/span&gt;
        &lt;span class="comment"&gt;# uncomment to use ri (and some patience)&lt;/span&gt;
        &lt;span class="comment"&gt;#desc = `ri -T '#{candidate}' 2&amp;gt;/dev/null`&lt;/span&gt;
        &lt;span class="comment"&gt;#unless desc.empty?&lt;/span&gt;

        &lt;span class="ident"&gt;puts&lt;/span&gt; &lt;span class="ident"&gt;desc&lt;/span&gt;
        &lt;span class="keyword"&gt;return&lt;/span&gt; &lt;span class="constant"&gt;true&lt;/span&gt;
      &lt;span class="keyword"&gt;end&lt;/span&gt;
    &lt;span class="keyword"&gt;end&lt;/span&gt;
    &lt;span class="constant"&gt;false&lt;/span&gt;

  &lt;span class="keyword"&gt;end&lt;/span&gt;
  &lt;span class="ident"&gt;private&lt;/span&gt; &lt;span class="symbol"&gt;:puts_ri_documentation_for&lt;/span&gt;

  &lt;span class="keyword"&gt;def &lt;/span&gt;&lt;span class="method"&gt;method_missing&lt;/span&gt;&lt;span class="punct"&gt;(&lt;/span&gt;&lt;span class="ident"&gt;meth&lt;/span&gt;&lt;span class="punct"&gt;,&lt;/span&gt; &lt;span class="punct"&gt;*&lt;/span&gt;&lt;span class="ident"&gt;args&lt;/span&gt;&lt;span class="punct"&gt;,&lt;/span&gt; &lt;span class="punct"&gt;&amp;amp;&lt;/span&gt;&lt;span class="ident"&gt;block&lt;/span&gt;&lt;span class="punct"&gt;)&lt;/span&gt;

    &lt;span class="keyword"&gt;if&lt;/span&gt; &lt;span class="ident"&gt;md&lt;/span&gt; &lt;span class="punct"&gt;=&lt;/span&gt; &lt;span class="punct"&gt;/&lt;/span&gt;&lt;span class="regex"&gt;ri_(.*)&lt;/span&gt;&lt;span class="punct"&gt;/.&lt;/span&gt;&lt;span class="ident"&gt;match&lt;/span&gt;&lt;span class="punct"&gt;(&lt;/span&gt;&lt;span class="ident"&gt;meth&lt;/span&gt;&lt;span class="punct"&gt;.&lt;/span&gt;&lt;span class="ident"&gt;to_s&lt;/span&gt;&lt;span class="punct"&gt;)&lt;/span&gt;

      &lt;span class="keyword"&gt;unless&lt;/span&gt; &lt;span class="ident"&gt;puts_ri_documentation_for&lt;/span&gt;&lt;span class="punct"&gt;(&lt;/span&gt;&lt;span class="constant"&gt;self&lt;/span&gt;&lt;span class="punct"&gt;,&lt;/span&gt;&lt;span class="ident"&gt;md&lt;/span&gt;&lt;span class="punct"&gt;[&lt;/span&gt;&lt;span class="number"&gt;1&lt;/span&gt;&lt;span class="punct"&gt;])&lt;/span&gt;
        &lt;span class="punct"&gt;&amp;quot;&lt;/span&gt;&lt;span class="string"&gt;Ri doesn't know about #&lt;span class="expr"&gt;#{meth}&lt;/span&gt;&lt;/span&gt;&lt;span class="punct"&gt;&amp;quot;&lt;/span&gt;
      &lt;span class="keyword"&gt;end&lt;/span&gt;

    &lt;span class="keyword"&gt;else&lt;/span&gt;
      &lt;span class="keyword"&gt;super&lt;/span&gt;
    &lt;span class="keyword"&gt;end&lt;/span&gt;
  &lt;span class="keyword"&gt;end&lt;/span&gt;

  &lt;span class="keyword"&gt;def &lt;/span&gt;&lt;span class="method"&gt;ri_&lt;/span&gt;&lt;span class="punct"&gt;(&lt;/span&gt;&lt;span class="ident"&gt;meth&lt;/span&gt;&lt;span class="punct"&gt;)&lt;/span&gt;

    &lt;span class="keyword"&gt;unless&lt;/span&gt; &lt;span class="ident"&gt;puts_ri_documentation_for&lt;/span&gt;&lt;span class="punct"&gt;(&lt;/span&gt;&lt;span class="constant"&gt;self&lt;/span&gt;&lt;span class="punct"&gt;,&lt;/span&gt;&lt;span class="ident"&gt;meth&lt;/span&gt;&lt;span class="punct"&gt;.&lt;/span&gt;&lt;span class="ident"&gt;to_s&lt;/span&gt;&lt;span class="punct"&gt;)&lt;/span&gt;
      &lt;span class="punct"&gt;&amp;quot;&lt;/span&gt;&lt;span class="string"&gt;Ri doesn't know about #&lt;span class="expr"&gt;#{meth}&lt;/span&gt;&lt;/span&gt;&lt;span class="punct"&gt;&amp;quot;&lt;/span&gt;
    &lt;span class="keyword"&gt;end&lt;/span&gt;

  &lt;span class="keyword"&gt;end&lt;/span&gt;
&lt;span class="keyword"&gt;end&lt;/span&gt;

&lt;span class="constant"&gt;RICompletionProc&lt;/span&gt; &lt;span class="punct"&gt;=&lt;/span&gt; &lt;span class="ident"&gt;proc&lt;/span&gt;&lt;span class="punct"&gt;{|&lt;/span&gt;&lt;span class="ident"&gt;input&lt;/span&gt;&lt;span class="punct"&gt;|&lt;/span&gt;
  &lt;span class="ident"&gt;bind&lt;/span&gt; &lt;span class="punct"&gt;=&lt;/span&gt; &lt;span class="constant"&gt;IRB&lt;/span&gt;&lt;span class="punct"&gt;.&lt;/span&gt;&lt;span class="ident"&gt;conf&lt;/span&gt;&lt;span class="punct"&gt;[&lt;/span&gt;&lt;span class="symbol"&gt;:MAIN_CONTEXT&lt;/span&gt;&lt;span class="punct"&gt;].&lt;/span&gt;&lt;span class="ident"&gt;workspace&lt;/span&gt;&lt;span class="punct"&gt;.&lt;/span&gt;&lt;span class="ident"&gt;binding&lt;/span&gt;

  &lt;span class="keyword"&gt;case&lt;/span&gt; &lt;span class="ident"&gt;input&lt;/span&gt;
  &lt;span class="keyword"&gt;when&lt;/span&gt; &lt;span class="punct"&gt;/&lt;/span&gt;&lt;span class="regex"&gt;(&lt;span class="escape"&gt;\s&lt;/span&gt;*(.*)&lt;span class="escape"&gt;\.&lt;/span&gt;ri_)(.*)&lt;/span&gt;&lt;span class="punct"&gt;/&lt;/span&gt;
    &lt;span class="ident"&gt;pre&lt;/span&gt; &lt;span class="punct"&gt;=&lt;/span&gt; &lt;span class="global"&gt;$1&lt;/span&gt;

    &lt;span class="ident"&gt;receiver&lt;/span&gt; &lt;span class="punct"&gt;=&lt;/span&gt; &lt;span class="global"&gt;$2&lt;/span&gt;
    &lt;span class="ident"&gt;meth&lt;/span&gt; &lt;span class="punct"&gt;=&lt;/span&gt; &lt;span class="global"&gt;$3&lt;/span&gt; &lt;span class="punct"&gt;?&lt;/span&gt; &lt;span class="punct"&gt;/&lt;/span&gt;&lt;span class="regex"&gt;&lt;span class="escape"&gt;\A&lt;/span&gt;&lt;span class="expr"&gt;#{Regexp.quote($3)}&lt;/span&gt;&lt;/span&gt;&lt;span class="punct"&gt;/&lt;/span&gt; &lt;span class="punct"&gt;:&lt;/span&gt; &lt;span class="punct"&gt;/&lt;/span&gt;&lt;span class="regex"&gt;.&lt;/span&gt;&lt;span class="punct"&gt;/&lt;/span&gt; &lt;span class="comment"&gt;#}&lt;/span&gt;

    &lt;span class="keyword"&gt;begin&lt;/span&gt;
      &lt;span class="ident"&gt;candidates&lt;/span&gt; &lt;span class="punct"&gt;=&lt;/span&gt; &lt;span class="ident"&gt;eval&lt;/span&gt;&lt;span class="punct"&gt;(&amp;quot;&lt;/span&gt;&lt;span class="string"&gt;&lt;span class="expr"&gt;#{receiver}&lt;/span&gt;.methods&lt;/span&gt;&lt;span class="punct"&gt;&amp;quot;,&lt;/span&gt; &lt;span class="ident"&gt;bind&lt;/span&gt;&lt;span class="punct"&gt;).&lt;/span&gt;&lt;span class="ident"&gt;map&lt;/span&gt; &lt;span class="keyword"&gt;do&lt;/span&gt; &lt;span class="punct"&gt;|&lt;/span&gt;&lt;span class="ident"&gt;m&lt;/span&gt;&lt;span class="punct"&gt;|&lt;/span&gt;

        &lt;span class="keyword"&gt;case&lt;/span&gt; &lt;span class="ident"&gt;m&lt;/span&gt;
        &lt;span class="keyword"&gt;when&lt;/span&gt; &lt;span class="punct"&gt;/&lt;/span&gt;&lt;span class="regex"&gt;[A-Za-z_]&lt;/span&gt;&lt;span class="punct"&gt;/;&lt;/span&gt; &lt;span class="ident"&gt;m&lt;/span&gt;
        &lt;span class="keyword"&gt;else&lt;/span&gt; &lt;span class="comment"&gt;# needs escaping&lt;/span&gt;

          &lt;span class="punct"&gt;%{&lt;/span&gt;&lt;span class="string"&gt;&amp;quot;&lt;span class="expr"&gt;#{m}&lt;/span&gt;&amp;quot;&lt;/span&gt;&lt;span class="punct"&gt;}&lt;/span&gt;
        &lt;span class="keyword"&gt;end&lt;/span&gt;
      &lt;span class="keyword"&gt;end&lt;/span&gt;
      &lt;span class="ident"&gt;candidates&lt;/span&gt; &lt;span class="punct"&gt;=&lt;/span&gt; &lt;span class="ident"&gt;candidates&lt;/span&gt;&lt;span class="punct"&gt;.&lt;/span&gt;&lt;span class="ident"&gt;grep&lt;/span&gt;&lt;span class="punct"&gt;(&lt;/span&gt;&lt;span class="ident"&gt;meth&lt;/span&gt;&lt;span class="punct"&gt;)&lt;/span&gt;

      &lt;span class="ident"&gt;candidates&lt;/span&gt;&lt;span class="punct"&gt;.&lt;/span&gt;&lt;span class="ident"&gt;map&lt;/span&gt;&lt;span class="punct"&gt;{|&lt;/span&gt;&lt;span class="ident"&gt;s&lt;/span&gt;&lt;span class="punct"&gt;|&lt;/span&gt; &lt;span class="ident"&gt;pre&lt;/span&gt; &lt;span class="punct"&gt;+&lt;/span&gt; &lt;span class="ident"&gt;s&lt;/span&gt; &lt;span class="punct"&gt;}&lt;/span&gt;
    &lt;span class="keyword"&gt;rescue&lt;/span&gt; &lt;span class="constant"&gt;Exception&lt;/span&gt;

      &lt;span class="ident"&gt;candidates&lt;/span&gt; &lt;span class="punct"&gt;=&lt;/span&gt; &lt;span class="punct"&gt;[]&lt;/span&gt;
    &lt;span class="keyword"&gt;end&lt;/span&gt;
  &lt;span class="keyword"&gt;when&lt;/span&gt; &lt;span class="punct"&gt;/&lt;/span&gt;&lt;span class="regex"&gt;([A-Z]&lt;span class="escape"&gt;\w&lt;/span&gt;+)#(&lt;span class="escape"&gt;\w&lt;/span&gt;*)&lt;/span&gt;&lt;span class="punct"&gt;/&lt;/span&gt; &lt;span class="comment"&gt;#}&lt;/span&gt;

    &lt;span class="ident"&gt;klass&lt;/span&gt; &lt;span class="punct"&gt;=&lt;/span&gt; &lt;span class="global"&gt;$1&lt;/span&gt;
    &lt;span class="ident"&gt;meth&lt;/span&gt; &lt;span class="punct"&gt;=&lt;/span&gt; &lt;span class="global"&gt;$2&lt;/span&gt; &lt;span class="punct"&gt;?&lt;/span&gt; &lt;span class="punct"&gt;/&lt;/span&gt;&lt;span class="regex"&gt;&lt;span class="escape"&gt;\A&lt;/span&gt;&lt;span class="expr"&gt;#{Regexp.quote($2)}&lt;/span&gt;&lt;/span&gt;&lt;span class="punct"&gt;/&lt;/span&gt; &lt;span class="punct"&gt;:&lt;/span&gt; &lt;span class="punct"&gt;/&lt;/span&gt;&lt;span class="regex"&gt;.&lt;/span&gt;&lt;span class="punct"&gt;/&lt;/span&gt;

    &lt;span class="ident"&gt;candidates&lt;/span&gt; &lt;span class="punct"&gt;=&lt;/span&gt; &lt;span class="ident"&gt;eval&lt;/span&gt;&lt;span class="punct"&gt;(&amp;quot;&lt;/span&gt;&lt;span class="string"&gt;&lt;span class="expr"&gt;#{klass}&lt;/span&gt;.instance_methods(false)&lt;/span&gt;&lt;span class="punct"&gt;&amp;quot;,&lt;/span&gt; &lt;span class="ident"&gt;bind&lt;/span&gt;&lt;span class="punct"&gt;)&lt;/span&gt;
    &lt;span class="ident"&gt;candidates&lt;/span&gt; &lt;span class="punct"&gt;=&lt;/span&gt; &lt;span class="ident"&gt;candidates&lt;/span&gt;&lt;span class="punct"&gt;.&lt;/span&gt;&lt;span class="ident"&gt;grep&lt;/span&gt;&lt;span class="punct"&gt;(&lt;/span&gt;&lt;span class="ident"&gt;meth&lt;/span&gt;&lt;span class="punct"&gt;)&lt;/span&gt;

    &lt;span class="ident"&gt;candidates&lt;/span&gt;&lt;span class="punct"&gt;.&lt;/span&gt;&lt;span class="ident"&gt;map&lt;/span&gt;&lt;span class="punct"&gt;{|&lt;/span&gt;&lt;span class="ident"&gt;s&lt;/span&gt;&lt;span class="punct"&gt;|&lt;/span&gt; &lt;span class="punct"&gt;&amp;quot;&lt;/span&gt;&lt;span class="string"&gt;'&lt;/span&gt;&lt;span class="punct"&gt;&amp;quot;&lt;/span&gt; &lt;span class="punct"&gt;+&lt;/span&gt; &lt;span class="ident"&gt;klass&lt;/span&gt; &lt;span class="punct"&gt;+&lt;/span&gt; &lt;span class="punct"&gt;'&lt;/span&gt;&lt;span class="string"&gt;#&lt;/span&gt;&lt;span class="punct"&gt;'&lt;/span&gt; &lt;span class="punct"&gt;+&lt;/span&gt; &lt;span class="ident"&gt;s&lt;/span&gt; &lt;span class="punct"&gt;+&lt;/span&gt; &lt;span class="punct"&gt;&amp;quot;&lt;/span&gt;&lt;span class="string"&gt;'&lt;/span&gt;&lt;span class="punct"&gt;&amp;quot;}&lt;/span&gt;

  &lt;span class="keyword"&gt;else&lt;/span&gt;
    &lt;span class="constant"&gt;IRB&lt;/span&gt;&lt;span class="punct"&gt;::&lt;/span&gt;&lt;span class="constant"&gt;InputCompletor&lt;/span&gt;&lt;span class="punct"&gt;::&lt;/span&gt;&lt;span class="constant"&gt;CompletionProc&lt;/span&gt;&lt;span class="punct"&gt;.&lt;/span&gt;&lt;span class="ident"&gt;call&lt;/span&gt;&lt;span class="punct"&gt;(&lt;/span&gt;&lt;span class="ident"&gt;input&lt;/span&gt;&lt;span class="punct"&gt;)&lt;/span&gt;
  &lt;span class="keyword"&gt;end&lt;/span&gt;

&lt;span class="punct"&gt;}&lt;/span&gt;
&lt;span class="comment"&gt;#Readline.basic_word_break_characters= &amp;quot; \t\n\&amp;quot;\\'`&amp;gt;&amp;lt;=;|&amp;amp;{(&amp;quot;&lt;/span&gt;
&lt;span class="constant"&gt;Readline&lt;/span&gt;&lt;span class="punct"&gt;.&lt;/span&gt;&lt;span class="ident"&gt;basic_word_break_characters&lt;/span&gt;&lt;span class="punct"&gt;=&lt;/span&gt; &lt;span class="punct"&gt;&amp;quot;&lt;/span&gt;&lt;span class="string"&gt; &lt;span class="escape"&gt;\t\n\\&lt;/span&gt;&amp;gt;&amp;lt;=;|&amp;amp;&lt;/span&gt;&lt;span class="punct"&gt;&amp;quot;&lt;/span&gt;

&lt;span class="constant"&gt;Readline&lt;/span&gt;&lt;span class="punct"&gt;.&lt;/span&gt;&lt;span class="ident"&gt;completion_proc&lt;/span&gt; &lt;span class="punct"&gt;=&lt;/span&gt; &lt;span class="constant"&gt;RICompletionProc&lt;/span&gt;
&lt;/pre&gt; &lt;/span&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/17362732-5204343639685553852?l=technofinance.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://technofinance.blogspot.com/feeds/5204343639685553852/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=17362732&amp;postID=5204343639685553852' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/17362732/posts/default/5204343639685553852'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/17362732/posts/default/5204343639685553852'/><link rel='alternate' type='text/html' href='http://technofinance.blogspot.com/2006/12/have-it-all-ruby-irb-autocompletion.html' title='Have it all : Ruby, irb, autocompletion, autodocumentation'/><author><name>Nicolas</name><uri>http://www.blogger.com/profile/03434148024010872285</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://2.bp.blogspot.com/_vbz7u92h91c/SJ6emBHBXjI/AAAAAAAAAC8/R27sE5IMTms/s1600-R/me.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-17362732.post-885894634833103239</id><published>2006-09-03T11:49:00.000-07:00</published><updated>2006-09-03T11:59:45.515-07:00</updated><title type='text'>on the air this week</title><content type='html'>&lt;p&gt; &lt;/p&gt;&lt;ul&gt;&lt;li&gt;Topology and programming langage semantics : a survey at &lt;a href="http://lambda-the-ultimate.org/node/1711"&gt;lambda the ultimate&lt;/a&gt;&lt;/li&gt;&lt;li&gt;A nice illustration of usefulness of iterators : &lt;a class="posttitle" id="viewpost.ascx_TitleUrl" href="http://pluralsight.com/blogs/dbox/archive/2005/04/24/7690.aspx"&gt;Ruby Ranges in C#&lt;/a&gt; &lt;/li&gt;&lt;li&gt;Dimensional analysis : why have we just been tought to use &lt;a href="http://en.wikipedia.org/wiki/Dimensional_analysis"&gt;dimensional analysis &lt;/a&gt;just to verify computation when it can &lt;a href="http://hubcap.clemson.edu/~daw/D_PHYS845/DimensionalAnalysisLecture.pdf#search=%22dimensional%20analysis%20gravity%20waves%20nuclear%20explosion%22"&gt;&lt;em&gt;solve &lt;/em&gt;them &lt;/a&gt;for you. &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/17362732-885894634833103239?l=technofinance.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://technofinance.blogspot.com/feeds/885894634833103239/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=17362732&amp;postID=885894634833103239' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/17362732/posts/default/885894634833103239'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/17362732/posts/default/885894634833103239'/><link rel='alternate' type='text/html' href='http://technofinance.blogspot.com/2006/09/on-air-this-week.html' title='on the air this week'/><author><name>Nicolas</name><uri>http://www.blogger.com/profile/03434148024010872285</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://2.bp.blogspot.com/_vbz7u92h91c/SJ6emBHBXjI/AAAAAAAAAC8/R27sE5IMTms/s1600-R/me.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-17362732.post-8857746576835821325</id><published>2006-09-02T04:12:00.000-07:00</published><updated>2006-09-02T04:38:33.716-07:00</updated><title type='text'>Importance of imagination</title><content type='html'>Say a company has to deals with giving labels to a lot of images, like a few tens of millions.
How could that be handled?

1. A strong hierarchical structure exists alongs with an administrative company culture.
Chances are high that a boss's only skill is avoidance of responsability for problems, and taking credit for successes.
He appoints some guy he does not like for dealing with it, and imposes him a stupid way to do it, involving vague arguments that long work hours are good for internal success in the company.
The work fails, but the responsability avoidance is a complete success !
Mission accomplished !


2. A company culture exists where putting imagination in action is standard business.
You end up with millions of people having fun doing the work : &lt;a href="http://images.google.com/imagelabeler/"&gt;Google image labeler&lt;/a&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/17362732-8857746576835821325?l=technofinance.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='related' href='http://images.google.com/imagelabeler/' title='Importance of imagination'/><link rel='replies' type='application/atom+xml' href='http://technofinance.blogspot.com/feeds/8857746576835821325/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=17362732&amp;postID=8857746576835821325' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/17362732/posts/default/8857746576835821325'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/17362732/posts/default/8857746576835821325'/><link rel='alternate' type='text/html' href='http://technofinance.blogspot.com/2006/09/importance-of-imagination.html' title='Importance of imagination'/><author><name>Nicolas</name><uri>http://www.blogger.com/profile/03434148024010872285</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://2.bp.blogspot.com/_vbz7u92h91c/SJ6emBHBXjI/AAAAAAAAAC8/R27sE5IMTms/s1600-R/me.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-17362732.post-115486236505689714</id><published>2006-08-06T04:07:00.000-07:00</published><updated>2006-08-06T04:10:40.600-07:00</updated><title type='text'>How is it so ?</title><content type='html'>&lt;div xmlns="http://www.w3.org/1999/xhtml"&gt;How is it so that when &lt;a href="http://www.digg.com"&gt;digg &lt;/a&gt;puts up a recommendation service online, it becomes one of the biggest success of the web, while 7 years before, some computer scientists, paid by public money, designed a &lt;a href="http://translate.google.com/translate?u=http%3A%2F%2Fregal.lip6.fr%2Fprojects%2Fpharos%2F&amp;amp;langpair=fr%7Cen&amp;hl=en&amp;amp;ie=UTF-8&amp;oe=UTF-8&amp;amp;prev=%2Flanguage_tools"&gt;very similar or even better system&lt;/a&gt; which ended nowhere, except for two papers in a administrative report, and presentation at the &lt;a href="http://www.inria.fr/valorisation/rencontres/web-semantique/"&gt;9th meeting of INRIA with the Industry&lt;/a&gt;

Also we are not talking of a small lab with small means, but the reference lab in france for computer science, with some 5000 phd's and a 160 MEUR budget.

So if, on a domain where you have a strong need, with a strong solution, computer science laboratories can not make it a success story, it raises questions :
&lt;/div&gt;&lt;div xmlns="http://www.w3.org/1999/xhtml"&gt;&lt;ul&gt;&lt;li&gt;What are they good for ultimately, if upon finding solutions they are not deployed ?
&lt;/li&gt;&lt;li&gt;If you consider that innovation in computer science is driven by usage, how such a disregard for use can not hurt the academic production of such labs ?&lt;/li&gt;&lt;/ul&gt;&lt;/div&gt;&lt;ul&gt;&lt;li&gt;On what ground will people be excited about doing computer research, when knowing that even if everything goes well, there work won't make a difference ?&lt;/li&gt;&lt;/ul&gt;&lt;p xmlns="http://www.w3.org/1999/xhtml"&gt;As a counter example you can take (at least some) american universities, whose research projects are integrated in a more general project pipeline designed to foster innovation. As innovation gets mature, it raises new questions which will themselves create open problems to be solved.

An illustration of this, based upon the very abstract subject of semantic web, is &lt;a href="http://simile.mit.edu/"&gt;SIMILE &lt;/a&gt;at the MIT. Their website is definitely public-oriented, and more importantly, the work done is integrated in a pipeline where if potential is detected, it &lt;u&gt;&lt;i&gt;will&lt;/i&gt;&lt;/u&gt; be exploited, even if this potential has a minor chance of revolutionizing the n'th order langage compiler theory.

No disregard for practical applications here, as having broad adoption is an
integral part of surfacing finer issues which can be analysed, so that
practice and theory are just one.&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/17362732-115486236505689714?l=technofinance.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://technofinance.blogspot.com/feeds/115486236505689714/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=17362732&amp;postID=115486236505689714' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/17362732/posts/default/115486236505689714'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/17362732/posts/default/115486236505689714'/><link rel='alternate' type='text/html' href='http://technofinance.blogspot.com/2006/08/how-is-it-so.html' title='How is it so ?'/><author><name>Nicolas</name><uri>http://www.blogger.com/profile/03434148024010872285</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://2.bp.blogspot.com/_vbz7u92h91c/SJ6emBHBXjI/AAAAAAAAAC8/R27sE5IMTms/s1600-R/me.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-17362732.post-115479196837633217</id><published>2006-08-05T08:32:00.000-07:00</published><updated>2006-08-11T13:26:58.673-07:00</updated><title type='text'>Some interesting aspects of programming : Multi-stage programming</title><content type='html'>The basic need for "multi-stage programming" arises of the following situation.

Say you need to write a program whose result won't be a single number, but rather a computation, for instance a function that double its input f : R --&amp;gt; R , x --&amp;gt; 2*x, or anything that might be represented in some langage of your choice called L. The question is : given L, how do we construct a langage L* which can output some L in a consistent way.

One can thinks of generics in dotnet2.0 or Java 1.5 as a particular case of multi-stage programming.
Generics are L* functions verifying L syntax, with an extra variable representing a type, and they eventually produce code in L for that type.
L* naturally inherits a typesytem fostered by L typesystem.
For instance some L* function producing a function outputing a real number cannot be composed with another L* function having strings as an input. Thus an expression that produces code for treating integers can be typed as being such. L* is a first-order langage with respect to L, and its types are expressed using &lt;a href="http://en.wikipedia.org/wiki/First-order_logic"&gt;first-order logic&lt;/a&gt; to create &lt;a href="http://citeseer.ist.psu.edu/71801.html"&gt;first-order data types&lt;/a&gt; of L.
A very nice introduction to a multistage C# or java can be found &lt;a href="http://www.cs.rice.edu/~sfogarty/cache/metaphor.pdf"&gt;here&lt;/a&gt;.


As everyone gets more accustomed to computers, there has been a huge push to get more than just static data, but also exchange programmatic-like structures, like dynamic web pages. There programmers need to have multistaged programming capacities. This explains a lot of the popularity for javascript, along with its universal runtime platform, as its L* can accept almost everything, being a very weakly typed system.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/17362732-115479196837633217?l=technofinance.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://technofinance.blogspot.com/feeds/115479196837633217/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=17362732&amp;postID=115479196837633217' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/17362732/posts/default/115479196837633217'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/17362732/posts/default/115479196837633217'/><link rel='alternate' type='text/html' href='http://technofinance.blogspot.com/2006/08/some-interesting-aspects-of_05.html' title='Some interesting aspects of programming : Multi-stage programming'/><author><name>Nicolas</name><uri>http://www.blogger.com/profile/03434148024010872285</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://2.bp.blogspot.com/_vbz7u92h91c/SJ6emBHBXjI/AAAAAAAAAC8/R27sE5IMTms/s1600-R/me.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-17362732.post-115426364124071439</id><published>2006-08-05T07:15:00.000-07:00</published><updated>2006-08-05T07:15:46.446-07:00</updated><title type='text'>Some interesting aspects of programming : Continuations</title><content type='html'>&lt;br /&gt;&lt;ul&gt;&lt;li&gt;&lt;a href="http://en.wikipedia.org/wiki/Continuations"&gt;Continuations&lt;/a&gt;&lt;/li&gt;&lt;/ul&gt;&lt;br /&gt;If you think about what a program performs, we start with an input and events to deal with.&lt;br /&gt;Based on a certain combination of those we will &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; -&amp;gt; perform computation&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; -&amp;gt; feed the results to other functions who will themselves do the same&lt;br /&gt;So that in concept, we deal with a graph of control flow, and programming is finding a way to transcript that control flow correctly. &lt;br /&gt;&lt;br /&gt;Good programming is about to do it in a way that maximise the signal to noise ratio, maximizing expressivenes, and minimizing the plumbering. &lt;br /&gt;&lt;br /&gt;The usual programming langage are "stack based", aka they implicitly gives back computed results to the caller. This implicit and uncontrollable link leads to problems when you want to spread a result in different places, as your graph requires, or decide to deliver the results based on a particular event, like what happens with GUI and generally asynchronous programming (&lt;a href="http://technofinance.blogspot.com/2006/06/closure-and-asynchronous-functions.html#links"&gt;exemple&lt;/a&gt;)&lt;br /&gt;&lt;br /&gt;That's why continuations, by &lt;u&gt;separating computations from the control flow&lt;/u&gt;, are sometimes useful.&lt;br /&gt;&amp;nbsp;&amp;nbsp; &lt;br /&gt;&lt;br /&gt;&lt;br /&gt;Technorati Tags: &lt;a href="http://technorati.com/tag/Structurallyyours" rel="tag"&gt;Structurallyyours&lt;/a&gt;, &lt;a href="http://technorati.com/tag/csharp" rel="tag"&gt;csharp&lt;/a&gt;, &lt;a href="http://technorati.com/tag/" rel="tag"&gt;&lt;/a&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/17362732-115426364124071439?l=technofinance.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://technofinance.blogspot.com/feeds/115426364124071439/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=17362732&amp;postID=115426364124071439' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/17362732/posts/default/115426364124071439'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/17362732/posts/default/115426364124071439'/><link rel='alternate' type='text/html' href='http://technofinance.blogspot.com/2006/08/some-interesting-aspects-of.html' title='Some interesting aspects of programming : Continuations'/><author><name>Nicolas</name><uri>http://www.blogger.com/profile/03434148024010872285</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://2.bp.blogspot.com/_vbz7u92h91c/SJ6emBHBXjI/AAAAAAAAAC8/R27sE5IMTms/s1600-R/me.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-17362732.post-115125661573783343</id><published>2006-06-25T10:31:00.000-07:00</published><updated>2006-06-25T10:31:57.453-07:00</updated><title type='text'>Queryable data store</title><content type='html'>It seems like my &lt;a href="http://technofinance.blogspot.com/2006/03/about-schyzophreny-c3-intelligence-and.html#links?&amp;amp;tags=software+permanent"&gt;shout out &lt;/a&gt;for a sweeter handling of &lt;b&gt;runtime &lt;/b&gt;queries against data store was on the agenda of the Microsofties Linq development team.&lt;br /&gt;&lt;br /&gt;My proposed solution, however, has the extra feature of exposing the datamodel outside of its context, in order to be used for some type helping, for instance. That point is critical for me, as this is the only way to leverage all the work done inside of your software outside of your business scope. In a network economy, this is a crucial point for customers, as a software always need to fit in an ecosystem somehow, and that ecosystem plumbing is where a lot of cost and issue is.&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;If we go back to Linq, the added value this time is clearly the IQueryable interface.&lt;br /&gt;Wanting to use Linq in a project, I ended up filling the dots exactly on the same place, around this notion of "data repository" with accept queries and translate them. This functionnality is now a standard feature of Linq, with the 2 main additions :&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;You can generate expression tree (aka build abstract representation of query from unstructured text)&lt;br /&gt;&lt;span style="font-size: 10pt; font-family: 'Lucida Console';"&gt;&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;br /&gt;&lt;p class="MsoNormal" style="margin: 0in 0in 0pt;"&gt;&lt;span style="font-size: 10pt; color: teal; font-family: 'Lucida Console';"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; ParameterExpression&lt;/span&gt;&lt;span style="font-size: 10pt; font-family: 'Lucida Console';"&gt; p = &lt;span style="color: teal;"&gt;Expression&lt;/span&gt;.Parameter(&lt;span style="color: blue;"&gt;typeof&lt;/span&gt;(&lt;span style="color: teal;"&gt;Customer&lt;/span&gt;), &lt;span style="color: maroon;"&gt;"c"&lt;/span&gt;);&lt;/span&gt;&lt;/p&gt;&lt;span style="font-size: 10pt; color: teal; font-family: 'Lucida Console';"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; LambdaExpression&lt;/span&gt;&lt;span style="font-size: 10pt; font-family: 'Lucida Console';"&gt; predicate = &lt;span style="color: teal;"&gt;QueryExpression&lt;/span&gt;.Lambda(&lt;span style="color: maroon;"&gt;"c.City = '&lt;st1:city w:st="on"&gt;&lt;st1:place w:st="on"&gt;London&lt;/st1:place&gt;&lt;/st1:city&gt;'"&lt;/span&gt;, p);&lt;br /&gt;&lt;br /&gt;And turn those trees into actual function :&lt;br /&gt;&lt;/span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="font-size: 10pt; font-family: 'Lucida Console';"&gt;&lt;span style=""&gt;&amp;nbsp; &lt;/span&gt;&lt;span style="color: teal;"&gt;Func&lt;/span&gt;&amp;lt;&lt;span style="color: teal;"&gt;Customer&lt;/span&gt;,&lt;span style="color: blue;"&gt;bool&lt;/span&gt;&amp;gt; d = predicate.Compile();&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;Now&amp;nbsp; you have a whole continuum for your Linq queries, ranging from static to dynamic, and you can handle back some control to your user.&lt;br /&gt;Unfortunately, their only entry point is a ..... untyped string, which is &lt;b&gt;precisely &lt;/b&gt;what Linq stands out against.&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;May be one day Microsoft will realize they need to do for end-user what they ambition with Linq for programmers, that is bring back some strong typing wherever we can, and they'll might end up with my solution and my genius will finally be recognized.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/17362732-115125661573783343?l=technofinance.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://technofinance.blogspot.com/feeds/115125661573783343/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=17362732&amp;postID=115125661573783343' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/17362732/posts/default/115125661573783343'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/17362732/posts/default/115125661573783343'/><link rel='alternate' type='text/html' href='http://technofinance.blogspot.com/2006/06/queryable-data-store.html' title='Queryable data store'/><author><name>Nicolas</name><uri>http://www.blogger.com/profile/03434148024010872285</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://2.bp.blogspot.com/_vbz7u92h91c/SJ6emBHBXjI/AAAAAAAAAC8/R27sE5IMTms/s1600-R/me.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-17362732.post-114962865997062728</id><published>2006-06-06T13:55:00.000-07:00</published><updated>2006-06-06T15:20:35.516-07:00</updated><title type='text'>Building bridges : follow up</title><content type='html'>&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://www.visit-montenegro.org/imgs/2-v.jpg"&gt;&lt;img style="margin: 0pt 10px 10px 0pt; float: left; cursor: pointer; width: 200px;" src="http://www.visit-montenegro.org/imgs/2-v.jpg" alt="" border="0" /&gt;&lt;/a&gt;With the help of the illustration of my readers flow, I stressed out in my last post the pure randomness, or close to, some of my readership, who is most welcome nonetheless.

If you bear with me, as a continuation this preceding post, I will try to show hows web 2.0 means empowering a very hot subject, mostly underground after long years in the desert of conceptual useless-land, the &lt;span style="font-style: italic; font-weight: bold;"&gt;semantic web&lt;/span&gt;, whose &lt;a href="http://www.eswc2006.org/"&gt;european conference&lt;/a&gt; is to be held next week in Montenegro.
(Now look at the picture and tell me you are not interested by semantic web..)


I was previously stressing out the importance of building vocabularies statistically, and to show this I would like to raise the question of why do we know stuff.

&lt;ul&gt;&lt;li&gt;Well we either identify some relevant concepts, and by intuition formulate an hypothesis on their relationship. then if true, we attached our name to the relationship and become famous, if not rich.&lt;/li&gt;&lt;/ul&gt;&lt;div style="text-align: center;"&gt;ex : F = m a  (Sir Newton)
&lt;/div&gt;&lt;ul&gt;&lt;li&gt;Now you can also, if you have lots of data dealing with those notions of mass and forces, even though their essence is unknow to you,   find the same law &lt;span style="font-style: italic;"&gt;statistically&lt;/span&gt;.&lt;/li&gt;&lt;/ul&gt;&lt;div style="text-align: center;"&gt;ex : That hammer falling on my foot hurts. Let's try from higher
&lt;/div&gt;


In matter of human knowledge, a broader subject than 3 variables, now one is going to take on the tasks of describing all the notions in the world. you might consider having experts doing there own domains, but you might need too many people to then connect those domains.
So the only viable option is to rely on heavily distributed method.
If you add the other constraint that the content producer dont have to maintain themselves the map of the notions, as they dont necesseraly have the time or interest to do so, you have little space but for statistics to rely on... or at least it should provide a great help.

This subject of semantic extraction is one of the workshop of european conference, and it summarizes may be better the point (and challenges..)
&lt;blockquote&gt;&lt;span style="font-style: italic; color: rgb(204, 0, 0);" class="title"&gt;Mastering the Gap: From Information Extraction to Semantic Representation&lt;/span&gt;    &lt;div&gt;   Automating the process of  semantic annotation of content objects is   a  crucial step for  bootstrapping the  Semantic Web.   This process   requires  a complex  flow of  activities which  combines competences   from  different areas.   The Workshop  will focus  precisely  on the   interface  between the  information extracted  from  content objects   (e.g., using methods from  NLP, image processing, text mining, etc.)   and  the semantic  layer  in which  this  information is  explicitly   represented  in the  form of  ontologies and  their  instances.  The   workshop  will  provide  an  opportunity  for:  discussing  adequate   methods,  processes (pipelines) and  representation formats  for the   annotation process; reaching a  shared understanding with respect to   the  terminology in the  area; discussing  the lessons  learned from   projects  in the  area,  and putting  together  a list  of the  most   critical  issues to  be tackled  by the  research community  to make   further progress in the area.&lt;/div&gt;&lt;/blockquote&gt;The  global goal of this semantic effort is certainly not to discourage my beloved reader to come from the finest and highly spirited sites in a random manner.
Randomness is something you can always have, and it is very essential to provide you with radical new knowledge. Look just how many people know of the semantic web, and now you might be more of those cutting edge people.

The goal of the semantic web is to pursue that discovery of theme on the ground of items which are relevant to certain subjects.  A very simple illustration. I discovered yesterday that one notion, called categories, was helping a lot in various, very different subjects I am interested in, like algebra, quantum physics, and computer langage theory.  How is it that, being interested in those subjects, I had never heard of categories?  Well it might be that for any of those individual domain, they might be a bit too abstract, so it  goes under the radar for many people.
But when you consider the 3 domain, you are much better off learning categories first and saving lots of time later.  Have I had access to a semantic map of those domain, I would have noticed this strange object belonging to all of them, and get informed on it.


That's what the semantic web is for, and not for discouraging dear readers to come from other quality blogs ;)&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/17362732-114962865997062728?l=technofinance.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://technofinance.blogspot.com/feeds/114962865997062728/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=17362732&amp;postID=114962865997062728' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/17362732/posts/default/114962865997062728'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/17362732/posts/default/114962865997062728'/><link rel='alternate' type='text/html' href='http://technofinance.blogspot.com/2006/06/building-bridges-follow-up.html' title='Building bridges : follow up'/><author><name>Nicolas</name><uri>http://www.blogger.com/profile/03434148024010872285</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://2.bp.blogspot.com/_vbz7u92h91c/SJ6emBHBXjI/AAAAAAAAAC8/R27sE5IMTms/s1600-R/me.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-17362732.post-114945876012323430</id><published>2006-06-04T15:06:00.000-07:00</published><updated>2006-06-05T13:22:46.140-07:00</updated><title type='text'>Web 2.0 : Building bridges</title><content type='html'>So having proved in my previous post, once and for all, that the web 2.0 concept is manyfold, I can only go on and add one aspect on what the web 2.0 is, also.

Many of my readers right now, may be you, are coming from my girlfirend's blog. Her readers are coming from this best of breed blog called &lt;a href="http://inparisnow.com/"&gt;inparisnow&lt;/a&gt; which has recently been referenced in a &lt;a href="http://online.wsj.com/public/us"&gt;wall street journal&lt;/a&gt; article.

How deceptive is it for a reader of charming (or not) stories about paris to come here and see stuff about "continuations" and "first order logic"....
Even to wall street journal readers, whose interests can be close to what my job is, since I happen to work in finance, the journey must be pretty deceiving.

Well this recognized fact is &lt;b&gt;&lt;i&gt;precisely &lt;/i&gt;&lt;/b&gt;what I think is the target for web 2.0
Tagging, social networking, sites mashups, all this is about building &lt;b&gt;semantic&lt;/b&gt; groups which relates a specific audience to a specific content.


The added twist to this bridge construction is the distributed nature of the semantic group.
What look to one reader as "computer theory" will be seen as a "typing system" by another, depending their prevalent knowledge : the &lt;i&gt;thought vocabulary &lt;/i&gt;is different between users, and naturally creates groups of users.

Within a group sharing a common vocabulary, opinions might diverge on the relative importance of theories, but if you accept the fact that the intragroup variations are smaller than the intergroup variations, then to solve the problem of bringing information is more complex than just a democratic vote, and the solution is not a straight forward one. Having just a popularity system looks like voting for what the result of 2+2 is wont help much..

So after the current ways like tagging, voting, are taken to their technical limits, my bet is that the next challenge will be on how to easily build those 'vocabularies' in a distributed way, through complex statistics tools or method which will be rethought to integrate very easily.


Which eventually will bring me to develop the "emergence" section sometime soon :)&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/17362732-114945876012323430?l=technofinance.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://technofinance.blogspot.com/feeds/114945876012323430/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=17362732&amp;postID=114945876012323430' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/17362732/posts/default/114945876012323430'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/17362732/posts/default/114945876012323430'/><link rel='alternate' type='text/html' href='http://technofinance.blogspot.com/2006/06/web-20-building-bridges.html' title='Web 2.0 : Building bridges'/><author><name>Nicolas</name><uri>http://www.blogger.com/profile/03434148024010872285</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://2.bp.blogspot.com/_vbz7u92h91c/SJ6emBHBXjI/AAAAAAAAAC8/R27sE5IMTms/s1600-R/me.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-17362732.post-114943950246746651</id><published>2006-06-04T09:45:00.000-07:00</published><updated>2006-06-04T09:45:02.466-07:00</updated><title type='text'>Web 2.0 : what is it, my own take</title><content type='html'>&lt;div xmlns="http://www.w3.org/1999/xhtml"&gt;So many definitions have been made about web 2.0, what's the motivation of giving another one?&lt;br /&gt;Well, as presumptuous as it is, I think I have &lt;b&gt;the &lt;/b&gt;right definition of web 2.0 :)&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;div align="center"&gt;&lt;b&gt;Web 2.0 stands for &lt;i&gt;"there is more to the web than web 1.0"&lt;/i&gt;&lt;/b&gt;&lt;br /&gt;&lt;/div&gt;&lt;br /&gt;This definition is why there are many views of what the web 2.0 is.&lt;br /&gt;&lt;ul&gt;&lt;li&gt;For the marketers, web 2.0 will be all about having turning a publishing system into a media.&lt;/li&gt;&lt;li&gt;For the designer guys, web 2.0 will be about having snappy GUI through AJAX web pages.&lt;/li&gt;&lt;li&gt;For the developpers, it will be all about rendering the web programmable&lt;/li&gt;&lt;li&gt;etc...&lt;/li&gt;&lt;br /&gt;&lt;/ul&gt;I told you, it's all &lt;i&gt;&lt;b&gt;structural ...&lt;/b&gt;&lt;/i&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/17362732-114943950246746651?l=technofinance.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://technofinance.blogspot.com/feeds/114943950246746651/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=17362732&amp;postID=114943950246746651' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/17362732/posts/default/114943950246746651'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/17362732/posts/default/114943950246746651'/><link rel='alternate' type='text/html' href='http://technofinance.blogspot.com/2006/06/web-20-what-is-it-my-own-take_04.html' title='Web 2.0 : what is it, my own take'/><author><name>Nicolas</name><uri>http://www.blogger.com/profile/03434148024010872285</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://2.bp.blogspot.com/_vbz7u92h91c/SJ6emBHBXjI/AAAAAAAAAC8/R27sE5IMTms/s1600-R/me.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-17362732.post-114935794948951260</id><published>2006-06-03T11:04:00.000-07:00</published><updated>2006-06-03T11:23:53.990-07:00</updated><title type='text'>Closure and asynchronous functions</title><content type='html'>Closures are, in a programming langage, the ability to access at &lt;b&gt;runtime &lt;/b&gt;in a &lt;b&gt;local function&lt;/b&gt; the objects available at &lt;b&gt;runtime &lt;/b&gt;at the &lt;b&gt;point of definition &lt;/b&gt;of that local function.

For instance
void somefunction ()
{
   string variable1 = "Hello";
   myButton.Click  += delegate { myButton.Text = variable1;}
}
will be legal, even though the button will be clicked way after somefunction() has exited, where the variable variable1 is normally out of scope.



This are very handy when dealing with asynchronous programming.
Asynchronous programming involves breaking down a single function into a call to a service, and a treatment of the response to that service.

Closures enable you to access to a single set of variables, just like in a single function, across all the pieces from the original function.

void synchronousfunction()
{
 myquerybutton.status = disabled;
 results = makebigQuery();
 window.display(variable);
 myquerybutton.status = enabled;
}

void asynchronousfunction()
{
 myquerybutton.status = disabled;
 query.oncomplete += new function(results) {
  window.display(results);
     myquerybutton.status = enabled;
  }
 query.launchquery();
}

The code looks very much alike, thanks to the closure.
These kind of closure can be found in csharp, javascript 1.5 and many functional programming langages.


Now if someone knows an easy way to synchronize my job schedule with my personal one, I'd be glad :)&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/17362732-114935794948951260?l=technofinance.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://technofinance.blogspot.com/feeds/114935794948951260/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=17362732&amp;postID=114935794948951260' title='1 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/17362732/posts/default/114935794948951260'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/17362732/posts/default/114935794948951260'/><link rel='alternate' type='text/html' href='http://technofinance.blogspot.com/2006/06/closure-and-asynchronous-functions.html' title='Closure and asynchronous functions'/><author><name>Nicolas</name><uri>http://www.blogger.com/profile/03434148024010872285</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://2.bp.blogspot.com/_vbz7u92h91c/SJ6emBHBXjI/AAAAAAAAAC8/R27sE5IMTms/s1600-R/me.jpg'/></author><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-17362732.post-114935285863161475</id><published>2006-06-03T09:40:00.000-07:00</published><updated>2006-06-04T09:51:17.660-07:00</updated><title type='text'>Web as a media</title><content type='html'>&lt;div xmlns="http://www.w3.org/1999/xhtml"&gt;&lt;a href="http://photos1.blogger.com/blogger/6411/209/1600/wp2sfdi4.jpg" onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}"&gt;&lt;img alt="" src="http://photos1.blogger.com/blogger/6411/209/320/wp2sfdi4.jpg" style="margin: 0pt 10px 10px 0pt; float: left; cursor: pointer;" border="0" /&gt;&lt;/a&gt;It would be easy to assume web is known territory nowadays, but this assumption is far from true.

There are many tools to master before efficiently contribute to it and some others to has a good perception of its reality.

To see how those tools can effectively change the perception one can have, this picture is a screen capture of my desktop.

Now those windows have no information by themselves, indeed they are inormation about the web. They represent the web as a media.

To the left is a window from www.swarmthe.com which shows the traffic between different sites. located bottom right is a firefox add in which displays comments made in the blogosphere about that web page. On the right is a view of Google analytics which helps to understand better what the audience of a website is. Then the last window where I am editing this post.

Strange views of the good old web indeed ... !!


------------------------------------------------------
On peut croire le web territoire connu.  Que nenni.
Il y a pas mal d'outils a maitriser avant de pouvoir efficacement contribuer et encore d'autres outils pour bien percevoir le web.

Ces outils changent effectivement la perception que l'on peut avoir de ce medium.
Pour vous en convaincre, voici une petite capture d'ecran de mon bureau.

Toute ces fenetres ne sont que differentes vues du web en tant que media.

A gauche une fenetre de www.swarmthe.com qui montre le trafic entre differents sites.
En bas a droite de cette fenetre se trouvent les commentaires que differents bloggers ont pu faire sur leurs blogs a propos de ce site.
A droite une vue de Google Analytics qui permet de comprendre quelle est l'audience d'un site.
Enfin, la derniere fenetre ou je tape ce billet.


De biens droles de vues du web et pourtant c'est bien lui !!


&lt;p class="poweredbyperformancing"&gt;powered by &lt;a href="http://performancing.com/firefox"&gt;performancing firefox&lt;/a&gt;
&lt;/p&gt;
&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/17362732-114935285863161475?l=technofinance.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://technofinance.blogspot.com/feeds/114935285863161475/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=17362732&amp;postID=114935285863161475' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/17362732/posts/default/114935285863161475'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/17362732/posts/default/114935285863161475'/><link rel='alternate' type='text/html' href='http://technofinance.blogspot.com/2006/06/web-as-media.html' title='Web as a media'/><author><name>Nicolas</name><uri>http://www.blogger.com/profile/03434148024010872285</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://2.bp.blogspot.com/_vbz7u92h91c/SJ6emBHBXjI/AAAAAAAAAC8/R27sE5IMTms/s1600-R/me.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-17362732.post-114883678497825061</id><published>2006-05-28T10:19:00.000-07:00</published><updated>2006-05-28T11:20:35.260-07:00</updated><title type='text'>websites as graph</title><content type='html'>&lt;a href="http://www.aharef.info/2006/05/websites_as_graphs.htm"&gt;An interesting website&lt;/a&gt; :

"Everyday, we look at dozens of websites. The structure of these
websites is defined in HTML, the lingua franca for publishing
information on the web. Your browser's job is to render the HTML
according to the specs (most of the time, at least). You can look at
the code behind any website by selecting the "View source" tab
somewhere in your browser's menu

HTML consists of so-called tags, like the A tag for links, IMG tag for
images and so on. Since tags are nested in other tags, they are
arranged in a hierarchical manner, and that hierarchy can be
represented as a graph. I've written a little app that visualizes such
a graph, and here are some screenshots of websites that I often look at."

cnn.com website:
&lt;img src="http://www.aharef.info/imgs/cnn_small.gif" heigth="80%" width="80%"/&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/17362732-114883678497825061?l=technofinance.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://technofinance.blogspot.com/feeds/114883678497825061/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=17362732&amp;postID=114883678497825061' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/17362732/posts/default/114883678497825061'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/17362732/posts/default/114883678497825061'/><link rel='alternate' type='text/html' href='http://technofinance.blogspot.com/2006/05/websites-as-graph.html' title='websites as graph'/><author><name>Nicolas</name><uri>http://www.blogger.com/profile/03434148024010872285</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://2.bp.blogspot.com/_vbz7u92h91c/SJ6emBHBXjI/AAAAAAAAAC8/R27sE5IMTms/s1600-R/me.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-17362732.post-114874925215452740</id><published>2006-05-27T10:00:00.000-07:00</published><updated>2006-06-04T12:06:44.193-07:00</updated><title type='text'>The right tools to blog</title><content type='html'>If you want to set up a blog, I highly recommend you to get :

&lt;span style="font-weight: bold;"&gt;Software

&lt;/span&gt;&lt;ul&gt;&lt;li&gt;&lt;a href="http://www.mozilla.com/firefox/"&gt;Firefox&lt;/a&gt;  This browser has the particularity of allowing some "extensions" to be added. As it is a browser of choice for many bloggers, there is a very useful ecosystem of handy tools for it that makes it a real &lt;i&gt;&lt;b&gt;pleasure&lt;/b&gt;&lt;/i&gt; to use. Remember the first time you used Google, you felt that "wow" effect ? That what you'll get with those nice extensions.
&lt;/li&gt;&lt;/ul&gt;&lt;ul&gt;&lt;li&gt;&lt;a href="http://performancing.com/"&gt;Performancing&lt;/a&gt; : this is a add on to Firefox which helps you post to Blogger, Livejournal, and many other blog services. Very well done. It automates other aspects like postings tags on del.icio.us, technorati, ping services, and other feature&lt;/li&gt;&lt;/ul&gt;&lt;span style="font-weight: bold;"&gt;&lt;/span&gt;

&lt;span style="font-weight: bold;"&gt;Services
&lt;/span&gt;&lt;ul&gt;&lt;li&gt;For pictures, you can use if you need &lt;a href="http://allyoucanupload.webshots.com/"&gt;Allyoucanupload&lt;/a&gt;, a straightforward image upload with no registration&lt;/li&gt;&lt;li&gt;&lt;a href="http://del.icio.us"&gt;del.icio.us&lt;/a&gt;, used in combination with a display system on your blog, helps you publish specific content on your blog
&lt;/li&gt;&lt;/ul&gt;
&lt;span style="font-weight: bold;"&gt;Categories content on your blog
&lt;/span&gt;&lt;ul&gt;&lt;li&gt;cf the &lt;a href="http://technofinance.blogspot.com/2006/05/categories-for-blogger.html#links"&gt;updated post &lt;/a&gt;about this
&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/17362732-114874925215452740?l=technofinance.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://technofinance.blogspot.com/feeds/114874925215452740/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=17362732&amp;postID=114874925215452740' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/17362732/posts/default/114874925215452740'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/17362732/posts/default/114874925215452740'/><link rel='alternate' type='text/html' href='http://technofinance.blogspot.com/2006/05/right-tools-to-blog.html' title='The right tools to blog'/><author><name>Nicolas</name><uri>http://www.blogger.com/profile/03434148024010872285</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://2.bp.blogspot.com/_vbz7u92h91c/SJ6emBHBXjI/AAAAAAAAAC8/R27sE5IMTms/s1600-R/me.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-17362732.post-114866025390254162</id><published>2006-05-26T09:13:00.000-07:00</published><updated>2006-05-26T09:22:23.820-07:00</updated><title type='text'>JSON : the web 2.0 esperanto ?</title><content type='html'>&lt;b&gt;JSON &lt;/b&gt;is probably a technology you never heard of unless you are a javascript or web designer expert.  But this piece of tech does have potential for glueing the web together.

In some way, this is the javascript counterpart of a webservice
And just like its couterpart, this is a multiplatform, call anywhere lightweight object, which you can easily manipulate from within a javascript.

Today many websites have public API's (yahoo, google, del.icio.us, technorati, etc..) so integrating all those creates some real added value, and JSON can help you deliver it.

For instance, do you want to integrate your cel.icio.us categories (dynamically) in a web site like blogger?  JSON is your friend then.
&lt;b&gt;
&lt;/b&gt;What JSON does is that &lt;b&gt;it takes a string &lt;/b&gt;which can comes from a 3rd party website and &lt;b&gt;transform it into a javascript object.
&lt;/b&gt;
References:
&lt;b&gt;
JSON &lt;/b&gt;
an exemple with yahoo : &lt;a href="http://developer.yahoo.com/common/json.html"&gt;http://developer.yahoo.com/common/json.html&lt;/a&gt;
the json website : &lt;a href="http://www.json.org/"&gt;http://www.json.org&lt;/a&gt;
the json parser   : &lt;a href="http://www.json.org/json.js"&gt;http://www.json.org/json.js&lt;/a&gt;


&lt;b&gt;JSONP &lt;/b&gt;: this proposition aims at handling the relation of JSON results and your scripts
&lt;a href="http://bob.pythonmac.org/archives/2005/12/05/remote-json-jsonp"&gt;http://bob.pythonmac.org/archives/2005/12/05/remote-json-jsonp&lt;/a&gt;
&lt;a href="http://ajaxian.com/archives/jsonp-json-with-padding"&gt;http://ajaxian.com/archives/jsonp-json-with-padding&lt;/a&gt;&lt;b&gt;

JSONT&lt;/b&gt; : This is to transform an external JSON object into your own javascript datamodel easily
&lt;a href="http://goessner.net/articles/jsont"&gt;http://goessner.net/articles/jsont&lt;/a&gt;
&lt;a href="http://www.xsltblog.com/archives/2006/02/jsont_transform.html"&gt;http://www.xsltblog.com/archives/2006/02/jsont_transform.html&lt;/a&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/17362732-114866025390254162?l=technofinance.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='related' href='http://www.json.org' title='JSON : the web 2.0 esperanto ?'/><link rel='replies' type='application/atom+xml' href='http://technofinance.blogspot.com/feeds/114866025390254162/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=17362732&amp;postID=114866025390254162' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/17362732/posts/default/114866025390254162'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/17362732/posts/default/114866025390254162'/><link rel='alternate' type='text/html' href='http://technofinance.blogspot.com/2006/05/json-web-20-esperanto.html' title='JSON : the web 2.0 esperanto ?'/><author><name>Nicolas</name><uri>http://www.blogger.com/profile/03434148024010872285</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://2.bp.blogspot.com/_vbz7u92h91c/SJ6emBHBXjI/AAAAAAAAAC8/R27sE5IMTms/s1600-R/me.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-17362732.post-114729167880180273</id><published>2006-05-10T13:00:00.000-07:00</published><updated>2006-05-10T13:09:43.650-07:00</updated><title type='text'>Le Mur de la modelisation</title><content type='html'>&lt;p&gt;Nous ne pouvons pas, malgré les sommes faramineuses mobilisées, plusieurs &lt;span style="font-weight: bold;"&gt;centaines de millions d'euros&lt;/span&gt; pour des banques en internes, plusieurs milliards d'euros chez des fournisseurs specialisés de logiciels, aboutir à un systeme de gestion integré.&lt;/p&gt;   &lt;p&gt;La richesse fonctionnelle à couvrir est enorme. Pour gerer la vie d'un produit que vous achetez dans un reseau bancaire par exemple: "vous beneficiez de 25% de la performance du cac40, plus un rendement garanti de 5% par an"&lt;/p&gt;   &lt;p&gt;Il aura d'abord fallu .une demarche commerciale pour ce produit (gestion commerciale avant vente) .donner un prix (manipulation de données historiques, et de modeles), avec eventuellement des allers retours. Une fois les caracteristiques determinées .verrouiller les parametres du prix (hedger) .l'emeteur devra en interne emettre un ensemble de titres representant chacun une composante du produit. ce split est necessaire pour obtenir pour chaque produit les meilleures conditions de prix, ou satisfaire à des obligations juridiques. .Ce produit genere pour l'emetteur des expositions en change, en taux, en volatilité, et d'autres parametres .Pour couvrir ces parametres, il faut placer des ordres à des heures precises, correspondant au produit vendu .Les evolutions des parametres financiers genere des gains ou des pertes au niveau de l'emetteur, qui doit rapporter celles ci au niveau de sa hierarchie, à intervalles reguliers, puis au niveau comptable au comissaire aux comptes. .Les cellules de controle de risque internes monitorent aussi en permanence les evolutions des engagements pris, et surtout potentiels....&lt;/p&gt;   &lt;p&gt;Etc, etc...&lt;/p&gt;      &lt;p&gt;Pourquoi cet exemple est interessant? Parce que derriere ces problemes, il existe des enjeux financiers importants. Par ailleurs, ces enjeux existent de maniere concentrés chez plusieurs acteurs qui ont des moyens importants à mettre en face. Les conditions sont donc ideales.&lt;/p&gt;   &lt;p style="font-weight: bold;"&gt;&lt;span style="font-weight: normal;"&gt;Or il y a echec.&lt;/span&gt;&lt;/p&gt;&lt;p style="font-weight: bold;"&gt;&lt;span style="font-weight: normal;"&gt;&lt;/span&gt;Le mur de la modelisation est atteint.&lt;/p&gt;     &lt;p&gt;A fortiori, d'autres domaines qui sont confrontés à une complexité fonctionnelle aussi riche, mais dont les interets à mettre en place une solution sont dispersés, ou qui n'ont tout simplement pas ces moyens n'ont aucune chance de voir une solution informatique gerer leur domaine fonctionnel.&lt;/p&gt;    &lt;p&gt;Revenons aux organisations qui ont donc le plus d'atouts de leur coté dans le cadre actuel : D'une part le mur de la modelisation est atteint. D'autre part, cette meme modelisation est à l'heure actuelle requise pour lancer des projets, car il y a des couts d'agence. un service sous traite à un autre la realisation d'un logiciel, il faut donc valider la facture generée, et pour ce faire, avoir prevu au prealable, et donc modelisé...&lt;/p&gt;   &lt;p style="font-weight: bold;"&gt;Nous sommes confrontés à un deadlock organisationnel.&lt;/p&gt;    &lt;p&gt;Il faut donc changer d'organisation. Ce ne sont pas les autorisation pour engager des depenses en externe au nom d'un groupe d'interet qui vont disparaitre. Il va donc falloir trouver des moyens plus souples de developper des solutions, de les mettre en oeuvre, de les scaler, etc..&lt;/p&gt;   &lt;p&gt;Il n'y a pas d'autres options que celle ci si l'on souhaite aller au dela du cycle logiciel actuel qui reste excessivement faible en dehors des grands systemes comme windows, chez les "vrais" utilisateurs d'informatique.&lt;/p&gt;       &lt;p&gt;C'est pour cela qu'à travers toute les technologies mises en place, je vois celle qui favorisent et structurent l'emergence de la modelisation comme celles qui sont importantes.&lt;/p&gt;    &lt;p&gt;La realisation est bien plus facile. Individuellement, les differents elements mis en oeuvre dans le modele complexe presenté de gestion d'un produit financier sont presque triviaux. collectivement ils deviennent tres compliqués. Architecturer ceux-ci pour integrer les changements sans bureaucratie excessive est impossible.&lt;/p&gt;       &lt;p&gt;ps: Concernant les tags, ceux ci sont utilisés depuis fort longtemps par Reuters, qui classe ses depeches ainsi, par langue, pays, theme, etc.. Un article sur une emission d'emprunt en pologne interesse aussi bien le marché du credit que celui des taux d'interets, que les banquiers conseils etc.. A contrario, une news sur le president polonais qui se rend en allemagne limite l'interet des recherche par mots clefs..&lt;/p&gt;   &lt;p&gt;Le probleme est que si Reuters utilise tres bien ces tags, les categories, le meta modele, est defini... par reuters! C'est la que se situe l'innovation des tags version web : la possiblité de se rassembler dans des categories communes, mais aussi la possiblité de se disperser pour discuter avec d'autres experts de choses qui n'existent pas dans l'esprit d'autres contemporains.&lt;/p&gt;   &lt;div class="tags"&gt;Tags:&lt;ul&gt;&lt;li&gt;&lt;a href="http://del.icio.us/nrolland/Structurallyyours+modelisation" rel="tag"&gt;modelisation&lt;/a&gt;&lt;/li&gt; &lt;li&gt;&lt;a href="http://del.icio.us/nrolland/Structurallyyours+wall" rel="tag"&gt;wall&lt;/a&gt;&lt;/li&gt; &lt;li&gt;&lt;a href="http://del.icio.us/nrolland/Structurallyyours+emergence" rel="tag"&gt;emergence&lt;/a&gt;&lt;/li&gt; &lt;li&gt;&lt;a href="http://del.icio.us/nrolland/Structurallyyours+distributed" rel="tag"&gt;distributed&lt;/a&gt;&lt;/li&gt; &lt;li&gt;&lt;a href="http://del.icio.us/nrolland/Structurallyyours+modeling" rel="tag"&gt;modeling&lt;/a&gt;&lt;/li&gt; &lt;/ul&gt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/17362732-114729167880180273?l=technofinance.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://technofinance.blogspot.com/feeds/114729167880180273/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=17362732&amp;postID=114729167880180273' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/17362732/posts/default/114729167880180273'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/17362732/posts/default/114729167880180273'/><link rel='alternate' type='text/html' href='http://technofinance.blogspot.com/2006/05/le-mur-de-la-modelisation.html' title='Le Mur de la modelisation'/><author><name>Nicolas</name><uri>http://www.blogger.com/profile/03434148024010872285</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://2.bp.blogspot.com/_vbz7u92h91c/SJ6emBHBXjI/AAAAAAAAAC8/R27sE5IMTms/s1600-R/me.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-17362732.post-114711884827169111</id><published>2006-05-08T12:49:00.000-07:00</published><updated>2006-05-08T13:37:47.846-07:00</updated><title type='text'>Emergence</title><content type='html'>Les tags ne sont qu'une premiere etape.

 Quel est l'interet des tags en realité? A mon point de vue, ils sont interessants car ils sont l'outil d'une organisation emergente.

 A contempler mon terminal Reuters et son interface des années 90, je me dis que le systeme des "topic" n'est pas si novateur qu'il y parait sur le web !

 L'innovation est que tout un chacun a la possibilité de se construire son propre dictionnaire, et d'y contribuer. L'innovation n'est pas dans l'information, mais dans la plateforme qui permet l'emergence. Les tags constitue une plateforme (perfectible) pour faire emerger des ontologies.

 Le futur consiste à extraire les conditions de l'emergence et à s'appliquer à les reproduire dans d'autres domaines, fonctionnellement plus riches que de simples topics.

 Etendons ce concept et nous permettrons par exemple un jour de faire emerger des applications. Travaillant en salle de marché, domaine friand de technologie de l'information, on ne peut que constater l'incapacité des processus de formalisation traditionnel. Plutot que de se battre contre cela, fabriquer un pont entre l'informel (spreadsheet excel, mail...) et le formel (worflow, BPM...) semble une solution.

 Quelles sont donc les conditions de l'emergence? A mon sens, il faut que les interlocuteurs partagent un modele de donnée. Dans le cas des tags, il s'agit d'un "topic", objet simple s'il en est, et canoniquement interpretable...

 Il est par ailleurs structurellement logique que derriere l'emergence se niche tout une richesse applicative puisque le modele precedent de developpement logiciel suppose la delegation entre l'utilisateur final et le realisateur. Et le cout d'agence associé (pas forcement que monetaire) a forcement occulté tout un pan applicatif jugé non critique pour les business lines mais radicalement novateur collectivement...

 Si ces sujet vous interessent, n'hesitez pas à reagir/me contacter pour que l'on en discute online ou de vive voix. &lt;div class="tags"&gt;Tags:&lt;ul&gt;&lt;li&gt;&lt;a href="http://del.icio.us/nrolland/Structurallyyours+tags" rel="tag"&gt;tags&lt;/a&gt;&lt;/li&gt; &lt;li&gt;&lt;a href="http://del.icio.us/nrolland/Structurallyyours+metadata" rel="tag"&gt;metadata&lt;/a&gt;&lt;/li&gt; &lt;li&gt;&lt;a href="http://del.icio.us/nrolland/Structurallyyours+emergence" rel="tag"&gt;emergence&lt;/a&gt;&lt;/li&gt; &lt;/ul&gt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/17362732-114711884827169111?l=technofinance.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://technofinance.blogspot.com/feeds/114711884827169111/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=17362732&amp;postID=114711884827169111' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/17362732/posts/default/114711884827169111'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/17362732/posts/default/114711884827169111'/><link rel='alternate' type='text/html' href='http://technofinance.blogspot.com/2006/05/emergence.html' title='Emergence'/><author><name>Nicolas</name><uri>http://www.blogger.com/profile/03434148024010872285</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://2.bp.blogspot.com/_vbz7u92h91c/SJ6emBHBXjI/AAAAAAAAAC8/R27sE5IMTms/s1600-R/me.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-17362732.post-114701444505797158</id><published>2006-05-07T08:02:00.000-07:00</published><updated>2006-05-08T12:47:20.233-07:00</updated><title type='text'>Compilation reloaded</title><content type='html'>If you are thinking about expressions, abstract syntax tree, dynamic langages... 
here is an interesting representation to guide your thoughts.
It does to performance what you can do for other properties.


&lt;a href="http://photos1.blogger.com/blogger/6411/209/1600/compilation.1.png"&gt;&lt;img style="DISPLAY: block; MARGIN: 0px auto 10px; CURSOR: hand; TEXT-ALIGN: center" alt="" src="http://photos1.blogger.com/blogger/6411/209/400/compilation.0.png" border="0" /&gt;&lt;/a&gt;

(From F# &lt;a href="http://research.microsoft.com/fsharp/slides/ml-reloaded.ppt"&gt;presentation&lt;/a&gt;)

&lt;div class="tags"&gt;Tags:&lt;ul&gt;&lt;li&gt;&lt;a href="http://del.icio.us/nrolland/Structurallyyours+AST" rel="tag"&gt;AST&lt;/a&gt;&lt;/li&gt; &lt;li&gt;&lt;a href="http://del.icio.us/nrolland/Structurallyyours+csharp" rel="tag"&gt;csharp&lt;/a&gt;&lt;/li&gt; &lt;/ul&gt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/17362732-114701444505797158?l=technofinance.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://technofinance.blogspot.com/feeds/114701444505797158/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=17362732&amp;postID=114701444505797158' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/17362732/posts/default/114701444505797158'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/17362732/posts/default/114701444505797158'/><link rel='alternate' type='text/html' href='http://technofinance.blogspot.com/2006/05/compilation-reloaded.html' title='Compilation reloaded'/><author><name>Nicolas</name><uri>http://www.blogger.com/profile/03434148024010872285</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://2.bp.blogspot.com/_vbz7u92h91c/SJ6emBHBXjI/AAAAAAAAAC8/R27sE5IMTms/s1600-R/me.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-17362732.post-114700514837597415</id><published>2006-05-07T05:27:00.000-07:00</published><updated>2006-05-08T12:44:21.026-07:00</updated><title type='text'>Top challenges</title><content type='html'>My list of the top open challenges in IT...


&lt;span style="font-weight: bold;"&gt;1. Metadata&lt;/span&gt;&lt;span style="font-weight: normal;"&gt;

Correctly handling metadata on a large scale and distributed basis is the fundation for giving a semantic web. This would enable a richer exchange network.

&lt;/span&gt;&lt;span style="font-weight: bold;"&gt;2. Awareness environment&lt;/span&gt;

"awareness" means the relation of one object to its context.
For instance
.the security context under which a program runs
.the available network ressources
.The degree of optimizations available for a query
.The links between this entry, for instance, and you, reader

Having a consistent set of environmental service, and a built in "awareness" in common langage enables is crucial.

This basically means that you are able to have separation of concerns, yet benefit of rich default functionalities.


&lt;span style="font-weight: bold;"&gt;3. Data mapping&lt;/span&gt;

Being able to seamlessly create live between datasources is crucial, and maintain that (hopefully "aware")  link is also a basic functionnality which has no obvious standard answer.
It has huge impact on basically every domain you can think of.


&lt;span style="font-weight: bold;"&gt;4. Distributed computing&lt;/span&gt;

There are tons of critical applications which require huge computing ressources : proteins folding, dna statistics

Good news :  There is a lot of it around the world....
Bad news : it is not available !!

So finding a consistent way to perform distributed computation  is a tremendous challenge.

Let's abstract from the vision of the many computers and consider that you have a thousand-core processor. Now without a consistant way to perform distributed compuations,
your apps don't go faster with it, only you can launch if you want a thousand apps...

Now consider that this app that you want to go fast will make it possible - or not - to save millions of life every year...
I guess now you can get an idea of the frustration the current situation generates.


&lt;span style="font-weight: bold;"&gt;5. Data and metadata merge&lt;/span&gt;
Being able to merge data and metadata will make it possible for everyone to enrich the typing system, while consuming some other's data.

This merge would basically enable to have distributedd modeling, for all those numerous domain where having a thousand consultants for a thousand years would not be enough.

If you consider the workflow of creating software, it is very unsatisfactory today.
The delegation issue between the requirer, the manager, the programme is very, very complex.
This is a huge bottleneck for hig bandwidth software where you don't want to want for the next 3year release.

Merging data and metadata enables knowledgeable end user to extend the built objects to their need.
Hopefully with "awareness", some statistical computations would prevent the resulting mess and offer model consistency across user.

&lt;span style="font-weight: bold;"&gt;6. ObjectNet&lt;/span&gt;

Being able to natively exchange object would definitely foster the web to a higher level.
The promised land of Corba and the like might become a reality if the performant infrastructure make it usable.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/17362732-114700514837597415?l=technofinance.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://technofinance.blogspot.com/feeds/114700514837597415/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=17362732&amp;postID=114700514837597415' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/17362732/posts/default/114700514837597415'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/17362732/posts/default/114700514837597415'/><link rel='alternate' type='text/html' href='http://technofinance.blogspot.com/2006/05/top-challenges.html' title='Top challenges'/><author><name>Nicolas</name><uri>http://www.blogger.com/profile/03434148024010872285</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://2.bp.blogspot.com/_vbz7u92h91c/SJ6emBHBXjI/AAAAAAAAAC8/R27sE5IMTms/s1600-R/me.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-17362732.post-114700425787662330</id><published>2006-05-07T05:17:00.000-07:00</published><updated>2006-05-07T05:17:58.846-07:00</updated><title type='text'>Managing metadata</title><content type='html'>Metadata have very interesting feature to organize information:

.They enables a many-hierarchies classification : 

For instance the tags on this blogs enable as many a one level hierarchy per tag, aka a grouping. If I add one hierarchy underwhich to file entries, I would have to file each message under ONE node. Without it you end uup with the nightmare of having t choose weather a car's bill should be filled under the car node or the bill node, and  you have all the chances that part of those items will be there, another part there : your information will be scattered, disorganised.


.They provide with an extensible type system :

You dont have to own the object to add some comments to it, or other datas. Metadata natively enable distribution wich is the underlying character of the internet... and of information itself !
So having a correct system to handle metadata is an essential piece of work in IT.



Actually, regarding the first aspect, the french secret service, back in the time where everything was paper based, were famous at some point for having a cross-reference system which would emulate physically the tag system.

Isn't it interesting to see how non-linear history can be?&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/17362732-114700425787662330?l=technofinance.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://technofinance.blogspot.com/feeds/114700425787662330/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=17362732&amp;postID=114700425787662330' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/17362732/posts/default/114700425787662330'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/17362732/posts/default/114700425787662330'/><link rel='alternate' type='text/html' href='http://technofinance.blogspot.com/2006/05/managing-metadata.html' title='Managing metadata'/><author><name>Nicolas</name><uri>http://www.blogger.com/profile/03434148024010872285</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://2.bp.blogspot.com/_vbz7u92h91c/SJ6emBHBXjI/AAAAAAAAAC8/R27sE5IMTms/s1600-R/me.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-17362732.post-114700257001149366</id><published>2006-05-07T04:48:00.000-07:00</published><updated>2006-06-04T13:40:05.543-07:00</updated><title type='text'>Categories for Blogger</title><content type='html'>If you want to add some topics to your blogger blogs, you'll have to use some tagging provider, like delicious, and then connect your blogger template to it.

Don't run away, it's not that hard, and to now it's the only way.

There are basically 2 or 3 steps required :
&lt;ol&gt;&lt;li&gt;At every post, feed your tagger with the your chosen tags for the entry&lt;/li&gt;&lt;li&gt;potentially including those tags in the entry as well&lt;/li&gt;&lt;li&gt;At Blogger display level, have the tags and the tagged entry to be displayed &lt;/li&gt;&lt;/ol&gt;

The basic concept is that from your tag provider, each blog entry will be tagged with the name of your blog. Then from a blog perspective, we can ask your tag provider to retrieve those entries and display them in blogger.
&lt;ul&gt;&lt;li&gt;For step 1 and 2 if you use &lt;a href="http://www.firefox.com"&gt;Firefox  &lt;/a&gt;and &lt;a href="http://greasemonkey.mozdev.org/"&gt;Greasemonkey &lt;/a&gt;extension, the following script makes it easy to have tags at posting time : &lt;span style="color: rgb(41, 57, 56);"&gt;&lt;span style="color: rgb(41, 57, 56);"&gt;&lt;a href="http://userscripts.org/scripts/show/2182"&gt;Script 2182&lt;/a&gt;: Deluxe Script by Johan Sundstrom w/ additional features&lt;/span&gt;&lt;/span&gt;&lt;/li&gt;&lt;li&gt;For step 3, you can use &lt;a href="http://ghill.customer.netspace.net.au/freshtags/"&gt;freshtags&lt;/a&gt;, which is a bit of javascript code to interrogates delicious and adds the navigation html to your page.&lt;/li&gt;&lt;/ul&gt;But I wanted more control than just a tag navigation system.
I wanted to be able to tags some posts as "sticky", and have a permaent sections to display those. Or may be have some other sections where I collect my "interesting links" items.


So I modified the freshtags javascript.
If you want to do this, just replace the freshtag javascript file with this one.
(Adapt to your delicious user name and your blog tag - the 'anchor')


&amp;lt;

&lt;!-- code formatted by http://manoli.net/csharpformat/ --&gt;
&lt;pre class="csharpcode"&gt;
&lt;span class="kwrd"&gt;&amp;lt;&lt;/span&gt;&lt;span class="html"&gt;script&lt;/span&gt; &lt;span class="attr"&gt;type&lt;/span&gt;&lt;span class="kwrd"&gt;="text/javascript"&lt;/span&gt;&lt;span class="kwrd"&gt;&amp;gt;&lt;/span&gt;
&lt;span class="rem"&gt;//FreshTags v0.5 http://www.greg-hill.id.au&lt;/span&gt;
del_user = &lt;span class="str"&gt;"nrolland"&lt;/span&gt;;
anchor = &lt;span class="str"&gt;"Structurallyyours"&lt;/span&gt;;
archive = &lt;span class="str"&gt;""&lt;/span&gt;;
defs = &lt;span class="str"&gt;""&lt;/span&gt;;
maxposts = 20;
writeScript( &lt;span class="str"&gt;"http://del.icio.us/feeds/json/tags/nrolland/structurallyyours?sort=freq&amp;count=100"&lt;/span&gt; );
&lt;span class="rem"&gt;//writeScript( "http://ghill.customer.netspace.net.au/freshtags/freshtags.js" );&lt;/span&gt;
writeScript(&lt;span class="str"&gt;"http://www.esnips.com/doc/4cc7f4ba-bdee-4810-8d66-b5dc8a008856/deliciousv1.js"&lt;/span&gt;);

&lt;span class="kwrd"&gt;function&lt;/span&gt; writeScript( src ) { document.write( &lt;span class="str"&gt;'&amp;lt;script type="text/javascript" src=" '&lt;/span&gt;+ src +&lt;span class="str"&gt;' "&amp;gt;&amp;lt;\/script&amp;gt;'&lt;/span&gt;)  }

window.onload = &lt;span class="kwrd"&gt;function&lt;/span&gt;() {
  displayinelement(&lt;span class="str"&gt;"list"&lt;/span&gt;, 20, &lt;span class="str"&gt;"catemergence"&lt;/span&gt;, &lt;span class="str"&gt;"emergence+permanent"&lt;/span&gt;);
  displayinelement(&lt;span class="str"&gt;"list"&lt;/span&gt;, 20, &lt;span class="str"&gt;"catlearning"&lt;/span&gt;, &lt;span class="str"&gt;"learning+permanent"&lt;/span&gt;);
  displayinelement(&lt;span class="str"&gt;"list"&lt;/span&gt;, 20, &lt;span class="str"&gt;"catdiffusion"&lt;/span&gt;, &lt;span class="str"&gt;"diffusion+permanent"&lt;/span&gt;);
  displayinelement(&lt;span class="str"&gt;"list"&lt;/span&gt;, 20, &lt;span class="str"&gt;"catproducts"&lt;/span&gt;, &lt;span class="str"&gt;"products+permanent"&lt;/span&gt;);
  displayinelement(&lt;span class="str"&gt;"list"&lt;/span&gt;, 20, &lt;span class="str"&gt;"catentrepreneurship"&lt;/span&gt;, &lt;span class="str"&gt;"entrepreneurship+permanent"&lt;/span&gt;);
  displayinelement(&lt;span class="str"&gt;"list"&lt;/span&gt;, 20, &lt;span class="str"&gt;"catsoftware"&lt;/span&gt;, &lt;span class="str"&gt;"software+permanent"&lt;/span&gt;);
}
&lt;span class="kwrd"&gt;&amp;lt;/&lt;/span&gt;&lt;span class="html"&gt;script&lt;/span&gt;&lt;span class="kwrd"&gt;&amp;gt;&lt;/span&gt;
&lt;/pre&gt;


This last code tells your browser to fill the HTML element called "catemergence" with the entries tagged "emergence" and "permanent" in delicious.
So there need to be somewhere in your template an element called as such, which will be the placeholder of your dynamic content :

 &lt;span id="ctl00_ContentPlaceHolder1_output"&gt;&lt;!-- code formatted by http://manoli.net/csharpformat/ --&gt;
&lt;style type="text/css"&gt;&lt;br /&gt;.csharpcode&lt;br /&gt;{&lt;br /&gt; font-size: small;&lt;br /&gt; color: black;&lt;br /&gt; font-family: Courier New , Courier, Monospace;&lt;br /&gt; background-color: #ffffff;&lt;br /&gt; /*white-space: pre;*/&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;.csharpcode pre { margin: 0em; }&lt;br /&gt;&lt;br /&gt;.csharpcode .rem { color: #008000; }&lt;br /&gt;&lt;br /&gt;.csharpcode .kwrd { color: #0000ff; }&lt;br /&gt;&lt;br /&gt;.csharpcode .str { color: #006080; }&lt;br /&gt;&lt;br /&gt;.csharpcode .op { color: #0000c0; }&lt;br /&gt;&lt;br /&gt;.csharpcode .preproc { color: #cc6633; }&lt;br /&gt;&lt;br /&gt;.csharpcode .asp { background-color: #ffff00; }&lt;br /&gt;&lt;br /&gt;.csharpcode .html { color: #800000; }&lt;br /&gt;&lt;br /&gt;.csharpcode .attr { color: #ff0000; }&lt;br /&gt;&lt;br /&gt;.csharpcode .alt &lt;br /&gt;{&lt;br /&gt; background-color: #f4f4f4;&lt;br /&gt; width: 100%;&lt;br /&gt; margin: 0em;&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;.csharpcode .lnum { color: #606060; }&lt;br /&gt;&lt;/style&gt;
&lt;pre class="csharpcode"&gt;
&lt;span class="kwrd"&gt;&amp;lt;&lt;/span&gt;&lt;span class="html"&gt;div&lt;/span&gt; &lt;span class="attr"&gt;id&lt;/span&gt;&lt;span class="kwrd"&gt;="catemergence"&lt;/span&gt;             &lt;span class="attr"&gt;class&lt;/span&gt;&lt;span class="kwrd"&gt;="permanent"&lt;/span&gt;&lt;span class="kwrd"&gt;&amp;gt;&lt;/span&gt;&lt;/pre&gt;&lt;/span&gt;



So now you can easily have many sections which are automatically feed by the tags you provide.




&lt;div class="tags"&gt;Tags:&lt;ul&gt;&lt;li&gt;&lt;a href="http://del.icio.us/nrolland/Structurallyyours+metadata" rel="tag"&gt;metadata&lt;/a&gt;&lt;/li&gt; &lt;li&gt;&lt;a href="http://del.icio.us/nrolland/Structurallyyours+tags" rel="tag"&gt;tags&lt;/a&gt;&lt;/li&gt; &lt;li&gt;&lt;a href="http://del.icio.us/nrolland/Structurallyyours+blog" rel="tag"&gt;blog&lt;/a&gt;&lt;/li&gt; &lt;/ul&gt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/17362732-114700257001149366?l=technofinance.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://technofinance.blogspot.com/feeds/114700257001149366/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=17362732&amp;postID=114700257001149366' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/17362732/posts/default/114700257001149366'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/17362732/posts/default/114700257001149366'/><link rel='alternate' type='text/html' href='http://technofinance.blogspot.com/2006/05/categories-for-blogger.html' title='Categories for Blogger'/><author><name>Nicolas</name><uri>http://www.blogger.com/profile/03434148024010872285</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://2.bp.blogspot.com/_vbz7u92h91c/SJ6emBHBXjI/AAAAAAAAAC8/R27sE5IMTms/s1600-R/me.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-17362732.post-114693240832099981</id><published>2006-05-06T08:56:00.000-07:00</published><updated>2006-05-07T02:26:39.700-07:00</updated><title type='text'>Powershell : more than just a shell</title><content type='html'>Microsoft has been working for some time now on a shell named &lt;a href="http://www.microsoft.com/downloads/details.aspx?familyid=2B0BBFCD-0797-4083-A817-5E6A054A85C9&amp;displaylang=en"&gt;Powershell &lt;/a&gt;(previously called Monad), which brings the tremendous power of dotnet at your fingertips.

A technical presentation is &lt;a href="http://download.microsoft.com/download/1/8/f/18f8cee2-0b64-41f2-893d-a6f2295b40c8/TW04038_WINHEC2004.ppt"&gt;here&lt;/a&gt;, download is &lt;a href="http://www.microsoft.com/downloads/details.aspx?familyid=2B0BBFCD-0797-4083-A817-5E6A054A85C9&amp;amp;displaylang=en"&gt;here&lt;/a&gt;

It all look like a shell you'd know like a DOS command prompt or for those of you who used unix like a bash or korn shell.

But this usual seamingly innocuous tool's mission is actually to connect you, the user, with an easy acces to all those structures defined in  your computer :
COM object written by some painful C++ programmers, small admin script written by a colleague, VB type written by your intern yesterday.

All those elements have a vocation to be accessible through a uniform way from monad, who lives in between those elements and the user, and make it easy for a simple element to be available for consumption.


Monad contribution on bringing a programmed elements ready to industrial strength use  on 3 aspects


&lt;span style="font-weight: bold;"&gt;User interaction&lt;/span&gt;

&lt;ul&gt;&lt;li&gt;it automatically makes sure the necessary arguments are filled, and take necessary corrective steps. the original programmed object does not have to do anything to inherit this behaviour
&lt;/li&gt;&lt;li&gt;it automatically provides parsing functionnality for the arguments provided, and again the programmed component needs not to know about any of this stuff.&lt;/li&gt;&lt;li&gt;it handles error in a clean way, and reports them as such without breaking eventual function composition&lt;/li&gt;&lt;li&gt;it will load the necessary dll and other components on the fly&lt;/li&gt;&lt;li&gt;it provides with standard output formatting, be it text or other component (excel graphics)&lt;/li&gt;&lt;li&gt;you can group object's properties through sets, which corresponds to one particular point of view of an object (mind you I dont care most of the time of the pid of a process....)
&lt;/li&gt;&lt;/ul&gt;

&lt;span style="font-weight: bold;"&gt;A rich native environment &lt;/span&gt;

&lt;ul&gt;&lt;li&gt;your objects will natively have a common space to live and cohabitate in..
&lt;/li&gt;&lt;li&gt;and they can alos collaborate through piping object from one command to another, composing functions easily&lt;/li&gt;&lt;/ul&gt;&lt;span style="font-weight: bold;"&gt;
An extendable type system&lt;/span&gt;
&lt;ul&gt;&lt;li&gt;The ability to dynamically enrich the type system of an object on the fly
&lt;/li&gt;&lt;/ul&gt;

This last functionnality is for me the best thing, as it blurs the distinction between data and metadata, which is where the crux of programming is.

As a forecasted development is the GUIfication of these commands, which should be a piece of cake now that the mmode of interactions of object with one another is frozen and that the behaviour of each object with respect to it is explicit


&lt;span style="font-weight: bold;"&gt;The bigger picture&lt;/span&gt;


Now apart from the obvious much desired cool functionalities I described, the REAL stuff provided here is all about 2 things :

&lt;ol&gt;&lt;li&gt;&lt;span style="font-weight: bold;"&gt;object pipelines&lt;/span&gt;&lt;/li&gt;&lt;li&gt;&lt;span style="font-weight: bold;"&gt;runtime typesystem extension
&lt;/span&gt;&lt;/li&gt;&lt;/ol&gt;
Those are the two properties you can create a goldmine on.


Look :
what if we enable different users to interact with each other and exchange objects...... ?
Oh, and by the way those objects exchanged, mind you, it's not some guy who decides what they are every 5year releases. Na, you just inherit those, and then you can tweak them at will..


One more question :
What would you think if we replaced the Internet by the ObjectNet.. ?
&lt;div class="tags"&gt;Tags:&lt;ul&gt;&lt;li&gt;&lt;a href="http://del.icio.us/nrolland/Structurallyyours+powershell" rel="tag"&gt;powershell&lt;/a&gt;&lt;/li&gt; &lt;li&gt;&lt;a href="http://del.icio.us/nrolland/Structurallyyours+metadata" rel="tag"&gt;metadata&lt;/a&gt;&lt;/li&gt; &lt;li&gt;&lt;a href="http://del.icio.us/nrolland/Structurallyyours+csharp" rel="tag"&gt;csharp&lt;/a&gt;&lt;/li&gt; &lt;/ul&gt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/17362732-114693240832099981?l=technofinance.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://technofinance.blogspot.com/feeds/114693240832099981/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=17362732&amp;postID=114693240832099981' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/17362732/posts/default/114693240832099981'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/17362732/posts/default/114693240832099981'/><link rel='alternate' type='text/html' href='http://technofinance.blogspot.com/2006/05/powershell-more-than-just-shell.html' title='Powershell : more than just a shell'/><author><name>Nicolas</name><uri>http://www.blogger.com/profile/03434148024010872285</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://2.bp.blogspot.com/_vbz7u92h91c/SJ6emBHBXjI/AAAAAAAAAC8/R27sE5IMTms/s1600-R/me.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-17362732.post-114349388891179107</id><published>2006-03-27T13:10:00.000-08:00</published><updated>2006-05-21T09:47:23.823-07:00</updated><title type='text'>Illustration of the Linq "Expressions Tree" and of the former classes</title><content type='html'>As an illustration of what is an Linq "Expression Tree", I will demonstrate here how to go from a simple one line declaration in a source file :
&lt;span style="font-size:85%;color:#008080;"&gt;Expression&lt;/span&gt;
&lt;span style="font-size:85%;"&gt;&amp;lt;&lt;/span&gt;
&lt;span style="font-size:85%;color:#008080;"&gt;Func&lt;/span&gt;
&lt;span style="font-size:85%;"&gt;&amp;lt;&lt;/span&gt;
&lt;span style="font-size:85%;color:#008080;"&gt;BusinessDAO&lt;/span&gt;
&lt;span style="font-size:85%;"&gt;, &lt;/span&gt;
&lt;span style="font-size:85%;color:#008080;"&gt;IEnumerable&lt;/span&gt;
&lt;span style="font-size:85%;"&gt;&amp;gt;&amp;gt; FunctionExpression = mydata =&amp;gt; mydata.Products.Where(p =&amp;gt; p.UnitPrice.Length == 4);
&lt;/span&gt;
&lt;span style="font-size:85%;"&gt;&lt;/span&gt;&lt;span style="font-size:85%;"&gt;&lt;/span&gt;
&lt;span style="font-size:85%;"&gt;&lt;/span&gt;
to a visual representation of that code :
&lt;a href="http://photos1.blogger.com/blogger/6411/209/1600/Capture2.jpg"&gt;
&lt;img heigth=20% width=20% src="http://photos1.blogger.com/blogger/6411/209/1600/Capture2.jpg"/&gt;
&lt;/a&gt;



As an illustration of the previous post, I managed to go from here to there in two different ways.
&lt;ul&gt;&lt;li&gt;Once using the "Visitor pattern" to the Expression :&lt;/li&gt;&lt;/ul&gt;&lt;p&gt;In that case, the tree structure is "implicit" and is handled internally by the visitor logic&lt;/p&gt;&lt;ul&gt;&lt;li&gt;Once with a classical Tree obtained using the wrapper exposed on the previous post :&lt;/li&gt;&lt;/ul&gt;&lt;p&gt;Here the tree is accessed direcly on the ExpressionTree object itself, as the role of the wrapper is to explicit the implicit tree structure, and expose it trhough a "children" property. I hope this make it clearer what expressions are.&lt;/p&gt;
&lt;p&gt;So now, the interesting question : which usefulness do you envision for them in your projects .....? ;)&lt;/p&gt;



&lt;a href="javascript:expandcollapse('codeexpression')"&gt;[+/-] read/hide the code&lt;/a&gt;
&lt;span class="posthidden" id="codeexpression"&gt;

&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;&lt;u&gt;&lt;strong&gt;Form1.cs&lt;/strong&gt;&lt;/u&gt;

&lt;!-- code formatted by http://manoli.net/csharpformat/ --&gt;
&lt;pre class="csharpcode"&gt;
&lt;span class="kwrd"&gt;using&lt;/span&gt; System;
&lt;span class="kwrd"&gt;using&lt;/span&gt; System.Collections;
&lt;span class="kwrd"&gt;using&lt;/span&gt; System.Collections.Generic;
&lt;span class="kwrd"&gt;using&lt;/span&gt; System.Expressions;
&lt;span class="kwrd"&gt;using&lt;/span&gt; System.Query;
&lt;span class="kwrd"&gt;using&lt;/span&gt; System.Windows.Forms;
&lt;span class="kwrd"&gt;using&lt;/span&gt; DataStructure;

&lt;span class="kwrd"&gt;namespace&lt;/span&gt; ExpressionIllustration
{



    &lt;span class="kwrd"&gt;public&lt;/span&gt; &lt;span class="kwrd"&gt;partial&lt;/span&gt; &lt;span class="kwrd"&gt;class&lt;/span&gt; Form1 : Form
    {
        BusinessDAO data;
        &lt;span class="kwrd"&gt;public&lt;/span&gt; Form1()
        {
            InitializeComponent();
            data = &lt;span class="kwrd"&gt;new&lt;/span&gt; BusinessDAO();
        }


        &lt;span class="kwrd"&gt;private&lt;/span&gt; &lt;span class="kwrd"&gt;void&lt;/span&gt; button1_Click(&lt;span class="kwrd"&gt;object&lt;/span&gt; sender, EventArgs e)
        {
            Expression&amp;lt;Func&amp;lt;BusinessDAO, IEnumerable&amp;gt;&amp;gt; FunctionExpression =mydata =&amp;gt; mydata.Products.Where(p =&amp;gt; p.ProductName.Length == 4);

            &lt;span class="kwrd"&gt;this&lt;/span&gt;.treeView1.Nodes.Clear();
            &lt;span class="kwrd"&gt;this&lt;/span&gt;.treeView1.Nodes.Add((TreeNode)FunctionExpression.Visit(&lt;span class="kwrd"&gt;new&lt;/span&gt; ExpressionTreeVisitor.VisitorDelegate(Utils.ToTreeNodeConverter), &lt;span class="kwrd"&gt;null&lt;/span&gt;));
        }

        &lt;span class="kwrd"&gt;private&lt;/span&gt; &lt;span class="kwrd"&gt;void&lt;/span&gt; button2_Click(&lt;span class="kwrd"&gt;object&lt;/span&gt; sender, EventArgs e)
        {
            Expression&amp;lt;Func&amp;lt;BusinessDAO, IEnumerable&amp;gt;&amp;gt; FunctionExpression =mydata =&amp;gt; mydata.Products.Where(p =&amp;gt; p.ProductName.Length == 4);
            ExpressionTree FunctionExpressionAsaTree = &lt;span class="kwrd"&gt;new&lt;/span&gt; ExpressionTree(FunctionExpression);

            &lt;span class="kwrd"&gt;this&lt;/span&gt;.treeView1.Nodes.Clear();
            &lt;span class="kwrd"&gt;this&lt;/span&gt;.treeView1.Nodes.Add(FunctionExpressionAsaTree.ToTreeNodes());
        }
    }
    &lt;span class="kwrd"&gt;public&lt;/span&gt; &lt;span class="kwrd"&gt;static&lt;/span&gt; &lt;span class="kwrd"&gt;class&lt;/span&gt; Utils
    {
        &lt;span class="kwrd"&gt;public&lt;/span&gt; &lt;span class="kwrd"&gt;static&lt;/span&gt; &lt;span class="kwrd"&gt;object&lt;/span&gt; ToTreeNodeConverter(Expression arg, &lt;span class="kwrd"&gt;object&lt;/span&gt; param, &lt;span class="kwrd"&gt;object&lt;/span&gt;[] sonreturn)
        {
            TreeNode ret = &lt;span class="kwrd"&gt;new&lt;/span&gt; TreeNode(&lt;span class="str"&gt;"Return Type : "&lt;/span&gt; +arg.Type.ToString());
            ret.Nodes.Add(&lt;span class="kwrd"&gt;new&lt;/span&gt; TreeNode(&lt;span class="str"&gt;"Expression : "&lt;/span&gt; + arg.ToString()));
            ret.Nodes.Add(&lt;span class="kwrd"&gt;new&lt;/span&gt; TreeNode(&lt;span class="str"&gt;"Expression Type: "&lt;/span&gt; + arg.NodeType.ToString()));
            TreeNode children = &lt;span class="kwrd"&gt;new&lt;/span&gt; TreeNode(&lt;span class="str"&gt;"Children"&lt;/span&gt;);

            &lt;span class="kwrd"&gt;foreach&lt;/span&gt; (&lt;span class="kwrd"&gt;object&lt;/span&gt; son &lt;span class="kwrd"&gt;in&lt;/span&gt; sonreturn)
            {
                &lt;span class="kwrd"&gt;object&lt;/span&gt;[] group = son &lt;span class="kwrd"&gt;as&lt;/span&gt; &lt;span class="kwrd"&gt;object&lt;/span&gt;[];
                &lt;span class="kwrd"&gt;if&lt;/span&gt; (group != &lt;span class="kwrd"&gt;null&lt;/span&gt;)
                {
                    &lt;span class="kwrd"&gt;foreach&lt;/span&gt; (&lt;span class="kwrd"&gt;object&lt;/span&gt; obj &lt;span class="kwrd"&gt;in&lt;/span&gt; group)
                        children.Nodes.Add(obj &lt;span class="kwrd"&gt;as&lt;/span&gt; TreeNode);
                }
                &lt;span class="kwrd"&gt;else&lt;/span&gt;
                    children.Nodes.Add(son &lt;span class="kwrd"&gt;as&lt;/span&gt; TreeNode);
            }
         
            &lt;span class="kwrd"&gt;if&lt;/span&gt;(children.Nodes.Count &amp;gt;0)
                ret.Nodes.Add(children);
            &lt;span class="kwrd"&gt;return&lt;/span&gt; ret;
        }

        &lt;span class="kwrd"&gt;public&lt;/span&gt; &lt;span class="kwrd"&gt;static&lt;/span&gt; TreeNode ToTreeNodes(&lt;span class="kwrd"&gt;this&lt;/span&gt; ExpressionTree arg)
        {
            TreeNode ret = &lt;span class="kwrd"&gt;new&lt;/span&gt; TreeNode(arg.Type.ToString());
            ret.Nodes.Add(&lt;span class="kwrd"&gt;new&lt;/span&gt; TreeNode(&lt;span class="str"&gt;"Expression : "&lt;/span&gt; + arg.Value.ToString()));
            TreeNode children = &lt;span class="kwrd"&gt;new&lt;/span&gt; TreeNode(&lt;span class="str"&gt;"Children"&lt;/span&gt;);

            &lt;span class="kwrd"&gt;foreach&lt;/span&gt; (ExpressionTree son &lt;span class="kwrd"&gt;in&lt;/span&gt; arg.Children)
                children.Nodes.Add(son.ToTreeNodes());

            ret.Nodes.Add(children);
            &lt;span class="kwrd"&gt;return&lt;/span&gt; ret;
        }
    }

    &lt;span class="kwrd"&gt;public&lt;/span&gt; &lt;span class="kwrd"&gt;partial&lt;/span&gt; &lt;span class="kwrd"&gt;class&lt;/span&gt; Product
    {
        &lt;span class="kwrd"&gt;private&lt;/span&gt; &lt;span class="kwrd"&gt;string&lt;/span&gt; _ProductName;
        &lt;span class="kwrd"&gt;private&lt;/span&gt; &lt;span class="kwrd"&gt;double&lt;/span&gt; _UnitPrice;
        &lt;span class="kwrd"&gt;public&lt;/span&gt; &lt;span class="kwrd"&gt;string&lt;/span&gt; ProductName
        {
            get { &lt;span class="kwrd"&gt;return&lt;/span&gt; _ProductName; }
            set { _ProductName = &lt;span class="kwrd"&gt;value&lt;/span&gt;; }
        }
        &lt;span class="kwrd"&gt;public&lt;/span&gt; &lt;span class="kwrd"&gt;double&lt;/span&gt; UnitPrice
        {
            get { &lt;span class="kwrd"&gt;return&lt;/span&gt; _UnitPrice; }
            set { _UnitPrice = &lt;span class="kwrd"&gt;value&lt;/span&gt;; }
        }
    }

    &lt;span class="kwrd"&gt;public&lt;/span&gt; &lt;span class="kwrd"&gt;class&lt;/span&gt; BusinessDAO
    {
        Product[] aproducts = &lt;span class="kwrd"&gt;new&lt;/span&gt; Product[2];

        &lt;span class="kwrd"&gt;public&lt;/span&gt; BusinessDAO()
        {
            aproducts[0] = &lt;span class="kwrd"&gt;new&lt;/span&gt; Product { ProductName = &lt;span class="str"&gt;"1"&lt;/span&gt;, UnitPrice = 1 };
            aproducts[1] = &lt;span class="kwrd"&gt;new&lt;/span&gt; Product { ProductName = &lt;span class="str"&gt;"12"&lt;/span&gt;, UnitPrice = 2 };
        }

        &lt;span class="kwrd"&gt;public&lt;/span&gt; IEnumerable&amp;lt;Product&amp;gt; Products
        {
            get { &lt;span class="kwrd"&gt;return&lt;/span&gt; aproducts; }
        }
    }
}
 
&lt;/pre&gt;
&lt;/span&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/17362732-114349388891179107?l=technofinance.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://technofinance.blogspot.com/feeds/114349388891179107/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=17362732&amp;postID=114349388891179107' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/17362732/posts/default/114349388891179107'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/17362732/posts/default/114349388891179107'/><link rel='alternate' type='text/html' href='http://technofinance.blogspot.com/2006/03/illustration-of-linq-expressions-tree.html' title='Illustration of the Linq &quot;Expressions Tree&quot; and of the former classes'/><author><name>Nicolas</name><uri>http://www.blogger.com/profile/03434148024010872285</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://2.bp.blogspot.com/_vbz7u92h91c/SJ6emBHBXjI/AAAAAAAAAC8/R27sE5IMTms/s1600-R/me.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-17362732.post-114330850786567415</id><published>2006-03-25T09:35:00.000-08:00</published><updated>2006-05-21T09:29:46.026-07:00</updated><title type='text'>Expression Trees and Linq</title><content type='html'>I love this new technology called "Linq", not only does it make some things much simpler, it also allows new possibilities.

While upon writing traditionnal code you get a hold on the &lt;u&gt;end result function&lt;/u&gt;, with Expression Tree you can get a hold on the abstract &lt;u&gt;composition &lt;/u&gt;which your function is made of.
The actual operation performed by your instruction, or sequence of, is just an aspect of it.
One can in principle, manipulate, enrich the sequence before transforming it to an actual function...

You can think of it as an extension of delegates. While delegates enables you to defer the actual execution of a command, Expression Trees enables you to also defer the actual body content.

Practically, those operations are not natively possible with Linq alone. You need :

&lt;ul&gt;&lt;li&gt;A way to travel in the tree structure of the Expression tree  : you can start with the code below. feel free to post back some if you improve it.&lt;/li&gt;&lt;li&gt;A way to convert from the Expression tree to actual code : the espresso sample provides a first start too. May be I'll post some more complete code here.&lt;/li&gt;&lt;/ul&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;So here is a wrapper to the Linq Expression type I wrote to explicit the tree structure.I allows you to traverse the tree for transformation.&lt;/p&gt;&lt;p&gt; Possible improvements would be to &lt;/p&gt;&lt;ul&gt;&lt;li&gt;support grouping of children node&lt;/li&gt;&lt;li&gt;Adding event support (like adding, removing element..) to make it bindable&lt;/li&gt;&lt;/ul&gt;&lt;p&gt; &lt;/p&gt;


&lt;a href="javascript:expandcollapse('codelinq')"&gt;[+/-] read/hide the code&lt;/a&gt;
&lt;span class="posthidden" id="codelinq"&gt;

&lt;p&gt;&lt;u&gt;ExpressionTree.cs&lt;/u&gt;

&lt;!-- code formatted by http://manoli.net/csharpformat/ --&gt;
&lt;pre class="csharpcode"&gt;
&lt;span class="kwrd"&gt;using&lt;/span&gt; System;
&lt;span class="kwrd"&gt;using&lt;/span&gt; System.Collections.Generic;
&lt;span class="kwrd"&gt;using&lt;/span&gt; System.Expressions;

&lt;span class="kwrd"&gt;namespace&lt;/span&gt; DataStructure
{

   [Flags]
   &lt;span class="kwrd"&gt;public&lt;/span&gt; &lt;span class="kwrd"&gt;enum&lt;/span&gt; ExpressionTypeTree : &lt;span class="kwrd"&gt;long&lt;/span&gt;
   {
       Add = 0,
       And = 2,
       As = 4,
       BitwiseAnd = 8,
       BitwiseNot = 16,
       BitwiseOr = 32,
       BitwiseXor = 64,
       Cast = 128,
       Coalesce = 256,
       Concat = 512,
       Constant = 1024,
       Convert = 2048,
       Divide = 4096,
       EQ = 8192,
       Funclet = 16384,
       GT = 32768,
       GE = 65536,
       Index = 131072,
       Invoke = 262144,
       Is = 524488,
       Lambda = 1048576,
       LE = 2097152,
       Len = 4194304,
       LShift = 8388608,
       LT = 16777216,
       MemberAccess = 33554432,
       MethodCall = 67108864,
       Modulo = 134217728,
       Multiply = 268435456,
       Negate = 536870912,
       NE = 1073741824,
       New = 2147483648,
       NewArrayInit = 4294967296,
       NewArrayBounds = 8589934592,
       Not = 17179869184,
       Or = 34359738368,
       Parameter = 68719476736,
       RShift = 137438953472,
       Source = 274877906944,
       Subtract = 549755813888,
       All = 1099511627775,
   }

   &lt;span class="kwrd"&gt;public&lt;/span&gt; &lt;span class="kwrd"&gt;class&lt;/span&gt; ExpressionTreeVisitor
   {
       &lt;span class="kwrd"&gt;public&lt;/span&gt; &lt;span class="kwrd"&gt;delegate&lt;/span&gt; &lt;span class="kwrd"&gt;object&lt;/span&gt; VisitorDelegate(Expression e, &lt;span class="kwrd"&gt;object&lt;/span&gt; param, &lt;span class="kwrd"&gt;object&lt;/span&gt;[] sonreturn);

       &lt;span class="kwrd"&gt;public&lt;/span&gt; VisitorDelegate VisitorNew;
       &lt;span class="kwrd"&gt;public&lt;/span&gt; VisitorDelegate VisitorBitwiseNot;
       &lt;span class="kwrd"&gt;public&lt;/span&gt; VisitorDelegate VisitorNegate;
       &lt;span class="kwrd"&gt;public&lt;/span&gt; VisitorDelegate VisitorNot;
       &lt;span class="kwrd"&gt;public&lt;/span&gt; VisitorDelegate VisitorAdd;
       &lt;span class="kwrd"&gt;public&lt;/span&gt; VisitorDelegate VisitorSubtract;
       &lt;span class="kwrd"&gt;public&lt;/span&gt; VisitorDelegate VisitorMultiply;
       &lt;span class="kwrd"&gt;public&lt;/span&gt; VisitorDelegate VisitorDivide;
       &lt;span class="kwrd"&gt;public&lt;/span&gt; VisitorDelegate VisitorModulo;
       &lt;span class="kwrd"&gt;public&lt;/span&gt; VisitorDelegate VisitorAnd;
       &lt;span class="kwrd"&gt;public&lt;/span&gt; VisitorDelegate VisitorOr;
       &lt;span class="kwrd"&gt;public&lt;/span&gt; VisitorDelegate VisitorLT;
       &lt;span class="kwrd"&gt;public&lt;/span&gt; VisitorDelegate VisitorLE;
       &lt;span class="kwrd"&gt;public&lt;/span&gt; VisitorDelegate VisitorGT;
       &lt;span class="kwrd"&gt;public&lt;/span&gt; VisitorDelegate VisitorGE;
       &lt;span class="kwrd"&gt;public&lt;/span&gt; VisitorDelegate VisitorEQ;
       &lt;span class="kwrd"&gt;public&lt;/span&gt; VisitorDelegate VisitorNE;
       &lt;span class="kwrd"&gt;public&lt;/span&gt; VisitorDelegate VisitorBitwiseAnd;
       &lt;span class="kwrd"&gt;public&lt;/span&gt; VisitorDelegate VisitorBitwiseOr;
       &lt;span class="kwrd"&gt;public&lt;/span&gt; VisitorDelegate VisitorBitwiseXor;
       &lt;span class="kwrd"&gt;public&lt;/span&gt; VisitorDelegate VisitorCoalesce;
       &lt;span class="kwrd"&gt;public&lt;/span&gt; VisitorDelegate VisitorConstant;
       &lt;span class="kwrd"&gt;public&lt;/span&gt; VisitorDelegate VisitorMemberAccess;
       &lt;span class="kwrd"&gt;public&lt;/span&gt; VisitorDelegate VisitorLambda;
       &lt;span class="kwrd"&gt;public&lt;/span&gt; VisitorDelegate VisitorParameter;
       &lt;span class="kwrd"&gt;public&lt;/span&gt; VisitorDelegate VisitorMethodCall;
       &lt;span class="kwrd"&gt;public&lt;/span&gt; VisitorDelegate VisitorCast;
       &lt;span class="kwrd"&gt;public&lt;/span&gt; VisitorDelegate VisitorConcat;
       &lt;span class="kwrd"&gt;public&lt;/span&gt; VisitorDelegate VisitorFunclet;
       &lt;span class="kwrd"&gt;public&lt;/span&gt; VisitorDelegate VisitorNewArrayInit;
       &lt;span class="kwrd"&gt;public&lt;/span&gt; VisitorDelegate VisitorDefault;


       &lt;span class="kwrd"&gt;public&lt;/span&gt; &lt;span class="kwrd"&gt;virtual&lt;/span&gt; &lt;span class="kwrd"&gt;void&lt;/span&gt; AssignVisitorTo(VisitorDelegate v, ExpressionTypeTree e)
       {
           &lt;span class="kwrd"&gt;if&lt;/span&gt; ((e &amp; ExpressionTypeTree.New) != 0)
               VisitorNew = v;
           &lt;span class="kwrd"&gt;if&lt;/span&gt; ((e &amp; ExpressionTypeTree.BitwiseNot) != 0)
               VisitorBitwiseNot = v;
           &lt;span class="kwrd"&gt;if&lt;/span&gt; ((e &amp; ExpressionTypeTree.Negate) != 0)
               VisitorNegate = v;
           &lt;span class="kwrd"&gt;if&lt;/span&gt; ((e &amp; ExpressionTypeTree.Not) != 0)
               VisitorNot = v;
           &lt;span class="kwrd"&gt;if&lt;/span&gt; ((e &amp; ExpressionTypeTree.Add) != 0)
               VisitorAdd = v;
           &lt;span class="kwrd"&gt;if&lt;/span&gt; ((e &amp; ExpressionTypeTree.Subtract) != 0)
               VisitorSubtract = v;
           &lt;span class="kwrd"&gt;if&lt;/span&gt; ((e &amp; ExpressionTypeTree.Multiply) != 0)
               VisitorMultiply = v;
           &lt;span class="kwrd"&gt;if&lt;/span&gt; ((e &amp; ExpressionTypeTree.Divide) != 0)
               VisitorDivide = v;
           &lt;span class="kwrd"&gt;if&lt;/span&gt; ((e &amp; ExpressionTypeTree.Modulo) != 0)
               VisitorModulo = v;
           &lt;span class="kwrd"&gt;if&lt;/span&gt; ((e &amp; ExpressionTypeTree.And) != 0)
               VisitorAnd = v;
           &lt;span class="kwrd"&gt;if&lt;/span&gt; ((e &amp; ExpressionTypeTree.Or) != 0)
               VisitorOr = v;
           &lt;span class="kwrd"&gt;if&lt;/span&gt; ((e &amp; ExpressionTypeTree.LT) != 0)
               VisitorLT = v;
           &lt;span class="kwrd"&gt;if&lt;/span&gt; ((e &amp; ExpressionTypeTree.LE) != 0)
               VisitorLE = v;
           &lt;span class="kwrd"&gt;if&lt;/span&gt; ((e &amp; ExpressionTypeTree.GT) != 0)
               VisitorGT = v;
           &lt;span class="kwrd"&gt;if&lt;/span&gt; ((e &amp; ExpressionTypeTree.GE) != 0)
               VisitorGE = v;
           &lt;span class="kwrd"&gt;if&lt;/span&gt; ((e &amp; ExpressionTypeTree.EQ) != 0)
               VisitorEQ = v;
           &lt;span class="kwrd"&gt;if&lt;/span&gt; ((e &amp; ExpressionTypeTree.NE) != 0)
               VisitorNE = v;
           &lt;span class="kwrd"&gt;if&lt;/span&gt; ((e &amp; ExpressionTypeTree.BitwiseAnd) != 0)
               VisitorBitwiseAnd = v;
           &lt;span class="kwrd"&gt;if&lt;/span&gt; ((e &amp; ExpressionTypeTree.BitwiseOr) != 0)
               VisitorBitwiseOr = v;
           &lt;span class="kwrd"&gt;if&lt;/span&gt; ((e &amp; ExpressionTypeTree.BitwiseXor) != 0)
               VisitorBitwiseXor = v;
           &lt;span class="kwrd"&gt;if&lt;/span&gt; ((e &amp; ExpressionTypeTree.Coalesce) != 0)
               VisitorCoalesce = v;
           &lt;span class="kwrd"&gt;if&lt;/span&gt; ((e &amp; ExpressionTypeTree.Constant) != 0)
               VisitorConstant = v;
           &lt;span class="kwrd"&gt;if&lt;/span&gt; ((e &amp; ExpressionTypeTree.MemberAccess) != 0)
               VisitorMemberAccess = v;
           &lt;span class="kwrd"&gt;if&lt;/span&gt; ((e &amp; ExpressionTypeTree.Lambda) != 0)
               VisitorLambda = v;
           &lt;span class="kwrd"&gt;if&lt;/span&gt; ((e &amp; ExpressionTypeTree.Parameter) != 0)
               VisitorParameter = v;
           &lt;span class="kwrd"&gt;if&lt;/span&gt; ((e &amp; ExpressionTypeTree.MethodCall) != 0)
               VisitorMethodCall = v;
           &lt;span class="kwrd"&gt;if&lt;/span&gt; ((e &amp; ExpressionTypeTree.Cast) != 0)
               VisitorCast = v;
           &lt;span class="kwrd"&gt;if&lt;/span&gt; ((e &amp; ExpressionTypeTree.Concat) != 0)
               VisitorConcat = v;
           &lt;span class="kwrd"&gt;if&lt;/span&gt; ((e &amp; ExpressionTypeTree.Funclet) != 0)
               VisitorFunclet = v;
           &lt;span class="kwrd"&gt;if&lt;/span&gt; ((e &amp; ExpressionTypeTree.NewArrayInit) != 0)
               VisitorNewArrayInit = v;
       }

       &lt;span class="kwrd"&gt;public&lt;/span&gt; &lt;span class="kwrd"&gt;object&lt;/span&gt; Visit(Expression e, &lt;span class="kwrd"&gt;object&lt;/span&gt; param)
       {
           &lt;span class="kwrd"&gt;switch&lt;/span&gt; (e.NodeType)
           {
               &lt;span class="kwrd"&gt;case&lt;/span&gt; ExpressionType.New:
               {
                   NewExpression ne = e &lt;span class="kwrd"&gt;as&lt;/span&gt; NewExpression;
                   &lt;span class="kwrd"&gt;object&lt;/span&gt;[] res1 = ne.Args.VisitList(&lt;span class="kwrd"&gt;this&lt;/span&gt;, param);
                   &lt;span class="kwrd"&gt;object&lt;/span&gt;[] res2 = ne.Bindings.VisitList(&lt;span class="kwrd"&gt;this&lt;/span&gt;, param);
                   &lt;span class="kwrd"&gt;return&lt;/span&gt; &lt;span class="kwrd"&gt;this&lt;/span&gt;.VisitorNew(e, param, &lt;span class="kwrd"&gt;new&lt;/span&gt; &lt;span class="kwrd"&gt;object&lt;/span&gt;[][] { res1, res2 });
               }
               &lt;span class="kwrd"&gt;case&lt;/span&gt; ExpressionType.BitwiseNot:
                   UnaryExpression ne1 = e &lt;span class="kwrd"&gt;as&lt;/span&gt; UnaryExpression;
                   &lt;span class="kwrd"&gt;return&lt;/span&gt; &lt;span class="kwrd"&gt;this&lt;/span&gt;.VisitorBitwiseNot(e, param, &lt;span class="kwrd"&gt;new&lt;/span&gt; &lt;span class="kwrd"&gt;object&lt;/span&gt;[] { ne1.Operand.Visit(&lt;span class="kwrd"&gt;this&lt;/span&gt;, param) });
               &lt;span class="kwrd"&gt;case&lt;/span&gt; ExpressionType.Negate:
                   UnaryExpression ne2 = e &lt;span class="kwrd"&gt;as&lt;/span&gt; UnaryExpression;
                   &lt;span class="kwrd"&gt;return&lt;/span&gt; &lt;span class="kwrd"&gt;this&lt;/span&gt;.VisitorNegate(e, param, &lt;span class="kwrd"&gt;new&lt;/span&gt; &lt;span class="kwrd"&gt;object&lt;/span&gt;[] { ne2.Operand.Visit(&lt;span class="kwrd"&gt;this&lt;/span&gt;, param) });
               &lt;span class="kwrd"&gt;case&lt;/span&gt; ExpressionType.Not:
                   UnaryExpression ne3 = e &lt;span class="kwrd"&gt;as&lt;/span&gt; UnaryExpression;
                   &lt;span class="kwrd"&gt;return&lt;/span&gt; &lt;span class="kwrd"&gt;this&lt;/span&gt;.VisitorNot(e, param, &lt;span class="kwrd"&gt;new&lt;/span&gt; &lt;span class="kwrd"&gt;object&lt;/span&gt;[] { ne3.Operand.Visit(&lt;span class="kwrd"&gt;this&lt;/span&gt;, param) });
               &lt;span class="kwrd"&gt;case&lt;/span&gt; ExpressionType.Add:
               &lt;span class="kwrd"&gt;case&lt;/span&gt; ExpressionType.Subtract:
               &lt;span class="kwrd"&gt;case&lt;/span&gt; ExpressionType.Multiply:
               &lt;span class="kwrd"&gt;case&lt;/span&gt; ExpressionType.Divide:
               &lt;span class="kwrd"&gt;case&lt;/span&gt; ExpressionType.Modulo:
               &lt;span class="kwrd"&gt;case&lt;/span&gt; ExpressionType.And:
               &lt;span class="kwrd"&gt;case&lt;/span&gt; ExpressionType.Or:
               &lt;span class="kwrd"&gt;case&lt;/span&gt; ExpressionType.LT:
               &lt;span class="kwrd"&gt;case&lt;/span&gt; ExpressionType.LE:
               &lt;span class="kwrd"&gt;case&lt;/span&gt; ExpressionType.GT:
               &lt;span class="kwrd"&gt;case&lt;/span&gt; ExpressionType.GE:
               &lt;span class="kwrd"&gt;case&lt;/span&gt; ExpressionType.EQ:
               &lt;span class="kwrd"&gt;case&lt;/span&gt; ExpressionType.NE:
               &lt;span class="kwrd"&gt;case&lt;/span&gt; ExpressionType.BitwiseAnd:
               &lt;span class="kwrd"&gt;case&lt;/span&gt; ExpressionType.BitwiseOr:
               &lt;span class="kwrd"&gt;case&lt;/span&gt; ExpressionType.BitwiseXor:
               &lt;span class="kwrd"&gt;case&lt;/span&gt; ExpressionType.Coalesce:
                   &lt;span class="kwrd"&gt;return&lt;/span&gt; &lt;span class="kwrd"&gt;this&lt;/span&gt;.VisitBinary((e &lt;span class="kwrd"&gt;as&lt;/span&gt; BinaryExpression), param);
               &lt;span class="kwrd"&gt;case&lt;/span&gt; ExpressionType.Constant:
                   &lt;span class="kwrd"&gt;return&lt;/span&gt; &lt;span class="kwrd"&gt;this&lt;/span&gt;.VisitorConstant(e, param, &lt;span class="kwrd"&gt;new&lt;/span&gt; &lt;span class="kwrd"&gt;object&lt;/span&gt;[] { });
               &lt;span class="kwrd"&gt;case&lt;/span&gt; ExpressionType.MemberAccess:
                   &lt;span class="kwrd"&gt;return&lt;/span&gt; &lt;span class="kwrd"&gt;this&lt;/span&gt;.VisitorMemberAccess(e, param, &lt;span class="kwrd"&gt;new&lt;/span&gt; &lt;span class="kwrd"&gt;object&lt;/span&gt;[] { (e &lt;span class="kwrd"&gt;as&lt;/span&gt; MemberExpression).Expression.Visit(&lt;span class="kwrd"&gt;this&lt;/span&gt;, param) });
               &lt;span class="kwrd"&gt;case&lt;/span&gt; ExpressionType.Lambda:
               {
                   LambdaExpression le = e &lt;span class="kwrd"&gt;as&lt;/span&gt; LambdaExpression;
                   &lt;span class="kwrd"&gt;object&lt;/span&gt;[] res1 = le.Parameters.VisitList(&lt;span class="kwrd"&gt;this&lt;/span&gt;, param);
                   &lt;span class="kwrd"&gt;object&lt;/span&gt; res2 = le.Body.Visit(&lt;span class="kwrd"&gt;this&lt;/span&gt;, param);
                   &lt;span class="kwrd"&gt;return&lt;/span&gt; &lt;span class="kwrd"&gt;this&lt;/span&gt;.VisitorLambda(e, param, &lt;span class="kwrd"&gt;new&lt;/span&gt; &lt;span class="kwrd"&gt;object&lt;/span&gt;[] { res1, res2 });
               }
               &lt;span class="kwrd"&gt;case&lt;/span&gt; ExpressionType.Parameter:
                   &lt;span class="kwrd"&gt;return&lt;/span&gt; &lt;span class="kwrd"&gt;this&lt;/span&gt;.VisitorParameter(e, param, &lt;span class="kwrd"&gt;new&lt;/span&gt; &lt;span class="kwrd"&gt;object&lt;/span&gt;[] { });
               &lt;span class="kwrd"&gt;case&lt;/span&gt; ExpressionType.MethodCall:
               {
                   MethodCallExpression me = e &lt;span class="kwrd"&gt;as&lt;/span&gt; MethodCallExpression;
                   &lt;span class="kwrd"&gt;object&lt;/span&gt;[] res1 = me.Parameters.VisitList(&lt;span class="kwrd"&gt;this&lt;/span&gt;, param);

                   &lt;span class="kwrd"&gt;return&lt;/span&gt; &lt;span class="kwrd"&gt;this&lt;/span&gt;.VisitorMethodCall(e, param, res1);
               }
               &lt;span class="kwrd"&gt;case&lt;/span&gt; ExpressionType.Cast:
                   &lt;span class="kwrd"&gt;return&lt;/span&gt; &lt;span class="kwrd"&gt;this&lt;/span&gt;.VisitorCast(e, param, &lt;span class="kwrd"&gt;new&lt;/span&gt; &lt;span class="kwrd"&gt;object&lt;/span&gt;[] { (e &lt;span class="kwrd"&gt;as&lt;/span&gt; UnaryExpression).Operand.Visit(&lt;span class="kwrd"&gt;this&lt;/span&gt;, param) });
               &lt;span class="kwrd"&gt;case&lt;/span&gt; ExpressionType.Concat:
               {
                   NAryExpression ne = e &lt;span class="kwrd"&gt;as&lt;/span&gt; NAryExpression;
                   &lt;span class="kwrd"&gt;object&lt;/span&gt;[] res1 = ne.Expressions.VisitList(&lt;span class="kwrd"&gt;this&lt;/span&gt;, param);
                   &lt;span class="kwrd"&gt;return&lt;/span&gt; &lt;span class="kwrd"&gt;this&lt;/span&gt;.VisitorConcat(e, param, res1);
               }
               &lt;span class="kwrd"&gt;case&lt;/span&gt; ExpressionType.Funclet:
                   &lt;span class="kwrd"&gt;return&lt;/span&gt; &lt;span class="kwrd"&gt;this&lt;/span&gt;.VisitorFunclet(e, param, &lt;span class="kwrd"&gt;null&lt;/span&gt;);
               &lt;span class="kwrd"&gt;case&lt;/span&gt; ExpressionType.NewArrayInit :
               {
                   NewArrayExpression ne = e &lt;span class="kwrd"&gt;as&lt;/span&gt; NewArrayExpression;
                   &lt;span class="kwrd"&gt;object&lt;/span&gt;[] res1 = ne.Expressions.VisitList(&lt;span class="kwrd"&gt;this&lt;/span&gt;, param);
                   &lt;span class="kwrd"&gt;return&lt;/span&gt; &lt;span class="kwrd"&gt;this&lt;/span&gt;.VisitorNewArrayInit(e, param, res1);
               }
               &lt;span class="kwrd"&gt;default&lt;/span&gt;:
                   &lt;span class="kwrd"&gt;return&lt;/span&gt; &lt;span class="kwrd"&gt;this&lt;/span&gt;.VisitorDefault(e, param, &lt;span class="kwrd"&gt;new&lt;/span&gt; &lt;span class="kwrd"&gt;object&lt;/span&gt;[] { });
           }
       }
       &lt;span class="kwrd"&gt;private&lt;/span&gt; &lt;span class="kwrd"&gt;object&lt;/span&gt; VisitBinary(BinaryExpression e, &lt;span class="kwrd"&gt;object&lt;/span&gt; param)
       {
           &lt;span class="kwrd"&gt;object&lt;/span&gt;[] ret = &lt;span class="kwrd"&gt;new&lt;/span&gt; &lt;span class="kwrd"&gt;object&lt;/span&gt;[2];
           ret[0] = e.Left.Visit(&lt;span class="kwrd"&gt;this&lt;/span&gt;, param);
           ret[1] = e.Right.Visit(&lt;span class="kwrd"&gt;this&lt;/span&gt;, param);
           &lt;span class="kwrd"&gt;switch&lt;/span&gt; (e.NodeType)
           {
               &lt;span class="kwrd"&gt;case&lt;/span&gt; ExpressionType.Add:
                   &lt;span class="kwrd"&gt;return&lt;/span&gt; &lt;span class="kwrd"&gt;this&lt;/span&gt;.VisitorAdd(e, param, ret);
               &lt;span class="kwrd"&gt;case&lt;/span&gt; ExpressionType.Subtract:
                   &lt;span class="kwrd"&gt;return&lt;/span&gt; &lt;span class="kwrd"&gt;this&lt;/span&gt;.VisitorSubtract(e, param, ret);
               &lt;span class="kwrd"&gt;case&lt;/span&gt; ExpressionType.Multiply:
                   &lt;span class="kwrd"&gt;return&lt;/span&gt; &lt;span class="kwrd"&gt;this&lt;/span&gt;.VisitorMultiply(e, param, ret);
               &lt;span class="kwrd"&gt;case&lt;/span&gt; ExpressionType.Divide:
                   &lt;span class="kwrd"&gt;return&lt;/span&gt; &lt;span class="kwrd"&gt;this&lt;/span&gt;.VisitorDivide(e, param, ret);
               &lt;span class="kwrd"&gt;case&lt;/span&gt; ExpressionType.Modulo:
                   &lt;span class="kwrd"&gt;return&lt;/span&gt; &lt;span class="kwrd"&gt;this&lt;/span&gt;.VisitorModulo(e, param, ret);
               &lt;span class="kwrd"&gt;case&lt;/span&gt; ExpressionType.And:
                   &lt;span class="kwrd"&gt;return&lt;/span&gt; &lt;span class="kwrd"&gt;this&lt;/span&gt;.VisitorAnd(e, param, ret);
               &lt;span class="kwrd"&gt;case&lt;/span&gt; ExpressionType.Or:
                   &lt;span class="kwrd"&gt;return&lt;/span&gt; &lt;span class="kwrd"&gt;this&lt;/span&gt;.VisitorOr(e, param, ret);
               &lt;span class="kwrd"&gt;case&lt;/span&gt; ExpressionType.LT:
                   &lt;span class="kwrd"&gt;return&lt;/span&gt; &lt;span class="kwrd"&gt;this&lt;/span&gt;.VisitorLT(e, param, ret);
               &lt;span class="kwrd"&gt;case&lt;/span&gt; ExpressionType.LE:
                   &lt;span class="kwrd"&gt;return&lt;/span&gt; &lt;span class="kwrd"&gt;this&lt;/span&gt;.VisitorLE(e, param, ret);
               &lt;span class="kwrd"&gt;case&lt;/span&gt; ExpressionType.GT:
                   &lt;span class="kwrd"&gt;return&lt;/span&gt; &lt;span class="kwrd"&gt;this&lt;/span&gt;.VisitorGT(e, param, ret);
               &lt;span class="kwrd"&gt;case&lt;/span&gt; ExpressionType.GE:
                   &lt;span class="kwrd"&gt;return&lt;/span&gt; &lt;span class="kwrd"&gt;this&lt;/span&gt;.VisitorGE(e, param, ret);
               &lt;span class="kwrd"&gt;case&lt;/span&gt; ExpressionType.EQ:
                   &lt;span class="kwrd"&gt;return&lt;/span&gt; &lt;span class="kwrd"&gt;this&lt;/span&gt;.VisitorEQ(e, param, ret);
               &lt;span class="kwrd"&gt;case&lt;/span&gt; ExpressionType.NE:
                   &lt;span class="kwrd"&gt;return&lt;/span&gt; &lt;span class="kwrd"&gt;this&lt;/span&gt;.VisitorNE(e, param, ret);
               &lt;span class="kwrd"&gt;case&lt;/span&gt; ExpressionType.BitwiseAnd:
                   &lt;span class="kwrd"&gt;return&lt;/span&gt; &lt;span class="kwrd"&gt;this&lt;/span&gt;.VisitorBitwiseAnd(e, param, ret);
               &lt;span class="kwrd"&gt;case&lt;/span&gt; ExpressionType.BitwiseOr:
                   &lt;span class="kwrd"&gt;return&lt;/span&gt; &lt;span class="kwrd"&gt;this&lt;/span&gt;.VisitorBitwiseOr(e, param, ret);
               &lt;span class="kwrd"&gt;case&lt;/span&gt; ExpressionType.BitwiseXor:
                   &lt;span class="kwrd"&gt;return&lt;/span&gt; &lt;span class="kwrd"&gt;this&lt;/span&gt;.VisitorBitwiseXor(e, param, ret);
               &lt;span class="kwrd"&gt;case&lt;/span&gt; ExpressionType.Coalesce:
                   &lt;span class="kwrd"&gt;return&lt;/span&gt; &lt;span class="kwrd"&gt;this&lt;/span&gt;.VisitorCoalesce(e, param, ret);
           }
           &lt;span class="kwrd"&gt;return&lt;/span&gt; &lt;span class="kwrd"&gt;null&lt;/span&gt;;
       }
   }


   &lt;span class="kwrd"&gt;public&lt;/span&gt; &lt;span class="kwrd"&gt;static&lt;/span&gt; &lt;span class="kwrd"&gt;partial&lt;/span&gt; &lt;span class="kwrd"&gt;class&lt;/span&gt; Utils
   {
       &lt;span class="kwrd"&gt;public&lt;/span&gt; &lt;span class="kwrd"&gt;static&lt;/span&gt; &lt;span class="kwrd"&gt;object&lt;/span&gt;[] VisitList(&lt;span class="kwrd"&gt;this&lt;/span&gt; StaticList&amp;lt;Expression&amp;gt; el, ExpressionTreeVisitor etvisitor, &lt;span class="kwrd"&gt;object&lt;/span&gt; param)
       {
           &lt;span class="kwrd"&gt;object&lt;/span&gt;[] ret = &lt;span class="kwrd"&gt;new&lt;/span&gt; &lt;span class="kwrd"&gt;object&lt;/span&gt;[el.Count];
           &lt;span class="kwrd"&gt;for&lt;/span&gt; (&lt;span class="kwrd"&gt;int&lt;/span&gt; i = 0, n = el.Count; i &amp;lt; n; i++)
               ret[i] = el[i].Visit(etvisitor, param);

           &lt;span class="kwrd"&gt;return&lt;/span&gt; ret;
       }
       &lt;span class="kwrd"&gt;public&lt;/span&gt; &lt;span class="kwrd"&gt;static&lt;/span&gt; &lt;span class="kwrd"&gt;object&lt;/span&gt;[] VisitList(&lt;span class="kwrd"&gt;this&lt;/span&gt; StaticList&amp;lt;Binding&amp;gt; el, ExpressionTreeVisitor etvisitor, &lt;span class="kwrd"&gt;object&lt;/span&gt; param)
       {
           &lt;span class="kwrd"&gt;object&lt;/span&gt;[] ret = &lt;span class="kwrd"&gt;new&lt;/span&gt; &lt;span class="kwrd"&gt;object&lt;/span&gt;[el.Count];
           &lt;span class="kwrd"&gt;for&lt;/span&gt; (&lt;span class="kwrd"&gt;int&lt;/span&gt; i = 0, n = el.Count; i &amp;lt; n; i++)
           {
               ret[i] = el[i].Visit(etvisitor, param);
           }
           &lt;span class="kwrd"&gt;return&lt;/span&gt; ret;
       }
       &lt;span class="kwrd"&gt;public&lt;/span&gt; &lt;span class="kwrd"&gt;static&lt;/span&gt; &lt;span class="kwrd"&gt;object&lt;/span&gt;[] VisitList(&lt;span class="kwrd"&gt;this&lt;/span&gt; StaticList&amp;lt;ParameterExpression&amp;gt; el, ExpressionTreeVisitor etvisitor, &lt;span class="kwrd"&gt;object&lt;/span&gt; param)
       {
           &lt;span class="kwrd"&gt;object&lt;/span&gt;[] ret = &lt;span class="kwrd"&gt;new&lt;/span&gt; &lt;span class="kwrd"&gt;object&lt;/span&gt;[el.Count];
           &lt;span class="kwrd"&gt;for&lt;/span&gt; (&lt;span class="kwrd"&gt;int&lt;/span&gt; i = 0, n = el.Count; i &amp;lt; n; i++)
           {
               ret[i] = (el[i] &lt;span class="kwrd"&gt;as&lt;/span&gt; Expression).Visit(etvisitor, param);
           }
           &lt;span class="kwrd"&gt;return&lt;/span&gt; ret;
       }
       &lt;span class="kwrd"&gt;public&lt;/span&gt; &lt;span class="kwrd"&gt;static&lt;/span&gt; &lt;span class="kwrd"&gt;object&lt;/span&gt; Visit(&lt;span class="kwrd"&gt;this&lt;/span&gt; Binding e, ExpressionTreeVisitor etvisitor, &lt;span class="kwrd"&gt;object&lt;/span&gt; param)
       {
           &lt;span class="kwrd"&gt;return&lt;/span&gt; &lt;span class="kwrd"&gt;null&lt;/span&gt;;
       }
       &lt;span class="kwrd"&gt;public&lt;/span&gt; &lt;span class="kwrd"&gt;static&lt;/span&gt; &lt;span class="kwrd"&gt;object&lt;/span&gt; Visit(&lt;span class="kwrd"&gt;this&lt;/span&gt; Expression e, ExpressionTreeVisitor etvisitor, &lt;span class="kwrd"&gt;object&lt;/span&gt; param)
       {
           &lt;span class="kwrd"&gt;return&lt;/span&gt; etvisitor.Visit(e, param);
       }
       &lt;span class="kwrd"&gt;public&lt;/span&gt; &lt;span class="kwrd"&gt;static&lt;/span&gt; &lt;span class="kwrd"&gt;object&lt;/span&gt; Visit(&lt;span class="kwrd"&gt;this&lt;/span&gt; Expression e, ExpressionTreeVisitor.VisitorDelegate etvisitordelegate, &lt;span class="kwrd"&gt;object&lt;/span&gt; param)
       {
           ExpressionTreeVisitor visitor = &lt;span class="kwrd"&gt;new&lt;/span&gt; ExpressionTreeVisitor();
           visitor.AssignVisitorTo(etvisitordelegate, ExpressionTypeTree.All);
           &lt;span class="kwrd"&gt;return&lt;/span&gt; e.Visit(visitor, param);
       }
   }


   &lt;span class="kwrd"&gt;public&lt;/span&gt; &lt;span class="kwrd"&gt;class&lt;/span&gt; ExpressionTree : Expression, INode&amp;lt;Expression&amp;gt;
   {
       ExpressionTreeList _Children = &lt;span class="kwrd"&gt;new&lt;/span&gt; ExpressionTreeList();
       Expression _expression;
       &lt;span class="kwrd"&gt;bool&lt;/span&gt; _isdirty = &lt;span class="kwrd"&gt;false&lt;/span&gt;;
       &lt;span class="kwrd"&gt;bool&lt;/span&gt; _isbuilding = &lt;span class="kwrd"&gt;false&lt;/span&gt;;

       &lt;span class="kwrd"&gt;public&lt;/span&gt; &lt;span class="kwrd"&gt;static&lt;/span&gt; &lt;span class="kwrd"&gt;object&lt;/span&gt; TreeBuilder(Expression expr, &lt;span class="kwrd"&gt;object&lt;/span&gt; param, &lt;span class="kwrd"&gt;object&lt;/span&gt;[] sons)
       {
           ExpressionTree exprtree = param &lt;span class="kwrd"&gt;as&lt;/span&gt; ExpressionTree;
           &lt;span class="kwrd"&gt;if&lt;/span&gt; (exprtree.Value == expr)
           {
               &lt;span class="kwrd"&gt;for&lt;/span&gt; (&lt;span class="kwrd"&gt;int&lt;/span&gt; i = 0, n = sons.Length; i &amp;lt; n; i++)
               {
                   &lt;span class="kwrd"&gt;object&lt;/span&gt;[] group = sons[i] &lt;span class="kwrd"&gt;as&lt;/span&gt; &lt;span class="kwrd"&gt;object&lt;/span&gt;[];
                   &lt;span class="kwrd"&gt;if&lt;/span&gt; (group != &lt;span class="kwrd"&gt;null&lt;/span&gt;)
                   {
                       &lt;span class="kwrd"&gt;foreach&lt;/span&gt; (&lt;span class="kwrd"&gt;object&lt;/span&gt; obj &lt;span class="kwrd"&gt;in&lt;/span&gt; group)
                           exprtree.Children.Add(&lt;span class="kwrd"&gt;new&lt;/span&gt; ExpressionTree(obj &lt;span class="kwrd"&gt;as&lt;/span&gt; Expression));
                   }
                   &lt;span class="kwrd"&gt;else&lt;/span&gt;
                       exprtree.Children.Add(&lt;span class="kwrd"&gt;new&lt;/span&gt; ExpressionTree(sons[i] &lt;span class="kwrd"&gt;as&lt;/span&gt; Expression));
               }
           }
           &lt;span class="kwrd"&gt;return&lt;/span&gt; expr;
       }


       &lt;span class="kwrd"&gt;public&lt;/span&gt; ExpressionTree(Expression expr)
           : &lt;span class="kwrd"&gt;base&lt;/span&gt;(expr.NodeType, expr.Type)
       {
           Value = expr;
       }

       &lt;span class="kwrd"&gt;private&lt;/span&gt; &lt;span class="kwrd"&gt;void&lt;/span&gt; BuildTree()
       {
           _isbuilding = &lt;span class="kwrd"&gt;true&lt;/span&gt;;
           ExpressionTreeVisitor visitor = &lt;span class="kwrd"&gt;new&lt;/span&gt; ExpressionTreeVisitor();
           visitor.AssignVisitorTo(&lt;span class="kwrd"&gt;new&lt;/span&gt; ExpressionTreeVisitor.VisitorDelegate(TreeBuilder), ExpressionTypeTree.All);
           _expression.Visit(visitor, &lt;span class="kwrd"&gt;this&lt;/span&gt;);
           _isbuilding = &lt;span class="kwrd"&gt;false&lt;/span&gt;;
           _isdirty = &lt;span class="kwrd"&gt;false&lt;/span&gt;;
       }


       &lt;span class="kwrd"&gt;public&lt;/span&gt; Expression Value
       {
           get
           {
               &lt;span class="kwrd"&gt;return&lt;/span&gt; _expression;
           }
           set
           {
               _expression = &lt;span class="kwrd"&gt;value&lt;/span&gt;;
               _isdirty = &lt;span class="kwrd"&gt;true&lt;/span&gt;;
           }
       }
       &lt;span class="kwrd"&gt;public&lt;/span&gt; INodeList&amp;lt;Expression&amp;gt; Children
       {
           get
           {
               &lt;span class="kwrd"&gt;if&lt;/span&gt; (_isdirty &amp;amp;&amp; !_isbuilding) BuildTree();
               &lt;span class="kwrd"&gt;return&lt;/span&gt; _Children &lt;span class="kwrd"&gt;as&lt;/span&gt; INodeList&amp;lt;Expression&amp;gt;;
           }
           set
           {
               _Children = &lt;span class="kwrd"&gt;value&lt;/span&gt; &lt;span class="kwrd"&gt;as&lt;/span&gt; ExpressionTreeList;
           }
       }
   }


   &lt;span class="kwrd"&gt;public&lt;/span&gt; &lt;span class="kwrd"&gt;class&lt;/span&gt; ExpressionTreeList : List&amp;lt;INode&amp;lt;Expression&amp;gt;&amp;gt;, INodeList&amp;lt;Expression&amp;gt;
   {

   }

}
&lt;/pre&gt;
&lt;p&gt;&lt;/p&gt;

and the tree structure:

&lt;p&gt;&lt;u&gt;Tree.cs&lt;/u&gt;

&lt;!-- code formatted by http://manoli.net/csharpformat/ --&gt;
&lt;/p&gt;&lt;pre class="csharpcode"&gt;
&lt;span class="kwrd"&gt;using&lt;/span&gt; System;
&lt;span class="kwrd"&gt;using&lt;/span&gt; System.Collections.Generic;
&lt;span class="kwrd"&gt;using&lt;/span&gt; System.Collections;
&lt;span class="kwrd"&gt;using&lt;/span&gt; System.Windows.Forms;

&lt;span class="kwrd"&gt;namespace&lt;/span&gt; DataStructure
{
   &lt;span class="kwrd"&gt;public&lt;/span&gt; &lt;span class="kwrd"&gt;interface&lt;/span&gt; INode
   {
       &lt;span class="kwrd"&gt;object&lt;/span&gt; Value { get; set;}
       ICollection Children { get;}
   }
   &lt;span class="kwrd"&gt;public&lt;/span&gt; &lt;span class="kwrd"&gt;interface&lt;/span&gt; INodeList : IList&amp;lt;INode&amp;gt; { }
   &lt;span class="kwrd"&gt;public&lt;/span&gt; &lt;span class="kwrd"&gt;interface&lt;/span&gt; INode&amp;lt;T&amp;gt;
   {
       T Value { get;            set;        }
       INodeList&amp;lt;T&amp;gt; Children
       {
           get;
           set;
       }
   }
   &lt;span class="kwrd"&gt;public&lt;/span&gt; &lt;span class="kwrd"&gt;interface&lt;/span&gt; INodeList&amp;lt;T&amp;gt; : IList&amp;lt;INode&amp;lt;T&amp;gt;&amp;gt;
   {
   }

   &lt;span class="kwrd"&gt;public&lt;/span&gt; &lt;span class="kwrd"&gt;class&lt;/span&gt; Node&amp;lt;T&amp;gt; : INode
   {
       &lt;span class="kwrd"&gt;private&lt;/span&gt; T data;
       &lt;span class="kwrd"&gt;private&lt;/span&gt; NodeList&amp;lt;T&amp;gt; _children = &lt;span class="kwrd"&gt;null&lt;/span&gt;;

       &lt;span class="kwrd"&gt;public&lt;/span&gt; Node() { }
       &lt;span class="kwrd"&gt;public&lt;/span&gt; Node(T data) : &lt;span class="kwrd"&gt;this&lt;/span&gt;(data, &lt;span class="kwrd"&gt;null&lt;/span&gt;) { }
       &lt;span class="kwrd"&gt;public&lt;/span&gt; Node(T data, NodeList&amp;lt;T&amp;gt; children)
       {
           &lt;span class="kwrd"&gt;this&lt;/span&gt;.data = data;
           &lt;span class="kwrd"&gt;this&lt;/span&gt;._children = children;
       }

       &lt;span class="kwrd"&gt;public&lt;/span&gt; T Value
       {
           get
           {
               &lt;span class="kwrd"&gt;return&lt;/span&gt; data;
           }
           set
           {
               data = &lt;span class="kwrd"&gt;value&lt;/span&gt;;
           }
       }

       &lt;span class="kwrd"&gt;public&lt;/span&gt; NodeList&amp;lt;T&amp;gt; Children
       {
           get
           {
               &lt;span class="kwrd"&gt;return&lt;/span&gt; _children;
           }
           set
           {
               _children = &lt;span class="kwrd"&gt;value&lt;/span&gt;;
           }
       }

       &lt;span class="preproc"&gt;#region&lt;/span&gt; INode Members

       &lt;span class="kwrd"&gt;object&lt;/span&gt; INode.Value
       {
           get
           {
               &lt;span class="kwrd"&gt;return&lt;/span&gt; &lt;span class="kwrd"&gt;this&lt;/span&gt;.Value;
           }
           set
           {
               &lt;span class="kwrd"&gt;this&lt;/span&gt;.Value = (T)&lt;span class="kwrd"&gt;value&lt;/span&gt;;
           }
       }

       ICollection INode.Children
       {
           get { &lt;span class="kwrd"&gt;return&lt;/span&gt; &lt;span class="kwrd"&gt;this&lt;/span&gt;.Children; }
       }

       &lt;span class="preproc"&gt;#endregion&lt;/span&gt;
   }
   &lt;span class="kwrd"&gt;public&lt;/span&gt; &lt;span class="kwrd"&gt;class&lt;/span&gt; NodeList&amp;lt;T&amp;gt; : List&amp;lt;Node&amp;lt;T&amp;gt;&amp;gt;
   {
       &lt;span class="kwrd"&gt;public&lt;/span&gt; NodeList() : &lt;span class="kwrd"&gt;base&lt;/span&gt;() { }

       &lt;span class="kwrd"&gt;public&lt;/span&gt; NodeList(&lt;span class="kwrd"&gt;int&lt;/span&gt; initialSize)
       {
           &lt;span class="kwrd"&gt;for&lt;/span&gt; (&lt;span class="kwrd"&gt;int&lt;/span&gt; i = 0; i &amp;lt; initialSize; i++)
               &lt;span class="kwrd"&gt;base&lt;/span&gt;.Add(&lt;span class="kwrd"&gt;default&lt;/span&gt;(Node&amp;lt;T&amp;gt;));
       }

       &lt;span class="kwrd"&gt;public&lt;/span&gt; Node&amp;lt;T&amp;gt; FindByValue(T &lt;span class="kwrd"&gt;value&lt;/span&gt;)
       {
           &lt;span class="kwrd"&gt;foreach&lt;/span&gt; (Node&amp;lt;T&amp;gt; node &lt;span class="kwrd"&gt;in&lt;/span&gt; &lt;span class="kwrd"&gt;this&lt;/span&gt;)
               &lt;span class="kwrd"&gt;if&lt;/span&gt; (node.Value.Equals(&lt;span class="kwrd"&gt;value&lt;/span&gt;))
                   &lt;span class="kwrd"&gt;return&lt;/span&gt; node;
           &lt;span class="kwrd"&gt;return&lt;/span&gt; &lt;span class="kwrd"&gt;null&lt;/span&gt;;
       }
   }

   &lt;span class="kwrd"&gt;public&lt;/span&gt; &lt;span class="kwrd"&gt;delegate&lt;/span&gt; &lt;span class="kwrd"&gt;object&lt;/span&gt; TreeVisitor&amp;lt;T&amp;gt;(INode&amp;lt;T&amp;gt; arg, &lt;span class="kwrd"&gt;object&lt;/span&gt; param, &lt;span class="kwrd"&gt;object&lt;/span&gt;[] sonreturn);
   &lt;span class="kwrd"&gt;public&lt;/span&gt; &lt;span class="kwrd"&gt;delegate&lt;/span&gt; INode&amp;lt;T&amp;gt; TreeTransformer&amp;lt;T&amp;gt;(INode&amp;lt;T&amp;gt; arg, &lt;span class="kwrd"&gt;object&lt;/span&gt; param, INode&amp;lt;T&amp;gt;[] sonreturn);



   &lt;span class="kwrd"&gt;public&lt;/span&gt; &lt;span class="kwrd"&gt;static&lt;/span&gt; &lt;span class="kwrd"&gt;partial&lt;/span&gt; &lt;span class="kwrd"&gt;class&lt;/span&gt; Utils
   {
       &lt;span class="kwrd"&gt;public&lt;/span&gt; &lt;span class="kwrd"&gt;static&lt;/span&gt; &lt;span class="kwrd"&gt;object&lt;/span&gt; Visit&amp;lt;T&amp;gt;(&lt;span class="kwrd"&gt;this&lt;/span&gt; INode&amp;lt;T&amp;gt; arg, TreeVisitor&amp;lt;T&amp;gt; treevisitor, &lt;span class="kwrd"&gt;object&lt;/span&gt; param)
       {
           &lt;span class="kwrd"&gt;return&lt;/span&gt; treevisitor(arg, param, arg.Children.VisitList&amp;lt;T&amp;gt;(treevisitor, param));
       }
       &lt;span class="kwrd"&gt;public&lt;/span&gt; &lt;span class="kwrd"&gt;static&lt;/span&gt; &lt;span class="kwrd"&gt;object&lt;/span&gt;[] VisitList&amp;lt;T&amp;gt;(&lt;span class="kwrd"&gt;this&lt;/span&gt; INodeList&amp;lt;T&amp;gt; arg, TreeVisitor&amp;lt;T&amp;gt; treevisitor, &lt;span class="kwrd"&gt;object&lt;/span&gt; param)
       {
           &lt;span class="kwrd"&gt;object&lt;/span&gt;[] ret = &lt;span class="kwrd"&gt;new&lt;/span&gt; &lt;span class="kwrd"&gt;object&lt;/span&gt;[arg.Count];
           &lt;span class="kwrd"&gt;for&lt;/span&gt; (&lt;span class="kwrd"&gt;int&lt;/span&gt; i = 0, n = arg.Count; i &amp;lt; n; i++)
           {
               ret[i] = arg[i].Visit(treevisitor, param);
           }
           &lt;span class="kwrd"&gt;return&lt;/span&gt; ret;
       }
       &lt;span class="kwrd"&gt;public&lt;/span&gt; &lt;span class="kwrd"&gt;static&lt;/span&gt; INode&amp;lt;T&amp;gt; Transform&amp;lt;T&amp;gt;(&lt;span class="kwrd"&gt;this&lt;/span&gt; INode&amp;lt;T&amp;gt; arg, TreeTransformer&amp;lt;T&amp;gt; treetransformer, &lt;span class="kwrd"&gt;object&lt;/span&gt; param)
       {
           &lt;span class="kwrd"&gt;return&lt;/span&gt; treetransformer(arg, param, arg.Children.TransformList&amp;lt;T&amp;gt;(treetransformer, param));
       }
       &lt;span class="kwrd"&gt;public&lt;/span&gt; &lt;span class="kwrd"&gt;static&lt;/span&gt; INode&amp;lt;T&amp;gt;[] TransformList&amp;lt;T&amp;gt;(&lt;span class="kwrd"&gt;this&lt;/span&gt; INodeList&amp;lt;T&amp;gt; arg, TreeTransformer&amp;lt;T&amp;gt; treetransformer, &lt;span class="kwrd"&gt;object&lt;/span&gt; param)
       {
           INode&amp;lt;T&amp;gt;[] ret = &lt;span class="kwrd"&gt;new&lt;/span&gt; INode&amp;lt;T&amp;gt;[arg.Count];
           &lt;span class="kwrd"&gt;for&lt;/span&gt; (&lt;span class="kwrd"&gt;int&lt;/span&gt; i = 0, n = arg.Count; i &amp;lt; n; i++)
           {
               ret[i] = arg[i].Transform(treetransformer, param);
           }
           &lt;span class="kwrd"&gt;return&lt;/span&gt; ret;
       }

       &lt;span class="kwrd"&gt;public&lt;/span&gt; &lt;span class="kwrd"&gt;static&lt;/span&gt; INode&amp;lt;T&amp;gt; Copy&amp;lt;T&amp;gt;(INode&amp;lt;T&amp;gt; arg, &lt;span class="kwrd"&gt;object&lt;/span&gt; param, INode&amp;lt;T&amp;gt;[] sonreturn)
       {
           Node&amp;lt;T&amp;gt; ret = &lt;span class="kwrd"&gt;new&lt;/span&gt; Node&amp;lt;T&amp;gt;();
           &lt;span class="kwrd"&gt;foreach&lt;/span&gt; (Node&amp;lt;T&amp;gt; son &lt;span class="kwrd"&gt;in&lt;/span&gt; sonreturn)
               ret.Children.Add(son);
           &lt;span class="kwrd"&gt;return&lt;/span&gt; ret &lt;span class="kwrd"&gt;as&lt;/span&gt; INode&amp;lt;T&amp;gt;;
       }
       &lt;span class="kwrd"&gt;public&lt;/span&gt; &lt;span class="kwrd"&gt;static&lt;/span&gt; &lt;span class="kwrd"&gt;object&lt;/span&gt; ToTreeNodes&amp;lt;T&amp;gt;(INode&amp;lt;T&amp;gt; arg, &lt;span class="kwrd"&gt;object&lt;/span&gt; param, &lt;span class="kwrd"&gt;object&lt;/span&gt;[] sonreturn)
       {
           TreeNode ret = &lt;span class="kwrd"&gt;new&lt;/span&gt; TreeNode(arg.ToString() + &lt;span class="str"&gt;":"&lt;/span&gt; + arg.Value.ToString());
           &lt;span class="kwrd"&gt;foreach&lt;/span&gt; (&lt;span class="kwrd"&gt;object&lt;/span&gt; son &lt;span class="kwrd"&gt;in&lt;/span&gt; sonreturn)
               ret.Nodes.Add(son &lt;span class="kwrd"&gt;as&lt;/span&gt; TreeNode);
           &lt;span class="kwrd"&gt;return&lt;/span&gt; ret;
       }
   }
}
&lt;/pre&gt;&lt;p&gt;&lt;/p&gt;&lt;/span&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/17362732-114330850786567415?l=technofinance.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://technofinance.blogspot.com/feeds/114330850786567415/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=17362732&amp;postID=114330850786567415' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/17362732/posts/default/114330850786567415'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/17362732/posts/default/114330850786567415'/><link rel='alternate' type='text/html' href='http://technofinance.blogspot.com/2006/03/expression-trees-and-linq.html' title='Expression Trees and Linq'/><author><name>Nicolas</name><uri>http://www.blogger.com/profile/03434148024010872285</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://2.bp.blogspot.com/_vbz7u92h91c/SJ6emBHBXjI/AAAAAAAAAC8/R27sE5IMTms/s1600-R/me.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-17362732.post-114194227466990366</id><published>2006-03-09T12:05:00.000-08:00</published><updated>2006-03-09T14:13:32.820-08:00</updated><title type='text'>About schyzophreny, C#3 intelligence and runtime stupidity</title><content type='html'>On my way toward a flexible application to perform queries on the vast amount of information my trading desk produces everyday, I was delighted to meet with C#3 and Linq functionnalities.

&lt;u&gt;&lt;strong&gt;Design time&lt;/strong&gt;&lt;/u&gt;

I always thought such a transversal approach was needed and I was surprised to remember that I developped a similar API for VB back in the old days :)
Now I could have cutting edge Microsoft functionnalities and exceptionnal compiler intelligence working for me.

Just think about this :

&lt;div class="code"   style="font-family:Courier New;font-size:9pt;"&gt;
&lt;span style="color:#0000ff;"&gt;var&lt;/span&gt;&lt;span style="color:#000000;"&gt; queries = &lt;/span&gt;&lt;span style="color:#0000ff;"&gt;new&lt;/span&gt;&lt;span style="color:#000000;"&gt; &lt;/span&gt;&lt;span style="color:#008080;"&gt;List&lt;&lt;/span&gt;&lt;span style="color:#008080;"&gt;IEnumerable&gt;&lt;/span&gt;&lt;span style="color:#000000;"&gt;();



&lt;/span&gt;&lt;span style="color:#0000ff;"&gt;var&lt;/span&gt;&lt;span style="color:#000000;"&gt; query1 = &lt;/span&gt;&lt;span style="color:#0000ff;"&gt;this&lt;/span&gt;&lt;span style="color:#000000;"&gt;.GetCustomerList().Where( p =&amp;gt; p.CompanyName.Length == 4);

queries.Add(query1);

&lt;/span&gt;&lt;/div&gt;

&lt;p&gt;&lt;/p&gt;
This simple line declare function, builds a query, infers return type... Also while I was typing it, I benefited from code completion, and if I add tried to assign it to a wrongly typed variable, I would have been warned of such probable mistake.What a great endeavour from a smal code line !

Yeah but as you may see from my code, I am not a business genius.
My query does not add a lot of value for the Market Intelligence people in search of which customer is important.
They'd probably

So I'd like my users to type in their own queries. That way, market intelligence people will build their own queries, managers their have own other set too, and I wont coerce them into my limited imagination.



&lt;strong&gt;&lt;u&gt;&lt;/u&gt;&lt;/strong&gt;
&lt;strong&gt;&lt;u&gt;Runtime definition of queries&lt;/u&gt;&lt;/strong&gt;

If I want to do this, here is how I could do to make it work :
&lt;ul&gt;&lt;li&gt;define a langage&lt;/li&gt;&lt;li&gt;build a parser to go from string to a tree of command (an expression tree in Linq)&lt;/li&gt;&lt;li&gt;build a visitor for this tree to build the code to run using reflection&lt;/li&gt;&lt;li&gt;evaluate&lt;/li&gt;&lt;/ul&gt;&lt;p&gt;Compare this with the ease I add with the previous query building. And with this solution I have lost all the intellisense, and many other prerun features....&lt;/p&gt;&lt;p&gt;Now what has changed from a functionnal point of view? Nothing, I just want to add some queries to my list...&lt;/p&gt;Beside, all the logic I want my to present to my users already exists in the C# compiler..
Although it is very interesting, why would I need to reinvent the wheel?


&lt;strong&gt;&lt;u&gt;Partial runtime and dynamic compilation&lt;/u&gt;&lt;/strong&gt;

The idea is that I want to tag part of my code, the one which define the queries, as being modifiable, until my program &lt;em&gt;&lt;strong&gt;really&lt;/strong&gt;&lt;/em&gt; needs it. 
&lt;div class="code"   style="font-family:Courier New;font-size:9pt;"&gt;
&lt;span style="color:#0000ff;"&gt;var&lt;/span&gt;&lt;span style="color:#000000;"&gt; queries = &lt;/span&gt;&lt;span style="color:#0000ff;"&gt;new&lt;/span&gt;&lt;span style="color:#000000;"&gt; &lt;/span&gt;&lt;span style="color:#008080;"&gt;List&lt;&lt;/span&gt;&lt;span style="color:#008080;"&gt;IEnumerable&gt;&lt;/span&gt;&lt;span style="color:#000000;"&gt;();

&lt;/span&gt;&lt;span style="color:#0000ff;"&gt;var&lt;/span&gt;&lt;span style="color:#000000;"&gt; query1 = &lt;/span&gt;&lt;span style="color:#0000ff;"&gt;this&lt;/span&gt;&lt;span style="color:#000000;"&gt;.GetCustomerList().Where( p =&amp;gt; p.CompanyName.Length == 4);
queries.Add(query1);

[&lt;span style="color:#008080;"&gt;userpoint&lt;/span&gt;("DefiningQueries")]


&lt;/span&gt;&lt;span style="color:#0000ff;"&gt;foreach&lt;/span&gt;&lt;span style="color:#000000;"&gt; (&lt;/span&gt;&lt;span style="color:#0000ff;"&gt;var&lt;/span&gt;&lt;span style="color:#000000;"&gt; query1 &lt;/span&gt;&lt;span style="color:#0000ff;"&gt;in&lt;/span&gt;&lt;span style="color:#000000;"&gt; queries) {

..

&lt;/span&gt;&lt;/div&gt;
If this tag is seen, I want the compiler to validate my code, and to store it as an expression, not compile it. Then, at runtime, I want to be able to make all the variables available at this place in my code known in a reflection-like manner, only this time reflection is not linked to an assembly or a class, but to a location in code. This helps me pre-validate the user input.
And I also want to inject code, and compile it in the specific context of that [Userpoint] !
&lt;div class="code"   style="font-family:Courier New;font-size:9pt;"&gt;
        &lt;span style="color:#0000ff;"&gt;public&lt;/span&gt;&lt;span style="color:#000000;"&gt; &lt;/span&gt;&lt;span style="color:#0000ff;"&gt;void&lt;/span&gt;&lt;span style="color:#000000;"&gt; AddExpression(&lt;/span&gt;&lt;span style="color:#0000ff;"&gt;string&lt;/span&gt;&lt;span style="color:#000000;"&gt; expr)

        {

           CompilerError[] ces = Microsoft.CSharp.Compile(expr, &lt;/span&gt;&lt;span style="color:#0000ff;"&gt;this&lt;/span&gt;&lt;span style="color:#000000;"&gt;, &lt;/span&gt;&lt;span style="color:#800000;"&gt;"DefiningQueries"&lt;/span&gt;&lt;span style="color:#000000;"&gt;);

            &lt;/span&gt;&lt;span style="color:#0000ff;"&gt;var&lt;/span&gt;&lt;span style="color:#000000;"&gt; queries = Code.Userpoint(&lt;/span&gt;&lt;span style="color:#800000;"&gt;"DefiningQueries"&lt;/span&gt;&lt;span style="color:#000000;"&gt;).getVariable(&lt;/span&gt;&lt;span style="color:#800000;"&gt;"queries"&lt;/span&gt;&lt;span style="color:#000000;"&gt;);

            queries.MethodCall(&lt;/span&gt;&lt;span style="color:#800000;"&gt;"Add"&lt;/span&gt;&lt;span style="color:#000000;"&gt;, &lt;/span&gt;&lt;span style="color:#0000ff;"&gt;new&lt;/span&gt;&lt;span style="color:#000000;"&gt; objet[] { ces } );

        }



&lt;/span&gt;
&lt;/div&gt;


That way, in a first part of the program, I load my general form, and the environment which enables my users to edit their queries.
When a query is added, it is actually added as parsed some code to my section.
I make full reuse of everything that already exists at the csharp compiler level.

So do you think this concept of partial runtime can be useful in other cases?&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/17362732-114194227466990366?l=technofinance.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://technofinance.blogspot.com/feeds/114194227466990366/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=17362732&amp;postID=114194227466990366' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/17362732/posts/default/114194227466990366'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/17362732/posts/default/114194227466990366'/><link rel='alternate' type='text/html' href='http://technofinance.blogspot.com/2006/03/about-schyzophreny-c3-intelligence-and.html' title='About schyzophreny, C#3 intelligence and runtime stupidity'/><author><name>Nicolas</name><uri>http://www.blogger.com/profile/03434148024010872285</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://2.bp.blogspot.com/_vbz7u92h91c/SJ6emBHBXjI/AAAAAAAAAC8/R27sE5IMTms/s1600-R/me.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-17362732.post-113061128349680675</id><published>2005-10-29T11:37:00.000-07:00</published><updated>2006-06-03T09:28:00.536-07:00</updated><title type='text'>Important aspects of c#</title><content type='html'>&lt;p&gt;There are plenty of places to read articles about one tech in .Net
Each of them tells you about one different aspect, but how to find which one to really know?


This is a repository of what aspect are I thought were important.
Can you think of some others?&lt;/p&gt;&lt;p&gt;
&lt;/p&gt;&lt;ul&gt;&lt;li&gt;Generics : generics are useful to strong types transversal notions
&lt;/li&gt;
&lt;li&gt;BindindSource behaviour (how the construct a view from the argument) and binding structure like &lt;a href="http://www.c2i.fr/code.aspx?IDCode=625"&gt;bindinglist&lt;/a&gt; &lt;/li&gt;
&lt;li&gt;Linq : the ultimate tool for projecting out data : If you need smart plumbering, agregating of data structure&lt;/li&gt;&lt;/ul&gt;&lt;ul&gt;&lt;li&gt;Reflection : it is useful when you want at runtime to manipulate&lt;/li&gt;&lt;/ul&gt;&lt;ul&gt;&lt;li&gt;&lt;a href="http://www.interact-sw.co.uk/iangblog/2006/05/21/webcontinuations"&gt;Continuations &lt;/a&gt;: If you need, against conventionnal wisdom, to perform a high level operations within a lower level context, continuation is an elegant way to separate those not be trapped and to express compactly your code&lt;/li&gt;&lt;/ul&gt;&lt;ul&gt;&lt;li&gt;Closures : closures captures at one point in code all the available context. They are very handy for &lt;a href="http://kuwamoto.org/2006/05/16/dealing-with-asynchronous-events-part-2/"&gt;dealing with asynchronous steps&lt;/a&gt;.
&lt;/li&gt;&lt;/ul&gt;&lt;ul&gt;

&lt;/ul&gt;&lt;div class="category"&gt;
Tag: &lt;a href="http://technofinance.blogger.com/&amp;amp;?csharp"&gt;csharp&lt;/a&gt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/17362732-113061128349680675?l=technofinance.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://technofinance.blogspot.com/feeds/113061128349680675/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=17362732&amp;postID=113061128349680675' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/17362732/posts/default/113061128349680675'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/17362732/posts/default/113061128349680675'/><link rel='alternate' type='text/html' href='http://technofinance.blogspot.com/2005/10/important-aspects-of-c.html' title='Important aspects of c#'/><author><name>Nicolas</name><uri>http://www.blogger.com/profile/03434148024010872285</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://2.bp.blogspot.com/_vbz7u92h91c/SJ6emBHBXjI/AAAAAAAAAC8/R27sE5IMTms/s1600-R/me.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-17362732.post-112993208366339265</id><published>2005-10-21T11:17:00.000-07:00</published><updated>2006-06-05T13:46:53.936-07:00</updated><title type='text'>The big software merge : a distributed data and metadata namespace (anything left?)</title><content type='html'>Nowadays peer to peer applications are powerful from the viewpoint of the 90's we.

But I guess that the confluence of p2p with a growing trend of the web is going to make this a killer app that will transform the computing world as we know it.

Think AJAX. It is a great technique, and you might think it is a slick and handy presentation. or a bad programming concept. Traditionnal apps present data. AJAX &lt;em&gt;through &lt;/em&gt;its slick presentation enables to expose not just data but the data model as well.
Think of those Gmail pages where you enter a new contact easily. or that dynamic autocompletion feature you like. The point is, you're not just entering strings, you are entering a contact. that is precisely what is a datamodel. You write an email, that field must be a contact. So those nice gmail guy's help you with entering a contact.


Now what is the link with p2p? Well, precisely, the datamodel, or its current lack of it.
Currently, raw data is exchanged, with an embryonnic, altavista like, search facility.




Beside the technical prowess of distributing download, the p1p story from a functionnal perspective sounds like : Some people have stuff stored. You can download them.


Which to me sounds like a very static web era story.

Now if you add to this story the trend that I discerned in AJAX, you can replace that story with
&lt;ul&gt;&lt;li&gt;Some people have stuff stored ----&gt; Some namespaces are published, aka "MyNeighbourTom",  wich contains stuff "StartrekMovie"&lt;/li&gt;&lt;li&gt;stuff  ---&gt; this stuff is actually object &lt;em&gt;whose data model is transmitted  :&lt;/em&gt; MyNeighbour.StartrekMovie.BitRate for instance&lt;/li&gt;&lt;li&gt;I download it  ---&gt; I can of course still download it, or &lt;em&gt;perform actions on those&lt;/em&gt;  like MyNeighbour.ThisDocument.Print.&lt;/li&gt;&lt;/ul&gt;&lt;ul&gt;&lt;li&gt;Furthermor, as you know the data model of your query, a computer can interpret that itself independantly of the actual action transmitted. for instance building up a common portal between friends exposing all the music we have.
&lt;/li&gt;&lt;/ul&gt;


So the notions at play here, that we now see develop, and which will among others radically change p2p and the internet are :

.Namespace sharing
.Data AND metadata publishing



Followup : the powershell published by microsoft gets closer to those notions, where "everything is an object", data and metadata are merged in one envrironment (you can create object on the fl, you can extend an object type on the fly too) but lacks GUI feature and p2p dimension.

This is all evolving very fast..&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/17362732-112993208366339265?l=technofinance.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://technofinance.blogspot.com/feeds/112993208366339265/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=17362732&amp;postID=112993208366339265' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/17362732/posts/default/112993208366339265'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/17362732/posts/default/112993208366339265'/><link rel='alternate' type='text/html' href='http://technofinance.blogspot.com/2005/10/big-software-merge-distributed-data.html' title='The big software merge : a distributed data and metadata namespace (anything left?)'/><author><name>Nicolas</name><uri>http://www.blogger.com/profile/03434148024010872285</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://2.bp.blogspot.com/_vbz7u92h91c/SJ6emBHBXjI/AAAAAAAAAC8/R27sE5IMTms/s1600-R/me.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-17362732.post-112939641841555268</id><published>2005-10-15T09:50:00.000-07:00</published><updated>2005-10-15T10:13:38.423-07:00</updated><title type='text'>Organizing information</title><content type='html'>There  is many information available to us, but as we can see in the information age what is important is not information itself, but how do we structure that information, in terms of relevance, of classification etc..

RSS has been useful because it delivers such a projection, which consists of the &lt;em&gt;&lt;u&gt;most recent&lt;/u&gt; &lt;/em&gt;information, from a &lt;u&gt;&lt;em&gt;selected&lt;/em&gt;&lt;/u&gt; subset of sources, who decides &lt;u&gt;&lt;em&gt;themselves&lt;/em&gt;&lt;/u&gt; that such and such information is of value to their reader, hence should be available through this channel.

Take another information. For instance bus stop times. yes, they are available for me on &lt;a href="http://www.ratp.fr"&gt;www.ratp.fr&lt;/a&gt; after 4 or five hops. Oh and wouldn't it be good if after I checked my bus stop to retrieve the weather for tonight so I know how to dress. And may be during the day I also would like to check if my stocks went up or down, not that it would change anything but I just like it.

Would I spend 30 minutes everyday on this? no then I prefer not to.
But had their be a simple service which would allow me to suscribe to those information once I sure would go and do that.

One of my friend is interested in the dollar rate,  which is important for him to send money to his place.

Another one wants to build a little app that for a particular functionnality reads various financial analysts reports from different website and synthetize them.


&lt;u&gt;&lt;strong&gt;Point of this is&lt;/strong&gt;&lt;/u&gt;:
The content published is a projection of datas which fits the needs of various publishers.
We want to project the datas on our needs.

We should be able to define data sources, independently of the data provider, group and categorize those data as &lt;em&gt;&lt;u&gt;&lt;strong&gt;we&lt;/strong&gt;&lt;/u&gt;&lt;/em&gt; see fit, and consume those datas as we would like to.



So I started a 'personnal projection project', which will enable people to define their own set, and publish this set. This is valuable for personnal use, but also for public use, letting people share not the data itself, but the location of the data, its description, its category etc..

Those data will be exported through standard web service, and of course customisable RSS feed, for integration into custom application, web pages, RSS readers etc.

Isn't it funny I wrote all that without the expression web2.0 in?&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/17362732-112939641841555268?l=technofinance.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://technofinance.blogspot.com/feeds/112939641841555268/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=17362732&amp;postID=112939641841555268' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/17362732/posts/default/112939641841555268'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/17362732/posts/default/112939641841555268'/><link rel='alternate' type='text/html' href='http://technofinance.blogspot.com/2005/10/organizing-information.html' title='Organizing information'/><author><name>Nicolas</name><uri>http://www.blogger.com/profile/03434148024010872285</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://2.bp.blogspot.com/_vbz7u92h91c/SJ6emBHBXjI/AAAAAAAAAC8/R27sE5IMTms/s1600-R/me.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-17362732.post-112871483393703826</id><published>2005-10-07T12:51:00.000-07:00</published><updated>2005-10-07T12:53:53.940-07:00</updated><title type='text'></title><content type='html'>Because finding the correct tool and minimizes impedance mismatch is getting 50% of the work done , this is a great article as far as langage itself is concerned :
&lt;a href="http://pico.vub.ac.be/~wdmeuter/RDL04/papers/Meijer.pdf"&gt;http://pico.vub.ac.be/~wdmeuter/RDL04/papers/Meijer.pdf&lt;/a&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/17362732-112871483393703826?l=technofinance.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://technofinance.blogspot.com/feeds/112871483393703826/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=17362732&amp;postID=112871483393703826' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/17362732/posts/default/112871483393703826'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/17362732/posts/default/112871483393703826'/><link rel='alternate' type='text/html' href='http://technofinance.blogspot.com/2005/10/because-finding-correct-tool-and.html' title=''/><author><name>Nicolas</name><uri>http://www.blogger.com/profile/03434148024010872285</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://2.bp.blogspot.com/_vbz7u92h91c/SJ6emBHBXjI/AAAAAAAAAC8/R27sE5IMTms/s1600-R/me.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-17362732.post-112863163683296496</id><published>2005-10-06T13:24:00.000-07:00</published><updated>2005-10-15T09:44:57.120-07:00</updated><title type='text'>Wrong architecture</title><content type='html'>I know this is all very basic yet this is a predominant pattern.

Shit happens where low level logic guide high level logic.
For instance in Excel say you have the following piece of shode:

&lt;em&gt;Function doSomething(&lt;/em&gt; no arguments &lt;em&gt;)&lt;/em&gt;
&lt;em&gt;Volatility100_1Y = cells("A16")&lt;/em&gt;
&lt;em&gt;Volatility110_1Y = cells("A17")&lt;/em&gt;
&lt;em&gt;...etc...&lt;/em&gt;
&lt;em&gt;..then some computation ..&lt;/em&gt;
&lt;em&gt;cells("A18") = result1&lt;/em&gt;
&lt;em&gt;cells("B18") = result2&lt;/em&gt;
&lt;em&gt;End&lt;/em&gt;
&lt;em&gt;&lt;/em&gt;
So here a low level idea (the specific format of the volatility organised in row) is imposing its format on what is an input of this process.

A first step would be to have
&lt;em&gt;Function doSomething(Range inputVol, Range OutPutResult)
Volatility.reads(c1)
...etc...
..then some computation ..&lt;/em&gt;
&lt;em&gt;result.write(cells("A18"))
End&lt;/em&gt;

Here it is the Volatility object that writes &lt;em&gt;&lt;strong&gt;itself &lt;/strong&gt;&lt;/em&gt;to the cells, not the little low level "A16" cell, who does not know shit about what a volatility is, who constraints the process nonetheless.

I think this is called inversion of control by computers scientists, and it relates to object orientation.
But it also relates to respecting a common sense abstraction hierarchy where high level guides low level, not the other way round. Which in the end of your application is where you want to go &lt;u&gt;anyway&lt;/u&gt;.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/17362732-112863163683296496?l=technofinance.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://technofinance.blogspot.com/feeds/112863163683296496/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=17362732&amp;postID=112863163683296496' title='1 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/17362732/posts/default/112863163683296496'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/17362732/posts/default/112863163683296496'/><link rel='alternate' type='text/html' href='http://technofinance.blogspot.com/2005/10/wrong-architecture.html' title='Wrong architecture'/><author><name>Nicolas</name><uri>http://www.blogger.com/profile/03434148024010872285</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://2.bp.blogspot.com/_vbz7u92h91c/SJ6emBHBXjI/AAAAAAAAAC8/R27sE5IMTms/s1600-R/me.jpg'/></author><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-17362732.post-112824454604589968</id><published>2005-10-02T02:01:00.000-07:00</published><updated>2005-10-02T02:20:46.943-07:00</updated><title type='text'>exchange rate</title><content type='html'>Why can the exchange rate be confusing to trade when it is just a unit of conversion? Let's take an example. For an engineer, the speed of a car is 100 km/h and varies in time. But the kilometer of the hour itself are not seen varying themselves, unlike in currency rate.

Say we go from .8 to 1.2 USD/EUR, the dollar would have weaken !
Which is why "USD per EUR" is called by cambists "EUR-USD" so that they can identify this number as "the spot of the Euro (rel to USD)"
So if you want to sell EUR, you will get the lowest quote, and if you want to buy, you'll get the highest.

&lt;strong&gt;Rule of thumb:&lt;/strong&gt;
for any currency pair, you take the currency at the denominator, you express your order in term of that currency. then you know if you are long or short the quote.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/17362732-112824454604589968?l=technofinance.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://technofinance.blogspot.com/feeds/112824454604589968/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=17362732&amp;postID=112824454604589968' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/17362732/posts/default/112824454604589968'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/17362732/posts/default/112824454604589968'/><link rel='alternate' type='text/html' href='http://technofinance.blogspot.com/2005/10/exchange-rate.html' title='exchange rate'/><author><name>Nicolas</name><uri>http://www.blogger.com/profile/03434148024010872285</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://2.bp.blogspot.com/_vbz7u92h91c/SJ6emBHBXjI/AAAAAAAAAC8/R27sE5IMTms/s1600-R/me.jpg'/></author><thr:total>0</thr:total></entry></feed>
