<?xml version="1.0" encoding="UTF-8"?>
<?xml-stylesheet type="text/xsl" media="screen" href="/~d/styles/rss2full.xsl"?><?xml-stylesheet type="text/css" media="screen" href="http://feeds.feedburner.com/~d/styles/itemcontent.css"?><rss 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:feedburner="http://rssnamespace.org/feedburner/ext/1.0" version="2.0">
  <channel>
    <title>Paul Bohm's Blog</title>
    
    <link>http://paulbohm.com</link>
    <description>So much entropy, so little time!</description>
    <pubDate>Fri, 12 Oct 2012 15:00:00 -0700</pubDate>
    <generator>The mighty Wintersmith</generator>
    <language>en</language>
    <atom10:link xmlns:atom10="http://www.w3.org/2005/Atom" rel="self" type="application/rss+xml" href="http://feeds.feedburner.com/PaulBohm" /><feedburner:info uri="paulbohm" /><atom10:link xmlns:atom10="http://www.w3.org/2005/Atom" rel="hub" href="http://pubsubhubbub.appspot.com/" /><item>
      <title>Information Theory: Obstacles To True Artificial Intelligence</title>
      <link>http://feedproxy.google.com/~r/PaulBohm/~3/34vhexvNTBU/</link>
      <pubDate>Fri, 12 Oct 2012 15:00:00 -0700</pubDate>
      <guid isPermaLink="false">http://paulbohm.com/articles/artificial-intelligence-obstacles-information-theory/</guid>
      <author>enki@bbq.io (Paul Bohm)</author>
      <description>&lt;p&gt;With the Singularity Summit coming to San Francisco tomorrow, a lot of people are wondering about how close we are to successfully implementing Artificial Intelligence.

&lt;/p&gt;
&lt;div style="margin-left: 200px; margin-top: 20px;"&gt;
    &lt;img src="http://paulbohm.com/articles/artificial-intelligence-obstacles-information-theory/0_400-Kurzweil_Exponential_growth.png" alt="image"&gt;
&lt;/div&gt;

&lt;p&gt;Probably you&amp;apos;ve seen a graph like the above before. Computers are getting faster. Does this mean we&amp;apos;re getting closer to true Artificial Intelligence? Not necessarily.

&lt;/p&gt;
&lt;p&gt;As I&amp;apos;ll show in the following paragraphs, both Artificial Intelligence and the less ambitious Machine Learning (ML) aren&amp;apos;t computationally but data bounded. This has profound implications for viable avenues for research and development.

&lt;/p&gt;
&lt;p&gt;&lt;span class="more"&gt;&lt;/span&gt;

&lt;/p&gt;
&lt;p&gt;Generally speaking, the goal of AI and ML research is to acquire a digitally executable copy of a model behavior. The specific model behavior desired can range from classifying (&amp;quot;are there humans in the picture?&amp;quot;, &amp;quot;ixs this news article about economics?&amp;quot;) to predicting values (&amp;quot;how much does a house in this neighborhood sell for?&amp;quot;), to making conversation like a human would (&amp;quot;a chatbot&amp;quot;).

&lt;/p&gt;
&lt;p&gt;Any such observable behavior can be mathematically described as a mapping from a set of finite input sequences to corresponding outputs, or in other words: a function. And any such function can be translated into a corresponding computer program.

&lt;/p&gt;
&lt;p&gt;That is, we can represent the model we want to learn (&amp;quot;respond to lines of chat messages like a human would&amp;quot; in the chat bot case) as a function, and then in turn said function as a computer program.

&lt;/p&gt;
&lt;p&gt;The length of the shortest computer program that provides a mapping equivalent to the model function, can be seen as a measure of the complexity of the model. (For example the shortest program that performs addition on input numbers obviously is shorter - that is, has lower complexity - than the shortest program that parses human acoustic speech)

&lt;/p&gt;
&lt;p&gt;Now, the goal of machine learning techniques often is seen as helping us acquire a computer program equivalent to the model we want to learn. In general, this feat is performed like this:
A human writes a machine learning program L, which given training data T, generates desired program M.

&lt;/p&gt;
&lt;p&gt;The sleight of hand, in case you haven&amp;apos;t noticed, is that instead of writing M directly, the human has simply decided to write L which writes M for him. The problem is that if the shortest L is shorter than the shortest M, we&amp;apos;re inevitably missing information - there&amp;apos;s many many different candidate M we could be writing - but which one specifically are we supposed to write? 

&lt;/p&gt;
&lt;p&gt;We need to acquire this information from somewhere, and the only place other than L we can get this information from is our training data T. T is a list of examples of M in action. This could be a data set of (houses, their location, and their sales price), or a list of pictures and whether they contain a human face, or log files of human chatroom conversation. The problem is that learning from examples without prior knowledge is notoriously difficult - to learn complex concepts we need an impractical amount of examples. (as proven in [1])

&lt;/p&gt;
&lt;p&gt;So let us recap here for a second: All the information that goes into producing M is a generator/machine learning function L (written by a human), and training data T (acquired through interaction with humans). The information encoded in L combined with the information extracted from T needs to at least match or exceed the information encoded in M. The only reasonable way to extract information from T is to encode information about its underlying pattern in L. That is: &lt;em&gt;All&lt;/em&gt; the work needs to be done by humans.

&lt;/p&gt;
&lt;p&gt;We face the following conundrum: To get a better model, we either need make the learning algorithm more complex/write more code (which is human work), or we need to gather more or better sample data (which requires human work as well). The complexity of the model M that we want to learn can&amp;apos;t be essentially reduced - it needs to be captured in a combination of program and training data.

&lt;/p&gt;
&lt;p&gt;Since these are information theoretical limitations, Moore&amp;apos;s law and faster computers do not help. Even a computationally unbounded supercomputer would not be able to break the laws of information theory. &lt;em&gt;Attempts to reduce the necessary work essentially by sophisticated machine learning methods can be compared with attempting to build a perpetuum mobile.&lt;/em&gt;

&lt;/p&gt;
&lt;p&gt;So how do we improve computer models? More often than not the answer is through more and better data. Humans often have knowledge about underlying relationships between data, which helps them write better M and L. But for problems where they themselves haven&amp;apos;t understood the underlying relationships, they are no help. Since &lt;em&gt;the contribution of machine learning techniques to knowledge acquisition tends asymptotically to zero from a viewpoint of algorithmic information theory&lt;/em&gt;, more or better data is needed.

&lt;/p&gt;
&lt;p&gt;Interestingly enough economists Mises and Hayek have discovered the necessity of data to decision making already in the 1920s in their treatises on the Economic Calculation Problem. Since markets force humans to interact, they reveal preferences through interaction. When removing the market, this preference data is never revealed. Thus the market is required to acquire the extract the data needed to do economic planning from people&amp;apos;s heads.
In a similar fashion the problem of AI needs to be approached with additional data. 

&lt;/p&gt;
&lt;p&gt;Either this data is directly extracted from a physical medium we know it to be encoded in (e.g. by scanning our body and brain), or we need to find ways to scale the amount of relevant data available to machine learning systems significantly.

&lt;/p&gt;
&lt;p&gt;A second way besides scanning would be simulation: If we&amp;apos;re fundamentally data limited, and we can&amp;apos;t acquire sufficient data from the physical world through adding sensors or collecting data, maybe we can make computers collect data from world&amp;apos;s of their own creation. In the simple case this would amount to computers playing games of parametrizable difficulty similar to Chess or Go against each other. It&amp;apos;s far easier to specify a game like Go than it is to fully understand it - so in theory we can let the computers explore a search space that provides its own data. The problem is that exploration of such a kind might over time approximate the complexity of a full particle simulation. It&amp;apos;s not clear how deep we&amp;apos;d have to search to find the kind of consciousness patterns we&amp;apos;re looking for. But we need to keep in mind that we might need to simulate an entire universe to find the patterns we are looking for.

&lt;/p&gt;
&lt;p&gt;Embodiment is the remaining third way, and one that had been chosen for humanity long before it made its own decisions. Here new bodies come loaded with both sensors and computational power. Since structurally there&amp;apos;s no clear boundary between the processes of cognition and living, this could be considered part of an efficient search process for consciousness throughout the entire universe. In this argument, our physical embodiment is actually a fairly efficient vessel, and humanity is more likely than not to become a first super-intelligence. The internet then amounts to said super-intelligence performing brain-surgery on itself, because changing the plumbing makes it capable of acting in a smarter more coordinated fashion, and those of us who develop better information routing technology simply continue the procedure.

&lt;/p&gt;
&lt;p&gt;In Summary: The real problem of creating good AI is data and complexity, not computational power. The information theoretical bounds described above apply equally to computers of finite and infinite computational power. 

&lt;/p&gt;
&lt;p&gt;In essence, an equivalent question to &amp;quot;can we learn intelligence by observing intelligent behavior&amp;quot; is: Can we learn about the structure of living organisms simply by looking at recorded DNA data. If so, how many DNA samples do we need? A lot. If we could examine the physical organism directly instead, we&amp;apos;d learn a lot faster.

&lt;/p&gt;
&lt;p&gt;It&amp;apos;ll be interesting to see where all this goes.

&lt;/p&gt;
&lt;p&gt;Post-Script: I&amp;apos;ve omitted formality in my arguments for the sake of reaching an audience. For a formal argument please see &lt;a href="http://paulbohm.com/pdf/general_limitations.pdf"&gt;A. Hoffmann, ECAI 1990&lt;/a&gt; and &lt;a href="http://paulbohm.com/pdf/can_machines_think.pdf"&gt;A. Hoffmann, Minds &amp;amp; Machines 2010&lt;/a&gt;, whom I&amp;apos;ve often simply paraphrased and in two cases quoted verbatim.

