<?xml version="1.0" encoding="UTF-8"?>
<?xml-stylesheet type="text/xsl" media="screen" href="/~d/styles/atom10full.xsl"?><?xml-stylesheet type="text/css" media="screen" href="http://feeds.feedburner.com/~d/styles/itemcontent.css"?><feed xmlns="http://www.w3.org/2005/Atom" xmlns:openSearch="http://a9.com/-/spec/opensearch/1.1/" xmlns:georss="http://www.georss.org/georss" xmlns:gd="http://schemas.google.com/g/2005" xmlns:thr="http://purl.org/syndication/thread/1.0" xmlns:geo="http://www.w3.org/2003/01/geo/wgs84_pos#" xmlns:feedburner="http://rssnamespace.org/feedburner/ext/1.0" gd:etag="W/&quot;CUQBRHo5cCp7ImA9WhRXGE4.&quot;"><id>tag:blogger.com,1999:blog-1024937100240932334</id><updated>2011-12-25T18:15:55.428+01:00</updated><category term="mobile" /><category term="entrepreneurial" /><category term="trondheim" /><category term="astronomy" /><category term="ai" /><category term="erlang" /><category term="books" /><category term="mobile agents" /><category term="competition" /><category term="gwt" /><category term="nobel prize" /><category term="assembler" /><category term="ranking" /><category term="time management" /><category term="aure" /><category term="mapreduce" /><category term="hadoop" /><category term="search informationretrieval selfindexing" /><category term="schwag" /><category term="classification" /><category term="c#" /><category term="nanotech" /><category term="grails" /><category term="regression" /><category term="academia" /><category term="dragvoll" /><category term="decremental" /><category term="software engineering" /><category term="performance" /><category term="tv" /><category term="doctest" /><category term="bdd" /><category term="c++" /><category term="eventlet" /><category term="supercomputing" /><category term="cfp" /><category term="startups" /><category term="future" /><category term="facebook" /><category term="simulation" /><category term="threads" /><category term="arc" /><category term="cartoon" /><category term="schwagmaster" /><category term="libsvm" /><category term="gsm" /><category term="linkeddata" /><category term="nobel laureate" /><category term="aquaculture" /><category term="cloud" /><category term="lift" /><category term="concurrency" /><category term="cinpy" /><category term="compile" /><category term="computers" /><category term="support vector machines" /><category term="hyperplane" /><category term="online" /><category term="semanticweb" /><category term="scrummaster" /><category term="gpu" /><category term="parallelization" /><category term="pyml" /><category term="hydrogen" /><category term="arctic" /><category term="kyoto" /><category term="estimates" /><category term="fuel cells" /><category term="ict" /><category term="lake biwa" /><category term="scrum scrummaster" /><category term="innovation" /><category term="agile methods" /><category term="dparser" /><category term="waterfall" /><category term="orange" /><category term="statistics" /><category term="json-rpc" /><category term="mcmc" /><category term="blogging" /><category term="noise" /><category term="json" /><category term="compiler" /><category term="navel gazing" /><category term="google" /><category term="technology" /><category term="javascript" /><category term="greenlets" /><category term="search engines" /><category term="schrum" /><category term="rpython" /><category term="mamma mia" /><category term="domain-specific languages" /><category term="mpi" /><category term="benchmark" /><category term="conference" /><category term="climate" /><category term="idi" /><category term="monte" /><category term="grid" /><category term="retrospect" /><category term="environmental technology" /><category term="tcc" /><category term="atbrox" /><category term="f#" /><category term="phd" /><category term="agile" /><category term="python" /><category term="bicycle" /><category term="biology" /><category term="ntnu" /><category term="antlr" /><category term="webpy" /><category term="parallel" /><category term="confounding" /><category term="tdd" /><category term="stanford" /><category term="physics" /><category term="programming competition" /><category term="productivity" /><category term="programming languages" /><category term="invention" /><category term="stackless python" /><category term="svm" /><category term="hardware" /><category term="science" /><category term="computer science" /><category term="gtd" /><category term="theory" /><category term="neural networks" /><category term="research" /><category term="cloud computing" /><category term="tech.lead" /><category term="ajax" /><category term="fortran" /><category term="programming" /><category term="norway" /><category term="sorting" /><category term="shedskin" /><category term="lisp" /><category term="crawling" /><category term="indexing" /><category term="incremental" /><category term="echo chamber" /><category term="energy" /><category term="scrum" /><category term="appengine" /><category term="stochastic" /><category term="biodiversity" /><category term="tasklets" /><category term="measurements" /><category term="history" /><category term="search" /><category term="markov chain monte carlo" /><category term="japan" /><category term="gcc" /><category term="coffee" /><category term="machine learning" /><category term="image processing" /><category term="software testing" /><category term="numbers" /><category term="academic" /><category term="transparancy" /><category term="health" /><category term="pypy" /><category term="tustna" /><title>Amund Tveit's Blog</title><subtitle type="html">See also &lt;a href="http://twitter.com/atveit"&gt;http://twitter.com/atveit&lt;/a&gt;</subtitle><link rel="http://schemas.google.com/g/2005#feed" type="application/atom+xml" href="http://amundblog.blogspot.com/feeds/posts/default" /><link rel="alternate" type="text/html" href="http://amundblog.blogspot.com/" /><link rel="next" type="application/atom+xml" href="http://www.blogger.com/feeds/1024937100240932334/posts/default?start-index=26&amp;max-results=25&amp;redirect=false&amp;v=2" /><author><name>Amund Tveit</name><uri>https://profiles.google.com/110451251449823277794</uri><email>noreply@blogger.com</email><gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="32" height="32" src="//lh6.googleusercontent.com/-zZKi4b5TYQY/AAAAAAAAAAI/AAAAAAAAAAA/_eaVu-shzqo/s512-c/photo.jpg" /></author><generator version="7.00" uri="http://www.blogger.com">Blogger</generator><openSearch:totalResults>91</openSearch:totalResults><openSearch:startIndex>1</openSearch:startIndex><openSearch:itemsPerPage>25</openSearch:itemsPerPage><atom10:link xmlns:atom10="http://www.w3.org/2005/Atom" rel="self" type="application/atom+xml" href="http://feeds.feedburner.com/AmundsBlog" /><feedburner:info uri="amundsblog" /><atom10:link xmlns:atom10="http://www.w3.org/2005/Atom" rel="hub" href="http://pubsubhubbub.appspot.com/" /><geo:lat>63.36</geo:lat><geo:long>10.25</geo:long><entry gd:etag="W/&quot;CUYGQHk4eCp7ImA9WhdXEUU.&quot;"><id>tag:blogger.com,1999:blog-1024937100240932334.post-619051855801000013</id><published>2011-08-24T07:45:00.001+01:00</published><updated>2011-08-24T11:52:01.730+01:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2011-08-24T11:52:01.730+01:00</app:edited><title>Syllable-based forecast of best performing yc-startups from latest batch</title><content type="html">
&lt;p&gt;&lt;a href="http://feedads.g.doubleclick.net/~a/0jPNx08qC6C7hiBPToUeUbVEJkg/0/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/0jPNx08qC6C7hiBPToUeUbVEJkg/0/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;br/&gt;
&lt;a href="http://feedads.g.doubleclick.net/~a/0jPNx08qC6C7hiBPToUeUbVEJkg/1/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/0jPNx08qC6C7hiBPToUeUbVEJkg/1/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;/p&gt;As previously written in &lt;a href="http://atbrox.com/2010/09/08/predicting-startup-performance-with-syllables/"&gt;predicting startup performance with syllables&lt;/a&gt; those with few syllables - typically 1 or 2 - in their name is likely to perform the best. Here is a quick prediction based on t&lt;a href="http://allthingsd.com/20110823/y-combinator-unloads-massive-new-batch-of-start-ups/"&gt;he yc startups from the latest batch&lt;/a&gt; just published:   &lt;b&gt;1 and 2-syllables (most likely to be high performers according to the few-syllable prediction)&lt;/b&gt;  &lt;ul&gt;
&lt;li&gt;MixRank (2), alexa-rank: 43,724&lt;/li&gt;
&lt;li&gt;Picplum (2), alexa-rank: 700,278&lt;/li&gt;
&lt;li&gt;Depteye (2), alexa-rank: no data&lt;/li&gt;
&lt;li&gt;Envolve (2), alexa-rank: 52,418&lt;/li&gt;
&lt;li&gt;Quartzy (2), alexa-rank: 785,102&lt;/li&gt;
&lt;li&gt;Snapjoy (2), alexa-rank: 450,142&lt;/li&gt;
&lt;li&gt;Opez (2), alexa-rank: 719,612&lt;/li&gt;
&lt;li&gt;Stypi (2), alexa-rank: 531,965&lt;/li&gt;
&lt;li&gt;ZigFu (2), alexa-rank: 21,914,936&lt;/li&gt;
&lt;li&gt;Parse (1), alexa-rank: 564,829&lt;/li&gt;
&lt;li&gt;Verbling (2, alexa-rank: 237,636&lt;/li&gt;
&lt;li&gt;Vidyard (2), alexa-rank: 508,951&lt;/li&gt;
&lt;li&gt;Tagstand (2), alexa-rank:  812,669&lt;/li&gt;
&lt;li&gt;Kicksend (2, alexa-rank: 326,583&lt;/li&gt;
&lt;li&gt;Can'tWait(2), alexa-rank: 786,213&lt;/li&gt;
&lt;/ul&gt;
I am sure the rest of the yc batch startups are just fine, but not according to syllable-based prediction, the ones I have in mind are: &lt;ul&gt;
&lt;li&gt;Aisle50 (3), alexa-rank: 1,106,951&lt;/li&gt;
&lt;li&gt;Launchpad Toys (3), alexa-rank: 1,425,628&lt;/li&gt;
&lt;li&gt;Interviewstreet (3), alexa-rank: 135,296&lt;/li&gt;
&lt;li&gt;DoubleRecall (4), alexa-rank: 799,538&lt;/li&gt;
&lt;li&gt;Munch on Me (3), alexa-rank: 130,234&lt;/li&gt;
&lt;li&gt;PageLever (3), alexa-rank: 55,462&lt;/li&gt;
&lt;li&gt;MarketBrief (3), alexa-rank: 467,943&lt;/li&gt;
&lt;li&gt;MobileWorks (3), alexa-rank: 315,150&lt;/li&gt;
&lt;li&gt;Vimessa (3), alexa-rank: 314,150&lt;/li&gt;
&lt;li&gt;Codeacademy (3), alexa-rank: 61,582&lt;/li&gt;
&lt;/ul&gt;
&lt;div&gt;
&lt;b&gt;How did it go with the last prediction round?&lt;/b&gt;&lt;/div&gt;
&lt;div&gt;
Unfortunately I only added the ones I though would be best performing according to syllable-count (and not the rest for comparison) for the yc summer 2010 batch, but here is how the low syllable count &amp;nbsp;did:&lt;/div&gt;
&lt;div&gt;
&lt;ul&gt;
&lt;li&gt;AdGrok (acquired by Twitter)&lt;/li&gt;
&lt;li&gt;Brushes (winner Apple design award 2010)&lt;/li&gt;
&lt;li&gt;FanVibe (acquired by beRecruited)&lt;/li&gt;
&lt;li&gt;Gantto (customers: Fujitsu, Lucasfilm++, &amp;nbsp;investor:500startups)&lt;/li&gt;
&lt;li&gt;GazeHawk (investor: 500startups)&lt;/li&gt;
&lt;li&gt;HipMunk (most successful startup from that yc batch?)&lt;/li&gt;
&lt;li&gt;OhLife (not sure how they have done)&lt;/li&gt;
&lt;li&gt;TeeVox (not sure how they have done)&lt;/li&gt;
&lt;/ul&gt;
&lt;/div&gt;

Whether this beats throwing darts (random selection) is yet to be tested.

&lt;div style="margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px;"&gt;
&lt;i&gt;&lt;b&gt;Disclaimer&lt;/b&gt;: If I've counted number of syllables wrong for some of the startups (have never heard pronounciation of the startup names) please ping me.&lt;/i&gt;&lt;/div&gt;
&lt;div&gt;
 &lt;/div&gt;
&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/1024937100240932334-619051855801000013?l=amundblog.blogspot.com' alt='' /&gt;&lt;/div&gt;&lt;div class="feedflare"&gt;
&lt;a href="http://feeds.feedburner.com/~ff/AmundsBlog?a=Yv9NsLTaDbc:x5InTzy9G48:yIl2AUoC8zA"&gt;&lt;img src="http://feeds.feedburner.com/~ff/AmundsBlog?d=yIl2AUoC8zA" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/AmundsBlog?a=Yv9NsLTaDbc:x5InTzy9G48:F7zBnMyn0Lo"&gt;&lt;img src="http://feeds.feedburner.com/~ff/AmundsBlog?i=Yv9NsLTaDbc:x5InTzy9G48:F7zBnMyn0Lo" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/AmundsBlog?a=Yv9NsLTaDbc:x5InTzy9G48:63t7Ie-LG7Y"&gt;&lt;img src="http://feeds.feedburner.com/~ff/AmundsBlog?d=63t7Ie-LG7Y" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/AmundsBlog?a=Yv9NsLTaDbc:x5InTzy9G48:V_sGLiPBpWU"&gt;&lt;img src="http://feeds.feedburner.com/~ff/AmundsBlog?i=Yv9NsLTaDbc:x5InTzy9G48:V_sGLiPBpWU" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/AmundsBlog?a=Yv9NsLTaDbc:x5InTzy9G48:qj6IDK7rITs"&gt;&lt;img src="http://feeds.feedburner.com/~ff/AmundsBlog?d=qj6IDK7rITs" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/AmundsBlog?a=Yv9NsLTaDbc:x5InTzy9G48:gIN9vFwOqvQ"&gt;&lt;img src="http://feeds.feedburner.com/~ff/AmundsBlog?i=Yv9NsLTaDbc:x5InTzy9G48:gIN9vFwOqvQ" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/AmundsBlog?a=Yv9NsLTaDbc:x5InTzy9G48:dnMXMwOfBR0"&gt;&lt;img src="http://feeds.feedburner.com/~ff/AmundsBlog?d=dnMXMwOfBR0" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/AmundsBlog?a=Yv9NsLTaDbc:x5InTzy9G48:7Q72WNTAKBA"&gt;&lt;img src="http://feeds.feedburner.com/~ff/AmundsBlog?d=7Q72WNTAKBA" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/AmundsBlog?a=Yv9NsLTaDbc:x5InTzy9G48:KwTdNBX3Jqk"&gt;&lt;img src="http://feeds.feedburner.com/~ff/AmundsBlog?i=Yv9NsLTaDbc:x5InTzy9G48:KwTdNBX3Jqk" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/AmundsBlog?a=Yv9NsLTaDbc:x5InTzy9G48:l6gmwiTKsz0"&gt;&lt;img src="http://feeds.feedburner.com/~ff/AmundsBlog?d=l6gmwiTKsz0" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/AmundsBlog?a=Yv9NsLTaDbc:x5InTzy9G48:TzevzKxY174"&gt;&lt;img src="http://feeds.feedburner.com/~ff/AmundsBlog?d=TzevzKxY174" border="0"&gt;&lt;/img&gt;&lt;/a&gt;
&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/AmundsBlog/~4/Yv9NsLTaDbc" height="1" width="1"/&gt;</content><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/1024937100240932334/posts/default/619051855801000013?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/1024937100240932334/posts/default/619051855801000013?v=2" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/AmundsBlog/~3/Yv9NsLTaDbc/syllable-based-forecast-of-best.html" title="Syllable-based forecast of best performing yc-startups from latest batch" /><author><name>Amund Tveit</name><uri>https://profiles.google.com/110451251449823277794</uri><email>noreply@blogger.com</email><gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="32" height="32" src="//lh6.googleusercontent.com/-zZKi4b5TYQY/AAAAAAAAAAI/AAAAAAAAAAA/_eaVu-shzqo/s512-c/photo.jpg" /></author><feedburner:origLink>http://amundblog.blogspot.com/2011/08/syllable-based-forecast-of-best.html</feedburner:origLink></entry><entry gd:etag="W/&quot;DEYARnc-cCp7ImA9WhdQEUk.&quot;"><id>tag:blogger.com,1999:blog-1024937100240932334.post-7025642470545540910</id><published>2011-08-12T11:49:00.001+01:00</published><updated>2011-08-12T11:49:07.958+01:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2011-08-12T11:49:07.958+01:00</app:edited><category scheme="http://www.blogger.com/atom/ns#" term="cfp" /><category scheme="http://www.blogger.com/atom/ns#" term="linkeddata" /><category scheme="http://www.blogger.com/atom/ns#" term="semanticweb" /><category scheme="http://www.blogger.com/atom/ns#" term="search" /><title>slowly back in the academic publishing game</title><content type="html">
&lt;p&gt;&lt;a href="http://feedads.g.doubleclick.net/~a/pu5-XI7BQVcBMJA6wAEkSKExTU8/0/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/pu5-XI7BQVcBMJA6wAEkSKExTU8/0/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;br/&gt;
&lt;a href="http://feedads.g.doubleclick.net/~a/pu5-XI7BQVcBMJA6wAEkSKExTU8/1/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/pu5-XI7BQVcBMJA6wAEkSKExTU8/1/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;/p&gt;a&lt;a href="http://amundtveit.info/eventseer/"&gt; very long time ago&lt;/a&gt; I created a list of conference Call for Papers (CFP) I wanted to follow (as a fresh PhD student), this grew into a &lt;a href="http://eventseer.net/"&gt;service of its own&lt;/a&gt; (and development shifted from me to another &lt;a href="http://no.linkedin.com/in/thomasbroxrost"&gt;developer&lt;/a&gt;), and has been used by researchers both directly as a service and later as a part of &lt;a href="http://en.wikipedia.org/wiki/Linked_Data"&gt;linked data&lt;/a&gt; (semantic web) input, and I just became a &lt;a href="http://amundtveit.info/publications/"&gt;sidekick on a poster about linked data and call for papers from that service&lt;/a&gt;. Hope to get the time to publish more in academic forums (in addition to &lt;a href="http://atbrox.com/about/articles/"&gt;blog posts&lt;/a&gt;) later this year, perhaps about Atbrox search technology and (forthcoming) services.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/1024937100240932334-7025642470545540910?l=amundblog.blogspot.com' alt='' /&gt;&lt;/div&gt;&lt;div class="feedflare"&gt;
&lt;a href="http://feeds.feedburner.com/~ff/AmundsBlog?a=gH0CCfywVM0:jlzd-hBUg0A:yIl2AUoC8zA"&gt;&lt;img src="http://feeds.feedburner.com/~ff/AmundsBlog?d=yIl2AUoC8zA" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/AmundsBlog?a=gH0CCfywVM0:jlzd-hBUg0A:F7zBnMyn0Lo"&gt;&lt;img src="http://feeds.feedburner.com/~ff/AmundsBlog?i=gH0CCfywVM0:jlzd-hBUg0A:F7zBnMyn0Lo" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/AmundsBlog?a=gH0CCfywVM0:jlzd-hBUg0A:63t7Ie-LG7Y"&gt;&lt;img src="http://feeds.feedburner.com/~ff/AmundsBlog?d=63t7Ie-LG7Y" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/AmundsBlog?a=gH0CCfywVM0:jlzd-hBUg0A:V_sGLiPBpWU"&gt;&lt;img src="http://feeds.feedburner.com/~ff/AmundsBlog?i=gH0CCfywVM0:jlzd-hBUg0A:V_sGLiPBpWU" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/AmundsBlog?a=gH0CCfywVM0:jlzd-hBUg0A:qj6IDK7rITs"&gt;&lt;img src="http://feeds.feedburner.com/~ff/AmundsBlog?d=qj6IDK7rITs" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/AmundsBlog?a=gH0CCfywVM0:jlzd-hBUg0A:gIN9vFwOqvQ"&gt;&lt;img src="http://feeds.feedburner.com/~ff/AmundsBlog?i=gH0CCfywVM0:jlzd-hBUg0A:gIN9vFwOqvQ" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/AmundsBlog?a=gH0CCfywVM0:jlzd-hBUg0A:dnMXMwOfBR0"&gt;&lt;img src="http://feeds.feedburner.com/~ff/AmundsBlog?d=dnMXMwOfBR0" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/AmundsBlog?a=gH0CCfywVM0:jlzd-hBUg0A:7Q72WNTAKBA"&gt;&lt;img src="http://feeds.feedburner.com/~ff/AmundsBlog?d=7Q72WNTAKBA" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/AmundsBlog?a=gH0CCfywVM0:jlzd-hBUg0A:KwTdNBX3Jqk"&gt;&lt;img src="http://feeds.feedburner.com/~ff/AmundsBlog?i=gH0CCfywVM0:jlzd-hBUg0A:KwTdNBX3Jqk" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/AmundsBlog?a=gH0CCfywVM0:jlzd-hBUg0A:l6gmwiTKsz0"&gt;&lt;img src="http://feeds.feedburner.com/~ff/AmundsBlog?d=l6gmwiTKsz0" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/AmundsBlog?a=gH0CCfywVM0:jlzd-hBUg0A:TzevzKxY174"&gt;&lt;img src="http://feeds.feedburner.com/~ff/AmundsBlog?d=TzevzKxY174" border="0"&gt;&lt;/img&gt;&lt;/a&gt;
&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/AmundsBlog/~4/gH0CCfywVM0" height="1" width="1"/&gt;</content><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/1024937100240932334/posts/default/7025642470545540910?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/1024937100240932334/posts/default/7025642470545540910?v=2" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/AmundsBlog/~3/gH0CCfywVM0/slowly-back-in-academic-publishing-game.html" title="slowly back in the academic publishing game" /><author><name>Amund Tveit</name><uri>https://profiles.google.com/110451251449823277794</uri><email>noreply@blogger.com</email><gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="32" height="32" src="//lh6.googleusercontent.com/-zZKi4b5TYQY/AAAAAAAAAAI/AAAAAAAAAAA/_eaVu-shzqo/s512-c/photo.jpg" /></author><category term="CFP" scheme="http://rss.financialcontent.com/stocksymbol" /><feedburner:origLink>http://amundblog.blogspot.com/2011/08/slowly-back-in-academic-publishing-game.html</feedburner:origLink></entry><entry gd:etag="W/&quot;A0cGSHo7eCp7ImA9WhZbEUw.&quot;"><id>tag:blogger.com,1999:blog-1024937100240932334.post-2711329639471972180</id><published>2011-06-15T07:22:00.001+01:00</published><updated>2011-06-15T07:23:49.400+01:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2011-06-15T07:23:49.400+01:00</app:edited><category scheme="http://www.blogger.com/atom/ns#" term="mapreduce" /><category scheme="http://www.blogger.com/atom/ns#" term="search" /><category scheme="http://www.blogger.com/atom/ns#" term="hadoop" /><title>Mapreduce Algorithms and Search</title><content type="html">
&lt;p&gt;&lt;a href="http://feedads.g.doubleclick.net/~a/cs3f2TBNPei1NlSWhYb9tnoB6ac/0/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/cs3f2TBNPei1NlSWhYb9tnoB6ac/0/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;br/&gt;
&lt;a href="http://feedads.g.doubleclick.net/~a/cs3f2TBNPei1NlSWhYb9tnoB6ac/1/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/cs3f2TBNPei1NlSWhYb9tnoB6ac/1/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;/p&gt;My latest postings on the Atbrox blog:&lt;br /&gt;
&lt;br /&gt;
&lt;ul&gt;&lt;li&gt;&lt;a href="http://atbrox.com/2011/05/16/mapreduce-hadoop-algorithms-in-academic-papers-4th-update-may-2011/"&gt;Mapreduce and Hadoop papers in Academic Papers - 4th update&lt;/a&gt;&lt;/li&gt;
&lt;ul&gt;&lt;li&gt;35 new papers and 2 new categories added - social networking and astronomy&lt;/li&gt;
&lt;/ul&gt;&lt;li&gt;&lt;a href="http://atbrox.com/2011/04/09/mapreduce-in-search/"&gt;Mapreduce in Search&lt;/a&gt;&lt;/li&gt;
&lt;ul&gt;&lt;li&gt;Guest Lecture in Search Technology at Department of Computer Science, University of Oslo&lt;/li&gt;
&lt;/ul&gt;&lt;/ul&gt;&lt;div&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/1024937100240932334-2711329639471972180?l=amundblog.blogspot.com' alt='' /&gt;&lt;/div&gt;&lt;div class="feedflare"&gt;
&lt;a href="http://feeds.feedburner.com/~ff/AmundsBlog?a=KqO7VX5jf9k:DsCZNSoAAYo:yIl2AUoC8zA"&gt;&lt;img src="http://feeds.feedburner.com/~ff/AmundsBlog?d=yIl2AUoC8zA" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/AmundsBlog?a=KqO7VX5jf9k:DsCZNSoAAYo:F7zBnMyn0Lo"&gt;&lt;img src="http://feeds.feedburner.com/~ff/AmundsBlog?i=KqO7VX5jf9k:DsCZNSoAAYo:F7zBnMyn0Lo" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/AmundsBlog?a=KqO7VX5jf9k:DsCZNSoAAYo:63t7Ie-LG7Y"&gt;&lt;img src="http://feeds.feedburner.com/~ff/AmundsBlog?d=63t7Ie-LG7Y" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/AmundsBlog?a=KqO7VX5jf9k:DsCZNSoAAYo:V_sGLiPBpWU"&gt;&lt;img src="http://feeds.feedburner.com/~ff/AmundsBlog?i=KqO7VX5jf9k:DsCZNSoAAYo:V_sGLiPBpWU" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/AmundsBlog?a=KqO7VX5jf9k:DsCZNSoAAYo:qj6IDK7rITs"&gt;&lt;img src="http://feeds.feedburner.com/~ff/AmundsBlog?d=qj6IDK7rITs" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/AmundsBlog?a=KqO7VX5jf9k:DsCZNSoAAYo:gIN9vFwOqvQ"&gt;&lt;img src="http://feeds.feedburner.com/~ff/AmundsBlog?i=KqO7VX5jf9k:DsCZNSoAAYo:gIN9vFwOqvQ" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/AmundsBlog?a=KqO7VX5jf9k:DsCZNSoAAYo:dnMXMwOfBR0"&gt;&lt;img src="http://feeds.feedburner.com/~ff/AmundsBlog?d=dnMXMwOfBR0" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/AmundsBlog?a=KqO7VX5jf9k:DsCZNSoAAYo:7Q72WNTAKBA"&gt;&lt;img src="http://feeds.feedburner.com/~ff/AmundsBlog?d=7Q72WNTAKBA" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/AmundsBlog?a=KqO7VX5jf9k:DsCZNSoAAYo:KwTdNBX3Jqk"&gt;&lt;img src="http://feeds.feedburner.com/~ff/AmundsBlog?i=KqO7VX5jf9k:DsCZNSoAAYo:KwTdNBX3Jqk" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/AmundsBlog?a=KqO7VX5jf9k:DsCZNSoAAYo:l6gmwiTKsz0"&gt;&lt;img src="http://feeds.feedburner.com/~ff/AmundsBlog?d=l6gmwiTKsz0" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/AmundsBlog?a=KqO7VX5jf9k:DsCZNSoAAYo:TzevzKxY174"&gt;&lt;img src="http://feeds.feedburner.com/~ff/AmundsBlog?d=TzevzKxY174" border="0"&gt;&lt;/img&gt;&lt;/a&gt;
&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/AmundsBlog/~4/KqO7VX5jf9k" height="1" width="1"/&gt;</content><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/1024937100240932334/posts/default/2711329639471972180?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/1024937100240932334/posts/default/2711329639471972180?v=2" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/AmundsBlog/~3/KqO7VX5jf9k/mapreduce-algorithms-and-search.html" title="Mapreduce Algorithms and Search" /><author><name>Amund Tveit</name><uri>https://profiles.google.com/110451251449823277794</uri><email>noreply@blogger.com</email><gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="32" height="32" src="//lh6.googleusercontent.com/-zZKi4b5TYQY/AAAAAAAAAAI/AAAAAAAAAAA/_eaVu-shzqo/s512-c/photo.jpg" /></author><feedburner:origLink>http://amundblog.blogspot.com/2011/06/mapreduce-algorithms-and-search.html</feedburner:origLink></entry><entry gd:etag="W/&quot;CE4CSH4zeip7ImA9Wx9bGUw.&quot;"><id>tag:blogger.com,1999:blog-1024937100240932334.post-4799876680335639197</id><published>2011-02-28T18:09:00.000+01:00</published><updated>2011-02-28T18:09:29.082+01:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2011-02-28T18:09:29.082+01:00</app:edited><category scheme="http://www.blogger.com/atom/ns#" term="atbrox" /><category scheme="http://www.blogger.com/atom/ns#" term="mapreduce" /><category scheme="http://www.blogger.com/atom/ns#" term="f#" /><category scheme="http://www.blogger.com/atom/ns#" term="c#" /><category scheme="http://www.blogger.com/atom/ns#" term="hadoop" /><title>Overview of my postings on the Atbrox blog August 2010-Feb 2011</title><content type="html">
&lt;p&gt;&lt;a href="http://feedads.g.doubleclick.net/~a/Xo2zSOS32BP1eaKx2TOU76sFurc/0/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/Xo2zSOS32BP1eaKx2TOU76sFurc/0/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;br/&gt;
&lt;a href="http://feedads.g.doubleclick.net/~a/Xo2zSOS32BP1eaKx2TOU76sFurc/1/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/Xo2zSOS32BP1eaKx2TOU76sFurc/1/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;/p&gt;I write most of my blog postings at my startup's - &lt;a href="http://atbrox.com/about/"&gt;Atbrox&lt;/a&gt; - blog. Here is an overview of postings from August 2010 - February 2011:&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;ul&gt;&lt;li&gt;&lt;a href="http://atbrox.com/2011/02/16/atbrox-spin-off-launches-new-media-search-engine/"&gt;Atbrox spin-off launches new media search engine&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="http://atbrox.com/2011/02/07/an-example-of-using-f-and-c-netmono-with-amazons-elastic-mapreduce-hadoop/"&gt;An example of using F# and C# (.net/mono) with Amazon's Elastic Mapreduce (Hadoop)&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="http://atbrox.com/2011/01/06/2nd-international-workshop-on-mapreduce-and-its-applications/"&gt;2nd International Workshop on Mapreduce and its applications&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="http://atbrox.com/2010/09/08/predicting-startup-performance-with-syllables/"&gt;Predicting startup performance with Syllables&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="http://atbrox.com/2010/08/31/recommended-mapreduce-workshop/"&gt;Recommended Mapreduce Workshop&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;&lt;div&gt;Best regards,&lt;/div&gt;&lt;div&gt;&lt;br /&gt;
&lt;/div&gt;&lt;div&gt;Amund&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/1024937100240932334-4799876680335639197?l=amundblog.blogspot.com' alt='' /&gt;&lt;/div&gt;&lt;div class="feedflare"&gt;
&lt;a href="http://feeds.feedburner.com/~ff/AmundsBlog?a=VcRt8xjAIng:rRMlXZYvmIQ:yIl2AUoC8zA"&gt;&lt;img src="http://feeds.feedburner.com/~ff/AmundsBlog?d=yIl2AUoC8zA" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/AmundsBlog?a=VcRt8xjAIng:rRMlXZYvmIQ:F7zBnMyn0Lo"&gt;&lt;img src="http://feeds.feedburner.com/~ff/AmundsBlog?i=VcRt8xjAIng:rRMlXZYvmIQ:F7zBnMyn0Lo" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/AmundsBlog?a=VcRt8xjAIng:rRMlXZYvmIQ:63t7Ie-LG7Y"&gt;&lt;img src="http://feeds.feedburner.com/~ff/AmundsBlog?d=63t7Ie-LG7Y" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/AmundsBlog?a=VcRt8xjAIng:rRMlXZYvmIQ:V_sGLiPBpWU"&gt;&lt;img src="http://feeds.feedburner.com/~ff/AmundsBlog?i=VcRt8xjAIng:rRMlXZYvmIQ:V_sGLiPBpWU" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/AmundsBlog?a=VcRt8xjAIng:rRMlXZYvmIQ:qj6IDK7rITs"&gt;&lt;img src="http://feeds.feedburner.com/~ff/AmundsBlog?d=qj6IDK7rITs" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/AmundsBlog?a=VcRt8xjAIng:rRMlXZYvmIQ:gIN9vFwOqvQ"&gt;&lt;img src="http://feeds.feedburner.com/~ff/AmundsBlog?i=VcRt8xjAIng:rRMlXZYvmIQ:gIN9vFwOqvQ" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/AmundsBlog?a=VcRt8xjAIng:rRMlXZYvmIQ:dnMXMwOfBR0"&gt;&lt;img src="http://feeds.feedburner.com/~ff/AmundsBlog?d=dnMXMwOfBR0" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/AmundsBlog?a=VcRt8xjAIng:rRMlXZYvmIQ:7Q72WNTAKBA"&gt;&lt;img src="http://feeds.feedburner.com/~ff/AmundsBlog?d=7Q72WNTAKBA" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/AmundsBlog?a=VcRt8xjAIng:rRMlXZYvmIQ:KwTdNBX3Jqk"&gt;&lt;img src="http://feeds.feedburner.com/~ff/AmundsBlog?i=VcRt8xjAIng:rRMlXZYvmIQ:KwTdNBX3Jqk" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/AmundsBlog?a=VcRt8xjAIng:rRMlXZYvmIQ:l6gmwiTKsz0"&gt;&lt;img src="http://feeds.feedburner.com/~ff/AmundsBlog?d=l6gmwiTKsz0" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/AmundsBlog?a=VcRt8xjAIng:rRMlXZYvmIQ:TzevzKxY174"&gt;&lt;img src="http://feeds.feedburner.com/~ff/AmundsBlog?d=TzevzKxY174" border="0"&gt;&lt;/img&gt;&lt;/a&gt;
&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/AmundsBlog/~4/VcRt8xjAIng" height="1" width="1"/&gt;</content><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/1024937100240932334/posts/default/4799876680335639197?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/1024937100240932334/posts/default/4799876680335639197?v=2" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/AmundsBlog/~3/VcRt8xjAIng/overview-of-my-postings-on-atbrox-blog.html" title="Overview of my postings on the Atbrox blog August 2010-Feb 2011" /><author><name>Amund Tveit</name><uri>https://profiles.google.com/110451251449823277794</uri><email>noreply@blogger.com</email><gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="32" height="32" src="//lh6.googleusercontent.com/-zZKi4b5TYQY/AAAAAAAAAAI/AAAAAAAAAAA/_eaVu-shzqo/s512-c/photo.jpg" /></author><feedburner:origLink>http://amundblog.blogspot.com/2011/02/overview-of-my-postings-on-atbrox-blog.html</feedburner:origLink></entry><entry gd:etag="W/&quot;DkAHSXgzfyp7ImA9Wx5XFk4.&quot;"><id>tag:blogger.com,1999:blog-1024937100240932334.post-7093544228464227732</id><published>2010-08-26T07:06:00.001+01:00</published><updated>2010-09-16T11:58:58.687+01:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2010-09-16T11:58:58.687+01:00</app:edited><category scheme="http://www.blogger.com/atom/ns#" term="supercomputing" /><category scheme="http://www.blogger.com/atom/ns#" term="mapreduce" /><category scheme="http://www.blogger.com/atom/ns#" term="gpu" /><category scheme="http://www.blogger.com/atom/ns#" term="python" /><category scheme="http://www.blogger.com/atom/ns#" term="cloud computing" /><category scheme="http://www.blogger.com/atom/ns#" term="hadoop" /><title>Overview of my postings on the Atbrox blog (May 2010 - Aug 2010)</title><content type="html">
&lt;p&gt;&lt;a href="http://feedads.g.doubleclick.net/~a/jz8_nA0V5FCW6a4i8BAnzoEeQiU/0/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/jz8_nA0V5FCW6a4i8BAnzoEeQiU/0/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;br/&gt;
&lt;a href="http://feedads.g.doubleclick.net/~a/jz8_nA0V5FCW6a4i8BAnzoEeQiU/1/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/jz8_nA0V5FCW6a4i8BAnzoEeQiU/1/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;/p&gt;As previously mentioned I currently write most of my blog postings over on &lt;a href="http://atbrox.com"&gt;Atbrox&lt;/a&gt; (my startup company)&lt;br /&gt;
&lt;br /&gt;
Here are the latest postings:&lt;br /&gt;
&lt;br /&gt;
&lt;ul&gt;&lt;li&gt;&lt;a href="http://atbrox.com/2010/08/20/word-count-with-mapreduce-on-a-gpu-a-python-example/"&gt;Word Count with Mapreduce on a GPU - A Python Example&lt;/a&gt;&lt;br /&gt;
&lt;li&gt;&lt;a href="http://atbrox.com/2010/05/25/statistics-about-hadoop-and-mapreduce-algorithm-papers/"&gt;Statistics about Hadoop and Mapreduce Algorithm Papers&lt;/a&gt;&lt;br /&gt;
&lt;li&gt;&lt;a href="http://atbrox.com/2010/05/24/towards-cloud-supercomputing/"&gt;Towards Cloud Supercomputing&lt;/a&gt;&lt;br /&gt;
&lt;/ul&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/1024937100240932334-7093544228464227732?l=amundblog.blogspot.com' alt='' /&gt;&lt;/div&gt;&lt;div class="feedflare"&gt;
&lt;a href="http://feeds.feedburner.com/~ff/AmundsBlog?a=E4CYGr6KZy0:L_Jn0bnrlW4:yIl2AUoC8zA"&gt;&lt;img src="http://feeds.feedburner.com/~ff/AmundsBlog?d=yIl2AUoC8zA" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/AmundsBlog?a=E4CYGr6KZy0:L_Jn0bnrlW4:F7zBnMyn0Lo"&gt;&lt;img src="http://feeds.feedburner.com/~ff/AmundsBlog?i=E4CYGr6KZy0:L_Jn0bnrlW4:F7zBnMyn0Lo" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/AmundsBlog?a=E4CYGr6KZy0:L_Jn0bnrlW4:63t7Ie-LG7Y"&gt;&lt;img src="http://feeds.feedburner.com/~ff/AmundsBlog?d=63t7Ie-LG7Y" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/AmundsBlog?a=E4CYGr6KZy0:L_Jn0bnrlW4:V_sGLiPBpWU"&gt;&lt;img src="http://feeds.feedburner.com/~ff/AmundsBlog?i=E4CYGr6KZy0:L_Jn0bnrlW4:V_sGLiPBpWU" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/AmundsBlog?a=E4CYGr6KZy0:L_Jn0bnrlW4:qj6IDK7rITs"&gt;&lt;img src="http://feeds.feedburner.com/~ff/AmundsBlog?d=qj6IDK7rITs" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/AmundsBlog?a=E4CYGr6KZy0:L_Jn0bnrlW4:gIN9vFwOqvQ"&gt;&lt;img src="http://feeds.feedburner.com/~ff/AmundsBlog?i=E4CYGr6KZy0:L_Jn0bnrlW4:gIN9vFwOqvQ" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/AmundsBlog?a=E4CYGr6KZy0:L_Jn0bnrlW4:dnMXMwOfBR0"&gt;&lt;img src="http://feeds.feedburner.com/~ff/AmundsBlog?d=dnMXMwOfBR0" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/AmundsBlog?a=E4CYGr6KZy0:L_Jn0bnrlW4:7Q72WNTAKBA"&gt;&lt;img src="http://feeds.feedburner.com/~ff/AmundsBlog?d=7Q72WNTAKBA" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/AmundsBlog?a=E4CYGr6KZy0:L_Jn0bnrlW4:KwTdNBX3Jqk"&gt;&lt;img src="http://feeds.feedburner.com/~ff/AmundsBlog?i=E4CYGr6KZy0:L_Jn0bnrlW4:KwTdNBX3Jqk" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/AmundsBlog?a=E4CYGr6KZy0:L_Jn0bnrlW4:l6gmwiTKsz0"&gt;&lt;img src="http://feeds.feedburner.com/~ff/AmundsBlog?d=l6gmwiTKsz0" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/AmundsBlog?a=E4CYGr6KZy0:L_Jn0bnrlW4:TzevzKxY174"&gt;&lt;img src="http://feeds.feedburner.com/~ff/AmundsBlog?d=TzevzKxY174" border="0"&gt;&lt;/img&gt;&lt;/a&gt;
&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/AmundsBlog/~4/E4CYGr6KZy0" height="1" width="1"/&gt;</content><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/1024937100240932334/posts/default/7093544228464227732?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/1024937100240932334/posts/default/7093544228464227732?v=2" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/AmundsBlog/~3/E4CYGr6KZy0/overview-of-my-postings-on-atbrox-blog.html" title="Overview of my postings on the Atbrox blog (May 2010 - Aug 2010)" /><author><name>Amund Tveit</name><uri>https://profiles.google.com/110451251449823277794</uri><email>noreply@blogger.com</email><gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="32" height="32" src="//lh6.googleusercontent.com/-zZKi4b5TYQY/AAAAAAAAAAI/AAAAAAAAAAA/_eaVu-shzqo/s512-c/photo.jpg" /></author><feedburner:origLink>http://amundblog.blogspot.com/2010/08/overview-of-my-postings-on-atbrox-blog.html</feedburner:origLink></entry><entry gd:etag="W/&quot;AkUAR387eSp7ImA9WxFWEkw.&quot;"><id>tag:blogger.com,1999:blog-1024937100240932334.post-9170617812041686476</id><published>2010-05-30T08:33:00.003+01:00</published><updated>2010-05-30T12:17:26.101+01:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2010-05-30T12:17:26.101+01:00</app:edited><category scheme="http://www.blogger.com/atom/ns#" term="indexing" /><category scheme="http://www.blogger.com/atom/ns#" term="search" /><category scheme="http://www.blogger.com/atom/ns#" term="future" /><category scheme="http://www.blogger.com/atom/ns#" term="crawling" /><title>Evaluation of Search Predictions made in May 2000</title><content type="html">
&lt;p&gt;&lt;a href="http://feedads.g.doubleclick.net/~a/VqJA0H8vcbwMf8npb7jsK-aq0hc/0/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/VqJA0H8vcbwMf8npb7jsK-aq0hc/0/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;br/&gt;
&lt;a href="http://feedads.g.doubleclick.net/~a/VqJA0H8vcbwMf8npb7jsK-aq0hc/1/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/VqJA0H8vcbwMf8npb7jsK-aq0hc/1/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;/p&gt;In May 2000 I wrote &lt;a href="http://amundtveit.info/publications/2000/iir.php"&gt;A few thoughts about the future of Internet Information Retrieval&lt;/a&gt; (i.e. search), but how did it actually go? I've tried to evaluate them in this posting, with the original prediction in &lt;i&gt;italic font&lt;/i&gt; followed by the evaluation.&lt;br /&gt;
&lt;br /&gt;
&lt;strong&gt;1a) Prediction - Specialized Services within Search&lt;/strong&gt;&lt;br /&gt;
&lt;i&gt;&lt;br /&gt;
It seems likely that the specialization in the Internet Information Retrieval (IIR) business will continue. Internet information crawling, pre-processing, indexing, searching and presentation requires different types of technologies and know-how, this might create opportunities for new companies specializing in only one step of the IIR "food chain". One possibility could be that companies doing crawling will do offer extracts of relevant data on request, e.g. a search engine specializing in winter sports could get only relevant data extracted from several regional crawler companies. In other words, the IIR "food chain" might increase in length.&lt;br /&gt;
&lt;/i&gt;&lt;br /&gt;
&lt;br /&gt;
&lt;strong&gt;1b) Evaluation&lt;/strong&gt;&lt;br /&gt;
Specalization of search services happened to some degree, but had relatively small impact. Examples of such services include fetching/crawl-related services (e.g. &lt;a href="http://atbrox.com/2009/11/04/preliminary-experiences-crawling-with-80legs/"&gt;80legs&lt;/a&gt;). But the services with biggest impact are the free (e.g. &lt;a href="http://code.google.com/apis/ajaxsearch/"&gt;Google Ajax Search API&lt;/a&gt; and &lt;a href="http://www.bing.com/developers"&gt;Bing APIs&lt;/a&gt;) and commercial search APIs (e.g. &lt;a href="http://developer.yahoo.com/search/boss/"&gt;Yahoo Boss&lt;/a&gt; and &lt;a href="http://www.wolframalpha.com/developers.html"&gt;Wolfram Alpha API&lt;/a&gt;), all in common that they offer the last step, i.e. search - so implicitly covering all steps. Noteworthy happenings in the related direction is cloud computing and increasing number of large data sets (e.g. &lt;a href="http://infochimps.org/"&gt;infochimps collection&lt;/a&gt;, &lt;a href="http://wiki.dbpedia.org/Datasets"&gt;DBPedia&lt;/a&gt; and &lt;a href="http://bixolabs.com/2009/11/01/announcing-the-public-terabyte-dataset-project/"&gt;the Public Terabyte (crawl) dataset&lt;/a&gt;)&lt;br /&gt;
&lt;br /&gt;
&lt;strong&gt;2a) Prediction about Potential New Search Players&lt;/strong&gt;&lt;br /&gt;
&lt;i&gt;&lt;br /&gt;
As the importance of Internet Information Retrieval grows, players that have been concentrating on the lower end of the Internet "food chain", i.e. major bandwidth providers (e.g. &lt;a href="http://en.wikipedia.org/wiki/MCI_Inc."&gt;MCI&lt;/a&gt; or &lt;a href="http://www.bt.com"&gt;British Telecom&lt;/a&gt;) and network software/hardware vendors (e.g. &lt;a href="http://www.3com.com"&gt;3COM &lt;/a&gt;or &lt;a href="http://www.cisco.com"&gt;Cisco&lt;/a&gt;) might want to enter the market as providers of partially indexed data to search engines and topic hierarchies.&lt;br /&gt;
&lt;/i&gt;&lt;br /&gt;
&lt;br /&gt;
&lt;strong&gt;2b) Evaluation&lt;/strong&gt;&lt;br /&gt;
This didn't happen at all to my knowledge.&lt;br /&gt;
&lt;br /&gt;
&lt;strong&gt;3a) Prediction about Potential New Search Technologies&lt;/strong&gt;&lt;br /&gt;
&lt;em&gt;&lt;br /&gt;
With the increased growth of the amount of data on the Internet, new technologies for doing distributed indexing/search of data will probably occur. This is particularly interesting if processing and indexing of multimedia data (e.g. sound, pictures and video) becomes popular. Processing of multimedia data is considerably more CPU intensive than processing of textual data. Example of such processing could be automatic detection of objects (e.g. a car) in video frames.&lt;br /&gt;
&lt;/em&gt;&lt;br /&gt;
&lt;br /&gt;
&lt;strong&gt;3b) Evaluation&lt;/strong&gt;&lt;br /&gt;
(Massively) distributed indexing in the "SETI@home-style" didn't happen at large scale, though there are a few examples pursuing distributed indexing/search, e.g. &lt;a href="http://www.majestic12.co.uk/about.php"&gt;the Majestic project&lt;/a&gt;. The in retrospective obvious processing of multimedia data is happening (but not trivial problems to solve).&lt;br /&gt;
&lt;br /&gt;
&lt;strong&gt;Conclusion&lt;/strong&gt;&lt;br /&gt;
If I am kind - 0.5 on prediction 1, 0 on prediction 2 and 0.5 on prediction 2 ~ 33.33% correct?&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/1024937100240932334-9170617812041686476?l=amundblog.blogspot.com' alt='' /&gt;&lt;/div&gt;&lt;div class="feedflare"&gt;
&lt;a href="http://feeds.feedburner.com/~ff/AmundsBlog?a=5kbWeLZJuc0:MpTDg5pJyX8:yIl2AUoC8zA"&gt;&lt;img src="http://feeds.feedburner.com/~ff/AmundsBlog?d=yIl2AUoC8zA" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/AmundsBlog?a=5kbWeLZJuc0:MpTDg5pJyX8:F7zBnMyn0Lo"&gt;&lt;img src="http://feeds.feedburner.com/~ff/AmundsBlog?i=5kbWeLZJuc0:MpTDg5pJyX8:F7zBnMyn0Lo" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/AmundsBlog?a=5kbWeLZJuc0:MpTDg5pJyX8:63t7Ie-LG7Y"&gt;&lt;img src="http://feeds.feedburner.com/~ff/AmundsBlog?d=63t7Ie-LG7Y" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/AmundsBlog?a=5kbWeLZJuc0:MpTDg5pJyX8:V_sGLiPBpWU"&gt;&lt;img src="http://feeds.feedburner.com/~ff/AmundsBlog?i=5kbWeLZJuc0:MpTDg5pJyX8:V_sGLiPBpWU" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/AmundsBlog?a=5kbWeLZJuc0:MpTDg5pJyX8:qj6IDK7rITs"&gt;&lt;img src="http://feeds.feedburner.com/~ff/AmundsBlog?d=qj6IDK7rITs" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/AmundsBlog?a=5kbWeLZJuc0:MpTDg5pJyX8:gIN9vFwOqvQ"&gt;&lt;img src="http://feeds.feedburner.com/~ff/AmundsBlog?i=5kbWeLZJuc0:MpTDg5pJyX8:gIN9vFwOqvQ" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/AmundsBlog?a=5kbWeLZJuc0:MpTDg5pJyX8:dnMXMwOfBR0"&gt;&lt;img src="http://feeds.feedburner.com/~ff/AmundsBlog?d=dnMXMwOfBR0" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/AmundsBlog?a=5kbWeLZJuc0:MpTDg5pJyX8:7Q72WNTAKBA"&gt;&lt;img src="http://feeds.feedburner.com/~ff/AmundsBlog?d=7Q72WNTAKBA" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/AmundsBlog?a=5kbWeLZJuc0:MpTDg5pJyX8:KwTdNBX3Jqk"&gt;&lt;img src="http://feeds.feedburner.com/~ff/AmundsBlog?i=5kbWeLZJuc0:MpTDg5pJyX8:KwTdNBX3Jqk" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/AmundsBlog?a=5kbWeLZJuc0:MpTDg5pJyX8:l6gmwiTKsz0"&gt;&lt;img src="http://feeds.feedburner.com/~ff/AmundsBlog?d=l6gmwiTKsz0" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/AmundsBlog?a=5kbWeLZJuc0:MpTDg5pJyX8:TzevzKxY174"&gt;&lt;img src="http://feeds.feedburner.com/~ff/AmundsBlog?d=TzevzKxY174" border="0"&gt;&lt;/img&gt;&lt;/a&gt;
&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/AmundsBlog/~4/5kbWeLZJuc0" height="1" width="1"/&gt;</content><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/1024937100240932334/posts/default/9170617812041686476?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/1024937100240932334/posts/default/9170617812041686476?v=2" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/AmundsBlog/~3/5kbWeLZJuc0/evaluation-of-search-predictions-made.html" title="Evaluation of Search Predictions made in May 2000" /><author><name>Amund Tveit</name><uri>https://profiles.google.com/110451251449823277794</uri><email>noreply@blogger.com</email><gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="32" height="32" src="//lh6.googleusercontent.com/-zZKi4b5TYQY/AAAAAAAAAAI/AAAAAAAAAAA/_eaVu-shzqo/s512-c/photo.jpg" /></author><category term="IIR" scheme="http://rss.financialcontent.com/stocksymbol" /><feedburner:origLink>http://amundblog.blogspot.com/2010/05/evaluation-of-search-predictions-made.html</feedburner:origLink></entry><entry gd:etag="W/&quot;A0MDQ3Y8cCp7ImA9WxFQF0U.&quot;"><id>tag:blogger.com,1999:blog-1024937100240932334.post-9152133615076892453</id><published>2010-05-13T23:24:00.000+01:00</published><updated>2010-05-13T23:24:32.878+01:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2010-05-13T23:24:32.878+01:00</app:edited><category scheme="http://www.blogger.com/atom/ns#" term="mapreduce" /><category scheme="http://www.blogger.com/atom/ns#" term="search" /><category scheme="http://www.blogger.com/atom/ns#" term="machine learning" /><category scheme="http://www.blogger.com/atom/ns#" term="ranking" /><category scheme="http://www.blogger.com/atom/ns#" term="hadoop" /><title>Overview of my postings on the Atbrox blog (Nov 2009-May 2010)</title><content type="html">
&lt;p&gt;&lt;a href="http://feedads.g.doubleclick.net/~a/tZxXS07bURqCWT-Ppnu36O0U8v0/0/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/tZxXS07bURqCWT-Ppnu36O0U8v0/0/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;br/&gt;
&lt;a href="http://feedads.g.doubleclick.net/~a/tZxXS07bURqCWT-Ppnu36O0U8v0/1/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/tZxXS07bURqCWT-Ppnu36O0U8v0/1/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;/p&gt;&lt;span class="Apple-style-span" style="color: #333333; font-family: 'Trebuchet MS', Verdana, Arial, sans-serif; font-size: 13px; line-height: 18px;"&gt;As mentioned in a previous posting I mainly write on&lt;/span&gt;&lt;span class="Apple-style-span" style="color: #333333; font-family: 'Trebuchet MS', Verdana, Arial, sans-serif; font-size: 13px; line-height: 18px;"&gt;&amp;nbsp;&lt;/span&gt;&lt;span class="Apple-style-span" style="color: #333333; font-family: 'Trebuchet MS', Verdana, Arial, sans-serif; font-size: 13px; line-height: 18px;"&gt;&lt;a href="http://atbrox.com/about/" style="color: #666666;"&gt;Atbrox's&lt;/a&gt;&lt;/span&gt;&lt;span class="Apple-style-span" style="color: #333333; font-family: 'Trebuchet MS', Verdana, Arial, sans-serif; font-size: 13px; line-height: 18px;"&gt;&amp;nbsp;&lt;/span&gt;&lt;span class="Apple-style-span" style="color: #333333; font-family: 'Trebuchet MS', Verdana, Arial, sans-serif; font-size: 13px; line-height: 18px;"&gt;blog (and not here), in case you haven't&lt;/span&gt;&lt;span class="Apple-style-span" style="color: #333333; font-family: 'Trebuchet MS', Verdana, Arial, sans-serif; font-size: 13px; line-height: 18px;"&gt;&amp;nbsp;seen them, here is an overview of my postings since November 2009 &amp;nbsp;and so far in May 2010:&lt;/span&gt;&lt;br /&gt;
&lt;span class="Apple-style-span" style="color: #333333; font-family: 'Trebuchet MS', Verdana, Arial, sans-serif; font-size: 13px; line-height: 18px;"&gt;&lt;br /&gt;
&lt;/span&gt;&lt;br /&gt;
&lt;span class="Apple-style-span" style="color: #333333; font-family: 'Trebuchet MS', Verdana, Arial, sans-serif; font-size: 13px; line-height: 18px;"&gt;&lt;/span&gt;&lt;br /&gt;
&lt;div style="color: black; font-family: 'Times New Roman'; font-size: medium; line-height: normal; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px;"&gt;&lt;span class="Apple-style-span" style="color: #333333; font-family: 'Trebuchet MS', Verdana, Arial, sans-serif; font-size: small;"&gt;&lt;span class="Apple-style-span" style="font-size: 13px; line-height: 18px;"&gt;&lt;b&gt;Search&lt;/b&gt;&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;div style="color: black; font-family: 'Times New Roman'; font-size: medium; line-height: normal; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px;"&gt;&lt;/div&gt;&lt;ul style="color: black; font-family: 'Times New Roman'; font-size: medium; line-height: normal;"&gt;&lt;li&gt;&lt;span class="Apple-style-span" style="color: #333333; font-family: 'Trebuchet MS', Verdana, Arial, sans-serif; font-size: 13px; line-height: 18px;"&gt;&lt;a href="http://atbrox.com/2010/02/28/initial-thoughts-on-yahoos-ranking-challenge/"&gt;Initial Thoughts on Yahoo's Ranking Challenge&lt;/a&gt;&lt;/span&gt;&lt;/li&gt;
&lt;/ul&gt;&lt;br /&gt;
&lt;span class="Apple-style-span" style="color: #333333; font-family: 'Trebuchet MS', Verdana, Arial, sans-serif; font-size: small;"&gt;&lt;span class="Apple-style-span" style="font-size: 13px; line-height: 18px;"&gt;&lt;b&gt;Hadoop and Mapreduce&lt;/b&gt;&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;
&lt;br /&gt;
&lt;ul&gt;&lt;li&gt;&lt;span class="Apple-style-span" style="color: #333333; font-family: 'Trebuchet MS', Verdana, Arial, sans-serif; font-size: 13px; line-height: 18px;"&gt;&lt;a href="http://atbrox.com/2010/05/08/mapreduce-hadoop-algorithms-in-academic-papers-may-2010-update/"&gt;Mapreduce &amp;amp; Hadoop Algorithms in Academic Papers (3rd Update)&lt;/a&gt;&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span class="Apple-style-span" style="color: #333333; font-family: 'Trebuchet MS', Verdana, Arial, sans-serif; font-size: 13px; line-height: 18px;"&gt;&lt;a href="http://atbrox.com/2010/02/08/parallel-machine-learning-for-hadoopmapreduce-a-python-example/"&gt;Parallel Machine Learning for Hadoop/Mapreduce - a Python Example&lt;/a&gt;&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span class="Apple-style-span" style="color: #333333; font-family: 'Trebuchet MS', Verdana, Arial, sans-serif; font-size: 13px; line-height: 18px;"&gt;&lt;a href="http://atbrox.com/2010/02/17/hadoop/"&gt;So, what is Hadoop?&lt;/a&gt;&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="http://atbrox.com/2009/11/14/atbrox-customer-case-study-scalable-language-processing-with-elastic-mapreduce-hadoop/"&gt;Atbrox Customer Case Study - Scalable Language Processing with Elastic Mapreduce&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;&lt;br /&gt;
&lt;span class="Apple-style-span" style="color: #333333; font-family: 'Trebuchet MS', Verdana, Arial, sans-serif; font-size: small;"&gt;&lt;span class="Apple-style-span" style="font-size: 13px; line-height: 18px;"&gt;(for even earlier postings on Atbrox check out &lt;a href="http://amundblog.blogspot.com/2009/11/my-latest-postings-on-atbrox-related-to.html"&gt;this overview&lt;/a&gt;)&lt;/span&gt;&lt;/span&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/1024937100240932334-9152133615076892453?l=amundblog.blogspot.com' alt='' /&gt;&lt;/div&gt;&lt;div class="feedflare"&gt;
&lt;a href="http://feeds.feedburner.com/~ff/AmundsBlog?a=gvc84htADqw:XClzYRAnSPU:yIl2AUoC8zA"&gt;&lt;img src="http://feeds.feedburner.com/~ff/AmundsBlog?d=yIl2AUoC8zA" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/AmundsBlog?a=gvc84htADqw:XClzYRAnSPU:F7zBnMyn0Lo"&gt;&lt;img src="http://feeds.feedburner.com/~ff/AmundsBlog?i=gvc84htADqw:XClzYRAnSPU:F7zBnMyn0Lo" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/AmundsBlog?a=gvc84htADqw:XClzYRAnSPU:63t7Ie-LG7Y"&gt;&lt;img src="http://feeds.feedburner.com/~ff/AmundsBlog?d=63t7Ie-LG7Y" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/AmundsBlog?a=gvc84htADqw:XClzYRAnSPU:V_sGLiPBpWU"&gt;&lt;img src="http://feeds.feedburner.com/~ff/AmundsBlog?i=gvc84htADqw:XClzYRAnSPU:V_sGLiPBpWU" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/AmundsBlog?a=gvc84htADqw:XClzYRAnSPU:qj6IDK7rITs"&gt;&lt;img src="http://feeds.feedburner.com/~ff/AmundsBlog?d=qj6IDK7rITs" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/AmundsBlog?a=gvc84htADqw:XClzYRAnSPU:gIN9vFwOqvQ"&gt;&lt;img src="http://feeds.feedburner.com/~ff/AmundsBlog?i=gvc84htADqw:XClzYRAnSPU:gIN9vFwOqvQ" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/AmundsBlog?a=gvc84htADqw:XClzYRAnSPU:dnMXMwOfBR0"&gt;&lt;img src="http://feeds.feedburner.com/~ff/AmundsBlog?d=dnMXMwOfBR0" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/AmundsBlog?a=gvc84htADqw:XClzYRAnSPU:7Q72WNTAKBA"&gt;&lt;img src="http://feeds.feedburner.com/~ff/AmundsBlog?d=7Q72WNTAKBA" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/AmundsBlog?a=gvc84htADqw:XClzYRAnSPU:KwTdNBX3Jqk"&gt;&lt;img src="http://feeds.feedburner.com/~ff/AmundsBlog?i=gvc84htADqw:XClzYRAnSPU:KwTdNBX3Jqk" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/AmundsBlog?a=gvc84htADqw:XClzYRAnSPU:l6gmwiTKsz0"&gt;&lt;img src="http://feeds.feedburner.com/~ff/AmundsBlog?d=l6gmwiTKsz0" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/AmundsBlog?a=gvc84htADqw:XClzYRAnSPU:TzevzKxY174"&gt;&lt;img src="http://feeds.feedburner.com/~ff/AmundsBlog?d=TzevzKxY174" border="0"&gt;&lt;/img&gt;&lt;/a&gt;
&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/AmundsBlog/~4/gvc84htADqw" height="1" width="1"/&gt;</content><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/1024937100240932334/posts/default/9152133615076892453?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/1024937100240932334/posts/default/9152133615076892453?v=2" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/AmundsBlog/~3/gvc84htADqw/overview-of-my-postings-on-atbrox-blog.html" title="Overview of my postings on the Atbrox blog (Nov 2009-May 2010)" /><author><name>Amund Tveit</name><uri>https://profiles.google.com/110451251449823277794</uri><email>noreply@blogger.com</email><gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="32" height="32" src="//lh6.googleusercontent.com/-zZKi4b5TYQY/AAAAAAAAAAI/AAAAAAAAAAA/_eaVu-shzqo/s512-c/photo.jpg" /></author><feedburner:origLink>http://amundblog.blogspot.com/2010/05/overview-of-my-postings-on-atbrox-blog.html</feedburner:origLink></entry><entry gd:etag="W/&quot;DUcER3kzeCp7ImA9WxBXE0s.&quot;"><id>tag:blogger.com,1999:blog-1024937100240932334.post-3959832335747507669</id><published>2010-01-24T22:03:00.000+01:00</published><updated>2010-01-24T22:03:26.780+01:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2010-01-24T22:03:26.780+01:00</app:edited><category scheme="http://www.blogger.com/atom/ns#" term="search informationretrieval selfindexing" /><title>My recent reads in Information Retrieval - Indexing</title><content type="html">
&lt;p&gt;&lt;a href="http://feedads.g.doubleclick.net/~a/EV5008FJg72ouh-48Dw5SIpBgUQ/0/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/EV5008FJg72ouh-48Dw5SIpBgUQ/0/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;br/&gt;
&lt;a href="http://feedads.g.doubleclick.net/~a/EV5008FJg72ouh-48Dw5SIpBgUQ/1/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/EV5008FJg72ouh-48Dw5SIpBgUQ/1/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;/p&gt;&lt;div style="height: 0px;"&gt;&lt;br /&gt;
&lt;/div&gt;&lt;div style="margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px;"&gt;Information Retrieval (IR) - better known as Search - is probably the most exciting research field I know of, the reasons that makes IR exciting are:&lt;br /&gt;
&lt;/div&gt;&lt;div&gt;&lt;ul&gt;&lt;li&gt;&lt;b&gt;solvability &lt;/b&gt;- it can probably never be solved perfectly, but always be improved&lt;/li&gt;
&lt;li&gt;&lt;b&gt;coverage &lt;/b&gt;- it spans all areas of computer science and touches many other sciences (e.g. statistics)&lt;/li&gt;
&lt;li&gt;&lt;b&gt;importance &lt;/b&gt;- it is the most important research area related to supporting human decisions? (~AI)&lt;/li&gt;
&lt;li&gt;&lt;b&gt;difficulty&amp;nbsp;&lt;/b&gt;- it is extremely hard to do well&lt;/li&gt;
&lt;li&gt;&lt;b&gt;applicability &lt;/b&gt;- it can be used practically anywhere (anytime).&lt;/li&gt;
&lt;/ul&gt;&lt;div&gt;&lt;b&gt;Where to start learning about information retrieval?&lt;/b&gt;&lt;br /&gt;
&lt;/div&gt;&lt;div&gt;Before jumping into research papers I suggest reading a book about IR, either:&lt;br /&gt;
&lt;a href="http://www.amazon.com/Search-Engines-Information-Retrieval-Practice/dp/0136072240?ie=UTF8&amp;amp;tag=amuw-20&amp;amp;link_code=btl&amp;amp;camp=213689&amp;amp;creative=392969" target="_blank"&gt;Search Engines: Information Retrieval in Practice&lt;/a&gt;&lt;img alt="" border="0" height="1" src="http://www.assoc-amazon.com/e/ir?t=amuw-20&amp;amp;l=btl&amp;amp;camp=213689&amp;amp;creative=392969&amp;amp;o=1&amp;amp;a=0136072240" style="border: none !important; margin: 0px !important; padding: 0px !important;" width="1" /&gt; (2009) or&lt;br /&gt;
&lt;a href="http://www.amazon.com/Introduction-Information-Retrieval-Christopher-Manning/dp/0521865719?ie=UTF8&amp;amp;tag=amuw-20&amp;amp;link_code=btl&amp;amp;camp=213689&amp;amp;creative=392969" target="_blank"&gt;Introduction to Information Retrieval&lt;/a&gt;&lt;img alt="" border="0" height="1" src="http://www.assoc-amazon.com/e/ir?t=amuw-20&amp;amp;l=btl&amp;amp;camp=213689&amp;amp;creative=392969&amp;amp;o=1&amp;amp;a=0521865719" style="border: none !important; margin: 0px !important; padding: 0px !important;" width="1" /&gt; (2008)&lt;br /&gt;
They are both good and relatively similar books written by a mix of authors from search industry and academic IR research (note: &lt;i&gt;I personally prefer the newest one&lt;/i&gt;).&lt;br /&gt;
&lt;br /&gt;
&lt;b&gt;My recent reads in Information Retrieval?&lt;/b&gt;&lt;br /&gt;
&lt;b&gt;&lt;br /&gt;
&lt;/b&gt;&lt;br /&gt;
&lt;b&gt;Indexing - algorithms and datastructures for self-indexing&lt;/b&gt;&lt;br /&gt;
&lt;/div&gt;&lt;div&gt;Self-indexing is&amp;nbsp;where (lossless) compression meets indexing, and is an alternative to the classic inverted index. Self-indices has some nice characteristics wrt compression, performance and query-flexibility. Indexing-research-rockstar &lt;a href="http://www.dcc.uchile.cl/~gnavarro/publ.html"&gt;Gonzalo Navarro&lt;/a&gt; even called it&amp;nbsp;&lt;a href="http://www.stringology.org/event/2009/psc09p01_presentation.pdf"&gt;the Miracle of Self-indexing&lt;/a&gt;&amp;nbsp;(2009).&lt;br /&gt;
2 key papers in the field are:&lt;br /&gt;
&lt;ol&gt;&lt;li&gt;&lt;a href="http://citeseerx.ist.psu.edu/viewdoc/download?doi=10.1.1.4.1585&amp;amp;rep=rep1&amp;amp;type=pdf"&gt;Opportunistic Data Structures with Application&lt;/a&gt;s (2000)&lt;/li&gt;

