<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0"
	xmlns:content="http://purl.org/rss/1.0/modules/content/"
	xmlns:wfw="http://wellformedweb.org/CommentAPI/"
	xmlns:dc="http://purl.org/dc/elements/1.1/"
	xmlns:atom="http://www.w3.org/2005/Atom"
	xmlns:sy="http://purl.org/rss/1.0/modules/syndication/"
	xmlns:slash="http://purl.org/rss/1.0/modules/slash/"
	>

<channel>
	<title>Kurt GrandisKurt Grandis</title>
	<atom:link href="http://kurtgrandis.com/blog/feed/" rel="self" type="application/rss+xml" />
	<link>http://kurtgrandis.com/blog</link>
	<description>Software Engineering &#38; Entrepreneurship</description>
	<lastBuildDate>Sun, 25 Nov 2012 08:14:47 +0000</lastBuildDate>
	<language>en-US</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
	<generator>http://wordpress.org/?v=3.4.2</generator>
		<item>
		<title>Python and the 555 Blinking Eyes in the Bushes</title>
		<link>http://kurtgrandis.com/blog/2012/11/25/python-and-the-555-blinking-eyes-in-the-bushes/</link>
		<comments>http://kurtgrandis.com/blog/2012/11/25/python-and-the-555-blinking-eyes-in-the-bushes/#comments</comments>
		<pubDate>Sun, 25 Nov 2012 08:14:18 +0000</pubDate>
		<dc:creator>kurt</dc:creator>
				<category><![CDATA[Python]]></category>
		<category><![CDATA[555]]></category>
		<category><![CDATA[astable]]></category>
		<category><![CDATA[blinking]]></category>
		<category><![CDATA[blinky]]></category>
		<category><![CDATA[calculator]]></category>
		<category><![CDATA[electronics]]></category>
		<category><![CDATA[led]]></category>
		<category><![CDATA[reverse calculator]]></category>
		<category><![CDATA[scipy]]></category>

		<guid isPermaLink="false">http://kurtgrandis.com/blog/?p=592</guid>
		<description><![CDATA[<p>For Halloween, I had wired the bushes in front of my house with a dozen or so pairs of blinking LED eyes. Each pair of eyes blinked at their own rate&#8211;all powered by an Arduino. After building these centrally-wired daemonic bush entities I wanted to be able to deploy a few more in remote bushes and trees without having to wire them up to an Arduino. So I turned to my good friend the 555 ...</p><p>The post <a href="http://kurtgrandis.com/blog/2012/11/25/python-and-the-555-blinking-eyes-in-the-bushes/">Python and the 555 Blinking Eyes in the Bushes</a> appeared first on <a href="http://kurtgrandis.com/blog">Kurt Grandis</a>.</p>]]></description>
			<content:encoded><![CDATA[<div id="attachment_615" style="width:400px;" class="wp-caption alignright"><img class=" wp-image-615" title="blinky eyes deployed in a bush" src="http://kurtgrandis.com/blog/wp-content/uploads/2012/11/eyes.jpg" alt="" width="400" height="174" /><span class="wp-caption-text">LED blinky eye units consisting of craft popsicle sticks and pipe cleaner anchors deployed in a bush.</span></div>
<p>For Halloween, I had wired the bushes in front of my house with a dozen or so pairs of blinking LED eyes. Each pair of eyes blinked at their own rate&#8211;all powered by an Arduino. After building these centrally-wired daemonic bush entities I wanted to be able to deploy a few more in remote bushes and trees without having to wire them up to an Arduino. So I turned to my good friend the 555 timer chip. <a href="http://en.wikipedia.org/wiki/555_timer_IC">555 timers</a> for the uninitiated are a very versatile integrated circuit that can be used in a variety of timer-related circuits.</p>
<p>I was looking to achieve a very specific blinking pattern and was having a hard time figuring out the optimal set of components to use. <a href="http://lmgtfy.com/?q=555+timer+calculator">There are tons of calculators out there</a> for figuring out the characteristics of a 555 circuit based on the values of the components you use. If you&#8217;ve ever tried using one of these calculators for this sort of project it can be very frustrating. I don&#8217;t actually care what the components&#8217; values are; I&#8217;m usually not thinking about that side of the equations at all. What I really care about are the timing characteristics of the circuit in terms of how long a signal is high and how long it is low. I want my &#8220;on time&#8221; to be X seconds and I want my &#8220;off time&#8221; to be Y seconds. You figure out what components I need to plug in to get that behavior.</p>
<p>Most of the existing 555 calculators I was able to find take the component values (e.g. R1= 100k, R2= 150k) and then compute the frequency, time_high, duty cycle, etc. I would rather think about the behavior I&#8217;m after and plug in the time_high and time_low and receive the values of the components I should use to achieve such a circuit.</p>
<p>Hang on. Let&#8217;s turn the real world dial up one more notch. It just so happens, I don&#8217;t have a resistor measured at 183.45 Ohms to achieve the specific oscillation I desire. Maybe we could constrain the calculator to only consider component values for components I actually have in my possession. Give me the best possible fit for the components that I do have (or can get my hands on).</p>
<p>So, I whipped up a simple Python tool to help me optimize my component selection to best achieve my desired blinking pattern. Here is an example snippet that solves the 555 timing equations using my inventory of components and my desired signal characteristics:</p>
<pre class="python" name="code">from optimize_555.opt import optimize
target_high = 42  #42 seconds on
target_low = 15 #15 seconds off
R1, R2, C, time_high, time_low = optimize(target_high, target_low)</pre>
<p>This results in a timing circuit that goes high for 45.7 seconds and then has a 15.2 second low. And the best part of it is it&#8217;s accomplished using components that I have in-stock. R1 is 200KOhm, R2 is 100KOhm, and C is 220uF. The system defaults to a set of commonly available components, but you can override and define your own inventory.</p>
<p>In its current form its a very thin wrapper around some basic SciPy functions. You can check it out<a href="https://github.com/kgrandis/optimize_555"> over at github</a>. If there is some interest, I hope to expose it through a web interface at some point to make it more accessible to non-programming, electronic hobbyists. Hope it helps and happy blinking!</p>
<p>The post <a href="http://kurtgrandis.com/blog/2012/11/25/python-and-the-555-blinking-eyes-in-the-bushes/">Python and the 555 Blinking Eyes in the Bushes</a> appeared first on <a href="http://kurtgrandis.com/blog">Kurt Grandis</a>.</p>]]></content:encoded>
			<wfw:commentRss>http://kurtgrandis.com/blog/2012/11/25/python-and-the-555-blinking-eyes-in-the-bushes/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Ingress: Dangers and First Impressions</title>
		<link>http://kurtgrandis.com/blog/2012/11/20/ingress-dangers-and-first-impressions/</link>
		<comments>http://kurtgrandis.com/blog/2012/11/20/ingress-dangers-and-first-impressions/#comments</comments>
		<pubDate>Wed, 21 Nov 2012 04:00:58 +0000</pubDate>
		<dc:creator>kurt</dc:creator>
				<category><![CDATA[Games]]></category>
		<category><![CDATA[Uncategorized]]></category>
		<category><![CDATA[ar]]></category>
		<category><![CDATA[augemented reality]]></category>
		<category><![CDATA[dangers]]></category>
		<category><![CDATA[game]]></category>
		<category><![CDATA[ingress]]></category>
		<category><![CDATA[niantic]]></category>

		<guid isPermaLink="false">http://kurtgrandis.com/blog/?p=595</guid>
		<description><![CDATA[<p>I push through the front doors of the US Post Office, my eyes still glued to my Ingress exotic matter (XM) scanner. I&#8217;m so going to hack this portal! &#8220;Target Acquired,&#8221; my cell phone chirped and loud enough for a few other patrons to notice. Oh crap, I may have just made a poor life decision, I thought as I glanced around the federal building. Ingress is a new augmented reality game created by Google&#8217;s Niantic Labs. Imagine ...</p><p>The post <a href="http://kurtgrandis.com/blog/2012/11/20/ingress-dangers-and-first-impressions/">Ingress: Dangers and First Impressions</a> appeared first on <a href="http://kurtgrandis.com/blog">Kurt Grandis</a>.</p>]]></description>
			<content:encoded><![CDATA[<p>I push through the front doors of the US Post Office, my eyes still glued to my <a href="http://www.ingress.com/">Ingress</a> exotic matter (XM) scanner. I&#8217;m so going to hack this portal! <em>&#8220;Target Acquired,&#8221;</em> my cell phone chirped and loud enough for a few other patrons to notice. Oh crap, <em>I may have just made a poor life decision,</em> I thought as I glanced around the federal building.</p>
<p><a href="http://www.ingress.com/">Ingress</a> is a new augmented reality game created by Google&#8217;s Niantic Labs. Imagine a cross between Pac Man, Foursquare, Geocaching, and Capture the Flag all rolled into one app on your phone. You run around town looking at a Google Map-like view gathering energy so that you can capture and defend geographically-distributed portals against an enemy faction.</p>
<p>Luckily, I walked away from my first big Ingress encounter unscathed, unfrisked, and undetained. But, I&#8217;m now picturing very different scenarios in the near future with people suspiciously circling buildings, eyes glued to their phones that occasionally make scary, threatening, futuristic sounds. Just ask the <a href="http://en.wikipedia.org/wiki/2007_Boston_bomb_scare">Mooninites</a> or that <a href="http://boingboing.net/2007/09/21/mit-student-arrested.html">student wearing art composed of exposed electronics</a>, but it doesn&#8217;t seem to take much to freak people out these days.</p>
<div id="attachment_598" style="width:250px;" class="wp-caption alignright"><img class="size-full wp-image-598" title="250px-Mooninite2" src="http://kurtgrandis.com/blog/wp-content/uploads/2012/11/250px-Mooninite2.jpg" alt="Mooninite" width="250" height="253" /><span class="wp-caption-text">Mooninite device that people freaked out about: http://en.wikipedia.org/wiki/2007_Boston_bomb_scare . Image from Wikipedia.</span></div>
<p>The game has placed portals on a number of sites that the broader citizen base may not appreciate seeing trampled including federal buildings, libraries, and even some public middle school grounds. Fire departments also appear to be a very popular location for portals. One fire department with a portal I investigated could not be hacked without driving or walking up into their parking lot, potentially blocking their garage. I took a moment to talk with the on-duty firefighter at the station to get his take on the game and to see if anyone had notified them that their station would now be a part of some geeky capture the flag game. Nope. He hadn&#8217;t heard of it and while he sounded intrigued by the concept he did not like the idea of increased traffic pulling into their parking lot. As a local homeowner, I have to agree.</p>
<p>The game is still in beta and perhaps one goal is to identify some of these concerns before unleashing the nerd hordes. Suspected terrorist and arsonist concerns aside, this has been a pretty entertaining game. I&#8217;ve hoped for an augmented reality game like this for awhile and I think the folks at Niantic Labs have done a great job. It&#8217;s even provided enough motivation for me to get a little extra exercise in as I take walking breaks to hack and recharge portals. I don&#8217;t know how the game dynamics will change or scale once more people join the action, but it definitely has my attention for the time being.</p>
<p>Just think twice if Google tells you to visit the local fire department at night and lets revisit portal placement. Make good life choices.</p>
<p>&nbsp;</p>
<div id="attachment_600" style="width:600px;" class="wp-caption aligncenter"><img class="size-full wp-image-600" title="Ingress Map of Durham" src="http://kurtgrandis.com/blog/wp-content/uploads/2012/11/ingress_map.jpg" alt="Ingress Map of Durham" width="600" height="236" /><span class="wp-caption-text">Snapshot of Ingress activity in Durham (Nov 2012)</span></div>
<p>The post <a href="http://kurtgrandis.com/blog/2012/11/20/ingress-dangers-and-first-impressions/">Ingress: Dangers and First Impressions</a> appeared first on <a href="http://kurtgrandis.com/blog">Kurt Grandis</a>.</p>]]></content:encoded>
			<wfw:commentRss>http://kurtgrandis.com/blog/2012/11/20/ingress-dangers-and-first-impressions/feed/</wfw:commentRss>
		<slash:comments>5</slash:comments>
		</item>
		<item>
		<title>Hello World Update</title>
		<link>http://kurtgrandis.com/blog/2012/10/23/hello-world-update/</link>
		<comments>http://kurtgrandis.com/blog/2012/10/23/hello-world-update/#comments</comments>
		<pubDate>Wed, 24 Oct 2012 03:21:45 +0000</pubDate>
		<dc:creator>kurt</dc:creator>
				<category><![CDATA[Entrepreneurship]]></category>
		<category><![CDATA[Local Business]]></category>
		<category><![CDATA[Presentation]]></category>
		<category><![CDATA[Software Engineering]]></category>
		<category><![CDATA[Uncategorized]]></category>
		<category><![CDATA[Agile]]></category>
		<category><![CDATA[Django]]></category>
		<category><![CDATA[popular mechanics]]></category>
		<category><![CDATA[pruvop]]></category>
		<category><![CDATA[Python]]></category>
		<category><![CDATA[startup]]></category>
		<category><![CDATA[triangle]]></category>

		<guid isPermaLink="false">http://kurtgrandis.com/blog/?p=542</guid>
		<description><![CDATA[<p>It&#8217;s been awhile since my last real update and a lot&#8217;s been going on. First, the good people of Popular Mechanics reached out to me earlier this year about the squirrel/sentry gun project and did a little write-up about it in their September 2012 issue. Having grown up on Popular Mechanics it was very cool and flattering. (I&#8217;m still tempted to send away for plans to build a flying ship out of ordinary household vacuum cleaners.) I ...</p><p>The post <a href="http://kurtgrandis.com/blog/2012/10/23/hello-world-update/">Hello World Update</a> appeared first on <a href="http://kurtgrandis.com/blog">Kurt Grandis</a>.</p>]]></description>
			<content:encoded><![CDATA[<p><a href="http://www.popularmechanics.com/technology/engineering/gonzo/backyard-genius-10-ingenious-amateur-builds-for-2012?click=main_sr#slide-9"><br />
<img class="alignright size-full wp-image-543" title="Popular-Mechanics-Squirrel" src="http://kurtgrandis.com/blog/wp-content/uploads/2012/10/PopMech.jpg" alt="Popular Mechanics Illustration of Sentry Gun with Squirrel" width="300" height="300" /></a></p>
<p>It&#8217;s been awhile since my last real update and a lot&#8217;s been going on. First, the good people of Popular Mechanics reached out to me earlier this year about the<a title="Recap of the Squirrel Hordes" href="http://kurtgrandis.com/blog/2012/03/12/recap-of-the-squirrel-hordes/"> squirrel/sentry gun project</a> and did a little write-up about it in their <a href="http://www.popularmechanics.com/technology/engineering/gonzo/backyard-genius-10-ingenious-amateur-builds-for-2012?click=main_sr#slide-9">September 2012 issue.</a> Having grown up on Popular Mechanics it was very cool and flattering. (I&#8217;m still tempted to send away for plans to build a flying ship out of ordinary household vacuum cleaners.) I think my favorite part was getting a cartoon rendering of myself. And to all the people who write to me about their ongoing wildlife battles: stay strong!</p>
<p>Since my last real update, I also left my amazing team to start a new adventure. I am now the Director of Technology at <a href="http://pruvop.com">Pruvop</a>. As a digital products laboratory we work on a wide-range of projects, from building functional prototypes for early-stage startups to helping larger organizations streamline their internal processes by integrating intelligent automation software. I&#8217;m back in the mud again, designing and building all sorts of cool projects in Downtown Durham.  It has been great being surrounded by a cross-functional team (marketing, business, developers) who all appreciate the strengths of agile and lean methodologies.</p>
<p>I hope to be able to share some new developments in the coming months!</p>
<p>The post <a href="http://kurtgrandis.com/blog/2012/10/23/hello-world-update/">Hello World Update</a> appeared first on <a href="http://kurtgrandis.com/blog">Kurt Grandis</a>.</p>]]></content:encoded>
			<wfw:commentRss>http://kurtgrandis.com/blog/2012/10/23/hello-world-update/feed/</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
		<item>
		<title>PyCarolinas Redux</title>
		<link>http://kurtgrandis.com/blog/2012/10/22/pycarolinas-redux/</link>
		<comments>http://kurtgrandis.com/blog/2012/10/22/pycarolinas-redux/#comments</comments>
		<pubDate>Mon, 22 Oct 2012 15:40:32 +0000</pubDate>
		<dc:creator>kurt</dc:creator>
				<category><![CDATA[Django]]></category>
		<category><![CDATA[Presentation]]></category>
		<category><![CDATA[Python]]></category>
		<category><![CDATA[pycarolinas]]></category>

		<guid isPermaLink="false">http://kurtgrandis.com/blog/?p=549</guid>
		<description><![CDATA[<p>We just wrapped up the inaugural PyCarolinas conference. I know I had a good time and it was great to see so many people in attendance not only from the southeast, but from across the US with even some international attendees. Professor Gary Bishop of the Department of Computer Science at UNC Chapel Hill gave our first keynote on Saturday touching on accessibility and enabling technologies. It was an inspiring call to action. We as ...</p><p>The post <a href="http://kurtgrandis.com/blog/2012/10/22/pycarolinas-redux/">PyCarolinas Redux</a> appeared first on <a href="http://kurtgrandis.com/blog">Kurt Grandis</a>.</p>]]></description>
			<content:encoded><![CDATA[<p><img class="alignleft size-full wp-image-553" title="pycarolinas" src="http://kurtgrandis.com/blog/wp-content/uploads/2012/10/pycarolinas.jpg" alt="PyCarolinas Sign" width="350" height="201" /></p>
<p>We just wrapped up the inaugural<a href="http://pycarolinas.org/"> PyCarolinas</a> conference. I know I had a good time and it was great to see so many people in attendance not only from the southeast, but from across the US with even some international attendees.</p>
<p><a href="http://www.cs.unc.edu/~gb/">Professor Gary Bishop</a> of the Department of Computer Science at UNC Chapel Hill gave our first keynote on Saturday touching on accessibility and enabling technologies. It was an inspiring call to action. We as developers have tremendous power at our fingertips to make a difference in the lives of countless individuals around the world. Just do it and make it happen. Leave the committees out of it.</p>
<p><a href="http://www.roguelynn.com/2012/10/21/community-ftw-kicking-of-the-pycarolinas-community/">Lynn Root gave Sunday&#8217;s keynote</a>, where she shared her experiences in joining and building communities. My favorite take away here on the simplicity of community and solidarity was, &#8220;Hey! You&#8217;re a nerd. I&#8217;m a nerd. Let&#8217;s hang out. Kthbai.&#8221;</p>
<p>Barry Peddycord III&#8217;s talk about Python in computer science education sparked a lot of offline discussion, which struck close to home given some of the educational technology initiatives I&#8217;m working on.</p>
<p>I missed Michael DeHaan&#8217;s talk on <a href="http://ansible.cc/">Ansible</a>, but it did put it on my radar. While, I&#8217;ve made healthy use of Chef, Puppet, (and fabric), they&#8217;ve never felt just right and I would gladly jump ship to a better solution.  So, I hope to check it out in the next few days.</p>
<p>I was cursing Fred Alger after his talk, Sysadmining Python to the Moon, for planting the seed that maybe I <em>could</em> build something and send it to the edge of space&#8211;it&#8217;s possible. Just what I need. It was a fun, inspiring talk and while I hope I can shake its effects, I have a feeling I may be revisiting it. You can check out his <a href=" https://github.com/phred/moontalk">presentation materials over on github.</a></p>
<p>François Dion gave a fun and passionate talk about Raspberry Pis, their use in exciting kids, and how to seriously soup them up with all sorts of add-ons. I plan on following his work over at his <a href="http://raspberry-python.blogspot.com/">Raspberry-Python blog.</a></p>
<p>David Ray and Julia Elman from Caktus also had great talks about working with designers, which sparked some good discussion. David presented <strong><a href=" https://github.com/daaray/django-comps ">django-comps</a>, </strong>which looks like a simple, yet handy tool for serving a directory of static-y html files from a Django project. The idea is you can have a designer work within the same source repo as the project proper as they start building out comps/templates.  This is an ideal setup for integrated rapid prototyping. Your project&#8217;s defined comps directory will show a list view of the available pages from which you can drill down. You can also easily zip things up for delivery to a client for offline review. I&#8217;m looking forward to checking this one out.</p>
<p>Another nice nugget came care of a lightning talk given by Simeon Franklin (@simeonfranklin). If you find yourself using optparse: stop. No really. <a href="http://docopt.org/ ">Check out <strong>docopt</strong>.</a> It looks like it may take a tremendous amount of pain out of writing command line utilities.</p>
<p>I think the first PyCarolinas event went swimmingly. A huge thanks to Calvin Spealman, Chris Calloway, UNC, the PSF, all the volunteers and the sponsors for making it happen. I&#8217;m already looking forward to next year&#8217;s!</p>
<div id="attachment_587" style="width:800px;" class="wp-caption aligncenter"><a href="http://kurtgrandis.com/blog/wp-content/uploads/2012/10/pycarolinas_crowd.jpg" rel="image_group"><img class="size-full wp-image-587" title="PyCarolinas Attendees" src="http://kurtgrandis.com/blog/wp-content/uploads/2012/10/pycarolinas_crowd.jpg" alt="PyCarolinas Attendees" width="800" height="315" /></a><span class="wp-caption-text">PyCarolinas Attendees https://twitter.com/PyCarolinas/status/260075547537833984</span></div>
<p>The post <a href="http://kurtgrandis.com/blog/2012/10/22/pycarolinas-redux/">PyCarolinas Redux</a> appeared first on <a href="http://kurtgrandis.com/blog">Kurt Grandis</a>.</p>]]></content:encoded>
			<wfw:commentRss>http://kurtgrandis.com/blog/2012/10/22/pycarolinas-redux/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Recap of the Squirrel Hordes</title>
		<link>http://kurtgrandis.com/blog/2012/03/12/recap-of-the-squirrel-hordes/</link>
		<comments>http://kurtgrandis.com/blog/2012/03/12/recap-of-the-squirrel-hordes/#comments</comments>
		<pubDate>Tue, 13 Mar 2012 02:28:33 +0000</pubDate>
		<dc:creator>kurt</dc:creator>
				<category><![CDATA[Data]]></category>
		<category><![CDATA[Machine Learning]]></category>
		<category><![CDATA[Presentation]]></category>
		<category><![CDATA[Python]]></category>
		<category><![CDATA[bird feeder]]></category>
		<category><![CDATA[computer vision]]></category>
		<category><![CDATA[presentation]]></category>
		<category><![CDATA[pycon]]></category>
		<category><![CDATA[sentry gun]]></category>
		<category><![CDATA[squirrels]]></category>

		<guid isPermaLink="false">http://kurtgrandis.com/blog/?p=522</guid>
		<description><![CDATA[<p>I gave my PyCon talk this weekend&#8211;&#8220;Militarizing Your Backyard With Python: Computer Vision and the Squirrel Hordes.&#8221; I was not prepared for the number of people who caught me after the talk and throughout the conference telling me about their own battles. Thanks again for all the recommendations about how to improve my firepower, tracking, and classification accuracy. As requested I&#8217;ve posted the presentation on SlideShare and here&#8217;s the final squirrel encounter video and the ...</p><p>The post <a href="http://kurtgrandis.com/blog/2012/03/12/recap-of-the-squirrel-hordes/">Recap of the Squirrel Hordes</a> appeared first on <a href="http://kurtgrandis.com/blog">Kurt Grandis</a>.</p>]]></description>
			<content:encoded><![CDATA[<div id="attachment_531" style="width:200px;" class="wp-caption alignright"><img class="size-full wp-image-531 " title="squirrel" src="http://kurtgrandis.com/blog/wp-content/uploads/2012/03/squirrel.jpg" alt="squirrel" width="200" height="154" /><span class="wp-caption-text">Horde Scout (source:wikipedia)</span></div>
<p>I gave my PyCon talk this weekend&#8211;<a href="https://us.pycon.org/2012/schedule/presentation/267/">&#8220;Militarizing Your Backyard With Python: Computer Vision and the Squirrel Hordes.&#8221; </a>I was not prepared for the number of people who caught me after the talk and throughout the conference telling me about their own battles. Thanks again for all the recommendations about how to improve my firepower, tracking, and classification accuracy.</p>
<p>As requested I&#8217;ve posted the <a href="http://www.slideshare.net/kgrandis/pycon-2012-militarizing-your-backyard-computer-vision-and-the-squirrel-hordes">presentation on SlideShare</a> and <a href="http://youtu.be/_mbvqxjFZpE">here&#8217;s the final squirrel encounter video</a> and the actual <a href="http://pyvideo.org/video/674/militarizing-your-backyard-with-python-computer">PyCon Presentation.</a></p>
<p>One great resource that was really helpful for getting ideas about sentry guns is <a href="https://sites.google.com/site/projectsentrygun/">Project Sentry Gun</a>. There is Wiring and Processing code to get you started as well as a premade Arduino shield if you&#8217;re interested. The folks at <a href="http://www.servocity.com/">Servocity</a> were also very helpful in sizing servos for my project.</p>
<p>As time permits, I&#8217;ll post some additional articles detailing the various steps of my project that folks seem to be interested in.</p>
<p>Thanks all. Good luck and don&#8217;t get captured.</p>
<p>The post <a href="http://kurtgrandis.com/blog/2012/03/12/recap-of-the-squirrel-hordes/">Recap of the Squirrel Hordes</a> appeared first on <a href="http://kurtgrandis.com/blog">Kurt Grandis</a>.</p>]]></content:encoded>
			<wfw:commentRss>http://kurtgrandis.com/blog/2012/03/12/recap-of-the-squirrel-hordes/feed/</wfw:commentRss>
		<slash:comments>6</slash:comments>
		</item>
		<item>
		<title>Python Hack Night #3</title>
		<link>http://kurtgrandis.com/blog/2011/07/20/python-hack-night-3/</link>
		<comments>http://kurtgrandis.com/blog/2011/07/20/python-hack-night-3/#comments</comments>
		<pubDate>Thu, 21 Jul 2011 03:41:28 +0000</pubDate>
		<dc:creator>kurt</dc:creator>
				<category><![CDATA[Django]]></category>
		<category><![CDATA[Games]]></category>
		<category><![CDATA[Local Business]]></category>
		<category><![CDATA[Python]]></category>
		<category><![CDATA[hack night]]></category>
		<category><![CDATA[trizpug]]></category>

		<guid isPermaLink="false">http://kurtgrandis.com/blog/?p=517</guid>
		<description><![CDATA[<p>We had a good turn out for TriZPUG&#8217;s third Python Hack Night tonight. All in all, nine local pythonistas showed up at MetaMetrics in Durham and dug right in. There was good conversation and it seems like progress was made on most fronts. We had a wide range of projects including: personal websites, a scrum workflow tool, a computational teaching problem, a game project, a nose plugin, a Django-based charting framework, and more. We even ...</p><p>The post <a href="http://kurtgrandis.com/blog/2011/07/20/python-hack-night-3/">Python Hack Night #3</a> appeared first on <a href="http://kurtgrandis.com/blog">Kurt Grandis</a>.</p>]]></description>
			<content:encoded><![CDATA[<p>We had a good turn out for <a href="http://trizpug.org" target="_blank">TriZPUG&#8217;s</a> third Python Hack Night tonight. All in all, nine local pythonistas showed up at MetaMetrics in Durham and dug right in. There was good conversation and it seems like progress was made on most fronts. We had a wide range of projects including: personal websites, a scrum workflow tool, a computational teaching problem, a game project, a nose plugin, a Django-based charting framework, and more. We even had an impromptu game AI-building competition emerge.</p>
<p>I was pleased with the results and would love to see one at least once a month. Let&#8217;s see what August brings.</p>
<p>The post <a href="http://kurtgrandis.com/blog/2011/07/20/python-hack-night-3/">Python Hack Night #3</a> appeared first on <a href="http://kurtgrandis.com/blog">Kurt Grandis</a>.</p>]]></content:encoded>
			<wfw:commentRss>http://kurtgrandis.com/blog/2011/07/20/python-hack-night-3/feed/</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
		<item>
		<title>Surveying Mechanical Turk to Validate a Startup Idea</title>
		<link>http://kurtgrandis.com/blog/2011/02/01/surveying-mechanical-turk-to-validate-a-startup-idea/</link>
		<comments>http://kurtgrandis.com/blog/2011/02/01/surveying-mechanical-turk-to-validate-a-startup-idea/#comments</comments>
		<pubDate>Wed, 02 Feb 2011 03:36:59 +0000</pubDate>
		<dc:creator>kurt</dc:creator>
				<category><![CDATA[Agile]]></category>
		<category><![CDATA[Data]]></category>
		<category><![CDATA[Entrepreneurship]]></category>
		<category><![CDATA[market research]]></category>
		<category><![CDATA[mechanical turk]]></category>
		<category><![CDATA[mturk]]></category>
		<category><![CDATA[mvp]]></category>
		<category><![CDATA[startup]]></category>
		<category><![CDATA[survey]]></category>

		<guid isPermaLink="false">http://kurtgrandis.com/blog/?p=458</guid>
		<description><![CDATA[<p>I was intrigued by Lindsey Harper&#8217;s post, &#8220;How I Used Amazon&#8217;s Mechanical Turk to Validate my Startup Idea.&#8221; If you&#8217;ve ever worked with market research firms, built your own panels, or have hit the pavement trying to collect your own market research you know it can be expensive and/or time consuming. The idea of having a broad and cheap sounding board available online was very appealing. I figured I would give it a shot and run a ...</p><p>The post <a href="http://kurtgrandis.com/blog/2011/02/01/surveying-mechanical-turk-to-validate-a-startup-idea/">Surveying Mechanical Turk to Validate a Startup Idea</a> appeared first on <a href="http://kurtgrandis.com/blog">Kurt Grandis</a>.</p>]]></description>
			<content:encoded><![CDATA[<p>I was intrigued by Lindsey Harper&#8217;s <a href="http://harperlindsey.com/2010/09/01/how-i-used-amazons-mechanical-turk-to-validate-my-startup-idea/" target="_blank">post</a>, &#8220;How I Used Amazon&#8217;s <em>Mechanical Turk</em> to Validate my Startup Idea.&#8221; If you&#8217;ve ever worked with market research firms, built your own panels, or have hit the pavement trying to collect your own market research you know it can be expensive and/or time consuming. The idea of having a broad and cheap sounding board available online was very appealing.</p>
<p>I figured I would give it a shot and run a few tests through the Mechanical Turk and see how it stacked up against some more traditional market research options. I grabbed my latest business idea&#8211;viability untested&#8211;and set off for Amazon.</p>
<h3><strong>Testing Business Viability</strong></h3>
<p><img class="size-medium wp-image-473  alignleft" style="margin-left: 5px; border: 0px initial initial;" title="Dude! We totally just made 15 cents" src="http://kurtgrandis.com/blog/wp-content/uploads/2010/10/kids_laptop-300x199.jpg" alt="Dude! We totally just made 15 cents" width="200" /></p>
<p>It&#8217;s worth noting the startup I was working on was a subscription-based consumer service geared towards parents of younger children and their grandparents. As Lindsey described in her article you get no segmentation or guaranteed panel refinement on Mechanical Turk so I was at the mercy of self-selection. I specified in the task description I was looking for parents of children of a certain age and let it go.</p>
<p>I posed some very basic demographic questions (e.g. gender, age(s) of their children, age). Once I had some basic information on the respondents I probed if they face the problem my service intends to solve. Once I described the service, the survey asked how likely they would be to use it and how likely they would be to recommend it to others. There were also a few service-specific questions, some open-ended responses including, &#8220;why would you not use the service,&#8221; and a general thoughts and feedback form.</p>
<p>I actually had some fancier survey question types than I cared to implement through Amazon&#8217;s Mechanical Turk API so instead I hosted the survey over at SurveyMonkey and had the respondents enter a confirmation code into MTurk upon completion.</p>
<p><strong>Results: Well look at that&#8230;</strong></p>
<p>Not bad. MTurkers ended up providing fairly similar answers to those I received in the wilds. After some light data trimming the data sets were very similar. Responses to the &#8220;How likely would you be to use this service&#8221; question were pretty similar between the MTurk panel and my other groups; statistically there was about an 80% chance the response groups were pulled from the same population. The response patterns were slightly shifted, but the overall outcome was the same.</p>
<p>The data trimming was done to account for a  larger than expected number of MTurk respondents who were very price conscientious. Their responses described ongoing harsh economic conditions, the need to save money, and other general hardships. These folks were generally not represented or targeted in my other surveys.</p>
<p>As a bonus, the optional open-ended responses given by MTurk respondents were thoughtful and very useful. I was not expecting this level of detail. The optional open-ended question about general thoughts and feedback elicited a 47% response rate with an average of 40 words per response. That mean came with a standard deviation of 32 words per response&#8211;there were some really thoughtful responses in there.</p>
<h3><strong>Semifinal Thoughts</strong></h3>
<p>Would I use Amazon&#8217;s Mechanical Turk for this purpose again? I think so. It seems to be a good way to get a general feel for your idea and certainly grab some helpful feedback. The responses I received led me to believe it was a very thoughtful community.</p>
<p>In no way am I endorsing a survey of this type to be the entirety of your market research. This is a cheap and easy way to get some feelers out there and validate that you&#8217;re not (too) crazy. In the end it is still very important to get out there yourself and talk with potential customers early on.</p>
<p><em>FYI: The result of this work has become <a href="http://www.glitterduck.com">GlitterDuck</a>. I am getting ready to start some pilot runs soon. If you are interested in learning more or becoming a beta tester please sign up over at the site.</em></p>
<p>The post <a href="http://kurtgrandis.com/blog/2011/02/01/surveying-mechanical-turk-to-validate-a-startup-idea/">Surveying Mechanical Turk to Validate a Startup Idea</a> appeared first on <a href="http://kurtgrandis.com/blog">Kurt Grandis</a>.</p>]]></content:encoded>
			<wfw:commentRss>http://kurtgrandis.com/blog/2011/02/01/surveying-mechanical-turk-to-validate-a-startup-idea/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Gitosis for Mercurial</title>
		<link>http://kurtgrandis.com/blog/2010/03/20/gitosis-for-mercurial/</link>
		<comments>http://kurtgrandis.com/blog/2010/03/20/gitosis-for-mercurial/#comments</comments>
		<pubDate>Sat, 20 Mar 2010 13:06:15 +0000</pubDate>
		<dc:creator>kurt</dc:creator>
				<category><![CDATA[Python]]></category>
		<category><![CDATA[git]]></category>
		<category><![CDATA[gitosis]]></category>
		<category><![CDATA[hg]]></category>
		<category><![CDATA[karmic]]></category>
		<category><![CDATA[lshift]]></category>
		<category><![CDATA[mercurial]]></category>
		<category><![CDATA[mercurial-server]]></category>
		<category><![CDATA[sharedkeys]]></category>
		<category><![CDATA[ssh]]></category>
		<category><![CDATA[ubuntu]]></category>

		<guid isPermaLink="false">http://kurtgrandis.com/blog/?p=411</guid>
		<description><![CDATA[<p>As far as DVCSs go I&#8217;ve been a git user. That&#8217;s mostly because it was the first one I tried and it worked. I&#8217;ve been comfy and have enjoyed the world of git and GitHub, but a number of troublemakers have been trying to convince me to give Mercurial a shot. After some nudging I obliged. After a day or two of toy and experimental projects I started missing one of my primary git utilities&#8211;Gitosis. ...</p><p>The post <a href="http://kurtgrandis.com/blog/2010/03/20/gitosis-for-mercurial/">Gitosis for Mercurial</a> appeared first on <a href="http://kurtgrandis.com/blog">Kurt Grandis</a>.</p>]]></description>
			<content:encoded><![CDATA[<p>As far as DVCSs go I&#8217;ve been a git user. That&#8217;s mostly because it was the first one I tried and it worked. I&#8217;ve been comfy and have enjoyed the world of git and GitHub, but a number of troublemakers have been trying to convince me to give Mercurial a shot. After some nudging I obliged.</p>
<p>After a day or two of toy and experimental projects I started missing one of my primary git utilities&#8211;Gitosis. Gitosis is a package that lets you and all your collaborators interact with your git repositories using a single user account over SSH. Gitosis manages user authentication and permissioning using a system of  shared keys without ever exposing actual shell functionality.</p>
<p>It took me a little while to find <a href="http://www.lshift.net/mercurial-server.html">mercurial-server</a> by LShift, which seems to be Mercurial&#8217;s equivalent to Gitosis. So, here is how I got Gitosis-style shared key repository management to work with Mercurial.</p>
<h2>Installing Mercurial-Server on Ubuntu 9.10 (Karmic)</h2>
<p>Luckily, Paul Crowley of <a href="http://lshift.net">LShift</a>, the author of mercurial-server, has volunteered to manage a Debian package for Mercurial-Server, which makes our lives easier. Thanks!</p>
<h3>Install the Mercurial-Server Package</h3>
<p>Add the following line to your /etc/apt/sources.list file replacing the url with a <a href="http://packages.ubuntu.com/lucid/all/mercurial-server/download">mirror</a> that&#8217;s appropriate for your location:</p>
<pre class="bash:nocontrols:nogutter" name="code">deb http://mirrors.kernel.org/ubuntu lucid main universe</pre>
<div>then:</div>
<pre class="bash:nocontrols:nogutter" name="code">$ sudo apt-get update
$ sudo apt-get install mercurial mercurial-server</pre>
<p>OR, if you want to install the package manually outside of synaptics or apt you can download the .deb from <a href="http://packages.ubuntu.com/lucid/all/mercurial-server/download ">http://packages.ubuntu.com/lucid/all/mercurial-server/download</a> and then:</p>
<pre class="bash:nocontrols:nogutter" name="code">$ sudo dpkg -i mercurial-server_1.0.1-1_all.deb</pre>
<p>Mercurial-Server should now be installed. Additionally, a new user <em>hg</em> has been created and will be used to manage all your interactions with your mercurial repositories.</p>
<h3 style="font-size: 1.17em;">Setting Up Mercurial-Server Administrator (root)</h3>
<p>You now need to grant yourself administrator rights. All permissioning is done with keys, so you&#8217;ll need to copy your public key to mercurial-server&#8217;s admin keyring:</p>
<pre class="bash:nocontrols:nogutter" name="code">$ sudo cp id_rsa.pub /etc/mercurial-server/keys/root/YOURUSERNAME
$ sudo -u hg /usr/share/mercurial-server/refresh-auth</pre>
<p>The second command refreshes mercurial-server&#8217;s authentication system&#8211;authorizing your account as an administrator. You&#8217;re good to go!</p>
<h2 style="font-size: 1.5em;">Managing Mercurial-Server</h2>
<h3>The <em>hgadmin</em> Repository</h3>
<p>Just like gitosis&#8217; <em>gitosis-admin</em> repository, mercurial-server&#8217;s functionality can be managed via <em>hgadmin</em>. Go ahead and clone the repo:</p>
<pre class="bash:nocontrols:nogutter" name="code">$ hg clone ssh://hg@MyMercurialServer/hgadmin</pre>
<h3>Adding New Users</h3>
<p>With your <em>hgadmin</em> repository cloned you can now grant access to new users via their public keys</p>
<pre class="bash:nocontrols:nogutter" name="code">$ cd hgadmin
$ mkdir -p keys/users/
$ cp ~/kurt-key.pub keys/users/kurt
$ hg add
adding keys/users/kurt
$ hg commit -m "Added Kurt's public key"
$ hg push</pre>
<p>You can also allow and organize multiple keys per user. In that scenario you create a directory of keys for each user:</p>
<pre class="bash:nocontrols:nogutter" name="code">$ cd hgadmin
$ mkdir -p keys/users/kurt
$ cp ~/kurt-home.pub keys/users/kurt/home
$ cp ~/kurt-work.pub keys/users/kurt/work
$ hg add
adding keys/users/kurt/home
adding keys/users/kurt/work
$ hg commit -m "Added keys for Kurt's home and work computers"
$ hg push</pre>
<h3>Creating New Repositories</h3>
<p>As administrator, if you want to create a new repository you simple clone a mercurial project to a path on your mercurial-server. For example:</p>
<pre class="bash:nocontrols:nogutter" name="code">$ cd my_hg_proj
$ hg clone . ssh://hg@MyMercurialServer/my_hg_project</pre>
<p>Now you and your collaborators can clone, push, and pull from the server&#8217;s repository just as we did with <em>hgadmin</em>. For example:</p>
<pre class="bash:nocontrols:nogutter" name="code">$ hg clone ssh://hg@MyMercurialServer/my_hg_project</pre>
<h3>Managing Repository Permissions</h3>
<p>Now that you&#8217;ve created your repositories and added users you will want to manage permissions. Repository permissions can be managed through an <em>hgadmin</em> file called <em>access.conf</em>. I recommend reading the mercurial-server <a href="http://dev.lshift.net/paul/mercurial-server/docbook.html#id1318361">documentation</a> for more information on managing security.</p>
<p>So far I&#8217;ve found mercurial-server to be a great way to collaborate with others on private repositories outside of Bitbucket. My hat off to Paul Crowley and LShift.</p>
<p>The post <a href="http://kurtgrandis.com/blog/2010/03/20/gitosis-for-mercurial/">Gitosis for Mercurial</a> appeared first on <a href="http://kurtgrandis.com/blog">Kurt Grandis</a>.</p>]]></content:encoded>
			<wfw:commentRss>http://kurtgrandis.com/blog/2010/03/20/gitosis-for-mercurial/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Get Your Nose Out Of There!</title>
		<link>http://kurtgrandis.com/blog/2010/03/09/get-your-nose-out-of-there/</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[<p>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 run. Really, it wants your code to work and it loves making dots. But, see I knew better and ...</p><p>The post <a href="http://kurtgrandis.com/blog/2010/03/09/get-your-nose-out-of-there/">Get Your Nose Out Of There!</a> appeared first on <a href="http://kurtgrandis.com/blog">Kurt Grandis</a>.</p>]]></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:nogutter:nocontrols" name="code"> $ 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:nogutter:nocontrols" name="code"> $ 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:nogutter:nocontrols" name="code">$ 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>
<p>The post <a href="http://kurtgrandis.com/blog/2010/03/09/get-your-nose-out-of-there/">Get Your Nose Out Of There!</a> appeared first on <a href="http://kurtgrandis.com/blog">Kurt Grandis</a>.</p>]]></content:encoded>
			<wfw:commentRss>http://kurtgrandis.com/blog/2010/03/09/get-your-nose-out-of-there/feed/</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
		<item>
		<title>Python + Django vs. C# + ASP.NET: Productivity Showdown</title>
		<link>http://kurtgrandis.com/blog/2010/02/24/python-django-vs-c-asp-net-productivity-showdown/</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[<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. 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. ...</p><p>The post <a href="http://kurtgrandis.com/blog/2010/02/24/python-django-vs-c-asp-net-productivity-showdown/">Python + Django vs. C# + ASP.NET: Productivity Showdown</a> appeared first on <a href="http://kurtgrandis.com/blog">Kurt Grandis</a>.</p>]]></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" style="width:487px;" class="wp-caption alignnone"><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><span class="wp-caption-text">Normalized Developer Velocities: C# + ASP.NET and Python + Django</span></div>
<p>The above histogram shows the distribution of normalized velocities associated with each completed sprint. The table below summarizes the distribution of velocities associated each team.</p>
<table style="height: 150px;" border="1" width="470">
<tbody>
<tr style="text-align: center;">
<td style="text-align: left;">units:<br />
story points /<br />
developer /<br />
week</td>
<th>C#/ASP.NET</th>
<th>Python/Django</th>
</tr>
<tr style="text-align: center;">
<th style="text-align: left;">mean</th>
<th>5.8</th>
<th>11.6</th>
</tr>
<tr style="text-align: center;">
<td style="text-align: left;">stdev</td>
<td>2.9</td>
<td>2.7</td>
</tr>
<tr style="text-align: center;">
<td style="text-align: left;">min</td>
<td>.3</td>
<td>8.5</td>
</tr>
<tr style="text-align: center;">
<td style="text-align: left;">max</td>
<td>9.3</td>
<td>15.8</td>
</tr>
</tbody>
<caption>Summary statistics of each team&#8217;s normalized developer velocities</caption>
</table>
<p>The distribution of velocities between the two samples are similarly shaped, but have clear differences in their mean. <strong>The average velocity of a  C#/ASP.NET developer was found to be 5.8 story points/week. A Python/Django developer has an average velocity of 11.6 story points/week. Independent t-tests reveal these differences as being statistically significant (t(15) = 4.19, p&lt;7.8e-4).</strong></p>
<h3><strong>Discussions and Conclusion</strong></h3>
<p>Given our development processes <strong>we found the average productivity of a single Django developer to be equivalent to the output generated by two C# ASP.NET developers. Given equal-sized teams, Django allowed our developers to be twice as productive as our ASP.NET team.</strong></p>
<p>I suspect these results may actually reflect a lower bound of the productivity differences. It should be noted that about half of the Team Python developers, while fluent in Python, had not used Django before. They quickly learned Django, but it is possible this fluency disparity may have caused an unintended bias in results&#8211;handicapping overall Django velocity.</p>
<h3>Epilogue</h3>
<p>The productivity differences quantified by our findings were then included as part of an overall rationale to shift web-based development platforms. Along with overall velocity differences, the costs associated with maintaining each environment were considered: OS licensing and database licensing for development and production environments, as well as costs associated with development tools. I&#8217;m happy to say we are now a Python and Django shop.</p>
<p><strong>Updated:</strong></p>
<p>Several good questions over at <a href="http://news.ycombinator.com/item?id=1148748">Hacker News</a></p>
<p>The post <a href="http://kurtgrandis.com/blog/2010/02/24/python-django-vs-c-asp-net-productivity-showdown/">Python + Django vs. C# + ASP.NET: Productivity Showdown</a> appeared first on <a href="http://kurtgrandis.com/blog">Kurt Grandis</a>.</p>]]></content:encoded>
			<wfw:commentRss>http://kurtgrandis.com/blog/2010/02/24/python-django-vs-c-asp-net-productivity-showdown/feed/</wfw:commentRss>
		<slash:comments>15</slash:comments>
		</item>
	</channel>
</rss>

<!-- Dynamic page generated in 0.605 seconds. -->
<!-- Cached page generated by WP-Super-Cache on 2013-05-01 22:17:01 -->