&lt;/p&gt;
&lt;p&gt;[1] &lt;a href="http://paulbohm.com/pdf/10.1.1.76.5543.pdf"&gt;A Ehrenfeucht, D Haussler, M Kearns… 1989 - A general lower bound on the number of examples needed for learning&lt;/a&gt;

&lt;/p&gt;&lt;img src="http://feeds.feedburner.com/~r/PaulBohm/~4/34vhexvNTBU" height="1" width="1"/&gt;</description>
    <feedburner:origLink>http://paulbohm.com/articles/artificial-intelligence-obstacles-information-theory/</feedburner:origLink></item>
    <item>
      <title>Analyzing my Facebook Graph</title>
      <link>http://feedproxy.google.com/~r/PaulBohm/~3/Ge4Vn_s0UB4/</link>
      <pubDate>Wed, 22 Feb 2012 15:00:00 -0800</pubDate>
      <guid isPermaLink="false">http://paulbohm.com/articles/analyzing-my-facebook-graph/</guid>
      <author>enki@bbq.io (Paul Bohm)</author>
      <description>&lt;div style="float:left; margin-right: 5px; margin-top: 20px"&gt;
&lt;img src="http://paulbohm.com/articles/analyzing-my-facebook-graph/260_0-socgraph.jpg" alt="image"&gt;
&lt;/div&gt;

&lt;p&gt;Tonight I did a manual graph analysis of my Facebook network: Turns out among nodes with a degree of at least 13, there exist three clearly distinct subgraphs. They probably are most appropriately named The Institute, YCombinator and Future Camp.

&lt;/p&gt;
&lt;p&gt;Centrality (&amp;quot;who is connected to almost everyone else in the subgraph&amp;quot;) seems to follow different rules in all three subgraphs. E.g. in the YC graph very successful founders seem to be more connected than less successful founders, and those in turn are generally more connected than employees.
&lt;span class="more"&gt;&lt;/span&gt;


&lt;/p&gt;
&lt;p&gt;In the two other subgraphs centrality seems to be more socially motivated. Intuitively I feel that it&amp;apos;s different rules that govern centrality in The Institute and Future Camp, but I don&amp;apos;t understand it well enough to even attempt to put in words. It&amp;apos;s clear that seeing only part of the graph (my perspective) adds a lot of noise that makes this data unreliable.

&lt;/p&gt;
&lt;p&gt;Finally, what I noticed is that I am somewhat fascinated with people who have high in-betweenness. That is, people that are connected to two or more subgraphs that I&amp;apos;m also connected to, but don&amp;apos;t necessarily have a high number of total connections. I don&amp;apos;t know exactly why, but probably because they are exposed to a wider range of ideas? 

&lt;/p&gt;
&lt;p&gt;In conclusion, exploring this data was fun. I don&amp;apos;t think I&amp;apos;m any wiser yet, but I&amp;apos;d certainly like to explore more how centrality and in-betweenness are correlated (first impression: negatively), and if there&amp;apos;s anything else I can learn from this.
&lt;/p&gt;&lt;img src="http://feeds.feedburner.com/~r/PaulBohm/~4/Ge4Vn_s0UB4" height="1" width="1"/&gt;</description>
    <feedburner:origLink>http://paulbohm.com/articles/analyzing-my-facebook-graph/</feedburner:origLink></item>
    <item>
      <title>The Wishes of an Old Man</title>
      <link>http://feedproxy.google.com/~r/PaulBohm/~3/j_D2Qj9nc7E/</link>
      <pubDate>Tue, 24 Jan 2012 15:00:00 -0800</pubDate>
      <guid isPermaLink="false">http://paulbohm.com/articles/the-wishes-of-an-old-man/</guid>
      <author>enki@bbq.io (Paul Bohm)</author>
      <description>&lt;p&gt;&lt;em&gt;This was a post I wrote on my 29th birthday&lt;/em&gt;

&lt;/p&gt;
&lt;p&gt;I&amp;apos;d like to thank all of you that have at times walked with me as a friend, besides me as a partner, behind me in support, or in front of me as someone leaving footsteps that I one day hope to fill. Whether now, in the past, or in the future!
&lt;span class="more"&gt;&lt;/span&gt;

&lt;/p&gt;
&lt;p&gt;I&amp;apos;m tremendously grateful to have met, spent time with, conversed and played with all of you, the amazing people that have inspired me and shaped me in every way, and that despite their usually good judgement of character, have allowed me to call them friends throughout parts of a twenty-nine year long voyage, both back in Europe where I was born, and in my new chosen home near the bay, where i now reside.

&lt;/p&gt;
&lt;p&gt;I feel, and know, and believe from within the deepest of my heart that that many of you can and will achieve monumental things within your lifetimes. Some of you already have. And I know you will do it again! Keep swimming against the stream, no matter how hard it is at times, and you will achieve the happiness that can grow only from the truth of honest work. Work well done is its own reward, and there is nothing else that comes close.

&lt;/p&gt;
&lt;p&gt;But let&amp;apos;s avoid getting lost, absorbed by the gentle rhythm of our own strokes, while swimming against the stream, pursuing our own goals, oblivious to where we&amp;apos;re all going. Let&amp;apos;s remind ourselves, and those dear to us, daily that we&amp;apos;re all living in pivotal times, where civilization is just at the brink of finally awakening. Amazing times could be ahead. It&amp;apos;s so tempting, you want to grasp it. But at this point it could still all go away.

&lt;/p&gt;
&lt;p&gt;None of us, no matter how important our projects are, can make this future happen alone. Technology is just a tool. Thus let&amp;apos;s look around us for means to set others free. Many can&amp;apos;t yet fulfill their potential for what amounts to trivial reasons. We&amp;apos;re all caught up in our own private pursuits of parts of the puzzle, but on some level, we need to find ways to enable others. Empowering others to empower others can be the most powerful of actions and chain reactions. Give someone a chance and see if you can set them free. And with that I share with you my resolution for the last year of my twenties, and hopefully for years beyond: Take more time to enable others to enable others.

&lt;/p&gt;
&lt;p&gt;Let me know if I can help you achieve your dreams and set your free, and I&amp;apos;ll try my best! Thank you for being my friends!
&lt;/p&gt;&lt;img src="http://feeds.feedburner.com/~r/PaulBohm/~4/j_D2Qj9nc7E" height="1" width="1"/&gt;</description>
    <feedburner:origLink>http://paulbohm.com/articles/the-wishes-of-an-old-man/</feedburner:origLink></item>
    <item>
      <title>A 14-year-old could build 1998's Google using her Dad's credit card!</title>
      <link>http://feedproxy.google.com/~r/PaulBohm/~3/97Avr3ZB5ao/</link>
      <pubDate>Mon, 16 Jan 2012 15:00:00 -0800</pubDate>
      <guid isPermaLink="false">http://paulbohm.com/articles/a-14-year-old-could-build-1998s-google-using-her-dads-credit-card/</guid>
      <author>enki@bbq.io (Paul Bohm)</author>
      <description>&lt;p&gt;Technology speeds everything up - more so in some areas than in others. While it&amp;apos;s easy to see that erecting a &lt;a href="http://www.youtube.com/watch?v=Ps0DSihggio"&gt;15-story building in two days&lt;/a&gt; is faster than it&amp;apos;s used to be done, it&amp;apos;s harder to get a grip on the giant strides we&amp;apos;re making in software construction. Nonetheless, software is probably the discipline with the most reliably accelerating productivity.

&lt;/p&gt;
&lt;p&gt;Just a few years ago software wasn&amp;apos;t moving all that fast. In those days most programming time was spent on squeezing the maximum performance from CPU and memory and programmers like John Carmack achieved lasting fame for their knack for teasing just a little bit more performance out of machines. And a few years before that, as prog21 &lt;a href="http://prog21.dadgum.com/29.html"&gt;points out&lt;/a&gt;, even writing a working basic spellchecker was a major achievement. You simply didn&amp;apos;t have the memory to store a list of words. Never mind building a really good spellchecker, you&amp;apos;d be busy with optimizing the base case.

&lt;/p&gt;
&lt;p&gt;&lt;span class="more"&gt;&lt;/span&gt;

&lt;/p&gt;
&lt;p&gt;But whenever hardware advanced, it only took a jiffy till programmers would again use up all that extra power. At that point in time, software&amp;apos;s progress was held back by the (comparatively) slow-moving physical nature of hardware. However computer networks were able to free software from the shackles of hardware: If you built your software right, you could just add more servers as you needed them, instead of relying on manufacturers to provide faster and faster hardware. 

&lt;/p&gt;
&lt;p&gt;Google was among the pioneers of networked architecture and built its service using arrays of cheap commodity hardware from the start. But it wasn&amp;apos;t until 2006, when Amazon introduced the Elastic Compute Cloud (EC2), that the chains of physicality were finally broken for everyone. Now you could add and remove machines from software as needed. This development opened up a whole new way of thinking about software to every programmer on the planet.

&lt;/p&gt;
&lt;p&gt;Three years later, in 2009 I proclaimed to a friend:

&lt;/p&gt;
&lt;p&gt;&lt;blockquote&gt;&lt;i&gt;Today a fourteen year old could build 1998&amp;apos;s Google using her dad&amp;apos;s credit card!&lt;/i&gt;&lt;/blockquote&gt;&lt;/p&gt;

