<?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; Open Source</title>
	<atom:link href="http://www.pixelmonkey.org/category/technology/open-source/feed" rel="self" type="application/rss+xml" />
	<link>http://www.pixelmonkey.org</link>
	<description>Andrew J. Montalenti's Blog</description>
	<lastBuildDate>Sun, 05 Feb 2012 19:10:33 +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>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>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>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>2</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>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>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>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>
		<item>
		<title>&#8220;This isn&#8217;t elitist, this is egalitarian.&#8221;</title>
		<link>http://www.pixelmonkey.org/2007/03/18/this-isnt-elitist-this-is-egalitarian?utm_source=rss&#038;utm_medium=rss&#038;utm_campaign=this-isnt-elitist-this-is-egalitarian</link>
		<comments>http://www.pixelmonkey.org/2007/03/18/this-isnt-elitist-this-is-egalitarian#comments</comments>
		<pubDate>Sun, 18 Mar 2007 15:43:00 +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/this-isnt-elitist-this-is-egalitarian/</guid>
		<description><![CDATA[A surprisingly articulate post on OSNews about Free Software: Asking me to get off my a$$ and code drivers for this baby is what I consider elitist and a very unreasonable demand on the end user. It&#8217;s one thing that gives GNU/Linux zealots a very bad name in the real world. I have sneaking suspicion [...]]]></description>
			<content:encoded><![CDATA[<p>A <a href="http://osnews.com/read_thread.php?news_id=17505&#038;comment_id=222131">surprisingly articulate post</a> on OSNews about Free Software:</p>
<blockquote><p><em>Asking me to get off my a$$ and code drivers for this baby is what I consider elitist and a very unreasonable demand on the end user. It&#8217;s one thing that gives GNU/Linux zealots a very bad name in the real world.</em></p>
<p>I have sneaking suspicion that you get this response from the Linux community because we feel you&#8217;re placing unreasonable demands on us. Your points are valid, but your energy is misdirected. Unfortunately for those who don&#8217;t like to code, that&#8217;s how software is created and improved. We invite you to participate in our projects in a variety of capacities including but not limited to programming, but of course participation is not required.</p>
<p>I think that Linux &#8220;zealots&#8221; get a bad name because much of the &#8220;real world&#8221; believes in a culture of entitlement. Look at everybody living life with a chip on their shoulder, blaming everyone else for their problems and scoffing at the notion that they take responsibility for their own situation. Somewhere along the line we stopped believing in opportunity as a means of realizing our dreams and began to foster the idea that we&#8217;re entitled to our expectations. In &#8220;Linux land,&#8221; we believe that the opportunity to participate in our information society is fundamental to our inherent desire as human beings to better our situation and control our own destiny.</p>
<p>Of course, money can make just about any dream come true. Mark Shuttleworth, for [example], invested $10 million to help make the Ubuntu project a reality. But years ago my great-grandmother told me the story of how my family came to America with nothing but the promise that here they would find a land of opportunity. This is the same promise we make with free software. This isn&#8217;t elitist, this is egalitarian.</p></blockquote>
<p>I have to say, this is part of what makes me love Free Software.  It&#8217;s this idea of widespread opportunity.  Sure, F/OSS has power structures and means of coercion/control built into certain parts of it, but for the most part, it&#8217;s based upon a very simple, powerful, and egalitarian idea.  &#8220;Anyone can improve this, anyone can make it better.&#8221;  It&#8217;s that kernel of an idea that makes any process &#8212; whether software production, <a href="http://www.socialtext.net/codev2/index.cgi">book editing</a>, <a href="http://www.socialtext.net/codev2/index.cgi">encyclopedia editing</a>, or even <a href="http://www.wired.com/news/business/0,1367,68144,00.html">beer brewing</a>, more enjoyable to those involved, and, as a side effect, better for the general public.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.pixelmonkey.org/2007/03/18/this-isnt-elitist-this-is-egalitarian/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Hilarious posts on Linux vs. Windows: satire or real thing?</title>
		<link>http://www.pixelmonkey.org/2007/03/16/hilarious-posts-on-linux-vs-windows-satire-or-real-thing?utm_source=rss&#038;utm_medium=rss&#038;utm_campaign=hilarious-posts-on-linux-vs-windows-satire-or-real-thing</link>
		<comments>http://www.pixelmonkey.org/2007/03/16/hilarious-posts-on-linux-vs-windows-satire-or-real-thing#comments</comments>
		<pubDate>Fri, 16 Mar 2007 16:09:57 +0000</pubDate>
		<dc:creator>pixelmonkey</dc:creator>
				<category><![CDATA[Microsoft]]></category>
		<category><![CDATA[Open Source]]></category>
		<category><![CDATA[Technology]]></category>

		<guid isPermaLink="false">http://www.pixelmonkey.org/2007/03/16/hilarious-posts-on-linux-vs-windows-satire-or-real-thing/</guid>
		<description><![CDATA[Take a look at these two posts from a ZDNet debate: A poster under the name &#8220;jerryleecooper&#8221; says, Vista is far more powerful than windows XP, and runs twice as fast. It is also much harder to pirate, and this point more than anything else has the Linux crowd in a panic. and, in a [...]]]></description>
			<content:encoded><![CDATA[<p>Take a look at these two posts from a ZDNet debate:</p>
<p>A poster under the name &#8220;jerryleecooper&#8221; <a href="http://talkback.zdnet.com/5208-12355-0.html?forumID=1&#038;threadID=31199&#038;messageID=579073&#038;start=44">says</a>,</p>
<blockquote><p>Vista is far more powerful than windows XP, and runs twice as fast. It is also much harder to pirate, and this point more than anything else has the Linux crowd in a panic.</p></blockquote>
<p>and, <a href="http://talkback.zdnet.com/5208-12355-0.html?forumID=1&#038;threadID=31199&#038;messageID=579806&#038;start=45">in a follow-up pos</a>t,</p>
<blockquote><p>Are you saying that this linux can run on a computer without windows underneath it, at all? As in, without a boot disk, without any drivers, and without any services?  That sounds preposterous to me.</p></blockquote>
<p>Is this serious, or satire?  If it&#8217;s serious, it&#8217;s absurd.  If it&#8217;s satire, it&#8217;s genius.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.pixelmonkey.org/2007/03/16/hilarious-posts-on-linux-vs-windows-satire-or-real-thing/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Catching up on the reading list</title>
		<link>http://www.pixelmonkey.org/2007/03/09/catching-up-on-the-reading-list?utm_source=rss&#038;utm_medium=rss&#038;utm_campaign=catching-up-on-the-reading-list</link>
		<comments>http://www.pixelmonkey.org/2007/03/09/catching-up-on-the-reading-list#comments</comments>
		<pubDate>Fri, 09 Mar 2007 23:41:07 +0000</pubDate>
		<dc:creator>pixelmonkey</dc:creator>
				<category><![CDATA[Books]]></category>
		<category><![CDATA[Corporate Power]]></category>
		<category><![CDATA[Economics]]></category>
		<category><![CDATA[Globalization]]></category>
		<category><![CDATA[Open Source]]></category>
		<category><![CDATA[Personal]]></category>
		<category><![CDATA[Politics]]></category>
		<category><![CDATA[Programming]]></category>
		<category><![CDATA[Technology]]></category>

		<guid isPermaLink="false">http://www.pixelmonkey.org/2007/03/09/catching-up-on-the-reading-list/</guid>
		<description><![CDATA[Lately, I&#8217;ve been very diligent about catching up on my reading. I have been perpetually delaying a review of Capitalism 3.0 and Dreaming in Code, both of whom deserve it. But I promise one soon. I use Hofstadter&#8217;s Rule of Thumb lately for estimating time: however long you think it&#8217;s gonna take, double it and [...]]]></description>
			<content:encoded><![CDATA[<p>Lately, I&#8217;ve been very diligent about catching up on my reading.</p>
<p>I have been perpetually delaying a review of <em>Capitalism 3.0</em> and <em>Dreaming in Code</em>, both of whom deserve it.  But I promise one soon.  I use Hofstadter&#8217;s Rule of Thumb lately for estimating time: however long you think it&#8217;s gonna take, double it and add a unit of time.  So if you think it&#8217;ll take two hours, it&#8217;ll really take four days.  If you think it&#8217;ll take five days, it&#8217;ll really take 10 weeks.  And so on.</p>
<p>In the meanwhile, I&#8217;ve been busy at work &#8212; actually working on some cool stuff from a technology standpoint, mainly in the realm of hacking with pieces of the <a href="http://www.eclipse.org/modeling/emf/?project=emf">Eclipse Modeling Framework</a>, and its related projects like GMF, RCP, Eclipse Core, etc.</p>
<p>On my commute, I&#8217;ve been enjoying reading <em>Making Globalization Work</em> by Stiglitz.  Although one of my friends mentioned to me that this book would be quite boring, and for the most part he was right.  Not the lofty stuff of Barnes in <em>Capitalism 3.0</em>; but perhaps Stiglitz&#8217;s recommendations are much more practical for ways to improve the current system.</p>
<p>The other book I started recently is a long, written interview with <a href="http://en.wikipedia.org/wiki/John_Kenneth_Galbraith">John Kenneth Galbraith</a> (much in the style of Socrates) which is entitled, <em>Almost Everyone&#8217;s Guide to Economics</em>.  What&#8217;s amazing is to see Galbraith, this towering (literally) Keynesian economic thinker, speaking in the 70s of the growth of corporate power, the undermining of labor, and the insidious nature of market fundamentalism.  And yet, here we are, 30 years later, heeding none of his warnings, and entering into the new &#8220;global age&#8221; of &#8220;The World is Flat&#8221;.</p>
<p>Oh yes indeed, I do need to write some reviews very soon.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.pixelmonkey.org/2007/03/09/catching-up-on-the-reading-list/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Finished Dreaming in Code</title>
		<link>http://www.pixelmonkey.org/2007/02/23/finished-dreaming-in-code?utm_source=rss&#038;utm_medium=rss&#038;utm_campaign=finished-dreaming-in-code</link>
		<comments>http://www.pixelmonkey.org/2007/02/23/finished-dreaming-in-code#comments</comments>
		<pubDate>Fri, 23 Feb 2007 14:54:48 +0000</pubDate>
		<dc:creator>pixelmonkey</dc:creator>
				<category><![CDATA[Books]]></category>
		<category><![CDATA[Corporate Power]]></category>
		<category><![CDATA[Globalization]]></category>
		<category><![CDATA[Open Source]]></category>
		<category><![CDATA[Personal]]></category>
		<category><![CDATA[Politics]]></category>
		<category><![CDATA[Programming]]></category>
		<category><![CDATA[Technology]]></category>

		<guid isPermaLink="false">http://www.pixelmonkey.org/2007/02/23/finished-dreaming-in-code/</guid>
		<description><![CDATA[Overall, Dreaming in Code was an interesting book. For programmers who already are obsessed with the classics of software engineering (Mythical Man-Month and friends), you probably won&#8217;t learn much new stuff in this book. However, the personal illustrations using OSAF did lead me to some self-evaluation of the work I do. It was also interesting [...]]]></description>
			<content:encoded><![CDATA[<p>Overall, <em>Dreaming in Code</em> was an interesting book.  For programmers who already are obsessed with the classics of software engineering (Mythical Man-Month and friends), you probably won&#8217;t learn much new stuff in this book.  However, the personal illustrations using OSAF did lead me to some self-evaluation of the work I do.  It was also interesting to see the internal workings of an organization which seems to be set up ideally for programmers &#8212; a good mission, an open source project, no real deadlines or users in the beginning, design-focused, etc. &#8212; and still see it run into the same issues traditional software shops run into.</p>
<p>I&#8217;d post a longer review, but I&#8217;m headed down to New Orleans today.  Will post a longer review when I get back, hopefully also of <em>Capitalism 3.0</em>, whose ideas have been swimming in my head the last few days of commute.  I think they really deserve to be summarized and presented here.</p>
<p>In the meanwhile, I&#8217;ve started reading <em>Making Globalization Work</em> by Joseph Stiglitz. This book, in particular, has been a kind of catharsis for most of my armchair ideas in economics, at least so far.  It&#8217;s a very strange feeling to read the ex-Chief Economist of the World Bank explaining his own ideas about overcoming the zealousness of &#8220;market fundamentalism&#8221; prevalent in economic circles, while I, who never studied economics formally, think, &#8220;Why would anyone trained in this discipline <em>actually believe</em> that markets are a magic force that work on their own?&#8221;  But I guess ideology always trumps rationality.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.pixelmonkey.org/2007/02/23/finished-dreaming-in-code/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Dell IdeaStorm</title>
		<link>http://www.pixelmonkey.org/2007/02/23/dell-ideastorm?utm_source=rss&#038;utm_medium=rss&#038;utm_campaign=dell-ideastorm</link>
		<comments>http://www.pixelmonkey.org/2007/02/23/dell-ideastorm#comments</comments>
		<pubDate>Fri, 23 Feb 2007 14:50:07 +0000</pubDate>
		<dc:creator>pixelmonkey</dc:creator>
				<category><![CDATA[Open Source]]></category>
		<category><![CDATA[Technology]]></category>

		<guid isPermaLink="false">http://www.pixelmonkey.org/2007/02/23/dell-ideastorm/</guid>
		<description><![CDATA[A friend from NYU, Luke Geldermans, pointed me to this website the other day. It&#8217;s really an amazing example of how much real demand there is for Linux on the desktop. The website provides a way for Dell customers to vote on the issues which are most important to them. The number 1 issue right [...]]]></description>
			<content:encoded><![CDATA[<p>A friend from NYU, Luke Geldermans, pointed me to this website the other day.  It&#8217;s really an amazing example of how much <em>real</em> demand there is for Linux on the desktop.</p>
<p>The website provides a way for Dell customers to vote on the issues which are most important to them.  The number 1 issue right now is making Linux available as an install option on their Dell PCs.  There are a slew of issues below that related to gaining driver support for Linux, and offering Windows with OOo and Firefox, and even offering OS-less computers to avoid the Microsoft tax.</p>
<p>It&#8217;d be interesting to see how this pans out, but in the meanwhile, go ahead and <a href="http://www.dellideastorm.com">contribute a vote</a>!</p>
]]></content:encoded>
			<wfw:commentRss>http://www.pixelmonkey.org/2007/02/23/dell-ideastorm/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Dreaming in Code</title>
		<link>http://www.pixelmonkey.org/2007/02/11/dreaming-in-code?utm_source=rss&#038;utm_medium=rss&#038;utm_campaign=dreaming-in-code</link>
		<comments>http://www.pixelmonkey.org/2007/02/11/dreaming-in-code#comments</comments>
		<pubDate>Sun, 11 Feb 2007 18:00:26 +0000</pubDate>
		<dc:creator>pixelmonkey</dc:creator>
				<category><![CDATA[Books]]></category>
		<category><![CDATA[Open Source]]></category>
		<category><![CDATA[Programming]]></category>
		<category><![CDATA[Technology]]></category>

		<guid isPermaLink="false">http://www.pixelmonkey.org/2007/02/11/dreaming-in-code/</guid>
		<description><![CDATA[I just picked up a copy of Dreaming in Code from Barnes &#038; Noble. Will probably devour it in the next couple of days.]]></description>
			<content:encoded><![CDATA[<p>I just picked up a copy of <a href="http://www.dreamingincode.com/">Dreaming in Code</a> from Barnes &#038; Noble.  Will probably devour it in the next couple of days.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.pixelmonkey.org/2007/02/11/dreaming-in-code/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Open Source Talks at Google, and VIM creator</title>
		<link>http://www.pixelmonkey.org/2007/02/07/open-source-talks-at-google-and-vim-creator?utm_source=rss&#038;utm_medium=rss&#038;utm_campaign=open-source-talks-at-google-and-vim-creator</link>
		<comments>http://www.pixelmonkey.org/2007/02/07/open-source-talks-at-google-and-vim-creator#comments</comments>
		<pubDate>Wed, 07 Feb 2007 18:03:37 +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/2007/02/07/open-source-talks-at-google-and-vim-creator/</guid>
		<description><![CDATA[Google has an interesting talk about &#8220;How Open Source Projects Survive Poisonous People&#8221; at Google Video. On February 13, they&#8217;re going to have the creator of VIM, Bram Moolenaar, giving a talk on VIM7.  What&#8217;s funny is that Bram, who has been working full-time on VIM for the past few years (living entirely on donations [...]]]></description>
			<content:encoded><![CDATA[<p>Google has an interesting talk about <a href="http://video.google.com/videoplay?docid=-4216011961522818645">&#8220;How Open Source Projects Survive Poisonous People&#8221;</a> at Google Video.</p>
<p>On February 13, they&#8217;re going to have the creator of <a href="http://www.vim.org">VIM</a>, Bram Moolenaar, giving a talk on VIM7.  What&#8217;s funny is that Bram, who has been working full-time on VIM for the past few years (living entirely on donations and money votes for VIM features) has now been hired by Google.  Smart move.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.pixelmonkey.org/2007/02/07/open-source-talks-at-google-and-vim-creator/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Spirited Discussion with Miguel de Icaza on Mono and Microsoft</title>
		<link>http://www.pixelmonkey.org/2007/02/04/spirited-discussion-with-miguel-de-icaza-on-mono-and-microsoft?utm_source=rss&#038;utm_medium=rss&#038;utm_campaign=spirited-discussion-with-miguel-de-icaza-on-mono-and-microsoft</link>
		<comments>http://www.pixelmonkey.org/2007/02/04/spirited-discussion-with-miguel-de-icaza-on-mono-and-microsoft#comments</comments>
		<pubDate>Sun, 04 Feb 2007 17:33:58 +0000</pubDate>
		<dc:creator>pixelmonkey</dc:creator>
				<category><![CDATA[GNOME]]></category>
		<category><![CDATA[Microsoft]]></category>
		<category><![CDATA[Open Source]]></category>
		<category><![CDATA[Programming]]></category>
		<category><![CDATA[Technology]]></category>

		<guid isPermaLink="false">http://www.pixelmonkey.org/2007/02/04/spirited-discussion-with-miguel-de-icaza-on-mono-and-microsoft/</guid>
		<description><![CDATA[I got fired up by the evidence coming out of Microsoft from yesterday, and decided to write a post to Miguel de Icaza&#8217;s blog. Here&#8217;s what I wrote: Hi Miguel, It looks like a new set of &#8220;Halloween Documents&#8221; have come out, thanks to a case in Iowa, Comes et. al. v. Microsoft (http://iowaconsumercase.org/index.html). I&#8217;m [...]]]></description>
			<content:encoded><![CDATA[<p>I got fired up by the evidence coming out of Microsoft from yesterday, and decided to write a post to <a href="http://tirania.org/blog/">Miguel de Icaza&#8217;s</a> blog.</p>
<p>Here&#8217;s what I wrote:</p>
<blockquote><p>Hi Miguel,</p>
<p>It looks like a new set of &#8220;Halloween Documents&#8221; have come out, thanks to a case in Iowa, Comes et. al. v. Microsoft (http://iowaconsumercase.org/index.html). I&#8217;m wondering if you have any comments on this document in particular, which suggests that Microsoft management knew full well they were &#8220;stealing Java&#8221; to intentionally marginalize the cross-platform language issue.</p>
<p>A select quote from the document, &#8220;Screw Sun, cross-platform will never work. Let&#8217;s move on and steal the Java language.&#8221;<br />
Here&#8217;s the e-mail archives, which was submitted into evidence:</p>
<p>http://www.iowaconsumercase.org/011107/PX_2768.pdf</p>
<p>I&#8217;m wondering, given these thoughts from within Microsoft management, and given the recent news of Sun open sourcing the Java language under GPL terms, how is it that you can still push for the Mono project on Linux? Aren&#8217;t we always going to be fighting an uphill battle against a monopoly company protecting its biggest cash cow: the Windows platform?</p></blockquote>
<p>Although my question was more &#8220;devil&#8217;s advocate&#8221; and meant to rile him up, Miguel provided some of the <a href="http://groups.google.com/group/tiraniaorg-blog-comments/browse_thread/thread/e0797330090eb791">strongest and most cogent arguments</a> for Mono that I&#8217;ve seen on record.</p>
<p>I just want to say great work to Miguel and the Mono team, and that if you ever doubted your <em>raison d&#8217;etre</em>, all it would take is reading this thread to be convinced!  You&#8217;ve certainly convinced me!</p>
<p><strong>Update:</strong> it&#8217;s really <a href="http://blogs.sun.com/jeffdillon/entry/net_and_mono_the_libraries">this kind of dependency</a> on Windows I&#8217;m worried about in .NET.  I think it&#8217;s just that the culture of the Java runtime is one of platform independence, whereas .NET from Microsoft is one of &#8220;platform dominance,&#8221; and Mono is some sort of stepping stone between Microsoft&#8217;s single-platform vision and those of us who want to write cross-platform apps using .NET.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.pixelmonkey.org/2007/02/04/spirited-discussion-with-miguel-de-icaza-on-mono-and-microsoft/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>GPLv3: Will it marginalize the FSF?</title>
		<link>http://www.pixelmonkey.org/2007/02/02/gplv3-will-it-marginalize-the-fsf?utm_source=rss&#038;utm_medium=rss&#038;utm_campaign=gplv3-will-it-marginalize-the-fsf</link>
		<comments>http://www.pixelmonkey.org/2007/02/02/gplv3-will-it-marginalize-the-fsf#comments</comments>
		<pubDate>Sat, 03 Feb 2007 04:40:44 +0000</pubDate>
		<dc:creator>pixelmonkey</dc:creator>
				<category><![CDATA[Open Source]]></category>
		<category><![CDATA[Technology]]></category>

		<guid isPermaLink="false">http://www.pixelmonkey.org/2007/02/02/gplv3-will-it-marginalize-the-fsf/</guid>
		<description><![CDATA[I just read an interesting position paper that suggests the new version of the GNU GPL will marginalize the Free Software Foundation. I&#8217;m not going to say I agree, yet. But I think the author may be right.]]></description>
			<content:encoded><![CDATA[<p>I just read an interesting position paper that suggests the new version of the GNU GPL <a href="http://www.linuxdevices.com/articles/AT2003051251.html">will marginalize</a> the Free Software Foundation.</p>
<p>I&#8217;m not going to say I agree, <em>yet</em>.  But I think the author may be right.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.pixelmonkey.org/2007/02/02/gplv3-will-it-marginalize-the-fsf/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Common Criticisms of Linux, parsed and analyzed</title>
		<link>http://www.pixelmonkey.org/2007/01/28/common-criticisms-of-linux-parsed-and-analyzed?utm_source=rss&#038;utm_medium=rss&#038;utm_campaign=common-criticisms-of-linux-parsed-and-analyzed</link>
		<comments>http://www.pixelmonkey.org/2007/01/28/common-criticisms-of-linux-parsed-and-analyzed#comments</comments>
		<pubDate>Sun, 28 Jan 2007 22:50:54 +0000</pubDate>
		<dc:creator>pixelmonkey</dc:creator>
				<category><![CDATA[GNOME]]></category>
		<category><![CDATA[Microsoft]]></category>
		<category><![CDATA[Open Source]]></category>
		<category><![CDATA[Technology]]></category>

		<guid isPermaLink="false">http://www.pixelmonkey.org/2005/08/05/common-criticisms-of-linux-parsed-and-analyzed/</guid>
		<description><![CDATA[The following post has been sitting in my &#8220;drafts&#8221; section of WordPress for a good while. I don&#8217;t know why I never posted it &#8212; it&#8217;s been there for more than a year. I think I just thought the article deserved such careful attention that I never sat down to really edit it and prepare [...]]]></description>
			<content:encoded><![CDATA[<p><em>The following post has been sitting in my &#8220;drafts&#8221; section of WordPress for a good while. I don&#8217;t know why I never posted it &#8212; it&#8217;s been there for more than a year. I think I just thought the article deserved such careful attention that I never sat down to really edit it and prepare it for publication.</em></p>
<p><em>The topic is on the common criticisms of Linux, and I think it&#8217;s time for me to finally post my thoughts, given the upcoming release of Windows Vista and related products.</em></p>
<p>Awhile back, /. posted an article entitled <a href="http://apple.slashdot.org/article.pl?sid=05/08/05/127222&#038;from=rss">&#8220;Is It Wrong to Love Microsoft?&#8221;</a> The article is horribly written, but does have one point to make: why is it that on /. and other technology news sites like OSNews and Kuro5hin, everyone loves Linux almost unconditionally, and hates Windows unequivocally? I personally am unfond of blind faith as much as I am offended by blind hatred. I&#8217;ve thought long and hard about the pros and cons of Linux and Windows, and think I can come up with a pretty balanced evaluation of the two.</p>
<p>Oftentimes the criticisms thrown at Linux are hard to parse, mainly because the authors of these criticisms don&#8217;t know much about system design themselves. Having studied it at University, and having been a 10-year user of Windows and Linux (and a 6-year user of Mac OS since version 9), I figured I should chime in.</p>
<p>First, as often happens when evaluating arguments of any kind, one needs to identify the different kinds of critique, and break them down into the smallest possible groups so that they can be evaluated fairly. Broad statements like &#8220;Linux is broken&#8221; or &#8220;Linux is impossible to use&#8221; do not identify specific problems, but merely express sentiments, probably acquired through firsthand experience with a particular set of conditions.</p>
<p>Futhermore, attacks mounted at Linux aren&#8217;t mounted at Linux &#8220;the kernel&#8221; but at the whole set of Free (and sometimes, commercial) Software that runs on Linux, which is quite broad and diverse (and not accountable to any one development team, not even distributors). As a result of this, the attacks often seem focused on the whole system, when in fact concern only a small part of the system, and quite often that small part is already in the process of being &#8220;fixed&#8221;. So, in order to evaluate these arguments, I will begin by pointing out the general complaint lunged at Linux, and then break it down into the proper categories and evaluate each of those in turn, placing whatever context I can to help understand the situation better.</p>
<p><span id="more-215"></span></p>
<p><em>Note for FSF/GNU folks: yes, to your dismay, I will refer to the entire system &#8212; kernel, shell, command line utilities, graphical desktop, etc. &#8212; as Linux. The GNU folks (especially Richard M. Stallman, whose persistence on this issue is just plain childish at this point) will insist I call it GNU/Linux. Fine, call it GNU/Linux when you refer to it. But truthfully, on my desktop at least, I find GNOME/Linux more appropriate, and on my webserver I find Apache/MySQL/Tomcat/Linux more appropriate, so this petty argument really has no substance. Let&#8217;s please set it aside for now.</em></p>
<p>With that out of the way, let&#8217;s continue to the major complaints.</p>
<p><strong>Complaint #1: It&#8217;s Hard to Use</strong></p>
<p>Perhaps the broadest and most common critique of Linux is that it&#8217;s just plain hard to use. &#8220;You&#8217;d have to be a geek or a programmer to use Linux.&#8221; This complaint has some merit, but often it places too much blame on a particular group (often it is either a big distributor, like Redhat or Ubuntu or SuSE, or the only &#8220;widely-known&#8221; developer group, e.g. GNOME hackers). The complaint refers to a lot of often related but very specific problems with Linux, so I&#8217;ll break it down.</p>
<p><strong>Complaint #1.1: Hardware Doesn&#8217;t Work</strong></p>
<p>A user installs Fedora Core or Ubuntu on their laptop, and then discovers the wireless adapter doesn&#8217;t &#8220;just work.&#8221; Maybe their driver isn&#8217;t supported, or is only supported through ndiswrapper. If they need ndiswrapper, they might need to go compile the project&#8217;s source from source (or worse, CVS) and then find a copy of a Windows driver for ndiswrapper to use.</p>
<p>But maybe the Windows driver comes from the manufacturer&#8217;s website packaged as an EXE, which they can&#8217;t run on Linux, and so they need to boot into Windows, extract the files, come back to Linux, drop into the command line, place the files in the proper location where ndiswrapper expects them, and then run ndiswrapper&#8217;s installation script. Even if the user makes it past this all, he may be at a loss for how to configure his wireless network. He asks on IRC and the forums and people tell him to use iwconfig, iwlist, ifconfig and dhcpcd, all command-line tools, and the user isn&#8217;t used to the command line, so this seems very complicated.</p>
<p>I actually quite sympathisize with this criticism. But in this case what you&#8217;re criticising isn&#8217;t all of Linux, but just one particular part of Linux&#8217;s otherwise massive and extensive hardware support. So now, let&#8217;s take a look at the full story: in reality, Linux has the most hardware support of any operating system on the market. How&#8217;s that you say? Well, Microsoft may have the most hardware support all things considered, but in terms of hardware supported <em>provided by Microsoft</em> as opposed to hardware support <em>included with the Linux kernel</em>, Linux wins hands down. At OSCON 3.3, Greg Kroah-Hartman reported on the <a href="http://www.oreillynet.com/onlamp/blog/2005/08/oscon_33_current_state_of_the.html">status of the Linux kernel </a>and pointed out that &#8220;Linux supports more hardware on more platforms than any other operating system in existence, including NetBSD,&#8221; and that is why a lot of other operating systems are aiming to simply support Linux drivers so they don&#8217;t have to reinvent the wheel. What makes Microsoft &#8220;seem&#8221; to win is that every hardware manufacturer provides third-party drivers for Windows, and many users are even shielded from this fact because OEMs pre-install 3rd party drivers on computers. There are hardly any Linux OEMs, and even if there were, third party manufacturers tend not to package drivers for Linux. That said, Linux hackers should be proud: they have more built-in hardware support than any OS in existence.</p>
<p>This means that if it weren&#8217;t for Microsoft&#8217;s <a href="http://news.zdnet.com/2100-3513_22-868505.html">anti-competititive practices</a>, third-party hardware manufacturers would have a much easier time getting their hardware to run and supported into perpetuity, since the task of driver development/maintainence would be taken care of by kernel hackers. OEMs would have an easier time shipping Linux systems because driver support would be taken care of for most hardware (not to mention preloading software like CD burning applications and office suites would be free and taken care of by Linux distros). Users, most importantly of all, would be much better off. They know their old hardware will be supported even if the platform evolves, since the source code will always be open.</p>
<p>That said, Linux does have some hardware support issues.  But many of these may even be blamed on the users themselves.</p>
<p>This may be hard to swallow.  Why are <em>we</em> at fault for the lack of Linux drivers for some desktop peripherals?</p>
<p>In short, because we don&#8217;t complain.</p>
<p>A hardware manufacturer will never produce drivers for an operating system with a tiny market share unless the users clamor for that driver to be written. But even more important than drivers, we don&#8217;t complain for <em>open specifications</em>. Oftentimes, the biggest roadblock to Linux driver development is that no one even knows how the hardware works. The driver developers have to practice reverse engineering to get a working driver, which is a time-sucking process.</p>
<p>Writing open drivers used to be easier because in the early days of computer hardware, before computers became so ubiquitous, hardware manufacturers often shipped thick manuals with the peripherals they sold. But these weren&#8217;t just &#8220;use&#8221; manuals, they were also specifications of the hardware itself: if the hardware included circuitry, it outlined the functions of the registers, or perhaps the significance of certain pins on a parallel port connector, etc. (Admittedly, I was very young in those days, so I can&#8217;t say this firsthand, but both my father and a Computer Science professor have told me about these old manuals, and my professor even once showed me the manual that came of a sound card he bought in the 80s which included full technical specs, which he then used to write a 4.3BSD driver).</p>
<p>Nowadays, with computer use no longer restricted to computer hobbyists, this would be impractical: what&#8217;s a typical Windows user need a big thick technical reference for? However, what would be totally practical is for documents like these to be provided on manufacturer websites in PDF form. These documents <em>must exist</em>, since the Windows driver developers needed something to work off: that is perhaps the most frustrating thing. Even more frustrating is that something resembling a specification would exist if any third-party manufacturers open sourced their <em>Windows</em> drivers, but since the culture of free software simply doesn&#8217;t exist in the industry (these are still &#8220;trade secrets&#8221;), the manufacturers don&#8217;t even think about it.</p>
<p>To provide some anecdotal evidence against this claim against Linux&#8217;s ease of use from a hardware point of view, let me tell you my experience getting support for my <a href="http://www.amselectronics.com/Products/PC_Servers/EG65/EG65_lg.jpg">AMS E-Cube</a>. That is the system I use as a desktop, which uses a Intel chipset with on-board Realtek ethernet, Intel graphics and Realtek ALC650 audio. I installed both Linux and Windows on this machine. When I booted up with Libranet Linux a couple years ago (before Ubuntu existed, it was the best Debian-based distro), I had to do no hardware configuration. I really mean zero. Every piece of hardware was supported immediately by the Linux kernel. Sound, LAN, 3D graphics, USB devices, everything was working.</p>
<p>Contrast this to Windows.  In order to get the hardware fully supported there, I had to go to the hardware manufacturer&#8217;s <a href="http://www.amselectronics.com/support_gBOXP4/techdowload-ecube_eg65.html">driver page</a>, and install the following drivers: Intel Chipset software (needed for full ACPI support), Realtek ALC650 audio driver (audio had &#8220;chirping&#8221; noise without this driver), Realtek 8100 LAN driver (LAN wasn&#8217;t detected by Windows), ICH5 USB 2.0 driver (otherwise, my system would only work at 1.1), and Intel accelerated graphics (needed for full 3D support). Moreover, every driver came as an EXE which I had to extract, run a setup program, and then reboot my computer. Admittedly, this is because my computer isn&#8217;t from a top-shelf OEM, but it does expose the Windows (e.g., Microsoft-led effort) hardware compatibility myth.</p>
<p>Perhaps the most unfortunate thing about Windows hardware support is the inability to easily migrate from one piece of hardware to the next. I had Windows installed on a previous <a href="http://amselectronics.com/Products/gBOX/CF-868%20front.jpg">AMS G-Box</a>, and was upgrading to the E-Cube. But because the hardware was so drastically different, simply &#8220;swapping the hard disk&#8221; caused Windows XP to really crash and burn: blue screen of death, etc. I tried all the directions online for &#8220;cleaning out your registry&#8221; and &#8220;resetting the hardware database&#8221;, but even once I got the machine booting it was slow, and unstable. So, like most Windows users, I had to &#8220;wipe&#8221; and &#8220;install fresh.&#8221; (This wouldn&#8217;t be so bad except that when you wipe a Windows machine, you really have your work cut out for you: you have to reinstall each piece of software again, since there is no package management system; more on this later).</p>
<p>Libranet, OTOH, &#8220;just booted&#8221; fine.  When Libranet came up, I had no kernel panics or anything.  All my <em>new</em> hardware was detected, and the drivers for the old hardware didn&#8217;t load up anymore.</p>
<p>But I&#8217;ve been used to this problem since the Windows 98 days. What&#8217;s funny about XP/2000 is that it&#8217;s supposed to be able to handle these hardware migrations, as it uses Windows NT&#8217;s &#8220;hardware abstraction layer&#8221;. And even stranger is that I think on some hardware it <em>does</em> handle these migrations.  But on my hardware, no dice.</p>
<p>Why did I bother with this anecodte? I think it actually points out one of the big misconceptiions about Windows. See, in my opinion, the only reason Windows hardware support is good is because hardware manufacturers tend to sell computers with Windows preloaded on them. As a result, the hardware manufacturer <em>has</em> to make Windows work with that machine. When you buy a laptop from Dell, it would be unreasonable for Dell to expect you to install drivers for the laptop yourself. To make your laptop work, Dell didn&#8217;t just put together the hardware and then install Windows XP on it. No no, they installed Dell&#8217;s special driver for this, VIA&#8217;s special driver for that, and a handful of other third-party utilities. And then hardware manufacturers provide other functionality missing the &#8220;basic Windows install&#8221; by licensing third-party programs: To play DVDs they bought a license from PowerDVD, to burn CDs they bought a license from Roxio, to archive files they bought a license from Winzip, to protect from viruses they bought a license from Symantec, etc. See, in the Windows world, functionality of hardware is aggregated only by backroom dealing, with the costs hidden from the consumer, so no one ever knows about it. This probably affects your price tag, something Linux users have often labeled the &#8220;<a href="http://business.newsforge.com/article.pl?sid=07/01/03/228204&#038;from=rss">Windows tax</a>&#8220;.  The software certainly isn&#8217;t free, so someone&#8217;s paying the licensing cost.</p>
<p>I remember I once called Dell about Linux support on my friend&#8217;s laptop, and the guy responded with disbelief: &#8220;but you&#8217;re not <em>supposed</em> to run Linux on our laptops. Our laptops only support Windows.&#8221; Indeed. But running Linux on a laptop isn&#8217;t like other kinds of &#8220;unsupported uses&#8221; of a given product. Take a lighter: a lighter manufacturer only guarantees me their lighter will light my cigarette; if I buy a lighter and the spark doesn&#8217;t work or it&#8217;s clogged and no gas comes out, I have a good reason to return it for another. But if <a href="http://everything2.com/index.pl?node_id=987999">I use my lighter to open my beer bottle</a>, and instead I end up with a bloody hand and a broken lighter, I can&#8217;t really complain.  That&#8217;s a totally unsupported use.</p>
<p>Computer manufacturers aren&#8217;t supposed to make computers that &#8220;just run Windows,&#8221; since users should be allowed to run whatever damn operating system they want on their computers. Some may respond saying &#8220;Why? Why should hardware manufacturers care about other operating systems?&#8221; Because using Linux on a Dell isn&#8217;t like using a lighter as a beer bottle opener. Forcing users to run Windows since it is the only supported operating system is like forcing users of your cigarette lighter to smoke Marlboros because it is the only supported cigarette. &#8220;But I&#8217;d like to smoke Camels or Carlton Light too, they&#8217;re all cigarettes, after all, and all your lighter has to do is light them up&#8221; the user says. &#8220;Too bad, we only support Marlboro.&#8221; Do you think that would be a fair thing for a lighter manufacturer to restrict?</p>
<p>When evaluating Linux&#8217;s hardware support, you have to sort of forget about the stuff that is the fault of hardware manufacturers. That is, you have to forget about it when judging Linux on its merits, rather than judging it on someone else&#8217;s faults. Look at the good: Linux has open source, working drivers for <em>most</em> of your hardware.  But we also need to face up to reality: Linux will <em>never have</em> the &#8220;just works&#8221; support for <em>all your hardware</em> that Windows has until hardware manufacturers start either producing well-functioning Linux drivers for their hardware, start open sourcing their Windows drivers, or start releasing open specificatioins for their hardware. And that&#8217;ll never happen until either we, the users, speak up, and tell hardware manufacturers we want to smoke whatever brand of cigarette we damn well please when using their lighters.</p>
<p><strong>Complaint #1.1: The Desktop Software Experience is Bad</strong></p>
<p>So a user plugs in his iPod to a Linux machine and&#8230; nothing happens. We often hear a complaint of this kind, where the iPod can be anything (a USB memory stick, a scanner, a DV camera, whatever). This particular complaint is valid, and has been taken head-on by the desktop development community. Both the GNOME desktop and KDE have been working hard to provide solutions for these problems, and often they have been doing it together through the FreeDesktop.org (fd.o) project. But we have been slowed by the fact that lower-level userspace programs that run in the background (called daemons) weren&#8217;t built from the point of view of running Linux on a fully-graphical desktop. So a lot of hackers are at work redesigning some stuff that is under the GNOME/KDE hood, like hal, udev and d-bus. The idea is emit messages when certain events important to a user occur, and provide nice suggestions as to what to do (Copy photos off a camera, open a nautilus window for your memory stick, open up the GIMP for your scanner, whatever). A lot of this work has already been implemented in the latest versions of both desktop environments. It&#8217;s certainly not perfect yet, but it&#8217;s getting closer and closer everyday.</p>
<p>As for other desktop experiences, I think most of these arguments against Linux desktop software are outdated. I can only speak from a GNOME perspective with authority, but nowadays I think we have good software for doing day-to-day tasks. I personally do document writing in Abiword, which I find much more enjoyable to use compared to the clunky, slow, and featuritis-plagued MS Word. I do browsing in Firefox 2, which I find vastly superior to IE. I do e-mail, contact, calendaring and task management with Evolution, which I find vastly superior to Outlook XP and slightly superior to Outlook 2003; in Microsoft&#8217;s latest version, Outlook really got much nicer, but is still catching up to Evolution. Since this claim about Evolution will no doubt be met with skepticism and trolling, I&#8217;ll point out that the features I &#8220;can&#8217;t live without&#8221;, and then send you to <a href="http://gnomejournal.org/article/8/evolution-20">this article</a> which gives a nice overview of Evolution 2.x: Smarter searching based on &#8220;rules&#8221;, saved searches, VFolders, powerful filtering, spamassassin-based junk filtering, <em>full</em> iCal support, and integration with the GNOME date/time applet.</p>
<p>So there&#8217;s browsing, e-mail and word processing, the Big Three tasks of the average desktop user. What else do I use? There are almost too many choices for music players. I am an old-style guy who likes beep-media-player (which is basically &#8220;WinAmp&#8221; for Linux) as I&#8217;m not really into &#8220;music management and categorization&#8221; a la iTunes, but there <a href="http://easytag.sourceforge.net/">are</a> <a href="http://www.gnome.org/projects/rhythmbox/">lots</a> <a href="http://amarok.kde.org/">of</a> <a href="http://muine.gooeylinux.org/">tools</a> <a href="http://developer.kde.org/~wheeler/juk.html">that</a> <a href="http://www.sacredchao.net/quodlibet">do</a> <a href="http://musik.berlios.de/">that</a> <a href="http://www.loudhailer.org/index.html">too</a>. File management is made simple with Nautilus, which is quite comparable to Windows explorer and continues to get improvements which make it surpass Windows Explorer (and start the catch-up game with Finder). Check <a href="http://www.gnome.org/~davyd/gnome-2-12/">Davyd&#8217;s</a> overview of some of the new features from a prior release of GNOME.</p>
<p><strike>All the basics are there, with the one exception of well-done file searching which is being quite rapidly developed by the Beagle guys</strike>.  When I wrote this article, <a href="http://beagle-project.org/Main_Page">Beagle</a> was still in its infancy stages, and <a href="http://raphael.slinckx.net/deskbar/">Deskbar Applet</a> didn&#8217;t exist. Now that they both do, file searching as a problem has been solved better than it has been in Windows, even with the latest &#8220;Windows Live Search.&#8221; I suspect it may be better than Vista&#8217;s search support, at least when it comes to support for various backends and its extensibility.</p>
<p>Now you want other applications, like image editors, sound editors, programming tools, document layout programs, and more? Linux has got them, in one form or another, all Free. (More on this later, but just check out e.g. <a href="http://www.gnomefiles.org">gnomefiles.org</a> if you don&#8217;t believe me.)</p>
<p><strong>Complaint #1.3: I have to use the shell (command line), and that&#8217;s hard to use</strong></p>
<p>A lot of users complain that the main problem with Linux is that &#8220;too much stuff happens at the command line.&#8221; For example, I shouldn&#8217;t have to drop into the shell to mirror a website with httrack, I should have a website mirroring tool like <a href="http://www.tenmax.com/teleport/pro/home.htm">Teleport Pro</a>.</p>
<p>This goes all against the general UNIX culture. The main reason the command line tool is preferred by UNIX users to the graphical application is that the command line tool is often more flexible. For example, wget, being a command-line tool that generally does fast retrievals from a variety of Internet sources, can be used from any other program that needs to do that task. Furthermore, it can be used by the UNIX user in scripts or scheduled tasks (cron jobs). I&#8217;m pretty sure a lot of graphical Linux download managers actually use wget behind the scenes. Because, really, why reinvent the wheel? Why design a whole new application to do spidering and mirroring of websites when you have a high-quality, debugged, speedy tool that does the job.</p>
<p>(Technical aside: It&#8217;s true that ideally, re-usable components of software shouldn&#8217;t be binary applications. One common problem in UNIX world is that scripts that spawn off lots of separate processes are often a very rapid means of development, but usually aren&#8217;t very performant. For example, the UNIX <em>wc</em> utility can be used to count the number of characters in a document, but if you were to code a text editor that ran <em>wc -c</em> on your text document every time a new character was created, it would slow things down quite a bit. Honestly, if the UNIX system were built on a more structured programming environment than C (like Python), we&#8217;d probably be better off; that said, the basic contract that UNIX utilities follow (as to standard input and standard output) enables a level of code re-use that&#8217;s rarely found in other systems.)</p>
<p>Other command-line tools (generally a part of GNU) have lots of really practical uses, like grep and sed. The tools may have strange syntax, especially for someone coming from the Windows world, but these are very &#8220;usable&#8221; tools. All you need to do is spend a couple hours learning how the UNIX shell works (including commands like man and info for getting help) and you can find it very natural and productive to use the whole offering of UNIX command line tools. Indeed, recently I attended a two-week long UNIX course in which most students were newcomers to Linux (mostly Java and C# developers). I found that in this two-week course, these students knew more about the UNIX system than I even did. At the end of the day, the &#8220;usability&#8221; of the UNIX system is quite good, it just has a bit more of a learning curve than &#8220;point and click.&#8221;</p>
<p>The command line, like windowing systems, is a kind of interface to the user. When I had to train my Mom to use Windows years ago, nothing seemed natural to her. She couldn&#8217;t understand concepts like &#8220;Windows&#8221; and &#8220;buttons&#8221; and &#8220;links&#8221; without having me explain things to her very carefully. She couldn&#8217;t tell the difference between double-clicking and single-clicking (so she just double-clicked everything). It was hard for her to understand things like &#8220;clicking and holding down on the titlebar lets you move the window around.&#8221; What&#8217;s the titlebar? Why do I have to click there? The task bar at the bottom where each button &#8220;represents&#8221; a Window and allows you to switch between them. And before she learned the concepts well enough, she always wrote everything down as tasks: &#8220;HOW TO OPEN A WEBSITE (1) Click Blue IE button on desktop (2) Click on address bar (3) Type website address and press enter.&#8221; Etc. Etc.</p>
<p>When I reflected on that training, that took her a few days to get to be productive in a windowing system, I realized that the command-line&#8217;s lack of usability is simply a myth. The command line has a very clear interface: you type in the name of a program, followed by options for what you want it to do, and it will do it. The command line isn&#8217;t necessarily a worse interface, it&#8217;s just different. And people, when faced with strange and unknown things, do not know what to do with them. Windowing systems may seem highly usable to you, but that&#8217;s only because you&#8217;re, well, used to them. So you download files by &#8220;clicking on a blue IE icon, typing in a url, and clicking save as&#8221; and I download files by typing &#8220;wget &#8220;. That&#8217;s only because you understand that process in terms of &#8220;Internet Explorer is a web browser which can download files, so I need to pull up a browser window which is ran by double-clicking that browser&#8217;s icon, typing an address in the field that application has for web addresses, and using the action the program makes available to save that file.&#8221; Meanwhile, I understand my process as &#8220;wget is a program that retrieves files, and it takes URLs as its argument, so all I need to do is run wget with the URL as its argument from my shell.&#8221; In the end, one can&#8217;t really say one process is any better than the other, they&#8217;re just different. They have different strengths and weaknesses (yours has a lot of pretty graphics involved with it, mine doesn&#8217;t; mine is quicker to do, yours is slower). I don&#8217;t want to do web browsing or image editing from the command-line, because the command line isn&#8217;t suited for those tasks. But if I need to rename a bunch of files, search through a bunch of text files, mirror websites, or convert thirty jpegs to png files, the command-line is my friend, and should be yours too.</p>
<p>Linux on the desktop is getting to be wonderful because you need the command-line less and less for day-to-day tasks, but it&#8217;s still there to give you the proper and needed bit of automation or time-saving functionality. Microsoft realizes this, which is why it&#8217;s trying to play catch-up with <a href="http://www.microsoft.com/technet/interopmigration/unix/sfu/default.mspx">Windows Services for Unix</a> and <a href="http://www.microsoft.com/windowsserver2003/technologies/management/powershell/default.mspx">Windows Powershell</a>. But due to significant cultural differences, I don&#8217;t think either of these efforts will ever lead to the full-featured and inter-connected UNIX system that us UNIX users enjoy.</p>
<p>End of part 1 of this series, &#8220;Common Criticisms of Linux, parsed and analyzed.&#8221; Part 2 will deal with a second major complaint, &#8220;Until Linux runs X, I won&#8217;t even look at it&#8230;&#8221; where X is MS Office, Adobe Photoshop, Macromedia Dreamweaver, and a whole slew of other commercial applications people have grown attached to on Windows.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.pixelmonkey.org/2007/01/28/common-criticisms-of-linux-parsed-and-analyzed/feed</wfw:commentRss>
		<slash:comments>4</slash:comments>
		</item>
		<item>
		<title>Linux Desktop Talk at NYU</title>
		<link>http://www.pixelmonkey.org/2006/12/08/linux-desktop-talk-at-nyu?utm_source=rss&#038;utm_medium=rss&#038;utm_campaign=linux-desktop-talk-at-nyu</link>
		<comments>http://www.pixelmonkey.org/2006/12/08/linux-desktop-talk-at-nyu#comments</comments>
		<pubDate>Fri, 08 Dec 2006 07:05:14 +0000</pubDate>
		<dc:creator>pixelmonkey</dc:creator>
				<category><![CDATA[Open Source]]></category>
		<category><![CDATA[Personal]]></category>
		<category><![CDATA[Technology]]></category>

		<guid isPermaLink="false">http://www.pixelmonkey.org/2006/12/08/linux-desktop-talk-at-nyu/</guid>
		<description><![CDATA[I gave another talk for CANYU and the emerging open source clubs at NYU about Linux on the desktop. Here is the synopsis: LINUX AND FREE/OPEN SOURCE SOFTWARE The State of the F/OSS World Update with talk/demo by Andrew Montalenti December 5, 2006 @ 7pm Room 813, Warren Weaver Hall Open source software is now [...]]]></description>
			<content:encoded><![CDATA[<p>I gave another talk for CANYU and the emerging open source clubs at NYU about Linux on the desktop.  Here is the synopsis:</p>
<blockquote><p>
LINUX AND FREE/OPEN SOURCE SOFTWARE</p>
<p>The State of the F/OSS World Update<br />
with talk/demo by Andrew Montalenti</p>
<p>December 5, 2006 @ 7pm<br />
Room 813, Warren Weaver Hall</p>
<p>Open source software is now mainstream.  Whether it&#8217;s the nearly ubiquitous Mozilla Firefox browser, the Azureus peer-to-peer client, the Eclipse IDE, or the Linux kernel, almost everything in the computer world has been touched by free / open source software developers collaborating across the globe.</p>
<p>Judging by the state of the community, this movement doesn&#8217;t seem to be losing steam.  With Microsoft Windows Vista around the corner offering a potentially bloated and hardware-requirements-heavy experience, desktop Linux operating systems are taking aim at the big giant, with big support around Ubuntu, Fedora (Redhat), and SuSE (Novell), among others.</p>
<p>So, what&#8217;s next for the free / open source world?  That&#8217;s what this talk is meant to help you find out.  After explaining a bit of the history of free and open source software, and the history of recent community and corporate efforts to make it widely available, this talk will show off some of the new, cool technologies coming out of the open source community, such as 3D desktop effects, productivity tools, enhanced multimedia support, better support for laptops, and a full suite of industry-grade development tools.  The talk will also discuss some of the legal and intellectual property issues facing the open source community, with a particular focus on the recent news coming from the Novell / Microsoft deal and Sun&#8217;s decision to open source Java.</p>
<p>Who is this talk meant for?  Anyone who hasn&#8217;t tried out Linux on their desktop, or anyone who is at least mildly interested in the current and future state of the computer industry.  Free / Open Source software has completely rocked the industry, changing every aspect of it from top to bottom, and this wave is only growing bigger every day.  NYU students interested in copyright issues surrounding open source may also find this talk valuable.</p>
<p>In any event, this won&#8217;t be a boring lecture &#8212; it&#8217;s meant to be interactive and fun!</p>
<p>The speaker will be bringing free CDs of Ubuntu Linux, a community-driven desktop Linux operating system which you can install on almost any home PC!  Come for the free CDs, stay for the revolution.
</p></blockquote>
<p>It went very well, with about 10 people in the audience.  You can download the slides in <a href="http://www.pixelmonkey.org/talks/2006-12-05/linux-desktop.odp">OpenOffice</a> or <a href="http://www.pixelmonkey.org/talks/2006-12-05/linux-desktop.pdf">PDF</a>.  Admittedly, the slides aren&#8217;t as cool without the live demo of Beryl I did at the talk itself.  Yay 3D desktop effects.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.pixelmonkey.org/2006/12/08/linux-desktop-talk-at-nyu/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Taming spam with spamassassin and evolution</title>
		<link>http://www.pixelmonkey.org/2006/11/18/taming-spam-with-spamassassin-and-evolution?utm_source=rss&#038;utm_medium=rss&#038;utm_campaign=taming-spam-with-spamassassin-and-evolution</link>
		<comments>http://www.pixelmonkey.org/2006/11/18/taming-spam-with-spamassassin-and-evolution#comments</comments>
		<pubDate>Sat, 18 Nov 2006 17:41:16 +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/2006/11/18/taming-spam-with-spamassassin-and-evolution/</guid>
		<description><![CDATA[I&#8217;ve found the anti-spam support on Linux to be pretty poor overall. Considering how common this problem is and how ingenious OSS guys usually are, I&#8217;m a bit surprised. I am trying to use Evolution with SpamAssassin, and finding horrible slowness and bugs in the bayes_* databases to be the norm. If you are attempting [...]]]></description>
			<content:encoded><![CDATA[<p>I&#8217;ve found the anti-spam support on Linux to be pretty poor overall.  Considering how common this problem is and how ingenious OSS guys usually are, I&#8217;m a bit surprised.</p>
<p>I am trying to use Evolution with SpamAssassin, and finding horrible slowness and bugs in the bayes_* databases to be the norm.</p>
<p>If you are attempting this setup, I recommend the following hacks:</p>
<p>1. Do not use bayesian autolearning in spam assassin, as this is a broken way to update your spam filters.<br />
2. Instead, create a JUNK and HAM directory in Evolution, and move your junk mails and ham mails there.<br />
3. If you have already tagged mails as Junk using Evo&#8217;s &#8220;Mark as Junk&#8221; feature, you need to hack these mails out of that folder and move them into a regular Evolution folder.  &#8220;Mark as Junk&#8221; is really not moving mail anywhere, but just &#8220;tagging&#8221; it, and then the Junk folder is like a vfolder which searches for all mail tagged as junk.  This is cool, but sucks if you want to run sa-learn on your mbox in order to train spamassassin.  The way to get around it is to create a mail filter in Evo which says: &#8220;if mail is marked as junk, then mark it as not junk AND move it it to folder named JUNK.&#8221;  Then you apply the filter to your Junk directory and Evo will copy them out.  (Note: if you try to merely &#8220;copy&#8221; the mail messages to another folder, they will simply not move &#8212; again, Junk is a &#8220;tag&#8221; in evo, not a location).<br />
4. Now from the shell, go to .evolution/mail/local and find your mbox for your mail.  You can use sa-learn &#8211;spam &#8211;progress &#8211;mbox <file> to learn it as a spam, and change &#8211;spam to &#8211;ham for ham.</p>
<p>This is much better than using the built-in Evo stuff.  Do this every few weeks until you don&#8217;t have to anymore.<br />
</file></p>
]]></content:encoded>
			<wfw:commentRss>http://www.pixelmonkey.org/2006/11/18/taming-spam-with-spamassassin-and-evolution/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Great tool for LaTeX users</title>
		<link>http://www.pixelmonkey.org/2006/09/12/great-tool-for-latex-users?utm_source=rss&#038;utm_medium=rss&#038;utm_campaign=great-tool-for-latex-users</link>
		<comments>http://www.pixelmonkey.org/2006/09/12/great-tool-for-latex-users#comments</comments>
		<pubDate>Tue, 12 Sep 2006 16:10:57 +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/2006/09/12/great-tool-for-latex-users/</guid>
		<description><![CDATA[Check it out. It&#8217;s called rubber, written in Python.]]></description>
			<content:encoded><![CDATA[<p>Check it out.  It&#8217;s called <a href="http://www.pps.jussieu.fr/~beffara/soft/rubber/">rubber</a>, written in Python.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.pixelmonkey.org/2006/09/12/great-tool-for-latex-users/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Bad Eye Candy</title>
		<link>http://www.pixelmonkey.org/2006/03/23/bad-eye-candy?utm_source=rss&#038;utm_medium=rss&#038;utm_campaign=bad-eye-candy</link>
		<comments>http://www.pixelmonkey.org/2006/03/23/bad-eye-candy#comments</comments>
		<pubDate>Fri, 24 Mar 2006 01:41:47 +0000</pubDate>
		<dc:creator>pixelmonkey</dc:creator>
				<category><![CDATA[Open Source]]></category>
		<category><![CDATA[Technology]]></category>

		<guid isPermaLink="false">http://www.pixelmonkey.org/2006/03/23/bad-eye-candy/</guid>
		<description><![CDATA[I recently installed X.Org 7 with Exa, Composite and the famed xcompmgr on my Linux desktop. This didn&#8217;t enable any fancy special effects for my lowly built-in via video chipset. However, it did finally do away with &#8220;rip and tear&#8221; on my desktop. That is, when I drag a window over another one, it just [...]]]></description>
			<content:encoded><![CDATA[<p>I recently installed X.Org 7 with Exa, Composite and the famed xcompmgr on my Linux desktop.  This didn&#8217;t enable any fancy special effects for my lowly built-in via video chipset.  However, it did finally do away with &#8220;rip and tear&#8221; on my desktop.  That is, when I drag a window over another one, it just smoothly glides across.  When I switch workspace, it&#8217;s instant &#8212; I don&#8217;t see as much &#8220;widget redrawing.&#8221;</p>
<p>More and more advances are going to inevitably lead to Linux &#8220;eye candy.&#8221;  Here&#8217;s a great post on Slashdot regarding good versus bad eye candy.</p>
<blockquote><p>
Here&#8217;s a great example: pull-down menus in Mac OS X vs the same in Windows XP. On the Mac, pulldowns appear instantly, and fade away once something is selected; this is correct behaviour, as you asked for a menu &#8211; there should be no delay. Fading away is fine because the selection has been made, and you have moved on. In XP, the menus fade up, and vanish instantly &#8211; totally backwards. That is bad eye candy.
</p></blockquote>
<p>You know, I never thought about that, but I always turned off menu fading on Windows XP because I could &#8220;feel&#8221; the delay, even on my Nvidia card on my desktop.  I never realized how much more sense it would make to display the menu instantly, and fade it away upon selection.</p>
<p>I hope this conservative approach is taken by Linux devs as they implement eye candy.  Functional <i>and</i> beautiful, please.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.pixelmonkey.org/2006/03/23/bad-eye-candy/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>UNIX Zen</title>
		<link>http://www.pixelmonkey.org/2006/03/06/unix-zen?utm_source=rss&#038;utm_medium=rss&#038;utm_campaign=unix-zen</link>
		<comments>http://www.pixelmonkey.org/2006/03/06/unix-zen#comments</comments>
		<pubDate>Tue, 07 Mar 2006 04:17:30 +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/2006/03/06/unix-zen/</guid>
		<description><![CDATA[You know you&#8217;re in UNIX zen when you are looking at pictures for an apartment you are interested in, and you think to yourself, &#8220;Man, I&#8217;d really just like to download all 8 photos of this apartment at once.&#8221; So you realize they end in numbers 1-8, and you open up a terminal and write: [...]]]></description>
			<content:encoded><![CDATA[<p>You know you&#8217;re in UNIX zen when you are looking at pictures for an apartment you are interested in, and you think to yourself, &#8220;Man, I&#8217;d really just like to download all 8 photos of this apartment at once.&#8221;  So you realize they end in numbers 1-8, and you open up a terminal and write:</p>
<pre>
for i in `seq 1 8`; do
  wget http://www.livinginbaires.com/imgs/departamentos/46-$i.jpg;
done
</pre>
<p>And that&#8217;s it, you hit enter and *vroooooom!* You see progress bars fly across your terminal as wget snappily fetches your photos, and suddenly, all eight photos are downloaded, and you get back to work.  <i>That&#8217;s</i> empowering.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.pixelmonkey.org/2006/03/06/unix-zen/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Getting the troops mobilized</title>
		<link>http://www.pixelmonkey.org/2006/02/25/getting-the-troops-mobilized?utm_source=rss&#038;utm_medium=rss&#038;utm_campaign=getting-the-troops-mobilized</link>
		<comments>http://www.pixelmonkey.org/2006/02/25/getting-the-troops-mobilized#comments</comments>
		<pubDate>Sat, 25 Feb 2006 21:29:33 +0000</pubDate>
		<dc:creator>pixelmonkey</dc:creator>
				<category><![CDATA[Computer Science]]></category>
		<category><![CDATA[GNOME]]></category>
		<category><![CDATA[Open Source]]></category>
		<category><![CDATA[Personal]]></category>
		<category><![CDATA[Programming]]></category>
		<category><![CDATA[Technology]]></category>

		<guid isPermaLink="false">http://www.pixelmonkey.org/2006/02/25/getting-the-troops-mobilized/</guid>
		<description><![CDATA[I gave a talk last Tuesday called &#8220;Open Source Development: A Rapid Introduction.&#8221; Here&#8217;s the blurb I sent out when I advertised the talk: Have you wanted to work on open source projects, but just don&#8217;t know how to get started? This talk will provide the basics you need to start working on open source [...]]]></description>
			<content:encoded><![CDATA[<p>I gave a talk last Tuesday called &#8220;Open Source Development: A Rapid Introduction.&#8221;</p>
<p>Here&#8217;s the blurb I sent out when I advertised the talk:</p>
<blockquote><p>
Have you wanted to work on open source projects, but just don&#8217;t know how to get started?  This talk will provide the basics you need to start working on open source software the next time you sit down at your computer.</p>
<p>In particular, this talk will cover:</p>
<p>(1) A brief overview of open source development in the industry and press. </p>
<p>(2) The UNIX development platform.  A brief and whimsical overview of the UNIX shell, its surrounding tools, and the power of shell scripting. (Useful to anyone wanting to learn more about UNIX tools.)  Learn how to do in a few lines of shell script what you only thought was possible with a big, extravagant hundred- or thousand- line program, and learn why so many of the world&#8217;s best hackers hack on a *nix system.</p>
<p>(3) The basics you need in order to hack on open source project: how mailing lists, wikis, bugzillas, source code revision systems all come together to form an organic code management process, and how to get started using those tools and others to learn about a project and what parts need development work done.  This will include a brief introduction to CVS.</p>
<p>(4) The last part of the talk will involve actually watching open source development in action.  In particular, the speaker will checkout some code from a source repository, make a change to it, create a patchfile from that change, then track down the mailing list or bugzilla related to the project and submit the patch to the maintainer.  You will actually get to see open source &#8220;in action,&#8221; and will want to do it right when you get home!</p>
<p>If you&#8217;re a Windows or Mac OS developer who has always wanted to learn more about *nix systems, or if you&#8217;re a developer who wants to either take his own project open source or work on existing open source projects, this talk is for you.</p>
<p>Of course, if you&#8217;re someone who is just interested in the concept of open source, this talk will give you an inside look at &#8220;how things get done&#8221; in this community.</p>
<p>This talk was at least partially inspired by Nat Friedman&#8217;s blog post, check it out here:</p>
<p><a href="http://nat.org/2005/september/#How-to-become-a-hacker">&#8220;How to be a Hacker&#8221;</a></p></blockquote>
<p>The talk was a general success, I think.  About 12 people attended.  You can see the talk in <a href="http://www.pixelmonkey.org/talks/2006-02-21/open_src_dev.pdf">PDF</a> or <a href="http://www.pixelmonkey.org/talks/2006-02-21/open_src_dev.odp">ODP</a> formats, and you can also <a href="http://www.pixelmonkey.org/talks/2006-02-21/">download the patches</a> I wrote specifically for the talk to illustrate &#8220;open source development in action.&#8221;  The patches are pretty stupid, but do illustrate the point, at least.  Plus, each of the three patches served one of my own goals (hacking my CPU frequency scaler, fixing a gnome-terminal bug, and hacking galeon &#8220;for fun&#8221;), so that&#8217;s that.  I think it&#8217;d be cool to give this talk again (maybe a little refined to include less basic UNIX tools and more hacking stuff) at a later date.  We&#8217;ll see.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.pixelmonkey.org/2006/02/25/getting-the-troops-mobilized/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Instilling Doubt</title>
		<link>http://www.pixelmonkey.org/2005/11/28/instilling-doubt?utm_source=rss&#038;utm_medium=rss&#038;utm_campaign=instilling-doubt</link>
		<comments>http://www.pixelmonkey.org/2005/11/28/instilling-doubt#comments</comments>
		<pubDate>Mon, 28 Nov 2005 11:33:27 +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/2005/11/28/instilling-doubt/</guid>
		<description><![CDATA[A pretty insightful comment coming from an anonymous poster (in the comments section), I always wonder about these Linux puff articles &#8212; what motivates the writers to pimp OSs that any experienced person knows will be nosebleeds for 90%+ of the novices trying to do a real, complete migration from XP? Linux never has been, [...]]]></description>
			<content:encoded><![CDATA[<p>A <a href="http://linuxhelp.blogspot.com/2005/11/10-things-that-make-ubuntu-neophytes.html">pretty insightful comment</a> coming from an anonymous poster (in the comments section),</p>
<blockquote><p>
I always wonder about these Linux puff articles &#8212; what motivates the writers to pimp OSs that any experienced person knows will be nosebleeds for 90%+ of the novices trying to do a real, complete migration from XP?</p>
<p>Linux never has been, nor will it ever be, an effortless turn-key OS for all-purpose desktop (let alone laptop!). Ubuntu is an improvement, but it&#8217;s still Linux &#8212; which, if you consider the costs of replacing unsupported hardware and your time struggling with setup at about two cents an hour, is the most lavishly expensive OS ever devised.</p>
<p>I&#8217;ve been screwing around with Ubuntu 5.04 for about five months, all but living on the official support forum, which provides &#8212; at best! &#8212; solutions for only about a quarter of the hardware and software problems I&#8217;ve encountered, and there are tons of them.</p>
<p>When 5.10 was released, the forum exploded with bug reports from those who had upgraded from 5.04 and found they had major-to-fatal problems.</p>
<p>I&#8217;ve tried to install 5.10 on my new laptop, but the VIA video is not supported, nor is the RaLink wireless, nor WPA authentication&#8230;etc., etc., etc.</p>
<p>If you want to spend the rest of your life talking with geeks (and in the process learn that OS advocacy is best understood as a psychiatric symptom above all else) and trying out an infinite number of kludges, you can get a lot of these problems worked out (more or less), but what you normally wind up doing is succumbing to what I call &#8220;Linux disfunction drift,&#8221; eliminating tasks that you used to do in Windows because your Linux distro won&#8217;t do them, or support the hardware you needed to do them.
</p></blockquote>
]]></content:encoded>
			<wfw:commentRss>http://www.pixelmonkey.org/2005/11/28/instilling-doubt/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Slashdot comes through for once: on the viability of open source &#8220;business&#8221;</title>
		<link>http://www.pixelmonkey.org/2005/11/21/slashdot-comes-through-for-once-on-open-source-business?utm_source=rss&#038;utm_medium=rss&#038;utm_campaign=slashdot-comes-through-for-once-on-open-source-business</link>
		<comments>http://www.pixelmonkey.org/2005/11/21/slashdot-comes-through-for-once-on-open-source-business#comments</comments>
		<pubDate>Tue, 22 Nov 2005 03:38:47 +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/2005/11/21/slashdot-comes-through-for-once-on-open-source-business/</guid>
		<description><![CDATA[There&#8217;s also a larger problem with this approach &#8211; it sucks for small companies trying to become bigger. If you are only able to profit off of service contracts, you can&#8217;t &#8216;write once, reach many&#8217; like you can with COTS software. Moreover, companies like IBM and Novell which have large established sales and service teams [...]]]></description>
			<content:encoded><![CDATA[<blockquote><p>There&#8217;s also a larger problem with this approach &#8211; it sucks for small companies trying to become bigger.</p>
<p>If you are only able to profit off of service contracts, you can&#8217;t &#8216;write once, reach many&#8217; like you can with COTS software. Moreover, companies like IBM and Novell which have large established sales and service teams will win all the larger contracts.</p>
<p>If you write a great peice of software, and then have to sell, educate the customer AND hire/train all the workforce, how much time are you going to have to devote to Rev. 2 of your world beating product?</p>
<p>Whenever folks talk about OSS in the context of markets, I think it should be with a jaundiced eye towards our &#8220;helpmates&#8221; at IBM, Novell, SAP/MySQL and Sun.</p>
<p>Ultimately, IBM et al are about making money for shareholders, if they didn&#8217;t see that as the likley outcome, they would not be out there pimping OSS.</p>
<p>I think a world where software is only &#8216;sold&#8217; in the context of a service contract is bad for the next great idea. OSS is great in its place, but to preclude software for sale isn&#8217;t the answer.</p></blockquote>
<p><a href="http://developers.slashdot.org/comments.pl?sid=168985&#038;cid=14086382">The truth hurts</a> for Free Software zealots, but it&#8217;s the truth.</p>
<p>Free Software isn&#8217;t about eliminating proprietary software, at least it shouldn&#8217;t be.  It should be about developing a free system for development, learning, and sharing, because we can.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.pixelmonkey.org/2005/11/21/slashdot-comes-through-for-once-on-open-source-business/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>The MDI Plague and Window Management Woes</title>
		<link>http://www.pixelmonkey.org/2005/11/19/the-mdi-plague-and-window-management-woes?utm_source=rss&#038;utm_medium=rss&#038;utm_campaign=the-mdi-plague-and-window-management-woes</link>
		<comments>http://www.pixelmonkey.org/2005/11/19/the-mdi-plague-and-window-management-woes#comments</comments>
		<pubDate>Sat, 19 Nov 2005 20:51:54 +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/2005/11/19/the-mdi-plague-and-window-management-woes/</guid>
		<description><![CDATA[There is a nice article on Wikipedia that discusses the multiple document interface, a horrible hack that took hold in the Windows world to deal with the fact that Microsoft&#8217;s default window manager was inadequate to handle multiple windows existing under the same application. I think Mac OS/OS X handles the MDI plague best by [...]]]></description>
			<content:encoded><![CDATA[<p>There is a nice article on Wikipedia that discusses the <a href="http://en.wikipedia.org/wiki/Multiple_Document_Interface">multiple document interface</a>, a horrible hack that took hold in the Windows world to deal with the fact that Microsoft&#8217;s default window manager was inadequate to handle multiple windows existing under the same application.</p>
<p>I think Mac OS/OS X handles the MDI plague best by simply grouping all application windows under a single application class, with a single menubar.  But usability experts have debated whether that makes the most sense, since the menubar can change, for example, depending on what window is in focus.  I think users get used to that, and it also allows the menubar to be as long as necessary while the window can remain as small as necessary.  That&#8217;s a nice win.</p>
<p>However, given our current model on *nix/Windows of menubars for every reasonably complex window, and given the lack of the MDI hack in GTK+, we do have a mess for applications that need more than one window to operate properly, i.e. Glade and The Gimp.</p>
<p>What I&#8217;ve been doing is giving these programs their own workspace as a workaround.  That seems quite greedy of them, and indeed it is.  What&#8217;s more, however, is that it&#8217;s unusable.  Even when I switch to my Glade workspace, I see 4 windows in my taskbar, each with the same icon and with the following names: &#8220;Glade: h2h&#8221;, &#8220;Properties: image95&#8243;, &#8220;Widget Tree&#8221;, &#8220;h2h&#8221;.  The first three are actually part of the Glade window class, and if I enable Metacity&#8217;s taskbar grouping, I see them as part of the same group.  The last one, however, is just my actual window, and so is separate.</p>
<p>This is good&#8211;but I only get some form of usability when I actually enable window grouping.  The thing is, in Metacity you can&#8217;t enable window grouping on a per-application basis.  It&#8217;s all, sometimes, or nothing.  Sometimes means metacity only groups windows when I&#8217;m running out of space.  Otherwise it&#8217;s either on or off.</p>
<p>The thing is, grouping isn&#8217;t just about space saving.  It&#8217;s about being able to perform window manager operations on a group of windows, i.e minimize all and maximize all.</p>
<p>This doesn&#8217;t even solve all problems: alt+tab still shows me all 4 glade windows, which can be quite confusing since only one comes into focus at a time.  But that&#8217;s a separate issue, separate debate.</p>
<p>Wouldn&#8217;t it be nice if instead of Metacity just &#8220;figuring out&#8221; when to group my windows together, it let me just press a hotkey &#8220;Group all X windows on this workspace&#8221;, where X is the application I&#8217;m currently in?</p>
<p>I&#8217;ve decided this feature is so valuable, I may just hack metacity to add it.  It will at least provide a path for solving the MDI nonsense.</p>
<p><b>Update</b>: check out these screenies of a &#8220;different&#8221; approach to MDI written in GTK.  It&#8217;s called <a href="http://gtkadi.sourceforge.net/shots.php">GTK ADI</a>.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.pixelmonkey.org/2005/11/19/the-mdi-plague-and-window-management-woes/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Met Runar, Discussed Software</title>
		<link>http://www.pixelmonkey.org/2005/11/12/met-runar-discussed-software?utm_source=rss&#038;utm_medium=rss&#038;utm_campaign=met-runar-discussed-software</link>
		<comments>http://www.pixelmonkey.org/2005/11/12/met-runar-discussed-software#comments</comments>
		<pubDate>Sun, 13 Nov 2005 01:39:18 +0000</pubDate>
		<dc:creator>pixelmonkey</dc:creator>
				<category><![CDATA[Open Source]]></category>
		<category><![CDATA[Personal]]></category>
		<category><![CDATA[Programming]]></category>
		<category><![CDATA[Technology]]></category>

		<guid isPermaLink="false">http://www.pixelmonkey.org/?p=273</guid>
		<description><![CDATA[I met with Runar (he&#8217;ll have a blog soon, I swear) today, and we discussed open source, Python, and all related goodness over coffee and vegetarian lunch free-riding on the &#8216;sNice wireless network. We spent about 3 hours there, just talking about Runar&#8217;s project, &#8220;sqlstring&#8221;, my ideas about inferred typing and static source code analysis [...]]]></description>
			<content:encoded><![CDATA[<p>I met with <a href="http://betur.net/blog/">Runar</a> (he&#8217;ll have a blog soon, I swear) today, and we discussed open source, Python, and all related goodness over coffee and vegetarian lunch free-riding on the <a href="http://newyork.citysearch.com/review/41550827">&#8216;sNice</a> wireless network.</p>
<p>We spent about 3 hours there, just talking about Runar&#8217;s project, &#8220;sqlstring&#8221;, my ideas about inferred typing and static source code analysis in Python, Python&#8217;s niceness in general, user interface toolkits, AJAX being a big, nasty hack, and web application frameworks in Java and Python.  Our discussion really degrenerated into praise of <a href="http://www.vim.org">vim</a> once we discovered that we were both happy users.  Text editors really bring people together.</p>
<p>Runar kind of convinced me that trying to infer all the types of objects is very &#8220;unpythonic,&#8221; which I guess is true since it discourages the crazy stuff you can do with Python.  Maybe the best thing to do is judiciously <code>eval</code> code, as was my original impulse for getting nice completion out of Python?  Not sure.</p>
<p>Or maybe I should just give up the idea and accept the fact that vim plus ipython is just about as good as it gets.  That seems like a cop-out, though.</p>
<p>Regardless, Runar seemed somewhat willing (only half-willing) perhaps to give a small talk for Free Coders on Python, I&#8217;ll see if I can convince him that it&#8217;ll be fun.  I suppose I could give the talk myself, but I already do all the talkin&#8217;.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.pixelmonkey.org/2005/11/12/met-runar-discussed-software/feed</wfw:commentRss>
		<slash:comments>0</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/124 queries in 0.080 seconds using memcached
Object Caching 1614/1888 objects using memcached

Served from: _ @ 2012-02-07 19:52:27 -->
