<?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>heisel.org</title>
	
	<link>http://heisel.org/blog</link>
	<description>Musings for those in the media who grok, grep, and otherwise get the Web.</description>
	<lastBuildDate>Sun, 07 Feb 2010 22:00:10 +0000</lastBuildDate>
	<generator>http://wordpress.org/?v=2.8.6</generator>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
			<feedburner:info uri="heisel/kdql" /><atom10:link xmlns:atom10="http://www.w3.org/2005/Atom" rel="hub" href="http://pubsubhubbub.appspot.com" /><atom10:link xmlns:atom10="http://www.w3.org/2005/Atom" rel="self" type="application/rss+xml" href="http://heisel.org/index.xml" /><feedburner:feedFlare href="http://www.newsgator.com/ngs/subscriber/subext.aspx?url=http%3A%2F%2Fheisel.org%2Findex.xml" src="http://www.newsgator.com/images/ngsub1.gif">Subscribe with NewsGator</feedburner:feedFlare><feedburner:feedFlare href="http://www.netvibes.com/subscribe.php?url=http%3A%2F%2Fheisel.org%2Findex.xml" src="http://www.netvibes.com/img/add2netvibes.gif">Subscribe with Netvibes</feedburner:feedFlare><feedburner:feedFlare href="http://fusion.google.com/add?feedurl=http%3A%2F%2Fheisel.org%2Findex.xml" src="http://buttons.googlesyndication.com/fusion/add.gif">Subscribe with Google</feedburner:feedFlare><feedburner:feedFlare href="http://www.addtoany.com/?linkname=heisel.org&amp;linkurl=http%3A%2F%2Fheisel.org%2Findex.xml&amp;type=feed" src="http://www.addtoany.com/addfr-b.gif">Add to Any Feed Reader</feedburner:feedFlare><item>
		<title>The Nature of the Business</title>
		<link>http://feedproxy.google.com/~r/heisel/kDqL/~3/izYUVLfTd08/</link>
		<comments>http://heisel.org/blog/2010/02/07/the-nature-of-the-business/#comments</comments>
		<pubDate>Sun, 07 Feb 2010 22:00:09 +0000</pubDate>
		<dc:creator>Chris</dc:creator>
				<category><![CDATA[Blogmarks]]></category>

		<guid isPermaLink="false">http://heisel.org/blog/2010/02/07/the-nature-of-the-business/</guid>
		<description><![CDATA[
The Nature of the Busi&#173;ness &#8211; A great post how (and how not) to manage [...]]]></description>
			<content:encoded><![CDATA[<ul>
<li><a href="http://imagineerebirth.blogspot.com/2007/06/nature-of-business.html">The Nature of the Busi&shy;ness</a> &#8211; A great post how (and how not) to manage a cre&shy;ative agency cov&shy;er&shy;ing one of my other great loves, the Disney parks and Imagineering</li>

</ul>
<div class="feedflare">
<a href="http://feeds.feedburner.com/~ff/heisel/kDqL?a=izYUVLfTd08:88zcrJesbsg:yIl2AUoC8zA"><img src="http://feeds.feedburner.com/~ff/heisel/kDqL?d=yIl2AUoC8zA" border="0"></img></a> <a href="http://feeds.feedburner.com/~ff/heisel/kDqL?a=izYUVLfTd08:88zcrJesbsg:F7zBnMyn0Lo"><img src="http://feeds.feedburner.com/~ff/heisel/kDqL?i=izYUVLfTd08:88zcrJesbsg:F7zBnMyn0Lo" border="0"></img></a>
</div><img src="http://feeds.feedburner.com/~r/heisel/kDqL/~4/izYUVLfTd08" height="1" width="1"/>]]></content:encoded>
			<wfw:commentRss>http://heisel.org/blog/2010/02/07/the-nature-of-the-business/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		<feedburner:origLink>http://heisel.org/blog/2010/02/07/the-nature-of-the-business/</feedburner:origLink></item>
		<item>
		<title>Saints, Colts Hoping To Resolve Super Bowl Through Diplomacy</title>
		<link>http://feedproxy.google.com/~r/heisel/kDqL/~3/9ct-9YEvy0U/</link>
		<comments>http://heisel.org/blog/2010/02/04/saints-colts-hoping-to-resolve-super-bowl-through-diplomacy/#comments</comments>
		<pubDate>Thu, 04 Feb 2010 14:00:30 +0000</pubDate>
		<dc:creator>Chris</dc:creator>
				<category><![CDATA[Blogmarks]]></category>

		<guid isPermaLink="false">http://heisel.org/blog/2010/02/04/saints-colts-hoping-to-resolve-super-bowl-through-diplomacy/</guid>
		<description><![CDATA[
Saints, Colts Hoping To Resolve Super Bowl Through Diplo&#173;macy &#8211; &#34;Absolutely no one wants to [...]]]></description>
			<content:encoded><![CDATA[<ul>
<li><a href="http://www.theonion.com/content/news/saints_colts_hoping_to_resolve">Saints, Colts Hoping To Resolve Super Bowl Through Diplo&shy;macy</a> &#8211; &quot;Absolutely no one wants to see these teams forced to take the field and play 60 min&shy;utes of brutal foot&shy;ball against each another.&quot;</li>

</ul>
<div class="feedflare">
<a href="http://feeds.feedburner.com/~ff/heisel/kDqL?a=9ct-9YEvy0U:vl590sFDG4c:yIl2AUoC8zA"><img src="http://feeds.feedburner.com/~ff/heisel/kDqL?d=yIl2AUoC8zA" border="0"></img></a> <a href="http://feeds.feedburner.com/~ff/heisel/kDqL?a=9ct-9YEvy0U:vl590sFDG4c:F7zBnMyn0Lo"><img src="http://feeds.feedburner.com/~ff/heisel/kDqL?i=9ct-9YEvy0U:vl590sFDG4c:F7zBnMyn0Lo" border="0"></img></a>
</div><img src="http://feeds.feedburner.com/~r/heisel/kDqL/~4/9ct-9YEvy0U" height="1" width="1"/>]]></content:encoded>
			<wfw:commentRss>http://heisel.org/blog/2010/02/04/saints-colts-hoping-to-resolve-super-bowl-through-diplomacy/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		<feedburner:origLink>http://heisel.org/blog/2010/02/04/saints-colts-hoping-to-resolve-super-bowl-through-diplomacy/</feedburner:origLink></item>
		<item>
		<title>Solving for the iron triangle with kanban and scrumban</title>
		<link>http://feedproxy.google.com/~r/heisel/kDqL/~3/f0q31ds38Fw/</link>
		<comments>http://heisel.org/blog/2010/01/10/iron-triangle-kanban-scrumban/#comments</comments>
		<pubDate>Sun, 10 Jan 2010 21:59:42 +0000</pubDate>
		<dc:creator>Chris</dc:creator>
				<category><![CDATA[Kanban]]></category>
		<category><![CDATA[Management]]></category>

		<guid isPermaLink="false">http://heisel.org/blog/?p=1618</guid>
		<description><![CDATA[Scope, quality, schedule -- pick two. Hint: Quality is fixed.]]></description>
			<content:encoded><![CDATA[<p>Life is full of lim&shy;i&shy;ta&shy;tions: No park&shy;ing, no run&shy;ning, no diving, <a href="http://www.youtube.com/watch?v=WStE470Nu4s">no stair&shy;way</a> etc.</p>

<p>One of the keys to project man&shy;age&shy;ment is know&shy;ing and embrac&shy;ing the lim&shy;i&shy;ta&shy;tions of a project. One of the other keys is being able to help others see and embrace the same limitations.</p>

<p>In soft&shy;ware devel&shy;op&shy;ment there&#8217;s been a lot of talk about &#8220;Fast. Cheap. Good. Pick two&#8221;. But I think the most common <a href="http://en.wikipedia.org/wiki/Project_triangle">iron tri&shy;an&shy;gle</a> we face is actu&shy;ally <strong>&#8220;Scope. Sched&shy;ule. Qual&shy;ity. Pick two.&#8221;</strong></p>

<p>Very few clients would ever actu&shy;ally pick Scope and Sched&shy;ule, and say &#8220;Meh. To hell with quality.&#8221;</p>

<p>So the real lim&shy;i&shy;ta&shy;tions of our dis&shy;ci&shy;pline are <strong>Scope</strong> and <strong>Sched&shy;ule</strong>, because almost no one wants an on-&#8203;time piece of garbage, or an incom&shy;plete piece of garbage.</p>

<p>There are two strate&shy;gies that I use to embrace these limitations:</p>

<h3>Kanban (fixed scope)</h3>

<p>If you haven&#8217;t heard of Kanban, I rec&shy;om&shy;mend you read up on it as it really is a great system. Here&#8217;s just <a href="http://www.kanbandistilled.com/">one quick tuto&shy;r&shy;ial</a>, and my <a href="http://delicious.com/chris.heisel/kanban">run&shy;ning list of links</a>.</p>

<p>For me, the essence of Kanban is fixed scope, but flex&shy;i&shy;ble sched&shy;ule. Sure, you can quote a <a href="http://leanandkanban.wordpress.com/2009/04/18/lead-time-vs-cycle-time/">lead time</a> &#8212; an aver&shy;age of how long it&#8217;s taken fea&shy;tures to go from the back&shy;log all the way to done in the past &#8212; but that&#8217;s an esti&shy;mate, not a commitment.</p>

<p>This works great if you&#8217;ve got clients who are flex&shy;i&shy;ble enough to accept a fairly open-&#8203;ended deliv&shy;ery&nbsp;date.</p>

<h3>Scrumban (fixed schedule)</h3>

<p><a href="http://leansoftwareengineering.com/ksse/scrum-ban/">Scrum&shy;ban</a> is a great tran&shy;si&shy;tional step for teams and clients when trying to go from Scrum/Agile or, <em>shud&shy;der</em> <a href="http://www.waterfall2006.com/">Water&shy;fall</a>, to Kanban.</p>

<p>In Scrum&shy;ban you&#8217;ll fix a sched&shy;ule, a release every two or three weeks sim&shy;i&shy;lar to Scrum. But unlike Scrum you <strong>don&#8217;t fix the scope</strong> for the sprint.</p>

<p>Instead you work with the client and the team to come up with a pri&shy;or&shy;i&shy;tized back&shy;log of items for that sprint.</p>

<p>Work during the sprint is popped off the top of the back&shy;log stack, so that the most impor&shy;tant work (as judged by the client) is done&nbsp;first.</p>

<p>If the back&shy;log stack gets too small, then, aside from cel&shy;e&shy;brat&shy;ing your pro&shy;duc&shy;tiv&shy;ity, the team and client can regroup and fill the back&shy;log up&nbsp;again.</p>

<p>If the back&shy;log isn&#8217;t com&shy;pleted by the end of the sprint, that&#8217;s OK because we decided to <strong>fix sched&shy;ule (and qual&shy;ity), not scope</strong>.</p>

<p>In con&shy;sul&shy;ta&shy;tion with the team and the client, you can take the remain&shy;ing items and start the next sprint with them, or throw them all out if pri&shy;or&shy;i&shy;ties have changed!</p>
<div class="feedflare">
<a href="http://feeds.feedburner.com/~ff/heisel/kDqL?a=f0q31ds38Fw:Uxzmqb2lKZs:yIl2AUoC8zA"><img src="http://feeds.feedburner.com/~ff/heisel/kDqL?d=yIl2AUoC8zA" border="0"></img></a> <a href="http://feeds.feedburner.com/~ff/heisel/kDqL?a=f0q31ds38Fw:Uxzmqb2lKZs:F7zBnMyn0Lo"><img src="http://feeds.feedburner.com/~ff/heisel/kDqL?i=f0q31ds38Fw:Uxzmqb2lKZs:F7zBnMyn0Lo" border="0"></img></a>
</div><img src="http://feeds.feedburner.com/~r/heisel/kDqL/~4/f0q31ds38Fw" height="1" width="1"/>]]></content:encoded>
			<wfw:commentRss>http://heisel.org/blog/2010/01/10/iron-triangle-kanban-scrumban/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		<feedburner:origLink>http://heisel.org/blog/2010/01/10/iron-triangle-kanban-scrumban/</feedburner:origLink></item>
		<item>
		<title>A time to work, a time to slack</title>
		<link>http://feedproxy.google.com/~r/heisel/kDqL/~3/FA0OVtt5MRc/</link>
		<comments>http://heisel.org/blog/2010/01/03/slack-time/#comments</comments>
		<pubDate>Sun, 03 Jan 2010 22:00:18 +0000</pubDate>
		<dc:creator>Chris</dc:creator>
				<category><![CDATA[Kanban]]></category>
		<category><![CDATA[Management]]></category>

		<guid isPermaLink="false">http://heisel.org/blog/?p=1616</guid>
		<description><![CDATA[Why 100% utilization is an awful idea.]]></description>
			<content:encoded><![CDATA[<p>Show your system admin&shy;is&shy;tra&shy;tor a box run&shy;ning at <a href="http://www.google.com/search?sourceid=chrome&amp;ie=UTF-8&amp;q=100%25+cpu+utilization">100 per&shy;cent system uti&shy;liza&shy;tion</a>.</p>

<p>If you can find one who thinks it&#8217;s a good thing, then you&#8217;ve got your&shy;self a bad system admin&shy;is&shy;tra&shy;tor. A <strong>good</strong> sysad&shy;min knows that if a box is pegged at 100 per&shy;cent, then it <strong>can&#8217;t handle any more traf&shy;fic</strong> and it&#8217;s <strong>likely to fall over at any moment</strong>.</p>

<p>Show some man&shy;agers an employee work&shy;ing at 100 per&shy;cent. Many will say, while pat&shy;ting them&shy;selves on the back, that must be a great worker who&#8217;s been prop&shy;erly motived by a good manager&#8230; <em>wink</em>.</p>

<p>But some, myself included, would think &#8220;there&#8217;s an employee who <strong>can&#8217;t handle any more traf&shy;fic</strong> and is <strong>likely to fall over at any moment.</strong>&#8220;</p>

<p>Machines can&#8217;t run at 100 per&shy;cent all the time, and nei&shy;ther can humans. That&#8217;s why we have <strong>slack time.</strong></p>

<p>Slack time ben&shy;e&shy;fits employ&shy;ees by giving them time to cool down and recharge their cre&shy;ativ&shy;ity between projects. Man&shy;agers ben&shy;e&shy;fit by con&shy;stantly having a pool of refreshed, ready talent to han&shy;dling incom&shy;ing&nbsp;work.</p>

<p>Good man&shy;agers should have a pool of low pri&shy;or&shy;ity, deadline-&#8203;less, &#8220;it&#8217;d be nice if&#8221; projects and&nbsp;tasks.</p>

<p>That way, when higher pri&shy;or&shy;ity work has been com&shy;pleted and there&#8217;s down time, there&#8217;s some&shy;thing for folks to work on that can be easily set aside should an emer&shy;gency arise, or new work arrive.</p>

<p><strong>Editor&#8217;s note:</strong> This is the first in a <a href="/blog/category/kanban/">series of posts</a> where I&#8217;ll try and espouse on the some of the prin&shy;ci&shy;pals and prac&shy;tices of <a href="http://www.limitedwipsociety.org/">Kanban</a>.</p>
<div class="feedflare">
<a href="http://feeds.feedburner.com/~ff/heisel/kDqL?a=FA0OVtt5MRc:iSU6N1o-n60:yIl2AUoC8zA"><img src="http://feeds.feedburner.com/~ff/heisel/kDqL?d=yIl2AUoC8zA" border="0"></img></a> <a href="http://feeds.feedburner.com/~ff/heisel/kDqL?a=FA0OVtt5MRc:iSU6N1o-n60:F7zBnMyn0Lo"><img src="http://feeds.feedburner.com/~ff/heisel/kDqL?i=FA0OVtt5MRc:iSU6N1o-n60:F7zBnMyn0Lo" border="0"></img></a>
</div><img src="http://feeds.feedburner.com/~r/heisel/kDqL/~4/FA0OVtt5MRc" height="1" width="1"/>]]></content:encoded>
			<wfw:commentRss>http://heisel.org/blog/2010/01/03/slack-time/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		<feedburner:origLink>http://heisel.org/blog/2010/01/03/slack-time/</feedburner:origLink></item>
		<item>
		<title>How to improve airports</title>
		<link>http://feedproxy.google.com/~r/heisel/kDqL/~3/_pWuXOtSjeo/</link>
		<comments>http://heisel.org/blog/2009/12/30/better-airports/#comments</comments>
		<pubDate>Wed, 30 Dec 2009 21:44:54 +0000</pubDate>
		<dc:creator>Chris</dc:creator>
				<category><![CDATA[Business]]></category>
		<category><![CDATA[Technology]]></category>

		<guid isPermaLink="false">http://heisel.org/blog/?p=1614</guid>
		<description><![CDATA[Four gripes, and one crazy idea, to make flying just a little better.]]></description>
			<content:encoded><![CDATA[<p>After the most recent round of hol&shy;i&shy;day air&shy;borne bus rides that is our civil avi&shy;a&shy;tion system, I thought I&#8217;d jot down a few ideas I had that&#8217;d make the expe&shy;ri&shy;ence more pleasant&#8230; at least for&nbsp;me.</p>

<h3>1. Stop the repetitive announcements</h3>

<p>How many times do we need to announce over the <acroymn title="Public Address">PA</acronym> system that &#8220;the white zone is for load&shy;ing and unloading&#8221;, &#8220;passengers are only allowed one car&shy;ryon and one per&shy;sonal item&#8221;, and &#8220;the national threat level is orange.&#8221;</p>

<p>These announce&shy;ments appear to be on an inter&shy;val loop and never actu&shy;ally rep&shy;re&shy;sent a change in state. Tell me when the threat level goes up, tell me when it goes down, tell me when the white zone is for breakdancing.</p>

<p>Until then, stop with the damn &#8220;announcements&#8221; and print it on a&nbsp;sign.</p>

<h3>2. Mute the TVs</h3>

<p>I don&#8217;t know about your air&shy;port, but <a href="http://www.atlanta-airport.com/">Harts&shy;field</a>, espe&shy;cially the C con&shy;course, always seems to have the TVs turned way the hell&nbsp;up.</p>

<p>Why not offer a couple of options for watch&shy;ing&nbsp;TV:</p>

<ul>
<li><p>Broad&shy;cast the audio on an FM chan&shy;nel, and let those who want to, tune in with a&nbsp;radio.</p></li>
<li><p>Turn on the closed cap&shy;tions so folks can read it if they&nbsp;like</p></li>
<li><p>Sign a spon&shy;sor&shy;ship deal so folks can use air&shy;port WiFi free, or at least free if they want to watch stream&shy;ing video on CNN or Hulu or&nbsp;such.</p></li>
</ul>

<h3>3. Seats</h3>

<p>Again, it may only be a Harts&shy;field thing, but clearly the gate seat&shy;ing capac&shy;ity was scaled for a time when secu&shy;rity lines were shorter and folks could race to their plane right before takeoff.</p>

<p>Air&shy;ports should add more seat&shy;ing beyond the secu&shy;rity check point. I&#8217;d envi&shy;sion a large lounge in each con&shy;course, sur&shy;rounded by shops and dining with large status boards.</p>

<p>Even better than status boards, let me sign up for SMS noti&shy;fi&shy;ca&shy;tions for my flight. Alert me when there&#8217;s 15 min&shy;utes to go before board&shy;ing, or if my gate changes, etc.</p>

<h3>4. Bring your own bin</h3>

<p>People doff&shy;ing their shoes, taking their lap&shy;tops out, undo&shy;ing their belts (is this secu&shy;rity or striptease?) cause a bot&shy;tle&shy;neck at secu&shy;rity&nbsp;lines.</p>

<p>Why not give away/sell re-&#8203;usable heavy-&#8203;duty plas&shy;tic bags that are TSA-&#8203;approved &#8212; I&#8217;m think&shy;ing it&#8217;d be sim&shy;i&shy;lar to the <a href="http://www.brickfish.com/Pages/PhotosAlbums/PhotoView.aspx?picid=882879_33726280&amp;pid=2418852">Idea bag</a>.</p>

<p>Then folks could stop any place before the secu&shy;rity line, do the secu&shy;rity striptease shuf&shy;fle, put their items in the bag, and walk up to the line ready to&nbsp;go.</p>

<p>After the secu&shy;rity check&shy;point, people would don all their gear again and fold the bag up and be on their&nbsp;way.</p>

<h3>5. Sit, then board, then fly</h3>

<p>This is my cra&shy;zi&shy;est idea. But hear me&nbsp;out.</p>

<p>Instead of a seat&shy;ing area out&shy;side the gate, imag&shy;ine if you actu&shy;ally sat down in your assigned seat, in your assigned row, and could put your lug&shy;gage into the over&shy;head com&shy;part&shy;ments before your plane arrived at the airport?</p>

<p>Then when your plane arrived, the seat&shy;ing com&shy;part&shy;ment would slide out &#8212; allow&shy;ing the arrivals to &#8220;deplane&#8221;, and the depar&shy;ture seat&shy;ing sec&shy;tion would slide into the plane with every&shy;one and their belong&shy;ings stowed.</p>

<p>It&#8217;d reduce turn&shy;around time and garner the air&shy;lines more money &#8212; quicker turn, means more flights, which means more fares per&nbsp;day.</p>

<p>Of course it&#8217;d require redesign&shy;ing not just all the air&shy;planes, but all the air&shy;ports to make it happen, but hey wouldn&#8217;t it be&nbsp;cool!</p>
<div class="feedflare">
<a href="http://feeds.feedburner.com/~ff/heisel/kDqL?a=_pWuXOtSjeo:Lyt1oQkQLmM:yIl2AUoC8zA"><img src="http://feeds.feedburner.com/~ff/heisel/kDqL?d=yIl2AUoC8zA" border="0"></img></a> <a href="http://feeds.feedburner.com/~ff/heisel/kDqL?a=_pWuXOtSjeo:Lyt1oQkQLmM:F7zBnMyn0Lo"><img src="http://feeds.feedburner.com/~ff/heisel/kDqL?i=_pWuXOtSjeo:Lyt1oQkQLmM:F7zBnMyn0Lo" border="0"></img></a>
</div><img src="http://feeds.feedburner.com/~r/heisel/kDqL/~4/_pWuXOtSjeo" height="1" width="1"/>]]></content:encoded>
			<wfw:commentRss>http://heisel.org/blog/2009/12/30/better-airports/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		<feedburner:origLink>http://heisel.org/blog/2009/12/30/better-airports/</feedburner:origLink></item>
		<item>
		<title>TV of my life: A side trip down memory lane</title>
		<link>http://feedproxy.google.com/~r/heisel/kDqL/~3/bxj8c31ewHg/</link>
		<comments>http://heisel.org/blog/2009/12/20/tv-of-my-life/#comments</comments>
		<pubDate>Sun, 20 Dec 2009 15:04:12 +0000</pubDate>
		<dc:creator>Chris</dc:creator>
				<category><![CDATA[Personal]]></category>

		<guid isPermaLink="false">http://heisel.org/blog/?p=1611</guid>
		<description><![CDATA[Announcing a new crappier blog!]]></description>
			<content:encoded><![CDATA[<p>This week I started a new blog called <a href="http://tvofmylife.com">TV of my life</a></p>

<p>I was think&shy;ing, in a bad way, about all the TV shows &#8212; some good, but most bad &#8212; that I watched in my childhood.</p>

<p>And then for some reason unbe&shy;knownst to me, I thought I&#8217;d start a blog and inflict this trip to nos&shy;tal&shy;giav&shy;ille on the rest of&nbsp;you.</p>

<p>There&#8217;s more about <a href="http://tvofmylife.com/post/289472147/about">why I started it</a> over at <a href="http://tvofmylife.com/">tvofmylife.com</a></p>
<div class="feedflare">
<a href="http://feeds.feedburner.com/~ff/heisel/kDqL?a=bxj8c31ewHg:6mAebH5hjmw:yIl2AUoC8zA"><img src="http://feeds.feedburner.com/~ff/heisel/kDqL?d=yIl2AUoC8zA" border="0"></img></a> <a href="http://feeds.feedburner.com/~ff/heisel/kDqL?a=bxj8c31ewHg:6mAebH5hjmw:F7zBnMyn0Lo"><img src="http://feeds.feedburner.com/~ff/heisel/kDqL?i=bxj8c31ewHg:6mAebH5hjmw:F7zBnMyn0Lo" border="0"></img></a>
</div><img src="http://feeds.feedburner.com/~r/heisel/kDqL/~4/bxj8c31ewHg" height="1" width="1"/>]]></content:encoded>
			<wfw:commentRss>http://heisel.org/blog/2009/12/20/tv-of-my-life/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		<feedburner:origLink>http://heisel.org/blog/2009/12/20/tv-of-my-life/</feedburner:origLink></item>
		<item>
		<title>Get XML coverage reports from nose</title>
		<link>http://feedproxy.google.com/~r/heisel/kDqL/~3/hzjVjdjFTeQ/</link>
		<comments>http://heisel.org/blog/2009/12/13/nose-xml-coverage/#comments</comments>
		<pubDate>Sun, 13 Dec 2009 22:31:53 +0000</pubDate>
		<dc:creator>Chris</dc:creator>
				<category><![CDATA[Django]]></category>
		<category><![CDATA[Projects]]></category>
		<category><![CDATA[Python]]></category>

		<guid isPermaLink="false">http://heisel.org/blog/?p=1598</guid>
		<description><![CDATA[Quick recap of my tiny plugin for nose.]]></description>
			<content:encoded><![CDATA[<p>When <a href="http://heisel.org/blog/2009/11/21/django-hudson/">hook&shy;ing up Hudson and Django</a>, I needed a way to get XML cov&shy;er&shy;age reports.</p>

<p>At the time I <a href="http://bitbucket.org/cmheisel/nose/src/">forked nose</a> itself, but I wasn&#8217;t happy with the solu&shy;tion. Folks rightly wouldn&#8217;t want to use my fork; I don&#8217;t want to commit to keep&shy;ing up with nose&#8217;s devel&shy;op&shy;ment; and <a href="http://somethingaboutorange.com/mrl/projects/nose/0.11.1/plugins/writing.html">duh, they have a plugin archi&shy;tec&shy;ture</a>.</p>

<p>So I&#8217;m happy to announce <a href="http://github.com/cmheisel/nose-xcover">nose-&#8203;xcover</a>. Install it and it&#8217;ll add the &#8211;with-&#8203;xcoverage option which you can use along&shy;side the built-&#8203;in plugin like&nbsp;so:</p>

<pre><code>#nosetests --with-coverage {{ coverage options }} --with-xcoverage
nosetests --with-coverage --cover-package=myapp --cover-tests --with-xcoverage
</code></pre>

<p>I updated my <a href="http://heisel.org/blog/2009/11/21/django-hudson/">Django and Hudson guide</a> to use this instead of the&nbsp;fork.</p>

<p>I hope you find it useful!</p>
<div class="feedflare">
<a href="http://feeds.feedburner.com/~ff/heisel/kDqL?a=hzjVjdjFTeQ:yp0PO2TxAL8:yIl2AUoC8zA"><img src="http://feeds.feedburner.com/~ff/heisel/kDqL?d=yIl2AUoC8zA" border="0"></img></a> <a href="http://feeds.feedburner.com/~ff/heisel/kDqL?a=hzjVjdjFTeQ:yp0PO2TxAL8:F7zBnMyn0Lo"><img src="http://feeds.feedburner.com/~ff/heisel/kDqL?i=hzjVjdjFTeQ:yp0PO2TxAL8:F7zBnMyn0Lo" border="0"></img></a>
</div><img src="http://feeds.feedburner.com/~r/heisel/kDqL/~4/hzjVjdjFTeQ" height="1" width="1"/>]]></content:encoded>
			<wfw:commentRss>http://heisel.org/blog/2009/12/13/nose-xml-coverage/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		<feedburner:origLink>http://heisel.org/blog/2009/12/13/nose-xml-coverage/</feedburner:origLink></item>
		<item>
		<title>Mathematical model for semi-sane redistricting</title>
		<link>http://feedproxy.google.com/~r/heisel/kDqL/~3/ORxp09P-CPk/</link>
		<comments>http://heisel.org/blog/2009/12/11/mathematical-model-for-semi-sane-redistricting/#comments</comments>
		<pubDate>Sat, 12 Dec 2009 02:00:21 +0000</pubDate>
		<dc:creator>Chris</dc:creator>
				<category><![CDATA[Blogmarks]]></category>

		<guid isPermaLink="false">http://heisel.org/blog/2009/12/11/mathematical-model-for-semi-sane-redistricting/</guid>
		<description><![CDATA[
Math&#173;e&#173;mat&#173;i&#173;cal model for semi-&#8203;sane redis&#173;trict&#173;ing &#8211; Fairly simple &#8212; make it a square, or as [...]]]></description>
			<content:encoded><![CDATA[<ul>
<li><a href="http://www.boston.com/bostonglobe/ideas/articles/2009/11/22/squaresville_usa_how_to_fix_american_politics_one_right_angle_at_a_time/?page=full">Math&shy;e&shy;mat&shy;i&shy;cal model for semi-&#8203;sane redis&shy;trict&shy;ing</a> &#8211; Fairly simple &#8212; make it a square, or as square as it can be to avoid non-&#8203;competitive dis&shy;tricts. &#39;The &ldquo;Hill Ratio&rdquo; he devised involves divid&shy;ing a district&rsquo;s perime&shy;ter by four, and divid&shy;ing that by the square root of a district&rsquo;s area. The closer to 1 the result is, the more per&shy;fectly square the dis&shy;trict. Hill points out that in 1960, the aver&shy;age Hill Ratio was 1.526. It&rsquo;s now 2.1.&#39;</li>

</ul>
<div class="feedflare">
<a href="http://feeds.feedburner.com/~ff/heisel/kDqL?a=ORxp09P-CPk:Z-zTRFYjRv4:yIl2AUoC8zA"><img src="http://feeds.feedburner.com/~ff/heisel/kDqL?d=yIl2AUoC8zA" border="0"></img></a> <a href="http://feeds.feedburner.com/~ff/heisel/kDqL?a=ORxp09P-CPk:Z-zTRFYjRv4:F7zBnMyn0Lo"><img src="http://feeds.feedburner.com/~ff/heisel/kDqL?i=ORxp09P-CPk:Z-zTRFYjRv4:F7zBnMyn0Lo" border="0"></img></a>
</div><img src="http://feeds.feedburner.com/~r/heisel/kDqL/~4/ORxp09P-CPk" height="1" width="1"/>]]></content:encoded>
			<wfw:commentRss>http://heisel.org/blog/2009/12/11/mathematical-model-for-semi-sane-redistricting/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		<feedburner:origLink>http://heisel.org/blog/2009/12/11/mathematical-model-for-semi-sane-redistricting/</feedburner:origLink></item>
		<item>
		<title>django-grappelli</title>
		<link>http://feedproxy.google.com/~r/heisel/kDqL/~3/jbrAMKRjApM/</link>
		<comments>http://heisel.org/blog/2009/12/11/django-grappelli/#comments</comments>
		<pubDate>Sat, 12 Dec 2009 02:00:20 +0000</pubDate>
		<dc:creator>Chris</dc:creator>
				<category><![CDATA[Blogmarks]]></category>

		<guid isPermaLink="false">http://heisel.org/blog/2009/12/11/django-grappelli/</guid>
		<description><![CDATA[
django-&#8203;grappelli &#8211; The Django admin reskinned, and pretty (not that I dis&#173;like the cur&#173;rent design).


]]></description>
			<content:encoded><![CDATA[<ul>
<li><a href="http://code.google.com/p/django-grappelli/wiki/screenshots">django-&#8203;grappelli</a> &#8211; The Django admin reskinned, and pretty (not that I dis&shy;like the cur&shy;rent design).</li>

</ul>
<div class="feedflare">
<a href="http://feeds.feedburner.com/~ff/heisel/kDqL?a=jbrAMKRjApM:UqM7zSGhfms:yIl2AUoC8zA"><img src="http://feeds.feedburner.com/~ff/heisel/kDqL?d=yIl2AUoC8zA" border="0"></img></a> <a href="http://feeds.feedburner.com/~ff/heisel/kDqL?a=jbrAMKRjApM:UqM7zSGhfms:F7zBnMyn0Lo"><img src="http://feeds.feedburner.com/~ff/heisel/kDqL?i=jbrAMKRjApM:UqM7zSGhfms:F7zBnMyn0Lo" border="0"></img></a>
</div><img src="http://feeds.feedburner.com/~r/heisel/kDqL/~4/jbrAMKRjApM" height="1" width="1"/>]]></content:encoded>
			<wfw:commentRss>http://heisel.org/blog/2009/12/11/django-grappelli/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		<feedburner:origLink>http://heisel.org/blog/2009/12/11/django-grappelli/</feedburner:origLink></item>
		<item>
		<title>For Christmas, vintage photos</title>
		<link>http://feedproxy.google.com/~r/heisel/kDqL/~3/idOspLDdqlQ/</link>
		<comments>http://heisel.org/blog/2009/12/07/vintage-christmas-photos/#comments</comments>
		<pubDate>Tue, 08 Dec 2009 02:57:16 +0000</pubDate>
		<dc:creator>Chris</dc:creator>
				<category><![CDATA[Personal]]></category>

		<guid isPermaLink="false">http://heisel.org/blog/?p=1574</guid>
		<description><![CDATA[My gift to you for the holidays, a photo edit.]]></description>
			<content:encoded><![CDATA[<p>Every year I like to dec&shy;o&shy;rate my com&shy;puter for the holidays.</p>

<p>In years past it took the form of <a href="http://osxdaily.com/2007/12/02/mac-os-x-christmas-holiday-desktop-app-fun/">holiday-&#8203;themed appli&shy;ca&shy;tions and dash&shy;board wid&shy;gets</a>.</p>

<p>But this year I&#8217;ve got a <a href="http://minimalmac.com/post/179603294/my-desktop-is-about-as-minimal-as-i-can-get-it">min&shy;i&shy;mal mac</a> thing going on. So I thought I&#8217;d &#8220;decorate&#8221; with some vin&shy;tage hol&shy;i&shy;day photos.</p>

<p>I ran across <a href="http://www.shorpy.com">Shorpy</a> which has a wealth of vin&shy;tage photos and thought I&#8217;d share my selects with you as a gift for the holidays:</p>

<ul>
<li><p><a href="http://www.shorpy.com/node/6826">Winter Palace: 1933</a> &mdash; Great com&shy;po&shy;si&shy;tion, and New York, espe&shy;cially, old New York, feels Christmassy.</p></li>
<li><p><a href="http://www.shorpy.com/node/6959">Sixth Avenue Shopp&shy;pers: 1903</a> &mdash; Mall schmall, these people shopped with horses!</p></li>
<li><p><a href="http://www.shorpy.com/node/7192">Broad&shy;way Santa: 1902</a> &mdash; A reminder that this is a time for giving. Also, Cubanola cigars and hats apparently.</p></li>
<li><p><a href="http://www.shorpy.com/node/5149">Wide Christ&shy;mas: 1920</a> &mdash; No matter how much you dec&shy;o&shy;rated your tree, these folks have you beat.&nbsp;Beat.</p></li>
<li><p><a href="http://www.shorpy.com/node/7050">Blade Run&shy;ners: 1919</a> &mdash; Great con&shy;trast with the white ice, and the blurry skater in the fore&shy;ground adds a hint of abstractness.</p></li>
<li><p><a href="http://www.shorpy.com/node/6299">Kay Jew&shy;lers: 1919</a> &mdash; Jane Sey&shy;mour and her open heart surger^H^H^H^H jew&shy;elry are nowhere to be&nbsp;found.</p></li>
<li><p><a href="http://www.shorpy.com/node/5170">Best Christ&shy;mas Ever: 1922</a> &mdash; That kid made out like a bandit, no matter what year it&nbsp;is.</p></li>
<li><p><a href="http://www.shorpy.com/node/5148">Five and Ten: 1921</a> &mdash; &#8220;Take a look in the five-&#8203;and-&#8203;ten, glis&shy;ten&shy;ing once again&#8221;</p></li>
<li><p><a href="http://www.shorpy.com/node/4609">Winter Won&shy;der&shy;land: 1908</a> &mdash; Tell me you don&#8217;t want to hop on one of those street&shy;cars with a parcel wrapped up in brown paper. Go on, tell&nbsp;me!</p></li>
<li><p><a href="http://www.shorpy.com/node/2196">Iowa City in the Snow: 1940</a>: Pos&shy;si&shy;bly my favorite. It&#8217;s straight out of &#8220;It&#8217;s a Won&shy;der&shy;ful Life.&#8221;</p></li>
</ul>
<div class="feedflare">
<a href="http://feeds.feedburner.com/~ff/heisel/kDqL?a=idOspLDdqlQ:VlBS0VUxBnE:yIl2AUoC8zA"><img src="http://feeds.feedburner.com/~ff/heisel/kDqL?d=yIl2AUoC8zA" border="0"></img></a> <a href="http://feeds.feedburner.com/~ff/heisel/kDqL?a=idOspLDdqlQ:VlBS0VUxBnE:F7zBnMyn0Lo"><img src="http://feeds.feedburner.com/~ff/heisel/kDqL?i=idOspLDdqlQ:VlBS0VUxBnE:F7zBnMyn0Lo" border="0"></img></a>
</div><img src="http://feeds.feedburner.com/~r/heisel/kDqL/~4/idOspLDdqlQ" height="1" width="1"/>]]></content:encoded>
			<wfw:commentRss>http://heisel.org/blog/2009/12/07/vintage-christmas-photos/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		<feedburner:origLink>http://heisel.org/blog/2009/12/07/vintage-christmas-photos/</feedburner:origLink></item>
		<item>
		<title>How Necessary Is Stretching?</title>
		<link>http://feedproxy.google.com/~r/heisel/kDqL/~3/ahyOwc0XEqo/</link>
		<comments>http://heisel.org/blog/2009/11/25/how-necessary-is-stretching/#comments</comments>
		<pubDate>Wed, 25 Nov 2009 18:00:04 +0000</pubDate>
		<dc:creator>Chris</dc:creator>
				<category><![CDATA[Blogmarks]]></category>

		<guid isPermaLink="false">http://heisel.org/blog/2009/11/25/how-necessary-is-stretching/</guid>
		<description><![CDATA[
How Nec&#173;es&#173;sary Is Stretch&#173;ing? &#8211; Truth be told, I _never_ stretch before a run or [...]]]></description>
			<content:encoded><![CDATA[<ul>
<li><a href="http://well.blogs.nytimes.com/2009/11/25/phys-ed-how-necessary-is-stretching/">How Nec&shy;es&shy;sary Is Stretch&shy;ing?</a> &#8211; Truth be told, I _never_ stretch before a run or any other workout.</li>

</ul>
<div class="feedflare">
<a href="http://feeds.feedburner.com/~ff/heisel/kDqL?a=ahyOwc0XEqo:shN6DV847U8:yIl2AUoC8zA"><img src="http://feeds.feedburner.com/~ff/heisel/kDqL?d=yIl2AUoC8zA" border="0"></img></a> <a href="http://feeds.feedburner.com/~ff/heisel/kDqL?a=ahyOwc0XEqo:shN6DV847U8:F7zBnMyn0Lo"><img src="http://feeds.feedburner.com/~ff/heisel/kDqL?i=ahyOwc0XEqo:shN6DV847U8:F7zBnMyn0Lo" border="0"></img></a>
</div><img src="http://feeds.feedburner.com/~r/heisel/kDqL/~4/ahyOwc0XEqo" height="1" width="1"/>]]></content:encoded>
			<wfw:commentRss>http://heisel.org/blog/2009/11/25/how-necessary-is-stretching/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		<feedburner:origLink>http://heisel.org/blog/2009/11/25/how-necessary-is-stretching/</feedburner:origLink></item>
		<item>
		<title>Django continuous integration with Hudson and Nose</title>
		<link>http://feedproxy.google.com/~r/heisel/kDqL/~3/l9NKSnVrHcs/</link>
		<comments>http://heisel.org/blog/2009/11/21/django-hudson/#comments</comments>
		<pubDate>Sat, 21 Nov 2009 22:27:52 +0000</pubDate>
		<dc:creator>Chris</dc:creator>
				<category><![CDATA[Django]]></category>
		<category><![CDATA[Programming]]></category>
		<category><![CDATA[Python]]></category>
		<category><![CDATA[Technology]]></category>

		<guid isPermaLink="false">http://heisel.org/blog/?p=1566</guid>
		<description><![CDATA[How to set up continuous testing, with coverage, of your Django project in Hudson.]]></description>
			<content:encoded><![CDATA[<p>At <a href="http://lincolnloop.com">work</a> we&#8217;ve decided to use <a href="http://hudson-ci.org/">Hudson</a> for our con&shy;tin&shy;u&shy;ous inte&shy;gra&shy;tion server.</p>

<p>I started off using <a href="http://www.rhonabwy.com/wp/2009/11/04/setting-up-a-python-ci-server-with-hudson/">Joe Heck&#8217;s great Python and Hudson writeup</a> as a&nbsp;guide.</p>

<p>But to get really good report&shy;ing, includ&shy;ing a cov&shy;er&shy;age report, you&#8217;re going to want to use <a href="http://somethingaboutorange.com/mrl/projects/nose/">Nose</a>, <a href="http://github.com/jbalogh/django-nose">django-&#8203;nose</a>, and my <a href="http://github.com/cmheisel/nose-xcover/">nose-&#8203;xcover</a> plugin.</p>

<p>Before you get <a href="http://hudson-ci.org/">Hudson</a> up and run&shy;ning, you&#8217;ll first want to create a test set&shy;tings module for your appli&shy;ca&shy;tion. Here&#8217;s a sample:</p>

<p><script src="http://gist.github.com/240285.js"></script></p>

<p>With that in place you&#8217;ll want to set up a sep&shy;a&shy;rate test require&shy;ments file for <a href="http://pypi.python.org/pypi/pip">pip</a>. If you&#8217;re not using <a href="http://pypi.python.org/pypi/pip">pip</a>, I can&#8217;t be held respon&shy;si&shy;ble if the <a href="http://s3.pixane.com/python_comrades.png">cen&shy;tral com&shy;mit&shy;tee</a> gets ahold of&nbsp;you.</p>

<p><script src="http://gist.github.com/240291.js"></script></p>

<p><strike>Why use <a href="http://bitbucket.org/cmheisel/nose/src/">my fork of nose</a>? We&#8217;ll get to that in a second.</strike> First let&#8217;s set up our build script.</p>

<p><script src="http://gist.github.com/240296.js"></script></p>

<ol>
<li>We change into Hudson work&shy;space set up for this&nbsp;build</li>
<li>Set up a <a href="http://pypi.python.org/pypi/virtualenv">vir&shy;tualenv</a> for our project</li>
<li>Acti&shy;vate&nbsp;it</li>
<li>Install our application&#8217;s requirements</li>
<li>Install our application&#8217;s test requirements</li>
<li>Assum&shy;ing you have a prop&shy;erly con&shy;structed setup.py, this com&shy;mand will sym&shy;link it into your virtualenv&#8217;s site packages</li>
<li>Finally run our tests, using our test settings.</li>
</ol>

<p>The &#8211;with-&#8203;coverage option tells nose we want to cap&shy;ture cov&shy;er&shy;age infor&shy;ma&shy;tion. The &#8211;cover-&#8203;package option tells nose we only want report&shy;ing on our appli&shy;ca&shy;tion. The &#8211;with-&#8203;xunit option will gen&shy;erte a nosetests.xml file in our work&shy;space with the results of the test&nbsp;run.</p>

<p><strike>Finally, the &#8211;with-&#8203;cover-&#8203;xml option is an option I added to nose&#8217;s cov&shy;er&shy;age plugin, and the reason why I&#8217;ve got <a href="http://bitbucket.org/cmheisel/nose/src/">my fork</a> listed in our test-requirements.pip.</strike> Finally, the &#8211;with-&#8203;xcoverage option acti&shy;vates my <a href="http://github.com/cmheisel/nose-xcover/">nose-&#8203;xcover</a> plugin. It out&shy;puts an XML cov&shy;er&shy;age report that Hudson can use, and it&#8217;ll honor the &#8211;cover-&#8203;package option you spec&shy;i&shy;fied ear&shy;lier, so your cov&shy;er&shy;age per&shy;cent&shy;age won&#8217;t be arti&shy;fi&shy;cially low&shy;ered, or inflated, by third-&#8203;party code you&nbsp;use.</p>

<p>Now let&#8217;s con&shy;fig&shy;ure Hudson to use the two XML reports we&#8217;re generating.</p>

<p>First the test pass/fail report.</p>

<p><img src="http://heisel.org/blog/wp-content/uploads/2009/11/Config-Hudson.jpg" alt="Config [Hudson].jpg" border="0" width="782" height="91" /></p>

<p>And then our cov&shy;er&shy;age report, you&#8217;ll need the <a href="http://wiki.hudson-ci.org/display/HUDSON/Cobertura+Plugin">Cober&shy;tura plugin</a> for&nbsp;this:</p>

<p><img src="http://heisel.org/blog/wp-content/uploads/2009/11/Config-Hudson-1.jpg" alt="Config [Hudson]-1.jpg" border="0" width="782" height="336" /></p>

<p>That&#8217;s right, you&#8217;ll also want the <a href="http://wiki.hudson-ci.org/display/HUDSON/ChuckNorris+Plugin">Chuck Norris plugin</a>. Why? Because Chuck Norris <strong>can</strong> divide by zero. That&#8217;s why.</p>

<p>Also, I&#8217;d highly rec&shy;om&shy;mend the <a href="http://wiki.hudson-ci.org/display/HUDSON/Green+Balls">Green balls</a> plugin, because Hudson&#8217;s default of blue == pass just doesn&#8217;t fly with me, or&nbsp;Chuck.</p>

<p>While we&#8217;ve been set&shy;ting up Hudson, I had another build in the oven baking using the recipe above. Let&#8217;s see how it turned out:</p>

<p><img src="http://heisel.org/blog/wp-content/uploads/2009/11/Dummy-Hudson.jpg" alt="Dummy [Hudson].jpg" border="0" width="861" height="550" /></p>

<p><strong>Editor&#8217;s note:</strong> I updated this post to use my <a href="http://github.com/cmheisel/nose-xcover/">nose-&#8203;xcover</a> plugin and not my <a href="http://bitbucket.org/cmheisel/nose/src/">fork of nose</a>.</p>
<div class="feedflare">
<a href="http://feeds.feedburner.com/~ff/heisel/kDqL?a=l9NKSnVrHcs:W1DQB346Lws:yIl2AUoC8zA"><img src="http://feeds.feedburner.com/~ff/heisel/kDqL?d=yIl2AUoC8zA" border="0"></img></a> <a href="http://feeds.feedburner.com/~ff/heisel/kDqL?a=l9NKSnVrHcs:W1DQB346Lws:F7zBnMyn0Lo"><img src="http://feeds.feedburner.com/~ff/heisel/kDqL?i=l9NKSnVrHcs:W1DQB346Lws:F7zBnMyn0Lo" border="0"></img></a>
</div><img src="http://feeds.feedburner.com/~r/heisel/kDqL/~4/l9NKSnVrHcs" height="1" width="1"/>]]></content:encoded>
			<wfw:commentRss>http://heisel.org/blog/2009/11/21/django-hudson/feed/</wfw:commentRss>
		<slash:comments>8</slash:comments>
		<feedburner:origLink>http://heisel.org/blog/2009/11/21/django-hudson/</feedburner:origLink></item>
		<item>
		<title>Chris Kelly sums up my feelings about unit tests</title>
		<link>http://feedproxy.google.com/~r/heisel/kDqL/~3/ybSTtDAMUUY/</link>
		<comments>http://heisel.org/blog/2009/11/20/chris-kelly-sums-up-my-feelings-about-unit-tests/#comments</comments>
		<pubDate>Fri, 20 Nov 2009 18:00:19 +0000</pubDate>
		<dc:creator>Chris</dc:creator>
				<category><![CDATA[Blogmarks]]></category>

		<guid isPermaLink="false">http://heisel.org/blog/2009/11/20/chris-kelly-sums-up-my-feelings-about-unit-tests/</guid>
		<description><![CDATA[
Chris Kelly sums up my feel&#173;ings about unit tests &#8211; &#34;I&#39;ve got a fever, and [...]]]></description>
			<content:encoded><![CDATA[<ul>
<li><a href="http://twitter.com/ckelly/status/5894454585">Chris Kelly sums up my feel&shy;ings about unit tests</a> &#8211; &quot;I&#39;ve got a fever, and the only pre&shy;scrip&shy;tion is more Unit Tests.&quot;</li>

</ul>
<div class="feedflare">
<a href="http://feeds.feedburner.com/~ff/heisel/kDqL?a=ybSTtDAMUUY:mjjQ0nj-DNE:yIl2AUoC8zA"><img src="http://feeds.feedburner.com/~ff/heisel/kDqL?d=yIl2AUoC8zA" border="0"></img></a> <a href="http://feeds.feedburner.com/~ff/heisel/kDqL?a=ybSTtDAMUUY:mjjQ0nj-DNE:F7zBnMyn0Lo"><img src="http://feeds.feedburner.com/~ff/heisel/kDqL?i=ybSTtDAMUUY:mjjQ0nj-DNE:F7zBnMyn0Lo" border="0"></img></a>
</div><img src="http://feeds.feedburner.com/~r/heisel/kDqL/~4/ybSTtDAMUUY" height="1" width="1"/>]]></content:encoded>
			<wfw:commentRss>http://heisel.org/blog/2009/11/20/chris-kelly-sums-up-my-feelings-about-unit-tests/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		<feedburner:origLink>http://heisel.org/blog/2009/11/20/chris-kelly-sums-up-my-feelings-about-unit-tests/</feedburner:origLink></item>
		<item>
		<title>It’s Decorative Gourd Season, Motherfuckers.</title>
		<link>http://feedproxy.google.com/~r/heisel/kDqL/~3/2-C23mmbaxI/</link>
		<comments>http://heisel.org/blog/2009/10/27/its-decorative-gourd-season-motherfuckers/#comments</comments>
		<pubDate>Tue, 27 Oct 2009 14:00:56 +0000</pubDate>
		<dc:creator>Chris</dc:creator>
				<category><![CDATA[Blogmarks]]></category>

		<guid isPermaLink="false">http://heisel.org/blog/2009/10/27/its-decorative-gourd-season-motherfuckers/</guid>
		<description><![CDATA[
It&#8217;s Dec&#173;o&#173;ra&#173;tive Gourd Season, Moth&#173;er&#173;fuck&#173;ers. &#8211; Had me laugh&#173;ing so hard I cried. Reminds me [...]]]></description>
			<content:encoded><![CDATA[<ul>
<li><a href="http://www.mcsweeneys.net/2009/10/20nissan.html">It&#8217;s Dec&shy;o&shy;ra&shy;tive Gourd Season, Moth&shy;er&shy;fuck&shy;ers.</a> &#8211; Had me laugh&shy;ing so hard I cried. Reminds me of the good old days with Her&shy;bert Korn&shy;feld at The&nbsp;Onion.</li>

</ul>
<div class="feedflare">
<a href="http://feeds.feedburner.com/~ff/heisel/kDqL?a=2-C23mmbaxI:_msq-DZR2fw:yIl2AUoC8zA"><img src="http://feeds.feedburner.com/~ff/heisel/kDqL?d=yIl2AUoC8zA" border="0"></img></a> <a href="http://feeds.feedburner.com/~ff/heisel/kDqL?a=2-C23mmbaxI:_msq-DZR2fw:F7zBnMyn0Lo"><img src="http://feeds.feedburner.com/~ff/heisel/kDqL?i=2-C23mmbaxI:_msq-DZR2fw:F7zBnMyn0Lo" border="0"></img></a>
</div><img src="http://feeds.feedburner.com/~r/heisel/kDqL/~4/2-C23mmbaxI" height="1" width="1"/>]]></content:encoded>
			<wfw:commentRss>http://heisel.org/blog/2009/10/27/its-decorative-gourd-season-motherfuckers/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		<feedburner:origLink>http://heisel.org/blog/2009/10/27/its-decorative-gourd-season-motherfuckers/</feedburner:origLink></item>
		<item>
		<title>Python complexity highlighling in Vim</title>
		<link>http://feedproxy.google.com/~r/heisel/kDqL/~3/jO79btz8g48/</link>
		<comments>http://heisel.org/blog/2009/10/26/python-complexity-highlighling-in-vim/#comments</comments>
		<pubDate>Mon, 26 Oct 2009 22:01:20 +0000</pubDate>
		<dc:creator>Chris</dc:creator>
				<category><![CDATA[Blogmarks]]></category>

		<guid isPermaLink="false">http://heisel.org/blog/2009/10/26/python-complexity-highlighling-in-vim/</guid>
		<description><![CDATA[
Python com&#173;plex&#173;ity high&#173;ligh&#173;ling in Vim &#8211; If you needed a reason to use Vim, this [...]]]></description>
			<content:encoded><![CDATA[<ul>
<li><a href="http://blog.extracheese.org/2009/10/cyclomatic-complexity-in-vim-first-steps.html">Python com&shy;plex&shy;ity high&shy;ligh&shy;ling in Vim</a> &#8211; If you needed a reason to use Vim, this is it. And it is hot.&nbsp;Hot.</li>

</ul>
<div class="feedflare">
<a href="http://feeds.feedburner.com/~ff/heisel/kDqL?a=jO79btz8g48:IwagRSbOhkk:yIl2AUoC8zA"><img src="http://feeds.feedburner.com/~ff/heisel/kDqL?d=yIl2AUoC8zA" border="0"></img></a> <a href="http://feeds.feedburner.com/~ff/heisel/kDqL?a=jO79btz8g48:IwagRSbOhkk:F7zBnMyn0Lo"><img src="http://feeds.feedburner.com/~ff/heisel/kDqL?i=jO79btz8g48:IwagRSbOhkk:F7zBnMyn0Lo" border="0"></img></a>
</div><img src="http://feeds.feedburner.com/~r/heisel/kDqL/~4/jO79btz8g48" height="1" width="1"/>]]></content:encoded>
			<wfw:commentRss>http://heisel.org/blog/2009/10/26/python-complexity-highlighling-in-vim/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		<feedburner:origLink>http://heisel.org/blog/2009/10/26/python-complexity-highlighling-in-vim/</feedburner:origLink></item>
		<item>
		<title>Why I like Redis</title>
		<link>http://feedproxy.google.com/~r/heisel/kDqL/~3/yeV0Xvpu56E/</link>
		<comments>http://heisel.org/blog/2009/10/22/why-i-like-redis/#comments</comments>
		<pubDate>Thu, 22 Oct 2009 13:01:32 +0000</pubDate>
		<dc:creator>Chris</dc:creator>
				<category><![CDATA[Blogmarks]]></category>

		<guid isPermaLink="false">http://heisel.org/blog/2009/10/22/why-i-like-redis/</guid>
		<description><![CDATA[
Why I like Redis &#8211; Redis is a sexy key/value store, sim&#173;i&#173;lar to mem&#173;cache but [...]]]></description>
			<content:encoded><![CDATA[<ul>
<li><a href="http://simonwillison.net/2009/Oct/22/redis/">Why I like Redis</a> &#8211; Redis is a sexy key/value store, sim&shy;i&shy;lar to mem&shy;cache but suited for more of a no-&#8203;SQL appli&shy;ca&shy;tion. I like how Simon is using it for offline data pro&shy;cess&shy;ing and transformation.</li>

</ul>
<div class="feedflare">
<a href="http://feeds.feedburner.com/~ff/heisel/kDqL?a=yeV0Xvpu56E:gPoQFO2ww3Q:yIl2AUoC8zA"><img src="http://feeds.feedburner.com/~ff/heisel/kDqL?d=yIl2AUoC8zA" border="0"></img></a> <a href="http://feeds.feedburner.com/~ff/heisel/kDqL?a=yeV0Xvpu56E:gPoQFO2ww3Q:F7zBnMyn0Lo"><img src="http://feeds.feedburner.com/~ff/heisel/kDqL?i=yeV0Xvpu56E:gPoQFO2ww3Q:F7zBnMyn0Lo" border="0"></img></a>
</div><img src="http://feeds.feedburner.com/~r/heisel/kDqL/~4/yeV0Xvpu56E" height="1" width="1"/>]]></content:encoded>
			<wfw:commentRss>http://heisel.org/blog/2009/10/22/why-i-like-redis/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		<feedburner:origLink>http://heisel.org/blog/2009/10/22/why-i-like-redis/</feedburner:origLink></item>
		<item>
		<title>"The Office", deeper than you may think</title>
		<link>http://feedproxy.google.com/~r/heisel/kDqL/~3/Rk33AowGYdU/</link>
		<comments>http://heisel.org/blog/2009/10/14/the-office-deeper-than-you-may-think/#comments</comments>
		<pubDate>Wed, 14 Oct 2009 19:02:19 +0000</pubDate>
		<dc:creator>Chris</dc:creator>
				<category><![CDATA[Blogmarks]]></category>

		<guid isPermaLink="false">http://heisel.org/blog/2009/10/14/the-office-deeper-than-you-may-think/</guid>
		<description><![CDATA[
&#34;The Office&#34;, deeper than you may think &#8211; A great, and long, analy&#173;sis that feel [...]]]></description>
			<content:encoded><![CDATA[<ul>
<li><a href="http://www.ribbonfarm.com/2009/10/07/the-gervais-principle-or-the-office-according-to-the-office/">&quot;The Office&quot;, deeper than you may think</a> &#8211; A great, and long, analy&shy;sis that feel unset&shy;tlingly accurate</li>

</ul>
<div class="feedflare">
<a href="http://feeds.feedburner.com/~ff/heisel/kDqL?a=Rk33AowGYdU:U_qrEiMa2H8:yIl2AUoC8zA"><img src="http://feeds.feedburner.com/~ff/heisel/kDqL?d=yIl2AUoC8zA" border="0"></img></a> <a href="http://feeds.feedburner.com/~ff/heisel/kDqL?a=Rk33AowGYdU:U_qrEiMa2H8:F7zBnMyn0Lo"><img src="http://feeds.feedburner.com/~ff/heisel/kDqL?i=Rk33AowGYdU:U_qrEiMa2H8:F7zBnMyn0Lo" border="0"></img></a>
</div><img src="http://feeds.feedburner.com/~r/heisel/kDqL/~4/Rk33AowGYdU" height="1" width="1"/>]]></content:encoded>
			<wfw:commentRss>http://heisel.org/blog/2009/10/14/the-office-deeper-than-you-may-think/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		<feedburner:origLink>http://heisel.org/blog/2009/10/14/the-office-deeper-than-you-may-think/</feedburner:origLink></item>
		<item>
		<title>Django at the AJC</title>
		<link>http://feedproxy.google.com/~r/heisel/kDqL/~3/bCYTGUZWvi4/</link>
		<comments>http://heisel.org/blog/2009/10/09/django-at-the-ajc/#comments</comments>
		<pubDate>Fri, 09 Oct 2009 16:00:13 +0000</pubDate>
		<dc:creator>Chris</dc:creator>
				<category><![CDATA[Blogmarks]]></category>

		<guid isPermaLink="false">http://heisel.org/blog/2009/10/09/django-at-the-ajc/</guid>
		<description><![CDATA[
Django at the AJC &#8211; Zellyn gave a great recap of all the Django work [...]]]></description>
			<content:encoded><![CDATA[<ul>
<li><a href="http://www.slideshare.net/zellyn/django-at-the-ajc">Django at the AJC</a> &#8211; Zellyn gave a great recap of all the Django work we&#39;ve done at the AJC for the Python Atlanta Users&nbsp;Group.</li>

</ul>
<div class="feedflare">
<a href="http://feeds.feedburner.com/~ff/heisel/kDqL?a=bCYTGUZWvi4:hh0Eqdbkwm0:yIl2AUoC8zA"><img src="http://feeds.feedburner.com/~ff/heisel/kDqL?d=yIl2AUoC8zA" border="0"></img></a> <a href="http://feeds.feedburner.com/~ff/heisel/kDqL?a=bCYTGUZWvi4:hh0Eqdbkwm0:F7zBnMyn0Lo"><img src="http://feeds.feedburner.com/~ff/heisel/kDqL?i=bCYTGUZWvi4:hh0Eqdbkwm0:F7zBnMyn0Lo" border="0"></img></a>
</div><img src="http://feeds.feedburner.com/~r/heisel/kDqL/~4/bCYTGUZWvi4" height="1" width="1"/>]]></content:encoded>
			<wfw:commentRss>http://heisel.org/blog/2009/10/09/django-at-the-ajc/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		<feedburner:origLink>http://heisel.org/blog/2009/10/09/django-at-the-ajc/</feedburner:origLink></item>
		<item>
		<title>Setup Django with mod_wsgi on your Mac</title>
		<link>http://feedproxy.google.com/~r/heisel/kDqL/~3/k6aaHrTkwi0/</link>
		<comments>http://heisel.org/blog/2009/09/25/mod-wsgi-mac/#comments</comments>
		<pubDate>Fri, 25 Sep 2009 23:09:22 +0000</pubDate>
		<dc:creator>Chris</dc:creator>
				<category><![CDATA[Django]]></category>
		<category><![CDATA[Programming]]></category>
		<category><![CDATA[Python]]></category>

		<guid isPermaLink="false">http://heisel.org/blog/?p=1529</guid>
		<description><![CDATA[Logged for your pleasure, and mine: the steps I went through to setup mod_wsgi on my Mac for local development of Django apps.]]></description>
			<content:encoded><![CDATA[<p>In spirit of writ&shy;ing this down so I don&#8217;t forget, I humbly submit this to <a href="http://www.youtube.com/watch?v=iRmxXp62O8g&amp;feature=related">the Inter&shy;nets</a> in the vain hope that it helps some&shy;one&nbsp;else.</p>

<p>For the pur&shy;poses of this I&#8217;m assum&shy;ing that you have Python and Django installed. I use <a href="http://www.macports.org/">Mac&shy;ports</a> but feel free to use <a href="http://github.com/mxcl/homebrew">Home&shy;brew</a> or any other <a href="http://linux.die.net/man/8/apt-get">fine pack&shy;age man&shy;ager</a>.</p>

<ul>
<li>Install apache2 and mod_wsgi</li>
</ul>


<div class="wp_syntax"><div class="code"><pre class="bash" style="font-family:monospace;">~ $ <span style="color: #c20cb9; font-weight: bold;">sudo</span> port <span style="color: #c20cb9; font-weight: bold;">install</span> apache2 mod_wsgi</pre></div></div>


<ul>
<li><p>You&#8217;ll prob&shy;a&shy;bly want to to add /opt/local/apache2/bin/ to your $PATH in ~/.profile</p></li>
<li><p>Create an httpd.conf file</p></li>
</ul>


<div class="wp_syntax"><div class="code"><pre class="bash" style="font-family:monospace;"><span style="color: #7a0874; font-weight: bold;">cd</span> <span style="color: #000000; font-weight: bold;">/</span>opt<span style="color: #000000; font-weight: bold;">/</span>local<span style="color: #000000; font-weight: bold;">/</span>apache2<span style="color: #000000; font-weight: bold;">/</span>conf
<span style="color: #c20cb9; font-weight: bold;">sudo</span> <span style="color: #c20cb9; font-weight: bold;">cp</span> httpd.conf.sample httpd.conf</pre></div></div>


<ul>
<li>Add the mod_wsgi module to httpd.conf</li>
</ul>


<div class="wp_syntax"><div class="code"><pre class="apache" style="font-family:monospace;"><span style="color: #00007f;">LoadModule</span> wsgi_module modules/mod_wsgi.so</pre></div></div>


<ul>
<li>Make sure the vhosts config file is loaded in httpd.conf</li>
</ul>


<div class="wp_syntax"><div class="code"><pre class="apache" style="font-family:monospace;"><span style="color: #00007f;">Include</span> conf/extra/httpd-vhosts.conf</pre></div></div>


<ul>
<li>Set up a vhost for your domain in /opt/local/apache2/conf/extra/httpd-vhosts.conf. Note the YOUR-&#8203;USERNAME-&#8203;HERE place holder.</li>
</ul>


<div class="wp_syntax"><div class="code"><pre class="apache" style="font-family:monospace;"><span style="color: #00007f;">NameVirtualHost</span> *:<span style="color: #ff0000;">80</span>
&nbsp;
&lt;<span style="color: #000000; font-weight:bold;">VirtualHost</span> *:<span style="color: #ff0000;">80</span>&gt;
    <span style="color: #00007f;">ServerName</span> local.yourdomain.com
    <span style="color: #00007f;">ErrorLog</span> <span style="color: #7f007f;">&quot;/private/var/log/apache2/local.yourdomain.com-error_log&quot;</span>
&nbsp;
    &lt;<span style="color: #000000; font-weight:bold;">Directory</span> /Users/YOUR-USERNAME-HERE/Code/wsgi_apps&gt;
        <span style="color: #00007f;">AllowOverride</span> <span style="color: #00007f;">All</span>
        <span style="color: #00007f;">Options</span> <span style="color: #0000ff;">Indexes</span> <span style="color: #0000ff;">FollowSymLinks</span>
        <span style="color: #00007f;">Order</span> <span style="color: #00007f;">allow</span>,<span style="color: #00007f;">deny</span>
        <span style="color: #00007f;">Allow</span> <span style="color: #00007f;">from</span> <span style="color: #00007f;">all</span>
    &lt;/<span style="color: #000000; font-weight:bold;">Directory</span>&gt;
&nbsp;
    WSGIDaemonProcess local.yourdomain.com processes=<span style="color: #ff0000;">1</span> threads=<span style="color: #ff0000;">1</span> maximum-requests=<span style="color: #ff0000;">1</span>
    WSGIProcessGroup local.yourdomain.com
&nbsp;
    WSGIScriptAlias / <span style="color: #7f007f;">&quot;/Users/YOUR-USERNAME-HERE/Code/wsgi_apps/local.yourdomain.com.wsgi&quot;</span>
&lt;/<span style="color: #000000; font-weight:bold;">VirtualHost</span>&gt;</pre></div></div>


<p><strong>Note:</strong> I amended the WSGI&shy;Dae&shy;mon&shy;Process line above so your code would get refreshed with each new request.</p>

<p>The ~/Code/wsgi_apps path is arbi&shy;trary, that&#8217;s just where I keep&nbsp;mine.</p>

<p>Many folks like to keep their .wsgi files in a /public direc&shy;tory inside their Django project. I like to work with&shy;out a project folder, but either way, sub&shy;sti&shy;tute the path to your wsgi file for /Users/YOUR-USERNAME-HERE/Code/wsgi_apps.</p>

<ul>
<li>Check your Apache conf before your wreck your apache conf</li>
</ul>


<div class="wp_syntax"><div class="code"><pre class="bash" style="font-family:monospace;">$ <span style="color: #c20cb9; font-weight: bold;">sudo</span> apachectl configtest
Syntax OK</pre></div></div>


<ul>
<li><p>Set up an alias for your domain in /etc/hosts</p>

<p><pre>
127.0.0.1       localhost
255.255.255.255 broadcasthost
::1             localhost 
fe80::1%lo0     localhost
127.0.0.1 local.yourdomain.com #Local Django server
</pre></p></li>
<li><p>Set up your actual wsgi&nbsp;file</p></li>
</ul>


<div class="wp_syntax"><div class="code"><pre class="python" style="font-family:monospace;"><span style="color: #ff7700;font-weight:bold;">import</span> <span style="color: #dc143c;">site</span>
<span style="color: #dc143c;">site</span>.<span style="color: black;">addsitedir</span><span style="color: black;">&#40;</span><span style="color: #483d8b;">'/Users/YOUR-USERNAME-HERE/.virtualenvs/YOUR-VIRTUALENV/lib/python2.4/site-packages'</span><span style="color: black;">&#41;</span>
&nbsp;
<span style="color: #ff7700;font-weight:bold;">import</span> <span style="color: #dc143c;">os</span>
<span style="color: #dc143c;">os</span>.<span style="color: black;">environ</span><span style="color: black;">&#91;</span><span style="color: #483d8b;">'DJANGO_SETTINGS_MODULE'</span><span style="color: black;">&#93;</span> = <span style="color: #483d8b;">'mysettingsmodule.local'</span>
&nbsp;
<span style="color: #ff7700;font-weight:bold;">import</span> django.<span style="color: black;">core</span>.<span style="color: black;">handlers</span>.<span style="color: black;">wsgi</span>
application = django.<span style="color: black;">core</span>.<span style="color: black;">handlers</span>.<span style="color: black;">wsgi</span>.<span style="color: black;">WSGIHandler</span><span style="color: black;">&#40;</span><span style="color: black;">&#41;</span></pre></div></div>


<p>I&#8217;m using <a href="http://pypi.python.org/pypi/virtualenv">Ian Bicking&#8217;s vir&shy;tualenv</a> and <a href="http://www.doughellmann.com/projects/virtualenvwrapper/">Doug Hellmann&#8217;s kick-&#8203;ass vir&shy;tualen&shy;vwrap&shy;per</a>, and you should be&nbsp;too.</p>

<p>If you&#8217;re not <strong>and</strong> you&#8217;re able to ignore the cries of all the pup&shy;pies and bun&shy;nies you&#8217;re killing because you&#8217;re not, then you&#8217;ll want to remove the first two&nbsp;lines.</p>

<ul>
<li>Fire up Apache</li>
</ul>


<div class="wp_syntax"><div class="code"><pre class="bash" style="font-family:monospace;">$ <span style="color: #c20cb9; font-weight: bold;">sudo</span> apachectl start</pre></div></div>


<p>That should be it! Go to http://&#8203;local.&#8203;your&#8203;do&#8203;main.com in your favorite browser and you should see your Django project.</p>
<div class="feedflare">
<a href="http://feeds.feedburner.com/~ff/heisel/kDqL?a=k6aaHrTkwi0:tF__AMglp3w:yIl2AUoC8zA"><img src="http://feeds.feedburner.com/~ff/heisel/kDqL?d=yIl2AUoC8zA" border="0"></img></a> <a href="http://feeds.feedburner.com/~ff/heisel/kDqL?a=k6aaHrTkwi0:tF__AMglp3w:F7zBnMyn0Lo"><img src="http://feeds.feedburner.com/~ff/heisel/kDqL?i=k6aaHrTkwi0:tF__AMglp3w:F7zBnMyn0Lo" border="0"></img></a>
</div><img src="http://feeds.feedburner.com/~r/heisel/kDqL/~4/k6aaHrTkwi0" height="1" width="1"/>]]></content:encoded>
			<wfw:commentRss>http://heisel.org/blog/2009/09/25/mod-wsgi-mac/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		<feedburner:origLink>http://heisel.org/blog/2009/09/25/mod-wsgi-mac/</feedburner:origLink></item>
		<item>
		<title>Rare Centuple Play Ends Mets’ Season</title>
		<link>http://feedproxy.google.com/~r/heisel/kDqL/~3/fRSq-5hfC1k/</link>
		<comments>http://heisel.org/blog/2009/09/20/rare-centuple-play-ends-mets-season/#comments</comments>
		<pubDate>Mon, 21 Sep 2009 00:00:53 +0000</pubDate>
		<dc:creator>Chris</dc:creator>
				<category><![CDATA[Blogmarks]]></category>

		<guid isPermaLink="false">http://heisel.org/blog/2009/09/20/rare-centuple-play-ends-mets-season/</guid>
		<description><![CDATA[
Rare Cen&#173;tu&#173;ple Play Ends Mets&#8217; Season &#8211; &#34;This was the most outs recorded on a [...]]]></description>
			<content:encoded><![CDATA[<ul>
<li><a href="http://www.theonion.com/content/news_briefs/rare_centuple_play_ends">Rare Cen&shy;tu&shy;ple Play Ends Mets&#8217; Season</a> &#8211; &quot;This was the most outs recorded on a single play since the 2004 Mon&shy;treal Expos were erad&shy;i&shy;cated from the league after hit&shy;ting into an &infin;-play&quot;</li>

</ul>
<div class="feedflare">
<a href="http://feeds.feedburner.com/~ff/heisel/kDqL?a=fRSq-5hfC1k:HZW4hrIwSRs:yIl2AUoC8zA"><img src="http://feeds.feedburner.com/~ff/heisel/kDqL?d=yIl2AUoC8zA" border="0"></img></a> <a href="http://feeds.feedburner.com/~ff/heisel/kDqL?a=fRSq-5hfC1k:HZW4hrIwSRs:F7zBnMyn0Lo"><img src="http://feeds.feedburner.com/~ff/heisel/kDqL?i=fRSq-5hfC1k:HZW4hrIwSRs:F7zBnMyn0Lo" border="0"></img></a>
</div><img src="http://feeds.feedburner.com/~r/heisel/kDqL/~4/fRSq-5hfC1k" height="1" width="1"/>]]></content:encoded>
			<wfw:commentRss>http://heisel.org/blog/2009/09/20/rare-centuple-play-ends-mets-season/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		<feedburner:origLink>http://heisel.org/blog/2009/09/20/rare-centuple-play-ends-mets-season/</feedburner:origLink></item>
		<item>
		<title>A git flavored distributed ticket system</title>
		<link>http://feedproxy.google.com/~r/heisel/kDqL/~3/OUe0MATbNpY/</link>
		<comments>http://heisel.org/blog/2009/09/20/a-git-flavored-distributed-ticket-system/#comments</comments>
		<pubDate>Sun, 20 Sep 2009 23:00:24 +0000</pubDate>
		<dc:creator>Chris</dc:creator>
				<category><![CDATA[Blogmarks]]></category>

		<guid isPermaLink="false">http://heisel.org/blog/2009/09/20/a-git-flavored-distributed-ticket-system/</guid>
		<description><![CDATA[
A git fla&#173;vored dis&#173;trib&#173;uted ticket system &#8211; Inter&#173;est&#173;ing, at first glance, take by GitHub&#39;s Scott [...]]]></description>
			<content:encoded><![CDATA[<ul>
<li><a href="http://wiki.github.com/schacon/ticgit">A git fla&shy;vored dis&shy;trib&shy;uted ticket system</a> &#8211; Inter&shy;est&shy;ing, at first glance, take by GitHub&#39;s Scott Chacon. I think the Fossil DVCS has the con&shy;cept of tickets/todos built-&#8203;in.</li>

</ul>
<div class="feedflare">
<a href="http://feeds.feedburner.com/~ff/heisel/kDqL?a=OUe0MATbNpY:pONvUhBLAnI:yIl2AUoC8zA"><img src="http://feeds.feedburner.com/~ff/heisel/kDqL?d=yIl2AUoC8zA" border="0"></img></a> <a href="http://feeds.feedburner.com/~ff/heisel/kDqL?a=OUe0MATbNpY:pONvUhBLAnI:F7zBnMyn0Lo"><img src="http://feeds.feedburner.com/~ff/heisel/kDqL?i=OUe0MATbNpY:pONvUhBLAnI:F7zBnMyn0Lo" border="0"></img></a>
</div><img src="http://feeds.feedburner.com/~r/heisel/kDqL/~4/OUe0MATbNpY" height="1" width="1"/>]]></content:encoded>
			<wfw:commentRss>http://heisel.org/blog/2009/09/20/a-git-flavored-distributed-ticket-system/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		<feedburner:origLink>http://heisel.org/blog/2009/09/20/a-git-flavored-distributed-ticket-system/</feedburner:origLink></item>
		<item>
		<title>Memcached and WordPress MU</title>
		<link>http://feedproxy.google.com/~r/heisel/kDqL/~3/ZpZzz-ED9UU/</link>
		<comments>http://heisel.org/blog/2009/09/19/memcache-wordpress/#comments</comments>
		<pubDate>Sat, 19 Sep 2009 19:44:56 +0000</pubDate>
		<dc:creator>Chris</dc:creator>
				<category><![CDATA[Programming]]></category>
		<category><![CDATA[Technology]]></category>

		<guid isPermaLink="false">http://heisel.org/blog/?p=1483</guid>
		<description><![CDATA[A step-by-step walkthrough to get WordPress and WordPressMU working with memcached.]]></description>
			<content:encoded><![CDATA[<p>This week I, with help from many, got <a href="http://mu.wordpress.org/">Word&shy;PressMU</a> setup to use <a href="http://www.danga.com/memcached/">mem&shy;cached</a>.</p>

<p>The instruc&shy;tions for doing all this are on the Inter&shy;net, but I thought it might help others (or at least my future self) to com&shy;pile them all in one&nbsp;spot.</p>

<h3>How WordPress caches</h3>

<p>There are two layers of caching in Word&shy;Press:
* An object level cache, sim&shy;i&shy;lar to Django&#8217;s <a href="http://docs.djangoproject.com/en/dev/topics/cache/#the-low-level-cache-api">low-&#8203;level cache</a>
* Page level caching, pro&shy;vided by plu&shy;g&shy;ins, sim&shy;i&shy;lar to Django&#8217;s <a href="http://docs.djangoproject.com/en/dev/topics/cache/#the-per-view-cache">per-&#8203;view cache</a></p>

<p>By the time we&#8217;re done, we&#8217;ll have both using mem&shy;cache. The object cache defaults to the file system, and most folks use <a href="http://wordpress.org/extend/plugins/wp-super-cache/">WP Super Cache</a> which caches pages to the filesys&shy;tem as&nbsp;well.</p>

<h3>Object caching</h3>

<ul>
<li><p>Install the <a href="http://us.php.net/memcache">PHP mem&shy;cache module</a></p></li>
<li><p>Add these set&shy;tings to your <strong>wp-config.php</strong></p></li>
</ul>


<div class="wp_syntax"><div class="code"><pre class="php" style="font-family:monospace;"><span style="color: #000000; font-weight: bold;">global</span> <span style="color: #000088;">$memcached_servers</span><span style="color: #339933;">;</span>
<span style="color: #000088;">$memcached_servers</span> <span style="color: #339933;">=</span> <span style="color: #990000;">array</span><span style="color: #009900;">&#40;</span><span style="color: #0000ff;">'default'</span> <span style="color: #339933;">=&gt;</span> <span style="color: #990000;">array</span><span style="color: #009900;">&#40;</span><span style="color: #0000ff;">'127.0.0.1:11211'</span><span style="color: #009900;">&#41;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span></pre></div></div>


<p>You can add as many servers and change the port number to match your mem&shy;cached setup. Example:</p>


<div class="wp_syntax"><div class="code"><pre class="php" style="font-family:monospace;"><span style="color: #000000; font-weight: bold;">global</span> <span style="color: #000088;">$memcached_servers</span><span style="color: #339933;">;</span>
<span style="color: #000088;">$memcached_servers</span> <span style="color: #339933;">=</span> <span style="color: #990000;">array</span><span style="color: #009900;">&#40;</span><span style="color: #0000ff;">'default'</span> <span style="color: #339933;">=&gt;</span> <span style="color: #990000;">array</span><span style="color: #009900;">&#40;</span><span style="color: #0000ff;">'bradfitzrocks:11211'</span><span style="color: #339933;">,</span> <span style="color: #0000ff;">'bradfitzrocks2.mycompanydomain.com:90210'</span><span style="color: #009900;">&#41;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span></pre></div></div>


<ul>
<li><p>Install the mem&shy;cache ver&shy;sion of WordPress&#8217;s <a href="http://plugins.trac.wordpress.org/export/71058/memcached/trunk/object-cache.php">object-cache.php</a> to your blog&#8217;s wp-&#8203;content folder.</p>

<p>I don&#8217;t want to side&shy;track myself com&shy;par&shy;ing how much <a href="http://djangoproject.com">Django</a> rocks com&shy;pared to PHP or Word&shy;Press, but I will anyway! In Django, your cache setup is a <a href="http://docs.djangoproject.com/en/dev/ref/settings/#cache-backend">set&shy;ting</a>, which makes local devel&shy;op&shy;ment soooo much easier.</p></li>
</ul>

<p>Stop here and you&#8217;ll be live with Word&shy;Press object caching.</p>

<h3>Page caching</h3>

<ul>
<li><p>You must have fol&shy;lowed the steps above to hook up WordPress&#8217;s object cache to memcache.</p></li>
<li><p>If it&#8217;s installed, unin&shy;stall <a href="http://wordpress.org/extend/plugins/wp-super-cache/">WP Super Cache</a></p></li>
<li><p>Install <a href="http://github.com/cmheisel/batcache">Bat&shy;cache</a> by putting advanced-cache.php file in your blog&#8217;s wp-&#8203;content folder, and batcache.php in your blog&#8217;s wp-content/plugins folder.</p></li>
<li><p>Acti&shy;vate the Bat&shy;cache plugin from within the admin inter&shy;face, if you&#8217;re on Word&shy;PressMU use the &#8220;Activate X Site Wide&#8221; link.</p></li>
<li><p>Hit reload on a page a few times and then view source and you should see some&shy;thing like&nbsp;this:</p></li>
</ul>


<div class="wp_syntax"><div class="code"><pre class="html" style="font-family:monospace;">&lt;!--
	generated 12 seconds ago
	generated in 0.683 seconds
	served from batcache in 0.006 seconds
	expires in 288 seconds
--&gt;
&lt;/head&gt;</pre></div></div>


<ul>
<li>Option&shy;ally, tweak Batcache&#8217;s behav&shy;ior by edit&shy;ing the options in advanced-cache.php</li>
</ul>


<div class="wp_syntax"><div class="code"><pre class="php" style="font-family:monospace;"><span style="color: #000000; font-weight: bold;">var</span> <span style="color: #000088;">$max_age</span> <span style="color: #339933;">=</span> <span style="color: #cc66cc;">300</span><span style="color: #339933;">;</span> <span style="color: #666666; font-style: italic;">// Expire batcache items aged this many seconds (zero to disable batcache)</span>
&nbsp;
<span style="color: #000000; font-weight: bold;">var</span> <span style="color: #000088;">$remote</span> <span style="color: #339933;">=</span> <span style="color: #cc66cc;">0</span><span style="color: #339933;">;</span> <span style="color: #666666; font-style: italic;">// Zero disables sending buffers to remote datacenters (req/sec is never sent)</span>
&nbsp;
<span style="color: #000000; font-weight: bold;">var</span> <span style="color: #000088;">$times</span> <span style="color: #339933;">=</span> <span style="color: #cc66cc;">2</span><span style="color: #339933;">;</span> <span style="color: #666666; font-style: italic;">// Only batcache a page after it is accessed this many times... (two or more)</span>
&nbsp;
<span style="color: #000000; font-weight: bold;">var</span> <span style="color: #000088;">$seconds</span> <span style="color: #339933;">=</span> <span style="color: #cc66cc;">120</span><span style="color: #339933;">;</span> <span style="color: #666666; font-style: italic;">// ...in this many seconds (zero to ignore this and use batcache immediately)</span>
&nbsp;
<span style="color: #000000; font-weight: bold;">var</span> <span style="color: #000088;">$group</span> <span style="color: #339933;">=</span> <span style="color: #0000ff;">'batcache'</span><span style="color: #339933;">;</span> <span style="color: #666666; font-style: italic;">// Name of memcached group. You can simulate a cache flush by changing this.</span>
&nbsp;
<span style="color: #000000; font-weight: bold;">var</span> <span style="color: #000088;">$unique</span> <span style="color: #339933;">=</span> <span style="color: #990000;">array</span><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span> <span style="color: #666666; font-style: italic;">// If you conditionally serve different content, put the variable values here.</span>
&nbsp;
<span style="color: #000000; font-weight: bold;">var</span> <span style="color: #000088;">$headers</span> <span style="color: #339933;">=</span> <span style="color: #990000;">array</span><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span> <span style="color: #666666; font-style: italic;">// Add headers here. These will be sent with every response from the cache.</span>
&nbsp;
<span style="color: #000000; font-weight: bold;">var</span> <span style="color: #000088;">$uncached_headers</span> <span style="color: #339933;">=</span> <span style="color: #990000;">array</span><span style="color: #009900;">&#40;</span><span style="color: #0000ff;">'transfer-encoding'</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span> <span style="color: #666666; font-style: italic;">// These headers will never be cached. Apply strtolower.</span>
&nbsp;
<span style="color: #000000; font-weight: bold;">var</span> <span style="color: #000088;">$debug</span> <span style="color: #339933;">=</span> <span style="color: #009900; font-weight: bold;">true</span><span style="color: #339933;">;</span> <span style="color: #666666; font-style: italic;">// Set false to hide the batcache info &lt;!-- comment --&gt;</span>
&nbsp;
<span style="color: #000000; font-weight: bold;">var</span> <span style="color: #000088;">$cache_control</span> <span style="color: #339933;">=</span> <span style="color: #009900; font-weight: bold;">true</span><span style="color: #339933;">;</span> <span style="color: #666666; font-style: italic;">// Set false to disable Last-Modified and Cache-Control headers</span>
&nbsp;
<span style="color: #000000; font-weight: bold;">var</span> <span style="color: #000088;">$cancel</span> <span style="color: #339933;">=</span> <span style="color: #009900; font-weight: bold;">false</span><span style="color: #339933;">;</span> <span style="color: #666666; font-style: italic;">// Change this to cancel the output buffer. Use batcache_cancel();</span></pre></div></div>


<p>The Bat&shy;cache ver&shy;sion I linked to is a GitHub fork of <a href="http://github.com/skeltoac/batcache">Andy Skelton&#8217;s</a> orig&shy;i&shy;nal ver&shy;sion. My fork includes a patch to make sure the Content-&#8203;Type header is set cor&shy;rectly on non-&#8203;HTML pages. I&#8217;m hoping to add some more cache inval&shy;i&shy;da&shy;tion rules on top of the great work Andy already did.</p>

<p>Many thanks to the fol&shy;low&shy;ing&nbsp;folks:</p>

<ul>
<li><a href="http://mohanjith.net/blog/2008/10/using-memcached-with-wordpress-object-cache.html">Mohan&shy;jith</a> for the object cache set&nbsp;up</li>
<li><a href="http://skeltoac.com/">Andy Skel&shy;ton</a> for cre&shy;at&shy;ing Bat&shy;cache and being kind enough to drop a ver&shy;sion on GitHub for me to&nbsp;fork</li>
<li><a href="http://maisonbisson.com/blog/post/13773/fixing-batcache-to-send-the-correct-content-type-header/">Casey Bisson</a> for describ&shy;ing the content-&#8203;type patch for Batcache</li>
</ul>
<div class="feedflare">
<a href="http://feeds.feedburner.com/~ff/heisel/kDqL?a=ZpZzz-ED9UU:Yg7-r-FAllQ:yIl2AUoC8zA"><img src="http://feeds.feedburner.com/~ff/heisel/kDqL?d=yIl2AUoC8zA" border="0"></img></a> <a href="http://feeds.feedburner.com/~ff/heisel/kDqL?a=ZpZzz-ED9UU:Yg7-r-FAllQ:F7zBnMyn0Lo"><img src="http://feeds.feedburner.com/~ff/heisel/kDqL?i=ZpZzz-ED9UU:Yg7-r-FAllQ:F7zBnMyn0Lo" border="0"></img></a>
</div><img src="http://feeds.feedburner.com/~r/heisel/kDqL/~4/ZpZzz-ED9UU" height="1" width="1"/>]]></content:encoded>
			<wfw:commentRss>http://heisel.org/blog/2009/09/19/memcache-wordpress/feed/</wfw:commentRss>
		<slash:comments>1</slash:comments>
		<feedburner:origLink>http://heisel.org/blog/2009/09/19/memcache-wordpress/</feedburner:origLink></item>
		<item>
		<title>New UI hotness for the Django Debug Toolbar</title>
		<link>http://feedproxy.google.com/~r/heisel/kDqL/~3/aCHscz8n8M8/</link>
		<comments>http://heisel.org/blog/2009/09/18/new-ui-hotness-for-the-django-debug-toolbar/#comments</comments>
		<pubDate>Fri, 18 Sep 2009 16:02:38 +0000</pubDate>
		<dc:creator>Chris</dc:creator>
				<category><![CDATA[Blogmarks]]></category>

		<guid isPermaLink="false">http://heisel.org/blog/2009/09/18/new-ui-hotness-for-the-django-debug-toolbar/</guid>
		<description><![CDATA[
New UI hot&#173;ness for the Django Debug Tool&#173;bar &#8211; Made an already great tool even [...]]]></description>
			<content:encoded><![CDATA[<ul>
<li><a href="http://robhudson.github.com/django-debug-toolbar/">New UI hot&shy;ness for the Django Debug Tool&shy;bar</a> &#8211; Made an already great tool even better.</li>

</ul>
<div class="feedflare">
<a href="http://feeds.feedburner.com/~ff/heisel/kDqL?a=aCHscz8n8M8:gRRKP9FrIuI:yIl2AUoC8zA"><img src="http://feeds.feedburner.com/~ff/heisel/kDqL?d=yIl2AUoC8zA" border="0"></img></a> <a href="http://feeds.feedburner.com/~ff/heisel/kDqL?a=aCHscz8n8M8:gRRKP9FrIuI:F7zBnMyn0Lo"><img src="http://feeds.feedburner.com/~ff/heisel/kDqL?i=aCHscz8n8M8:gRRKP9FrIuI:F7zBnMyn0Lo" border="0"></img></a>
</div><img src="http://feeds.feedburner.com/~r/heisel/kDqL/~4/aCHscz8n8M8" height="1" width="1"/>]]></content:encoded>
			<wfw:commentRss>http://heisel.org/blog/2009/09/18/new-ui-hotness-for-the-django-debug-toolbar/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		<feedburner:origLink>http://heisel.org/blog/2009/09/18/new-ui-hotness-for-the-django-debug-toolbar/</feedburner:origLink></item>
		<item>
		<title>Time travel posters</title>
		<link>http://feedproxy.google.com/~r/heisel/kDqL/~3/3yE7j7Xad_s/</link>
		<comments>http://heisel.org/blog/2009/09/14/time-travel-posters/#comments</comments>
		<pubDate>Mon, 14 Sep 2009 21:05:05 +0000</pubDate>
		<dc:creator>Chris</dc:creator>
				<category><![CDATA[Blogmarks]]></category>

		<guid isPermaLink="false">http://heisel.org/blog/2009/09/14/time-travel-posters/</guid>
		<description><![CDATA[
Time travel posters &#8211; Travel to these exotic times of yore! I love the ice [...]]]></description>
			<content:encoded><![CDATA[<ul>
<li><a href="http://826la.org/store-sundries/#F.A.T.">Time travel posters</a> &#8211; Travel to these exotic times of yore! I love the ice age&nbsp;one!</li>

</ul>
<div class="feedflare">
<a href="http://feeds.feedburner.com/~ff/heisel/kDqL?a=3yE7j7Xad_s:XM8apDhhuhI:yIl2AUoC8zA"><img src="http://feeds.feedburner.com/~ff/heisel/kDqL?d=yIl2AUoC8zA" border="0"></img></a> <a href="http://feeds.feedburner.com/~ff/heisel/kDqL?a=3yE7j7Xad_s:XM8apDhhuhI:F7zBnMyn0Lo"><img src="http://feeds.feedburner.com/~ff/heisel/kDqL?i=3yE7j7Xad_s:XM8apDhhuhI:F7zBnMyn0Lo" border="0"></img></a>
</div><img src="http://feeds.feedburner.com/~r/heisel/kDqL/~4/3yE7j7Xad_s" height="1" width="1"/>]]></content:encoded>
			<wfw:commentRss>http://heisel.org/blog/2009/09/14/time-travel-posters/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		<feedburner:origLink>http://heisel.org/blog/2009/09/14/time-travel-posters/</feedburner:origLink></item>
		<item>
		<title>A short introduction to Django and Gearman</title>
		<link>http://feedproxy.google.com/~r/heisel/kDqL/~3/Io8MbKb55j8/</link>
		<comments>http://heisel.org/blog/2009/09/11/gearman/#comments</comments>
		<pubDate>Fri, 11 Sep 2009 17:20:11 +0000</pubDate>
		<dc:creator>Chris</dc:creator>
				<category><![CDATA[Django]]></category>
		<category><![CDATA[Programming]]></category>
		<category><![CDATA[Python]]></category>

		<guid isPermaLink="false">http://heisel.org/blog/?p=1456</guid>
		<description><![CDATA[Notes from my lightning talk at DjangoCon 2009 on Gearman, a distributed work queue.]]></description>
			<content:encoded><![CDATA[<p><em>Note: This is a recap of a light&shy;ning talk I gave at <a href="http://www.djangocon.org/">Djan&shy;go&shy;Con 2009</a>. Here are <a href="http://www.slideshare.net/cmheisel/gearman-and-django-working-later">the slides</a></em></p>

<p>Prob&shy;lem: You&#8217;ve got resource or time inten&shy;sive work to be done but you don&#8217;t want to do it within the Django request/response cycle. Jobs like fetch&shy;ing remote resources, resiz&shy;ing images, expen&shy;sive data&shy;base queries, etc. are good candidates.</p>

<p>At work, when&shy;ever we have a prob&shy;lem with scal&shy;ing, or really any prob&shy;lem at all, <a href="http://revjohnnyhealey.wordpress.com/">Johnny</a> always asks <strong>&#8220;What would <a href="http://bradfitz.com/">Brad Fitz&shy;patrick</a> do?&#8221;</strong></p>

<p><a href="http://heisel.org/blog/2009/09/11/gearman/bradfitz-png/" rel="attachment wp-att-1455"><img src="http://heisel.org/blog/wp-content/uploads/2009/09/bradfitz-300x200.png" alt="bradfitz.png" title="bradfitz.png" width="300" height="200" class="alignleft size-medium wp-image-1455" /></a></p>

<p>What he did was build <a href="http://gearman.org/">Gear&shy;man</a>. It is a work queu&shy;ing and dis&shy;tri&shy;b&shy;u&shy;tion system. From your client code you send a request off for work to be done, either syn&shy;chro&shy;nously or asyn&shy;chro&shy;nously. Worker instances pull jobs off the stack and per&shy;form&nbsp;them.</p>

<p>The Python bind&shy;ings are <a href="http://samuel.github.com/python-gearman/docs/">stu&shy;pidly simple to use</a>.</p>


<div class="wp_syntax"><div class="code"><pre class="python" style="font-family:monospace;"><span style="color: #808080; font-style: italic;"># client.py</span>
<span style="color: #ff7700;font-weight:bold;">from</span> gearman <span style="color: #ff7700;font-weight:bold;">import</span> GearmanClient
client = GearmanClient<span style="color: black;">&#40;</span><span style="color: black;">&#91;</span><span style="color: #483d8b;">&quot;127.0.0.1&quot;</span><span style="color: black;">&#93;</span><span style="color: black;">&#41;</span>
client.<span style="color: black;">dispatch_background_task</span><span style="color: black;">&#40;</span><span style="color: #483d8b;">&quot;echo&quot;</span>, <span style="color: #483d8b;">&quot;foo&quot;</span><span style="color: black;">&#41;</span>
&nbsp;
<span style="color: #808080; font-style: italic;"># worker.py</span>
worker = GearmanWorker<span style="color: black;">&#40;</span><span style="color: black;">&#91;</span><span style="color: #483d8b;">&quot;127.0.0.1&quot;</span><span style="color: black;">&#93;</span><span style="color: black;">&#41;</span>
worker.<span style="color: black;">register_function</span><span style="color: black;">&#40;</span><span style="color: #483d8b;">&quot;echo&quot;</span>, <span style="color: #ff7700;font-weight:bold;">lambda</span> job:job.<span style="color: black;">arg</span><span style="color: black;">&#41;</span>
worker.<span style="color: black;">work</span><span style="color: black;">&#40;</span><span style="color: black;">&#41;</span></pre></div></div>


<p>It&#8217;s con&shy;cep&shy;tu&shy;ally sim&shy;i&shy;lar to <a href="http://www.rabbitmq.com/">Rab&shy;bitMQ</a>. Both are mes&shy;sage queues but Gear&shy;man feels a little more spe&shy;cial&shy;ized for use as a task queue, while Rab&shy;bitMQ is more a gen&shy;eral mes&shy;sag&shy;ing framework.</p>

<p>Rab&shy;bitMQ is nice as well but I&#8217;ve got one par&shy;tic&shy;u&shy;lar pet peeve with it. When you ask &#8220;How do I scale RabbitMQ?&#8221; the answer is pretty much <a href="http://browsertoolkit.com/fault-tolerance.png">&#8220;Use the power of Erlang&#8221;</a>.</p>

<p>When you ask &#8220;How do I scale Gearman?&#8221; the answer is &#8220;just like mem&shy;cached, add more servers to the clus&shy;ter and spec&shy;ify them in your connection.&#8221;</p>


<div class="wp_syntax"><div class="code"><pre class="python" style="font-family:monospace;"><span style="color: #ff7700;font-weight:bold;">from</span> gearman <span style="color: #ff7700;font-weight:bold;">import</span> GearmanClient
&nbsp;
client = GearmanClient<span style="color: black;">&#40;</span><span style="color: black;">&#91;</span><span style="color: #483d8b;">&quot;workserver.yourdomain.com&quot;</span>,
<span style="color: #483d8b;">&quot;procrastinate.yourdomain.com&quot;</span><span style="color: black;">&#93;</span><span style="color: black;">&#41;</span></pre></div></div>


<p>If you&#8217;re look&shy;ing for a task queue, I highly rec&shy;om&shy;mend <a href="http://gearman.org/">Gear&shy;man</a> &#8212; it&#8217;s easy to use and easy to&nbsp;scale!</p>
<div class="feedflare">
<a href="http://feeds.feedburner.com/~ff/heisel/kDqL?a=Io8MbKb55j8:XPfR0tHi9cw:yIl2AUoC8zA"><img src="http://feeds.feedburner.com/~ff/heisel/kDqL?d=yIl2AUoC8zA" border="0"></img></a> <a href="http://feeds.feedburner.com/~ff/heisel/kDqL?a=Io8MbKb55j8:XPfR0tHi9cw:F7zBnMyn0Lo"><img src="http://feeds.feedburner.com/~ff/heisel/kDqL?i=Io8MbKb55j8:XPfR0tHi9cw:F7zBnMyn0Lo" border="0"></img></a>
</div><img src="http://feeds.feedburner.com/~r/heisel/kDqL/~4/Io8MbKb55j8" height="1" width="1"/>]]></content:encoded>
			<wfw:commentRss>http://heisel.org/blog/2009/09/11/gearman/feed/</wfw:commentRss>
		<slash:comments>2</slash:comments>
		<feedburner:origLink>http://heisel.org/blog/2009/09/11/gearman/</feedburner:origLink></item>
		<item>
		<title>A book lover’s guide to IKEA seating</title>
		<link>http://feedproxy.google.com/~r/heisel/kDqL/~3/nclKrA346PA/</link>
		<comments>http://heisel.org/blog/2009/09/09/a-book-lovers-guide-to-ikea-seating/#comments</comments>
		<pubDate>Wed, 09 Sep 2009 07:01:24 +0000</pubDate>
		<dc:creator>Chris</dc:creator>
				<category><![CDATA[Blogmarks]]></category>

		<guid isPermaLink="false">http://heisel.org/blog/2009/09/09/a-book-lovers-guide-to-ikea-seating/</guid>
		<description><![CDATA[
A book lover&#8217;s guide to IKEA seat&#173;ing &#8211; &#34;This chair comes with Jonathan Franzen. Some [...]]]></description>
			<content:encoded><![CDATA[<ul>
<li><a href="http://htmlgiant.com/?p=13745">A book lover&rsquo;s guide to IKEA seat&shy;ing</a> &#8211; &quot;This chair comes with Jonathan Franzen. Some impor&shy;tant notes while assem&shy;bling this chair: make sure you do it cor&shy;rectly the first time, no mistakes.&quot; Ha ha ha ha&nbsp;ha!</li>

</ul>
<div class="feedflare">
<a href="http://feeds.feedburner.com/~ff/heisel/kDqL?a=nclKrA346PA:xEvTnoKT_68:yIl2AUoC8zA"><img src="http://feeds.feedburner.com/~ff/heisel/kDqL?d=yIl2AUoC8zA" border="0"></img></a> <a href="http://feeds.feedburner.com/~ff/heisel/kDqL?a=nclKrA346PA:xEvTnoKT_68:F7zBnMyn0Lo"><img src="http://feeds.feedburner.com/~ff/heisel/kDqL?i=nclKrA346PA:xEvTnoKT_68:F7zBnMyn0Lo" border="0"></img></a>
</div><img src="http://feeds.feedburner.com/~r/heisel/kDqL/~4/nclKrA346PA" height="1" width="1"/>]]></content:encoded>
			<wfw:commentRss>http://heisel.org/blog/2009/09/09/a-book-lovers-guide-to-ikea-seating/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		<feedburner:origLink>http://heisel.org/blog/2009/09/09/a-book-lovers-guide-to-ikea-seating/</feedburner:origLink></item>
		<item>
		<title>Microscopes zoom in on molecules at last</title>
		<link>http://feedproxy.google.com/~r/heisel/kDqL/~3/cbXuUG3Z7Aw/</link>
		<comments>http://heisel.org/blog/2009/08/29/microscopes-zoom-in-on-molecules-at-last/#comments</comments>
		<pubDate>Sat, 29 Aug 2009 13:00:22 +0000</pubDate>
		<dc:creator>Chris</dc:creator>
				<category><![CDATA[Blogmarks]]></category>

		<guid isPermaLink="false">http://heisel.org/blog/2009/08/29/microscopes-zoom-in-on-molecules-at-last/</guid>
		<description><![CDATA[
Micro&#173;scopes zoom in on mol&#173;e&#173;cules at last &#8211; What&#39;s crazy is that they could put [...]]]></description>
			<content:encoded><![CDATA[<ul>
<li><a href="http://www.newscientist.com/article/dn17699-microscopes-zoom-in-on-molecules-at-last.html?DCMP=OTC-rss&amp;nsref=online-news">Micro&shy;scopes zoom in on mol&shy;e&shy;cules at last</a> &#8211; What&#39;s crazy is that they could put a _single_ mol&shy;e&shy;cule of carbon monox&shy;ide on the micro&shy;scope, and that&#39;s what allowed them to image the mol&shy;e&shy;cule with&shy;out dis&shy;turb&shy;ing it&#39;s structure.</li>

</ul>
<div class="feedflare">
<a href="http://feeds.feedburner.com/~ff/heisel/kDqL?a=cbXuUG3Z7Aw:3qYvZu0lauY:yIl2AUoC8zA"><img src="http://feeds.feedburner.com/~ff/heisel/kDqL?d=yIl2AUoC8zA" border="0"></img></a> <a href="http://feeds.feedburner.com/~ff/heisel/kDqL?a=cbXuUG3Z7Aw:3qYvZu0lauY:F7zBnMyn0Lo"><img src="http://feeds.feedburner.com/~ff/heisel/kDqL?i=cbXuUG3Z7Aw:3qYvZu0lauY:F7zBnMyn0Lo" border="0"></img></a>
</div><img src="http://feeds.feedburner.com/~r/heisel/kDqL/~4/cbXuUG3Z7Aw" height="1" width="1"/>]]></content:encoded>
			<wfw:commentRss>http://heisel.org/blog/2009/08/29/microscopes-zoom-in-on-molecules-at-last/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		<feedburner:origLink>http://heisel.org/blog/2009/08/29/microscopes-zoom-in-on-molecules-at-last/</feedburner:origLink></item>
		<item>
		<title>Study finds artificial sweetner’s may cause cravings for more calories</title>
		<link>http://feedproxy.google.com/~r/heisel/kDqL/~3/CbcGx8C40hw/</link>
		<comments>http://heisel.org/blog/2009/08/24/study-finds-artificial-sweetners-may-cause-cravings-for-more-calories/#comments</comments>
		<pubDate>Tue, 25 Aug 2009 02:00:39 +0000</pubDate>
		<dc:creator>Chris</dc:creator>
				<category><![CDATA[Blogmarks]]></category>

		<guid isPermaLink="false">http://heisel.org/blog/2009/08/24/study-finds-artificial-sweetners-may-cause-cravings-for-more-calories/</guid>
		<description><![CDATA[
Study finds arti&#173;fi&#173;cial sweetner&#8217;s may cause crav&#173;ings for more calo&#173;ries &#8211; They&#39;ll have to pry [...]]]></description>
			<content:encoded><![CDATA[<ul>
<li><a href="http://trueslant.com/ryansager/2009/03/08/diet-soda-the-brain-knows-better/">Study finds arti&shy;fi&shy;cial sweetner&#8217;s may cause crav&shy;ings for more calo&shy;ries</a> &#8211; They&#39;ll have to pry the Diet Coke from my cold, well-&#8203;caffeinated hands.</li>

</ul>
<div class="feedflare">
<a href="http://feeds.feedburner.com/~ff/heisel/kDqL?a=CbcGx8C40hw:nUXr9l4deKo:yIl2AUoC8zA"><img src="http://feeds.feedburner.com/~ff/heisel/kDqL?d=yIl2AUoC8zA" border="0"></img></a> <a href="http://feeds.feedburner.com/~ff/heisel/kDqL?a=CbcGx8C40hw:nUXr9l4deKo:F7zBnMyn0Lo"><img src="http://feeds.feedburner.com/~ff/heisel/kDqL?i=CbcGx8C40hw:nUXr9l4deKo:F7zBnMyn0Lo" border="0"></img></a>
</div><img src="http://feeds.feedburner.com/~r/heisel/kDqL/~4/CbcGx8C40hw" height="1" width="1"/>]]></content:encoded>
			<wfw:commentRss>http://heisel.org/blog/2009/08/24/study-finds-artificial-sweetners-may-cause-cravings-for-more-calories/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		<feedburner:origLink>http://heisel.org/blog/2009/08/24/study-finds-artificial-sweetners-may-cause-cravings-for-more-calories/</feedburner:origLink></item>
		<item>
		<title>Concentrics’ Bakeshop to open on Peachtree</title>
		<link>http://feedproxy.google.com/~r/heisel/kDqL/~3/jc14ogwP8HY/</link>
		<comments>http://heisel.org/blog/2009/08/22/concentrics-bakeshop-to-open-on-peachtree/#comments</comments>
		<pubDate>Sun, 23 Aug 2009 03:00:21 +0000</pubDate>
		<dc:creator>Chris</dc:creator>
				<category><![CDATA[Blogmarks]]></category>

		<guid isPermaLink="false">http://heisel.org/blog/2009/08/22/concentrics-bakeshop-to-open-on-peachtree/</guid>
		<description><![CDATA[
Concentrics&#8217; Bakeshop to open on Peachtree &#8211; Glad that some&#173;thing is moving into the Gold [...]]]></description>
			<content:encoded><![CDATA[<ul>
<li><a href="http://blogs.ajc.com/table-talk-blog/2009/08/21/concentrics-bakeshop-to-open-on-peachtree/?cxntfid=blogs_table_talk_blog">Concentrics&rsquo; Bakeshop to open on Peachtree</a> &#8211; Glad that some&shy;thing is moving into the Gold Star spot on Peachtree. Not sure I wanted it to be a tempt&shy;ing patisserie!</li>

</ul>
<div class="feedflare">
<a href="http://feeds.feedburner.com/~ff/heisel/kDqL?a=jc14ogwP8HY:1pBIEngEpcM:yIl2AUoC8zA"><img src="http://feeds.feedburner.com/~ff/heisel/kDqL?d=yIl2AUoC8zA" border="0"></img></a> <a href="http://feeds.feedburner.com/~ff/heisel/kDqL?a=jc14ogwP8HY:1pBIEngEpcM:F7zBnMyn0Lo"><img src="http://feeds.feedburner.com/~ff/heisel/kDqL?i=jc14ogwP8HY:1pBIEngEpcM:F7zBnMyn0Lo" border="0"></img></a>
</div><img src="http://feeds.feedburner.com/~r/heisel/kDqL/~4/jc14ogwP8HY" height="1" width="1"/>]]></content:encoded>
			<wfw:commentRss>http://heisel.org/blog/2009/08/22/concentrics-bakeshop-to-open-on-peachtree/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		<feedburner:origLink>http://heisel.org/blog/2009/08/22/concentrics-bakeshop-to-open-on-peachtree/</feedburner:origLink></item>
		<item>
		<title>High level overview of Scrum, Lean and kanban</title>
		<link>http://feedproxy.google.com/~r/heisel/kDqL/~3/SKaFNhOPVbs/</link>
		<comments>http://heisel.org/blog/2009/08/22/high-level-overview-of-scrum-lean-and-kanban/#comments</comments>
		<pubDate>Sat, 22 Aug 2009 14:00:05 +0000</pubDate>
		<dc:creator>Chris</dc:creator>
				<category><![CDATA[Blogmarks]]></category>

		<guid isPermaLink="false">http://heisel.org/blog/2009/08/22/high-level-overview-of-scrum-lean-and-kanban/</guid>
		<description><![CDATA[
High level overview of Scrum, Lean and kanban &#8211; A pretty decent high-&#8203;level overview of [...]]]></description>
			<content:encoded><![CDATA[<ul>
<li><a href="http://www.infoq.com/articles/current-direction-of-agile">High level overview of Scrum, Lean and kanban</a> &#8211; A pretty decent high-&#8203;level overview of the evo&shy;lu&shy;tion from Scrum to&nbsp;Lean.</li>

</ul>
<div class="feedflare">
<a href="http://feeds.feedburner.com/~ff/heisel/kDqL?a=SKaFNhOPVbs:0ZE1O0h0r4w:yIl2AUoC8zA"><img src="http://feeds.feedburner.com/~ff/heisel/kDqL?d=yIl2AUoC8zA" border="0"></img></a> <a href="http://feeds.feedburner.com/~ff/heisel/kDqL?a=SKaFNhOPVbs:0ZE1O0h0r4w:F7zBnMyn0Lo"><img src="http://feeds.feedburner.com/~ff/heisel/kDqL?i=SKaFNhOPVbs:0ZE1O0h0r4w:F7zBnMyn0Lo" border="0"></img></a>
</div><img src="http://feeds.feedburner.com/~r/heisel/kDqL/~4/SKaFNhOPVbs" height="1" width="1"/>]]></content:encoded>
			<wfw:commentRss>http://heisel.org/blog/2009/08/22/high-level-overview-of-scrum-lean-and-kanban/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		<feedburner:origLink>http://heisel.org/blog/2009/08/22/high-level-overview-of-scrum-lean-and-kanban/</feedburner:origLink></item>
	</channel>
</rss>
