<?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>pixelmonkey.org - alter or abolish? &#187; Technology</title>
	<atom:link href="http://www.pixelmonkey.org/category/technology/feed" rel="self" type="application/rss+xml" />
	<link>http://www.pixelmonkey.org</link>
	<description>Andrew J. Montalenti's Blog</description>
	<lastBuildDate>Sun, 29 Jan 2012 00:54:03 +0000</lastBuildDate>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
	<generator>http://wordpress.org/?v=3.2.1</generator>
		<item>
		<title>Why NYC does, indeed, need HackNY</title>
		<link>http://www.pixelmonkey.org/2011/11/10/hackny?utm_source=rss&#038;utm_medium=rss&#038;utm_campaign=hackny</link>
		<comments>http://www.pixelmonkey.org/2011/11/10/hackny#comments</comments>
		<pubDate>Thu, 10 Nov 2011 17:59:23 +0000</pubDate>
		<dc:creator>pixelmonkey</dc:creator>
				<category><![CDATA[Startups]]></category>
		<category><![CDATA[Technology]]></category>

		<guid isPermaLink="false">http://www.pixelmonkey.org/?p=836</guid>
		<description><![CDATA[On Fred Wilson&#8217;s blog post about Raise Cache and HackNY, someone asked a very legitimate question: Why are we raising money to benefit CS students from top programs around the country? Why are we raising money to help companies like Business Insider and bit.ly hire interns? The event looks like fun but I&#8217;ve been trying [...]]]></description>
			<content:encoded><![CDATA[<p>On <a href="http://www.avc.com/a_vc/2011/11/raise-cache.html">Fred Wilson&#8217;s blog post about Raise Cache</a> and <a href="http://hackny.org">HackNY</a>, someone asked a very legitimate question:</p>
<blockquote><p>
Why are we raising money to benefit CS students from top programs around the country? Why are we raising money to help companies like Business Insider and bit.ly hire interns?</p>
<p>The event looks like fun but I&#8217;ve been trying to understand hackNY and don&#8217;t understand why it&#8217;s a charitable cause.
</p></blockquote>
<p>And, I wrote a response &#8212; providing some anecdotal information about how <a href="http://parse.ly">Parse.ly</a> benefited from HackNY, and why it matters in a city flush with gold-plated Wall St. internships.</p>
<blockquote><p>
Let me give you a hint why HackNY is somewhat charitable: Wall Street firms pay between $15-$30k/summer for technical interns in NYC. Most startups &#8212; especially early-stage ones &#8212; simply can&#8217;t compete with that. </p>
<p>You may not think startups like bit.ly and Business Insider need any help (and with their $13-15M in capital funding raised, maybe you are right), but in 2010, when Parse.ly sought a summer intern, we had no funding and a < $3K/mo. burn rate. You can read our testimonial about HackNY here: http://hackny.org/a/2011/01/st...</p>
<p>That said, it'd probably be good to have more truly early-stage (pre-funding) companies on the roster -- one of the problems with this, though, is that a lot of pre-funding companies are in such a fragile state that the internship might be over a couple weeks into the summer. Also, pre-funding companies aren't typically "buzzworthy". The first two years of HackNY has been partially about creating some buzz about NYC tech among university students, something at which it has succeeded spectacularly.</p>
<p>Both of our HackNY interns (2010 + 2011) have commented about how one of the interesting parts of the program is that it simply raises awareness of the different stages of companies. Since the HackNY interns all live together in university housing, they share stories -- and you'll have folks working on >100-person teams at places like Gilt Group and folks working on &lt;10-person teams at places like Parse.ly. Also, the program&#8217;s lecture series does a good job of encouraging students to consider entrepreneurship or startup work as a post-graduation option. This is a countervailing force to the professional HR/recruiting teams employed by Wall Street and other Fortune 500s to market their positions to top students.
</p></blockquote>
<p>from <a href="http://www.avc.com/a_vc/2011/11/raise-cache.html#comment-353231002">Raise Cache at AVC.com</a>.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.pixelmonkey.org/2011/11/10/hackny/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>The C++ trap</title>
		<link>http://www.pixelmonkey.org/2011/11/03/the-cpp-trap?utm_source=rss&#038;utm_medium=rss&#038;utm_campaign=the-cpp-trap</link>
		<comments>http://www.pixelmonkey.org/2011/11/03/the-cpp-trap#comments</comments>
		<pubDate>Thu, 03 Nov 2011 15:34:28 +0000</pubDate>
		<dc:creator>pixelmonkey</dc:creator>
				<category><![CDATA[Programming]]></category>
		<category><![CDATA[Technology]]></category>

		<guid isPermaLink="false">http://www.pixelmonkey.org/?p=832</guid>
		<description><![CDATA[I came across this wonderful piece of historical retelling by David Beazley, one of my favorite Pythonistas and the author of Python Essential Reference. Here is a man who conquered C++ in just about every way, but ultimately found himself trapped in its byzantine complexity, only to escape by way of Python. Swig grew a [...]]]></description>
			<content:encoded><![CDATA[<p>I came across this wonderful piece of historical retelling by David Beazley, one of my favorite Pythonistas and the author of Python Essential Reference. Here is a man who conquered C++ in just about every way, but ultimately found himself trapped in its byzantine complexity, only to escape by way of Python.</p>
<blockquote><p>
Swig grew a fully compatible C++ preprocessor that fully supported macros. A complete C++ type system was implemented including support for namespaces, templates, and even such things as template partial specialization.  Swig evolved into a multi-pass compiler that was doing all sorts of global analysis of the interface. Just to give you an idea, Swig would do things such as automatically detect/wrap C++ smart pointers.It could wrap overloaded C++ methods/function.  Also, if you had a C++ class with virtual methods, it would only make one Python wrapper function and then reuse across all wrapped subclasses. </p>
<p>Under the covers of all of this, the implementation basically evolved into a sophisticated macro preprocessor coupled with a pattern matching engine built on top of the C++ type system [...] This whole pattern matching approach had a huge power if you knew what you were doing [...]</p>
<p>In hindsight however, I think the complexity of Swig has exceeded anyone&#8217;s ability to fully understand it (including my own).  For example, to even make sense of what&#8217;s happening, you have to have a pretty solid grasp of the C/C++ type system (easier said than done). Couple that with all sorts of crazy pattern matching, low-level code fragments, and a ton of macro definitions, your head will literally explode if you try to figure out what&#8217;s happening. So far as I know, recent versions of Swig have even combined all of this type-pattern matching with regular expressions. I can&#8217;t even fathom it.</p>
<p>Sadly, my involvement was Swig was an unfortunate casualty of my academic career biting the dust. By 2005, I was so burned out of working on it and so sick of what I was doing, I quite literally put all of my computer stuff aside to go play in a band for a few years. After a few years, I came back to programming (obviously), but not to keep working on the same stuff. <em>In particularly, I will die quite happy if I never have to look at another line of C++ code ever again.</em>  No, I would much rather fling my toddlers, ride my bike, play piano, or do just about anything than ever do that again.
</p></blockquote>
<p>From this <a href="http://mail.python.org/pipermail/python-dev/2011-August/113277.html">Swig mailing list entry</a>.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.pixelmonkey.org/2011/11/03/the-cpp-trap/feed</wfw:commentRss>
		<slash:comments>3</slash:comments>
		</item>
		<item>
		<title>import this: learning the Zen of Python with code and slides</title>
		<link>http://www.pixelmonkey.org/2011/10/29/import-this?utm_source=rss&#038;utm_medium=rss&#038;utm_campaign=import-this</link>
		<comments>http://www.pixelmonkey.org/2011/10/29/import-this#comments</comments>
		<pubDate>Sun, 30 Oct 2011 02:27:25 +0000</pubDate>
		<dc:creator>pixelmonkey</dc:creator>
				<category><![CDATA[Computer Science]]></category>
		<category><![CDATA[Open Source]]></category>
		<category><![CDATA[Programming]]></category>
		<category><![CDATA[Startups]]></category>
		<category><![CDATA[Technology]]></category>

		<guid isPermaLink="false">http://www.pixelmonkey.org/?p=817</guid>
		<description><![CDATA[It&#8217;s hard to find me gushing more unapologetically than when I talk about the virtues of my favorite programming language, Python. Indeed, my life for the last 3 years has been dominated by the language. In many ways, pursuing a startup and enduring the associated financial hardship was partially because I had become frustrated with [...]]]></description>
			<content:encoded><![CDATA[<p>It&#8217;s hard to find me gushing more unapologetically than when I talk about the virtues of my favorite programming language, Python.</p>
<p><a href="http://xkcd.com/353/" target="_blank"><img src="http://imgs.xkcd.com/comics/python.png" alt="" title="import antigravity" width="518" height="588" class="aligncenter size-full wp-image-823" /></a></p>
<p>Indeed, my life for the last 3 years has been dominated by the language. In many ways, <a href="http://www.pixelmonkey.org/2010/10/16/what-one-does" title="What One Does">pursuing a startup</a> and enduring the <a href="http://www.pixelmonkey.org/2011/04/02/not-for-the-faint-of-heart" title="Startups: Not for the faint of heart">associated financial hardship</a> was partially because I had become <a href="http://www.pixelmonkey.org/2007/01/27/solving-accidents-and-essences-of-programming-with-better-languages" title="Solving “accidents” and “essences” of programming with better languages">frustrated with using Java</a> in my full-time work and wanted to convert hobby projects I was building outside of work hours into full-fledged projects.</p>
<p><span id="more-817"></span></p>
<p>Something else I noticed in the last three years is that my programming life has become very zen-like. I now rarely discuss or debate things like programming language features, strange constructs like generics, or which framework to use or ignore. Instead, I spend most of my time building a product that people love. My colleagues and I communicate with code. And what better language to communicate in than arguably the world&#8217;s most readable? What better language to deliver value in than  one that simply gets out of your way?</p>
<p>I therefore get a great amount of joy of showing other people what the Zen of Python can mean in their lives. Last year, I gave a training course to a 20-person team of government employees who were using dated languages like Fortran and COBOL to build important government systems. A bright manager in the organization realized how much more productive their team could be if they stopped worrying about compiler versions and IDEs and started thinking in code. But the key was to understand the value of Python, not necessarily as a language with a certain set of features, but as a way of doing things, as a cultural influence. This is a culture that says, &#8220;the language should fade away&#8221;, similarly to how Edward Tufte argues that the <a href="http://www.youtube.com/watch?v=YslQ2625TR4">chrome and administrative debris should fade away</a> when displaying content.</p>
<p>Since then, I have used these slides countless times to espouse the virtues of my favorite interpreter. This has included giving short seminars in NYC, training <a href="http://parse.ly">Parse.ly</a> interns and new hires (here&#8217;s <a href="http://www.flickr.com/photos/hackny/6212454931/in/photostream">a shot of me and two Parse.ly engineers, Michael and Zach</a>), holding Python office hours at HackNY&#8217;s hackathon (indeed, <a href="http://www.flickr.com/photos/hackny/6202768849/in/set-72157627798810758">here&#8217;s an action shot on Flickr</a> to prove it!), and introducing my friends to the joy of building software.</p>
<p><strong>Code and Slides: The Zen of Python in 3 days</strong></p>
<p>It&#8217;s therefore with elation that today I am able to provide the slides and materials for this talk free to the world on my Github account. Simply click here:</p>
<p><a href="https://github.com/Parsely/python-adv-slides">https://github.com/Parsely/python-adv-slides</a></p>
<p>Or, if you&#8217;re not interested in the code behind the slides (because the slides are actually created with the help of Python itself), you can go here to simply view them.</p>
<p><a href="http://pixelmonkey.org/pub/python-training/">http://pixelmonkey.org/pub/python-training/</a></p>
<p>(note, modern web browser like Chrome or Firefox recommended for speed and smoothness)</p>
<p>This may be my first &#8220;open source presentation&#8221;, in that the slide presentation itself is provided as code that is freely available, and reproducing the slide presentation is a matter of running a code generator.</p>
<p><strong>A touch of NLP with Python</strong></p>
<p>I mentioned that one of the reasons I love Python is because it gets out of your way. Nowhere is this more evident than Python&#8217;s ability to prototype algorithms to natural language processing and corpus linguistics problems, something I do everyday. The Natural Language Toolkit (NLTK) provides an excellent starting point from learning about this aspect of computer science.</p>
<p>Recently, <a href="http://parse.ly">Parse.ly</a> has gotten some new engineers on the team who are great Python programmers but without any background in NLP. To give them a taste of how well-suited Python is for this task, I gave a seminar entitled, &#8220;Just Enough NLP with Python&#8221;. Just as with the prior slides, you can view these online on Github:</p>
<p><a href="https://github.com/Parsely/python-nlp-slides ">https://github.com/Parsely/python-nlp-slides</a></p>
<p>And you can view the compiled slides here:</p>
<p><a href="http://pixelmonkey.org/pub/nlp-training/ ">http://pixelmonkey.org/pub/nlp-training/</a></p>
<p>Between these two pieces, you can learn the <a href="http://www.python.org/dev/peps/pep-0020/">Zen of Python (PEP 20)</a> very rapidly, and incorporate it into your everyday software life.</p>
<p>If you have any comments or feedback, feel free to reach out to me <a href="http://twitter.com/amontalenti">on Twitter</a>. I&#8217;d love to hear what you think. And if you, too, are bitten by the Python bug (as one of our Parse.ly interns <a href="http://twitter.com/#!/emmett9001/status/114769015972429825">recently was</a> in a <a href="https://twitter.com/#!/amontalenti/status/115275221329641472">big, almost romantic way</a>) then you should reach out to us, since <a href="http://parse.ly/jobs.html">we&#8217;re hiring</a>.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.pixelmonkey.org/2011/10/29/import-this/feed</wfw:commentRss>
		<slash:comments>2</slash:comments>
		</item>
		<item>
		<title>Engineers don&#8217;t become engineers</title>
		<link>http://www.pixelmonkey.org/2011/09/05/engineer-shortage?utm_source=rss&#038;utm_medium=rss&#038;utm_campaign=engineer-shortage</link>
		<comments>http://www.pixelmonkey.org/2011/09/05/engineer-shortage#comments</comments>
		<pubDate>Mon, 05 Sep 2011 21:19:47 +0000</pubDate>
		<dc:creator>pixelmonkey</dc:creator>
				<category><![CDATA[Computer Science]]></category>
		<category><![CDATA[Politics]]></category>
		<category><![CDATA[Startups]]></category>
		<category><![CDATA[Technology]]></category>

		<guid isPermaLink="false">http://www.pixelmonkey.org/?p=809</guid>
		<description><![CDATA[And, sadly, our top engineering graduates don’t always become engineers. They move into finance or management consulting — both of which pay far higher salaries than engineering. I have seen the dilemma that my engineering students at at Duke University have faced. Do they take a job in civil engineering that pays $70,000, or join [...]]]></description>
			<content:encoded><![CDATA[<blockquote><p>
And, sadly, our top engineering graduates don’t always become engineers. They move into finance or management consulting — both of which pay far higher salaries than engineering. I have seen the dilemma that my engineering students at at Duke University have faced. Do they take a job in civil engineering that pays $70,000, or join big Wall Street financial firm and make $120,000? With the hefty student loans that hang over their heads, most have made the financially sensible decision. In some years, half of our graduates have ended up taking jobs outside of engineering. Instead of developing new types of medical devices, renewable energy sources and ways to sustain the environment, my most brilliant students are designing new ways to help our investment banks engineer the financial system.</p>
<p>[...] We also need to make the engineering profession &#8220;cool&#8221; again, with the same sense of excitement and urgency in engineering and science that we saw during the Sputnik days. Back then, engineering was considered essential to the nation’s survival. Engineers and scientists were national heroes. It’s not that we don’t have problems to solve. The economy is in dire straits. Natural resources such as food, water, and crude oil are becoming scarce. Drug-resistant bacteria threaten us with doomsday plagues. But we’re not offering our best minds incentive to solve them.
</p></blockquote>
<p>From <a href="http://www.washingtonpost.com/national/on-innovations/president-obama-there-is-no-engineer-shortage/2011/09/01/gIQADpmpuJ_story.html">Mr. President, there is no engineer shortage</a>.</p>
<p>Luckily this is happening already in high tech in NYC, thanks to awesome programs like <a href="http://hackny.org">HackNY</a> and <a href="http://www.collabracode.com/">collabraCode</a> (both of which my startup <a href="http://parsely.com">Parse.ly</a> formally supported). As much as it pains me to say it, I also think <a href="http://en.wikipedia.org/wiki/The_Social_Network">The Social Network</a> may be seen as a cultural catalyst for software engineers becoming &#8220;cool&#8221;.</p>
<p>But high tech is only a small piece of the puzzle &#8212; we need the same active marketing for students&#8217; minds in biotech, education, medical research, civil engineering, etc.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.pixelmonkey.org/2011/09/05/engineer-shortage/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Upcoming: standing desk setup, Python training, Groovy/JavaScript articles</title>
		<link>http://www.pixelmonkey.org/2011/08/28/upcoming-2011-preview?utm_source=rss&#038;utm_medium=rss&#038;utm_campaign=upcoming-2011-preview</link>
		<comments>http://www.pixelmonkey.org/2011/08/28/upcoming-2011-preview#comments</comments>
		<pubDate>Sun, 28 Aug 2011 22:54:09 +0000</pubDate>
		<dc:creator>pixelmonkey</dc:creator>
				<category><![CDATA[Programming]]></category>
		<category><![CDATA[Startups]]></category>
		<category><![CDATA[Technology]]></category>

		<guid isPermaLink="false">http://www.pixelmonkey.org/?p=802</guid>
		<description><![CDATA[I&#8217;ve been quite busy with work lately, so haven&#8217;t had time to send a few posts toward my blog. However, I have been working on some spare time and work-related projects that I&#8217;d love to share with everyone here. Among them: Lifehacking through standing desks. I have created a standing desk setup for my home [...]]]></description>
			<content:encoded><![CDATA[<p>I&#8217;ve been quite busy with work lately, so haven&#8217;t had time to send a few posts toward my blog. However, I have been working on some spare time and work-related projects that I&#8217;d love to share with everyone here.</p>
<p>Among them:</p>
<ul>
<li><strong>Lifehacking through standing desks</strong>. I have created a <a href="https://plus.google.com/104910016488576834812/posts/C3rPcqZcT5k">standing desk setup</a> for my home office, and my investors in Parse.ly have created a <a href="http://www.betabeat.com/2011/07/08/thats-it-were-calling-it-the-healthy-start-up-office-craze-is-official/">healthy startup office in NYC</a>. I have some thoughts about this as it applies engineering and hacking to the thing many of us do most: sit in a desk chair all day.</li>
<li><strong>2-day Python Training Course</strong>. I have created a 2-day Python training course that helps existing programmers learn Python by comparing it very directly to languages they may already know, like C and Java. I gave this course to a group of government employees a few months ago. It has some interesting characteristics: I designed the whole course using ReStructured Text (ReST) and compiled it into a web-based presentation. This means that the entire course has the potential to be &#8220;open source&#8221; &#8212; exercises, slides, and all. I plan to release this to the public. For now, I am just clearing a few of the images I used in the course to make sure I don&#8217;t inadvertently  infringe copyright. After that, I will open to the public.</li>
<li><strong>Groovy/JavaScript articles go public domain.</strong> Some articles I wrote for GroovyMag and JSMag last year are now able to be published in the public domain. These include one about RESTful services with Groovy, one that talks about functional programming with JavaScript, and finally one that discusses a design for &#8220;metagrids&#8221; in ExtJS 3.x. I will put all three articles up on this blog once they are reformatted.</li>
</ul>
<p>Stay tuned!</p>
]]></content:encoded>
			<wfw:commentRss>http://www.pixelmonkey.org/2011/08/28/upcoming-2011-preview/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Groovy, the Python of Java</title>
		<link>http://www.pixelmonkey.org/2011/04/09/groovy-the-python-of-java?utm_source=rss&#038;utm_medium=rss&#038;utm_campaign=groovy-the-python-of-java</link>
		<comments>http://www.pixelmonkey.org/2011/04/09/groovy-the-python-of-java#comments</comments>
		<pubDate>Sat, 09 Apr 2011 22:32:03 +0000</pubDate>
		<dc:creator>pixelmonkey</dc:creator>
				<category><![CDATA[Open Source]]></category>
		<category><![CDATA[Programming]]></category>
		<category><![CDATA[Startups]]></category>
		<category><![CDATA[Technology]]></category>

		<guid isPermaLink="false">http://www.pixelmonkey.org/?p=730</guid>
		<description><![CDATA[I was a bona fide Java programmer for 5 years before I started working on Aleph Point and Parse.ly. I truly believe that Python and JavaScript are fundamentally better languages than Java for a variety of reasons born out of experience with each of them. (Note: Before this gets marked as flamebait, please notice that [...]]]></description>
			<content:encoded><![CDATA[<p>I was a bona fide Java programmer for 5 years before I started working on <a href="http://alephpoint.com">Aleph Point</a> and <a href="http://parse.ly">Parse.ly</a>. I truly believe that Python and JavaScript are fundamentally better languages than Java for a variety of reasons born out of experience with each of them. (<em>Note:</em> Before this gets marked as flamebait, please notice that not only was I Java programmer for more than 5 years, but I was also a Java open source contributor!) I have enormous respect for the Java open source community, which has produced some of the highest quality modules available anywhere.</p>
<p>Now, don&#8217;t get me wrong &#8212; Python also has <a href="http://docs.python.org/library/">batteries included</a>, and usually, when I think that I&#8217;m missing a great module I used to use in Java, it already exists in a much more powerful form in Python&#8217;s Standard Library or the wealth of modules on PyPI, GitHub, and Bitbucket. However, I believe in not reinventing the wheel, and so if a great open source tool exists in Java, I will want to interact with it.</p>
<p>One of these modules which we use extensively at Parse.ly is <a href="http://lucene.apache.org/solr/">Apache Solr</a>, and its surrounding <a href="http://lucene.apache.org/">Lucene project</a> modules. Lucene is an extremely mature framework for document indexing, and Solr is a powerful server-ization of that technology that fits well into complex, mixed language distributed systems. I know there are efforts &#8212; like <a href="https://bitbucket.org/mchaput/whoosh/wiki/Home">Whoosh</a> &#8212; to build fast search engines atop the Python language. And I applaud these efforts &#8212; more projects means more competition, and more competition means better products. However, I still believe that you go with the best of breed tools available for production software, and you try not to let religious arguments about programming language get in the way.</p>
<p>Lately, I have come across more and more Java open source projects that have no equivalent in Python, and which I would like to access. Knowing that I wanted to feel comfortable incorporating Java open source projects &#8212; beyond Solr, which was already nicely wrapped as a web service &#8212; I, at first, thought that I&#8217;d be forced to still live among the weeds of complex class and interface definitions, cumbersome Java IDEs, XML configuration files, and (IMO) time-wasting rabbit holes like dependency injection, configuration management, and classpath hell. And then I found <a href="http://groovy.codehaus.org/">Groovy</a>.</p>
<p><span id="more-730"></span></p>
<p><strong>The most under-rated language ever</strong></p>
<p>Groovy was released as one of the earliest dynamic languages written atop the JVM, back in 2003. I remember hearing about it back then and not &#8220;taking it seriously&#8221;, as we programmers often do with important, new technologies. I had the same ill feelings toward JavaScript until as late as 2007, but now consider myself more a JavaScript programmer than a Java one!</p>
<p>In truth, had I read James Strachan&#8217;s blog post discussing why he created Groovy, I would have probably paid more attention:</p>
<blockquote><p>
So I&#8217;ve been musing a little while if its time the Java platform had its own dynamic language designed from the ground up to work real nice with existing code; creating/extending objects normal Java can use and vice versa. Python/Jython&#8217;s a pretty good base &#8211; add the nice stuff from Ruby and maybe sprinkle on some AOP features and we could have a really Groovy new language for scripting Java objects, writing test cases and who knows, even doing real development in it.
</p></blockquote>
<p>I had thoughts like these back in my Java programming days, too. I would see features that were standard in other languages &#8212; concise list/map syntax, &#8220;bare&#8221; functions (that could live outside of class definitions), optional/dynamic typing, metaprogramming, a proper REPL, first-class functions &#8212; and think to myself, &#8220;Aren&#8217;t we missing a whole lot by lacking these features in Java?&#8221; The more I started to code Python and Java side-by-side, the more I started to realize that many &#8220;core&#8221; Java technologies were basically created to cope with inadequacies of the language itself. </p>
<p>For example, unit testing &#8220;frameworks&#8221; and formal IDE/debuggers are more popular in Java than other languages because of the lack of the REPL &#8212; dynamic language programmers tend to test their code from an interactive shell as a regular part of programming. Utility libraries like Apache Common Utils were created to cope with syntactic deficiencies around core types like lists and maps. And on and on.</p>
<p>Groovy is a &#8220;post-modern language&#8221; dynamic language. By that, I mean it is clearly inspired by and learns from the lessons of both Python and Ruby. It is also the world&#8217;s first programming language that was written <em>to target</em> an existing community of programmers. Let me explain. Python was not written &#8220;to target&#8221; C programmers or Visual Basic programmers. It was written as a new language altogether, not targeted at anyone in particular. However, Groovy was written &#8220;to target&#8221; Java programmers &#8212; it is the dynamic language Sun <em>should have</em> built for the JVM as dynamic languages gained popularity and the Java language stagnated.</p>
<p>Groovy is respectful of and cooperative with Java itself. One of its primary design goals is to live alongside existing Java code, even while Groovy&#8217;s syntax far surpasses that of Java. In this respect, Groovy plays a very similar role in the Java ecosystem that Python plays in the C ecosystem. However, unlike Python and C&#8217;s relationship, Groovy&#8217;s relationship with Java is bidirectional. What that means is that one can easily write Java libraries that execute Groovy code (provided the Groovy Language is on the classpath as a JAR), and Groovy libraries can easily execute Java code. In fact, you can even have complex relationships among these two languages, such as Groovy classes serving as base classes for Java classes and vice versa. </p>
<p>However, what&#8217;s perhaps most astonishing about Groovy is that it truly got <em>a whole lot of things right</em>. That is, the language simply is extremely well designed, and specifically greased for programmer productivity. It learned from the mistakes of existing dynamic languages, and made a dynamic language that is truly the &#8220;best of both worlds&#8221;. When I introduced the language to an engineer on my team at Parse.ly, he uttered some words that really stuck with me: &#8220;This language was clearly designed by very, very lazy programmers.&#8221;</p>
<p>So true. Typing is a chore &#8212; let&#8217;s do less of it to code without sacrificing readability. That&#8217;s the Groovy way.</p>
<p>Over the last several years, it has matured to the point where I feel extremely comfortable writing production code in Groovy, especially thanks to the surrounding ecosystem of the <a href="http://www.grails.org/">Grails</a> project.</p>
<p><strong>Python is still my muse, but Groovy is my Winston Wolf</strong></p>
<p>A famous character in the movie Pulp Fiction is Harvey Keitel&#8217;s &#8220;Winston Wolf&#8221;. He&#8217;s the underworld problem solver &#8212; a guy who gets things done with a no-nonsense attitude.</p>
<blockquote><p>Winston Wolf: If I&#8217;m curt with you, it&#8217;s because time is a factor. I think fast, I talk fast, and I need you two guys to act fast if you want to get out of this.</p></blockquote>
<p>Python is a beautiful language and will continue to be my language of choice for production code. However, I simply can&#8217;t ignore the enormous wealth of production-quality Java code that has been written for which there is no good Python equivalent. I also can&#8217;t ignore the unbelievable engineering effort that went into making the JVM a powerful, scalable, and stable platform for production software. I thought I&#8217;d have to throw this community away (for myself and my companies) due to the deficiencies of the Java language. However, I have come to realize that Groovy has proven itself the worthy successor to Java. (Yes, <em>successor</em> &#8212; as in, you would be a fool to write your code directly in Java these days.) And personally, I will never work on a Java project again without Groovy. Java is a mess, but Groovy is my clean-up man.</p>
<p>I have also observed that the &#8220;ported&#8221; JVM languages have failed. This was a surprise to me as it was happening, but in retrospect, is not as surprising. Jython and JRuby are simply not viable long-term open source projects. The target community is only those programmers who know both Python and Java or both Ruby and Java. And there was no great impetus to truly &#8220;learn&#8221; those environments, because Python programmers felt that they already &#8220;knew&#8221; Jython, since the language was the same. Is the benefit of having access to Java libraries worth the downside of using a non-standard VM for my primary programming language? Usually not.</p>
<p>Now, while I wasn&#8217;t even paying attention &#8212; slowly learning Groovy in my spare time and using it for small projects dependent on Java &#8212; it seems that the world of independent dynamic JVM languages has taken off. Groovy has not had nearly as much popularity as languages like <a href="http://scala-lang.org">Scala</a> (used at Twitter and Foursquare) or <a href="http://clojure.org">Clojure</a>. And Groovy lacks &#8220;sex appeal&#8221;, possibly because no significant large-scale projects have been documented atop Groovy and because the language is an incremental improvement on successful mixed-paradigm languages.</p>
<p>However, unlike Clojure and Scala, the Groovy language can be learned in a weekend by an existing Java programmer with dynamic language experience, and can be learned in a couple weeks by anyone else. And unlike those other languages, it does not try to be a fundamentally new programming language with new programming models. Instead, it simply dramatically improves the Java language itself using a syntax that becomes quickly familiar to dynamic programmers.</p>
<p>When you consider the cost/benefit analysis of learning Groovy &#8212; for a couple weeks of my time, I gain access to being able to easily script &#8212; and, with Grails, wrap as web services &#8212; an almost limitless supply of Java open source code, you realize you&#8217;d be a fool not to learn the language.</p>
<p>I like new stuff as much as the next guy, but Java is a language that is still used by millions of professional programmers across the world, and has proven its ability to be the basis for large projects. And Groovy is a 2X or 3X productivity improvement over Java, with full bi-directional compatibility with existing Java code? I&#8217;ll take that over a new-fangled &#8220;revolutionary&#8221; language any day!</p>
<p><strong>So, what&#8217;s so groovy about Groovy?</strong></p>
<p>Oh, nothing&#8230; just things like this:</p>

<div class="wp_syntax"><div class="code"><pre class="groovy" style="font-family:monospace;"><span style="color: #66cc66;">&#91;</span><span style="color: #ff0000;">&quot;Rob&quot;</span>, <span style="color: #ff0000;">&quot;Christopher&quot;</span>, <span style="color: #ff0000;">&quot;Joe&quot;</span>, <span style="color: #ff0000;">&quot;John&quot;</span><span style="color: #66cc66;">&#93;</span>.<span style="color: #663399;">findAll</span><span style="color: #66cc66;">&#123;</span> 
  it.<span style="color: #663399;">size</span><span style="color: #66cc66;">&#40;</span><span style="color: #66cc66;">&#41;</span> <span style="color: #66cc66;">&lt;</span> <span style="color: #66cc66;">=</span> <span style="color: #cc66cc;">4</span> 
<span style="color: #66cc66;">&#125;</span>.<span style="color: #663399;">each</span> <span style="color: #66cc66;">&#123;</span> 
  <span style="color: #993399;">println</span> it 
<span style="color: #66cc66;">&#125;</span>
<span style="color: #808080; font-style: italic;">// ==&gt; prints &quot;Rob&quot;, &quot;Joe&quot; and &quot;John&quot;</span></pre></div></div>

<p>Yes, we&#8217;re really not in Java anymore.  Let&#8217;s walk through the pain that is Java step by step to arrive at our Groovy salvation.</p>
<p>First, Java loves boilerplate. It really is an affliction of the language and the community.  A great example of this is Java&#8217;s take on module imports.</p>
<p>Even though Java has a great standard library that is extremely well-designed and complete (for the most part), it fails to make this standard library easily accessible to you.  That&#8217;s because all of Java&#8217;s best libraries are hidden in obtuse, deeply-nested library locations, and one can never remember where they are.  IDEs solve this problem by providing an &#8220;Organize Imports&#8221; facility, which expert Java programmers use instead of managing imports themselves. This problem, alone, puts Java IDEs on significantly more productive footing than simple text editors like vim.</p>
<p>Groovy says, &#8220;this is nonsense &#8212; stop the madness&#8221;.  In Groovy, a slew of commonly-used Java modules are simply imported automatically.  If you run into a namespace conflict, that&#8217;s OK &#8212; we&#8217;re all adults here.</p>

<div class="wp_syntax"><div class="code"><pre class="groovy" style="font-family:monospace;"><span style="color: #808080; font-style: italic;">// these are all automatic in every Groovy module you write</span>
<span style="color: #000000; font-weight: bold;">import</span> <span style="color: #a1a100;">java.lang.*</span><span style="color: #66cc66;">;</span>
<span style="color: #000000; font-weight: bold;">import</span> <span style="color: #a1a100;">java.util.*</span><span style="color: #66cc66;">;</span>
<span style="color: #000000; font-weight: bold;">import</span> <span style="color: #a1a100;">java.net.*</span><span style="color: #66cc66;">;</span>
<span style="color: #000000; font-weight: bold;">import</span> <span style="color: #a1a100;">java.io.*</span><span style="color: #66cc66;">;</span>
<span style="color: #000000; font-weight: bold;">import</span> <span style="color: #a1a100;">java.math.BigInteger</span><span style="color: #66cc66;">;</span>
<span style="color: #000000; font-weight: bold;">import</span> <span style="color: #a1a100;">java.math.BigDecimal</span><span style="color: #66cc66;">;</span>
<span style="color: #000000; font-weight: bold;">import</span> <span style="color: #a1a100;">groovy.lang.*</span><span style="color: #66cc66;">;</span>
<span style="color: #000000; font-weight: bold;">import</span> <span style="color: #a1a100;">groovy.util.*</span><span style="color: #66cc66;">;</span></pre></div></div>

<p>Note that <a href="http://groovy.codehaus.org/api/groovy/lang/package-tree.html">groovy.lang</a> and <a href="http://groovy.codehaus.org/api/groovy/util/package-tree.html">groovy.util</a> add significant utilities above and beyond Java.</p>
<p>Next up are the major data structures used by any modern programmer &#8212; lists and maps (aka dictionaries).  If you haven&#8217;t been doing Java in awhile, you won&#8217;t miss this kind of code.</p>
<pre>
List&lt;Integer&gt; someItems = Arrays.asList(new Integer[] {1, 2, 3, 4});
for (Integer item : someItems) {
    System.out.println(item);
}
Map&lt;String, String&gt; someMapping = new HashMap&lt;String , String&gt;() {{
    put("ST", "started);
    put("IP", "in progress");
    put("DN", "done");
}}
for (Map.Entry&lt;String, String&gt; entry : someMapping.entrySet()) {
    String key = entry.getKey();
    String value = entry.getValue();
    System.out.println(key + " => " + value);
}
</pre>
<p>Note that the above is about the <em>most concise possible</em> code you can write for these operations using standard Java facilities.  In fact, I have even tapped into some obscure features, using Arrays.asList to initialize the ArrayList (leveraging the fact that arrays, but not lists, have a concise initialization syntax) and leveraging <a href="http://stackoverflow.com/questions/1372113/meaning-of-new-class-initialization-idiom/1372124#1372124">double curly brace initialization</a> for the Map, which is an extremely non-standard and perhaps even overly inefficient technique.  (The alternative, though, is to write out someMapping.put(key, val) for each entry in the Map &#8212; ick).</p>
<p>Let&#8217;s look at this same syntax, but in Groovy.</p>

<div class="wp_syntax"><div class="code"><pre class="groovy" style="font-family:monospace;">someItems <span style="color: #66cc66;">=</span> <span style="color: #66cc66;">&#91;</span><span style="color: #cc66cc;">1</span>, <span style="color: #cc66cc;">2</span>, <span style="color: #cc66cc;">3</span>, <span style="color: #cc66cc;">4</span><span style="color: #66cc66;">&#93;</span>
someItems.<span style="color: #663399;">each</span> <span style="color: #66cc66;">&#123;</span>
  <span style="color: #993399;">println</span> it
<span style="color: #66cc66;">&#125;</span>
someMapping <span style="color: #66cc66;">=</span> <span style="color: #66cc66;">&#91;</span><span style="color: #ff0000;">&quot;ST&quot;</span>: <span style="color: #ff0000;">&quot;started&quot;</span>, <span style="color: #ff0000;">&quot;IP&quot;</span>: <span style="color: #ff0000;">&quot;in progress&quot;</span>, <span style="color: #ff0000;">&quot;DN&quot;</span>: <span style="color: #ff0000;">&quot;done&quot;</span><span style="color: #66cc66;">&#93;</span>
someMapping.<span style="color: #663399;">each</span> <span style="color: #66cc66;">&#123;</span> key, val <span style="color: #66cc66;">-&gt;</span>
  <span style="color: #993399;">println</span> <span style="color: #ff0000;">&quot;${key} =&gt; ${val}&quot;</span>
<span style="color: #66cc66;">&#125;</span></pre></div></div>

<p>Not only is this code more concise, it is also much more readable. The signal-to-noise ratio is much better.</p>
<p>Groovy has great support for <a href="http://en.wikipedia.org/wiki/Functional_programming">Functional Programming</a> and <a href="http://en.wikipedia.org/wiki/Domain-specific_language">Domain-Specific Languages</a>.</p>

<div class="wp_syntax"><div class="code"><pre class="groovy" style="font-family:monospace;"><span style="color: #808080; font-style: italic;">// first-class functions/methods and DSL syntax</span>
clean <span style="color: #66cc66;">=</span> <span style="color: #66cc66;">&#123;</span> text <span style="color: #66cc66;">-&gt;</span>
  text.<span style="color: #006600;">replaceAll</span><span style="color: #66cc66;">&#40;</span><span style="color: #ff0000;">&quot;[^A-Za-z]*&quot;</span>, <span style="color: #ff0000;">&quot;&quot;</span><span style="color: #66cc66;">&#41;</span>
<span style="color: #66cc66;">&#125;</span>
clean <span style="color: #ff0000;">&quot;my-text-*foo&quot;</span>
remove <span style="color: #66cc66;">=</span> someItems.<span style="color: #66cc66;">&amp;</span>remove
remove <span style="color: #cc66cc;">3</span>
someItems</pre></div></div>

<p>It retains support for loved Java features like switch statements, but these become much more powerful and concise, e.g. in this factory function that actually returns cleaner functions depending on the passed-in type.</p>

<div class="wp_syntax"><div class="code"><pre class="groovy" style="font-family:monospace;"><span style="color: #808080; font-style: italic;">// proper closure, switches and variable interpolation</span>
cleanerFactory <span style="color: #66cc66;">=</span> <span style="color: #66cc66;">&#123;</span> type <span style="color: #66cc66;">-&gt;</span> 
  <span style="color: #b1b100;">switch</span> <span style="color: #66cc66;">&#40;</span>type<span style="color: #66cc66;">&#41;</span> <span style="color: #66cc66;">&#123;</span>
    <span style="color: #b1b100;">case</span> <span style="color: #ff0000;">&quot;text&quot;</span>:
        <span style="color: #000000; font-weight: bold;">return</span> clean
    <span style="color: #b1b100;">case</span> <span style="color: #ff0000;">&quot;numbers&quot;</span>:
        <span style="color: #000000; font-weight: bold;">return</span> <span style="color: #66cc66;">&#123;</span> text <span style="color: #66cc66;">-&gt;</span>
            text.<span style="color: #006600;">replaceAll</span><span style="color: #66cc66;">&#40;</span><span style="color: #ff0000;">&quot;[^0-9]*&quot;</span>, <span style="color: #ff0000;">&quot;&quot;</span><span style="color: #66cc66;">&#41;</span>
        <span style="color: #66cc66;">&#125;</span>
    <span style="color: #000000; font-weight: bold;">default</span>:
        <span style="color: #000000; font-weight: bold;">throw</span> <span style="color: #000000; font-weight: bold;">new</span> <span style="color: #aaaadd; font-weight: bold;">IllegalArgumentException</span><span style="color: #66cc66;">&#40;</span><span style="color: #ff0000;">&quot;invalid type ${type}&quot;</span><span style="color: #66cc66;">&#41;</span>
  <span style="color: #66cc66;">&#125;</span>
<span style="color: #66cc66;">&#125;</span></pre></div></div>

<p>Using the cleanerFactory is a breeze, simply call it and you get back a function which you may then call. Yes, this is basically impossible in Java. To get something close, you&#8217;d have to make the factory return &#8220;Runnable&#8221; instances and then call .run() on the results.</p>

<div class="wp_syntax"><div class="code"><pre class="groovy" style="font-family:monospace;"><span style="color: #808080; font-style: italic;">// try/catch and bean syntax shorthand</span>
test <span style="color: #66cc66;">=</span> <span style="color: #ff0000;">&quot;my-text-*foo-1234&quot;</span>
<span style="color: #993399;">println</span> cleanerFactory<span style="color: #66cc66;">&#40;</span><span style="color: #ff0000;">&quot;text&quot;</span><span style="color: #66cc66;">&#41;</span><span style="color: #66cc66;">&#40;</span>test<span style="color: #66cc66;">&#41;</span>
<span style="color: #993399;">println</span> cleanerFactory<span style="color: #66cc66;">&#40;</span><span style="color: #ff0000;">&quot;numbers&quot;</span><span style="color: #66cc66;">&#41;</span><span style="color: #66cc66;">&#40;</span>test<span style="color: #66cc66;">&#41;</span>
<span style="color: #000000; font-weight: bold;">try</span> <span style="color: #66cc66;">&#123;</span>
  <span style="color: #993399;">println</span> cleanerFactory<span style="color: #66cc66;">&#40;</span><span style="color: #ff0000;">&quot;foo&quot;</span><span style="color: #66cc66;">&#41;</span><span style="color: #66cc66;">&#40;</span>test<span style="color: #66cc66;">&#41;</span>
<span style="color: #66cc66;">&#125;</span> <span style="color: #000000; font-weight: bold;">catch</span> <span style="color: #66cc66;">&#40;</span><span style="color: #aaaadd; font-weight: bold;">IllegalArgumentException</span> ex<span style="color: #66cc66;">&#41;</span> <span style="color: #66cc66;">&#123;</span>
  <span style="color: #993399;">println</span> <span style="color: #ff0000;">&quot;cleanerFactory returned exception: ${ex.class.simpleName}, ${ex.message}&quot;</span>
<span style="color: #66cc66;">&#125;</span></pre></div></div>

<p>Just like Java, Groovy supports classes. But it improves them by adding a concise syntax for declaring proper JavaBeans. The following class has getters, setters, and a keyword constructor autogenerated for you.</p>

<div class="wp_syntax"><div class="code"><pre class="groovy" style="font-family:monospace;"><span style="color: #808080; font-style: italic;">// classes and types, if you need them</span>
<span style="color: #000000; font-weight: bold;">class</span> Article <span style="color: #66cc66;">&#123;</span>
  <span style="color: #aaaadd; font-weight: bold;">String</span> title
  <span style="color: #aaaadd; font-weight: bold;">String</span> summary
  <span style="color: #aaaadd; font-weight: bold;">String</span> content
  <span style="color: #aaaadd; font-weight: bold;">Date</span> date
<span style="color: #66cc66;">&#125;</span>
article <span style="color: #66cc66;">=</span> <span style="color: #000000; font-weight: bold;">new</span> Article<span style="color: #66cc66;">&#40;</span>
    title: <span style="color: #ff0000;">&quot;Parse.ly uses Groovy, oh noes!&quot;</span>, 
    summary: <span style="color: #ff0000;">&quot;Didier resigns in protest&quot;</span>, 
    content: <span style="color: #ff0000;">&quot;Keith goes back to .Net, Toms returns to Ireland.  Ahhhh!&quot;</span>,
    date: <span style="color: #000000; font-weight: bold;">new</span> <span style="color: #aaaadd; font-weight: bold;">Date</span><span style="color: #66cc66;">&#40;</span><span style="color: #cc66cc;">2011</span>, <span style="color: #cc66cc;">3</span>, <span style="color: #cc66cc;">7</span><span style="color: #66cc66;">&#41;</span>
<span style="color: #66cc66;">&#41;</span>
article.<span style="color: #006600;">properties</span>.<span style="color: #663399;">each</span><span style="color: #66cc66;">&#123;</span><span style="color: #993399;">println</span> it<span style="color: #66cc66;">&#125;</span></pre></div></div>

<p>Also notice the special &#8220;.properties&#8221; property, which allows you to iterate over a JavaBean&#8217;s property without using Java&#8217;s obtuse reflection API.</p>

<div class="wp_syntax"><div class="code"><pre class="groovy" style="font-family:monospace;"><span style="color: #808080; font-style: italic;">// inheritance if you need it</span>
<span style="color: #000000; font-weight: bold;">class</span> WSJArticle <span style="color: #000000; font-weight: bold;">extends</span> Article <span style="color: #66cc66;">&#123;</span>
    <span style="color: #aaaadd; font-weight: bold;">List</span> topics
<span style="color: #66cc66;">&#125;</span>
wsj <span style="color: #66cc66;">=</span> <span style="color: #000000; font-weight: bold;">new</span> WSJArticle<span style="color: #66cc66;">&#40;</span>topics: <span style="color: #66cc66;">&#91;</span><span style="color: #ff0000;">&quot;US&quot;</span>, <span style="color: #ff0000;">&quot;Finance&quot;</span>, <span style="color: #ff0000;">&quot;World News&quot;</span><span style="color: #66cc66;">&#93;</span><span style="color: #66cc66;">&#41;</span>
wsj.<span style="color: #006600;">topics</span>.<span style="color: #663399;">each</span><span style="color: #66cc66;">&#123;</span> <span style="color: #993399;">println</span> it <span style="color: #66cc66;">&#125;</span></pre></div></div>

<p>Inheritance works exactly as expected, and follows Java rules. However, inheritance gets even better in Groovy because it loosens stupid rules that Java has, such as &#8220;final&#8221; classes.</p>

<div class="wp_syntax"><div class="code"><pre class="groovy" style="font-family:monospace;"><span style="color: #808080; font-style: italic;">// and sure, even call and inherit from Java code (even final classes!)</span>
<span style="color: #000000; font-weight: bold;">class</span> BetterDate <span style="color: #000000; font-weight: bold;">extends</span> <span style="color: #aaaadd; font-weight: bold;">Date</span> <span style="color: #66cc66;">&#123;</span>
    <span style="color: #000000; font-weight: bold;">def</span> getTimeString <span style="color: #66cc66;">=</span> <span style="color: #66cc66;">&#123;</span>
        <span style="color: #000000; font-weight: bold;">return</span> <span style="color: #ff0000;">&quot;{this.time}&quot;</span>
    <span style="color: #66cc66;">&#125;</span>
<span style="color: #66cc66;">&#125;</span>
<span style="color: #993399;">println</span> <span style="color: #000000; font-weight: bold;">new</span> BetterDate<span style="color: #66cc66;">&#40;</span><span style="color: #66cc66;">&#41;</span>.<span style="color: #006600;">timeString</span></pre></div></div>

<p>It&#8217;s simply not possible to subclass Date in Java, but Groovy has no problem with that. We&#8217;re all adults here.</p>

<div class="wp_syntax"><div class="code"><pre class="groovy" style="font-family:monospace;"><span style="color: #808080; font-style: italic;">// and sure, use Groovy scripting constructs with existing Java APIs!</span>
lotsaItems <span style="color: #66cc66;">=</span> <span style="color: #66cc66;">&#91;</span><span style="color: #cc66cc;">1</span>, <span style="color: #cc66cc;">1</span>, <span style="color: #cc66cc;">2</span>, <span style="color: #cc66cc;">2</span>, <span style="color: #cc66cc;">2</span>, <span style="color: #cc66cc;">3</span>, <span style="color: #cc66cc;">3</span>, <span style="color: #cc66cc;">3</span>, <span style="color: #cc66cc;">3</span>, <span style="color: #cc66cc;">3</span><span style="color: #66cc66;">&#93;</span>
<span style="color: #993399;">println</span> <span style="color: #aaaadd; font-weight: bold;">Collections</span>.<span style="color: #006600;">frequency</span><span style="color: #66cc66;">&#40;</span>lotsaItems, <span style="color: #cc66cc;">3</span><span style="color: #66cc66;">&#41;</span>
<span style="color: #aaaadd; font-weight: bold;">Collections</span>.<span style="color: #006600;">shuffle</span><span style="color: #66cc66;">&#40;</span>lotsaItems<span style="color: #66cc66;">&#41;</span>
<span style="color: #993399;">println</span> lotsaItems</pre></div></div>

<p>The above is an example of using existing Java APIs. Collections is surely a nice static class. Groovy lets you use it to your heart&#8217;s content.</p>
<p>The API for the Collections.binarySearch method is written as:</p>
<pre>
static &lt;T&gt; int binarySearch(List&lt;? extends T&gt; list, T key, Comparator&lt;? super T&gt; c)
</pre>
<p>Yes, that is &#8220;documentation&#8221; <img src='http://www.pixelmonkey.org/wordpress/wp-includes/images/smilies/icon_smile.gif' alt=':-)' class='wp-smiley' />   So basically, I need to create a class that implements the Comparator interface, and then I need to pass that comparator to this method along with my list. That will require a lot of angle brackets to get the generics right. Hmm, who cares, let&#8217;s just do it the easy way: in Groovy.</p>

<div class="wp_syntax"><div class="code"><pre class="groovy" style="font-family:monospace;"><span style="color: #808080; font-style: italic;">// even existing, complex APIs work fine in Groovy, and with less code!</span>
comparator <span style="color: #66cc66;">=</span> <span style="color: #66cc66;">&#91;</span>
  compare: <span style="color: #66cc66;">&#123;</span> a, b <span style="color: #66cc66;">-&gt;</span> a.<span style="color: #006600;">equals</span><span style="color: #66cc66;">&#40;</span>b<span style="color: #66cc66;">&#41;</span> <span style="color: #66cc66;">?</span> <span style="color: #cc66cc;">0</span> : <span style="color: #aaaadd; font-weight: bold;">Math</span>.<span style="color: #006600;">abs</span><span style="color: #66cc66;">&#40;</span>a<span style="color: #66cc66;">&#41;</span> <span style="color: #66cc66;">&lt;</span> <span style="color: #aaaadd; font-weight: bold;">Math</span>.<span style="color: #006600;">abs</span><span style="color: #66cc66;">&#40;</span>b<span style="color: #66cc66;">&#41;</span> <span style="color: #66cc66;">?</span> <span style="color: #66cc66;">-</span><span style="color: #cc66cc;">1</span> : <span style="color: #cc66cc;">1</span> <span style="color: #66cc66;">&#125;</span>
<span style="color: #66cc66;">&#93;</span> <span style="color: #000000; font-weight: bold;">as</span> <span style="color: #aaaadd; font-weight: bold;">Comparator</span>
<span style="color: #993399;">println</span> <span style="color: #aaaadd; font-weight: bold;">Collections</span>.<span style="color: #006600;">binarySearch</span><span style="color: #66cc66;">&#40;</span><span style="color: #66cc66;">&#91;</span><span style="color: #cc66cc;">0</span>, <span style="color: #cc66cc;">2</span>, <span style="color: #cc66cc;">5</span>, <span style="color: #cc66cc;">7</span>, <span style="color: #cc66cc;">8</span><span style="color: #66cc66;">&#93;</span>, <span style="color: #cc66cc;">5</span>, comparator<span style="color: #66cc66;">&#41;</span></pre></div></div>

<p>This shows off the ability of Groovy to easily coerce values using some very intelligent rules. Comparator is an interface that expects a &#8220;compare&#8221; method &#8212; therefore, we can coerce a map with a &#8220;compare&#8221; key and a function value into an implementation of that interface.</p>
</pre>

<div class="wp_syntax"><div class="code"><pre class="groovy" style="font-family:monospace;"><span style="color: #808080; font-style: italic;">// convenience features abound, like heredocs and safe pointer access</span>
myDocument <span style="color: #66cc66;">=</span> <span style="color: #ff0000;">&quot;&quot;&quot;
  This is a long document...
&quot;&quot;&quot;</span>
foo <span style="color: #66cc66;">=</span> <span style="color: #66cc66;">&#91;</span>myDoc: <span style="color: #000000; font-weight: bold;">null</span><span style="color: #66cc66;">&#93;</span>
<span style="color: #993399;">println</span> foo.<span style="color: #006600;">myDoc</span><span style="color: #66cc66;">?</span>.<span style="color: #663399;">size</span><span style="color: #66cc66;">&#40;</span><span style="color: #66cc66;">&#41;</span> <span style="color: #808080; font-style: italic;">// returns null rather than an exception</span></pre></div></div>

<p>If I had a dime for every time I noticed Java programmers using StringBuilder to work around its lack of multi-line strings, or adding extra methods just to do null checks... well, I'd be very rich indeed <img src='http://www.pixelmonkey.org/wordpress/wp-includes/images/smilies/icon_smile.gif' alt=':)' class='wp-smiley' />  Groovy says -- no need to complicate your life with that noise.</p>

<div class="wp_syntax"><div class="code"><pre class="groovy" style="font-family:monospace;"><span style="color: #808080; font-style: italic;">// and type coercion that actually works!</span>
set <span style="color: #66cc66;">=</span> <span style="color: #66cc66;">&#91;</span><span style="color: #cc66cc;">1</span>, <span style="color: #cc66cc;">2</span>, <span style="color: #cc66cc;">3</span>, <span style="color: #cc66cc;">4</span>, <span style="color: #cc66cc;">5</span><span style="color: #66cc66;">&#93;</span> <span style="color: #000000; font-weight: bold;">as</span> <span style="color: #aaaadd; font-weight: bold;">Set</span>
<span style="color: #cc66cc;">5</span> <span style="color: #b1b100;">in</span> set
<span style="color: #808080; font-style: italic;">// ==&gt; true!</span></pre></div></div>

<p>Yes, the in keyword. Yes, lists can be converted to sets. Because that makes sense!</p>

<div class="wp_syntax"><div class="code"><pre class="groovy" style="font-family:monospace;"><span style="color: #808080; font-style: italic;">// this is a feature I wish Python had -- JavaScript-like map syntax</span>
map <span style="color: #66cc66;">=</span> <span style="color: #66cc66;">&#91;</span>:<span style="color: #66cc66;">&#93;</span>
map.<span style="color: #006600;">item1</span> <span style="color: #66cc66;">=</span> <span style="color: #ff0000;">&quot;foo&quot;</span>
map.<span style="color: #006600;">item2</span> <span style="color: #66cc66;">=</span> <span style="color: #ff0000;">&quot;bar&quot;</span>
map.<span style="color: #663399;">each</span> <span style="color: #66cc66;">&#123;</span> <span style="color: #993399;">println</span> it <span style="color: #66cc66;">&#125;</span>
<span style="color: #808080; font-style: italic;">// ==&gt; &quot;item1&quot;=&quot;foo&quot;, &quot;item2&quot;=&quot;bar&quot;</span>
<span style="color: #993399;">println</span> <span style="color: #ff0000;">&quot;done&quot;</span></pre></div></div>

<p>Groovy also learns a little from JavaScript -- maps are accessible using either key index or dot syntax. I personally like this, I know some Python people won't.</p>

<div class="wp_syntax"><div class="code"><pre class="groovy" style="font-family:monospace;"><span style="color: #808080; font-style: italic;">// nice range and slice syntax</span>
items <span style="color: #66cc66;">=</span> <span style="color: #66cc66;">&#91;</span><span style="color: #cc66cc;">1</span>, <span style="color: #cc66cc;">2</span>, <span style="color: #cc66cc;">3</span>, <span style="color: #cc66cc;">4</span>, <span style="color: #cc66cc;">5</span><span style="color: #66cc66;">&#93;</span>
<span style="color: #993399;">println</span> items<span style="color: #66cc66;">&#91;</span><span style="color: #cc66cc;">0</span>..<span style="color: #cc66cc;">2</span><span style="color: #66cc66;">&#93;</span>
<span style="color: #b1b100;">for</span> <span style="color: #66cc66;">&#40;</span>i <span style="color: #b1b100;">in</span> <span style="color: #cc66cc;">0</span>..<span style="color: #cc66cc;">5</span><span style="color: #66cc66;">&#41;</span> <span style="color: #66cc66;">&#123;</span> <span style="color: #993399;">println</span> i <span style="color: #66cc66;">&#125;</span></pre></div></div>

<p>Similar to Python's slice syntax, Groovy supports a "Range" type using two dots. It works where you expect it to: array indexing, for loops.</p>
<p>Using Grails, the standard web framework for Groovy, you can write simple RESTful, JSON web services in just tens of lines of code. e.g., here's a Grails controller that renders the result of a function as JSON.</p>

<div class="wp_syntax"><div class="code"><pre class="groovy" style="font-family:monospace;"><span style="color: #000000; font-weight: bold;">package</span> <span style="color: #a1a100;">service</span>
<span style="color: #000000; font-weight: bold;">import</span> <span style="color: #a1a100;">com.thirdparty.library.ContentExtractor</span>
<span style="color: #000000; font-weight: bold;">import</span> <span style="color: #a1a100;">grails.converters.JSON</span>
&nbsp;
<span style="color: #000000; font-weight: bold;">class</span> ParseController <span style="color: #66cc66;">&#123;</span>
  <span style="color: #000000; font-weight: bold;">def</span> contentExtractor <span style="color: #66cc66;">=</span> <span style="color: #000000; font-weight: bold;">new</span> ContentExtractor<span style="color: #66cc66;">&#40;</span><span style="color: #66cc66;">&#41;</span>
  <span style="color: #000000; font-weight: bold;">def</span> index <span style="color: #66cc66;">=</span> <span style="color: #66cc66;">&#123;</span>
    <span style="color: #000000; font-weight: bold;">def</span> article <span style="color: #66cc66;">=</span> contentExtractor.<span style="color: #006600;">extractContent</span><span style="color: #66cc66;">&#40;</span>params.<span style="color: #006600;">url</span><span style="color: #66cc66;">&#41;</span>
    render article <span style="color: #000000; font-weight: bold;">as</span> JSON
  <span style="color: #66cc66;">&#125;</span>
<span style="color: #66cc66;">&#125;</span></pre></div></div>

<p>This will respond to a service like http://service:8080/parse?url=http://google.com with a JSON document containing the Java properties from the article object.</p>
<p>Seriously, how much easier can it get to wrap up a Java library as a JSON web service? Not much.</p>

<div class="wp_syntax"><div class="code"><pre class="groovy" style="font-family:monospace;"><span style="color: #808080; font-style: italic;">// in short, a pretty language worth looking at</span>
<span style="color: #993399;">println</span> <span style="color: #ff0000;">&quot;DONE.&quot;</span></pre></div></div>

<p>Download <a href="http://groovy.codehaus.org/">Groovy</a> and <a href="http://grails.org/">Grails</a> to start playing around!</p>
]]></content:encoded>
			<wfw:commentRss>http://www.pixelmonkey.org/2011/04/09/groovy-the-python-of-java/feed</wfw:commentRss>
		<slash:comments>20</slash:comments>
		</item>
		<item>
		<title>Startups: Not for the faint of heart</title>
		<link>http://www.pixelmonkey.org/2011/04/02/not-for-the-faint-of-heart?utm_source=rss&#038;utm_medium=rss&#038;utm_campaign=not-for-the-faint-of-heart</link>
		<comments>http://www.pixelmonkey.org/2011/04/02/not-for-the-faint-of-heart#comments</comments>
		<pubDate>Sat, 02 Apr 2011 20:07:38 +0000</pubDate>
		<dc:creator>pixelmonkey</dc:creator>
				<category><![CDATA[Startups]]></category>
		<category><![CDATA[Technology]]></category>

		<guid isPermaLink="false">http://www.pixelmonkey.org/?p=694</guid>
		<description><![CDATA[Early on during this startup adventure, a person I trust told me, &#8220;Watch out &#8212; startups aren&#8217;t for the faint of heart.&#8221; Looking back on my personal net income graph from 2009 to present, I can see what he meant. May 2009 is when I entered Dreamit Ventures to begin working on what would become [...]]]></description>
			<content:encoded><![CDATA[<p>Early on during this startup adventure, a person I trust told me, &#8220;Watch out &#8212; startups aren&#8217;t for the faint of heart.&#8221; Looking back on my personal net income graph from 2009 to present, I can see what he meant.</p>
<div align="center"><a href="http://www.pixelmonkey.org/wordpress/wp-content/uploads/2011/02/neticome_crazy.png"><img src="http://www.pixelmonkey.org/wordpress/wp-content/uploads/2011/02/neticome_crazy-300x148.png" alt="" title="My Net Income, 2009 - 2010" width="300" height="148" class="size-medium wp-image-695" /></a></div>
<p>May 2009 is when I entered <a href="http://dreamitventures.com">Dreamit Ventures</a> to begin working on what would become <a href="http://parsely.com">Parse.ly</a>. That&#8217;s when I plunged my &#8220;savings buffer&#8221; into the company. The few months after that had me frantically trying to recover from the realization that startup progress is measured in months and years, not days and weeks.</p>
<p>Sachin and I switched gears from targeting consumers with a free product to targeting large online content properties with a paid product, and bootstrapped the company with side consulting gigs. We didn&#8217;t tell anyone we did the side consulting work (unless they specifically asked). We watched other entrepreneurs go into credit card debt and borrow money from trusting friends and relatives. We didn&#8217;t believe in that, so we took the hard road of &#8220;earning our survival&#8221;.</p>
<p>However, our costs were going up, not down, as we pursued a more ambitious product with more demanding clients. Also, my expenses skyrocketed as COBRA disappeared for my health insurance and I had to pay for horribly overpriced sole proprietorship plans. (Fact: America&#8217;s broken healthcare system is harmful to entrepreneurs.) I knew I needed to do something to &#8220;stop the bleeding&#8221; on my financial situation &#8212; so, I took on more consulting gigs&#8230;</p>
<p><span id="more-694"></span></p>
<p>My consulting gigs only started earning me enough to stabilize my personal expenses late last year. That&#8217;s when you see my net income turn into a very nice flat line. Those months felt more secure than any of the preceding ones. It was around then that I realized a lot of people took advantage of my desperate position and underpaid me. I raised my prices and started to round up talented engineers to work with me as a distributed team. That got things under control.</p>
<p>Mid-to-end of 2010, I felt like I could conquer the world. My finances stable, <i>I didn&#8217;t need me no stinkin&#8217; investors</i>. We could bootstrap this company to success ourselves. After a year of hard work, I had plentiful consulting clients, and more knocking down my door. There was a stable 50/50 split between Parse.ly time and paid consulting time. We were also on the verge of closing big contracts for Parse.ly. I could cover my expenses well, and saw lots of personal gain in my future. My consulting company even seemed like a nicely profitable and happy company in its own right.</p>
<p>Of course, it was around this time that investors finally decided to notice Parse.ly and that <a href="http://blog.parse.ly/post/2908469289/parse-ly-closes-800k-financing-round">we closed financing</a>. Note to entrepreneurs &#8212; <a href="http://bit.ly/option-bet">no one ever gives you money when you actually need it</a>!</p>
<p>Mid-January was first time in 2 years that I had health insurance paid by someone else and my first &#8220;real paycheck&#8221; in 2 years. January and February have been amazing, productive, ambitious, and life-changing months. So proud of Parse.ly team and what&#8217;s coming up next for us.</p>
<p>In all, the past 18 months has been a crazy ride, but I survived! Personal relationships were strained, but not soured. Financial pressure applied, but not to the breaking point.</p>
<div align="center"><a href="http://www.pixelmonkey.org/wordpress/wp-content/uploads/2011/02/netincome_aleph.png"><img src="http://www.pixelmonkey.org/wordpress/wp-content/uploads/2011/02/netincome_aleph-300x144.png" alt="" title="netincome_aleph" width="300" height="144" class="aligncenter size-medium wp-image-704" /></a></div>
<p>This graph above is also quite an interesting side effect of this process. It shows the net income not for me personally, but for my consulting company, Aleph Point, Inc. In the span of 10 months, I took my consulting company from a 1-man shop to a profitable, legitimate company. That required me to wear a &#8220;CEO hat&#8221; and focus on things like profit margins, contract negotiation, and customer acquisition. What I like about this graph is that it&#8217;s a hockey stick profit chart. True, consulting work is not scalable, but it sure is profitable. Of course, due to Parse.ly&#8217;s funding round, I now need a bigger hockey stick.</p>
<p><b>&#8220;Don&#8217;t do other things?&#8221;</b></p>
<p>I wanted to write about this experience because it directly contradicts some advice one of my online mentors, Paul Graham, gave in his essay, <a href="http://www.paulgraham.com/die.html">&#8220;How Not to Die&#8221;</a>. He wrote:</p>
<blockquote><p>
The number one thing not to do is other things. If you find yourself saying a sentence that ends with &#8220;but we&#8217;re going to keep working on the startup,&#8221; you are in big trouble. Bob&#8217;s going to grad school, but we&#8217;re going to keep working on the startup. We&#8217;re moving back to Minnesota, but we&#8217;re going to keep working on the startup. We&#8217;re taking on some consulting projects, but we&#8217;re going to keep working on the startup. You may as well just translate these to &#8220;we&#8217;re giving up on the startup, but we&#8217;re not willing to admit that to ourselves,&#8221; because that&#8217;s what it means most of the time. A startup is so hard that working on it can&#8217;t be preceded by &#8220;but.&#8221;
</p></blockquote>
<p>If I hadn&#8217;t worked on my consulting projects last year, Parse.ly would have died. <b>PERIOD.</b> PG is often right, but he&#8217;s wrong on this one. I agree that startups require your undivided attention. But surviving isn&#8217;t a compromise &#8212; it&#8217;s a necessity. Do it however you possibly can.</p>
<p>In any event, I learned a lot from this experience. On to the next! It&#8217;s time to pump some green for Parse.ly!</p>
<p><strong>Hacker News</strong></p>
<p>Oh, wow. I ended up on the front page of Hacker News. <a href="http://news.ycombinator.com/item?id=2401483">Check out the great comments and discussion going on there</a>. Also, feel free to check out <a href="http://www.pixelmonkey.org/category/technology/startups">some other posts I&#8217;ve written about startups</a>, such as:</p>
<ul>
<li><a href="http://www.pixelmonkey.org/2009/12/11/ideas-and-execution">Ideas and Execution</a></li>
<li><a href="http://www.pixelmonkey.org/2010/10/16/what-one-does">What One Does</a></li>
<li><a href="http://www.pixelmonkey.org/2010/10/23/the-startup-diet">The Startup Diet</a></li>
<li><a href="http://www.pixelmonkey.org/2010/12/13/its-easier-to-play-the-option-than-the-bet">It&#8217;s easier to play the option than the bet</a></li>
</ul>
]]></content:encoded>
			<wfw:commentRss>http://www.pixelmonkey.org/2011/04/02/not-for-the-faint-of-heart/feed</wfw:commentRss>
		<slash:comments>10</slash:comments>
		</item>
		<item>
		<title>Understanding Wisconsin protests with big language data</title>
		<link>http://www.pixelmonkey.org/2011/03/02/understanding-wisconsin-protests-with-big-language-data?utm_source=rss&#038;utm_medium=rss&#038;utm_campaign=understanding-wisconsin-protests-with-big-language-data</link>
		<comments>http://www.pixelmonkey.org/2011/03/02/understanding-wisconsin-protests-with-big-language-data#comments</comments>
		<pubDate>Thu, 03 Mar 2011 03:57:22 +0000</pubDate>
		<dc:creator>pixelmonkey</dc:creator>
				<category><![CDATA[Books]]></category>
		<category><![CDATA[Economics]]></category>
		<category><![CDATA[Politics]]></category>
		<category><![CDATA[Technology]]></category>
		<category><![CDATA[US Government]]></category>

		<guid isPermaLink="false">http://www.pixelmonkey.org/?p=717</guid>
		<description><![CDATA[I made an interesting discovery today. &#8220;Free Market&#8221; vs. &#8220;Labor Union&#8221; in Google Ngram Book Viewer Explains why no one has heard of labor unions and everyone is raving about the free market (by the way, you can download the entire dataset behind this neat little Google Labs project)]]></description>
			<content:encoded><![CDATA[<p>I made an interesting discovery today.</p>
<div align="center"><a href="http://www.pixelmonkey.org/wordpress/wp-content/uploads/2011/03/wisconsin.png"><img src="http://www.pixelmonkey.org/wordpress/wp-content/uploads/2011/03/wisconsin-300x122.png" alt="" title="Understanding Wisconsin Protests with Language" width="300" height="122" class="aligncenter size-medium wp-image-719" /></a></div>
<p><a href="http://ngrams.googlelabs.com/graph?content=free+market,labor+union&#038;year_start=1900&#038;year_end=2000&#038;corpus=0&#038;smoothing=3">&#8220;Free Market&#8221; vs. &#8220;Labor Union&#8221; in Google Ngram Book Viewer</a></p>
<p>Explains why no one has heard of labor unions and everyone is raving about the free market <img src='http://www.pixelmonkey.org/wordpress/wp-includes/images/smilies/icon_smile.gif' alt=':)' class='wp-smiley' /> </p>
<p>(by the way, you can <a href="http://ngrams.googlelabs.com/datasets">download the entire dataset</a> behind this neat little Google Labs project)</p>
]]></content:encoded>
			<wfw:commentRss>http://www.pixelmonkey.org/2011/03/02/understanding-wisconsin-protests-with-big-language-data/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>It&#8217;s easier to play the option than the bet</title>
		<link>http://www.pixelmonkey.org/2010/12/13/its-easier-to-play-the-option-than-the-bet?utm_source=rss&#038;utm_medium=rss&#038;utm_campaign=its-easier-to-play-the-option-than-the-bet</link>
		<comments>http://www.pixelmonkey.org/2010/12/13/its-easier-to-play-the-option-than-the-bet#comments</comments>
		<pubDate>Mon, 13 Dec 2010 20:42:24 +0000</pubDate>
		<dc:creator>pixelmonkey</dc:creator>
				<category><![CDATA[Startups]]></category>
		<category><![CDATA[Technology]]></category>

		<guid isPermaLink="false">http://www.pixelmonkey.org/?p=543</guid>
		<description><![CDATA[Let&#8217;s say that you want to make some money at the horse tracks. The guy behind the booth gives you the following choice: The Bet. You can place a bet now, before the race starts, on the horse with, in your view, the best odds of winning. The Option. Instead of betting now, he will [...]]]></description>
			<content:encoded><![CDATA[<p>Let&#8217;s say that you want to make some money at the horse tracks. The guy behind the booth gives you the following choice:</p>
<ol>
<li><strong>The Bet</strong>. You can place a bet now, before the race starts, on the horse with, in your view, the best odds of winning.</li>
<li><strong>The Option</strong>. Instead of betting now, he will sell you an option. The option gives you the right to bet on any horse <em>during</em> the race, up until 5 seconds before the first horse crosses the finish line. However, there&#8217;s a small catch: everyone else who owns this option has the same right, and only 3 gamblers are allowed per horse during the race. If all the spots fill up, you simply get your money back. Further, each other gambler&#8217;s choice will be made publicly available to others during the race.</li>
</ol>
<p>Most people, even if they don&#8217;t know much about horse betting, will rightfully think <strong>The Option</strong> is the way to go.  No matter how much information you might have about each of the horses and riders before the race, the information you gather <em>during</em> the race is much more valuable. A top-ranked horse might break a leg, or its rider might trip up on the start.  Even if you pick a favorite before the race begins, once it gets going and you see him lagging behind, the economic reality put in front of you will override your speculative capacities.</p>
<p><span id="more-543"></span></p>
<p>In short, it&#8217;s easier to play the option than the bet. It&#8217;s less risky. It&#8217;s more fun. There are less ways to lose. So, it&#8217;s no surprise most horse betting does not work this way.</p>
<div align="center"><img src="http://www.pixelmonkey.org/wordpress/wp-content/uploads/2010/12/800px-The_Horse_in_Motion-300x186.jpg" alt="" title="The Horse in Motion" width="300" height="186" class="aligncenter size-medium wp-image-689" /></div>
<p>However, let&#8217;s analyze the interesting crowd behavior that emerges during a race where The Option is available.</p>
<p><strong>Some Examples</strong></p>
<p>Let&#8217;s say one horse suddenly pulls ahead of the pack.  Those who are paying attention and who hold the option will quickly exercise it. Many other gamblers will miss their opportunity, creating an oversubscribed horse.</p>
<p>Take another example. Since the bets are public, other gamblers will be inclined to pay attention to signals from the gamblers with the best past record of picking horses. If a well-known gambler with an excellent record picks a horse in the middle of the pack, its two other spots will likely fill up very quickly.</p>
<p>Some gamblers will avoid making picks based on sudden movements by the horses or other gamblers. Instead, these less emotional players will wait until a reasonable time period before the end of the race &#8212; say 30 or 45 seconds. They will wait until they have all the trending information necessary to make a call. They won&#8217;t mind picking a #2 or #3 winner &#8212; they just want minimal risk of picking a loser.</p>
<p>Finally, some horses will go unpicked altogether. That&#8217;s not to say they aren&#8217;t strong horses with a lot of potential. They just have a lot of perceived risk. And gamblers don&#8217;t like taking on risk when The Option gives them a way to altogether mitigate it.</p>
<p><strong>Changing the Rules</strong></p>
<p>A horse race with The Option at play seems complicated enough, but let&#8217;s change the rules a little more. Let&#8217;s say the race doesn&#8217;t end &#8212; doesn&#8217;t have a set start time and end time. Let&#8217;s say that once a horse gets 3 options exercised on it, it&#8217;s <em>removed</em> from the race. Let&#8217;s say new horses enter the race every day, and that horses only tend to run for between 2-5 minutes each. After 5 minutes, most riders remove their horse from the race on their own.</p>
<p>In this new race, small signals have a big impact. Charge ahead suddenly and you might get your 3 spots filled. Convince a top-tier gambler to go to bat for you, and you&#8217;re all set &#8212; your other two spots will fill up quickly. If you&#8217;ve been in the race before and had your spots filled up quickly, you&#8217;ll likely get them filled up quickly when you enter the race again.</p>
<p>Managing which options to exercise also becomes a little trickier. With new horses entering all the time, the biggest gamblers will start to have a horse flow management problem. They&#8217;ll delegate some of the initial analysis and tracking work to junior gamblers. Riders and horse owners will start to do outrageous things to get noticed by the gambling ecosystem.</p>
<p>As but one horse of hundreds or thousands, it will therefore become possible for you to run a steady race without any of these signals, and basically go unnoticed in the crowd. Occasionally, you will get considered by the unemotional, data-oriented gamblers. However, they will wait until the last possible minute before pulling the trigger on your option, because it is in their interest to do so.</p>
<p><strong>Do the Gamblers Change the Game?</strong></p>
<p>One has to wonder what effect The Option has on the race. For example, if the goal is to leave the race via The Option &#8212; rather than to cross the finish line &#8212; will some riders start slow and then sprint quickly ahead to attract the fast-acting trend-followers? Will some riders try to network with the top-tier gamblers before they enter the race, to win their favor outside the game itself?</p>
<p>Would any gambler even choose The Old-Fashioned Bet anymore? It seems to me the only time someone would is if the rider and horse had such a great past record, that they were a favorite to win. No-name rider and newly-trained horses will never garner Bets, only Options.</p>
<p>And what about those hundreds of mid-range horses that never make sudden forward motions? Instead, they slowly and steadily continue to beat their best lap time. They aren&#8217;t flashy and never catch a glance from the top-tier gamblers, or even the stadium audience. For them, there is but one choice: <em>Keep riding</em>. <em>Keep pushing</em>. A gambler may notice you at the last moment, just when you think you haven&#8217;t any stamina or wherewithal left.</p>
<p>Sure, it won&#8217;t seem fair, to see all these other horses leaving the race early. But don&#8217;t look left and right &#8212; just look ahead. Before you know it, you may not even care about The Option, since you will have crossed the finish line all on your own.</p>
<p>So, next time you hear a &#8220;maybe&#8221; when you ask someone to bet on your horse, remember: it&#8217;s easier to play the option than the bet. The reason you entered the race in the first place was <em>to ride like hell</em> and <em>win for yourself</em>, not to be someone else&#8217;s winning bet.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.pixelmonkey.org/2010/12/13/its-easier-to-play-the-option-than-the-bet/feed</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
		<item>
		<title>Pythonic means idiomatic and tasteful</title>
		<link>http://www.pixelmonkey.org/2010/11/03/pythonic-means-idiomatic-and-tasteful?utm_source=rss&#038;utm_medium=rss&#038;utm_campaign=pythonic-means-idiomatic-and-tasteful</link>
		<comments>http://www.pixelmonkey.org/2010/11/03/pythonic-means-idiomatic-and-tasteful#comments</comments>
		<pubDate>Thu, 04 Nov 2010 03:41:21 +0000</pubDate>
		<dc:creator>pixelmonkey</dc:creator>
				<category><![CDATA[Programming]]></category>
		<category><![CDATA[Technology]]></category>

		<guid isPermaLink="false">http://www.pixelmonkey.org/?p=648</guid>
		<description><![CDATA[Pythonic isn&#8217;t just idiomatic Python &#8212; it&#8217;s tasteful Python. It&#8217;s less an objective property of code, more a compliment bestowed onto especially nice Python code. The reason Pythonistas have their own word for this is because Python is a language that encourages good taste; Python programmers with poor taste tend to write un-Pythonic code. This [...]]]></description>
			<content:encoded><![CDATA[<p><a href="http://nedbatchelder.com/blog/201011/pythonic.html">Pythonic</a> isn&#8217;t just idiomatic Python &#8212; it&#8217;s tasteful Python.  It&#8217;s less an objective property of code, more a compliment bestowed onto especially nice Python code.  The reason Pythonistas have their own word for this is because Python is a language that encourages good taste; Python programmers with poor taste tend to write un-Pythonic code.</p>
<p>This is highly subjective, but can be easily understood by Pythonistas who have been with the language for awhile.</p>
<p>Here&#8217;s some un-Pythonic code:</p>

<div class="wp_syntax"><div class="code"><pre class="python" style="font-family:monospace;"><span style="color: #ff7700;font-weight:bold;">def</span> xform<span style="color: black;">&#40;</span>item<span style="color: black;">&#41;</span>:
    data = <span style="color: black;">&#123;</span><span style="color: black;">&#125;</span>
    data<span style="color: black;">&#91;</span><span style="color: #483d8b;">&quot;title&quot;</span><span style="color: black;">&#93;</span> = item<span style="color: black;">&#91;</span><span style="color: #483d8b;">&quot;title&quot;</span><span style="color: black;">&#93;</span>.<span style="color: black;">encode</span><span style="color: black;">&#40;</span><span style="color: #483d8b;">&quot;utf-8&quot;</span>, <span style="color: #483d8b;">&quot;ignore&quot;</span><span style="color: black;">&#41;</span>
    data<span style="color: black;">&#91;</span><span style="color: #483d8b;">&quot;summary&quot;</span><span style="color: black;">&#93;</span> = item<span style="color: black;">&#91;</span><span style="color: #483d8b;">&quot;summary&quot;</span><span style="color: black;">&#93;</span>.<span style="color: black;">encode</span><span style="color: black;">&#40;</span><span style="color: #483d8b;">&quot;utf-8&quot;</span>, <span style="color: #483d8b;">&quot;ignore&quot;</span><span style="color: black;">&#41;</span>
    <span style="color: #ff7700;font-weight:bold;">return</span> data</pre></div></div>

<p>This code is both un-Pythonic and unidiomatic.  There&#8217;s some code duplication which can very easily be factored out.  The programmer hasn&#8217;t used concise, readability-enhancing facilities that are available to him by the language.  Even lazy programmers will recognize this code&#8217;s clear downsides.</p>
<p><span id="more-648"></span></p>
<p>Here&#8217;s another version that is more idiomatic but is nonetheless still  un-Pythonic:</p>

<div class="wp_syntax"><div class="code"><pre class="python" style="font-family:monospace;"><span style="color: #ff7700;font-weight:bold;">class</span> ItemTransformer<span style="color: black;">&#40;</span><span style="color: #008000;">object</span><span style="color: black;">&#41;</span>:
    <span style="color: #ff7700;font-weight:bold;">def</span> <span style="color: #0000cd;">__init__</span><span style="color: black;">&#40;</span><span style="color: #008000;">self</span>, item<span style="color: black;">&#41;</span>:
        <span style="color: #008000;">self</span>.<span style="color: black;">item</span> = item
&nbsp;
    <span style="color: #ff7700;font-weight:bold;">def</span> encode<span style="color: black;">&#40;</span><span style="color: #008000;">self</span>, key<span style="color: black;">&#41;</span>:
        <span style="color: #ff7700;font-weight:bold;">return</span> <span style="color: #008000;">self</span>.<span style="color: black;">item</span><span style="color: black;">&#91;</span>key<span style="color: black;">&#93;</span>.<span style="color: black;">encode</span><span style="color: black;">&#40;</span><span style="color: #483d8b;">&quot;utf-8&quot;</span>, <span style="color: #483d8b;">&quot;ignore&quot;</span><span style="color: black;">&#41;</span>
&nbsp;
    <span style="color: #ff7700;font-weight:bold;">def</span> transform<span style="color: black;">&#40;</span><span style="color: #008000;">self</span><span style="color: black;">&#41;</span>:
        <span style="color: #ff7700;font-weight:bold;">return</span> <span style="color: #008000;">dict</span><span style="color: black;">&#40;</span>
            title=<span style="color: #008000;">self</span>.<span style="color: black;">encode</span><span style="color: black;">&#40;</span><span style="color: #483d8b;">&quot;title&quot;</span><span style="color: black;">&#41;</span>, 
            summary=<span style="color: #008000;">self</span>.<span style="color: black;">encode</span><span style="color: black;">&#40;</span><span style="color: #483d8b;">&quot;summary&quot;</span><span style="color: black;">&#41;</span><span style="color: black;">&#41;</span></pre></div></div>

<p>Nothing about this code is particularly unidiomatic.  I might even see code like this in many popular open source projects.  But it&#8217;s in poor taste.  It&#8217;s un-Pythonic.</p>
<p>What is the code doing?  It&#8217;s just taking an incoming dictionary, encoding its values using utf-8, and returning a new dictionary with those encoded values.  There is no need to introduce an ItemTransformer object &#8212; it&#8217;s an extra abstraction and is just making the signal-to-noise ratio poorer.  People coming from Java often write un-Pythonic code because Java is a language that does not reward good taste.  The Pythonic view is: programming is hard enough &#8212; let&#8217;s not make it harder for ourselves.</p>
<p>Here&#8217;s a more Pythonic version:</p>

<div class="wp_syntax"><div class="code"><pre class="python" style="font-family:monospace;"><span style="color: #ff7700;font-weight:bold;">def</span> encode_news_item<span style="color: black;">&#40;</span>item<span style="color: black;">&#41;</span>:
    <span style="color: #ff7700;font-weight:bold;">def</span> encoded<span style="color: black;">&#40;</span><span style="color: #66cc66;">*</span>keys<span style="color: black;">&#41;</span>:
        <span style="color: #ff7700;font-weight:bold;">for</span> key <span style="color: #ff7700;font-weight:bold;">in</span> keys: 
            <span style="color: #ff7700;font-weight:bold;">yield</span> <span style="color: black;">&#40;</span>key, item<span style="color: black;">&#91;</span>key<span style="color: black;">&#93;</span>.<span style="color: black;">encode</span><span style="color: black;">&#40;</span><span style="color: #483d8b;">&quot;utf-8&quot;</span>, <span style="color: #483d8b;">&quot;ignore&quot;</span><span style="color: black;">&#41;</span><span style="color: black;">&#41;</span>
    <span style="color: #ff7700;font-weight:bold;">return</span> <span style="color: #008000;">dict</span><span style="color: black;">&#40;</span>encoded<span style="color: black;">&#40;</span><span style="color: #483d8b;">&quot;title&quot;</span>, <span style="color: #483d8b;">&quot;summary&quot;</span><span style="color: black;">&#41;</span><span style="color: black;">&#41;</span></pre></div></div>

<p>This code shows comfort with Python&#8217;s features, but does not abuse this comfort by obfuscating the code with mind-bending constructions.  The programmer has reduced the problem to two comprehensible subproblems: creating a stream of tuples (key, encoded_value) and constructing the new dictionary from that stream.  This leverages the elegant fact that in Python, dictionaries can be easily constructed from (key, value) tuples.</p>
<p>This version avoids code duplication while also making the last line (the return statement) a rough description of the entire function.  &#8220;<b>return</b> a <b>dict</b>ionary of the <b>encoded</b> values for the keys <b>title</b> and <b>summary</b>&#8221;  Idiomatic, yes.  But also tasteful, and thus Pythonic.</p>
<p>Even Pythonic code can be improved:</p>

<div class="wp_syntax"><div class="code"><pre class="python" style="font-family:monospace;"><span style="color: #ff7700;font-weight:bold;">def</span> encode_news_item<span style="color: black;">&#40;</span>item<span style="color: black;">&#41;</span>:
    encoded = <span style="color: #ff7700;font-weight:bold;">lambda</span> key: item<span style="color: black;">&#91;</span>key<span style="color: black;">&#93;</span>.<span style="color: black;">encode</span><span style="color: black;">&#40;</span><span style="color: #483d8b;">&quot;utf-8&quot;</span>, <span style="color: #483d8b;">&quot;ignore&quot;</span><span style="color: black;">&#41;</span>
    keys = <span style="color: black;">&#40;</span><span style="color: #483d8b;">&quot;title&quot;</span>, <span style="color: #483d8b;">&quot;summary&quot;</span><span style="color: black;">&#41;</span>
    <span style="color: #ff7700;font-weight:bold;">return</span> <span style="color: #008000;">dict</span><span style="color: black;">&#40;</span><span style="color: black;">&#40;</span>key, encoded<span style="color: black;">&#40;</span>key<span style="color: black;">&#41;</span><span style="color: black;">&#41;</span> <span style="color: #ff7700;font-weight:bold;">for</span> key <span style="color: #ff7700;font-weight:bold;">in</span> keys<span style="color: black;">&#41;</span></pre></div></div>

<p>And though Pythonic code is often smaller than its un-Pythonic counterparts, the experienced Pythonista knows the road to hell is paved with good intentions:</p>

<div class="wp_syntax"><div class="code"><pre class="python" style="font-family:monospace;"><span style="color: #ff7700;font-weight:bold;">def</span> encode_news_item<span style="color: black;">&#40;</span>item<span style="color: black;">&#41;</span>:
    keys = <span style="color: black;">&#40;</span><span style="color: #483d8b;">&quot;title&quot;</span>, <span style="color: #483d8b;">&quot;summary&quot;</span><span style="color: black;">&#41;</span>
    <span style="color: #ff7700;font-weight:bold;">return</span> <span style="color: #008000;">dict</span><span style="color: black;">&#40;</span><span style="color: #008000;">zip</span><span style="color: black;">&#40;</span>keys, <span style="color: #008000;">map</span><span style="color: black;">&#40;</span><span style="color: #ff7700;font-weight:bold;">lambda</span> key: item<span style="color: black;">&#91;</span>key<span style="color: black;">&#93;</span>.<span style="color: black;">encode</span><span style="color: black;">&#40;</span><span style="color: #483d8b;">&quot;utf-8&quot;</span>, <span style="color: #483d8b;">&quot;ignore&quot;</span><span style="color: black;">&#41;</span>, keys<span style="color: black;">&#41;</span><span style="color: black;">&#41;</span><span style="color: black;">&#41;</span></pre></div></div>

<p>Ick&#8230; time to <i>hg revert</i> this idiomatic Python code to the more Pythonic version <img src='http://www.pixelmonkey.org/wordpress/wp-includes/images/smilies/icon_wink.gif' alt=';-)' class='wp-smiley' /> </p>
]]></content:encoded>
			<wfw:commentRss>http://www.pixelmonkey.org/2010/11/03/pythonic-means-idiomatic-and-tasteful/feed</wfw:commentRss>
		<slash:comments>6</slash:comments>
		</item>
		<item>
		<title>The Startup Diet</title>
		<link>http://www.pixelmonkey.org/2010/10/23/the-startup-diet?utm_source=rss&#038;utm_medium=rss&#038;utm_campaign=the-startup-diet</link>
		<comments>http://www.pixelmonkey.org/2010/10/23/the-startup-diet#comments</comments>
		<pubDate>Sat, 23 Oct 2010 06:11:02 +0000</pubDate>
		<dc:creator>pixelmonkey</dc:creator>
				<category><![CDATA[Personal]]></category>
		<category><![CDATA[Startups]]></category>
		<category><![CDATA[Technology]]></category>

		<guid isPermaLink="false">http://www.pixelmonkey.org/?p=594</guid>
		<description><![CDATA[Last summer, we got our company, Parse.ly, off the ground at DreamIt Ventures incubator program in Philadelphia. Since then, we&#8217;ve talked to a lot of founders about our experience in the program. Many founders are data-driven people who are looking for concrete advice about how to optimize their experience at these programs. One of the [...]]]></description>
			<content:encoded><![CDATA[<p><em>Last summer, we got our company, <a href="http://parse.ly">Parse.ly</a>, off the ground at <a href="http://dreamitventures.com">DreamIt Ventures</a> incubator program in Philadelphia. Since then, we&#8217;ve talked to a lot of founders about our experience in the program. Many founders are data-driven people who are looking for concrete advice about how to optimize their experience at these programs. One of the most successful runway-extending pieces of advice we have given has been to keep food costs low. We were able to get our food cost down to <strong>$4/person/day</strong> through some simple planning during that summer, and each of us also lost 10-15 pounds in the process. We felt great, were productive, and made our DreamIt investment last. I think this might be one of the core reasons for our company&#8217;s survival and success. This is the story behind &#8220;The Startup Diet&#8221;.</em></p>
<p>DreamIt Ventures had just cut us a check for $20K to get our startup off the ground. But my cofounder Sachin and I were worried.  $20K seems like a lot of money, but it&#8217;s actually not that much.  Not when you&#8217;re using it for both living expenses and to hire other people to get your company off the ground.  So we started planning our spend and rationing the money immediately.</p>
<p>We knew we&#8217;d use some of the money for our living expenses.  We had just arrived in Philadelphia, and we were living in a startup house with Matt and Burak, the founders of <a href="http://engagethewave.com">Tidal Labs</a>, and Jack, one of the founders of <a href="http://seatgeek.com">SeatGeek</a>. It turns out that rent wasn&#8217;t that expensive in Philly, especially in this arrangement.  Instead, our number one cost, we determined, was going to be food.</p>
<p><span id="more-594"></span></p>
<div align="center"><img src="http://www.pixelmonkey.org/wordpress/wp-content/uploads/2010/10/4633501235_3bf5a725c3.jpg" alt="4633501235_3bf5a725c3" title="It may seem quick, easy and cheap, but the costs can add up" width="500" height="375" class="aligncenter size-full wp-image-601" /></div>
<p><strong>The Next Meal</strong></p>
<p>One of the founders of modern management, Peter F. Drucker, once wrote, &#8220;In all recorded history there has not been one economist who has had to worry about where the next meal would come from.&#8221; How true. But every startup entrepreneur I talked to obsessed with one thing and one thing only: &#8220;runway&#8221;. In other words, where the next meal would come from once the small amount of funding we got ran out.</p>
<p>With some good take-out and food truck options in University City (where DreamIt&#8217;s offices were), we were already spending as little as $10/person/day.  But actually getting this food wasted valuable time, and it usually wasn&#8217;t very healthy. We heard reports of the &#8220;Startup 15&#8243; &#8212; the 15 pounds many founders gain when beginning work on their companies. We also knew that when you eat like crap, it affects your productivity negatively. Finally, we knew healthier takeout options were prohibitively expensive. This presented a serious problem. Thinking like founders, we decided to hack this situation to our advantage.</p>
<p>Most companies at DreamIt figured it couldn&#8217;t get any better than the food trucks, and stuck to low-cost takeout most every day. We wondered &#8212; was there a way we could cut our food cost down, eat healthily, have positive productivity, save time, and hell, even lose weight in the process?</p>
<p><strong>The Birth of a Good Idea</strong></p>
<p>Thus was born <em>The Startup Diet</em>. What we needed was a diet with the following properties:</p>
<ul>
<li>Healthy, energy-filled food to enhance productivity</li>
<li>Low daily calorie intake to prevent weight gain</li>
<li>Idiot-proof and simple meal preparation</li>
<li>Extremely cheap per-person cost</li>
<li>Ability to purchase in bulk to reduce time wasted at supermarket</li>
</ul>
<p>Sachin went online researching diet options and came across Tim Ferriss&#8217;s blog. Ferriss takes a scientific approach to living, and is best known for his popular book, <em>The 4-Hour Work Week</em>. The relevant article Sachin found was called <a href="http://www.fourhourworkweek.com/blog/2007/04/06/how-to-lose-20-lbs-of-fat-in-30-days-without-doing-any-exercise/">How to Lose 20 lbs. of Fat in 30 Days… Without Doing Any Exercise</a>. This provided an excellent starting point.</p>
<p><strong>The Four Rules</strong></p>
<p>I encourage you to read his post, but for the impatient, here are his rules:</p>
<ul>
<li>Rule #1: Avoid “white” carbohydrates</li>
<li>Rule #2: Eat the same few meals over and over again</li>
<li>Rule #3: Don’t drink calories</li>
<li>Rule #4: Take one day off per week</li>
</ul>
<p>The diet we came up with was basically a <a href="http://en.wikipedia.org/wiki/Fork_%28software_development%29">fork</a> of Ferriss&#8217;s.  We followed his four rules. The most important of these ended up being rules #2 and #4. By turning our meals into a routine, it became much easier to make them efficient and reduce the time spent buying, prepping, and cooking food. By taking one day off per week, we didn&#8217;t feel that we were &#8220;missing out&#8221; on important business opportunities as a result of our diet &#8212; e.g., lunch appointments with mentors or a night out at the bar to blow off steam with the team and other founders. Our &#8220;cheat day&#8221; also had an interesting other efficiency effect: we were just forced to schedule all of our breakfast/lunch/dinner meetings for a single day, and thus didn&#8217;t interrupt our work week with distractions.</p>
<p><strong>The Core Insight: Beans as a Base</strong></p>
<p>The goals of our diet were different than Ferriss&#8217;s.  But like him, we used beans/legumes as a base. Beans are an excellent base food for a startup diet because they meet all of our core requirements above. But the best thing about beans is their startup economics. If you consider that our goal is to ingest the cheapest/healthiest possible calories, you can&#8217;t find a more flexible foodstuff than canned black beans. You can buy organic canned black beans for as little as $1.50/can. One can of beans is around 600 calories.</p>
<div align="center"><img src="http://www.pixelmonkey.org/wordpress/wp-content/uploads/2010/10/Screenshot-Calories-in-Black-Beans-Nutrition-Facts-and-Healthy-Alternatives-LIVESTRONG.COM-Mozilla-Firefox.png" alt="Nutrition Info for Black Beans" title="Nutrition Info for Black Beans" width="317" height="322" class="aligncenter size-full wp-image-604" /></div>
<p>If you look at black beans from an efficiency standpoint, you get 4 calories per $0.01. Compare a slice of pizza which is 200 calories and will usually run you $2.50; that&#8217;s only about 0.8 calories per $0.01, making beans about 5X more efficient. But beans aren&#8217;t just more energy-efficient, they&#8217;re also loaded with protein and fiber (about 7g of each per serving). Most of the cost in a diet comes from eating expensive proteins like chicken and beef, and beans have the ability to provide both efficient calories and efficient proteins at the same time. Finally, you can buy canned beans in bulk and store them.</p>
<div align="center"><img src="http://www.pixelmonkey.org/wordpress/wp-content/uploads/2010/10/Organic-Black-Turtle-Beans.jpg" alt="Black Beans: food efficiency" title="Black Beans: food efficiency" width="345" height="258" class="aligncenter size-full wp-image-609" /></div>
<p>For other nutrition, we would lean on four more sources: eggs; salad (mixed greens, romaine lettuce, tomatoes, and peppers); prepackaged vegetarian protein sources like tofu, seitan, and wheat gluten which we would use sparingly; and canned soups.</p>
<p><strong>The Trial Run</strong></p>
<p>We went to the supermarket to run our first trial. We knew this would need some coordination. Our first trick was to make an up-front investment in lots of differently-sized Ziploc containers and canvas carrying bags, so that we could flexibly relocate food where we needed it (home, office).</p>
<div align="center"><img src="http://www.pixelmonkey.org/wordpress/wp-content/uploads/2010/10/ziploc.jpg" alt="Ziploc the startup dieter friend" title="Ziploc the startup dieter friend" width="300" height="300" class="aligncenter size-full wp-image-607" /></div>
<p>We wanted to prep food for the week ahead of time and bring it into the office to ensure we didn&#8217;t cheat on the diet. The next trick was to come up with a meal plan using the four rules and our beans-as-a-base theory. Here is the meal plan we came up with:</p>
<ul>
<li><strong>Breakfast</strong>: alternate between 2 eggs per person or vegetarian saussage links; add hot sauce and side of mixed greens.</li>
<li><strong>Lunch</strong>: alternate between mixed salad with one can of soup (we liked Split Pea and Lentil) or salad with black beans on top. We would prep the salad for the week in zip lock containers, and leave the rest of the things we needed (e.g. salad dressing or the canned beans) at the office.</li>
<li><strong>Dinner</strong>: a combination of black beans, vegetarian protein (usually &#8220;chicken&#8221; strips or &#8220;beef&#8221; rips), hot sauce, onions, and jalapeño peppers. We would eat this &#8220;core&#8221; food like a burrito stuffing, but instead of putting it in a tortilla, we would eat it with romaine lettuce wrappings. (Think &#8220;Lettuce Wraps&#8221; that you can get at fancy New American / Asian restaurants.) The great thing about this as our dinner food is that we could make the filling ahead of time for 2-3 days and then just reheat it. Fresh Romaine Lettuce has a great crunch and lets you eat the food with your bare hands, even minimizing dish cleanup time. We just had to keep a regular supply of Romaine Lettuce on-hand.</li>
</ul>
<div align="center"><img src="http://www.pixelmonkey.org/wordpress/wp-content/uploads/2010/10/709px-Romaine.jpg" alt="Romaine Lettuce, the ideal wrapper" title="Romaine Lettuce, the ideal wrapper" width="400" height="339" class="aligncenter size-full wp-image-613" /></div>
<p><strong>An Agile-Friendly Diet</strong></p>
<p>I mentioned Matt from Tidal Labs. He was also our landlord.  His <a href="http://sprucehillhouse.com/">Spruce Hill House</a> was the perfect atmosphere for getting some serious summer hacking done.  But one of the nicest &#8212; and eventually, most useful &#8212; things about the house was the huge kitchen and huge Sub Zero refrigerator.  Matt later told me bought the refrigerator off eBay for a $1 (it wasn&#8217;t functional and the owner just wanted to get rid of it), and then Matt fixed it himself.  He is scrappy and awesome that way.</p>
<p>Sachin and I treated this Sub Zero fridge as our diet command center. We would prep our meals before and after our long days at the office. One of us would prep breakfast for the day while the other prepped lunch/dinner materials for the next 2 days. We&#8217;d collaborate on prepping dinner. Every couple days, we&#8217;d swap.</p>
<p>We cherished this time for its management value to the company. In the morning, we&#8217;d have a founder <a href="http://en.wikipedia.org/wiki/Stand-up_meeting">standup</a>: we&#8217;d figure out the things we wanted to accomplish for the day while prepping and eating breakfast. We&#8217;d evaluate the day over dinner, a kind of mini <a href="http://en.wikipedia.org/wiki/Retrospective#Software_development">retrospective</a>. The Startup Diet became a kind of management technique.</p>
<p><strong>Making It Work</strong></p>
<p>Perhaps by now you&#8217;re convinced that this diet has a lot of cost and efficiency benefits. You can&#8217;t beat living on $4/person/day for food. You can&#8217;t beat saving (by our estimate) 1-2 hours a day on prep and meal time.</p>
<p>But, the main question we get about this was, <em>didn&#8217;t that taste horrible?</em> Surprisingly, no. We used a lot of obvious flavor enhancers to keep things tasting pretty good. We invested in good olive oil, sea salt (in a grinder), black peppercorns (in a grinder), and threw in a liberal helping of spices, hot sauce, and herbs.</p>
<p>The second common question we get was, <em>wasn&#8217;t it mind-numbingly boring to keep eating the same thing over and over again?</em> Again, surprisingly, no. The first week you wonder how you&#8217;ll go a whole summer like this. The second week, it just becomes the routine.</p>
<p>Remember, startups are hard in the early stages. Every day requires your fullest attention. Therefore, turning meals into a routine actually made a lot of sense &#8212; it reduced the degree to which we were interrupted in getting the company off the ground. Our body got used to it, and we hardly even noticed that we were eating the same meals week by week. Rule #4, the cheat day, was the real savior in this aspect. We used to look forward to our cheat days, and we made them count. Cheat days also acted as a kind of reward for a week of focused work.</p>
<p><strong>Making It Your Own</strong></p>
<p>I am not a doctor or a nutrition expert, and so all the regular caveats apply. But this was how we were able to keep our costs down while Parse.ly was being incubated at DreamIt Ventures.</p>
<p>Learn to love black beans and other legumes &#8212; they are a healthy, flexible and efficient food. Plan your approach. Turn eating into a routine, and prepare most of your meals ahead of time. Cut out the carbs, beer and soda &#8212; drink lots of water instead. Use meal prep time to manage your company. Use your cheat day to manage external relationships and reward yourself.</p>
<p>Stay focused on your startup. Lose weight. Gain productivity. Extend your runway.</p>
<p>The rest is up to you.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.pixelmonkey.org/2010/10/23/the-startup-diet/feed</wfw:commentRss>
		<slash:comments>22</slash:comments>
		</item>
		<item>
		<title>What One Does</title>
		<link>http://www.pixelmonkey.org/2010/10/16/what-one-does?utm_source=rss&#038;utm_medium=rss&#038;utm_campaign=what-one-does</link>
		<comments>http://www.pixelmonkey.org/2010/10/16/what-one-does#comments</comments>
		<pubDate>Sun, 17 Oct 2010 00:56:54 +0000</pubDate>
		<dc:creator>pixelmonkey</dc:creator>
				<category><![CDATA[Personal]]></category>
		<category><![CDATA[Programming]]></category>
		<category><![CDATA[Startups]]></category>
		<category><![CDATA[Technology]]></category>

		<guid isPermaLink="false">http://www.pixelmonkey.org/?p=502</guid>
		<description><![CDATA[One of America’s greatest strengths is social mobility. There are several cases of an individual starting with nothing and persevering to become rich, powerful, and influential. Success stories of this kind have become an important part of American business mythology, especially in the world of entrepreneurship. They are strong motivators for individuals embarking on companies [...]]]></description>
			<content:encoded><![CDATA[<p>One of America’s greatest strengths is social mobility. There are several cases of an individual starting with nothing and persevering to become rich, powerful, and influential. Success stories of this kind have become an important part of American business mythology, especially in the world of entrepreneurship. They are strong motivators for individuals embarking on companies of their own.</p>
<p>For those of us who start companies, we see the company as a vehicle to creating something valuable and lasting for society, while also advancing our personal goals. This isn’t usually hubris or ego, though sometimes it may be. Instead, it&#8217;s usually an attempt to make your time worthwhile: to yourself, to those close to you, and &#8212; if you’re lucky and persistent enough &#8212; to the entire world.</p>
<p>The problem with social mobility is that not every individual begins at the same starting line. In fact, the range is huge. Those who start with an influential family or significant capital resources have a much easier time getting to the top. For those who don’t have this head start, things are a lot harder. </p>
<p>Though America is not entirely merit-based, it can reward individuals for hard work. I’ve experienced the benefit both of an advantageous starting point and hard work in my 26 years on this earth. I also believe that with each step and milestone in my life, my potential to create enduring value for society has increased significantly.</p>
<p><strong>Beginnings</strong></p>
<p>The inspiration for this essay was a comment I read online about a successful young businessman who was the son of a successful businessman. <em>&#8220;I&#8217;d [like to] read a story about a 25-yo [who] made good on the same scale[,] who went to a state college, had screwed up parents who were too busy fighting with each other or gettiing drunk to even have a clue what he was doing, isn&#8217;t childhood friends with a celebrity&#8230; Just happened to be smart and hardworking and optimistic even despite all those factors. That would actually be an interesting story.&#8221;</em></p>
<p>My parents weren&#8217;t screwed up, but they did fight a lot &#8212; my Mom and Dad separated when I was in elementary school and divorced shortly after that. I&#8217;ve not been childhood friends with a celebrity and I don&#8217;t have a trust fund.</p>
<p>I&#8217;m not saying I came from a disadvantaged upbringing &#8212; in fact, quite the opposite. I went to public high school in New York. To a New Yorker, that may not sound like a huge step up in the world, but I recognize that public school in New York represents one of the top educations you can get.</p>
<p>I grew up in a nice house in a quiet suburban neighborhood. I had good, encouraging teachers. My parents were liberal and a positive influence. I didn&#8217;t have a silver spoon in my mouth, but I also didn&#8217;t have any serious handicap in my upbringing. Probably my biggest step up in the world, given my current trajectory, was that when I was 10 or 11 years old, my Dad noticed an interest I had in computers. And so, he bought me a PC (running DOS / Windows 3.1) and set it up for me on Christmas Day. From that point forward, I was enchanted by the machine. And once I got a 28K modem and dial-up access to the web (on one of the first ISPs, <a href="http://en.wikipedia.org/wiki/The_Pipeline">The Pipeline</a>), I became a citizen of the world before I had even hit puberty.</p>
<p>This I do know &#8212; though I had a head start, I also worked hard. I was a geek &#8212; as I got older, I built my own servers in my basement, taught myself to program, and discovered Linux and Free Software. But I also kept ahead in &#8220;the real world&#8221;. I did feel a little disconnected from my peers in my private pursuits; reflecting on my childhood, I realize I &#8220;grew up&#8221; a little more quickly than my peers. </p>
<p><span id="more-502"></span></p>
<p><strong>My First &#8220;Startups&#8221;</strong></p>
<p>At 15, I had built and launched somewhat popular websites for a couple of personal projects. Nothing you would remember &#8212; each one was related in some way to an interest I had in multiplayer online video games, an interest I aged out of a year later. Each website had between a few hundred and several thousand visitors a week.</p>
<p>But the sites looked nice. When I told my family friends and teachers in my local suburb that &#8220;I built websites&#8221;, they were all interested in having me work for them. Recognizing the opportunity, I turned this into a business.</p>
<p>By 2010 standards, the websites I built were boring and simple &#8212; static designs, gaudy flash &#8220;intros&#8221;, contact forms and quickly-outdated information portals. Yet in 1999, this was cutting-edge. So cutting-edge that people were willing to pay to be on the web. I printed up business cards and called my company a &#8220;digital online identity firm&#8221;. Might seem like an obvious thing now, but I felt proud to deliver that value to my early-adopter customers. This was my first &#8220;B2B startup&#8221;.  During this period, my friends would ask me to hang out on the weekends, but I&#8217;d be working on HTML/CSS, JavaScript and Macromedia Flash, building up my online portfolio.</p>
<p>At 16, I was approached by the editors of a technology publishing company called Friends of ED to write a couple chapters for a book of theirs called <a href="http://www.amazon.com/Flash-Dynamic-Content-Studio-ROM/dp/1903450063">Flash 5 Dynamic Content Studio</a>. They found me on the web &#8212; my first &#8220;digital introduction&#8221;, before the days of LinkedIn. On the weekends, I regularly answered people&#8217;s Actionscript programming questions in a <a href="http://en.wikipedia.org/wiki/LISTSERV">listserv</a> called flashpro. They liked that I had both a Flash and programming background, so they contacted me to contribute to their book &#8212; one of the first that discussed building backend systems and tying them to Flash frontends.</p>
<p>I corresponded with them entirely via e-mail. I wrote the chapters and edited about 80% of the book during my junior year of high school, while also prepping for SATs and acting as editor of my school newspaper. I probably got 3 hours of sleep a night. My friends thought I was crazy.</p>
<p>When the book finally went to press and started showing up on Amazon.com and in Barnes &#038; Noble stores, it was one of my proudest moments in my early adulthood. I just thought about how the work I did was being seen and read by thousands of people across the world. Each of those individuals would go on and use that knowledge to build web applications for other individuals. There was seemingly no limit to the impact of my work. I may have been naive, but I thought, <em>what could be better than this</em>?</p>
<p>I still remember when the editors in the UK found out I was only 16 (it was while we were negotiating payment). They were shocked, they actually didn&#8217;t believe me. They had to check with lawyers to see if they could even pay me. Then they paid me the bunch of money they owed me for my hourly editing rate and IP rights, and I had all the savings I needed to live throughout my first couple college years without asking my parents for support.</p>
<p>By 16, I had some unique experiences. I created a market in my skills. I built working software for companies small and large. I contributed to a project that had global impact. I made some real money. And, in my junior and senior years of high school, I got a taste of the competing demands of personal and work life.</p>
<p><strong>College: Creating Value for Myself</strong></p>
<p>When I got into NYU on scholarship, I was thrilled. My grades in high school let me go to a good college without breaking the bank. I would be able to attend a top-tier school without the financial stress typically associated with private schools. I&#8217;d get to stay in New York, one of my true loves. I had also been rejected by just about every other top-tier university in the country. Come to think of it, the ups and downs of the college application process was good training for startup life &#8212; especially the rejections.</p>
<p>I worked my butt off in college. I really got into it. Not just the coursework, but also just pursuing my passions within the student body. I held talks that tried to stoke up my peers about technology, economics and open source software, all passions of mine. My friends rarely saw me because I was often working on these and other spare time projects.</p>
<p>College was interesting. I worked hard, but rarely got paid for my work. In some sense, working hard in college is good preparation for a startup lifestyle. You work hard because you believe in yourself and in your own potential, not because you have a paycheck coming.</p>
<p>It was also in college where I came to an important realization: I am a software engineer and computer scientist. Though there are many ways for me to add value, my preparation and passions make me especially well-suited to building software. And so, that&#8217;s where I should have an impact.</p>
<p><strong>Internship: Creating Value for Others</strong></p>
<p>I took an internship in summer of my sophomore year where I got paid a flat $3000 to build a web application for a NYC-based non-profit, <a href="http://uac-ny.org/">The Unemployment Action Center of NY</a>. I probably spent 750 hours on the thing (60 hours a week), not making it a very profitable proposition. My friends again thought I was crazy &#8212; lots of them had taken well-paying and prestigious internships at software companies and banks, but I didn&#8217;t even apply to those.</p>
<p>This was my first experience with building a real product that people actually used. I worked entirely from home. I used my own development environment and hosting environment. I gathered requirements directly from the end-users. I made all the technical decisions and implemented all the code. That was good experience for startup life. Built useful stuff, solved real problems. Made lots of little decisions.</p>
<p>The case management application I built is still running today, relatively bug-free, and has helped thousands of unemployed people get legal representation for free, so that they can get justice for wrongful termination and other cases. I&#8217;m really proud of that application. I didn&#8217;t care that I got paid $4/hour for it. Looking back, I would have done it for free. What a phenomenal organization and what a great cause to apply technology toward.</p>
<p><strong>Post-College: Creating Value for Money</strong></p>
<p>The rest of my story is told pretty well by this <a href="http://www.observer.com/2010/media/programming-dummies-dissastisfied-some-wall-street-technologists-flee-start-life">NY Observer article</a>.</p>
<p>I worked at Morgan Stanley for a couple of years while living at home on Long Island to save money. Working at the bank was a huge change from the rest of my life. The primary focus of my job became my paycheck. Technology decisions were made for me, by external committees. I was expected to follow all sorts of processes and procedures. I was expected to become a conventional programmer. I found myself building products that had an unclear end-user.</p>
<p>I did learn things there, too. I learned what it was like to work with engineers on a daily basis. I learned a lot from my managers and colleagues, many of whom were just astoundingly intelligent individuals. I learned how big companies operated. But mostly, I learned a lot about myself.</p>
<p>I learned that work meant more to me than a paycheck. Work should be about solving problems, helping people, and creating enduring value. Money is important, but it wasn&#8217;t what attracted me to technology in the first place. And that&#8217;s why I knew I had to leave that firm.</p>
<p><strong>Startup Life: Creating Lasting Value for Myself, for Others, and for Money</strong></p>
<p>I accepted this compromise: I would work at the bank to save the money I needed to build my own company. I was &#8220;realistic&#8221;, and this seemed a fair compromise.</p>
<p>I anticipated that I&#8217;d need at least a $20K buffer to start my startup (it ended up being more than that). And in March of last year, I quit Morgan Stanley to embark on this path. My awesome, like-minded friend from NYU, Sachin Kamdar, quit his job too. Together, we tried to build something of value, even though we didn&#8217;t know what that would be initially. We worked out of cafes, brainstorming ideas and building prototypes. We consulted on the side &#8212; I, through the boutique software engineering firm I founded, <a href="http://alephpoint.com">Aleph Point</a>. Early on, my girlfriend prophetically referred to my financial strategy in all this as &#8220;putting a bandaid on a hemorrhaging femoral artery&#8221;.</p>
<p>Our friends thought we were crazy. Chuck a steady paycheck to work on an ill-defined &#8220;startup&#8221;?  For some reason, all we could think was, <em>hell yes we would</em>.</p>
<p>Our first stroke of luck was getting into <a href="http://dreamitventures.com/">DreamIt Ventures</a>. NYC didn&#8217;t have seed programs like Tech Stars or Seed Start yet. We moved to Philadelphia for the summer, leaving our NYC apartment leases and girlfriends behind. They thought we were crazy. The $20K from DreamIt basically covered our living expenses in Philly, but it did lift some financial pressure for a few months. We came up with a $4/person/day diet &#8212; which we called <a href="http://www.pixelmonkey.org/2010/10/23/the-startup-diet">&#8220;the startup diet&#8221;</a> &#8212; that involved eating beans, soup, romaine lettuce, and veggie burgers basically every day. We lived in a &#8220;startup house&#8221; with the founders of <a href="http://seatgeek.com">SeatGeek</a> and <a href="http://www.engagethewave.com/">Tidal Labs</a>. We worked in an office with the founders of <a href="http://postling.com">Postling</a>, <a href="http://notehall.com">NoteHall</a>, and <a href="http://dreamitventures.com/node/6">other fledgling companies</a>. We started hacking on what would eventually become <a href="http://parse.ly">Parse.ly</a>. And for the first time in our lives, we were surrounded by individuals who also felt that what one does is more important than how one benefits.</p>
<p>Our second stroke of luck was finding our exceptionally talented lead engineer, <a href="http://dfdeshom.tumblr.com/">Didier Deshommes</a>, who has been with us ever since we incubated Parse.ly in Philadelphia. Ever since DreamIt, we operate on this maxim: we got our share of luck &#8212; now, let&#8217;s make our own.</p>
<p><strong>Creating Your Own Luck</strong></p>
<p>Perhaps our startup founding story isn&#8217;t remarkable. But lately, reflecting on the last year &#8212; where we bootstrapped and self-financed this startup, overworking ourselves and straining our personal relationships &#8212; I&#8217;ve started to feel like it is pretty remarkable.</p>
<p>We made our own luck. And we&#8217;ve brought all our skills and experience to bear. I&#8217;ve been preparing for running Parse.ly since the age of 15. I&#8217;ve been preparing, basically, my whole life. And I&#8217;m so glad we did this together. With all the ups and downs, if I had done this on my own, I would have given up. But we just kept pushing each other. Every time we hit a roadblock, we just said, &#8220;we can still do this.&#8221; And we did.</p>
<p>I&#8217;m really proud of this company and our team. We&#8217;ve built a real, valuable technology of lasting value. We&#8217;ve learned so much. And we&#8217;ve done it all against the odds. We are a small NYC startup with two no-name founders. Neither of us have &#8220;prior exits&#8221; or &#8220;a solid track record&#8221;. Neither of us have built and launched startups before. But none of that matters. We discovered that <a href="http://parse.ly/consumer">people want their content filtered and prioritized</a> and that <a href="http://parse.ly/p3">online publishers want their content optimized</a>, and we used elbow grease, hustle, and dedicated hacking to make the rest happen.</p>
<p>Our startup is three hard-working and optimistic guys who believe that we can change the world. We put it all on the line to create something from nothing. Our work is still in progress, and there are still challenges ahead. There are easier things we could be doing, but we don&#8217;t care. You may think we&#8217;re crazy, and you may be right.</p>
<p>But that&#8217;s the final lesson of startups, isn&#8217;t it? You have to be a little crazy.</p>
<p>&#8212;</p>
<p><em>Thanks to <a href="http://sachinkamdar.com">Sachin Kamdar</a> for editing this essay. And thanks to our awesome friends, significant others, and families for still cheering us on even as they rightfully thought we were crazy.</em></p>
]]></content:encoded>
			<wfw:commentRss>http://www.pixelmonkey.org/2010/10/16/what-one-does/feed</wfw:commentRss>
		<slash:comments>6</slash:comments>
		</item>
		<item>
		<title>Flavors.me emerges from beta: lifestreaming for the masses</title>
		<link>http://www.pixelmonkey.org/2010/02/24/flavors-me-emerges-from-beta-lifestreaming-for-the-masses?utm_source=rss&#038;utm_medium=rss&#038;utm_campaign=flavors-me-emerges-from-beta-lifestreaming-for-the-masses</link>
		<comments>http://www.pixelmonkey.org/2010/02/24/flavors-me-emerges-from-beta-lifestreaming-for-the-masses#comments</comments>
		<pubDate>Thu, 25 Feb 2010 01:58:13 +0000</pubDate>
		<dc:creator>pixelmonkey</dc:creator>
				<category><![CDATA[Programming]]></category>
		<category><![CDATA[Startups]]></category>
		<category><![CDATA[Technology]]></category>

		<guid isPermaLink="false">http://www.pixelmonkey.org/?p=520</guid>
		<description><![CDATA[My good friends at HiiDef just launched a new app that has been in beta for awhile, Flavors.me. This is an excellent tool that has a great, simple, and usable design. What&#8217;s the value preposition of Flavors.me? It&#8217;s to unify your various &#8220;online identities&#8221; into a single, dynamic, automatically-updated, and elegant website. What do I [...]]]></description>
			<content:encoded><![CDATA[<p>My good friends at <a href="http://hiidef.com/">HiiDef</a> just launched a new app that has been in beta for awhile, <a href="http://flavors.me">Flavors.me</a>.  This is an excellent tool that has a great, simple, and usable design.</p>
<p>What&#8217;s the value preposition of Flavors.me?  It&#8217;s to unify your various &#8220;online identities&#8221; into a single, dynamic, automatically-updated, and elegant website.</p>
<p>What do I mean by that?  OK &#8212; so, like most people on the web, you spread public information about yourself in multiple places.  You might run one or two blogs (personal and work?).  You might have a Facebook account, a Twitter account.  You may share your favorite books at GoodReads, your favorite movies at Netflix, and your favorite music on Last.fm.</p>
<p>Flavors.me lets you take all that information and put it together in a single website to serve as your &#8220;online identity&#8221;.  All your publicly shared information, aggregated in one place, and displayed beautifully.</p>
<p>I&#8217;ve been running a Flavors.me site for some time that you can see here: <a href="http://flavors.me/pixelmonkey" target="_blank">http://flavors.me/pixelmonkey</a></p>
<div align="center"><a target="_blank" href="http://flavors.me/pixelmonkey"><img src="http://www.pixelmonkey.org/wordpress/wp-content/uploads/2010/02/pixelmonkey-flavorsme1-300x187.png" alt="pixelmonkey-flavorsme" title="pixelmonkey-flavorsme" width="300" height="187" class="aligncenter size-medium wp-image-523" /></a></div>
<p>Now, that&#8217;s the end product.  All the content gets pulled dynamically from your various online feeds.  The real magic with Flavors.me is how easy it is to get there.  You can drastically change the look and feel of this site using a dynamic, &#8220;WYSIWYG&#8221; interface.  You can do one or two clicks to add a service, reorder it, rename it.  Another couple of clicks and you change font sizes, colors, and even the overall layout.</p>
<p><span id="more-520"></span></p>
<p>As I was writing this post, I noticed that Flavors.me had added LinkedIn support, which wasn&#8217;t available earlier in the beta.  So I went ahead and added it.  I simply logged in and pulled up the design panel.</p>
<div align="center"><a href="http://www.pixelmonkey.org/wordpress/wp-content/uploads/2010/02/flavors-cpanel-01.png"><img src="http://www.pixelmonkey.org/wordpress/wp-content/uploads/2010/02/flavors-cpanel-01.png" alt="flavors-cpanel-01" title="flavors-cpanel-01" width="407" height="528" class="aligncenter size-full wp-image-528" /></a></div>
<p>From there, I could navigate over to &#8220;Services&#8221;, click the &#8220;LinkedIn&#8221; logo, and Flavors.me would guide me through the authorization process to make LinkedIn data available to them for display on my page.  You simply get redirected to LinkedIn.com, log in there (if not already logged in), and then get redirected back to the Flavors control panel.</p>
<div align="center"><a href="http://www.pixelmonkey.org/wordpress/wp-content/uploads/2010/02/flavors-cpanel-02.png"><img src="http://www.pixelmonkey.org/wordpress/wp-content/uploads/2010/02/flavors-cpanel-02.png" alt="flavors-cpanel-02" title="flavors-cpanel-02" width="315" height="492" class="aligncenter size-full wp-image-529" /></a></div>
<p>Next, I could simply drag-and-drop the service box in the panel in order to reorder it on the page.  Yay, drag-and-drop!  There is also in-line editing, and editing the title of the LinkedIn &#8220;popout&#8221; dynamically updates my profile page in real-time!  Nice touch.</p>
<div align="center"><a href="http://www.pixelmonkey.org/wordpress/wp-content/uploads/2010/02/flavors-cpanel-03.png"><img src="http://www.pixelmonkey.org/wordpress/wp-content/uploads/2010/02/flavors-cpanel-03.png" alt="flavors-cpanel-03" title="flavors-cpanel-03" width="306" height="336" class="aligncenter size-full wp-image-530" /></a></div>
<p>Finally, I can go to the &#8220;Design&#8221; panel to tweak fonts, layout, sizes, etc.  Look at how Flavors.me displays fonts.  It&#8217;s amazing &#8212; this is the web, but it&#8217;s easier to change my Flavors.me web design font styles than it is to change font styles in a Microsoft Word document!</p>
<div align="center"><a href="http://www.pixelmonkey.org/wordpress/wp-content/uploads/2010/02/flavors-cpanel-04.png"><img src="http://www.pixelmonkey.org/wordpress/wp-content/uploads/2010/02/flavors-cpanel-04.png" alt="flavors-cpanel-04" title="flavors-cpanel-04" width="307" height="343" class="aligncenter size-full wp-image-531" /></a></div>
<p>Now, depending on where, exactly, you store the bits that make up your online identity, you may find yourself disappointed by a lack of this-or-that service.  They already support quite a few, and they are adding more in the future, I hear.  The one I sorely missed was <a href="http://delicious.com">Delicious</a>, so I could share my bookmarks with the world.</p>
<p>But wait!  For those services that still don&#8217;t have first-class support, Flavors.me gracefully supports RSS feeds of any variety.  I simply popped the RSS feed for my Delicious bookmarks into Flavors.me services panel, and, voila! &#8212; my bookmarks are now publicly shared!</p>
<div align="center"><a target="_blank" href="http://www.pixelmonkey.org/wordpress/wp-content/uploads/2010/02/flavors-cpanel-05.png"><img src="http://www.pixelmonkey.org/wordpress/wp-content/uploads/2010/02/flavors-cpanel-05-300x183.png" alt="flavors-cpanel-05" title="flavors-cpanel-05" width="300" height="183" class="aligncenter size-medium wp-image-532" /></a></div>
<p>It&#8217;s this kind of simplicity, design sense, and user-centric approach that makes me love the web as a place to develop, deploy, and use software.  So, what are you waiting for?  <a href="http://flavors.me/signup">Sign up for Flavors.me today: it&#8217;s free!</a></p>
]]></content:encoded>
			<wfw:commentRss>http://www.pixelmonkey.org/2010/02/24/flavors-me-emerges-from-beta-lifestreaming-for-the-masses/feed</wfw:commentRss>
		<slash:comments>2</slash:comments>
		</item>
		<item>
		<title>The danger of feature-driven design</title>
		<link>http://www.pixelmonkey.org/2009/12/22/the-danger-of-feature-driven-design?utm_source=rss&#038;utm_medium=rss&#038;utm_campaign=the-danger-of-feature-driven-design</link>
		<comments>http://www.pixelmonkey.org/2009/12/22/the-danger-of-feature-driven-design#comments</comments>
		<pubDate>Tue, 22 Dec 2009 06:49:39 +0000</pubDate>
		<dc:creator>pixelmonkey</dc:creator>
				<category><![CDATA[Programming]]></category>
		<category><![CDATA[Startups]]></category>

		<guid isPermaLink="false">http://www.pixelmonkey.org/?p=504</guid>
		<description><![CDATA[I recently re-read Douglas Crockford&#8217;s JavaScript: The Good Parts. I have been writing more and more JavaScript lately, especially object-oriented JavaScript plugging into existing frameworks. Re-reading the book has definitely been a useful exercise &#8212; I think when I first read it approximately 6 months ago, I didn&#8217;t fully understand it. But now, I do. [...]]]></description>
			<content:encoded><![CDATA[<p>I recently re-read Douglas Crockford&#8217;s <em>JavaScript: The Good Parts</em>.  I have been writing more and more JavaScript lately, especially object-oriented JavaScript plugging into existing frameworks.  Re-reading the book has definitely been a useful exercise &#8212; I think when I first read it approximately 6 months ago, I didn&#8217;t fully understand it.  But now, I do.</p>
<p>I also found it very interesting to hear Crockford wax poetic about the virtue of simplicity in all forms of software design.  The following passage concludes the book.</p>
<blockquote><p>
When I started thinking about this[...], I wanted to take the subset idea further, to show how to take an existing [product] and make significant improvements to it by making no changes except to exclude the low-value features.</p>
<p>We see a lot of feature-driven product design in which the cost of features is not properly accounted. Features can have a negative value to consumers because they make the products more difficult to understand and use. We are finding that people like products that just work. It turns out that designs that just work are much harder to produce than designs that assemble long lists of features.</p>
<p>Features have a specification cost, a design cost, and a development cost. There is a testing cost and a reliability cost. The more features there are, the more likely one will develop problems or will interact badly with another. In software systems, there is a storage cost, which was becoming negligible, but in mobile applications is becoming significant again. There are ascending performance costs because Moore’s Law doesn’t apply to batteries.  </p>
<p>Features have a documentation cost. Every feature adds pages to the manual, increasing training costs. Features that offer value to a minority of users impose a cost on all users. So, in designing products[...], we want to get the core features—the good parts—right because that is where we create most of the value.</p>
<p>We all find the good parts in the products that we use. We value simplicity, and when simplicity isn’t offered to us, we make it ourselves. My microwave oven has tons of features, but the only ones I use are cook and the clock. And setting the clock is a struggle. We cope with the complexity of feature-driven design by finding and sticking with the good parts.</p>
<p>It would be nice if products[...] were designed to have only good parts.
</p></blockquote>
<p>I removed direct references to the main subject of Crockford&#8217;s discussion &#8212; namely, the JavaScript language itself.  The truth is, this advice is much more valuable for the design of all software products.  Perhaps one day someone will write the much needed book, <em>Startups: The Good Parts</em>.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.pixelmonkey.org/2009/12/22/the-danger-of-feature-driven-design/feed</wfw:commentRss>
		<slash:comments>3</slash:comments>
		</item>
		<item>
		<title>Persistent Folders: Or, why ideas don&#8217;t matter, and execution does</title>
		<link>http://www.pixelmonkey.org/2009/12/11/ideas-and-execution?utm_source=rss&#038;utm_medium=rss&#038;utm_campaign=ideas-and-execution</link>
		<comments>http://www.pixelmonkey.org/2009/12/11/ideas-and-execution#comments</comments>
		<pubDate>Fri, 11 Dec 2009 15:59:51 +0000</pubDate>
		<dc:creator>pixelmonkey</dc:creator>
				<category><![CDATA[Open Source]]></category>
		<category><![CDATA[Programming]]></category>
		<category><![CDATA[Startups]]></category>
		<category><![CDATA[Technology]]></category>

		<guid isPermaLink="false">http://www.pixelmonkey.org/?p=475</guid>
		<description><![CDATA[I&#8217;ll start off this post with a somewhat controversial claim: I invented Dropbox. I&#8217;ll show why this claim doesn&#8217;t matter later, but for now, I&#8217;ll assure you that it&#8217;s true. How many of you out there use Dropbox? If you don&#8217;t, you should &#8212; it&#8217;s an excellent tool. In its free version, it provides you [...]]]></description>
			<content:encoded><![CDATA[<p>I&#8217;ll start off this post with a somewhat  controversial claim: <i>I invented Dropbox</i>.</p>
<p>I&#8217;ll show why this claim doesn&#8217;t matter later, but for now, I&#8217;ll assure you that it&#8217;s <b>true</b>. </p>
<p>How many of you out there use <a href="http://getdropbox.com">Dropbox</a>?  If you don&#8217;t, you should &#8212; it&#8217;s an excellent tool.  In its free version, it provides you with 2GB of storage &#8220;in the cloud&#8221;, using a new kind of folder called a &#8220;Dropbox&#8221;.  What distinguishes a Dropbox from other folders on your computer?  The following:</p>
<ul>
<li>Every file put in your Dropbox is automatically (and securely) uploaded to Dropbox&#8217;s servers, ensuring you have an offsite backup of all data therein.</li>
<li>Multiple computers can gain access to a Dropbox, ensuring files are automatically synchronized across computers without having to use complication version control systems.</li>
<li>All files in your Dropbox are versioned, ensuring you can always recover an older version of a file in case you accidentally overwrite a good version.</li>
</ul>
<p>Dropbox is supported on Windows, Mac OS X, and Linux, and now even has mobile applications, as well.  Further, I have a special place in my heart for this service because I started using it almost 2 years ago, and it has acted as a file sharing and project management tool for my own startup&#8217;s internal operations at <a href="http://parse.ly">Parse.ly</a>.  I was therefore more than ecstatic to discover that this excellent tool and its smart founders had also made it through all of the hurdles necessary to get an early-stage company the financing it needs: they&#8217;ve <a href="http://gigaom.com/2009/11/24/dropbox-raises-7-25m-crosses-3m-users/">raised over $7 million in financing and have over 3 million users</a>.</p>
<p>But there is another reason I absolutely love Dropbox: because <i>it was my idea</i>.  I invented it.</p>
<p><span id="more-475"></span></p>
<p>In the summer of 2004, I was really itching to get into <a href="http://code.google.com/soc/">Google&#8217;s Summer of Code competition</a>.  This was the summer I had taken a job working from home as the lead web developer at the <a href="http://uac-ny.org">Unemployment Action Center of NY</a>.  Though the job was great experience &#8212; letting me build my first full web application for a real client &#8212; I was itching to work on a technically juicy problem, something that affected <i>me</i> in my daily computer use.  </p>
<p>And so, I sat down for a day and wrote up a Google Summer of Code proposal for a new system I had invented called <i>Persistent Folders</i>.  It wasn&#8217;t <i>exactly</i> like Dropbox, but damn close.  Even the implementation is close: Dropbox and my system both sync files using rsync, and both use a Python daemon process.  The main difference is that since my system was meant to be open source, it did not require the use of a company-maintained service; instead, I proposed that users piggyback existing storage they have via web hosting providers.</p>
<p>Unfortunately, my project wasn&#8217;t selected.</p>
<p>Why am I posting this?  I recently had a discussion with another engineer after I had discussed some of the technology behind <a href="http://parse.ly">Parse.ly</a> with him.  He was surprised at how liberal I was with explaining our internal implementation, architecture, and algorithms.  He asked me, &#8220;Aren&#8217;t you worried that I could steal your idea?&#8221;</p>
<p>I responded, &#8220;You can steal it all you want; I dare you to try and implement it!&#8221;  I then explained that to me, ideas don&#8217;t matter.  I had the idea for a hundred startups that now exist before they started.  I know from talking to users and customers of Parse.ly that they had our idea before we implemented it.  What matters in software is not an idea, but <i>execution</i> of that idea.  Ideas are a dime a dozen.</p>
<p>I began this post with the statement, <i>I invented Dropbox</i>.  And now I&#8217;m here to tell you that it <i>doesn&#8217;t matter one bit</i>, because I never <i>implemented</i> Dropbox.  And you can&#8217;t own ideas&#8230;</p>
<blockquote><p>
If nature has made any one thing less susceptible than all others of exclusive property, it is the action of the thinking power called an idea, which an individual may exclusively possess as long as he keeps it to himself; but the moment it is divulged, it forces itself into the possession of every one, and the receiver cannot dispossess himself of it. Its peculiar character, too, is that no one possesses the less, because every other possesses the whole of it. He who receives an idea from me, receives instruction himself without lessening mine; as he who lights his taper at mine, receives light without darkening me.<br />
<i>-Thomas Jefferson</i>
</p></blockquote>
<p>Imagine if when I had come up with this idea, I had patented it.  Would it really have been fair to force Dropbox to license my technology?  To sue them for &#8220;infringing&#8221; on my patent?</p>
<p>No way &#8212; these guys deserve the success they have.  How stifling it would have been for me to put any roadblocks in their way because &#8220;I had the idea first&#8221;!  The world is better because Dropbox exists.  And, these guys have had &#8212; in my opinion &#8212; <b>near-flawless execution</b>.  So, kudos to them.</p>
<p>Consider the following matrix:</p>
<div align="center">
<table style="border: 1px solid #000; padding: 3px; text-align: center;">
<tr>
<td>&nbsp;</td>
<td style="font-weight: bold; padding: 5px;">Mediocre Idea</td>
<td style="font-weight: bold; padding: 5px;">Great Idea</td>
</tr>
<tr style="background-color: #ccc;">
<td style="font-weight: bold; padding: 5px;">No implementation</td>
<td> <img src='http://www.pixelmonkey.org/wordpress/wp-includes/images/smilies/icon_sad.gif' alt=':-(' class='wp-smiley' /> </td>
<td> <img src='http://www.pixelmonkey.org/wordpress/wp-includes/images/smilies/icon_sad.gif' alt=':-(' class='wp-smiley' /> </td>
</tr>
<tr style="background-color: #ddd;">
<td style="font-weight: bold; padding: 5px;">Mediocre Implementation</td>
<td> <img src='http://www.pixelmonkey.org/wordpress/wp-includes/images/smilies/icon_sad.gif' alt=':-(' class='wp-smiley' /> </td>
<td> <img src='http://www.pixelmonkey.org/wordpress/wp-includes/images/smilies/icon_confused.gif' alt=':-?' class='wp-smiley' /> </td>
</tr>
<tr style="background-color: #eee;">
<td style="font-weight: bold; padding: 5px;">Great Implementation</td>
<td> <img src='http://www.pixelmonkey.org/wordpress/wp-includes/images/smilies/icon_smile.gif' alt=':-)' class='wp-smiley' /> </td>
<td> <img src='http://www.pixelmonkey.org/wordpress/wp-includes/images/smilies/icon_cool.gif' alt=':cool:' class='wp-smiley' /> </td>
</tr>
</table>
</div>
<p>A mediocre idea with a good implementation is worth infinitely more than a carefully-guarded, good idea with no implementation.  Of course, the best products are both great ideas and great implementations.  And I think my proposal for &#8220;Persistent Folders&#8221; &#8212; written three years before Dropbox even started &#8212; proves this to me in a very personal way.</p>
<p>Now, I&#8217;m certain the Dropbox guys never read my little proposal, because it was only sent to Google and otherwise sat on my hard drive for years, not viewed by anyone.  I had a great idea, but no implementation.  And the Dropbox guys took a great idea (one they arrived at on their own, I&#8217;m sure), and gave it the implementation it deserved.</p>
<p>For those of you who guard your ideas carefully, I&#8217;d suggest you stop wasting your time, get off your butt, and focus on <a href="http://gettingreal.37signals.com/">actually building stuff</a>.  Because if you don&#8217;t, someone else will!</p>
<div align="center"><a href="http://www.pixelmonkey.org/wordpress/wp-content/uploads/2009/12/persist-poster.jpg" target="_blank"><img src="http://www.pixelmonkey.org/wordpress/wp-content/uploads/2009/12/persist-poster-300x219.jpg" alt="persist-poster" title="persist-poster" width="300" height="219" class="aligncenter size-medium wp-image-492" /></a></div>
<p>For the curious, below is my proposal to Google Summer of Code 2004, unaltered from its original draft.  This is just a relic; for now, I&#8217;m glad to keep <a href="http://parse.ly">hacking on my own little idea</a>, hoping one day I can look back and say I <i>executed</i> as well as Dropbox did&#8230;</p>
<blockquote><p>
<strong>PERSISTENT FOLDERS: A New Metaphor for Data Synchronization</strong><br />
<i>May 13, 2004</i></p>
<p><strong>The Problem</strong></p>
<p>Computer users are more and more finding themselves with a serious problem: the fragmentation of personal data across multiple physical machines, and even multiple operating systems.  Users who find it most comfortable to have a desktop machine at home and a mobile laptop computer &#8220;on-the-go&#8221; (for business or trips) have to deal with chaotic and often frustrating manual methods to copy that data to the needed places.  Some users carry USB memory sticks &#8212; which hold their important &#8220;working set&#8221; of files &#8212; and either work directly off those disks (suffering reduced speeds) or make copies of the folders therein on their actual machines, as they become needed, spreading yet more copies and compounding the problem of synchronization.  Others abuse ubiquitous technologies for accessing important files, by either e-mailing the files to themselves or by uploading them temporarily to web or FTP servers.</p>
<p>The end result of any of these methods is fragmentation of personal data, with error-prone manual processes for replication, and the inability for a consistent way to search, backup or even just keep track of all the important files and folders spread among the PCs in question.</p>
<p>What is needed to solve this problem, or at least make the problem more manageable, is an intelligent, user-friendly, customizable cross-platform program that allows for transparent synchronization of personal data across multiple computers and systems, either via a LAN or via the Internet.</p>
<p><strong>Introducing the Persistent Folder</strong></p>
<p>Up to this point, most users are used to understanding folders as existing solely in one location.  The only way to get a folder&#8217;s data onto another machine is to copy that folder, thus making a duplicate.  The goal of this project will be to introduce a new high-level data storage mechanism known as a Persistent Folder.  Persistent Folders differ from regular folders in that they are meant to be transparently persistent, or synchronized, across different computers.</p>
<p>To explore a hypothetical example, imagine user Joe sits down to do some personal accounting work on Friday.  He creates a folder on his desktop called &#8220;Personal Accounting,&#8221; and begins working on some OpenOffice spreadsheets in that folder.  A few minutes later, Joe realizes that some of his accounting work will have to be done while he is away during the weekend, on his laptop computer.</p>
<p>To enable this, he simply right-clicks the folder on his desktop and says &#8220;Make this folder persistent across multiple computers.&#8221;  When he does this, a dialog comes up asking him to type in a description of the persistent folder, and to select computers on which he wishes to make this folder persistent.  Joe is presented with a dialog of computers currently available on the LAN.  He sees his laptop, &#8220;MobileJoe&#8221;, and selects it.  He then presses OK.</p>
<p>Within seconds, Joe sees the folder &#8220;Personal Accounting&#8221; appear on his mobile computer&#8217;s desktop, even though he hasn&#8217;t even touched his mobile computer yet.  When he enters that folder, he sees the same spreadsheets that are available on his main PC&#8217;s desktop.</p>
<p>These two folders are now treated by Joe as &#8220;one persistent folder available across two computers.&#8221;  He can add files to one folder and they will automatically be propagated to the other.  He can modify files and the new versions will then exist in the other.  Joe no longer has to worry about pushing his data back and forth across the computers.</p>
<p><strong>Internet Synchronization by way of Ubiquitous Services</strong></p>
<p>One of the major questions one may ask at this point, &#8220;that is all well and good for persistence of a folder on a LAN, but what about when I leave my home/office, and need to synchronize over the Internet?&#8221;</p>
<p>One approach would be to have a special server application with which all computers that wish to share persistent folders could synchronize.  But then the user needs his own server, and needs to install my little server daemon on it.  And not many users have their own servers on which they can just install any old application.  So for normal users, this, in fact, is no approach at all.</p>
<p>Although most users don&#8217;t run their own servers, many modern users do have _server access_.  That is, many users do have Web/FTP hosting providers to whom they pay subscriptions, and these servers power their blogs, personal photo stores, etc.  The goal of Persistent Folders would be to allow users to piggyback their existing web services to synchronize their files, essentially turning a folder on that server into a Persistent Folder Repository.</p>
<p>A dialog in the properties of a persistent folder would include a checkbox that allows the user to &#8220;make this folder available over the Internet.&#8221;  It would then allow a user to choose a method for making this folder available via the Internet, asking the user to provide a &#8220;persistent folder repository&#8221; via FTP by default (due to commonality), but equally possible would be scp, rsync, NFS, or even something like cvs/svn (the goal, of course, would be to make the design modular enough that it could support any server type with basic file system operations).</p>
<p>Then, every other visible machine on the LAN who shares that persistent folder would have option enabled automatically.  If the machines are offline, the option can be entered manually by the same method explained above.</p>
<p>From that point on, the folders become persistently available and transparently usable, just as before.  If the other computers are available on the LAN, then the program utilizes LAN speeds and synchronizes directly.  Otherwise, it synchronizes with the Internet Repository.</p>
<p>Lucky Joe is now able to work on his files in the office, leave his laptop there (&#8220;the darn thing is so heavy to carry around!&#8221;), return home, and continue right on working on those files which are now found in the &#8220;same folder&#8221; on his desktop machine at home. </p>
<p><strong>Implementation Ideas</strong></p>
<p>I plan on implementing this idea in Python, since one of the major goals of the project is to allow Persistent Folders to exist not just across computers, but also across operating systems (so that a Windows desktop could have a persistent folder that also exists on a Linux laptop, for example).  For a user interface, I plan to use PyGTK, since that&#8217;s what I know, and since it is also cross-platform.  I need something powerful like GTK since there will be times when user intervention will be necessary, but since it is a goal of this project to reduce the number of times the user must intervene, I want to make sure that when he does, he is presented with sane, human-readable, and user-friendly dialogs.</p>
<p>I don&#8217;t plan to reinvent the wheel.  Most of the magic of Persistent Folders is just making existing synchronization tools work relatively silently and in a way that makes sense with a user&#8217;s workflow.  The main tool I am thinking of using is rsync, the relatively-ubiquitous UNIX utility for incremental synchronization of directory trees.  I considered using the unison, as recommended by Ubuntu&#8217;s Wiki entry, but I saw two major problems: (1) unison is no longer under active development and (2) it is written in OCaml, a relatively obscure language which I don&#8217;t know.  Therefore, any bugs I discover in unison would not be fixed in a timely fashion by its developers, and any features I&#8217;d like to add to support my idea would be quite difficult to implement.</p>
<p>As for monitoring folders for changes, I imagine the most elegant solution would be to take advantage of inotify under Linux (like Beagle does) and perhaps handle ChangeNotify events under Windows.  I&#8217;d really like to avoid polling, since polling is just plain evil for something as potentially neat as this.  Regardless, I&#8217;ll probably need to code Yet Another Daemon (or Windows service) to keep track of Persistent Folders on the local machine and their equivalents across the network.</p>
<p>Finally, for secure synchronization of files, I plan to use SSH tunneling wherever possible, which is available under Windows under the OpenSSH for Windows Sourceforge project, http://sshwindows.sf.net.  Linux distros like Ubuntu, of course, have all the ssh support one needs.</p>
<p><strong>Conclusion</strong></p>
<p>This project aims to introduce a new metaphor users may utilize to share important files across multiple computers: the Persistent Folder.  A Persistent Folder is not a shared a folder; rather, it is seen as a single folder that exists locally across multiple computers, and can be treated by the user as such.  Changes at any one folder rapidly propagate to the others.  Properly implemented, this may provide a better way for users to manage important data that might otherwise be scattered, fragmented, and even lost through the daily shuffle of file transfers across networked PCs.</p>
<p><strong>Appendix A: Project Roadmap</strong></p>
<p>o June 24: Begin Work, with ideas now fully developed in the form of documents.  Post these documents to Ubuntu&#8217;s Wiki to encourage ideas from community. </p>
<p>o July 5: Have a console synchronization wrapper and some network discovery stuff in Python written, and have UI concepts designed in Glade.</p>
<p>o July 20: Make 0.1 (GUI and basic features working) release, so that Google can show it off at OSCON?</p>
<p>o August 1: Have other great features, like the Internet synchronization and multi-protocol support, in 0.2 release.</p>
<p>o August 10: Consider working on features to allow transparent backup and versioning, to include with bug fixes in a 0.3 release.</p>
<p>o August 20: Make simultaneous 0.4 releases on Linux and<br />
Windows, hammering out as many cross-platform issues as possible. Add inotify/ChangeNotify support if not already there.</p>
<p>o August 30: The big 0.5 release, finished for Google&#8217;s deadline.  Let Google/Ubuntu make the decision if it&#8217;s worthy of being renamed a &#8220;1.0&#8243; release.</p>
<p>o September 1: Live a less stressful life, since my files are now neatly synchronized among my PCs!  But I&#8217;ll keep making it better.</p>
<p><strong>Appendix B: Hold On, Isn&#8217;t Samba Good Enough?</strong></p>
<p>One common response to this project may be, &#8220;Aren&#8217;t Samba and SMB shared folders good enough?&#8221;  Though Samba is good, I do not believe it is good enough.  Here&#8217;s why:</p>
<p>(1) Samba does not aim to present the user with a metaphor of a folder existing in multiple locations at the same time.  I believe this metaphor would be appreciated as powerful by longtime computer users and subconsciously acknowledged as highly usable by novices.</p>
<p>(2) Samba only allows users to share folders on their drives.  Other Samba users may then mount those folders via the LAN.  This two-step, asymmetric process already seems complicated and convoluted to end users.  But more importantly, synchronization is left up to the user.  In theory, users could avoid synchronization altogether and work on the files directly, via the share.  In practice, LAN speeds are not adequate, and other issues are raised (such as file locking and write conflicts).  This forces users to home-brew their own synchronization protocol to make sure duplicate files at different versions doesn&#8217;t result in an accidental loss of data.</p>
<p>(3) Samba does not provide any easy method to access personal files once one leaves the LAN and enters the WAN, short of opening up a bunch of ports on your router and trying to connect in from outside (a very slow and insecure method).</p>
<p>(4) Samba provides no recourse when a computer is no longer available.  Persistent Folders, on the other hand, make data available &#8220;offline&#8221; by design.</p>
<p>(5) Samba does not know whether two duplicate files exist across the network.  Therefore, Samba cannot be immediately utilized as a transparent form of backup.</p>
<p>Is the Persistent Folder meant to replace Samba?  Of course not.  I believe Samba has specific purposes: to allow for easy, fast, one-time transfers of files across a LAN, and to allow networked printer and device sharing.  I do not believe Samba is an adequate solution to allow a user to  treat a folder as if it existed on multiple computers at once.</p>
<p><strong>Appendix C: Versioning&#8217;s the Thing</strong></p>
<p>Upon further contemplation of this project, I realized I had left a question unanswered in this document.  What is the right way to deal with version conflicts during the silent synchronization phase among Persistent Folders?</p>
<p>Imagine user Joe works on a file in a Persistent Folder which exists on his laptop and desktop computers.  The first version (let&#8217;s call it version 0.1) was created on his desktop, and Joe had the laptop on the same network, allowing automatic synchronization to occur.  But then Joe&#8217;s laptop was disconnected from his desktop, as Joe was without network or even Internet access.  He works on the document a bit, which can now be called version 0.2.  But then Joe forgets that he worked on the document on his laptop, and when he gets home, he works on his desktop computer, creating a version 0.2 there too.  Which version 0.2 should be synchronized?</p>
<p>Normally, the answer would be to pick the most recent one.  But we don&#8217;t want Joe&#8217;s laptop work to be lost, just because Joe forgot about his prior work, do we?  Well, what needs to happen is a bit of smart conflict resolution with no data loss.</p>
<p>I propose that Persistent Folders should also be versioned to a sane degree.  Perhaps by default 3-5 versions of files are always kept, with the most recent versions visible directly in the persistent folder, and other versions buried (in .dotfiles or hidden folders) behind there.  Then, the Persistent Folder monitor should inform Joe (&#8220;whisper&#8221; to Joe via the notification area/systray) that there was a conflict, and the newest file was chosen.  But at any point, Joe can choose to revert a file back to an older version.  The interface should be such that Joe can even see where the file was edited, for example:</p>
<p>Personal Accounts.xls &#8211; Prior Versions<br />
  o version 0.2: edited on MobileJoe<br />
  o version 0.2: edited on DesktopJoe<br />
  o version 0.1: edited on DesktopJoe</p>
<p>Of course, versioning could be disabled (at risk of data loss to the user), or could be enabled as &#8220;smart versioning&#8221; to only version files when conflicts occur during synchronization.  Some may say that versioning is dangerous because it can drastically increase disk usage, but as I mentioned above, the other benefit is that the user gets redundant network backup of files for free.  In higher versions of Persistent Folders, things could get more sophisticated by allowing users to turn off versioning even at the file-level, but I don&#8217;t think that&#8217;d be necessary in the first few releases.
</p></blockquote>
<p>So, for those not keeping score, Dropbox supports:</p>
<ul>
<li>Windows, Linux and Mac OS X syncing, using a scheme similar to that described above, except with a managed set of servers (Dropbox&#8217;s) acting as the &#8220;repository&#8221;</li>
<li>sync over LAN (in latest beta releases) when PCs are local</li>
<li>file-level versioning</li>
<li>Collaboration by sharing folders with other users &#8212; a feature I didn&#8217;t discuss in my proposal, but that would be a clear next step for a managed service</li>
</ul>
<p>Go Dropbox!</p>
]]></content:encoded>
			<wfw:commentRss>http://www.pixelmonkey.org/2009/12/11/ideas-and-execution/feed</wfw:commentRss>
		<slash:comments>3</slash:comments>
		</item>
		<item>
		<title>Simplifying CSS with 960.gs</title>
		<link>http://www.pixelmonkey.org/2009/12/08/simplifying-css-with-960-gs?utm_source=rss&#038;utm_medium=rss&#038;utm_campaign=simplifying-css-with-960-gs</link>
		<comments>http://www.pixelmonkey.org/2009/12/08/simplifying-css-with-960-gs#comments</comments>
		<pubDate>Tue, 08 Dec 2009 20:20:52 +0000</pubDate>
		<dc:creator>pixelmonkey</dc:creator>
				<category><![CDATA[Open Source]]></category>
		<category><![CDATA[Programming]]></category>
		<category><![CDATA[Technology]]></category>

		<guid isPermaLink="false">http://www.pixelmonkey.org/?p=469</guid>
		<description><![CDATA[I recently did some web design work in collaboration with a graphic designer. She introduced me to what has become my latest favorite piece of CSS code: 960.gs. 960.gs is a CSS grid framework, similar in spirit to Blueprint CSS and YUI Grid. However, 960.gs is at once more minimalist than these approaches, and more [...]]]></description>
			<content:encoded><![CDATA[<p>I recently did some web design work in collaboration with a graphic designer.  She introduced me to what has become my latest favorite piece of CSS code: <a href="http://960.gs/">960.gs</a>.</p>
<p>960.gs is a CSS grid framework, similar in spirit to <a href="http://www.blueprintcss.org/">Blueprint CSS</a> and <a href="http://developer.yahoo.com/yui/grids/">YUI Grid</a>.  However, 960.gs is at once more minimalist than these approaches, and more thorough.</p>
<p>The <a href="http://sonspring.com/journal/960-grid-system">author has a detailed blog post</a> explaining his motivations for working on 960.gs, so I won&#8217;t rehash each of those.  Instead, I&#8217;ll just dive into what I liked about it.</p>
<p><span id="more-469"></span></p>
<ol>
<li><b>Very simple and comprehensible name choices for CSS classes</b>: You can see their <a href="http://960.gs/demo.html">demo page</a> (view its source) for examples, but I can even summarize the approach in a few short sentences.  You begin a grid container with a <i>container_XX</i> class, where XX is the number of total grid columns in the container.  Every child element has a <i>grid_XX</i> class, which is the number of columns (aka colspan) for that element.  All grid_XX elements should add up to the XX amount in the container if you are using all the grid elements available.  To use larger gutter widths, you can use <i>prefix_XX</i> and <i>suffix_XX</i> classes.  Finally, for any child grid elements, you need to mark the first one with an <i>alpha</i> class and the last one with an <i>omega</i> class &#8212; this is necessary to get rid of left/right margins on starting and ending elements.</li>
<li><b>Excellent CSS generator</b>: this <a href="http://www.spry-soft.com/grids/">online CSS generator</a> tool lets you generate 960.gs CSS that is just right for your website.</li>
<li><b>jQuery-based bookmarklet for double-checking grid layouts</b>: another <a href="http://gridder.andreehansson.se/">online tool</a> is a bookmarklet which will &#8220;inject&#8221; a customizable grid overlay on any existing site, to help with alignment.</li>
<li><b>Templates for every major design tool</b>: I saved the best for last.  Nathan&#8217;s focus in designing 960.gs was to allow better collaboration between trained graphic designers (whose tools are typically Adobe Photoshop, Fireworks, Illustrator, etc.) and trained web designers (whose tools are things like Rails, Grails, Django).  To ease this collaboration, the author <a href="http://bitbucket.org/nathansmith/960-grid-system/src/tip/templates/">provides templates for every major graphic design tool</a> that has &#8220;grid overlays&#8221; compatible with the 960.gs framework.</li>
</ol>
<p>Finally, the entire project is hosted <a href="http://bitbucket.org/nathansmith/960-grid-system/">on bitbucket and developed in the open</a>.  What more could you ask for?  This has really simplified my approach to standard CSS designs.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.pixelmonkey.org/2009/12/08/simplifying-css-with-960-gs/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Parse.ly presentation at NYC Search &amp; Discovery Meetup</title>
		<link>http://www.pixelmonkey.org/2009/11/09/parse-ly-presentation-at-nyc-search-discovery-meetup?utm_source=rss&#038;utm_medium=rss&#038;utm_campaign=parse-ly-presentation-at-nyc-search-discovery-meetup</link>
		<comments>http://www.pixelmonkey.org/2009/11/09/parse-ly-presentation-at-nyc-search-discovery-meetup#comments</comments>
		<pubDate>Mon, 09 Nov 2009 11:44:03 +0000</pubDate>
		<dc:creator>pixelmonkey</dc:creator>
				<category><![CDATA[Startups]]></category>
		<category><![CDATA[Technology]]></category>
		<category><![CDATA[cogtree]]></category>

		<guid isPermaLink="false"></guid>
		<description><![CDATA[Hi Parse.ly fans.  Andrew here.  I just wanted to let you know that I presented Parse.ly at the NYC Search &#038; Discovery Meetup on Thurs, Oct. 29.  The meetup is organized by Otis Gospodnetic (blog), who is one of the authors of Lucene in Action and the author of the ...]]></description>
			<content:encoded><![CDATA[<p>I presented Parse.ly at the NYC Search &#038; Discovery Meetup on Thurs, Oct. 29.  The meetup is organized by Otis Gospodnetic (blog), who is one of the authors of Lucene in Action and the author of the upcoming book, Solr in Action.  We make heavy use of Lucene and Solr on Parse.ly, so it was exciting to get an opportunity to present to a community of fellow technologists building systems with these excellent technologies.</p>
<p><span id="more-460"></span></p>
]]></content:encoded>
			<wfw:commentRss>http://www.pixelmonkey.org/2009/11/09/parse-ly-presentation-at-nyc-search-discovery-meetup/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Parse.ly releases new version on Sunday, Sept. 20</title>
		<link>http://www.pixelmonkey.org/2009/09/21/parse-ly-releases-new-version-on-sunday-sept-20?utm_source=rss&#038;utm_medium=rss&#038;utm_campaign=parse-ly-releases-new-version-on-sunday-sept-20</link>
		<comments>http://www.pixelmonkey.org/2009/09/21/parse-ly-releases-new-version-on-sunday-sept-20#comments</comments>
		<pubDate>Tue, 22 Sep 2009 00:56:51 +0000</pubDate>
		<dc:creator>pixelmonkey</dc:creator>
				<category><![CDATA[Startups]]></category>
		<category><![CDATA[Technology]]></category>
		<category><![CDATA[cogtree]]></category>

		<guid isPermaLink="false"></guid>
		<description><![CDATA[If you were trying to log into Parse.ly between 11pm-1am this Sunday, you may have noticed that it was intermittently down for maintenance.  Over the last several weeks, we've been working hard to roll out some new features, polish some rough edges, and improve our infrastructure after our launch last ...]]></description>
			<content:encoded><![CDATA[<p>If you were trying to log into Parse.ly between 11pm-1am this Sunday, you may have noticed that it was intermittently down for maintenance.  Over the last several weeks, we&#8217;ve been working hard to roll out some new features, polish some rough edges, and improve our infrastructure after our launch last &#8230;</p>
]]></content:encoded>
			<wfw:commentRss>http://www.pixelmonkey.org/2009/09/21/parse-ly-releases-new-version-on-sunday-sept-20/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Chase&#8217;s completely insecure and broken &#8220;secure&#8221; document exchange system (aka securedx, secure-dx)</title>
		<link>http://www.pixelmonkey.org/2009/08/21/chase-insecure?utm_source=rss&#038;utm_medium=rss&#038;utm_campaign=chase-insecure</link>
		<comments>http://www.pixelmonkey.org/2009/08/21/chase-insecure#comments</comments>
		<pubDate>Fri, 21 Aug 2009 14:41:17 +0000</pubDate>
		<dc:creator>pixelmonkey</dc:creator>
				<category><![CDATA[Programming]]></category>
		<category><![CDATA[Technology]]></category>

		<guid isPermaLink="false">http://www.pixelmonkey.org/?p=432</guid>
		<description><![CDATA[A few days ago, I got a call from my girlfriend, Olivia. I was so deep in working on my startup, Parse.ly, that I hadn&#8217;t checked my bank account statements in several weeks. We just went into private beta last Thursday, after DreamIt Demo Day. She noticed some suspicious charges, and so I looked into [...]]]></description>
			<content:encoded><![CDATA[<p>A few days ago, I got a call from my girlfriend, Olivia.  I was so deep in working on my startup, <a href="http://parse.ly">Parse.ly</a>, that I hadn&#8217;t checked my bank account statements in several weeks.  We just went into private beta last Thursday, after <a href="http://www.techcrunch.com/2009/08/13/dreamit-releases-ten-startups-into-the-wild/">DreamIt Demo Day</a>.  She noticed some suspicious charges, and so I looked into them.  Indeed, it looked like I had been a victim of fraud: there were three charges that clearly was not me.</p>
<p>I immediately called Chase Customer Service.  In order to confirm the details about my account, the representative needed me to identify the fraudulent charges, but also identify charges that were actually valid.  For this latter bit, I needed to identify the time/place of a specific transaction.  This card was mostly used for online auto bill payments, so this turned out to be impossible for any of my last 20 valid payments. Yet the customer service rep insisted that I name a time and place.  I told her, &#8220;The time and place was whenever the server for this system decided to automatically bill my account.  I don&#8217;t know where their server is, I don&#8217;t know what time their cron jobs run.&#8221;</p>
<p>&#8220;Cron jobs?&#8221; she said.</p>
<p>Right, I had been hanging around techies at <a href="http://dreamitventures.com">DreamIt Ventures</a> for too long.  &#8220;Listen, the transaction didn&#8217;t take place physically, it took place digitally.  I can identify one transaction, which is about a month old, where I actually used the card in-person to buy something.&#8221;  She finally understood and let me move on.</p>
<p><a href="http://burakkanber.blogspot.com/">Burak</a> from <a href="http://trendsta.com">Trendsta</a> said he felt bad for me, for how patient I had to be with this person.  But that was the least of it.  This little technical misunderstanding was nothing compared to what followed.</p>
<p><span id="more-432"></span></p>
<p>I was told that in order to get a credit back from my account, they had to collect from me a signed affidavit indicating the charges were fraudulent.  This affadavit would be &#8220;securely shared&#8221; with me via e-mail.  OK, &#8220;sounds good&#8221; I said.  I waited around for the e-mail to come in.</p>
<p>Finally, two e-mails arrived in my inbox.  The important bits <span style="color: red">are in red</span>.  First:</p>
<blockquote>
<h3>Message from Chase Customer Claims Secure Document Exchange</h3>
<p><strong>From:</strong> <span style="color: red">chase_customer_claims@secure-dx.com</span></p>
<p>Welcome to the Chase Customer Claims Secure Document Exchange. You recently contacted Chase regarding your claim number XXXX. Your documents are available for your review.</p>
<p>Per our telephone conversation, you will need to register to our secure website. </p>
<p><strong style="color: red"><br />
Your initial password is: password</p>
<p>Your initial user name has been sent to you in a separate email.<br />
</strong></p>
<p>On your first log in, you will be required to select a new password.</p>
<p>Thank you for using Chase Customer Claims Secure Document Exchange.</p>
<p>To contact Chase for claim related questions or to withdraw your claim, please call 1-866-564-2262.
</p></blockquote>
<p>Any geek reading this will immediately identify some key things wrong with this e-mail that make it look like a total phishing expedition.  Namely:</p>
<ol>
<li>The e-mail address, rather than being from a chase.com domain, was from a strange domain named &#8220;secure-dx.com&#8221;.</li>
<li>Rather than sending a cryptographically secure, expiring activation link, a default password was sent in plain text.</li>
<li>To make matters worse, the password is the same for all users, and thus anyone who can guess my e-mail address can easily impersonate me on this &#8220;secure document&#8221; website.</li>
<li>The default password is &#8220;password&#8221;.  WTF?! I mean, c&#8217;mon?</li>
</ol>
<p>I didn&#8217;t quite understand why I needed a &#8220;second e-mail&#8221; now, but I opened it up.  Here it is, excerpted:</p>
<blockquote>
<h3>Your Chase Customer Claims Secure Document Exchange Electronic Package is available online</h3>
<p><strong>From:</strong> <span style="color: red">chase_customer_claims@secure-dx.com</span></p>
<p>ANDREW MONTALENTI,</p>
<p>Welcome to the Chase Customer Claims Secure Document Exchange.You recently contacted Chase regarding your claim number XXXX. Your documents are available for your review. </p>
<p>Per our telephone conversation, you will need to register to our secure website by clicking on the link below or copy and paste the link into your browser&#8217;s address bar.</p>
<p><span style="color: red">https://chase.secure-dx.com/consumerdcx-chase_atm</span></p>
<p>Your user name is my.email@hidden.com</p>
<p><span style="color: red">Your initial password has been sent to you in a separate email</span></p>
<p><span style="color: red">On your first log in, you will be required to select a new password. NOTE: This site is different from Chase.com and passwords are not related. Updating your password on Chase Customer Claims Secure Document Exchange will have no impact on established Chase.com passwords.</span></p>
<p>Once registered, you will be able to access your customer correspondence on our secure website. You may be offered the option to complete and sign the form online if you wish to do so. [...]
</p></blockquote>
<p>To say I was confused would be a major understatement.  I was downright depressed.</p>
<p>My guess is that the engineers at Chase thought that by separating the &#8220;password e-mail&#8221; from the &#8220;user e-mail&#8221;, that somehow made the whole communication more secure.  Two e-mails are better than one, right?</p>
<p>The most important thing to point to is the link.  The link where this secure communication will happen is <strong>not at the chase.com domain</strong>  Instead, it is at https://<strong>chase.secure-dx.com</strong>/consumerdcx-chase_atm.  There is no way, NO WAY this is a real Chase site, I think.</p>
<p>I click on the link and in Firefox, I see this:</p>
<p><img src="http://www.pixelmonkey.org/wordpress/wp-content/uploads/2009/08/chase_forgery.png" alt="chase_forgery" title="chase_forgery" width="435" height="228" class="aligncenter size-full wp-image-437" /></p>
<p>At this point, my paranoid self turns on.  Curious, I click through the link anyway.  And I see this:</p>
<p><img src="http://www.pixelmonkey.org/wordpress/wp-content/uploads/2009/08/chase_sdx.png" alt="chase_sdx" title="chase_sdx" width="600" height="294" class="aligncenter size-full wp-image-438" /></p>
<p>Now I&#8217;m really paranoid.  Links off secure-dx.com pointing back to chase.com&#8217;s privacy policy.  A username and password box and a sort of hokey imitation of the Chase.com web design.  I realize, holy shit, I&#8217;m being duped!  Not just small-time credit card fraud, but someone has managed to really take over my life!</p>
<p>Why am I freaking out?  The customer service person I talked to, I realize what must have happened.  That wasn&#8217;t Chase.  Someone stole my credit card information and then set up a call forwarding on my cell phone, somehow, to point Chase&#8217;s customer service number to some fraudulent interceptor.  This person then diligently took my claim only to send me an e-mail that would get yet more information out of me and take me for even more money.  I freaked!</p>
<p>Immediately, I double-checked my call logs and compared them to Chase.com customer service numbers.  I made sure to change my DNS server to OpenDNS to make sure no one was somehow intercepting that.  Finally, I realized I could look at the number written on the back of my Chase credit cards.  It all checked out &#8212; the number was good.  So I switched phone.  I called Chase customer service on both my phone and Olivia&#8217;s.  I made sure the messages were exactly the same.  From Olivia&#8217;s phone, I called back Chase again to speak to someone there about this.  But then I got even more paranoid &#8212; how big could this be? &#8212; so I decided to hang up.  Instead, I called my local Chase branch in my neighborhood.</p>
<p>With my local branch&#8217;s help, I got transferred via a branch office line to the actual Chase customer service.  <em>Finally on a secure line</em>, I thought to myself.  When they picked up, I was expecting to uncover the scam of the century.  I felt like an investigative journalist right on the tail of something truly big.</p>
<p>But then I spoke to the Chase representative, on the secure line, and she explained to me that this is just the normal procedure.  secure-dx.com is the website they use for &#8220;securely&#8221; sharing documents.</p>
<p>I was livid.  I explained everything wrong with this setup.  I demanded to speak to a supervisor.  I spoke to a supervisor.  He said he did not know why the system was the way it was.  He wasn&#8217;t a software guy.  He just knew that &#8220;with the way the business is changing lately, a lot of systems are in flux.&#8221;  I said this flux was unacceptable.  &#8220;I&#8217;m a software engineer,&#8221; I said.  &#8220;How can I possibly trust Chase to manage my financial accounts if something as simple as sharing a PDF document is done in the least secure way possible?&#8221;  What other skeletons might they have in the closet?</p>
<p>I wanted to be forwarded to the department responsible for that.  After my explanation to him of what was wrong, he fully understood the problem.  To his credit, he admitted it was wrong the way it was set up.  He actually tried to track down a supervisor.  But there was none that could field IT and software requests.</p>
<p>They promised to call me once they could track someone down to talk about this.  No call yet.</p>
<p>My excitement came down a couple of notches.  I was not the investigative journalist undercovering an elaborate scam any longer.  Instead, I was a software engineer.  And some members of my profession have let me down.  Big time.</p>
<p>In the meanwhile, I did the research and found the vendor who provided this service to Chase.  They are Wolters Kluwer, a &#8220;financial services and banking compliance solutions provider&#8221;.  The product page for &#8220;SDX&#8221;, <a href="http://www.wolterskluwerfs.com/Content/Products/ProductDetail/Secure_Document_Exchange.aspx">Secure Document Exchange</a>, is completely ludicrous.  They claim this product includes &#8220;industry-leading security, including PKI encryption and multi-level user authentication, to keep communications safe at every step of the process.&#8221;  </p>
<p>Right, so the password was <strong>sent in plain text</strong>.  The <strong>default password is &#8220;password&#8221;</strong>.  And, rather than having a chase.com subdomain which points at Wolters Kluwer&#8217;s server (e.g. secure-dx.chase.com) and sharing a secure chase.com certificate with them, they decide to host the whole thing outside of the chase.com domain, so that as a user, I have no way of confirming this actually is an e-mail or system originating from Chase.  Users are so confused by this that they have already reported it as a phishing scam, even though it is not one.  </p>
<p>That&#8217;s industry-leading?  That&#8217;s &#8220;safe communication&#8221;?</p>
<p>No, that&#8217;s a joke.  Chase should be ashamed.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.pixelmonkey.org/2009/08/21/chase-insecure/feed</wfw:commentRss>
		<slash:comments>165</slash:comments>
		</item>
		<item>
		<title>For Linux/GNOME users: tired of nm-applet? Try wicd</title>
		<link>http://www.pixelmonkey.org/2009/07/31/for-linuxgnome-users-tired-of-nm-applet-try-wicd?utm_source=rss&#038;utm_medium=rss&#038;utm_campaign=for-linuxgnome-users-tired-of-nm-applet-try-wicd</link>
		<comments>http://www.pixelmonkey.org/2009/07/31/for-linuxgnome-users-tired-of-nm-applet-try-wicd#comments</comments>
		<pubDate>Fri, 31 Jul 2009 23:01:44 +0000</pubDate>
		<dc:creator>pixelmonkey</dc:creator>
				<category><![CDATA[GNOME]]></category>
		<category><![CDATA[Open Source]]></category>
		<category><![CDATA[Technology]]></category>

		<guid isPermaLink="false">http://www.pixelmonkey.org/2009/07/31/for-linuxgnome-users-tired-of-nm-applet-try-wicd/</guid>
		<description><![CDATA[This post is only intended for those who actually run GNOME and Linux, just a warning I just replaced network-manager on my Ubuntu Jaunty desktop with wicd.  See wicd here: http://wicd.sourceforge.net/ What&#39;s so great about wicd?  I used to think nm-applet and NetworkManager were the best thing since sliced bread, but have grown increasingly frustrated [...]]]></description>
			<content:encoded><![CDATA[<p>This post is only intended for those who actually run GNOME and Linux, just a warning <img src='http://www.pixelmonkey.org/wordpress/wp-includes/images/smilies/icon_smile.gif' alt=':-)' class='wp-smiley' /> </p>
<p />
<div>I just replaced <b>network-manager</b> on my Ubuntu Jaunty desktop with <b>wicd</b>.  See wicd here:
<p />
<div><a href="http://wicd.sourceforge.net/">http://wicd.sourceforge.net/</a></div>
<p />
<div>What&#39;s so great about wicd?  I used to think nm-applet and NetworkManager were the best thing since sliced bread, but have grown increasingly frustrated with these tools over time.  Here&#39;s my short list of things I dislike about NM:</div>
<p><span id="more-427"></span></p>
<p />
<div>
<ul>
<li>The wifi network list is <b>unsorted</b> (rather than <b>obviously</b> being sorted by signal strength).</li>
<li>The wifi network list uses an animated progress bar.  This may look cool in screencasts, but when there are &gt;20 networks in range, pulling up the list brings my computer to a crawl (due to 20 animated progress bars).</li>
<li>The wifi network list is only accessible by clicking on the nm-applet icon &#8212; there is no &quot;full screen&quot; view for when you have a lot of networks in range.</li>
<li>Its logic for remembering and prioritizing networks is just plain wrong, and the UI for editing this stuff is broken.</li>
<li>It does a horrible job of guessing the authentication type of a network, and takes way too long authenticating.</li>
<li>There is no command-line way to switch networks, and NM so messes with your Linux network connections that using typical command-line tools becomes painful.  I run Linux for a reason, you know <img src='http://www.pixelmonkey.org/wordpress/wp-includes/images/smilies/icon_smile.gif' alt=':-)' class='wp-smiley' /> </li>
<li>NM is written in GObject/C.  I know GObject/C, but I also know enough to know that it&#39;s too much of a pain to go in there to fix any of these problems.</li>
</ul>
<p>Enter wicd.  It seems to fix all these problems.  Like NM, wicd runs as a daemon and it is via that daemon that networks are connected.  It has a systray app like nm-applet that is written in GTK+ and easily integrates with GNOME, which is called <b>wicd-client</b>.  Unlike nm-applet, wicd-client provides a fast and ergonomic interface for browsing networks.  If you have a lot of networks in range, you get a nice window with all of them sorted by signal strength, and can easily set up &quot;automatic connect&quot; settings.</div>
<div>
<p />
<div>wicd is also written in <b>Python</b>.  I think that gives it about +100 points above NM for me, as now I can actually submit patches against my wifi manager if anything bugs me.  But so far, it actually seems like quite a neat, robust, and good little app.</div>
<p><a href='http://posterous.com/getfile/files.posterous.com/pixelmonkey/Ifp8BLBdGyZyJY9AoIjcalZ7fhiMOWZ1HCsZ8u84s7jNQHuOT1PT65KlYRbm/Screenshot-Wicd_Network_Manage.png'><img src="http://posterous.com/getfile/files.posterous.com/pixelmonkey/eeNT6N2MWDtCrPWO41WJJWAoRcvih6Mr9RSmX8rTdMOvPHgMs1PuVUQNcEzr/Screenshot-Wicd_Network_Manage.png.scaled.500.jpg" width="500" height="389"/></a></p>
<p />
<div>wicd 1.6.2 (the latest version available on their <a href="http://sf.net">sf.net</a> page) also includes <b>wicd-curses</b>, an ncurses-based command-line client for the wicd daemon.  Yes!  I can finally manage my wifi networks from the command-line.  All in all, I&#39;m glad there is a competitor to NetworkManager that is getting actively developed, because I have lived frustrated with NM for too long.  Hooray for open source, it&#39;s all about choices!</div>
</p></div>
</div>
]]></content:encoded>
			<wfw:commentRss>http://www.pixelmonkey.org/2009/07/31/for-linuxgnome-users-tired-of-nm-applet-try-wicd/feed</wfw:commentRss>
		<slash:comments>3</slash:comments>
		</item>
		<item>
		<title>Trouble connecting to GTalk with Pidgin?</title>
		<link>http://www.pixelmonkey.org/2009/07/13/trouble-connecting-to-gtalk-with-pidgin?utm_source=rss&#038;utm_medium=rss&#038;utm_campaign=trouble-connecting-to-gtalk-with-pidgin</link>
		<comments>http://www.pixelmonkey.org/2009/07/13/trouble-connecting-to-gtalk-with-pidgin#comments</comments>
		<pubDate>Mon, 13 Jul 2009 19:05:26 +0000</pubDate>
		<dc:creator>pixelmonkey</dc:creator>
				<category><![CDATA[GNOME]]></category>
		<category><![CDATA[Open Source]]></category>
		<category><![CDATA[Technology]]></category>

		<guid isPermaLink="false">http://www.pixelmonkey.org/2009/07/13/trouble-connecting-to-gtalk-with-pidgin/</guid>
		<description><![CDATA[After my recent upgrade to Pidgin 2.5.5 (on Ubuntu Jaunty), GTalk mysteriously stopped working.  Check out the FAQ entry on the Pidgin developer website for an explanation.  The workaround, not listed there, is to change your &#34;Connect Server&#34; to &#34;talk.google.com&#34;.  Pidgin will then prompt you once for a certificate, and after that, it will connect fine. A [...]]]></description>
			<content:encoded><![CDATA[<p>After my recent upgrade to Pidgin 2.5.5 (on Ubuntu Jaunty), GTalk mysteriously stopped working.  Check out the <a href="http://developer.pidgin.im/wiki/Protocol%20Specific%20Questions#WhycantIlogontomyGoogleTalkGoogleAppsaccountanymore">FAQ entry</a> on the Pidgin developer website for an explanation.  The workaround, not listed there, is to change your &quot;Connect Server&quot; to &quot;<a href="http://talk.google.com">talk.google.com</a>&quot;.  Pidgin will then prompt you once for a certificate, and after that, it will connect fine.
<div></div>
<div>A developer in #pidgin on <a href="irc://irc.freenode.org">irc.freenode.org</a> told me to &quot;fix my router&quot; since my &quot;router was broken&quot;.  This even though the problem has now occurred on three separate LANs, two of which I don&#39;t own/control.  Routers that are used as DNS servers are <i>very</i> common, and the fact they are broken in this regard is a reality.  Wake up &#8212; realities trump ideal every time.  Pidgin should automatically work around this problem, IMO.</div>
]]></content:encoded>
			<wfw:commentRss>http://www.pixelmonkey.org/2009/07/13/trouble-connecting-to-gtalk-with-pidgin/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>We’ve planted our roots, and now we’re growing…</title>
		<link>http://www.pixelmonkey.org/2009/07/06/we%e2%80%99ve-planted-our-roots-and-now-we%e2%80%99re-growing%e2%80%a6?utm_source=rss&#038;utm_medium=rss&#038;utm_campaign=we%25e2%2580%2599ve-planted-our-roots-and-now-we%25e2%2580%2599re-growing%25e2%2580%25a6</link>
		<comments>http://www.pixelmonkey.org/2009/07/06/we%e2%80%99ve-planted-our-roots-and-now-we%e2%80%99re-growing%e2%80%a6#comments</comments>
		<pubDate>Tue, 07 Jul 2009 04:44:34 +0000</pubDate>
		<dc:creator>pixelmonkey</dc:creator>
				<category><![CDATA[Startups]]></category>
		<category><![CDATA[Technology]]></category>
		<category><![CDATA[cogtree]]></category>

		<guid isPermaLink="false"></guid>
		<description><![CDATA[Sorry for excessive metaphors related to trees, but it just seemed so fitting.

You see, for almost a year, Sachin (the other founder of Cog Tree) and I have spent every moment of our free time to the path of starting this company.  We felt quite nomadic during that time -- ...]]></description>
			<content:encoded><![CDATA[<p>Sorry for excessive metaphors related to trees, but it just seemed so fitting.</p>
<p>You see, for almost a year, Sachin (the other founder of Cog Tree) and I have spent every moment of our free time to the path of starting this company.  We felt quite nomadic during that time &#8212; &#8230;</p>
]]></content:encoded>
			<wfw:commentRss>http://www.pixelmonkey.org/2009/07/06/we%e2%80%99ve-planted-our-roots-and-now-we%e2%80%99re-growing%e2%80%a6/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Ubuntu Jaunty installation process</title>
		<link>http://www.pixelmonkey.org/2009/06/06/ubuntu-jaunty-installation-process?utm_source=rss&#038;utm_medium=rss&#038;utm_campaign=ubuntu-jaunty-installation-process</link>
		<comments>http://www.pixelmonkey.org/2009/06/06/ubuntu-jaunty-installation-process#comments</comments>
		<pubDate>Sat, 06 Jun 2009 21:17:39 +0000</pubDate>
		<dc:creator>pixelmonkey</dc:creator>
				<category><![CDATA[Open Source]]></category>
		<category><![CDATA[Technology]]></category>

		<guid isPermaLink="false">http://www.pixelmonkey.org/?p=408</guid>
		<description><![CDATA[Today, I decided to finally sit down and upgrade my Ubuntu Intrepid installation to Ubuntu Jaunty. I torrented the live DVD last night (causing my roommates to complain of major Internet hoggage &#8212; it was downloading at 1.2MB/sec!). I then performed a full system backup to a remote hard drive, and then repartitioned my drives [...]]]></description>
			<content:encoded><![CDATA[<p>Today, I decided to finally sit down and upgrade my Ubuntu Intrepid installation to Ubuntu Jaunty.  I torrented the live DVD last night (causing my roommates to complain of major Internet hoggage &#8212; it was downloading at 1.2MB/sec!).  I then performed a full system backup to a remote hard drive, and then repartitioned my drives this morning using gparted, the graphical partition editor that comes with Jaunty&#8217;s live DVD.</p>
<p>The process took some time, which is why I saved it for a weekend.  To backup my hard drive took about 2 hours, and doing the partitioning operations took about 3 hours.  I went out in the nice weather and picked up groceries while it was loading.</p>
<p>When I got back and could kick off the installation process, I was pleasantly surprised by the installation wizard UI.  It easily guided me through the partition setup process.  Even though in my case I had to make use of the &#8220;Advanced&#8221; editor, it easily visualized what was going on in my hard drive, and even detected the operating systems I had on there (WinXP and Intrepid).</p>
<p>I set up my new ext3 partitions (after deciding ext4 too unstable for my taste), and got started.  I was pleasantly surprised when instead of asking me to reboot my computer, it just <em>started</em> right up.  I still had access to a functioning computer while it was installing!  Nice.  That allowed me to jump on my blog and start on this post <img src='http://www.pixelmonkey.org/wordpress/wp-includes/images/smilies/icon_smile.gif' alt=':-)' class='wp-smiley' />   I even connected my MP3 player and have some tunes playing!</p>
<p>I was considering doing an upgrade of my system from Intrepid->Jaunty, but decided to give a clean installation a try.  I get the feeling that there is some &#8220;drag&#8221; in my Linux installation which has been running on my machine for almost 3 years now.  (Wow, has it been that long since I got this laptop?)  I went through multiple releases of Ubuntu via upgrades, and I simply feel my requirements for my system have shrunk so significantly that a clean install was best to ensure my system is configured well and cleanly.</p>
<p>What do I mean by &#8220;shrunk&#8221; requirements?  Well, when I profile the usage of my computer, nowadays 90% of what I do personally happens within Firefox.  The remaining 10% are all handed by newer software.  Among things that don&#8217;t include Firefox are browsing photos and listening to MP3s.  Even some of these tasks are moving to the web platform.</p>
<p>For my work on <a href="http://www.cogtree.com">Cog Tree</a>, I really only have 3 development tools I lean on directly: vim, WingIDE (Python), and Eclipse IDE (Java).  Javascript development and debugging happens inside a browser.  I still lean on VMWare to give me some high-quality creative professional tools from the Windows world, e.g. Photoshop and Topstyle (for CSS).  Aside from these, I don&#8217;t really need nor want much other software on my system.  Any other development tools can be installed on-demand using Synaptic.</p>
<p>Jaunty&#8217;s installation percentage is about 50% right now.  We&#8217;ll see how the system runs once it boots directly off the hard drive.  I&#8217;m pleasantly surprised that most of my hardware seems to be working out of the box.  Even my volume buttons, brightness buttons and media buttons on my laptop now work, which is a nice touch.  My sound quality is still a little poor due to a chipset detection problem that still seems to be present in the snd_hda_intel driver.  But I&#8217;m pretty sure by setting some options in /etc/modprobe.d/alsa-base I&#8217;ll be able to get it working better.</p>
<p>People who know me know that I&#8217;m very skeptical about my computer and about Linux.  I regularly complain about all the little silly regressions that Linux has suffered over the years.  I&#8217;m also particularly upset about how certain beautiful and essential pieces of software never end up making it into the Linux mainstream, e.g. TuxOnIce.  But hopefully, Jaunty will capture my heart this time, and gain some love from this Linux cynic&#8230;</p>
]]></content:encoded>
			<wfw:commentRss>http://www.pixelmonkey.org/2009/06/06/ubuntu-jaunty-installation-process/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Favorite PyCon 2009 talks</title>
		<link>http://www.pixelmonkey.org/2009/04/06/favorite-pycon-2009-talks?utm_source=rss&#038;utm_medium=rss&#038;utm_campaign=favorite-pycon-2009-talks</link>
		<comments>http://www.pixelmonkey.org/2009/04/06/favorite-pycon-2009-talks#comments</comments>
		<pubDate>Mon, 06 Apr 2009 15:10:13 +0000</pubDate>
		<dc:creator>pixelmonkey</dc:creator>
				<category><![CDATA[Open Source]]></category>
		<category><![CDATA[Programming]]></category>
		<category><![CDATA[Technology]]></category>

		<guid isPermaLink="false">http://www.pixelmonkey.org/?p=385</guid>
		<description><![CDATA[I attended PyCon 2009 this year, which was a whole lot of fun. Quite a few people have asked me which talks I liked, so I decided to put together my &#8220;top 5 talks&#8221; list, in ranked order: A Whirlwind Excursion through Writing a C Extension. This talk by Ned Batchelder (author of coverage.py and [...]]]></description>
			<content:encoded><![CDATA[<p>I attended PyCon 2009 this year, which was a whole lot of fun.  Quite a few people have asked me which talks I liked, so I decided to put together my &#8220;top 5 talks&#8221; list, in ranked order:</p>
<ol>
<li><a href="http://pycon.blip.tv/file/1957417/">A Whirlwind Excursion through Writing a C Extension</a>.  This talk by Ned Batchelder (author of coverage.py and cog) shows that you can write a Python C extension module in under 20 minutes.  This is my top talk because I never thought that my skills in C would be so directly useful in writing Python applications.  Considering <i>how damn easy</i> it is to write a basic C extension module, I wouldn&#8217;t be surprised if the only reason I ever write C code again is to implement some Python functions or types in C.  Truly the best of both worlds!</li>
<li><a href="http://pycon.blip.tv/file/1957215/">Reinteract: a better way to interact with Python</a>.  Owen Taylor (of GNOME/GTK+ fame) has spent some time over the last few months building a better Python shell.  Specifically, it&#8217;s a lightweight shell that is meant to be a prototyping or &#8220;worksheet&#8221; environment a la Matlab, Mathematica, or Maple.  Except, you&#8217;re running and re-evaluating Python code.  It even supports things like in-line graph plotting, but I&#8217;ve already used it to experiment with Python web services API.  Any Python programmer who has been frustrated with IPython before should check out Reinteract.</li>
<li><a href="http://pycon.blip.tv/file/1947373/">Easy AI with Python</a>.  This talk might have gotten the #1 slot for most interesting, but not the #1 slot overall because it seems like this talk has been given at a lot of conferences (not just PyCon) over the last few years.  This talk introduces some complex AI topics in a very short time frame, and in a very intuitive way.  For me, the neural networks example with Jets and Sharks was particularly impressive.  Raymond Hettinger is a great presenter, and if you have some time you should definitely check out his recipes on <a href="http://code.activestate.com/recipes/users/178123/">ActiveState&#8217;s Python Cookbook</a> and his <a href="http://users.rcn.com/python/download/Descriptor.htm">How-to Guide for Descriptors</a>.</li>
<li><a href="http://pycon.blip.tv/file/1957071/">Abstraction as Leverage</a>.  A talk by one of my favorite Python authors, Alex Martelli (who wrote the best book on Python on the market, <i>Python in a Nutshell</i>), this talk isn&#8217;t so much about Python as it is about software engineering overall.  But it&#8217;s thought-provoking as his talks usually are.</li>
<li><a href="http://pycon.blip.tv/file/1949345/">Class Decorators: Radically Simple</a>.  The presenter is the author of the Class Decorators PEP, Jack Diederich.  If you like decorators and you are curious about metaclasses, you&#8217;ll love class decorators.</li>
</ol>
<p>Feel free to share your favorites!</p>
]]></content:encoded>
			<wfw:commentRss>http://www.pixelmonkey.org/2009/04/06/favorite-pycon-2009-talks/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Beautiful Code and a Beautiful Bug</title>
		<link>http://www.pixelmonkey.org/2009/02/28/beautiful-code-and-a-beautiful-bug?utm_source=rss&#038;utm_medium=rss&#038;utm_campaign=beautiful-code-and-a-beautiful-bug</link>
		<comments>http://www.pixelmonkey.org/2009/02/28/beautiful-code-and-a-beautiful-bug#comments</comments>
		<pubDate>Sun, 01 Mar 2009 02:32:14 +0000</pubDate>
		<dc:creator>pixelmonkey</dc:creator>
				<category><![CDATA[Personal]]></category>
		<category><![CDATA[Programming]]></category>

		<guid isPermaLink="false">http://www.pixelmonkey.org/?p=374</guid>
		<description><![CDATA[I am teaching a technical course on the popular and ubiquitous version control system, Subversion, this Monday. I thought it might be fun to give my class a little &#8220;extra credit&#8221; reading from the O&#8217;Reilly book, Beautiful Code. In it, one of the original authors of Subversion, Karl Fogel, shares what he considers to be [...]]]></description>
			<content:encoded><![CDATA[<p>I am teaching a technical course on the popular and ubiquitous version control system, <a href="http://subversion.tigris.org/">Subversion</a>, this Monday.  I thought it might be fun to give my class a little &#8220;extra credit&#8221; reading from the O&#8217;Reilly book, <a href="http://oreilly.com/catalog/9780596510046/">Beautiful Code</a>.  In it, one of the original authors of Subversion, Karl Fogel, shares what he considers to be the most beautiful internal design within the codebase: the <a href="http://www.red-bean.com/kfogel/beautiful-code/bc-chapter-02.html">SVN delta editor</a>.  Though this API is not directly used in doing Subversion development, I thought it might be cool for students to have a deeper understanding of the thought that went into SVN&#8217;s codebase.  But when trying to print up some copies of the chapter for the class, I got more than I bargained for&#8230;</p>
<p><span id="more-374"></span></p>
<p><img src="http://www.pixelmonkey.org/wordpress/wp-content/uploads/2009/02/caterpillar-300x199.jpg" alt="" title="caterpillar" width="300" height="199" class="alignright size-medium wp-image-375" /></p>
<p>I highly recommend the entire book.  It is not so much a book about beautiful code as about passionate and opinionated programmers and their tastes.  But this is a good thing.  It was one of the few books about software that I have read in the last decade or so that actually gave me entirely positive feelings about my profession.  There is so much raw creativity and thought captured in these few essays.  What <a href="http://en.wikipedia.org/wiki/Brian_Kernighan">Brian Kernighan</a> finds beautiful is entirely different from what <a href="http://en.wikipedia.org/wiki/Yukihiro_Matsumoto">Matz</a> or <a href="http://en.wikipedia.org/wiki/Simon_Peyton_Jones">simonpj</a> find beautiful.  And that&#8217;s the thing about a fundamentally creative craft like software.  You put five software engineers in a room with a piece of code, and you&#8217;re lucky if you come out with only six different opinions about it.  It&#8217;s like art, or writing.  Taste matters.</p>
<p>I don&#8217;t recommend people read Beautiful Code to try to imitate some of the code described therein.  Instead, I recommend you read it as a sociological or psychological study of what makes proud and bright software engineers tick.  For example, for Kernighan it is the simplicity and minimalism that is embodied in UNIX.  For Matz, it is the notion that the programming language should be as syntactically flexible as our real languages are.  For simonpj, it&#8217;s that complicated can be made easy, given the right abstractions.  And for Jon Bentley, in one of the more thought-provoking essays in the book, beauty and elegance was only perceived as the size of his code <i>shrank</i>.</p>
<p><img src="http://www.pixelmonkey.org/wordpress/wp-content/uploads/2009/02/acroread_disaster1.png" alt="" title="acroread_disaster1" class="alignleft size-full wp-image-376" /></p>
<p>The essay about the SVN Delta Editor not only illuminates the internals of SVN, but also illustrates the social dimension to software engineering and design.  It is a story about programmers, debating an API, producing it, and then putting it into practice.  It is about give and take, and an unteachable skill in problem size and complexity reduction.  All this in C!  There was a period of time in university where I actually programmed in C full-time, so I have a lot of respect for the elegance with which they crafted this powerful API.  C gives you few tools (like OO or explicit interfaces) for doing this kind of work; they had to work in spite of the language&#8217;s features and plan carefully.</p>
<p>I have about twenty students in my class, so I was going to print up one copy and get it copied and stapled at a local print shop.  (See <a href="#note-on-copyright">note on copyright below</a>.)  I opened up my ebook PDF of Beautiful Code with acroread on UNIX.  I navigated to the right chapter and realized that I wanted to print just that single chapter.  I always remember being annoyed whenever I had to do this, for a number of reasons.</p>
<ol>
<li>PDF ebooks sometimes lack the proper &#8220;bookmark&#8221; information to navigate to the right section to print</li>
<li>Since ebooks were once print copies, they tend to have page numbers at the bottom of each page.  But since the ebook itself has a different page numbering scheme, all sorts of psychic dissonance occurs.  You navigate to page 30 (in the print copy) but have to note that it&#8217;s actually page 42 in the ebook.  You then navigate to page 45 (in the print copy) but have to note that it&#8217;s actually 57 in the ebook.</li>
<li>OK, now I know what I need to print&#8230; I think.  So now I have to enter one of those print ranges in the &#8220;Print&#8221; dialog. Is it 30-42?  No, wait, it&#8217;s 42-45&#8230; I mean, 42-57 &#8212; that&#8217;s it!  Is that inclusive or exclusive? <img src='http://www.pixelmonkey.org/wordpress/wp-includes/images/smilies/icon_smile.gif' alt=':-)' class='wp-smiley' />   Oh, my&#8230;</li>
</ol>
<p>It&#8217;s really not <i>that</i> bad, and it&#8217;s only an occasional annoyance, but it&#8217;s always there.  I&#8217;m sure you know what I&#8217;m talking about.</p>
<p><img src="http://www.pixelmonkey.org/wordpress/wp-content/uploads/2009/02/acroread_disaster2.png" alt="" title="acroread_disaster2" class="alignright size-full wp-image-377" /></p>
<p>I had recently upgraded to acroread and noticed that the UI was all spiffed up.  And I noticed that this ebook had the right metadata for the bookmarks.  I thought to myself, &#8220;Wouldn&#8217;t it be nice if acroread supported printing a <strong>chapter</strong>?&#8221;  I right-clicked on the first entry in the chapter bookmark and was astonished.  Lo and behold, my feature existed!  (See the image to the right.)  I clicked the &#8220;Print Pages&#8230;&#8221; button with a bit of discomfort.  I don&#8217;t trust software too often, and am always suspicious when I find a feature I didn&#8217;t expect to be there.  It&#8217;s like my inner programmer is saying, &#8220;Yea, right &#8212; too good to be true.&#8221;</p>
<p>A few minutes later, my chapter was printed.  I looked it over, and brought it with my other materials to the local print shop.  One hour later, I picked up my copies and brought them home to look them over.</p>
<p>I noticed something very strange.  Instead of my copies containing pages 42-57, they contained pages 42, 43, 46, 51, 55, and 57.  <i>Damn it</i>.  There didn&#8217;t seem to be much of a rhyme or reason to the pages that were selected.  What kind of sequence was this?  I felt that there <i>must</i> be some pattern, some fibonacci-like, non-obvious sequence that applied to these pages.  I suspected the first, and obvious, culprit: that the printer had made a mistake.  <i>Maybe it&#8217;s a human error</i>.  But then I looked over my original and indeed, the original only had those pages.  Not a human error.  I thought to myself, &#8220;How is this possible?&#8221;</p>
<p><img src="http://www.pixelmonkey.org/wordpress/wp-content/uploads/2009/02/butterfly-150x150.jpg" alt="" title="butterfly" width="150" height="150" class="alignright size-thumbnail wp-image-380" /></p>
<p>Of course, I&#8217;ve probably given you enough information that you&#8217;ve already figured it out.  Especially if you&#8217;re a programmer.  We&#8217;re just wired to think this way.  But in case you haven&#8217;t figured it out, I&#8217;ll indulge you.</p>
<p>When I went back into acroread, tracing back my steps, I noticed something about that menu item I clicked.  It didn&#8217;t say <i>Print chapter</i>.  Instead, it said, <i>Print pages</i>.  Now, conceptually that seems like a small distinction, but I picked up on it.</p>
<p>I started to think like a programmer, rather than a user.  This function with a for loop emerged from the program and hovered above it, almost magically.  It said:</p>

<div class="wp_syntax"><div class="code"><pre class="python" style="font-family:monospace;"><span style="color: #ff7700;font-weight:bold;">def</span> print_pages<span style="color: black;">&#40;</span><span style="color: #008000;">self</span>, selected<span style="color: black;">&#41;</span>:
    to_print = <span style="color: black;">&#91;</span><span style="color: black;">&#93;</span>
    <span style="color: #ff7700;font-weight:bold;">for</span> bookmark <span style="color: #ff7700;font-weight:bold;">in</span> selected.<span style="color: black;">self_and_bookmarked_children</span><span style="color: black;">&#40;</span><span style="color: black;">&#41;</span>:
        to_print.<span style="color: black;">append</span><span style="color: black;">&#40;</span>bookmark.<span style="color: black;">page</span><span style="color: black;">&#40;</span><span style="color: black;">&#41;</span><span style="color: black;">&#41;</span>
    PrintSubsystem.<span style="color: black;">queue_job</span><span style="color: black;">&#40;</span>to_print<span style="color: black;">&#41;</span></pre></div></div>

<p>Then I realized the pattern in the pages it picked.  There was no pattern.  This was a beautiful little bug.  A <i>butterfly</i>.</p>
<p>You see, within the narrow world of this <i>Print Pages</i> function, the &#8220;feature&#8221; works as expected.  But from a user&#8217;s perspective, it makes absolutely no sense.  Rather than printing everything from that bookmark to the next bookmark at the same level (that is, rather than printing a <i>chapter</i>), it printed each <i>individual page that happened to be physically bookmarked (or &#8216;sub-bookmarked&#8217;) in the PDF, at or below that level</i>.  This resulted in a bunch of pages being printed that happened to be the pages on which subsections began.  But this left out most of the chapter, somewhat randomly.</p>
<p>The worst traits of our profession come out when it is at its least social.  I have no doubt that this function that prints these pages was written by a single programmer in a windowless room, without any peer review, pair programming, or other check on his logic.  I am sure that he was given the narrow and ill-defined requirement to enable an action to &#8220;print bookmark pages&#8221;.  He needed to <i>think</i>, but instead, he decided to code.  And coding got &#8220;it&#8221; done, for some very weird value of &#8220;it&#8221;.  He was probably under time pressure.  But one thing is certain to me: he was alone.  No two programmers, debating the design and implementation of this feature, would let each other make this mistake.</p>
<p>The behavior it exhibited truly caught me by surprise.  Strange as it sounds, I admired how easily I had been duped by this feature.  The human error &#8212; the anti-social error &#8212; made by that programmer exhibited an odd and enigmatic computer behavior.  A human inelegance created a strange sort of cruel machine elegance.</p>
<p>I found it ironic that in trying to print a chapter about beautiful design from a book called <i>Beautiful Code</i>, I came across this beautiful bug.  I call the bug beautiful because it managed to fool me, to get me to suffer its wrath while thinking I was getting some convenience.  It exhibited behavior that challenged me to identify a pattern, where there was none.  It was so clever, it even cost me money (the printing charges).  And even though I was a discerning programmer &#8212; skeptical of the feature, and so unsure of the software&#8217;s operation that I checked the output, albeit too briefly &#8212; this little bug managed to outsmart me.</p>
<p>My students will have to live without the chapter, or read it online on their own.  I&#8217;m not upset about it.  There can be beauty, even in failure.</p>
<p><small><strong><a name="note-on-copyright">A note about copyright:</a></strong> some readers on reddit and on my comments section suggested that I might be ignoring copyright issues by thinking that I could just photocopy a chapter from this book to distribute to my students.  Trust me, I know about copyright.  The content of this chapter happens to be available <a href="http://www.red-bean.com/kfogel/beautiful-code/bc-chapter-02.html">online for free</a> under <a href="http://creativecommons.org/licenses/by/3.0/">Creative Commons Attribution 3.0</a>.  Karl Fogel, the author of the article, has even given his informal blessing in my comments section.  And finally, by most people&#8217;s interpretation of the rules of Fair Use, it was OK for me to copy a chapter for my classroom.  I&#8217;m surprised no one suggested that this bug might be beautiful in another way: that it saved me from a copyright disaster.  I don&#8217;t think it was <i>that</i> good&#8230; <img src='http://www.pixelmonkey.org/wordpress/wp-includes/images/smilies/icon_smile.gif' alt=':-)' class='wp-smiley' />   If you are really interested in seeing a debate about this, you can read <a href="http://www.reddit.com/r/programming/comments/814ku/beautiful_code_and_a_beautiful_bug/c07z97y">this thread on reddit</a>.  Warning, somewhat painful and longwinded.  (Also, if you clicked the anchor link within the article to get to this note, simply click &#8220;back&#8221; in your browser to return and continue reading.)</small></p>
]]></content:encoded>
			<wfw:commentRss>http://www.pixelmonkey.org/2009/02/28/beautiful-code-and-a-beautiful-bug/feed</wfw:commentRss>
		<slash:comments>11</slash:comments>
		</item>
		<item>
		<title>A New Yorker&#8217;s Take on San Francisco</title>
		<link>http://www.pixelmonkey.org/2007/08/07/san-francisco-trip?utm_source=rss&#038;utm_medium=rss&#038;utm_campaign=san-francisco-trip</link>
		<comments>http://www.pixelmonkey.org/2007/08/07/san-francisco-trip#comments</comments>
		<pubDate>Wed, 08 Aug 2007 03:38:48 +0000</pubDate>
		<dc:creator>pixelmonkey</dc:creator>
				<category><![CDATA[Personal]]></category>
		<category><![CDATA[Programming]]></category>
		<category><![CDATA[Technology]]></category>

		<guid isPermaLink="false">http://www.pixelmonkey.org/2007/08/07/san-francisco-trip/</guid>
		<description><![CDATA[I just got back from San Francisco. This wasn&#8217;t my first time to the west coast, but it was my first time to Northern California. Overall, I had an amazing time. This trip emerged as a major convenience for me. My brother was heading out to California for the Real Estate Connect conference, since his [...]]]></description>
			<content:encoded><![CDATA[<p>I just got back from San Francisco.  This wasn&#8217;t my first time to the west coast, but it was my first time to Northern California.  Overall, I had an amazing time.<br />
<span id="more-359"></span></p>
<p>This trip emerged as a major convenience for me.  My brother was heading out to California for the <a href="http://www.realestateconnect.com/">Real Estate Connect</a> conference, since his company is intimately involved with Real Estate technologies.  But he didn&#8217;t want to go alone, so he paid for my plane ticket and hotel stay the first few nights to convince me to come out.  (Thanks, Alex!)</p>
<p>I got in touch with some people I knew out there, but many of them weren&#8217;t going to be around during my stay, due to summer vacations, etc.</p>
<p>Joseph Sofaer, a friend of mine from NYU, was gracious enough to delay a trip to Europe to show me around the area.  I was even lucky enough that the first first day I was there, he invited me to a party at the Facebook headquarters in Palo Alto, CA, where I briefly met Mark Zuckerberg, saw Robert Scoble walking around, and met about twenty other software developers in a room of 300, who worked for companies like Yahoo, Pandora, del.icio.us, and, of course, Facebook itself.</p>
<p>The train ride home, I was riding with the <a href="http://www.milliondollarhomepage.com/faq.php#2">creator</a> of the <a href="http://www.milliondollarhomepage.com/">MillionDollarHomepage</a>, probably the best website idea of all time.</p>
<p><strong>Palo Alto and Software is Sexy<br />
</strong> &#8212;<br />
The vibe in Palo Alto was enviable, especially for a native New Yorker.  When I pull out my laptop on the train or in a cafe in NY, screens full of code or running with full-screen vterms, I get stares and strange looks.  (Including right now, as I write this blog post on the LIRR&#8230;)  In Palo Alto, my brother and I walked by two or three cafes, and in each I saw young guys and gals at their laptops, coding away, screens full of GNU make output scroling by, emacs and vim buffers splitting off.  I overheard conversation snippets like, &#8220;we&#8217;re hoping to release our next version in a couple weeks&#8221;, &#8220;you have got to try metaclass programming with Python&#8221;, and &#8220;did you see that article on /.?&#8221;</p>
<p>In New York, people aren&#8217;t that proud to be a geek.  You go to a typical gathering and say, &#8220;I&#8217;m a software developer&#8221; and the typical response is, &#8220;Oh&#8230;&#8221;, followed by silence, followed by, &#8220;I think I need another drink&#8230;&#8221;.  Sexy in New York, programming isn&#8217;t.  If you want sex appeal, go into finance, law, or politics.</p>
<p>Opposite in Palo Alto, of course.  Which makes you feel great as a software developer.  What are you into?  If you answer, &#8220;Stocks, bonds, and the market&#8221; you&#8217;ll get the treatment I described above.  You answer, &#8220;Ruby on Rails&#8221; and you&#8217;ll be having a 2-hour, heated conversation.</p>
<p>BTW, the Silicon Valley excitement about Ruby on Rails is palpable.  Everyone wants a Rails developer.</p>
<p>A quick anecdote to illustrate the NY disdain for geeks: I was out with a friend once who had attend culinary school and was trying her way up the restaurant ladder, to become a chef.  She complained, however, that the money in these entry level jobs (food preparer, etc.) in the kitchen was way too little, that it was difficult to get by.  So, someone suggested, &#8220;Why don&#8217;t you waitress on the side?&#8221;</p>
<p>Her response, &#8220;Waitress?  I&#8217;m trying to become a chef.  That&#8217;s like saying to someone who wants to run a company, &#8216;Why don&#8217;t you work as an IT guy?&#8217;&#8221;</p>
<p>Something tells me that joke wouldn&#8217;t work that well in Palo Alto.</p>
<p><strong>San Francisco and Good Coffee<br />
</strong> &#8212;<br />
It was great to be able to get a little sense of the Silicon Valley vibe on my first day in Northern California.  But by the end of the day, my head was spinning.  I was ready to head back to an environment that was less technobubble, something a bit more real.</p>
<p>My second day there, I walked around some neighborhoods on my own, particularly Union Square (which is a bit of a tourist center), the Mission (which reminds me of Astoria, but with a different set of ethnic groups), and Noe Valley (which reminds me of the Upper East Side, but with houses instead of apartment buildings).</p>
<p>In the Mission, I ended up stopping by a coffee place named <a href="http://www.philzcoffee.com/">Philz</a>.  I asked for an iced coffee.  I then watched as the barrista (who I think was <a href="http://www.philzcoffee.com/philcoffee.html">Phil</a>!) took a scoop of coffee beans, ground them in a grinder, put them in a coffee machine, and made a fresh cup of coffee.  Some ice went in with frothed milk atop it.  I kid you not, the <strong><em>BEST</em></strong> iced coffee I have ever had.</p>
<p>Later in the day, when I met up with Joey at his apartment, I mentioned that I had just stumbled upon the best iced coffee of my life a couple hours ago.  And he said, &#8220;Oh, man&#8230; if you want good coffee, you have to try this place Philz.&#8221;</p>
<p>I laughed and said &#8220;THAT&#8217;s exactly where I was!&#8221; and he responded, &#8220;Man, you had &#8216;just stumbled upon&#8217; possibly the best coffee in the world.&#8221;  So that was a bit of good luck.  We ended up going back to Philz later that day <img src='http://www.pixelmonkey.org/wordpress/wp-includes/images/smilies/icon_wink.gif' alt=';-)' class='wp-smiley' /> </p>
<p>Joey had to leave the next day for Europe, but we spent the rest of the afternoon chatting about software ideas, in particular details about his latest idea, a Blackboard replacement application hosted on the Facebook Platform.  If you&#8217;re on the Facebook, check out the application called &#8220;Courses&#8221;.  It&#8217;s quite cool, even if it is in the early stages.</p>
<p><strong>The Weekend</strong><br />
&#8212;<br />
My brother&#8217;s real estate conference was winding down, so he snuck me in so I could catch the last couple presenters.  Unfortunately, I had missed the presentation by Craig Newmark (of craiglist fame), which was apparently pretty good.  Instead, I caught a panel by some head honchos of real estate technology at Google, Yahoo, Microsoft and Realtor.com.This panel was mighty uninteresting.  Despite the fact that these guys were all supposed to be team leads and head-techies-in-charge, they all gave tired lines and made me question whether they actually knew what they were talking about.</p>
<p>Nonetheless, it was interesting to see a conference of this kind &#8212; lots of buzz, lots of software developers all gathered together, a lot of excitement about an emerging market.</p>
<p>That afternoon, we took a bus tour of San Francisco, which was well worth it due to the hilarious tour guide named &#8220;Silvio.&#8221;</p>
<p>We spent that night at a Vietnamese Restaurant named &#8220;<a href="http://www.lecolonialsf.com/index_flash.html">La Colonial</a>&#8220;.  Excellent.</p>
<p>Saturday morning, we walked around the city, starting out in Union Square, moving through to Civic Center.  We stopped at the <a href="http://www.asianart.org/">Asian Art Museum</a>, where I saw an exhibit on <a href="http://www.marvelofmanga.org/">Manga</a> and <a href="http://www.asianart.org/yoshitoshi.htm">Japanese Wood Block art</a>, both very good, among others.  Finally, we ended up in the Lower Haight and Haight Ashbury, where we spent the afternoon lounging and exploring.</p>
<p>At night, we headed to North Beach and <a href="http://www.stepsofrome.com/">ate dinner</a> there.  We ended the night at the bar at the top of the Sir Francis Drake hotel, which my brother said reminded him a bit of Windows on the World, when that was still around.</p>
<p><strong>Conclusion</strong><br />
&#8212;</p>
<p>For a short trip, I got to see a good chunk of the city, and even got to take that important visit outside the city.  Overall, I had a great time.</p>
<p>As a technologist based out of New York, I have to say that San Francisco is quite appealing.  The weather, the laid back attitude, the independent shops, cafes and restaurants, the technology buzz.  But moving there would certainly seem like selling out.  Sure, we may not be able to <a href="http://www.paulgraham.com/siliconvalley.html">reproduce Silicon Valley</a> but we can <a href="http://en.wikipedia.org/wiki/Silicon_Alley">do our own thing</a>.  New York is too strong a city to be left in the hands of financiers and lawyers.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.pixelmonkey.org/2007/08/07/san-francisco-trip/feed</wfw:commentRss>
		<slash:comments>2</slash:comments>
		</item>
		<item>
		<title>An Empty Calendar, a Dusty Blog</title>
		<link>http://www.pixelmonkey.org/2007/07/08/an-empty-calendar-a-dusty-blog?utm_source=rss&#038;utm_medium=rss&#038;utm_campaign=an-empty-calendar-a-dusty-blog</link>
		<comments>http://www.pixelmonkey.org/2007/07/08/an-empty-calendar-a-dusty-blog#comments</comments>
		<pubDate>Sun, 08 Jul 2007 19:52:25 +0000</pubDate>
		<dc:creator>pixelmonkey</dc:creator>
				<category><![CDATA[Personal]]></category>
		<category><![CDATA[Politics]]></category>
		<category><![CDATA[Technology]]></category>

		<guid isPermaLink="false">http://www.pixelmonkey.org/2007/07/08/an-empty-calendar-a-dusty-blog/</guid>
		<description><![CDATA[I took a look at my WordPress calendar, and realized I haven&#8217;t written a post in over a month. A sad state of affairs &#8212; I guess my blog waxes/wanes in and out of popularity for me. One thing I have wanted to do is to create a &#8220;schism&#8221; in my blog between the political [...]]]></description>
			<content:encoded><![CDATA[<p>I took a look at my WordPress calendar, and realized I haven&#8217;t written a post in over a month.  A sad state of affairs &#8212; I guess my blog waxes/wanes in and out of popularity for me.</p>
<p>One thing I have wanted to do is to create a &#8220;schism&#8221; in my blog between the political and technological sections.  I realize there is no sense forcing my audience to wade through technology posts to get to the political stuff they may be interested in, and vice versa.</p>
<p>The main thing stopping me from doing so is the fact that even as I have a single blog for these two topics, I hardly find the time to post to either of them.  That isn&#8217;t to say I don&#8217;t have much to say.  I&#8217;ve been reading quite a bit lately about Lisp (for the first time in my life), and have interesting ideas surrounding my use of <a href="http://www.eclipse.org">Eclipse</a> technologies and modeling tools at work.  I have been following a lot on the political side of things, from Libby&#8217;s commuted sentence to debates over globalization, to WSJ&#8217;s potential new owner.  And I&#8217;ve finished a slew of books, from John Kenneth Galbraith&#8217;s <em>The Affluent Society</em> to Jared Diamond&#8217;s <em>Guns, Germs and Steel</em>.</p>
<p>But I just lack the time to write.  I&#8217;m busy at work (at least 10-12 hours a day, when you include commute time), and the last thing I want to do when I get home is use computers some more.  Which is sad, but an inevitable result of my situation.</p>
<p>I truly do not want this blog to die.  How might I save it?</p>
]]></content:encoded>
			<wfw:commentRss>http://www.pixelmonkey.org/2007/07/08/an-empty-calendar-a-dusty-blog/feed</wfw:commentRss>
		<slash:comments>4</slash:comments>
		</item>
		<item>
		<title>Dilbertization of IT</title>
		<link>http://www.pixelmonkey.org/2007/03/19/dilbertization-of-it?utm_source=rss&#038;utm_medium=rss&#038;utm_campaign=dilbertization-of-it</link>
		<comments>http://www.pixelmonkey.org/2007/03/19/dilbertization-of-it#comments</comments>
		<pubDate>Mon, 19 Mar 2007 18:14:18 +0000</pubDate>
		<dc:creator>pixelmonkey</dc:creator>
				<category><![CDATA[Programming]]></category>
		<category><![CDATA[Technology]]></category>

		<guid isPermaLink="false">http://www.pixelmonkey.org/2007/03/19/dilbertization-of-it/</guid>
		<description><![CDATA[There is an article on eWeek I encountered via del.icio.us called &#8220;The Dilbertization of IT.&#8221; Though it says a lot of stuff most IT workers already know (that in many places, the &#8220;creative&#8221; work is being de-emphasized while &#8220;firefighting&#8221; or &#8220;maintainence&#8221; is emphasized), the more important thing to point out is the cause of this [...]]]></description>
			<content:encoded><![CDATA[<p>There is an article on eWeek I encountered via del.icio.us called &#8220;<a href="http://www.eweek.com/article2/0,1895,2104997,00.asp">The Dilbertization of IT</a>.&#8221;  Though it says a lot of stuff most IT workers already know (that in many places, the &#8220;creative&#8221; work is being de-emphasized while &#8220;firefighting&#8221; or &#8220;maintainence&#8221; is emphasized), the more important thing to point out is the cause of this Dilbertization.  I found an insightful <a href="http://www.eweek.com/talkback_details/0,1932,s=26767&#038;a=203343,00.asp?m=22328">comment</a> which points to some of them.</p>
<blockquote><p>Dilbert&#8217;s pointy-headed managers are everywhere. In my current Fortune 100 company, virtually none of the managers with any authority have ANY IT development background. They manage entirely by cost and project plan &#8211; ignoring any and all input from those developers who actually have a successful track record.</p></blockquote>
<p>I can&#8217;t say this is true in my team, at my company, but I have certainly heard it from a lot of my IT friends.  Also, I have an acquaintence who is an IT Project Manager who thinks that development is &#8220;easy work&#8221; and that most software developers are just &#8220;lazy&#8221;, which is why projects end up behind schedule.  I think many <a href="http://innumeracy.com/">innumerate</a> IT managers share this opinion, and this can lead to problems, low morale, and resentment.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.pixelmonkey.org/2007/03/19/dilbertization-of-it/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Nat&#8217;s Pendulum</title>
		<link>http://www.pixelmonkey.org/2007/03/18/nats-pendulum?utm_source=rss&#038;utm_medium=rss&#038;utm_campaign=nats-pendulum</link>
		<comments>http://www.pixelmonkey.org/2007/03/18/nats-pendulum#comments</comments>
		<pubDate>Sun, 18 Mar 2007 19:24:57 +0000</pubDate>
		<dc:creator>pixelmonkey</dc:creator>
				<category><![CDATA[GNOME]]></category>
		<category><![CDATA[Open Source]]></category>
		<category><![CDATA[Programming]]></category>
		<category><![CDATA[Technology]]></category>

		<guid isPermaLink="false">http://www.pixelmonkey.org/2007/03/18/nats-pendulum/</guid>
		<description><![CDATA[Metacity (the window manager for GNOME) has this annoying and ugly minimize animation that looks like a bunch of cascading rectangles flying at your taskbar. I&#8217;ve always hated it, but dealt with it for awhile. Today, I did some digging on the Metacity bugzilla to see if it was fixed, and found this bug. Over [...]]]></description>
			<content:encoded><![CDATA[<p>Metacity (the window manager for GNOME) has this annoying and ugly minimize animation that looks like a bunch of cascading rectangles flying at your taskbar.  I&#8217;ve always hated it, but dealt with it for awhile.</p>
<p>Today, I did some digging on the Metacity bugzilla to see if it was fixed, and found <a href="http://bugzilla.gnome.org/show_bug.cgi?id=95777">this bug</a>.</p>
<p>Over the course of 3.5 years, this bug has sat on the bugzilla, and still isn&#8217;t satisfactorily resolved.  There is now a reduced_resources flag in gconf, but this flag only disables the minimize animation at the expense of forcing you to use an ugly wireframe window dragging animation.  (Complete, utter insanity.)</p>
<p><span id="more-349"></span></p>
<p>I don&#8217;t understand how after two years of debate, and nearly 3.5 years down th road from when this bug was first opened, the final fix was something that throws the baby out with the bathwater.</p>
<p>I don&#8217;t want the minimize animation, but I don&#8217;t want wireframe windows, either.  Why can I only opt out of them as a couple?</p>
<p>Havoc, you asked for rationale and not rant, and lloyd had provided it:</p>
<blockquote><p>the window minimization animation&#8217;s sole purpose is to indicate to an absolute GUI neophyte &#8220;where the window goes&#8221; when it&#8217;s minimized.  for a huge number of users &#8211; basically anyone who&#8217;s ever used a GUI with a taskbar before, which is in excess of 98% of current desktop computer users &#8211; they are never useful because they already know this.</p>
<p>for the remainder, window animations are useful exactly once in their lifetimes &#8211; the first time they minimize a window and wonder where their application window &#8220;went&#8221;.</p>
<p>thereafter, window animations are a distracting waste of time, and to me and many others, an annoyance.  it&#8217;s roughly equivalent to never being able to turn off Clippy.</p></blockquote>
<p>I wholeheartedly agree with this analysis.  Minimize animations are useful to newbies, not useful to anyone else.</p>
<p>The lack of an ability to disable this animation (<em>alone</em>, not in a catch-all flag that enables wireframe drawing, for crying out loud!) is completely absurd.  On my Core Duo 1.6 Ghz machine running an Nvidia graphics card, this animation still feels slow and clunky, and is completely superfluous.</p>
<p>In the future, maybe we&#8217;ll be able to use compiz and get nice fade in and fade out that works smoothly and nicely.  Even then, I&#8217;ll still want to be able to disable it, because <em>it serves no purpose for me, and isn&#8217;t central to metacity&#8217;s operation</em>.</p>
<p>In the GNOME community, we&#8217;ve heard mention of &#8220;Nat&#8217;s Pendulum&#8221;, referring to Nat Friedman&#8217;s insistence that the GNOME &#8220;usability pendulum&#8221; has swung too far in the other direction.  The 3.5 years spent blocking on the inclusion of this simple gconf flag, was, I think, a perfect illustration of what Nat meant.  The fact that the flag still isn&#8217;t there in the form suggested may mean that the damage may just be permanent in this community surrounding metacity development.</p>
<p>Why must gconf be &#8220;usable&#8221; too?  Don&#8217;t give me a <em>reduced_resources</em> catch-all flag, but give me separate flags to enable/disable certain animations/effects. Is this really such a usability disaster, or are you just being a Metacity Nazi:&#8221;no fine-grained configuration for you!&#8221;</p>
<p>As Jeff Waugh has mentioned, religious usability insistence like that expressed in this thread was enough to send many would-be GNOME users and contributors packing for projects like KDE, XFCE, or even to proprietary platforms like OS X.  The damage is deep and felt.  I lost a lot of faith in GNOME personally because of these issues, and am only slowly regaining it.</p>
<p>Has anyone already written a patch which removes the <em>reduced_resources</em> flag and adds this fine-grained control of the minimize and wireframe animations?  If not, I&#8217;ll write it and attach it to this issue.</p>
<p>I will <em>not</em> open a new bugzilla bug for this, because I think history is important so that we learn from our past mistakes.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.pixelmonkey.org/2007/03/18/nats-pendulum/feed</wfw:commentRss>
		<slash:comments>3</slash:comments>
		</item>
		<item>
		<title>HOWTO: Get microphone, headphone, automute and sound properly working on an HP DV2000 laptop in Linux</title>
		<link>http://www.pixelmonkey.org/2007/03/18/dv2000-alsa-patches?utm_source=rss&#038;utm_medium=rss&#038;utm_campaign=dv2000-alsa-patches</link>
		<comments>http://www.pixelmonkey.org/2007/03/18/dv2000-alsa-patches#comments</comments>
		<pubDate>Sun, 18 Mar 2007 16:51:20 +0000</pubDate>
		<dc:creator>pixelmonkey</dc:creator>
				<category><![CDATA[Open Source]]></category>
		<category><![CDATA[Technology]]></category>

		<guid isPermaLink="false">http://www.pixelmonkey.org/2007/03/18/howto-get-microphone-headphone-automute-and-sound-properly-working-on-an-hp-dv2000-laptop-in-linux/</guid>
		<description><![CDATA[Note: This entry is now wildly out of date.  Try these instructions at your own risk.  If I get a few moments, I will revise these instructions in the future.  I&#8217;ve been in contact with an ALSA hacker, Tobin Davis, over a series of patches that provide support for the sound chipset (intel-hda) that is [...]]]></description>
			<content:encoded><![CDATA[<p><strong>Note: This entry is now wildly out of date.  Try these instructions at your own risk.  If I get a few moments, I will revise these instructions in the future. </strong></p>
<p>I&#8217;ve been in contact with an ALSA hacker, Tobin Davis, over a series of patches that provide support for the sound chipset (intel-hda) that is part of the HP DV2000 laptop.</p>
<p>His patches over ALSA 1.0.14rc3 enable the following new features:</p>
<ul>
<li>The headphone port now works, and the speakers automute when the headphones are plugged in.</li>
<li>The microphone port now works, with great sound quality.</li>
<li>The built-in mic on the monitor now works, though obviously with worse sound quality due to ambient noise.</li>
</ul>
<p>The new patches aren&#8217;t perfect.  I&#8217;m noticing some sound quality issues at high volumes, and in order to get it to work Tobin had to essentially enable two PCM channels (PCM and PCM-2), which have a very strange behavior.  The first one controls the volume directly from the sound system.  The second one controls the volume only between the sound system and the speakers (and thus, will have no effect on the sound when the headphones are plugged in).  The master volume control effectively modulates both of these.  Tobin has told me that the chipset produced by Conexant is particularly weird, which is why he had to this.  I find that it&#8217;s not so bad, as long as I keep a launcher to gnome-volume-control set up so that I can control it, knowing these rules.</p>
<p>That said, it&#8217;s a huge improvement over out of the box sound support for Ubuntu (which is ALSA 1.0.11).  Inside this post you&#8217;ll find further instructions, which are adapted from a text document Tobin sent his tester group via e-mail.  These are step by step instructions to set up 1.0.14rc3 ALSA drivers plus Tobin&#8217;s latest patch.</p>
<p><span id="more-348"></span></p>
<p><strong>1. Backup your current drivers</strong></p>
<blockquote>
<pre>tar -zcvf original-drivers.tgz /lib/modules/`uname -r`/kernel/sound</pre>
</blockquote>
<p><strong>2. Next, get the latest release and bring it current.</strong></p>
<blockquote>
<pre>wget ftp://ftp.alsa-project.org/pub/driver/alsa-driver-1.0.14rc3.tar.bz2</pre>
<pre>wget http://members.dsl-only.net/~tdavis/alsa-patches/conexant-latest-rc3.patch</pre>
<pre>tar -jxf alsa-driver-1.0.14rc3.tar.bz2</pre>
<pre>cd alsa-driver-1.0.14rc3/alsa-kernel</pre>
<pre>patch -p1 < ../../conexant-latest-rc3.patch</pre>
</pre>
<pre>cd ../../</pre>
</blockquote>
<p><strong>3. Build the code.</strong></p>
<blockquote>
<pre>cd alsa-driver-1.0.14rc3</pre>
<pre>./configure --with-debug=detect --with-cards=hda-intel</pre>
<pre>make</pre>
<pre>sudo make install</pre>
<pre>sudo depmod -a</pre>
<pre>sudo dmesg -c >/dev/null</pre>
</blockquote>
<p><strong>4. Stop all audio applications and remove all audio drivers</strong></p>
<p>On my system, the following works:</p>
<blockquote>
<pre>modprobe -r snd-usb-audio</pre>
<pre>modprobe -r snd-hda-intel snd-hda-codec snd-pcm-oss snd-mixer-oss snd-pcm snd-timer snd snd-page-alloc</pre>
</blockquote>
<p><strong>5. Reload the new driver</strong></p>
<p>Simply run modprobe snd-hda-intel, look at the dmesg output and test it out.</p>
<p>Using alsamixer will show you all available channels.  In gnome-volume-control, you can also enable additional channels with Edit->Preferences.  You&#8217;ll need at least Master, PCM, and PCM-2 enabled to get proper volume working on the headphones and speakers.  You&#8217;ll need Capture enabled in the Capture tab to get mic input working.</p>
<p>If nothing works, or one function doesn&#8217;t work, try reloading the driver with &#8220;model=test&#8221; as a parameter.  On Ubuntu, this can be done by doing sudo vim /etc/modprobe.d/alsa-base and adding a line to the end that says This should enable everything.</p>
<p>If you have issues, you can try to contact Tobin Davis or other hackers at the ALSA team.  Or you could even post a comment here and I&#8217;ll pass it along.  Please include the system make/model, the subsystem line from &#8220;lspci -s 0:1b -vn&#8221; (Ex: Subsystem: 103c:30b2), the dmesg output from above, and the output from &#8220;cat /proc/asound/card0/codec#0&#8243;.</p>
<p><strong><em>Update</em></strong>: Modified instructions based on Henrique&#8217;s input below.  (Patchlevel argument for patch command was incorrect.)</p>
]]></content:encoded>
			<wfw:commentRss>http://www.pixelmonkey.org/2007/03/18/dv2000-alsa-patches/feed</wfw:commentRss>
		<slash:comments>29</slash:comments>
		</item>
	</channel>
</rss>

<!-- Performance optimized by W3 Total Cache. Learn more: http://www.w3-edge.com/wordpress-plugins/

Minified using memcached
Page Caching using memcached
Database Caching 1/120 queries in 0.090 seconds using memcached
Object Caching 1564/1824 objects using memcached

Served from: _ @ 2012-02-05 01:35:24 -->