&lt;ul&gt;&lt;li&gt;Introduced the FM-index&lt;/li&gt;
&lt;/ul&gt;
&lt;li&gt;&lt;a href="http://portal.acm.org/citation.cfm?id=644108.644250"&gt;High-order entropy-compressed text indexes&lt;/a&gt; (2003)&lt;/li&gt;

&lt;ul&gt;&lt;li&gt;Introduced the Wavelet Index Tree&lt;/li&gt;
&lt;/ul&gt;
&lt;/ol&gt;Check out &lt;a href="http://www.dcc.uchile.cl/~gnavarro/publ.html"&gt;Navarro's&lt;/a&gt; survey paper&amp;nbsp;&lt;a href="http://www.dcc.uchile.cl/~gnavarro/ps/acmcs06.pdf"&gt;Compressed Full-Text Indexes&lt;/a&gt;&amp;nbsp;(2007) for a good overview of self-indexing.&lt;br /&gt;
&lt;br /&gt;
&lt;span style="color: blue;"&gt;Have a nice read :)&lt;/span&gt;&lt;br /&gt;
&lt;/div&gt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/1024937100240932334-3959832335747507669?l=amundblog.blogspot.com' alt='' /&gt;&lt;/div&gt;&lt;div class="feedflare"&gt;
&lt;a href="http://feeds.feedburner.com/~ff/AmundsBlog?a=hOUganYm1W8:-hbAKSDpvZE:yIl2AUoC8zA"&gt;&lt;img src="http://feeds.feedburner.com/~ff/AmundsBlog?d=yIl2AUoC8zA" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/AmundsBlog?a=hOUganYm1W8:-hbAKSDpvZE:F7zBnMyn0Lo"&gt;&lt;img src="http://feeds.feedburner.com/~ff/AmundsBlog?i=hOUganYm1W8:-hbAKSDpvZE:F7zBnMyn0Lo" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/AmundsBlog?a=hOUganYm1W8:-hbAKSDpvZE:63t7Ie-LG7Y"&gt;&lt;img src="http://feeds.feedburner.com/~ff/AmundsBlog?d=63t7Ie-LG7Y" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/AmundsBlog?a=hOUganYm1W8:-hbAKSDpvZE:V_sGLiPBpWU"&gt;&lt;img src="http://feeds.feedburner.com/~ff/AmundsBlog?i=hOUganYm1W8:-hbAKSDpvZE:V_sGLiPBpWU" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/AmundsBlog?a=hOUganYm1W8:-hbAKSDpvZE:qj6IDK7rITs"&gt;&lt;img src="http://feeds.feedburner.com/~ff/AmundsBlog?d=qj6IDK7rITs" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/AmundsBlog?a=hOUganYm1W8:-hbAKSDpvZE:gIN9vFwOqvQ"&gt;&lt;img src="http://feeds.feedburner.com/~ff/AmundsBlog?i=hOUganYm1W8:-hbAKSDpvZE:gIN9vFwOqvQ" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/AmundsBlog?a=hOUganYm1W8:-hbAKSDpvZE:dnMXMwOfBR0"&gt;&lt;img src="http://feeds.feedburner.com/~ff/AmundsBlog?d=dnMXMwOfBR0" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/AmundsBlog?a=hOUganYm1W8:-hbAKSDpvZE:7Q72WNTAKBA"&gt;&lt;img src="http://feeds.feedburner.com/~ff/AmundsBlog?d=7Q72WNTAKBA" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/AmundsBlog?a=hOUganYm1W8:-hbAKSDpvZE:KwTdNBX3Jqk"&gt;&lt;img src="http://feeds.feedburner.com/~ff/AmundsBlog?i=hOUganYm1W8:-hbAKSDpvZE:KwTdNBX3Jqk" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/AmundsBlog?a=hOUganYm1W8:-hbAKSDpvZE:l6gmwiTKsz0"&gt;&lt;img src="http://feeds.feedburner.com/~ff/AmundsBlog?d=l6gmwiTKsz0" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/AmundsBlog?a=hOUganYm1W8:-hbAKSDpvZE:TzevzKxY174"&gt;&lt;img src="http://feeds.feedburner.com/~ff/AmundsBlog?d=TzevzKxY174" border="0"&gt;&lt;/img&gt;&lt;/a&gt;
&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/AmundsBlog/~4/hOUganYm1W8" height="1" width="1"/&gt;</content><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/1024937100240932334/posts/default/3959832335747507669?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/1024937100240932334/posts/default/3959832335747507669?v=2" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/AmundsBlog/~3/hOUganYm1W8/my-recent-reads-in-information.html" title="My recent reads in Information Retrieval - Indexing" /><author><name>Amund Tveit</name><uri>https://profiles.google.com/110451251449823277794</uri><email>noreply@blogger.com</email><gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="32" height="32" src="//lh6.googleusercontent.com/-zZKi4b5TYQY/AAAAAAAAAAI/AAAAAAAAAAA/_eaVu-shzqo/s512-c/photo.jpg" /></author><category term="IR" scheme="http://rss.financialcontent.com/stocksymbol" /><feedburner:origLink>http://amundblog.blogspot.com/2010/01/my-recent-reads-in-information.html</feedburner:origLink></entry><entry gd:etag="W/&quot;CkMNQXs5cSp7ImA9WxNaEEg.&quot;"><id>tag:blogger.com,1999:blog-1024937100240932334.post-3347061328874199726</id><published>2009-11-24T09:12:00.001+01:00</published><updated>2009-11-24T09:14:50.529+01:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2009-11-24T09:14:50.529+01:00</app:edited><category scheme="http://www.blogger.com/atom/ns#" term="atbrox" /><category scheme="http://www.blogger.com/atom/ns#" term="mapreduce" /><category scheme="http://www.blogger.com/atom/ns#" term="search" /><category scheme="http://www.blogger.com/atom/ns#" term="hadoop" /><title>My latest postings (on Atbrox) related to Hadoop/Mapreduce &amp; Search</title><content type="html">
&lt;p&gt;&lt;a href="http://feedads.g.doubleclick.net/~a/mQwyy8ay7ADRF7-M3ly9jqTM6l0/0/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/mQwyy8ay7ADRF7-M3ly9jqTM6l0/0/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;br/&gt;
&lt;a href="http://feedads.g.doubleclick.net/~a/mQwyy8ay7ADRF7-M3ly9jqTM6l0/1/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/mQwyy8ay7ADRF7-M3ly9jqTM6l0/1/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;/p&gt;As mentioned in a previous posting I mainly write on &lt;a href="http://atbrox.com/about/"&gt;Atbrox's&lt;/a&gt; blog, here are my postings in October and (so far in) November.&lt;br /&gt;&lt;div&gt;&lt;br /&gt;&lt;ul&gt;&lt;li&gt;&lt;strong&gt;Search&lt;/strong&gt;&lt;br /&gt;&lt;br /&gt;&lt;ul&gt;&lt;li&gt;&lt;a href="http://atbrox.com/2009/11/04/preliminary-experiences-crawling-with-80legs/"&gt;Preliminary Experiences Crawling with 80legs&lt;/a&gt;&lt;br /&gt;&lt;/li&gt;&lt;li&gt;&lt;a href="http://atbrox.com/2009/10/27/unstructuredsearchforsimpledb/"&gt;Unstructured Search for Amazon’s SimpleDB&lt;/a&gt;&lt;/li&gt;&lt;/ul&gt;&lt;br /&gt;&lt;br /&gt;&lt;/li&gt;&lt;/ul&gt;&lt;ul&gt;&lt;li&gt;&lt;strong&gt;Hadoop and Mapreduce&lt;/strong&gt;&lt;br /&gt;&lt;br /&gt;&lt;ul&gt;&lt;li&gt;&lt;a href="http://atbrox.com/2009/11/11/how-to-combine-elastic-mapreducehadoop-with-other-amazon-web-services/"&gt;How to Combine Elastic Mapreduce/Hadoop with other Amazon Web Services&lt;/a&gt;&lt;br /&gt;&lt;/li&gt;&lt;li&gt;&lt;a href="http://atbrox.com/2009/10/07/how-to-use-c-compiled-python-for-amazons-elastic-mapreduce-hadoop/"&gt;How to use C++ Compiled Python for Amazon’s Elastic Mapreduce (Hadoop)&lt;/a&gt;&lt;/li&gt;&lt;li&gt;&lt;a href="http://atbrox.com/2009/10/01/mapreduce-and-hadoop-academic-papers/"&gt;Mapreduce &amp;amp; Hadoop Algorithms in Academic Papers&lt;/a&gt;&lt;/li&gt;&lt;li&gt;&lt;a href="http://atbrox.com/2009/10/03/hadoop-world-2009-notes-from-application-session/"&gt;Hadoop World NYC - notes from application session&lt;/a&gt;&lt;/li&gt;&lt;li&gt;&lt;a href="http://atbrox.com/2009/10/02/hadoop-world-2009-some-notes-from-morning-session/"&gt;Hadoop World NYC - notes from morning session&lt;/a&gt;&lt;/li&gt;&lt;/ul&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;ul&gt;&lt;/ul&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&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/1024937100240932334-3347061328874199726?l=amundblog.blogspot.com' alt='' /&gt;&lt;/div&gt;&lt;div class="feedflare"&gt;
&lt;a href="http://feeds.feedburner.com/~ff/AmundsBlog?a=4y-TTQ7DV5Q:caOfklKyEFI:yIl2AUoC8zA"&gt;&lt;img src="http://feeds.feedburner.com/~ff/AmundsBlog?d=yIl2AUoC8zA" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/AmundsBlog?a=4y-TTQ7DV5Q:caOfklKyEFI:F7zBnMyn0Lo"&gt;&lt;img src="http://feeds.feedburner.com/~ff/AmundsBlog?i=4y-TTQ7DV5Q:caOfklKyEFI:F7zBnMyn0Lo" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/AmundsBlog?a=4y-TTQ7DV5Q:caOfklKyEFI:63t7Ie-LG7Y"&gt;&lt;img src="http://feeds.feedburner.com/~ff/AmundsBlog?d=63t7Ie-LG7Y" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/AmundsBlog?a=4y-TTQ7DV5Q:caOfklKyEFI:V_sGLiPBpWU"&gt;&lt;img src="http://feeds.feedburner.com/~ff/AmundsBlog?i=4y-TTQ7DV5Q:caOfklKyEFI:V_sGLiPBpWU" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/AmundsBlog?a=4y-TTQ7DV5Q:caOfklKyEFI:qj6IDK7rITs"&gt;&lt;img src="http://feeds.feedburner.com/~ff/AmundsBlog?d=qj6IDK7rITs" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/AmundsBlog?a=4y-TTQ7DV5Q:caOfklKyEFI:gIN9vFwOqvQ"&gt;&lt;img src="http://feeds.feedburner.com/~ff/AmundsBlog?i=4y-TTQ7DV5Q:caOfklKyEFI:gIN9vFwOqvQ" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/AmundsBlog?a=4y-TTQ7DV5Q:caOfklKyEFI:dnMXMwOfBR0"&gt;&lt;img src="http://feeds.feedburner.com/~ff/AmundsBlog?d=dnMXMwOfBR0" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/AmundsBlog?a=4y-TTQ7DV5Q:caOfklKyEFI:7Q72WNTAKBA"&gt;&lt;img src="http://feeds.feedburner.com/~ff/AmundsBlog?d=7Q72WNTAKBA" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/AmundsBlog?a=4y-TTQ7DV5Q:caOfklKyEFI:KwTdNBX3Jqk"&gt;&lt;img src="http://feeds.feedburner.com/~ff/AmundsBlog?i=4y-TTQ7DV5Q:caOfklKyEFI:KwTdNBX3Jqk" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/AmundsBlog?a=4y-TTQ7DV5Q:caOfklKyEFI:l6gmwiTKsz0"&gt;&lt;img src="http://feeds.feedburner.com/~ff/AmundsBlog?d=l6gmwiTKsz0" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/AmundsBlog?a=4y-TTQ7DV5Q:caOfklKyEFI:TzevzKxY174"&gt;&lt;img src="http://feeds.feedburner.com/~ff/AmundsBlog?d=TzevzKxY174" border="0"&gt;&lt;/img&gt;&lt;/a&gt;
&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/AmundsBlog/~4/4y-TTQ7DV5Q" height="1" width="1"/&gt;</content><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/1024937100240932334/posts/default/3347061328874199726?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/1024937100240932334/posts/default/3347061328874199726?v=2" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/AmundsBlog/~3/4y-TTQ7DV5Q/my-latest-postings-on-atbrox-related-to.html" title="My latest postings (on Atbrox) related to Hadoop/Mapreduce &amp; Search" /><author><name>Amund Tveit</name><uri>https://profiles.google.com/110451251449823277794</uri><email>noreply@blogger.com</email><gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="32" height="32" src="//lh6.googleusercontent.com/-zZKi4b5TYQY/AAAAAAAAAAI/AAAAAAAAAAA/_eaVu-shzqo/s512-c/photo.jpg" /></author><feedburner:origLink>http://amundblog.blogspot.com/2009/11/my-latest-postings-on-atbrox-related-to.html</feedburner:origLink></entry><entry gd:etag="W/&quot;CEMGSXw4eyp7ImA9WxNXGUw.&quot;"><id>tag:blogger.com,1999:blog-1024937100240932334.post-210358024055023955</id><published>2009-10-07T11:47:00.000+01:00</published><updated>2009-10-07T11:47:08.233+01:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2009-10-07T11:47:08.233+01:00</app:edited><title>From now on mainly blogging on Atbrox.com's blog</title><content type="html">
&lt;p&gt;&lt;a href="http://feedads.g.doubleclick.net/~a/MBT2q6q9ITTwd4rwWFxL1GvU5xw/0/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/MBT2q6q9ITTwd4rwWFxL1GvU5xw/0/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;br/&gt;
&lt;a href="http://feedads.g.doubleclick.net/~a/MBT2q6q9ITTwd4rwWFxL1GvU5xw/1/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/MBT2q6q9ITTwd4rwWFxL1GvU5xw/1/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;/p&gt;&lt;a href="http://atbrox.com/"&gt;Atbrox &lt;/a&gt;is my new startup company (I left Google 1 month ago after 4 exciting years).&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/1024937100240932334-210358024055023955?l=amundblog.blogspot.com' alt='' /&gt;&lt;/div&gt;&lt;div class="feedflare"&gt;
&lt;a href="http://feeds.feedburner.com/~ff/AmundsBlog?a=AD-D-U-hVkk:p8dp9cTfaeY:yIl2AUoC8zA"&gt;&lt;img src="http://feeds.feedburner.com/~ff/AmundsBlog?d=yIl2AUoC8zA" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/AmundsBlog?a=AD-D-U-hVkk:p8dp9cTfaeY:F7zBnMyn0Lo"&gt;&lt;img src="http://feeds.feedburner.com/~ff/AmundsBlog?i=AD-D-U-hVkk:p8dp9cTfaeY:F7zBnMyn0Lo" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/AmundsBlog?a=AD-D-U-hVkk:p8dp9cTfaeY:63t7Ie-LG7Y"&gt;&lt;img src="http://feeds.feedburner.com/~ff/AmundsBlog?d=63t7Ie-LG7Y" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/AmundsBlog?a=AD-D-U-hVkk:p8dp9cTfaeY:V_sGLiPBpWU"&gt;&lt;img src="http://feeds.feedburner.com/~ff/AmundsBlog?i=AD-D-U-hVkk:p8dp9cTfaeY:V_sGLiPBpWU" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/AmundsBlog?a=AD-D-U-hVkk:p8dp9cTfaeY:qj6IDK7rITs"&gt;&lt;img src="http://feeds.feedburner.com/~ff/AmundsBlog?d=qj6IDK7rITs" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/AmundsBlog?a=AD-D-U-hVkk:p8dp9cTfaeY:gIN9vFwOqvQ"&gt;&lt;img src="http://feeds.feedburner.com/~ff/AmundsBlog?i=AD-D-U-hVkk:p8dp9cTfaeY:gIN9vFwOqvQ" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/AmundsBlog?a=AD-D-U-hVkk:p8dp9cTfaeY:dnMXMwOfBR0"&gt;&lt;img src="http://feeds.feedburner.com/~ff/AmundsBlog?d=dnMXMwOfBR0" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/AmundsBlog?a=AD-D-U-hVkk:p8dp9cTfaeY:7Q72WNTAKBA"&gt;&lt;img src="http://feeds.feedburner.com/~ff/AmundsBlog?d=7Q72WNTAKBA" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/AmundsBlog?a=AD-D-U-hVkk:p8dp9cTfaeY:KwTdNBX3Jqk"&gt;&lt;img src="http://feeds.feedburner.com/~ff/AmundsBlog?i=AD-D-U-hVkk:p8dp9cTfaeY:KwTdNBX3Jqk" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/AmundsBlog?a=AD-D-U-hVkk:p8dp9cTfaeY:l6gmwiTKsz0"&gt;&lt;img src="http://feeds.feedburner.com/~ff/AmundsBlog?d=l6gmwiTKsz0" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/AmundsBlog?a=AD-D-U-hVkk:p8dp9cTfaeY:TzevzKxY174"&gt;&lt;img src="http://feeds.feedburner.com/~ff/AmundsBlog?d=TzevzKxY174" border="0"&gt;&lt;/img&gt;&lt;/a&gt;
&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/AmundsBlog/~4/AD-D-U-hVkk" height="1" width="1"/&gt;</content><link rel="related" href="http://atbrox.com" title="From now on mainly blogging on Atbrox.com's blog" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/1024937100240932334/posts/default/210358024055023955?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/1024937100240932334/posts/default/210358024055023955?v=2" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/AmundsBlog/~3/AD-D-U-hVkk/from-now-on-mainly-blogging-on.html" title="From now on mainly blogging on Atbrox.com's blog" /><author><name>Amund Tveit</name><uri>https://profiles.google.com/110451251449823277794</uri><email>noreply@blogger.com</email><gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="32" height="32" src="//lh6.googleusercontent.com/-zZKi4b5TYQY/AAAAAAAAAAI/AAAAAAAAAAA/_eaVu-shzqo/s512-c/photo.jpg" /></author><feedburner:origLink>http://amundblog.blogspot.com/2009/10/from-now-on-mainly-blogging-on.html</feedburner:origLink></entry><entry gd:etag="W/&quot;DkYNRH88cCp7ImA9WxVVFUg.&quot;"><id>tag:blogger.com,1999:blog-1024937100240932334.post-7328959644058281143</id><published>2009-03-08T23:24:00.011+01:00</published><updated>2009-03-09T00:16:35.178+01:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2009-03-09T00:16:35.178+01:00</app:edited><category scheme="http://www.blogger.com/atom/ns#" term="cloud" /><category scheme="http://www.blogger.com/atom/ns#" term="cinpy" /><category scheme="http://www.blogger.com/atom/ns#" term="mobile agents" /><category scheme="http://www.blogger.com/atom/ns#" term="python" /><category scheme="http://www.blogger.com/atom/ns#" term="parallel" /><title>Snakes on a Cloud</title><content type="html">
&lt;p&gt;&lt;a href="http://feedads.g.doubleclick.net/~a/GiafAgxhQntBkFikprcgmn-BDao/0/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/GiafAgxhQntBkFikprcgmn-BDao/0/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;br/&gt;
&lt;a href="http://feedads.g.doubleclick.net/~a/GiafAgxhQntBkFikprcgmn-BDao/1/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/GiafAgxhQntBkFikprcgmn-BDao/1/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;/p&gt;&lt;div style="text-align: center;"&gt;&lt;span class="Apple-style-span" style="font-weight: bold; "&gt;.. or Mobile Agents with Python&lt;/span&gt;&lt;/div&gt;&lt;br /&gt;&lt;b&gt;&lt;span class="Apple-style-span"  style="font-size:large;"&gt;What are mobile agents?&lt;br /&gt;&lt;/span&gt;&lt;/b&gt;&lt;i&gt;"A mobile agent is a process that can transport its state from one environment to another, &lt;span class="Apple-style-span"  style="color:#3333FF;"&gt;with its data&lt;/span&gt; intact, and be capable of performing appropriately in the new environment"&lt;/i&gt;, source: &lt;a href="http://en.wikipedia.org/wiki/Mobile_agent"&gt;Wikipedia&lt;/a&gt;.&lt;div&gt;&lt;br /&gt;&lt;b&gt;Why Mobile Agents .. or how to deal with Data Gravity&lt;/b&gt;&lt;br /&gt;The phrase &lt;i&gt;&lt;span class="Apple-style-span"  style="color:#3333FF;"&gt;"with its data"&lt;/span&gt;&lt;/i&gt; most likely refers to the agent's state data (and not all types of data), since one of the nicest properties of mobile agents is that they can move to where potentially huge amounts of data is. By plotting the curve "data gravity" - i.e. a rough estimate of how long time it takes to empty/fill/process a hard drive over a network connection -  hard disk size divided by (typical) ethernet network speed over the last 20 years - the motivation for moving code to data (and not vice versa) is clearly increasing, making mobile agents a potentially interesting approach.&lt;div&gt;&lt;img src="http://2.bp.blogspot.com/_2DnUjV2gKmw/SbRI-GKLf6I/AAAAAAAAD3k/gh5WCxMTGjc/s400/datagravity.png" style="display:block; margin:0px auto 10px; text-align:center;cursor:pointer; cursor:hand;width: 400px; height: 300px;" border="0" alt="" id="BLOGGER_PHOTO_ID_5310950092219056034" /&gt;&lt;figure here=""&gt;&lt;br /&gt;&lt;/figure&gt;&lt;div&gt;&lt;figure here=""&gt;&lt;b&gt;&lt;span class="Apple-style-span"  style="font-size:large;"&gt;Mobile Agent Runtime Environment&lt;/span&gt;&lt;/b&gt;&lt;/figure&gt;&lt;/div&gt;&lt;div&gt;&lt;figure here=""&gt;A basic requirement for a mobile agent runtime environment is the ability to receive and run the agent's code, e.g. typically  support one/several of the following (with Python-related examples):&lt;br /&gt;i) receive and run binary code&lt;br /&gt;python example: receive python compiled to binary with Shedskin and g++&lt;br /&gt;ii) receive and compile source code and run it&lt;br /&gt;python example: receive c source code and compile/integrate it with Python using Cinpy, or use Shedskin/g++ on received Python code&lt;br /&gt;iii) receive and run interpreter on source code&lt;br /&gt;python example: receive python code and interpret using the eval() method.&lt;br /&gt;&lt;br /&gt;&lt;b&gt;&lt;span class="Apple-style-span"  style="font-size:large;"&gt;Bandwidth&lt;br /&gt;&lt;/span&gt;&lt;/b&gt;If the mobile agents move around a bit, you probably want their representation as compact as possible to reduce bandwidth requirements, i.e. prefer agents represented in (small amounts of) source code - alternative ii) or iii) - over (larger amounts of) binary code - alternative i).&lt;br /&gt;&lt;br /&gt;&lt;b&gt;&lt;span class="Apple-style-span"  style="font-size:large;"&gt;Processing&lt;br /&gt;&lt;/span&gt;&lt;/b&gt;compiled code (or just-in-time compiled code) is usually more efficient than interpreted code (interpreted code can perhaps be seen as analog to the &lt;i&gt;"gas guzzling cars"&lt;/i&gt; of computing wrt resource utilization, fortunately there are tools to deal with that), so alternative ii) is probably preferred over iii), and with the cinpy case compilation overhead is negligible (a few milliseconds to compile and make a short C method ready to be called from Python), which matter if you have a large amount of distributed mobile agents. Pareto principle also matters for mobile agents, so a mix (80-99% of code) in interpreted Python and the things that really need to perform in C (quickly compiled with cinpy)  might be a common mix.&lt;br /&gt;&lt;br /&gt;&lt;b&gt;Example of Cinpy-wrapped C function in python&lt;br /&gt;&lt;/b&gt;&lt;span class="Apple-style-span"  style="font-size:small;"&gt;&lt;span class="Apple-style-span"  style="color:#006600;"&gt;fibc=cinpy.defc(&lt;br /&gt;"fib",&lt;br /&gt;ctypes.CFUNCTYPE(ctypes.c_int,ctypes.c_int),&lt;br /&gt;"""&lt;br /&gt;int fib(int x) {&lt;br /&gt;  if (x&lt;=1) return 1;       return fib(x-1)+fib(x-2);     }     """)&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;b&gt;&lt;span class="Apple-style-span"  style="font-size:large;"&gt;Security&lt;/span&gt;&lt;/b&gt;&lt;br /&gt;In case mobile agents move around on the cloud it is nice to know that the agent you receive is from a known source (yourself), this can e.g. be done using &lt;a href="http://www.freenet.org.nz/ezPyCrypto/"&gt;ezPyCrypto&lt;/a&gt;'s &lt;a href="http://www.freenet.org.nz/ezPyCrypto/detail/public/ezPyCrypto.key-class.html#signString"&gt;signString&lt;/a&gt;() to sign the agent source and then use &lt;a href="http://www.freenet.org.nz/ezPyCrypto/detail/public/ezPyCrypto.key-class.html#verifyString"&gt;verifyString&lt;/a&gt;() methods on the signed agent source code together with its signature to check the origin of the agent (assuming the signer's public key is available on the receiving end).&lt;/figure&gt;&lt;/div&gt;&lt;div&gt;&lt;i&gt;&lt;br /&gt;&lt;/i&gt;&lt;/div&gt;&lt;div&gt;&lt;b&gt;&lt;i&gt;disclaimer&lt;/i&gt;&lt;/b&gt;&lt;i&gt;: this posting (and all others on this blog) only represents my personal views.&lt;/i&gt;&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/1024937100240932334-7328959644058281143?l=amundblog.blogspot.com' alt='' /&gt;&lt;/div&gt;&lt;div class="feedflare"&gt;
&lt;a href="http://feeds.feedburner.com/~ff/AmundsBlog?a=qbMHFep4sVY:7SVWqcI9XAo:yIl2AUoC8zA"&gt;&lt;img src="http://feeds.feedburner.com/~ff/AmundsBlog?d=yIl2AUoC8zA" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/AmundsBlog?a=qbMHFep4sVY:7SVWqcI9XAo:F7zBnMyn0Lo"&gt;&lt;img src="http://feeds.feedburner.com/~ff/AmundsBlog?i=qbMHFep4sVY:7SVWqcI9XAo:F7zBnMyn0Lo" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/AmundsBlog?a=qbMHFep4sVY:7SVWqcI9XAo:63t7Ie-LG7Y"&gt;&lt;img src="http://feeds.feedburner.com/~ff/AmundsBlog?d=63t7Ie-LG7Y" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/AmundsBlog?a=qbMHFep4sVY:7SVWqcI9XAo:V_sGLiPBpWU"&gt;&lt;img src="http://feeds.feedburner.com/~ff/AmundsBlog?i=qbMHFep4sVY:7SVWqcI9XAo:V_sGLiPBpWU" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/AmundsBlog?a=qbMHFep4sVY:7SVWqcI9XAo:qj6IDK7rITs"&gt;&lt;img src="http://feeds.feedburner.com/~ff/AmundsBlog?d=qj6IDK7rITs" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/AmundsBlog?a=qbMHFep4sVY:7SVWqcI9XAo:gIN9vFwOqvQ"&gt;&lt;img src="http://feeds.feedburner.com/~ff/AmundsBlog?i=qbMHFep4sVY:7SVWqcI9XAo:gIN9vFwOqvQ" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/AmundsBlog?a=qbMHFep4sVY:7SVWqcI9XAo:dnMXMwOfBR0"&gt;&lt;img src="http://feeds.feedburner.com/~ff/AmundsBlog?d=dnMXMwOfBR0" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/AmundsBlog?a=qbMHFep4sVY:7SVWqcI9XAo:7Q72WNTAKBA"&gt;&lt;img src="http://feeds.feedburner.com/~ff/AmundsBlog?d=7Q72WNTAKBA" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/AmundsBlog?a=qbMHFep4sVY:7SVWqcI9XAo:KwTdNBX3Jqk"&gt;&lt;img src="http://feeds.feedburner.com/~ff/AmundsBlog?i=qbMHFep4sVY:7SVWqcI9XAo:KwTdNBX3Jqk" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/AmundsBlog?a=qbMHFep4sVY:7SVWqcI9XAo:l6gmwiTKsz0"&gt;&lt;img src="http://feeds.feedburner.com/~ff/AmundsBlog?d=l6gmwiTKsz0" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/AmundsBlog?a=qbMHFep4sVY:7SVWqcI9XAo:TzevzKxY174"&gt;&lt;img src="http://feeds.feedburner.com/~ff/AmundsBlog?d=TzevzKxY174" border="0"&gt;&lt;/img&gt;&lt;/a&gt;
&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/AmundsBlog/~4/qbMHFep4sVY" height="1" width="1"/&gt;</content><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/1024937100240932334/posts/default/7328959644058281143?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/1024937100240932334/posts/default/7328959644058281143?v=2" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/AmundsBlog/~3/qbMHFep4sVY/snakes-on-cloud.html" title="Snakes on a Cloud" /><author><name>Amund Tveit</name><uri>https://profiles.google.com/110451251449823277794</uri><email>noreply@blogger.com</email><gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="32" height="32" src="//lh6.googleusercontent.com/-zZKi4b5TYQY/AAAAAAAAAAI/AAAAAAAAAAA/_eaVu-shzqo/s512-c/photo.jpg" /></author><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="http://2.bp.blogspot.com/_2DnUjV2gKmw/SbRI-GKLf6I/AAAAAAAAD3k/gh5WCxMTGjc/s72-c/datagravity.png" height="72" width="72" /><feedburner:origLink>http://amundblog.blogspot.com/2009/03/snakes-on-cloud.html</feedburner:origLink></entry><entry gd:etag="W/&quot;CEAMR3o4eCp7ImA9WxVUEE4.&quot;"><id>tag:blogger.com,1999:blog-1024937100240932334.post-2634175588260165534</id><published>2008-12-27T01:23:00.013+01:00</published><updated>2009-03-14T13:13:06.430+01:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2009-03-14T13:13:06.430+01:00</app:edited><category scheme="http://www.blogger.com/atom/ns#" term="javascript" /><category scheme="http://www.blogger.com/atom/ns#" term="webpy" /><category scheme="http://www.blogger.com/atom/ns#" term="gwt" /><category scheme="http://www.blogger.com/atom/ns#" term="json-rpc" /><category scheme="http://www.blogger.com/atom/ns#" term="facebook" /><category scheme="http://www.blogger.com/atom/ns#" term="ajax" /><category scheme="http://www.blogger.com/atom/ns#" term="python" /><category scheme="http://www.blogger.com/atom/ns#" term="json" /><category scheme="http://www.blogger.com/atom/ns#" term="appengine" /><title>Ajax with Python - Combining PyJS and Appengine with json-rpc</title><content type="html">
&lt;p&gt;&lt;a href="http://feedads.g.doubleclick.net/~a/shFCapxkkHd6DvaNKN3jpchpikY/0/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/shFCapxkkHd6DvaNKN3jpchpikY/0/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;br/&gt;
&lt;a href="http://feedads.g.doubleclick.net/~a/shFCapxkkHd6DvaNKN3jpchpikY/1/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/shFCapxkkHd6DvaNKN3jpchpikY/1/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;/p&gt;I recently (re)discovered &lt;a href="http://pyjs.org/"&gt;pyjs &lt;/a&gt;&amp;nbsp;- also called Pyjamas - which &amp;nbsp;is a tool to support development of (client-side) Ajax applications with Python, it does that by compiling Python code to Javascript (Pyjamas is inspired by&amp;nbsp;&lt;a href="http://code.google.com/webtoolkit/"&gt;GWT &lt;/a&gt;&amp;nbsp;- which supports writing Ajax applications in Java).&lt;br /&gt;
&lt;br /&gt;
pyjs' kitchensink comes with a &lt;a href="http://en.wikipedia.org/wiki/JSON-RPC"&gt;JSON-RPC&lt;/a&gt; example, this posting shows how to use Appengine to serve as a JSON-RPC server for the pyjs json-rpc example.&lt;br /&gt;
&lt;br /&gt;
&lt;span style="font-weight: bold;"&gt;(Rough) Steps&lt;/span&gt;:&lt;br /&gt;
1) download&amp;nbsp;&lt;a href="http://code.google.com/appengine/downloads.html"&gt;appengine SDK&lt;/a&gt; and create an &lt;a href="http://appengine.google.com/"&gt;appengine application&lt;/a&gt;&amp;nbsp;(in the dashboard)&lt;br /&gt;
2) download&amp;nbsp;&lt;a href="http://sourceforge.net/project/showfiles.php?group_id=239074"&gt;pyjs&amp;nbsp;&lt;/a&gt;&lt;br /&gt;
3) Replace pyjs example/jsonrpc/JSONRPCExample.py with this code&lt;br /&gt;
&lt;br /&gt;
&lt;span style="color: blue;"&gt;from ui import RootPanel, TextArea, Label, Button, HTML, VerticalPanel, HorizontalPanel, ListBox&lt;br /&gt;
&lt;/span&gt;&lt;br /&gt;
&lt;br /&gt;
&lt;span style="color: blue;"&gt;from JSONService import JSONProxy&lt;/span&gt;&lt;br /&gt;
&lt;span style="color: blue;"&gt;&lt;br /&gt;
&lt;/span&gt;&lt;br /&gt;
&lt;span style="color: blue;"&gt;class JSONRPCExample:&lt;/span&gt;&lt;br /&gt;
&lt;span style="color: blue;"&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;def onModuleLoad(self):&lt;/span&gt;&lt;br /&gt;
&lt;span style="color: blue;"&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;self.TEXT_WAITING = "Waiting for response..."&lt;/span&gt;&lt;br /&gt;
&lt;span style="color: blue;"&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;self.TEXT_ERROR = "Server Error"&lt;/span&gt;&lt;br /&gt;
&lt;span style="color: blue;"&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;self.remote_py = UpperServicePython()&lt;/span&gt;&lt;br /&gt;
&lt;span style="color: blue;"&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;self.status=Label()&lt;/span&gt;&lt;br /&gt;
&lt;span style="color: blue;"&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;self.text_area = TextArea()&lt;/span&gt;&lt;br /&gt;
&lt;span style="color: blue;"&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;self.text_area.setText(r"Please uppercase this string")&lt;/span&gt;&lt;br /&gt;
&lt;span style="color: blue;"&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;self.text_area.setCharacterWidth(80)&lt;/span&gt;&lt;br /&gt;
&lt;span style="color: blue;"&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;self.text_area.setVisibleLines(8)&lt;/span&gt;&lt;br /&gt;
&lt;span style="color: blue;"&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;self.button_py = Button("Send to Python Service", self)&lt;/span&gt;&lt;br /&gt;
&lt;span style="color: blue;"&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;buttons = HorizontalPanel()&lt;/span&gt;&lt;br /&gt;
&lt;span style="color: blue;"&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;buttons.add(self.button_py)&lt;/span&gt;&lt;br /&gt;
&lt;span style="color: blue;"&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;buttons.setSpacing(8)&lt;/span&gt;&lt;br /&gt;
&lt;span style="color: blue;"&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;info = r'This example demonstrates the calling of appengine upper(case) method with &lt;a href="http://draft.blogger.com/%22http://json-rpc.org//%22"&gt;JSON-RPC&lt;/a&gt; from javascript (i.e. Python code compiled with pyjs to javascript).'&lt;/span&gt;&lt;br /&gt;
&lt;span style="color: blue;"&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;panel = VerticalPanel()&lt;/span&gt;&lt;br /&gt;
&lt;span style="color: blue;"&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;panel.add(HTML(info))&lt;/span&gt;&lt;br /&gt;
&lt;span style="color: blue;"&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;panel.add(self.text_area)&lt;/span&gt;&lt;br /&gt;
&lt;span style="color: blue;"&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;panel.add(buttons)&lt;/span&gt;&lt;br /&gt;
&lt;span style="color: blue;"&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;panel.add(self.status)&lt;/span&gt;&lt;br /&gt;
&lt;span style="color: blue;"&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;RootPanel().add(panel)&lt;/span&gt;&lt;br /&gt;
&lt;span style="color: blue;"&gt;&lt;br /&gt;
&lt;/span&gt;&lt;br /&gt;
&lt;span style="color: blue;"&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;def onClick(self, sender):&lt;/span&gt;&lt;br /&gt;
&lt;span style="color: blue;"&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;self.status.setText(self.TEXT_WAITING)&lt;/span&gt;&lt;br /&gt;
&lt;span style="color: blue;"&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;text = self.text_area.getText()&lt;/span&gt;&lt;br /&gt;
&lt;span style="color: blue;"&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;if self.remote_py.upper(self.text_area.getText(), self) &amp;lt; 0:&lt;/span&gt;&lt;br /&gt;
&lt;span style="color: blue;"&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;self.status.setText(self.TEXT_ERROR)&lt;/span&gt;&lt;br /&gt;
&lt;span style="color: blue;"&gt;&lt;br /&gt;
&lt;/span&gt;&lt;br /&gt;
&lt;span style="color: blue;"&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;def onRemoteResponse(self, response, request_info):&lt;/span&gt;&lt;br /&gt;
&lt;span style="color: blue;"&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;self.status.setText(response)&lt;/span&gt;&lt;br /&gt;
&lt;span style="color: blue;"&gt;&lt;br /&gt;
&lt;/span&gt;&lt;br /&gt;
&lt;span style="color: blue;"&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;def onRemoteError(self, code, message, request_info):&lt;/span&gt;&lt;br /&gt;
&lt;span style="color: blue;"&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;self.status.setText("Server Error or Invalid Response: ERROR " + code + " - " + message)&lt;/span&gt;&lt;br /&gt;
&lt;span style="color: blue;"&gt;&lt;br /&gt;
&lt;/span&gt;&lt;br /&gt;
&lt;span style="color: blue;"&gt;class UpperServicePython(JSONProxy):&lt;/span&gt;&lt;br /&gt;
&lt;span style="color: blue;"&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;def __init__(self):&lt;/span&gt;&lt;br /&gt;
&lt;span style="color: blue;"&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;JSONProxy.__init__(self, "/json", ["upper"])&lt;/span&gt;&lt;br /&gt;
&lt;span style="color: blue;"&gt;&lt;br /&gt;
&lt;/span&gt;&lt;br /&gt;
&lt;span style="color: blue;"&gt;&lt;span style="color: black;"&gt;&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;
&lt;div style="margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px;"&gt;4) Use the following code for the appengine app&lt;/div&gt;&lt;div style="margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px;"&gt;&lt;/div&gt;&lt;div style="margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px;"&gt;&lt;span style="color: blue;"&gt;from google.appengine.ext import webapp&lt;/span&gt;&lt;/div&gt;&lt;div style="margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px;"&gt;&lt;span style="color: blue;"&gt;from google.appengine.ext.webapp.util import run_wsgi_app&lt;/span&gt;&lt;/div&gt;&lt;div style="margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px;"&gt;&lt;span style="color: blue;"&gt;import logging&lt;/span&gt;&lt;/div&gt;&lt;div style="margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px;"&gt;&lt;span style="color: blue;"&gt;from django.utils import simplejson&lt;/span&gt;&lt;/div&gt;&lt;div style="margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px;"&gt;&lt;span style="color: blue;"&gt;&lt;br /&gt;
&lt;/span&gt;&lt;/div&gt;&lt;div style="margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px;"&gt;&lt;span style="color: blue;"&gt;class JSONHandler(webapp.RequestHandler):&lt;/span&gt;&lt;/div&gt;&lt;div style="margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px;"&gt;&lt;span style="color: blue;"&gt;&amp;nbsp;&amp;nbsp;def json_upper(self,args):&lt;/span&gt;&lt;/div&gt;&lt;div style="margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px;"&gt;&lt;span style="color: blue;"&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;return [args[0].upper()]&lt;/span&gt;&lt;/div&gt;&lt;div style="margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px;"&gt;&lt;span style="color: blue;"&gt;&lt;br /&gt;
&lt;/span&gt;&lt;/div&gt;&lt;div style="margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px;"&gt;&lt;span style="color: blue;"&gt;&amp;nbsp;&amp;nbsp;def post(self):&lt;/span&gt;&lt;/div&gt;&lt;div style="margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px;"&gt;&lt;span style="color: blue;"&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;args = simplejson.loads(self.request.body)&lt;/span&gt;&lt;/div&gt;&lt;div style="margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px;"&gt;&lt;span style="color: blue;"&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;json_func = getattr(self, 'json_%s' % args[u"method"])&lt;/span&gt;&lt;/div&gt;&lt;div style="margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px;"&gt;&lt;span style="color: blue;"&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;json_params = args[u"params"]&lt;/span&gt;&lt;/div&gt;&lt;div style="margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px;"&gt;&lt;span style="color: blue;"&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;json_method_id = args[u"id"]&lt;/span&gt;&lt;/div&gt;&lt;div style="margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px;"&gt;&lt;span style="color: blue;"&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;result = json_func(json_params)&lt;/span&gt;&lt;/div&gt;&lt;div style="margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px;"&gt;&lt;span style="color: blue;"&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;# reuse args to send result back&lt;/span&gt;&lt;/div&gt;&lt;div style="margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px;"&gt;&lt;span style="color: blue;"&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;args.pop(u"method")&lt;/span&gt;&lt;/div&gt;&lt;div style="margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px;"&gt;&lt;span style="color: blue;"&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;args["result"] = result[0]&lt;/span&gt;&lt;/div&gt;&lt;div style="margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px;"&gt;&lt;span style="color: blue;"&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;args["error"] = None # IMPORTANT!!&lt;/span&gt;&lt;/div&gt;&lt;div style="margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px;"&gt;&lt;span style="color: blue;"&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;self.response.headers['Content-Type'] = 'application/json'&lt;/span&gt;&lt;/div&gt;&lt;div style="margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px;"&gt;&lt;span style="color: blue;"&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;self.response.set_status(200)&lt;/span&gt;&lt;/div&gt;&lt;div style="margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px;"&gt;&lt;span style="color: blue;"&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;self.response.out.write(simplejson.dumps(args))&lt;/span&gt;&lt;/div&gt;&lt;div style="margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px;"&gt;&lt;span style="color: blue;"&gt;&lt;br /&gt;
&lt;/span&gt;&lt;/div&gt;&lt;div style="margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px;"&gt;&lt;span style="color: blue;"&gt;application = webapp.WSGIApplication(&lt;/span&gt;&lt;/div&gt;&lt;div style="margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px;"&gt;&lt;span style="color: blue;"&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; [('/json', JSONHandler)],&lt;/span&gt;&lt;/div&gt;&lt;div style="margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px;"&gt;&lt;span style="color: blue;"&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; debug=True)&lt;/span&gt;&lt;/div&gt;&lt;div style="margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px;"&gt;&lt;span style="color: blue;"&gt;&lt;br /&gt;
&lt;/span&gt;&lt;/div&gt;&lt;div style="margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px;"&gt;&lt;span style="color: blue;"&gt;def main():&lt;/span&gt;&lt;/div&gt;&lt;div style="margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px;"&gt;&lt;span style="color: blue;"&gt;&amp;nbsp;&amp;nbsp;run_wsgi_app(application)&lt;/span&gt;&lt;/div&gt;&lt;div style="margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px;"&gt;&lt;span style="color: blue;"&gt;&lt;br /&gt;
&lt;/span&gt;&lt;/div&gt;&lt;div style="margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px;"&gt;&lt;span style="color: blue;"&gt;if __name__ == "__main__":&lt;/span&gt;&lt;/div&gt;&lt;div style="margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px;"&gt;&lt;span style="color: blue;"&gt;&amp;nbsp;&amp;nbsp;main()&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;/div&gt;&lt;div&gt;5) compile pyjs code in 3) and create static dir in appengine app to store compiled code (i.e in app.yaml)&lt;/div&gt;&lt;div&gt;&lt;/div&gt;&lt;div&gt;6) use dev_appserver.py to test locally or appcfg.py to deploy on appengine&lt;/div&gt;&lt;div&gt;&lt;/div&gt;&lt;div&gt;7) a testable version is on&amp;nbsp;&lt;a href="https://testulf3.appspot.com/static/JSONRPCExample.html"&gt;https://testulf3.appspot.com/static/JSONRPCExample.html&lt;/a&gt;&amp;nbsp;.&lt;/div&gt;&lt;div&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;
&lt;span class="Apple-style-span" style="font-weight: bold;"&gt;Facebook application&lt;/span&gt;&lt;br /&gt;
By using &lt;a href="http://googlewebtoolkit.blogspot.com/2008/12/put-your-gwt-app-on-facebook-in-10.html"&gt;this recipe&lt;/a&gt;&amp;nbsp;it was easy to create a facebook app of the example in this posting - check it out at&amp;nbsp;&lt;a href="http://apps.facebook.com/testulf/"&gt;http://apps.facebook.com/testulf/&lt;/a&gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;span class="Apple-style-span" style="font-weight: bold;"&gt;Alternative backend - using webpy&lt;/span&gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;div style="margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px;"&gt;This shows how to use&amp;nbsp;&lt;a href="http://webpy.org/"&gt;webpy&lt;/a&gt;&amp;nbsp;as backend, just put the javascript/html resulting from pyjs compile into the static/ directory. Very similar as the previous approach, with the code in blue being the main diff (i.e. webpy specific)&lt;/div&gt;&lt;div style="margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px;"&gt;&lt;/div&gt;&lt;div style="margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px;"&gt;&lt;span class="Apple-style-span" style="font-family: 'Courier New'; font-size: 13px;"&gt;&lt;span class="Apple-style-span" style="font-size: 12px;"&gt;import web&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;div style="margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px;"&gt;&lt;span class="Apple-style-span" style="font-family: 'Courier New'; font-size: 13px;"&gt;&lt;span class="Apple-style-span" style="font-size: 12px;"&gt;import json&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;div style="margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px;"&gt;&lt;span class="Apple-style-span" style="font-family: 'Courier New'; font-size: 13px;"&gt;&lt;span class="Apple-style-span" style="color: blue;"&gt;&lt;span class="Apple-style-span" style="font-size: 12px;"&gt;urls = (&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;div style="margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px;"&gt;&lt;span class="Apple-style-span" style="font-family: 'Courier New'; font-size: 13px;"&gt;&lt;span class="Apple-style-span" style="color: blue;"&gt;&lt;span class="Apple-style-span" style="font-size: 12px;"&gt;'/json', 'jsonhandler'&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;div style="margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px;"&gt;&lt;span class="Apple-style-span" style="font-family: 'Courier New'; font-size: 13px;"&gt;&lt;span class="Apple-style-span" style="color: blue;"&gt;&lt;span class="Apple-style-span" style="font-size: 12px;"&gt;)&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;div style="margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px;"&gt;&lt;span class="Apple-style-span" style="font-family: 'Courier New'; font-size: 13px;"&gt;&lt;span class="Apple-style-span" style="color: blue;"&gt;&lt;span class="Apple-style-span" style="font-size: 12px;"&gt;app = web.application(urls, globals())&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;div style="margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px;"&gt;&lt;span class="Apple-style-span" style="color: blue; font-family: 'Courier New';"&gt;&lt;span class="Apple-style-span" style="font-size: 13px;"&gt;&lt;br /&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;div style="margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px;"&gt;&lt;span class="Apple-style-span" style="font-family: 'Courier New'; font-size: 13px;"&gt;&lt;span class="Apple-style-span" style="font-size: 12px;"&gt;class jsonhandler:&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;div style="margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px;"&gt;&lt;span class="Apple-style-span" style="font-family: 'Courier New'; font-size: 13px;"&gt;&lt;span class="Apple-style-span" style="font-size: 12px;"&gt;&amp;nbsp;&amp;nbsp;def json_upper(self,args):&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;div style="margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px;"&gt;&lt;span class="Apple-style-span" style="font-family: 'Courier New'; font-size: 13px;"&gt;&lt;span class="Apple-style-span" style="font-size: 12px;"&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;return [args[0].upper()]&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;div style="margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px;"&gt;&lt;span class="Apple-style-span" style="font-family: 'Courier New'; font-size: 13px;"&gt;&lt;span class="Apple-style-span" style="font-size: 12px;"&gt;&lt;br /&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;div style="margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px;"&gt;&lt;span class="Apple-style-span" style="font-family: 'Courier New'; font-size: 13px;"&gt;&lt;span class="Apple-style-span" style="font-size: 12px;"&gt;&amp;nbsp;&amp;nbsp;def json_markdown(self,args):&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;div style="margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px;"&gt;&lt;span class="Apple-style-span" style="font-family: 'Courier New'; font-size: 13px;"&gt;&lt;span class="Apple-style-span" style="font-size: 12px;"&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;return [args[0].lower()]&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;div style="margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px;"&gt;&lt;span class="Apple-style-span" style="font-family: 'Courier New'; font-size: 13px;"&gt;&lt;span class="Apple-style-span" style="font-size: 12px;"&gt;&lt;br /&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;div style="margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px;"&gt;&lt;span class="Apple-style-span" style="font-family: 'Courier New'; font-size: 13px;"&gt;&lt;span class="Apple-style-span" style="font-size: 12px;"&gt;&amp;nbsp;&amp;nbsp;def POST(self):&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;div style="margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px;"&gt;&lt;span class="Apple-style-span" style="font-family: 'Courier New'; font-size: 13px;"&gt;&lt;span class="Apple-style-span" style="font-size: 12px;"&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;args = json.loads(web.data())&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;div style="margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px;"&gt;&lt;span class="Apple-style-span" style="font-family: 'Courier New'; font-size: 13px;"&gt;&lt;span class="Apple-style-span" style="font-size: 12px;"&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;json_func = getattr(self, 'json_%s' % args[u"method"])&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;div style="margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px;"&gt;&lt;span class="Apple-style-span" style="font-family: 'Courier New'; font-size: 13px;"&gt;&lt;span class="Apple-style-span" style="font-size: 12px;"&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;json_params = args[u"params"]&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;div style="margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px;"&gt;&lt;span class="Apple-style-span" style="font-family: 'Courier New'; font-size: 13px;"&gt;&lt;span class="Apple-style-span" style="font-size: 12px;"&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;json_method_id = args[u"id"]&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;div style="margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px;"&gt;&lt;span class="Apple-style-span" style="font-family: 'Courier New'; font-size: 13px;"&gt;&lt;span class="Apple-style-span" style="font-size: 12px;"&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;result = json_func(json_params)&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;div style="margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px;"&gt;&lt;span class="Apple-style-span" style="font-family: 'Courier New'; font-size: 13px;"&gt;&lt;span class="Apple-style-span" style="font-size: 12px;"&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;# reuse args to send result back&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;div style="margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px;"&gt;&lt;span class="Apple-style-span" style="font-family: 'Courier New'; font-size: 13px;"&gt;&lt;span class="Apple-style-span" style="font-size: 12px;"&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;args.pop(u"method")&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;div style="margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px;"&gt;&lt;span class="Apple-style-span" style="font-family: 'Courier New'; font-size: 13px;"&gt;&lt;span class="Apple-style-span" style="font-size: 12px;"&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;args["result"] = result[0]&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;div style="margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px;"&gt;&lt;span class="Apple-style-span" style="font-family: 'Courier New'; font-size: 13px;"&gt;&lt;span class="Apple-style-span" style="font-size: 12px;"&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;args["error"] = None # IMPORTANT!!&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;div style="margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px;"&gt;&lt;span class="Apple-style-span" style="font-family: 'Courier New'; font-size: 13px;"&gt;&lt;span class="Apple-style-span" style="font-size: 12px;"&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;&lt;/span&gt;&lt;span class="Apple-style-span" style="color: blue;"&gt;&lt;span class="Apple-style-span" style="font-size: 12px;"&gt;web.header("Content-Type","text/html; charset=utf-8")&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;div style="margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px;"&gt;&lt;span class="Apple-style-span" style="font-family: 'Courier New'; font-size: 13px;"&gt;&lt;span class="Apple-style-span" style="color: blue;"&gt;&lt;span class="Apple-style-span" style="font-size: 12px;"&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;return json.dumps(args)&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;div style="margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px;"&gt;&lt;span class="Apple-style-span" style="font-family: 'Courier New'; font-size: 13px;"&gt;&lt;span class="Apple-style-span" style="font-size: 12px;"&gt;&lt;br /&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;div style="margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px;"&gt;&lt;span class="Apple-style-span" style="font-family: 'Courier New'; font-size: 13px;"&gt;&lt;span class="Apple-style-span" style="font-size: 12px;"&gt;if __name__ == "__main__":&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;div style="margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px;"&gt;&lt;span class="Apple-style-span" style="font-family: 'Courier New'; font-size: 13px;"&gt;&lt;span class="Apple-style-span" style="color: blue;"&gt;&lt;span class="Apple-style-span" style="font-size: 12px;"&gt;&amp;nbsp;&amp;nbsp;app.run()&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;span style="color: blue;"&gt;&lt;br /&gt;
&lt;/span&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/1024937100240932334-2634175588260165534?l=amundblog.blogspot.com' alt='' /&gt;&lt;/div&gt;&lt;div class="feedflare"&gt;
&lt;a href="http://feeds.feedburner.com/~f/AmundsBlog?a=R3YsPla3"&gt;&lt;img src="http://feeds.feedburner.com/~f/AmundsBlog?d=41" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~f/AmundsBlog?a=CsTJR27N"&gt;&lt;img src="http://feeds.feedburner.com/~f/AmundsBlog?i=CsTJR27N" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~f/AmundsBlog?a=VjVpno4j"&gt;&lt;img src="http://feeds.feedburner.com/~f/AmundsBlog?d=42" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~f/AmundsBlog?a=1sNVEx2n"&gt;&lt;img src="http://feeds.feedburner.com/~f/AmundsBlog?i=1sNVEx2n" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~f/AmundsBlog?a=qcBmM5OG"&gt;&lt;img src="http://feeds.feedburner.com/~f/AmundsBlog?d=52" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~f/AmundsBlog?a=evBRNpu1"&gt;&lt;img src="http://feeds.feedburner.com/~f/AmundsBlog?i=evBRNpu1" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~f/AmundsBlog?a=jKvgrBeS"&gt;&lt;img src="http://feeds.feedburner.com/~f/AmundsBlog?d=43" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~f/AmundsBlog?a=82QFvccI"&gt;&lt;img src="http://feeds.feedburner.com/~f/AmundsBlog?d=50" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~f/AmundsBlog?a=uzi3ILwY"&gt;&lt;img src="http://feeds.feedburner.com/~f/AmundsBlog?i=uzi3ILwY" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~f/AmundsBlog?a=Bak8CF3n"&gt;&lt;img src="http://feeds.feedburner.com/~f/AmundsBlog?d=54" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~f/AmundsBlog?a=lgJdjh6z"&gt;&lt;img src="http://feeds.feedburner.com/~f/AmundsBlog?d=129" border="0"&gt;&lt;/img&gt;&lt;/a&gt;
&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/AmundsBlog/~4/RwEyeTGLbfI" height="1" width="1"/&gt;</content><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/1024937100240932334/posts/default/2634175588260165534?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/1024937100240932334/posts/default/2634175588260165534?v=2" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/AmundsBlog/~3/RwEyeTGLbfI/ajax-with-python-combining-pyjs-and.html" title="Ajax with Python - Combining PyJS and Appengine with json-rpc" /><author><name>Amund Tveit</name><uri>https://profiles.google.com/110451251449823277794</uri><email>noreply@blogger.com</email><gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="32" height="32" src="//lh6.googleusercontent.com/-zZKi4b5TYQY/AAAAAAAAAAI/AAAAAAAAAAA/_eaVu-shzqo/s512-c/photo.jpg" /></author><feedburner:origLink>http://amundblog.blogspot.com/2008/12/ajax-with-python-combining-pyjs-and.html</feedburner:origLink></entry><entry gd:etag="W/&quot;DkQBRXczcCp7ImA9WxVTGE8.&quot;"><id>tag:blogger.com,1999:blog-1024937100240932334.post-832288441960450034</id><published>2008-12-17T18:32:00.011+01:00</published><updated>2009-01-01T16:39:14.988+01:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2009-01-01T16:39:14.988+01:00</app:edited><category scheme="http://www.blogger.com/atom/ns#" term="mcmc" /><category scheme="http://www.blogger.com/atom/ns#" term="mamma mia" /><category scheme="http://www.blogger.com/atom/ns#" term="markov chain monte carlo" /><category scheme="http://www.blogger.com/atom/ns#" term="python" /><category scheme="http://www.blogger.com/atom/ns#" term="simulation" /><title>Simulating Mamma Mia under the xmas tree (with Python)</title><content type="html">
&lt;p&gt;&lt;a href="http://feedads.g.doubleclick.net/~a/wo3ceFal-48jq-CXHT8zObXfMko/0/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/wo3ceFal-48jq-CXHT8zObXfMko/0/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;br/&gt;
&lt;a href="http://feedads.g.doubleclick.net/~a/wo3ceFal-48jq-CXHT8zObXfMko/1/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/wo3ceFal-48jq-CXHT8zObXfMko/1/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;/p&gt;&lt;img alt="" border="0" src="http://ia.media-imdb.com/images/M/MV5BMTIzMDI3NDI5MF5BMl5BanBnXkFtZTcwMzczOTEwMg@@._V1._SX100_SY136_.jpg" style="float: right; height: 136px; margin-bottom: 10px; margin-left: 10px; margin-right: 0px; margin-top: 0px; width: 100px;" /&gt;Norway has a population of ~4.7 million, and "Mamma Mia!" has during a few weeks been sold in ~600 thousand DVD/Blueray copies (&amp;gt; 12% of the population, i.e. breaking every sales record, perhaps with the exception of Sissel Kyrkjebø's Christmas Carol album which has sold a total of &lt;a href="http://en.wikipedia.org/wiki/Sissel_Kyrkjeb%C3%B8#1986_-_1994:_Rise_to_prominence_at_home"&gt;~900 thousand copies&lt;/a&gt;&amp;nbsp;in the same population, but that was over a period of 21 years). &amp;nbsp;In the UK it has sold &lt;a href="http://news.sky.com/skynews/Home/UK-News/Mamma-Mia-Is-UK-Best-Selling-DVD-Ever-Beating-Titantic/Article/200901115196115?lid=ARTICLE_15196115_MammaMia!IsUKBest-SellingDVDEver,BeatingTitantic&amp;amp;lpos=searchresults"&gt;more than 5 million&lt;/a&gt; (in a population of 59 million, i.e. &amp;gt;8% of the population).&lt;br /&gt;
&lt;div&gt;&lt;br /&gt;
Well, to the point. Guesstimating that there will be ~2 million xmas trees in Norway, one can assume that many of the trees will have (much) more than one "Mamma Mia!" dvd/blueray underneath it*, &amp;nbsp;the question is how many?&lt;br /&gt;
&lt;br /&gt;
&lt;span style="font-weight: bold;"&gt;&lt;span style="text-decoration: underline;"&gt;Simulating &lt;/span&gt;Mamma Mia under the xmas tree&lt;/span&gt;&lt;br /&gt;
&lt;span style="font-weight: bold;"&gt;&lt;span style="font-weight: normal;"&gt;.. Before you start recapping probability theory, combinatorics, birthday paradox, multiplication of improbabilities and whatnot, how about finding an alternative solution using&amp;nbsp;&lt;span style="font-style: italic;"&gt;simulation&lt;/span&gt;?&amp;nbsp;&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;
&lt;br /&gt;
&lt;span style="font-weight: bold;"&gt;&lt;span style="font-weight: normal;"&gt;A simple simulation model could be to assume that for every Mamma Mia dvd/blueray copy there is a lottery where all trees participate, &amp;nbsp;and then finally (or incrementally) count how many copies each tree won.&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;
&lt;br /&gt;
A friend wrote a nice Python script to simulate this:&lt;br /&gt;
&lt;br /&gt;
&lt;span style="color: blue;"&gt;&lt;span style="font-family: 'Courier New', Courier, monospace;"&gt;&lt;span style="font-size: small;"&gt;import random&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span style="color: blue; font-family: 'Courier New'; font-size: 13px;"&gt;&lt;br /&gt;
&lt;/span&gt;&lt;span style="color: blue;"&gt;&lt;span style="font-family: 'Courier New', Courier, monospace;"&gt;&lt;span style="font-size: small;"&gt;NUM_XMAS_TREES = 2000000&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;
&lt;span style="color: blue;"&gt;&lt;span style="font-family: 'Courier New', Courier, monospace;"&gt;&lt;span style="font-size: small;"&gt;NUM_MAMMA_MIAS = 600000&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span style="color: blue; font-family: 'Courier New'; font-size: 13px;"&gt;&lt;br /&gt;
&lt;/span&gt;&lt;span style="color: blue;"&gt;&lt;span style="font-family: 'Courier New', Courier, monospace;"&gt;&lt;span style="font-size: small;"&gt;tree_supplies = {}&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;
&lt;span style="color: blue;"&gt;&lt;span style="font-family: 'Courier New', Courier, monospace;"&gt;&lt;span style="font-size: small;"&gt;for mamma_mia in range(NUM_MAMMA_MIAS):&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;
&lt;span style="color: blue;"&gt;&lt;span style="font-family: 'Courier New', Courier, monospace;"&gt;&lt;span style="font-size: small;"&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;winner_tree = random.randint(0, NUM_XMAS_TREES)&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;
&lt;span style="color: blue;"&gt;&lt;span style="font-family: 'Courier New', Courier, monospace;"&gt;&lt;span style="font-size: small;"&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;tree_supplies[winner_tree] = tree_supplies.get(winner_tree,0) + 1&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span style="color: blue; font-family: 'Courier New'; font-size: 13px;"&gt;&lt;br /&gt;
&lt;/span&gt;&lt;span style="color: blue;"&gt;&lt;span style="font-family: 'Courier New', Courier, monospace;"&gt;&lt;span style="font-size: small;"&gt;tree_stats = {}&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;
&lt;span style="color: blue;"&gt;&lt;span style="font-family: 'Courier New', Courier, monospace;"&gt;&lt;span style="font-size: small;"&gt;for tree in tree_supplies:&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;
&lt;span style="color: blue;"&gt;&lt;span style="font-family: 'Courier New', Courier, monospace;"&gt;&lt;span style="font-size: small;"&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;tree_stats[tree_supplies[tree]] = tree_stats.get(tree_supplies[tree], 0) + 1&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;
&lt;span style="color: blue;"&gt;&lt;span style="font-family: 'Courier New', Courier, monospace;"&gt;&lt;span style="font-size: small;"&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;
&lt;span style="color: blue;"&gt;&lt;span style="font-family: 'Courier New', Courier, monospace;"&gt;&lt;span style="font-size: small;"&gt;print tree_stats&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;
&lt;br /&gt;
&lt;span style="font-weight: bold;"&gt;Results:&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span style="font-weight: bold;"&gt;&lt;br /&gt;
&lt;/span&gt;&lt;span style="color: blue;"&gt;&lt;span style="font-family: 'Courier New', Courier, monospace;"&gt;&lt;span style="font-size: small;"&gt;$ for k in `seq 1 10`; do echo -n "$k " ; python mammamia.py; done&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;
&lt;span style="color: blue;"&gt;&lt;span style="font-family: 'Courier New', Courier, monospace;"&gt;&lt;span style="font-size: small;"&gt;1 {1: 443564, 2: 67181, 3: 6618, 4: 510, &lt;span style="color: cyan;"&gt;5&lt;/span&gt;: 36}&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;
&lt;span style="color: blue;"&gt;&lt;span style="font-family: 'Courier New', Courier, monospace;"&gt;&lt;span style="font-size: small;"&gt;2 {1: 444497, 2: 66811, 3: 6543, 4: 520, 5: 32, &lt;span style="color: cyan;"&gt;6&lt;/span&gt;: 2}&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;
&lt;span style="color: blue;"&gt;&lt;span style="font-family: 'Courier New', Courier, monospace;"&gt;&lt;span style="font-size: small;"&gt;3 {1: 444796, 2: 66376, 3: 6738, 4: 510, 5: 36, &lt;span style="color: cyan;"&gt;6&lt;/span&gt;: 3}&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;
&lt;span style="color: blue;"&gt;&lt;span style="font-family: 'Courier New', Courier, monospace;"&gt;&lt;span style="font-size: small;"&gt;4 {1: 444499, 2: 66750, 3: 6652, 4: 469, 5: 30, 6: 2, &lt;span style="color: red;"&gt;7&lt;/span&gt;&lt;span style="color: yellow;"&gt;: 1}&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;
&lt;span style="color: blue;"&gt;&lt;span style="font-family: 'Courier New', Courier, monospace;"&gt;&lt;span style="font-size: small;"&gt;5 {1: 444347, 2: 66717, 3: 6697, 4: 494, 5: 28, &lt;span style="color: cyan;"&gt;6&lt;/span&gt;: 2}&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;
&lt;span style="color: blue;"&gt;&lt;span style="font-family: 'Courier New', Courier, monospace;"&gt;&lt;span style="font-size: small;"&gt;6 {1: 444511, 2: 66389, 3: 6763, 4: 551, 5: 40, &lt;span style="color: cyan;"&gt;6&lt;/span&gt;: 3}&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;
&lt;span style="color: blue;"&gt;&lt;span style="font-family: 'Courier New', Courier, monospace;"&gt;&lt;span style="font-size: small;"&gt;7 {1: 443914, 2: 66755, 3: 6785, 4: 511, 5: 33, &lt;span style="color: cyan;"&gt;6&lt;/span&gt;: 2}&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;
&lt;span style="color: blue;"&gt;&lt;span style="font-family: 'Courier New', Courier, monospace;"&gt;&lt;span style="font-size: small;"&gt;8 {1: 444747, 2: 66558, 3: 6667, 4: 484, &lt;span style="color: cyan;"&gt;5&lt;/span&gt;: 40}&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;
&lt;span style="color: blue;"&gt;&lt;span style="font-family: 'Courier New', Courier, monospace;"&gt;&lt;span style="font-size: small;"&gt;9 {1: 444553, 2: 66703, 3: 6631, 4: 497, &lt;span style="color: cyan;"&gt;5&lt;/span&gt;: 32}&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;
&lt;span style="color: blue;"&gt;&lt;span style="font-family: 'Courier New', Courier, monospace;"&gt;&lt;span style="font-size: small;"&gt;10 {1: 443903, 2: 66853, 3: 6774, 4: 487, 5: 23, &lt;span style="color: cyan;"&gt;6&lt;/span&gt;: 1}&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;
&lt;span style="color: blue; font-family: 'Courier New'; font-size: 12px;"&gt;&lt;span style="color: black; font-family: 'Times New Roman'; font-size: 16px;"&gt;&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;
&lt;div style="margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px;"&gt;&lt;span style="font-weight: bold;"&gt;Conclusion&lt;/span&gt;&lt;/div&gt;&lt;br /&gt;
So we see that in run 4 there was one xmas tree that according to the simulation model got &lt;span style="color: red;"&gt;7&lt;/span&gt;(!) Mamma Mia DVD/Bluerays underneath it, but the overall simulation shows that &lt;span style="color: cyan;"&gt;5&lt;/span&gt; or &lt;span style="color: cyan;"&gt;6&lt;/span&gt;&amp;nbsp;(at most) is probably more likely (assuming the model is right).&lt;br /&gt;
&lt;br /&gt;
Regarding the simulation model, it is probably way too simplistic, i.e. not taking into account people buying mamma mia for themselves (or not as xmas gifts), a likely skewness in terms of number of gifts per christmas tree, interaction between buyers, etc. But it can with relatively simple manners be extended with code to make it more realistic. Check out &lt;a href="http://en.wikipedia.org/wiki/Markov_chain_Monte_Carlo"&gt;Markov Chain Monte Carlo&lt;/a&gt; simulation for more info on how to create more realistic simulation models.&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/1024937100240932334-832288441960450034?l=amundblog.blogspot.com' alt='' /&gt;&lt;/div&gt;&lt;div class="feedflare"&gt;
&lt;a href="http://feeds.feedburner.com/~f/AmundsBlog?a=5tRWnBAt"&gt;&lt;img src="http://feeds.feedburner.com/~f/AmundsBlog?d=41" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~f/AmundsBlog?a=l0MSmASk"&gt;&lt;img src="http://feeds.feedburner.com/~f/AmundsBlog?i=l0MSmASk" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~f/AmundsBlog?a=OAIjuNyI"&gt;&lt;img src="http://feeds.feedburner.com/~f/AmundsBlog?d=42" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~f/AmundsBlog?a=vWFPU8sS"&gt;&lt;img src="http://feeds.feedburner.com/~f/AmundsBlog?i=vWFPU8sS" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~f/AmundsBlog?a=7u3xY6yA"&gt;&lt;img src="http://feeds.feedburner.com/~f/AmundsBlog?d=52" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~f/AmundsBlog?a=dDOsRhFY"&gt;&lt;img src="http://feeds.feedburner.com/~f/AmundsBlog?i=dDOsRhFY" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~f/AmundsBlog?a=rlebeOOb"&gt;&lt;img src="http://feeds.feedburner.com/~f/AmundsBlog?d=43" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~f/AmundsBlog?a=p05mskgk"&gt;&lt;img src="http://feeds.feedburner.com/~f/AmundsBlog?d=50" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~f/AmundsBlog?a=WCFHt9k9"&gt;&lt;img src="http://feeds.feedburner.com/~f/AmundsBlog?i=WCFHt9k9" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~f/AmundsBlog?a=YF4NpIEF"&gt;&lt;img src="http://feeds.feedburner.com/~f/AmundsBlog?d=54" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~f/AmundsBlog?a=KMok2SJx"&gt;&lt;img src="http://feeds.feedburner.com/~f/AmundsBlog?d=129" border="0"&gt;&lt;/img&gt;&lt;/a&gt;
&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/AmundsBlog/~4/JqjYroL0L3g" height="1" width="1"/&gt;</content><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/1024937100240932334/posts/default/832288441960450034?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/1024937100240932334/posts/default/832288441960450034?v=2" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/AmundsBlog/~3/JqjYroL0L3g/simulating-mamma-mia-under-xmas-tree.html" title="Simulating Mamma Mia under the xmas tree (with Python)" /><author><name>Amund Tveit</name><uri>https://profiles.google.com/110451251449823277794</uri><email>noreply@blogger.com</email><gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="32" height="32" src="//lh6.googleusercontent.com/-zZKi4b5TYQY/AAAAAAAAAAI/AAAAAAAAAAA/_eaVu-shzqo/s512-c/photo.jpg" /></author><feedburner:origLink>http://amundblog.blogspot.com/2008/12/simulating-mamma-mia-under-xmas-tree.html</feedburner:origLink></entry><entry gd:etag="W/&quot;DEMCSHc4fCp7ImA9WxRbFUk.&quot;"><id>tag:blogger.com,1999:blog-1024937100240932334.post-9184407444873126794</id><published>2008-12-03T20:23:00.006+01:00</published><updated>2008-12-06T07:54:29.934+01:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2008-12-06T07:54:29.934+01:00</app:edited><category scheme="http://www.blogger.com/atom/ns#" term="performance" /><category scheme="http://www.blogger.com/atom/ns#" term="gcc" /><category scheme="http://www.blogger.com/atom/ns#" term="cinpy" /><category scheme="http://www.blogger.com/atom/ns#" term="tcc" /><category scheme="http://www.blogger.com/atom/ns#" term="python" /><category scheme="http://www.blogger.com/atom/ns#" term="compile" /><title>cinpy - or C in Python</title><content type="html">
&lt;p&gt;&lt;a href="http://feedads.g.doubleclick.net/~a/yMOElWM-2xutfTs3nphikxotaIM/0/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/yMOElWM-2xutfTs3nphikxotaIM/0/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;br/&gt;
&lt;a href="http://feedads.g.doubleclick.net/~a/yMOElWM-2xutfTs3nphikxotaIM/1/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/yMOElWM-2xutfTs3nphikxotaIM/1/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;/p&gt;&lt;a href="http://www.cs.tut.fi/~ask/cinpy/"&gt;cinpy&lt;/a&gt;&amp;nbsp;is a tool where you can write C code in your Python code (with the help of ctypes - included in modern Python versions). When you execute your python program the C code is compiled on the fly using Tiny C Compiler (TCC).&lt;br /&gt;
&lt;div&gt;&lt;/div&gt;&lt;div&gt;In this posting I will describe:&lt;/div&gt;&lt;div&gt;1) installation and testing cinpy&lt;/div&gt;&lt;div&gt;2) a simple benchmark (c-in-py vs python)&lt;/div&gt;&lt;div&gt;3) compare performance with gcc (c-in-py vs gcc)&lt;/div&gt;&lt;div&gt;4) measure cinpy (on-the-fly) compilation time&lt;/div&gt;&lt;div&gt;5) how to dynamically change cinpy methods&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;br /&gt;
&lt;span style="font-weight: bold;"&gt;1. How to install and try cinpy (note: also found in cinpy/tcc README files)&lt;/span&gt;&lt;br /&gt;
1) &lt;a href="http://download.savannah.nongnu.org/releases/tinycc/tcc-0.9.24.tar.bz2"&gt;download&lt;/a&gt;, uncompress and compile TCC&lt;br /&gt;
&lt;span style="font-family: 'Courier New', Courier, monospace;"&gt;./configure&lt;/span&gt;&lt;br /&gt;
&lt;span style="font-family: 'Courier New', Courier, monospace;"&gt;make&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span style="font-family: 'Courier New'; font-size: 13px;"&gt;make install&lt;br /&gt;
&lt;/span&gt;&lt;span style="font-family: 'Courier New', Courier, monospace;"&gt;gcc -shared -Wl,-soname,libtcc.so -o libtcc.so libtcc.o&lt;br /&gt;
&lt;/span&gt;&lt;br /&gt;
2) download, uncompress and try cinpy&lt;br /&gt;
&lt;span style="font-family: 'Courier New', Courier, monospace;"&gt;cp ../tcc*/*.so .&lt;/span&gt;&lt;br /&gt;
&lt;span style="font-family: 'Courier New', Courier, monospace;"&gt;python cinpy_test.py &amp;nbsp;# you may have to comment out or install &lt;a href="http://psyco.sourceforge.net/"&gt;psyco&lt;/a&gt;&amp;nbsp;&lt;/span&gt;&lt;br /&gt;
&lt;br /&gt;
&lt;span style="font-weight: bold;"&gt;2. Sample performance results (on a x86 linux box):&lt;br /&gt;
&lt;/span&gt;&lt;br /&gt;
&lt;div style="margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px;"&gt;&lt;/div&gt;&lt;div style="margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px;"&gt;&lt;span style="font-family: 'Courier New', Courier, monospace;"&gt;&lt;span style="color: blue;"&gt;python cinpy_test.py&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;div style="margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px;"&gt;&lt;span style="font-family: 'Courier New', Courier, monospace;"&gt;&lt;span style="color: blue;"&gt;Calculating fib(30)...&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;div style="margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px;"&gt;&lt;span style="font-family: 'Courier New', Courier, monospace;"&gt;&lt;span style="color: blue;"&gt;fibc : 1346269 time: 0.03495 s&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;div style="margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px;"&gt;&lt;span style="font-family: 'Courier New', Courier, monospace;"&gt;&lt;span style="color: blue;"&gt;fibpy: 1346269 time: 2.27871 s&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;div style="margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px;"&gt;&lt;span style="font-family: 'Courier New', Courier, monospace;"&gt;&lt;span style="color: blue;"&gt;Calculating for(1000000)...&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;div style="margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px;"&gt;&lt;span style="font-family: 'Courier New', Courier, monospace;"&gt;&lt;span style="color: blue;"&gt;forc : 1000000 time: 0.00342 s&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;div style="margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px;"&gt;&lt;span style="font-family: 'Courier New', Courier, monospace;"&gt;&lt;span style="color: blue;"&gt;forpy: 1000000 time: 0.32119 s&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;
&lt;span style="color: blue; font-family: 'Courier New'; font-size: 13px;"&gt;&lt;br /&gt;
&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span style="color: blue;"&gt;&lt;span style="font-family: inherit;"&gt;&lt;span style="font-weight: bold;"&gt;&lt;span style="font-size: small;"&gt;Using cinpy for fibc (Fibonacci) method was ~65 times faster than fibpy, and and cinpy for forc (loop) was ~93 times faster than forpy, not bad&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="font-family: inherit;"&gt;&lt;span style="font-weight: bold;"&gt;&lt;span style="font-size: small;"&gt;.&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span style="font-weight: bold;"&gt;&lt;br /&gt;
&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;/div&gt;&lt;div&gt;&lt;span style="font-weight: bold;"&gt;3. How does cinpy (compiled with tcc) compare to gcc performance?&lt;/span&gt;&lt;/div&gt;&lt;div&gt;Copying the C fib() method and calling it with main program&lt;/div&gt;&lt;div&gt;&lt;span style="font-size: 13px;"&gt;&lt;span style="font-family: 'Courier New', Courier, monospace;"&gt;&lt;span style="color: blue;"&gt;$ time fibgcc&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="font-family: 'Courier New', Courier, monospace;"&gt;&lt;span style="color: blue;"&gt;&lt;br /&gt;
&lt;/span&gt; &lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span style="color: blue;"&gt;&lt;span style="font-family: 'Courier New'; font-size: 13px;"&gt;&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;
&lt;span style="font-family: 'Courier New'; font-size: 13px;"&gt;&lt;/span&gt;&lt;br /&gt;
&lt;span style="font-family: 'Courier New'; font-size: 13px;"&gt;&lt;div&gt;&lt;span style="font-family: 'Courier New', Courier, monospace;"&gt;&lt;span style="color: blue;"&gt;fib(30) = 1346269&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span style="font-family: 'Courier New', Courier, monospace;"&gt;&lt;span style="color: blue;"&gt;&lt;br /&gt;
&lt;/span&gt; &lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span style="font-family: 'Courier New', Courier, monospace;"&gt;&lt;span style="color: blue;"&gt;real &amp;nbsp; &amp;nbsp;0m0.016s&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span style="font-family: 'Courier New', Courier, monospace;"&gt;&lt;span style="color: blue;"&gt;user &amp;nbsp; &amp;nbsp;0m0.020s&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span style="font-family: 'Courier New', Courier, monospace;"&gt;&lt;span style="color: blue;"&gt;sys &amp;nbsp; &amp;nbsp; 0m0.000s&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;
&lt;span style="color: blue;"&gt;&lt;br /&gt;
&lt;/span&gt;&lt;br /&gt;
&lt;span style="font-family: 'Times New Roman'; font-size: 16px;"&gt;&lt;span style="font-family: inherit;"&gt;&lt;span style="color: blue;"&gt;&lt;span style="font-weight: bold;"&gt;GCC gives roughly twice as fast code as cinpy/tcc (0.034/0.016).&amp;nbsp;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;
&lt;span style="color: blue;"&gt; &lt;/span&gt;&lt;br /&gt;
&lt;span class="Apple-style-span" style="color: blue; font-family: 'Times New Roman'; font-size: 16px; font-weight: bold;"&gt;&lt;br /&gt;
&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;/div&gt;&lt;div&gt;&lt;span style="color: blue;"&gt;&lt;span style="color: black; font-family: 'Times New Roman'; font-size: 16px;"&gt;&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;
&lt;span style="color: blue;"&gt;&lt;span style="color: black; font-family: 'Times New Roman'; font-size: 16px;"&gt;&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;
&lt;span style="color: blue;"&gt;&lt;span style="color: black; font-family: 'Times New Roman'; font-size: 16px;"&gt;&lt;div&gt;&lt;span style="font-weight: bold;"&gt;4. How long time does it take for tcc to on-the-fly compile cinpy methods?&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span style="font-weight: bold;"&gt;&lt;/span&gt;&lt;br /&gt;
&lt;span style="font-weight: bold;"&gt;&lt;/span&gt;&lt;br /&gt;
&lt;span style="font-weight: bold;"&gt;&lt;div&gt;&lt;span style="font-weight: normal;"&gt;&lt;span style="font-size: small;"&gt;&lt;span style="font-family: 'Courier New', Courier, monospace;"&gt;#!/usr/bin/env python&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;
&lt;span style="font-size: 13px; font-weight: normal;"&gt;&lt;span style="font-family: 'Courier New', Courier, monospace;"&gt;# cinpy_compile_performance.py&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span style="font-weight: normal;"&gt;&lt;span style="font-size: small;"&gt;&lt;span style="font-family: 'Courier New', Courier, monospace;"&gt;import ctypes&lt;br /&gt;
&lt;/span&gt; &lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span style="font-weight: normal;"&gt;&lt;span style="font-size: small;"&gt;&lt;span style="font-family: 'Courier New', Courier, monospace;"&gt;import cinpy&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span style="font-weight: normal;"&gt;&lt;span style="font-size: small;"&gt;&lt;span style="font-family: 'Courier New', Courier, monospace;"&gt;import time&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span style="font-weight: normal;"&gt;&lt;span style="font-size: small;"&gt;&lt;span style="font-family: 'Courier New', Courier, monospace;"&gt;t=time.time&lt;br /&gt;
&lt;/span&gt; &lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span style="font-weight: normal;"&gt;&lt;span style="font-size: small;"&gt;&lt;span style="font-family: 'Courier New', Courier, monospace;"&gt;t0 = t()&lt;br /&gt;
&lt;/span&gt; &lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span style="font-weight: normal;"&gt;&lt;span style="font-size: small;"&gt;&lt;span style="font-family: 'Courier New', Courier, monospace;"&gt;fibc=cinpy.defc(&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;
&lt;span style="font-weight: normal;"&gt;&lt;span style="font-size: small;"&gt;&lt;span style="font-family: 'Courier New', Courier, monospace;"&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp; "fib",&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;
&lt;span style="font-weight: normal;"&gt;&lt;span style="font-size: small;"&gt;&lt;span style="font-family: 'Courier New', Courier, monospace;"&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp; ctypes.CFUNCTYPE(ctypes.c_int,ctypes.c_int),&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span style="font-weight: normal;"&gt;&lt;span style="font-size: small;"&gt;&lt;span style="font-family: 'Courier New', Courier, monospace;"&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp; """&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span style="font-weight: normal;"&gt;&lt;span style="font-size: small;"&gt;&lt;span style="font-family: 'Courier New', Courier, monospace;"&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp; int fib(int x) {&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span style="font-weight: normal;"&gt;&lt;span style="font-size: small;"&gt;&lt;span style="font-family: 'Courier New', Courier, monospace;"&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp; &amp;nbsp; if (x&amp;lt;=1) return 1;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span style="font-weight: normal;"&gt;&lt;span style="font-size: small;"&gt;&lt;span style="font-family: 'Courier New', Courier, monospace;"&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp; &amp;nbsp; return fib(x-1)+fib(x-2);&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span style="font-weight: normal;"&gt;&lt;span style="font-size: small;"&gt;&lt;span style="font-family: 'Courier New', Courier, monospace;"&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp; }&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span style="font-weight: normal;"&gt;&lt;span style="font-size: small;"&gt;&lt;span style="font-family: 'Courier New', Courier, monospace;"&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp; """)&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span style="font-weight: normal;"&gt;&lt;span style="font-size: small;"&gt;&lt;span style="font-family: 'Courier New', Courier, monospace;"&gt;t1 = t()&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span style="font-weight: normal;"&gt;&lt;span style="font-size: small;"&gt;&lt;span style="font-family: 'Courier New', Courier, monospace;"&gt;print "Calculating fib(30)..."&lt;br /&gt;
&lt;/span&gt; &lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span style="font-weight: normal;"&gt;&lt;span style="font-size: small;"&gt;&lt;span style="font-family: 'Courier New', Courier, monospace;"&gt;sc,rv_fibc,ec=t(),fibc(30),t()&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span style="font-weight: normal;"&gt;&lt;span style="font-size: small;"&gt;&lt;span style="font-family: 'Courier New', Courier, monospace;"&gt;print "fibc :",rv_fibc,"time: %6.5f s" % (ec-sc)&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span style="font-weight: normal;"&gt;&lt;span style="font-size: small;"&gt;&lt;span style="font-family: 'Courier New', Courier, monospace;"&gt;print "compilation time = %6.5f s" % (t1-t0)&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;
&lt;span style="font-family: 'Courier New'; font-size: 13px; font-weight: normal;"&gt;&lt;span style="color: blue;"&gt;python cinpy_compile_performance.py&lt;/span&gt;&lt;/span&gt;&lt;span style="color: blue;"&gt;&lt;br /&gt;
&lt;/span&gt;&lt;br /&gt;
&lt;span style="font-family: 'Courier New'; font-size: 13px; font-weight: normal;"&gt;&lt;span style="color: blue;"&gt;Calculating fib(30)...&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;
&lt;span style="font-family: 'Courier New'; font-size: 13px; font-weight: normal;"&gt;&lt;span style="color: blue;"&gt;fibc: 1346269 time: 0.03346 s&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;
&lt;span style="font-family: 'Courier New'; font-size: 13px; font-weight: normal;"&gt;&lt;span style="color: blue;"&gt;compilation time: 0.00333 s&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;
&lt;span style="font-family: 'Courier New'; font-size: 13px; font-weight: normal;"&gt;&lt;br /&gt;
&lt;/span&gt;&lt;br /&gt;
&lt;span style="color: blue;"&gt;&lt;span style="font-family: inherit;"&gt;&lt;span style="font-size: medium;"&gt;So compilation (and linking) time is about 3.3ms, which is reasonably good, not a lot of overhead! (note: TCC is benchmarked to compile, assemble and link 67MB of code in 2.27s)&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;
&lt;span style="color: blue;"&gt;&lt;br /&gt;
&lt;/span&gt;&lt;br /&gt;
5. "Hot-swap" replacement of cinpy code?&lt;br /&gt;
&lt;span style="font-weight: normal;"&gt;Let us assume you have a system with a "pareto" situation, i.e. 80-99% of the code doesn't need be fast (written in Python), but 1-20% need to be really high performance (and written in C using cinpy), and that you need to frequently change the high performing code, can that be done? Examples of such a system could be mobile (software) agents.&lt;/span&gt;&lt;br /&gt;
&lt;span style="font-weight: normal;"&gt;&lt;br /&gt;
&lt;/span&gt;&lt;br /&gt;
&lt;span style="font-weight: normal;"&gt;&lt;span style="color: blue;"&gt;Sure, all you need to do is wrap your cinpy definition as a string and run exec on it, like this:&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;
&lt;span style="font-weight: normal;"&gt;&lt;/span&gt;&lt;br /&gt;
origmethod="""&lt;br /&gt;
&lt;span style="font-family: 'Courier New', Courier, monospace;"&gt;&lt;span style="font-size: small;"&gt;fibc=cinpy.defc("fib",ctypes.CFUNCTYPE(ctypes.c_int,ctypes.c_int),&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;
&lt;span style="font-family: 'Courier New', Courier, monospace;"&gt;&lt;span style="font-size: small;"&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;'''&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;
&lt;span style="font-family: 'Courier New', Courier, monospace;"&gt;&lt;span style="font-size: small;"&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;int fib(int x) {&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;
&lt;span style="font-family: 'Courier New', Courier, monospace;"&gt;&lt;span style="font-size: small;"&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;if (x&amp;lt;=1) return 1;&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;
&lt;span style="font-family: 'Courier New', Courier, monospace;"&gt;&lt;span style="font-size: small;"&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;return fib(x-1)+fib(x-2);&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;
&lt;span style="font-family: 'Courier New', Courier, monospace;"&gt;&lt;span style="font-size: small;"&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;}&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;
&lt;span style="font-family: 'Courier New', Courier, monospace;"&gt;&lt;span style="font-size: small;"&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;''')&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;
&lt;span style="font-family: 'Courier New', Courier, monospace;"&gt;&lt;span style="font-size: small;"&gt;"""&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;
&lt;span style="font-family: 'Courier New', Courier, monospace;"&gt;&lt;span style="font-size: small;"&gt;# add an offset to the Fibonacci method&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;
&lt;span style="font-family: 'Courier New', Courier, monospace;"&gt;&lt;span style="font-size: small;"&gt;alternatemethod = origmethod.replace("+", "+998+")&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;
&lt;span style="font-family: 'Courier New', Courier, monospace;"&gt;&lt;span style="font-size: small;"&gt;print alternatemethod&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;
&lt;span style="font-family: 'Courier New', Courier, monospace;"&gt;&lt;span style="font-size: small;"&gt;&lt;span style="font-weight: bold;"&gt;# alternatemethod has replaces origmethod with exec(alternatemethod)&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;
&lt;span style="font-family: 'Courier New', Courier, monospace;"&gt;&lt;span style="font-size: small;"&gt;print fibc(2) # = 1000&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;
&lt;div&gt;&lt;/div&gt;Conclusion:&lt;br /&gt;
&lt;span style="font-weight: normal;"&gt;&lt;span style="color: blue;"&gt;cinpy ain't bad.&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;/span&gt;&lt;/div&gt;&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;/span&gt;&lt;/div&gt;&lt;br /&gt;
&lt;span class="Apple-style-span" style="color: blue; font-style: italic; font-weight: bold;"&gt;Remark:&amp;nbsp;&lt;span class="Apple-style-span" style="font-weight: normal;"&gt;depending on the problem you are solving (e.g. if it is primarily network IO bound and not CPU bound) , becoming 1-2 orders of magnitude faster (cinpy vs pure python) is probably fast enough (CPU wise), the doubling from GCC may not matter (since network IO wise Python performs quite alright, e.g. with &lt;a href="http://twistedmatrix.com/trac/"&gt;Twisted&lt;/a&gt;&amp;nbsp;).&amp;nbsp;&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;
&lt;div&gt;&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/1024937100240932334-9184407444873126794?l=amundblog.blogspot.com' alt='' /&gt;&lt;/div&gt;&lt;div class="feedflare"&gt;
&lt;a href="http://feeds.feedburner.com/~f/AmundsBlog?a=RVbxtkec"&gt;&lt;img src="http://feeds.feedburner.com/~f/AmundsBlog?d=41" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~f/AmundsBlog?a=h2g3RHAp"&gt;&lt;img src="http://feeds.feedburner.com/~f/AmundsBlog?i=h2g3RHAp" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~f/AmundsBlog?a=V3Fftuvu"&gt;&lt;img src="http://feeds.feedburner.com/~f/AmundsBlog?d=42" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~f/AmundsBlog?a=zVj89jCq"&gt;&lt;img src="http://feeds.feedburner.com/~f/AmundsBlog?i=zVj89jCq" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~f/AmundsBlog?a=ZEIqmIaN"&gt;&lt;img src="http://feeds.feedburner.com/~f/AmundsBlog?d=52" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~f/AmundsBlog?a=am5WbaCu"&gt;&lt;img src="http://feeds.feedburner.com/~f/AmundsBlog?i=am5WbaCu" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~f/AmundsBlog?a=Peu5uynJ"&gt;&lt;img src="http://feeds.feedburner.com/~f/AmundsBlog?d=43" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~f/AmundsBlog?a=j3WyNVwn"&gt;&lt;img src="http://feeds.feedburner.com/~f/AmundsBlog?d=50" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~f/AmundsBlog?a=REazgXTK"&gt;&lt;img src="http://feeds.feedburner.com/~f/AmundsBlog?i=REazgXTK" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~f/AmundsBlog?a=PdS6SPu5"&gt;&lt;img src="http://feeds.feedburner.com/~f/AmundsBlog?d=54" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~f/AmundsBlog?a=pAO3nRir"&gt;&lt;img src="http://feeds.feedburner.com/~f/AmundsBlog?d=129" border="0"&gt;&lt;/img&gt;&lt;/a&gt;
&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/AmundsBlog/~4/hxfWof2zEww" height="1" width="1"/&gt;</content><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/1024937100240932334/posts/default/9184407444873126794?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/1024937100240932334/posts/default/9184407444873126794?v=2" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/AmundsBlog/~3/hxfWof2zEww/cinpy-or-c-in-python.html" title="cinpy - or C in Python" /><author><name>Amund Tveit</name><uri>https://profiles.google.com/110451251449823277794</uri><email>noreply@blogger.com</email><gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="32" height="32" src="//lh6.googleusercontent.com/-zZKi4b5TYQY/AAAAAAAAAAI/AAAAAAAAAAA/_eaVu-shzqo/s512-c/photo.jpg" /></author><category term="TCC" scheme="http://rss.financialcontent.com/stocksymbol" /><feedburner:origLink>http://amundblog.blogspot.com/2008/12/cinpy-or-c-in-python.html</feedburner:origLink></entry><entry gd:etag="W/&quot;DUYDRXc-fCp7ImA9WxRbFUk.&quot;"><id>tag:blogger.com,1999:blog-1024937100240932334.post-1789763046071759146</id><published>2008-11-29T09:38:00.008+01:00</published><updated>2008-12-06T08:06:14.954+01:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2008-12-06T08:06:14.954+01:00</app:edited><category scheme="http://www.blogger.com/atom/ns#" term="performance" /><category scheme="http://www.blogger.com/atom/ns#" term="c++" /><category scheme="http://www.blogger.com/atom/ns#" term="assembler" /><category scheme="http://www.blogger.com/atom/ns#" term="parallelization" /><category scheme="http://www.blogger.com/atom/ns#" term="fortran" /><category scheme="http://www.blogger.com/atom/ns#" term="python" /><title>Tools for Accelerating Python</title><content type="html">
&lt;p&gt;&lt;a href="http://feedads.g.doubleclick.net/~a/YdDzF4A9PxqJM0uqLJmNTR9tEDk/0/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/YdDzF4A9PxqJM0uqLJmNTR9tEDk/0/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;br/&gt;
&lt;a href="http://feedads.g.doubleclick.net/~a/YdDzF4A9PxqJM0uqLJmNTR9tEDk/1/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/YdDzF4A9PxqJM0uqLJmNTR9tEDk/1/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;/p&gt;If you need to speed up your Python program there are several possible approaches, with varying degree of effort needed, here is (probably not complete) overview:&lt;br /&gt;&lt;ol&gt;&lt;li&gt;Rewrite your Python code by &lt;a href="http://en.wikipedia.org/wiki/Parallel_computing"&gt;parallelizing&lt;/a&gt; or optimizing/replacing/tuning algorithm(s), e.g. using: &lt;a href="http://www.michael-noll.com/wiki/Writing_An_Hadoop_MapReduce_Program_In_Python"&gt;&lt;/a&gt;&lt;/li&gt;&lt;ul&gt;&lt;li&gt;&lt;a href="http://www.michael-noll.com/wiki/Writing_An_Hadoop_MapReduce_Program_In_Python"&gt;Hadoop&lt;/a&gt; or &lt;a href="http://discoproject.org/"&gt;Disco&lt;/a&gt;&lt;a href="http://www.parallelpython.com/"&gt;&lt;/a&gt;&lt;/li&gt;&lt;ul&gt;&lt;li&gt;Open source implementations of &lt;a href="http://labs.google.com/papers/mapreduce.html"&gt;MapReduce&lt;/a&gt; &lt;/li&gt;&lt;/ul&gt;&lt;li&gt;&lt;a href="http://www.parallelpython.com/"&gt;Parallel Python&lt;/a&gt; &lt;a href="http://mpi4py.scipy.org/"&gt;&lt;/a&gt;&lt;/li&gt;&lt;li&gt;&lt;a href="http://mpi4py.scipy.org/"&gt;Message Passing Interface (MPI)&lt;/a&gt;&lt;a href="http://www.parawiki.org/index.php/Python/BSP"&gt;&lt;/a&gt;&lt;/li&gt;&lt;ul&gt;&lt;li&gt;Frequently used for numerical programming&lt;/li&gt;&lt;/ul&gt;&lt;li&gt;&lt;a href="http://www.parawiki.org/index.php/Python/BSP"&gt;Bulk Synchronous Parallel (BSP)&lt;/a&gt; &lt;/li&gt;&lt;li&gt;&lt;a href="http://rpyc.wikidot.com/"&gt;RPyC&lt;/a&gt;&lt;/li&gt;&lt;ul&gt;&lt;li&gt;RPC for Distributed/Parallel Programming&lt;br /&gt;&lt;/li&gt;&lt;/ul&gt;&lt;li&gt;&lt;a href="http://twistedmatrix.com/trac/"&gt;Twisted&lt;/a&gt;&lt;/li&gt;&lt;ul&gt;&lt;li&gt;Network libraries for Distributed/Parallel Programming&lt;br /&gt;&lt;/li&gt;&lt;/ul&gt;&lt;li&gt;&lt;a href="http://www.python.org/doc/2.5.2/lib/module-profile.html"&gt;Profiling Tools&lt;/a&gt;&lt;/li&gt;&lt;li&gt;Threading or &lt;a href="http://amundblog.blogspot.com/2008/10/example-of-microsimulation-with.html"&gt;Microthreads (Stackless)&lt;/a&gt; &lt;/li&gt;&lt;/ul&gt;&lt;li&gt;Use a tool that can speed up your code more or less unchanged&lt;br /&gt;&lt;/li&gt;&lt;ul&gt;&lt;li&gt;&lt;a href="http://psyco.sourceforge.net/"&gt;Psyco&lt;/a&gt;&lt;/li&gt;&lt;ul&gt;&lt;li&gt;Just in time compiler, note: this is probably the easiest approach to try&lt;/li&gt;&lt;/ul&gt;&lt;li&gt;&lt;a href="http://www.cosc.canterbury.ac.nz/greg.ewing/python/Pyrex/"&gt;Pyrex&lt;/a&gt;&lt;/li&gt;&lt;ul&gt;&lt;li&gt;Write and compile Python with a flavor of C data structures&lt;/li&gt;&lt;/ul&gt;&lt;li&gt;&lt;a href="http://cython.org/"&gt;Cython&lt;/a&gt; &lt;/li&gt;&lt;li&gt;&lt;a href="http://pyjs.org/"&gt;PyJs&lt;/a&gt; &lt;/li&gt;&lt;ul&gt;&lt;li&gt;Compile (large subset of) Python to Javascript, note: probably more interesting for client development (ajax) than server side.&lt;/li&gt;&lt;/ul&gt;&lt;li&gt;&lt;a href="http://amundblog.blogspot.com/2008/01/rpython-gclb-benchmark-recursive.html"&gt;Rpython&lt;/a&gt;&lt;/li&gt;&lt;ul&gt;&lt;li&gt;Compile (large subset of) Python to native code, note: part of PyPy project&lt;/li&gt;&lt;/ul&gt;&lt;li&gt;&lt;a href="http://code.google.com/p/pystream/"&gt;PyStream&lt;/a&gt;&lt;/li&gt;&lt;li&gt;&lt;a href="http://www.txcorp.com/products/GPULib/"&gt;GPULib&lt;/a&gt;&lt;/li&gt;&lt;li&gt;&lt;a href="http://sourceforge.net/projects/shedskin/"&gt;Shedskin &lt;/a&gt;&lt;span style="font-style: italic;"&gt;&lt;/span&gt;&lt;/li&gt;&lt;ul&gt;&lt;li&gt;Compile (large subset of) Python to C++, &lt;a href="http://ianozsvald.com/2008/11/17/making-python-math-196-faster-with-shedskin/"&gt;some benchmarks&lt;/a&gt;&lt;br /&gt;&lt;/li&gt;&lt;/ul&gt;&lt;/ul&gt;&lt;li&gt;Replace (parts of) your Python code with another language&lt;/li&gt;&lt;ul&gt;&lt;li&gt;&lt;a href="http://www.swig.org/"&gt;Simplified Wrapper and Interface Generator (SWIG)&lt;/a&gt; &lt;span style="font-style: italic;"&gt;&lt;/span&gt;&lt;/li&gt;&lt;ul&gt;&lt;li&gt;Use C/C++ from Python&lt;br /&gt;&lt;/li&gt;&lt;/ul&gt;&lt;li&gt;&lt;a href="http://cens.ioc.ee/projects/f2py2e/"&gt;Fortran to Python Interface Generator (F2PY)&lt;/a&gt; &lt;span style="font-style: italic;"&gt;&lt;/span&gt;&lt;/li&gt;&lt;ul&gt;&lt;li&gt;Use Fortran from Python&lt;/li&gt;&lt;/ul&gt;&lt;li&gt;&lt;a href="http://mdevan.nfshost.com/llvm-py/"&gt;llvm-py&lt;/a&gt; &lt;/li&gt;&lt;ul&gt;&lt;li&gt;Code and Compile to Assembler for running on Low-Level Virtual Machine&lt;/li&gt;&lt;/ul&gt;&lt;li&gt;&lt;a href="http://www.corepy.org/"&gt;CorePy&lt;/a&gt; &lt;/li&gt;&lt;ul&gt;&lt;li&gt;Write Assembly Code in Python&lt;/li&gt;&lt;/ul&gt;&lt;li&gt;&lt;a href="http://scipy.org/Weave"&gt;Weave&lt;/a&gt; &lt;/li&gt;&lt;li&gt;&lt;a href="http://pyinline.sourceforge.net/"&gt;PyInline&lt;/a&gt; &lt;/li&gt;&lt;li&gt;&lt;a href="http://www.boost.org/doc/libs/1_37_0/libs/python/doc/index.html"&gt;Boost.Python&lt;/a&gt;&lt;/li&gt;&lt;li&gt;&lt;a href="http://www.cs.tut.fi/~ask/cinpy/"&gt;Cinpy&lt;/a&gt; &lt;span style="font-style: italic;"&gt;&lt;/span&gt;&lt;/li&gt;&lt;ul&gt;&lt;li&gt;C code blended with Python (using &lt;a href="http://starship.python.net/crew/theller/ctypes/"&gt;ctypes&lt;/a&gt;) and runtime compilation with &lt;a href="http://tinycc.org/"&gt;tcc&lt;/a&gt;&lt;/li&gt;&lt;/ul&gt;&lt;/ul&gt;&lt;/ol&gt;&lt;div&gt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/1024937100240932334-1789763046071759146?l=amundblog.blogspot.com' alt='' /&gt;&lt;/div&gt;&lt;div class="feedflare"&gt;
&lt;a href="http://feeds.feedburner.com/~f/AmundsBlog?a=UKu9VTLV"&gt;&lt;img src="http://feeds.feedburner.com/~f/AmundsBlog?d=41" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~f/AmundsBlog?a=qubLjdwH"&gt;&lt;img src="http://feeds.feedburner.com/~f/AmundsBlog?i=qubLjdwH" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~f/AmundsBlog?a=DRibMNwS"&gt;&lt;img src="http://feeds.feedburner.com/~f/AmundsBlog?d=42" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~f/AmundsBlog?a=LIfXP1T2"&gt;&lt;img src="http://feeds.feedburner.com/~f/AmundsBlog?i=LIfXP1T2" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~f/AmundsBlog?a=dU7QtcK0"&gt;&lt;img src="http://feeds.feedburner.com/~f/AmundsBlog?d=52" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~f/AmundsBlog?a=AC7JAqyG"&gt;&lt;img src="http://feeds.feedburner.com/~f/AmundsBlog?i=AC7JAqyG" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~f/AmundsBlog?a=tQVpEONo"&gt;&lt;img src="http://feeds.feedburner.com/~f/AmundsBlog?d=43" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~f/AmundsBlog?a=Rz0g2IPu"&gt;&lt;img src="http://feeds.feedburner.com/~f/AmundsBlog?d=50" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~f/AmundsBlog?a=9HPGUvZt"&gt;&lt;img src="http://feeds.feedburner.com/~f/AmundsBlog?i=9HPGUvZt" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~f/AmundsBlog?a=BD1Iw91q"&gt;&lt;img src="http://feeds.feedburner.com/~f/AmundsBlog?d=54" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~f/AmundsBlog?a=wonXJYPF"&gt;&lt;img src="http://feeds.feedburner.com/~f/AmundsBlog?d=129" border="0"&gt;&lt;/img&gt;&lt;/a&gt;
&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/AmundsBlog/~4/eI3oKyzg4rc" height="1" width="1"/&gt;</content><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/1024937100240932334/posts/default/1789763046071759146?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/1024937100240932334/posts/default/1789763046071759146?v=2" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/AmundsBlog/~3/eI3oKyzg4rc/tools-for-accelerating-python.html" title="Tools for Accelerating Python" /><author><name>Amund Tveit</name><uri>https://profiles.google.com/110451251449823277794</uri><email>noreply@blogger.com</email><gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="32" height="32" src="//lh6.googleusercontent.com/-zZKi4b5TYQY/AAAAAAAAAAI/AAAAAAAAAAA/_eaVu-shzqo/s512-c/photo.jpg" /></author><category term="MPI" scheme="http://rss.financialcontent.com/stocksymbol" /><category term="BSP" scheme="http://rss.financialcontent.com/stocksymbol" /><category term="SWIG" scheme="http://rss.financialcontent.com/stocksymbol" /><feedburner:origLink>http://amundblog.blogspot.com/2008/11/tools-for-accelerating-python.html</feedburner:origLink></entry><entry gd:etag="W/&quot;DkUNQHY_fip7ImA9WxRXE08.&quot;"><id>tag:blogger.com,1999:blog-1024937100240932334.post-6156953348503553271</id><published>2008-10-18T10:01:00.001+01:00</published><updated>2008-10-18T11:04:51.846+01:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2008-10-18T11:04:51.846+01:00</app:edited><category scheme="http://www.blogger.com/atom/ns#" term="cloud" /><category scheme="http://www.blogger.com/atom/ns#" term="greenlets" /><category scheme="http://www.blogger.com/atom/ns#" term="python" /><category scheme="http://www.blogger.com/atom/ns#" term="stackless python" /><category scheme="http://www.blogger.com/atom/ns#" term="parallel" /><category scheme="http://www.blogger.com/atom/ns#" term="grid" /><category scheme="http://www.blogger.com/atom/ns#" term="tasklets" /><title>Example of Microsimulation with Stackless Python</title><content type="html">
&lt;p&gt;&lt;a href="http://feedads.g.doubleclick.net/~a/16VbRvM0d7WCM5fqaXodLP3GOtA/0/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/16VbRvM0d7WCM5fqaXodLP3GOtA/0/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;br/&gt;
&lt;a href="http://feedads.g.doubleclick.net/~a/16VbRvM0d7WCM5fqaXodLP3GOtA/1/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/16VbRvM0d7WCM5fqaXodLP3GOtA/1/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;/p&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://4.bp.blogspot.com/_2DnUjV2gKmw/SPm0sHHMY8I/AAAAAAAAC0U/a3WISNDRwPk/s1600-h/robotmusicalchairs.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" src="http://4.bp.blogspot.com/_2DnUjV2gKmw/SPm0sHHMY8I/AAAAAAAAC0U/igYkFOP98Vc/s400-R/robotmusicalchairs.png" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;
Stackless Python is roughly Python with support for microthreads (called &lt;a href="http://www.stackless.com/wiki/Tasklets"&gt;tasklets&lt;/a&gt;). Tasklets communicate with each other by sending messages through&amp;nbsp;&lt;a href="http://zope.stackless.com/wiki/Channels"&gt;channels&lt;/a&gt;&amp;nbsp;, i.e. similar to &lt;a href="http://en.wikipedia.org/wiki/Erlang_(programming_language)"&gt;Erlang&lt;/a&gt;, but of course with Python syntax (guess which I prefer :-). &amp;nbsp;Stackless has a sibling called &lt;a href="http://amundblog.blogspot.com/2008/02/python-is-concurrently-alive-and.html"&gt;Greenlet Python&lt;/a&gt;&amp;nbsp;, which is a library that can be used with traditional Python to get decent mictrothread support.&lt;br /&gt;
&lt;br /&gt;
&lt;span style="font-weight: bold;"&gt;Scale&lt;/span&gt;&lt;br /&gt;
Tasklets have low overhead (compared to traditional threads) so you can have hundreds of thousands of them simultaneously, and when it gets overly crowded and busy on one machine, you can easily scale up by &lt;span style="-webkit-text-decorations-in-effect: underline; color: #551a8b; text-decoration: underline;"&gt;pickling&amp;nbsp;&lt;/span&gt;some&amp;nbsp;tasklets and send them to another machine (better known as &lt;a href="http://en.wikipedia.org/wiki/Mobile_agent"&gt;mobile agents&lt;/a&gt;&amp;nbsp;in computer science). Since tasklets also live Python's GIL regime, it might be idea to use the processing API to spawn several processes to better utilize multicore machines (and have many tasklets within each process), or use some of &lt;a href="http://wiki.python.org/moin/ParallelProcessing"&gt;these libraries&lt;/a&gt;&amp;nbsp;.&lt;br /&gt;
&lt;br /&gt;
&lt;span class="Apple-style-span" style="font-weight: bold;"&gt;API Alignment Challenge&lt;/span&gt;&lt;br /&gt;
In Python 2.6 the process and thread APIs are aligned, but a missing piece would be to align those apis with stackless/tasklet apis. From my perspective a natural order would be process &amp;gt; thread &amp;gt; tasklet, and perhaps adding your favorite piece of the cloud would make sense for the API as well?&lt;br /&gt;
&lt;br /&gt;
&lt;span style="font-weight: bold;"&gt;Example - simulation with 100k robots&lt;/span&gt;&lt;br /&gt;
The robots are playing a variant of musical chairs on a rectangular arena, it differs from regular musical chairs since if a chair has been sat on once, it can't be sat on again. Finding out who won is left as an exercise (hint: it can be found more than 1 place)&lt;br /&gt;
&lt;pre&gt;&lt;span style="color: #c00000; font-family: Lucida; font-size: 16px;"&gt;&lt;/span&gt;&lt;/pre&gt;&lt;br /&gt;
&lt;pre&gt;&lt;span style="font-family: Lucida, 'Courier New';"&gt;&lt;span style="color: #c00000;"&gt;from&lt;/span&gt; &lt;span style="color: black;"&gt;random&lt;/span&gt; &lt;span style="color: #c00000;"&gt;import&lt;/span&gt; &lt;span style="color: black;"&gt;randint&lt;/span&gt;
&lt;span style="color: #c00000;"&gt;import&lt;/span&gt; &lt;span style="color: black;"&gt;stackless&lt;/span&gt;
&lt;span style="color: #c00000;"&gt;import&lt;/span&gt; &lt;span style="color: black;"&gt;sys&lt;/span&gt;
&lt;span style="color: #c00000;"&gt;import&lt;/span&gt; &lt;span style="color: black;"&gt;time&lt;/span&gt;

&lt;span style="color: #c00000;"&gt;class&lt;/span&gt; &lt;span style="color: black;"&gt;Arena&lt;/span&gt;&lt;span style="color: #0000c0;"&gt;:&lt;/span&gt;
    &lt;span style="color: #c00000;"&gt;def&lt;/span&gt; &lt;span style="color: black;"&gt;__init__&lt;/span&gt;&lt;span style="color: #0000c0;"&gt;(&lt;/span&gt;&lt;span style="color: black;"&gt;self&lt;/span&gt;&lt;span style="color: #0000c0;"&gt;,&lt;/span&gt; &lt;span style="color: black;"&gt;xdim&lt;/span&gt;&lt;span style="color: #0000c0;"&gt;,&lt;/span&gt; &lt;span style="color: black;"&gt;ydim&lt;/span&gt;&lt;span style="color: #0000c0;"&gt;)&lt;/span&gt;&lt;span style="color: #0000c0;"&gt;:&lt;/span&gt;
        &lt;span style="color: black;"&gt;self&lt;/span&gt;&lt;span style="color: #0000c0;"&gt;.&lt;/span&gt;&lt;span style="color: black;"&gt;arena&lt;/span&gt; &lt;span style="color: #0000c0;"&gt;=&lt;/span&gt; &lt;span style="color: #0000c0;"&gt;[&lt;/span&gt;&lt;span style="color: #0000c0;"&gt;[&lt;/span&gt;&lt;span style="color: black;"&gt;None&lt;/span&gt;&lt;span style="color: #0000c0;"&gt;]&lt;/span&gt;&lt;span style="color: #0000c0;"&gt;*&lt;/span&gt;&lt;span style="color: black;"&gt;ydim&lt;/span&gt; &lt;span style="color: #c00000;"&gt;for&lt;/span&gt; &lt;span style="color: black;"&gt;x&lt;/span&gt; &lt;span style="color: #c00000;"&gt;in&lt;/span&gt; &lt;span style="color: black;"&gt;range&lt;/span&gt;&lt;span style="color: #0000c0;"&gt;(&lt;/span&gt;&lt;span style="color: black;"&gt;xdim&lt;/span&gt;&lt;span style="color: #0000c0;"&gt;)&lt;/span&gt;&lt;span style="color: #0000c0;"&gt;]&lt;/span&gt;
        &lt;span style="color: #0000c0;"&gt;(&lt;/span&gt;&lt;span style="color: black;"&gt;self&lt;/span&gt;&lt;span style="color: #0000c0;"&gt;.&lt;/span&gt;&lt;span style="color: black;"&gt;xdim&lt;/span&gt;&lt;span style="color: #0000c0;"&gt;,&lt;/span&gt; &lt;span style="color: black;"&gt;self&lt;/span&gt;&lt;span style="color: #0000c0;"&gt;.&lt;/span&gt;&lt;span style="color: black;"&gt;ydim&lt;/span&gt;&lt;span style="color: #0000c0;"&gt;)&lt;/span&gt; &lt;span style="color: #0000c0;"&gt;=&lt;/span&gt; &lt;span style="color: #0000c0;"&gt;(&lt;/span&gt;&lt;span style="color: black;"&gt;xdim&lt;/span&gt;&lt;span style="color: #0000c0;"&gt;,&lt;/span&gt; &lt;span style="color: black;"&gt;ydim&lt;/span&gt;&lt;span style="color: #0000c0;"&gt;)&lt;/span&gt;

    &lt;span style="color: #c00000;"&gt;def&lt;/span&gt; &lt;span style="color: black;"&gt;find_unused_place_for_robot&lt;/span&gt;&lt;span style="color: #0000c0;"&gt;(&lt;/span&gt;&lt;span style="color: black;"&gt;self&lt;/span&gt;&lt;span style="color: #0000c0;"&gt;,&lt;/span&gt; &lt;span style="color: black;"&gt;robotname&lt;/span&gt;&lt;span style="color: #0000c0;"&gt;)&lt;/span&gt;&lt;span style="color: #0000c0;"&gt;:&lt;/span&gt;
        &lt;span style="color: #0000c0;"&gt;(&lt;/span&gt;&lt;span style="color: black;"&gt;x&lt;/span&gt;&lt;span style="color: #0000c0;"&gt;,&lt;/span&gt; &lt;span style="color: black;"&gt;y&lt;/span&gt;&lt;span style="color: #0000c0;"&gt;)&lt;/span&gt; &lt;span style="color: #0000c0;"&gt;=&lt;/span&gt; &lt;span style="color: black;"&gt;randint&lt;/span&gt;&lt;span style="color: #0000c0;"&gt;(&lt;/span&gt;&lt;span style="color: #0080c0;"&gt;0&lt;/span&gt;&lt;span style="color: #0000c0;"&gt;,&lt;/span&gt;&lt;span style="color: black;"&gt;self&lt;/span&gt;&lt;span style="color: #0000c0;"&gt;.&lt;/span&gt;&lt;span style="color: black;"&gt;xdim&lt;/span&gt;&lt;span style="color: #0000c0;"&gt;-&lt;/span&gt;&lt;span style="color: #0080c0;"&gt;1&lt;/span&gt;&lt;span style="color: #0000c0;"&gt;)&lt;/span&gt;&lt;span style="color: #0000c0;"&gt;,&lt;/span&gt; &lt;span style="color: black;"&gt;randint&lt;/span&gt;&lt;span style="color: #0000c0;"&gt;(&lt;/span&gt;&lt;span style="color: #0080c0;"&gt;0&lt;/span&gt;&lt;span style="color: #0000c0;"&gt;,&lt;/span&gt;&lt;span style="color: black;"&gt;self&lt;/span&gt;&lt;span style="color: #0000c0;"&gt;.&lt;/span&gt;&lt;span style="color: black;"&gt;ydim&lt;/span&gt;&lt;span style="color: #0000c0;"&gt;-&lt;/span&gt;&lt;span style="color: #0080c0;"&gt;1&lt;/span&gt;&lt;span style="color: #0000c0;"&gt;)&lt;/span&gt;
        &lt;span style="color: #c00000;"&gt;if&lt;/span&gt; &lt;span style="color: #c00000;"&gt;not&lt;/span&gt; &lt;span style="color: black;"&gt;self&lt;/span&gt;&lt;span style="color: #0000c0;"&gt;.&lt;/span&gt;&lt;span style="color: black;"&gt;arena&lt;/span&gt;&lt;span style="color: #0000c0;"&gt;[&lt;/span&gt;&lt;span style="color: black;"&gt;x&lt;/span&gt;&lt;span style="color: #0000c0;"&gt;]&lt;/span&gt;&lt;span style="color: #0000c0;"&gt;[&lt;/span&gt;&lt;span style="color: black;"&gt;y&lt;/span&gt;&lt;span style="color: #0000c0;"&gt;]&lt;/span&gt;&lt;span style="color: #0000c0;"&gt;:&lt;/span&gt;
            &lt;span style="color: black;"&gt;self&lt;/span&gt;&lt;span style="color: #0000c0;"&gt;.&lt;/span&gt;&lt;span style="color: black;"&gt;arena&lt;/span&gt;&lt;span style="color: #0000c0;"&gt;[&lt;/span&gt;&lt;span style="color: black;"&gt;x&lt;/span&gt;&lt;span style="color: #0000c0;"&gt;]&lt;/span&gt;&lt;span style="color: #0000c0;"&gt;[&lt;/span&gt;&lt;span style="color: black;"&gt;y&lt;/span&gt;&lt;span style="color: #0000c0;"&gt;]&lt;/span&gt; &lt;span style="color: #0000c0;"&gt;=&lt;/span&gt; &lt;span style="color: black;"&gt;robotname&lt;/span&gt;
        &lt;span style="color: #c00000;"&gt;return&lt;/span&gt; &lt;span style="color: black;"&gt;self&lt;/span&gt;&lt;span style="color: #0000c0;"&gt;.&lt;/span&gt;&lt;span style="color: black;"&gt;arena&lt;/span&gt;&lt;span style="color: #0000c0;"&gt;[&lt;/span&gt;&lt;span style="color: black;"&gt;x&lt;/span&gt;&lt;span style="color: #0000c0;"&gt;]&lt;/span&gt;&lt;span style="color: #0000c0;"&gt;[&lt;/span&gt;&lt;span style="color: black;"&gt;y&lt;/span&gt;&lt;span style="color: #0000c0;"&gt;]&lt;/span&gt; &lt;span style="color: #0000c0;"&gt;==&lt;/span&gt; &lt;span style="color: black;"&gt;robotname&lt;/span&gt;

&lt;span style="color: #c00000;"&gt;class&lt;/span&gt; &lt;span style="color: black;"&gt;Robot&lt;/span&gt;&lt;span style="color: #0000c0;"&gt;:&lt;/span&gt;
    &lt;span style="color: #c00000;"&gt;def&lt;/span&gt; &lt;span style="color: black;"&gt;__init__&lt;/span&gt;&lt;span style="color: #0000c0;"&gt;(&lt;/span&gt;&lt;span style="color: black;"&gt;self&lt;/span&gt;&lt;span style="color: #0000c0;"&gt;,&lt;/span&gt; &lt;span style="color: black;"&gt;name&lt;/span&gt;&lt;span style="color: #0000c0;"&gt;=&lt;/span&gt;&lt;span style="color: #0080c0;"&gt;0&lt;/span&gt;&lt;span style="color: #0000c0;"&gt;,&lt;/span&gt; &lt;span style="color: black;"&gt;arena&lt;/span&gt;&lt;span style="color: #0000c0;"&gt;=&lt;/span&gt;&lt;span style="color: black;"&gt;None&lt;/span&gt;&lt;span style="color: #0000c0;"&gt;,&lt;/span&gt; &lt;span style="color: black;"&gt;maxrounds&lt;/span&gt;&lt;span style="color: #0000c0;"&gt;=&lt;/span&gt;&lt;span style="color: #0080c0;"&gt;0&lt;/span&gt;&lt;span style="color: #0000c0;"&gt;)&lt;/span&gt;&lt;span style="color: #0000c0;"&gt;:&lt;/span&gt;
        &lt;span style="color: black;"&gt;self&lt;/span&gt;&lt;span style="color: #0000c0;"&gt;.&lt;/span&gt;&lt;span style="color: black;"&gt;name&lt;/span&gt; &lt;span style="color: #0000c0;"&gt;=&lt;/span&gt; &lt;span style="color: black;"&gt;name&lt;/span&gt;
        &lt;span style="color: black;"&gt;self&lt;/span&gt;&lt;span style="color: #0000c0;"&gt;.&lt;/span&gt;&lt;span style="color: black;"&gt;arena&lt;/span&gt; &lt;span style="color: #0000c0;"&gt;=&lt;/span&gt; &lt;span style="color: black;"&gt;arena&lt;/span&gt;
        &lt;span style="color: black;"&gt;self&lt;/span&gt;&lt;span style="color: #0000c0;"&gt;.&lt;/span&gt;&lt;span style="color: black;"&gt;points&lt;/span&gt; &lt;span style="color: #0000c0;"&gt;=&lt;/span&gt; &lt;span style="color: #0080c0;"&gt;0&lt;/span&gt;
        &lt;span style="color: black;"&gt;self&lt;/span&gt;&lt;span style="color: #0000c0;"&gt;.&lt;/span&gt;&lt;span style="color: black;"&gt;maxrounds&lt;/span&gt; &lt;span style="color: #0000c0;"&gt;=&lt;/span&gt; &lt;span style="color: black;"&gt;maxrounds&lt;/span&gt;

        &lt;span style="color: green;"&gt;# bind Robot's live method to it's tasklet&lt;/span&gt;
        &lt;span style="color: black;"&gt;self&lt;/span&gt;&lt;span style="color: #0000c0;"&gt;.&lt;/span&gt;&lt;span style="color: black;"&gt;tasklet&lt;/span&gt; &lt;span style="color: #0000c0;"&gt;=&lt;/span&gt; &lt;span style="color: black;"&gt;stackless&lt;/span&gt;&lt;span style="color: #0000c0;"&gt;.&lt;/span&gt;&lt;span style="color: black;"&gt;tasklet&lt;/span&gt;&lt;span style="color: #0000c0;"&gt;(&lt;/span&gt;&lt;span style="color: black;"&gt;self&lt;/span&gt;&lt;span style="color: #0000c0;"&gt;.&lt;/span&gt;&lt;span style="color: black;"&gt;live&lt;/span&gt;&lt;span style="color: #0000c0;"&gt;)&lt;/span&gt;&lt;span style="color: #0000c0;"&gt;(&lt;/span&gt;&lt;span style="color: #0000c0;"&gt;)&lt;/span&gt;

    &lt;span style="color: #c00000;"&gt;def&lt;/span&gt; &lt;span style="color: black;"&gt;live&lt;/span&gt;&lt;span style="color: #0000c0;"&gt;(&lt;/span&gt;&lt;span style="color: black;"&gt;self&lt;/span&gt;&lt;span style="color: #0000c0;"&gt;)&lt;/span&gt;&lt;span style="color: #0000c0;"&gt;:&lt;/span&gt;
        &lt;span style="color: black;"&gt;rounds&lt;/span&gt; &lt;span style="color: #0000c0;"&gt;=&lt;/span&gt; &lt;span style="color: #0080c0;"&gt;0&lt;/span&gt;
        &lt;span style="color: #c00000;"&gt;while&lt;/span&gt; &lt;span style="color: black;"&gt;rounds&lt;/span&gt; &lt;span class="Apple-style-span" style="color: #0000c0;"&gt;&amp;lt;&lt;/span&gt; &lt;span style="color: black;"&gt;self&lt;/span&gt;&lt;span style="color: #0000c0;"&gt;.&lt;/span&gt;&lt;span style="color: black;"&gt;maxrounds&lt;/span&gt;&lt;span style="color: #0000c0;"&gt;:&lt;/span&gt;
            &lt;span style="color: black;"&gt;self&lt;/span&gt;&lt;span style="color: #0000c0;"&gt;.&lt;/span&gt;&lt;span style="color: black;"&gt;play&lt;/span&gt;&lt;span style="color: #0000c0;"&gt;(&lt;/span&gt;&lt;span style="color: #0000c0;"&gt;)&lt;/span&gt;
            &lt;span style="color: black;"&gt;rounds&lt;/span&gt; &lt;span style="color: #0000c0;"&gt;+=&lt;/span&gt; &lt;span style="color: #0080c0;"&gt;1&lt;/span&gt;
        &lt;span style="color: black;"&gt;self&lt;/span&gt;&lt;span style="color: #0000c0;"&gt;.&lt;/span&gt;&lt;span style="color: black;"&gt;tasklet&lt;/span&gt;&lt;span style="color: #0000c0;"&gt;.&lt;/span&gt;&lt;span style="color: black;"&gt;kill&lt;/span&gt;&lt;span style="color: #0000c0;"&gt;(&lt;/span&gt;&lt;span style="color: #0000c0;"&gt;)&lt;/span&gt;

    &lt;span style="color: #c00000;"&gt;def&lt;/span&gt; &lt;span style="color: black;"&gt;play&lt;/span&gt;&lt;span style="color: #0000c0;"&gt;(&lt;/span&gt;&lt;span style="color: black;"&gt;self&lt;/span&gt;&lt;span style="color: #0000c0;"&gt;)&lt;/span&gt;&lt;span style="color: #0000c0;"&gt;:&lt;/span&gt;
        &lt;span style="color: green;"&gt;# entire play method is atomically executed&lt;/span&gt;
        &lt;span style="color: black;"&gt;atomic&lt;/span&gt; &lt;span style="color: #0000c0;"&gt;=&lt;/span&gt; &lt;span style="color: black;"&gt;self&lt;/span&gt;&lt;span style="color: #0000c0;"&gt;.&lt;/span&gt;&lt;span style="color: black;"&gt;tasklet&lt;/span&gt;&lt;span style="color: #0000c0;"&gt;.&lt;/span&gt;&lt;span style="color: black;"&gt;set_atomic&lt;/span&gt;&lt;span style="color: #0000c0;"&gt;(&lt;/span&gt;&lt;span style="color: black;"&gt;True&lt;/span&gt;&lt;span style="color: #0000c0;"&gt;)&lt;/span&gt;
        &lt;span style="color: #c00000;"&gt;if&lt;/span&gt; &lt;span style="color: black;"&gt;self&lt;/span&gt;&lt;span style="color: #0000c0;"&gt;.&lt;/span&gt;&lt;span style="color: black;"&gt;arena&lt;/span&gt;&lt;span style="color: #0000c0;"&gt;.&lt;/span&gt;&lt;span style="color: black;"&gt;find_unused_place_for_robot&lt;/span&gt;&lt;span style="color: #0000c0;"&gt;(&lt;/span&gt;&lt;span style="color: black;"&gt;self&lt;/span&gt;&lt;span style="color: #0000c0;"&gt;.&lt;/span&gt;&lt;span style="color: black;"&gt;name&lt;/span&gt;&lt;span style="color: #0000c0;"&gt;)&lt;/span&gt;&lt;span style="color: #0000c0;"&gt;:&lt;/span&gt;
            &lt;span style="color: black;"&gt;self&lt;/span&gt;&lt;span style="color: #0000c0;"&gt;.&lt;/span&gt;&lt;span style="color: black;"&gt;points&lt;/span&gt; &lt;span style="color: #0000c0;"&gt;+=&lt;/span&gt; &lt;span style="color: #0080c0;"&gt;1&lt;/span&gt;
        &lt;span style="color: black;"&gt;self&lt;/span&gt;&lt;span style="color: #0000c0;"&gt;.&lt;/span&gt;&lt;span style="color: black;"&gt;tasklet&lt;/span&gt;&lt;span style="color: #0000c0;"&gt;.&lt;/span&gt;&lt;span style="color: black;"&gt;set_atomic&lt;/span&gt;&lt;span style="color: #0000c0;"&gt;(&lt;/span&gt;&lt;span style="color: black;"&gt;atomic&lt;/span&gt;&lt;span style="color: #0000c0;"&gt;)&lt;/span&gt;

&lt;span style="color: #c00000;"&gt;class&lt;/span&gt; &lt;span style="color: black;"&gt;RobotArenaSimulator&lt;/span&gt;&lt;span style="color: #0000c0;"&gt;:&lt;/span&gt;
    &lt;span style="color: #c00000;"&gt;def&lt;/span&gt; &lt;span style="color: black;"&gt;__init__&lt;/span&gt;&lt;span style="color: #0000c0;"&gt;(&lt;/span&gt;&lt;span style="color: black;"&gt;self&lt;/span&gt;&lt;span style="color: #0000c0;"&gt;,&lt;/span&gt; &lt;span style="color: black;"&gt;num_robots&lt;/span&gt;&lt;span style="color: #0000c0;"&gt;,&lt;/span&gt; &lt;span style="color: black;"&gt;xdim&lt;/span&gt;&lt;span style="color: #0000c0;"&gt;,&lt;/span&gt; &lt;span style="color: black;"&gt;ydim&lt;/span&gt;&lt;span style="color: #0000c0;"&gt;,&lt;/span&gt; &lt;span style="color: black;"&gt;maxrounds&lt;/span&gt;&lt;span style="color: #0000c0;"&gt;)&lt;/span&gt;&lt;span style="color: #0000c0;"&gt;:&lt;/span&gt;
        &lt;span style="color: black;"&gt;self&lt;/span&gt;&lt;span style="color: #0000c0;"&gt;.&lt;/span&gt;&lt;span style="color: black;"&gt;maxrounds&lt;/span&gt; &lt;span style="color: #0000c0;"&gt;=&lt;/span&gt; &lt;span style="color: black;"&gt;maxrounds&lt;/span&gt;
        &lt;span style="color: black;"&gt;self&lt;/span&gt;&lt;span style="color: #0000c0;"&gt;.&lt;/span&gt;&lt;span style="color: black;"&gt;arena&lt;/span&gt; &lt;span style="color: #0000c0;"&gt;=&lt;/span&gt; &lt;span style="color: black;"&gt;Arena&lt;/span&gt;&lt;span style="color: #0000c0;"&gt;(&lt;/span&gt;&lt;span style="color: black;"&gt;xdim&lt;/span&gt;&lt;span style="color: #0000c0;"&gt;,&lt;/span&gt; &lt;span style="color: black;"&gt;ydim&lt;/span&gt;&lt;span style="color: #0000c0;"&gt;)&lt;/span&gt;
        &lt;span style="color: black;"&gt;self&lt;/span&gt;&lt;span style="color: #0000c0;"&gt;.&lt;/span&gt;&lt;span style="color: black;"&gt;robots&lt;/span&gt; &lt;span style="color: #0000c0;"&gt;=&lt;/span&gt; &lt;span style="color: #0000c0;"&gt;[&lt;/span&gt;&lt;span style="color: black;"&gt;Robot&lt;/span&gt;&lt;span style="color: #0000c0;"&gt;(&lt;/span&gt;&lt;span style="color: black;"&gt;id&lt;/span&gt;&lt;span style="color: #0000c0;"&gt;,&lt;/span&gt; &lt;span style="color: black;"&gt;self&lt;/span&gt;&lt;span style="color: #0000c0;"&gt;.&lt;/span&gt;&lt;span style="color: black;"&gt;arena&lt;/span&gt;&lt;span style="color: #0000c0;"&gt;,&lt;/span&gt; &lt;span style="color: black;"&gt;maxrounds&lt;/span&gt;&lt;span style="color: #0000c0;"&gt;)&lt;/span&gt;
                       &lt;span style="color: #c00000;"&gt;for&lt;/span&gt; &lt;span style="color: black;"&gt;id&lt;/span&gt; &lt;span style="color: #c00000;"&gt;in&lt;/span&gt; &lt;span style="color: black;"&gt;range&lt;/span&gt;&lt;span style="color: #0000c0;"&gt;(&lt;/span&gt;&lt;span style="color: #0080c0;"&gt;1&lt;/span&gt;&lt;span style="color: #0000c0;"&gt;,&lt;/span&gt;&lt;span style="color: black;"&gt;num_robots&lt;/span&gt;&lt;span style="color: #0000c0;"&gt;+&lt;/span&gt;&lt;span style="color: #0080c0;"&gt;1&lt;/span&gt;&lt;span style="color: #0000c0;"&gt;)&lt;/span&gt;&lt;span style="color: #0000c0;"&gt;]&lt;/span&gt;&lt;/span&gt;&lt;/pre&gt;&lt;pre&gt;&lt;span style="font-family: Lucida, 'Courier New';"&gt;&lt;span class="Apple-style-span" style="color: #0000c0;"&gt;    &lt;/span&gt;&lt;span style="color: #c00000;"&gt;def&lt;/span&gt; &lt;span style="color: black;"&gt;run_preemptive&lt;/span&gt;&lt;span style="color: #0000c0;"&gt;(&lt;/span&gt;&lt;span style="color: black;"&gt;self&lt;/span&gt;&lt;span style="color: #0000c0;"&gt;,&lt;/span&gt; &lt;span style="color: black;"&gt;nopreempt_steps&lt;/span&gt;&lt;span style="color: #0000c0;"&gt;=&lt;/span&gt;&lt;span style="color: #0080c0;"&gt;1&lt;/span&gt;&lt;span style="color: #0000c0;"&gt;)&lt;/span&gt;&lt;span style="color: #0000c0;"&gt;:&lt;/span&gt;
        &lt;span style="color: black;"&gt;tstart&lt;/span&gt; &lt;span style="color: #0000c0;"&gt;=&lt;/span&gt; &lt;span style="color: black;"&gt;time&lt;/span&gt;&lt;span style="color: #0000c0;"&gt;.&lt;/span&gt;&lt;span style="color: black;"&gt;clock&lt;/span&gt;&lt;span style="color: #0000c0;"&gt;(&lt;/span&gt;&lt;span style="color: #0000c0;"&gt;)&lt;/span&gt;
        &lt;span style="color: #c00000;"&gt;while&lt;/span&gt; &lt;span style="color: black;"&gt;stackless&lt;/span&gt;&lt;span style="color: #0000c0;"&gt;.&lt;/span&gt;&lt;span style="color: black;"&gt;getruncount&lt;/span&gt;&lt;span style="color: #0000c0;"&gt;(&lt;/span&gt;&lt;span style="color: #0000c0;"&gt;)&lt;/span&gt; &lt;span style="color: #0000c0;"&gt;!=&lt;/span&gt; &lt;span style="color: #0080c0;"&gt;1&lt;/span&gt;&lt;span style="color: #0000c0;"&gt;:&lt;/span&gt;
            &lt;span style="color: green;"&gt;# run() takes out the tasklet after nopreempt_steps&lt;/span&gt;
            &lt;span style="color: black;"&gt;t&lt;/span&gt; &lt;span style="color: #0000c0;"&gt;=&lt;/span&gt; &lt;span style="color: black;"&gt;stackless&lt;/span&gt;&lt;span style="color: #0000c0;"&gt;.&lt;/span&gt;&lt;span style="color: black;"&gt;run&lt;/span&gt;&lt;span style="color: #0000c0;"&gt;(&lt;/span&gt;&lt;span style="color: black;"&gt;nopreempt_steps&lt;/span&gt;&lt;span style="color: #0000c0;"&gt;)&lt;/span&gt;
            &lt;span style="color: green;"&gt;# so need to add the tasklet to scheduler again&lt;/span&gt;
            &lt;span style="color: #c00000;"&gt;if&lt;/span&gt; &lt;span style="color: black;"&gt;t&lt;/span&gt;&lt;span style="color: #0000c0;"&gt;:&lt;/span&gt; &lt;span style="color: black;"&gt;t&lt;/span&gt;&lt;span style="color: #0000c0;"&gt;.&lt;/span&gt;&lt;span style="color: black;"&gt;insert&lt;/span&gt;&lt;span style="color: #0000c0;"&gt;(&lt;/span&gt;&lt;span style="color: #0000c0;"&gt;)&lt;/span&gt;
        &lt;span style="color: #c00000;"&gt;return&lt;/span&gt; &lt;span style="color: #0000c0;"&gt;(&lt;/span&gt;&lt;span style="color: black;"&gt;time&lt;/span&gt;&lt;span style="color: #0000c0;"&gt;.&lt;/span&gt;&lt;span style="color: black;"&gt;clock&lt;/span&gt;&lt;span style="color: #0000c0;"&gt;(&lt;/span&gt;&lt;span style="color: #0000c0;"&gt;)&lt;/span&gt;&lt;span style="color: #0000c0;"&gt;-&lt;/span&gt;&lt;span style="color: black;"&gt;tstart&lt;/span&gt;&lt;span style="color: #0000c0;"&gt;)&lt;/span&gt;

&lt;span style="color: #c00000;"&gt;if&lt;/span&gt; &lt;span style="color: black;"&gt;__name__&lt;/span&gt; &lt;span style="color: #0000c0;"&gt;==&lt;/span&gt; &lt;span style="color: #004080;"&gt;"__main__"&lt;/span&gt;&lt;span style="color: #0000c0;"&gt;:&lt;/span&gt;
    &lt;span style="color: black;"&gt;tstart&lt;/span&gt; &lt;span style="color: #0000c0;"&gt;=&lt;/span&gt; &lt;span style="color: black;"&gt;time&lt;/span&gt;&lt;span style="color: #0000c0;"&gt;.&lt;/span&gt;&lt;span style="color: black;"&gt;clock&lt;/span&gt;&lt;span style="color: #0000c0;"&gt;(&lt;/span&gt;&lt;span style="color: #0000c0;"&gt;)&lt;/span&gt;
    &lt;span style="color: black;"&gt;simulator&lt;/span&gt; &lt;span style="color: #0000c0;"&gt;=&lt;/span&gt; &lt;span style="color: black;"&gt;RobotArenaSimulator&lt;/span&gt;&lt;span style="color: #0000c0;"&gt;(&lt;/span&gt;&lt;span style="color: black;"&gt;num_robots&lt;/span&gt; &lt;span style="color: #0000c0;"&gt;=&lt;/span&gt; &lt;span style="color: #0080c0;"&gt;100000&lt;/span&gt;&lt;span style="color: #0000c0;"&gt;,&lt;/span&gt;
                                    &lt;span style="color: black;"&gt;xdim&lt;/span&gt; &lt;span style="color: #0000c0;"&gt;=&lt;/span&gt; &lt;span style="color: #0080c0;"&gt;10000&lt;/span&gt;&lt;span style="color: #0000c0;"&gt;,&lt;/span&gt; &lt;span style="color: black;"&gt;ydim&lt;/span&gt; &lt;span style="color: #0000c0;"&gt;=&lt;/span&gt; &lt;span style="color: #0080c0;"&gt;10000&lt;/span&gt;&lt;span style="color: #0000c0;"&gt;,&lt;/span&gt;
                                    &lt;span style="color: black;"&gt;maxrounds&lt;/span&gt; &lt;span style="color: #0000c0;"&gt;=&lt;/span&gt; &lt;span style="color: #0080c0;"&gt;10&lt;/span&gt;&lt;span style="color: #0000c0;"&gt;)&lt;/span&gt;
    &lt;span style="color: black;"&gt;simulationtime&lt;/span&gt; &lt;span style="color: #0000c0;"&gt;=&lt;/span&gt; &lt;span style="color: black;"&gt;simulator&lt;/span&gt;&lt;span style="color: #0000c0;"&gt;.&lt;/span&gt;&lt;span style="color: black;"&gt;run_preemptive&lt;/span&gt;&lt;span style="color: #0000c0;"&gt;(&lt;/span&gt;&lt;span style="color: #0000c0;"&gt;)&lt;/span&gt;
    &lt;span style="color: #c00000;"&gt;print&lt;/span&gt; &lt;span style="color: #004080;"&gt;"simulation time was %.2f seconds"&lt;/span&gt; &lt;span style="color: #0000c0;"&gt;%&lt;/span&gt; &lt;span style="color: #0000c0;"&gt;(&lt;/span&gt;&lt;span style="color: black;"&gt;simulationtime&lt;/span&gt;&lt;span style="color: #0000c0;"&gt;)&lt;/span&gt;
    &lt;span style="color: #c00000;"&gt;print&lt;/span&gt; &lt;span style="color: #004080;"&gt;"total running time was %.2f seconds"&lt;/span&gt; &lt;span style="color: #0000c0;"&gt;%&lt;/span&gt; &lt;span style="color: #0000c0;"&gt;(&lt;/span&gt;&lt;span style="color: black;"&gt;time&lt;/span&gt;&lt;span style="color: #0000c0;"&gt;.&lt;/span&gt;&lt;span style="color: black;"&gt;clock&lt;/span&gt;&lt;span style="color: #0000c0;"&gt;(&lt;/span&gt;&lt;span style="color: #0000c0;"&gt;)&lt;/span&gt;&lt;span style="color: #0000c0;"&gt;-&lt;/span&gt;&lt;span style="color: black;"&gt;tstart&lt;/span&gt;&lt;span style="color: #0000c0;"&gt;)&lt;/span&gt;&lt;span style="color: black;"&gt;&lt;/span&gt;&lt;/span&gt;&lt;/pre&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/1024937100240932334-6156953348503553271?l=amundblog.blogspot.com' alt='' /&gt;&lt;/div&gt;&lt;div class="feedflare"&gt;
&lt;a href="http://feeds.feedburner.com/~f/AmundsBlog?a=PaTyxLPh"&gt;&lt;img src="http://feeds.feedburner.com/~f/AmundsBlog?d=41" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~f/AmundsBlog?a=iP7UBn0y"&gt;&lt;img src="http://feeds.feedburner.com/~f/AmundsBlog?i=iP7UBn0y" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~f/AmundsBlog?a=qskrxGfM"&gt;&lt;img src="http://feeds.feedburner.com/~f/AmundsBlog?d=42" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~f/AmundsBlog?a=tpM0rs4y"&gt;&lt;img src="http://feeds.feedburner.com/~f/AmundsBlog?i=tpM0rs4y" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~f/AmundsBlog?a=NzOQTHoM"&gt;&lt;img src="http://feeds.feedburner.com/~f/AmundsBlog?d=52" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~f/AmundsBlog?a=wszV3NNV"&gt;&lt;img src="http://feeds.feedburner.com/~f/AmundsBlog?i=wszV3NNV" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~f/AmundsBlog?a=P6X59ixs"&gt;&lt;img src="http://feeds.feedburner.com/~f/AmundsBlog?d=43" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~f/AmundsBlog?a=WJDMdbH8"&gt;&lt;img src="http://feeds.feedburner.com/~f/AmundsBlog?d=50" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~f/AmundsBlog?a=IgqjMncy"&gt;&lt;img src="http://feeds.feedburner.com/~f/AmundsBlog?i=IgqjMncy" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~f/AmundsBlog?a=PE9AzwfY"&gt;&lt;img src="http://feeds.feedburner.com/~f/AmundsBlog?d=54" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~f/AmundsBlog?a=OGDIEqTG"&gt;&lt;img src="http://feeds.feedburner.com/~f/AmundsBlog?d=129" border="0"&gt;&lt;/img&gt;&lt;/a&gt;
&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/AmundsBlog/~4/d9ifBVMjw6M" height="1" width="1"/&gt;</content><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/1024937100240932334/posts/default/6156953348503553271?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/1024937100240932334/posts/default/6156953348503553271?v=2" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/AmundsBlog/~3/d9ifBVMjw6M/example-of-microsimulation-with.html" title="Example of Microsimulation with Stackless Python" /><author><name>Amund Tveit</name><uri>https://profiles.google.com/110451251449823277794</uri><email>noreply@blogger.com</email><gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="32" height="32" src="//lh6.googleusercontent.com/-zZKi4b5TYQY/AAAAAAAAAAI/AAAAAAAAAAA/_eaVu-shzqo/s512-c/photo.jpg" /></author><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="http://4.bp.blogspot.com/_2DnUjV2gKmw/SPm0sHHMY8I/AAAAAAAAC0U/igYkFOP98Vc/s72-Rc/robotmusicalchairs.png" height="72" width="72" /><feedburner:origLink>http://amundblog.blogspot.com/2008/10/example-of-microsimulation-with.html</feedburner:origLink></entry><entry gd:etag="W/&quot;Ak4ERHY4eCp7ImA9WxdVE0o.&quot;"><id>tag:blogger.com,1999:blog-1024937100240932334.post-7304274048201639935</id><published>2008-07-18T08:30:00.016+01:00</published><updated>2008-07-18T12:01:45.830+01:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2008-07-18T12:01:45.830+01:00</app:edited><category scheme="http://www.blogger.com/atom/ns#" term="statistics" /><category scheme="http://www.blogger.com/atom/ns#" term="theory" /><category scheme="http://www.blogger.com/atom/ns#" term="confounding" /><category scheme="http://www.blogger.com/atom/ns#" term="science" /><title>The Rebirth of Confounding and Theory in Science?</title><content type="html">
&lt;p&gt;&lt;a href="http://feedads.g.doubleclick.net/~a/Gk7mYWXDlAIT9bxdmr3xOx4jH4E/0/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/Gk7mYWXDlAIT9bxdmr3xOx4jH4E/0/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;br/&gt;
&lt;a href="http://feedads.g.doubleclick.net/~a/Gk7mYWXDlAIT9bxdmr3xOx4jH4E/1/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/Gk7mYWXDlAIT9bxdmr3xOx4jH4E/1/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;/p&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://4.bp.blogspot.com/_2DnUjV2gKmw/SIBv65jeEII/AAAAAAAACyU/eEdHjTE66XY/s1600-h/confounding.png"&gt;&lt;img style="cursor: pointer;" src="http://4.bp.blogspot.com/_2DnUjV2gKmw/SIBv65jeEII/AAAAAAAACyU/eEdHjTE66XY/s400/confounding.png" alt="" id="BLOGGER_PHOTO_ID_5224298625422463106" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;Wired recently published an interesting article titled: &lt;a href="http://www.wired.com/science/discoveries/magazine/16-07/pb_theory"&gt;The End of Theory: The Data Deluge Makes the Scientific Method Obsolete&lt;/a&gt;, where they roughly conclude that with enough data and processing correlation is all you need. While interesting I think it misses a few important points.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;Confounding variables&lt;/span&gt;&lt;br /&gt;At the end of the article they claimed: &lt;span style="font-style: italic;"&gt;"Correlation supersedes causation, and science can advance even without coherent models, unified theories, or really any mechanistic explanation at all"&lt;/span&gt;.&lt;br /&gt;&lt;br /&gt;Correlation between two variables can give &lt;span style="font-style: italic;"&gt;some&lt;/span&gt; information, and with a lot of data and computational horsepower you can find correlation relatively easily, but the danger is if correlation is interpreted as causation (and that can happen).&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;Example: Correlation between GDP and Children´s Weight&lt;/span&gt;&lt;br /&gt;An example is the positive correlation between a country´s Gross Domestic Product (GDP) and the weight of its children, if that was interpreted as a causation the cheapest way to increase GDP for a country would be put kids on e.g. a &lt;a href="http://en.wikipedia.org/wiki/Chankonabe"&gt;Chankonabe&lt;/a&gt; diet (note: I am not saying that is a likely action). The GDP and weight correlation is an example of where a third &lt;a href="http://en.wikipedia.org/wiki/Confounding_variable"&gt;confounding variable&lt;/a&gt; &lt;span style="font-style: italic;"&gt;time&lt;/span&gt; was not accounted for.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;Example: Correlation between substance X and your health&lt;/span&gt;&lt;br /&gt;In the press you frequently see eating/drinking substance X is good for your health and makes you live longer, in several of those cases I believe correlation is reported and not the confounding variables, i.e. many of these substances are luxury goods and may not be affordable to most of the worlds population, so the confounding variable might be personal economy which is probably correlated with access to vaccines and medical care.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;The value of theory&lt;/span&gt;&lt;br /&gt;My personal hypothesis is that the likelihood of not finding confounding variables increases exponentially with the complexity or level of abstractness of the domain investigated for correlation (e.g. in medicine, farmacology, biology or physics) The useful information is more likely to be found when discovering confounding variables, and the correlation is primarily a signal that says that something exciting is underneath (there can be cases where correlation is sufficiently interesting in itself though). In order to find or propose confounding variables I believe the need for models and theories is still very much needed, probably even more than earlier (but the simplicity or complexity of models is another discussion, I tend to lean towards KISS).&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold; color: rgb(204, 0, 0);"&gt;Disclaimer&lt;/span&gt;&lt;span style="color: rgb(204, 0, 0);"&gt;: This posting (and all my others) represent only &lt;/span&gt;&lt;span style="font-style: italic; color: rgb(204, 0, 0);"&gt;my personal &lt;/span&gt;&lt;span style="color: rgb(204, 0, 0);"&gt;views.&lt;/span&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/1024937100240932334-7304274048201639935?l=amundblog.blogspot.com' alt='' /&gt;&lt;/div&gt;&lt;div class="feedflare"&gt;
&lt;a href="http://feeds.feedburner.com/~f/AmundsBlog?a=hDBnFv5x"&gt;&lt;img src="http://feeds.feedburner.com/~f/AmundsBlog?d=41" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~f/AmundsBlog?a=3WF9RFcx"&gt;&lt;img src="http://feeds.feedburner.com/~f/AmundsBlog?i=3WF9RFcx" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~f/AmundsBlog?a=2NVtSrb8"&gt;&lt;img src="http://feeds.feedburner.com/~f/AmundsBlog?d=42" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~f/AmundsBlog?a=K6Xq0Wvq"&gt;&lt;img src="http://feeds.feedburner.com/~f/AmundsBlog?i=K6Xq0Wvq" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~f/AmundsBlog?a=Quwy5RmP"&gt;&lt;img src="http://feeds.feedburner.com/~f/AmundsBlog?d=52" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~f/AmundsBlog?a=oWPyIcXh"&gt;&lt;img src="http://feeds.feedburner.com/~f/AmundsBlog?i=oWPyIcXh" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~f/AmundsBlog?a=MJtOdu8c"&gt;&lt;img src="http://feeds.feedburner.com/~f/AmundsBlog?d=43" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~f/AmundsBlog?a=nszw6Aap"&gt;&lt;img src="http://feeds.feedburner.com/~f/AmundsBlog?d=50" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~f/AmundsBlog?a=9GORNkAd"&gt;&lt;img src="http://feeds.feedburner.com/~f/AmundsBlog?i=9GORNkAd" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~f/AmundsBlog?a=jdU4qX8i"&gt;&lt;img src="http://feeds.feedburner.com/~f/AmundsBlog?d=54" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~f/AmundsBlog?a=2zIUvp8k"&gt;&lt;img src="http://feeds.feedburner.com/~f/AmundsBlog?d=129" border="0"&gt;&lt;/img&gt;&lt;/a&gt;
&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/AmundsBlog/~4/TSFRAZT_o6Q" height="1" width="1"/&gt;</content><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/1024937100240932334/posts/default/7304274048201639935?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/1024937100240932334/posts/default/7304274048201639935?v=2" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/AmundsBlog/~3/TSFRAZT_o6Q/rebirth-of-confounding-and-theory-in.html" title="The Rebirth of Confounding and Theory in Science?" /><author><name>Amund Tveit</name><uri>https://profiles.google.com/110451251449823277794</uri><email>noreply@blogger.com</email><gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="32" height="32" src="//lh6.googleusercontent.com/-zZKi4b5TYQY/AAAAAAAAAAI/AAAAAAAAAAA/_eaVu-shzqo/s512-c/photo.jpg" /></author><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="http://4.bp.blogspot.com/_2DnUjV2gKmw/SIBv65jeEII/AAAAAAAACyU/eEdHjTE66XY/s72-c/confounding.png" height="72" width="72" /><category term="GDP" scheme="http://rss.financialcontent.com/stocksymbol" /><feedburner:origLink>http://amundblog.blogspot.com/2008/07/rebirth-of-confounding-and-theory-in.html</feedburner:origLink></entry><entry gd:etag="W/&quot;D0ADRnw5cCp7ImA9WxdVEEg.&quot;"><id>tag:blogger.com,1999:blog-1024937100240932334.post-3773600887078758414</id><published>2008-07-14T10:13:00.002+01:00</published><updated>2008-07-14T18:16:17.228+01:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2008-07-14T18:16:17.228+01:00</app:edited><category scheme="http://www.blogger.com/atom/ns#" term="echo chamber" /><category scheme="http://www.blogger.com/atom/ns#" term="navel gazing" /><title>Annual Echo Chamber</title><content type="html">
&lt;p&gt;&lt;a href="http://feedads.g.doubleclick.net/~a/RKpJfSatPOvXDBcwpKtZf3Z8b6U/0/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/RKpJfSatPOvXDBcwpKtZf3Z8b6U/0/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;br/&gt;
&lt;a href="http://feedads.g.doubleclick.net/~a/RKpJfSatPOvXDBcwpKtZf3Z8b6U/1/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/RKpJfSatPOvXDBcwpKtZf3Z8b6U/1/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;/p&gt;Having blogged for a bit more than a year (April 2007), here are some rough stats and opinions of blog entries so far.

Most read entries:
&lt;ol&gt;&lt;li&gt;&lt;a href="http://amundblog.blogspot.com/2008/05/pragmatic-classification-with-python.html"&gt;Pragmatic Classification with Python&lt;/a&gt;&lt;/li&gt;&lt;li&gt;&lt;a href="http://amundblog.blogspot.com/2008/02/python-is-concurrently-alive-and.html"&gt;Greenlet Python is concurrently alive and kicking&lt;/a&gt;&lt;/li&gt;&lt;li&gt;&lt;a href="http://amundblog.blogspot.com/2008/01/rpython-gclb-benchmark-recursive.html"&gt;RPython GCLB Benchmark - Recursive&lt;/a&gt;  &lt;/li&gt;&lt;li&gt;&lt;a href="http://amundblog.blogspot.com/2008/01/how-to-complete-your-phd.html"&gt;How to complete your PhD&lt;/a&gt; &lt;/li&gt;&lt;li&gt;&lt;a href="http://amundblog.blogspot.com/2008/01/future-number-of-programming-languages.html"&gt;Future number of programming languages - singularity or infinity?&lt;/a&gt;&lt;/li&gt;&lt;/ol&gt;In terms of self-eval (&lt;i&gt;read: navel gazing..&lt;/i&gt;) of entries, the list would look like this:
&lt;ul&gt;&lt;li&gt;&lt;a href="http://amundblog.blogspot.com/2008/01/increase-automation-of-test-driven.html"&gt;Increase Automation of Test-Driven Development&lt;/a&gt;&lt;/li&gt;&lt;li&gt;&lt;a href="http://amundblog.blogspot.com/2008/01/phd-subject-in-computer-science.html"&gt;PhD Subject in Computer Science? &lt;/a&gt;
&lt;/li&gt;&lt;li&gt;&lt;a href="http://amundblog.blogspot.com/2008/04/pragmatic-classification-very-basics.html"&gt;Pragmatic Classification: The very basics&lt;/a&gt;&lt;/li&gt;&lt;li&gt;&lt;a href="http://amundblog.blogspot.com/2008/06/pragmatic-classification-of-classifiers.html"&gt;Pragmatic Classification of Classifiers&lt;/a&gt;
&lt;/li&gt;&lt;li&gt;&lt;a href="http://amundblog.blogspot.com/2008/01/dining-philosophers-and-quarreling-kids.html"&gt;Dining Philosophers and Quarreling Kids&lt;/a&gt;&lt;/li&gt;&lt;/ul&gt;&lt;i&gt;As always this blog only expresses my personal opinions. &lt;/i&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/1024937100240932334-3773600887078758414?l=amundblog.blogspot.com' alt='' /&gt;&lt;/div&gt;&lt;div class="feedflare"&gt;
&lt;a href="http://feeds.feedburner.com/~f/AmundsBlog?a=QW7RHwlB"&gt;&lt;img src="http://feeds.feedburner.com/~f/AmundsBlog?d=41" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~f/AmundsBlog?a=QcHLkwrZ"&gt;&lt;img src="http://feeds.feedburner.com/~f/AmundsBlog?i=QcHLkwrZ" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~f/AmundsBlog?a=xcrj27d3"&gt;&lt;img src="http://feeds.feedburner.com/~f/AmundsBlog?d=42" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~f/AmundsBlog?a=BKnryqOW"&gt;&lt;img src="http://feeds.feedburner.com/~f/AmundsBlog?i=BKnryqOW" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~f/AmundsBlog?a=gj6hJuFH"&gt;&lt;img src="http://feeds.feedburner.com/~f/AmundsBlog?d=52" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~f/AmundsBlog?a=NAZRjFUx"&gt;&lt;img src="http://feeds.feedburner.com/~f/AmundsBlog?i=NAZRjFUx" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~f/AmundsBlog?a=Fz4Wkuiz"&gt;&lt;img src="http://feeds.feedburner.com/~f/AmundsBlog?d=43" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~f/AmundsBlog?a=160UT0fH"&gt;&lt;img src="http://feeds.feedburner.com/~f/AmundsBlog?d=50" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~f/AmundsBlog?a=hy96rMjx"&gt;&lt;img src="http://feeds.feedburner.com/~f/AmundsBlog?i=hy96rMjx" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~f/AmundsBlog?a=frNjxLrk"&gt;&lt;img src="http://feeds.feedburner.com/~f/AmundsBlog?d=54" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~f/AmundsBlog?a=mBgYtLVj"&gt;&lt;img src="http://feeds.feedburner.com/~f/AmundsBlog?d=129" border="0"&gt;&lt;/img&gt;&lt;/a&gt;
&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/AmundsBlog/~4/aZl45E5OA3A" height="1" width="1"/&gt;</content><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/1024937100240932334/posts/default/3773600887078758414?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/1024937100240932334/posts/default/3773600887078758414?v=2" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/AmundsBlog/~3/aZl45E5OA3A/annual-echo-chamber.html" title="Annual Echo Chamber" /><author><name>Amund Tveit</name><uri>https://profiles.google.com/110451251449823277794</uri><email>noreply@blogger.com</email><gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="32" height="32" src="//lh6.googleusercontent.com/-zZKi4b5TYQY/AAAAAAAAAAI/AAAAAAAAAAA/_eaVu-shzqo/s512-c/photo.jpg" /></author><feedburner:origLink>http://amundblog.blogspot.com/2008/07/annual-echo-chamber.html</feedburner:origLink></entry><entry gd:etag="W/&quot;CU8HSHg8eCp7ImA9WxdQEk8.&quot;"><id>tag:blogger.com,1999:blog-1024937100240932334.post-1966941322250251416</id><published>2008-06-11T21:54:00.006+01:00</published><updated>2008-06-11T23:37:19.670+01:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2008-06-11T23:37:19.670+01:00</app:edited><category scheme="http://www.blogger.com/atom/ns#" term="online" /><category scheme="http://www.blogger.com/atom/ns#" term="decremental" /><category scheme="http://www.blogger.com/atom/ns#" term="svm" /><category scheme="http://www.blogger.com/atom/ns#" term="hyperplane" /><category scheme="http://www.blogger.com/atom/ns#" term="parallel" /><category scheme="http://www.blogger.com/atom/ns#" term="machine learning" /><category scheme="http://www.blogger.com/atom/ns#" term="stochastic" /><category scheme="http://www.blogger.com/atom/ns#" term="incremental" /><title>Pragmatic Classification of Classifiers</title><content type="html">
&lt;p&gt;&lt;a href="http://feedads.g.doubleclick.net/~a/WGch9-3pOG4f1xFQJ1vggmzsDZo/0/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/WGch9-3pOG4f1xFQJ1vggmzsDZo/0/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;br/&gt;
&lt;a href="http://feedads.g.doubleclick.net/~a/WGch9-3pOG4f1xFQJ1vggmzsDZo/1/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/WGch9-3pOG4f1xFQJ1vggmzsDZo/1/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;/p&gt;&lt;span class="ft1"&gt;recap: In my previous machine learning related postings I have written about the&lt;a href="http://amundblog.blogspot.com/2008/04/pragmatic-classification-very-basics.html"&gt; basics of classification&lt;/a&gt; and given an overview of &lt;a href="http://amundblog.blogspot.com/2008/05/pragmatic-classification-with-python.html"&gt;Python tools for classificatio&lt;/a&gt;n (and also &lt;a href="http://amundblog.blogspot.com/2008/04/machine-learning-theory-dream-team.html"&gt;a machine learning dream team&lt;/a&gt; and &lt;a href="http://amundblog.blogspot.com/2008/01/increase-automation-of-test-driven.html"&gt;how to increase automation of test-driven development&lt;/a&gt;).&lt;br /&gt;&lt;br /&gt;In this posting I will "go meta" and say something about classes and characteristics of classifiers.&lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://2.bp.blogspot.com/_2DnUjV2gKmw/SFBQzZ1qOkI/AAAAAAAACvo/uMW0BPLub3Y/s1600-h/selectingclassifiers.png"&gt;&lt;img style="cursor: pointer;" src="http://2.bp.blogspot.com/_2DnUjV2gKmw/SFBQzZ1qOkI/AAAAAAAACvo/uMW0BPLub3Y/s400/selectingclassifiers.png" alt="" id="BLOGGER_PHOTO_ID_5210753612907166274" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;Informative vs Discriminative Classifiers&lt;/span&gt;&lt;br /&gt;&lt;span style="font-style: italic;"&gt;Informative classifiers&lt;/span&gt; model the densities of classes and select the class that most likely produce the features, in the naive bayes case this modeling involves counting (&lt;a href="http://jmvidal.cse.sc.edu/talks/bayesianlearning/nbex.xml?style=White"&gt;see here for an example&lt;/a&gt; with &lt;a href="http://jmvidal.cse.sc.edu/talks/decisiontrees/choosingbest.xml?style=White"&gt;these data&lt;/a&gt;).&lt;br /&gt;&lt;br /&gt;&lt;span style="font-style: italic;"&gt;Discriminative classifiers&lt;/span&gt; have a different approach - they try to model class boundary and membership directly, e.g. in a simple 2-feature dimension case this could mean trying to finding the line that best separates the classes (in &gt;3 feature dimensions case it would be looking for the &lt;a href="http://en.wikipedia.org/wiki/Hyperplane"&gt;hyperplane&lt;/a&gt; that best separate classes). Examples of discriminative classifiers are support vector machines (SVM) and ridge regression.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;Classifier training methods&lt;/span&gt;&lt;br /&gt;Many classifiers are &lt;span style="font-style: italic;"&gt;batch-based&lt;/span&gt;, that means that they need to have access to all training data at the same time (including historic data in a re-training case). &lt;span style="font-style: italic;"&gt;Online&lt;/span&gt; classifiers  don't need all data for every training round, they supporting updating the classifier data incrementally. A related training method is&lt;span style="font-style: italic;"&gt; decremental trainin&lt;/span&gt;g, which is about dealing with classifier problems where there is &lt;a href="http://en.wikipedia.org/wiki/Concept_drift"&gt;&lt;span style="font-style: italic;"&gt;concept drift&lt;/span&gt;&lt;/a&gt; (i.e. forgetting out-of-date examples). Other training methods include s&lt;span style="font-style: italic;"&gt;tochastic training &lt;/span&gt;which is about training using random samples of data.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;Linear vs Non-Linear Classifiers&lt;/span&gt;&lt;br /&gt;If you have a situation where one class is inside a circle and the other class is outside the circle (and surrounding the circle), it will be impossible to linearly separate the two classes (with a discriminative classifier), fortunately there are non-linear classifiers that can solve this (typically by transforming the problem into a more computationally heavier problem using a &lt;a href="http://en.wikipedia.org/wiki/Kernel_trick"&gt;kernel trick&lt;/a&gt;, but at least the new problem is possible to solve).&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;Sequential vs Parallel Classifiers&lt;/span&gt;&lt;br /&gt;Sequential classifier algorithms can typically utilize one core, cpu or machine, and parallel classifier algorithms are able to utilize more cores, cpus or machines (e.g. in order to handle more data or get faster results).&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;Non-orthogonal Data&lt;/span&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;&lt;/span&gt;Non-orthogonality is handled by some classifiers, this can happen when there are repeated occurrences of training data.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;Dependencies between features&lt;/span&gt;&lt;br /&gt;Dealing with dependencies between features (e.g. correlations) is handled by some classifiers (this is sometimes a symptom of potential for improvement in feature representation).&lt;br /&gt;&lt;/span&gt;&lt;span class="ft1"&gt;&lt;br /&gt;&lt;/span&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/1024937100240932334-1966941322250251416?l=amundblog.blogspot.com' alt='' /&gt;&lt;/div&gt;&lt;div class="feedflare"&gt;
&lt;a href="http://feeds.feedburner.com/~f/AmundsBlog?a=0XRBJdXs"&gt;&lt;img src="http://feeds.feedburner.com/~f/AmundsBlog?d=41" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~f/AmundsBlog?a=hDzjr7NQ"&gt;&lt;img src="http://feeds.feedburner.com/~f/AmundsBlog?i=hDzjr7NQ" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~f/AmundsBlog?a=yYH5G3NV"&gt;&lt;img src="http://feeds.feedburner.com/~f/AmundsBlog?d=42" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~f/AmundsBlog?a=slCV60rx"&gt;&lt;img src="http://feeds.feedburner.com/~f/AmundsBlog?i=slCV60rx" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~f/AmundsBlog?a=iyIWXujI"&gt;&lt;img src="http://feeds.feedburner.com/~f/AmundsBlog?d=52" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~f/AmundsBlog?a=FdxY5ID4"&gt;&lt;img src="http://feeds.feedburner.com/~f/AmundsBlog?i=FdxY5ID4" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~f/AmundsBlog?a=BkfTObzd"&gt;&lt;img src="http://feeds.feedburner.com/~f/AmundsBlog?d=43" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~f/AmundsBlog?a=I4kraRdd"&gt;&lt;img src="http://feeds.feedburner.com/~f/AmundsBlog?d=50" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~f/AmundsBlog?a=gTYBEfxt"&gt;&lt;img src="http://feeds.feedburner.com/~f/AmundsBlog?i=gTYBEfxt" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~f/AmundsBlog?a=CMdx7Aiw"&gt;&lt;img src="http://feeds.feedburner.com/~f/AmundsBlog?d=54" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~f/AmundsBlog?a=9YIamOe7"&gt;&lt;img src="http://feeds.feedburner.com/~f/AmundsBlog?d=129" border="0"&gt;&lt;/img&gt;&lt;/a&gt;
&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/AmundsBlog/~4/h7lazxs1rmM" height="1" width="1"/&gt;</content><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/1024937100240932334/posts/default/1966941322250251416?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/1024937100240932334/posts/default/1966941322250251416?v=2" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/AmundsBlog/~3/h7lazxs1rmM/pragmatic-classification-of-classifiers.html" title="Pragmatic Classification of Classifiers" /><author><name>Amund Tveit</name><uri>https://profiles.google.com/110451251449823277794</uri><email>noreply@blogger.com</email><gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="32" height="32" src="//lh6.googleusercontent.com/-zZKi4b5TYQY/AAAAAAAAAAI/AAAAAAAAAAA/_eaVu-shzqo/s512-c/photo.jpg" /></author><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="http://2.bp.blogspot.com/_2DnUjV2gKmw/SFBQzZ1qOkI/AAAAAAAACvo/uMW0BPLub3Y/s72-c/selectingclassifiers.png" height="72" width="72" /><category term="SVM" scheme="http://rss.financialcontent.com/stocksymbol" /><feedburner:origLink>http://amundblog.blogspot.com/2008/06/pragmatic-classification-of-classifiers.html</feedburner:origLink></entry><entry gd:etag="W/&quot;A0YBQXsycSp7ImA9WxdSGU8.&quot;"><id>tag:blogger.com,1999:blog-1024937100240932334.post-5807844202260399392</id><published>2008-05-27T23:56:00.004+01:00</published><updated>2008-05-27T23:59:10.599+01:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2008-05-27T23:59:10.599+01:00</app:edited><category scheme="http://www.blogger.com/atom/ns#" term="cartoon" /><category scheme="http://www.blogger.com/atom/ns#" term="health" /><category scheme="http://www.blogger.com/atom/ns#" term="blogging" /><category scheme="http://www.blogger.com/atom/ns#" term="scrum" /><category scheme="http://www.blogger.com/atom/ns#" term="scrummaster" /><title>Blogging is good for you..</title><content type="html">
&lt;p&gt;&lt;a href="http://feedads.g.doubleclick.net/~a/jmTP6wg76uQlSRWLnqH--iF8k-s/0/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/jmTP6wg76uQlSRWLnqH--iF8k-s/0/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;br/&gt;
&lt;a href="http://feedads.g.doubleclick.net/~a/jmTP6wg76uQlSRWLnqH--iF8k-s/1/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/jmTP6wg76uQlSRWLnqH--iF8k-s/1/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;/p&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://2.bp.blogspot.com/_2DnUjV2gKmw/SDyRosIJWDI/AAAAAAAACuw/oyphog_wEyk/s1600-h/bloggingishealthy.png"&gt;&lt;img style="cursor: pointer;" src="http://2.bp.blogspot.com/_2DnUjV2gKmw/SDyRosIJWDI/AAAAAAAACuw/oyphog_wEyk/s400/bloggingishealthy.png" alt="" id="BLOGGER_PHOTO_ID_5205195397559572530" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;Source: &lt;a href="http://www.sciam.com/article.cfm?id=the-healthy-type"&gt;Blogging -- It's Good for You&lt;/a&gt; (Scientific American)&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/1024937100240932334-5807844202260399392?l=amundblog.blogspot.com' alt='' /&gt;&lt;/div&gt;&lt;div class="feedflare"&gt;
&lt;a href="http://feeds.feedburner.com/~f/AmundsBlog?a=MDpo931p"&gt;&lt;img src="http://feeds.feedburner.com/~f/AmundsBlog?d=41" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~f/AmundsBlog?a=r2shXAxS"&gt;&lt;img src="http://feeds.feedburner.com/~f/AmundsBlog?i=r2shXAxS" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~f/AmundsBlog?a=w8BREhgF"&gt;&lt;img src="http://feeds.feedburner.com/~f/AmundsBlog?d=42" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~f/AmundsBlog?a=p5OItP8B"&gt;&lt;img src="http://feeds.feedburner.com/~f/AmundsBlog?i=p5OItP8B" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~f/AmundsBlog?a=RX6y96p6"&gt;&lt;img src="http://feeds.feedburner.com/~f/AmundsBlog?d=52" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~f/AmundsBlog?a=n1m0kmtg"&gt;&lt;img src="http://feeds.feedburner.com/~f/AmundsBlog?i=n1m0kmtg" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~f/AmundsBlog?a=UKiNghyc"&gt;&lt;img src="http://feeds.feedburner.com/~f/AmundsBlog?d=43" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~f/AmundsBlog?a=chAi3fOD"&gt;&lt;img src="http://feeds.feedburner.com/~f/AmundsBlog?d=50" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~f/AmundsBlog?a=odeQupYp"&gt;&lt;img src="http://feeds.feedburner.com/~f/AmundsBlog?i=odeQupYp" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~f/AmundsBlog?a=XnqF15cW"&gt;&lt;img src="http://feeds.feedburner.com/~f/AmundsBlog?d=54" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~f/AmundsBlog?a=j0HT5Sb1"&gt;&lt;img src="http://feeds.feedburner.com/~f/AmundsBlog?d=129" border="0"&gt;&lt;/img&gt;&lt;/a&gt;
&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/AmundsBlog/~4/tAf4Uh3Q704" height="1" width="1"/&gt;</content><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/1024937100240932334/posts/default/5807844202260399392?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/1024937100240932334/posts/default/5807844202260399392?v=2" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/AmundsBlog/~3/tAf4Uh3Q704/blogging-is-good-for-you.html" title="Blogging is good for you.." /><author><name>Amund Tveit</name><uri>https://profiles.google.com/110451251449823277794</uri><email>noreply@blogger.com</email><gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="32" height="32" src="//lh6.googleusercontent.com/-zZKi4b5TYQY/AAAAAAAAAAI/AAAAAAAAAAA/_eaVu-shzqo/s512-c/photo.jpg" /></author><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="http://2.bp.blogspot.com/_2DnUjV2gKmw/SDyRosIJWDI/AAAAAAAACuw/oyphog_wEyk/s72-c/bloggingishealthy.png" height="72" width="72" /><feedburner:origLink>http://amundblog.blogspot.com/2008/05/blogging-is-good-for-you.html</feedburner:origLink></entry><entry gd:etag="W/&quot;AkUDRH0-cCp7ImA9WxdSGE8.&quot;"><id>tag:blogger.com,1999:blog-1024937100240932334.post-3104000577752358734</id><published>2008-05-26T19:54:00.003+01:00</published><updated>2008-05-26T19:57:55.358+01:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2008-05-26T19:57:55.358+01:00</app:edited><category scheme="http://www.blogger.com/atom/ns#" term="waterfall" /><category scheme="http://www.blogger.com/atom/ns#" term="research" /><category scheme="http://www.blogger.com/atom/ns#" term="agile methods" /><category scheme="http://www.blogger.com/atom/ns#" term="scrum" /><title>Scrum makes you smarter</title><content type="html">
&lt;p&gt;&lt;a href="http://feedads.g.doubleclick.net/~a/WulQvDKZLZdexYqms7BELvNtA3s/0/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/WulQvDKZLZdexYqms7BELvNtA3s/0/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;br/&gt;
&lt;a href="http://feedads.g.doubleclick.net/~a/WulQvDKZLZdexYqms7BELvNtA3s/1/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/WulQvDKZLZdexYqms7BELvNtA3s/1/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;/p&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://3.bp.blogspot.com/_2DnUjV2gKmw/SDsHhMIJWBI/AAAAAAAACtM/sCgEfpiUCXo/s1600-h/scrummakesyousmarter.png"&gt;&lt;img style="cursor: pointer;" src="http://3.bp.blogspot.com/_2DnUjV2gKmw/SDsHhMIJWBI/AAAAAAAACtM/sCgEfpiUCXo/s400/scrummakesyousmarter.png" alt="" id="BLOGGER_PHOTO_ID_5204762061129209874" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold; font-style: italic;"&gt;Disclaimer:&lt;/span&gt;&lt;span style="font-style: italic;"&gt; cartoon presents a free interpretation of &lt;/span&gt;&lt;a href="http://jeffsutherland.com/scrum/2008/05/scrum-makes-you-smarter.html"&gt;&lt;span style="font-style: italic;"&gt;this&lt;/span&gt;&lt;br /&gt;&lt;/a&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/1024937100240932334-3104000577752358734?l=amundblog.blogspot.com' alt='' /&gt;&lt;/div&gt;&lt;div class="feedflare"&gt;
&lt;a href="http://feeds.feedburner.com/~f/AmundsBlog?a=3lvr7XgB"&gt;&lt;img src="http://feeds.feedburner.com/~f/AmundsBlog?d=41" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~f/AmundsBlog?a=AT6LggrO"&gt;&lt;img src="http://feeds.feedburner.com/~f/AmundsBlog?i=AT6LggrO" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~f/AmundsBlog?a=sMhD5Uil"&gt;&lt;img src="http://feeds.feedburner.com/~f/AmundsBlog?d=42" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~f/AmundsBlog?a=57b07bxJ"&gt;&lt;img src="http://feeds.feedburner.com/~f/AmundsBlog?i=57b07bxJ" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~f/AmundsBlog?a=Xnme53YE"&gt;&lt;img src="http://feeds.feedburner.com/~f/AmundsBlog?d=52" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~f/AmundsBlog?a=Wn4I0oDZ"&gt;&lt;img src="http://feeds.feedburner.com/~f/AmundsBlog?i=Wn4I0oDZ" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~f/AmundsBlog?a=S4K9dBlC"&gt;&lt;img src="http://feeds.feedburner.com/~f/AmundsBlog?d=43" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~f/AmundsBlog?a=hRpqkjlH"&gt;&lt;img src="http://feeds.feedburner.com/~f/AmundsBlog?d=50" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~f/AmundsBlog?a=iWX1O5CP"&gt;&lt;img src="http://feeds.feedburner.com/~f/AmundsBlog?i=iWX1O5CP" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~f/AmundsBlog?a=ww95wU1L"&gt;&lt;img src="http://feeds.feedburner.com/~f/AmundsBlog?d=54" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~f/AmundsBlog?a=hJDhNjrY"&gt;&lt;img src="http://feeds.feedburner.com/~f/AmundsBlog?d=129" border="0"&gt;&lt;/img&gt;&lt;/a&gt;
&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/AmundsBlog/~4/5-J3qmN6xgs" height="1" width="1"/&gt;</content><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/1024937100240932334/posts/default/3104000577752358734?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/1024937100240932334/posts/default/3104000577752358734?v=2" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/AmundsBlog/~3/5-J3qmN6xgs/scrum-makes-you-smarter.html" title="Scrum makes you smarter" /><author><name>Amund Tveit</name><uri>https://profiles.google.com/110451251449823277794</uri><email>noreply@blogger.com</email><gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="32" height="32" src="//lh6.googleusercontent.com/-zZKi4b5TYQY/AAAAAAAAAAI/AAAAAAAAAAA/_eaVu-shzqo/s512-c/photo.jpg" /></author><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="http://3.bp.blogspot.com/_2DnUjV2gKmw/SDsHhMIJWBI/AAAAAAAACtM/sCgEfpiUCXo/s72-c/scrummakesyousmarter.png" height="72" width="72" /><feedburner:origLink>http://amundblog.blogspot.com/2008/05/scrum-makes-you-smarter.html</feedburner:origLink></entry><entry gd:etag="W/&quot;CEMGSH0yeSp7ImA9WxdSF0g.&quot;"><id>tag:blogger.com,1999:blog-1024937100240932334.post-1314592371714532529</id><published>2008-05-25T21:11:00.008+01:00</published><updated>2008-05-25T22:53:49.391+01:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2008-05-25T22:53:49.391+01:00</app:edited><category scheme="http://www.blogger.com/atom/ns#" term="libsvm" /><category scheme="http://www.blogger.com/atom/ns#" term="pyml" /><category scheme="http://www.blogger.com/atom/ns#" term="svm" /><category scheme="http://www.blogger.com/atom/ns#" term="classification" /><category scheme="http://www.blogger.com/atom/ns#" term="orange" /><category scheme="http://www.blogger.com/atom/ns#" term="machine learning" /><category scheme="http://www.blogger.com/atom/ns#" term="monte" /><title>Pragmatic Classification with Python</title><content type="html">
&lt;p&gt;&lt;a href="http://feedads.g.doubleclick.net/~a/4V61tXlyCCHvyV3vrEbZicIBRF4/0/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/4V61tXlyCCHvyV3vrEbZicIBRF4/0/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;br/&gt;
&lt;a href="http://feedads.g.doubleclick.net/~a/4V61tXlyCCHvyV3vrEbZicIBRF4/1/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/4V61tXlyCCHvyV3vrEbZicIBRF4/1/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;/p&gt;In my previous posting I wrote about &lt;a href="http://amundblog.blogspot.com/2008/04/pragmatic-classification-very-basics.html"&gt;classification basics&lt;/a&gt;, this posting will follow up and talk about Python tools for classification and give an example with one of the tools.&lt;br /&gt;&lt;br /&gt;&lt;div class="entries"&gt;    &lt;div class="entry owner" id="e-b857e59d-ed05-448f-a846-527f893802b9"&gt;  &lt;span style="font-weight: bold;"&gt;Open Source Python Tools for Classification&lt;br /&gt;&lt;/span&gt;&lt;ul&gt;&lt;li&gt;&lt;a href="http://www.ailab.si/orange/"&gt;Orange&lt;/a&gt; -  machine learning tool which supports classification (including combining &lt;a href="http://en.wikipedia.org/wiki/Ensembles_of_Classifiers"&gt;classifiers in ensembles&lt;/a&gt;), &lt;a href="http://en.wikipedia.org/wiki/Feature_extraction"&gt;feature extraction&lt;/a&gt;,  basic statistical analysis, &lt;a href="http://en.wikipedia.org/wiki/Regression_analysis"&gt;regression&lt;/a&gt; and &lt;a href="http://en.wikipedia.org/wiki/Association_rule_learning"&gt;association rules&lt;/a&gt;. It also has &lt;a href="http://ai.fri.uni-lj.si/aleks/orng/"&gt;an extension module&lt;/a&gt; which supports clustering and additional classifier algorithms. &lt;span style="font-weight: bold;"&gt;Note&lt;/span&gt;: Orange is probably the Python-based machine learning tool that is most similar to the more famous tool &lt;a href="http://www.cs.waikato.ac.nz/ml/weka/"&gt;Weka&lt;/a&gt; (which is for Java, or &lt;a href="http://www.jython.org/Project/index.html"&gt;Jython&lt;/a&gt; for that matter). &lt;/li&gt;&lt;/ul&gt;&lt;ul&gt;&lt;li&gt;&lt;a href="http://montepython.sourceforge.net/"&gt;Monte&lt;/a&gt; - less comprehensive than Orange, written purely in Python (i.e. no &lt;a href="http://www.swig.org/"&gt;SWIG&lt;/a&gt;ed C++). Looks interesting (has several classifiers algorithms), but the APIs seems to be in an early phase (relatively new tool in version 0.1.0)&lt;/li&gt;&lt;/ul&gt;&lt;ul&gt;&lt;li&gt;&lt;a href="http://www.csie.ntu.edu.tw/%7Ecjlin/libsvm/"&gt;libsvm&lt;/a&gt; - Python API for most popular open source implementation of SVM. &lt;span style="font-weight: bold;"&gt;Note&lt;/span&gt;: libsvm is also included with Orange and PyML. (I used this tools during my PhD a few years ago)&lt;br /&gt;&lt;/li&gt;&lt;/ul&gt;&lt;ul&gt;&lt;li&gt;&lt;a href="http://rpy.sourceforge.net/"&gt;RPy&lt;/a&gt; - not exactly a classification tool, but it is quite useful with a statistics tool when you are doing classification (it has a nice plotting capability, not unlike matlabs), check out the &lt;a href="http://rpy.sourceforge.net/rpy_demo.html"&gt;demo&lt;/a&gt;.&lt;br /&gt;&lt;/li&gt;&lt;/ul&gt;&lt;ul&gt;&lt;li&gt;&lt;a href="http://pyml.sourceforge.net/"&gt;PyML&lt;/a&gt; - also less comprehensive than Orange (specialized towards classification and regression, it supports SVM/SMO, ANN and Ridge Regression), but it has a nice API. Example of use: &lt;span style="color: rgb(0, 0, 255);"&gt;&lt;br /&gt;&lt;pre&gt;&lt;br /&gt;from PyML import multi, svm, datafunc&lt;br /&gt;&lt;em&gt;# read training data, last column has the class&lt;/em&gt;&lt;br /&gt;mydataset = datafunc.SparseDataSet('iris.data', labelsColumn = -1)&lt;br /&gt;myclassifier = multi.OneAgainstRest(svm.SVM())&lt;br /&gt;print "cross-validation results", myclassifier.cv(mydataset)&lt;br /&gt;&lt;/pre&gt;&lt;/span&gt;&lt;/li&gt;&lt;/ul&gt;My recommendation is to either go with Orange or with PyML.&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;/div&gt;    &lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/1024937100240932334-1314592371714532529?l=amundblog.blogspot.com' alt='' /&gt;&lt;/div&gt;&lt;div class="feedflare"&gt;
&lt;a href="http://feeds.feedburner.com/~f/AmundsBlog?a=mJCLTSmL"&gt;&lt;img src="http://feeds.feedburner.com/~f/AmundsBlog?d=41" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~f/AmundsBlog?a=Vonq2kac"&gt;&lt;img src="http://feeds.feedburner.com/~f/AmundsBlog?i=Vonq2kac" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~f/AmundsBlog?a=FzkYoBN1"&gt;&lt;img src="http://feeds.feedburner.com/~f/AmundsBlog?d=42" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~f/AmundsBlog?a=sKyLuTuo"&gt;&lt;img src="http://feeds.feedburner.com/~f/AmundsBlog?i=sKyLuTuo" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~f/AmundsBlog?a=HKRTHHfu"&gt;&lt;img src="http://feeds.feedburner.com/~f/AmundsBlog?d=52" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~f/AmundsBlog?a=QPyEcgCf"&gt;&lt;img src="http://feeds.feedburner.com/~f/AmundsBlog?i=QPyEcgCf" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~f/AmundsBlog?a=f8HzU2Zy"&gt;&lt;img src="http://feeds.feedburner.com/~f/AmundsBlog?d=43" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~f/AmundsBlog?a=xGXDl8py"&gt;&lt;img src="http://feeds.feedburner.com/~f/AmundsBlog?d=50" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~f/AmundsBlog?a=aP9S5qzD"&gt;&lt;img src="http://feeds.feedburner.com/~f/AmundsBlog?i=aP9S5qzD" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~f/AmundsBlog?a=04Fz0HDw"&gt;&lt;img src="http://feeds.feedburner.com/~f/AmundsBlog?d=54" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~f/AmundsBlog?a=AELYYxpO"&gt;&lt;img src="http://feeds.feedburner.com/~f/AmundsBlog?d=129" border="0"&gt;&lt;/img&gt;&lt;/a&gt;
&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/AmundsBlog/~4/ZsjMPCY4oIE" height="1" width="1"/&gt;</content><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/1024937100240932334/posts/default/1314592371714532529?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/1024937100240932334/posts/default/1314592371714532529?v=2" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/AmundsBlog/~3/ZsjMPCY4oIE/pragmatic-classification-with-python.html" title="Pragmatic Classification with Python" /><author><name>Amund Tveit</name><uri>https://profiles.google.com/110451251449823277794</uri><email>noreply@blogger.com</email><gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="32" height="32" src="//lh6.googleusercontent.com/-zZKi4b5TYQY/AAAAAAAAAAI/AAAAAAAAAAA/_eaVu-shzqo/s512-c/photo.jpg" /></author><feedburner:origLink>http://amundblog.blogspot.com/2008/05/pragmatic-classification-with-python.html</feedburner:origLink></entry><entry gd:etag="W/&quot;CkADRncyfCp7ImA9WxZbGU0.&quot;"><id>tag:blogger.com,1999:blog-1024937100240932334.post-7461514759039109982</id><published>2008-04-22T20:26:00.010+01:00</published><updated>2008-04-22T22:46:17.994+01:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2008-04-22T22:46:17.994+01:00</app:edited><category scheme="http://www.blogger.com/atom/ns#" term="classification" /><category scheme="http://www.blogger.com/atom/ns#" term="machine learning" /><title>Pragmatic Classification: The very basics</title><content type="html">
&lt;p&gt;&lt;a href="http://feedads.g.doubleclick.net/~a/g3A8xlmFPAwUF6qk7HZ5CgsgFqE/0/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/g3A8xlmFPAwUF6qk7HZ5CgsgFqE/0/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;br/&gt;
&lt;a href="http://feedads.g.doubleclick.net/~a/g3A8xlmFPAwUF6qk7HZ5CgsgFqE/1/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/g3A8xlmFPAwUF6qk7HZ5CgsgFqE/1/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;/p&gt;&lt;span style="font-style: italic;"&gt;Classification&lt;/span&gt; is an everyday task, it is about selecting one out of several outcomes based on their &lt;span style="font-style: italic;"&gt;features.&lt;/span&gt; An example could be recycling of garbage where you select the bin based on the characteristics of the garbage, e.g. paper, metal, plastic or organic.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;Classification with computers&lt;/span&gt;&lt;br /&gt;For classification with computers the focus is frequently on the &lt;span style="font-style: italic;"&gt;classifier&lt;/span&gt; - the function/algorithm that selects the class based on features (note: classifiers usually has to be &lt;span style="font-style: italic;"&gt;trained&lt;/span&gt; to get fit for fight). Classifiers can be found in many flavors, and quite a few of them have impressive names (phrases with rough, kernel, vector, machine and reasoning aren't uncommon when naming them).&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;note: &lt;/span&gt;Garbage in leads to Garbage out - as (almost always) - same goes for classification.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;The numerical baseline&lt;/span&gt;&lt;br /&gt;Let us assume you have a data set&lt;span style="font-style: italic;"&gt; &lt;/span&gt;with 1000 documents that shows to have 4 equally different categories (e.g. math, physics, chemistry and medicine). A simple classifier for a believe-to-be-similar-dataset could be the rule: &lt;span style="font-style: italic;"&gt;"the class is math"&lt;/span&gt;, which is likely to give a classification accuracy of about 25%. (Another classifier could be to pick a random category for every document). This can be used as a numerical baseline for comparison with when bringing in heavier classification machinery, e.g if you get 19% accuracy with the heavier machinery it probably isn't very good (or your feature representation isn't very good) for &lt;span style="font-style: italic;"&gt;that particular problem&lt;/span&gt;. (Note: heavy classification machinery frequently has plenty of degrees of freedom, so fine tuning them can be a challenge, same goes for feature extraction and representation).&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;Combining classifiers&lt;/span&gt;&lt;br /&gt;On the other hand, if the heavy machinery classifier gave 0% accuracy you could &lt;span style="font-style: italic;"&gt;combine it&lt;/span&gt; with a random classifier to only randomly select from the 3 classes the heavy machinery classifier didn't suggest.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;Question 1: &lt;/span&gt;&lt;span style="font-style: italic;"&gt;What is the accuracy with these combined classifiers?&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;Baseline for unbalanced data sets&lt;/span&gt;&lt;br /&gt;Quite frequently classification problems have to deal with unbalanced data sets, e.g. let us say you were to classify documents about soccer and &lt;a href="http://en.wikipedia.org/wiki/Casting_%28sport%29"&gt;casting (fishing)&lt;/a&gt;, and your training data set contained about 99.99% soccer and 0.01% about casting, a baseline classifier for a similar dataset could be to say - "the article is about soccer". This would most likely be a very strong baseline, and probably hard to beat for most heavy machinery classifiers.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;Silver bullet classifier and feature extraction method?&lt;br /&gt;&lt;/span&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://1.bp.blogspot.com/_2DnUjV2gKmw/SA48VmFu8sI/AAAAAAAACjw/rzDWJuz5iaY/s1600-h/uglyduckling.png"&gt;&lt;img style="cursor: pointer;" src="http://1.bp.blogspot.com/_2DnUjV2gKmw/SA48VmFu8sI/AAAAAAAACjw/rzDWJuz5iaY/s400/uglyduckling.png" alt="" id="BLOGGER_PHOTO_ID_5192153762104275650" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;Q: My friend says that classifier algorithm X and feature extraction method Y are the best for all problems, is that the case?&lt;br /&gt;A: No, tell him/her to read about the ugly duckling and no free lunch theorems which clearly says that there is no universally best classifier or feature extraction approach.&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;note: &lt;/span&gt;Just some of the basics this time, something more concrete next time (I think).&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/1024937100240932334-7461514759039109982?l=amundblog.blogspot.com' alt='' /&gt;&lt;/div&gt;&lt;div class="feedflare"&gt;
&lt;a href="http://feeds.feedburner.com/~f/AmundsBlog?a=5MkAV8tK"&gt;&lt;img src="http://feeds.feedburner.com/~f/AmundsBlog?d=41" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~f/AmundsBlog?a=GAigIyrn"&gt;&lt;img src="http://feeds.feedburner.com/~f/AmundsBlog?i=GAigIyrn" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~f/AmundsBlog?a=Wwtlz2tN"&gt;&lt;img src="http://feeds.feedburner.com/~f/AmundsBlog?d=42" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~f/AmundsBlog?a=ku4hxduh"&gt;&lt;img src="http://feeds.feedburner.com/~f/AmundsBlog?i=ku4hxduh" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~f/AmundsBlog?a=NRVWLqZu"&gt;&lt;img src="http://feeds.feedburner.com/~f/AmundsBlog?d=52" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~f/AmundsBlog?a=uTYv4tMd"&gt;&lt;img src="http://feeds.feedburner.com/~f/AmundsBlog?i=uTYv4tMd" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~f/AmundsBlog?a=IDFNOCiP"&gt;&lt;img src="http://feeds.feedburner.com/~f/AmundsBlog?d=43" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~f/AmundsBlog?a=XKMebQhp"&gt;&lt;img src="http://feeds.feedburner.com/~f/AmundsBlog?d=50" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~f/AmundsBlog?a=VIIcOBDN"&gt;&lt;img src="http://feeds.feedburner.com/~f/AmundsBlog?i=VIIcOBDN" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~f/AmundsBlog?a=0KFmVtLi"&gt;&lt;img src="http://feeds.feedburner.com/~f/AmundsBlog?d=54" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~f/AmundsBlog?a=mRzYFc3e"&gt;&lt;img src="http://feeds.feedburner.com/~f/AmundsBlog?d=129" border="0"&gt;&lt;/img&gt;&lt;/a&gt;
&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/AmundsBlog/~4/UXbkFKQNLsg" height="1" width="1"/&gt;</content><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/1024937100240932334/posts/default/7461514759039109982?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/1024937100240932334/posts/default/7461514759039109982?v=2" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/AmundsBlog/~3/UXbkFKQNLsg/pragmatic-classification-very-basics.html" title="Pragmatic Classification: The very basics" /><author><name>Amund Tveit</name><uri>https://profiles.google.com/110451251449823277794</uri><email>noreply@blogger.com</email><gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="32" height="32" src="//lh6.googleusercontent.com/-zZKi4b5TYQY/AAAAAAAAAAI/AAAAAAAAAAA/_eaVu-shzqo/s512-c/photo.jpg" /></author><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="http://1.bp.blogspot.com/_2DnUjV2gKmw/SA48VmFu8sI/AAAAAAAACjw/rzDWJuz5iaY/s72-c/uglyduckling.png" height="72" width="72" /><feedburner:origLink>http://amundblog.blogspot.com/2008/04/pragmatic-classification-very-basics.html</feedburner:origLink></entry><entry gd:etag="W/&quot;A0ENRXkzeip7ImA9WxFUFkw.&quot;"><id>tag:blogger.com,1999:blog-1024937100240932334.post-3113833080540174570</id><published>2008-04-20T17:11:00.021+01:00</published><updated>2010-06-27T07:21:34.782+01:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2010-06-27T07:21:34.782+01:00</app:edited><category scheme="http://www.blogger.com/atom/ns#" term="entrepreneurial" /><category scheme="http://www.blogger.com/atom/ns#" term="history" /><title>My years on the net from 1998-2000</title><content type="html">
&lt;p&gt;&lt;a href="http://feedads.g.doubleclick.net/~a/RrDrlYc4b3G4TJLdLU1LpCZOHLs/0/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/RrDrlYc4b3G4TJLdLU1LpCZOHLs/0/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;br/&gt;
&lt;a href="http://feedads.g.doubleclick.net/~a/RrDrlYc4b3G4TJLdLU1LpCZOHLs/1/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/RrDrlYc4b3G4TJLdLU1LpCZOHLs/1/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;/p&gt;&lt;span style="font-weight: bold;"&gt;1998 - Insurance and Finance, and my first domain name&lt;/span&gt;&lt;br /&gt;
Once upon a time (September 1998) I bought my first domain name - agentus.com. The domain name was inspired by a course in "distributed artificial intelligence and intelligent agents" I (partially) followed while being an IT trainee in an insurance and finance company. Learned quite a bit from insurance (enjoyed working with actuaries, i.e. basic risk analysis for insurance pricing), but felt I had some unfinished business in academia (and entrepreneur wise), so in the summer of 1999 I left the finance company to university to start on a PhD scholarship in the fall.&lt;br /&gt;
&lt;br /&gt;
&lt;span style="font-weight: bold;"&gt;1999 - Back to University&lt;/span&gt;&lt;br /&gt;
I spent the most of the summer of 1999 doing what could be called entrepreneurship-in-a-sandbox, i.e. not actually doing much concrete (coding wise), but reading up on e-commerce literature[2] to figure out something entrepreneurial to do. I ended up with a few vague ideas (one was creating a service to automatically create brand and domain names), but nothing that I really believed could fly (maybe the insight into risk analysis wasn't such a great thing?). The PhD scholarship was part of project called "Electronic Commercial Agents" - ElComAg. One of the first things when I created web pages for the project was an updated list of academic events and call for papers to e-commerce and CS related conferences, workshops and journals, this was gradually improved over the years and grew into &lt;a href="http://amundtveit.info/eventseer/"&gt;eventseer.net&lt;/a&gt;.&lt;a href="http://amundtveit.info/eventseer/"&gt;&lt;/a&gt;&lt;br /&gt;
&lt;br /&gt;
&lt;span style="font-weight: bold;"&gt;2000 - Entrepreneurial year&lt;br /&gt;
&lt;/span&gt;At this time CoShopper.com and LetsBuyIt.com provided coshopping services, the idea behind these services was roughly to be a &lt;span style="font-style: italic;"&gt;"crowd-shopping middleman"&lt;/span&gt; i.e. if a lots of consumers got together and purchased things (e.g. hundreds of dvd players) they should get it cheaper than on their own. Inspired by this and my recent insurance experience I thought something like: &lt;span style="font-style: italic;"&gt;"insurance is by nature a crowd-risk-sharing product, so what is more natural than co-shopping of insurance?&lt;/span&gt;". Another nice property of insurance (at least selling it..) is that it is highly virtual so close to no distribution cost[3]. (Coshopping of insurance actually happened already then but more implicit, e.g. if you're a member of an organization you might get cheaper insurance).&lt;br /&gt;
I strongly believed this would change the insurance industry, and in particular for insurance brokers (and perhaps even for reinsurance industry, but I don't remember why :), so together with 2 CS project students I tried to make this idea fly, but the highlight became a full day workshop with executives from a very large insurance broker.  (From Feb 2000 investment mood starting changing around the world and when summer of 2000 arrived it all died out).&lt;br /&gt;
&lt;br /&gt;
As mentioned I had the summer before thought of a service for automatic brand and domain name creating, so I got a CS project student working on it (in parallel with the insurance project) and we got approved to participate in a summit for entrepreneurs sponsored by the University[4], the first part of the workshop revealed significant business level holes in the idea (revenue potential etc.), so we had to be agile and think of something new so we changed the idea to an ontology-based browser plugin to support search. At the summit's presentation real investors were in the panel, and when we spoke with one of them he said informally he might be willing to invest a very large amount, not being used to be close to large numbers it somewhat freaked me out[5] . Coincidentally(1) enough &lt;span style="font-style: italic;"&gt;during&lt;/span&gt; the first part of the summit (which was in February ) I saw the front page of a financial newspaper (in the reception area) that the stockmarket was seriously down, i.e. the dot.com bubble burst.&lt;br /&gt;
&lt;br /&gt;
Coincidentally(2) again &lt;span style="font-style: italic;"&gt;during&lt;/span&gt; the second part of the entrepreneurial summit I got a phone call on behalf of a large investor, I had recently sent him an email with misc. ideas. I stayed in touch and later in the year (fall) I got funding from that investor to found a company together with my brother and the student who worked on the automatic brand name project. I worked on this company part time in addition to my PhD studies for about 2-3 years until going back to PhD fulltime.&lt;br /&gt;
&lt;br /&gt;
I was a co-organizer for something called "technology café", mainly together with other PhD students from many parts of the university (e.g. industrial ecology, political science, linguistics, social anthropology and computer science). Together with a few of them we tried to develop a company (during the fall) doing consulting and services related to indicators for industrial eco-efficiency. We had meetings with potential local investors and customers, but our business model was quite vague so it was a hard sell, so the initiative unfortunately fizzled out.&lt;br /&gt;
&lt;span style="font-weight: bold;"&gt;&lt;br /&gt;
&lt;/span&gt;One of the guys from the industrial eco-efficiency initiative had another project related to services related to carbon quota market (this was 3 years after the Kyoto Protocol), they were lacking an IT guy so I was for a brief period one of the 5 people working on it, but due to my newly funded company (2 paragraphs up)  I had to pass this project on. In retrospect I honestly wish I didn't, this company - PointCarbon - became very successful now with customers in more than 200 countries :-)&lt;br /&gt;
&lt;br /&gt;
Hm, 2000 was truly a busy year, other than that I remember getting my submitted first paper rejected ;-) But things started getting &lt;a href="http://amundtveit.info/publications/"&gt;somewhat better on the academic front&lt;/a&gt; in 2001.&lt;br /&gt;
&lt;br /&gt;
[1] - intellige.. twice in a course name had to be good :)&lt;br /&gt;
[2] - online/PDF e-commerce literature such as Make Your Site Sell and Wilsonweb, and magazines: Fast Company, Business 2.0, Red Herring and Wired (some of them approximating phone book size per monthly issue. Not as being in silicon valley, but an ok substitute while being 9 timezones east of it, i.e. Scandinavia).&lt;br /&gt;
[3] - you pay someone to take on your risk, and the combined pay of the entire crowd is going to at least cover the costs of reimbursements to those who have incidents the insurance covers.&lt;br /&gt;
[4] - it was mainly traditional engineering companies participating at the innovation summit, e.g. with more tangible projects like a mobile asfalt producing vehicle. Our idea was accepted because it was exotic with a dot.com'ish like company (at least I believe so).&lt;br /&gt;
[5] - I saw bigger numbers as in IT trainee in insurance and finance, but they felt more distant.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/1024937100240932334-3113833080540174570?l=amundblog.blogspot.com' alt='' /&gt;&lt;/div&gt;&lt;div class="feedflare"&gt;
&lt;a href="http://feeds.feedburner.com/~f/AmundsBlog?a=JBQs0Ay3"&gt;&lt;img src="http://feeds.feedburner.com/~f/AmundsBlog?d=41" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~f/AmundsBlog?a=xfBJffB3"&gt;&lt;img src="http://feeds.feedburner.com/~f/AmundsBlog?i=xfBJffB3" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~f/AmundsBlog?a=vmraIDVz"&gt;&lt;img src="http://feeds.feedburner.com/~f/AmundsBlog?d=42" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~f/AmundsBlog?a=qF744CMX"&gt;&lt;img src="http://feeds.feedburner.com/~f/AmundsBlog?i=qF744CMX" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~f/AmundsBlog?a=e4IW00EJ"&gt;&lt;img src="http://feeds.feedburner.com/~f/AmundsBlog?d=52" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~f/AmundsBlog?a=zEMpcSOP"&gt;&lt;img src="http://feeds.feedburner.com/~f/AmundsBlog?i=zEMpcSOP" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~f/AmundsBlog?a=uafPvO26"&gt;&lt;img src="http://feeds.feedburner.com/~f/AmundsBlog?d=43" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~f/AmundsBlog?a=0l1hShXo"&gt;&lt;img src="http://feeds.feedburner.com/~f/AmundsBlog?d=50" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~f/AmundsBlog?a=8vM1GoJt"&gt;&lt;img src="http://feeds.feedburner.com/~f/AmundsBlog?i=8vM1GoJt" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~f/AmundsBlog?a=ugKfyuhw"&gt;&lt;img src="http://feeds.feedburner.com/~f/AmundsBlog?d=54" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~f/AmundsBlog?a=5ZvYcFy5"&gt;&lt;img src="http://feeds.feedburner.com/~f/AmundsBlog?d=129" border="0"&gt;&lt;/img&gt;&lt;/a&gt;
&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/AmundsBlog/~4/o8AGLvHKQm4" height="1" width="1"/&gt;</content><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/1024937100240932334/posts/default/3113833080540174570?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/1024937100240932334/posts/default/3113833080540174570?v=2" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/AmundsBlog/~3/o8AGLvHKQm4/my-years-on-net-from-1998-2000.html" title="My years on the net from 1998-2000" /><author><name>Amund Tveit</name><uri>https://profiles.google.com/110451251449823277794</uri><email>noreply@blogger.com</email><gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="32" height="32" src="//lh6.googleusercontent.com/-zZKi4b5TYQY/AAAAAAAAAAI/AAAAAAAAAAA/_eaVu-shzqo/s512-c/photo.jpg" /></author><feedburner:origLink>http://amundblog.blogspot.com/2008/04/my-years-on-net-from-1998-2000.html</feedburner:origLink></entry><entry gd:etag="W/&quot;CEMDSXc6cSp7ImA9WxZbEEw.&quot;"><id>tag:blogger.com,1999:blog-1024937100240932334.post-8289058198182284722</id><published>2008-04-12T15:42:00.005+01:00</published><updated>2008-04-12T16:01:18.919+01:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2008-04-12T16:01:18.919+01:00</app:edited><title>Biting the Hand that Feeds the Double Standard?</title><content type="html">
&lt;p&gt;&lt;a href="http://feedads.g.doubleclick.net/~a/cqpGQV5UhLNDI3dxJZTbrfzbNYQ/0/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/cqpGQV5UhLNDI3dxJZTbrfzbNYQ/0/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;br/&gt;
&lt;a href="http://feedads.g.doubleclick.net/~a/cqpGQV5UhLNDI3dxJZTbrfzbNYQ/1/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/cqpGQV5UhLNDI3dxJZTbrfzbNYQ/1/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;/p&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://1.bp.blogspot.com/_2DnUjV2gKmw/SADKhwg7dmI/AAAAAAAACg0/3WtJ_19EBak/s1600-h/doublestandards.png"&gt;&lt;img style="cursor: pointer;" src="http://1.bp.blogspot.com/_2DnUjV2gKmw/SADKhwg7dmI/AAAAAAAACg0/3WtJ_19EBak/s400/doublestandards.png" alt="" id="BLOGGER_PHOTO_ID_5188369452038321762" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;Maybe it is just me, but I am personally somewhat puzzled by two recent world events:&lt;br /&gt;&lt;ol&gt;&lt;li&gt;protests against a big event in a country who at the same time is &lt;span style="font-style: italic;"&gt;the&lt;/span&gt; major supplier of goods to those who are protesting against the event (&lt;span style="font-style: italic;"&gt;double standards?&lt;/span&gt;)&lt;span style="font-style: italic;"&gt;&lt;/span&gt;&lt;br /&gt;&lt;/li&gt;&lt;li&gt;suggested actions that severely irritates another country who is &lt;span style="font-style: italic;"&gt;the&lt;/span&gt; major supplier of energy to several of the countries who are irritating it (&lt;span style="font-style: italic;"&gt;biting the hand that feeds you?&lt;/span&gt;)&lt;br /&gt;&lt;/li&gt;&lt;/ol&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/1024937100240932334-8289058198182284722?l=amundblog.blogspot.com' alt='' /&gt;&lt;/div&gt;&lt;div class="feedflare"&gt;
&lt;a href="http://feeds.feedburner.com/~f/AmundsBlog?a=dAW9AV77"&gt;&lt;img src="http://feeds.feedburner.com/~f/AmundsBlog?d=41" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~f/AmundsBlog?a=AT3xbhIP"&gt;&lt;img src="http://feeds.feedburner.com/~f/AmundsBlog?i=AT3xbhIP" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~f/AmundsBlog?a=y2HfiPt4"&gt;&lt;img src="http://feeds.feedburner.com/~f/AmundsBlog?d=42" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~f/AmundsBlog?a=0QYzYPff"&gt;&lt;img src="http://feeds.feedburner.com/~f/AmundsBlog?i=0QYzYPff" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~f/AmundsBlog?a=2KTpMcVs"&gt;&lt;img src="http://feeds.feedburner.com/~f/AmundsBlog?d=52" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~f/AmundsBlog?a=nENNzFAQ"&gt;&lt;img src="http://feeds.feedburner.com/~f/AmundsBlog?i=nENNzFAQ" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~f/AmundsBlog?a=ya2WoqHz"&gt;&lt;img src="http://feeds.feedburner.com/~f/AmundsBlog?d=43" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~f/AmundsBlog?a=qWiuFKu5"&gt;&lt;img src="http://feeds.feedburner.com/~f/AmundsBlog?d=50" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~f/AmundsBlog?a=EMpq3Qz4"&gt;&lt;img src="http://feeds.feedburner.com/~f/AmundsBlog?i=EMpq3Qz4" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~f/AmundsBlog?a=6hd56NYD"&gt;&lt;img src="http://feeds.feedburner.com/~f/AmundsBlog?d=54" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~f/AmundsBlog?a=dvjCF2yN"&gt;&lt;img src="http://feeds.feedburner.com/~f/AmundsBlog?d=129" border="0"&gt;&lt;/img&gt;&lt;/a&gt;
&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/AmundsBlog/~4/qzf_vvh1y84" height="1" width="1"/&gt;</content><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/1024937100240932334/posts/default/8289058198182284722?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/1024937100240932334/posts/default/8289058198182284722?v=2" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/AmundsBlog/~3/qzf_vvh1y84/biting-hand-that-feeds-double-standard.html" title="Biting the Hand that Feeds the Double Standard?" /><author><name>Amund Tveit</name><uri>https://profiles.google.com/110451251449823277794</uri><email>noreply@blogger.com</email><gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="32" height="32" src="//lh6.googleusercontent.com/-zZKi4b5TYQY/AAAAAAAAAAI/AAAAAAAAAAA/_eaVu-shzqo/s512-c/photo.jpg" /></author><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="http://1.bp.blogspot.com/_2DnUjV2gKmw/SADKhwg7dmI/AAAAAAAACg0/3WtJ_19EBak/s72-c/doublestandards.png" height="72" width="72" /><feedburner:origLink>http://amundblog.blogspot.com/2008/04/biting-hand-that-feeds-double-standard.html</feedburner:origLink></entry></feed>

