<?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>Push cx &#187; Django</title>
	<atom:link href="http://push.cx/tag/django/feed" rel="self" type="application/rss+xml" />
	<link>http://push.cx</link>
	<description>A tea-drinking web geek's coffee-flavored blog</description>
	<lastBuildDate>Tue, 12 Jan 2010 01:59:09 +0000</lastBuildDate>
	<generator>http://wordpress.org/?v=2.9.1</generator>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
			<item>
		<title>OpenOffice.org Losing Viability</title>
		<link>http://push.cx/2009/openofficeorg-losing-viability</link>
		<comments>http://push.cx/2009/openofficeorg-losing-viability#comments</comments>
		<pubDate>Sat, 24 Jan 2009 16:23:25 +0000</pubDate>
		<dc:creator>Peter Harkins</dc:creator>
				<category><![CDATA[Code]]></category>
		<category><![CDATA[community]]></category>
		<category><![CDATA[Django]]></category>
		<category><![CDATA[open source]]></category>
		<category><![CDATA[OpenOffice.org]]></category>
		<category><![CDATA[Rails]]></category>

		<guid isPermaLink="false">http://push.cx/?p=622</guid>
		<description><![CDATA[
OpenOffice.org developer Michael Meeks analyzed 2008 commit data to show that the project is losing steam: decreasing numbers of commits, developers, and companies. He rhetorically asks about how the project is losing technical quality:



Why is my bug not fixed ? why is the UI still so unpleasant ? why is performance still poor ? why [...]]]></description>
			<content:encoded><![CDATA[<p>
OpenOffice.org developer Michael Meeks <a href="http://push.cx/wp-content/plugins/feed-statistics.php?url=aHR0cDovL3d3dy5nbm9tZS5vcmcvfm1pY2hhZWwvYmxvZy9vb28tY29tbWl0LXN0YXRzLTIwMDguaHRtbA==">analyzed 2008 commit data</a> to show that the project is losing steam: decreasing numbers of commits, developers, and companies. He rhetorically asks about how the project is losing technical quality:
</p>

<blockquote>
Why is my bug not fixed ? why is the UI still so unpleasant ? why is performance still poor ? why does it consume more memory than necessary ? why is it getting slower to start ? why ? why ? &#8211; the answer lies with developers: Will you help us make OpenOffice.org better ?
</blockquote>

<p>
Meeks identifies the lack of growth in the community as the core problem and his suggestions for improving the software product are about redesigning the community to be more responsive to developers, to welcome newbies better, and to simplify the act of contributing. Notably, he doesn&#8217;t suggest a single technical change for improving bugs, the UI, performance, or other features.
</p>

<p>
Maybe this is a better example than mine of <a href="http://push.cx/wp-content/plugins/feed-statistics.php?url=LzIwMDkvb3Blbi1zb3VyY2UtY29tbXVuaXRpZXM=">Django and Rails</a>: developers don&#8217;t tend to get irrationally competitive about office productivity suites and stop listening like they do web frameworks. (This is part of why OOo is in more trouble than Django.) The point is the same, though: a healthy, active community is the only guarantee of a an open source project&#8217;s viability. Community determines whether a project keeps up with its competition and redefines the limits of its field, or maintains the status quo, or becomes unreliable and unusable.
</p> <img src="http://push.cx/wp-content/plugins/feed-statistics.php?view=1&post_id=622" width="1" height="1" style="display: none;" />]]></content:encoded>
			<wfw:commentRss>http://push.cx/2009/openofficeorg-losing-viability/feed</wfw:commentRss>
		<slash:comments>2</slash:comments>
		</item>
		<item>
		<title>Open Source Communities</title>
		<link>http://push.cx/2009/open-source-communities</link>
		<comments>http://push.cx/2009/open-source-communities#comments</comments>
		<pubDate>Mon, 19 Jan 2009 13:28:53 +0000</pubDate>
		<dc:creator>Peter Harkins</dc:creator>
				<category><![CDATA[Code]]></category>
		<category><![CDATA[community]]></category>
		<category><![CDATA[Django]]></category>
		<category><![CDATA[open source]]></category>
		<category><![CDATA[Rails]]></category>

		<guid isPermaLink="false">http://push.cx/?p=554</guid>
		<description><![CDATA[
Open source projects should be judged as much by their community as by their technological achievements. The code tells you what it&#8217;s good for, but the community tells you what its future is.



Communities need to be active to continue improving the project, deal with bugs and changes to their ecosystem. If no one is interested [...]]]></description>
			<content:encoded><![CDATA[<p>
Open source projects should be judged as much by their community as by their technological achievements. The code tells you what it&#8217;s good for, but the community tells you what its future is.
</p>

<p>
Communities need to be active to continue improving the project, deal with bugs and changes to their ecosystem. If no one is interested enough to talk about the project, none of that will happen. Newcomers need to meet experienced users to be sold on why to use the software, to get help as they learn their way around, to maybe be drawn into contributing to the project itself.
</p>

<p>
Some communities are maladjusted. They <a href="http://push.cx/wp-content/plugins/feed-statistics.php?url=aHR0cDovL3d3dy5zaGlya3kuY29tL3dyaXRpbmdzL2dyb3VwX2VuZW15Lmh0bWw=">self-defeat</a> (see the section on Bion&#8217;s support groups), they lack plans or goals, they abuse newbies to keep from growing or changing, they&#8217;re more interested in bringing something down or defending turf than building up their own project. Some successful projects start <a href="http://push.cx/wp-content/plugins/feed-statistics.php?url=aHR0cDovL2dldHRpbmdyZWFsLjM3c2lnbmFscy5jb20vY2gwMl9IYXZlX2FuX0VuZW15LnBocA==">with a grudge to pick</a>, but most that do so fail to develop their own identify, and you can hear that in a cacophony of blame and flames in their social spaces.
</p>

<p>
Productivity is the best way to tell if a community is well. Even if it doesn&#8217;t have regular releases, it needs explicit plans on a reasonable schedule to meet measurable goals. Good software is produced by careful and deliberate iteration.
</p>

<p>
All well and good, but what about the slugfest between Django and Rails? When do we get to the part where I reveal myself as an irrational, deceptive propagandist because I say anything nice about the project you don&#8217;t prefer? Better question: why is there so much vitrol between the two?
</p>

<p>
The two are far more alike than dissimilar: extracted from projects that were created in similar dynamic languages from late 2003 through 2004, their core functionality was routing URLs to templates rendered with data retrieved with an ORM.
</p>

<p>
The biggest early difference is in these two contemporaneous blog posts: <a href="http://push.cx/wp-content/plugins/feed-statistics.php?url=aHR0cDovL3d3dy5kamFuZ29wcm9qZWN0LmNvbS93ZWJsb2cvMjAwNS9qdWwvMTUvY2hpcHkv">Django releases</a>, <a href="http://push.cx/wp-content/plugins/feed-statistics.php?url=aHR0cDovL3d3dy4zN3NpZ25hbHMuY29tL3N2bi9hcmNoaXZlczIvcnVieV9vbl9yYWlsc190dXJuc18xLnBocA==">Rails turns 1</a>. Django was wrongly seen as a Python copy of Rails on its release, though it&#8217;s just a case of <a href="http://push.cx/wp-content/plugins/feed-statistics.php?url=aHR0cDovL2VuLndpa2lwZWRpYS5vcmcvd2lraS9Db252ZXJnZW50X2V2b2x1dGlvbg==">convergent evolution</a>: to solve similar problems they developed along the same lines.
</p>

<p>
If success is binary, both Rails and Django are successes. They&#8217;re strong, reliable tools for building websites quickly. They are their respective languages&#8217; leading web frameworks. Speaking personally, I enjoy working daily in both.
</p>

<p>
If success is relative, Rails is far more successful than Django. By any measure I can take, the Rails community is at least ten times larger. For example, Indeed has more jobs and Google Trends shows more searches:
</p>

<a style=\"float: right\" href="http://push.cx/wp-content/plugins/feed-statistics.php?url=aHR0cDovL3d3dy5nb29nbGUuY29tL3RyZW5kcz9xPXB5dGhvbitkamFuZ28lMkMrcnVieStyYWlscw=="><img src="/wp-content/uploads/2009/01/google_trends-150x150.png" ></a>
<a href="http://push.cx/wp-content/plugins/feed-statistics.php?url=aHR0cDovL3d3dy5pbmRlZWQuY29tL2pvYnRyZW5kcz9xPXJhaWxzJTJDK2RqYW5nbyYjMDM4O2w9"><img src="/wp-content/uploads/2009/01/indeed-150x150.png" ></a>


<p>
And yesterday I posted about the <a href="http://push.cx/wp-content/plugins/feed-statistics.php?url=aHR0cDovL3B1c2guY3gvMjAwOS9kamFuZ28tdnMtcmFpbHMtdGhlLWRlYWQtdHJlZS1lZGl0aW9u">difference in books</a> with a ridiculous title. The difference between eight books and dozens can&#8217;t be explained away by Python being simpler, the Django docs being better, or Rails being more of a moving target (all true); none of them would stop publishers from trying to profit from an audience. The jobs, the searches, the books: they&#8217;re imprecise metrics that all point the same direction.
</p>

<p>
Rewind. Rails and Django were roughly technologically equivalent. They were both once a little flaky and incomplete and Definitely Didn&#8217;t Scale. But with the aid of good marketing, Rails turned its earlier release into a lead in in the developer market and created a vibrant, growing community (even if that community acts out a self-parody roughly annually).
</p>

<p>
Rails has had more resources in the form of bloggers, coders, writers, trainers, and users, and it&#8217;s used them to push in far more directions than Django has. Rails has explored dead ends like <a href="http://push.cx/wp-content/plugins/feed-statistics.php?url=aHR0cDovL3d3dy5ydWJ5LWZvcnVtLmNvbS90b3BpYy82Njg5Ng==">components</a>, built plugins and <a href="http://push.cx/wp-content/plugins/feed-statistics.php?url=aHR0cDovL2Jsb2cuamF5ZmllbGRzLmNvbS8yMDA2LzEyL3JhaWxzLXBsdWdpbnMtd2h5Lmh0bWw=">changed course</a> to use <a href="http://push.cx/wp-content/plugins/feed-statistics.php?url=aHR0cDovL3J5YW5kYWlnbGUuY29tL2FydGljbGVzLzIwMDgvNC8xL3doYXQtcy1uZXctaW4tZWRnZS1yYWlscy1nZW0tZGVwZW5kZW5jaWVz">better integration</a> with its package manager, and soon the entire Merb sort-of-fork project is <a href="http://push.cx/wp-content/plugins/feed-statistics.php?url=aHR0cDovL3dlYmxvZy5ydWJ5b25yYWlscy5vcmcvMjAwOC8xMi8yMy9tZXJiLWdldHMtbWVyZ2VkLWludG8tcmFpbHMtMw==">merging</a> into Rails with the results of its successful experiments.
</p>

<p>
Django hasn&#8217;t moved nearly as fast, it hasn&#8217;t had the resources to make as many <a href="http://push.cx/wp-content/plugins/feed-statistics.php?url=aHR0cDovL3d3dy5lcmljc2luay5jb20vYm9zL01ha2VfTW9yZV9NaXN0YWtlcy5odG1s">mistakes</a> to learn from. The Django community is recovering from an 18 month gap between feature releases (<a href="http://push.cx/wp-content/plugins/feed-statistics.php?url=aHR0cDovL3d3dy5kamFuZ29wcm9qZWN0LmNvbS93ZWJsb2cvMjAwNy9tYXIvMjMvMDk2Lw==">0.96</a> on March 23, 2007 and <a href="http://push.cx/wp-content/plugins/feed-statistics.php?url=aHR0cDovL3d3dy5kamFuZ29wcm9qZWN0LmNvbS93ZWJsb2cvMjAwOC9zZXAvMDMvMS8=">1.0</a> on September 3, 2008). 1.0 included a lot of great features and improvements, but it was a long, quiet year-and-half getting there while Rails was continuing to iterate.
</p>

<p>
It&#8217;s not a question comparing 1.0 minus .96 against 2.2 minus 1.2.3. It&#8217;s about activity and momentum, Django lost it while Rails has used the <a href="http://push.cx/wp-content/plugins/feed-statistics.php?url=aHR0cDovL2VuLndpa2lwZWRpYS5vcmcvd2lraS9OZXR3b3JrIGVmZmVjdHM=">network effect</a> to grow the most active web development community to build better software. Count the amount of <a href="http://push.cx/wp-content/plugins/feed-statistics.php?url=aHR0cDovL2Jsb2dzZWFyY2guZ29vZ2xlLmNvbS9ibG9nc2VhcmNoP2hsPWVuJiMwMzg7aWU9VVRGLTgmIzAzODtxPQ=="ruby+on+rails\"&#038;btnG=Search+Blogs\">blog posts</a>, <a href="http://push.cx/wp-content/plugins/feed-statistics.php?url=aHR0cDovL3d3dy5oYXNocm9ja2V0LmNvbS9wcm9kdWN0cw==">consultancies</a>, <a href="http://push.cx/wp-content/plugins/feed-statistics.php?url=aHR0cDovL251YnlvbnJhaWxzLmNvbS8=">newbies</a>, <a href="http://push.cx/wp-content/plugins/feed-statistics.php?url=aHR0cDovL3d3dy56ZWRzaGF3LmNvbS9yYW50cy9yYWlsc19pc19hX2doZXR0by5odG1s">rants</a>, <a href="http://push.cx/wp-content/plugins/feed-statistics.php?url=aHR0cDovL2dpdGh1Yi5jb20vcmFpbHMvcmFpbHMvY29tbWl0LzIyYWY2MmNmNDg2NzIxZWUyZTQ1YmI3MjBjNDJhYzJmNDEyMWZhZjQ=">silliness</a>, <a href="http://push.cx/wp-content/plugins/feed-statistics.php?url=aHR0cDovL2dpdGh1Yi5jb20vc2VhcmNoP3E9cmFpbHM=">projects</a>, and <a href="http://push.cx/wp-content/plugins/feed-statistics.php?url=aHR0cDovL3dlYmxvZy5ydWJ5b25yYWlscy5vcmcvMjAwOS8xLzUvYW5ub3VuY2luZy10aGUtcmFpbHMtYWN0aXZpc3Rz">weaknesses addressed</a> instead of books and see how Rails has succeeded. It <em>is</em> its own ecosystem instead of only being part of the web.
</p>

<p>
The difference in relative success is that Django&#8217;s still a useful tool for building good websites. Meanwhile, Rails has Changed The Web, influencing <a href="http://push.cx/wp-content/plugins/feed-statistics.php?url=aHR0cDovL3d3dy4zN3NpZ25hbHMuY29tL3N2bi9hcmNoaXZlcy8wMDA1NTgucGhw">graphic design</a>, pushing <a href="http://push.cx/wp-content/plugins/feed-statistics.php?url=aHR0cDovL2VuLndpa2lwZWRpYS5vcmcvd2lraS9XZWJfMi4w">collaboration</a>, proving the value of Javascript <a href="http://push.cx/wp-content/plugins/feed-statistics.php?url=aHR0cDovL3d3dy5wcm90b3R5cGVqcy5vcmcv">toolkits</a>, driving the adoption of <a href="http://push.cx/wp-content/plugins/feed-statistics.php?url=aHR0cDovL2dpdC1zY20uY29tLw==">distributed version control</a>. I&#8217;m not claiming Rails is singlehandedly responsible for these trends, I&#8217;m saying it&#8217;s been a dominant force in these advancements of the web.
</p>

<p>
The Django and Rails communities fight so much and so rudely because they&#8217;re too similar not to. Projects survive and thrive because they have attention from developers, and developers don&#8217;t often pick up two tools to do the same job (usually it&#8217;s one tool for every job). Community is the lifeblood of every open source project and the world of difference between Django and Rails is evidence.
</p> <img src="http://push.cx/wp-content/plugins/feed-statistics.php?view=1&post_id=554" width="1" height="1" style="display: none;" />]]></content:encoded>
			<wfw:commentRss>http://push.cx/2009/open-source-communities/feed</wfw:commentRss>
		<slash:comments>8</slash:comments>
		</item>
		<item>
		<title>Django vs Rails: The Dead-Tree Edition</title>
		<link>http://push.cx/2009/django-vs-rails-the-dead-tree-edition</link>
		<comments>http://push.cx/2009/django-vs-rails-the-dead-tree-edition#comments</comments>
		<pubDate>Sun, 18 Jan 2009 19:30:34 +0000</pubDate>
		<dc:creator>Peter Harkins</dc:creator>
				<category><![CDATA[Code]]></category>
		<category><![CDATA[books]]></category>
		<category><![CDATA[Django]]></category>
		<category><![CDATA[Rails]]></category>

		<guid isPermaLink="false">http://push.cx/?p=399</guid>
		<description><![CDATA[Django










Rails





















































In Conclusion

The difference speaks for itself. I&#8217;ll write about why this matters tomorrow.



(Yeah, I used the Fancy Link Builder I posted yesterday about. It was infuriating to use, it has whiz-bang Javascript to open a product detail lightbox that served only to make it nearly impossible to copy cover images. New theory: the creators of [...]]]></description>
			<content:encoded><![CDATA[<h3>Django</h3>

<a href="http://push.cx/wp-content/plugins/feed-statistics.php?url=aHR0cDovL3d3dy5hbWF6b24uY29tL2RwLzAxMzIzNTYxMzkvP3RhZz1wdXNoY3gtMjA="><img border="0" src="/wp-content/uploads/2009/01/51y3VtGapML._SL160_.jpg"></a>
<a href="http://push.cx/wp-content/plugins/feed-statistics.php?url=aHR0cDovL3d3dy5hbWF6b24uY29tL2RwLzE0MzAyMTA0NzgvP3RhZz1wdXNoY3gtMjA="><img border="0" src="/wp-content/uploads/2009/01/516STCBRnOL._SL160_.jpg"></a>
<a href="http://push.cx/wp-content/plugins/feed-statistics.php?url=aHR0cDovL3d3dy5hbWF6b24uY29tL2RwLzE1OTA1OTcyNTcvP3RhZz1wdXNoY3gtMjA="><img border="0" src="/wp-content/uploads/2009/01/51TgEPuRPvL._SL160_.jpg"></a>
<a href="http://push.cx/wp-content/plugins/feed-statistics.php?url=aHR0cDovL3d3dy5hbWF6b24uY29tL2RwLzE4NDcxOTMzNTgvP3RhZz1wdXNoY3gtMjA="><img border="0" src="/wp-content/uploads/2009/01/51KV6GDQNRL._SL160_.jpg"></a>
<a href="http://push.cx/wp-content/plugins/feed-statistics.php?url=aHR0cDovL3d3dy5hbWF6b24uY29tL2RwLzA2NzIzMjk1OVgvP3RhZz1wdXNoY3gtMjA="><img border="0" src="/wp-content/uploads/2009/01/21vjgVyKobL._SL160_.jpg"></a>
<a href="http://push.cx/wp-content/plugins/feed-statistics.php?url=aHR0cDovL3d3dy5hbWF6b24uY29tL2RwLzE4NDcxOTU3MDkvP3RhZz1wdXNoY3gtMjA="><img border="0" src="/wp-content/uploads/2009/01/41w-iUI3YXL._SL160_.jpg"></a>
<a href="http://push.cx/wp-content/plugins/feed-statistics.php?url=aHR0cDovL3d3dy5hbWF6b24uY29tL2RwLzA0NzAxMzgwOTIvP3RhZz1wdXNoY3gtMjA="><img border="0" src="/wp-content/uploads/2009/01/41TCjBvrSYL._SL160_.jpg"></a>
<a href="http://push.cx/wp-content/plugins/feed-statistics.php?url=aHR0cDovL3d3dy5hbWF6b24uY29tL2RwLzE0MzAyMTkzODYvP3RhZz1wdXNoY3gtMjA="><img border="0" src="/wp-content/uploads/2009/01/51a7iRFovkL._SL160_.jpg"></a>

<h3>Rails</h3>

<a href="http://push.cx/wp-content/plugins/feed-statistics.php?url=aHR0cDovL3d3dy5hbWF6b24uY29tL2RwLzAzMjE0NDU2MTkvP3RhZz1wdXNoY3gtMjA="><img border="0" src="/wp-content/uploads/2009/01/51QMXWhhVjL._SL160_.jpg"></a>
<a href="http://push.cx/wp-content/plugins/feed-statistics.php?url=aHR0cDovL3d3dy5hbWF6b24uY29tL2RwLzA1OTY1MjkyNjAvP3RhZz1wdXNoY3gtMjA="><img border="0" src="/wp-content/uploads/2009/01/51bobMnaN4L._SL160_.jpg"></a>
<a href="http://push.cx/wp-content/plugins/feed-statistics.php?url=aHR0cDovL3d3dy5hbWF6b24uY29tL2RwLzA5ODA0NTUyMDAvP3RhZz1wdXNoY3gtMjA="><img border="0" src="/wp-content/uploads/2009/01/51a9QwzgBoL._SL160_.jpg"></a>
<a href="http://push.cx/wp-content/plugins/feed-statistics.php?url=aHR0cDovL3d3dy5hbWF6b24uY29tL2RwLzA1OTY1MTU3NzQvP3RhZz1wdXNoY3gtMjA="><img border="0" src="/wp-content/uploads/2009/01/51gQ8Ol15gL._SL160_.jpg"></a>
<a href="http://push.cx/wp-content/plugins/feed-statistics.php?url=aHR0cDovL3d3dy5hbWF6b24uY29tL2RwLzA5Nzc2MTY2MzAvP3RhZz1wdXNoY3gtMjA="><img border="0" src="/wp-content/uploads/2009/01/51KxXNu8g3L._SL160_.jpg"></a>
<a href="http://push.cx/wp-content/plugins/feed-statistics.php?url=aHR0cDovL3d3dy5hbWF6b24uY29tL2RwLzA1OTY1MTUyMDAvP3RhZz1wdXNoY3gtMjA="><img border="0" src="/wp-content/uploads/2009/01/51GwHSlh8BL._SL160_.jpg"></a>
<a href="http://push.cx/wp-content/plugins/feed-statistics.php?url=aHR0cDovL3d3dy5hbWF6b24uY29tL2RwLzAzMjE0OTA0NTIvP3RhZz1wdXNoY3gtMjA="><img border="0" src="/wp-content/uploads/2009/01/51NG5mF-SAL._SL160_.jpg"></a>
<a href="http://push.cx/wp-content/plugins/feed-statistics.php?url=aHR0cDovL3d3dy5hbWF6b24uY29tL2RwLzA1OTY1MjczMTQvP3RhZz1wdXNoY3gtMjA="><img border="0" src="/wp-content/uploads/2009/01/515UAKz4xpL._SL160_.jpg"></a>
<a href="http://push.cx/wp-content/plugins/feed-statistics.php?url=aHR0cDovL3d3dy5hbWF6b24uY29tL2RwLzA0NzAwNjkxNTUvP3RhZz1wdXNoY3gtMjA="><img border="0" src="/wp-content/uploads/2009/01/41BAq6RJ2VL._SL160_.jpg"></a>
<a href="http://push.cx/wp-content/plugins/feed-statistics.php?url=aHR0cDovL3d3dy5hbWF6b24uY29tL2RwLzE5MzQzNTYyMzkvP3RhZz1wdXNoY3gtMjA="><img border="0" src="/wp-content/uploads/2009/01/51OLRygjI0L._SL160_.jpg"></a>
<a href="http://push.cx/wp-content/plugins/feed-statistics.php?url=aHR0cDovL3d3dy5hbWF6b24uY29tL2RwLzE5MzIzOTQ2OTkvP3RhZz1wdXNoY3gtMjA="><img border="0" src="/wp-content/uploads/2009/01/41tTB2jdYCL._SL160_.jpg"></a>
<a href="http://push.cx/wp-content/plugins/feed-statistics.php?url=aHR0cDovL3d3dy5hbWF6b24uY29tL2RwLzA1OTY1MTg3NzMvP3RhZz1wdXNoY3gtMjA="><img border="0" src="/wp-content/uploads/2009/01/51sqo-%2BaCCL._SL160_.jpg"></a>
<a href="http://push.cx/wp-content/plugins/feed-statistics.php?url=aHR0cDovL3d3dy5hbWF6b24uY29tL2RwLzA0NzAyNTgyMjUvP3RhZz1wdXNoY3gtMjA="><img border="0" src="/wp-content/uploads/2009/01/510G6HV9apL._SL160_.jpg"></a>
<a href="http://push.cx/wp-content/plugins/feed-statistics.php?url=aHR0cDovL3d3dy5hbWF6b24uY29tL2RwLzA5Nzc2MTY2MDYvP3RhZz1wdXNoY3gtMjA="><img border="0" src="/wp-content/uploads/2009/01/51jCF6MuL3L._SL160_.jpg"></a>
<a href="http://push.cx/wp-content/plugins/feed-statistics.php?url=aHR0cDovL3d3dy5hbWF6b24uY29tL2RwLzAzMjE0ODA3OTEvP3RhZz1wdXNoY3gtMjA="><img border="0" src="/wp-content/uploads/2009/01/51W2gZ6rlnL._SL160_.jpg"></a>
<a href="http://push.cx/wp-content/plugins/feed-statistics.php?url=aHR0cDovL3d3dy5hbWF6b24uY29tL2RwLzA1OTYxMDEzMjUvP3RhZz1wdXNoY3gtMjA="><img border="0" src="/wp-content/uploads/2009/01/51qbrSw4sGL._SL160_.jpg"></a>
<a href="http://push.cx/wp-content/plugins/feed-statistics.php?url=aHR0cDovL3d3dy5hbWF6b24uY29tL2RwLzA1OTY1Mjc0NDYvP3RhZz1wdXNoY3gtMjA="><img border="0" src="/wp-content/uploads/2009/01/51nQnMz4y2L._SL160_.jpg"></a>
<a href="http://push.cx/wp-content/plugins/feed-statistics.php?url=aHR0cDovL3d3dy5hbWF6b24uY29tL2RwLzE1OTA1OTY4NjIvP3RhZz1wdXNoY3gtMjA="><img border="0" src="/wp-content/uploads/2009/01/511nGo%2BS9-L._SL160_.jpg"></a>
<a href="http://push.cx/wp-content/plugins/feed-statistics.php?url=aHR0cDovL3d3dy5hbWF6b24uY29tL2RwLzA5Nzg3MzkyMDUvP3RhZz1wdXNoY3gtMjA="><img border="0" src="/wp-content/uploads/2009/01/51Gp324uWrL._SL160_.jpg"></a>
<a href="http://push.cx/wp-content/plugins/feed-statistics.php?url=aHR0cDovL3d3dy5hbWF6b24uY29tL2RwLzE5MzQzNTYxMjMvP3RhZz1wdXNoY3gtMjA="><img border="0" src="/wp-content/uploads/2009/01/51pFUUERPgL._SL160_.jpg"></a>
<a href="http://push.cx/wp-content/plugins/feed-statistics.php?url=aHR0cDovL3d3dy5hbWF6b24uY29tL2RwLzA1OTY1MTAzMjIvP3RhZz1wdXNoY3gtMjA="><img border="0" src="/wp-content/uploads/2009/01/51bvVPHlpeL._SL160_.jpg"></a>
<a href="http://push.cx/wp-content/plugins/feed-statistics.php?url=aHR0cDovL3d3dy5hbWF6b24uY29tL2RwLzE1OTA1OTg0MTUvP3RhZz1wdXNoY3gtMjA="><img border="0" src="/wp-content/uploads/2009/01/41zAqazU8zL._SL160_.jpg"></a>
<a href="http://push.cx/wp-content/plugins/feed-statistics.php?url=aHR0cDovL3d3dy5hbWF6b24uY29tL2RwLzE5MzQzNTYyMDQvP3RhZz1wdXNoY3gtMjA="><img border="0" src="/wp-content/uploads/2009/01/51cctS-JKgL._SL160_.jpg"></a>
<a href="http://push.cx/wp-content/plugins/feed-statistics.php?url=aHR0cDovL3d3dy5hbWF6b24uY29tL2RwLzE5MzM5ODg1MDkvP3RhZz1wdXNoY3gtMjA="><img border="0" src="/wp-content/uploads/2009/01/51QysfVDlVL._SL160_.jpg"></a>
<a href="http://push.cx/wp-content/plugins/feed-statistics.php?url=aHR0cDovL3d3dy5hbWF6b24uY29tL2RwLzE1OTA1OTg0NzQvP3RhZz1wdXNoY3gtMjA="><img border="0" src="/wp-content/uploads/2009/01/41D2fWLxW2L._SL160_.jpg"></a>
<a href="http://push.cx/wp-content/plugins/feed-statistics.php?url=aHR0cDovL3d3dy5hbWF6b24uY29tL2RwLzA0NzAwODEyMDEvP3RhZz1wdXNoY3gtMjA="><img border="0" src="/wp-content/uploads/2009/01/5127VkAT6GL._SL160_.jpg"></a>
<a href="http://push.cx/wp-content/plugins/feed-statistics.php?url=aHR0cDovL3d3dy5hbWF6b24uY29tL2RwL0IwMDBQMjhXSk8vP3RhZz1wdXNoY3gtMjA="><img border="0" src="/wp-content/uploads/2009/01/414cCaAVrsL._SL160_.jpg"></a>
<a href="http://push.cx/wp-content/plugins/feed-statistics.php?url=aHR0cDovL3d3dy5hbWF6b24uY29tL2RwLzA0NzAxODk0ODcvP3RhZz1wdXNoY3gtMjA="><img border="0" src="/wp-content/uploads/2009/01/41pAXWlJYYL._SL160_.jpg"></a>
<a href="http://push.cx/wp-content/plugins/feed-statistics.php?url=aHR0cDovL3d3dy5hbWF6b24uY29tL2RwLzA0NzAyMjM4OFgvP3RhZz1wdXNoY3gtMjA="><img border="0" src="/wp-content/uploads/2009/01/416ucPUFGXL._SL160_.jpg"></a>
<a href="http://push.cx/wp-content/plugins/feed-statistics.php?url=aHR0cDovL3d3dy5hbWF6b24uY29tL2RwLzE1OTA1OTczNjIvP3RhZz1wdXNoY3gtMjA="><img border="0" src="/wp-content/uploads/2009/01/41cHCApIIoL._SL160_.jpg"></a>
<a href="http://push.cx/wp-content/plugins/feed-statistics.php?url=aHR0cDovL3d3dy5hbWF6b24uY29tL2RwLzE1OTA1OTc4MTgvP3RhZz1wdXNoY3gtMjA="><img border="0" src="/wp-content/uploads/2009/01/41ISDydfaTL._SL160_.jpg"></a>
<a href="http://push.cx/wp-content/plugins/feed-statistics.php?url=aHR0cDovL3d3dy5hbWF6b24uY29tL2RwLzA5NzU4NDE5NTUvP3RhZz1wdXNoY3gtMjA="><img border="0" src="/wp-content/uploads/2009/01/51QRVmc5-9L._SL160_.jpg"></a>
<a href="http://push.cx/wp-content/plugins/feed-statistics.php?url=aHR0cDovL3d3dy5hbWF6b24uY29tL2RwLzA5Nzc2MTY2OVgvP3RhZz1wdXNoY3gtMjA="><img border="0" src="/wp-content/uploads/2009/01/51k6buikSWL._SL160_.jpg"></a>
<a href="http://push.cx/wp-content/plugins/feed-statistics.php?url=aHR0cDovL3d3dy5hbWF6b24uY29tL2RwLzE4NDcxOTM5ODYvP3RhZz1wdXNoY3gtMjA="><img border="0" src="/wp-content/uploads/2009/01/51guAgtKbfL._SL160_.jpg"></a>
<a href="http://push.cx/wp-content/plugins/feed-statistics.php?url=aHR0cDovL3d3dy5hbWF6b24uY29tL2RwLzE5MzQzNTYwNDIvP3RhZz1wdXNoY3gtMjA="><img border="0" src="/wp-content/uploads/2009/01/41dR1eGL44L._SL160_.jpg"></a>
<a href="http://push.cx/wp-content/plugins/feed-statistics.php?url=aHR0cDovL3d3dy5hbWF6b24uY29tL2RwLzAzMjE1MTcwNjcvP3RhZz1wdXNoY3gtMjA="><img border="0" src="/wp-content/uploads/2009/01/41Kl2XX58SL._SL160_.jpg"></a>
<a href="http://push.cx/wp-content/plugins/feed-statistics.php?url=aHR0cDovL3d3dy5hbWF6b24uY29tL2RwLzE1OTA1OTc1MjQvP3RhZz1wdXNoY3gtMjA="><img border="0" src="/wp-content/uploads/2009/01/41m97RSl5vL._SL160_.jpg"></a>
<a href="http://push.cx/wp-content/plugins/feed-statistics.php?url=aHR0cDovL3d3dy5hbWF6b24uY29tL2RwLzE1OTA1OTkzMzAvP3RhZz1wdXNoY3gtMjA="><img border="0" src="/wp-content/uploads/2009/01/41DJKGMk5vL._SL160_.jpg"></a>
<a href="http://push.cx/wp-content/plugins/feed-statistics.php?url=aHR0cDovL3d3dy5hbWF6b24uY29tL2RwLzE4NDcxOTM0MTIvP3RhZz1wdXNoY3gtMjA="><img border="0" src="/wp-content/uploads/2009/01/51KIECGkaQL._SL160_.jpg"></a>
<a href="http://push.cx/wp-content/plugins/feed-statistics.php?url=aHR0cDovL3d3dy5hbWF6b24uY29tL2RwLzE1OTY3MTM4MzYvP3RhZz1wdXNoY3gtMjA="><img border="0" src="/wp-content/uploads/2009/01/51M0pT6qBAL._SL160_.jpg"></a>
<a href="http://push.cx/wp-content/plugins/feed-statistics.php?url=aHR0cDovL3d3dy5hbWF6b24uY29tL2RwLzE1OTY3MTMwODkvP3RhZz1wdXNoY3gtMjA="><img border="0" src="/wp-content/uploads/2009/01/41ZAr-k1jIL._SL160_.jpg"></a>
<a href="http://push.cx/wp-content/plugins/feed-statistics.php?url=aHR0cDovL3d3dy5hbWF6b24uY29tL2RwLzAxMzI0MTc5OTUvP3RhZz1wdXNoY3gtMjA="><img border="0" src="/wp-content/uploads/2009/01/51%2B8ZrPMj6L._SL160_.jpg"></a>
<a href="http://push.cx/wp-content/plugins/feed-statistics.php?url=aHR0cDovL3d3dy5hbWF6b24uY29tL2RwLzE5MjE1NzMxMjAvP3RhZz1wdXNoY3gtMjA="><img border="0" src="/wp-content/uploads/2009/01/51zXQUtOmoL._SL160_.jpg"></a>
<a href="http://push.cx/wp-content/plugins/feed-statistics.php?url=aHR0cDovL3d3dy5hbWF6b24uY29tL2RwLzM1NDA3MzE0NFgvP3RhZz1wdXNoY3gtMjA="><img border="0" src="/wp-content/uploads/2009/01/41FGiiVTI%2BL._SL160_.jpg"></a>
<a href="http://push.cx/wp-content/plugins/feed-statistics.php?url=aHR0cDovL3d3dy5hbWF6b24uY29tL2RwLzA0NzAzNzQ5NTAvP3RhZz1wdXNoY3gtMjA="><img border="0" src="/wp-content/uploads/2009/01/41RFlrF8xLL._SL160_.jpg"></a>
<a href="http://push.cx/wp-content/plugins/feed-statistics.php?url=aHR0cDovL3d3dy5hbWF6b24uY29tL2RwLzE4NDcxOTM5MzUvP3RhZz1wdXNoY3gtMjA="><img border="0" src="/wp-content/uploads/2009/01/51nJbQqygPL._SL160_.jpg"></a>
<a href="http://push.cx/wp-content/plugins/feed-statistics.php?url=aHR0cDovL3d3dy5hbWF6b24uY29tL2RwLzM0NDY0MDkzMjcvP3RhZz1wdXNoY3gtMjA="><img border="0" src="/wp-content/uploads/2009/01/41DS37fvPuL._SL160_.jpg"></a>
<a href="http://push.cx/wp-content/plugins/feed-statistics.php?url=aHR0cDovL3d3dy5hbWF6b24uY29tL2RwLzA1OTYxMDE1MDMvP3RhZz1wdXNoY3gtMjA="><img border="0" src="/wp-content/uploads/2009/01/51wcYzxJGLL._SL160_.jpg"></a>
<a href="http://push.cx/wp-content/plugins/feed-statistics.php?url=aHR0cDovL3d3dy5hbWF6b24uY29tL2RwLzE4NDcxOTA4NTUvP3RhZz1wdXNoY3gtMjA="><img border="0" src="/wp-content/uploads/2009/01/51-ILxOshkL._SL160_.jpg"></a>
<a href="http://push.cx/wp-content/plugins/feed-statistics.php?url=aHR0cDovL3d3dy5hbWF6b24uY29tL2RwLzM4OTg2NDQwMjIvP3RhZz1wdXNoY3gtMjA="><img border="0" src="/wp-content/uploads/2009/01/41WzCwSl4ML._SL160_.jpg"></a>
<a href="http://push.cx/wp-content/plugins/feed-statistics.php?url=aHR0cDovL3d3dy5hbWF6b24uY29tL2RwLzE5MzIzOTQ3NDUvP3RhZz1wdXNoY3gtMjA="><img border="0" src="/wp-content/uploads/2009/01/51U3TcTocZL._SL160_.jpg"></a>

<h3>In Conclusion</h3>
<p>
The difference speaks for itself. I&#8217;ll write about why this matters <a href="http://push.cx/wp-content/plugins/feed-statistics.php?url=LzIwMDkvb3Blbi1zb3VyY2UtY29tbXVuaXRpZXM=">tomorrow</a>.
</p>

<p class="aside">
(Yeah, I used the <a href="http://push.cx/wp-content/plugins/feed-statistics.php?url=LzIwMDkvdHdvLWludGVyYWN0aW9ucy13aXRoLWFtYXpvbg==">Fancy Link Builder</a> I posted yesterday about. It was infuriating to use, it has whiz-bang Javascript to open a product detail lightbox that served only to make it nearly impossible to copy cover images. New theory: the creators of the Fancy Link Builder are moles from offline bookstores who have infiltrated Amazon to destroy it from within.)
</p>

 <img src="http://push.cx/wp-content/plugins/feed-statistics.php?view=1&post_id=399" width="1" height="1" style="display: none;" />]]></content:encoded>
			<wfw:commentRss>http://push.cx/2009/django-vs-rails-the-dead-tree-edition/feed</wfw:commentRss>
		<slash:comments>28</slash:comments>
		</item>
		<item>
		<title>Washington Post Update</title>
		<link>http://push.cx/2009/washington-post-update</link>
		<comments>http://push.cx/2009/washington-post-update#comments</comments>
		<pubDate>Wed, 14 Jan 2009 16:01:55 +0000</pubDate>
		<dc:creator>Peter Harkins</dc:creator>
				<category><![CDATA[Code]]></category>
		<category><![CDATA[Django]]></category>
		<category><![CDATA[politics]]></category>
		<category><![CDATA[Washington Post]]></category>
		<category><![CDATA[work]]></category>

		<guid isPermaLink="false">http://push.cx/?p=432</guid>
		<description><![CDATA[
It&#8217;s been a long time since I&#8217;ve written
about what I&#8217;ve been up to at the Washington Post, so let me run down the apps
I&#8217;ve worked on since September 2007 in roughly linear order. Lots of these apps link different places,
so if you don&#8217;t see projects.washingtonpost.com at the start of the
URL, you&#8217;ve probably wandered off something [...]]]></description>
			<content:encoded><![CDATA[<p>
It&#8217;s been a <a href="http://push.cx/wp-content/plugins/feed-statistics.php?url=aHR0cDovL3B1c2guY3gvMjAwNy9wb3N0LXBvbGl0aWNzLWdsb3NzYXJ5">long</a> <a
href="http://push.cx/wp-content/plugins/feed-statistics.php?url=aHR0cDovL3B1c2guY3gvMjAwNy9jaG9vc2UteW91ci1jYW5kaWRhdGU=">time</a> since I&#8217;ve written
about what I&#8217;ve been up to at the Washington Post, so let me run down the apps
I&#8217;ve worked on since September 2007 in roughly linear order. Lots of these apps link different places,
so if you don&#8217;t see <kbd>projects.washingtonpost.com</kbd> at the start of the
URL, you&#8217;ve probably wandered off something I directly worked on.
</p>

<dl>

<dt><a href="http://push.cx/wp-content/plugins/feed-statistics.php?url=aHR0cDovL3Byb2plY3RzLndhc2hpbmd0b25wb3N0LmNvbS8yMDA4LXByZXNpZGVudGlhbC1jYW5kaWRhdGVzL3RyYWNrZXIv">Campaign Tracker</a></dt>
<dd>I made it possible to browse events <a href="http://push.cx/wp-content/plugins/feed-statistics.php?url=aHR0cDovL3Byb2plY3RzLndhc2hpbmd0b25wb3N0LmNvbS8yMDA4LXByZXNpZGVudGlhbC1jYW5kaWRhdGVzL3RyYWNrZXIvdHlwZXMv">by type</a>. I&#8217;ve also gotten data to academic researchers who&#8217;ve requested copies of this (I think) unique data.</dd>

<dt><a href="http://push.cx/wp-content/plugins/feed-statistics.php?url=aHR0cDovL3Byb2plY3RzLndhc2hpbmd0b25wb3N0LmNvbS92b3RlcnNndWlkZS8=">Voters Guide</a></dt>
<dd>The 2006-8 Metro Voters Guide is probably the clunkiest app I worked on. Lots of confusion between producing a one-off site and a maintained app, as well as between primaries and generals. 2009 will be better because we&#8217;ve settled those issues and we&#8217;ve built a nice database schema for dealing with elections as part of the 2008 Presidential race.</dd>

<dt><a href="http://push.cx/wp-content/plugins/feed-statistics.php?url=aHR0cDovL3Byb2plY3RzLndhc2hpbmd0b25wb3N0LmNvbS9jb25ncmVzcy8=">Congress Votes</a></dt>
<dd>I loaded the new info for the current and previous sessions of Congress, added the ability to view just current members of Congress (as some join or leave during the term), added JSON feeds that power the <a href="http://push.cx/wp-content/plugins/feed-statistics.php?url=aHR0cDovL3d3dy5sZXNzaWcub3JnL2Jsb2cvMjAwOC8xMi9hcHR1cmUuaHRtbA==">Apture</a> displays (yes, I know about the <a href="http://push.cx/wp-content/plugins/feed-statistics.php?url=aHR0cDovL29wZW4uYmxvZ3Mubnl0aW1lcy5jb20vMjAwOS8wMS8wOC9pbnRyb2R1Y2luZy10aGUtY29uZ3Jlc3MtYXBpLw==">NYT Congress API</a>, I&#8217;m getting the signoffs to publicize the machine-readable pages).</dd>

<dt><a href="http://push.cx/wp-content/plugins/feed-statistics.php?url=aHR0cDovL3Byb2plY3RzLndhc2hpbmd0b25wb3N0LmNvbS9zdGFmZi9lbWFpbC9nZW5lK3dlaW5nYXJ0ZW4v">Staff E-Mail Form</a></dt>
<dd>Mostly just maintenance, but some generalization for <a href="http://push.cx/wp-content/plugins/feed-statistics.php?url=aHR0cDovL3Byb2plY3RzLndhc2hpbmd0b25wb3N0LmNvbS9zdGFmZi9lbWFpbC9yZWFkZXIrcGlja3Mv">shared mailboxes</a>.</dd>

<dt><a href="http://push.cx/wp-content/plugins/feed-statistics.php?url=aHR0cDovL3Byb2plY3RzLndhc2hpbmd0b25wb3N0LmNvbS9jaGFsbGVuZ2VpbmRleC8=">Challenge Index</a></dt>
<dd>Formerly the clunkiest app, we fixed it by refocusing it on local schools (dropping <a href="http://push.cx/wp-content/plugins/feed-statistics.php?url=aHR0cDovL3d3dy5uZXdzd2Vlay5jb20vaWQvMzkzODA=">national</a>) and I rebuilt it in Dec 2008 to clean up the code. Then we imported data back to 1996, and it&#8217;s a really nice little app. Also the source of my 3rd rule of database apps (watch for the post).</dd>

<dt><a href="http://push.cx/wp-content/plugins/feed-statistics.php?url=aHR0cDovL3Byb2plY3RzLndhc2hpbmd0b25wb3N0LmNvbS8yMDA4LXByZXNpZGVudGlhbC1jYW5kaWRhdGVzL2VuZG9yc2VtZW50cy8=">Presidential Endorsements</a></dt>
<dd>During the primaries, we tracked endorsements from public figures, mostly politicians. The app is interesting today: the front page only mentions the last few candidates like Clinton, Obama, and McCain because we stopped advertising the candidates as they dropped, but their data is all still in the db. We&#8217;ve been meaning to resurface them now that the election is settled, but it&#8217;s hard to remember to find the time to be an archive instead of just news.</dd>

<dt><a href="http://push.cx/wp-content/plugins/feed-statistics.php?url=aHR0cDovL3Byb2plY3RzLndhc2hpbmd0b25wb3N0LmNvbS8yMDA3L3NlbGxvdXQtc29uZ3Mv">Sellout Songs</a></dt>
<dd>This went along with a cute piece in the Sunday Style section. Fun fact: Python has one constant for pi, the graphic used another, and the example songs used a third. If you play with the app, you&#8217;ll see it matches the examples (because that&#8217;s the only discrepancy folks might notice). This project is where I started dreading the Sunday paper: because there&#8217;s a Saturday edition (the &#8220;bulldog&#8221; edition), things have to be ready late Friday evening. And print folks are under a daily pressure that has driven them all a bit mad, so they tend to finish projects right up against the deadline. Since this project we&#8217;ve managed projects better to avoid the &#8220;OK, now that it&#8217;s 7 PM on Friday, here&#8217;s everything you need to build the web app&#8221; problem, and I&#8217;ve noticed the web has gotten more consideration in the print newsroom over time.</dd>

<dt><a href="http://push.cx/wp-content/plugins/feed-statistics.php?url=aHR0cDovL3Byb2plY3RzLndhc2hpbmd0b25wb3N0LmNvbS8yMDA4LXByZXNpZGVudGlhbC1jYW5kaWRhdGVzL2ZpbmFuY2Uvc2VhcmNoLw==">Campaign Finance Search</a></dt>
<dd>Candidates are required to report contributions over $200 to the <a href="http://push.cx/wp-content/plugins/feed-statistics.php?url=aHR0cDovL2ZlYy5nb3Y=">FEC</a> and we pull that data from them. We were showing state, city, and zip code totals, then I built a search engine to expose the individual records. (And we also track <a href="http://push.cx/wp-content/plugins/feed-statistics.php?url=aHR0cDovL3Byb2plY3RzLndhc2hpbmd0b25wb3N0LmNvbS8yMDA4LXByZXNpZGVudGlhbC1jYW5kaWRhdGVzL2ZpbmFuY2Uvc2VhcmNoLz9ub3Rld29ydGh5PTEmIzAzODtyZWNpcGllbnQ9YmFyYWNrLW9iYW1h">noteworthy donors</a>.) Take a good look at the search page and results table so you know it as you continue reading this list.</dd>

<dt><a href="http://push.cx/wp-content/plugins/feed-statistics.php?url=aHR0cDovL3Byb2plY3RzLndhc2hpbmd0b25wb3N0LmNvbS9kb2dwYXJrcy8=">Dog Parks</a></dt>
<dd>A small app showing off Dog Parks in the DC Metro area. We&#8217;ve talked about adding more features, but it&#8217;s never climbed high enough up the priorities ladder.</dd>

<dt><a href="http://push.cx/wp-content/plugins/feed-statistics.php?url=aHR0cDovL3d3dy5jbGVhcnNwcmluZy5jb20vd2lkZ2V0cy80NzNjYTI1Njg3Yjk5ZTY4">Recipes of the Day widget</a></dt>
<dd>The only (technically) interesting thing about this project was preloading a month&#8217;s worth of season-appropriate recipes at a time, because it&#8217;d grind down a producer to have to update this by hand every day. It&#8217;s a nice toy.</dd>

<dt><a href="http://push.cx/wp-content/plugins/feed-statistics.php?url=aHR0cDovL3Byb2plY3RzLndhc2hpbmd0b25wb3N0LmNvbS8yMDA3L3NpbGVudGluanVzdGljZS8=">Silent Injustice</a></dt>
<dd>The FBI used to analyze the content of lead in bullets to match a bullet in a victim to bullets owned by a defendant. Trouble is, the science didn&#8217;t really work, and they quietly dropped it without notifying people convicted in whole or in part on this unreliable evidence. I helped put all the case files we could find online. This was a really rewarding project: it may have only mattered to a few hundred defendants and their loves ones, but it meant a lot to them.</dd>

<dt><a href="http://push.cx/wp-content/plugins/feed-statistics.php?url=aHR0cDovL3d3dy53YXNoaW5ndG9ucG9zdC5jb20vd3Atc3J2L3BvbGl0aWNzL2ludGVyYWN0aXZlcy9jYW1wYWlnbjA4L3ByaW1hcmllcy8=">Primary Pages</a></dt>
<dd>They showed live news and election results on election nights, and our database server struggled a little to keep up that first Iowa night. Postgresql doesn&#8217;t have good replication options like MySQL, so we beefed up the hardware before Super Tuesday and have been running great since. On some of the election nights, traffic to the projects server accounted for more than 10% of all WashingtonPost.com traffic.</dd>

<dt><a href="http://push.cx/wp-content/plugins/feed-statistics.php?url=aHR0cDovL3Byb2plY3RzLndhc2hpbmd0b25wb3N0LmNvbS8yMDA4LXByZXNpZGVudGlhbC1jYW5kaWRhdGVzL3ByaW1hcmllcy9leGl0LXBvbGxzLw==">Primary Exit Polls</a></dt>
<dd>Lots of fun breakdowns of data by demographic, location, response, etc. One thing I noticed on this project is that it&#8217;s hard for humans to talk about breaking down data in more than three dimensions (and three itself can be tricky). Funny how our visual and spatial skills affect the rest of our cognition.</dd>

<dt><a href="http://push.cx/wp-content/plugins/feed-statistics.php?url=aHR0cDovL3Byb2plY3RzLndhc2hpbmd0b25wb3N0LmNvbS9wb3N0MjAwLzIwMDgv">Post 200</a></dt>
<dd>The Post 200 showcases 200 prominent local businesses; apparently it&#8217;s been a yearly staple for a few decades. In 2008 we built a site we could continuously update, rather than just drop a little data once a year. I&#8217;d still like to grow this app to encompass all local companies, or all publicly traded companies (because more data makes everything better, right?). The Post doesn&#8217;t do a whole lot of business coverage, though, so we may not be able to add enough value to make that all worthwhile.</dd>

<dt><a href="http://push.cx/wp-content/plugins/feed-statistics.php?url=aHR0cDovL3Byb2plY3RzLndhc2hpbmd0b25wb3N0LmNvbS8yMDA4L2NsaW50b24tc2NoZWR1bGUv">Clinton&#8217;s Schedule</a></dt>
<dd>In the 2008 primaries, Hillary Clinton supported her claim of being more experienced with her time as First Lady, and eventually acquiesced to the call to release her schedule so people could judge her time. I found out the day before (while chatting at the water cooler) that her campaign would be dropping it off at the National Archives. Seemed like it might be fun to do something with the data, but we had no idea what format it would take. The next morning a courier picked up a CD from the Archives and we saw it in all its glory: a 17,481 page PDF that looked like it had been scanned from the fax of a photcopied inkjet printout. If you look at the news stories written that day (2008-03-19) you&#8217;ll notice they all take the form of &#8220;What was Clinton doing on this important date?&#8221; because reporters couldn&#8217;t search, just page through it chronologically. I used 200 Amazon EC2 instances to break up and OCR the entire PDF in a few hours and we put the searchable database online (and it became an <a href="http://push.cx/wp-content/plugins/feed-statistics.php?url=aHR0cDovL2F3cy5hbWF6b24uY29tL3NvbHV0aW9ucy9jYXNlLXN0dWRpZXMvd2FzaGluZ3Rvbi1wb3N0Lw==">AWS Case Study</a> (note: PR people wrote that thing)). The project was an absolute blast: making interesting data available by applying cutting-edge tools on a tight deadline.</dd>

<dt><a href="http://push.cx/wp-content/plugins/feed-statistics.php?url=aHR0cDovL3Byb2plY3RzLndhc2hpbmd0b25wb3N0LmNvbS8yMDA4L29iZXNpdHkvc2VhcmNoLw==">Young Lives At Risk</a></dt>
<dd>I pulled nutritional data on 11k foods from the USDA (in tilde-delimited format, weird) and it powered an <a href="http://push.cx/wp-content/plugins/feed-statistics.php?url=aHR0cDovL3d3dy53YXNoaW5ndG9ucG9zdC5jb20vd3Atc3J2L2hlYWx0aC9jaGlsZGhvb2RvYmVzaXR5L3N0b3JlLw==">interactive shopping cart</a>. Over the few weeks of this project, the USDA called me nearly daily to chat about nutritional data. I respect their commitment to nutritional data, but by the end of it I just wanted to buy them all puppies so my phone would stop ringing.</dd>

<dt><a href="http://push.cx/wp-content/plugins/feed-statistics.php?url=aHR0cDovL3d3dy53YXNoaW5ndG9ucG9zdC5jb20vd3Atc3J2L25hdGlvbi9pbnRlcmFjdGl2ZXMvcGVudGFnb25tZW1vcmlhbC9pbmRleC5odG1s">Sacred Ground</a></dt>
<dd>I didn&#8217;t work on the (very nice) Flash app, I updated the <a href="http://push.cx/wp-content/plugins/feed-statistics.php?url=aHR0cDovL3Byb2plY3RzLndhc2hpbmd0b25wb3N0LmNvbS9mYWxsZW4v">Faces of the Fallen</a> app to user-submitted tributes and the &#8220;Sacred Ground&#8221; templates for Pentagon victims. This looks really nice if you&#8217;re surfing from this story on the opening of the Pentagon Memorial, but it&#8217;s hugely confusing if you&#8217;re visiting from the main Fallen app. It&#8217;s one of those last-minute compromises that sometimes happen, and I plan to repair the damage.</dd>

<dt><a href="http://push.cx/wp-content/plugins/feed-statistics.php?url=aHR0cDovL3Byb2plY3RzLndhc2hpbmd0b25wb3N0LmNvbS9idXNpbmVzcy1nbG9zc2FyeS8=">Business Glossary</a></dt>
<dd>When the CDO market finally had to face reality and cratered, the business dept. asked if it would be possible to build a resource for all the (unfortunately) new terms readers were confused by. Working from the <a href="http://push.cx/wp-content/plugins/feed-statistics.php?url=aHR0cDovL3Byb2plY3RzLndhc2hpbmd0b25wb3N0LmNvbS9wb2xpdGljc2dsb3NzYXJ5Lw==">Politics Glossary</a> (gee, eerily similar), we were able to respond with an entire application instead of just a promise to build one.</dd>

<dt><a href="http://push.cx/wp-content/plugins/feed-statistics.php?url=aHR0cDovL3d3dy53YXNoaW5ndG9ucG9zdC5jb20vd3AtZHluL2NvbnRlbnQvcG9saXRpY3MvZmVkcGFnZS8=">Thrift Savings Plan data</a></dt>
<dd>The iframe near the bottom of the page with TSP market information (sort of a 401k for government employees) is a small app that pulls data from the <a href="http://push.cx/wp-content/plugins/feed-statistics.php?url=aHR0cDovL3RzcC5nb3Y=">TSP</a>.</dd>

<dt><a href="http://push.cx/wp-content/plugins/feed-statistics.php?url=aHR0cDovL3Byb2plY3RzLndhc2hpbmd0b25wb3N0LmNvbS8yMDA4L3ZvdGUtbW9uaXRvci8=">Vote Monitor</a></dt>
<dd>Our team kept some empty space in our schedule because we knew the Politics team would surely come up with a last-minute idea for an election app, and they did. After some debate about whether to stay local or open up to national reports, we built a great app to allow people to report their voting experiences. I wish we&#8217;d had the idea sooner to better advertise it and work closer with other organizations that monitored the elections. Note for 2010 to-do list&#8230;</dd>

<dt><a href="http://push.cx/wp-content/plugins/feed-statistics.php?url=aHR0cDovL3Byb2plY3RzLndhc2hpbmd0b25wb3N0LmNvbS8yMDA5L3RyYW5zaXRpb24tZG9ub3JzLw==">Obama Transition Donations</a></dt>
<dd>Hey, remember that table with donations presidential candidates table from back when? Obama, big on transparency, has released information on the donations to his presidential transition and we&#8217;re presenting a fairly familiar view of it. I believe they&#8217;ll release the data on January donors in about two weeks, so we&#8217;ll be updating then.</dd>

<dt><a href="http://push.cx/wp-content/plugins/feed-statistics.php?url=aHR0cDovL3Byb2plY3RzLndhc2hpbmd0b25wb3N0LmNvbS8yMDA4L2NsaW50b24tZG9ub3JzLw==">Clinton Foundation Donations</a></dt>
<dd>Hey, remember that table with donations&#8230; yeah, you remember. As part of Hillary Clinton&#8217;s confirmation process as Secretary of State, the Obama team required the Clinton Foundation to release previously-private donation information. They grudgingly posted it to their website, which crashed under the load. We scraped what we could as the site was intermittently up and presented it.</dd>

<dt><a href="http://push.cx/wp-content/plugins/feed-statistics.php?url=aHR0cDovL3d3dy53YXNoaW5ndG9ucG9zdC5jb20vd3Atc3J2L3BvbGl0aWNzL2J1c2gvbGVnYWN5L3RpbWVsaW5lLw==">Bush Legacy Timeline</a></dt>
<dd>Finally, reaching a project that went live two days ago, the Bush Legacy Timeline graphs key indicators against important events. I created the database to store events and helped out with the Flash coding.</dd>

</dl>

<p>
Some other projects that I haven&#8217;t done much more than bugfix are <a href="http://push.cx/wp-content/plugins/feed-statistics.php?url=aHR0cDovL3Byb2plY3RzLndhc2hpbmd0b25wb3N0LmNvbS9sb2NhbC1ibG9nLWRpcmVjdG9yeS8=">Local Blog Directory</a>, <a href="http://push.cx/wp-content/plugins/feed-statistics.php?url=aHR0cDovL3d3dy53YXNoaW5ndG9ucG9zdC5jb20vd3Atc3J2L2FydHNhbmRsaXZpbmcvZm9vZGFuZGRpbmluZy9yZWNpcGVzL3NlYXJjaC9pbmRleC5odG1s">Recipes</a>, <a href="http://push.cx/wp-content/plugins/feed-statistics.php?url=aHR0cDovL3Byb2plY3RzLndhc2hpbmd0b25wb3N0LmNvbS9kY3NjaG9vbHMvbGlzdC8=">DC Schools</a>, <a href="http://push.cx/wp-content/plugins/feed-statistics.php?url=aHR0cDovL3Byb2plY3RzLndhc2hpbmd0b25wb3N0LmNvbS9wb2xpdGljYWxhZHMv">Political Ads</a>, <a href="http://push.cx/wp-content/plugins/feed-statistics.php?url=aHR0cDovL3Byb2plY3RzLndhc2hnaW50b25wb3N0LmNvbS9mYWxsZW4v">Faces of the Fallen</a>, <a href="http://push.cx/wp-content/plugins/feed-statistics.php?url=aHR0cDovL3Byb2plY3RzLndhc2hpbmd0b25wb3N0LmNvbS9oc3MvcmVjcnVpdHMv">High School Recruiting</a>, and <a href="http://push.cx/wp-content/plugins/feed-statistics.php?url=aHR0cDovL3d3dy53YXNoaW5ndG9ucG9zdC5jb20vd3AtZHluL2NvbnRlbnQvYXJ0aWNsZS8yMDA5LzAxLzA5L0FSMjAwOTAxMDkwMjIyMy5odG1s">Inauguration Alerts</a>. I&#8217;ve also built a few internal tools to automate or streamline the editorial process, but they don&#8217;t make for compelling reading and this post is already plenty long.
</p>

<p>
In case you&#8217;ve wondered why I&#8217;ve called the Post the best job I&#8217;ve ever had, scroll back up and read it again. Tons of interesting, meaningful projects with more talented professionals than I could manage to list, but let me try so this post doesn&#8217;t make me look like a braggart:
</p>

<p>
The foundation was laid by <a href="http://push.cx/wp-content/plugins/feed-statistics.php?url=aHR0cDovL2hvbG92YXR5LmNvbQ==">Adrian Holovaty</a> and <a href="http://push.cx/wp-content/plugins/feed-statistics.php?url=aHR0cDovL3RoZXNjb29wLm9yZw==">Derek Willis</a>. It&#8217;s the nicest codebase I&#8217;ve ever inherited. Almost every one of the apps I listed is well-designed because of <a href="http://push.cx/wp-content/plugins/feed-statistics.php?url=aHR0cDovL3d3dy5hbHlzb25odXJ0LmNvbS8=">Alyson Hurt</a>. Several of these data sets came from Sarah Cohen. I&#8217;ve worked a bit with the developers Dan Berko and Ed Holzinger. Ryan O&#8217;Neil is the other developer on the Tools Team who builds all these fun apps with me, and he occasionally saves me from my bugs and design decisions. There&#8217;s also all all the news producers who created and managed apps: Jason Manning, Sarah Lovenheim, Paul Volpe, Andrea Caumont, Amy Kovac, Tanya Ballard, Amanda McGrath, Jacqueline Dupree, Alicia Cypress, and Amanda Zamora. Last, it&#8217;s been possible because of great bosses Bob Greiner, Karl Eisenhower, Jim Brady, and Dave Baker.
</p>

<p>
More TK.
</p> <img src="http://push.cx/wp-content/plugins/feed-statistics.php?view=1&post_id=432" width="1" height="1" style="display: none;" />]]></content:encoded>
			<wfw:commentRss>http://push.cx/2009/washington-post-update/feed</wfw:commentRss>
		<slash:comments>14</slash:comments>
		</item>
		<item>
		<title>Django Template Tag for Dictionary Access</title>
		<link>http://push.cx/2007/django-template-tag-for-dictionary-access</link>
		<comments>http://push.cx/2007/django-template-tag-for-dictionary-access#comments</comments>
		<pubDate>Wed, 19 Dec 2007 18:59:36 +0000</pubDate>
		<dc:creator>Peter Harkins</dc:creator>
				<category><![CDATA[Code]]></category>
		<category><![CDATA[dictionaries]]></category>
		<category><![CDATA[Django]]></category>
		<category><![CDATA[hash]]></category>
		<category><![CDATA[templates]]></category>

		<guid isPermaLink="false">http://push.cx/2007/django-template-tag-for-dictionary-access</guid>
		<description><![CDATA[
About a million times when writing Django pages I&#8217;ve been iterating through a list of objects and wanted to look up a value in a dictionary keyed by object.id. But you can&#8217;t, the built-in tags don&#8217;t allow it.



The standard workaround is to loop over the list and zip the hash data into some kind of [...]]]></description>
			<content:encoded><![CDATA[<p>
About a million times when writing Django pages I&#8217;ve been iterating through a list of objects and wanted to look up a value in a dictionary keyed by <kbd>object.id</kbd>. But you can&#8217;t, the built-in tags don&#8217;t allow it.
</p>

<p>
The standard workaround is to loop over the list and zip the hash data into some kind of bigger list, but this is expensive if the list is big and just plain annoying, especially if you&#8217;re on Django 0.96 and can&#8217;t unpack tuples with your <kbd>for</kbd> tag.
</p>

<p>
So I finally hacked up a template tag to give me access to dictionary contents:
</p>

<pre>&nbsp;
@register.<span style="color: #202020;">filter</span>
<span style="color: #b1b100;">def</span> <span style="color: #b1b100;">hash</span><span style="color: #66cc66;">&#40;</span>h, key<span style="color: #66cc66;">&#41;</span>:
    <span style="color: #b1b100;">return</span> h<span style="color: #66cc66;">&#91;</span>key<span style="color: #66cc66;">&#93;</span></pre>

<p>
And it&#8217;s used like:
</p>

<p>
<pre>&nbsp;
{% for o in objects %}
  <span style="color: #009900;"><a href="http://push.cx/wp-content/plugins/feed-statistics.php?url=aHR0cDovL2RlY2VtYmVyLmNvbS9odG1sLzQvZWxlbWVudC9saS5odG1s"><span style="color: #000000; font-weight: bold;">&lt;li&gt;</span></a></span>{{ dictionary|hash:o.id }}<span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;/li&gt;</span></span>
{% endfor %}</pre>

<p>
It may not be beautiful, but it mostly works. Annoyingly, you can&#8217;t do <kbd>dictionary|hash:o.id|hash:'foo'</kbd> to get at an inner hash &#8212; anyone know why?
</p> <img src="http://push.cx/wp-content/plugins/feed-statistics.php?view=1&post_id=295" width="1" height="1" style="display: none;" />]]></content:encoded>
			<wfw:commentRss>http://push.cx/2007/django-template-tag-for-dictionary-access/feed</wfw:commentRss>
		<slash:comments>5</slash:comments>
		</item>
		<item>
		<title>Django And The Disappearing Template Tags</title>
		<link>http://push.cx/2006/django-and-the-disappearing-template-tags</link>
		<comments>http://push.cx/2006/django-and-the-disappearing-template-tags#comments</comments>
		<pubDate>Thu, 25 May 2006 17:28:33 +0000</pubDate>
		<dc:creator>Peter Harkins</dc:creator>
				<category><![CDATA[Code]]></category>
		<category><![CDATA[Django]]></category>

		<guid isPermaLink="false">http://push.cx/2006/django-and-the-disappearing-template-tags</guid>
		<description><![CDATA[
If you are defining custom template tags, don&#8217;t put them in a file named log.py. You&#8217;ll be able to {% load log %} fine in your template, but you won&#8217;t be able to use your tags. No, this isn&#8217;t documented anywhere.



I suspect it&#8217;s because the admin interface also defines custom tags in a file named [...]]]></description>
			<content:encoded><![CDATA[<p>
If you are defining custom template tags, don&#8217;t put them in a file named <kbd>log.py</kbd>. You&#8217;ll be able to <kbd>{% load log %}</kbd> fine in your template, but you won&#8217;t be able to use your tags. No, this isn&#8217;t documented anywhere.
</p>

<p>
I suspect it&#8217;s because the admin interface also defines custom tags in a file named <kbd>log.py</kbd> and that you should avoid duplicating any template tags filename in your <kbd>INSTALLED_APPS</kbd>.
</p>

<p>
This public service announcement has been brought to you by a wasted hour of my life.
</p> <img src="http://push.cx/wp-content/plugins/feed-statistics.php?view=1&post_id=115" width="1" height="1" style="display: none;" />]]></content:encoded>
			<wfw:commentRss>http://push.cx/2006/django-and-the-disappearing-template-tags/feed</wfw:commentRss>
		<slash:comments>2</slash:comments>
		</item>
		<item>
		<title>Django Gets Transactions</title>
		<link>http://push.cx/2006/django-gets-transactions</link>
		<comments>http://push.cx/2006/django-gets-transactions#comments</comments>
		<pubDate>Wed, 01 Mar 2006 18:30:48 +0000</pubDate>
		<dc:creator>Peter Harkins</dc:creator>
				<category><![CDATA[Code]]></category>
		<category><![CDATA[databases]]></category>
		<category><![CDATA[Django]]></category>
		<category><![CDATA[web]]></category>

		<guid isPermaLink="false">http://push.cx/2006/django-gets-transactions</guid>
		<description><![CDATA[
Jacob Kaplan-Moss added transaction support to the magic-removal branch of Django just a few minutes ago. It&#8217;s one of the many changes to come out of the sprint. Usage will look something like this (based on Jacob&#8217;s docs and chatting with him in #django-sprint):


&#160;
from django.db import transaction
&#160;
@transaction.commit_manually
def view&#40;request&#41;:
    # you make changes [...]]]></description>
			<content:encoded><![CDATA[<p>
<a href="http://push.cx/wp-content/plugins/feed-statistics.php?url=aHR0cDovL2phY29iaWFuLm9yZw==">Jacob Kaplan-Moss</a> added transaction support to the <a href="http://push.cx/wp-content/plugins/feed-statistics.php?url=aHR0cDovL2NvZGUuZGphbmdvcHJvamVjdC5jb20vd2lraS9SZW1vdmluZ1RoZU1hZ2lj">magic-removal</a> branch of Django just a few minutes ago. It&#8217;s one of the many changes to come out of the <a href="http://push.cx/wp-content/plugins/feed-statistics.php?url=aHR0cDovL2NvZGUuZGphbmdvcHJvamVjdC5jb20vd2lraS9QeUNvblNwcmludDA2">sprint</a>. Usage will look something like this (based on Jacob&#8217;s docs and chatting with him in #django-sprint):
</p>

<pre>&nbsp;
<span style="color: #b1b100;">from</span> django.<span style="color: #202020;">db</span> <span style="color: #b1b100;">import</span> transaction
&nbsp;
@transaction.<span style="color: #202020;">commit_manually</span>
<span style="color: #b1b100;">def</span> view<span style="color: #66cc66;">&#40;</span>request<span style="color: #66cc66;">&#41;</span>:
    <span style="color: #808080; font-style: italic;"># you make changes to your objects, calling obj.save() on them as normal</span>
&nbsp;
    <span style="color: #808080; font-style: italic;"># when you commit, all changes to all objects will be commited to your database</span>
    transaction.<span style="color: #202020;">commit</span><span style="color: #66cc66;">&#40;</span><span style="color: #66cc66;">&#41;</span> 
&nbsp;
    <span style="color: #808080; font-style: italic;"># an excellent idea would be to wrap in a try/except block</span>
    <span style="color: #b1b100;">try</span>:
        <span style="color: #808080; font-style: italic;"># do your stuff</span>
    <span style="color: #b1b100;">except</span>:
        transaction.<span style="color: #202020;">rollback</span><span style="color: #66cc66;">&#40;</span><span style="color: #66cc66;">&#41;</span>
    <span style="color: #b1b100;">else</span>:
        transaction.<span style="color: #202020;">commit</span><span style="color: #66cc66;">&#40;</span><span style="color: #66cc66;">&#41;</span></pre>

<p>
I couldn&#8217;t find a good doc quick for Python decorators (that bit with the @ before the function declaration) for people who haven&#8217;t used them before, so if someone has a good one, please post it in the comments below.
</p>

<p>
Here&#8217;s a link to the <a href="http://push.cx/wp-content/plugins/feed-statistics.php?url=aHR0cDovL2NvZGUuZGphbmdvcHJvamVjdC5jb20vYnJvd3Nlci9kamFuZ28vYnJhbmNoZXMvbWFnaWMtcmVtb3ZhbC9kb2NzL3RyYW5zYWN0aW9ucy50eHQ=">full docs</a> and for those interested in the nitty-gritty, here&#8217;s a link to the <a href="http://push.cx/wp-content/plugins/feed-statistics.php?url=aHR0cDovL2NvZGUuZGphbmdvcHJvamVjdC5jb20vY2hhbmdlc2V0LzI0NTc=">code checkin</a>.
</p>

<p>
And before you ask, magic-removal is expected to be merged to trunk before the end of March.
</p> <img src="http://push.cx/wp-content/plugins/feed-statistics.php?view=1&post_id=55" width="1" height="1" style="display: none;" />]]></content:encoded>
			<wfw:commentRss>http://push.cx/2006/django-gets-transactions/feed</wfw:commentRss>
		<slash:comments>8</slash:comments>
		</item>
		<item>
		<title>Versioning: The Next Big Thing</title>
		<link>http://push.cx/2006/versioning-next-big-thing</link>
		<comments>http://push.cx/2006/versioning-next-big-thing#comments</comments>
		<pubDate>Tue, 28 Feb 2006 17:34:26 +0000</pubDate>
		<dc:creator>Peter Harkins</dc:creator>
				<category><![CDATA[Code]]></category>
		<category><![CDATA[databases]]></category>
		<category><![CDATA[Django]]></category>
		<category><![CDATA[math]]></category>
		<category><![CDATA[web]]></category>

		<guid isPermaLink="false">http://push.cx/2006/versioning-next-big-thing</guid>
		<description><![CDATA[<p>
In the web development world, anyways. So, in the grand scheme of things, maybe not a huge deal to anyone else. Versioning is going to be one of the biggest problems and opportunities there is in web development, and it's going to take us at least five years to get it right.
</p>]]></description>
			<content:encoded><![CDATA[<p>
In the web development world, anyways. So, in the grand scheme of things, maybe not a huge deal to anyone else. Versioning is going to be one of the biggest problems and opportunities there is in web development, and it&#8217;s going to take us at least five years to get it right.
</p>

<p>
Actually, let me admit up front that five years is a shot in the dark, and optimistic to boot. If people keep hanging out with <a href="http://push.cx/wp-content/plugins/feed-statistics.php?url=aHR0cDovL2MyLmNvbS9jZ2kvd2lraT9Cb25kYWdlQW5kRGlzY2lwbGluZUxhbmd1YWdl">bondage and discipline languages</a> like Java and C# that are still catching up to language and framework developments from the 90&#8217;s it&#8217;ll take us more like ten years. (Attention Lisp Weenies: Yes, I know you solved every problem forty years ago for certain values of &#8220;solved&#8221; and &#8220;problem&#8221; while the rest of us were getting work done.) Not only is versioning a difficult technical problem, it will be difficult to educate programmers in what it is, how it works, and why you&#8217;ll wish you used about a year after you decided it was too much work.
</p>

<p>
I&#8217;m writing to get help get the ball rolling on the process of solving this problem and publicizing it. So maybe it&#8217;s about time I go into what the problem <i>is</i> instead of just yammering on, eh?
</p>

<p>
Because your website is served from your machines, you can update it every few days or hours. This is almost pedantically obvious, but it&#8217;s a big change from having to press CDs, ship them to a store, and wait for them to go home with customers &#8212; it&#8217;s even a big change from posting a new version online for customers to download and install.
</p>

<p>
The web&#8217;s faster pace means that updating, say, your database model to add or remove fields is a common occurence rather than something your InstallShield wizard does every 1-2 years. It&#8217;s vital that changes be streamlined and safeguarded. What kind of defaults get set when you add fields? How do you save data when you lose fields? How does the programmer make sure the Right Thing happens? If you have the fields Name and Address and want to combine them into a simple MailingAddress field, you&#8217;re not just deleting two columns and adding one.
</p>

<p>
Not only is it complex to change your schema, getting those changes into production are not easy. The script that updates definitions and migrates data (which we tested somewhere other than production, right?) needs to placate the multiple web and database servers used for load-balancing. If you update the database server first, the application code on the web server shouldn&#8217;t break because it didn&#8217;t get the word about the new schema.
</p>

<p>
I see too many problems with trying to get multiple servers to update to a new version at the Exact Same Instant, I think schema changes are going to have to be a four-step process with a backwards-compatible first step applied to the database (add columns, loosen restrictions), a code update (with testing!), a backwards-incompatible database change (drop columns, tighten restrictions), and finally another code update to remove outdated usage.
</p>

<p>
<a href="http://push.cx/wp-content/plugins/feed-statistics.php?url=aHR0cDovL3d3dy5qYWNvYmlhbi5vcmcv">Jakob Kaplan-Moss</a>, one of the creators of Django, just <a href="http://push.cx/wp-content/plugins/feed-statistics.php?url=aHR0cDovL2NvZGUuZGphbmdvcHJvamVjdC5jb20vd2lraS9TY2hlbWFFdm9sdXRpb24=">opened the discussion of versioning in Django</a> (with links to prior art). As a web framework with an object-relational mapper, versioning is an important feature.
</p>

<p>
In addition to databases, web APIs need versioning. Adam Kelsey has <a href="http://push.cx/wp-content/plugins/feed-statistics.php?url=aHR0cDovL2thbHNleS5jb20vMjAwNi8wMi92ZXJzaW9uaW5nX3dlYl9zZXJ2aWNlcy8=">opened that discussion</a>, but so far the solutions are pretty rough and I don&#8217;t have anything to add to the discussion.
</p>

<p>
If you&#8217;d like to read more about how web development differs from other development, Steve Yegge wrote an excellent article titled <a href="http://push.cx/wp-content/plugins/feed-statistics.php?url=aHR0cDovL3d3dy5jYWJvY2hvbi5jb20vfnN0ZXZleS9ibG9nLXJhbnRzL2l0cy1ub3Qtc29mdHdhcmUuaHRtbA==">It&#8217;s Not Software</a> coining the term &#8220;servware&#8221; to emphasize that web developers need to recognize the ways our code ends up so different. (It&#8217;s easy to turn this topic into rah-rah &#8220;We&#8217;re so special we don&#8217;t have to learn from history&#8221; bullshit, but nobody wants that.)
</p> <img src="http://push.cx/wp-content/plugins/feed-statistics.php?view=1&post_id=53" width="1" height="1" style="display: none;" />]]></content:encoded>
			<wfw:commentRss>http://push.cx/2006/versioning-next-big-thing/feed</wfw:commentRss>
		<slash:comments>7</slash:comments>
		</item>
	</channel>
</rss>

<!-- Dynamic Page Served (once) in 0.915 seconds -->