&lt;p&gt;To put that into perspective, there&amp;apos;s three parts in play here: 1998, her dad&amp;apos;s credit card, and the software engineering knowledge and tools required to build what Google built in 1998. Let&amp;apos;s start with 1998: The internet was much smaller back then. By the end of 1998, Google had an index of about 60 million pages, and Larry Page&amp;apos;s web crawler had been exploring the web since 1996. The total amount of data downloaded was probably in the ballpark of 200 gigabytes by the end of 1998. Storing 200GB of data on 33 bleeding edge 6GB hard drives at $370 a piece would have cost about $12,210 non-inflation-corrected at that time. That&amp;apos;s without the hardware, electricity, nor bandwidth to actually operate machines to fetch and store the data. In 2009 you&amp;apos;d have gotten a 1000GB drive for $74.99 and could have run it from a single computer, while people regularly download more than 200GB a month on unlimited cable broadband.

&lt;/p&gt;
&lt;p&gt;So getting the data had become cheap enough for our hypothetical teen&amp;apos;s dad&amp;apos;s credit card. Crunching the numbers would require a few more resources, but 1998&amp;apos;s internet was small enough to be crunched on EC2 with her parents&amp;apos;s credit card. Serving the data and answering queries on a popular website without feeling sluggish would also require a few more servers. Let&amp;apos;s assume 30 servers would handle the peak load for a start (Altavista was running off 20 multi-processor DEC 64-bit Alpha&amp;apos;s in 1998). At not-the-cheapest-at-the-time $70 per server-month on Amazon, that would give us an estimated cost ceiling of $2100/month, with the expected cost being more along the lines of $500-$1000/month. Now I&amp;apos;m sure Dad wouldn&amp;apos;t appreciate it, but for many people that&amp;apos;s in the ballpark of what they pay for rent and thus affordable.

&lt;/p&gt;
&lt;p&gt;So theoretically speaking it could have been done in 2009. More than that, price-wise it probably could even have been done in 2006 without ever touching any hardware yourself. But of course money wouldn&amp;apos;t have been the only difficulty for a hypothetical fourteen year old trying to build Google in 1998 or even 2009. Just because you can build anything you want in theory, doesn&amp;apos;t mean you know how to do so in practice. 

&lt;/p&gt;
&lt;p&gt;But not only has hardware gotten cheaper and easier to handle (through software), but during the same time our collective understanding of best practice software engineering has progressed by leaps and bounds as well. In between 2006 and 2009 many more people became acquainted with highly distributed architectures. More tutorials, libraries, and opensource software were written than ever before. Distributed Databases and NoSQL systems garnered a lot of attention. And with distributed version control systems like &lt;a href="http://git-scm.com/"&gt;Git&lt;/a&gt;, code reuse and collaborative development became more commonplace. Many people stopped thinking about how to program individual computers altogether, and started thinking only in networked systems. Because of the wealth of information and code available, and a large community concerned with distributed system problems, a lot of things that were difficult a decade earlier, had become fairly easy to do.

&lt;/p&gt;
&lt;p&gt;Somewhen towards the end of 2009 I realized that writing Google as it was in 1998 didn&amp;apos;t seem as daunting a task anymore. Not only was the hardware cheap, and the information on how to do it widely spread, but a lot of the functionality had already been implemented. Distributed Datastores? Check. Batch Data Processing? Check. Web Crawlers? Check. Web Servers? Check. The age of big data had arrived, because self-taught kids who wanted to could now play with it without asking for permission.

&lt;/p&gt;
&lt;p&gt;So do I think a fourteen year old could have pulled it off? I sure think so, but I realize in 2009 it would have taken a very tenacious fourteen year old. But that was 2009. If you are skeptic about my predictions for the past, how about applying them to today or 2015? How long till the technology that, at the time, precipitated the fastest wealth generation humanity had ever seen, can be replicated by a teenager with next to no budget during summer break? How long till it&amp;apos;s something you write as a pet project while learning to program. Our tools are still getting more powerful, and our collective understanding of software problems is still increasing at a rapid pace. Do you think there&amp;apos;s an upper ceiling for how good we can get at writing software? Are we close?

&lt;/p&gt;
&lt;p&gt;A few years ago, it was hard to find a library providing the functionality you&amp;apos;d need to write your application. A few decades ago the concept of reusable shared libraries had to be invented before you could write one. And if you&amp;apos;d wanted to use a hash table, if you even knew what a hash table was, you&amp;apos;d have to write your own. Today programmers have a wealth of collaboratively developed libraries for almost any purpose at their disposal. When you write software today, you&amp;apos;re standing on the shoulders of countless giants.

&lt;/p&gt;
&lt;p&gt;Personally I believe that a large part of the reason we&amp;apos;re collectively getting better at building software is that a portion of software written is software for building better tools for building better tools. We&amp;apos;re not even close to peak productivity yet. We&amp;apos;re so much drowning in solvable problems, that we don&amp;apos;t even know what peak productivity in software engineering would look like.

&lt;/p&gt;
&lt;p&gt;If you like my writing or have comments, you should follow me on &lt;a href="http://twitter.com/enkido/"&gt;Twitter&lt;/a&gt; and &lt;a href="https://www.facebook.com/pbohm"&gt;Facebook&lt;/a&gt;!&lt;/p&gt;&lt;img src="http://feeds.feedburner.com/~r/PaulBohm/~4/97Avr3ZB5ao" height="1" width="1"/&gt;</description>
    <feedburner:origLink>http://paulbohm.com/articles/a-14-year-old-could-build-1998s-google-using-her-dads-credit-card/</feedburner:origLink></item>
    <item>
      <title>Two asynchronous I/O Helpers for Node.js</title>
      <link>http://feedproxy.google.com/~r/PaulBohm/~3/S5DYAXIm_Ys/</link>
      <pubDate>Fri, 18 Nov 2011 15:00:00 -0800</pubDate>
      <guid isPermaLink="false">http://paulbohm.com/articles/two-asynchronous-io-helpers-for-nodejs/</guid>
      <author>enki@bbq.io (Paul Bohm)</author>
      <description>&lt;p&gt;I&amp;apos;ve recently started using Node.JS and Erlang. Haven&amp;apos;t been this unfaithful to Python since 2001, and of course there are consequences:

&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href="https://github.com/enki/node-iostream"&gt;IOStream&lt;/a&gt;: JS implementation of &lt;a href="http://tornadoweb.org/"&gt;Tornado&lt;/a&gt;&amp;apos;s IOStream class for buffered I/O.&lt;/li&gt;
&lt;li&gt;&lt;a href="https://github.com/enki/node-deque"&gt;Deque&lt;/a&gt;: JS implementation of a &lt;a href="http://en.wikipedia.org/wiki/Double-ended_queue"&gt;Double-ended Queue&lt;/a&gt;.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Both are MIT licensed. Hope this is of use!&lt;/p&gt;&lt;img src="http://feeds.feedburner.com/~r/PaulBohm/~4/S5DYAXIm_Ys" height="1" width="1"/&gt;</description>
    <feedburner:origLink>http://paulbohm.com/articles/two-asynchronous-io-helpers-for-nodejs/</feedburner:origLink></item>
    <item>
      <title>Ephemerisle 2011 Summary</title>
      <link>http://feedproxy.google.com/~r/PaulBohm/~3/Yf_R0XV2P94/</link>
      <pubDate>Sat, 18 Jun 2011 15:00:00 -0700</pubDate>
      <guid isPermaLink="false">http://paulbohm.com/articles/ephemerisle-2011-summary/</guid>
      <author>enki@bbq.io (Paul Bohm)</author>
      <description>&lt;div style="float:left; margin-right: 5px;"&gt;
    &lt;a href="http://www.flickr.com/photos/ratha/5837830284/" title="P6100117 by papertygre, on Flickr"&gt;
        &lt;img src="http://paulbohm.com/articles/ephemerisle-2011-summary/240_180-5837830284_7d07e2d899_m.jpg" alt="image"&gt;
    &lt;/a&gt;
&lt;/div&gt;

&lt;div&gt;I spent last weekend at &lt;a href="http://ephemerisle.org/"&gt;Ephemerisle 2011&lt;/a&gt;, the third year of the floating festival on the Sacramento River Delta. Lots of people asked me how it was, and the short answer is: awesome - it keeps getting better every year.&lt;/div&gt;

&lt;p&gt;The long answer comes with history: I&amp;apos;ve spent years organizing and thinking about conferences and events and what makes them amazing, back in Europe. When you&amp;apos;re regularly taking a few hundred thousand Euros in hand to make a conference, every detail starts to matter to you. How many tracks does the conference have, which speakers do you invite, where do you put the buffet, which rooms do you use for the talks. When I first started &lt;a href="http://deepsec.net/"&gt;DeepSec&lt;/a&gt; (disclosure: I&amp;apos;m not longer involved), I spent two months looking at every single hotel in Vienna to find the perfect location.&lt;/p&gt;

&lt;p&gt;&lt;span class="more"&gt;&lt;/span&gt;

&lt;/p&gt;
&lt;p&gt;It&amp;apos;s easy to get things wrong too. Most people think conferences are about talks and speakers, but really they are not. It&amp;apos;s all about giving the audience the opportunity to connect. Your job as an organizer isn&amp;apos;t to connect them, but to remove the obstacles and optimize the connection funnel.
&lt;/p&gt;

