<?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>Tue, 09 Mar 2010 08:56:51 +0000</lastBuildDate>
	<generator>http://wordpress.org/?v=2.8.4</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>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 class="bash"> $ 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 class="bash"> $ 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 class="bash">$ 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>
<!-- Social Bookmarking Reloaded BEGIN --><div class="social_bookmark"><em>Bookmarks:</em><br /><a class="social_img" onclick="window.open(this.href, '_blank', 'scrollbars=yes,menubar=no,border=0,height=600,width=750,resizable=yes,toolbar=no,location=no,status=no'); return false;" href="http://del.icio.us/post?url=http://kurtgrandis.com/blog/2010/03/09/get-your-nose-out-of-there/&amp;title=Get+Your+Nose+Out+Of+There%21" title="Add 'Get Your Nose Out Of There!' to Del.icio.us"><img src="http://kurtgrandis.com/blog/wp-content/plugins/social-bookmarking-reloaded/delicious.png" title="Add 'Get Your Nose Out Of There!' to Del.icio.us" alt="Add 'Get Your Nose Out Of There!' to Del.icio.us" /></a><a class="social_img" onclick="window.open(this.href, '_blank', 'scrollbars=yes,menubar=no,border=0,height=600,width=750,resizable=yes,toolbar=no,location=no,status=no'); return false;" href="http://digg.com/submit?phase=2&amp;url=http://kurtgrandis.com/blog/2010/03/09/get-your-nose-out-of-there/&amp;title=Get+Your+Nose+Out+Of+There%21" title="Add 'Get Your Nose Out Of There!' to digg"><img src="http://kurtgrandis.com/blog/wp-content/plugins/social-bookmarking-reloaded/digg.png" title="Add 'Get Your Nose Out Of There!' to digg" alt="Add 'Get Your Nose Out Of There!' to digg" /></a><a class="social_img" onclick="window.open(this.href, '_blank', 'scrollbars=yes,menubar=no,border=0,height=600,width=750,resizable=yes,toolbar=no,location=no,status=no'); return false;" href="http://reddit.com/submit?url=http://kurtgrandis.com/blog/2010/03/09/get-your-nose-out-of-there/&amp;title=Get+Your+Nose+Out+Of+There%21" title="Add 'Get Your Nose Out Of There!' to reddit"><img src="http://kurtgrandis.com/blog/wp-content/plugins/social-bookmarking-reloaded/reddit.png" title="Add 'Get Your Nose Out Of There!' to reddit" alt="Add 'Get Your Nose Out Of There!' to reddit" /></a><a class="social_img" onclick="window.open(this.href, '_blank', 'scrollbars=yes,menubar=no,border=0,height=600,width=750,resizable=yes,toolbar=no,location=no,status=no'); return false;" href="http://www.technorati.com/faves?add=http://kurtgrandis.com/blog/2010/03/09/get-your-nose-out-of-there/" title="Add 'Get Your Nose Out Of There!' to Technorati"><img src="http://kurtgrandis.com/blog/wp-content/plugins/social-bookmarking-reloaded/technorati.png" title="Add 'Get Your Nose Out Of There!' to Technorati" alt="Add 'Get Your Nose Out Of There!' to Technorati" /></a><a class="social_img" onclick="window.open(this.href, '_blank', 'scrollbars=yes,menubar=no,border=0,height=600,width=750,resizable=yes,toolbar=no,location=no,status=no'); return false;" href="http://www.stumbleupon.com/submit?url=http://kurtgrandis.com/blog/2010/03/09/get-your-nose-out-of-there/&amp;title=Get+Your+Nose+Out+Of+There%21" title="Add 'Get Your Nose Out Of There!' to Stumble Upon"><img src="http://kurtgrandis.com/blog/wp-content/plugins/social-bookmarking-reloaded/stumbleupon.png" title="Add 'Get Your Nose Out Of There!' to Stumble Upon" alt="Add 'Get Your Nose Out Of There!' to Stumble Upon" /></a><a class="social_img" onclick="window.open(this.href, '_blank', 'scrollbars=yes,menubar=no,border=0,height=600,width=750,resizable=yes,toolbar=no,location=no,status=no'); return false;" href="http://www.google.com/bookmarks/mark?op=edit&amp;output=popup&amp;bkmk=http://kurtgrandis.com/blog/2010/03/09/get-your-nose-out-of-there/&amp;title=Get+Your+Nose+Out+Of+There%21" title="Add 'Get Your Nose Out Of There!' to Google Bookmarks"><img src="http://kurtgrandis.com/blog/wp-content/plugins/social-bookmarking-reloaded/google.png" title="Add 'Get Your Nose Out Of There!' to Google Bookmarks" alt="Add 'Get Your Nose Out Of There!' to Google Bookmarks" /></a><a class="social_img" onclick="window.open(this.href, '_blank', 'scrollbars=yes,menubar=no,border=0,height=600,width=750,resizable=yes,toolbar=no,location=no,status=no'); return false;" href="http://slashdot.org/bookmark.pl?title=Get+Your+Nose+Out+Of+There%21&amp;url=http://kurtgrandis.com/blog/2010/03/09/get-your-nose-out-of-there/" title="Add 'Get Your Nose Out Of There!' to SlashDot"><img src="http://kurtgrandis.com/blog/wp-content/plugins/social-bookmarking-reloaded/slashdot.png" title="Add 'Get Your Nose Out Of There!' to SlashDot" alt="Add 'Get Your Nose Out Of There!' to SlashDot" /></a><a class="social_img" onclick="window.open(this.href, '_blank', 'scrollbars=yes,menubar=no,border=0,height=600,width=750,resizable=yes,toolbar=no,location=no,status=no'); return false;" href="http://twitter.com/home?status=http://kurtgrandis.com/blog/2010/03/09/get-your-nose-out-of-there/" title="Add 'Get Your Nose Out Of There!' to Twitter"><img src="http://kurtgrandis.com/blog/wp-content/plugins/social-bookmarking-reloaded/twitter.png" title="Add 'Get Your Nose Out Of There!' to Twitter" alt="Add 'Get Your Nose Out Of There!' to Twitter" /></a></div>
<!-- Social Bookmarking Reloaded END --><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>0</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><br/><br />
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>
<!-- Social Bookmarking Reloaded BEGIN --><div class="social_bookmark"><em>Bookmarks:</em><br /><a class="social_img" onclick="window.open(this.href, '_blank', 'scrollbars=yes,menubar=no,border=0,height=600,width=750,resizable=yes,toolbar=no,location=no,status=no'); return false;" href="http://del.icio.us/post?url=http://kurtgrandis.com/blog/2010/02/24/python-django-vs-c-asp-net-productivity-showdown/&amp;title=Python+%2B+Django+vs.+C%23+%2B+ASP.NET%3A+Productivity+Showdown" title="Add 'Python + Django vs. C# + ASP.NET: Productivity Showdown' to Del.icio.us"><img src="http://kurtgrandis.com/blog/wp-content/plugins/social-bookmarking-reloaded/delicious.png" title="Add 'Python + Django vs. C# + ASP.NET: Productivity Showdown' to Del.icio.us" alt="Add 'Python + Django vs. C# + ASP.NET: Productivity Showdown' to Del.icio.us" /></a><a class="social_img" onclick="window.open(this.href, '_blank', 'scrollbars=yes,menubar=no,border=0,height=600,width=750,resizable=yes,toolbar=no,location=no,status=no'); return false;" href="http://digg.com/submit?phase=2&amp;url=http://kurtgrandis.com/blog/2010/02/24/python-django-vs-c-asp-net-productivity-showdown/&amp;title=Python+%2B+Django+vs.+C%23+%2B+ASP.NET%3A+Productivity+Showdown" title="Add 'Python + Django vs. C# + ASP.NET: Productivity Showdown' to digg"><img src="http://kurtgrandis.com/blog/wp-content/plugins/social-bookmarking-reloaded/digg.png" title="Add 'Python + Django vs. C# + ASP.NET: Productivity Showdown' to digg" alt="Add 'Python + Django vs. C# + ASP.NET: Productivity Showdown' to digg" /></a><a class="social_img" onclick="window.open(this.href, '_blank', 'scrollbars=yes,menubar=no,border=0,height=600,width=750,resizable=yes,toolbar=no,location=no,status=no'); return false;" href="http://reddit.com/submit?url=http://kurtgrandis.com/blog/2010/02/24/python-django-vs-c-asp-net-productivity-showdown/&amp;title=Python+%2B+Django+vs.+C%23+%2B+ASP.NET%3A+Productivity+Showdown" title="Add 'Python + Django vs. C# + ASP.NET: Productivity Showdown' to reddit"><img src="http://kurtgrandis.com/blog/wp-content/plugins/social-bookmarking-reloaded/reddit.png" title="Add 'Python + Django vs. C# + ASP.NET: Productivity Showdown' to reddit" alt="Add 'Python + Django vs. C# + ASP.NET: Productivity Showdown' to reddit" /></a><a class="social_img" onclick="window.open(this.href, '_blank', 'scrollbars=yes,menubar=no,border=0,height=600,width=750,resizable=yes,toolbar=no,location=no,status=no'); return false;" href="http://www.technorati.com/faves?add=http://kurtgrandis.com/blog/2010/02/24/python-django-vs-c-asp-net-productivity-showdown/" title="Add 'Python + Django vs. C# + ASP.NET: Productivity Showdown' to Technorati"><img src="http://kurtgrandis.com/blog/wp-content/plugins/social-bookmarking-reloaded/technorati.png" title="Add 'Python + Django vs. C# + ASP.NET: Productivity Showdown' to Technorati" alt="Add 'Python + Django vs. C# + ASP.NET: Productivity Showdown' to Technorati" /></a><a class="social_img" onclick="window.open(this.href, '_blank', 'scrollbars=yes,menubar=no,border=0,height=600,width=750,resizable=yes,toolbar=no,location=no,status=no'); return false;" href="http://www.stumbleupon.com/submit?url=http://kurtgrandis.com/blog/2010/02/24/python-django-vs-c-asp-net-productivity-showdown/&amp;title=Python+%2B+Django+vs.+C%23+%2B+ASP.NET%3A+Productivity+Showdown" title="Add 'Python + Django vs. C# + ASP.NET: Productivity Showdown' to Stumble Upon"><img src="http://kurtgrandis.com/blog/wp-content/plugins/social-bookmarking-reloaded/stumbleupon.png" title="Add 'Python + Django vs. C# + ASP.NET: Productivity Showdown' to Stumble Upon" alt="Add 'Python + Django vs. C# + ASP.NET: Productivity Showdown' to Stumble Upon" /></a><a class="social_img" onclick="window.open(this.href, '_blank', 'scrollbars=yes,menubar=no,border=0,height=600,width=750,resizable=yes,toolbar=no,location=no,status=no'); return false;" href="http://www.google.com/bookmarks/mark?op=edit&amp;output=popup&amp;bkmk=http://kurtgrandis.com/blog/2010/02/24/python-django-vs-c-asp-net-productivity-showdown/&amp;title=Python+%2B+Django+vs.+C%23+%2B+ASP.NET%3A+Productivity+Showdown" title="Add 'Python + Django vs. C# + ASP.NET: Productivity Showdown' to Google Bookmarks"><img src="http://kurtgrandis.com/blog/wp-content/plugins/social-bookmarking-reloaded/google.png" title="Add 'Python + Django vs. C# + ASP.NET: Productivity Showdown' to Google Bookmarks" alt="Add 'Python + Django vs. C# + ASP.NET: Productivity Showdown' to Google Bookmarks" /></a><a class="social_img" onclick="window.open(this.href, '_blank', 'scrollbars=yes,menubar=no,border=0,height=600,width=750,resizable=yes,toolbar=no,location=no,status=no'); return false;" href="http://slashdot.org/bookmark.pl?title=Python+%2B+Django+vs.+C%23+%2B+ASP.NET%3A+Productivity+Showdown&amp;url=http://kurtgrandis.com/blog/2010/02/24/python-django-vs-c-asp-net-productivity-showdown/" title="Add 'Python + Django vs. C# + ASP.NET: Productivity Showdown' to SlashDot"><img src="http://kurtgrandis.com/blog/wp-content/plugins/social-bookmarking-reloaded/slashdot.png" title="Add 'Python + Django vs. C# + ASP.NET: Productivity Showdown' to SlashDot" alt="Add 'Python + Django vs. C# + ASP.NET: Productivity Showdown' to SlashDot" /></a><a class="social_img" onclick="window.open(this.href, '_blank', 'scrollbars=yes,menubar=no,border=0,height=600,width=750,resizable=yes,toolbar=no,location=no,status=no'); return false;" href="http://twitter.com/home?status=http://kurtgrandis.com/blog/2010/02/24/python-django-vs-c-asp-net-productivity-showdown/" title="Add 'Python + Django vs. C# + ASP.NET: Productivity Showdown' to Twitter"><img src="http://kurtgrandis.com/blog/wp-content/plugins/social-bookmarking-reloaded/twitter.png" title="Add 'Python + Django vs. C# + ASP.NET: Productivity Showdown' to Twitter" alt="Add 'Python + Django vs. C# + ASP.NET: Productivity Showdown' to Twitter" /></a></div>
<!-- Social Bookmarking Reloaded END --><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>2</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>
<!-- Social Bookmarking Reloaded BEGIN --><div class="social_bookmark"><em>Bookmarks:</em><br /><a class="social_img" onclick="window.open(this.href, '_blank', 'scrollbars=yes,menubar=no,border=0,height=600,width=750,resizable=yes,toolbar=no,location=no,status=no'); return false;" href="http://del.icio.us/post?url=http://kurtgrandis.com/blog/2010/01/30/fabric-presentation/&amp;title=Fabric+Presentation" title="Add 'Fabric Presentation' to Del.icio.us"><img src="http://kurtgrandis.com/blog/wp-content/plugins/social-bookmarking-reloaded/delicious.png" title="Add 'Fabric Presentation' to Del.icio.us" alt="Add 'Fabric Presentation' to Del.icio.us" /></a><a class="social_img" onclick="window.open(this.href, '_blank', 'scrollbars=yes,menubar=no,border=0,height=600,width=750,resizable=yes,toolbar=no,location=no,status=no'); return false;" href="http://digg.com/submit?phase=2&amp;url=http://kurtgrandis.com/blog/2010/01/30/fabric-presentation/&amp;title=Fabric+Presentation" title="Add 'Fabric Presentation' to digg"><img src="http://kurtgrandis.com/blog/wp-content/plugins/social-bookmarking-reloaded/digg.png" title="Add 'Fabric Presentation' to digg" alt="Add 'Fabric Presentation' to digg" /></a><a class="social_img" onclick="window.open(this.href, '_blank', 'scrollbars=yes,menubar=no,border=0,height=600,width=750,resizable=yes,toolbar=no,location=no,status=no'); return false;" href="http://reddit.com/submit?url=http://kurtgrandis.com/blog/2010/01/30/fabric-presentation/&amp;title=Fabric+Presentation" title="Add 'Fabric Presentation' to reddit"><img src="http://kurtgrandis.com/blog/wp-content/plugins/social-bookmarking-reloaded/reddit.png" title="Add 'Fabric Presentation' to reddit" alt="Add 'Fabric Presentation' to reddit" /></a><a class="social_img" onclick="window.open(this.href, '_blank', 'scrollbars=yes,menubar=no,border=0,height=600,width=750,resizable=yes,toolbar=no,location=no,status=no'); return false;" href="http://www.technorati.com/faves?add=http://kurtgrandis.com/blog/2010/01/30/fabric-presentation/" title="Add 'Fabric Presentation' to Technorati"><img src="http://kurtgrandis.com/blog/wp-content/plugins/social-bookmarking-reloaded/technorati.png" title="Add 'Fabric Presentation' to Technorati" alt="Add 'Fabric Presentation' to Technorati" /></a><a class="social_img" onclick="window.open(this.href, '_blank', 'scrollbars=yes,menubar=no,border=0,height=600,width=750,resizable=yes,toolbar=no,location=no,status=no'); return false;" href="http://www.stumbleupon.com/submit?url=http://kurtgrandis.com/blog/2010/01/30/fabric-presentation/&amp;title=Fabric+Presentation" title="Add 'Fabric Presentation' to Stumble Upon"><img src="http://kurtgrandis.com/blog/wp-content/plugins/social-bookmarking-reloaded/stumbleupon.png" title="Add 'Fabric Presentation' to Stumble Upon" alt="Add 'Fabric Presentation' to Stumble Upon" /></a><a class="social_img" onclick="window.open(this.href, '_blank', 'scrollbars=yes,menubar=no,border=0,height=600,width=750,resizable=yes,toolbar=no,location=no,status=no'); return false;" href="http://www.google.com/bookmarks/mark?op=edit&amp;output=popup&amp;bkmk=http://kurtgrandis.com/blog/2010/01/30/fabric-presentation/&amp;title=Fabric+Presentation" title="Add 'Fabric Presentation' to Google Bookmarks"><img src="http://kurtgrandis.com/blog/wp-content/plugins/social-bookmarking-reloaded/google.png" title="Add 'Fabric Presentation' to Google Bookmarks" alt="Add 'Fabric Presentation' to Google Bookmarks" /></a><a class="social_img" onclick="window.open(this.href, '_blank', 'scrollbars=yes,menubar=no,border=0,height=600,width=750,resizable=yes,toolbar=no,location=no,status=no'); return false;" href="http://slashdot.org/bookmark.pl?title=Fabric+Presentation&amp;url=http://kurtgrandis.com/blog/2010/01/30/fabric-presentation/" title="Add 'Fabric Presentation' to SlashDot"><img src="http://kurtgrandis.com/blog/wp-content/plugins/social-bookmarking-reloaded/slashdot.png" title="Add 'Fabric Presentation' to SlashDot" alt="Add 'Fabric Presentation' to SlashDot" /></a><a class="social_img" onclick="window.open(this.href, '_blank', 'scrollbars=yes,menubar=no,border=0,height=600,width=750,resizable=yes,toolbar=no,location=no,status=no'); return false;" href="http://twitter.com/home?status=http://kurtgrandis.com/blog/2010/01/30/fabric-presentation/" title="Add 'Fabric Presentation' to Twitter"><img src="http://kurtgrandis.com/blog/wp-content/plugins/social-bookmarking-reloaded/twitter.png" title="Add 'Fabric Presentation' to Twitter" alt="Add 'Fabric Presentation' to Twitter" /></a></div>
<!-- Social Bookmarking Reloaded END --><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;
Bookmarks:
]]></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>
<!-- Social Bookmarking Reloaded BEGIN --><div class="social_bookmark"><em>Bookmarks:</em><br /><a class="social_img" onclick="window.open(this.href, '_blank', 'scrollbars=yes,menubar=no,border=0,height=600,width=750,resizable=yes,toolbar=no,location=no,status=no'); return false;" href="http://del.icio.us/post?url=http://kurtgrandis.com/blog/2009/12/13/triangle-django-sprint/&amp;title=Triangle+Django+Sprint" title="Add 'Triangle Django Sprint' to Del.icio.us"><img src="http://kurtgrandis.com/blog/wp-content/plugins/social-bookmarking-reloaded/delicious.png" title="Add 'Triangle Django Sprint' to Del.icio.us" alt="Add 'Triangle Django Sprint' to Del.icio.us" /></a><a class="social_img" onclick="window.open(this.href, '_blank', 'scrollbars=yes,menubar=no,border=0,height=600,width=750,resizable=yes,toolbar=no,location=no,status=no'); return false;" href="http://digg.com/submit?phase=2&amp;url=http://kurtgrandis.com/blog/2009/12/13/triangle-django-sprint/&amp;title=Triangle+Django+Sprint" title="Add 'Triangle Django Sprint' to digg"><img src="http://kurtgrandis.com/blog/wp-content/plugins/social-bookmarking-reloaded/digg.png" title="Add 'Triangle Django Sprint' to digg" alt="Add 'Triangle Django Sprint' to digg" /></a><a class="social_img" onclick="window.open(this.href, '_blank', 'scrollbars=yes,menubar=no,border=0,height=600,width=750,resizable=yes,toolbar=no,location=no,status=no'); return false;" href="http://reddit.com/submit?url=http://kurtgrandis.com/blog/2009/12/13/triangle-django-sprint/&amp;title=Triangle+Django+Sprint" title="Add 'Triangle Django Sprint' to reddit"><img src="http://kurtgrandis.com/blog/wp-content/plugins/social-bookmarking-reloaded/reddit.png" title="Add 'Triangle Django Sprint' to reddit" alt="Add 'Triangle Django Sprint' to reddit" /></a><a class="social_img" onclick="window.open(this.href, '_blank', 'scrollbars=yes,menubar=no,border=0,height=600,width=750,resizable=yes,toolbar=no,location=no,status=no'); return false;" href="http://www.technorati.com/faves?add=http://kurtgrandis.com/blog/2009/12/13/triangle-django-sprint/" title="Add 'Triangle Django Sprint' to Technorati"><img src="http://kurtgrandis.com/blog/wp-content/plugins/social-bookmarking-reloaded/technorati.png" title="Add 'Triangle Django Sprint' to Technorati" alt="Add 'Triangle Django Sprint' to Technorati" /></a><a class="social_img" onclick="window.open(this.href, '_blank', 'scrollbars=yes,menubar=no,border=0,height=600,width=750,resizable=yes,toolbar=no,location=no,status=no'); return false;" href="http://www.stumbleupon.com/submit?url=http://kurtgrandis.com/blog/2009/12/13/triangle-django-sprint/&amp;title=Triangle+Django+Sprint" title="Add 'Triangle Django Sprint' to Stumble Upon"><img src="http://kurtgrandis.com/blog/wp-content/plugins/social-bookmarking-reloaded/stumbleupon.png" title="Add 'Triangle Django Sprint' to Stumble Upon" alt="Add 'Triangle Django Sprint' to Stumble Upon" /></a><a class="social_img" onclick="window.open(this.href, '_blank', 'scrollbars=yes,menubar=no,border=0,height=600,width=750,resizable=yes,toolbar=no,location=no,status=no'); return false;" href="http://www.google.com/bookmarks/mark?op=edit&amp;output=popup&amp;bkmk=http://kurtgrandis.com/blog/2009/12/13/triangle-django-sprint/&amp;title=Triangle+Django+Sprint" title="Add 'Triangle Django Sprint' to Google Bookmarks"><img src="http://kurtgrandis.com/blog/wp-content/plugins/social-bookmarking-reloaded/google.png" title="Add 'Triangle Django Sprint' to Google Bookmarks" alt="Add 'Triangle Django Sprint' to Google Bookmarks" /></a><a class="social_img" onclick="window.open(this.href, '_blank', 'scrollbars=yes,menubar=no,border=0,height=600,width=750,resizable=yes,toolbar=no,location=no,status=no'); return false;" href="http://slashdot.org/bookmark.pl?title=Triangle+Django+Sprint&amp;url=http://kurtgrandis.com/blog/2009/12/13/triangle-django-sprint/" title="Add 'Triangle Django Sprint' to SlashDot"><img src="http://kurtgrandis.com/blog/wp-content/plugins/social-bookmarking-reloaded/slashdot.png" title="Add 'Triangle Django Sprint' to SlashDot" alt="Add 'Triangle Django Sprint' to SlashDot" /></a><a class="social_img" onclick="window.open(this.href, '_blank', 'scrollbars=yes,menubar=no,border=0,height=600,width=750,resizable=yes,toolbar=no,location=no,status=no'); return false;" href="http://twitter.com/home?status=http://kurtgrandis.com/blog/2009/12/13/triangle-django-sprint/" title="Add 'Triangle Django Sprint' to Twitter"><img src="http://kurtgrandis.com/blog/wp-content/plugins/social-bookmarking-reloaded/twitter.png" title="Add 'Triangle Django Sprint' to Twitter" alt="Add 'Triangle Django Sprint' to Twitter" /></a></div>
<!-- Social Bookmarking Reloaded END --><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>
<!-- Social Bookmarking Reloaded BEGIN --><div class="social_bookmark"><em>Bookmarks:</em><br /><a class="social_img" onclick="window.open(this.href, '_blank', 'scrollbars=yes,menubar=no,border=0,height=600,width=750,resizable=yes,toolbar=no,location=no,status=no'); return false;" href="http://del.icio.us/post?url=http://kurtgrandis.com/blog/2009/12/03/triangle-django-development-sprint/&amp;title=Triangle+Django+Development+Sprint" title="Add 'Triangle Django Development Sprint' to Del.icio.us"><img src="http://kurtgrandis.com/blog/wp-content/plugins/social-bookmarking-reloaded/delicious.png" title="Add 'Triangle Django Development Sprint' to Del.icio.us" alt="Add 'Triangle Django Development Sprint' to Del.icio.us" /></a><a class="social_img" onclick="window.open(this.href, '_blank', 'scrollbars=yes,menubar=no,border=0,height=600,width=750,resizable=yes,toolbar=no,location=no,status=no'); return false;" href="http://digg.com/submit?phase=2&amp;url=http://kurtgrandis.com/blog/2009/12/03/triangle-django-development-sprint/&amp;title=Triangle+Django+Development+Sprint" title="Add 'Triangle Django Development Sprint' to digg"><img src="http://kurtgrandis.com/blog/wp-content/plugins/social-bookmarking-reloaded/digg.png" title="Add 'Triangle Django Development Sprint' to digg" alt="Add 'Triangle Django Development Sprint' to digg" /></a><a class="social_img" onclick="window.open(this.href, '_blank', 'scrollbars=yes,menubar=no,border=0,height=600,width=750,resizable=yes,toolbar=no,location=no,status=no'); return false;" href="http://reddit.com/submit?url=http://kurtgrandis.com/blog/2009/12/03/triangle-django-development-sprint/&amp;title=Triangle+Django+Development+Sprint" title="Add 'Triangle Django Development Sprint' to reddit"><img src="http://kurtgrandis.com/blog/wp-content/plugins/social-bookmarking-reloaded/reddit.png" title="Add 'Triangle Django Development Sprint' to reddit" alt="Add 'Triangle Django Development Sprint' to reddit" /></a><a class="social_img" onclick="window.open(this.href, '_blank', 'scrollbars=yes,menubar=no,border=0,height=600,width=750,resizable=yes,toolbar=no,location=no,status=no'); return false;" href="http://www.technorati.com/faves?add=http://kurtgrandis.com/blog/2009/12/03/triangle-django-development-sprint/" title="Add 'Triangle Django Development Sprint' to Technorati"><img src="http://kurtgrandis.com/blog/wp-content/plugins/social-bookmarking-reloaded/technorati.png" title="Add 'Triangle Django Development Sprint' to Technorati" alt="Add 'Triangle Django Development Sprint' to Technorati" /></a><a class="social_img" onclick="window.open(this.href, '_blank', 'scrollbars=yes,menubar=no,border=0,height=600,width=750,resizable=yes,toolbar=no,location=no,status=no'); return false;" href="http://www.stumbleupon.com/submit?url=http://kurtgrandis.com/blog/2009/12/03/triangle-django-development-sprint/&amp;title=Triangle+Django+Development+Sprint" title="Add 'Triangle Django Development Sprint' to Stumble Upon"><img src="http://kurtgrandis.com/blog/wp-content/plugins/social-bookmarking-reloaded/stumbleupon.png" title="Add 'Triangle Django Development Sprint' to Stumble Upon" alt="Add 'Triangle Django Development Sprint' to Stumble Upon" /></a><a class="social_img" onclick="window.open(this.href, '_blank', 'scrollbars=yes,menubar=no,border=0,height=600,width=750,resizable=yes,toolbar=no,location=no,status=no'); return false;" href="http://www.google.com/bookmarks/mark?op=edit&amp;output=popup&amp;bkmk=http://kurtgrandis.com/blog/2009/12/03/triangle-django-development-sprint/&amp;title=Triangle+Django+Development+Sprint" title="Add 'Triangle Django Development Sprint' to Google Bookmarks"><img src="http://kurtgrandis.com/blog/wp-content/plugins/social-bookmarking-reloaded/google.png" title="Add 'Triangle Django Development Sprint' to Google Bookmarks" alt="Add 'Triangle Django Development Sprint' to Google Bookmarks" /></a><a class="social_img" onclick="window.open(this.href, '_blank', 'scrollbars=yes,menubar=no,border=0,height=600,width=750,resizable=yes,toolbar=no,location=no,status=no'); return false;" href="http://slashdot.org/bookmark.pl?title=Triangle+Django+Development+Sprint&amp;url=http://kurtgrandis.com/blog/2009/12/03/triangle-django-development-sprint/" title="Add 'Triangle Django Development Sprint' to SlashDot"><img src="http://kurtgrandis.com/blog/wp-content/plugins/social-bookmarking-reloaded/slashdot.png" title="Add 'Triangle Django Development Sprint' to SlashDot" alt="Add 'Triangle Django Development Sprint' to SlashDot" /></a><a class="social_img" onclick="window.open(this.href, '_blank', 'scrollbars=yes,menubar=no,border=0,height=600,width=750,resizable=yes,toolbar=no,location=no,status=no'); return false;" href="http://twitter.com/home?status=http://kurtgrandis.com/blog/2009/12/03/triangle-django-development-sprint/" title="Add 'Triangle Django Development Sprint' to Twitter"><img src="http://kurtgrandis.com/blog/wp-content/plugins/social-bookmarking-reloaded/twitter.png" title="Add 'Triangle Django Development Sprint' to Twitter" alt="Add 'Triangle Django Development Sprint' to Twitter" /></a></div>
<!-- Social Bookmarking Reloaded END --><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(&#8217;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(&#8217;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>
<!-- Social Bookmarking Reloaded BEGIN --><div class="social_bookmark"><em>Bookmarks:</em><br /><a class="social_img" onclick="window.open(this.href, '_blank', 'scrollbars=yes,menubar=no,border=0,height=600,width=750,resizable=yes,toolbar=no,location=no,status=no'); return false;" href="http://del.icio.us/post?url=http://kurtgrandis.com/blog/2009/12/03/django-multidb-mysqldb-and-mysql-encoding-errors/&amp;title=django-multidb%2C+MySQLdb%2C+and+MySQL+Encoding+Errors" title="Add 'django-multidb, MySQLdb, and MySQL Encoding Errors' to Del.icio.us"><img src="http://kurtgrandis.com/blog/wp-content/plugins/social-bookmarking-reloaded/delicious.png" title="Add 'django-multidb, MySQLdb, and MySQL Encoding Errors' to Del.icio.us" alt="Add 'django-multidb, MySQLdb, and MySQL Encoding Errors' to Del.icio.us" /></a><a class="social_img" onclick="window.open(this.href, '_blank', 'scrollbars=yes,menubar=no,border=0,height=600,width=750,resizable=yes,toolbar=no,location=no,status=no'); return false;" href="http://digg.com/submit?phase=2&amp;url=http://kurtgrandis.com/blog/2009/12/03/django-multidb-mysqldb-and-mysql-encoding-errors/&amp;title=django-multidb%2C+MySQLdb%2C+and+MySQL+Encoding+Errors" title="Add 'django-multidb, MySQLdb, and MySQL Encoding Errors' to digg"><img src="http://kurtgrandis.com/blog/wp-content/plugins/social-bookmarking-reloaded/digg.png" title="Add 'django-multidb, MySQLdb, and MySQL Encoding Errors' to digg" alt="Add 'django-multidb, MySQLdb, and MySQL Encoding Errors' to digg" /></a><a class="social_img" onclick="window.open(this.href, '_blank', 'scrollbars=yes,menubar=no,border=0,height=600,width=750,resizable=yes,toolbar=no,location=no,status=no'); return false;" href="http://reddit.com/submit?url=http://kurtgrandis.com/blog/2009/12/03/django-multidb-mysqldb-and-mysql-encoding-errors/&amp;title=django-multidb%2C+MySQLdb%2C+and+MySQL+Encoding+Errors" title="Add 'django-multidb, MySQLdb, and MySQL Encoding Errors' to reddit"><img src="http://kurtgrandis.com/blog/wp-content/plugins/social-bookmarking-reloaded/reddit.png" title="Add 'django-multidb, MySQLdb, and MySQL Encoding Errors' to reddit" alt="Add 'django-multidb, MySQLdb, and MySQL Encoding Errors' to reddit" /></a><a class="social_img" onclick="window.open(this.href, '_blank', 'scrollbars=yes,menubar=no,border=0,height=600,width=750,resizable=yes,toolbar=no,location=no,status=no'); return false;" href="http://www.technorati.com/faves?add=http://kurtgrandis.com/blog/2009/12/03/django-multidb-mysqldb-and-mysql-encoding-errors/" title="Add 'django-multidb, MySQLdb, and MySQL Encoding Errors' to Technorati"><img src="http://kurtgrandis.com/blog/wp-content/plugins/social-bookmarking-reloaded/technorati.png" title="Add 'django-multidb, MySQLdb, and MySQL Encoding Errors' to Technorati" alt="Add 'django-multidb, MySQLdb, and MySQL Encoding Errors' to Technorati" /></a><a class="social_img" onclick="window.open(this.href, '_blank', 'scrollbars=yes,menubar=no,border=0,height=600,width=750,resizable=yes,toolbar=no,location=no,status=no'); return false;" href="http://www.stumbleupon.com/submit?url=http://kurtgrandis.com/blog/2009/12/03/django-multidb-mysqldb-and-mysql-encoding-errors/&amp;title=django-multidb%2C+MySQLdb%2C+and+MySQL+Encoding+Errors" title="Add 'django-multidb, MySQLdb, and MySQL Encoding Errors' to Stumble Upon"><img src="http://kurtgrandis.com/blog/wp-content/plugins/social-bookmarking-reloaded/stumbleupon.png" title="Add 'django-multidb, MySQLdb, and MySQL Encoding Errors' to Stumble Upon" alt="Add 'django-multidb, MySQLdb, and MySQL Encoding Errors' to Stumble Upon" /></a><a class="social_img" onclick="window.open(this.href, '_blank', 'scrollbars=yes,menubar=no,border=0,height=600,width=750,resizable=yes,toolbar=no,location=no,status=no'); return false;" href="http://www.google.com/bookmarks/mark?op=edit&amp;output=popup&amp;bkmk=http://kurtgrandis.com/blog/2009/12/03/django-multidb-mysqldb-and-mysql-encoding-errors/&amp;title=django-multidb%2C+MySQLdb%2C+and+MySQL+Encoding+Errors" title="Add 'django-multidb, MySQLdb, and MySQL Encoding Errors' to Google Bookmarks"><img src="http://kurtgrandis.com/blog/wp-content/plugins/social-bookmarking-reloaded/google.png" title="Add 'django-multidb, MySQLdb, and MySQL Encoding Errors' to Google Bookmarks" alt="Add 'django-multidb, MySQLdb, and MySQL Encoding Errors' to Google Bookmarks" /></a><a class="social_img" onclick="window.open(this.href, '_blank', 'scrollbars=yes,menubar=no,border=0,height=600,width=750,resizable=yes,toolbar=no,location=no,status=no'); return false;" href="http://slashdot.org/bookmark.pl?title=django-multidb%2C+MySQLdb%2C+and+MySQL+Encoding+Errors&amp;url=http://kurtgrandis.com/blog/2009/12/03/django-multidb-mysqldb-and-mysql-encoding-errors/" title="Add 'django-multidb, MySQLdb, and MySQL Encoding Errors' to SlashDot"><img src="http://kurtgrandis.com/blog/wp-content/plugins/social-bookmarking-reloaded/slashdot.png" title="Add 'django-multidb, MySQLdb, and MySQL Encoding Errors' to SlashDot" alt="Add 'django-multidb, MySQLdb, and MySQL Encoding Errors' to SlashDot" /></a><a class="social_img" onclick="window.open(this.href, '_blank', 'scrollbars=yes,menubar=no,border=0,height=600,width=750,resizable=yes,toolbar=no,location=no,status=no'); return false;" href="http://twitter.com/home?status=http://kurtgrandis.com/blog/2009/12/03/django-multidb-mysqldb-and-mysql-encoding-errors/" title="Add 'django-multidb, MySQLdb, and MySQL Encoding Errors' to Twitter"><img src="http://kurtgrandis.com/blog/wp-content/plugins/social-bookmarking-reloaded/twitter.png" title="Add 'django-multidb, MySQLdb, and MySQL Encoding Errors' to Twitter" alt="Add 'django-multidb, MySQLdb, and MySQL Encoding Errors' to Twitter" /></a></div>
<!-- Social Bookmarking Reloaded END --><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>
<!-- Social Bookmarking Reloaded BEGIN --><div class="social_bookmark"><em>Bookmarks:</em><br /><a class="social_img" onclick="window.open(this.href, '_blank', 'scrollbars=yes,menubar=no,border=0,height=600,width=750,resizable=yes,toolbar=no,location=no,status=no'); return false;" href="http://del.icio.us/post?url=http://kurtgrandis.com/blog/2009/11/20/django-in-the-triangle/&amp;title=Django+in+the+Triangle" title="Add 'Django in the Triangle' to Del.icio.us"><img src="http://kurtgrandis.com/blog/wp-content/plugins/social-bookmarking-reloaded/delicious.png" title="Add 'Django in the Triangle' to Del.icio.us" alt="Add 'Django in the Triangle' to Del.icio.us" /></a><a class="social_img" onclick="window.open(this.href, '_blank', 'scrollbars=yes,menubar=no,border=0,height=600,width=750,resizable=yes,toolbar=no,location=no,status=no'); return false;" href="http://digg.com/submit?phase=2&amp;url=http://kurtgrandis.com/blog/2009/11/20/django-in-the-triangle/&amp;title=Django+in+the+Triangle" title="Add 'Django in the Triangle' to digg"><img src="http://kurtgrandis.com/blog/wp-content/plugins/social-bookmarking-reloaded/digg.png" title="Add 'Django in the Triangle' to digg" alt="Add 'Django in the Triangle' to digg" /></a><a class="social_img" onclick="window.open(this.href, '_blank', 'scrollbars=yes,menubar=no,border=0,height=600,width=750,resizable=yes,toolbar=no,location=no,status=no'); return false;" href="http://reddit.com/submit?url=http://kurtgrandis.com/blog/2009/11/20/django-in-the-triangle/&amp;title=Django+in+the+Triangle" title="Add 'Django in the Triangle' to reddit"><img src="http://kurtgrandis.com/blog/wp-content/plugins/social-bookmarking-reloaded/reddit.png" title="Add 'Django in the Triangle' to reddit" alt="Add 'Django in the Triangle' to reddit" /></a><a class="social_img" onclick="window.open(this.href, '_blank', 'scrollbars=yes,menubar=no,border=0,height=600,width=750,resizable=yes,toolbar=no,location=no,status=no'); return false;" href="http://www.technorati.com/faves?add=http://kurtgrandis.com/blog/2009/11/20/django-in-the-triangle/" title="Add 'Django in the Triangle' to Technorati"><img src="http://kurtgrandis.com/blog/wp-content/plugins/social-bookmarking-reloaded/technorati.png" title="Add 'Django in the Triangle' to Technorati" alt="Add 'Django in the Triangle' to Technorati" /></a><a class="social_img" onclick="window.open(this.href, '_blank', 'scrollbars=yes,menubar=no,border=0,height=600,width=750,resizable=yes,toolbar=no,location=no,status=no'); return false;" href="http://www.stumbleupon.com/submit?url=http://kurtgrandis.com/blog/2009/11/20/django-in-the-triangle/&amp;title=Django+in+the+Triangle" title="Add 'Django in the Triangle' to Stumble Upon"><img src="http://kurtgrandis.com/blog/wp-content/plugins/social-bookmarking-reloaded/stumbleupon.png" title="Add 'Django in the Triangle' to Stumble Upon" alt="Add 'Django in the Triangle' to Stumble Upon" /></a><a class="social_img" onclick="window.open(this.href, '_blank', 'scrollbars=yes,menubar=no,border=0,height=600,width=750,resizable=yes,toolbar=no,location=no,status=no'); return false;" href="http://www.google.com/bookmarks/mark?op=edit&amp;output=popup&amp;bkmk=http://kurtgrandis.com/blog/2009/11/20/django-in-the-triangle/&amp;title=Django+in+the+Triangle" title="Add 'Django in the Triangle' to Google Bookmarks"><img src="http://kurtgrandis.com/blog/wp-content/plugins/social-bookmarking-reloaded/google.png" title="Add 'Django in the Triangle' to Google Bookmarks" alt="Add 'Django in the Triangle' to Google Bookmarks" /></a><a class="social_img" onclick="window.open(this.href, '_blank', 'scrollbars=yes,menubar=no,border=0,height=600,width=750,resizable=yes,toolbar=no,location=no,status=no'); return false;" href="http://slashdot.org/bookmark.pl?title=Django+in+the+Triangle&amp;url=http://kurtgrandis.com/blog/2009/11/20/django-in-the-triangle/" title="Add 'Django in the Triangle' to SlashDot"><img src="http://kurtgrandis.com/blog/wp-content/plugins/social-bookmarking-reloaded/slashdot.png" title="Add 'Django in the Triangle' to SlashDot" alt="Add 'Django in the Triangle' to SlashDot" /></a><a class="social_img" onclick="window.open(this.href, '_blank', 'scrollbars=yes,menubar=no,border=0,height=600,width=750,resizable=yes,toolbar=no,location=no,status=no'); return false;" href="http://twitter.com/home?status=http://kurtgrandis.com/blog/2009/11/20/django-in-the-triangle/" title="Add 'Django in the Triangle' to Twitter"><img src="http://kurtgrandis.com/blog/wp-content/plugins/social-bookmarking-reloaded/twitter.png" title="Add 'Django in the Triangle' to Twitter" alt="Add 'Django in the Triangle' to Twitter" /></a></div>
<!-- Social Bookmarking Reloaded END --><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>
		<item>
		<title>GHAPACK: A Library for the Generalized Hebbian Algorithm</title>
		<link>http://feedproxy.google.com/~r/kurtgrandis/qQcH/~3/pJfl1b3gj80/</link>
		<comments>http://kurtgrandis.com/blog/2009/02/08/ghapack-a-library-for-the-generalized-hebbian-algorithm/#comments</comments>
		<pubDate>Mon, 09 Feb 2009 03:34:04 +0000</pubDate>
		<dc:creator>kurt</dc:creator>
				<category><![CDATA[Data]]></category>
		<category><![CDATA[Machine Learning]]></category>
		<category><![CDATA[Software Engineering]]></category>
		<category><![CDATA[gha]]></category>
		<category><![CDATA[lsa]]></category>
		<category><![CDATA[lsi]]></category>
		<category><![CDATA[machinelearning]]></category>
		<category><![CDATA[svd]]></category>

		<guid isPermaLink="false">http://kurtgrandis.com/blog/?p=31</guid>
		<description><![CDATA[I recently joined a new open source project called GHAPACK. The project currently provides the functionality and the means to use the Generalized Hebbian Algorithm. I came across this project after banging my head against some of the practical limitations of Singular Value Decomposition (SVD). GHA is a Hebbian-based neural network-like algorithm that approximates SVD&#8217;s [...]]]></description>
			<content:encoded><![CDATA[<p>I recently joined a new open source project called <a href="http://sourceforge.net/projects/ghapack/">GHAPACK</a>. The project currently provides the functionality and the means to use the Generalized Hebbian Algorithm. I came across this project after banging my head against some of the practical limitations of Singular Value Decomposition (SVD). GHA is a Hebbian-based neural network-like algorithm that approximates SVD&#8217;s ability to perform eigen decomposition. Its added bonus is that it allows for incremental training so you can refine your model with new data without having to recompute using the entire dataset.</p>
<h2>Your Trusty SVD Tool</h2>
<p>SVD is one of those tools that every machine learning practitioner and computational geek will pull out at some time or another. It&#8217;s a powerful matrix factorization technique that allows you to get at the matrix&#8217;s eigenvectors and eigenvalues. One of reason it tends to be used so often is the fact that it can be used on those pesky <em>M x N </em>matrices, which us data junkies tend to generate.</p>
<p>For most small problems I can just use scipy and numpy&#8217;s <em>svd</em> and never give it a second thought. <a href="http://www.netlib.org/lapack/">LAPACK&#8217;s</a> suite of SVD routines power the <em>svd</em> functions of scipy, numpy, and MATLAB among others. It is developed for dense matrices and processes them in their entirety. What happens when you start dealing with problems in high-dimensional space? Those dense representations and full processing are expensive. So, when your problem space is better suited for sparse matrices you tend to run into not enough memory, non-convergence&#8230;no SVD.</p>
<p>At the time I was considering a problem that would be well-suited for incremental training, meaning I did not want to have to rerun the entire dataset through SVD after adding a small set of new data; GHA lets you avoid that sort of inconvenience and approximates the same outcome (as far as my problem was concerned).</p>
<h2>GHAPACK</h2>
<p>GHAPACK is written by <a href="http://www.dcs.shef.ac.uk/~genevieve/lsa.html">Genevieve Gorrell</a> and based on her work using GHAs to perform Latent Semantic Analysis (LSA).</p>
<h3>&#8220;Offline&#8221; Calculations</h3>
<p>My first order of business upon joining the project was to get the offline training working. This allows you to compute a pseudo-SVD based on a massive matrix without having to load the whole thing into memory.  No more out-of-memory segfaults. Now, you&#8217;re just limited by the resiliency of your hardware. This is now working.</p>
<h3>Memory Management</h3>
<p>I addressed a few memory leaks, but will likely do some restructuring to optimize memory management.</p>
<h3>Resource Library</h3>
<p>I would like the core of the GHA magic to be extracted into a library that others could embed in their own projects. So, I intend to move core functionality into a library and restructure the existing apps into commandline tools that utilize those libs.</p>
<h3>Performance</h3>
<p>GHA, off-the-bat, is not known for its speed compared to some other eigen decomposition approaches. Besides that, there is room for some major gains in performance. Let&#8217;s see what we can squeeze out of GHAPACK and perhaps lean on things like BLAS.</p>
<h3>Testing Framework</h3>
<p>A testing framework that objectively keeps track of performance gains, while ensuring computational integrity through unit testing always makes refactoring work that much less stressful.</p>
<p>Lots of work to do and a hearty thanks to Professor Gorrell for letting me join her efforts.</p>
<hr />
<h2>Other SVD Resources</h2>
<p>There are other SVD libraries out there that will carry you farther if SVD is what you really want and not necessarily the means to an end.</p>
<p><a href="http://www.netlib.org/scalapack/">ScaLAPACK</a> has parallel SVD code, which creams LAPACK&#8217;s performance when you have access to multiple cores and/or MPI. <a href="http://www.caam.rice.edu/software/ARPACK/">ARPACK</a> and <a href="http://www.netlib.org/svdpack/">SVDPACK</a> both offer Lanczos-based SVD solutions for sparse matrices with ARPACK being well-suited for parallel processing.</p>
<!-- Social Bookmarking Reloaded BEGIN --><div class="social_bookmark"><em>Bookmarks:</em><br /><a class="social_img" onclick="window.open(this.href, '_blank', 'scrollbars=yes,menubar=no,border=0,height=600,width=750,resizable=yes,toolbar=no,location=no,status=no'); return false;" href="http://del.icio.us/post?url=http://kurtgrandis.com/blog/2009/02/08/ghapack-a-library-for-the-generalized-hebbian-algorithm/&amp;title=GHAPACK%3A+A+Library+for+the+Generalized+Hebbian+Algorithm" title="Add 'GHAPACK: A Library for the Generalized Hebbian Algorithm' to Del.icio.us"><img src="http://kurtgrandis.com/blog/wp-content/plugins/social-bookmarking-reloaded/delicious.png" title="Add 'GHAPACK: A Library for the Generalized Hebbian Algorithm' to Del.icio.us" alt="Add 'GHAPACK: A Library for the Generalized Hebbian Algorithm' to Del.icio.us" /></a><a class="social_img" onclick="window.open(this.href, '_blank', 'scrollbars=yes,menubar=no,border=0,height=600,width=750,resizable=yes,toolbar=no,location=no,status=no'); return false;" href="http://digg.com/submit?phase=2&amp;url=http://kurtgrandis.com/blog/2009/02/08/ghapack-a-library-for-the-generalized-hebbian-algorithm/&amp;title=GHAPACK%3A+A+Library+for+the+Generalized+Hebbian+Algorithm" title="Add 'GHAPACK: A Library for the Generalized Hebbian Algorithm' to digg"><img src="http://kurtgrandis.com/blog/wp-content/plugins/social-bookmarking-reloaded/digg.png" title="Add 'GHAPACK: A Library for the Generalized Hebbian Algorithm' to digg" alt="Add 'GHAPACK: A Library for the Generalized Hebbian Algorithm' to digg" /></a><a class="social_img" onclick="window.open(this.href, '_blank', 'scrollbars=yes,menubar=no,border=0,height=600,width=750,resizable=yes,toolbar=no,location=no,status=no'); return false;" href="http://reddit.com/submit?url=http://kurtgrandis.com/blog/2009/02/08/ghapack-a-library-for-the-generalized-hebbian-algorithm/&amp;title=GHAPACK%3A+A+Library+for+the+Generalized+Hebbian+Algorithm" title="Add 'GHAPACK: A Library for the Generalized Hebbian Algorithm' to reddit"><img src="http://kurtgrandis.com/blog/wp-content/plugins/social-bookmarking-reloaded/reddit.png" title="Add 'GHAPACK: A Library for the Generalized Hebbian Algorithm' to reddit" alt="Add 'GHAPACK: A Library for the Generalized Hebbian Algorithm' to reddit" /></a><a class="social_img" onclick="window.open(this.href, '_blank', 'scrollbars=yes,menubar=no,border=0,height=600,width=750,resizable=yes,toolbar=no,location=no,status=no'); return false;" href="http://www.technorati.com/faves?add=http://kurtgrandis.com/blog/2009/02/08/ghapack-a-library-for-the-generalized-hebbian-algorithm/" title="Add 'GHAPACK: A Library for the Generalized Hebbian Algorithm' to Technorati"><img src="http://kurtgrandis.com/blog/wp-content/plugins/social-bookmarking-reloaded/technorati.png" title="Add 'GHAPACK: A Library for the Generalized Hebbian Algorithm' to Technorati" alt="Add 'GHAPACK: A Library for the Generalized Hebbian Algorithm' to Technorati" /></a><a class="social_img" onclick="window.open(this.href, '_blank', 'scrollbars=yes,menubar=no,border=0,height=600,width=750,resizable=yes,toolbar=no,location=no,status=no'); return false;" href="http://www.stumbleupon.com/submit?url=http://kurtgrandis.com/blog/2009/02/08/ghapack-a-library-for-the-generalized-hebbian-algorithm/&amp;title=GHAPACK%3A+A+Library+for+the+Generalized+Hebbian+Algorithm" title="Add 'GHAPACK: A Library for the Generalized Hebbian Algorithm' to Stumble Upon"><img src="http://kurtgrandis.com/blog/wp-content/plugins/social-bookmarking-reloaded/stumbleupon.png" title="Add 'GHAPACK: A Library for the Generalized Hebbian Algorithm' to Stumble Upon" alt="Add 'GHAPACK: A Library for the Generalized Hebbian Algorithm' to Stumble Upon" /></a><a class="social_img" onclick="window.open(this.href, '_blank', 'scrollbars=yes,menubar=no,border=0,height=600,width=750,resizable=yes,toolbar=no,location=no,status=no'); return false;" href="http://www.google.com/bookmarks/mark?op=edit&amp;output=popup&amp;bkmk=http://kurtgrandis.com/blog/2009/02/08/ghapack-a-library-for-the-generalized-hebbian-algorithm/&amp;title=GHAPACK%3A+A+Library+for+the+Generalized+Hebbian+Algorithm" title="Add 'GHAPACK: A Library for the Generalized Hebbian Algorithm' to Google Bookmarks"><img src="http://kurtgrandis.com/blog/wp-content/plugins/social-bookmarking-reloaded/google.png" title="Add 'GHAPACK: A Library for the Generalized Hebbian Algorithm' to Google Bookmarks" alt="Add 'GHAPACK: A Library for the Generalized Hebbian Algorithm' to Google Bookmarks" /></a><a class="social_img" onclick="window.open(this.href, '_blank', 'scrollbars=yes,menubar=no,border=0,height=600,width=750,resizable=yes,toolbar=no,location=no,status=no'); return false;" href="http://slashdot.org/bookmark.pl?title=GHAPACK%3A+A+Library+for+the+Generalized+Hebbian+Algorithm&amp;url=http://kurtgrandis.com/blog/2009/02/08/ghapack-a-library-for-the-generalized-hebbian-algorithm/" title="Add 'GHAPACK: A Library for the Generalized Hebbian Algorithm' to SlashDot"><img src="http://kurtgrandis.com/blog/wp-content/plugins/social-bookmarking-reloaded/slashdot.png" title="Add 'GHAPACK: A Library for the Generalized Hebbian Algorithm' to SlashDot" alt="Add 'GHAPACK: A Library for the Generalized Hebbian Algorithm' to SlashDot" /></a><a class="social_img" onclick="window.open(this.href, '_blank', 'scrollbars=yes,menubar=no,border=0,height=600,width=750,resizable=yes,toolbar=no,location=no,status=no'); return false;" href="http://twitter.com/home?status=http://kurtgrandis.com/blog/2009/02/08/ghapack-a-library-for-the-generalized-hebbian-algorithm/" title="Add 'GHAPACK: A Library for the Generalized Hebbian Algorithm' to Twitter"><img src="http://kurtgrandis.com/blog/wp-content/plugins/social-bookmarking-reloaded/twitter.png" title="Add 'GHAPACK: A Library for the Generalized Hebbian Algorithm' to Twitter" alt="Add 'GHAPACK: A Library for the Generalized Hebbian Algorithm' to Twitter" /></a></div>
<!-- Social Bookmarking Reloaded END --><img src="http://feeds.feedburner.com/~r/kurtgrandis/qQcH/~4/pJfl1b3gj80" height="1" width="1"/>]]></content:encoded>
			<wfw:commentRss>http://kurtgrandis.com/blog/2009/02/08/ghapack-a-library-for-the-generalized-hebbian-algorithm/feed/</wfw:commentRss>
		<slash:comments>1</slash:comments>
		<feedburner:origLink>http://kurtgrandis.com/blog/2009/02/08/ghapack-a-library-for-the-generalized-hebbian-algorithm/</feedburner:origLink></item>
		<item>
		<title>Agile Scapegoating and People over Process</title>
		<link>http://feedproxy.google.com/~r/kurtgrandis/qQcH/~3/2beH4WFnheA/</link>
		<comments>http://kurtgrandis.com/blog/2008/11/19/agile-scapegoating-and-people-over-process/#comments</comments>
		<pubDate>Wed, 19 Nov 2008 07:28:32 +0000</pubDate>
		<dc:creator>kurt</dc:creator>
				<category><![CDATA[Agile]]></category>
		<category><![CDATA[Software Engineering]]></category>
		<category><![CDATA[scrum]]></category>
		<category><![CDATA[xp]]></category>

		<guid isPermaLink="false">http://kurtgrandis.com/blog/?p=23</guid>
		<description><![CDATA[Last week James Shore posted an article The Decline and Fall of Agile that generated quite a bit of discussion. He points out many of atrocities and failures in software development and software project management done under guise of &#8220;Agile&#8221; or &#8220;Scrum&#8221; are often not true implementations. You have these teams who say they are doing Scrum, but the only things [...]]]></description>
			<content:encoded><![CDATA[<p>Last week James Shore posted an article <a href="http://jamesshore.com/Blog/The-Decline-and-Fall-of-Agile.html">The Decline and Fall of Agile</a> that generated quite a bit of discussion. He points out many of atrocities and failures in software development and software project management done under guise of &#8220;Agile&#8221; or &#8220;Scrum&#8221; are often not true implementations. You have these teams who say they are doing Scrum, but the only things that actually get adopted are sprints and scrums. So many  of these failed groups ignore the important and difficult aspects of Scrum like self-organization, shippable product goals, and self-reflection &amp; improvement. As Jason says, they are &#8220;having their dessert every night and skipping their vegetables.&#8221;</p>
<p>Ken Schwaber replied to Jason&#8217;s article:</p>
<blockquote><p>When Scrum is mis-used, the results are iterative, incrementa​l death marches. This is simply waterfall done more often without any of the risk mitigation techniques or people and engineerin​g practices needed to make Scrum work.</p></blockquote>
<p>The article also sparked Bob Martin to write an essay <a href="http://blog.objectmentor.com/articles/2008/11/16/dirty-rotten-scrumdrels">&#8220;Dirty Rotten ScrumDrels&#8221;</a> in response to some of the Scrum scapegoating that has been going on recently. Check out the comments for some Uncle Bob-Shore dialog.</p>
<p>Things like self-reflection and process and work reviews are all practices that people naturally adopt to improve themselves. I think successful developers tend to do this anyways in order to stay ahead of the curve. When you have mediocre teams flailing about who           are looking for a silver bullet and turn to things like Scrum who don&#8217;t already do this sort of thing, it is easy for them to brush that off as a triviality; if they haven&#8217;t already seen the value of it, it just gets lost in the noise.</p>
<p>I share Mr. Shore&#8217;s frustration in seeing Agile and Scrum being blamed for the shortcomings of teams and improper implementations, when you&#8217;ve seen the real thing work over and over.</p>
<!-- Social Bookmarking Reloaded BEGIN --><div class="social_bookmark"><em>Bookmarks:</em><br /><a class="social_img" onclick="window.open(this.href, '_blank', 'scrollbars=yes,menubar=no,border=0,height=600,width=750,resizable=yes,toolbar=no,location=no,status=no'); return false;" href="http://del.icio.us/post?url=http://kurtgrandis.com/blog/2008/11/19/agile-scapegoating-and-people-over-process/&amp;title=Agile+Scapegoating+and+People+over+Process" title="Add 'Agile Scapegoating and People over Process' to Del.icio.us"><img src="http://kurtgrandis.com/blog/wp-content/plugins/social-bookmarking-reloaded/delicious.png" title="Add 'Agile Scapegoating and People over Process' to Del.icio.us" alt="Add 'Agile Scapegoating and People over Process' to Del.icio.us" /></a><a class="social_img" onclick="window.open(this.href, '_blank', 'scrollbars=yes,menubar=no,border=0,height=600,width=750,resizable=yes,toolbar=no,location=no,status=no'); return false;" href="http://digg.com/submit?phase=2&amp;url=http://kurtgrandis.com/blog/2008/11/19/agile-scapegoating-and-people-over-process/&amp;title=Agile+Scapegoating+and+People+over+Process" title="Add 'Agile Scapegoating and People over Process' to digg"><img src="http://kurtgrandis.com/blog/wp-content/plugins/social-bookmarking-reloaded/digg.png" title="Add 'Agile Scapegoating and People over Process' to digg" alt="Add 'Agile Scapegoating and People over Process' to digg" /></a><a class="social_img" onclick="window.open(this.href, '_blank', 'scrollbars=yes,menubar=no,border=0,height=600,width=750,resizable=yes,toolbar=no,location=no,status=no'); return false;" href="http://reddit.com/submit?url=http://kurtgrandis.com/blog/2008/11/19/agile-scapegoating-and-people-over-process/&amp;title=Agile+Scapegoating+and+People+over+Process" title="Add 'Agile Scapegoating and People over Process' to reddit"><img src="http://kurtgrandis.com/blog/wp-content/plugins/social-bookmarking-reloaded/reddit.png" title="Add 'Agile Scapegoating and People over Process' to reddit" alt="Add 'Agile Scapegoating and People over Process' to reddit" /></a><a class="social_img" onclick="window.open(this.href, '_blank', 'scrollbars=yes,menubar=no,border=0,height=600,width=750,resizable=yes,toolbar=no,location=no,status=no'); return false;" href="http://www.technorati.com/faves?add=http://kurtgrandis.com/blog/2008/11/19/agile-scapegoating-and-people-over-process/" title="Add 'Agile Scapegoating and People over Process' to Technorati"><img src="http://kurtgrandis.com/blog/wp-content/plugins/social-bookmarking-reloaded/technorati.png" title="Add 'Agile Scapegoating and People over Process' to Technorati" alt="Add 'Agile Scapegoating and People over Process' to Technorati" /></a><a class="social_img" onclick="window.open(this.href, '_blank', 'scrollbars=yes,menubar=no,border=0,height=600,width=750,resizable=yes,toolbar=no,location=no,status=no'); return false;" href="http://www.stumbleupon.com/submit?url=http://kurtgrandis.com/blog/2008/11/19/agile-scapegoating-and-people-over-process/&amp;title=Agile+Scapegoating+and+People+over+Process" title="Add 'Agile Scapegoating and People over Process' to Stumble Upon"><img src="http://kurtgrandis.com/blog/wp-content/plugins/social-bookmarking-reloaded/stumbleupon.png" title="Add 'Agile Scapegoating and People over Process' to Stumble Upon" alt="Add 'Agile Scapegoating and People over Process' to Stumble Upon" /></a><a class="social_img" onclick="window.open(this.href, '_blank', 'scrollbars=yes,menubar=no,border=0,height=600,width=750,resizable=yes,toolbar=no,location=no,status=no'); return false;" href="http://www.google.com/bookmarks/mark?op=edit&amp;output=popup&amp;bkmk=http://kurtgrandis.com/blog/2008/11/19/agile-scapegoating-and-people-over-process/&amp;title=Agile+Scapegoating+and+People+over+Process" title="Add 'Agile Scapegoating and People over Process' to Google Bookmarks"><img src="http://kurtgrandis.com/blog/wp-content/plugins/social-bookmarking-reloaded/google.png" title="Add 'Agile Scapegoating and People over Process' to Google Bookmarks" alt="Add 'Agile Scapegoating and People over Process' to Google Bookmarks" /></a><a class="social_img" onclick="window.open(this.href, '_blank', 'scrollbars=yes,menubar=no,border=0,height=600,width=750,resizable=yes,toolbar=no,location=no,status=no'); return false;" href="http://slashdot.org/bookmark.pl?title=Agile+Scapegoating+and+People+over+Process&amp;url=http://kurtgrandis.com/blog/2008/11/19/agile-scapegoating-and-people-over-process/" title="Add 'Agile Scapegoating and People over Process' to SlashDot"><img src="http://kurtgrandis.com/blog/wp-content/plugins/social-bookmarking-reloaded/slashdot.png" title="Add 'Agile Scapegoating and People over Process' to SlashDot" alt="Add 'Agile Scapegoating and People over Process' to SlashDot" /></a><a class="social_img" onclick="window.open(this.href, '_blank', 'scrollbars=yes,menubar=no,border=0,height=600,width=750,resizable=yes,toolbar=no,location=no,status=no'); return false;" href="http://twitter.com/home?status=http://kurtgrandis.com/blog/2008/11/19/agile-scapegoating-and-people-over-process/" title="Add 'Agile Scapegoating and People over Process' to Twitter"><img src="http://kurtgrandis.com/blog/wp-content/plugins/social-bookmarking-reloaded/twitter.png" title="Add 'Agile Scapegoating and People over Process' to Twitter" alt="Add 'Agile Scapegoating and People over Process' to Twitter" /></a></div>
<!-- Social Bookmarking Reloaded END --><img src="http://feeds.feedburner.com/~r/kurtgrandis/qQcH/~4/2beH4WFnheA" height="1" width="1"/>]]></content:encoded>
			<wfw:commentRss>http://kurtgrandis.com/blog/2008/11/19/agile-scapegoating-and-people-over-process/feed/</wfw:commentRss>
		<slash:comments>2</slash:comments>
		<feedburner:origLink>http://kurtgrandis.com/blog/2008/11/19/agile-scapegoating-and-people-over-process/</feedburner:origLink></item>
		<item>
		<title>Protosprout : Promoting Entrepreneurship &amp; Start-Up Culture in North Carolina</title>
		<link>http://feedproxy.google.com/~r/kurtgrandis/qQcH/~3/t1IspD1hlHw/</link>
		<comments>http://kurtgrandis.com/blog/2008/11/18/protosprout-promoting-entrepreneurship-start-up-culture-in-north-carolina/#comments</comments>
		<pubDate>Tue, 18 Nov 2008 07:32:49 +0000</pubDate>
		<dc:creator>kurt</dc:creator>
				<category><![CDATA[Entrepreneurship]]></category>
		<category><![CDATA[Local Business]]></category>
		<category><![CDATA[nc]]></category>
		<category><![CDATA[protosprout]]></category>
		<category><![CDATA[startup]]></category>
		<category><![CDATA[techshop]]></category>

		<guid isPermaLink="false">http://kurtgrandis.com/blog/?p=15</guid>
		<description><![CDATA[A couple of weeks ago I emerged from my development trance and decided to venture back out into the wilds of the Triangle entrepreneurial scene. The timing worked out so that I could trek out to Raleigh earlier this month to attend the inaugural Protosprout Community Program Meeting.
Protosprout ( http://protosprout.com ) is a NC-based company [...]]]></description>
			<content:encoded><![CDATA[<p>A couple of weeks ago I emerged from my development trance and decided to venture back out into the wilds of the Triangle entrepreneurial scene. The timing worked out so that I could trek out to Raleigh earlier this month to attend the inaugural Protosprout Community Program Meeting.</p>
<p><strong><a href="http://protosprout.com">Protosprout</a></strong> ( <a href="http://protosprout.com">http://protosprout.com</a> ) is a NC-based company founded by Justis Peters that is looking to bring local entrepreneurs together and foster an energized, start-up community. I think it was a successful first meeting. Justis pulled folks together and lead some interesting and informal discussions including how the community could work together to provide support and value to one another. Ideas included things like skill and service bartering, community forums, general networking, official Protosprout mentorship and startup programs. A local skill bartering system would be great for a lot of startups ( ala programmer meets designer ) as would a tighter knit community for bouncing ideas off of or even testing your prototypes.</p>
<p>Part of the evening included time for pitching your startups and Q&amp;A. Even <a href="http://wayne-sutton.com">Wayne Sutton</a> got up and pitched an idea. I&#8217;ll take a moment to mention one really cool company that pitched: <a href="http://www.durham.techshop.ws/"><strong>Durham TechShop</strong></a> ( <a href="http://www.durham.techshop.ws/">http://www.durham.techshop.ws</a> )</p>
<p>The TechShop will be a a DIY workshop with a slew of tools and machines for any number of tasks ( electronics, woodworking, plastics, machining, welding, 3d printing, even blacksmithing! ). They&#8217;ll offer classes so that you can get certified to use the various tools and then you&#8217;re off to create whatever you want. I am really excited to see this in action, so all you folks with checkbooks contact Scott Saxon over at the TechShop and get this puppy funded!</p>
<p>I met a lot of interesting people that night and look forward to attending the next Protosprout meeting. You should check it out over at <a href="http://protosprout.com">http://protosprout.com</a> . I think Justis is doing a great job getting this organized.</p>
<p>You can also follow Protosprout on Twitter  ( <a href="http://twitter.com/protosprout">http://twitter.com/protosprout</a> )</p>
<!-- Social Bookmarking Reloaded BEGIN --><div class="social_bookmark"><em>Bookmarks:</em><br /><a class="social_img" onclick="window.open(this.href, '_blank', 'scrollbars=yes,menubar=no,border=0,height=600,width=750,resizable=yes,toolbar=no,location=no,status=no'); return false;" href="http://del.icio.us/post?url=http://kurtgrandis.com/blog/2008/11/18/protosprout-promoting-entrepreneurship-start-up-culture-in-north-carolina/&amp;title=Protosprout+%3A+Promoting+Entrepreneurship+%26%23038%3B+Start-Up+Culture+in+North+Carolina" title="Add 'Protosprout : Promoting Entrepreneurship &#038; Start-Up Culture in North Carolina' to Del.icio.us"><img src="http://kurtgrandis.com/blog/wp-content/plugins/social-bookmarking-reloaded/delicious.png" title="Add 'Protosprout : Promoting Entrepreneurship &#038; Start-Up Culture in North Carolina' to Del.icio.us" alt="Add 'Protosprout : Promoting Entrepreneurship &#038; Start-Up Culture in North Carolina' to Del.icio.us" /></a><a class="social_img" onclick="window.open(this.href, '_blank', 'scrollbars=yes,menubar=no,border=0,height=600,width=750,resizable=yes,toolbar=no,location=no,status=no'); return false;" href="http://digg.com/submit?phase=2&amp;url=http://kurtgrandis.com/blog/2008/11/18/protosprout-promoting-entrepreneurship-start-up-culture-in-north-carolina/&amp;title=Protosprout+%3A+Promoting+Entrepreneurship+%26%23038%3B+Start-Up+Culture+in+North+Carolina" title="Add 'Protosprout : Promoting Entrepreneurship &#038; Start-Up Culture in North Carolina' to digg"><img src="http://kurtgrandis.com/blog/wp-content/plugins/social-bookmarking-reloaded/digg.png" title="Add 'Protosprout : Promoting Entrepreneurship &#038; Start-Up Culture in North Carolina' to digg" alt="Add 'Protosprout : Promoting Entrepreneurship &#038; Start-Up Culture in North Carolina' to digg" /></a><a class="social_img" onclick="window.open(this.href, '_blank', 'scrollbars=yes,menubar=no,border=0,height=600,width=750,resizable=yes,toolbar=no,location=no,status=no'); return false;" href="http://reddit.com/submit?url=http://kurtgrandis.com/blog/2008/11/18/protosprout-promoting-entrepreneurship-start-up-culture-in-north-carolina/&amp;title=Protosprout+%3A+Promoting+Entrepreneurship+%26%23038%3B+Start-Up+Culture+in+North+Carolina" title="Add 'Protosprout : Promoting Entrepreneurship &#038; Start-Up Culture in North Carolina' to reddit"><img src="http://kurtgrandis.com/blog/wp-content/plugins/social-bookmarking-reloaded/reddit.png" title="Add 'Protosprout : Promoting Entrepreneurship &#038; Start-Up Culture in North Carolina' to reddit" alt="Add 'Protosprout : Promoting Entrepreneurship &#038; Start-Up Culture in North Carolina' to reddit" /></a><a class="social_img" onclick="window.open(this.href, '_blank', 'scrollbars=yes,menubar=no,border=0,height=600,width=750,resizable=yes,toolbar=no,location=no,status=no'); return false;" href="http://www.technorati.com/faves?add=http://kurtgrandis.com/blog/2008/11/18/protosprout-promoting-entrepreneurship-start-up-culture-in-north-carolina/" title="Add 'Protosprout : Promoting Entrepreneurship &#038; Start-Up Culture in North Carolina' to Technorati"><img src="http://kurtgrandis.com/blog/wp-content/plugins/social-bookmarking-reloaded/technorati.png" title="Add 'Protosprout : Promoting Entrepreneurship &#038; Start-Up Culture in North Carolina' to Technorati" alt="Add 'Protosprout : Promoting Entrepreneurship &#038; Start-Up Culture in North Carolina' to Technorati" /></a><a class="social_img" onclick="window.open(this.href, '_blank', 'scrollbars=yes,menubar=no,border=0,height=600,width=750,resizable=yes,toolbar=no,location=no,status=no'); return false;" href="http://www.stumbleupon.com/submit?url=http://kurtgrandis.com/blog/2008/11/18/protosprout-promoting-entrepreneurship-start-up-culture-in-north-carolina/&amp;title=Protosprout+%3A+Promoting+Entrepreneurship+%26%23038%3B+Start-Up+Culture+in+North+Carolina" title="Add 'Protosprout : Promoting Entrepreneurship &#038; Start-Up Culture in North Carolina' to Stumble Upon"><img src="http://kurtgrandis.com/blog/wp-content/plugins/social-bookmarking-reloaded/stumbleupon.png" title="Add 'Protosprout : Promoting Entrepreneurship &#038; Start-Up Culture in North Carolina' to Stumble Upon" alt="Add 'Protosprout : Promoting Entrepreneurship &#038; Start-Up Culture in North Carolina' to Stumble Upon" /></a><a class="social_img" onclick="window.open(this.href, '_blank', 'scrollbars=yes,menubar=no,border=0,height=600,width=750,resizable=yes,toolbar=no,location=no,status=no'); return false;" href="http://www.google.com/bookmarks/mark?op=edit&amp;output=popup&amp;bkmk=http://kurtgrandis.com/blog/2008/11/18/protosprout-promoting-entrepreneurship-start-up-culture-in-north-carolina/&amp;title=Protosprout+%3A+Promoting+Entrepreneurship+%26%23038%3B+Start-Up+Culture+in+North+Carolina" title="Add 'Protosprout : Promoting Entrepreneurship &#038; Start-Up Culture in North Carolina' to Google Bookmarks"><img src="http://kurtgrandis.com/blog/wp-content/plugins/social-bookmarking-reloaded/google.png" title="Add 'Protosprout : Promoting Entrepreneurship &#038; Start-Up Culture in North Carolina' to Google Bookmarks" alt="Add 'Protosprout : Promoting Entrepreneurship &#038; Start-Up Culture in North Carolina' to Google Bookmarks" /></a><a class="social_img" onclick="window.open(this.href, '_blank', 'scrollbars=yes,menubar=no,border=0,height=600,width=750,resizable=yes,toolbar=no,location=no,status=no'); return false;" href="http://slashdot.org/bookmark.pl?title=Protosprout+%3A+Promoting+Entrepreneurship+%26%23038%3B+Start-Up+Culture+in+North+Carolina&amp;url=http://kurtgrandis.com/blog/2008/11/18/protosprout-promoting-entrepreneurship-start-up-culture-in-north-carolina/" title="Add 'Protosprout : Promoting Entrepreneurship &#038; Start-Up Culture in North Carolina' to SlashDot"><img src="http://kurtgrandis.com/blog/wp-content/plugins/social-bookmarking-reloaded/slashdot.png" title="Add 'Protosprout : Promoting Entrepreneurship &#038; Start-Up Culture in North Carolina' to SlashDot" alt="Add 'Protosprout : Promoting Entrepreneurship &#038; Start-Up Culture in North Carolina' to SlashDot" /></a><a class="social_img" onclick="window.open(this.href, '_blank', 'scrollbars=yes,menubar=no,border=0,height=600,width=750,resizable=yes,toolbar=no,location=no,status=no'); return false;" href="http://twitter.com/home?status=http://kurtgrandis.com/blog/2008/11/18/protosprout-promoting-entrepreneurship-start-up-culture-in-north-carolina/" title="Add 'Protosprout : Promoting Entrepreneurship &#038; Start-Up Culture in North Carolina' to Twitter"><img src="http://kurtgrandis.com/blog/wp-content/plugins/social-bookmarking-reloaded/twitter.png" title="Add 'Protosprout : Promoting Entrepreneurship &#038; Start-Up Culture in North Carolina' to Twitter" alt="Add 'Protosprout : Promoting Entrepreneurship &#038; Start-Up Culture in North Carolina' to Twitter" /></a></div>
<!-- Social Bookmarking Reloaded END --><img src="http://feeds.feedburner.com/~r/kurtgrandis/qQcH/~4/t1IspD1hlHw" height="1" width="1"/>]]></content:encoded>
			<wfw:commentRss>http://kurtgrandis.com/blog/2008/11/18/protosprout-promoting-entrepreneurship-start-up-culture-in-north-carolina/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		<feedburner:origLink>http://kurtgrandis.com/blog/2008/11/18/protosprout-promoting-entrepreneurship-start-up-culture-in-north-carolina/</feedburner:origLink></item>
	</channel>
</rss><!-- Dynamic page generated in 0.590 seconds. --><!-- Cached page generated by WP-Super-Cache on 2010-03-09 03:57:38 --><!-- Compression = gzip -->
