<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0"
	xmlns:content="http://purl.org/rss/1.0/modules/content/"
	xmlns:wfw="http://wellformedweb.org/CommentAPI/"
	xmlns:dc="http://purl.org/dc/elements/1.1/"
	xmlns:atom="http://www.w3.org/2005/Atom"
	xmlns:sy="http://purl.org/rss/1.0/modules/syndication/"
	xmlns:slash="http://purl.org/rss/1.0/modules/slash/"
	>

<channel>
	<title>Nicollet.Net</title>
	<atom:link href="http://www.nicollet.net/feed/" rel="self" type="application/rss+xml" />
	<link>http://www.nicollet.net</link>
	<description>Everyone Loves Me</description>
	<lastBuildDate>Fri, 30 Mar 2012 12:39:20 +0000</lastBuildDate>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
	<generator>http://wordpress.org/?v=</generator>
		<item>
		<title>The Evil Overlord Name Generator</title>
		<link>http://www.nicollet.net/2012/03/evil-overlord-name-generator/</link>
		<comments>http://www.nicollet.net/2012/03/evil-overlord-name-generator/#comments</comments>
		<pubDate>Fri, 30 Mar 2012 12:39:20 +0000</pubDate>
		<dc:creator>Victor Nicollet</dc:creator>
				<category><![CDATA[Random]]></category>
		<category><![CDATA[Javascript]]></category>
		<category><![CDATA[Useless]]></category>

		<guid isPermaLink="false">http://www.nicollet.net/?p=2704</guid>
		<description><![CDATA[Need a name for your Evil Overlord  ? Something like Greyspleen, the Rotting Mummy or Smells-like-silence, the Scorned Annihilator or Othoggoth, the Faceless Fiend ? Or something lighthearted, such as Fiendfingers, the Unyielding Gynaecologist ? The latest version of the Evil Overlord Name Generator is free, and available on GitHub. Enjoy !]]></description>
			<content:encoded><![CDATA[<p>Need a name for your Evil Overlord  ? Something like <strong id="name">Greyspleen, the Rotting Mummy </strong>or <strong id="name">Smells-like-silence, the Scorned Annihilator</strong> or <strong id="name">Othoggoth, the Faceless Fiend</strong><strong> </strong>? Or something lighthearted, such as <strong id="name">Fiendfingers, the Unyielding Gynaecologist</strong> ?<strong> </strong></p>
<p>The latest version of the <a href="http://www.nicollet.net/files/blog/evil-overlord/" target="_blank">Evil Overlord Name Generator</a> is free, and <a href="https://github.com/VictorNicollet/Evil-Overlord-Names" target="_blank">available on GitHub</a>. Enjoy !</p>
]]></content:encoded>
			<wfw:commentRss>http://www.nicollet.net/2012/03/evil-overlord-name-generator/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Execution Matters, Brand Matters More</title>
		<link>http://www.nicollet.net/2012/03/execution-matters-brand-matters-more/</link>
		<comments>http://www.nicollet.net/2012/03/execution-matters-brand-matters-more/#comments</comments>
		<pubDate>Fri, 23 Mar 2012 11:14:39 +0000</pubDate>
		<dc:creator>Victor Nicollet</dc:creator>
				<category><![CDATA[Strategy]]></category>
		<category><![CDATA[Brand]]></category>
		<category><![CDATA[Marketing]]></category>

		<guid isPermaLink="false">http://www.nicollet.net/?p=2700</guid>
		<description><![CDATA[There&#8217;s a small shitstorm blowing around on Hacker News right now. The back story is that Dustin Curtis created svbtle, a blogging platform that is currently closed-source and invite-only. A relevant bit: I wrote this engine entirely for myself, without the intention of opening it up to other people. But since realizing that it has [...]]]></description>
			<content:encoded><![CDATA[<p>There&#8217;s a small shitstorm blowing around on Hacker News right now. The back story is that Dustin Curtis created <a href="http://dcurt.is/codename-svbtle" target="_blank">svbtle</a>, a blogging platform that is currently closed-source and invite-only. A relevant bit:</p>
<blockquote><p><small>I wrote this engine entirely for myself, without the intention of opening it up to other people. But since realizing that it has improved the way I think and write, I&#8217;ve decided to open it up to a small number of vetted bloggers. At least at first. The goal is simple: when you see the Svbtle design, you should know that the content is <em>guaranteed</em> to be great. Network bloggers are encouraged to keep quality high at the expense of everything else.</small></p></blockquote>
<p>Then, Nate Wienert created <a href="http://natewienert.com/codename-obtvse" target="_blank">obtvse</a>, intended to be an open-source alternative to Dustin&#8217;s svbtle software.</p>
<blockquote><p><small>So, I decided to do something about it. Svbtle was nearly exactly what I had been looking to do with my own blog. I wanted it, and I wanted to share it with friends. I whipped open terminal, typed in <em>rails new obtvse</em>, and a few hours later I&#8217;m here.</small></p></blockquote>
<p>Then, Nate posted the link on Hacker News, and the <a href="http://news.ycombinator.com/item?id=3744294" target="_blank">top comment</a> came from Dustin:</p>
<blockquote><p><small>This is almost unbelievable. No matter what you think about me or my product decisions, it is flatly wrong to ripoff work. It&#8217;s shameful, even.</small></p>
<p><small>Please take this site down and delete the Github repository. The work isn&#8217;t yours.</small></p>
<p><small>Just wait until Svbtle is finished and open to the public. The reason it&#8217;s closed is really simple: it&#8217;s not ready yet.</small></p></blockquote>
<p>Let&#8217;s get a few facts straight before we go on.</p>
<ol>
<li>Nate Wienert did not copy any source code from Svbtle when creating Obtvse. The implementation of Obtvse is an entirely original work, <em>including the HTML and CSS</em>.</li>
<li>The function and underlying idea of the Obtvse <em>software</em> are exactly the same as those of Svtble <em>software</em>.</li>
<li>The design and features of Obtvuse, though not identical, are strikingly similar to Svbtle, and this is intentional.</li>
</ol>
<p>What happened ?</p>
<p><strong>Nate owns the implementation work for Obtvse</strong>. He wrote it himself, and it bears no significant resemblance to the implementation of Svbtle. Dustin has no business telling anyone else what to do with the code they write.</p>
<p><strong>No one owns the general idea behind the software</strong>: less clutter ? Emphasis on content instead of presentation ? Markdown ? None of these are original, and if they were, then 2007 called : the people at Tumblr want their ideas back.</p>
<p><strong>The design and features are more of a gray area</strong>. Creating an aesthetically pleasing design is more difficult than turning that design into HTML and CSS. The original Obtvse was indeed dangerously close to plagiarism, but has moved away from the original Svbtle design and is looking for its own visual identity.</p>
<p>So, is Dustin entitled to complain about the situation ? I believe so.</p>
<p><strong>Obtvse is blatantly hijacking the Svtble brand</strong>. But first, let me mention <a href="http://zachholman.com/posts/from-hack-to-popular-project/" target="_blank">an article written last year</a> by Zach Holman :</p>
<blockquote><p><small>Last Monday, I sat down to hack.</small></p>
<p><small>After a few hours, I open sourced the code. By the end of the week, it had 1,000 watchers and 70 forks on GitHub, and 500 upvotes on Hacker News.</small></p>
<p><small> </small><small></small><small>It’s my favorite example of open source recently. Here’s why it worked.</small></p></blockquote>
<p>He then explains that his project took off because it was easily portable, simple and fun. No. These certainly helped a little bit, but the main reason the project had a massive audience is because Zach Holman has a massive audience : he has a popular blog that is regularly seen on Hacker News, he is followed by ten thousand people on Twitter and he works at GitHub. In fact, I would be quite interested in the following experiment : create a new blog, new twitter account and new GitHub profile, publish an awesome project and see how long it takes to get 1,000 watchers !</p>
<p>I&#8217;m not saying that Zach Holman was lucky. Quite the contrary : building an audience takes time and effort, and I&#8217;m quite certain that Zach earned  every single one of his feed subscribers and twitter followers.</p>
<p>Which brings me back to Svbtle and Obtvse. I may disagree with the «Invite-Only Network» mostly out of jealousy for not being able to join, but I will be the first to agree that <strong>Dustin Curtis worked hard to build the personal audience that he could pitch Svbtle to</strong>. The main reason why Nate Wienert rose to the top of Hacker News is that it&#8217;s a different take on a well-known and trending topic — in all honesty, if you had never heard of Svbtle in the first place, would you have paid any attention to Obtvse ?</p>
<p>And this is unfair. It&#8217;s unfair to Dustin, who worked hard on getting people to know Svbtle and is being painted as a bad guy because of what is ultimately an emotional reaction that should not have been posted. And it&#8217;s unfair to all of us who would rather be acknowledged because of who we are instead of what bandwagon we rode on.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.nicollet.net/2012/03/execution-matters-brand-matters-more/feed/</wfw:commentRss>
		<slash:comments>3</slash:comments>
		</item>
		<item>
		<title>Of Wedding Planners and Hairdressers</title>
		<link>http://www.nicollet.net/2012/03/of-wedding-planners-and-hairdressers/</link>
		<comments>http://www.nicollet.net/2012/03/of-wedding-planners-and-hairdressers/#comments</comments>
		<pubDate>Wed, 14 Mar 2012 00:07:19 +0000</pubDate>
		<dc:creator>Victor Nicollet</dc:creator>
				<category><![CDATA[Strategy]]></category>
		<category><![CDATA[Marketing]]></category>
		<category><![CDATA[Start-Up]]></category>

		<guid isPermaLink="false">http://www.nicollet.net/?p=2696</guid>
		<description><![CDATA[On my previous article about cold calling, Stu Millett left an interesting comment. The relevant parts are : If i want something i will go look for it, if i don’t find your product- tuff! If you go out of business, tuff because you had a rubbish business plan, specialised product with limited appeal or whatever- your [...]]]></description>
			<content:encoded><![CDATA[<p>On my previous article about cold calling, Stu Millett left an <a href="http://www.nicollet.net/2012/03/of-cold-calling-and-other-trolls/comment-page-1/#comment-291281">interesting comment</a>. The relevant parts are :</p>
<blockquote><p>If i want something i will go look for it, if i don’t find your product- tuff! If you go out of business, tuff because you had a rubbish business plan, specialised product with limited appeal or whatever- your product is not good enough!</p>
<p>[...]</p>
<p>Pull your head out your arse will you! Cold callers are the scum of the earth and so are their advocates! Retailers are scum too but at least i get the choice or opening the conversation or not!</p></blockquote>
<p>I wish to thank Stu for his kind words and interesting comments about my anatomy. But, more seriously, I sincerely wish my customers were like him. Wait, let me rephrase that. <strong>I wish all humans were like Stu Millett</strong>.</p>
<p>This is what we all expect humans to do when solving problems : research the issue, examine the solutions and pick the best one. If you&#8217;re not being picked, it <em>must</em> be because your product sucks.</p>
<p>Such an analysis is correct for <strong>wedding planners</strong>. Every year, there&#8217;s a crowd of young couples who never needed to plan a wedding before. The only course of action for them is to research possible options, which provides wedding planners with a constant flow of potential customers that they have to convince based on the merits of their product.</p>
<p>It does not apply, however, to <strong>hairdressers</strong>. When you set up shop, all the people in your area have already finished their search for a hairdresser. This is not a product issue : even if your skills and your pricing are a clear improvement over the competition, your potential customers are not looking for a hairdresser anymore, and so you will never have a chance to compete in the first place.</p>
<p>If a new hairdresser appeared in your town and offered better haircuts at a lower price, how long would it take you to notice ?</p>
<p>Your strategy is going to be entirely different based on whether you&#8217;re selling a wedding planner or hairdresser product. Wedding planners have to spend most of their resources on being easy to find and easy to compare. Hairdressers have to spend most of their resources telling their potential customers that there&#8217;s a new player on the field.</p>
<p>The worst possible mistake you could do here is this :</p>
<blockquote><p><em>«Our product is unique, there&#8217;s no entrenched competition, we are obviously wedding planners.»</em></p></blockquote>
<p>Let me make this clear : being a wedding planner or a hairdresser is not about what your product is, it&#8217;s about the pain it solves. If you&#8217;re solving a pain that a lot of people experience for the first time, then you&#8217;re a wedding planner. Otherwise, you&#8217;re a hairdresser.</p>
<p>And guess what ? I made that mistake. Our product makes group managers so awesome at managing groups, I thought, that most of our target market will agree we&#8217;re the best. So we designed a wedding planner release, and watched quietly as&#8230; nobody ever came.</p>
<p>Group managers are not idiots. They know they have group management problems, and they have already looked for solutions years ago. Most of the time, these solutions are contraptions made of mailing-lists, online forums, Microsoft Excel spreadsheets and random pieces of string ; they are frustrating to use and cause many problems of their own, from lost data to people not receiving important messages to privacy issues, but that&#8217;s not enough to cause group managers to start looking for other solutions.</p>
<p>In the words of Stu, is our product <em>«not good enough»</em> ? No. Every time we have shown our product to a potential customer, they have loved it, and they even told their friends about it. This is not a product problem. Then did we have a <em>«rubbish business plan»</em> ? We most certainly did!</p>
<p>Our real challenge is not to convince people we&#8217;re the best, but to tell as many people as possible that there&#8217;s a new hairdresser in town.</p>
<p>As I mentioned previously, there are three ways of doing that : word-of-mouth, advertising and direct contact. Depending on your target population, one of these solutions is going to be better than the others. Direct contact may be the scum of the earth, it may be extremely annoying to many people, but that doesn&#8217;t make it a bad marketing strategy.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.nicollet.net/2012/03/of-wedding-planners-and-hairdressers/feed/</wfw:commentRss>
		<slash:comments>2</slash:comments>
		</item>
		<item>
		<title>JavaScript RGB Password</title>
		<link>http://www.nicollet.net/2012/03/javascript-rgb-password/</link>
		<comments>http://www.nicollet.net/2012/03/javascript-rgb-password/#comments</comments>
		<pubDate>Wed, 07 Mar 2012 15:04:40 +0000</pubDate>
		<dc:creator>Victor Nicollet</dc:creator>
				<category><![CDATA[Random]]></category>

		<guid isPermaLink="false">http://www.nicollet.net/?p=2694</guid>
		<description><![CDATA[This (demo here) displays a fingerprint of your hidden password using three color boxes, so you can see if it is correct. My first reaction was «Nice, I wonder what my usual passwords look like.» My second reaction was «I should fork this and AJAX all the passwords to my server» Does that make me innately evil ?]]></description>
			<content:encoded><![CDATA[<p><a href="https://github.com/skattyadz/JavaScript-RGB-Password" target="_blank">This</a> (demo <a href="http://skattyadz.github.com/JavaScript-RGB-Password/index.html" target="_blank">here</a>) displays a fingerprint of your hidden password using three color boxes, so you can <em>see</em> if it is correct.</p>
<p>My first reaction was «Nice, I wonder what my usual passwords look like.» My second reaction was «I should fork this and AJAX all the passwords to my server»</p>
<p>Does that make me innately evil ?</p>
]]></content:encoded>
			<wfw:commentRss>http://www.nicollet.net/2012/03/javascript-rgb-password/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>To Job or Not To Job</title>
		<link>http://www.nicollet.net/2012/03/to-job-or-not-to-job/</link>
		<comments>http://www.nicollet.net/2012/03/to-job-or-not-to-job/#comments</comments>
		<pubDate>Wed, 07 Mar 2012 14:43:23 +0000</pubDate>
		<dc:creator>Victor Nicollet</dc:creator>
				<category><![CDATA[Strategy]]></category>
		<category><![CDATA[Marketing]]></category>
		<category><![CDATA[Productivity]]></category>
		<category><![CDATA[Start-Up]]></category>

		<guid isPermaLink="false">http://www.nicollet.net/?p=2686</guid>
		<description><![CDATA[p4bl0 wrote, almost one year ago, Startup or research ? The relevant part is: Now I&#8217;m a fourth year university student (which is the undergrad year in the US but the first of the two grad years before PhD in France) and I don&#8217;t know which one to chose: launch my startup or academic career? [...]]]></description>
			<content:encoded><![CDATA[<p>p4bl0 wrote, almost one year ago, <a href="http://shebang.ws/startup-or-research.html">Startup or research ?</a> The relevant part is:</p>
<blockquote><p><small>Now I&#8217;m a fourth year university student (which is the undergrad year in the US but the first of the two grad years before PhD in France) and I don&#8217;t know which one to chose: launch my startup or academic career?</small></p>
<p><small>Of course the easy and realistic answer to my question is: finish your studies, do a PhD, start an academic career and when your research brings you an awesome and marketable idea, launch your startup.</small></p>
<p><small>But that means maybe launching a startup almost ten years from now, at least. And I must admit that some times I want to live the startup adventure right now, without waiting. When I want that, I&#8217;m never stopped by missing startup ideas, I already had plenty of that. What&#8217;s missing is the courage to jump and go for it without knowing what happens if it fails, because I haven&#8217;t finished my studies yet. That&#8217;s an horrible feeling. We people of my generation, at least in France (Europe?), have a lot of pressure about that. We feel like any wrong move will lead us to life-long unemployment and misery. I&#8217;m of course exaggerating a little, but you get the idea.</small></p></blockquote>
<p>His blog does not allow comments, so I am going to answer his questions on my own blog [1].</p>
<p>Alone, humans have a lot of trouble merely surviving, let alone leading a modern life with its plentiful food, high-speed internet, health benefits, cell phones and MP3 music. <strong>Your main priority as a human being is to get help from other human beings.</strong> The most common way of doing this is by helping <em>them</em> in return for money, and use that money to buy help from others. Being an employee, a freelancer or an investor are three kinds of help you can offer, each with its own risks and rewards, but ultimately it does not matter.</p>
<p><strong>The single most important skill in modern society is convincing people to accept your help for a good fee</strong>. From my experience, young people in general and those with a technical expertise in particular, do not have this skill. They naturally seek out careers where this skill is not necessary: obtaining several degrees (which involves mostly their technical expertise, and makes it easier to convince people to accept their help) and settling on a job that is as stable as possible so they get a maximum bang for the proverbial buck they spent during the recruitment process. </p>
<p>The pressure you describe as &laquo;any wrong move [...] life-long unemployment&raquo; is a consequence of your lack of skill in getting money from people : you need to spend most of your time building up powerful arguments (good degrees, a brilliant yet <em>consensual</em> early career) to compensate for it. It is hardly surprising that any such argument you fail to build up feels like a setback for your future career.  </p>
<p>The secret is that this getting-money-from-people skill can be trained: try spending one day each week with a different recruitment officer, and after a while, you will start to get the hang of it. Once you&#8217;ve went through enough interviews that you feel you could get a soulless but high-paying job on a whim, you will feel a lot safer. </p>
<p>Another thing: this skill can be supplemented by things that are neither degrees nor traditional career moves. The very act of founding and sticking with a startup, even if it ultimately failed, is a strong selling point because it says a lot about your ability to function autonomously. Reputation, such as being a known speaker to trade conferences or writing an expert blog on a given topic, is also a great way to convince people. Networking means you can be on the receiving end of an &laquo;I know a guy who knows a guy&raquo; recommendation, and the act of stepping outside of your social comfort zone is in itself a refreshing activity.  </p>
<p>Obviously, having an original early career will make it hard for you to work as a corporate drone. Corporate drones are chosen for their blandness, predictability and lack of surprises, and startup founders are the opposite of all three. So you won&#8217;t get a job as a corporate drone. Boo hoo. But many companies, including mine, actually enjoy original profiles [2]. </p>
<p>But, and here&#8217;s the funny part: <strong>you can never build a successful startup if you don&#8217;t have mad getting-money-from-people skills</strong>. Building a working product is the easy part, especially for technical founders like us, but you won&#8217;t sell it, you won&#8217;t get investors to fund you, and you won&#8217;t convince the mythical &laquo;sales co-founder&raquo; to join your team. So, if you&#8217;re not ready to brush up on those skills, don&#8217;t even think of creating a startup. You may certainly join one that already has a competent evangelist on board, but there&#8217;s a high risk that it will feel like you&#8217;re working on someone else&#8217;s project. </p>
<p>Before I go, one final thing about startups. Your &laquo;what if I fail ?&raquo; makes absolutely no sense. Your startup will fail. Probably several times, in fact. The beauty of startups is that failure is not permanent: you&#8217;ve discovered one way that doesn&#8217;t work, so pivot the hell out of your business model and try another approach. As long as you keep working on it, there&#8217;s no definite point in time where your startup will be objectively and irrevocably dead. <strong>And that&#8217;s the hardest part about a startup: the only way it can die is if you kill it.</strong> [3] If you stop the &laquo;okay, one more try and then I give up&raquo; game and accept to live forever with the crushing suspicion that one more try would have made it work. </p>
<p><strong>This, in itself, is a lot more painful than the fear you won&#8217;t ever find a paying job again.</strong> </p>
<p><small>[1] and if you&#8217;re interested in meeting me to discuss this in person, there&#8217;s a nice Sushi place near Place d&#8217;Italie.<br />
[2] I still wouldn&#8217;t hire you, you blasphemous dynamic typing Racket freak <img src='http://www.nicollet.net/wp-includes/images/smilies/icon_wink.gif' alt=';-)' class='wp-smiley' /><br />
[3] So, when are Republicans going to outlaw startup abortion ? </small></p>
]]></content:encoded>
			<wfw:commentRss>http://www.nicollet.net/2012/03/to-job-or-not-to-job/feed/</wfw:commentRss>
		<slash:comments>7</slash:comments>
		</item>
		<item>
		<title>OCaml : improved CouchDB access.</title>
		<link>http://www.nicollet.net/2012/03/ocaml-improved-couchdb-access/</link>
		<comments>http://www.nicollet.net/2012/03/ocaml-improved-couchdb-access/#comments</comments>
		<pubDate>Wed, 07 Mar 2012 10:22:46 +0000</pubDate>
		<dc:creator>Victor Nicollet</dc:creator>
				<category><![CDATA[Functional]]></category>
		<category><![CDATA[Architecture]]></category>
		<category><![CDATA[CouchDB]]></category>
		<category><![CDATA[Design Patterns]]></category>
		<category><![CDATA[Objective Caml]]></category>
		<category><![CDATA[RunOrg]]></category>

		<guid isPermaLink="false">http://www.nicollet.net/?p=2678</guid>
		<description><![CDATA[My current project is written in OCaml and uses CouchDB for persistent storage. This article discusses our strategy for improving the performance of our database access layer. One of our heaviest database hitters is our « Notifications » dashboard : it contains several notifications such as « James Bond has written a message on the event Tommorow Never [...]]]></description>
			<content:encoded><![CDATA[<p>My current project is written in OCaml and uses CouchDB for persistent storage. This article discusses our strategy for improving the performance of our database access layer.</p>
<p>One of our heaviest database hitters is our « Notifications » dashboard : it contains several notifications such as « <strong>James Bond</strong> has written a message on the event <strong>Tommorow Never Dies</strong> by the <strong>MI5</strong> organization. » The data presented for each notification comes from several CouchDB documents : a notification document, a message document, an user-profile document, an user-profile-picture document, an event document and an organization document. On a typical dashboard, this represents around 120 documents. A naïve database access layer (one that performs one query per document) would take nearly half a second to extract all that information from the database, not counting the information needed to render the rest of the page.</p>
<p>The recommended <strong>CouchDB</strong> strategy for this situation is, I believe, a mess. First, all documents involved in rendering the notifications should be present in the same database, or at least a denormalized copy of their data should be. Then, the view that returns the notifications to be rendered should be designed to also contain the documents related to those notifications : the notification document contains the identifier of its dependencies, so it can <code>emit([doc.usr_id,doc.time],{_id,doc.author_id})</code> to include the user document in the view output. This has the side-effect of completely messing up paging, as it is no longer possible to just grab the first 20 notifications if every notification has a variable number of dependencies.</p>
<p>The traditional <strong>SQL</strong> strategy for this situation is arguably simpler : <code>INNER JOIN</code> all the required data, then <code>LEFT OUTER JOIN</code> the optional data, and let the ORM map all of that to actual notifications-and-dependencies. Still, it means that notifications cannot be encapsulated, because a single query should be able to get the necessary data for all notifications, so it should know how those notifications are represented.</p>
<p>Our project uses one CouchDB database for each document type. There&#8217;s a database that contains only notifications, a database that contains only user profiles, and so on. The application is responsible for bringing together the necessary data by performing GET queries against all the databases. For instance, the code that extracts the notification data from the database looks like this :</p>
<pre style="color: #000020; padding-left: 30px;"><span style="color: #200080; font-weight: bold;">let</span> render_event_message msg_id <span style="color: #308080;">=</span>
  <span style="color: #200080; font-weight: bold;">let</span> message <span style="color: #308080;">=</span> Message<span style="color: #008c00;">.</span>get msg_id <span style="color: #200080; font-weight: bold;">in</span>
  <span style="color: #200080; font-weight: bold;">let</span> author  <span style="color: #308080;">=</span> Profile<span style="color: #008c00;">.</span>get <span style="color: #308080;">(</span>message <span style="color: #308080;">#</span> author<span style="color: #308080;">)</span> <span style="color: #200080; font-weight: bold;">in</span>
  <span style="color: #200080; font-weight: bold;">let</span> picture <span style="color: #308080;">=</span> Picture<span style="color: #008c00;">.</span>get <span style="color: #308080;">(</span>author <span style="color: #308080;">#</span> picture<span style="color: #308080;">)</span> <span style="color: #200080; font-weight: bold;">in</span>
  <span style="color: #200080; font-weight: bold;">let</span> event   <span style="color: #308080;">=</span> Event<span style="color: #008c00;">.</span>get <span style="color: #308080;">(</span>message <span style="color: #308080;">#</span> event<span style="color: #308080;">)</span> <span style="color: #200080; font-weight: bold;">in</span>
  <span style="color: #200080; font-weight: bold;">let</span> org     <span style="color: #308080;">=</span> Organization<span style="color: #008c00;">.</span>get <span style="color: #308080;">(</span>event <span style="color: #308080;">#</span> org<span style="color: #308080;">)</span> <span style="color: #200080; font-weight: bold;">in</span>
  Html<span style="color: #008c00;">.</span>render_notification ~message ~author ~picture ~event ~org

<span style="color: #200080; font-weight: bold;">let</span> render_item <span style="color: #308080;">=</span> <span style="color: #200080; font-weight: bold;">function</span>
  <span style="color: #308080;">|</span> <span style="color: #308080;">`</span>EventMessage msg_id <span style="color: #308080;">-&gt;</span> render_event_message msg_id
  <span style="color: #308080;">|</span>  <span style="color: #308080;">...</span> <span style="color: #308080;">-&gt;</span> <span style="color: #308080;">...</span> 

<span style="color: #200080; font-weight: bold;">let</span> render usr_id <span style="color: #308080;">=</span>
  <span style="color: #200080; font-weight: bold;">let</span> items <span style="color: #308080;">=</span> Notification<span style="color: #008c00;">.</span>for_user usr_id <span style="color: #200080; font-weight: bold;">in</span>
  Html<span style="color: #008c00;">.</span>concat <span style="color: #308080;">(</span>List<span style="color: #008c00;">.</span>map render_item items<span style="color: #308080;">)</span></pre>
<p>This architecture has two main benefits. First, the segregation of different document types into separate databases makes it easier to split the load onto multiple servers should the need arise, and querying the documents by their identifier makes it easy to insert a simple key-value cache between the database and the application. Secondly, and I believe this is the most important benefit, the code structure is very straightforward, as it is written exactly like one would expect it to be written instead of bending all over for performance reasons, and adding a new kind of notification does not involve changing any existing code, merely adding entirely new code that can be safely encapsulated away in another module.</p>
<p>Obviously, if the above code performs one <code>HTTP GET</code> for every call to a <code>get</code> function, the performance will be disastrous. The solution is to use batching, which involves grouping several queries into a single HTTP request:</p>
<pre style="padding-left: 30px;">GET http://localhost:5984/db/_all_docs?include_docs=true&amp;keys=[1,2,3]</pre>
<p>This is three times as fast, but obtains the same data as:</p>
<pre style="padding-left: 30px;">GET http://localhost:5984/db/1
GET http://localhost:5984/db/2
GET http://localhost:5984/db/3</pre>
<p>All that remains to be done is to make sure the OCaml-CouchDB interface batches requests together. This is where we originally hit another snag : the application runs each <code>get</code> call in isolation, and it must return a value for execution to continue before it even knows what the next call will be. In order for batching to be possible, the application must be able to call several <code>get</code> functions in parallel, but without the design overhead of making the parallelization explicit.</p>
<p>The solution was to use a monad-based pre-emptive threading model, such as <a href="http://ocsigen.org/lwt/"><code>Lwt</code></a> — the one we use is called <code>Ohm</code> and has several key differences to <code>Lwt</code>, but the underlying thread principles are the same.</p>
<p>When using <code>Ohm</code>, one manipulates queries instead of values. For instance, <code>Profile.get id</code> is not the profile with identifier <code>id</code>, but rather the query that fetches the profile with identifier <code>id</code>. What this means is that, instead of returning the HTML of the page to be displayed in response to a request, <strong>every RunOrg request handler returns a database query that returns that HTML</strong>. The evaluation engine then evaluates that query, optimizing it on the fly.</p>
<p>The most frequent operation performed on queries is deciding what will happen to the value returned by the query. For instance, to return the picture of an author, one binds a secondary query (get the picture) to a primary query (get the author):</p>
<pre style="color: #000020; padding-left: 30px;">Run<span style="color: #008c00;">.</span>bind
  <span style="color: #308080;">(</span><span style="color: #200080; font-weight: bold;">fun</span> author <span style="color: #308080;">-&gt;</span> Picture<span style="color: #008c00;">.</span>get <span style="color: #308080;">(</span>author <span style="color: #308080;">#</span> picture<span style="color: #308080;">)</span><span style="color: #308080;">)</span>
  <span style="color: #308080;">(</span>Author<span style="color: #008c00;">.</span>get author_id<span style="color: #308080;">)</span></pre>
<p>In order to keep things readable, the above is equivalent to :</p>
<pre style="color: #000020; padding-left: 30px"><span style="color: #200080; font-weight: bold;">let</span><span style="color: #308080;">!</span> author <span style="color: #308080;">=</span> ohm $ Author<span style="color: #008c00;">.</span>get author_id <span style="color: #200080; font-weight: bold;">in</span>
Picture<span style="color: #008c00;">.</span>get <span style="color: #308080;">(</span>author <span style="color: #308080;">#</span> picture<span style="color: #308080;">)</span></pre>
<p>The second most frequent operation is implicit parallelization, by performing a query for every element of a list, using <code>Run.list_map</code> instead of <code>List.map</code>. The query optimizer will notice this, and will attempt to run all those queries in parallel.</p>
<p>The syntax extension makes the query-based code look very similar to the natural code :</p>
<pre style='color:#000020;'><span style='color:#200080; font-weight:bold; '>let</span> render_event_message msg_id <span style='color:#308080; '>=</span>
  <span style='color:#200080; font-weight:bold; '>let</span><span style='color:#308080; '>!</span> message <span style='color:#308080; '>=</span> ohm $ Message<span style='color:#008c00; '>.</span>get msg_id <span style='color:#200080; font-weight:bold; '>in</span>
  <span style='color:#200080; font-weight:bold; '>let</span><span style='color:#308080; '>!</span> author  <span style='color:#308080; '>=</span> ohm $ Profile<span style='color:#008c00; '>.</span>get <span style='color:#308080; '>(</span>message <span style='color:#308080; '>#</span> author<span style='color:#308080; '>)</span> <span style='color:#200080; font-weight:bold; '>in</span>
  <span style='color:#200080; font-weight:bold; '>let</span><span style='color:#308080; '>!</span> picture <span style='color:#308080; '>=</span> ohm $ Picture<span style='color:#008c00; '>.</span>get <span style='color:#308080; '>(</span>author <span style='color:#308080; '>#</span> picture<span style='color:#308080; '>)</span> <span style='color:#200080; font-weight:bold; '>in</span>
  <span style='color:#200080; font-weight:bold; '>let</span><span style='color:#308080; '>!</span> event   <span style='color:#308080; '>=</span> ohm $ Event<span style='color:#008c00; '>.</span>get <span style='color:#308080; '>(</span>message <span style='color:#308080; '>#</span> event<span style='color:#308080; '>)</span> <span style='color:#200080; font-weight:bold; '>in</span>
  <span style='color:#200080; font-weight:bold; '>let</span><span style='color:#308080; '>!</span> org     <span style='color:#308080; '>=</span> ohm $ Organization<span style='color:#008c00; '>.</span>get <span style='color:#308080; '>(</span>event <span style='color:#308080; '>#</span> org<span style='color:#308080; '>)</span> <span style='color:#200080; font-weight:bold; '>in</span>
  return $ Html<span style='color:#008c00; '>.</span>render_notification ~message ~author ~picture ~event ~org

<span style='color:#200080; font-weight:bold; '>let</span> render_item <span style='color:#308080; '>=</span> <span style='color:#200080; font-weight:bold; '>function</span>
  <span style='color:#308080; '>|</span> <span style='color:#308080; '>`</span>EventMessage msg_id <span style='color:#308080; '>-></span> render_event_message msg_id
  <span style='color:#308080; '>|</span>  <span style='color:#308080; '>...</span> <span style='color:#308080; '>-></span> <span style='color:#308080; '>...</span> 

<span style='color:#200080; font-weight:bold; '>let</span> render () <span style='color:#308080; '>=</span>
  <span style='color:#200080; font-weight:bold; '>let</span><span style='color:#308080; '>!</span> usr_id    <span style='color:#308080; '>=</span> ohmctx (#user) <span style='color:#200080; font-weight:bold; '>in</span>
  <span style='color:#200080; font-weight:bold; '>let</span><span style='color:#308080; '>!</span> items     <span style='color:#308080; '>=</span> ohm $ Notification<span style='color:#008c00; '>.</span>for_user usr_id <span style='color:#200080; font-weight:bold; '>in</span>
  <span style='color:#200080; font-weight:bold; '>let</span><span style='color:#308080; '>!</span> html_list <span style='color:#308080; '>=</span> ohm $ Run<span style='color:#008c00; '>.</span>list_map render_item items <span style='color:#200080; font-weight:bold; '>in</span>
  return $ Html<span style='color:#008c00; '>.</span>concat html_list
</pre>
<p>The benefits of the query optimizer include :</p>
<ol>
<li>The above 120 queries are reduced to around 12 queries, most of them batches. It&#8217;s not perfect &mdash; manual optimization could have brought this down to 8 queries &mdash; but it&#8217;s quite good for an approach that does not change the structure of the code. </li>
<li>Batch requests to different databases can be performed in parallel.</li>
<li>The optimizer also caches values that are read from the database, which is quite useful for frequently-accessed values : a typical user receives most notifications from only a handful of organizations.</li>
</ol>
]]></content:encoded>
			<wfw:commentRss>http://www.nicollet.net/2012/03/ocaml-improved-couchdb-access/feed/</wfw:commentRss>
		<slash:comments>3</slash:comments>
		</item>
		<item>
		<title>Of Cold Calling and Other Trolls</title>
		<link>http://www.nicollet.net/2012/03/of-cold-calling-and-other-trolls/</link>
		<comments>http://www.nicollet.net/2012/03/of-cold-calling-and-other-trolls/#comments</comments>
		<pubDate>Thu, 01 Mar 2012 01:05:19 +0000</pubDate>
		<dc:creator>Victor Nicollet</dc:creator>
				<category><![CDATA[Strategy]]></category>
		<category><![CDATA[Cold-Calls]]></category>
		<category><![CDATA[Marketing]]></category>
		<category><![CDATA[Spam]]></category>
		<category><![CDATA[Start-Up]]></category>

		<guid isPermaLink="false">http://www.nicollet.net/?p=2676</guid>
		<description><![CDATA[Alex Payne wrote a piece about How Not To Sell Software in 2012. Most of the things he says are quite sound and make perfect sense. A little gem caught my eye, though : This should go without saying, but don’t cold call or spam me. If your product is good and meets my needs, [...]]]></description>
			<content:encoded><![CDATA[<p>Alex Payne wrote a piece about <a href="http://al3x.net/2012/02/29/how-not-to-sell-software-in-2012.html" target="_blank">How Not To Sell Software in 2012</a>. Most of the things he says are quite sound and make perfect sense. A little gem caught my eye, though :</p>
<blockquote><p>This should go without saying, but don’t cold call or spam me. If your product is good and meets my needs, I promise that I’ll find out about it.</p></blockquote>
<p>I call bullshit on this one. Not the « no cold calls or spam » part, of course (those are an absolute pain) but rather the « I will find it » promise.</p>
<p><strong>You will not find my product &#8230;</strong></p>
<p>Because, maybe my product is solving a need that you don&#8217;t know you have. Perhaps it&#8217;s a pain that you have come to accept as a natural part of life, and you wouldn&#8217;t expect a solution to exist. If you already have a working thermostat in your house, how likely are you to search for a better one — and discover <a href="http://www.nest.com/" target="_blank">that Nest solves your user interface pains</a> ?</p>
<p>Or maybe your needs may look vaguely similar to a problem you have solved in the past, so you will use the same solution as before instead of doing a brand new search for new solutions. You need to split expenses for a party, and you know a Google Docs form would solve the problem, so you don&#8217;t bother looking for anything else and never discover <a href="http://splitwise.com/" target="_blank">more adapted solutions, such as Splitwise</a>.</p>
<p><strong>&#8230; so I need to reach you. </strong></p>
<p>There are many ways of doing that — ads, social marketing, press releases, viral features, cold calling — and depending on the product and the target audience, some of them may work better than others. Yes, it&#8217;s possible for cold calling or mass e-mailing to achieve better results than all other techniques combined.</p>
<p>As surprising as it may seem, my startup has achieved the best results by calling or e-mailing people directly: we reached more people, we had a better conversion rate, and we had higher profits.</p>
<p><strong>Am I suggesting cold calls or spam?</strong></p>
<p>Kind of. The situation is far from black-and-white.</p>
<p>At the white end of the continuum, I know with perfect accuracy whether my product meets your needs. Maybe you posted about it on your blog, or mentioned it at a conference, or one of your friends tweeted about it. I can call you and say « Sir, I&#8217;ve noticed that you are looking for a Frobnicator, and we happen to be the only Frobnicator providers in your area. » and to you, this will not feel like a cold call, it will feel like someone paying attention to you.</p>
<p>At the black end of the continuum, I have no idea who you are or what you want. I can call you and say « Insert name here, would you like to purchase life insurance for your pet goldfish? » and your pet goldfish died last week and you burst into tears on the phone and curse me and my kin for seven generations.</p>
<p>The question is, where do we draw the line? How qualified do your leads need to be before you contact them directly? And if the leads are qualified enough, why are we not calling them?</p>
]]></content:encoded>
			<wfw:commentRss>http://www.nicollet.net/2012/03/of-cold-calling-and-other-trolls/feed/</wfw:commentRss>
		<slash:comments>2</slash:comments>
		</item>
		<item>
		<title>Blame The Machine</title>
		<link>http://www.nicollet.net/2012/02/blame-the-machine/</link>
		<comments>http://www.nicollet.net/2012/02/blame-the-machine/#comments</comments>
		<pubDate>Tue, 28 Feb 2012 17:13:24 +0000</pubDate>
		<dc:creator>Victor Nicollet</dc:creator>
				<category><![CDATA[People]]></category>
		<category><![CDATA[Design]]></category>
		<category><![CDATA[Psychology]]></category>
		<category><![CDATA[RunOrg]]></category>
		<category><![CDATA[Start-Up]]></category>
		<category><![CDATA[Strategy]]></category>

		<guid isPermaLink="false">http://www.nicollet.net/?p=2674</guid>
		<description><![CDATA[Ten minutes ago, I was using one of those automatic checkout machines in a nearby supermarket. For those of you who wonder how I could be back home and typing a blog article within ten minutes of leaving a supermarket, remember that us Parisiens have supermarkets within walking distance of our downtown homes. But I [...]]]></description>
			<content:encoded><![CDATA[<p>Ten minutes ago, I was using one of those automatic checkout machines in a nearby supermarket. For those of you who wonder how I could be back home and typing a blog article within ten minutes of leaving a supermarket, remember that us <em>Parisiens</em> have supermarkets within walking distance of our downtown homes. But I digress. An interesting thing happened while I was checking out my purchases : a woman using the checkout machine next to mine had trouble scanning the barcode on a piece of broccoli, because the laser scanner was confused by its odd shape.</p>
<p>She called a store employee for help, explained the problem and <em>apologized for not being able to use the machine correctly</em>.</p>
<p>My first thought was « Why apologize ? This is clearly a <em>technical </em>problem, the machines should be able to handle broccoli correctly ! Blame the machines or the engineers who invented them ! »</p>
<p>Then, one of the other voices in my head whispered to me « Oh look, you&#8217;re thinking like a product designer ! » and that voice was indeed quite right : I had spent the day working on some product design issues for my startup, and I was deep in the « Never blame users. Always blame the machine. » mindset that comes with it.</p>
<p>Had I spent the day writing code, I would have reacted exactly like that woman had — well, perhaps instead of calling for help I would have tried to debug the issue myself, but I would have still felt deserving of some kind of karmic blame for not being able to scan a piece of broccoli. <em>How much of an idiot do you have to be to fail to scan a piece of broccoli ?</em></p>
<p>The first rule of programming is that <em>The Machine Is Always Right</em>. If something wrong happens, you messed up. You made a typo, left in a logic bug, failed to take an edge case into account, or had any other kind of brain fart. The chances of cosmic rays corrupting your RAM or compiler bugs mangling your algorithms are exceedingly slim. <strong>The reflexive reaction to any unexpected program behavior is to ask yourself « Where did I go wrong this time ? »</strong></p>
<p>When improving a software product, the opposite mindset is necessary : if the program surprises the user, then the program is wrong. The chances of a complete idiot expecing your accounting package to play music are exceedingly slim.</p>
<p>So, to design software you need to be in blame-the-machine mode, and to develop software you need to be in blame-the-human mode. If you&#8217;re both the designer and the developer, you had better be good at context-switching those two modes.</p>
<p>I patted myself on the back for my awesome context-switching abilities. I swear, I have a brain lobe entirely devoted to patting myself on the back.</p>
<p>Then I looked back on all the team meetings I had at RunOrg and examined the evidence in light of this blame-assignment mode, with alarming conclusions : it turns out that the context switching speed is not that good, and the speed depends on the direction. All you need to do to get me from blame-the-machine to blame-the-human is mention an interesting technical problem and hint that a solution might be needed, maybe, someday. Then I will put on my developer hat, reach for the caffeine and start thinking of possible solutions.</p>
<p>However, my non-technical co-founders are permanently in blame-the-program mode. If I am in blame-the-human mode and they suggest a program change, my thought process is as follows :</p>
<ul>
<li>FOOLISH MORTALS, ARE YOU SAYING MY WORK IS CRAP ?</li>
<li>Wait. Stay calm. I&#8217;m not my work. I should take criticism like an adult.</li>
<li>Ok, I understand what you expect, but that&#8217;s not how it works.</li>
<li>Wait. They know that&#8217;s not how it works. What do they mean, then ?</li>
<li>Oh, you mean users expect that to happen ? They&#8217;re wrong.</li>
<li>Wait. Customers are always right.</li>
</ul>
<p>&#8230; and then I snap back to blame-the-program mode and all is well. Depending on how diplomatic I am feeling at the moment, one or more of the above steps may be played out silently in my head instead of being spoken out loud to my co-founders.</p>
<p>Does anyone else get these context-switches wrong, too ?</p>
]]></content:encoded>
			<wfw:commentRss>http://www.nicollet.net/2012/02/blame-the-machine/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Dear Creation Scientists</title>
		<link>http://www.nicollet.net/2012/02/dear-creation-scientists/</link>
		<comments>http://www.nicollet.net/2012/02/dear-creation-scientists/#comments</comments>
		<pubDate>Mon, 20 Feb 2012 14:47:01 +0000</pubDate>
		<dc:creator>Victor Nicollet</dc:creator>
				<category><![CDATA[Random]]></category>
		<category><![CDATA[Creation Science]]></category>
		<category><![CDATA[Useless]]></category>

		<guid isPermaLink="false">http://www.nicollet.net/?p=2672</guid>
		<description><![CDATA[I understand that efforts to add Creation Science or Intelligent Design to the curriculum of U.S. schools have been repeatedly thwarted in recent years. You blamed the atheists and the God-haters, the heathens and the hypocrites. For the sake of discussion, let us assume that truth may only be found within your version of the [...]]]></description>
			<content:encoded><![CDATA[<p>I understand that efforts to add Creation Science or Intelligent Design to the curriculum of U.S. schools have been repeatedly thwarted in recent years. You blamed the atheists and the God-haters, the heathens and the hypocrites.</p>
<p>For the sake of discussion, let us assume that truth may only be found within your version of the Holy Bible — however unfair it may be to members of other religions — including, of course, that God does indeed exist as described therein.</p>
<p>As you might know, the Genesis describes how the Lord created everything. The most well-known quote from the Holy Bible is probably this :</p>
<blockquote><p>And God said, Let there be light: and there was light.</p></blockquote>
<p>This answers the question « Why is there light ? » that, quite shockingly, secular science never considered interesting enough to ponder. Indeed, secular science instead concentrates on more empirical questions such as « How does light behave ? » — answered in part by the laws of Maxwell — or « Is light a special case of a more general phenomenon ? » — which is indeed the case, as visible light is made of the same <em>stuff</em> as X-rays or radio waves.</p>
<p>In a sense, secular scientists do have a point : questions such as « How does it behave ? » give us the ability to predict the behavior of things, which is essential in order to build tools or technology. Understanding the wave-like behaviour of light, for instance, is essential to building lasers, which in turn enable us to have DVD players and eye surgery. Questions such as « Why does it exist ? » have no such practical application, unless the answer covers both <em>Why</em> and <em>How</em>.</p>
<p>As such, « Light exists because God created it » is of no practical or scientific use — it is, by definition, a small bit of trivia : true, but useless for anything but the sake of knowledge. Then again, knowledge begets knowledge : if the information contained within the Holy Bible is true, why are we not using it as a starting point for increasing our knowledge of the universe ?</p>
<p>For instance, we know from the Bible that God <em>said</em>, Let there be light.</p>
<p><strong>What language did He speak</strong> <strong>?</strong> Was it one of the early semitic languages, such as those that transmitted the early versions of the Bible through oral tradition ? If that were the case, linguists worldwide would be thrilled to learn that a language from the afro-asiatic family existed before humans were around to speak it. Or was it something else entirely ?</p>
<p>In that case, <strong>what were the exact words He used ?</strong> Could we use them to infer the vocabulary and grammar of that language ? How would it relate to modern or ancient languages ?</p>
<p>We know that the words carried the power to create light, but <strong>was the power within the words or did it come from God ?</strong> If it was within the words, could we harness words of power ourselves, perhaps by emulating the anatomical characteristics God used to speak them ? If not, why were words necessary and what does this tell us about the interaction between words and power ?</p>
<p>These are just elementary questions related to a single sentence in the Holy Bible, and they are not directly answered therein. Finding the answers would greatly further our understanding of our word, and have great practical applications. Why are we not working on these questions ?</p>
<p><strong>Because we can&#8217;t.</strong></p>
<p>All the supernatural aspects of the Bible, including God, are out of reach of our tools and experiments. Any attempt to test, observe or replicate supernatural events mentioned in the bible : either the event was observed and could be explained with purely natural reasons, or it could not be observed.</p>
<p>I fear that God may be beyond the reach of our scientific methodology because He does not wish to be a subject of research. In that case, it would be wise to keep God out of the science classroom, because He does not wish to be there.</p>
<p>I suspect, however, that science has actually always observed God and His actions on our world, because all happens in the world through His will. This would mean that any scientific observations, laws and theories are merely boring and secular <em>descriptions</em> of the Lord&#8217;s actions. But then, what happens when the Words of God and the Actions of God appear to be contradictory ?</p>
<p>It is because our <em>human</em> interpretation of His Words and our <em>human</em> observations of His Actions do not match. Either the man reading the Bible made a mistake, or the man studying the world made a mistake. And both have happened in the past. We should act in this matter as we act in all other cases of contradiction : ask both men to explain their work, so that we may check it for them.</p>
<p>It is sinful to presume that your interpretation of God&#8217;s Words is true, for you are but a man. And to say « It is written in the Bible ! » is a lie, you should instead quote the Bible and meditate differing interpretations from your peers.</p>
<p><small>Then again, maybe science has never observed God simply because God does not exist.</small></p>
]]></content:encoded>
			<wfw:commentRss>http://www.nicollet.net/2012/02/dear-creation-scientists/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>js1k 2012 : Love</title>
		<link>http://www.nicollet.net/2012/02/js1k-2012-love/</link>
		<comments>http://www.nicollet.net/2012/02/js1k-2012-love/#comments</comments>
		<pubDate>Sun, 19 Feb 2012 19:25:21 +0000</pubDate>
		<dc:creator>Victor Nicollet</dc:creator>
				<category><![CDATA[Functional]]></category>
		<category><![CDATA[Contest]]></category>
		<category><![CDATA[Javascript]]></category>
		<category><![CDATA[js1k]]></category>
		<category><![CDATA[Useless]]></category>

		<guid isPermaLink="false">http://www.nicollet.net/?p=2668</guid>
		<description><![CDATA[js1k is a competition that runs once or twice a year. The point is to write a piece of JavaScript that is shorter than 1024 characters (bytes, actually, so mind your encoding) and still manages to do something interesting and somehow related to the subject of the competition. The current iteration of the competition has [...]]]></description>
			<content:encoded><![CDATA[<p><a href="http://js1k.com/" target="_blank">js1k</a> is a competition that runs once or twice a year. The point is to write a piece of JavaScript that is shorter than 1024 characters (<em>bytes</em>, actually, so mind your encoding) and still manages to do something interesting and somehow related to the subject of the competition.</p>
<p>The current iteration of the competition has the subject «Love» which, as you might imagine, led to many heart-rendering, pink-tinted applications being submitted.</p>
<p>My own submission is «<a href="http://www.nicollet.net/files/js1k-2012/" target="_blank">Why am I single ?</a>» :</p>
<p><a href="http://www.nicollet.net/files/js1k-2012/"><img class="aligncenter size-full wp-image-2669" title="js1k-2012" src="http://www.nicollet.net/wp-content/uploads/2012/02/js1k-2012.png" alt="" width="480" height="480" /></a></p>
<p>It performs a simulation of a 50%-male, 50%-female population (entirely heterosexual — I couldn&#8217;t fit anything else in those 1k bytes) of things that bounce around a room and enter variable-duration relationships whenever opposite gender couples collide. A pie chart in the top left corner displays the current proportions of single males and females.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.nicollet.net/2012/02/js1k-2012-love/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
	</channel>
</rss>