&lt;p&gt;You can imagine that connection funnel as:
    &lt;ol&gt;
        &lt;li&gt;&lt;em&gt;Image:&lt;/em&gt; What&amp;apos;s your events&amp;apos; public image? Which audience does that attract? Who&amp;apos;d come if they could?&lt;/li&gt;
        &lt;li&gt;&lt;em&gt;Filter:&lt;/em&gt; Who really gets there? Many events are too expensive for many that are interested. That filters, but not for awesomeness. Other events have an application process or are invitation only, but that&amp;apos;s very prone to missing awesome people who aren&amp;apos;t established yet. Some events like Burning Man have natural filters: They filter for dedication and persistence. Being in the desert with only the food and water you bring yourself is a pretty good way to filter for dedication and self-reliance.&lt;/li&gt;
        &lt;li&gt;Event: Layout of the location and event structure. Once you&amp;apos;ve got the people there, you still need to give them excuses and opportunities to connect. We all want connection, but we&amp;apos;re all a bit shy. Density is an important factor in enabling connection. Have a space with lots of nooks and crannies, and give people a reason to walk through the hallway. Put your conference tracks at opposite ends of the hallway. Have competitions or just events people can observe or participate in. If the location is too big, put up walls to make it smaller and more dense.&lt;/li&gt;
    &lt;/ol&gt;
&lt;/p&gt;

&lt;p&gt;If you get all of those right you&amp;apos;ll have an amazing event, and your event will have an impact. Not directly, but by connecting people that will go on and work on projects together.&lt;/p&gt;

&lt;p&gt;So back to Ephemerisle. What&amp;apos;s great about it? 
&lt;ol&gt;
&lt;li&gt;It has an amazing core audience: Since year one, it has had some of the nicest, smartest and most talented people I know in attendance. And every year they bring more of their friends.&lt;/li&gt;
&lt;li&gt;It&amp;apos;s hard to get there. You first need to hear about it, and then convince someone to host you on their boat. And someone to ferry you to the actual event. There&amp;apos;s no central authority who keeps people away, but it&amp;apos;s still pretty damn hard to get there.&lt;/li&gt;
&lt;li&gt;Once you&amp;apos;re there, you have all these amazing people, but it&amp;apos;s really dense and intense. There&amp;apos;s little space on the water. Only the land you bring yourself, but it&amp;apos;s got lots of nooks and crannies. There&amp;apos;s a reason all the best conversations at parties happen in the kitchen or pantry. This year we had about 17 boats tied together. On each of these boats a whole bunch of people feel like they are the hosts, and are hospitable and inviting. Also there&amp;apos;s lots of activities for people to actually do something useful together and connect. Building a temporary floating city isn&amp;apos;t easy, and by contributing you get accepted into the community&lt;/li&gt;
&lt;/ol&gt;
&lt;/p&gt;

&lt;p&gt;So here&amp;apos;s why Ephemerisle is amazing. It&amp;apos;s got all the important basics right. From here on out, it&amp;apos;s just making it better every year. And it seems we&amp;apos;re right on track.&lt;/p&gt;

&lt;p&gt;&lt;i&gt;Look at some more pictures from &lt;a href="http://bit.ly/SXDOj4"&gt;Ephemerisle 2011 on Flickr&lt;/a&gt;.&lt;/i&gt;&lt;/p&gt;&lt;img src="http://feeds.feedburner.com/~r/PaulBohm/~4/Yf_R0XV2P94" height="1" width="1"/&gt;</description>
    <feedburner:origLink>http://paulbohm.com/articles/ephemerisle-2011-summary/</feedburner:origLink></item>
    <item>
      <title>Bitcoin's Value is Decentralization</title>
      <link>http://feedproxy.google.com/~r/PaulBohm/~3/Il8tjBun21w/</link>
      <pubDate>Fri, 17 Jun 2011 15:00:00 -0700</pubDate>
      <guid isPermaLink="false">http://paulbohm.com/articles/bitcoins-value-is-decentralization/</guid>
      <author>enki@bbq.io (Paul Bohm)</author>
      <description>&lt;p&gt;Recently I&amp;apos;ve read a lot of claims that Bitcoins don&amp;apos;t have intrinsic value. I&amp;apos;ve come to a different conclusion. Bitcoins have intrinsic value if they enable desirable interactions that are not possible without them. Bitcoin is a theoretical and practical breakthrough that makes it possible to decentralize services we couldn&amp;apos;t previously decentralize.&lt;/p&gt;

&lt;p&gt;To elaborate: Bitcoin isn&amp;apos;t just a currency but an elegant universal solution to the Byzantine Generals&amp;apos; Problem&lt;a href="http://www.mail-archive.com/cryptography@metzdowd.com/msg09997.html"&gt;[1]&lt;/a&gt;, one of the core problems of reaching consensus in Distributed Systems. Until recently it was thought to not be practically solvable at all, much less on a global scale. Irrespective of its currency aspects, many experts believe Bitcoin is brilliant in that it technically made possible what was previously thought impossible.&lt;/p&gt;

&lt;p&gt;&lt;span class="more"&gt;&lt;/span&gt;

&lt;/p&gt;
&lt;p&gt;The Byzantine Generals&amp;apos; Problem roughly goes as follows: N Generals have their armies camped outside a city they want to invade. They know their numbers are strong enough that if at least 1/2 of them attack at the same time they&amp;apos;ll be victorious. But if they don&amp;apos;t coordinate the time of attack, they&amp;apos;ll be spread too thin and all die. They also suspect that some of the Generals might be disloyal and send fake messages. Since they can only communicate by messenger, they have no means to verify the authenticity of a message. How can such a large group reach consensus on the time of attack without trust or a central authority, especially when faced with adversaries intent on confusing them?&lt;/p&gt;

&lt;p&gt;
Bitcoin&amp;apos;s solution is this: All of the Generals start working on a mathematical problem that statistically should take 10 minutes to solve if all of them worked on it. Once one of them finds the solution, she broadcasts that solution to all the other Generals. Everyone then proceeds to extending that solution - which again should take another ten minutes. Every General always starts working on extending the longest solution he&amp;apos;s seen. After a solution has been extended 12 times, every General can be certain that no attacker controlling less than half the computational resources could have created another chain of similar length. The existence of the 12-block chain is proof that a majority of them has participated in its creation. We call this a proof-of-work scheme.
&lt;/p&gt;

&lt;p&gt;If that sounds confusing, don&amp;apos;t worry. What it means is just that consensus is reached, because computational resources are scarce. You vote with work. To rig the vote an attacker would need to control more computational power than the honest nodes. To ensure it&amp;apos;s more expensive for an attacker to purchase the computational power needed to attack the system, Bitcoin adds an incentive scheme. Users who contribute computational power get rewarded for their work. If the value of a Bitcoin rises and thus attacking the system becomes more profitable, it also becomes more profitable for honest users to add computational resources. At any given point, one would expect miners to invest as much resources into mining as is profitable for them. Bitcoin is a currency, because it needs incentives to protect the consensus process from attackers. This computational process (&amp;quot;mining&amp;quot;) is not wasteful at all, but an incredibly efficient way to make attacks economically unprofitable. Bitcoin never uses more computational resources than neccessary to protect the integrity of its interactions.&lt;/p&gt;

&lt;p&gt;Now let&amp;apos;s go back to discussing the value provided by Bitcoin. Essentially it&amp;apos;s a means to make consensus in highly distributed large-scale systems, which would otherwise never be able to reach consensus. The value of this is, that it&amp;apos;s now possible to build applications in a decentralized fashion, that we previously thought could not be built without a central authority. The most obvious value of Bitcoin is as a medium of exchange for goods and services that can&amp;apos;t be easily bought or sold using cash issued by a central authority. But there&amp;apos;s more. Bitcoin also makes it possible to fully decentralize the DNS (Domain Name System). In that case, every Bitcoin Domain Name already comes with a cryptographic key pair. That means it also allows us to solve the PKI (Public Key Infrastructure) problem - every name you connect to has an encryption key associated with it that can be verified without trusting a central authority. In case network traffic monitoring prevents people from accessing information either at all or anonymously, Bitcoin  makes it feasible to pay for internet relays that anonymize or reroute traffic - that is, it makes it easier to remove central control and fight censorship. The list goes on, I&amp;apos;ve been hard-pressed to find any decentralization schemes that would not benefit from Bitcoin integration&lt;/p&gt;

&lt;p&gt;The pattern here is: Pretty much all of these applications can already be built in centralized form. But often the centralized solution comes with a whole bunch of weaknesses. In the PKI case you&amp;apos;ll have to trust over 300 Certificate Authorities every time you make an https:// connection, many of which are located in countries with repressive governments. If any of those 300 entities get compromised or malevolent attackers will be able to read your email, access your bank account, and violate your privacy. DNS is getting censored by governments because they can. And every time you store value in currency, you&amp;apos;re trusting a central authority that it isn&amp;apos;t mismanaged and thus depreciates in value.&lt;/p&gt;

&lt;p&gt;Is there value in Bitcoin? Let me ask a counter question: Is decentralization valuable? If you think that we&amp;apos;ll increasingly lose trust in the central authorities that manage the infrastructure we rely on, you might expect Bitcoins to rise a lot in value. If not, that is you believe that authorities will be able to tackle the challenges of the future better in centralized form, then from your perspective Bitcoins don&amp;apos;t add value. We&amp;apos;ll see.&lt;/p&gt;&lt;img src="http://feeds.feedburner.com/~r/PaulBohm/~4/Il8tjBun21w" height="1" width="1"/&gt;</description>
    <feedburner:origLink>http://paulbohm.com/articles/bitcoins-value-is-decentralization/</feedburner:origLink></item>
    <item>
      <title>The Challenge of Recognizing Bold Early-Stage Research</title>
      <link>http://feedproxy.google.com/~r/PaulBohm/~3/ygVNNw6MMcA/</link>
      <pubDate>Mon, 11 Apr 2011 15:00:00 -0700</pubDate>
      <guid isPermaLink="false">http://paulbohm.com/articles/the-challenge-of-recognizing-bold-early-stage-research/</guid>
      <author>enki@bbq.io (Paul Bohm)</author>
      <description>&lt;p&gt;Last Tuesday, Peter Thiel announced Breakout Labs, his newest philantropic endeavour.

