<?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:creativeCommons="http://backend.userland.com/creativeCommonsRssModule" xmlns:feedburner="http://rssnamespace.org/feedburner/ext/1.0" version="2.0">

<channel>
	<title>yergler.net</title>
	
	<link>http://yergler.net</link>
	<description>Because eventually I'll be right. Theoretically.</description>
	<lastBuildDate>Mon, 07 Jun 2010 23:41:11 +0000</lastBuildDate>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
	<generator>http://wordpress.org/?v=3.0</generator>
		<feedburner:info uri="yerglernet-tloa" /><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://yergler.net/blog/feed/" /><feedburner:feedFlare href="http://add.my.yahoo.com/rss?url=http%3A%2F%2Fyergler.net%2Fblog%2Ffeed%2F" src="http://us.i1.yimg.com/us.yimg.com/i/us/my/addtomyyahoo4.gif">Subscribe with My Yahoo!</feedburner:feedFlare><feedburner:feedFlare href="http://www.newsgator.com/ngs/subscriber/subext.aspx?url=http%3A%2F%2Fyergler.net%2Fblog%2Ffeed%2F" src="http://www.newsgator.com/images/ngsub1.gif">Subscribe with NewsGator</feedburner:feedFlare><feedburner:feedFlare href="http://feeds.my.aol.com/add.jsp?url=http%3A%2F%2Fyergler.net%2Fblog%2Ffeed%2F" src="http://o.aolcdn.com/favorites.my.aol.com/webmaster/ffclient/webroot/locale/en-US/images/myAOLButtonSmall.gif">Subscribe with My AOL</feedburner:feedFlare><feedburner:feedFlare href="http://www.bloglines.com/sub/http://yergler.net/blog/feed/" src="http://www.bloglines.com/images/sub_modern11.gif">Subscribe with Bloglines</feedburner:feedFlare><feedburner:feedFlare href="http://www.netvibes.com/subscribe.php?url=http%3A%2F%2Fyergler.net%2Fblog%2Ffeed%2F" 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%2Fyergler.net%2Fblog%2Ffeed%2F" src="http://buttons.googlesyndication.com/fusion/add.gif">Subscribe with Google</feedburner:feedFlare><feedburner:feedFlare href="http://www.pageflakes.com/subscribe.aspx?url=http%3A%2F%2Fyergler.net%2Fblog%2Ffeed%2F" src="http://www.pageflakes.com/ImageFile.ashx?instanceId=Static_4&amp;fileName=ATP_blu_91x17.gif">Subscribe with Pageflakes</feedburner:feedFlare><feedburner:feedFlare href="http://www.plusmo.com/add?url=http%3A%2F%2Fyergler.net%2Fblog%2Ffeed%2F" src="http://plusmo.com/res/graphics/fbplusmo.gif">Subscribe with Plusmo</feedburner:feedFlare><feedburner:feedFlare href="http://www.thefreedictionary.com/_/hp/AddRSS.aspx?http%3A%2F%2Fyergler.net%2Fblog%2Ffeed%2F" src="http://img.tfd.com/hp/addToTheFreeDictionary.gif">Subscribe with The Free Dictionary</feedburner:feedFlare><feedburner:feedFlare href="http://www.bitty.com/manual/?contenttype=rssfeed&amp;contentvalue=http%3A%2F%2Fyergler.net%2Fblog%2Ffeed%2F" src="http://www.bitty.com/img/bittychicklet_91x17.gif">Subscribe with Bitty Browser</feedburner:feedFlare><feedburner:feedFlare href="http://www.newsalloy.com/?rss=http%3A%2F%2Fyergler.net%2Fblog%2Ffeed%2F" src="http://www.newsalloy.com/subrss3.gif">Subscribe with NewsAlloy</feedburner:feedFlare><feedburner:feedFlare href="http://www.live.com/?add=http%3A%2F%2Fyergler.net%2Fblog%2Ffeed%2F" src="http://tkfiles.storage.msn.com/x1piYkpqHC_35nIp1gLE68-wvzLZO8iXl_JMledmJQXP-XTBOLfmQv4zhj4MhcWEJh_GtoBIiAl1Mjh-ndp9k47If7hTaFno0mxW9_i3p_5qQw">Subscribe with Live.com</feedburner:feedFlare><feedburner:feedFlare href="http://mix.excite.eu/add?feedurl=http%3A%2F%2Fyergler.net%2Fblog%2Ffeed%2F" src="http://image.excite.co.uk/mix/addtomix.gif">Subscribe with Excite MIX</feedburner:feedFlare><feedburner:feedFlare href="http://download.attensa.com/app/get_attensa.html?feedurl=http%3A%2F%2Fyergler.net%2Fblog%2Ffeed%2F" src="http://www.attensa.com/blogs/attensa/WindowsLiveWriter/BadgeredintoBadges_10C02/attensa_feed_button5.gif">Subscribe with Attensa for Outlook</feedburner:feedFlare><feedburner:feedFlare href="http://www.webwag.com/wwgthis.php?url=http%3A%2F%2Fyergler.net%2Fblog%2Ffeed%2F" src="http://www.webwag.com/images/wwgthis.gif">Subscribe with Webwag</feedburner:feedFlare><feedburner:feedFlare href="http://www.podcastready.com/oneclick_bookmark.php?url=http%3A%2F%2Fyergler.net%2Fblog%2Ffeed%2F" src="http://www.podcastready.com/images/podcastready_button.gif">Subscribe with Podcast Ready</feedburner:feedFlare><feedburner:feedFlare href="http://www.flurry.com/pushRssFeed.do?r=fb&amp;url=http%3A%2F%2Fyergler.net%2Fblog%2Ffeed%2F" src="http://www.flurry.com/images/flurry_rss_logo2.gif">Subscribe with Flurry</feedburner:feedFlare><feedburner:feedFlare href="http://www.wikio.com/subscribe?url=http%3A%2F%2Fyergler.net%2Fblog%2Ffeed%2F" src="http://www.wikio.com/shared/img/add2wikio.gif">Subscribe with Wikio</feedburner:feedFlare><feedburner:feedFlare href="http://www.dailyrotation.com/index.php?feed=http%3A%2F%2Fyergler.net%2Fblog%2Ffeed%2F" src="http://www.dailyrotation.com/rss-dr2.gif">Subscribe with Daily Rotation</feedburner:feedFlare><item>
		<title>Reading Update: Short Reviews</title>
		<link>http://feedproxy.google.com/~r/yerglernet-tloa/~3/f_3DqSOP2cU/</link>
		<comments>http://yergler.net/blog/2010/06/06/reading-update-short-reviews/#comments</comments>
		<pubDate>Mon, 07 Jun 2010 01:14:22 +0000</pubDate>
		<dc:creator>Nathan Yergler</dc:creator>
				<category><![CDATA[reading]]></category>
		<category><![CDATA[read]]></category>

		<guid isPermaLink="false">http://yergler.net/?p=1726</guid>
		<description><![CDATA[I&#8217;ve been delinquent in posting about what I&#8217;ve been reading. Rather than continue with the charade that I&#8217;ll eventually write full reviews for each book, I present a set of short reviews that should get me more or less caught up. Tweak: Growing Up on Methamphetamines by Nic Sheff As part of the memoir writing [...]]]></description>
			<content:encoded><![CDATA[<p>I&#8217;ve been delinquent in posting about what I&#8217;ve been reading.  Rather than continue with the charade that I&#8217;ll eventually write full reviews for each book, I present a set of short reviews that should get me more or less caught up.</p>
<p><a href="http://www.amazon.com/gp/product/1416972196?ie=UTF8&#038;tag=yergler.net-20&#038;linkCode=as2&#038;camp=1789&#038;creative=390957&#038;creativeASIN=1416972196">Tweak: Growing Up on Methamphetamines</a><img src="http://www.assoc-amazon.com/e/ir?t=yergler.net-20&#038;l=as2&#038;o=1&#038;a=1416972196" width="1" height="1" border="0" alt="" style="border:none !important; margin:0px !important;" /> by Nic Sheff</p>
<p>As part of the memoir writing class I took last fall, we read David Sheff&#8217;s book, <em>Beautiful Boy</em>, which tells the story of watching his promising young son struggle with drug and alcohol addiction.  His son&#8217;s book, Tweak, tells his own wrenching story.  When I read American Psycho a few years ago there were times I was so disturbed I sort of held the book at arm&#8217;s length and read through squinted eyes.  I had the same experience with <em>Tweak</em>, amplified by knowing what I read was true.  <em>Tweak</em> is not a perfect memoir &#8212; Sheff acknowledges some mistakes and missteps in the afterword &#8212; but it manages to convey the roller coaster of insanity Sheff went through as an addict, a recovering addict, and a relapsing addict.  Unlike his father&#8217;s book (also very good) which mingles person narrative with facts in a journalistic memoir, <em>Tweak</em> is all raw emotion and craving.</p>
<p><a href="http://www.amazon.com/gp/product/0143035746?ie=UTF8&#038;tag=yergler.net-20&#038;linkCode=as2&#038;camp=1789&#038;creative=390957&#038;creativeASIN=0143035746">The Liars&#8217; Club: A Memoir</a><img src="http://www.assoc-amazon.com/e/ir?t=yergler.net-20&#038;l=as2&#038;o=1&#038;a=0143035746" width="1" height="1" border="0" alt="" style="border:none !important; margin:0px !important;" /> by Mary Karr</p>
<p>You think your mom was crazy? No. Not at all.  Mary Karr&#8217;s mom? Crazy. As in &#8220;let me set your shit on fire and come at you with a knife&#8221; crazy.  And yet Karr somehow still renders her with empathy and tenderness, describing her childhood in East Texas in this, her first, memoir.</p>
<p><a href="http://www.amazon.com/gp/product/0060596996?ie=UTF8&#038;tag=yergler.net-20&#038;linkCode=as2&#038;camp=1789&#038;creative=390957&#038;creativeASIN=0060596996">Lit: A Memoir (P.S.)</a><img src="http://www.assoc-amazon.com/e/ir?t=yergler.net-20&#038;l=as2&#038;o=1&#038;a=0060596996" width="1" height="1" border="0" alt="" style="border:none !important; margin:0px !important;" /> by Mary Karr</p>
<p>If <em>The Liar&#8217;s Club</em> let me peer into Mary Karr&#8217;s east Texas childhood, <em>Lit</em>, her third memoir, dropped me into her development as an adult and a poet.  And consequently into her development as an alcoholic, a recovery alcoholic, and a Catholic (albeit one she describes as &#8220;not the Pope&#8217;s favorite&#8221;).  I checked out Lit from the library, read it in a couple days, and then ordered my own copy.  So much of the story resonated for me, and Karr&#8217;s phrasing and ear for dialogue make it a joy to read.</p>
<p><a href="http://www.amazon.com/gp/product/0307409449?ie=UTF8&#038;tag=yergler.net-20&#038;linkCode=as2&#038;camp=1789&#038;creative=390957&#038;creativeASIN=0307409449">The Death of American Virtue: Clinton vs. Starr</a><img src="http://www.assoc-amazon.com/e/ir?t=yergler.net-20&#038;l=as2&#038;o=1&#038;a=0307409449" width="1" height="1" border="0" alt="" style="border:none !important; margin:0px !important;" /> by Ken Gormley</p>
<p>A massive tome at 800 pages, Gormley&#8217;s account of Clinton&#8217;s legal troubles, beginning with Paula Jones and morphing into the Office of the Independent Council investigation, reads like a novel.  Contrary to what I believed in high school, when it was all going on (and I was a Young Republican), as well as what I hear today from some more left-ist friends (that Starr was a rapid attack dog out for blood), Gormley tells a very human story.  That is, a story where everyone is flawed, imperfect, and probably underestimating their own flaws.  Was Clinton an incorrigible womanizer who caused massive wreckage to his life and the lives of those around him by lying? Yes.  Did Starr and his office operate at the edge of their charter, with little oversight or control? Yes.  Should you read this? Yes.</p>
<img src="http://feeds.feedburner.com/~r/yerglernet-tloa/~4/f_3DqSOP2cU" height="1" width="1"/>]]></content:encoded>
			<wfw:commentRss>http://yergler.net/blog/2010/06/06/reading-update-short-reviews/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		<feedburner:origLink>http://yergler.net/blog/2010/06/06/reading-update-short-reviews/</feedburner:origLink></item>
		<item>
		<title>Read: “Django 1.1 Testing and Debugging”, by Karen M. Tracey</title>
		<link>http://feedproxy.google.com/~r/yerglernet-tloa/~3/Xm3v0_Guueg/</link>
		<comments>http://yergler.net/blog/2010/06/06/read-django-1-1-testing-and-debugging%e2%80%9d-by-karen-m-tracey/#comments</comments>
		<pubDate>Mon, 07 Jun 2010 00:42:47 +0000</pubDate>
		<dc:creator>Nathan Yergler</dc:creator>
				<category><![CDATA[reading]]></category>
		<category><![CDATA[2010]]></category>
		<category><![CDATA[nonfiction]]></category>
		<category><![CDATA[read]]></category>
		<category><![CDATA[review]]></category>

		<guid isPermaLink="false">http://yergler.net/?p=1715</guid>
		<description><![CDATA[Packt Publishing sent me a copy of Django 1.1 Testing and Debugging for review. I was particularly interested in reading this title, as testing is something I know makes my code better, but don&#8217;t feel like I do enough of, and because I work on a couple of Django-based projects in my spare time, with [...]]]></description>
			<content:encoded><![CDATA[<p>Packt Publishing <a href="http://yergler.net/blog/2010/05/16/preread-django-1-1-testing-and-debugging-by-karen-m-tracey/">sent</a> me a copy of <em><a href="http://www.packtpub.com/django-1-1-testing-and-debugging/book?utm_source=yergler.net&#038;utm_medium=bookrev&#038;utm_content=blog&#038;utm_campaign=mdb_003267">Django 1.1 Testing and Debugging</a></em> for review.  I was particularly interested in reading this title, as testing is something I know makes my code better, but don&#8217;t feel like I do enough of, and because I work on a couple of <a href="http://djangoproject.com">Django</a>-based projects in my spare time, with varying degrees of test coverage.  While I consider myself comfortable with Python&#8217;s stock <a href="http://docs.python.org/library/unittest.html"><code>unittest</code></a> and <a href="http://docs.python.org/library/doctest.html"><code>doctest</code></a> modules, I was curious to learn about how you can integrate Django with other Python testing tools.</p>
<p><em>Django 1.1. Testing and Debugging</em> is split, as the title implies, into two halves: Testing, followed by Debugging.  It uses a narrative approach, following the development of a survey application throughout.  The book starts with an overview of the stock unittest and doctest facilities in Python.  Most of chapters 1 through 3 are devoted to the basics of unit testing, specifically for Model classes.  Tracey provides information about Django-specific nuances along with way.  For example, I didn&#8217;t realize Django ships with a customized doctest module to enabled <a href="http://docs.python.org/library/doctest.html#doctest.ELLIPSIS">ELLIPSES</a> support in Python 2.3.  Chapter 3 also provides information about how to use fixtures for providing test data, and how to specify those apart from the initial data fixtures developers may already be aware of.  Chapter 4 mirrors some of the information found in Django&#8217;s <a href="http://docs.djangoproject.com/en/1.1/topics/testing/">testing documentation</a>: the Django <a href="http://docs.djangoproject.com/en/1.1/topics/testing/#testcase">TestCase</a>, and how you use it to do basic view testing.</p>
<p>Chapter 5 describes integrating Django with other tools, primarily by example.  Tracey discusses how to replace the default Django test runner, and what interface the replacement needs to implement.  She also provides a stub example of more &#8220;invasive&#8221; integration, crafting a new management command that could (possibly) handle code coverage reporting while running the tests.  This stub was interesting, but didn&#8217;t feel particularly testing related to me.  Chapter 5 closes with examples of using the excellent <a href="http://pypi.python.org/pypi/coverage">coverage</a> package with <a href="http://pypi.python.org/pypi/django-coverage">django-coverage</a>, and integrating twill into Django tests.</p>
<p>Chapter 6 begins the section on debugging with an overview of the Django settings that impact debugging, and how the development server supports debugging of applications.  Chapter 7 follows with a thorough analysis of the development server&#8217;s error page, as well as examples of debugging based on the information given.  The examples continue to develop the survey application, and introduces what Tracey describes as &#8220;typical mistakes&#8221;, then describes how to fix them.  </p>
<p>Chapter 8 begins to dig a little deeper, and I was happy to see mention of Rob Hudson&#8217;s <a href="http://github.com/robhudson/django-debug-toolbar">Django Debug Toolbar</a>, an indispensable tool.  Chapter 8 also includes details on using the <a href="http://docs.python.org/library/logging.html">logging</a> module, and how to develop a decorator that marks function entry and exit.  I know that I&#8217;m all too guilty of using <code>print</code> instead of <code>logging</code>, and it was nice to be reminded of how easy this is.</p>
<p>Chapter 9 was my favorite part of the book.  It gives a good overview of using <a href="http://docs.python.org/library/pdb.html">pdb</a>, and then goes on to demonstrate how to use pdb and a shell session to test a race condition and deal with it.  </p>
<p>Overall <em><a href="http://www.packtpub.com/django-1-1-testing-and-debugging/book?utm_source=yergler.net&#038;utm_medium=bookrev&#038;utm_content=blog&#038;utm_campaign=mdb_003267">Django 1.1 Testing and Debugging</a></em> seems like a good introductory book for Django developers who are new to testing (or Django).  While many of the debugging examples seemed obvious to me, I suspect that someone new to Django could use this book as an introduction to development and debugging.</p>
<img src="http://feeds.feedburner.com/~r/yerglernet-tloa/~4/Xm3v0_Guueg" height="1" width="1"/>]]></content:encoded>
			<wfw:commentRss>http://yergler.net/blog/2010/06/06/read-django-1-1-testing-and-debugging%e2%80%9d-by-karen-m-tracey/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		<feedburner:origLink>http://yergler.net/blog/2010/06/06/read-django-1-1-testing-and-debugging%e2%80%9d-by-karen-m-tracey/</feedburner:origLink></item>
		<item>
		<title>Batteries Included (or, Maildir to mbox, again)</title>
		<link>http://feedproxy.google.com/~r/yerglernet-tloa/~3/zs76UEO1pG0/</link>
		<comments>http://yergler.net/blog/2010/06/06/batteries-included-or-maildir-to-mbox-again/#comments</comments>
		<pubDate>Sun, 06 Jun 2010 20:04:29 +0000</pubDate>
		<dc:creator>Nathan Yergler</dc:creator>
				<category><![CDATA[geek]]></category>
		<category><![CDATA[maildir]]></category>
		<category><![CDATA[mbox]]></category>
		<category><![CDATA[python]]></category>

		<guid isPermaLink="false">http://yergler.net/?p=1707</guid>
		<description><![CDATA[UPDATE 7 June 2010: Added usage information to docstring. My script for converting maildir to mbox continues to be one of the most popular pages on yergler.net (according to Google Analytics). Of course, even after I updated it slightly in February, it still had a couple of bugs, likely introduced when I converted the page [...]]]></description>
			<content:encoded><![CDATA[<p class="update"><strong>UPDATE 7 June 2010:</strong> Added usage information to docstring.</p>
<p>My <a href="http://yergler.net/projects/one-off/maildir-to-mbox/">script for converting maildir to mbox</a> <a href="http://yergler.net/blog/2010/02/03/most-popular-erroneous-post/">continues</a> to be one of the most popular pages on yergler.net (according to Google Analytics).  Of course, even after I <a href="http://yergler.net/blog/2010/02/03/most-popular-erroneous-post/">updated</a> it slightly in February, it still had a couple of bugs, likely introduced when I converted the page from MoinMoin to WordPress.  This afternoon I finally decided to clear out the pending comments about those bugs, and update it.  </p>
<p>While looking at the Python documentation for the <a href="http://docs.python.org/library/mailbox.html"><code>mailbox</code></a> package included in the standard library, I realized it could probably be simplified even further by using the library&#8217;s native <a href="http://docs.python.org/library/mailbox.html#mbox"><code>mbox</code></a> support.  I&#8217;m also more comfortable using the standard library&#8217;s implementation of <code>mbox</code> rather than my hacked up raw file implementation (who knows, the standard library may do exactly what my script did: I&#8217;m not an <code>mbox</code> expert by any stretch of the imagination).</p>
<p>The new script is below.  I should note that it&#8217;s received very little testing, and I make no guarantees.  I also should note that there is nothing creative or original about this.  It just uses Python&#8217;s excellent standard library.  As they say, &#8220;batteries included&#8221;.</p>
<div class="wp_syntax">
<div class="wp_syntax_download">
<div class="wp_syntax_download_filename"><a name="file-maildir2mbox.py" href="#file-maildir2mbox.py" title="maildir2mbox.py">maildir2mbox.py</a></div>
<div class="wp_syntax_download_actions">
<a href="http://yergler.net/wordpress/wp-content/plugins/wp-syntax-download-extension/wp-syntax-download-extension.php/1707/maildir2mbox.py">raw</a> <a href="http://yergler.net/wordpress/wp-content/plugins/wp-syntax-download-extension/wp-syntax-download-extension.php/1707/download/maildir2mbox.py">download</a>
</div>
</div>
<table><tr>
<td class="line_numbers"><pre>1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
</pre></td>
<td class="code"><pre class="python" style="font-family:monospace;"><span style="color: #808080; font-style: italic;"># -*- coding: utf-8 -*-</span>
&nbsp;
<span style="color: #483d8b;">"""
maildir2mbox.py
Nathan R. Yergler, 6 June 2010
&nbsp;
This file does not contain sufficient creative expression to invoke
assertion of copyright.  No warranty is expressed or implied; use at
your own risk.
&nbsp;
---
&nbsp;
Uses Python's included mailbox library to convert mail archives from
maildir [http://en.wikipedia.org/wiki/Maildir] to 
mbox [http://en.wikipedia.org/wiki/Mbox] format.
&nbsp;
See http://docs.python.org/library/mailbox.html#mailbox.Mailbox for 
full documentation on this library.
&nbsp;
---
&nbsp;
To run, save as maildir2mbox.py and run:
&nbsp;
$ python maildir2mbox.py [maildir_path] [mbox_filename]
&nbsp;
[maildir_path] should be the the path to the actual maildir (containing new, cur, tmp);
&nbsp;
[mbox_filename] will be newly created.
"""</span>
&nbsp;
<span style="color: #ff7700;font-weight:bold;">import</span> <span style="color: #dc143c;">mailbox</span>
<span style="color: #ff7700;font-weight:bold;">import</span> <span style="color: #dc143c;">sys</span>
<span style="color: #ff7700;font-weight:bold;">import</span> <span style="color: #dc143c;">email</span>
&nbsp;
<span style="color: #808080; font-style: italic;"># open the existing maildir and the target mbox file</span>
maildir = <span style="color: #dc143c;">mailbox</span>.<span style="color: black;">Maildir</span><span style="color: black;">(</span><span style="color: #dc143c;">sys</span>.<span style="color: black;">argv</span> <span style="color: black;">[</span>-<span style="color: #ff4500;">2</span><span style="color: black;">]</span>, <span style="color: #dc143c;">email</span>.<span style="color: black;">message_from_file</span><span style="color: black;">)</span>
mbox = <span style="color: #dc143c;">mailbox</span>.<span style="color: black;">mbox</span><span style="color: black;">(</span><span style="color: #dc143c;">sys</span>.<span style="color: black;">argv</span><span style="color: black;">[</span>-<span style="color: #ff4500;">1</span><span style="color: black;">]</span><span style="color: black;">)</span>
&nbsp;
<span style="color: #808080; font-style: italic;"># lock the mbox</span>
mbox.<span style="color: black;">lock</span><span style="color: black;">(</span><span style="color: black;">)</span>
&nbsp;
<span style="color: #808080; font-style: italic;"># iterate over messages in the maildir and add to the mbox</span>
<span style="color: #ff7700;font-weight:bold;">for</span> msg <span style="color: #ff7700;font-weight:bold;">in</span> maildir:
    mbox.<span style="color: black;">add</span><span style="color: black;">(</span>msg<span style="color: black;">)</span>
&nbsp;
<span style="color: #808080; font-style: italic;"># close and unlock</span>
mbox.<span style="color: black;">close</span><span style="color: black;">(</span><span style="color: black;">)</span>
maildir.<span style="color: black;">close</span><span style="color: black;">(</span><span style="color: black;">)</span></pre></td>
</tr></table>
</div>
<img src="http://feeds.feedburner.com/~r/yerglernet-tloa/~4/zs76UEO1pG0" height="1" width="1"/>]]></content:encoded>
			<wfw:commentRss>http://yergler.net/blog/2010/06/06/batteries-included-or-maildir-to-mbox-again/feed/</wfw:commentRss>
		<slash:comments>1</slash:comments>
		<feedburner:origLink>http://yergler.net/blog/2010/06/06/batteries-included-or-maildir-to-mbox-again/</feedburner:origLink></item>
		<item>
		<title>Preread: “Django 1.1 Testing and Debugging”, by Karen M. Tracey</title>
		<link>http://feedproxy.google.com/~r/yerglernet-tloa/~3/JqxOLnFLVAk/</link>
		<comments>http://yergler.net/blog/2010/05/16/preread-django-1-1-testing-and-debugging-by-karen-m-tracey/#comments</comments>
		<pubDate>Mon, 17 May 2010 04:39:04 +0000</pubDate>
		<dc:creator>Nathan Yergler</dc:creator>
				<category><![CDATA[reading]]></category>
		<category><![CDATA[django]]></category>
		<category><![CDATA[pre-read]]></category>
		<category><![CDATA[python]]></category>

		<guid isPermaLink="false">http://yergler.net/?p=1696</guid>
		<description><![CDATA[Another Packt Publishing title is on the way for review, Django 1.1 Testing and Debugging, by Karen M. Tracey. Django 1.2 ships tomorrow, and I&#8217;m looking forward to the book: testing is one of the things that helps software evolve, but it&#8217;s also one of the things that&#8217;s easiest to ignore on a project. I [...]]]></description>
			<content:encoded><![CDATA[<p>Another Packt Publishing title is on the way for review, <em><a href="http://www.packtpub.com/django-1-1-testing-and-debugging/book?utm_source=yergler.net&#038;utm_medium=bookrev&#038;utm_content=blog&#038;utm_campaign=mdb_003267">Django 1.1 Testing and Debugging</a></em>, by Karen M. Tracey.  Django 1.2 <a href="http://www.djangoproject.com/weblog/2010/may/15/release-schedule/">ships tomorrow</a>, and I&#8217;m looking forward to the book: testing is one of the things that helps software evolve, but it&#8217;s also one of the things that&#8217;s easiest to ignore on a project.  I say this to myself as much as anyone: even though I know tests will make my life better in the long run, when I start hacking, sometimes they&#8217;re the furthest thing from my mind.  Books about how to test, and how to do it effectively, are definitely a good thing for me.</p>
<p>The PDF preview of <a href="https://www.packtpub.com/sites/default/files/7566_Django%201.1%20Testing%20and%20Debugging_SampleChapter_1.pdf">chapter 3</a> (basic unit testing) looks good, and the table of contents looks like a good overview of basic tools and techniques.  I&#8217;m particularly looking forward to reading about integrating Django with other testing tools (chapter 5), and using Django with <code>pdb</code> (chapter 9).  I&#8217;m looking forward to learning more about testing my Django applications &#8212; and hopefully how I can form better habits around testing.</p>
<img src="http://feeds.feedburner.com/~r/yerglernet-tloa/~4/JqxOLnFLVAk" height="1" width="1"/>]]></content:encoded>
			<wfw:commentRss>http://yergler.net/blog/2010/05/16/preread-django-1-1-testing-and-debugging-by-karen-m-tracey/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		<feedburner:origLink>http://yergler.net/blog/2010/05/16/preread-django-1-1-testing-and-debugging-by-karen-m-tracey/</feedburner:origLink></item>
		<item>
		<title>WWDC WAG</title>
		<link>http://feedproxy.google.com/~r/yerglernet-tloa/~3/1LIDAeku92Q/</link>
		<comments>http://yergler.net/blog/2010/05/08/wwdc-wag/#comments</comments>
		<pubDate>Sun, 09 May 2010 06:33:20 +0000</pubDate>
		<dc:creator>Nathan Yergler</dc:creator>
				<category><![CDATA[geek]]></category>
		<category><![CDATA[apple]]></category>
		<category><![CDATA[iphone]]></category>
		<category><![CDATA[wag]]></category>
		<category><![CDATA[wwdc]]></category>

		<guid isPermaLink="false">http://yergler.net/?p=1675</guid>
		<description><![CDATA[People put a lot of time and effort into reading the Apple (and Steve J.) tea leaves: what will be announced, when, and will there be &#8220;one more thing&#8221;? I&#8217;ve put next to no time into this, but wanted to document my WAG &#8212; wild ass guess &#8212; for WWDC this year. I should note: [...]]]></description>
			<content:encoded><![CDATA[<p>People put a lot of time and effort into reading the Apple (and Steve J.) tea leaves: what will be announced, when, and will there be &#8220;one more thing&#8221;?  I&#8217;ve put next to no time into this, but wanted to document my WAG &#8212; wild ass guess &#8212; for WWDC this year.  I should note: I use a Macbook, but these days Mac OS X is basically a run-time for Firefox for me (my primary machine these days is a Thinkpad running Ubuntu). I use an <a href="http://en.wikipedia.org/wiki/IPod_Classic#iPod_With_Color_Display">iPod Color 60GB</a>, and haven&#8217;t seen the need to upgrade yet. I haven&#8217;t seen an iPad in person.  In short, I&#8217;m hardly qualified to make predictions about Apple corporate strategy.  But that doesn&#8217;t seem to stop anyone else.</p>
<p>I believe Apple will announce that you&#8217;ll be able to run <a href="http://en.wikipedia.org/wiki/IPhone_OS">iPhone OS</a> applications on Mac OS X.  Why?  Well, it just seems like it fits. </p>
<ul>
<li>Apple is obviously investing heavily in iPhone OS. One indication of its importance is that the <a href="http://en.wikipedia.org/wiki/Apple_Design_Awards">Apple Design Awards</a> are limited <a href="http://www.apple.com/pr/library/2010/04/28wwdc.html">to iPhone OS applications</a> this year.</li>
<li>As the iPad has launched, and developers have been crafting applications to watch video, read news, and listen to public radio, the question has been raised: why weren&#8217;t people creating applications that looked this good for laptops? I&#8217;m sure people using Macbooks would love to have some of those apps.  (I really don&#8217;t believe iPhone OS has any secret ingredient that suddenly enables ABC to create a video player.)</li>
<li>Apple&#8217;s restrictions to the iPhone SDK agreement, prohibiting the use of third party development tools, will allow Apple to <a href="http://daringfireball.net/linked/2010/04/14/keeping-the-platform-nimble">easily switch hardware platforms</a>, ala PPC to x86 &#8212; or support an additional architecture if needed.  You know, an additional architecture like x86.</li>
<li>Apple has experience with compatibility virtual machines (see: <a href="http://en.wikipedia.org/wiki/Rosetta_%28software%29">Rosetta</a>), as well as <a href="http://www.appleinsider.com/articles/08/06/20/apples_other_open_secret_the_llvm_complier.html">LLVM</a>.  You can imagine these experiences informing support for running iPhone OS applications in a sandbox on Mac OS X, or re-targeting the application at compilation time.</li>
<li>Finally, and perhaps most importantly, it inserts Apple into the middle of additional software purchases, enables them to leverage the App Store further, and exert additional control.</li>
</ul>
<p>So that&#8217;s my WAG for WWDC.  I think it&#8217;ll be sold to developers as a way to reach new users, and provide an end-to-end, mobile to desktop experience (I won&#8217;t be surprised if they launch improved, wireless sync between your iPad and Mac at the same time &#8212; syncing documents between iWork for iPad and your Mac <a href="http://www.macobserver.com/tmo/article/file_sharing_with_an_ipad_ugh/">sounds like hell</a>).  I think it&#8217;ll be sold to users on security and stability: iPhone OS applications would almost certainly have limited privileges on the desktop, and if you replace your laptop, logging into your iTunes account would sync your apps back to the machine.</p>
<p>If I&#8217;m right, users will undoubtedly begin to see [beautiful] software stream onto their desktops from a single, tightly controlled pool, and developers will devote hours crafting tools with the hope they&#8217;ll pass muster, and make it into that pool.  If I&#8217;m wrong, well, I&#8217;ve been wrong before.  And this is just a wild ass guess.</p>
<img src="http://feeds.feedburner.com/~r/yerglernet-tloa/~4/1LIDAeku92Q" height="1" width="1"/>]]></content:encoded>
			<wfw:commentRss>http://yergler.net/blog/2010/05/08/wwdc-wag/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		<feedburner:origLink>http://yergler.net/blog/2010/05/08/wwdc-wag/</feedburner:origLink></item>
		<item>
		<title>Read: “Grok 1.0 Web Development”, by Carlos de la Guardia</title>
		<link>http://feedproxy.google.com/~r/yerglernet-tloa/~3/f1skakK8hqQ/</link>
		<comments>http://yergler.net/blog/2010/05/02/read-grok-1-0-web-development-by-carlos-de-la-guardia/#comments</comments>
		<pubDate>Sun, 02 May 2010 22:36:19 +0000</pubDate>
		<dc:creator>Nathan Yergler</dc:creator>
				<category><![CDATA[reading]]></category>
		<category><![CDATA[2010]]></category>
		<category><![CDATA[nonfiction]]></category>
		<category><![CDATA[read]]></category>
		<category><![CDATA[review]]></category>

		<guid isPermaLink="false">http://yergler.net/?p=1646</guid>
		<description><![CDATA[A month and a half ago I posted a pre-review of Grok 1.0 Web Development, a new title from Packt Publishing (disclosure: I received a complimentary copy of the book for review). I recently completed a spate of travel that took me across the Atlantic and across North America (with another trip across the Atlantic [...]]]></description>
			<content:encoded><![CDATA[<p>A month and a half ago I posted a <a href="http://yergler.net/blog/2010/03/16/pre-read-grok-1-0-web-development/">pre-review</a> of <em><a href="http://www.packtpub.com/grok-1-0-web-development/book?utm_source=yergler.net&#038;utm_medium=bookrev&#038;utm_content=blog&#038;utm_campaign=mdb_002632">Grok 1.0 Web Development</a></em>, a new title from Packt Publishing (disclosure: I received a complimentary copy of the book for review).  I recently completed a spate of travel that took me across the Atlantic and across North America (with another trip across the Atlantic aborted due to the <a href="http://en.wikipedia.org/wiki/2010_eruptions_of_Eyjafjallaj%C3%B6kull">volcanic ash cloud</a>), and have turned my attention back to the book.  My initial impression remains: this is exactly the sort of documentation I wish I&#8217;d had when I ported the <a href="http://creativecommons.org/choose/">Creative Commons license chooser</a> from &#8220;pure&#8221; Zope 3 to Grok.  <em>Grok 1.0 Web Development</em> is a great introduction to <a href="http://grok.zope.org/">Grok</a>, Python web development, and the Zope Component Architecture.</p>
<p><a href="http://www.packtpub.com/grok-1-0-web-development/book?utm_source=yergler.net&amp;utm_medium=bookrev&amp;utm_content=blog&amp;utm_campaign=mdb_002632"><img src="/media//2010/03/Grok-1.0-image-243x300.jpg" alt="" title="Grok 1.0 Web Development" width="243" height="300" class="alignright size-medium wp-image-1568" /></a><em><a href="http://www.packtpub.com/grok-1-0-web-development/book?utm_source=yergler.net&#038;utm_medium=bookrev&#038;utm_content=blog&#038;utm_campaign=mdb_002632">Grok 1.0 Web Development</a></em> takes what as I think of as a customary approach to framework introductions, instructing the user on the basic features of the framework by building an application (in this case a to do list manager) and adding features and refining the code as it goes.  This works well for Grok &#8212; the amount of boilerplate code is kept to a minimum, by design, so the text can focus on first implementing the feature, then delving deeper to discuss the &#8220;best practice&#8221; around that tool if needed.  For example, Chapter 6 covers ZODB Catalogs (index).  It starts by defining the search view and user interface so that the reader has a functioning search tool to work with, then takes a diversion to discuss how one best structures their application to support search.  These detailed drill downs are one of the most valuable parts of <em>Grok 1.0 Web Development</em>: they help the reader expand their understand beyond just implementing a feature, to implementing in a way that will be flexible and easy to support in the future. The [somewhat brief] advice on when to use the ZODB versus a relational database is another example of practical advice that I appreciated in the book.</p>
<p><em>Grok 1.0 Web Development</em> is not perfect.  In particular I wish the chapter on testing were earlier (the author&#8217;s admonition that it &#8220;should not be treated as an afterthought&#8221; doesn&#8217;t seem to jibe with its placement among the advanced topics towards the end of the book.  I suppose I&#8217;m also a little sensitive to slogging on Zope 3 and it&#8217;s &#8220;lack&#8221; of agility.  I can probably be described as a Zope 3 / Zope component architecture apologist, but it seems the type of agility described is a rather narrow, specific definition.  The sprints I did on Zope 3 at PyCon several years contributed more to my understanding and appreciation of test driven development and agile planning than just about anything.  Yes, Grok gets it done without the ZCML; I think it&#8217;s an exercise for the reader as to whether that&#8217;s better or worse for your application.</p>
<p>I think that the Zope derived frameworks such as Grok and <a href="http://bfg.repoze.org/">repoze.bfg</a> are some of the most interesting in development today.  <em>Grok 1.0 Web Development</em> does a great job of introducing <a href="http://grok.zope.org/">Grok</a> to developers who are new to web programming, or who already have some familiarity with another framework.  I recommend it to anyone interested in building extensible web applications with a minimum of boilerplate.</p>
<img src="http://feeds.feedburner.com/~r/yerglernet-tloa/~4/f1skakK8hqQ" height="1" width="1"/>]]></content:encoded>
			<wfw:commentRss>http://yergler.net/blog/2010/05/02/read-grok-1-0-web-development-by-carlos-de-la-guardia/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		<feedburner:origLink>http://yergler.net/blog/2010/05/02/read-grok-1-0-web-development-by-carlos-de-la-guardia/</feedburner:origLink></item>
		<item>
		<title>CiviCon Plenary: What Are We Paying For?</title>
		<link>http://feedproxy.google.com/~r/yerglernet-tloa/~3/iuQ9fAxMW08/</link>
		<comments>http://yergler.net/blog/2010/04/22/civicon-plenary-what-are-we-paying-for/#comments</comments>
		<pubDate>Thu, 22 Apr 2010 18:41:29 +0000</pubDate>
		<dc:creator>Nathan Yergler</dc:creator>
				<category><![CDATA[talks]]></category>
		<category><![CDATA[cc]]></category>
		<category><![CDATA[civicon]]></category>
		<category><![CDATA[civicrm]]></category>

		<guid isPermaLink="false">http://yergler.net/?p=1656</guid>
		<description><![CDATA[I&#8217;m spending part of my day today at the first ever CiviCon, a one day conference for the CiviCRM community. I was honored (and a little surprised) to be asked to give the opening plenary talk. My original travel schedule called for me to fly back from Istanbul yesterday, get up this morning and present [...]]]></description>
			<content:encoded><![CDATA[<p>I&#8217;m spending part of my day today at the first ever <a href="http://wiki.civicrm.org/confluence/display/CRM/CiviCon+April+2010">CiviCon</a>, a one day conference for the <a href="http://civicrm.org/">CiviCRM</a> community.  I was honored (and a little surprised) to be asked to give the opening plenary talk.  My original travel schedule called for me to fly back from Istanbul yesterday, get up this morning and present (and then presumably crash from jet lag).  Luckily (for me) the volcano derailed my trip to Istanbul, so I was able to present with a little more sleep.  This is the text of the talk I prepared.</p>
<hr />
<p>Good morning.  I am incredibly happy to be here talking to you this morning.  I&#8217;m excited to be here because CiviCRM has been and continues to be a very important part of our infrastructure at Creative Commons.  Beyond CC, I think it&#8217;s an important piece of software for non-profit and grassroots organizations, one that should not be ignored when evaluating donor and constituent management applications.  This morning I want to tell you about my experience with it, and why I think it&#8217;s so very, very important.</p>
<p>I&#8217;ve been at Creative Commons about six years now.  I started working as an engineer, which basically meant I wrote code, deployed code, and babysat the server &#8212; there was only one then &#8212; when it got cranky.  We started using Civi in 2006.  Creative Commons is a 501c3, which means we have to work towards passing the IRS&#8217;s public support test: 30% of our operating budget from &#8220;the public&#8221;, in our case.  In 2005 we had a rather unpleasant realization: we hadn&#8217;t done shit, and we were getting close to the end of our five year grace period.  I hacked together a contribution page, wired up PayPal for donation processing, and put together a terrible looking Plone backend that allowed people in the office to enter offline checks, promised contributions, etc, and to make the all important thermometer work on the front page.  And we started begging.  Creative Commons is fortunate to have a generous, passionate community, and they responded to our call. After the dust had settled and we realized we were going to have to do this <em>again</em>, we knew we needed something better than what I could write in between other projects.  It was clear that we didn&#8217;t have the resources to build something complete, and still fulfill our mission, so we started looking around.  Mike Linksvayer, then our CTO, asked me if I&#8217;d used Raiser&#8217;s Edge before, and if so, what I thought of it.  Raiser&#8217;s Edge had &#8212; perhaps has &#8212; the mindshare, and our development director at the time was certain Raiser&#8217;s Edge was the essential piece of technology to make the jump to the big leagues.  If I recall correctly, my response is not suitable for mixed company.</p>
<p>Before working at CC, I worked for a very different kind of non-profit.  <a href="http://canterburyschool.org/">Canterbury School</a> is a private, K-12, college prep school.  With small classes, dedicated teachers, and a commitment to education that includes computer programming for *every* student, they are they best game in private education in northeast Indiana.  The faculty and staff there do an amazing job.  Every year Canterbury holds an annual campaign, which raises funds to support the school operating budget.  Part of my job there was supporting the development office and Raiser&#8217;s Edge.  Our Raiser Edge installation had one primary user, Barbara.  I am convinced Barbara is the direct descendant of the bearded UNIX sysadmin wizards.  Unlike her ancestors, she does not keep mainframes online, but rather has her own special wizard-like skills: comprehensive knowledge of the Raiser&#8217;s Edge query language and interface.  So you can imagine that days when Barbara called my office were not my favorite days at work.  &#8220;The database is locked&#8221; &#8220;My labels template won&#8217;t print right&#8221; &#8220;The query isn&#8217;t returning data I know is in there.&#8221; </p>
<p>Now in all fairness, this was almost ten years ago, and we were running Raiser&#8217;s Edge on <a href="http://en.wikipedia.org/wiki/SQL_Anywhere">Sybase SQLAnywhere</a>.  But I&#8217;d also like to point out that we were paying about $3000 a year for a support contract, a contract sold with a statement along the lines of, &#8220;You want updates when they come out, don&#8217;t you?&#8221;  These updates and improvements, when they did come out, were usually accompanied by new system requirements, indirect costs, and lots of time spent making sure the upgrade went correctly.  And bugs fixes?  What bugs?</p>
<p>This, my friends, is what we call a protection racket.</p>
<p>I also had enough experience to know that expecting to deploy a CRM package out of the box with no customization was probably unreasonable.  I had worked on a CRM and ERP deployment in 2003 for an international manufacturer that took the better part of a year, and whose customization costs were almost as high as the software licensing costs.  I was lucky on that project: I got to write C++ DLLs to handle custom accounting information from pricing tables.  And this was a product sold on how open and customizable it was.  &#8220;Look, we have an API, you can write a DLL.&#8221; Gee, thanks.</p>
<p>So back to Creative Commons: after some consideration, CiviCRM was selected as a platform.  When we started out with Civi, we paid for CivicActions&#8217; development, customization, and hosting services.  We also paid for updates, improvements, and upgrades, just like we would have with Raiser&#8217;s Edge.  It&#8217;s a couple years later, in 2007, when the difference between the two really becomes apparent. because</p>
<p>In 2007, we had been been using Civi for a couple of years, and while we weren&#8217;t unhappy with it, it still wasn&#8217;t really a piece of software any of us looked forward to using.  I personally tried to ignore it as much as possible except during the lead up to the annual campaign.  It worked, it did it&#8217;s job, but it felt quirky and a little clunky, sort of like I was working against it sometimes.  But there was hope.  The 3.0 release was going to be a big upgrade.  Lots of new features, improved user interface, and lots of attention paid to usability. We talked to CiviActions about a 3.0 upgrade and some additional customization we wanted to do.  The quotes we got back were, well, expensive.  Now I don&#8217;t think they were out of line, but it was more than we had budgeted at the time.  Our situation internally had changed, as well.  We were up to a handful of servers, two full time engineers, and a graphic designer with great technical chops.  Instead of quoting out every change and upgrade, it started to feel like we might be ready to walk on our own.</p>
<p>So we checked out the source code &#8212; including all the custom code CivicActions built for us &#8212; and installed it on our own server. </p>
<p>I think this bears repeating.  We downloaded the source code &#8212; the same source code our vendor was using &#8212; and installed it with our own tools.  We didn&#8217;t have to ask for permission, pay a fee, or &#8220;upgrade&#8221; our license; it was already available to us.</p>
<p>You see, unlike the protection racket I lived under at Canterbury, at Creative Commons we&#8217;ve been paying for something that we own.  That the community owns.  We&#8217;re paying for value that we retain, that we can take elsewhere when we&#8217;re ready.  This is huge.</p>
<p>Now, for those of you who are open source and free software developers, those of us who run Linux on our laptops, who build applications using open source tools, this sounds like business as usual.  But CiviCRM is very special software: it is not software for Geeks, it&#8217;s software for Humans.</p>
<p>At Creative Commons, we build legal tools that help people share their creative works with the permissions that they choose, the some rights reserved that work best for them.  But we also recognize that most of the time, those creators are not lawyers.  They&#8217;re coming to us <em>because</em> they&#8217;re not lawyers, and our job is to reduce the number of hoops they have jump through to share their work.  So we make our tools available for two different audiences, which we jokingly refer to as Lawyers and Humans.  Today I&#8217;d like to posit that we have a similar divide when it comes to free software.  Apache, Linux, MySQL, CouchDB &#8212; these are all examples of software for Geeks.  CiviCRM is software for Humans.  And it&#8217;s really important software for Humans.</p>
<p>A friend of mine, Asheeesh Laroia, runs Open Hatch, a website dedicated to helping people get involved with open source software. Talking about software like CiviCRM, he made the comment, &#8220;It&#8217;s important that we give communities tools that they can use and that they can control.  Otherwise how do we expect them to be independent and self sustaining?&#8221; Fundraising and constituent management is a critical part of any non-profit&#8217;s life cycle.  Why do we think it&#8217;s OK for these organizations &#8212; many of which we personally contribute to &#8212; to enrich the coffers of a for profit businesses with no real long term return?</p>
<p>Please don&#8217;t misunderstand me: I am not saying that paying money for support is wrong, misguided, or unncessary.  I am saying that we &#8212; non-profits &#8212; can do a lot better than investing in a protection racket.  We can pay for support, and at the same time invest in our<br />
tools.  And when we&#8217;re ready to move to the next level, there is no upgrade fee.  We already own it all.</p>
<p>Creative Commons&#8217; story did not end by simply installing CiviCRM onto our server and moving on.  And putting it on our own server has not resulted in the cost of Civi going to zero.  In fact, we still &#8220;pay&#8221; for support, but we do it differently these days.  Maintenance and support for Civi is a core responsibility for the technical team today.  When our development team has questions, wants to run new reports, or wants to do something new like personal campaigns, they sit down with Chris, John, and Nathan, and figure out what we&#8217;ll need to do to Civi to make it work.</p>
<p>Last year we decided that the contribution workflow was too long.  We were demanding information from our donors that we didn&#8217;t necessarily need, and duplicating information they might give PayPal when processing their payment.  We wanted to streamline the process,<br />
reducing the number of clicks between us and a donor&#8217;s money.  We invested the time to implement some custom code on Civi to make this happen.  Right now we want to offer tighter integration between CiviCRM and CC Network accounts, a premium we offer donors.  So we&#8217;re writing code to do that.</p>
<p>The click-streamline code is available to anyone who wants to use it.  We&#8217;re writing our integration code with the hope we can contribute it to the CiviCRM core.  It&#8217;s tempting to say that we&#8217;re no longer customers, that we&#8217;ve moved up to become partners.  But the truth is that we were never just customers: with CiviCRM, we were partners from day one, we just didn&#8217;t necessarily realize it. </p>
<p>Now I know that lots of commercial vendors talk about partnering with customers.  I&#8217;d like to call bullshit on that.  If you don&#8217;t have the source code, you are not a partner. If you can&#8217;t be trusted to inspect the software you rely on, you are not a respected equal in that relationship.  Companies go out of business.  Companies are acquired. Management changes.  This is the reality of business.</p>
<p>Let&#8217;s go back and look at Canterbury again.  I sent Vern, Canterbury&#8217;s Director of Technology and a man who can really only be called my mentor, an email to fact check my memory about what we were working with in 2001. Vern told me he&#8217;s part of a Google Group formed for schools to exchange SQL Server queries for accessing their data.  Why SQL Server queries and not an API &#8212; seems a little crude to me. Turns out, if you want to write your own code to access your data through their API, there&#8217;s a toll: $10000 and another $1000 per year in support.</p>
<p>If a customer want to access their data in the safest, sanest manner, they have to pay.  Again.  If that were the reality for CiviCRM, we would not have been able to streamline our contribution process.  We would not be integrating CC Network memberships as a premium for donating.  Hell, I&#8217;m not even sure we&#8217;d be able to show the beloved thermometer on the front page.  The cost is too high. </p>
<p>Let me wrap up with some thoughts about the future.  If you work for a non-profit or grassroots organization, I believe it is incumbent upon you to think about things in terms of fiscal stewardship.  Where is your money going today, and what value are you getting?  Are you a customer, or are you a partner?  As an officer at a non-profit, I see fundraising and development as critical to our ability to execute our core mission.  Our mission at Creative Commons is not to make money, but if we can&#8217;t keep the lights on, we can&#8217;t help people share their work online.</p>
<p>If you&#8217;re using CiviCRM today, it&#8217;s time to start talking about it.  I find that lots of non-profits I talk to are unaware that there&#8217;s a different way.  They haven&#8217;t thought about the fact that they have a choice.  We need to work to increase the mind share that CiviCRM has. If you think Civi is only good for small organizations, that you can&#8217;t really recommend it for large scale installations, I&#8217;d like to challenge that misconception.  Mozilla Foundation.  Wikimedia Foundation.  Creative Commons.  We&#8217;re all using CiviCRM for all or part of our constituent management solution.  And if you&#8217;re a user or integrator who&#8217;s customizing it, it&#8217;s time to start thinking about how you give back.  The AGPL already requires that you make your changes available.  I think it&#8217;s worth your while to consider how you&#8217;re making those changes.  Is this a customization someone else might want? If so, I encourage you to take a few minutes, talk to the developers on IRC or the forums, and think about how you might build your solution in a general way.  The CiviCRM developers are some of the most available and responsive I&#8217;ve ever encountered. They can give you guidance about how to think about a problem. It may take some extra time to build a general solution.  But if you can contribute that back to the core codebase, you&#8217;re going to make upgrades much easier.  And the great thing is that at the same time you&#8217;re making things easy for yourself in the future, you&#8217;re also helping to sustain the community and the development process.</p>
<p>Finally, if you&#8217;re evaluating CiviCRM today, I have some advice for you.  Do not think to yourself, &#8220;oh, I can download this for free, this isn&#8217;t going to cost me anything.&#8221;  Do not look at CiviCRM as a zero cost solution.  My experience is that there is no such thing in CRM, and I&#8217;d argue you wouldn&#8217;t want there to be: we all need experts we can call upon in an emergency, and paying for a tool enables the developers to improve it.  Instead, do your checkbox evaluation and realize that Civi is competitive with commercial packages.  Talk to people who are using CiviCRM and tell them how you plan to use it, ask them about their experience.  Then ask yourself, &#8220;how much am I going to spend year over year, and what am I getting from that? How is my investment going to grow?  Am I paying for protection, or am I<br />
investing in my organizations future stability?&#8221;  I think the answer is self evident.</p>
<p>Working at Creative Commons has been an amazing opportunity for me, and I&#8217;m proud of a lot that I&#8217;ve accomplished over the past six years. But I&#8217;m especially proud of how we&#8217;ve used and contributed to CiviCRM. I&#8217;m proud to be a user, and I feel good every time I talk to my team about Civi and hear, &#8220;Oh, yeah, I just jumped on IRC and got an answer from one of the core developers.&#8221;  You can not buy that sort of dedication and support.</p>
<img src="http://feeds.feedburner.com/~r/yerglernet-tloa/~4/iuQ9fAxMW08" height="1" width="1"/>]]></content:encoded>
			<wfw:commentRss>http://yergler.net/blog/2010/04/22/civicon-plenary-what-are-we-paying-for/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		<feedburner:origLink>http://yergler.net/blog/2010/04/22/civicon-plenary-what-are-we-paying-for/</feedburner:origLink></item>
		<item>
		<title>Back to the Future: Desktop Applications</title>
		<link>http://feedproxy.google.com/~r/yerglernet-tloa/~3/ndTsMZ79wjU/</link>
		<comments>http://yergler.net/blog/2010/03/30/back-to-the-future-desktop-applications/#comments</comments>
		<pubDate>Tue, 30 Mar 2010 16:04:03 +0000</pubDate>
		<dc:creator>Nathan Yergler</dc:creator>
				<category><![CDATA[development]]></category>
		<category><![CDATA[cc]]></category>
		<category><![CDATA[ccpublisher]]></category>
		<category><![CDATA[python]]></category>

		<guid isPermaLink="false">http://yergler.net/?p=1517</guid>
		<description><![CDATA[One of the best prepared talks I saw at PyCon this year was on Phatch, a cross-platform photo processing application written in Python. Stani Michiels and Nadia Alramli gave a well rehearsed, compelling talk discussing the ins and outs of developing their application for Linux, Mac OS X, and Windows. The video is available from [...]]]></description>
			<content:encoded><![CDATA[<p>One of the best prepared talks I saw at PyCon this year was on <a href="http://photobatch.stani.be/">Phatch</a>, a cross-platform photo processing application written in Python.  Stani Michiels and Nadia Alramli gave a well rehearsed, compelling talk discussing the ins and outs of developing their application for Linux, Mac OS X, and Windows.  The <a href="http://python.mirocommunity.org/video/1595/pycon-2010-cross-platform-appl">video is available</a> from the excellent Python MiroCommunity.</p>
<p>The talk reminded of a blog post I saw late last year and never got around to commenting on, <a href="http://spin.atomicobject.com/2009/01/30/ruby-for-desktop-applications-yes-we-can">Ruby for Desktop Applications? Yes we can.</a>  Now I&#8217;m only a year late in commenting on it.  This post caught my eye for two reasons. First, the software they discuss was commissioned by the <a href="http://www.goldratt.com/">AGI Goldratt Institute</a>.  I had heard about Goldratt from my father, whose employer, <a href="http://trustedmfg.com/">Trusted Manufacturing</a>, was working on implementing constraints-based manufacturing as a way to reduce costs and distinguish themselves from the rest of the market.  More interesting, though, was their discussion of how they built the application, and how it seemed to resonate with some of the work I did in my early days at CC.  </p>
<p>Atomic wrote three blog posts (at least that I saw), and the one with the most text (as determined by my highly unscientific &#8220;page down&#8221; method) was all about how they &#8220;rolled&#8221; the JRuby application: how they laid out the source tree, how they compile Ruby source into Java JARs, and how they distribute a single JAR file with their application and its dependencies.  I thought this was interesting because even though it uses a different language (Python instead of Ruby), GUI framework (wx instead of Swing/Batik), and runtime strategy (bundled interpreter instead of bytecode archive), the thing I spent the most time on when I was developing <a href="http://wiki.creativecommons.org/CC_Publisher">CC Publisher</a> was deployment. </p>
<p>Like Atomic and Phatch, we had a single code base that we wanted to work across the major platforms (Windows, Linux, and Mac OS X in our case).  The presentation about Phatch has some great information about making desktop-specific idioms work in Python, so I&#8217;ll let them cover that.  Packaging and deployment was the biggest challenge, one we never quite got right.</p>
<p>On Windows, we used <a href="http://www.py2exe.org/">py2exe</a> to bundle our Python runtime with the source code and dependencies.  This worked most of the time, unless we forget to specify a sub-package in our manifest, in which case it blew up in amazing and spectacular ways (not really).  Like Atomic, we used <a href="http://nsis.sourceforge.net/">NSIS</a> for the Windows installer portion.  On Mac OS X, we used <a href="http://svn.pythonmac.org/py2app/py2app/trunk/doc/index.html">py2app</a> to do something similar, and distributed a disk image.  On Linux&#8230; well, on Linux, we punted.  We experimented with a <a href="http://cx-freeze.sourceforge.net/">cx-freeze</a> and <a href="http://yergler.net/blog/2005/08/17/packaging-applications-for-linux-with-autopackage/">flirted</a> with <a href="http://autopackage.org/">autopackage</a>.  But nothing ever worked quite right [enough], so we would up shipping tarballs. </p>
<p>The really appealing thing about Atomic&#8217;s approach is that by using a single JAR, you get to leverage a much bigger ecosystem of tools: the Java community has either solved, or has well defined idioms for, launching Java applications from JARs.  You get <a href="http://launch4j.sourceforge.net/">launch4j</a> and <a href="http://izpack.org/">izpack</a>, which look like great additions to a the desktop developer&#8217;s toolbox.</p>
<p>For better or for worse, we [Creative Commons] decided CC Publisher wasn&#8217;t the best place to put our energy and time.  This was probably the right decision, but it was a fun project to work on.  (We do have <a href="http://wiki.creativecommons.org/CC_Publisher_Refresh_and_Update">rebooting CC Publisher</a> listed as a <a href="http://wiki.creativecommons.org/Developer_Challenges">suggested project</a> for <a href="http://socghop.appspot.com/gsoc/org/show/google/gsoc2010/creativecommons">Google Summer of Code</a>, if someone else is interested in helping out.) Given the maturity of Java&#8217;s desktop tool chain, and the vast improvements in <a href="http://jython.org/">Jython</a> over the past year or two, I can imagine considering an approach very much like Atomic&#8217;s were I working on it today.  Even though it seems like the majority of people&#8217;s attention is on web applications these days, I like seeing examples of interesting desktop applications being built with dynamic languages.</p>
<img src="http://feeds.feedburner.com/~r/yerglernet-tloa/~4/ndTsMZ79wjU" height="1" width="1"/>]]></content:encoded>
			<wfw:commentRss>http://yergler.net/blog/2010/03/30/back-to-the-future-desktop-applications/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		<feedburner:origLink>http://yergler.net/blog/2010/03/30/back-to-the-future-desktop-applications/</feedburner:origLink></item>
		<item>
		<title>Perfection is not an option</title>
		<link>http://feedproxy.google.com/~r/yerglernet-tloa/~3/8exjg9CJCCY/</link>
		<comments>http://yergler.net/blog/2010/03/29/perfection-is-not-an-option/#comments</comments>
		<pubDate>Mon, 29 Mar 2010 15:04:46 +0000</pubDate>
		<dc:creator>Nathan Yergler</dc:creator>
				<category><![CDATA[my life]]></category>
		<category><![CDATA[meta]]></category>

		<guid isPermaLink="false">http://yergler.net/?p=1610</guid>
		<description><![CDATA[My friend Andy, a successful organizational development consultant, moved to Ohio last year to pursue an MFA in playwriting. I spoke to Andy yesterday for the first time in about a month. We talked about his first year play, and he told me about how he&#8217;s felt blocked for a few weeks. After an initial [...]]]></description>
			<content:encoded><![CDATA[<p>My friend Andy, a successful organizational development consultant, moved to Ohio last year to pursue an MFA in playwriting.  I spoke to Andy yesterday for the first time in about a month.  We talked about his first year play, and he told me about how he&#8217;s felt blocked for a few weeks.  After an initial reading with actors, he received consistent feedback in one area: he had to decide if he was writing a farce with some serious undertones, or a serious piece with some moments of light.  Andy told me that this weekend he finally gave up trying to have it both ways, made a decision, found himself unblocked creatively, and spent the entire weekend writing.  </p>
<blockquote><p>&#8220;I realized that I don&#8217;t have time to fix everything I want to fix this time around. I need to fix the big things, get it in front of actors, and let the little things take care of themselves. I can&#8217;t afford to wait around for it to be perfect.&#8221;</p></blockquote>
<p>Perfection is not an option.</p>
<p>How many projects do I have in some sort of blocked state right now because I <em>need</em> to find the time to do them <em>right</em>? How many ideas are only half-executed because I haven&#8217;t figured out how to finish them the <em>&#8220;right&#8221;</em> way? I have friends who agreed to read some of my writing in December, whom I haven&#8217;t followed up with because I haven&#8217;t <em>&#8220;finished&#8221;</em> revising. And I never will, at least not as long as I hang onto a belief in perfection.</p>
<p>This should sound familiar to anyone who&#8217;s worked on a software project using one of the agile methodologies. You don&#8217;t try to perfect &#8212; finish &#8212; the software, and then show it to the users. You take care of the big stuff, and get in front of users. And then the big stuff changes, and you can take care of it again. Rinse and repeat.</p>
<p>Perfection is not an option.</p>
<p>Perfection is, of course, quite alluring. I know that I want to be recognized for my work, want to be seen as someone who has intellectual authority and gets things done. At the same time, I&#8217;m afraid that I&#8217;ll be seen as less than that: as a failure, a poser, someone who just <em>doesn&#8217;t get it</em>. So I hold onto this belief that if I do it perfectly, I can somehow control how people see my work.  This is a lie.  I can not control how people see my work, and can not control their reactions.  If someone reacts negatively, it&#8217;s possible they&#8217;re reacting to the quality of my work (I am not for one moment arguing I shouldn&#8217;t care about doing my best), but it could also be something else entirely.  The way I present myself.  Their own concerns and fears about their work. Things I can not control.  So I remind myself of the truth.</p>
<p>Perfection is not an option.</p>
<p>Just like I&#8217;ve tried to stop worrying about <a href="http://yergler.net/blog/2010/01/02/meta/">having the perfect tools</a>, I want to let go of believing the output has to be perfect before I share it with others. [Reading this blog, you can be forgiven believing that I let go of that belief long ago; I do better here, but there are still drafts from 2006 that I've never published because they weren't "right".] By definition what I put out, no matter how much time I put into it, is not going to be perfect. If I can accept that, embrace it, I can spend my time and energy actually doing the work, instead of worrying about the output.</p>
<p>Perfection is not an option.</p>
<img src="http://feeds.feedburner.com/~r/yerglernet-tloa/~4/8exjg9CJCCY" height="1" width="1"/>]]></content:encoded>
			<wfw:commentRss>http://yergler.net/blog/2010/03/29/perfection-is-not-an-option/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		<feedburner:origLink>http://yergler.net/blog/2010/03/29/perfection-is-not-an-option/</feedburner:origLink></item>
		<item>
		<title>Read: “Invisible”, by Paul Auster</title>
		<link>http://feedproxy.google.com/~r/yerglernet-tloa/~3/c-jB8Z8F1Wc/</link>
		<comments>http://yergler.net/blog/2010/03/28/read-invisible-by-paul-auster/#comments</comments>
		<pubDate>Mon, 29 Mar 2010 03:04:26 +0000</pubDate>
		<dc:creator>Nathan Yergler</dc:creator>
				<category><![CDATA[reading]]></category>
		<category><![CDATA[2009]]></category>
		<category><![CDATA[fiction]]></category>
		<category><![CDATA[read]]></category>

		<guid isPermaLink="false">http://yergler.net/?p=1622</guid>
		<description><![CDATA[There are a few authors who I&#8217;ll follow just about anywhere; Paul Auster is one of them. Over the past couple years as I&#8217;ve read his catalog, I&#8217;ve enjoyed his description of even the darkest and bleakest situations. Leah described his work as &#8220;primarily meta-fiction&#8221; when she first introduced me to Auster &#8212; and he [...]]]></description>
			<content:encoded><![CDATA[<p>There are a few authors who I&#8217;ll follow just about anywhere; <a href="http://en.wikipedia.org/wiki/Paul_Auster">Paul Auster</a> is one of them. Over the past couple years as I&#8217;ve read his catalog, I&#8217;ve enjoyed his description of even the darkest and bleakest situations.  Leah described his work as &#8220;primarily meta-fiction&#8221; when she first introduced me to Auster &#8212; and he definitely excels at that &#8212; but that&#8217;s only part of the appeal.  In works like <em><a href="http://en.wikipedia.org/wiki/Invisible_(2009_novel)">Invisible</a></em>, Auster uses creates a fictional world that he then uses to explore how we think about identity, shared experience, and stories.</p>
<p>[Warning, the following may contain spoilers, although I don't think they would degrade the actual reading experience.]</p>
<p><iframe class="shameless commerce alignright" src="http://rcm.amazon.com/e/cm?lt1=_blank&#038;bc1=000000&#038;IS2=1&#038;npa=1&#038;bg1=FFFFFF&#038;fc1=000000&#038;lc1=0000FF&#038;t=yergler.net-20&#038;o=1&#038;p=8&#038;l=as1&#038;m=amazon&#038;f=ifr&#038;md=10FE9736YVPPT7A0FBG2&#038;asins=0805090800" style="width:120px;height:240px;" scrolling="no" marginwidth="0" marginheight="0" frameborder="0"></iframe><em>Invisible</em> begins in 1967, when the protagonist, Adam Walker, meets a visiting college professor, Born, and his girlfriend, Margot, at a party.  This chance meeting gives rise to a business deal, the celebration of which is marred by a mugging that turns violent.  It isn&#8217;t until the second section of the book that we realize the narrator is not Adam, but a college friend, James, now a successful author.  James has received the preceding section from Adam much later in their lives, as the first part of a book Adam hopes to write.  This book, like <em>Invisible</em>, will have four sections &#8212; spring, summer, fall, winter.  The sending of pages, the recipients admiration for the original author (James believed Adam would go on to greatness), and the eventual responsibility for publication all echo the story of Fanshawe in <em>The Locked Room</em>, part of <a href="http://en.wikipedia.org/wiki/The_New_York_Trilogy">The New York Trilogy</a>, one of Auster&#8217;s earlier works.</p>
<p><em>Invisible</em> depicts a progression, both mechanically and for its characters.  The characters deal with a push-pull of good (intellect) and evil.  The book describes an interesting tension between sex and justice, how they interlock and how we distance ourselves from our actions seeking both.  Auster uses different voices to emphasize the distance, telling each part of the story in a different voice.  The first section is told in the first person, second in the second person, etc. The fourth and final section is told from the perspective of another person through a diary, with Adam, the protagonist, absent except in reference.  As the story progresses, the details fall away in another reflection of this distancing.</p>
<p><em>Invisible</em> works for me on many levels: as a story, as moralistic exposition, as a demonstration of using the mechanics of writing to further a story.  Most importantly, it was enjoyable to read and drew me into a world where the line of what I know and what I think I know is never quite clear.</p>
<img src="http://feeds.feedburner.com/~r/yerglernet-tloa/~4/c-jB8Z8F1Wc" height="1" width="1"/>]]></content:encoded>
			<wfw:commentRss>http://yergler.net/blog/2010/03/28/read-invisible-by-paul-auster/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		<feedburner:origLink>http://yergler.net/blog/2010/03/28/read-invisible-by-paul-auster/</feedburner:origLink></item>
	</channel>
</rss>
