<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0" xmlns:dc="http://purl.org/dc/elements/1.1/">
  <channel>
    <title>Ziki - R&#233;gis Gaidot's last published content</title>
    <link>http://www.ziki.com/fr/rgaidot+2199</link>
    <pubDate>jeu, 04 Dec 2008 01:02:47 +0100</pubDate>
    <ttl>120</ttl>
    <description>Mon contenu chez Ziki.com</description>
    <item>
      <title>The OpenID Foundation Needs You</title>
      <link>http://feedproxy.google.com/%7Er/readwriteweb/%7E3/jh4fsGzdL84/the_openid_foundation_board.php</link>
      <description>
        <![CDATA[<div class="post_content wiki_text"><p>
  <img src="http://www.readwriteweb.com/images/openid225.jpg" width="150" />Do you think that open standards, data portability and questions of online identity are important? We do; we think these issues are the foundation upon which many of the most exciting and important online innovations are being built.
</p>
<p>
  That's only going to be more true in the future, so if you'd like to have a say in how it all goes down - now's the time to get involved. The <a href="http://openid.net">OpenID Foundation</a> is one of the leading organizations in the new standards world and it's having its first ever election of community board members this month. Nominations close Monday and the voting begins on Wednesday.
</p>
<p style="text-align: right;">
  <em>Sponsor</em><br />
  <a href="http://d.openx.org/ck.php?n=12805&amp;amp;cb=12805"><img src="http://d.openx.org/avw.php?zoneid=861&amp;amp;cb=12805&amp;amp;n=12805" alt="" align="right" /></a>
</p>
<p>
  There are big issues on the table right now and the outcome of the election is going to make a big difference in the future of the internet. The Foundation has had incredible success in the past year but it needs your help to determine its direction in the future.
</p>
<p>
  Individuals will have to <a href="https://openid.net/foundation/members/registration">pay a $25 Foundation membership fee</a> in order to vote, but this author just paid his and is looking forward to pulling the virtual voter's lever. Nominees so far are listed below.
</p>
<h2>
  What Are the Issues?
</h2>
<p>
  OpenID usability, getting major players to respect incoming OpenID and not just authenticate their own users elsewhere with OpenID, the personal data payload that travels with OpenID and many other difficult questions remain unanswered, despite all the progress the Foundation and other organizations have made in the last year.
</p>
<p>
  A year ago this week we wrote a post saying that <a href="http://www.readwriteweb.com/archives/the_troubles_with_openid_20.php">OpenID was in serious trouble</a>. One year later, the situation seems to have improved quite a lot. That's thanks not just to the work of the OpenID Foundation, but they deserve a large part of the credit.
</p>
<p>
  The protocol is far from out of the woods, though, and so this election is going to be an important one.
</p>
<h2>
  Who's Been Nominated?
</h2>
<p>
  So far twelve people have been nominated. Once you register as a Foundation member, you can see the nominees and their position statements. More nominations will likely occur before this weekend is over. Seven of the <span style="text-decoration: line-through;">following twelve</span> total number of people nominated by Monday will get positions on the board. Here's who's been nominated so far.
</p>
<p>
  Johannes Ernst - founder and CEO of startup <a href="http://netmesh.us/">Netmesh</a><br />
  David Recordon - is from <a href="http://sixapart.com">SixApart</a> and is one of the most publicly visible members of the OpenID community<br />
  Mike Kirkwood - CEO of iPhone-centric medical patient data service <a href="http://www.polka.com/index.php">Polka</a><br />
  Eric Sachs - <a href="http://eric.sachs.googlepages.com/">Product Manager</a> at Google<br />
  Snorri Giorgetti - OpenID Foundation's <a href="http://www.openid2009.org/">European Representative</a><br />
  Eran Hammer-Lahav - Open Web Evangelist at Yahoo! and <a href="http://www.hueniverse.com/hueniverse/2007/10/beginners-gui-1.html">OAuth lover</a><br />
  Allen Tom - Architect, <a href="http://developer.yahoo.net/blog/archives/2008/10/open_id_research.html">Yahoo! Membership</a><br />
  Scott Kveton - Current OpenID Foundation Chair and VP Open Platforms at <a href="http://vidoop.com">Vidoop</a><br />
  Nat Sakimura - <a href="http://www.sakimura.org/en/modules/wordpress/">Identity tech wonk</a> from Japan<br />
  Brian Kissel - CEO of JanRain, makers of <a href="http://bkkissel.myopenid.com/">MyOpenID.com</a><br />
  John Bradley - OpenID security wonk<br />
  Martin Atkins - an OpenSocial and identity <a href="http://www.apparently.me.uk/">developer</a>
</p>
<p>
  Which seven of those people do you want driving the future of the OpenID Foundation? <a href="https://openid.net/foundation/members/registration">Register as a member</a>, read their policy statements and you can have your hopes for this important technology paradigm recognized.
</p><strong><a href="http://www.readwriteweb.com/archives/the_openid_foundation_board.php#comments-open">Discuss</a></strong>
<p>
  <a href="http://feedads.googleadservices.com/~at/lh08e47M_et16V78XEFS-tWiRAw/a"><img src="http://feedads.googleadservices.com/~at/lh08e47M_et16V78XEFS-tWiRAw/i" /></a>
</p>
<div>
  <a href="http://feedproxy.google.com/~f/readwriteweb?a=RqiiF2AL"><img src="http://feedproxy.google.com/~f/readwriteweb?d=1035" /></a> <a href="http://feedproxy.google.com/~f/readwriteweb?a=rnVALbY8"><img src="http://feedproxy.google.com/~f/readwriteweb?d=41" /></a> <a href="http://feedproxy.google.com/~f/readwriteweb?a=W4ER2t1X"><img src="http://feedproxy.google.com/~f/readwriteweb?i=W4ER2t1X" /></a> <a href="http://feedproxy.google.com/~f/readwriteweb?a=RWrIlniH"><img src="http://feedproxy.google.com/~f/readwriteweb?i=RWrIlniH" /></a> <a href="http://feedproxy.google.com/~f/readwriteweb?a=KgkxmhS9"><img src="http://feedproxy.google.com/~f/readwriteweb?i=KgkxmhS9" /></a> <a href="http://feedproxy.google.com/~f/readwriteweb?a=6q1YC2nC"><img src="http://feedproxy.google.com/~f/readwriteweb?d=52" /></a> <a href="http://feedproxy.google.com/~f/readwriteweb?a=S08s96ca"><img src="http://feedproxy.google.com/~f/readwriteweb?d=1034" /></a>
</div><img src="http://feedproxy.google.com/~r/readwriteweb/~4/jh4fsGzdL84" height="1" width="1" />
</div>]]>
      </description>
      <pubDate>jeu, 04 Dec 2008 01:02:47 +0100</pubDate>
      <guid isPermaLink="false">tag:ziki.com,2008:/article/8428381</guid>
    </item>
    <item>
      <title>The Distributed Social Networking Puzzle: Putting The Pieces Together</title>
      <link>http://feedproxy.google.com/%7Er/readwriteweb/%7E3/alegFxHV4Vg/distributed_social_networking.php</link>
      <description>
        <![CDATA[<div class="post_content wiki_text"><p>
  <img src="http://www.readwriteweb.com/images/distributed_social_networks_puzzle.jpg" />Distributed social networking - where users can connect their profile, friends and other data across multiple sites - is still a relatively new concept and not fully developed. There are plenty of companies and projects vying to be a major piece of the distributed social networking puzzle. The big Internet companies have initiatives such as <a href="http://www.readwriteweb.com/archives/opensocial_one_year_later.php">OpenSocial</a> (Google), <a href="http://www.readwriteweb.com/archives/facebook_connect_coming_soon_t.php">Facebook Connect</a>, <a href="http://www.readwriteweb.com/archives/myspace_data_availability.php">MySpace Data Availability</a>, <a href="http://www.readwriteweb.com/archives/yahoo_opens_yos_to_developers.php">Yahoo! Open Strategy</a>. There are also smaller company and open source projects such as DiSo and Noserub (we explain these below).
</p>
<p style="text-align: right;">
  <em>Sponsor</em><br />
  <a href="http://d.openx.org/ck.php?n=12808&amp;amp;cb=12808"><img src="http://d.openx.org/avw.php?zoneid=861&amp;amp;cb=12808&amp;amp;n=12808" alt="" align="right" /></a>
</p>
<p>
  For users the following scenario explains the end goal, albeit too simplistically: in a distributed social networking world you would be able to access your Facebook friends in MySpace, and vice versa. Of course, it's far from a perfect world and the Facebook-MySpace sharing scenario in particular is unlikely to happen any time soon. But slowly social networking is beginning to open up - and not just in the major social networks either.
</p>
<p>
  We spotted an interesting screencast in the ReadWriteWeb Friendfeed room, <a href="http://friendfeed.com/rooms/rww">The Future of Tech</a>, that explains distributed social networking more.
</p>
<p>
  <embed src="http://vimeo.com/moogaloop.swf?clip_id=2378501&amp;amp;server=vimeo.com&amp;amp;show_title=1&amp;amp;show_byline=1&amp;amp;show_portrait=0&amp;amp;color=&amp;amp;fullscreen=1" height="273" width="400" /><br />
  <a href="http://vimeo.com/2378501">Distributed Social Networking - An Introduction</a> from <a href="http://vimeo.com/pixelsebi">pixelsebi</a> on <a href="http://vimeo.com">Vimeo</a>.
</p>
<p>
  The screencast was created by <a href="http://pixelsebi.com">Sebastian Küpers</a>, an Open Web and Virtual Worlds Evangelist from Germany. He starts by explaining that profiles are a building block of social networks - for example there's a lot of useful profile data in his Facebook account that he'd like to use elsewhere. Friends/contacts, messaging, groups, and activity streams are other building blocks of social networks, explained Sebastian.
</p>
<p>
  He mentioned two projects that are aiming to create distributed social networks by using open standards - <a href="http://diso-project.org/">DiSo Project</a> (our coverage <a href="http://www.readwriteweb.com/archives/messina_norris_vidoop.php">here</a> and <a href="http://www.readwriteweb.com/archives/wordpress_social_networks_ill.php">here</a>) and <a href="http://noserub.com/">Noserub</a> (a German app). DiSo is basically an umbrella project for many of the leading open standards in the social Web currently - microformats, OpenID, OAuth and more. Noserub describes itself as a "protocol" and uses standards like OpenID, RSS and FOAF.
</p>
<p>
  Sebastian outlined the following use case: if you are a MySpace user and want to add someone who isn't a MySpace user to your friends list, right now you can't. But if MySpace supported the open standards that Noserub, DiSo and others are advocating (microformats, OpenID, etc), then it would be possible for MySpace to support that scenario.
</p>
<h2>
  Key Differences Between DiSo/Noserub and OpenSocial/fbConnect
</h2>
<p>
  One question that people have about distributed social networks, which Sebastian might like to address in a future screencast, is what is the relation between open source projects like DiSo and Noserub, and 'open data' projects of the bigcos such as Google's OpenSocial and Facebook Connect? Chris Messina, one of the founders of DiSo, pointed out one key difference <a href="http://groups.google.com/group/diso-project/browse_thread/thread/635b58f051b54a56">in DiSo's Google Group in June</a>:
</p>
<blockquote>
  <p>
    "Our model is rather different than OpenSocial as I understand it, as we're trying to architect this in such a way that anyone can host their own friends list (for example) and not necessarily defer to Google, MySpace, etc... for starters."
  </p>
</blockquote>
<p>
  So for DiSo, they are using the Wordpress blogging platform as their main vehicle for now. However in the same message, Chris mentioned that he's "personally very interested in the overlap between DiSo and fbConnect and OpenSocial." See also <a href="http://blog.broadbandmechanics.com/2008/11/the-open-stack-diso-and-all-those-closed-stacks">Marc Canter's comments on DiSo</a>, because Marc's "open mesh" theories are very relevant here.
</p>
<h2>
  If Everything is So Open, Why Can't We Connect Yet?
</h2>
<p>
  There is confusion right now because all the commercial vendors are positioning themselves as open - yet they don't necessarily connect to each other! For example <a href="http://www.readwriteweb.com/archives/googles_new_open_stack_sans_facebook_microsoft.php">Google has been using the term "Open Stack"</a> to explain what OpenSocial is doing. OpenSocial is still in development and it's important to point out that Google doesn't 'own' it, although it is obviously driving it. But OpenSocial isn't being used by key players like Facebook and Microsoft; and when it is being used by bigcos it can be buggy - a RWW commenter recently remarked that MySpace's OpenSocial implementation is <a href="http://www.readwriteweb.com/archives/googles_new_open_stack_sans_facebook_microsoft.php#comment-118698">"incredibly buggy"</a>. So the fact that all of the main pieces of the distributed social networking puzzle are still in beta, goes some way to explaining why ordinary people can't connect many of their profiles just yet.
</p>
<p>
  <img src="http://www.readwriteweb.com/images/opensocial_stack08.jpg" />
</p>
<p>
  We'd like to get some more feedback on distributed social networks in the comments - how would you explain the key differences between DiSo/Noserub and OpenSocial/fbConnect to people? How do you see all the different projects connecting together eventually?
</p>
<p>
  <strong>Note:</strong> the idea for this post came from the ReadWriteWeb Friendfeed room, <a href="http://friendfeed.com/rooms/rww">The Future of Tech</a>. Thanks to <a href="http://friendfeed.com/pixelsebi">Sebastian Küpers</a> for posting it. If you're want to inspire the RWW crew to write posts on certain topics, <a href="http://friendfeed.com/rooms/rww">our Friendfeed room</a> is a great place to let us know! Thanks also <a href="http://friendfeed.com/zee">Zee</a> for managing that room for us.
</p><strong><a href="http://www.readwriteweb.com/archives/distributed_social_networking.php#comments-open">Discuss</a></strong>
<p>
  <a href="http://feedads.googleadservices.com/~at/Aap1Gqx68ATMotyYWPDUAsXCvtQ/a"><img src="http://feedads.googleadservices.com/~at/Aap1Gqx68ATMotyYWPDUAsXCvtQ/i" /></a>
</p>
<div>
  <a href="http://feedproxy.google.com/~f/readwriteweb?a=MnkwcZSY"><img src="http://feedproxy.google.com/~f/readwriteweb?d=1035" /></a> <a href="http://feedproxy.google.com/~f/readwriteweb?a=qSa40HX0"><img src="http://feedproxy.google.com/~f/readwriteweb?d=41" /></a> <a href="http://feedproxy.google.com/~f/readwriteweb?a=PnkiI2Fv"><img src="http://feedproxy.google.com/~f/readwriteweb?i=PnkiI2Fv" /></a> <a href="http://feedproxy.google.com/~f/readwriteweb?a=0Iu9JlKk"><img src="http://feedproxy.google.com/~f/readwriteweb?i=0Iu9JlKk" /></a> <a href="http://feedproxy.google.com/~f/readwriteweb?a=9Ni7J5kO"><img src="http://feedproxy.google.com/~f/readwriteweb?i=9Ni7J5kO" /></a> <a href="http://feedproxy.google.com/~f/readwriteweb?a=0NB5lCzq"><img src="http://feedproxy.google.com/~f/readwriteweb?d=52" /></a> <a href="http://feedproxy.google.com/~f/readwriteweb?a=ack96X50"><img src="http://feedproxy.google.com/~f/readwriteweb?d=1034" /></a>
</div><img src="http://feedproxy.google.com/~r/readwriteweb/~4/alegFxHV4Vg" height="1" width="1" />
</div>]]>
      </description>
      <pubDate>mer, 03 Dec 2008 23:25:17 +0100</pubDate>
      <guid isPermaLink="false">tag:ziki.com,2008:/article/8426218</guid>
    </item>
    <item>
      <title>Introduction to Automated Proof Verification with SASyLF</title>
      <link>http://feeds.codecommit.com/%7Er/codecommit/%7E3/471037368/introduction-to-automated-proof-verification-with-sasylf</link>
      <description>
        <![CDATA[<div class="post_content wiki_text"><p>
  Doesn’t that title just get the blood pumping?&nbsp; Proof verification has a reputation for being an inordinately academic subject.&nbsp; In fact, even within scholarly (otherwise known as “<em>unrealistically intelligent</em>“) circles, the automated verification of proofs is known mainly as a complex, ugly and difficult task often not worth the effort.&nbsp; This is a shame really, because rigorous proofs are at the very core of both mathematics and computer science.&nbsp; We are nothing without logic (paraphrased contrapositive from Descartes).&nbsp; Believe it or not, understanding basic proof techniques will be of tremendous aid to your cognitive process, even when working on slightly less ethereal problems such as how to get the freakin’ login page to work properly.
</p>
<p>
  Well, if you made it all the way to the second paragraph, then you either believe me when I say that this is legitimately useful (and cool!) stuff, or you’re just plain bored.&nbsp; Either way, read on as we commence our exciting journey into the land of rigorous proofs!
</p>
<h3>
  SASyLF Crash Course
</h3>
<p>
  If you’re at all familiar with the somewhat-specialized field of proof verification, you probably know that <a href="http://www.sasylf.org">SASyLF</a> (pronounced “sassy elf”) is <em>not</em> the most widely used tool for the job.&nbsp; In fact, it may very well be the least well-known.&nbsp; More commonly, proofs that require automatic verification are written in <a href="http://twelf.plparty.org/wiki/Main_Page">Twelf</a> or <a href="http://coq.inria.fr/">Coq</a>.&nbsp; Both of these are fine tools and capable of a lot more than SASyLF, but they can also be extremely difficult to use.&nbsp; One of the primary motivations behind SASyLF was to produce a tool which was easier to learn, had a higher level syntax (easier to read) and which gave more helpful error messages than Twelf.&nbsp; The main idea behind these convolutions was to produce a tool which was more suitable for use in the classroom.
</p>
<p>
  The main design decision which sets SASyLF apart from Twelf is the way in which proofs are expressed.&nbsp; As I understand it, Twelf exploits <a href="http://en.wikipedia.org/wiki/Curry-Howard_correspondence">Curry-Howard correspondence</a> to represent proofs implicitly in the types of a functional program (<strong>disclaimer:</strong> I’ve never used Twelf, this is just coming from what little I have read about it).&nbsp; While this can be very powerful, it’s not the most intuitive way to think about a proof.&nbsp; Eschewing this approach, SASyLF expresses proofs using <em>unification</em> (very similar to Prolog) and defines inference rules explicitly in a natural-language style.
</p>
<p>
  There are three main components to a SASyLF proof:
</p>
<ul>
  <li>Syntax
  </li>
  <li>Judgments
  </li>
  <li>Theorems/Lemmas
  </li>
</ul>
<p>
  Intuitively enough, the syntax section is where we express the grammar for the language used throughout our proof.&nbsp; This grammar is expressed very naturally using BNF, just as if we were defining the language mathematically for a hand-written proof.&nbsp; Left-recursion is allowed, as is right-recursion, arbitrary symbols, ambiguity and so on.&nbsp; SASyLF’s parser is mind bogglingly powerful, capable of chewing threw just about any syntax you throw at it.&nbsp; The main restriction is that you cannot use parentheses, square brackets (<code>[]</code>), pipes (<code>|</code>) or periods (<code>.</code>) in your syntax.&nbsp; The pure-untyped lambda calculus defined in SASyLF would look something like this:
</p>
<div>
  
    
      
      
        <pre>
<span style="color: #000000;">t ::=<span style="color: #ff00cc;"> </span><span style="color: #ff00cc;">fn</span><span style="color: #ff00cc;"> </span><span style="color: #66ccff; font-weight: bold;">x</span><span style="color: #ff00cc;"> </span><span style="color: #ff00cc;">=</span><span style="color: #ff00cc;">&gt;</span><span style="color: #ff00cc;"> </span><span style="color: #ff00cc;">t</span><span style="color: #000000; font-weight: bold;">[</span><span style="color: #66ccff; font-weight: bold;">x</span><span style="color: #000000; font-weight: bold;">]</span>
<span style="color: #000000; font-weight: bold;"> </span><span style="color: #000000; font-weight: bold;"> </span><span style="color: #000000; font-weight: bold;"> </span><span style="color: #000000; font-weight: bold;"> </span><span style="color: #000000; font-weight: bold;">|</span><span style="color: #000000; font-weight: bold;"> </span><span style="color: #ff00cc;">t</span><span style="color: #ff00cc;"> </span><span style="color: #ff00cc;">t</span>
<span style="color: #000000; font-weight: bold;"> </span><span style="color: #000000; font-weight: bold;"> </span><span style="color: #000000; font-weight: bold;"> </span><span style="color: #000000; font-weight: bold;"> </span><span style="color: #000000; font-weight: bold;">|</span><span style="color: #000000; font-weight: bold;"> </span><span style="color: #66ccff; font-weight: bold;">x</span>
</span>
</pre>
      
    
  
</div>
<p>
  I said we couldn’t use brackets, but that’s only because SASyLF assigns some special magic to these operators.&nbsp; In a nutshell, they allow the above definition of lambda calculus to ignore all of the issues associated with variable name freshness and context.&nbsp; For simplicity’s sake, that’s about as far as I’m going to go into these mysterious little thingies.
</p>
<p>
  The judgments section is where we define our inference rules.&nbsp; Just as if we were defining these rules by hand, the syntax has the conditionals above a line of hyphens with the conclusion below.&nbsp; The label for the rule goes to the right of the “line”.&nbsp; What could be more natural?
</p>
<div>
  
    
      
      
        <pre>
<span style="color: #000000;"><span style="color: #006699; font-weight: bold;">judgment</span><span style="color: #006699; font-weight: bold;"> </span><span style="color: #9900cc;">eval</span><span style="color: #006699; font-weight: bold;">:</span> t -&gt; t

t1 -&gt; t1′
<span style="color: #cc00cc;">---------------</span><span style="color: #cc00cc;"> </span><span style="color: #cc00cc;">E-Beta1</span>
t1 t2 -&gt; t1′ t2
</span>
</pre>
      
    
  
</div>
<p>
  The <code>judgment</code> syntax is what defines the syntax for the <code>-&gt;</code> “operator”.&nbsp; Once SASyLF sees this, it knows that we may define rules of the form <code>t -&gt; t</code>, where <code>t</code> is defined by the syntax section.&nbsp; Further on down, SASyLF sees our <code>E-Beta1</code> rule.&nbsp; Each of the tokens within this rule (aside from <code>-&gt;</code>) begins with “<code>t</code>“.&nbsp; From this, SASyLF is able to infer that we mean “a term as defined previously”.&nbsp; Thus, this rule is syntactically valid according to our evaluation judgment and the syntax given above.
</p>
<p>
  Of course, theorems are where you will find the real meat of any proof (I’m using the word “proof” very loosely to mean the collection of proven theorems and lemmas which indicates some fact(s) about a language).&nbsp; SASyLF wouldn’t be a very complete proof verification system without support for some form of proving.&nbsp; Once again, the syntax is extremely natural language, almost to the point of being overly-verbose.&nbsp; A simple theorem given the rules above plus a little would be to show that values cannot evaluate:
</p>
<div>
  
    
      
      
        <pre>
<span style="color: #000000;"><span style="color: #006699; font-weight: bold;">theorem</span> <span style="color: #9900cc;">eval-value-implies-contradiction:</span>
    <span style="color: #009966; font-weight: bold;">forall</span><span style="color: #009966; font-weight: bold;"> </span><span style="color: #9966ff;">e:</span> t -&gt; t’
    <span style="color: #009966; font-weight: bold;">forall</span><span style="color: #009966; font-weight: bold;"> </span><span style="color: #9966ff;">v:</span> t value
    <span style="color: #009966; font-weight: bold;">exists</span> contradiction <span style="color: #000000; font-weight: bold;">.</span>

<span style="color: #9966ff;"> </span><span style="color: #9966ff;"> </span><span style="color: #9966ff;"> </span><span style="color: #9966ff;"> </span><span style="color: #9966ff;">_:</span><span style="color: #9966ff;"> </span>contradiction <span style="color: #000000; font-weight: bold;">by</span><span style="color: #000000; font-weight: bold;"> </span><span style="background: #ffffcc; color: #ff0066;">unproved</span>
<span style="color: #006699; font-weight: bold;">end theorem</span>
</span>
</pre>
      
    
  
</div>
<p>
  Note that <code>contradiction</code> is not more SASyLF magic.&nbsp; We can actually define what it means to have a contradiction by adding the following lines to our judgment section:
</p>
<div>
  
    
      
      
        <pre>
<span style="color: #000000;"><span style="color: #006699; font-weight: bold;">judgment</span><span style="color: #006699; font-weight: bold;"> </span><span style="color: #9900cc;">absurd</span><span style="color: #006699; font-weight: bold;">:</span> contradiction
</span>
</pre>
      
    
  
</div>
<p>
  In other words, we can have a contradiction, but there are no rules which allow us to get it.&nbsp; In fact, the only way to have a contradiction is to somehow get SASyLF to the point where it sees that there are no cases which satisfy some set of proven facts (given the <code>forall</code> assumptions).&nbsp; If SASyLF cannot find any cases to satisfy some rules, it allows us to derive anything at all, including judgments which have no corresponding rules.
</p>
<p>
  Readers who have yet to fall asleep will notice that I cleverly elided a portion of the “<code>theorem</code>” code snippet.&nbsp; That’s because there wasn’t really a way to prove that contradiction given the drastically abbreviated rules given in earlier samples.&nbsp; Instead of proving anything, I used a special SASyLF justification, <code>unproved</code>, which allows the derivation of any fact given no input (very useful for testing incomplete proofs).&nbsp; Lambda calculus isn’t much more complicated than what I showed, but it does require more than just an application context rule in its evaluation semantics.&nbsp; In order to get a taste for SASyLF’s proof syntax, we’re going to need to look at a much simpler language.
</p>
<h3>
  Case Study: Integer Comparison
</h3>
<p>
  For this case study, we’re going to be working with simple counting numbers which start with <code>0</code> and then proceed upwards, each value expressed as the successor of its previous value.&nbsp; Thus, the logical number 3 would be <code>s s s 0</code>.&nbsp; Not a very useful language in the real world, but much easier to deal with in the field of proof verification.&nbsp; The syntax for our natural numbers looks like this:
</p>
<div>
  
    
      
      
        <pre>
<span style="color: #000000;">n ::=<span style="color: #ff00cc;"> </span><span style="color: #ff00cc;">0</span>
<span style="color: #000000; font-weight: bold;"> </span><span style="color: #000000; font-weight: bold;"> </span><span style="color: #000000; font-weight: bold;"> </span><span style="color: #000000; font-weight: bold;"> </span><span style="color: #000000; font-weight: bold;">|</span><span style="color: #000000; font-weight: bold;"> </span><span style="color: #ff00cc;">s</span><span style="color: #ff00cc;"> </span><span style="color: #ff00cc;">n</span>
</span>
</pre>
      
    
  
</div>
<p>
  With this humble definition for <code>n</code>, we can go on to define the mathematical greater-than comparison using two rules under a single judgment:
</p>
<div>
  
    
      
      
        <pre>
<span style="color: #000000;"><span style="color: #006699; font-weight: bold;">judgment</span><span style="color: #006699; font-weight: bold;"> </span><span style="color: #9900cc;">gt</span><span style="color: #006699; font-weight: bold;">:</span> n &gt; n

<span style="color: #cc00cc;">-------</span><span style="color: #cc00cc;"> </span><span style="color: #cc00cc;">gt-one</span>
s n &gt; n

n1 &gt; n2
<span style="color: #cc00cc;">---------</span><span style="color: #cc00cc;"> </span><span style="color: #cc00cc;">gt-more</span>
s n1 &gt; n2
</span>
</pre>
      
    
  
</div>
<p>
  Believe it or not, this is all we need to do in terms of definition.&nbsp; The first rule says that the successor of any number is greater than that same number (3 &gt; 2).&nbsp; The second rule states that if we already have two numbers, one greater than the other (12 &gt; 4), then the successor of the greater number will still be greater than the lesser (13 &gt; 4).&nbsp; All very intuitive, but the real question is whether or not we can prove anything with these definitions.
</p>
<h4>
  An Easy Lemma
</h4>
<p>
  For openers, we can try something reasonably simple: prove that all non-zero numbers are greater than zero.&nbsp; This is such a simple proof that we won’t even bother calling it a theorem, we will give it the lesser rank of “lemma”:
</p>
<div>
  
    
      
      
        <pre>
<span style="color: #000000;"><span style="color: #006699; font-weight: bold;">lemma</span> <span style="color: #9900cc;">all-gt-zero:</span>
    <span style="color: #009966; font-weight: bold;">forall</span><span style="color: #009966; font-weight: bold;"> </span>n
    <span style="color: #009966; font-weight: bold;">exists</span> s n &gt; 0 <span style="color: #000000; font-weight: bold;">.</span>

<span style="color: #9966ff;">    </span><span style="color: #9966ff;">_:</span><span style="color: #9966ff;"> </span>s n &gt; 0 <span style="color: #000000; font-weight: bold;">by</span><span style="color: #000000; font-weight: bold;"> </span><span style="color: #0099ff; font-weight: bold;">induction</span><span style="color: #9966ff;"> </span><span style="color: #000000; font-weight: bold;">on </span><span style="color: #9966ff;">n:</span>
        <span style="color: #006699; font-weight: bold;">case</span> 0 <span style="color: #006699; font-weight: bold;">is</span>
<span style="color: #9966ff;">    </span><span style="color: #9966ff;">    </span><span style="color: #9966ff;">    </span><span style="color: #9966ff;">_:</span><span style="color: #9966ff;"> </span>s 0 &gt; 0 <span style="color: #000000; font-weight: bold;">by</span><span style="color: #000000; font-weight: bold;"> </span><span style="color: #0099ff; font-weight: bold;">rule</span><span style="color: #0099ff; font-weight: bold;"> </span><span style="color: #cc00cc;">gt-one</span>
        <span style="color: #006699; font-weight: bold;">end case</span>

        <span style="color: #006699; font-weight: bold;">case</span> s n1 <span style="color: #006699; font-weight: bold;">is</span>
<span style="color: #9966ff;">    </span><span style="color: #9966ff;">    </span><span style="color: #9966ff;">    </span><span style="color: #9966ff;">g:</span><span style="color: #9966ff;"> </span>s n1 &gt; 0 <span style="color: #000000; font-weight: bold;">by</span><span style="color: #000000; font-weight: bold;"> </span><span style="color: #0099ff; font-weight: bold;">induction hypothesis</span><span style="color: #9966ff;"> </span><span style="color: #000000; font-weight: bold;">on </span><span style="color: #9966ff;">n1</span>
<span style="color: #9966ff;">    </span><span style="color: #9966ff;">    </span><span style="color: #9966ff;">    </span><span style="color: #9966ff;">_:</span><span style="color: #9966ff;"> </span>s s n1 &gt; 0 <span style="color: #000000; font-weight: bold;">by</span><span style="color: #000000; font-weight: bold;"> </span><span style="color: #0099ff; font-weight: bold;">rule</span><span style="color: #0099ff; font-weight: bold;"> </span><span style="color: #cc00cc;">gt-more</span><span style="color: #0099ff; font-weight: bold;"> </span><span style="color: #000000; font-weight: bold;">on </span><span style="color: #9966ff;">g</span>
        <span style="color: #006699; font-weight: bold;">end case</span>
    <span style="color: #006699; font-weight: bold;">end induction</span>
<span style="color: #006699; font-weight: bold;">end lemma</span>
</span>
</pre>
      
    
  
</div>
<p>
  In order to prove anything about <code>n</code>, we first need to “pull it apart” and find out what it’s made of.&nbsp; To do that, we’re going to use <code>induction</code>.&nbsp; We could also use <code>case analysis</code>, but that would only work if our proof didn’t require “recursion” (we’ll get to this in a minute).&nbsp; There are two cases as given by the syntax for <code>n</code>: when <code>n</code> is “<code>0</code>“, and when <code>n</code> is “<code>s n1</code>“, where <code>n1</code> is some other number.&nbsp; We must prove that <code>s n &gt; 0</code> for both of these cases individually, otherwise our proof is not valid.
</p>
<p>
  The first case is easy.&nbsp; When <code>n</code> is 0, the proof is trivial using the rule <code>gt-one</code>.&nbsp; Notice that within this case we are no longer proving <code>s n &gt; 0</code>, but rather <code>s 0 &gt; 0</code>.&nbsp; This is the huge win brought by SASyLF’s unification: <code>n</code> <em>is</em> “<code>0</code>” within this case.&nbsp; Anything we already know about <code>n</code>, we also know about <code>0</code>.&nbsp; When we apply the rule <code>gt-one</code>, SASyLF sees that we are attempting to prove <code>s n &gt; n</code> where <code>n</code> is “<code>0</code>“.&nbsp; This is valid by the rule, so the verification passes.
</p>
<p>
  The second case is where things get interesting.&nbsp; We have that <code>n</code> is actually <code>s n1</code>, but that doesn’t really get us too much closer to proving <code>s s n1 &gt; 0</code> (remember, unification).&nbsp; Fortunately, we <em>can</em> prove that <code>s n1 &gt; 0</code> because we’re writing a lemma at this very moment which prove that.&nbsp; This is like writing a function to sum all the values in a list: when the list is empty, the result is trivial; but when the list has contents, we must take the head and then add it to the sum of the tail as computed by…ourself.&nbsp; Induction is literally just recursion in logic.&nbsp; Interestingly enough, SASyLF is smart enough to look at all of the inductive cases in your proof and verify that they are valid.&nbsp; This is sort-of the equivalent of a compiler looking at your code and telling you whether or not it will lead to an infinite loop.
</p>
<p>
  To get that <code>s n1 &gt; 0</code>, we use the induction hypothesis, passing <code>n1</code> as the “parameter”.&nbsp; However, we’re not quite done yet.&nbsp; We need to prove that <code>s s n1 &gt; 0</code> in order to unify with our original target (<code>s n &gt; 0</code>).&nbsp; Fortunately, we already have a rule that allows us to prove the successor of a number retains its greater-than status: <code>gt-more</code>.
</p>
<p>
  However, <code>gt-more</code> has a condition in our definition.&nbsp; It requires that we already have some fact <code>n1 &gt; n2</code> in order to obtain <code>s n1 &gt; n2</code>.&nbsp; In our case, we already have this fact (<code>s n1 &gt; 0</code>), but we need to “pass” it to the rule.&nbsp; SASyLF allows us to do this by giving our facts labels.&nbsp; In this case, we have labeled the <code>s n1 &gt; 0</code> fact as “<code>g</code>“.&nbsp; We take this fact, pack it up and send it to <code>gt-more</code> and it gives us back our final goal.
</p>
<h4>
  A Slightly Harder Theorem
</h4>
<p>
  A slightly more difficult task would be to prove that the successors of two numbers preserves their greater-than relationship.&nbsp; Thus, if we know that 4 &gt; 3, we can prove that 5 &gt; 4.&nbsp; More formally:
</p>
<div>
  
    
      
      
        <pre>
<span style="color: #000000;"><span style="color: #006699; font-weight: bold;">theorem</span> <span style="color: #9900cc;">gt-implies-gt-succ:</span>
    <span style="color: #009966; font-weight: bold;">forall</span><span style="color: #009966; font-weight: bold;"> </span><span style="color: #9966ff;">g:</span> n1 &gt; n2
    <span style="color: #009966; font-weight: bold;">exists</span> s n1 &gt; s n2 <span style="color: #000000; font-weight: bold;">.</span>

<span style="color: #9966ff;">    </span><span style="color: #9966ff;">_:</span><span style="color: #9966ff;"> </span>s n1 &gt; s n2 <span style="color: #000000; font-weight: bold;">by</span><span style="color: #000000; font-weight: bold;"> </span><span style="background: #ffffcc; color: #ff0066;">unproved</span>
<span style="color: #006699; font-weight: bold;">end theorem</span>
</span>
</pre>
      
    
  
</div>
<p>
  At first glance, this looks impossible since we don’t really have a rule dealing with <code>s n</code> on the right-hand side of the <code>&gt;</code>-sign.&nbsp; We can try to prove this one step at a time to see whether or not this intuition is correct.
</p>
<p>
  Almost any lemma of interest is going to require induction, so immediately we jump to inducting on the only fact we have available: <code>g</code>.&nbsp; Note that this is different from what we had in the earlier example.&nbsp; Instead of getting the different syntactic cases, we’re looking at the the rules which would have allowed the input to be constructed.&nbsp; After all, whoever “called” our theorem will have needed to somehow prove that <code>n1 &gt; n2</code>, it would be helpful to know what facts they used to do that.&nbsp; SASyLF allows this using the <code>case rule</code> syntax.&nbsp; We start with the easy base case:
</p>
<div>
  
    
      
      
        <pre>
<span style="color: #000000;"><span style="color: #9966ff;">_:</span><span style="color: #9966ff;"> </span>s n1 &gt; s n2 <span style="color: #000000; font-weight: bold;">by</span><span style="color: #000000; font-weight: bold;"> </span><span style="color: #0099ff; font-weight: bold;">induction</span><span style="color: #9966ff;"> </span><span style="color: #000000; font-weight: bold;">on </span><span style="color: #9966ff;">g:</span>
    <span style="color: #006699; font-weight: bold;">case rule</span>
<span style="color: #cc00cc;">    </span><span style="color: #cc00cc;">    </span><span style="color: #cc00cc;">------------</span><span style="color: #cc00cc;"> </span><span style="color: #cc00cc;">gt-one</span>
<span style="color: #9966ff;">    </span><span style="color: #9966ff;">    </span><span style="color: #9966ff;">_:</span><span style="color: #9966ff;"> </span>s n2 &gt; n2
    <span style="color: #006699; font-weight: bold;">is</span>
<span style="color: #9966ff;">    </span><span style="color: #9966ff;">    </span><span style="color: #9966ff;">_:</span><span style="color: #9966ff;"> </span>s s n2 &gt; s n2 <span style="color: #000000; font-weight: bold;">by</span><span style="color: #000000; font-weight: bold;"> </span><span style="color: #0099ff; font-weight: bold;">rule</span><span style="color: #0099ff; font-weight: bold;"> </span><span style="color: #cc00cc;">gt-one</span>
    <span style="color: #006699; font-weight: bold;">end case</span>
<span style="color: #006699; font-weight: bold;">end induction</span>
</span>
</pre>
      
    
  
</div>
<p>
  In this case, the term <code>_: s n2 &gt; n2</code> is unified with <code>n1 &gt; n2</code>.&nbsp; Thus, <code>n1</code> is actually “<code>s n2</code>“.&nbsp; This means that by unification, we are actually trying to prove <code>s s n2 &gt; s n2</code>.&nbsp; Fortunately, we have a rule for that.&nbsp; If we let “<code>n</code>” be “<code>s n2</code>“, we can easily apply the rule <code>gt-one</code> to produce the desired result.
</p>
<p>
  The second case is a bit trickier.&nbsp; We start out by defining the case rule according to the inference rules given in the judgment section.&nbsp; The only case left is <code>gt-more</code>, so we mindlessly copy/paste and correct the variables to suit our needs:
</p>
<div>
  
    
      
      
        <pre>
<span style="color: #000000;"><span style="color: #006699; font-weight: bold;">case rule</span>
<span style="color: #9966ff;">    </span><span style="color: #9966ff;">g1:</span><span style="color: #9966ff;"> </span>n11 &gt; n2
<span style="color: #cc00cc;">    </span><span style="color: #cc00cc;">-------------</span><span style="color: #cc00cc;"> </span><span style="color: #cc00cc;">gt-more</span>
<span style="color: #9966ff;">    </span><span style="color: #9966ff;">_:</span><span style="color: #9966ff;"> </span>s n11 &gt; n2
<span style="color: #006699; font-weight: bold;">is</span>
<span style="color: #9966ff;">    </span><span style="color: #9966ff;">_:</span><span style="color: #9966ff;"> </span>s s n11 &gt; s n2 <span style="color: #000000; font-weight: bold;">by</span><span style="color: #000000; font-weight: bold;"> </span><span style="background: #ffffcc; color: #ff0066;">unproved</span>
<span style="color: #006699; font-weight: bold;">end case</span>
</span>
</pre>
      
    
  
</div>
<p>
  In this case, <code>n1</code> actually unifies with “<code>s n11</code>“.&nbsp; This is probably the most annoying aspect of SASyLF: all of the syntax is determined by token prefix, so <em>every</em> number has to start with <code>n</code>, occasionally making proofs a little difficult to follow.
</p>
<p>
  At this point, we need to derive <code>s s n11 &gt; s n2</code>.&nbsp; Since the left and right side of the <code>&gt;</code> “operator” do not share a common sub-term, the only rule which could possibly help us is <code>gt-more</code>.&nbsp; In order to apply this rule, we will somehow need to derive <code>s n11 &gt; s n2</code> (remember, <code>gt-more</code> takes a known greater-than relationship and then tells us something about how the left-successor relates to the right).&nbsp; We can reflect this “bottom-up” step towards a proof in the following way:
</p>
<div>
  
    
      
      
        <pre>
<span style="color: #000000;"><span style="color: #006699; font-weight: bold;">case rule</span>
<span style="color: #9966ff;">    </span><span style="color: #9966ff;">g1:</span><span style="color: #9966ff;"> </span>n11 &gt; n2
<span style="color: #cc00cc;">    </span><span style="color: #cc00cc;">-------------</span><span style="color: #cc00cc;"> </span><span style="color: #cc00cc;">gt-more</span>
<span style="color: #9966ff;">    </span><span style="color: #9966ff;">_:</span><span style="color: #9966ff;"> </span>s n11 &gt; n2
<span style="color: #006699; font-weight: bold;">is</span>
<span style="color: #9966ff;">    </span><span style="color: #9966ff;">g:</span><span style="color: #9966ff;"> </span>s n11 &gt; s n2 <span style="color: #000000; font-weight: bold;">by</span><span style="color: #000000; font-weight: bold;"> </span><span style="background: #ffffcc; color: #ff0066;">unproved</span>
<span style="color: #9966ff;">    </span><span style="color: #9966ff;">_:</span><span style="color: #9966ff;"> </span>s s n11 &gt; s n2 <span style="color: #000000; font-weight: bold;">by</span><span style="color: #000000; font-weight: bold;"> </span><span style="color: #0099ff; font-weight: bold;">rule</span><span style="color: #0099ff; font-weight: bold;"> </span><span style="color: #cc00cc;">gt-more</span><span style="color: #0099ff; font-weight: bold;"> </span><span style="color: #000000; font-weight: bold;">on </span><span style="color: #9966ff;">g</span>
<span style="color: #006699; font-weight: bold;">end case</span>
</span>
</pre>
      
    
  
</div>
<p>
  At this point, SASyLF will warn us about the <code>unproved</code>, but it will happily pass the rest of our theorem.&nbsp; This technique for proof development is extremely handy in more complicated theorems.&nbsp; The ability to find out whether or not your logic is sound even before it is complete can be very reassuring (in this way you can avoid chasing entirely down the wrong logical path).
</p>
<p>
  In order to make this whole thing work, we need to somehow prove <code>s n11 &gt; s n2</code>.&nbsp; Fortunately, we just so happen to be working on a theorem which could prove this if we could supply <code>n11 &gt; n2</code>.&nbsp; This fact is conveniently available with the label of “<code>g1</code>“.&nbsp; We feed this into the <code>induction hypothesis</code> to achieve our goal.&nbsp; The final theorem looks like this:
</p>
<div>
  
    
      
      
        <pre>
<span style="color: #000000;"><span style="color: #006699; font-weight: bold;">theorem</span> <span style="color: #9900cc;">gt-implies-gt-succ:</span>
    <span style="color: #009966; font-weight: bold;">forall</span><span style="color: #009966; font-weight: bold;"> </span><span style="color: #9966ff;">g:</span> n1 &gt; n2
    <span style="color: #009966; font-weight: bold;">exists</span> s n1 &gt; s n2 <span style="color: #000000; font-weight: bold;">.</span>

<span style="color: #9966ff;">    </span><span style="color: #9966ff;">_:</span><span style="color: #9966ff;"> </span>s n1 &gt; s n2 <span style="color: #000000; font-weight: bold;">by</span><span style="color: #000000; font-weight: bold;"> </span><span style="color: #0099ff; font-weight: bold;">induction</span><span style="color: #9966ff;"> </span><span style="color: #000000; font-weight: bold;">on </span><span style="color: #9966ff;">g:</span>
        <span style="color: #006699; font-weight: bold;">case rule</span>
<span style="color: #cc00cc;">    </span><span style="color: #cc00cc;">    </span><span style="color: #cc00cc;">    </span><span style="color: #cc00cc;">------------</span><span style="color: #cc00cc;"> </span><span style="color: #cc00cc;">gt-one</span>
<span style="color: #9966ff;">    </span><span style="color: #9966ff;">    </span><span style="color: #9966ff;">    </span><span style="color: #9966ff;">_:</span><span style="color: #9966ff;"> </span>s n2 &gt; n2
        <span style="color: #006699; font-weight: bold;">is</span>
<span style="color: #9966ff;">    </span><span style="color: #9966ff;">    </span><span style="color: #9966ff;">    </span><span style="color: #9966ff;">_:</span><span style="color: #9966ff;"> </span>s s n2 &gt; s n2 <span style="color: #000000; font-weight: bold;">by</span><span style="color: #000000; font-weight: bold;"> </span><span style="color: #0099ff; font-weight: bold;">rule</span><span style="color: #0099ff; font-weight: bold;"> </span><span style="color: #cc00cc;">gt-one</span>
        <span style="color: #006699; font-weight: bold;">end case</span>

        <span style="color: #006699; font-weight: bold;">case rule</span>
<span style="color: #9966ff;">    </span><span style="color: #9966ff;">    </span><span style="color: #9966ff;">    </span><span style="color: #9966ff;">g1:</span><span style="color: #9966ff;"> </span>n11 &gt; n2
<span style="color: #cc00cc;">    </span><span style="color: #cc00cc;">    </span><span style="color: #cc00cc;">    </span><span style="color: #cc00cc;">-------------</span><span style="color: #cc00cc;"> </span><span style="color: #cc00cc;">gt-more</span>
<span style="color: #9966ff;">    </span><span style="color: #9966ff;">    </span><span style="color: #9966ff;">    </span><span style="color: #9966ff;">_:</span><span style="color: #9966ff;"> </span>s n11 &gt; n2
        <span style="color: #006699; font-weight: bold;">is</span>
<span style="color: #9966ff;">    </span><span style="color: #9966ff;">    </span><span style="color: #9966ff;">    </span><span style="color: #9966ff;">g2:</span><span style="color: #9966ff;"> </span>s n11 &gt; s n2 <span style="color: #000000; font-weight: bold;">by</span><span style="color: #000000; font-weight: bold;"> </span><span style="color: #0099ff; font-weight: bold;">induction hypothesis</span><span style="color: #9966ff;"> </span><span style="color: #000000; font-weight: bold;">on </span><span style="color: #9966ff;">g1</span>
<span style="color: #9966ff;">    </span><span style="color: #9966ff;">    </span><span style="color: #9966ff;">    </span><span style="color: #9966ff;">_:</span><span style="color: #9966ff;"> </span>s s n11 &gt; s n2 <span style="color: #000000; font-weight: bold;">by</span><span style="color: #000000; font-weight: bold;"> </span><span style="color: #0099ff; font-weight: bold;">rule</span><span style="color: #0099ff; font-weight: bold;"> </span><span style="color: #cc00cc;">gt-more</span><span style="color: #0099ff; font-weight: bold;"> </span><span style="color: #000000; font-weight: bold;">on </span><span style="color: #9966ff;">g2</span>
        <span style="color: #006699; font-weight: bold;">end case</span>
    <span style="color: #006699; font-weight: bold;">end induction</span>
<span style="color: #006699; font-weight: bold;">end theorem</span>
</span>
</pre>
      
    
  
</div>
<h3>
  Conclusion
</h3>
<p>
  I realize this was a bit of a deviation from my normal semi-practical posts, but I think it was still a journey well worth taking.&nbsp; If you’re working as a serious developer in this industry, I strongly suggest that you find yourself a good formal language and/or type theory textbook (<a href="http://www.amazon.com/Types-Programming-Languages-Benjamin-Pierce/dp/0262162091/ref=pd_bbs_sr_1?ie=UTF8&amp;amp;s=books&amp;amp;qid=1228110398&amp;amp;sr=8-1">might I recommend?</a>) and follow it through the best that you can.&nbsp; The understanding of how languages are formally constructed and the mental circuits to create those proofs yourself will have a surprisingly powerful impact on your day-to-day programming.&nbsp; Knowing how the properties of a language are proven provides tremendous illumination into why that language is the way it is and somtimes how it can be made better.
</p>
<p>
  <strong>Credit:</strong> Examples in this post drawn rather unimaginatively from <a href="http://www.cs.uwm.edu/~boyland/">Dr. John Boyland’s</a> excellent course in type theory.
</p>
<ul>
  <li>
    <a href="http://www.cs.cmu.edu/~aldrich/SASyLF/">SASyLF Main Page</a> at Carnegie Mellon University
  </li>
  <li>
    <a href="http://www.codecommit.com/blog/misc/math.slf">Download math.slf</a> (the full greater-than example)
  </li>
  <li>
    <a href="http://www.cs.cmu.edu/~aldrich/SASyLF/fdpe08.pdf">Further reading…</a>
  </li>
</ul><img src="http://feeds.codecommit.com/~r/codecommit/~4/471037368" height="1" width="1" />
</div>]]>
      </description>
      <pubDate>lun, 01 Dec 2008 09:00:00 +0100</pubDate>
      <guid isPermaLink="false">tag:ziki.com,2008:/article/8401188</guid>
    </item>
    <item>
      <title>MIT&#8217;s Introduction to Algorithms, Lecture 15: Dynamic Programming</title>
      <link>http://feeds.feedburner.com/%7Er/catonmat/%7E3/467915525/</link>
      <description>
        <![CDATA[<div class="post_content wiki_text"><p>
  <img src="http://www.catonmat.net/blog/wp-content/uploads/2008/08/post-icon.jpg" alt="MIT Algorithms" align="left" />This is the tenth post in an article series about MIT’s lecture course “<strong>Introduction to Algorithms</strong>.” In this post I will review lecture fifteen, which introduces the concept of <strong>Dynamic Programming</strong> and applies it to the <strong>Longest Common Subsequence</strong> problem.
</p>
<p>
  Dynamic programming is a design technique similar to <a>divide and conquer</a>. Divide-and-conquer algorithms partition the problem into independent subproblems, solve the subproblems recursively, and then combine their solutions to solve the original problem. Dynamic programming is applicable when the subproblems are not independent, that is, when subproblems share subsubproblems. A dynamic-programming algorithm solves every subsubproblem just once and then saves its answer in a table, thereby avoiding the work of recomputing the answer every time the subsubproblem is encountered.
</p>
<p>
  Dynamic programming was systematized by <a href="http://en.wikipedia.org/wiki/Richard_E._Bellman">Richard E. Bellman</a>. He began the systematic study of dynamic programming in 1955. The word “programming,” both here and in linear programming, refers to the use of a tabular solution method and not to writing computer code.
</p>
<p>
  Dynamic programming is typically applied to optimization problems. In such problems there can be many possible solutions. Each solution has a value, and we wish to find a solution with the optimal (minimum or maximum) value. We call such a solution <em>an optimal solution</em>, as opposed to <em>the optimal solution</em>, since there may be several solutions that achieve the optimal value.
</p>
<p>
  Dynamic programming can be effectively applied to solve the longest common subsequence (LCS) problem. The problem is stated as following: given two sequences (or strings) x and y find a maximum-length common subsequence (substring) of x and y.
</p>
<p>
  For example, given two sequences x = “ABCBDAB” and y = “BDCABA”, the LCS(x, y) = { “BCBA”, “BDAB”, “BCAB” }. As you can see there are several optimal solutions.
</p>
<p>
  Lecture fifteen introduces dynamic programming via this longest common subsequence problem. It first gives a brute-force, exponential time algorithm for solving it. The idea of algorithm is to check every subequence of x[1..m] (m is the length of sequence x) to see if it is also a subsequence of y[1..n] (n is the length of sequence y). Checking takes O(n) time, and there are 2<sup>m</sup> subsequences of x. The running time thus is exponential O(n·2<sup>m</sup>). It is no good for large sequences and the lecture continues with a simplification - let’s look at the length of a longest-common subseq and then extend this algorithm to find the LCS itself. The simplified algorithm is recursive in nature and computes the same subproblems. At this moment two dynamic programming hallmarks are stated:
</p>
<ul>
  <li>1. <strong>Optimal substructure</strong>: an optimal solution to a problem contains optimal solutions to subproblems.
  </li>
  <li>2. <strong>Overlapping subproblems</strong>: a recursive solution contains a “small” number of distinct subproblems repeated many times.
  </li>
</ul>
<p>
  As the subproblems are overlapping, the lecture introduces concept of <strong>memoization</strong> algorithm (note that it’s not memo<strong>r</strong>ization). A better known word for memoization is caching. The subproblems are cached (memoized) so that they are not recomputed over and over again.
</p>
<p>
  The lecture ends with constructing a dynamic programming table for LCS problem and explains how to find a LCS from this table.
</p>
<p>
  You’re welcome to watch lecture fifteen:
</p>
<div>
  <embed src="http://video.google.com/googleplayer.swf?docid=5819552931286083215&amp;amp;hl=en&amp;amp;fs=true" style="width: 400px; height: 326px;" /><br />
  Direct URL: <a href="http://video.google.com/videoplay?docid=5819552931286083215">http://video.google.com/videoplay?docid=5819552931286083215</a>
</div>
<p>
  Topics covered in lecture fifteen:
</p>
<ul>
  <li>[00:20] Dynamic programming.
  </li>
  <li>[01:47] Longest common subsequence (LCS) problem.
  </li>
  <li>[03:55] Example of LCS on sequences “ABCBDAB” and “BDCABA”.
  </li>
  <li>[06:55] Brute force algorithm for LCS.
  </li>
  <li>[07:50] Analysis of brute force algorithm.
  </li>
  <li>[11:40] Simplification of LCS problem.
  </li>
  <li>[16:20] Theorem about LCS length.
  </li>
  <li>[18:25] Proof of the theorem.
  </li>
  <li>[30:40] Dynamic programming hallmark #1: Optimal substructure.
  </li>
  <li>[32:25] Example of hallmark #1 on LCS.
  </li>
  <li>[34:15] Recursive algorithm for longest common subseq.
  </li>
  <li>[36:40] Worst case analysis of the algorithm.
  </li>
  <li>[38:10] Recursion tree of algorithm.
  </li>
  <li>[42:40] Dynamic programming hallmark #2: Overlapping subproblems.
  </li>
  <li>[44:40] Example of hallmark #2 on LCS.
  </li>
  <li>[45:50] Memoization algorithm for LCS.
  </li>
  <li>[48:45] Time and space analysis of memoized algorithm.
  </li>
  <li>[54:30] Dynamic programming algorithm for LCS.
  </li>
  <li>[01:01:15] Analysis of dynamic programming algorithm.
  </li>
</ul>
<p>
  Lecture fifteen notes:
</p>
<div>
  
    
      
        <a href="http://www.catonmat.net/blog/wp-content/uploads/2008/11/mit-algorithms-lecture-15-01.jpg" title="MIT Algorithms Lecture 15 Notes Thumbnail. Page 1 of 2."><img src="http://www.catonmat.net/blog/wp-content/uploads/2008/11/mit-algorithms-lecture-15-01-thumb.jpg" alt="MIT Algorithms Lecture 15 Notes Thumbnail. Page 1 of 2." /></a><br />
        <small>Lecture 15, page 1 of 2.</small>
      
      
      
        <a href="http://www.catonmat.net/blog/wp-content/uploads/2008/11/mit-algorithms-lecture-15-02.jpg" title="MIT Algorithms Lecture 15 Notes Thumbnail. Page 2 of 2."><img src="http://www.catonmat.net/blog/wp-content/uploads/2008/11/mit-algorithms-lecture-15-02-thumb.jpg" alt="MIT Algorithms Lecture 15 Notes Thumbnail. Page 2 of 2." /></a><br />
        <small>Lecture 15, page 2 of 2.</small>
      
    
  
</div>
<p>
  Have fun with programming dynamically! The next post will be about graphs, greedy algorithms and minimum spanning trees.
</p>
<p>
  PS. This course is taught from the CLRS book (also called “Introduction to Algorithms”). Chapter 15 is called “Dynamic Programming” and covers the topics in this lecture. It also explains the assembly-line scheduling problem, matrix-chain multiplication problem, elements of dynamic programming and optimal binary search trees.
</p>
<div>
  <a href="http://feeds.feedburner.com/~f/catonmat?a=8QzjN"><img src="http://feeds.feedburner.com/~f/catonmat?i=8QzjN" /></a> <a href="http://feeds.feedburner.com/~f/catonmat?a=z9dan"><img src="http://feeds.feedburner.com/~f/catonmat?i=z9dan" /></a> <a href="http://feeds.feedburner.com/~f/catonmat?a=GKJmn"><img src="http://feeds.feedburner.com/~f/catonmat?i=GKJmn" /></a> <a href="http://feeds.feedburner.com/~f/catonmat?a=ufb0n"><img src="http://feeds.feedburner.com/~f/catonmat?i=ufb0n" /></a>
</div><img src="http://feeds.feedburner.com/~r/catonmat/~4/467915525" height="1" width="1" />
</div>]]>
      </description>
      <pubDate>jeu, 27 Nov 2008 16:45:42 +0100</pubDate>
      <guid isPermaLink="false">tag:ziki.com,2008:/article/8378810</guid>
    </item>
    <item>
      <title>Loi de Geek</title>
      <link>http://www.biologeek.com/2008/11/loi-de-geek/</link>
      <description>
        <![CDATA[<div class="post_content wiki_text"><blockquote>
  <p>
    Plus tu as de connaissances et d'expérience pour faire des trucs géniaux et moins tu as de temps pour les réaliser.
  </p>
</blockquote>
<p>
  Monde cruel.
</p>
<div style="font-size: small; padding: 0px 10px 0px 10px; border: 1px solid #bcb895; color: #333; background-color: #f4f4ed;">
  <p>
    <a href="http://www.biologeek.com/" title=""><img src="http://media.biologeek.com/css/images/logo.png" alt="Logo biologeek" style="float: left; margin-right: 5px; border: none;" /></a> <a href="http://www.biologeek.com/2008/11/loi-de-geek/"><strong>Loi de Geek</strong></a> a été rédigé par <a href="http://david.larlet.fr">David Larlet</a> pour <a href="http://www.biologeek.com">biologeek.com</a> et a été originellement posté le 26 Novembre 2008. À part exceptions, c'est ©2008 David Larlet et sous <a href="http://www.biologeek.com/contact/#licence" title="À lire avant toute (re)copie">licence (presque) libre</a> autorisant la reproduction, la distribution et la modification sous certaines conditions. Veuillez les respecter.
  </p>
</div>
</div>]]>
      </description>
      <pubDate>mer, 26 Nov 2008 15:10:27 +0100</pubDate>
      <guid isPermaLink="false">tag:ziki.com,2008:/article/8364227</guid>
    </item>
    <item>
      <title>Prize winners visualise Irish online life in the boards.ie SIOC Data Competition</title>
      <link>http://sioc-project.org/node/335</link>
      <description>
        <![CDATA[<div class="post_content wiki_text"><p>
  The winners of the <a href="http://sioc-project.org/">SIOC (pronounced "shock")</a> <a href="http://data.sioc-project.org/">data competition</a> being run by <a href="http://www.deri.ie/">DERI</a> at the <a href="http://www.nuigalway.ie/">National University of Ireland, Galway</a> have been announced. The competition ran from September to October 2008, and the brief was to produce an interesting creation based on a data set of discussion posts reflecting ten years of Irish online life from boards.ie, Ireland's largest community website.
</p>
<p>
  <a href="http://sioc-project.org/node/335">read more</a>
</p>
</div>]]>
      </description>
      <pubDate>mer, 26 Nov 2008 10:45:14 +0100</pubDate>
      <guid isPermaLink="false">tag:ziki.com,2008:/article/8374109</guid>
    </item>
    <item>
      <title>Mapping du d&#233;p&#244;t de modules Perl CPAN</title>
      <link>http://www.web-mining.fr/blog/[user]/mapping_du_d%C3%A9p%C3%B4t_de_modules_perl_cpan</link>
      <description>
        <![CDATA[<div class="post_content wiki_text"><p>
  Julian Bilcke, membre officieux de web-mining.fr et néanmoins très actif sur les projets <a href="http://gephi.org">Gephi</a> et <a href="http://www.web-mining.fr/codeminer">CodeMiner</a>, avait réalisé un travail expérimental au printemps dernier sur la cartographie du dépôt logiciel de la communauté Perl, appelé CPAN.
</p>
<p>
  L’objectif de ce projet consistait à mettre en place un système de visualisation des dépendances logicielles de CPAN, contenant environ 53 000 modules répartis dans plus de 14 000 packages, chaque module pouvant en utiliser plusieurs autres. Ce système permettait de voir les dépendances d'un module ou un package donné, c’est à dire les composants également issus de CPAN nécessaires à son fonctionnement.
</p>
<p>
  Voici une maquette :<br />
  <img src="http://uxmal.paradisia.net/wp-content/depgraph.png" /><br />
  Il s’agit du graphe des dépendances d’un package pris au hasard sur CPAN, App-Context. Il donne à voir tous les packages nécessaires à son installation automatique. L'affichage est basé sur des méta-données pour rendre le graphe utile à explorer, et permet ainsi de voir les résultats des tests officiels, le faisant un outil d’aide à la décision.
</p>
<p>
  Présentation :
</p>
<div style="width: 425px; text-align: left;">
  <a href="http://www.slideshare.net/flngr/sigl-cpan-graphe-des-dpendances-entre-modules-perl-presentation?type=powerpoint" title="SIGL CPAN : Graphe des dependances entre modules Perl" style="font: 14px Helvetica,Arial,Sans-serif; display: block; margin: 12px 0 3px 0; text-decoration: underline;">SIGL CPAN : Graphe des dependances entre modules Perl</a>
  <div style="font-size: 11px; font-family: tahoma,arial; height: 26px; padding-top: 2px;">
    View SlideShare <a href="http://www.slideshare.net/flngr/sigl-cpan-graphe-des-dpendances-entre-modules-perl-presentation?type=powerpoint" title="View SIGL CPAN : Graphe des dependances entre modules Perl on SlideShare" style="text-decoration: underline;">presentation</a> or <a href="http://www.slideshare.net/upload?type=powerpoint" style="text-decoration: underline;">Upload</a> your own. (tags: <a href="http://slideshare.net/tag/datamining" style="text-decoration: underline;">datamining</a> <a href="http://slideshare.net/tag/graphe" style="text-decoration: underline;">graphe</a>)
  </div>
</div>
<p>
  <img src="http://counters.gigya.com/wildfire/IMP/CXNID=2000002.0NXC/bT*xJmx*PTEyMjc1Mzc3MjQzMDEmcHQ9MTIyNzUzNzcyODc3NSZwPTEwMTkxJmQ9Jmc9MiZ*PSZvPTkwNjVlMzFjNmUxYzQ*YTQ4NzU5MDlkZTdhNWYwNTIz.gif" height="0" style="width: 0px; height: 0px;" width="0" />
</p>
<p>
  Page du projet : <a href="http://uxmal.paradisia.net/sigl-cpan/" title="http://uxmal.paradisia.net/sigl-cpan/">http://uxmal.paradisia.net/sigl-cpan/</a><br />
  Billet de blog attenant : <a href="http://uxmal.paradisia.net/2008/04/27/dependances-logicielles-entre-packages-perl/" title="http://uxmal.paradisia.net/2008/04/27/dependances-logicielles-entre-packages-perl/">http://uxmal.paradisia.net/2008/04/27/dependances-logicielles-entre-pack...</a><br />
  Présentation : <a href="http://www.slideshare.net/flngr/sigl-cpan-graphe-des-dpendances-entre-modules-perl-presentation/">Voir le ppt sur slideshare</a><br />
  Rapport : <a href="http://dl.getdropbox.com/u/122451/projects/sigl/2008%20-%20Rapport%20SIGL%20CPAN%20-%20Julian%20Bilcke.pdf">Télécharger</a><br />
  Captures d’écran : <a href="http://www.getdropbox.com/gallery/122451/2/projets/sigl?h=69d9d7">galerie d’images</a>
</p>
<p>
  Et pour finir, quelques captures d'écran du système, d'abord la visualisation par modules :
</p>
<p>
  <img src="http://photos-2.getdropbox.com/i/l/L8StM1OVv5NYztTy7TwkqbdPWCmg7aZ7qvec0ONUTUc#14" /><br />
  Un graphe de dépendances, les boules rouges représentent les modules.
</p>
<p>
  <img src="http://photos-3.getdropbox.com/i/l/DBpO3AKhGnR3p9C2j0zvbr31RdK9FEd9mg6Hpeb-BHs#15" /><br />
  Un graphe de dépendances en cours de visualisation sous <a href="http://gephi.org">Gephi</a>.
</p>
<p>
  <img src="http://photos-3.getdropbox.com/i/l/Hoa8_Lnl7ui1Ocaop_b_VDg3VXGDmehndnrhzmuRdes#3" /><br />
  Page d'interrogation en ligne avec applet Gephi intégré.
</p>
<p>
  Et la vue sur le dépôt entier :
</p>
<p>
  <img src="http://photos-3.getdropbox.com/i/l/5Rvm7ARanM_G285vBnrAyoAezu3ew22XmzTMYWVHeuU#11" /><br />
  En cours de spatialisation sous Gephi.
</p>
<p>
  <img src="http://photos-4.getdropbox.com/i/l/G1y20ZcF2L_LE2yOeonYSS-jzLf9HGcq46eN0BcYmzs#8" /><br />
  Après un premier "éclatement" du graphe où l'on distingue un coeur, des composantes non connexes et des éléments isolés formant des "anneaux" en périphérie.
</p>
<p>
  <img src="http://photos-1.getdropbox.com/i/l/8szQbnKW7hq_LzdX8bcj37sDAhy39DtXkYM2NsCmY6U#13" /><br />
  Le plugin Gephi permettant d'explorer le graphe en recherchant des modules et en ajustant la profondeur des dépendances à afficher.
</p>
<p>
  Le projet est actuellement arrêté mais j'espère vivement que Julian trouvera le temps ou quelqu'un d'autre pour le poursuivre !
</p>
</div>]]>
      </description>
      <pubDate>lun, 24 Nov 2008 16:10:38 +0100</pubDate>
      <guid isPermaLink="false">tag:ziki.com,2008:/article/8342890</guid>
    </item>
    <item>
      <title>My Job Interview at Google</title>
      <link>http://feeds.feedburner.com/%7Er/catonmat/%7E3/463820420/</link>
      <description>
        <![CDATA[<div class="post_content wiki_text"><p>
  <img src="http://www.catonmat.net/blog/wp-content/uploads/2008/11/interview-at-google.jpg" alt="My Job Interview at Google" align="left" />A little more than two weeks ago I had an on-site interview at Google in Mountain View, California! The job interview with Google was an interesting experience and I want to tell you about it. (I got the green light from Google to publish this article).
</p>
<p>
  The position I was interviewing for was a Google SRE. SRE stands for Site Reliability Engineering. Site reliability engineers (SREs) are both software engineers and systems administrators, responsible for Google’s production services from end-to-end.
</p>
<p>
  There were eight separate interviews total. The first three were over the phone (phone interviews) and the remaining five were on-site. The first interview was with the recruiter and was not very technical but the other seven were very technical.
</p>
<p>
  All interviews went very well but I just got to know that I did not get hired! Oh well… I personally think that I did really well. I answered all the questions but it seems they were not satisfied! The recruiter told me that I did not have enough experience to work in a mission critical team and that I should get more experience and try again.
</p>
<p>
  Here is how it all happened.
</p>
<p>
  Shortly after I published the “<a href="http://www.catonmat.net/blog/code-reuse-in-google-chrome-browser/">Code Reuse in Google Chrome</a>” post I was contacted by a recruiter at Google. The email said:
</p>
<blockquote>
  <p>
    I recruit top notch Software Engineering talent at Google. I recently came across your name as a possible world class Engineer and am intrigued to know more about you. I promise to exchange some detailed info about us as well.
  </p>
  <p>
    Interested to hear more? Want to be an impact player at Google? Then please respond with a current (English) copy of your resume and I’ll be happy to call you and discuss.
  </p>
</blockquote>
<p>
  At first I thought I would be applying for a software developer position, but after we went through my skillset, the recruiter concluded that I would better fit as an SRE. I agreed with him. This seemed like a perfect position for me. I love systems administration as much as I love programming.
</p>
<h2 style="margin-bottom: 10px;">
  First Interview (phone)
</h2>
<p>
  The first interview was on the 10th of September with the recruiter. He explained the Google recruitment process to me and we went through my skill set. I had to rank myself from 0 - 10 in a bunch of areas such as C programming, C++ programming, Python programming, networking, algorithms and data structures, distributed systems, Linux systems administration, and others.
</p>
<p>
  As I said, based on my answers we concluded that SRE was the best position for me. An SRE basically has to know everything: algorithms, data structures, programming, networking, distributed systems, scalable architecture, troubleshooting. It’s a great hacker position!
</p>
<p>
  After these questions he asked me where I would like to work - Google office in Ireland, Zurich, Mountain View or Australia. I said Mountain View as it’s the Googleplex! He explained that if the interviews went OK, I’d have to get an H-1B visa that allows non-US citizens to work in the US.
</p>
<p>
  The second half of the interview had some basic technical questions, just to make sure I knew something. The questions were about Linux systems administration, algorithms, computer architecture and C programming. <strong><span style="color: red;">I can’t go into any details because I signed a non-disclosure agreement and my recruiter kindly asked me not to post the questions!</span></strong>
</p>
<p>
  I made some factual mistakes but he was satisfied and we scheduled the next phone interview. He warned me that it will be very technical and I should do really good preps. I asked him to give me a plenty of time for the preparation and we scheduled the next interview on 22nd of September.
</p>
<p>
  He also told me that each phone interview is going to be 45 minutes to 1 hour long.
</p>
<p>
  I started preparing like crazy. I found three presentations on what SRE is all about:
</p>
<ul>
  <li>
    <a href="http://www.catonmat.net/blog/wp-content/uploads/2008/11/linuxworld-07-describesre.pdf" title="Engineering Reliability into Web Sites: Google SRE">Engineering Reliability into Web Sites: Google SRE</a>
  </li>
  <li>
    <a href="http://www.catonmat.net/blog/wp-content/uploads/2008/11/thatcouldnthappentous.pdf" title="Google SRE: That Couldn’t Happen to US… Could It?">Google SRE: That Couldn’t Happen to US… Could It?</a>
  </li>
  <li>
    <a href="http://www.catonmat.net/blog/wp-content/uploads/2008/11/pollmann_google_lightning_talk.ppt" title="Google SRE: Chasing Uptime">Google SRE: Chasing Uptime</a>
  </li>
</ul>
<p>
  Then I found all the other blog posts about interviews and interview questions at Google:
</p>
<ul>
  <li>
    <a href="http://ifdefined.com/blog/post/2008/03/Google-interview.aspx">Corey Trager’s Google Interview</a>
  </li>
  <li>
    <a href="http://www.nomachetejuggling.com/2006/12/30/my-interview-with-google/">Rod Hilton’s Google Interview</a>
  </li>
  <li>
    <a href="http://www.philosophicalgeek.com/2007/08/12/my-interview-experience-with-google/">Ben Watson’s Google Interview</a>
  </li>
  <li>
    <a href="http://www.lifereboot.com/2008/my-interview-at-google/">Shaun Boyd’s Google Interview</a>
  </li>
  <li>
    <a href="http://www.alleyinsider.com/2008/3/how_i_blew_my_interview_with_google">How I Blew My Google Interview by Henry Blodget</a>
  </li>
  <li>
    <a href="http://steve-yegge.blogspot.com/2008/03/get-that-job-at-google.html">Get That Job at Google by Steve Yegge</a>
  </li>
  <li>
    <a href="http://www.theregister.co.uk/2007/01/05/google_interview_tales/">Tales from the Google’s interview room</a>
  </li>
  <li>
    <a href="http://www.drizzle.com/~jpaint/google.html">Google Interview Questions</a>
  </li>
  <li>
    <a href="http://jhorna.wordpress.com/2007/09/08/google-interview-questions-fun-brain-teasers/">Google Interview Questions — Fun Brain Teasers!</a>
  </li>
  <li>And some others…
  </li>
</ul>
<p>
  I printed and read four Google research papers:
</p>
<ul>
  <li>
    <a href="http://research.google.com/archive/gfs.html">The Google File System</a>
  </li>
  <li>
    <a href="http://research.google.com/archive/bigtable.html">Bigtable: A Distributed Storage System for Structured Data</a>
  </li>
  <li>
    <a href="http://research.google.com/archive/mapreduce.html">MapReduce: Simplified Data Processing on Large Clusters</a>
  </li>
  <li>and just for fun <a href="http://research.google.com/archive/disk_failures.html">Failure Trends in a Large Disk Drive Population</a>
  </li>
</ul>
<p>
  I also went through several books:
</p>
<ul>
  <li>the best book on basics of networking “<a href="http://www.amazon.com/exec/obidos/ISBN=0201633469/freesciencand-20">TCP/IP Illustrated</a>“
  </li>
  <li>the best book on algorithms “<a href="http://www.amazon.com/dp/0262032937/freesciencand-20">MIT’s Introduction to Algorithms</a>” + <a href="http://www.catonmat.net/blog/mit-introduction-to-algorithms-part-one/">my notes on algorithms</a>
  </li>
  <li>a book on scalability “<a href="http://www.amazon.com/dp/0596102356/freesciencand-20">Building Scalable Web Sites</a>“
  </li>
</ul>
<p>
  As I did not know if I might get specific programming language questions, I went through a few tens of receipts in <a href="http://www.amazon.com/Cookbook-Cookbooks-OReilly-Ryan-Stephens/dp/0596007612/freesciencand-20">C++ Cookbook</a>, <a href="http://www.amazon.com/Python-Cookbook-Alex-Martelli/dp/0596007973/freesciencand-20">Python Cookbook</a>, and <a href="http://www.amazon.com/Perl-Cookbook-Second-Tom-Christiansen/dp/0596003137/freesciencand-20">Perl Cookbook</a>.
</p>
<h2 style="margin-bottom: 10px;">
  Second Interview (phone)
</h2>
<p>
  The second phone interview was with an engineer from Google. He worked on the Ads team which is responsible for running AdSense, AdWords and other advertisement stuff.
</p>
<p>
  The interview was very technical and started with an algorithmic problem which was too large to fit in computer memory. I had to tell him precisely how I would get around this problem and what data structures and algorithms I would use. He also asked me to think out loudly. The interview continued with questions about data structures, DNS, TCP protocol, a security vulnerability associated with TCP, networking in general, and Google itself. Sorry, but I can’t disclose anything in more details.
</p>
<p>
  After the interview the engineer had to write feedback on me. It was positive and I could move on with the interviews.
</p>
<h2 style="margin-bottom: 10px;">
  Third Interview (phone)
</h2>
<p>
  I gave myself more time to prepare and the third interview was on the 1st of October. It was with an engineer from the Google traffic team.
</p>
<p>
  In this interview I had a very simple programming question and I had to do coding over phone. I was free to choose the language and I chose Perl as it is my most favorite programming language. It was impossible to dictate Perl syntax over phone “for my dollar sign element open paren at data close paren open curly brace … close curly brace” so I submitted my Perl program over the email.
</p>
<p>
  Then the same problem was taken to the next level, what if the data we are working on is gigabytes in size, terabytes in size. How would my program/solution change?
</p>
<p>
  Finally I had a question about DNS again, then HTTP protocol, routing, and TCP data transfer.
</p>
<p>
  The feedback was positive and I could prepare for the on-site interviews. In my conversation with my recruiter I got to know that there will be five on-site interviews, each exactly 45 minutes long. One on my previous work experience, one on algorithms and data structures, one on troubleshooting and networking, and two on software development with focus on C and C++.
</p>
<p>
  My recruiter suggested that I read a few more documents:
</p>
<ul>
  <li>
    <a href="http://google-styleguide.googlecode.com/svn/trunk/cppguide.xml">Google C++ Style Guide</a>
  </li>
  <li>
    <a href="http://research.google.com/archive/googlecluster.html">Web Search for a Planet: The Google Cluster Architecture</a>
  </li>
  <li>
    <a href="http://www.topcoder.com/tc?module=Static&amp;amp;d1=tutorials&amp;amp;d2=alg_index">Algorithm Tutorials on TopCoder</a>
  </li>
</ul>
<p>
  I flew out to USA on 24th of October at 1pm from Latvia and arrived in California at 8pm. The flight was actually 14 hours but it was nice that I flew in the same direction as the time flows. This saved me 7 hours. The on-site interview was scheduled on 27th of October so I had a good rest before the interview. It was also nice that Google paid for my trip, hotel, cab and food. I had zero expenses!
</p>
<h2 style="margin-bottom: 10px;">
  Fourth Interview (on-site)
</h2>
<p>
  The fourth interview was finally at Googleplex! At 10am I met my recruiter and we had a 15 minute discussion about the interviews. He told me I would have two interviews now, then one of Google engineers would take me to lunch to one of Google’s restaurants and then I would have three other interviews.
</p>
<p>
  At 10:15am the first on-site interview began. It was about my previous job experience. I have had a lot of job experience in the past and I decided to tell about a physical security notification system that I coded in C on Linux a few years ago. The system would receive messages through the serial port and send out emails and SMS’es.
</p>
<p>
  In the last minutes of the interview he asked me some basic Unix filesystem questions.
</p>
<p>
  In all the on-site interviews I was writing and drawing on two big whiteboards. Fun!
</p>
<h2 style="margin-bottom: 10px;">
  Fifth Interview (on-site)
</h2>
<p>
  The fifth interview began at 11am. It was a coding session and began with a trick question and not a real coding problem. I was asked to implement the solution in C. The solution was a mathematical expression that was a one-line return statement. No big coding there. Then I was asked to write an implementation of a very well known data structure. While coding I made a mistake and forgot to initialize part of a data structure that I had malloc()’ed! The program would have segfault’ed in real life and I would have noticed the error, but Google engineers are very serious about it! If you have an interview don’t ever make any mistakes!
</p>
<p>
  After this interview I was taken to lunch by the engineer who interviewed me on the second (phone) interview. She told me she was working at Google for two years and was very happy about it. We went to Asian food restaurant (located in Googleplex) and I had all kinds of delicious foods. All free!
</p>
<p>
  Then she showed me around Googleplex. It was all amazing. Free drinks and candy everywhere, some arcade machines, a beach volleyball outside, and many other surprising things.
</p>
<h2 style="margin-bottom: 10px;">
  Sixth Interview (on-site)
</h2>
<p>
  The sixth interview began at 12:45pm. It was a troubleshooting and networking interview. The interviewer drew a network diagram on the whiteboard and had imagined a problem in there. I had to ask a bunch of specific networking questions to locate the problem. He was satisfied and in the last few minutes of the interview he asked me some specific networking device questions.
</p>
<h2 style="margin-bottom: 10px;">
  Seventh Interview (on-site)
</h2>
<p>
  The seventh interview began at 1:30pm. It was a coding session. I was asked to implement a simple string manipulation subroutine in either C or C++. I chose C. Unfortunately I made an off-by-one mistake there - the most common programming mistake in the history of mankind. The whole interview focused on this one problem.
</p>
<h2 style="margin-bottom: 10px;">
  Eighth Interview (on-site)
</h2>
<p>
  The last, eight, interview began at 2:15pm. It was algorithms and data structures interview. The problem presented here was similar to the problem in the 2nd interview. Not only was it a problem too large to fit in computer memory but it also was distributed. So I had to do all kinds of trickery to solve it. The interview was very free-style and we talked back and forth about the problem. I arrived at the correct solution near the end of the interview and he said that not many candidates get that far in the solution. I was happy.
</p>
<p>
  After the interview the engineer escorted me out to the lobby and I took a cab back to my hotel. That’s it! <img src="http://www.catonmat.net/blog/wp-includes/images/smilies/icon_smile.gif" alt=":)" />
</p>
<h2 style="margin-bottom: 10px;">
  FIN
</h2>
<p>
  Overall the Google interviews were pure fun for me. The interview questions were technical but not very challenging or difficult.
</p>
<p>
  Thanks for the opportunity Google! <img src="http://www.catonmat.net/blog/wp-includes/images/smilies/icon_smile.gif" alt=":)" />
</p>
<div>
  <a href="http://feeds.feedburner.com/~f/catonmat?a=qXsfN"><img src="http://feeds.feedburner.com/~f/catonmat?i=qXsfN" /></a> <a href="http://feeds.feedburner.com/~f/catonmat?a=OzeTn"><img src="http://feeds.feedburner.com/~f/catonmat?i=OzeTn" /></a> <a href="http://feeds.feedburner.com/~f/catonmat?a=NIyvn"><img src="http://feeds.feedburner.com/~f/catonmat?i=NIyvn" /></a> <a href="http://feeds.feedburner.com/~f/catonmat?a=rPhkn"><img src="http://feeds.feedburner.com/~f/catonmat?i=rPhkn" /></a>
</div><img src="http://feeds.feedburner.com/~r/catonmat/~4/463820420" height="1" width="1" />
</div>]]>
      </description>
      <pubDate>lun, 24 Nov 2008 05:20:36 +0100</pubDate>
      <guid isPermaLink="false">tag:ziki.com,2008:/article/8342891</guid>
    </item>
    <item>
      <title>La crise financi&#232;re et les startups</title>
      <link>http://www.oezratty.net/wordpress/2008/la-crise-financire-et-les-startups/</link>
      <description>
        <![CDATA[<div class="post_content wiki_text"><p>
  J’ai eu l’occasion d’animer cette semaine un débat intéressant sur le web 2.0 et la Silicon Valley, le “SF Valley”. Il s’agissait d’une visioconférence avec d’un côté environ 200 personnes dans l’amphithéâtre des Jardins de l’Innovation de France Télécom à Issy les Moulineaux, et de l’autre, une demi douzaine d’entrepreneurs sis dans l’Orange Lab de San Francisco, animés par <a href="http://blogs.lesechos.fr/auteur.php?id_auteur=1141">Laetitia Mailhes</a>, correspondante permanente des Echos aux USA. La <a href="http://silicon-valley.blogs.centraliens-marseille.fr/">conférence</a> était organisée sous l’égide du G9+ (qui rassemble les groupements informatiques des associations d’anciens élèves de grandes écoles d’ingénieur et de commerce) et pilotée par des anciens de Centrale Marseille.
</p>
<p>
  Les intervenants côté US étaient Daniel Laury (de <a href="http://www.lsfinteractive.com/index.php">LSF Interactive</a>, une agence web, également <a href="http://www.lsfinteractive.fr/">active en France</a>), Béatrice Tarka (de <a href="http://www.mobissimo.com">Mobissimo</a>, un site web de voyage), Renaud Laplanche (de <a href="http://www.lendingclub.com">Lending Club</a>, un site de prêt en peer to peer), Marc Dangeard (d’<a href="http://www.entrepreneurcommons.org">Entrepreneur Commons</a>, une association qui propose des prêts aux entrepreneurs) et JD Bergeron (de <a href="http://www.kiva.org/">Kiva</a>, une ONG de microcrédit pour les pays émergents). Nous avions sinon <strong>Thierry Bonhomme</strong>, Directeur de la R&amp;D de FT ainsi que <strong>Georges Nahon</strong>, patron des <a href="http://www.orange-innovation.tv/webtv/mode/detail/307/orange-labs-san-francisco/">Orange Labs de San Francisco</a>.
</p>
<p>
  On devait parler web 2.0. Mais la thématique de cette conférence de plus de deux heures a nettement penché sur l’impact de la crise financière dans le monde des startups. Et de comparer la résilience des nos économies respectives face à cette crise.
</p>
<p>
  L’occasion m’en est donc donnée de faire ici le tour de la question en comparant l’impact de cette crise entre la Silicon Valley et la France. Et en mélangeant ce que j’ai pu entendre jeudi dernier et aussi via pas mal d’autres sources.
</p>
<p>
  <strong>Le financement des startups</strong>
</p>
<p>
  Est-ce que la crise du crédit impacte le financement des startups ? Certainement, mais pas de la même manière aux USA et en France.
</p>
<p>
  Les montants investis par les VCs aux USA se sont <a href="http://cf.us.biz.yahoo.com/prnews/081018/ph39997.html?.v=1">ralentis sur le troisième trimestre</a> ($7,4B sur 583 deals, une décroissance de 7,2% par rapport à 2007 sur 673 deals. Et on s’attend à un très mauvais Q4. La tendance des VCs est de financer des seconds et troisièmes tours de sociétés qui ont fait leurs preuves et beaucoup moins d’amorçage. C’est ainsi que les VCs utilisent les fonds qu’ils ont levés en 2007. Ils s’orientent aussi nettement sur des secteurs porteurs comme les greentechs, où la Silicon Valley est très active. La crise du financement a en tout cas refroidi les VCs qui finançaient encore beaucoup trop de startups web 2.0 fonctionnant sur un modèle publicitaire. Les VCs privilégient maintenant les modèles économiques capables de générer du revenu rapidement. La crise va sérieusement assainir le marché !
</p>
<p>
  En France, nous n’avons pas encore de données sur Q3 2008. La loi TEPA a quelque peu gonflé le financement de FCPI, un véhicule privilégié pour de nombreux VCs. Ce qui donne un peu de mou aux VCs pour investir pendant 2008 et 2009. Mais Q3 et Q4 2008 ne devraient pas être bien brillants. On attend donc <a href="http://www.chaussonfinance.com/indicateur/indicateur.htm">l’indicateur de Chausson Finance</a> sur fin 2008 !
</p>
<p>
  Autre impact : les valorisations des sociétés baissent avant les tours de financement. Les entrepreneurs peuvent s’attendre à des négociations difficiles sur ce point avec autant les VCs que les business angels. Bien entendu, il est bon d’avoir une valorisation qui limite la dilution à chaque tour de financement. Mais elle doit être justifiée par la création de valeur de la société, une combinaison de la valeur de l’équipe, du produit et des clients déjà captés. S’il y a bien une bulle web 2.0 qui se dégonflera, c’est sur les valos ! Evidemment, il y aura aussi moins de sorties (acquisitions et introductions en bourse) pendant quelques temps. Ce qui posera des problèmes pour cloturer les fonds des VCs.
</p>
<p>
  Béatrice Tarka de Mobissimo signalait un autre phénomène dans le débat SF Valley : l’insécurité du cash levé par les startups. Placé dans le système bancaire, il est fragilisé car les banques peuvent faire faillite et leurs garanties sont faibles (&lt;$250K). Il leur faut donc envisager un investissement “sûr”, par exemple en bons du trésor, les pays occidentaux en émettant des wagons en ce moment. Jusqu’au jour où ces pays subiront eux-aussi une crise de type Argentine !
</p>
<p>
  La crise favorise sinon le développement de solutions alternatives de financement. Le prêt mutualisé est la formule proposée par <a href="http://www.lendingclub.com">Lending Club</a> et <a href="http://www.entrepreneurcommons.org">Entrepreneur Commons</a>, deux solutions présentées pendant le débat “SF Valley”. Mais en masse, cela semble bien marginal au regard des $30B que les VCs investissaient en 2007 et à peu près autant provenant des business angels. Aux USA, ces derniers sont en train de baisser la voilure où à chercher des rendements à court terme, incompatibles avec le risque du financement des startups qui ressemble plutôt à un jeu de casino… sur le Titanic.
</p>
<p>
  Qu’avons-nous du côté de la France ?
</p>
<ul>
  <li>La loi TEPA et l’exonération d’ISF de 75% pour les investissements dans les PME innovantes va continuer à drainer un bon volant de business angels. Une bien rare exception qui fera de l’ISF un atout pour la France ! Le rôle des associations de business angels et des SIBA (sociétés d’investissement de business angels) va être critique pour réguler ce flot de financement assez “amateur” par les temps qui courent.
  </li>
  <li>Les financements publics, même s’ils s’assèchent rapidement, constituent une autre spécificité française qui soutient bien les startups en phase d’amorçage. Mais on entend dire qu’Oséo va réduire ses aides en phase d’amorçage et favoriser les aides au développement des gazelles, une priorité gouvernementale.
  </li>
  <li>On voit apparaitre quelques sites de désintermédiation entre investisseurs individuels (business angels) et entrepreneurs comme <a href="http://www.investigo.fr/">Investigo</a> et <a href="http://faisonsaffaire.com">FaisonsAffaires</a>. Ils se rémunèrent au pourcentage des montants levés (environ 5%) mais le modèle n’est pas très scalable. Et puis, il est concurrencé par le <a href="http://www.capital-pme.oseo.fr/">site d’Oséo</a> qui rapproche les investisseurs des PME innovantes (respectivement 3590 et 2297, tous secteurs confondus). Mais il est difficile d’y trouver les startups du numérique, catégorie qui n’existe pas dans leurs critères de sélection ! Toutes ces désintermédiations vont mettre de l’huile dans les rouages, sauf qu’il risque de ne plus y avoir beaucoup d’engrenages !
  </li>
</ul>
<p>
  <a href="http://www.oezratty.net/wordpress/wp-content/osocapitalpme.jpg"><img title="Oséo Capital PME" src="http://www.oezratty.net/wordpress/wp-content/osocapitalpme-thumb.jpg" height="315" alt="Oséo Capital PME" style="border-right: 0px; border-top: 0px; display: inline; border-left: 0px; border-bottom: 0px;" width="395" /></a>
</p>
<ul>
  <li>Enfin, il y a l’appel aux dons, une méthode originale quoiqu’un peu déplacée. Elle est utilisée par exemple par <a href="http://dailybuzz.mobuzz.tv/">Mobuzz.TV</a>, une web TV spécialiste… du buzz ! Ils cherchent tout de même 150K€ par ce biais ! Pourquoi ? Levée de fonds difficile. Pourquoi ? Il suffit de voir le site et son modèle publicitaire…
  </li>
</ul>
<p>
  Bref, en France, nous aurons un peu plus d’air sur le financement d’amorçage qu’aux USA. Mais cela n’améliorera pas pour autant les chances de réussite des startups.
</p>
<p>
  <strong>La gestion des coûts</strong>
</p>
<p>
  Réduire au maximum les coûts est le mot d’ordre. Les startups doivent durer avec les fonds qu’elles ont levé et réduire au maximum la voilure, surtout si elles ne génèrent pas encore de revenu.
</p>
<p>
  D’où un gel des embauches voire des licenciements préventifs. Un phénomène qui a affecté aussi bien de grandes entreprises comme HP, Dell, Amdocs, Xerox et Yahoo que des sociétés du&nbsp; web 2.0 comme Pandora, Technorati, Seesmic, Twitter, Hi5, Adbrite, Zivity, Mahalo (qui a maintenant du cash pour tenir sans revenus jusqu’à 2012 et avec 30 personnes après en avoir viré 10%…). Ce qui n’a pas empêché LinkedIn de lever $26m en octobre portant le total à $100m. Mais qui licencie tout de même ! Ces licenciements sont suivis par TechCrunch qui a créé un <a href="http://www.techcrunch.com/layoffs/">Layoffs Tracker</a> et en a totalisé 78751 à ce jour dans la high-tech et particulièrement dans la Silicon Valley ! Ce qui a augmenté le chômage dans la Silicon Valley à 6,6%.
</p>
<p>
  <a href="http://www.oezratty.net/wordpress/wp-content/techcrunchlayofftracker.jpg"><img title="TechCrunch Layoff Tracker" src="http://www.oezratty.net/wordpress/wp-content/techcrunchlayofftracker-thumb.jpg" height="348" alt="TechCrunch Layoff Tracker" style="border-right: 0px; border-top: 0px; display: inline; border-left: 0px; border-bottom: 0px;" width="368" /></a>
</p>
<p>
  Mais où vont tous ces chômeurs dans la mesure où les grandes boites de la high-tech gèlent aussi plus ou moins leurs recrutements ? On pouvait apprendre dans le débat SF Valley que l’écosystème de la Silicon Valley bénéficie d’une grosse variable d’ajustement : les nombreux étrangers qui travaillent dans la SV avec un visa de travail H1B1. Plus de boulot, plus de visa, et ils doivent retourner dans leur pays. Ou devenir clandestins. Un ajustement qui fonctionne peut-être dans la Silicon Valley mais ne sera pas opérant à Détroit avec les difficultés de General Motors.
</p>
<p>
  La grande flexibilité du travail aux USA créé cette fluidité qui simplifie la vie des entreprises lorsqu’il faut s’adapter et dégraisser. Les intervenants de SF Valley indiquaient que cela permettait de trouver des talents de qualité alors que c’était très difficile. Mais qui peut encore embaucher ? Peut-être quelques rares startups profitables ou les grandes entreprises qui ne licencient pas et gèrent leur turn-over.
</p>
<p>
  <strong>Les modèles économiques</strong>
</p>
<p>
  Quel est l’impact de la crise sur les modèles économiques des startups ?
</p>
<p>
  Les modèles <strong>purement publicitaires</strong> (au CPM ou CPC) seront très affectés car ils ne permettent pas d’être rentables à moins d’avoir un trafic énorme, et encore. Daniel Laury de LSF Interactive confirmait cette tendance : les modèles attendus par les clients sont de plus en plus basés sur la performance : le CPA/CPL (coût à l’action, au lead). Ils déplacent le risque des annonceurs vers les sites et les régies publicitaires et rendent prédictibles les investissements publicitaires : un $ de pub génère x $ de revenu incrémental. Encore faut-il que la construction du site soit adaptée à ce besoin.
</p>
<p>
  Le modèle « <em>on créé de l’audience et on verra plus tard pour le modèle de revenu</em> » va à mon sens battre de l’aile. C’en est presque devenu un mythe lié au cas de Google qui fait rêver. Mais Google est un cas particulier qui n’est pas facilement réplicable. Google a créé le modèle de revenu structurellement le meilleur du web : le search (qui permet de la publicité très contextuelle) et le volume (un outil pour tous utilisé tout le temps). La plupart des sites web 2.0 ne créent pas cette combinaison de contextualité et de volume. Seuls quelques réseaux sociaux gagnent leur vie car ils ont une forte part de contenu dans leur mix (MySpace, Skyblog). Une startup qui prévoit de se financer par la publicité devra avoir une stratégie très affinée de monétisation et la faire correspondre aux méthodes du marché (régies pubs, comportement des annonceurs, modes de segmentation dans les pratiques marketing des boites btob). Le business plan de la startup qui indique “financement par la pub” sans autre précision risque d’être poubellisé rapidement ! Même dans les instances de financement issues du secteur public.
</p>
<p>
  Les modèles de <strong>commerce électronique</strong> sont plus sains mais peuvent aussi être affectés par la baisse de la consommation des ménages et des entreprises. Les modèles qui fonctionneront le mieux devront être en phase avec l’évolution des modes de consommation : prix plus bas, etc.
</p>
<p>
  Seront donc (encore plus) favorisée par les investisseurs les entreprises qui :
</p>
<ul>
  <li>Proposent une « business value » claire et percutante, permettant par exemple aux entreprises de réaliser des économies substantielles. Avec un chiffrage précis de l’équation économique et sa relation avec le temps.
  </li>
  <li>Dont les modèles génèrent du revenu au gré de l’augmentation du volume, et pas après par effet de seuil. Par exemple dans la mobilité si le revenu peut être partagé avec les telcos.
  </li>
  <li>Qui ont déjà un produit et des clients et une évolution déjà bien lancée de leur CA.
  </li>
  <li>Ont éventuellement un bon portefeuille de propriété intellectuelle (potentiel ou existant) et monétisable assez rapidement.
  </li>
</ul>
<p>
  C’est en tout cas la fin du financement des me-toos comme les innombrables réseaux sociaux voire de social shopping. Une fin qui avait déjà démarré avant septembre. La crise n’annonce pas la fin des grands principes du web 2.0 et notamment de l’UGC (User Generated Content). Mais ceux qui vont en profiter seront les plus gros acteurs, ou bien les activités « non-profit » (blogs, associations, ONG, éduc, etc).
</p>
<p>
  Chose surprenante, la crise n’empêche aucunement les entrepreneurs de manifester une créativité débridée. J’ai récemment découvert un blog US, <a href="http://www.killerstartups.com/">KillerStartups</a>, qui décrit cinq nouvelles startups par jour. C’est à la fois varié et on y trouve un véritable bêtisier des startups “features companies” et sans modèle économique.
</p>
<p>
  <a href="http://www.oezratty.net/wordpress/wp-content/killerstartups.jpg"><img title="KillerStartups" src="http://www.oezratty.net/wordpress/wp-content/killerstartups-thumb.jpg" height="250" alt="KillerStartups" style="border-right: 0px; border-top: 0px; display: inline; border-left: 0px; border-bottom: 0px;" width="397" /></a>
</p>
<p>
  Plus de la moitié des startups survivent après quatre ans d’existence dans la Silicon Valley. Au vu de ce catalogue, c’est franchement surprenant !
</p>
<p>
  <strong>Les marchés</strong>
</p>
<p>
  La crise impacte les clients des startups et de différentes manières :
</p>
<ul>
  <li>Les cycles de vente s’allongent. La prise de risques s’amenuise. Les startups vont en souffrir et particulièrement en France qui ne brille pas par la culture du risque.
  </li>
  <li>Les budgets marketing sont souvent des variables d’ajustement. Depuis le début de 2008, les budgets publicitaire online étaient les seuls à augmenter alors que le offline baissait partout. Mais sur la fin 2008, il semblerait que même les budgets online soient en diminution aux USA. Et donc ailleurs.
  </li>
  <li>Des sponsors se désengagent d’opérations. Un diner-débat d’une association professionnelle auquel je devais participer en octobre a été annulé pour cette raison !
  </li>
  <li>Les cadres des grandes entreprises sont encore plus prudents, protègent leur place, et le stress au travail augmente en conséquence.
  </li>
  <li>Le poids de l’état est tel que la commande publique pourrait avoir un rôle clé chez certaines startups, notamment dans les organisations telles que la Mairie de Paris qui souhaitent promouvoir l’innovation.
  </li>
</ul>
<p>
  Quelques business sont porteurs dans cette phase de récession : la vente de coffres forts, les matières premières (quoique sujettes à de fortes variations comme le pétrole), la grande distribution (Wallmart est l’une des rares valorisations boursières à avoir augmenté depuis le début de l’année, cf ci-dessous, le <a href="http://www.smartmoney.com/map-of-the-market/">Mondrian de SmartMoney</a>), les écrans plats (vs les vacances), les logiciels libres, la prévention dans la santé, les services de base, les anxiolytiques et les ventes de produits sucrés (qui ont un effet antidépresseur).
</p>
<p>
  <a href="http://www.oezratty.net/wordpress/wp-content/marketmap.jpg"><img title="MarketMap" src="http://www.oezratty.net/wordpress/wp-content/marketmap-thumb.jpg" height="256" alt="MarketMap" style="border-right: 0px; border-top: 0px; display: inline; border-left: 0px; border-bottom: 0px;" width="418" /></a>
</p>
<p>
  La crise a au moins du bon dans un domaine : la récession réduit semble-t-il la consommation d’énergie. Avec le recul,&nbsp; la course à la croissance est dangereuse pour la survie de l’humanité à moyen terme du fait de l’épuisement des ressources de la planète et de son impact environnemental. Trouver le moyen de gérer une “décroissance positive” serait un beau projet pour la survie de l’humanité…. mais on s’éloigne.
</p>
<p>
  <strong>Quelques conseils</strong>
</p>
<p>
  Le tableau est bien sombre, et malgré tout, les créateurs d’entreprises n’ont jamais été aussi nombreux. C’est rassurant car cela montre l’énergie qui subsiste, notamment chez les jeunes. Alors, voici à leur intention quelques conseils basiques :
</p>
<ul>
  <li>Constituez une équipe très solide (interne, board, advisory board, …).
  </li>
  <li>Créez un service ou produit avec des facteurs différentiateurs clairs et forts par rapport à la concurrence ou aux solutions établies. Evitez la solution “nice to have”. Votre présentation doit générer chez le client le sentiment pressant du “je le veux tout de suite” !
  </li>
  <li>Travaillez finement la monétisation de votre offre. Ne la repoussez par au jour où vous ferez de l’audience. Soyez à la fois précis et souples dans votre modèle de monétisation.
  </li>
  <li>Trouvez des sources de financement diverses non dilutives pour créer le produit et attirer les premiers clients / consommateurs. Puis faites appel à des business angels en profitant de l’effet Loi TEPA qui, on l’espère, ne va pas entièrement disparaître du fait de la crise. Ne faites pas trop de plans sur la comète sur une levée de 3m€ dans 12 mois. Vos chances, certes non nulles, sont très faibles d’y parvenir (moins de 200 projets par an en France en tout et pour tout).
  </li>
  <li>Faites de la qualité : présentations, supports, produit/service, relations, fiabilité. Il y a encore trop de médiocrité, et la qualité, cela se remarque !
  </li>
</ul>
<p>
  Et si vous en avez la possibilité, venez à la conférence <a href="http://www.lewebparis.com/">Leweb</a> pour vous remonter le moral avec son thème “Love”. Quitte, vu le prix, à être invité par l’un des sponsors, ou à y assister à distance par l’un des webcasts qui ne manqueront pas de la relayer !
</p>
</div>]]>
      </description>
      <pubDate>sam, 22 Nov 2008 12:24:05 +0100</pubDate>
      <guid isPermaLink="false">tag:ziki.com,2008:/article/8322688</guid>
    </item>
    <item>
      <title>MIT&#8217;s Introduction to Algorithms, Lectures 13 and 14: Amortized Analysis and Self-Organizing Lists</title>
      <link>http://feeds.feedburner.com/%7Er/catonmat/%7E3/459806859/</link>
      <description>
        <![CDATA[<div class="post_content wiki_text"><p>
  <img src="http://www.catonmat.net/blog/wp-content/uploads/2008/08/post-icon.jpg" alt="MIT Algorithms" align="left" />This is the ninth post in an article series about MIT’s lecture course “<strong>Introduction to Algorithms</strong>.” In this post I will review lectures thirteen and fourteen. They are on theoretical topics of <strong>Amortized Analysis</strong>, <strong>Competitive Analysis</strong> and <strong>Self-Organizing Lists</strong>.
</p>
<p>
  Amortized analysis is a tool for analyzing algorithms that perform a sequence of similar operations. It can be used to show that the average cost of an operation is small, if one averages over a sequence of operations, even though a single operation within the sequence might be expensive. Amortized analysis differs from average-case analysis in that probability is not involved; an amortized analysis guarantees the average performance of each operation in the worst case.
</p>
<p>
  Lecture thirteen looks at three most common techniques used in amortized analysis - <strong>Aggregate Analysis</strong>, <strong>Accounting Method</strong> (also known as <strong>Taxation Method</strong>) and <strong>Potential Method</strong>.
</p>
<p>
  Competitive analysis is a method that is used to show how an <strong>Online Algorithm</strong> compares to an <strong>Offline Algorithm</strong>. An algorithm is said to be online if it does not know the data it will be executing on beforehand. An offline algorithm may see all of the data in advance.
</p>
<p>
  A self-organizing list is a list that reorders its elements based on some self-organizing heuristic to improve average access time.
</p>
<p>
  Lecture fourteen gives a precise definition of what it means for an algorithm to be competitive and shows a heuristic for a self-organizing list that makes it 4-competitive.
</p>
<h2 style="margin-bottom: 10px;">
  Lecture 13: Amortized Algorithms
</h2>
<p>
  Lecture thirteen starts with a question - “How large should a hash table be?” Well, we could make it as large as possible to minimize the search time, but then it might take too much space. We could then try to make it as small as possible, but what if we don’t know the number of elements that will be hashed into it? The solution is to use a dynamic hash table that grows whenever it is about to overflow.
</p>
<p>
  This creates a problem that at the moment of overflow the table must be grown and growing it might take a lot of time. Thus, we need a way to analyze the running time in a long run.
</p>
<p>
  Lecture continues with three methods for this analysis, called amortized arguments - aggregate method, accounting method, and potential method.
</p>
<p>
  In aggregate analysis, we determine an upper bound T(n) on the total cost of a sequence of n operations. The average cost per operation is then T(n)/n. We take the average cost as the amortized cost of each operation, so that all operations have the same amortized cost.
</p>
<p>
  In accounting method we determine an amortized cost of each operation. When there is more than one type of operation, each type of operation may have a different amortized cost. The accounting method overcharges some operations early in the sequence, storing the overcharge as “prepaid credit” on specific objects in the data structure. The credit is used later in the sequence to pay for operations that are charged less than they actually cost.
</p>
<p>
  Potential method is like the accounting method in that we determine the amortized cost of each operation and may overcharge operations early on to compensate for undercharges later. The potential method maintains the credit as the “potential energy” of the data structure as a whole instead of associating the credit with individual objects within the data structure.
</p>
<p>
  Each method is applied to dynamic tables to show that average cost per insert is O(1).
</p>
<p>
  You’re welcome to watch lecture thirteen:
</p>
<div>
  <embed src="http://video.google.com/googleplayer.swf?docid=2911922151647726531&amp;amp;hl=en&amp;amp;fs=true" style="width: 400px; height: 326px;" />
  <p>
    Direct URL: <a href="http://video.google.com/videoplay?docid=2911922151647726531">http://video.google.com/videoplay?docid=2911922151647726531</a>
  </p>
</div>
<p>
  Topics covered in lecture thirteen:
</p>
<ul>
  <li>[01:05] How large should a hash table be?
  </li>
  <li>[04:45] Dynamic tables.
  </li>
  <li>[06:15] Algorithm of dynamic hash tables.
  </li>
  <li>[07:10] Example of inserting elements in a dynamic array.
  </li>
  <li>[09:35] Wrong analysis of time needed for n insert operations.
  </li>
  <li>[12:15] Correct analysis of n insert operations using aggregate analysis method.
  </li>
  <li>[19:10] Definition of amortized analysis.
  </li>
  <li>[21:20] Types of amortized arguments.
  </li>
  <li>[23:55] Accounting method (taxation method) amortized analysis.
  </li>
  <li>[29:00] Dynamic table analysis with accounting (taxation) method.
  </li>
  <li>[40:45] Potential method amortized analysis.
  </li>
  <li>[54:15] Table doubling analysis with potential method.
  </li>
  <li>[01:13:10] Conclusions about amortized costs, methods and bounds.
  </li>
</ul>
<p>
  Lecture thirteen notes:
</p>
<div>
  
    
      
        <a href="http://www.catonmat.net/blog/wp-content/uploads/2008/11/mit-algorithms-lecture-13-01.jpg" title="MIT Algorithms Lecture 13 Notes Thumbnail. Page 1 of 2."><img src="http://www.catonmat.net/blog/wp-content/uploads/2008/11/mit-algorithms-lecture-13-01-thumb.jpg" alt="MIT Algorithms Lecture 13 Notes Thumbnail. Page 1 of 2." /></a><br />
        <small>Lecture 13, page 1 of 2.</small>
      
      
      
        <a href="http://www.catonmat.net/blog/wp-content/uploads/2008/11/mit-algorithms-lecture-13-02.jpg" title="MIT Algorithms Lecture 13 Notes Thumbnail. Page 2 of 2."><img src="http://www.catonmat.net/blog/wp-content/uploads/2008/11/mit-algorithms-lecture-13-02-thumb.jpg" alt="MIT Algorithms Lecture 13 Notes Thumbnail. Page 2 of 2." /></a><br />
        <small>Lecture 13, page 2 of 2.</small>
      
    
  
</div>
<h2 style="margin-bottom: 10px;">
  Lecture 14: Competitive Analysis and Self-Organizing Lists
</h2>
<p>
  Lecture fourteen starts with the notion of self-organizing lists. A self-organizing list is a list that reorders itself to improve the average access time. The goal is to find a reordering that minimizes the total access time.
</p>
<p>
  At this point the lecture steps away from this problem for a moment and defines online algorithms and offline algorithms: Given a sequence S of operations that algorithm must execute, an online algorithm must execute each operation immediately but an offline algorithm may see all of S in advance.
</p>
<p>
  Now the lecture returns to the self-organizing list problem and looks at two heuristics how the list might reorganize itself to minimize the access time. The first way is to keep a count of the number of times each element in the list is accessed and reorder list in the order of decreasing count. The other is move-to-front heuristic (MTF) - after accessing the element, move it to the front of the list.
</p>
<p>
  Next the lecture defines what it means for an algorithm to be competitive. It is said that an online algorithm is α-competitive if there is a constant k such that for any sequence of operations the (running time cost of online algorithm) &lt;= α·(running time cost of an optimal offline algorithm (also called "God's algorithm")) + k.
</p>
<p>
  Lecture continues with a theorem that move-to-front is 4-competitive for self-organizing lists. The proof of this theorem takes almost an hour!
</p>
<div>
  <embed src="http://video.google.com/googleplayer.swf?docid=542405605639111887&amp;amp;hl=en&amp;amp;fs=true" style="width: 400px; height: 326px;" /><br />
  Direct URL: <a href="http://video.google.com/videoplay?docid=542405605639111887">http://video.google.com/videoplay?docid=542405605639111887</a>
</div>
<p>
  Topics covered in lecture fourteen:
</p>
<ul>
  <li>[01:00] Definition of self-organizing lists.
  </li>
  <li>[03:00] Example of a self-organizing list (illustrates transpose cost and access cost).
  </li>
  <li>[05:00] Definition of on-line and off-line algorithms.
  </li>
  <li>[08:45] Worst case analysis of self-organizing lists.
  </li>
  <li>[11:40] Average case analysis of selforganizing lists.
  </li>
  <li>[17:05] Move-to-front heuristic.
  </li>
  <li>[20:35] Definition of competitive analysis.
  </li>
  <li>[23:35] Theorem: MTF is 4-competitive.
  </li>
  <li>[25:50] Proof of this theorem.
  </li>
</ul>
<p>
  Lecture fourteen notes:
</p>
<div>
  
    
      
        <a href="http://www.catonmat.net/blog/wp-content/uploads/2008/11/mit-algorithms-lecture-14-01.jpg" title="MIT Algorithms Lecture 14 Notes Thumbnail. Page 1 of 2."><img src="http://www.catonmat.net/blog/wp-content/uploads/2008/11/mit-algorithms-lecture-14-01-thumb.jpg" alt="MIT Algorithms Lecture 13 Notes Thumbnail. Page 1 of 2." /></a><br />
        <small>Lecture 14, page 1 of 2.</small>
      
      
      
        <a href="http://www.catonmat.net/blog/wp-content/uploads/2008/11/mit-algorithms-lecture-14-02.jpg" title="MIT Algorithms Lecture 14 Notes Thumbnail. Page 2 of 2."><img src="http://www.catonmat.net/blog/wp-content/uploads/2008/11/mit-algorithms-lecture-14-02-thumb.jpg" alt="MIT Algorithms Lecture 14 Notes Thumbnail. Page 2 of 2." /></a><br />
        <small>Lecture 14, page 2 of 2.</small>
      
    
  
</div>
<p>
  Have fun with amortized and competitive analysis! The next post will be about dynamic programming!
</p>
<p>
  PS. This course is taught from the CLRS book (also called “Introduction to Algorithms”):
</p>
<div>
  <a href="http://feeds.feedburner.com/~f/catonmat?a=LUOON"><img src="http://feeds.feedburner.com/~f/catonmat?i=LUOON" /></a> <a href="http://feeds.feedburner.com/~f/catonmat?a=MSGcn"><img src="http://feeds.feedburner.com/~f/catonmat?i=MSGcn" /></a> <a href="http://feeds.feedburner.com/~f/catonmat?a=h5BGn"><img src="http://feeds.feedburner.com/~f/catonmat?i=h5BGn" /></a> <a href="http://feeds.feedburner.com/~f/catonmat?a=fCP4n"><img src="http://feeds.feedburner.com/~f/catonmat?i=fCP4n" /></a>
</div><img src="http://feeds.feedburner.com/~r/catonmat/~4/459806859" height="1" width="1" />
</div>]]>
      </description>
      <pubDate>jeu, 20 Nov 2008 10:40:45 +0100</pubDate>
      <guid isPermaLink="false">tag:ziki.com,2008:/article/8320397</guid>
    </item>
    <item>
      <title>Are your mongrels growing by 20MB/request on Rails 2.2? Blame AssetTag!</title>
      <link>http://blog.hungrymachine.com/2008/11/19/are-your-mongrels-growing-to-600mb-blame-assettag</link>
      <description>
        <![CDATA[<div class="post_content wiki_text"><p>
  After porting our production application to Rails 2.2, we noticed a major memory leak.
</p>
<p>
  Beforehand, monit would restart instances a handful of times a day. After Rails 2.2, monit restarted instances THOUSANDS of times a day.
</p>
<p>
  This is a graph of one of our haproxy instances a couple days ago.
</p>&lt;center&gt;<img src="http://blog.hungrymachine.com/assets/2008/11/19/Picture_79.png" />&lt;/center&gt;
<p>
  We looked at everything, including time spent <a href="http://blog.hungrymachine.com/2008/11/8/how-to-save-100m-of-ram-per-mongrel">rewriting</a> <a href="http://blog.hungrymachine.com/2008/11/11/how-to-save-100m-of-ram-per-mongrel-part-2">Routes</a>, thinking that was the culprit.
</p>
<p>
  This morning, we all sat around and fought the issue old school style. binary debugging... and found it: AssetTagHelper. See the patch <a href="http://rails.lighthouseapp.com/projects/8994-ruby-on-rails/tickets/1419-massive-memory-leak-in-assettag">here</a>.
</p>
<p>
  The new thread-safe asset tag code keeps a static AssetTag::Cache = {} of all asset_tags created (css,jss, and all images).
</p>
<p>
  Internally, each AssetTag object keeps a reference to the controller and template objects, and in turn all instance variables you created in your request.
</p>
<p>
  What does that mean? Say you have a people controller, that loads a person and their stuff, and you show images of their stuff via image_tag().
</p>
<pre>
 class PeopleController &lt; ApplicationController
   def show
     @person = Person.find(params[:id])
     @stuff = @people.stuff.find(:all, :limit =&gt; 30)
   end
 end
</pre>
<p>
  When image_tag() is called, it does rails magic to append file extensions, asset_ids, and the like. To be smart, it caches those objects so it doesnt hit the file system to figure all that out on every request. The problem is it puts it in a static cache, AssetTag::Cache.
</p>
<p>
  So each PeopleController instance has a reference to 1 person and 30 Stuffs. After 1000 people look at their pages, or better yet google crawls your site, you have 1k @controllers with a total of 1000 People Objects, and 1000*30 Stuff objects. This would normally be fine. The objects leave scope and get GC'ed. But, if you generate an image tag to an unique asset, AssetTag puts that into a cache, AssetTag::Cache, with a reference to the @controller of the request. So All People and their Stuff are kept around forever, unable to be GC'ed.... every time a unique image is rendered via AssetTag. Eventually monit has to kill the process.
</p>
<p>
  The <a href="http://rails.lighthouseapp.com/projects/8994-ruby-on-rails/tickets/1419-massive-memory-leak-in-assettag">patch</a> we just submitted does 2 things.
</p>
<p>
  1) It now keeps a cache of just the modified path strings, caching the file access stuff. If you have tons of local images, reference them by fully qualified host. Thats better for lots of reasons. Cookie-less asset hosts with multiple subdomains FTW!
</p>
<p>
  2) It stops caching absolute URL paths. You cant do anything on the filesystem to verify them, and keeping a cache of those would also grow unbounded. We have millions of items in our system, each with a reference to an image.
</p>
<p>
  Here is a graph of that haproxy today... Sleeping.........
</p>&lt;center&gt;<img src="http://blog.hungrymachine.com/assets/2008/11/19/Picture_80.png" />&lt;/center&gt;
<p>
  In order to do some testing of your own, here's a simplistic after_filter you can add to application.rb (or is it now application_controller.rb?). Make sure you run this in production mode or with cache_classes = true. As you click around your site, you should see that the cache retains references to controller instances, just to name a few. After you apply the patch, you'll see the cache is just strings.
</p>
<pre>
 def assettag_cache
    puts "-"*80
    puts "[AssetTag::Cache] Now #{ActionView::Helpers::AssetTagHelper::AssetTag::Cache.size} items"
    ActionView::Helpers::AssetTagHelper::AssetTag::Cache.values.each do |asset_tag|
      if asset_tag === ActionView::Helpers::AssetTagHelper::AssetTag
        puts "   [Asset] #{asset_tag.instance_variable_get("@source")}  #{asset_tag.instance_variable_get("@controller").class.to_s}"  
      else
        puts "   [Asset] #{asset_tag}"  
      end
    end
  end
</pre>
<p>
  Ohh... and we havent given up on routes... Warren is working on some very interesting enhancements to rails routing. Looking forward to blogging about that soon.
</p><img src="http://feeds.feedburner.com/~r/hungrymachine/~4/458831196" height="1" width="1" />
</div>]]>
      </description>
      <pubDate>mer, 19 Nov 2008 23:27:41 +0100</pubDate>
      <guid isPermaLink="false">tag:ziki.com,2008:/article/8295667</guid>
    </item>
    <item>
      <title>Canvas in 3D</title>
      <link>http://feeds.feedburner.com/%7Er/ajaxian/%7E3/458502504/canvas-in-3d</link>
      <description>
        <![CDATA[<div class="post_content wiki_text"><p>
  Peter Nederlof of the infamous Dutch "Lost Boys" <a href="http://www.xs4all.nl/~peterned/3d/">created a 3D engine in Canvas</a>.
</p>
<p>
  <a href="http://www.xs4all.nl/~peterned/3d/"><img title="Canvas 3D " src="http://ajaxian.com/wp-content/uploads/canvas3d-flickr.png" height="239" alt="Flickr mashup with photos on a 3D plane" width="300" /></a>
</p>
<p>
  Straight from the horse's mouth:
</p>
<blockquote>
  <p>
    I've been working on a 3D engine on canvas for some time, and as I was posting a message on our blog, I figured you guys might be interrested as well :)
  </p>
  <p>
    The demo is over here: <a href="http://www.xs4all.nl/~peterned/3d/">http://www.xs4all.nl/~peterned/3d/</a>
  </p>
  <p>
    Another (completely useless but fun to watch) one is over here (and<br />
    using chrome is strongly advised): <a href="http://www.xs4all.nl/~peterned/3d/psychedelic3D.html">http://www.xs4all.nl/~peterned/3d/psychedelic3D.html</a>
  </p>
  <p>
    Ultimately the purpose of this engine would be to provide an easy to<br />
    use platform/interface for creating 3D stuff, from degrading interface<br />
    elements for sites, to complete games. Collada support is en route,<br />
    and with squirrelfish hitting air, I'm considering trying that too :)
  </p>
</blockquote>
<p>
  More details are available on the <a href="http://lbi.lostboys.nl/blog/artikelen/canvas-in-full-3d/">Lost Boys blog</a>.
</p>
<div>
  <a href="http://feeds.feedburner.com/~f/ajaxian?a=tSrHN"><img src="http://feeds.feedburner.com/~f/ajaxian?i=tSrHN" /></a> <a href="http://feeds.feedburner.com/~f/ajaxian?a=uwAON"><img src="http://feeds.feedburner.com/~f/ajaxian?i=uwAON" /></a> <a href="http://feeds.feedburner.com/~f/ajaxian?a=JeKhn"><img src="http://feeds.feedburner.com/~f/ajaxian?i=JeKhn" /></a>
</div>
</div>]]>
      </description>
      <pubDate>mer, 19 Nov 2008 16:33:55 +0100</pubDate>
      <guid isPermaLink="false">tag:ziki.com,2008:/article/8295668</guid>
    </item>
    <item>
      <title>Voice in Google Mobile App: A Tipping Point for the Web?</title>
      <link>http://feeds.feedburner.com/%7Er/oreilly/radar/atom/%7E3/457413674/voice-in-google-mobile-app-tipping-point.html</link>
      <description>
        <![CDATA[<div class="post_content wiki_text"><p>
  As I wrote in <a href="http://radar.oreilly.com/2008/11/daddy-wheres-your-phone.html">Daddy, Where's Your Phone?</a>, it's time to start thinking of the phone as a first class device for accessing web services, not as a way of repurposing content or applications originally designed to be accessed on a keyboard and big screen. The release of <a href="http://googlemobile.blogspot.com/2008/11/google-mobile-app-for-iphone-now-with.html">speech recognition in Google Mobile App for iPhone</a> continues the process begun with the iPhone itself, of building a new, phone-native way of delivering computing services. Here are two of the key elements:<br />
</p>
<ol>
  <li>
    <strong>Sensor-based interfaces</strong>. Apple wowed us with iPhone touch screen, but the inclusion of the accelerometer was almost as important, and now Google has shown us how it can be used as a <em>key component of an application user interface</em>. Put the phone to your ear, and the application starts listening, triggered by the natural gesture rather than by an artificial tap or click. Yes, the accelerometer has been used in games like <a href="http://www.xeodesign.com/tilt.html">tilt</a>, parlor amusements like <a href="http://www.carling.com/ipint_details.html">the iPint</a>, but Google has pushed things further by integrating it into a kind of workflow with the phone's main sensor, the microphone.<br />
    <p>
      <br />
      This is the future of mobile: to invent interfaces that throw away the assumptions of the previous generation. Point and click was a breakthrough for PCs, but it's a trap for mobile interface design. Right now, the iPhone (and other similar smartphones) have an array of sensors: the microphone, the camera, the touchscreen, the accelerometer, the location sensor (GPS or cell triangulation), and yes, on many, the keyboard and pointing device. Future applications will surprise us by using them in new ways, and in new combinations; future devices will provide richer and richer arrays of senses (yes, senses, not just sensors) for paying attention to what we want.<br />
    </p>
    <p>
      <br />
      Could a phone recognize the gesture of raising the camera up and then holding it steady to launch the camera application? Could we talk to the phone to adjust camera settings? (There's a constrained language around lighting and speed and focus that should be easy to recognize.) Could a phone recognize the motion of a car and switch automatically to voice dialing? And of course, there are all the Wii-like interactions with other devices that are possible when we think of the phone as a controller. Sensor based workflows are the future of UI design.<br />
    </p>
  </li>
  <li>
    <br />
    <strong>Cloud integration</strong>. It's easy to forget that <em>the speech recognition isn't happening on your phone</em>. It's happening on Google's servers. It's Google's vast database of speech data that makes the speech recognition work so well. It would be hard to pack all that into a local device.<br />
    <p>
      <br />
      And that of course is the future of mobile as well. A mobile phone is inherently a connected device with local memory and processing. But it's time we realized that the local compute power is a fraction of what's available in the cloud. Web applications take this for granted -- for example, when we request a map tile for our phone -- but it's surprising how many native applications settle themselves comfortably in their silos. (Consider my <a href="http://radar.oreilly.com/archives/2007/03/the-web-20-addr-1.html">long-ago complaint that the phone address book cries out to be a connected application</a> powered by my phone company's call-history database, annotated by data harvested from my online social networking applications as well as other online sources.)
    </p>
  </li>
</ol><br />
Put these two trends together, and we can imagine the future of mobile: a sensor-rich device with applications that use those sensors both to feed and interact with cloud services. The location sensor knows you're <em>here</em> so you don't need to tell the map server where to start; the microphone knows the sound of your voice, so it unlocks your private data in the cloud; the camera images an object or a person, sends it to a remote application that recognizes it, and retrieves relevant data. All of these things already exist in scattered applications, but eventually, they will be the new normal.<br />
<p>
  <br />
  This is an incredibly exciting time in mobile application design. There are breakthroughs waiting to happen. Voice and gesture recognition in the Google Mobile App is just the beginning.
</p>
<div>
  <a href="http://feeds.feedburner.com/~f/oreilly/radar/atom?a=wcYun"><img src="http://feeds.feedburner.com/~f/oreilly/radar/atom?i=wcYun" /></a> <a href="http://feeds.feedburner.com/~f/oreilly/radar/atom?a=mjTEN"><img src="http://feeds.feedburner.com/~f/oreilly/radar/atom?i=mjTEN" /></a> <a href="http://feeds.feedburner.com/~f/oreilly/radar/atom?a=xyfIn"><img src="http://feeds.feedburner.com/~f/oreilly/radar/atom?i=xyfIn" /></a> <a href="http://feeds.feedburner.com/~f/oreilly/radar/atom?a=9BVnN"><img src="http://feeds.feedburner.com/~f/oreilly/radar/atom?i=9BVnN" /></a>
</div><img src="http://feeds.feedburner.com/~r/oreilly/radar/atom/~4/457413674" height="1" width="1" />
</div>]]>
      </description>
      <pubDate>mer, 19 Nov 2008 01:09:48 +0100</pubDate>
      <guid isPermaLink="false">tag:ziki.com,2008:/article/8285247</guid>
    </item>
    <item>
      <title>10 Semantic Apps to Watch - One Year Later</title>
      <link>http://feedproxy.google.com/%7Er/readwriteweb/%7E3/WSYEmvBAeos/10_semantic_apps_to_watch_one_year_later.php</link>
      <description>
        <![CDATA[<div class="post_content wiki_text"><p>
  <img src="http://www.readwriteweb.com/images/semantic_apps_nov08b.jpg" />In November 2007, we listed and reviewed <a href="http://www.readwriteweb.com/archives/10_semantic_apps_to_watch.php">10 promising Semantic Web apps</a>. A lot can happen in one year on the Internet, so we thought we'd check back in with each of the 10 products and see how they're progressing. What's changed over the past year and what are these companies working on now? The products are, in no particular order: Freebase, Powerset, Twine, AdaptiveBlue, Hakia, Talis, TrueKnowledge, TripIt, Calais (was ClearForest), Spock.
</p>
<p>
  In our next post in this series, we're going to publish a <strong>completely new list of Semantic apps to watch</strong>! That's right, 10 <em>more</em> Semantic apps. Let us know your suggestions in the comments.
</p>
<p style="text-align: right;">
  <em>Sponsor</em><br />
  <a href="http://d.openx.org/ck.php?n=12600&amp;amp;cb=12600"><img src="http://d.openx.org/avw.php?zoneid=861&amp;amp;cb=12600&amp;amp;n=12600" alt="" align="right" /></a>
</p>
<h2>
  Freebase
</h2>
<p>
  <img src="http://www.readwriteweb.com/images/freebase_logo_nov07.png" align="left" /><a href="http://www.freebase.com/">Freebase</a> is an open, semantically marked up database of information. It looks similar to Wikipedia, but Freebase is all about structured data and what you can do with it.
</p>
<p>
  Freebase has been one of the more hyped companies in Semantic Web, leading to some skepticism that the product is too much like Wikipedia and offers nothing much new. In May '08, we <a href="http://www.readwriteweb.com/archives/freebase_overview.php">attempted to dispel the Freebase skepticism</a>. Our conclusion was that the structured database, API, creative commons licensing - among other things - all added up to a richer product than Wikipedia. Then in July, we reported that <a href="http://www.readwriteweb.com/archives/metawebs_freebase_now_60_large.php">Freebase was about to hit 4 million topics</a> in its collection - which at the time was 60% more than the English Wikipedia.
</p>
<p>
  However, we noted some concerns with Freebase - "big gaps in the data" along with usability issues. In a follow-up article in August, we covered an interesting tool for browsing Freebase, <a href="http://www.readwriteweb.com/archives/freebase_parallax_taunts_us_wi.php">called Freebase Parallax</a>. Unfortunately, when we tried out a number of searches in Parallax, very few subjects were well populated.
</p>
<p>
  <strong>RWW verdict one year later:</strong> still lots of work to do for Freebase, in terms of usability and useful data.
</p>
<h2>
  Calais (was ClearForest)
</h2>
<p>
  <img src="http://www.readwriteweb.com/images/calais_logo_mar08.gif" align="right" />When we did our round-up one year ago, ClearForest had been recently <a href="http://www.clearforest.com/whatsnew/PRs.asp?year=2007&amp;amp;id=109">acquired by Reuters</a> and at that point it had a Web Service and a Firefox extension. What a change a year brings! ClearForest went on to release <a href="http://www.opencalais.com/">Calais</a>, a toolkit of products that enable users to incorporate semantic functionality within their blog, content management system, website or application.
</p>
<p>
  Since <a href="http://www.readwriteweb.com/archives/reuters_calais.php">launching the Open Calais API</a> early this year, over 6,000 developers have registered with it and the service is doing more than 1 million transactions a day. We wrote about the launch of <a href="http://www.readwriteweb.com/archives/reuters_semanticproxy_jump-start.php">Calais' easiest-to-use service yet</a>, called <a href="http://semanticproxy.com/">SemanticProxy</a>, at the end of September. <a href="http://www.opencalais.com/node/8823">Version 3.0 was released</a> earlier this month and version 4 is expected by January 09.
</p>
<p>
  <strong>RWW verdict one year later:</st