&lt;/p&gt;
&lt;div style="float:left; margin-right: 5px; margin-top: 20px"&gt;
&lt;img src="http://paulbohm.com/articles/the-challenge-of-recognizing-bold-early-stage-research/240_0-logo_breakoutlabs.jpg" alt="image"&gt;
&lt;/div&gt;

&lt;p&gt;&lt;a href="https://www.breakoutlabs.org/"&gt;Breakout Labs&lt;/a&gt; wants to reshape the way early-stage science is funded, and to return scientific innovation to the hands of independent scientists, engineers, and inventors. Funding agreements will typically range from $50,000 to $350,000 but depend on the nature of the project.

&lt;/p&gt;
&lt;p&gt;Thiel has long been arguing that we&amp;apos;re not seeing the rate of progress that we should, and I think he might be right. But what rate of progress are we seeing, and what rate of progress should we be seeing?

&lt;/p&gt;
&lt;p&gt;Back in 1871, Lord Kelvin observed:
&lt;/p&gt;
&lt;blockquote&gt;
Scientific wealth tends to accumulate according to the law of compound interest. Every addition to knowledge of the properties of matter supplies [the physical scientist] with new instrumental means for discovering and interpreting phenomena of nature, which in their turn afford foundations of fresh generalisations, bringing gains of permanent value into the great storehouse of [natural] philosophy.
&lt;/blockquote&gt;

&lt;p&gt;If Kelvin&amp;apos;s statements sufficiently described the accumulation scientific wealth, we&amp;apos;d expect continuous exponential growth:

&lt;/p&gt;
&lt;div style="text-align: center;"&gt;
&lt;img src="http://paulbohm.com/articles/the-challenge-of-recognizing-bold-early-stage-research/180_0-expgrowth.png" alt="image"&gt;
&lt;br/&gt;
Fig.1 Exponential Growth
&lt;/div&gt;

&lt;p&gt;But progress only seems to follow an exponential pattern on the surface. Not every advance provides the same utility to future research. Progress really is made up from many smaller paradigm shifts, that each create entirely new fields. Initially a new field makes possible a lot of follow-up results, but as it matures, it becomes increasingly harder to make significant discoveries within it. Eventually all the low-hanging fruit have been picked, and revolutionary advances give way to merely incremental improvements. A logistic S-Curve is a decent visualization of this progression:

&lt;/p&gt;
&lt;div style="text-align: center;"&gt;
&lt;img src="http://paulbohm.com/articles/the-challenge-of-recognizing-bold-early-stage-research/240_0-scurvesingle.jpg" alt="image"&gt;
&lt;br/&gt;
Fig.2 S-Curve of a new paradigm
&lt;/div&gt;

&lt;p&gt;Only when we overlay a series of these paradigm shifts, do we move in the direction of exponential growth:

&lt;/p&gt;
&lt;div style="text-align: center;"&gt;
&lt;img src="http://paulbohm.com/articles/the-challenge-of-recognizing-bold-early-stage-research/240_0-cyclescurve.jpg" alt="image"&gt;
&lt;br/&gt;
Fig.3 Multiple S-Curves overlayed
&lt;/div&gt;

&lt;p&gt;Thiel seems to argue that we&amp;apos;re not producing these significant breakthroughs at a high enough rate anymore. Through institutionalism, centralization and standardization, we&amp;apos;ve homogenized the kind of research that can get funding. We&amp;apos;ve stymied radical experiments in favor of safe, predictable, incremental improvements. To continue making radical discoveries, we need to be willing to accept less centralized control over the direction of research.

&lt;/p&gt;
&lt;p&gt;True innovation is by definition hard to recognize. Anything that is obvious would already have been discovered. New ideas require rethinking and challenging what we believe to be true and absolute. It&amp;apos;s tough for an outsider, and most innovators are outsiders, to garner the level of attention they need to get their ideas accepted. It&amp;apos;s only after they&amp;apos;ve succeeded that we start to idolize their way of thinking, and look towards people that fit the same pattern for the next wave of innovation. But the previous generation of rebels often aren&amp;apos;t the ones to recognize the significance of the next. By the very nature of innovation, every new wave will be unlike the previous one. Truly new ideas always look unworkable, boring, crazy, and absurd.

&lt;/p&gt;
&lt;p&gt;A good example of this we find in the history of game theory: &lt;i&gt;The entire edifice of game theory rests on two theorems: von Neumann’s min-max theorem of 1928 and Nash’s equilibrium theorem of 1950. Like many great scientific ideas, from Newton’s theory of gravitation to Darwin’s theory of natural selection, Nash’s idea seemed initially too simple to be truly interesting, too narrow to be widely applicable, and, later on, so obvious that its discovery by someone was deemed all but inevitable. Today, Nash’s concept of equilibrium from strategic games is one of the basic paradigms in social sciences and biology, and earned Nash a Nobel Prize.&lt;/i&gt;
Still, the eminent von Neumann initially rejected Nash&amp;apos;s ideas, just as Einstein had rejected one of Nash&amp;apos;s earlier ideas, albeit more politely.

&lt;/p&gt;
&lt;p&gt;But Nash was lucky in that he didn&amp;apos;t have to ask for permission to conduct his research. Since he was a mathematician and economist with a scholarship, he didn&amp;apos;t require funds for experiments. Also Princeton at the time, was a fairly unique institution in that it &lt;i&gt;subjected its students to a maximum of pressure but a wonderful minimum of bureaucracy. The department offered courses, true, but enrollment was a fiction, as were grades. Some professors put down all As, others all Cs, on their grade reports, but both were completely arbitrary. You didn’t have to show up a single time to earn them and students’ transcripts were, more often than not, works of fiction “to satisfy the Philistines.”&lt;/i&gt; More than that, not only could he pursue his own studies, but at Princeton he had access to von Neumann and Einstein and many other of the greatest minds of his time. Given that access, he was eventually able to find established mentors that helped him get his research accepted.

&lt;/p&gt;
&lt;p&gt;In many other sectors however, progress can&amp;apos;t happen without initial funding. Also an increasing number of innovators, especially those residing outside of elite academic institutions, lack the level of access to the ears of the great minds in their fields. Worse, as the amount of research grows, and the world is becoming more interconnected, an ever increasing number of researchers and ideas are vying for the attention of a comparatively small count of established individuals that can&amp;apos;t thoroughly study even a small fraction of them.

&lt;/p&gt;
&lt;p&gt;Today, for ideas and proposals to reach high-profile individuals that can support them, they must pass through layers of gatekeepers or committees. But gatekeepers and committees are notoriously bad at recognizing breakout brilliance - they always tend towards the safe average. Thus we&amp;apos;re facing a structural problem, wherein the way we discover and promote worthwhile projects can no longer scale with the volume of project proposals produced. If we can&amp;apos;t consume the research of our peers anymore, and we&amp;apos;re not discovering the occasional brilliance therein, how can that briliance contribute to our own research, and thus fuel progress?

&lt;/p&gt;
&lt;p&gt;The challenge for Breakout Labs is going to be to find ways to recognize truly exciting projects - not just by being more bold, but by developing new methodologies to determine at scale, which radical ideas are worth funding. I&amp;apos;ll argue in a follow-up post, that the most reasonable metric might be a measurement of an individual or team&amp;apos;s ability to execute, rather than an assessment of the research idea itself.

&lt;/p&gt;
&lt;p&gt;( &lt;i&gt;Italiczed parts of this text based on: Nasar, Sylvia (2011). A Beautiful Mind Simon &amp;amp; Schuster.&lt;/i&gt; )&lt;/p&gt;&lt;img src="http://feeds.feedburner.com/~r/PaulBohm/~4/ygVNNw6MMcA" height="1" width="1"/&gt;</description>
    <feedburner:origLink>http://paulbohm.com/articles/the-challenge-of-recognizing-bold-early-stage-research/</feedburner:origLink></item>
    <item>
      <title>Modeling User Information for Food Delivery</title>
      <link>http://feedproxy.google.com/~r/PaulBohm/~3/iTwUt5bTIT0/</link>
      <pubDate>Tue, 07 Dec 2010 15:00:00 -0800</pubDate>
      <guid isPermaLink="false">http://paulbohm.com/articles/modeling-user-information-for-food-delivery/</guid>
      <author>enki@bbq.io (Paul Bohm)</author>
      <description>&lt;div style="float:left; margin-right: 5px;"&gt;
  &lt;img src="http://paulbohm.com/articles/modeling-user-information-for-food-delivery/128_88-mjam_logo.png" alt="image"&gt;
&lt;/div&gt;

&lt;p&gt;A few years ago I helped start what is now probably Austria&amp;apos;s largest internet food delivery website. &amp;apos;Mjam&amp;apos; is an onomatopoeia for the sound you make with your tongue when your mouth is watering in anticipation of something really tasty.&lt;/p&gt;

&lt;p&gt;While working on Mjam, one thing we really thought about was ranking quality: How can we learn from our users and find out which restaurants are the best? The better we are at satisfying our customers, the more likely they&amp;apos;d stick around or even get their friends to use our site.
&lt;/p&gt;

