<?xml version="1.0" encoding="UTF-8"?>
<?xml-stylesheet type="text/xsl" media="screen" href="/~d/styles/rss2full.xsl"?><?xml-stylesheet type="text/css" media="screen" href="http://feeds.feedburner.com/~d/styles/itemcontent.css"?><rss xmlns:content="http://purl.org/rss/1.0/modules/content/" xmlns:wfw="http://wellformedweb.org/CommentAPI/" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:sy="http://purl.org/rss/1.0/modules/syndication/" xmlns:slash="http://purl.org/rss/1.0/modules/slash/" xmlns:feedburner="http://rssnamespace.org/feedburner/ext/1.0" version="2.0">

<channel>
	<title>Kurt Grandis</title>
	
	<link>http://kurtgrandis.com/blog</link>
	<description>Software Engineering &amp; Entrepreneurship</description>
	<lastBuildDate>Thu, 21 Jul 2011 03:41:28 +0000</lastBuildDate>
	<generator>http://wordpress.org/?v=2.9.2</generator>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
			<atom10:link xmlns:atom10="http://www.w3.org/2005/Atom" rel="self" type="application/rss+xml" href="http://feeds.feedburner.com/kurtgrandis/qQcH" /><feedburner:info uri="kurtgrandis/qqch" /><atom10:link xmlns:atom10="http://www.w3.org/2005/Atom" rel="hub" href="http://pubsubhubbub.appspot.com/" /><item>
		<title>Python Hack Night #3</title>
		<link>http://feedproxy.google.com/~r/kurtgrandis/qQcH/~3/Y-rWClV2BoA/</link>
		<comments>http://kurtgrandis.com/blog/2011/07/20/python-hack-night-3/#comments</comments>
		<pubDate>Thu, 21 Jul 2011 03:41:28 +0000</pubDate>
		<dc:creator>kurt</dc:creator>
				<category><![CDATA[Django]]></category>
		<category><![CDATA[Games]]></category>
		<category><![CDATA[Local Business]]></category>
		<category><![CDATA[Python]]></category>
		<category><![CDATA[hack night]]></category>
		<category><![CDATA[trizpug]]></category>

		<guid isPermaLink="false">http://kurtgrandis.com/blog/?p=517</guid>
		<description><![CDATA[We had a good turn out for TriZPUG&#8217;s third Python Hack Night tonight. All in all, nine local pythonistas showed up at MetaMetrics in Durham and dug right in. There was good conversation and it seems like progress was made on most fronts. We had a wide range of projects including: personal websites, a scrum [...]]]></description>
			<content:encoded><![CDATA[<p>We had a good turn out for <a href="http://trizpug.org" target="_blank">TriZPUG&#8217;s</a> third Python Hack Night tonight. All in all, nine local pythonistas showed up at MetaMetrics in Durham and dug right in. There was good conversation and it seems like progress was made on most fronts. We had a wide range of projects including: personal websites, a scrum workflow tool, a computational teaching problem, a game project, a nose plugin, a Django-based charting framework, and more. We even had an impromptu game AI-building competition emerge.</p>
<p>I was pleased with the results and would love to see one at least once a month. Let&#8217;s see what August brings.</p>
<img src="http://feeds.feedburner.com/~r/kurtgrandis/qQcH/~4/Y-rWClV2BoA" height="1" width="1"/>]]></content:encoded>
			<wfw:commentRss>http://kurtgrandis.com/blog/2011/07/20/python-hack-night-3/feed/</wfw:commentRss>
		<slash:comments>1</slash:comments>
		<feedburner:origLink>http://kurtgrandis.com/blog/2011/07/20/python-hack-night-3/</feedburner:origLink></item>
		<item>
		<title>Surveying Mechanical Turk to Validate a Startup Idea</title>
		<link>http://feedproxy.google.com/~r/kurtgrandis/qQcH/~3/5k3_-jkC0OI/</link>
		<comments>http://kurtgrandis.com/blog/2011/02/01/surveying-mechanical-turk-to-validate-a-startup-idea/#comments</comments>
		<pubDate>Wed, 02 Feb 2011 03:36:59 +0000</pubDate>
		<dc:creator>kurt</dc:creator>
				<category><![CDATA[Agile]]></category>
		<category><![CDATA[Data]]></category>
		<category><![CDATA[Entrepreneurship]]></category>
		<category><![CDATA[market research]]></category>
		<category><![CDATA[mechanical turk]]></category>
		<category><![CDATA[mturk]]></category>
		<category><![CDATA[mvp]]></category>
		<category><![CDATA[startup]]></category>
		<category><![CDATA[survey]]></category>

		<guid isPermaLink="false">http://kurtgrandis.com/blog/?p=458</guid>
		<description><![CDATA[I was intrigued by Lindsey Harper&#8217;s post, &#8220;How I Used Amazon&#8217;s Mechanical Turk to Validate my Startup Idea.&#8221; If you&#8217;ve ever worked with market research firms, built your own panels, or have hit the pavement trying to collect your own market research you know it can be expensive and/or time consuming. The idea of having a broad [...]]]></description>
			<content:encoded><![CDATA[<p>I was intrigued by Lindsey Harper&#8217;s <a href="http://harperlindsey.com/2010/09/01/how-i-used-amazons-mechanical-turk-to-validate-my-startup-idea/" target="_blank">post</a>, &#8220;How I Used Amazon&#8217;s <em>Mechanical Turk</em> to Validate my Startup Idea.&#8221; If you&#8217;ve ever worked with market research firms, built your own panels, or have hit the pavement trying to collect your own market research you know it can be expensive and/or time consuming. The idea of having a broad and cheap sounding board available online was very appealing.</p>
<p>I figured I would give it a shot and run a few tests through the Mechanical Turk and see how it stacked up against some more traditional market research options. I grabbed my latest business idea&#8211;viability untested&#8211;and set off for Amazon.</p>
<h3><strong>Testing Business Viability</strong></h3>
<p><img class="size-medium wp-image-473  alignleft" style="margin-left: 5px; border: 0px initial initial;" title="Dude! We totally just made 15 cents" src="http://kurtgrandis.com/blog/wp-content/uploads/2010/10/kids_laptop-300x199.jpg" alt="Dude! We totally just made 15 cents" width="200" /></p>
<p>It&#8217;s worth noting the startup I was working on was a subscription-based consumer service geared towards parents of younger children and their grandparents. As Lindsey described in her article you get no segmentation or guaranteed panel refinement on Mechanical Turk so I was at the mercy of self-selection. I specified in the task description I was looking for parents of children of a certain age and let it go.</p>
<p>I posed some very basic demographic questions (e.g. gender, age(s) of their children, age). Once I had some basic information on the respondents I probed if they face the problem my service intends to solve. Once I described the service, the survey asked how likely they would be to use it and how likely they would be to recommend it to others. There were also a few service-specific questions, some open-ended responses including, &#8220;why would you not use the service,&#8221; and a general thoughts and feedback form.</p>
<p>I actually had some fancier survey question types than I cared to implement through Amazon&#8217;s Mechanical Turk API so instead I hosted the survey over at SurveyMonkey and had the respondents enter a confirmation code into MTurk upon completion.</p>
<p><strong>Results: Well look at that&#8230;</strong></p>
<p>Not bad. MTurkers ended up providing fairly similar answers to those I received in the wilds. After some light data trimming the data sets were very similar. Responses to the &#8220;How likely would you be to use this service&#8221; question were pretty similar between the MTurk panel and my other groups; statistically there was about an 80% chance the response groups were pulled from the same population. The response patterns were slightly shifted, but the overall outcome was the same.</p>
<p>The data trimming was done to account for a  larger than expected number of MTurk respondents who were very price conscientious. Their responses described ongoing harsh economic conditions, the need to save money, and other general hardships. These folks were generally not represented or targeted in my other surveys.</p>
<p>As a bonus, the optional open-ended responses given by MTurk respondents were thoughtful and very useful. I was not expecting this level of detail. The optional open-ended question about general thoughts and feedback elicited a 47% response rate with an average of 40 words per response. That mean came with a standard deviation of 32 words per response&#8211;there were some really thoughtful responses in there.</p>
<h3><strong>Semifinal Thoughts</strong></h3>
<p>Would I use Amazon&#8217;s Mechanical Turk for this purpose again? I think so. It seems to be a good way to get a general feel for your idea and certainly grab some helpful feedback. The responses I received led me to believe it was a very thoughtful community.</p>
<p>In no way am I endorsing a survey of this type to be the entirety of your market research. This is a cheap and easy way to get some feelers out there and validate that you&#8217;re not (too) crazy. In the end it is still very important to get out there yourself and talk with potential customers early on.</p>
<p><em>FYI: The result of this work has become <a href="http://www.glitterduck.com">GlitterDuck</a>. I am getting ready to start some pilot runs soon. If you are interested in learning more or becoming a beta tester please sign up over at the site.</em></p>
<img src="http://feeds.feedburner.com/~r/kurtgrandis/qQcH/~4/5k3_-jkC0OI" height="1" width="1"/>]]></content:encoded>
			<wfw:commentRss>http://kurtgrandis.com/blog/2011/02/01/surveying-mechanical-turk-to-validate-a-startup-idea/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		<feedburner:origLink>http://kurtgrandis.com/blog/2011/02/01/surveying-mechanical-turk-to-validate-a-startup-idea/</feedburner:origLink></item>
		<item>
		<title>Gitosis for Mercurial</title>
		<link>http://feedproxy.google.com/~r/kurtgrandis/qQcH/~3/FrECZDkX9IE/</link>
		<comments>http://kurtgrandis.com/blog/2010/03/20/gitosis-for-mercurial/#comments</comments>
		<pubDate>Sat, 20 Mar 2010 13:06:15 +0000</pubDate>
		<dc:creator>kurt</dc:creator>
				<category><![CDATA[Python]]></category>
		<category><![CDATA[git]]></category>
		<category><![CDATA[gitosis]]></category>
		<category><![CDATA[hg]]></category>
		<category><![CDATA[karmic]]></category>
		<category><![CDATA[lshift]]></category>
		<category><![CDATA[mercurial]]></category>
		<category><![CDATA[mercurial-server]]></category>
		<category><![CDATA[sharedkeys]]></category>
		<category><![CDATA[ssh]]></category>
		<category><![CDATA[ubuntu]]></category>

		<guid isPermaLink="false">http://kurtgrandis.com/blog/?p=411</guid>
		<description><![CDATA[As far as DVCSs go I&#8217;ve been a git user. That&#8217;s mostly because it was the first one I tried and it worked. I&#8217;ve been comfy and have enjoyed the world of git and GitHub, but a number of troublemakers have been trying to convince me to give Mercurial a shot. After some nudging I [...]]]></description>
			<content:encoded><![CDATA[<p>As far as DVCSs go I&#8217;ve been a git user. That&#8217;s mostly because it was the first one I tried and it worked. I&#8217;ve been comfy and have enjoyed the world of git and GitHub, but a number of troublemakers have been trying to convince me to give Mercurial a shot. After some nudging I obliged.</p>
<p>After a day or two of toy and experimental projects I started missing one of my primary git utilities&#8211;Gitosis. Gitosis is a package that lets you and all your collaborators interact with your git repositories using a single user account over SSH. Gitosis manages user authentication and permissioning using a system of  shared keys without ever exposing actual shell functionality.</p>
<p>It took me a little while to find <a href="http://www.lshift.net/mercurial-server.html">mercurial-server</a> by LShift, which seems to be Mercurial&#8217;s equivalent to Gitosis. So, here is how I got Gitosis-style shared key repository management to work with Mercurial.</p>
<h2>Installing Mercurial-Server on Ubuntu 9.10 (Karmic)</h2>
<p>Luckily, Paul Crowley of <a href="http://lshift.net">LShift</a>, the author of mercurial-server, has volunteered to manage a Debian package for Mercurial-Server, which makes our lives easier. Thanks!</p>
<h3>Install the Mercurial-Server Package</h3>
<p>Add the following line to your /etc/apt/sources.list file replacing the url with a <a href="http://packages.ubuntu.com/lucid/all/mercurial-server/download">mirror</a> that&#8217;s appropriate for your location:</p>
<pre class="bash:nocontrols:nogutter" name="code">deb http://mirrors.kernel.org/ubuntu lucid main universe</pre>
<div>then:</div>
<pre class="bash:nocontrols:nogutter" name="code">$ sudo apt-get update
$ sudo apt-get install mercurial mercurial-server</pre>
<p>OR, if you want to install the package manually outside of synaptics or apt you can download the .deb from <a href="http://packages.ubuntu.com/lucid/all/mercurial-server/download ">http://packages.ubuntu.com/lucid/all/mercurial-server/download</a> and then:</p>
<pre class="bash:nocontrols:nogutter" name="code">$ sudo dpkg -i mercurial-server_1.0.1-1_all.deb</pre>
<p>Mercurial-Server should now be installed. Additionally, a new user <em>hg</em> has been created and will be used to manage all your interactions with your mercurial repositories.</p>
<h3 style="font-size: 1.17em;">Setting Up Mercurial-Server Administrator (root)</h3>
<p>You now need to grant yourself administrator rights. All permissioning is done with keys, so you&#8217;ll need to copy your public key to mercurial-server&#8217;s admin keyring:</p>
<pre class="bash:nocontrols:nogutter" name="code">$ sudo cp id_rsa.pub /etc/mercurial-server/keys/root/YOURUSERNAME
$ sudo -u hg /usr/share/mercurial-server/refresh-auth</pre>
<p>The second command refreshes mercurial-server&#8217;s authentication system&#8211;authorizing your account as an administrator. You&#8217;re good to go!</p>
<h2 style="font-size: 1.5em;">Managing Mercurial-Server</h2>
<h3>The <em>hgadmin</em> Repository</h3>
<p>Just like gitosis&#8217; <em>gitosis-admin</em> repository, mercurial-server&#8217;s functionality can be managed via <em>hgadmin</em>. Go ahead and clone the repo:</p>
<pre class="bash:nocontrols:nogutter" name="code">$ hg clone ssh://hg@MyMercurialServer/hgadmin</pre>
<h3>Adding New Users</h3>
<p>With your <em>hgadmin</em> repository cloned you can now grant access to new users via their public keys</p>
<pre class="bash:nocontrols:nogutter" name="code">$ cd hgadmin
$ mkdir -p keys/users/
$ cp ~/kurt-key.pub keys/users/kurt
$ hg add
adding keys/users/kurt
$ hg commit -m "Added Kurt's public key"
$ hg push</pre>
<p>You can also allow and organize multiple keys per user. In that scenario you create a directory of keys for each user:</p>
<pre class="bash:nocontrols:nogutter" name="code">$ cd hgadmin
$ mkdir -p keys/users/kurt
$ cp ~/kurt-home.pub keys/users/kurt/home
$ cp ~/kurt-work.pub keys/users/kurt/work
$ hg add
adding keys/users/kurt/home
adding keys/users/kurt/work
$ hg commit -m "Added keys for Kurt's home and work computers"
$ hg push</pre>
<h3>Creating New Repositories</h3>
<p>As administrator, if you want to create a new repository you simple clone a mercurial project to a path on your mercurial-server. For example:</p>
<pre class="bash:nocontrols:nogutter" name="code">$ cd my_hg_proj
$ hg clone . ssh://hg@MyMercurialServer/my_hg_project</pre>
<p>Now you and your collaborators can clone, push, and pull from the server&#8217;s repository just as we did with <em>hgadmin</em>. For example:</p>
<pre class="bash:nocontrols:nogutter" name="code">$ hg clone ssh://hg@MyMercurialServer/my_hg_project</pre>
<h3>Managing Repository Permissions</h3>
<p>Now that you&#8217;ve created your repositories and added users you will want to manage permissions. Repository permissions can be managed through an <em>hgadmin</em> file called <em>access.conf</em>. I recommend reading the mercurial-server <a href="http://dev.lshift.net/paul/mercurial-server/docbook.html#id1318361">documentation</a> for more information on managing security.</p>
<p>So far I&#8217;ve found mercurial-server to be a great way to collaborate with others on private repositories outside of Bitbucket. My hat off to Paul Crowley and LShift.</p>
<img src="http://feeds.feedburner.com/~r/kurtgrandis/qQcH/~4/FrECZDkX9IE" height="1" width="1"/>]]></content:encoded>
			<wfw:commentRss>http://kurtgrandis.com/blog/2010/03/20/gitosis-for-mercurial/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		<feedburner:origLink>http://kurtgrandis.com/blog/2010/03/20/gitosis-for-mercurial/</feedburner:origLink></item>
		<item>
		<title>Get Your Nose Out Of There!</title>
		<link>http://feedproxy.google.com/~r/kurtgrandis/qQcH/~3/a_H96D2A4QU/</link>
		<comments>http://kurtgrandis.com/blog/2010/03/09/get-your-nose-out-of-there/#comments</comments>
		<pubDate>Tue, 09 Mar 2010 08:56:51 +0000</pubDate>
		<dc:creator>kurt</dc:creator>
				<category><![CDATA[Python]]></category>
		<category><![CDATA[directories]]></category>
		<category><![CDATA[nose]]></category>
		<category><![CDATA[nose-exclude]]></category>
		<category><![CDATA[nosetests]]></category>
		<category><![CDATA[plugin]]></category>
		<category><![CDATA[testing]]></category>

		<guid isPermaLink="false">http://kurtgrandis.com/blog/?p=377</guid>
		<description><![CDATA[I wrote my first Nose plugin this weekend and I&#8217;ve got to say it was dead simple.

I was looking around for ways to keep Nose from searching for tests in certain directories. You see Nose is a nosey little critter that will scour every nook and cranny of your directory structure looking for unittests to [...]]]></description>
			<content:encoded><![CDATA[<p>I wrote my first <a href="http://somethingaboutorange.com/mrl/projects/nose">Nose</a> plugin this weekend and I&#8217;ve got to say it was dead simple.</p>
<p><img class="alignleft size-full wp-image-380" src="http://kurtgrandis.com/blog/wp-content/uploads/2010/03/leash_kid2.jpg" alt="" width="146" height="269" /></p>
<p>I was looking around for ways to keep Nose from searching for tests in certain directories. You see Nose is a nosey little critter that will scour every nook and cranny of your directory structure looking for unittests to run. Really, it wants your code to work and it loves making dots. But, see I knew better and knew if that little Nose test discoverer ventured down a few rabbit holes it would end up in a world of pain&#8211;segfaults or worse. I just wanted to avoid the whole mess and just have Nose exclude a few directories from its massive testhunt.</p>
<p>I asked a few people I know who use Nose regularly about my options. &#8220;Write your own plugin,&#8221; was the consensus. Nose&#8217;s architecture makes it very easy to write plugins for just about every aspect of its behavior&#8230;check out its <a href="http://somethingaboutorange.com/mrl/projects/nose/doc/plugin_interface.html">plugin api</a>. The project documentation is also very helpful in this regard.</p>
<p>I spent most of my time trying to figure out how to test my testing plugin. In the end it only took a couple of hours to go from Nose novice to having written a packaged, testable Nose plugin. So, here&#8217;s a quick example of how you would use this new <em><strong>nose-exclude</strong> plugin</em>:</p>
<pre name="code" class="bash:nogutter:nocontrols"> $ ls test_dir
dir_with_tests    dir_with_bad_tests
there_be_dragons_here    more_tests</pre>
<p>In this example, I want Nose to ignore a couple directories and not even bother searching them. You would run:</p>
<pre name="code" class="bash:nogutter:nocontrols"> $ nosetests --exclude-dir=test_dir/dir_with_bad_tests \
 --exclude-dir=test_dir/there_be_dragons_here test_dir</pre>
<p>You could further specify to exclude subdirectories if you wanted that level of control. There is also an <em>&#8211;exclude-dir-file=</em> option available that allows you to specify a file containing paths to be excluded.</p>
<pre name="code" class="bash:nogutter:nocontrols">$ nosetests --exclude-dir-file=exclude_dirs.txt test_dir</pre>
<p><em>nose-exclude</em> is pretty simple and covers a fairly basic use case so hopefully others will find it useful. For now <em>nose-exclude</em> is available on <a href="http://bitbucket.org/kgrandis/nose-exclude">bitbucket</a>, but will be up on PyPI shortly.</p>
<img src="http://feeds.feedburner.com/~r/kurtgrandis/qQcH/~4/a_H96D2A4QU" height="1" width="1"/>]]></content:encoded>
			<wfw:commentRss>http://kurtgrandis.com/blog/2010/03/09/get-your-nose-out-of-there/feed/</wfw:commentRss>
		<slash:comments>1</slash:comments>
		<feedburner:origLink>http://kurtgrandis.com/blog/2010/03/09/get-your-nose-out-of-there/</feedburner:origLink></item>
		<item>
		<title>Python + Django vs. C# + ASP.NET: Productivity Showdown</title>
		<link>http://feedproxy.google.com/~r/kurtgrandis/qQcH/~3/qHn6Ocpsmzs/</link>
		<comments>http://kurtgrandis.com/blog/2010/02/24/python-django-vs-c-asp-net-productivity-showdown/#comments</comments>
		<pubDate>Wed, 24 Feb 2010 07:33:57 +0000</pubDate>
		<dc:creator>kurt</dc:creator>
				<category><![CDATA[Agile]]></category>
		<category><![CDATA[Data]]></category>
		<category><![CDATA[Django]]></category>
		<category><![CDATA[Entrepreneurship]]></category>
		<category><![CDATA[Python]]></category>
		<category><![CDATA[asp.net]]></category>
		<category><![CDATA[c#]]></category>
		<category><![CDATA[storypoints]]></category>
		<category><![CDATA[velocity]]></category>

		<guid isPermaLink="false">http://kurtgrandis.com/blog/?p=148</guid>
		<description><![CDATA[People are often asking me how and why my department shifted from an ASP.NET environment to Django. I&#8217;ve finally gotten around to writing about the process leading up to our decision. I hope people out there find it useful in their own development groups and discussions.
Almost two years ago I was in a rather unlikely [...]]]></description>
			<content:encoded><![CDATA[<p>People are often asking me how and why my department shifted from an ASP.NET environment to Django. I&#8217;ve finally gotten around to writing about the process leading up to our decision. I hope people out there find it useful in their own development groups and discussions.</p>
<p>Almost two years ago I was in a rather unlikely situation in that I was running a software engineering department containing both a C# team and a Python team. The Python group was focused on building scientific computing and NLP-type applications, whereas the C# team was focused on building web applications.</p>
<p>A few of us Python folks in the department had already started playing around with Django&#8211;building internal web applications and projects outside of work. It did not take long for us to realize the power of Django and how quickly we were able to produce high-quality applications with little effort. This was my (strong) impression, but in order to propose a corporate platform shift I was going to need some data to support my claims.</p>
<p>It slowly dawned on me that I had a perfect test bed. Here we had two teams using different technology stacks within the same department. The same department. That means they shared the same development processes, project management tools, quality control measures, defect management processes. Everything was the same between these groups except for the technologies. Perfect! So like any good manager I turned my teams into unwitting guinea pigs.</p>
<h3>The Hypothesis</h3>
<p style="text-align: center;"><em>We can accomplish more with Python + Django than with C# + ASP.NET given the same amount of time without sacrificing quality</em></p>
<h3>Measuring Productivity</h3>
<p>For the sake of this study, I defined productivity as a normalized team velocity: how many story points were completed / developer / week. I record the normalized team velocity for each team&#8217;s sprint for later analysis.</p>
<p>For those of you unfamiliar with the concept story points I highly recommend Mike Cohn&#8217;s <a title="Agile Estimation and Planning" href="http://www.amazon.com/Agile-Estimating-Planning-Mike-Cohn/dp/0131479415">Agile Estimation and Planning</a>.</p>
<h3>WAIT! You can&#8217;t compare story points between teams!</h3>
<p>I hear this a lot. Yes, you can. The problem is that most people do not bother creating a common scale or continually calibrate their estimations (within or between groups). Generally, it&#8217;s way more work than most groups need to deal with and it doesn&#8217;t deliver much utility to most groups so it isn&#8217;t often discussed or practiced.</p>
<p>The methods described below should outline the additional calibration work that was performed to ensure a common estimation scale between the two teams.</p>
<h3>Methods</h3>
<p>Both teams continued business as usual working on projects in parallel. Each sprint consisted of 3-4 developers. It is worth noting that Team ASP.NET did not make use of MS MVC Framework, but they did use Linq-to-SQL for its ORMy powers.</p>
<p>Special care was taken to maintain linkage between the two team&#8217;s effort estimates. During sprint planning, each team would use a common story point calibration reference when making estimates. In order to detect any potential deviations in calibration, during several planning poker sessions I included stories that had already been estimated during previous sprints or by the other team; no significant deviations were found.</p>
<p>At the end of each sprint I would calculate the normalized developer velocity ( # of completed story points / developer / week ). These values were recorded for both teams. It should be noted that only Django-based sprints were used in analysis for Team Python.</p>
<p>I recorded results for approximately 6 months.</p>
<h3>Results</h3>
<div id="attachment_261" class="wp-caption alignnone" style="width: 497px"><a rel="attachment wp-att-261" href="http://kurtgrandis.com/blog/2010/02/24/python-django-vs-c-asp-net-productivity-showdown/django_asp_histo-2/"><img class="size-full wp-image-261   " title="Normalized Developer Velocities: C# + ASP.NET and Python + Django" src="http://kurtgrandis.com/blog/wp-content/uploads/2010/02/django_asp_histo1.png" alt="Normalized Sprint Velocities: C# + ASP.NET and Python + Django" width="487" height="367" /></a><p class="wp-caption-text">Normalized Developer Velocities: C# + ASP.NET and Python + Django</p></div>
<p>The above histogram shows the distribution of normalized velocities associated with each completed sprint. The table below summarizes the distribution of velocities associated each team.</p>
<table style="height: 150px;" border="1" width="470">
<tbody>
<tr style="text-align: center;">
<td style="text-align: left;">units:<br />
story points /<br />
developer /<br />
week</td>
<th>C#/ASP.NET</th>
<th>Python/Django</th>
</tr>
<tr style="text-align: center;">
<th style="text-align: left;">mean</th>
<th>5.8</th>
<th>11.6</th>
</tr>
<tr style="text-align: center;">
<td style="text-align: left;">stdev</td>
<td>2.9</td>
<td>2.7</td>
</tr>
<tr style="text-align: center;">
<td style="text-align: left;">min</td>
<td>.3</td>
<td>8.5</td>
</tr>
<tr style="text-align: center;">
<td style="text-align: left;">max</td>
<td>9.3</td>
<td>15.8</td>
</tr>
</tbody>
<caption>Summary statistics of each team&#8217;s normalized developer velocities</caption>
</table>
<p>The distribution of velocities between the two samples are similarly shaped, but have clear differences in their mean. <strong>The average velocity of a  C#/ASP.NET developer was found to be 5.8 story points/week. A Python/Django developer has an average velocity of 11.6 story points/week. Independent t-tests reveal these differences as being statistically significant (t(15) = 4.19, p&lt;7.8e-4).</strong></p>
<h3><strong>Discussions and Conclusion</strong></h3>
<p>Given our development processes <strong>we found the average productivity of a single Django developer to be equivalent to the output generated by two C# ASP.NET developers. Given equal-sized teams, Django allowed our developers to be twice as productive as our ASP.NET team.</strong></p>
<p>I suspect these results may actually reflect a lower bound of the productivity differences. It should be noted that about half of the Team Python developers, while fluent in Python, had not used Django before. They quickly learned Django, but it is possible this fluency disparity may have caused an unintended bias in results&#8211;handicapping overall Django velocity.</p>
<h3>Epilogue</h3>
<p>The productivity differences quantified by our findings were then included as part of an overall rationale to shift web-based development platforms. Along with overall velocity differences, the costs associated with maintaining each environment were considered: OS licensing and database licensing for development and production environments, as well as costs associated with development tools. I&#8217;m happy to say we are now a Python and Django shop.</p>
<p><strong>Updated:</strong></p>
<p>Several good questions over at <a href="http://news.ycombinator.com/item?id=1148748">Hacker News</a></p>
<img src="http://feeds.feedburner.com/~r/kurtgrandis/qQcH/~4/qHn6Ocpsmzs" height="1" width="1"/>]]></content:encoded>
			<wfw:commentRss>http://kurtgrandis.com/blog/2010/02/24/python-django-vs-c-asp-net-productivity-showdown/feed/</wfw:commentRss>
		<slash:comments>15</slash:comments>
		<feedburner:origLink>http://kurtgrandis.com/blog/2010/02/24/python-django-vs-c-asp-net-productivity-showdown/</feedburner:origLink></item>
		<item>
		<title>Fabric Presentation</title>
		<link>http://feedproxy.google.com/~r/kurtgrandis/qQcH/~3/TbRF9espeDc/</link>
		<comments>http://kurtgrandis.com/blog/2010/01/30/fabric-presentation/#comments</comments>
		<pubDate>Sun, 31 Jan 2010 04:35:01 +0000</pubDate>
		<dc:creator>kurt</dc:creator>
				<category><![CDATA[Django]]></category>
		<category><![CDATA[Python]]></category>
		<category><![CDATA[fabric]]></category>
		<category><![CDATA[mallet]]></category>
		<category><![CDATA[rpath]]></category>
		<category><![CDATA[trizpug]]></category>

		<guid isPermaLink="false">http://kurtgrandis.com/blog/?p=220</guid>
		<description><![CDATA[This past Thursday I gave a presentation on Fabric for TriZPUG. I want to thank everyone for their comments and appreciation. We had a great attendance and good discussions.
I presented Fabric as a tool that I use for automated deployment and maintenance of servers. I can publish and update multiple servers with differential instructions based on their [...]]]></description>
			<content:encoded><![CDATA[<p><img class="alignleft size-full wp-image-226" style="margin-right: 15px;" title="loom" src="http://kurtgrandis.com/blog/wp-content/uploads/2010/01/loom.jpg" alt="loom" width="250" height="166" />This past Thursday I gave a presentation on <a href="http://fabfile.org">Fabric</a> for <a href="http://trizpug.org">TriZPUG</a>. I want to thank everyone for their comments and appreciation. We had a great attendance and good discussions.</p>
<p>I presented Fabric as a tool that I use for automated deployment and maintenance of servers. I can publish and update multiple servers with differential instructions based on their defined roles (e.g. Apache web server, MySQL database server, Nginx server, etc.). We briefly touched on some other cool things you can do like database maintenance, database dumps, backups, Django contribs for remotely working with Model objects, and even toggling maintenance modes for your website.</p>
<p>The next part of the presentation dealt with another use I&#8217;ve found for Fabric: bootstrapping a server. The ease of automating distributed systems made Fabric an ideal tool for lightweight configuration of a newly installed OS. Go ahead and have it apt-get/yum/emerge whatever packages are going to be required&#8211;again as specified by its defined role. For instance, I have a few fabfiles that will prep an Ubuntu or a RHEL servers for serving Django apps with Nginx, Apache+mod_wsgi, and MySQL.</p>
<p>So, the most common questions and comments I&#8217;ve received have been along the lines of &#8220;Why not just build packages and meta packages for each server configuration?&#8221; This is absolutely an approach that one could take and a powerful one at that. I&#8217;ll be the first to admit I am not a packaging whiz so the thought of building a slew of .debs and then maybe parallel .rpms if we have to migrate to a new platform based on the client or project is not super appealing, but luckily I work with people smarter than myself who enjoy that sort of thing.</p>
<p>The sweet spot I&#8217;ve found for bootstrapping servers with Fabric is where your server configuration may not be final, the project maybe short term, you may still have to switch between distros, and you do not have access to VMs that can be cloned.  Fabric is lightweight and available for your more ephemeral projects that may not necessitate the effort required to build custom packages.</p>
<p>For instance, one place Fabric is handy is prepping Amazon EC2 servers for quick compute jobs. Now I could go ahead and create custom AMIs for every one-off project, but Fabric makes it easy to spin a server up and then bootstrap it with the required packages for a particular project. Nice and lightweight.</p>
<p>I would love to hear about other tools people are using out there. It was nice that after my presentation a bunch of people shared their tools and methods for bootstrapping servers. <a href="http://www.ogmaciel.com/">Og Maciel</a> and other rPathers demonstrated rPath&#8217;s <a href="http://rpath.org">rBuilder Online</a> and how it can be used to easily build packages and entire system images or VMs based on sets of packages and a few clicks. Tobias McNulty of the <a href="http://caktusgroup.com">Caktus Consulting Group</a> also demonstrated his work on <a href="http://bitbucket.org/tobias.mcnulty/mallet/">Mallet</a>, which can be used to quickly build and configure Debian-based servers. Mallet is also available through PyPI.</p>
<p>Overall a great turn out and I learned a lot. Thanks folks!</p>
<img src="http://feeds.feedburner.com/~r/kurtgrandis/qQcH/~4/TbRF9espeDc" height="1" width="1"/>]]></content:encoded>
			<wfw:commentRss>http://kurtgrandis.com/blog/2010/01/30/fabric-presentation/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		<feedburner:origLink>http://kurtgrandis.com/blog/2010/01/30/fabric-presentation/</feedburner:origLink></item>
		<item>
		<title>Triangle Django Sprint</title>
		<link>http://feedproxy.google.com/~r/kurtgrandis/qQcH/~3/FvwxhKbteuQ/</link>
		<comments>http://kurtgrandis.com/blog/2009/12/13/triangle-django-sprint/#comments</comments>
		<pubDate>Mon, 14 Dec 2009 01:48:13 +0000</pubDate>
		<dc:creator>kurt</dc:creator>
				<category><![CDATA[Django]]></category>
		<category><![CDATA[Local Business]]></category>
		<category><![CDATA[sprint]]></category>

		<guid isPermaLink="false">http://kurtgrandis.com/blog/?p=203</guid>
		<description><![CDATA[We had a nice turn out for the Triangle Django Sprint. Lots of first time Django sprinters and everyone dove right in.
Thanks again to the Caktus Consulting Group, Carrboro Creative Coworking, MetaMetrics, Capstrat, Karen, and everyone who showed up to make the event happen.
I managed to be perfectly eclipsed in this picture&#8230;
]]></description>
			<content:encoded><![CDATA[<p><a href="http://img131.imageshack.us/my.php?image=m1o.jpg" target="_blank"><img class="alignright" style="margin: 5px; border: 0px initial initial;" title="Django Sprint at Carborro Creative Coworking" src="http://img131.imageshack.us/img131/6987/m1o.jpg" border="0" alt="" width="346" height="259" /></a>We had a nice turn out for the Triangle Django Sprint. Lots of first time Django sprinters and everyone dove right in.</p>
<p>Thanks again to the Caktus Consulting Group, Carrboro Creative Coworking, MetaMetrics, Capstrat, Karen, and everyone who showed up to make the event happen.</p>
<p><span style="color: #808080;">I managed to be perfectly eclipsed in this picture&#8230;</span></p>
<img src="http://feeds.feedburner.com/~r/kurtgrandis/qQcH/~4/FvwxhKbteuQ" height="1" width="1"/>]]></content:encoded>
			<wfw:commentRss>http://kurtgrandis.com/blog/2009/12/13/triangle-django-sprint/feed/</wfw:commentRss>
		<slash:comments>2</slash:comments>
		<feedburner:origLink>http://kurtgrandis.com/blog/2009/12/13/triangle-django-sprint/</feedburner:origLink></item>
		<item>
		<title>Triangle Django Development Sprint</title>
		<link>http://feedproxy.google.com/~r/kurtgrandis/qQcH/~3/SV0Ay1FPenE/</link>
		<comments>http://kurtgrandis.com/blog/2009/12/03/triangle-django-development-sprint/#comments</comments>
		<pubDate>Fri, 04 Dec 2009 04:16:48 +0000</pubDate>
		<dc:creator>kurt</dc:creator>
				<category><![CDATA[Django]]></category>
		<category><![CDATA[Local Business]]></category>
		<category><![CDATA[Python]]></category>
		<category><![CDATA[caktus]]></category>
		<category><![CDATA[carborrocoworking]]></category>
		<category><![CDATA[metametrics]]></category>
		<category><![CDATA[sprint]]></category>
		<category><![CDATA[triangle]]></category>
		<category><![CDATA[tridjug]]></category>
		<category><![CDATA[trizpug]]></category>

		<guid isPermaLink="false">http://kurtgrandis.com/blog/?p=171</guid>
		<description><![CDATA[Come Work on Django!
We are organizing a Django sprint here in the Triangle on December 12th and 13th 2009 (Saturday &#38; Sunday). The sprint is being hosted by Caktus Consulting Group over at Carrboro Creative Coworking.
The goal is to get folks familiar with the Django development process and knock out some features and tickets associated [...]]]></description>
			<content:encoded><![CDATA[<h2><a rel="attachment wp-att-174" href="http://kurtgrandis.com/blog/2009/12/03/triangle-django-development-sprint/sprintsrawk/"><img class="size-medium wp-image-174 alignright" style="margin: 5px;" title="sprintsrawk" src="http://kurtgrandis.com/blog/wp-content/uploads/2009/12/sprintsrawk-221x300.jpg" alt="Sprints Rawk" width="177" height="240" /></a>Come Work on Django!</h2>
<p>We are organizing a Django sprint here in the Triangle on December 12th and 13th 2009 (Saturday &amp; Sunday). The sprint is being hosted by <a href="http://www.caktusgroup.com/">Caktus Consulting Group</a> over at <a href="http://www.carrborocoworking.com/">Carrboro Creative Coworking</a>.</p>
<p>The goal is to get folks familiar with the Django development process and knock out some features and tickets associated with the upcoming release of Django 1.2.</p>
<p>You can find more details on the <strong>Sprint Wiki:</strong> <a href="http://code.djangoproject.com/wiki/Sprint200912TriangleNC">http://code.djangoproject.com/wiki/Sprint200912TriangleNC</a></p>
<h3 style="text-align: center;"><a href="http://django-triangle-dec-09.eventbrite.com/">Sign Up Here&#8230;</a></h3>
<h3>Sponsors</h3>
<p>Thanks to <a href="http://www.caktusgroup.com/">Caktus Consulting Group</a>, <a href="http://www.carrborocoworking.com/">Carrboro Creative Coworking</a>, and <a href="http://metametricsinc.com">MetaMetrics</a> for helping sponsor this event.</p>
<p>Hope to see you there!</p>
<img src="http://feeds.feedburner.com/~r/kurtgrandis/qQcH/~4/SV0Ay1FPenE" height="1" width="1"/>]]></content:encoded>
			<wfw:commentRss>http://kurtgrandis.com/blog/2009/12/03/triangle-django-development-sprint/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		<feedburner:origLink>http://kurtgrandis.com/blog/2009/12/03/triangle-django-development-sprint/</feedburner:origLink></item>
		<item>
		<title>django-multidb, MySQLdb, and MySQL Encoding Errors</title>
		<link>http://feedproxy.google.com/~r/kurtgrandis/qQcH/~3/AA3aTMD1hh0/</link>
		<comments>http://kurtgrandis.com/blog/2009/12/03/django-multidb-mysqldb-and-mysql-encoding-errors/#comments</comments>
		<pubDate>Thu, 03 Dec 2009 07:57:01 +0000</pubDate>
		<dc:creator>kurt</dc:creator>
				<category><![CDATA[Django]]></category>
		<category><![CDATA[Python]]></category>
		<category><![CDATA[cp1252]]></category>
		<category><![CDATA[django-multidb]]></category>
		<category><![CDATA[encoding]]></category>
		<category><![CDATA[latin1]]></category>
		<category><![CDATA[mysql]]></category>
		<category><![CDATA[utf8]]></category>

		<guid isPermaLink="false">http://kurtgrandis.com/blog/?p=150</guid>
		<description><![CDATA[We recently ran into a bug involving improper encoding of Unicode data using Django, MySQL, and django-multidb. It took us a little while to track it down so I just wanted to take the opportunity to post a description of the problem and the resolution to help any others out there running into similar issues.
We [...]]]></description>
			<content:encoded><![CDATA[<p>We recently ran into a bug involving improper encoding of Unicode data using Django, MySQL, and django-multidb. It took us a little while to track it down so I just wanted to take the opportunity to post a description of the problem and the resolution to help any others out there running into similar issues.</p>
<p>We were anxiously looking forward to Alex Gaynor&#8217;s multidb efforts, but needed something in the near term to help our site scale. After looking at a few options, including building our own, we settled on Mike Malone&#8217;s django-multidb. I first heard about Mike&#8217;s <a href="http://github.com/mmalone/django-multidb">django-multidb</a> in his <a href="http://www.slideshare.net/mmalone/scaling-django-1393282">Scaling Django Presentation</a>. It was a perfect solution for our needs: it gave us the ability to manage master-slave databases within Django, it was very simple, and offered just the right amount of flexibility.</p>
<h3>The Problem</h3>
<p>We started receiving sporadic UnicodeEncodeErrors. The tracebacks were reporting that the system was unable to encode certain Unicode strings into <em>latin1</em>. <em>Latin1</em>? Who wants<em> latin1</em>? We use <em>utf8</em> as our standard character set for both Django and MySQL (client &amp; server).</p>
<p>So where was this <em>latin1</em> encoding request sneaking in from? No rogue .encode(&#8216;latin1&#8242;)s were popping up in codebase searches. The Django MySQL backend certainly looked like it was doing its job, but we had to validate that the cursors being generated were in fact being set with the appropriate charset. We followed the path back and eventually started intercepting a few MySQLdb cursors. Once we started debugging and probing cursors it became clear that they were in fact using <em>latin1</em> as the default character set.</p>
<h3>You keep using that word. I do not think it means what you think it means.</h3>
<p>I learned an interesting tidbit along the way that explains why it took us awhile to diagnose the problem. When you don&#8217;t specify a character set or encoding, MySQL&#8217;s default encoding is called &#8220;latin1&#8243;. Except by &#8220;latin1&#8243; MySQL does not mean &#8220;latin1&#8243; of ISO 8859-1 fame, but rather the Windows cp1252 code page. This occurs even though MySQL does know what cp1252 is and is fully capable of honoring that character set separately by name. <a href="http://dev.mysql.com/doc/refman/5.4/en/charset-we-sets.html">Really</a>.</p>
<p>So, imagine MySQLdb asking the MySQL server what charset it prefers and the server replies &#8220;latin1&#8243;. MySQLdb then says, &#8220;Awesome, I know latin1,&#8221; and they go on chatting and passing information. This works just fine until the MySQL server passes back a bytestring representing a string once stored in its database containing the Unicode entity U+2019 ( ’ ). This RIGHT SINGLE QUOTATION MARK can easily be encoded in <em>cp1252</em>, but it cannot be represented by <em>latin1</em> (The real ISO 8859-1 one). MySQLdb receives the <em>cp1252</em>-encoded bytestring and attempts to decode as if it were<em> latin1</em> and lo and behold it throws an exception for attempting the impossible.</p>
<p>Now imagine the encoding mess occurring within a SQL query. MySQLdb opens a connection with the server, agrees to communicate using the <em>latin1</em> charset, and then prepares to send a query containing a right single smart quote (U+2019). It takes the Unicode query string and attempts to <em>.encode(&#8216;latin1&#8242;)</em>.  BLAM! Encoding error.</p>
<h3>The Solution</h3>
<p>The problem ended up being an inconspicuous bug in django-multidb that restored Django&#8217;s backend cursor settings to system defaults, which resulted in any preferred character sets being ignored. The latin1-cp1252 confusion was then free to crop up.  I know many folks including myself looked right over the code and bug many times without noticing. No worries. Mike Malone has already patched the <a href="http://github.com/mmalone/django-multidb">django-multidb repository</a> over at github. So, at this point you just need to update your project with the latest django-multidb code and you should be good to go.</p>
<p>Regarding the MySQL-MySQLdb<em> latin1</em> debacle, it seems simple enough to make MySQLdb call MySQL&#8217;s bluff. Maybe another time&#8230;until then I think I will avoid this issue and stick with explicitly defining <em>utf8 </em>as my character set of choice.</p>
<img src="http://feeds.feedburner.com/~r/kurtgrandis/qQcH/~4/AA3aTMD1hh0" height="1" width="1"/>]]></content:encoded>
			<wfw:commentRss>http://kurtgrandis.com/blog/2009/12/03/django-multidb-mysqldb-and-mysql-encoding-errors/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		<feedburner:origLink>http://kurtgrandis.com/blog/2009/12/03/django-multidb-mysqldb-and-mysql-encoding-errors/</feedburner:origLink></item>
		<item>
		<title>Django in the Triangle</title>
		<link>http://feedproxy.google.com/~r/kurtgrandis/qQcH/~3/U_eJmD846Bk/</link>
		<comments>http://kurtgrandis.com/blog/2009/11/20/django-in-the-triangle/#comments</comments>
		<pubDate>Fri, 20 Nov 2009 07:12:40 +0000</pubDate>
		<dc:creator>kurt</dc:creator>
				<category><![CDATA[Django]]></category>
		<category><![CDATA[Local Business]]></category>
		<category><![CDATA[Python]]></category>
		<category><![CDATA[nc]]></category>
		<category><![CDATA[rtp]]></category>
		<category><![CDATA[trizpug]]></category>

		<guid isPermaLink="false">http://kurtgrandis.com/blog/?p=77</guid>
		<description><![CDATA[Jacob Kaplan-Moss recently wrote about the growing size of the Django community. It seems as though we are starting to feel some Django-related growing pains here in North Carolina&#8217;s Research Triangle Park. Given recent developments on the Triangle Zope &#38; Python User Group (TriZPUG) mailing list I thought I would take some time to discuss [...]]]></description>
			<content:encoded><![CDATA[<p style="text-align: left;">Jacob Kaplan-Moss recently wrote about the <a href="http://jacobian.org/writing/django-community-2009/" target="_blank">growing size of the Django community</a>. It seems as though we are starting to feel some Django-related growing pains here in North Carolina&#8217;s Research Triangle Park. Given recent developments on the Triangle Zope &amp; Python User Group (<a href="http://trizpug.org/">TriZPUG</a>) mailing list I thought I would take some time to discuss the current state of Django in the Triangle, who&#8217;s using it, and what is in the pipeline.</p>
<h2 style="text-align: left;"><a rel="attachment wp-att-79" href="http://kurtgrandis.com/blog/2009/11/20/django-in-the-triangle/django_jobgraph/"><img class="size-medium wp-image-79 alignright" title="Django Jobs Trend" src="http://kurtgrandis.com/blog/wp-content/uploads/2009/11/django_jobgraph.png" alt="Django Jobs in the US (Trend data provided by Indeed.com) " width="437" height="243" /></a></h2>
<h3 style="text-align: left;">Django&#8217;s growing popularity</h3>
<p>First off, it&#8217;s important to note that Django adoption is growing nationwide. The included chart shows the number of posted &#8220;Django&#8221; jobs found on Indeed.com over the past few years. Notice a trend? Jacob Kaplan-Moss estimates the Django community may have grown somewhere on the order of 2-3x from 2007 to 2009. I definitely believe it and wouldn&#8217;t be surprised if it were higher. Between the volume of phone calls from recruiters and the number of people I run into using or talking about Django its popularity is definitely on the rise in the Triangle.</p>
<h3>Django in Action</h3>
<p>Here&#8217;s a short list of shops in the Triangle who use Django in their day-to-day development:</p>
<ul>
<li><a href="http://lexile.com/">MetaMetrics</a> ( Lexile )</li>
<li><a href="http://caktusgroup.com">Caktus Consulting Group</a></li>
<li><a href="http://capstrat.com">Capstrat</a></li>
<li><a href="http://americanri.com">American Research Institute</a></li>
<li><a href="http://www.src.org/">Semiconductor Research Corporation</a></li>
<li><a href="http://viget.com">Viget Labs</a></li>
<li><a href="http://rpath.com">rPath</a></li>
</ul>
<p>I know there are other closeted folks out there using Django without full corporate blessing or knowledge. If there are other groups out there who would like to make this list please let me know.</p>
<h3>A Triangle Django Users Group?</h3>
<p>A new <a href="http://groups.google.com/group/tridjug">Google Group TriDjUG</a> (twitter: <a href="http://twitter.com/tridjug">@TriDjUG</a>) was recently created in order to help foster a healthy Django community. At the same time some good discussion erupted from the TriZPUG mailing list. Why bother splitting our local Python community? While the intention was never to split away, some good cases were made for operating under the umbrella of TriZPUG. Strengthen the Python community. One exciting sentiment that came from TriZPUG members was that non-Django Python users were interested in Django and wanted to learn more during regular TriZPUG meetings. That would give us a captive audience at an already catered and organized event. Sounds good.</p>
<p>Surely there is some Django-specific fun to be had&#8230; For starters, we&#8217;re looking to sponsor local Django-related sprints maybe including one for the upcoming Django 1.2 release. For our community building/growing merit badges a couple of us are developing a Django Bootcamp; let&#8217;s continue to grow.</p>
<p>So it sounds like it&#8217;s up to us local Djangonauts to step up, participate in TriZPUG, and build greater awareness. People want to hear about our technologies, so let&#8217;s share. If you have other ideas we&#8217;ld love to hear them. If you haven&#8217;t yet introduced yourself swing by the mailing list or irc (#trizpug) and say hello.</p>
<img src="http://feeds.feedburner.com/~r/kurtgrandis/qQcH/~4/U_eJmD846Bk" height="1" width="1"/>]]></content:encoded>
			<wfw:commentRss>http://kurtgrandis.com/blog/2009/11/20/django-in-the-triangle/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		<feedburner:origLink>http://kurtgrandis.com/blog/2009/11/20/django-in-the-triangle/</feedburner:origLink></item>
	</channel>
</rss><!-- Dynamic page generated in 0.409 seconds. --><!-- Cached page generated by WP-Super-Cache on 2012-02-03 17:16:40 -->