&lt;div style="float:left; margin-right: 5px;"&gt;
  &lt;img src="http://paulbohm.com/articles/modeling-user-information-for-food-delivery/124_28-fivestar.png" alt="image"&gt;
&lt;/div&gt;

&lt;p&gt;We immediately knew that Pure 1-5 Star ratings wouldn&amp;apos;t do. Everyone uses stars differently, and there&amp;apos;s interaction-specific attractors to boot (on Netflix people are more likely to rate movies they like, so 5 is more popular than 4, 4 is more popular than 3, ...). The Star rating system also loses a lot of resolution: We don&amp;apos;t want to know which 50 restaurants have 5 Stars, we want to know which ones are the best. Ordering restaurants would be a much better fit than discrete rankings.
&lt;/p&gt;
&lt;p&gt;So we experimented with modeling the knowledge our users had when they made an order: A restaurant was an unknown to a user, unless they had recently placed an order there (within the last two months). If a user knew multiple restaurants, and clearly preferred a few of them over the others, that was a vote. Not ordering from a restaurant you hadn&amp;apos;t tried before wasn&amp;apos;t a vote against it, nor ordering from a restaurant without knowing any of the alternatives. We completely scrapped explicit votes. Instead we decided to let people vote with their money and real orders. The more a user knew (through previous orders), the more weight we gave to that user&amp;apos;s behavior in calculating our rankings.
&lt;/p&gt;
&lt;p&gt;The method turned out to work out incredibly well: Mjam&amp;apos;s ratings are still by far the best I&amp;apos;ve seen (I&amp;apos;m no longer a shareholder nor do I work with them or have any recent inside information). For newer projects I&amp;apos;m focusing even more on personalizing filters, but I think this kind of information modeling still has a lot of promise for improving a lot of ranking systems. Yelp would be a prime candidate for recommending you alternatives and then tracking over time which one you prefer.&lt;/p&gt;&lt;img src="http://feeds.feedburner.com/~r/PaulBohm/~4/iTwUt5bTIT0" height="1" width="1"/&gt;</description>
    <feedburner:origLink>http://paulbohm.com/articles/modeling-user-information-for-food-delivery/</feedburner:origLink></item>
    <item>
      <title>Parex - Parallel Execution for Python and Fabric</title>
      <link>http://feedproxy.google.com/~r/PaulBohm/~3/c9CQh3B0DFw/</link>
      <pubDate>Sat, 10 Jul 2010 15:00:00 -0700</pubDate>
      <guid isPermaLink="false">http://paulbohm.com/articles/parex---parallel-execution-for-python-and-fabric/</guid>
      <author>enki@bbq.io (Paul Bohm)</author>
      <description>&lt;div style="float:left; margin-right: 5px;"&gt;
  &lt;img src="http://paulbohm.com/articles/parex---parallel-execution-for-python-and-fabric/87_88-parallel.jpg" alt="image"&gt;
&lt;/div&gt;&lt;p&gt;I&amp;apos;ve been planning for a while to release more of the tools I&amp;apos;ve developed for BBQ. Let&amp;apos;s get this started:&lt;/p&gt;

&lt;p&gt;Parex is a simple python module that allows you to execute multiple processes in parallel, and then block till they&amp;apos;ve all finished. I use it with &lt;a href="http://fabfile.org/"&gt;fabric&lt;/a&gt; to make deployments &lt;b&gt;significantly faster&lt;/b&gt;. Find the &lt;a  href="http://github.com/enki/parex"&gt;code over at github&lt;/a&gt;.

&lt;p&gt;Usage Example:
&lt;!-- HTML generated using hilite.me --&gt;&lt;div style="background: #f8f8f8; overflow:auto;width:auto;color:black;background:white;border:solid gray;border-width:.1em .1em .1em .8em;padding:.2em .6em;"&gt;&lt;pre style="margin: 0; line-height: 125%"&gt;x &lt;span style="color: #666666"&gt;=&lt;/span&gt; TaskManager(cwd&lt;span style="color: #666666"&gt;=&lt;/span&gt;&lt;span style="color: #BB4444"&gt;&amp;quot;.&amp;quot;&lt;/span&gt;)
x&lt;span style="color: #666666"&gt;.&lt;/span&gt;execute(&lt;span style="color: #BB4444"&gt;&amp;#39;ls&amp;#39;&lt;/span&gt;) &lt;span style="color: #008800; font-style: italic"&gt;# execute commands&lt;/span&gt;
x&lt;span style="color: #666666"&gt;.&lt;/span&gt;execute(&lt;span style="color: #BB4444"&gt;&amp;#39;ps auxw&amp;#39;&lt;/span&gt;)
pid &lt;span style="color: #666666"&gt;=&lt;/span&gt; x&lt;span style="color: #666666"&gt;.&lt;/span&gt;execute(&lt;span style="color: #BB4444"&gt;&amp;#39;who&amp;#39;&lt;/span&gt;) &lt;span style="color: #008800; font-style: italic"&gt;# returns pid&lt;/span&gt;
x&lt;span style="color: #666666"&gt;.&lt;/span&gt;wait() &lt;span style="color: #008800; font-style: italic"&gt;# wait till all have finished&lt;/span&gt;
&lt;span style="color: #AA22FF; font-weight: bold"&gt;for&lt;/span&gt; y &lt;span style="color: #AA22FF; font-weight: bold"&gt;in&lt;/span&gt; x&lt;span style="color: #666666"&gt;.&lt;/span&gt;data&lt;span style="color: #666666"&gt;.&lt;/span&gt;values(): &lt;span style="color: #008800; font-style: italic"&gt;# keyed by pid&lt;/span&gt;
    &lt;span style="color: #AA22FF; font-weight: bold"&gt;print&lt;/span&gt; y&lt;span style="color: #666666"&gt;.&lt;/span&gt;getvalue() &lt;span style="color: #008800; font-style: italic"&gt;# y is StringIO&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;

&lt;p&gt;&lt;/p&gt;

&lt;/p&gt;
&lt;p&gt;Follow me on twitter &lt;a href="http://twitter.com/enkido/"&gt;here&lt;/a&gt; or sign up for the &lt;a href="http://bbq.io/"&gt;BBQ betatest&lt;/a&gt;.&lt;/p&gt;&lt;img src="http://feeds.feedburner.com/~r/PaulBohm/~4/c9CQh3B0DFw" height="1" width="1"/&gt;</description>
    <feedburner:origLink>http://paulbohm.com/articles/parex---parallel-execution-for-python-and-fabric/</feedburner:origLink></item>
    <item>
      <title>Logo for BBQ</title>
      <link>http://feedproxy.google.com/~r/PaulBohm/~3/INRIOz1e7Xs/</link>
      <pubDate>Sat, 10 Jul 2010 15:00:00 -0700</pubDate>
      <guid isPermaLink="false">http://paulbohm.com/articles/logo-for-bbq/</guid>
      <author>enki@bbq.io (Paul Bohm)</author>
      <description>&lt;p&gt;&lt;div style="float:left; margin-right: 5px;"&gt;
    &lt;img src="http://paulbohm.com/articles/logo-for-bbq/152_88-bbq.png" alt="image"&gt;
&lt;/div&gt;
BBQ, my information filtering project that has made me skip sleep lately, has a new logo and some additional design! I&amp;apos;ve spent more money on logos than I was planning, but sometimes moving forward is more important than being frugal. 

&lt;/p&gt;
&lt;p&gt;&lt;br/&gt;I&amp;apos;ll blog more about BBQ shortly, but in the meanwhile sign up for the betatest &lt;a href="http://bbq.io/"&gt;here&lt;/a&gt;.&lt;/p&gt;&lt;img src="http://feeds.feedburner.com/~r/PaulBohm/~4/INRIOz1e7Xs" height="1" width="1"/&gt;</description>
    <feedburner:origLink>http://paulbohm.com/articles/logo-for-bbq/</feedburner:origLink></item>
    <item>
      <title>Multi-Nothing</title>
      <link>http://feedproxy.google.com/~r/PaulBohm/~3/lQ3M9jUbflk/</link>
      <pubDate>Sun, 04 Jul 2010 15:00:00 -0700</pubDate>
      <guid isPermaLink="false">http://paulbohm.com/articles/multi-nothing/</guid>
      <author>enki@bbq.io (Paul Bohm)</author>
      <description>&lt;p&gt;&lt;div style="float:left; margin-right: 5px;"&gt;
  &lt;img src="http://paulbohm.com/articles/multi-nothing/140_180-foot-juggling2_265x335.jpg" alt="image"&gt;
&lt;/div&gt;
I used to admire the ability of people to work on many things at once or in succession, but these days I&amp;apos;m much more excited by people who focus intently on just one thing for a long time. It&amp;apos;s not the quantity of things you do, but whether the parts work together to create a good whole.&lt;/p&gt;&lt;img src="http://feeds.feedburner.com/~r/PaulBohm/~4/lQ3M9jUbflk" height="1" width="1"/&gt;</description>
    <feedburner:origLink>http://paulbohm.com/articles/multi-nothing/</feedburner:origLink></item>
    <item>
      <title>Most Recently Used Wardrobe</title>
      <link>http://feedproxy.google.com/~r/PaulBohm/~3/JY1NxB25Nys/</link>
      <pubDate>Tue, 15 Jun 2010 15:00:00 -0700</pubDate>
      <guid isPermaLink="false">http://paulbohm.com/articles/most-recently-used-wardrobe/</guid>
      <author>enki@bbq.io (Paul Bohm)</author>
      <description>&lt;div style="float:left; margin-right: 5px;"&gt;
        &lt;a href="#"&gt;
            &lt;img src="http://paulbohm.com/articles/most-recently-used-wardrobe/259_196-wardrobe.png" alt="image"&gt;
            &lt;span class="frame"&gt;&lt;/span&gt;
        &lt;/a&gt;
    &lt;/div&gt;

&lt;p&gt;
Ok, this is probably going to blow you away. After a long hiatus from blogging, I&amp;apos;m sitting at my desk on such a beautiful day and bring to you applied computer science: Behold, the miracle of the Bay Area: The magnificent Most Recently Used Wardrobe.
&lt;/p&gt;

&lt;p&gt;&lt;p&gt;That is: Hang all your clothes on a bar and whenever you return an item from laundry, append it to the right side of the bar. After a while all the stuff you never wear ends up on the left side - ready for archival or transfer.

&lt;/p&gt;
&lt;p&gt;&lt;/p&gt;&lt;p&gt;Remember: Random Access for pop() but appendright() for Insertion.&lt;/p&gt;&lt;p&gt;

&lt;/p&gt;&lt;img src="http://feeds.feedburner.com/~r/PaulBohm/~4/JY1NxB25Nys" height="1" width="1"/&gt;</description>
    <feedburner:origLink>http://paulbohm.com/articles/most-recently-used-wardrobe/</feedburner:origLink></item>
    <item>
      <title>The all new paulbohm.com!</title>
      <link>http://feedproxy.google.com/~r/PaulBohm/~3/wWtb4MTV7oA/</link>
      <pubDate>Wed, 09 Jun 2010 15:00:00 -0700</pubDate>
      <guid isPermaLink="false">http://paulbohm.com/articles/the-all-new-paulbohmcom/</guid>
      <author>enki@bbq.io (Paul Bohm)</author>
      <description>&lt;p&gt;It&amp;apos;s online and already home to &lt;a href="/projects/"&gt;fine interwebs&lt;/a&gt;!&lt;/p&gt;

&lt;p&gt;&lt;div class="image"&gt;
    &lt;a href="#"&gt;
        &lt;img src="http://paulbohm.com/articles/the-all-new-paulbohmcom/706_200-img1-post.jpg" alt="image"&gt;
        &lt;span class="frame"&gt;&lt;/span&gt;
    &lt;/a&gt;
&lt;/div&gt;
&lt;/p&gt;
&lt;p&gt;&lt;p&gt;PS: This site is running on top of Cassandra/Tornado/Tragedy/EC2.&lt;/p&gt;
&lt;strong&gt;Update:&lt;/strong&gt; &lt;i&gt;added some old posts from the archive&lt;/i&gt;&lt;/p&gt;&lt;img src="http://feeds.feedburner.com/~r/PaulBohm/~4/wWtb4MTV7oA" height="1" width="1"/&gt;</description>
    <feedburner:origLink>http://paulbohm.com/articles/the-all-new-paulbohmcom/</feedburner:origLink></item>
    <item>
      <title>Product Discovery not Software Development</title>
      <link>http://feedproxy.google.com/~r/PaulBohm/~3/WAoZvyE5VE0/</link>
      <pubDate>Sun, 10 Jan 2010 15:00:00 -0800</pubDate>
      <guid isPermaLink="false">http://paulbohm.com/articles/product-discovery-not-software-development/</guid>
      <author>enki@bbq.io (Paul Bohm)</author>
      <description>&lt;p&gt;&lt;div style="float:left; margin-right: 5px;"&gt;
    &lt;a href="http://www.nataliedee.com/"&gt;
            &lt;img src="http://paulbohm.com/articles/product-discovery-not-software-development/259_196-he-always-says-hi-guys-and-everything.jpg" alt="image"&gt;
            &lt;span class="frame"&gt;&lt;/span&gt;
    &lt;/a&gt;
&lt;/div&gt;
&lt;/p&gt;
&lt;p&gt;If you’re building a new product, your biggest risk isn’t that you won’t be able to reach a mainstream audience, but that you’ll fail to attract even 50 users that love your product.&lt;/p&gt;

&lt;p&gt;When embarking on a new venture, your goal isn’t to implement any specific idea in the best way possible, but to iterate as fast as you can, till someone is passionate about whatever product you’ll eventually converge on. Don’t worry about being scalable or cross-platform. So what if IE6 users can’t use your app - you’ve yet to find anyone that wants to use your useless app anyway. Anything that reduces your speed of iteration is poison to your startup at this point.&lt;/p&gt;

&lt;p&gt;Yes, we ridicule companies that fail to scale when they start becoming successful, but keep in mind - they’ve become successful and that makes them extraordinary in so many ways. Maybe they didn’t become successful despite being scrappy, but because they were scrappy. Seriously, once you have users that want to use your product but can’t because your tech sucks, you’ve basically won. After all, what you’ve been doing is product discovery, not software development. The tech really is the easy part, since it only becomes important once you have something that people actually want to use.&lt;/p&gt;

&lt;p&gt;&lt;i&gt;This article was inspired by a heated discussion on irc.freenode.net #startups about whether not supporting IE and even Firefox is a viable strategy for an early-stage startup. My thoughts are above. I’d love to hear yours. Discuss over at &lt;a href="http://news.ycombinator.com/item?id=1042378"&gt;Hacker News&lt;/a&gt;.&lt;/i&gt;&lt;/p&gt;&lt;img src="http://feeds.feedburner.com/~r/PaulBohm/~4/WAoZvyE5VE0" height="1" width="1"/&gt;</description>
    <feedburner:origLink>http://paulbohm.com/articles/product-discovery-not-software-development/</feedburner:origLink></item>
    <item>
      <title>Florian Hufsky, @oneup, 13.11.1986 - 16.12.2009</title>
      <link>http://feedproxy.google.com/~r/PaulBohm/~3/Nvo6u6ZDCyw/</link>
      <pubDate>Fri, 18 Dec 2009 15:00:00 -0800</pubDate>
      <guid isPermaLink="false">http://paulbohm.com/articles/florian-hufsky-oneup-13111986---16122009/</guid>
      <author>enki@bbq.io (Paul Bohm)</author>
      <description>&lt;div style="margin-left: 100px; width: 440px; border: 6px coral solid; border-color: black; padding: 9px; "&gt;
&lt;p&gt;
&lt;div style="margin-left: 120px;"&gt;
&lt;img src="http://paulbohm.com/articles/florian-hufsky-oneup-13111986---16122009/200_150-oneup.jpg" alt="image"&gt;
&lt;/div&gt;
&lt;/p&gt;
&lt;p&gt;Florian Hufsky (“Flo”, “oneup”, “Hufsky”) war mehr als ein geliebter Freund, mehr als ein Pixelkünstler, Hacker und Spieledesigner. Flo war
jemand der konstant mit einer Leichtigkeit Ideen, Konzepte, Code und
Projekte produzierte, die Ihn nicht bloss nach einem Medium für seine
Ideen suchen liess, sondern zum Medium seiner Ideen machte. Jemand der
mit 23 bereits eine Partei, mehrere Spiele, Startups, und eine
Künstlertruppe gestartet hatte, und jemand der Freunde und Familie
hatte die Ihn wirklich liebten. Nicht jemand der etwas sein wollte,
sondern jemand der etwas war, und dessen Beiträge und Inspiration noch
lange in Design, Produkten und Diskurs weit über dieses kleine
Alpenland hinaus widerhallen werden. Und dennoch war er nicht
glücklich, fand nicht die Perspektive und Liebe die Ihm gebührte, und
sah scheinbar keinen Ausweg. Mir blutet das Herz daran zu denken, dass
er etwas übersehen haben könnte - ich wünschte er hätte mehr gereist,
hätte mehr gesehen - vielleicht wäre da etwas für Ihn gewesen. Doch
unendliche parallele Welten, und wir enden in einer in der ein Freund,
ein Vorbild und Inspiration mit so viel Potential, uns bewusst
verlässt. Ich kann nicht abschliessen damit, ich spüre nur Wut,
Tränen, Verzweiflung. Sein Licht brannte hell, und Ich bin dankbar für
die Zeit die er mit uns teilte. Danke Flo!&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;English&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;
Florian Hufsky (“Flo”, “oneup”, “Hufsky”) was more than a beloved
friend, more than a pixel artist, hacker and game designer. Flo was
someone who produced ideas, concepts, code and projects with such
ease, that he didn’t just look for a medium for his ideas, but he
himself became a medium for his ideas. Someone who at 23 years of age
had already started a political party, multiple games, startups, and
a digital art troupe, and someone who had friends and family that
truly loved him. Not someone who wanted to become someone, but someone
who was someone, and whose contributions and inspiration will continue
to be felt for a long time in designs, products and discourse, far
beyond the small alpine country that he was born in. But despite all
this, he wasn’t happy, he didn’t find the perspective and love that he
deserved, and it seems he saw no way for himself to achieve happiness.
My heart is bleeding when i think that he might have missed something
- i wish he had travelled more, had seen more - maybe there’d have
been something for him out there. But despite the infinite parallel
worlds that we live in, we end up in one in which a friend, a
role-model and inspiration with so much potential, has left us
intentionally. I can’t comprehend, I can’t move on, I only feel anger,
tears and despair. His light burned bright, and I’m thankful for the
time he shared with us. Thank you, Flo!
&lt;/p&gt;
&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/PaulBohm/~4/Nvo6u6ZDCyw" height="1" width="1"/&gt;</description>
    <feedburner:origLink>http://paulbohm.com/articles/florian-hufsky-oneup-13111986---16122009/</feedburner:origLink></item>
    <item>
      <title>Wave, the new X-Windows?</title>
      <link>http://feedproxy.google.com/~r/PaulBohm/~3/2Sr8rV0P8QI/</link>
      <pubDate>Sun, 09 Aug 2009 15:00:00 -0700</pubDate>
      <guid isPermaLink="false">http://paulbohm.com/articles/wave-the-new-x-windows/</guid>
      <author>enki@bbq.io (Paul Bohm)</author>
      <description>&lt;div style="float:left; margin-right: 5px;"&gt;
        &lt;a href="#"&gt;
            &lt;img src="http://paulbohm.com/articles/wave-the-new-x-windows/259_196-scipywave.png" alt="image"&gt;
            &lt;span class="frame"&gt;&lt;/span&gt;
        &lt;/a&gt;
    &lt;/div&gt;

&lt;p&gt;While at the &lt;a href="http://gtug-campout-sv.eventbrite.com/"&gt;GTUG Campout&lt;/a&gt; in Mountain View, &lt;a href="http://jacobrus.com/"&gt;Jacob Rus&lt;/a&gt; and me turned &lt;a href="http://wave.google.com/"&gt;Google Wave&lt;/a&gt; into a collaborative Scientific Computing Environment using &lt;a href="http://scipy.org/"&gt;scipy&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;Working on Wave there and later independently on Operational Transformations (the algorithms behind wave), has led me to conclude that the protocols and ideas behind wave are far more interesting than the promise of the current implementation&lt;/p&gt;

&lt;p&gt;Most observers are portraying Google Wave as the future of email or instant&amp;#160;messaging, and celebrating or criticizing it as such. In the blog posts I&amp;apos;ve&amp;#160;read, Wave’s merits are analyzed&amp;#160;solely based on the current developer &lt;em&gt;UI preview&lt;/em&gt;. Calling it a preview is giving it a lot of credit - let&amp;apos;s maybe call it a &lt;em&gt;debugger&lt;/em&gt; or &lt;em&gt;proof-of-concept&lt;/em&gt; instead.&amp;#160;Or in other words, people are discussing Wave like it is the newest social networking website, and not an&amp;#160;infrastructure protocol under heavy development.&lt;/p&gt;
&lt;p&gt;So let’s ignore the high-level “next-gen E-mail” sales pitch for a&amp;#160;moment and take a look at the state of Wave today. At its heart is a&amp;#160;technology called &lt;a href="http://en.wikipedia.org/wiki/Operational_transformation"&gt;Operational Transformation&lt;/a&gt; (OT). It defines a set of&amp;#160;operations, transformations, and the documents they can be applied to.&lt;/p&gt;
&lt;p&gt;For Google Wave in particular, the components involved are:&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;Documents that can be rendered to HTML.&lt;/li&gt;
&lt;li&gt;Operations and series of operations that can be applied to documents: For&amp;#160;instance, insert a character ‘c’ at position 5, then delete the character at position 9 &lt;em&gt;(Note: this is an example, not how wave&amp;apos;s operations really work)&lt;/em&gt;.&lt;/li&gt;
&lt;li&gt;Transformations of Operations: These are rules to change operations, so&amp;#160;that if operations are received in different order on multiple clients, the document still eventually converges to the same consistent state.&lt;/li&gt;
&lt;li&gt;Robots that can monitor operations and create new operations based&lt;br&gt;on the operations previously applied to a document.&lt;/li&gt;
&lt;li&gt;An early draft of a federation protocol that allows documents to be&lt;br&gt;hosted on arbitrary servers instead of a central location, for example&lt;br&gt;at Google.&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;That&amp;apos;s pretty much all there is to it. It essentially defines the data&amp;#160;structures of a collaborative document editor, and we don’t really know yet where many of the components attached to them will lead: The federation API is still a moving target, there&amp;apos;s no client/server protocol, and robots speak yet a different moving-target protocol. Add a web UI (which right now doesn&amp;apos;t even properly speak OT, and is built on an unspecified and &lt;a href="http://en.wikipedia.org/wiki/Google_Web_Toolkit"&gt;GWT&lt;/a&gt;-specific protocol) and what you&amp;#160;have is a collaborative web document editor with big ambitions. That’s exactly where Wave&amp;#160;is right now, and the&amp;#160;&lt;a href="http://etherpad.com"&gt;competition&lt;/a&gt; has been here before (maybe without the big vision, but who&amp;apos;s to say?).&lt;/p&gt;
&lt;p&gt;Now where can we go from here? HTML is a document display system repurposed as an application platform. Wave seems aimed at the same route. So how could that application platform look?&lt;/p&gt;
&lt;p&gt;Let me explain using an analogy.&lt;/p&gt;
&lt;p&gt;Traditional programs can either directly access input and output devices like&amp;#160;keyboards and graphics cards, or they can use the &lt;a href="http://en.wikipedia.org/wiki/X_Window_System"&gt;X-Windows&lt;/a&gt; protocol,&amp;#160;which is more abstract, but has certain advantages. With the X protocol,&amp;#160;programs request graphics operations instead of instructing the hardware&amp;#160;directly. This level of abstraction enables multiple programs to work on&amp;#160;the same screen, cooperate with copy&amp;amp;paste or enhance each other like&amp;#160;window managers do.&lt;/p&gt;
&lt;p&gt;Programs can even use the &lt;a href="http://en.wikipedia.org/wiki/X_Window_System_protocols_and_architecture"&gt;X-Protocol&lt;/a&gt; over a network, which&lt;br&gt;means that a program and its server with the screen can run on different&lt;br&gt;machines. I say in theory, because graphics operations are ill-suited&lt;br&gt;for high-latency, low-bandwidth environments such as the Internet, and&lt;br&gt;X-Windows is a particularly chatty protocol. More efficient solutions&lt;br&gt;like &lt;a href="http://en.wikipedia.org/wiki/RFB_protocol"&gt;RFB/VNC&lt;/a&gt; and &lt;a href="http://en.wikipedia.org/wiki/NX_technology"&gt;NX&lt;/a&gt; have been developed, but in general, the pixel&amp;#160;transfer paradigm has proven inferior to the high-level web application paradigm&amp;#160;that has parts of the UI logic running on the clients in JavaScript.&lt;/p&gt;
&lt;p&gt;Now I&amp;apos;m arguing that this new webapp paradigm is still like talking to the graphics hardware directly. Developing custom JavaScript code for changing documents requires&amp;#160;re-inventing the collaboration and interoperability wheels over and over again. Wave could be the heart of protocols and standards&amp;#160;upon which we can develop the next generation of applications without&amp;#160;re-implementing everything over and over again for each new app. Apps&amp;#160;would be robots, possibly partially running within the browser, and all I/O would be operations on documents.&lt;/p&gt;
&lt;p&gt;This means that every Wave application would be collaborative &amp;quot;for free&amp;quot;, and&lt;br&gt;you could combine multiple apps to interoperate on the same documents, like a latter day &lt;a href="http://en.wikipedia.org/wiki/OpenDoc"&gt;OpenDoc&lt;/a&gt;.&amp;#160;Eventually, documents could be more than just static data, and using the&amp;#160;same protocol and algorithms to build, let&amp;apos;s say, a collaborative&amp;#160;Photoshop in Wave is entirely possible, just like classic web&amp;#160;applications have transcended the original scope of HTML.&lt;/p&gt;
&lt;p&gt;&lt;em&gt;To give you a little background: I am a software engineer working on distributed systems, and particularly on OT algorithms.&amp;#160;&amp;#160;I am posting&amp;#160;this from the&amp;#160;&lt;a href="http://gtug-campout-sv.eventbrite.com/"&gt;GTUG Campout&lt;/a&gt; at the Google Campus in Mountain View where I have just built a few Wave-based apps with my co-conspirator&amp;#160;&lt;a href="http://jacobrus.com/"&gt;Jacob Rus&lt;/a&gt;.&amp;#160;Among them is a collaborative scientific computing environment (think Mathematica or Matlab - but based on the awesome Python &lt;a href="http://scipy.org/"&gt;Scipy&lt;/a&gt; environment - &lt;a href="http://lolstartups.com/post/159322545/while-at-the-gtug-campout-in-mountain-view-jacob"&gt;screenshot here&lt;/a&gt;), and a Wave Robot IDE, which allows you to write wave robots collaboratively from within Wave. Both projects will be opensourced soon. You should follow me &lt;a href="http://twitter.com/enkido"&gt;here&lt;/a&gt; on twitter, if you want to get updates.&lt;/em&gt;&lt;/p&gt;
&lt;p&gt;&lt;em&gt;&lt;strong&gt;Thanks&lt;/strong&gt; to&amp;#160;Christiane Ruetten, Jacob Rus and someone knowledgeable who can&amp;apos;t be named for reading drafts of this.&lt;/em&gt;&lt;/p&gt;
&lt;p&gt;&lt;em&gt;Discussion and comments on&amp;#160;&lt;a href="http://news.ycombinator.com/item?id=752340"&gt;news.yc&lt;/a&gt;!&lt;/em&gt;&lt;/p&gt;&lt;img src="http://feeds.feedburner.com/~r/PaulBohm/~4/2Sr8rV0P8QI" height="1" width="1"/&gt;</description>
    <feedburner:origLink>http://paulbohm.com/articles/wave-the-new-x-windows/</feedburner:origLink></item>
  </channel>
</rss>
