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

<channel>
	<title>Rhonabwy &#187; django</title>
	<atom:link href="http://www.rhonabwy.com/wp/category/geekstuff/django/feed/" rel="self" type="application/rss+xml" />
	<link>http://www.rhonabwy.com/wp</link>
	<description>Mac OS X, iPhone, Tech, and daily life in Seattle</description>
	<lastBuildDate>Sun, 28 Feb 2010 21:40:36 +0000</lastBuildDate>
	<generator>http://wordpress.org/?v=2.9.2</generator>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
			<item>
		<title>The darker side of Pinax</title>
		<link>http://www.rhonabwy.com/wp/2010/02/27/the-darker-side-of-pinax/</link>
		<comments>http://www.rhonabwy.com/wp/2010/02/27/the-darker-side-of-pinax/#comments</comments>
		<pubDate>Sat, 27 Feb 2010 21:15:32 +0000</pubDate>
		<dc:creator>Joe</dc:creator>
				<category><![CDATA[Geekstuff]]></category>
		<category><![CDATA[Ranting and Reflections]]></category>
		<category><![CDATA[django]]></category>

		<guid isPermaLink="false">http://www.rhonabwy.com/wp/?p=952</guid>
		<description><![CDATA[I really like the concept of Pinax, but I&#8217;m beginning to see the darker sides of the project. Here&#8217;s the fundamental issue:
Pinax does a completely kick ass job of making a combined and base project that pulls together a lot of pretty darn good re-usable django &#8220;applications&#8221; into a single project. What it doesn&#8217;t do [...]]]></description>
			<content:encoded><![CDATA[<p>I really like the concept of <a href="http://pinaxproject.com/">Pinax</a>, but I&#8217;m beginning to see the darker sides of the project. Here&#8217;s the fundamental issue:</p>
<p>Pinax does a completely kick ass job of making a combined and base project that pulls together a lot of pretty darn good re-usable django &#8220;applications&#8221; into a single project. What it doesn&#8217;t do well is manage any of the dependencies in that tree, or make it easy to use only a portion of some app. If you want to use Pinax the way Pinax is already developed, you&#8217;re rockin&#8217;. If not, you&#8217;re re-working quite a bit of code. And the worst part is that code is almost all opaque to you and hidden in the pinax framework.</p>
<p>The application I wanted to pull in to my basic &#8220;pinax&#8221; project was &#8220;photos&#8221; &#8211; some simple photo uploading. Yeah, cool &#8211; uses photologue under the covers. What&#8217;s not clear is that photos also has dependencies on grouping and tagging, and if you review <a href="http://pinaxproject.com/docs/0.7/dependencies.html">the dependencies documentation</a>, it looks like there&#8217;s circular dependencies embedded in there.</p>
<p>What I ended up doing was to take the &#8220;photos&#8221; application from the Pinax project directly, fork that, and drop it into my project. Then I had to do a shit-load of renaming and stripping because &#8220;photos&#8221; is built in to Pinax as a default &#8211; so &#8220;photos&#8221; in my app became &#8220;photo&#8221; and I was scrambling through code to remove the bindings into commenting, threaded commenting, grouping, and so forth.</p>
<p>I did get it working, and really all told I spent less time stripping out stuff than I would have putting it together from scratch. But the only reason I was able to do it that efficiently is because I&#8217;ve already been through the pinax project&#8217;s source, had it on my laptop, and was a fairly comfortable and competent <a href="http://www.djangoproject.com/">Django</a> programmer. Any newcomer hitting this would have been toast, and badly confused.</p>
<p>When I asked around the <a href="http://www.djangoseattle.org/">Seattle Django user&#8217;s group</a> related to Pinax, several of them said they&#8217;d been shying away from something like Pinax because it was easier for them to simply including the good open-source django apps into their work already. At the time, I thought &#8220;Well, maybe that just makes Pinax easier and more effective for newbies into Django.&#8221; Now I&#8217;m reconsidering.</p>
<p>I don&#8217;t have a good answer to the problem, and I&#8217;m sure I&#8217;ll continue to use Pinax and maybe even dig deeper and see what can be done to resolve this kind of issue. I think the idea of the Pinax project is fantastic, I just wish it was a little less &#8220;tightly coupled&#8221; under the covers and provided more transparency into it&#8217;s depths.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.rhonabwy.com/wp/2010/02/27/the-darker-side-of-pinax/feed/</wfw:commentRss>
		<slash:comments>9</slash:comments>
		</item>
		<item>
		<title>Pinax cheat sheets</title>
		<link>http://www.rhonabwy.com/wp/2010/01/24/pinax-cheat-sheets/</link>
		<comments>http://www.rhonabwy.com/wp/2010/01/24/pinax-cheat-sheets/#comments</comments>
		<pubDate>Mon, 25 Jan 2010 01:12:35 +0000</pubDate>
		<dc:creator>Joe</dc:creator>
				<category><![CDATA[Geekstuff]]></category>
		<category><![CDATA[Ranting and Reflections]]></category>
		<category><![CDATA[django]]></category>

		<guid isPermaLink="false">http://www.rhonabwy.com/wp/?p=938</guid>
		<description><![CDATA[I have a few friends that I&#8217;m bringing up to speed pretty quickly on Django. The basics are going well, and I&#8217;m providing the foundations for the effort. To take advantage of all the good stuff out there, I&#8217;ve started diving deeply into Pinax, and then wrapping some automation around it with Fabric to make [...]]]></description>
			<content:encoded><![CDATA[<p>I have a few friends that I&#8217;m bringing up to speed pretty quickly on <a href="http://www.djangoproject.com/">Django</a>. The basics are going well, and I&#8217;m providing the foundations for the effort. To take advantage of all the good stuff out there, I&#8217;ve started diving deeply into <a href="http://pinaxproject.com/">Pinax</a>, and then wrapping some automation around it with <a href="http://docs.fabfile.org/0.9.0/">Fabric</a> to make it really easy to work on new apps and projects.</p>
<p>That&#8217;s the whole reason I posted <a href="http://gist.github.com/284927">gist 284927</a> yesterday <a href="http://www.rhonabwy.com/wp/2010/01/23/using-fabric-to-deploy-a-pinax-project/">on setting up a remote app server for a pinax project with Fabric</a>.</p>
<p>The biggest hurdle that I have with the fellows I&#8217;m bringing up to speed is them understanding what&#8217;s IN the project that I&#8217;ve already slapped down. Even a basic pinax project has a huge amount of complexity for the newer django developer &#8211; it&#8217;s pretty overwhelming. To try and mitigate that complexity, I&#8217;ve started a side project making <a href="http://github.com/heckj/pinax_cheat_sheets">Pinax cheat sheets</a>. (<a href="http://github.com/heckj/pinax_cheat_sheets">http://github.com/heckj/pinax_cheat_sheets</a>).</p>
<p>This is <strong>not</strong> intended to replace Pinax documentation, and in fact I hope that I can eventually tweak these around and put them into the pinax project. I have a huge respect for it (and I use it), so here&#8217;s a little bit of detail for contributing back.</p>
<p>I am very happy to take on any changes, edits, updates, etc &#8211; from others. There&#8217;s a lot of folks who&#8217;ve worked very hard to build all these components, and I&#8217;m not writing from the perspective of the creator, but of the &#8220;code spelunker&#8221;. I&#8217;m sure I&#8217;ll get some of this stuff wrong &#8211; so if you see something, please let me know.</p>
<p>I&#8217;d ideally love to receive contributions in the form of pull requests from GitHub. Just fork that project, make your edits, and when you&#8217;ve pushed them back up &#8211; send me a pull request. I don&#8217;t promise that I&#8217;ll include everyone&#8217;s contributions, but to be honest I don&#8217;t expect to be too darn picky.</p>
<p>I&#8217;ve written the cheat sheets in <a href="http://daringfireball.net/projects/markdown/">markdown</a>, mostly because I know it, and secondarily because it renders nicely as HTML when viewed through GitHub.</p>
<p>The start of the project has the following cheat sheets up:</p>
<ul>
<li><a href="http://github.com/heckj/pinax_cheat_sheets/blob/master/django_contrib_auth.markdown">django.contrib.auth</a></li>
<li><a href="http://github.com/heckj/pinax_cheat_sheets/blob/master/django_contrib_contenttypes.markdown">django.contrib.contenttypes</a></li>
<li><a href="http://github.com/heckj/pinax_cheat_sheets/blob/master/django_contrib_humanize.markdown">django.contrib.humanize</a></li>
<li><a href="http://github.com/heckj/pinax_cheat_sheets/blob/master/django_contrib_sessions.markdown">django.contrib.sessions</a></li>
<li><a href="http://github.com/heckj/pinax_cheat_sheets/blob/master/django_contrib_sites.markdown">django.contrib.sites</a></li>
<li><a href="http://github.com/heckj/pinax_cheat_sheets/blob/master/pinax_templatetags.markdown">pinax.templatetags</a></li>
<li><a href="http://github.com/heckj/pinax_cheat_sheets/blob/master/notification.markdown">notification</a></li>
</ul>
<p>I have a bunch more external apps to go before I hit the internal Pinax apps. I&#8217;m working through everything that&#8217;s included in a Pinax &#8220;basic_project&#8221;.</p>
<ul>
<li><a href="http://github.com/heckj/pinax_cheat_sheets/blob/master/django_openid.markdown">django_openid</a></li>
<li><a href="http://github.com/heckj/pinax_cheat_sheets/blob/master/emailconfirmation.markdown">emailconfirmation</a></li>
<li><a href="http://github.com/heckj/pinax_cheat_sheets/blob/master/mailer.markdown">mailer</a></li>
<li><a href="http://github.com/heckj/pinax_cheat_sheets/blob/master/announcements.markdown">announcements</a></li>
<li><a href="http://github.com/heckj/pinax_cheat_sheets/blob/master/pagination.markdown">pagination</a></li>
<li><a href="http://github.com/heckj/pinax_cheat_sheets/blob/master/timezones.markdown">timezones</a></li>
<li><a href="http://github.com/heckj/pinax_cheat_sheets/blob/master/ajax_validation.markdown">ajax_validation</a></li>
<li><a href="http://github.com/heckj/pinax_cheat_sheets/blob/master/uni_form.markdown">uni_form</a></li>
<li><a href="http://github.com/heckj/pinax_cheat_sheets/blob/master/staticfiles.markdown">staticfiles</a></li>
</ul>
<p>And then the internal apps:</p>
<ul>
<li>basic_profiles</li>
<li>account</li>
<li>signup_codes</li>
<li>about</li>
<li>django.contrib.admin</li>
</ul>
]]></content:encoded>
			<wfw:commentRss>http://www.rhonabwy.com/wp/2010/01/24/pinax-cheat-sheets/feed/</wfw:commentRss>
		<slash:comments>3</slash:comments>
		</item>
		<item>
		<title>Using fabric to deploy a Pinax project</title>
		<link>http://www.rhonabwy.com/wp/2010/01/23/using-fabric-to-deploy-a-pinax-project/</link>
		<comments>http://www.rhonabwy.com/wp/2010/01/23/using-fabric-to-deploy-a-pinax-project/#comments</comments>
		<pubDate>Sun, 24 Jan 2010 01:30:51 +0000</pubDate>
		<dc:creator>Joe</dc:creator>
				<category><![CDATA[Geekstuff]]></category>
		<category><![CDATA[Ranting and Reflections]]></category>
		<category><![CDATA[django]]></category>

		<guid isPermaLink="false">http://www.rhonabwy.com/wp/?p=935</guid>
		<description><![CDATA[I spent the better part of this morning screwing around with Fabric to get even a basic deployment working correctly with Pinax. I may be doing this horrifically backwards&#8230; Since I finally nailed something that worked for me and I couldn&#8217;t find much out there on the web, I wanted to post up a result [...]]]></description>
			<content:encoded><![CDATA[<p>I spent the better part of this morning screwing around with Fabric to get even a basic deployment working correctly with Pinax. I may be doing this horrifically backwards&#8230; Since I finally nailed something that worked for me and I couldn&#8217;t find much out there on the web, I wanted to post up a result so that other folks could use/riff etc.</p>
<p><a href="http://gist.github.com/284927">http://gist.github.com/284927</a></p>
<p>Please feel free to replicate/clone/use/etc whatever to your heart&#8217;s content. It&#8217;s built around deploying a <a href="http://pinaxproject.com/">Pinax</a> 0.71 project clone that also uses <a href="http://south.aeracode.org/">South</a> for schema migrations, and the project is housed in BitBucket.</p>
<p>The other fabric file I found that&#8217;s referenced frequently was a part of the inspiration here: <a href="http://gist.github.com/212366">http://gist.github.com/212366</a>. It&#8217;s a fabfile that&#8217;s intended to provide some simple rollback and expects to be used from GitHub &#8211; and has some really nice documentation associated with it. Maybe I&#8217;ll work on mine to add some of that doc&#8230; but mostly I&#8217;m just making it available as is.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.rhonabwy.com/wp/2010/01/23/using-fabric-to-deploy-a-pinax-project/feed/</wfw:commentRss>
		<slash:comments>2</slash:comments>
		</item>
		<item>
		<title>integrated project management for development</title>
		<link>http://www.rhonabwy.com/wp/2009/12/24/integrated-project-management-for-development/</link>
		<comments>http://www.rhonabwy.com/wp/2009/12/24/integrated-project-management-for-development/#comments</comments>
		<pubDate>Thu, 24 Dec 2009 23:40:37 +0000</pubDate>
		<dc:creator>Joe</dc:creator>
				<category><![CDATA[Geekstuff]]></category>
		<category><![CDATA[Ranting and Reflections]]></category>
		<category><![CDATA[django]]></category>
		<category><![CDATA[rails]]></category>

		<guid isPermaLink="false">http://www.rhonabwy.com/wp/?p=921</guid>
		<description><![CDATA[Ironically, the choices for an in-house integrated project management toolchain are, to my mind, significantly more limited than the straight up open-source market. I have been looking and watching several projects over the past months for something that I could use for my development team at work (i.e. behind a corporate firewall and not publicly [...]]]></description>
			<content:encoded><![CDATA[<p>Ironically, the choices for an in-house integrated project management toolchain are, to my mind, significantly more limited than the straight up open-source market. I have been looking and watching several projects over the past months for something that I could use for my development team at work (i.e. behind a corporate firewall and not publicly available) to support a more open, transparent view of what was happening.</p>
<p><a href="http://trac.edgewall.org/">Trac</a>, of course, is one I&#8217;ve used and really enjoy. <a href="http://trac.edgewall.org/">Trac</a>, however, doesn&#8217;t really support multiple projects in any integrated way &#8211; and we&#8217;ve got way more than one project. From the activity I&#8217;ve seen, it&#8217;s not about to any time soon. Variations on that theme include <a href="https://www.drproject.org/">DrProject</a>, and more recently <a href="http://basieproject.org/">Basie</a>. They&#8217;re all interesting, but I didn&#8217;t see either DrProject or Basie as really ready for prime time and I wanted to be able to quickly grow beyond the basics. Two others that are obviously available are <a href="http://www.redmine.org/">Redmine</a> and <a href="http://retrospectiva.org/">Retrospectiva</a>.</p>
<p>Ultimately, I&#8217;m heading down the road with Redmine for the following reasons:</p>
<ol>
<li>It&#8217;s a decent and clean user interface that has several years of polish now around it</li>
<li>The system support plugins, and there&#8217;s several plugins that I really want to take advantage of</li>
<li>Redmine and Trac appear to have the most active communities around them and driving them</li>
</ol>
<p>The story cards and burn-down charts from <a href="http://retrospectiva.org/wiki/AgilePM">Retrospectiva&#8217;s AgilePM</a> addition were darned compelling. But ultimately it has a more limited set of folks focusing on that project, and I think I can achieve the same effects with <a href="http://www.redmine.org/wiki/redmine/Plugin_List">plugins that are available from the Redmine community</a>. Many of these are hosted on GitHub, and even more are in development or some middlin&#8217; shape at the same site. And finally, I&#8217;d much rather deal with a partially implemented plugin than a partially implemented core system.</p>
<p>If I could host our development outside of the corporate firewall, I&#8217;d likely be looking at <a href="http://bitbucket.org/">Bitbucket</a> or <a href="http://www.activestate.com/firefly/">Firefly</a> for the work. I like Bitbucket partially because it&#8217;s all mercurial based, and I need to support some Microsoft based development. Git <i>will</i> work with enough effort, but I don&#8217;t want to go down the road of trying to explain all the detail needed there. I love the functionality in <a href="https://github.com/">GitHub</a>, and frankly think it&#8217;s a slightly better and more aggressively updated solution that BitBucket, but the git thing &#8211; while I&#8217;m happy enough with it &#8211; just sinks me otherwise because I know I&#8217;ll end up spending hours attempting to support it on a windows environment, and I just don&#8217;t want that hit. <a href="http://www.activestate.com/firefly/">Firefly</a> is ActiveState&#8217;s &#8220;let&#8217;s take and commercialize Trac by hosting it&#8221; &#8211; and they look like they&#8217;ve done a nice job of it. The agile methodology plugins and burn-down charts are pretty darn compelling.</p>
<p>It should be noted that I also took a pretty deep look at <a href="https://launchpad.net/">Launchpad</a>. Even though it&#8217;s open sourced, it&#8217;s a damned complex thing to potentially integrate and build up for internal use, and its integration/collaboration features just haven&#8217;t been as compelling to me as the machinery that GitHub or Bitbucket provide. The &#8220;branch and request a pull&#8221; feature set that supports the massive branching and merging for features, bugfixes, etc. is just so much easier in Github or Bitbucket &#8211; and the wiki support to the other components is also far superior.</p>
<p>If you&#8217;re looking for something yourself, definitely keep an eye on the market and projects though. RIght now it&#8217;s just December 2009, and it&#8217;s clear there is a lot of effort, momentum, and a ton of good ideas that people are just begging to implement in this space. If I go to make this same decision in 6 months, there&#8217;s no guarantee that the landscape won&#8217;t have changed dramatically and a different solution would be better.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.rhonabwy.com/wp/2009/12/24/integrated-project-management-for-development/feed/</wfw:commentRss>
		<slash:comments>5</slash:comments>
		</item>
		<item>
		<title>South &#8211; incredible easy migrations for Django</title>
		<link>http://www.rhonabwy.com/wp/2009/11/15/south-incredible-easy-migrations-for-django/</link>
		<comments>http://www.rhonabwy.com/wp/2009/11/15/south-incredible-easy-migrations-for-django/#comments</comments>
		<pubDate>Mon, 16 Nov 2009 01:47:09 +0000</pubDate>
		<dc:creator>Joe</dc:creator>
				<category><![CDATA[Geekstuff]]></category>
		<category><![CDATA[Ranting and Reflections]]></category>
		<category><![CDATA[django]]></category>

		<guid isPermaLink="false">http://www.rhonabwy.com/wp/?p=911</guid>
		<description><![CDATA[I&#8217;ve been hacking away at a side project for the past three or four weeks &#8211; got myself to internal milestone #2 this weekend, for which I&#8217;m really pleased. The very tail end of this milestone was deploying the code somewhere and vetting that all the basic, mostly-crappy-still bits actually worked.
Since I&#8217;ve got it deployed [...]]]></description>
			<content:encoded><![CDATA[<p>I&#8217;ve been hacking away at a side project for the past three or four weeks &#8211; got myself to internal milestone #2 this weekend, for which I&#8217;m really pleased. The very tail end of this milestone was deploying the code somewhere and vetting that all the basic, mostly-crappy-still bits actually worked.</p>
<p>Since I&#8217;ve got it deployed now onto a little dev server, I was thinking about how I was going to make this work going forward. Database migrations being one of those &#8220;how do you upgrade things?&#8221; questions when you&#8217;re doing rapid development django applications where the database model can get twiddled a bit.</p>
<p>The result of scanning around this afternoon from <a href="http://www.eldiablocoffee.com/">my favorite coffee shop haunt</a> led me to <a href="http://south.aeracode.org/">South</a>. In about 10 minutes I&#8217;d enabled and moved to south and had my application up and rolling with it. My previous experience was with <a href="http://code.google.com/p/django-evolution/">Django Evolution</a> &#8211; which wasn&#8217;t bad, but it was more work to get it into place and running.</p>
<p>The migrations in place, I did some model twiddling and experimented a bit to see how it all worked. I can see how if you&#8217;re not being somewhat careful, you could get into some really horrible places that no program could figure out. But basic migrations &#8211; moving forward and backward &#8211; really do an excellent job of &#8220;just working&#8221; with this framework out of the box.</p>
<p>The one interesting quirk I ran into &#8211; I&#8217;ve been doing tests on my codebase with:</p>
<pre><a href="http://nedbatchelder.com/code/coverage/">coverage</a> manage.py test</pre>
<p>which just caught and ran the tests for everything in the application list. Figured it didn&#8217;t hurt to test the admin and auth stuff as well. When I added south, which I installed using:</p>
<pre> <a href="http://pypi.python.org/pypi/pip">pip</a> install south</pre>
<p>The directory that south&#8217;s tests expect to use suddenly becomes a bit less accessible on the build server. Not a bad thing to redirect the tests to just what I&#8217;m writing, but an interesting side effect.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.rhonabwy.com/wp/2009/11/15/south-incredible-easy-migrations-for-django/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Setting up a python CI server with Hudson</title>
		<link>http://www.rhonabwy.com/wp/2009/11/04/setting-up-a-python-ci-server-with-hudson/</link>
		<comments>http://www.rhonabwy.com/wp/2009/11/04/setting-up-a-python-ci-server-with-hudson/#comments</comments>
		<pubDate>Thu, 05 Nov 2009 05:17:49 +0000</pubDate>
		<dc:creator>Joe</dc:creator>
				<category><![CDATA[Geekstuff]]></category>
		<category><![CDATA[Ranting and Reflections]]></category>
		<category><![CDATA[django]]></category>

		<guid isPermaLink="false">http://www.rhonabwy.com/wp/?p=895</guid>
		<description><![CDATA[Installing Hudson
I start with a basic virtual machine &#8211; in this case, I&#8217;m using Ubuntu Server 9.10. Once you have a basic machine installed, I recommend you make sure everything&#8217;s up to date with patches.
sudo apt-get update
sudo apt-get dist-upgrade

If you haven&#8217;t already, consider installing an ssh server for remote login. You don&#8217;t need it for [...]]]></description>
			<content:encoded><![CDATA[<h2>Installing Hudson</h2>
<p>I start with a basic virtual machine &#8211; in this case, I&#8217;m using <a href="http://www.ubuntu.com/getubuntu/download-server">Ubuntu Server</a> 9.10. Once you have a basic machine installed, I recommend you make sure everything&#8217;s up to date with patches.</p>
<p><code>sudo apt-get update<br />
sudo apt-get dist-upgrade<br />
</code></p>
<p>If you haven&#8217;t already, consider installing an ssh server for remote login. You don&#8217;t need it for hudson, but I find it makes administration easier.</p>
<p><code>sudo apt-get install openssh-server</code></p>
<p>To make installing python packages and pieces a bit easier:</p>
<p><code>sudo apt-get install build-essential python-dev</code></p>
<p>Start off by getting a copy of hudson.</p>
<p><code>wget http://hudson-ci.org/latest/hudson.war</code></p>
<p>Hudson runs fine from that war directly &#8211; a darned handy way to make the whole system work. You can also install this in Tomcat, JBoss, or whatever other servlet container you like to run. I find it easiest to run directly from the war file.</p>
<p>If you&#8217;re going using Mercurial or Git, you&#8217;ll need to install the appropriate version control client onto your machine as well. The plugins use those systems through the command line interface.</p>
<p><code>sudo apt-get install mercurial<br />
sudo apt-get install git-core<br />
sudo apt-get install subversion<br />
</code></p>
<p>Since hudson is a java application, we need to have java installed&#8230; Ubuntu 9.10 comes with OpenJDK which works just fine. You can also download and install the Sun JDK if you want to, but it doesn&#8217;t really seem to be required. If you don&#8217;t have any JDK already installed, you can generally get OpenJDK using:</p>
<p><code>sudo apt-get install openjdk-6-jre-headless</code></p>
<p>To get rolling with Hudson, just fire it up:</p>
<p><code>java -jar hudson.war</code></p>
<p>I just run this as the base user &#8211; no special privileges. It creates all it&#8217;s working directories, workspaces, etc in a &#8220;.hudson&#8221; directory. You can do the extra work to make this a unix daemon too &#8211; I haven&#8217;t bothered because it&#8217;s been relatively stable. There are some good notes on doing this at <a href="http://weblogs.java.net/blog/2009/02/10/hudson-now-good-behaving-unix-daemon" target="_blank">http://weblogs.java.net/blog/2009/02/10/hudson-now-good-behaving-unix-daemon</a> and <a href="http://wiki.hudson-ci.org/display/HUDSON/Installing+Hudson+as+a+Unix+daemon" target="_blank">http://wiki.hudson-ci.org/display/HUDSON/Installing+Hudson+as+a+Unix+daemon</a>, so I won&#8217;t dive into those details here.</p>
<p>Once you&#8217;ve started it, bring up the UI in a browser to make sure it&#8217;s all working. My virtual machine is running at 192.168.0.2, so I open up http://192.168.0.2:8080/. I&#8217;ll use this same IP address through the course of this walk-through. Of course you can replace it with a hostname.</p>
<div style="clear:both;">&#8230;</div>
<p><img class="size-medium wp-image-880 aligncenter" title="hudson1" src="http://www.rhonabwy.com/wp/wp-content/uploads/2009/11/hudson1-300x237.png" alt="hudson1" width="300" height="237" /></p>
<div style="clear:both;">&#8230;</div>
<p>I generally start off by making sure we have the latest Hudson installed and getting the various client plugins I want to use all installed &#8211; click on &#8220;Manage Hudson&#8221; (http://192.168.0.2:8080/manage)</p>
<p>If there&#8217;s a more recent version of Hudson available, it will show at the very top of this page and give you the option to download and install it. You&#8217;ll be able to upgrade plugins the same way &#8211; Hudson knows to look at it&#8217;s own site for the latest plugins and versions, so it&#8217;s very easy to maintain. If you&#8217;ve been following along with this, the &#8220;wget&#8221; statement up above will have likely brought down the latest version already, so you won&#8217;t see this sort of screen until a new update comes along.</p>
<div style="clear:both;">&#8230;</div>
<p><img class="aligncenter size-medium wp-image-881" title="hudson2" src="http://www.rhonabwy.com/wp/wp-content/uploads/2009/11/hudson2-300x237.png" alt="hudson2" width="300" height="237" /></p>
<div style="clear:both;">&#8230;</div>
<p>The upgrade automatically mechanism has worked great for me, but a couple of caveats are needed here &#8211; the process needs to be running with permissions to the directory in which it&#8217;s located to work. The other is once you&#8217;ve upgraded the system, you may need to restart the service from the command line to enable future downloads. I&#8217;m not sure if I ran into a bug with that, or if that&#8217;s expected behavior &#8211; but I haven&#8217;t run into it often.</p>
<div style="clear:both;">&#8230;</div>
<p><img class="aligncenter size-medium wp-image-882" title="hudson3" src="http://www.rhonabwy.com/wp/wp-content/uploads/2009/11/hudson3-300x237.png" alt="hudson3" width="300" height="237" /></p>
<div style="clear:both;">&#8230;</div>
<p>Now you should have the latest version &#8211; either directly or just upgraded. Lets get to the plugins &#8211; because that&#8217;s where a lot of the Hudson goodness really lives. You can get to the list of installed plugins so you can see what&#8217;s there by default. From the &#8220;Manage Hudson&#8221; page, click on the link to &#8220;Manage Plugins&#8221;. The URL for that page is http://192.168.0.2:8080/pluginManager/</p>
<p>There are four tabs here to help you see what&#8217;s available &#8211; the first tab <em>Updates</em> is the default, and shows any outdated plugins. The second is <em>Available</em>, that shows what&#8217;s linked up from the central Hudson plugin list, and <em>Installed</em>, which shows the bits that are already there. Click on the Available tab (url is http://192.168.0.2:8080/pluginManager/available) and you can see the plethora of interesting things ready to use. The ones I like to install for my python projects are:</p>
<ul>
<li>Cobertura Plugin</li>
<li>Git Plugin</li>
<li>Mercurial Plugin</li>
<li>Monitoring Plugin</li>
<li>Python Plugin</li>
<li>Violations Plugin</li>
</ul>
<div style="clear:both;">Click on one of the plugins at a time and then go to the bottom of the page (lower right corner) and click Install. The screenshot below should look pretty familiar for this process. I&#8217;ve had trouble sometimes installing several plugins at once, although I expect that should be possible.</div>
<div style="clear:both;">&#8230;</div>
<p><img class="alignleft size-medium wp-image-883" title="hudson4" src="http://www.rhonabwy.com/wp/wp-content/uploads/2009/11/hudson4-300x237.png" alt="hudson4" width="300" height="237" /></p>
<div style="clear:both;">&#8230;</div>
<p>All of these plugins will still require you to have whatever local libraries you need to make them work. That&#8217;s why we installed Mercurial, Subversion, Git, etc earlier &#8211; to make sure those tools were available. Hudson invokes them on the command line on your behalf to make it all work.</p>
<p>Below is a broad set of libraries that cover a lot of pieces &#8211; you may want to install more/different libraries to accomplish your aims with Hudson. I&#8217;ll be aiming to create some typical build reports with it all &#8211; unit test output, coverage, etc.</p>
<p><code>sudo apt-get install python-setuptools<br />
sudo easy_install coverage<br />
sudo easy_install pylint<br />
sudo easy_install unittest-xml-reporting<br />
sudo easy_install fabric<br />
sudo easy_install nose<br />
</code></p>
<h2>Setting up a new Job</h2>
<p>Now we just need a project. Let&#8217;s start with an open-source project &#8211; <a href="http://pygments.org/" target="_blank">Pygments</a> is a great project, with lots of diverse things happening within it. And it&#8217;s got tests and will be a good general victim for this writeup.</p>
<p>Start out by clicking on &#8220;New Job&#8221; (http://192.168.0.2:8080/view/All/newJob). A Job in Hudson is a build process. I&#8217;m going to make a fairly simple one, but you can cascade multiple jobs together into a far more complex build process if you want to&#8230; I&#8217;m not going to delve into that here, focusing instead on getting a single python project rolling.</p>
<div style="clear:both;">&#8230;</div>
<p><img class="alignleft size-medium wp-image-884" title="hudson5" src="http://www.rhonabwy.com/wp/wp-content/uploads/2009/11/hudson5-300x238.png" alt="hudson5" width="300" height="238" /></p>
<div style="clear:both;">&#8230;</div>
<p>In the new job form:</p>
<ul>
<li>set the job name to &#8220;pygments&#8221;</li>
<li>choose &#8220;Build a free-style software project&#8221;</li>
<li>I also put in a description (it&#8217;s not mandatory)</li>
<li>then choose &#8220;Mercurial&#8221; from the Source Code management section</li>
</ul>
<div style="clear: both;">&#8230;</div>
<p><img class="alignleft size-medium wp-image-885" title="hudson6" src="http://www.rhonabwy.com/wp/wp-content/uploads/2009/11/hudson6-300x238.png" alt="hudson6" width="300" height="238" /></p>
<div style="clear: both;">&#8230;</div>
<ul>
<li>put in &#8220;http://dev.pocoo.org/hg/pygments-main&#8221; for Repository URL</li>
<li>put in &#8220;trunk&#8221; for the Branch</li>
<li>click the &#8220;Save&#8221; button down at the bottom</li>
</ul>
<p>Now you&#8217;ve got a job &#8211; we can come back and configure this at any time, and we&#8217;ll do more tweaking as we go through this. Let&#8217;s make sure we have the basics all working first though&#8230;</p>
<ul></ul>
<p>At this point, you should be at the project pygments page in Hudson. If you&#8217;re not, you can navigate there from the front page, or go directly to the URL (http://192.168.0.2:8080/view/All/job/pygments/). The page should look something like this:</p>
<div style="clear:both;">&#8230;</div>
<p><img class="alignleft size-medium wp-image-886" title="hudson7" src="http://www.rhonabwy.com/wp/wp-content/uploads/2009/11/hudson7-300x265.png" alt="hudson7" width="300" height="265" /></p>
<div style="clear:both;">&#8230;</div>
<p>On the left hand side of the page are the controls for the job, including <em>Configure</em> and <em>Build Now</em> among a list of other options.</p>
<ul>
<li>click on &#8220;Build Now&#8221;</li>
</ul>
<p>You should see the build start processing with a little rolling progress bar on the left hand side of the window. You can click on that link that looks like #1 Nov 5, 2009 8:35:18 AM&#8217; in the Build History box.</p>
<ul></ul>
<div style="clear:both;">&#8230;</div>
<p><img class="alignleft size-medium wp-image-887" title="hudson8" src="http://www.rhonabwy.com/wp/wp-content/uploads/2009/11/hudson8-300x265.png" alt="hudson8" width="300" height="265" /></p>
<div style="clear:both;">&#8230;</div>
<p>Either immediately, or when the build reports complete, click on that link.</p>
<div style="clear:both;">&#8230;</div>
<p><img class="alignleft size-medium wp-image-888" title="hudson9" src="http://www.rhonabwy.com/wp/wp-content/uploads/2009/11/hudson9-300x265.png" alt="hudson9" width="300" height="265" /></p>
<div style="clear:both;">&#8230;</div>
<p>You can see the console output from the build (which is just pulling down the source) with the link <em>Console Output</em>. The output of the build is exactly what happened on the command line. In this case, you&#8217;ll see something akin to:</p>
<pre style="white-space: pre-wrap; word-wrap: break-word;">Started by user anonymous
$ hg clone -r trunk http://dev.pocoo.org/hg/pygments-main /home/ubuntu/.hudson/jobs/pygments/workspace
requesting all changes
adding changesets
adding manifests
adding file changes
added 903 changesets with 2247 changes to 269 files
updating working directory
249 files updated, 0 files merged, 0 files removed, 0 files unresolved
[workspace] $ hg log -r . --template {node}
Finished: SUCCESS</pre>
<p>Once you&#8217;ve done an initial build, the files will also be available for you to look at and download through the Hudson UI. If you click on the link <em>Back to Project</em> or just the project name at the top of the page, you should see a new reference in the project called <em>Workspace</em>. Clicking into that will show you all the files that were downloaded and any other results of the build process. Right now we&#8217;re just getting files from source control, but as we add build steps to the process, the results will be available to dig around in at the workspace.</p>
<p>If you want to set up Hudson to check for updates and build when it finds them, you can go back to the project page and click on the <em>Configure</em> link. Once in there, scroll down in the configuration and enable the checkbox labelled &#8220;Poll SCM&#8221;. As soon as you do, another text field will come available that will let you specify a Cron-like string to identify when the builds should check source control. In the screenshot below, I&#8217;ve enabled Hudson to check the mercurial repository every 10 minutes.</p>
<p>&#8230;</p>
<p><img class="alignleft size-medium wp-image-889" title="hudson10" src="http://www.rhonabwy.com/wp/wp-content/uploads/2009/11/hudson10-300x265.png" alt="hudson10" width="300" height="265" /></p>
<div style="clear:both;">&#8230;</div>
<p>Any time you change the configuration, go to the bottom of the Configure page and click on &#8220;Save&#8221; to set the changes.</p>
<h2>Adding Build Steps &#8211; doing &#8216;work&#8217;</h2>
<p>Right now, the build isn&#8217;t doing too much &#8211; let&#8217;s see about getting it doing some more work for us. The <a href="http://dev.pocoo.org/projects/pygments/browser">Pygments source code</a> is set up with a Makefile to make doing this a bit easier, so we&#8217;ll take advantage of that. If you&#8217;re not in the Job configuration page &#8211; get there. Go to the job an click on the <em>Configure</em> link. Now we&#8217;ll add a build step that simple invokes the shell command &#8220;make test&#8221;.</p>
<p>Scroll down in the configuration page until you see the section labelled <em>Build</em>. Click on the button underneath there labelled <em>Add build step</em>, and choose <em>Execute shell</em>. When the text field for that script appears, put in the text <em>make test.</em></p>
<p>Scroll to the bottom of the page, save the configuration, and invoke &#8220;Build Now&#8221; to run the updated build. Looking at the console output for the build will now show the updated console log with the running tests, like the screen shot below.</p>
<div style="clear:both;">&#8230;</div>
<p><img class="alignleft size-medium wp-image-890" title="hudson11" src="http://www.rhonabwy.com/wp/wp-content/uploads/2009/11/hudson11-300x265.png" alt="hudson11" width="300" height="265" /></p>
<div style="clear:both;">&#8230;</div>
<p>Should the built in unit tests fail, the system will show a red indicator on the hudson front page and next to the build results link.</p>
<h2>Displaying unit test results</h2>
<p>What this isn&#8217;t doing it making some pretty graphs and charts. Let&#8217;s see about getting some of that enabled.</p>
<p>Pygments uses Nose tests for it&#8217;s unit tests. That&#8217;s pretty nice, because Nose includes a mechanism to output the format of the tests into Java-based JUnit format, and Hudson in turn knows how to make pretty pictures from that format. Since we installed the nose library earlier, we can take advantage of it. Probably the &#8220;right&#8221; way to do this would be to change the Makefile to invoke the tests that output XML for the unit tests. For right now, we&#8217;ll just shim it into place with new build steps.</p>
<ul>
<li>Change the content of the <em>Execute shell</em> build step and replace it with<br />
<code>python tests/run.py --with-xunit</code></li>
<li>save the configuration and invoke &#8220;Build Now&#8221;</li>
<li>now look in the workspace in you should find a new file called &#8220;nosetests.xml&#8221; in the tests subdirectory.</li>
</ul>
<p>Let&#8217;s get that graphed&#8230;</p>
<ul>
<li>Go to the job configuration and enable &#8220;Publish JUnit test result report&#8221;. It will have a text field so that you can tell it where to find the results. It uses an Ant format for finding filenames in an existing directory structure.</li>
<li>In this case use <em>**/tests/nosetests.xml</em></li>
<li>Save the config</li>
<li>invoke <em>Build Now</em></li>
</ul>
<p>Now you&#8217;ll see a new element in the web user interface called &#8220;Latest Test Result&#8221; which you can dig into. If you invoke &#8220;Build Now&#8221; again, it will start graphing the results of the tests and making that trend available in the project view. Right now this graph is going to be really darned boring, because there aren&#8217;t any changes between builds. Once more code starts rolling in, you&#8217;ll see changes with the number of tests being invoked. You can also click on that link and see the tests that were invoked. For python folks, remember that we&#8217;re shimming Python unit tests into a JUnit conceptual framework, so there are going to be some &#8220;leaky abstractions here&#8221;. In particular, test names, classes, and such may not alway match up with expectations. I have more details on how to enable XML output for a Django based test runner that I&#8217;ll post in another write up&#8230; uh, later.</p>
<div style="clear:both;">&#8230;</div>
<p><img class="alignleft size-medium wp-image-891" title="hudson12" src="http://www.rhonabwy.com/wp/wp-content/uploads/2009/11/hudson12-300x255.png" alt="hudson12" width="300" height="255" /></p>
<div style="clear:both;">&#8230;</div>
<h2>Add cobertura style test coverage reporting:</h2>
<p>Now we get to use <a href="http://nedbatchelder.com/code/coverage/">Ned Batchelder&#8217;s coverage library</a> to see some cool stuff!</p>
<p>(This whole write up is basically a thank you to Ned for writing Coverage)</p>
<p>Go back to the configuration for the job</p>
<ul>
<li>change the <em>Execute Shell</em> build step to read:</li>
</ul>
<p><code>coverage run tests/run.py --with-xunit<br />
coverage xml<br />
</code></p>
<ul>
<li>scroll down and enable  the check box <em>Publish Cobertura Coverage Report</em></li>
<li>use the pattern <em>**/coverage.xml</em></li>
</ul>
<div style="clear:both;">Ned gave me some feedback that I&#8217;d like to include about coverage, which is really great detail:</div>
<div style="clear:both;"></div>
<div style="clear:both;"><em>Cobertura has a Java-centric view of the world, and coverage.py tries to squeeze Python-oriented measurement into Cobertura&#8217;s Java-oriented report, so the &#8220;classes&#8221; numbers really have nothing to do with classes, they are about files, as an example. Also coverage doesn&#8217;t (yet! it&#8217;s almost ready for alpha) measure branch coverage, so those numbers are always 100% 0/0.</em></div>
<div style="clear:both;"></div>
<div style="clear:both;">&#8230;</div>
<p><img class="alignleft size-medium wp-image-893" title="hudson14" src="http://www.rhonabwy.com/wp/wp-content/uploads/2009/11/hudson14-300x207.png" alt="hudson14" width="300" height="207" /></p>
<div style="clear:both;">&#8230;</div>
<h2>Add pylint reporting</h2>
<p>Head back to the job configuration</p>
<ul>
<li>add a new <em>Execute shell</em> build step  to read:</li>
</ul>
<p><code>#!/bin/bash<br />
pylint --rcfile scripts/pylintrc -f parseable pygments &gt; pylint.txt<br />
echo "pylint complete"<br />
</code></p>
<ul>
<li>It&#8217;s important to start this with #!/bin/bash, and then end with the echo statement so that the return codes from pylint don&#8217;t get interpreted as a build failure (unless you want that&#8230; I don&#8217;t know about you, but I&#8217;m not pythonic enough to have a 100% pylint result.)</li>
<li>enable the checkbox <em>Report Violations</em></li>
<li>under pylint, use XML filename pattern of <em>**/pylint.txt</em></li>
</ul>
<div style="clear:both;">&#8230;</div>
<p><img class="alignleft size-medium wp-image-892" title="hudson13" src="http://www.rhonabwy.com/wp/wp-content/uploads/2009/11/hudson13-300x255.png" alt="hudson13" width="300" height="255" /></p>
<div style="clear:both;">&#8230;</div>
<ul>
<li>save the configuration and invoke &#8220;Build Now&#8221;</li>
</ul>
<p>So there you have it &#8211; a python project building under hudson with unit tests getting run, cobertura style coverage reports, and pylint style reporting.</p>
<ul></ul>
<div style="clear:both;">&#8230;</div>
<p><img class="alignleft size-medium wp-image-894" title="hudson15" src="http://www.rhonabwy.com/wp/wp-content/uploads/2009/11/hudson15-300x224.png" alt="hudson15" width="300" height="224" /></p>
]]></content:encoded>
			<wfw:commentRss>http://www.rhonabwy.com/wp/2009/11/04/setting-up-a-python-ci-server-with-hudson/feed/</wfw:commentRss>
		<slash:comments>15</slash:comments>
		</item>
		<item>
		<title>Knowing when to back off a project&#8230;</title>
		<link>http://www.rhonabwy.com/wp/2009/07/12/knowing-when-to-back-off-a-project/</link>
		<comments>http://www.rhonabwy.com/wp/2009/07/12/knowing-when-to-back-off-a-project/#comments</comments>
		<pubDate>Sun, 12 Jul 2009 22:55:50 +0000</pubDate>
		<dc:creator>Joe</dc:creator>
				<category><![CDATA[Geekstuff]]></category>
		<category><![CDATA[Ranting and Reflections]]></category>
		<category><![CDATA[django]]></category>

		<guid isPermaLink="false">http://www.rhonabwy.com/wp/?p=850</guid>
		<description><![CDATA[A couple of years ago I created the original code behind project Django Queue Service on a bet with myself at the O&#8217;Reilly Open Source Convention. A few months later I popped the whole thing up on Google Code hosting and made it an open source project. A couple of fellows joined me in hacking [...]]]></description>
			<content:encoded><![CDATA[<p>A couple of years ago I created the original code behind project <a href="http://django-queue-service.googlecode.com/">Django Queue Service</a> on a bet with myself at the <a href="http://en.oreilly.com/oscon2009">O&#8217;Reilly Open Source Convention</a>. A few months later I popped the whole thing up on Google Code hosting and made it an open source project. A couple of fellows joined me in hacking on the code base to move it forward a bit &#8211; and one in particular (<a href="https://www.ohloh.net/accounts/rajeshd">Rajesh</a>) did an amazing amount of work moving the whole thing forward.</p>
<p>While I had some good original ideas, I didn&#8217;t keep the project moving. And the project has been effectively abandoned from my head for the past 9 months. So today I&#8217;ve moved ownership of that project to Rajesh. I&#8217;ve left myself as a contributor &#8211; but I&#8217;ve found that unless I&#8217;m actively using the code myself, I&#8217;m not likely to do anything to contribute into the code base &#8211; and right now the Django based work I&#8217;m doing is all pretty external to needing any queues to get stuff done.</p>
<p>I think I likely should have handed the project off some time ago &#8211; I didn&#8217;t do it any favors by just lurking on the code and not promoting it. I didn&#8217;t hold up any patches either &#8211; I just didn&#8217;t make it move forward. I think the project&#8217;s in good hands and I&#8217;m looking forward to watching the &#8220;really simple queue&#8221; space to see where it continues to go. There are some interesting alternatives out there too &#8211; <a href="http://highscalability.com/product-gearman-open-source-message-queuing-system">Gearman</a>, <a href="http://ask.github.com/celery/introduction.html">Celery</a> (rides atop RabbitMQ), and <a href="http://xph.us/software/beanstalkd/">beanstalkd</a>.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.rhonabwy.com/wp/2009/07/12/knowing-when-to-back-off-a-project/feed/</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
		<item>
		<title>Django 1.0</title>
		<link>http://www.rhonabwy.com/wp/2008/09/03/django-10/</link>
		<comments>http://www.rhonabwy.com/wp/2008/09/03/django-10/#comments</comments>
		<pubDate>Thu, 04 Sep 2008 02:51:08 +0000</pubDate>
		<dc:creator>Joe</dc:creator>
				<category><![CDATA[Geekstuff]]></category>
		<category><![CDATA[django]]></category>

		<guid isPermaLink="false">http://www.rhonabwy.com/wp/?p=674</guid>
		<description><![CDATA[Congratulations to the entire development team and Django community for making the Django 1.0 release today! It&#8217;s a monumental accomplishment, and I&#8217;m very pleased to see it here.
I&#8217;m not as active in the community these days, but I&#8217;m still using the project on a regular basis as one of my &#8220;secret weapons&#8221; to get things [...]]]></description>
			<content:encoded><![CDATA[<p>Congratulations to the entire development team and Django community for making <a href="http://www.djangoproject.com/weblog/2008/sep/03/1/">the Django 1.0 release</a> today! It&#8217;s a monumental accomplishment, and I&#8217;m very pleased to see it here.</p>
<p>I&#8217;m not as active in the community these days, but I&#8217;m still using the project on a regular basis as one of my &#8220;secret weapons&#8221; to get things done quickly. It&#8217;s worth noting that there are some definite changes in the 1.0 release from even what&#8217;s in the various books now available for Django. If you&#8217;re heading in to the 1.0 release and can&#8217;t find something you expect to be there, make sure you check the <a href="http://docs.djangoproject.com/">online documentation</a> at <a href="http://docs.djangoproject.com/">http://docs.djangoproject.com/</a> &#8211; it&#8217;s very complete and very worthwhile.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.rhonabwy.com/wp/2008/09/03/django-10/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>LaunchPad</title>
		<link>http://www.rhonabwy.com/wp/2008/06/27/launchpad/</link>
		<comments>http://www.rhonabwy.com/wp/2008/06/27/launchpad/#comments</comments>
		<pubDate>Fri, 27 Jun 2008 23:28:00 +0000</pubDate>
		<dc:creator>Joe</dc:creator>
				<category><![CDATA[Geekstuff]]></category>
		<category><![CDATA[Ranting and Reflections]]></category>
		<category><![CDATA[django]]></category>

		<guid isPermaLink="false">http://www.rhonabwy.com/wp/?p=623</guid>
		<description><![CDATA[I signed up with Launchpad today &#8211; don&#8217;t know why I hadn&#8217;t really done it earlier, other than I just didn&#8217;t think to or have any projects that drove me there. The project du jour that lured me in was Graphite &#8211; a distributed high-performance monitoring solution written in python (and apparently using Django as [...]]]></description>
			<content:encoded><![CDATA[<p>I signed up with <a href="https://launchpad.net/">Launchpad</a> today &#8211; don&#8217;t know why I hadn&#8217;t really done it earlier, other than I just didn&#8217;t think to or have any projects that drove me there. The project du jour that lured me in was <a href="https://launchpad.net/graphite">Graphite</a> &#8211; a distributed high-performance monitoring solution written in <a href="http://www.python.org/">python</a> (and apparently using <a href="http://www.djangoproject.com/">Django</a> as well!).</p>
<p>(I haven&#8217;t tried Graphite yet, but the <a href="http://graphite.wikidot.com/screen-shots">screenshots</a> looked pretty nice &#8211; so I might be doing so to see what it&#8217;s all about.)</p>
<p>LaunchPad is Ubuntu/Canonical&#8217;s code hosting platform &#8211; similar to <a href="http://code.google.com/">Google Code</a> or <a href="http://www.sf.net">Sourceforge</a> in concept. They use <a href="http://bazaar-vcs.org/">Bzr</a> for their source control, which is a tad odd to me &#8211; I&#8217;m more in the <a href="http://www.selenic.com/mercurial/wiki/">mercurial</a> camp of any decentralized SCM &#8211; but their web site is really first class. They&#8217;ve got a nice system and setup &#8211; simple, somewhat bold iconography, obvious components to projects, and a clean look. As a place to encourage project and community participation, I admit that I was immediately drawn in. My own project (languishing at the moment) on Google Code (<a href="http://django-queue-service.googlecode.com/">django queue service</a>) has an interface that feels positively stark in contrast.</p>
<p>I&#8217;m not going to move anything over, but I suspect I will pay more attention to the LaunchPad setup going into the future.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.rhonabwy.com/wp/2008/06/27/launchpad/feed/</wfw:commentRss>
		<slash:comments>2</slash:comments>
		</item>
		<item>
		<title>Mondrian &amp; ReviewBoard</title>
		<link>http://www.rhonabwy.com/wp/2008/05/02/mondrian-reviewboard/</link>
		<comments>http://www.rhonabwy.com/wp/2008/05/02/mondrian-reviewboard/#comments</comments>
		<pubDate>Sat, 03 May 2008 03:30:57 +0000</pubDate>
		<dc:creator>Joe</dc:creator>
				<category><![CDATA[Geekstuff]]></category>
		<category><![CDATA[Ranting and Reflections]]></category>
		<category><![CDATA[django]]></category>

		<guid isPermaLink="false">http://www.rhonabwy.com/wp/?p=602</guid>
		<description><![CDATA[Word is that the a version of the code review tool that Google uses internally (called Mondrian) on the Google App Engine &#8211; called Code Review. I remember first seeing the Google tech talk on Mondrian and thinking that was pretty cool &#8211; then later hearing about ReviewBoard on the Django users mailing list. 
I&#8217;ve [...]]]></description>
			<content:encoded><![CDATA[<p><a href="http://radar.oreilly.com/archives/2008/05/mondrian-guido-google-app-engine.html">Word is that the a version of the code review tool that Google uses internally (called Mondrian) on the Google App Engine</a> &#8211; called <a href="http://codereview.appspot.com/">Code Review</a>. I remember first seeing the <a href="http://www.youtube.com/watch?v=sMql3Di4Kgc">Google tech talk on Mondrian</a> and thinking that was pretty cool &#8211; then later hearing about <a href="http://review-board.org/">ReviewBoard</a> on the Django users mailing list. </p>
<p>I&#8217;ve since starting using <a href="http://review-board.org/">ReviewBoard</a> (and even contributed a few bits back) and have been very pleased with it. I&#8217;m curious to dig into what <a href="http://codereview.appspot.com/">Code Review</a> offers in comparison, but I already know that I&#8217;ll continue using <a href="http://review-board.org/">ReviewBoard</a>. For one thing, my office wouldn&#8217;t take kindly to code and code reviews happening beyond the constrains of the fire wall. But I am seriously jazzed about <a href="http://codereview.appspot.com/">Code Review</a> in the hopes that it&#8217;s very easy to set up. If it&#8217;s an easy, low/no-cost solution for open source code&#8230; well, that&#8217;d be pretty damn cool. <a href="http://review-board.org/">ReviewBoard</a>, for all it&#8217;s goodness, can take some time and effort to completely install.</p>
<p><b>UPDATE:</b> Since I wrote about this, I found the Google project that Guido has used to make (and now share) CodeReview &#8211; the project is <a href="http://code.google.com/p/rietveld/">rietveld</a>. Guido mentions that it&#8217;s meant to showcase how to do a webapp using Django templating and views with the Google Application Engine.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.rhonabwy.com/wp/2008/05/02/mondrian-reviewboard/feed/</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
		<item>
		<title>Django and the Google AppEngine</title>
		<link>http://www.rhonabwy.com/wp/2008/04/07/django-and-the-google-appengine/</link>
		<comments>http://www.rhonabwy.com/wp/2008/04/07/django-and-the-google-appengine/#comments</comments>
		<pubDate>Tue, 08 Apr 2008 05:11:49 +0000</pubDate>
		<dc:creator>Joe</dc:creator>
				<category><![CDATA[Geekstuff]]></category>
		<category><![CDATA[django]]></category>

		<guid isPermaLink="false">http://www.rhonabwy.com/wp/2008/04/07/django-and-the-google-appengine/</guid>
		<description><![CDATA[I&#8217;m sure that anyone into Django will either see or hear about this before they catch my blog post, but it&#8217;s too neat a story not to write about a comment on.
Tonight, Google released AppEngine &#8211; an elastic computing environment specifically set up with the idea of developing web applications in python. They&#8217;ve pushed up [...]]]></description>
			<content:encoded><![CDATA[<p>I&#8217;m sure that anyone into Django will either see or hear about this before they catch my blog post, but it&#8217;s too neat a story not to write about a comment on.</p>
<p>Tonight, <a href="http://radar.oreilly.com/archives/2008/04/app-engine-host-your-python-apps-with-google.html">Google released AppEngine</a> &#8211; an elastic computing environment specifically set up with the idea of developing web applications in python. They&#8217;ve pushed up <a href="http://code.google.com/appengine/articles/cf1-text.html">a copy of the transcript from their announcement</a> if you&#8217;re interested&#8230;</p>
<p>It may come as no surprise that the back-end of AppEngine is/was heavily influenced by <a href="http://www.djangoproject.com/">Django</a> &#8211; and in fact the SDK that you can download comes with Django 0.96.1 embedded within it. That&#8217;s not to say Django is your only choice, but it definitely it mine.</p>
<p>To that end, there&#8217;s an excellent article up at their site on <a href="http://code.google.com/appengine/articles/django.html">using Django with AppEngine</a> &#8211; which basically boils down to: &#8220;Don&#8217;t use Django&#8217;s models, because we&#8217;ve got our own <a href="http://code.google.com/appengine/docs/datastore/">back-end datastore thingy</a>, and it works similarly, but from different, than Django&#8217;s models and a database. I haven&#8217;t looked at the HQL datastore API they&#8217;ve got enabled, but I&#8217;m going to guess that some Django core developers likely will before too long to see what the potential overlap is for making it more directly usable with Django&#8217;s model system. (That guess is PURE speculation, I don&#8217;t have any insider knowledge there)</p>
<p>I wasn&#8217;t speedy enough on the request to get into the initial pool of folks who can use the beta &#8211; but I&#8217;ve tacked into the waitling list. It&#8217;s not like I really need another cool technology to go spend a lot of time on, but I&#8217;m really curious&#8230; especially with the idea that hosting some amount of your application might be available for free. Not quite sure how <i><b>that</b></i> is going to make sense long term &#8211; but I&#8217;ll take it while it&#8217;s available.</p>
<p>One thing for sure &#8211; this is certainly going to bring a boon of new attention to python web development, and likely Django as well.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.rhonabwy.com/wp/2008/04/07/django-and-the-google-appengine/feed/</wfw:commentRss>
		<slash:comments>4</slash:comments>
		</item>
		<item>
		<title>getting ReviewBoard running</title>
		<link>http://www.rhonabwy.com/wp/2008/02/14/getting-reviewboard-running/</link>
		<comments>http://www.rhonabwy.com/wp/2008/02/14/getting-reviewboard-running/#comments</comments>
		<pubDate>Fri, 15 Feb 2008 01:00:53 +0000</pubDate>
		<dc:creator>Joe</dc:creator>
				<category><![CDATA[Geekstuff]]></category>
		<category><![CDATA[django]]></category>

		<guid isPermaLink="false">http://www.rhonabwy.com/wp/2008/02/14/getting-reviewboard-running/</guid>
		<description><![CDATA[I made some notes on getting Review Board up and running. I thought they might be useful for someone else wishing to do the same&#8230; I implemented review board on a virtual machine, with the VM running Ubuntu Gutsy. I highly recommend getting the basic setup from the GettingStarted page on the reviewboard project wiki.
Review [...]]]></description>
			<content:encoded><![CDATA[<p>I made some notes on getting <a href="http://review-board.org/">Review Board</a> up and running. I thought they might be useful for someone else wishing to do the same&#8230; I implemented review board on a virtual machine, with the VM running Ubuntu Gutsy. I highly recommend getting the basic setup from the <a href="http://code.google.com/p/reviewboard/wiki/GettingStarted">GettingStarted</a> page on the <a href="http://code.google.com/p/reviewboard/w/list">reviewboard project wiki</a>.</p>
<p>Review Board includes an automake setup solution, but I didn&#8217;t take advantage of it. Partly because I felt comfortable setting up a Django project without it, and partly because I didn&#8217;t clue in that it was there and I should use it until well after I&#8217;d begun fiddling with all this.</p>
<p>From those basics, here&#8217;s some additional tidbits</p>
<ol>
<li>get an instance of reviewboard running:</li>
<pre>
mysql -u root -p
 (enter password)
create database reviewboard;
GRANT ALL on reviewboard.* TO reviewboard@localhost IDENTIFIED BY "sup3rsekret"
</pre>
<li>set up settings_local.py to match:</li>
<pre>
# Database backend.  Any supported django database engine should work.
DATABASE_ENGINE = 'mysql'      # 'postgresql', 'mysql', 'sqlite3' or 'ado_mssql'.
DATABASE_NAME = 'reviewboard'  # Or path to database file if using sqlite3.
DATABASE_USER = 'reviewboard'     # Not used with sqlite3.
DATABASE_PASSWORD = 'sup3rsekret' # Not used with sqlite3.
DATABASE_HOST = ''             # Set to empty string for localhost.
DATABASE_PORT = ''             # Set to empty string for default.
</pre>
<li>initialize the database:</li>
<pre>
cd reviewboard
./manage.py syncdb
 (create an admin account when asked)
</pre>
<li>hook this whole thing up to Apache:</li>
<p>I configured my setup using the <a href="http://code.google.com/p/reviewboard/source/browse/trunk/reviewboard/contrib/conf/apache-modpython.conf.in">provided mod_python template</a> &#8211; the Makefile setup system seems to include provisioning it, but I did this all by hand. </p>
<p>Running as mod_python means that the account accessing perforce was &#8220;www-data&#8221; by default &#8211; a user that isn&#8217;t normally enabled in our Perforce repository. I worked around that issue by handing down additional perforce specific environment variables:</p>
<pre>
    SetEnv P4USER readonly-account
    SetEnv P4PORT p4.server.com:1666
    SetEnv P4CLIENT reviewboard
    SetEnv P4PASSWD xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
</pre>
<li>set up the initial data bits to use the service in our environment:</li>
<ul>
<li>use &#8220;python post-review -d&#8221; to find out what perforce is calling your repository.</li>
<li>Add that repository to the list of repositories in the Admin console of ReviewBoard</li>
<li>Add at least one &#8220;review group&#8221; in the Admin form as well</li>
</ul>
<li>Set up a .reviewboardrc for your tree</li>
<p>Place this at the root of your tree. Post-review starts in the current directory and scans upwards to find an instance of this file to know what to do&#8230;</p>

<div class="wp_syntax"><div class="code"><pre class="python" style="font-family:monospace;"><span style="color: #808080; font-style: italic;"># Default Review Board Server</span>
REVIEWBOARD_URL = <span style="color: #483d8b;">'http://10.0.0.25'</span>
&nbsp;
<span style="color: #808080; font-style: italic;"># Per-repository Review Board servers</span>
<span style="color: #808080; font-style: italic;"># TREES = {</span>
<span style="color: #808080; font-style: italic;">#    '/path/to/local/repo/checkout': {</span>
<span style="color: #808080; font-style: italic;">#         'REVIEWBOARD_URL': 'http://whatever' </span>
<span style="color: #808080; font-style: italic;">#    }</span>
<span style="color: #808080; font-style: italic;"># }</span></pre></div></div>

</ol>
<p>One other thing of note: post review is sensitive to the Diff Headers in trying to pull out the date. We were using an old version of diff and it had some real trouble with that. We updated to using diffutils 2.8.7 to resolve that.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.rhonabwy.com/wp/2008/02/14/getting-reviewboard-running/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Starting in with ReviewBoard</title>
		<link>http://www.rhonabwy.com/wp/2008/02/08/starting-in-with-reviewboard/</link>
		<comments>http://www.rhonabwy.com/wp/2008/02/08/starting-in-with-reviewboard/#comments</comments>
		<pubDate>Sat, 09 Feb 2008 07:55:48 +0000</pubDate>
		<dc:creator>Joe</dc:creator>
				<category><![CDATA[Geekstuff]]></category>
		<category><![CDATA[django]]></category>

		<guid isPermaLink="false">http://www.rhonabwy.com/wp/2008/02/08/starting-in-with-reviewboard/</guid>
		<description><![CDATA[I&#8217;ve been meaning to dive into the project ReviewBoard since I first heard about it, many months ago. I had first heard of a similar critter &#8211; Google&#8217;s internal tool called Mondrian. I was pretty darn excited about that tool when I heard about it, but Google&#8217;s not making any of it available. Instead some [...]]]></description>
			<content:encoded><![CDATA[<p>I&#8217;ve been meaning to dive into the project <a href="http://www.review-board.org/">ReviewBoard</a> since <a href="http://www.chipx86.com/blog/?p=222">I first heard about it</a>, many months ago. I had first heard of a similar critter &#8211; Google&#8217;s internal tool called <a href="http://video.google.com/videoplay?docid=-8502904076440714866">Mondrian</a>. I was pretty darn excited about that tool when I heard about it, but Google&#8217;s not making any of it available. Instead <a href="http://www.chipx86.com/blog/">some</a> of the <a href="http://david.navi.cx/blog/">fine staff</a> at <a href="http://www.vmware.com/products/ws/">VMware</a> (fine products that I use, even if they do seem a tad overly &#8216;proud&#8217; price wise of their enterprise server products&#8230;) made it available. More than made it available, actually &#8211; as they&#8217;re hosting it, developing it, working it, and making it real with Google&#8217;s <a href="http://code.google.com/p/reviewboard/">informal help with code hosting</a>.</p>
<p>I pulled down all the parts and pieces. Getting <a href="http://public.perforce.com/guest/robert_cowham/perforce/API/python/index.html#build">p4python</a> all set up was a bit of a trick, but the wiki had good hints in the right direction to get me rolling. Just spending a few hours with it, I found a few little quirks, and I&#8217;ll be adding more back into the project as I find things &#8211; might as well, if I&#8217;m debugging and fiddling to get things to work anyway, it seems only right to share it back with the community.</p>
<p>So the first thing to note is that getting a ReviewBoard instance set up isn&#8217;t really documented on the wiki as yet. <a href="http://code.google.com/p/reviewboard/wiki/GettingStarted">GettingStarted</a>, and <a href="http://code.google.com/p/reviewboard/wiki/UserBasics">UserBasics</a> gives some hints, but you&#8217;ll still need to read a little code to get it all happening.</p>
<p>Here&#8217;s what I&#8217;ve got for the first takeaways:</p>
<ol>
<li>To really use this tool (at least with Perforce), you&#8217;ll want to use a client like the provided script <a href="http://reviewboard.googlecode.com/svn/trunk/reviewboard/contrib/tools/post-review">post-review</a>. The script is pretty straightforward really &#8211; it does all the tedious work of creating a diff <i>prior</i> to checkin and shoving it up into the system.</li>
<li>post-review <a href="http://code.google.com/p/reviewboard/source/browse/trunk/reviewboard/contrib/tools/post-review#328">supports a config file mechanism</a>, but I don&#8217;t yet have that format really working for me. I suspect I&#8217;m doing something stupid, but it&#8217;ll take a little back-tracing to get a reasonable config set up yet.</li>
<li>Getting an instance of this thing rolling requires a few django-specific commands to get the environment seeded up. At a minimum, you&#8217;ll need to invoke &#8220;<code>./manage.py syncdb</code>&#8221; to get the database schemas all in place and rolling.</li>
<li>When you get the instance all rolling for the first time, you&#8217;ll need to set up an admin account and add a Review Group with an appropriate path. I suspect the subversion folks have this a touch easier than Perforce. With Perforce, the &#8220;path&#8221; that you enter needs to match the details that you&#8217;d otherwise get from running &#8220;<code>p4 info</code>&#8220;. When I first set things up, I didn&#8217;t realize that. The server name we use internally is different than the data presented in &#8220;<code>p4 info</code>&#8220;, so that took me a bit by surprise.</li>
<li>post-review also appears to be sensitive to the format of the output of running a diff. If your diff tool, for example, outputs it&#8217;s header data in the form of &#8220;Fri, Feb 8 14:23:52 2008&#8243; <a href="http://code.google.com/p/reviewboard/source/browse/trunk/reviewboard/contrib/tools/post-review#530">instead of &#8220;08/18/2008 14:23:52&#8243;</a>, you&#8217;re going to get a very confusing error.</li>
</ol>
<p>There&#8217;s more, I&#8217;m sure &#8211; but I had to deal with other tasks this afternoon, so I haven&#8217;t yet got the basics up and functional. I&#8217;ve at least <a href="http://code.google.com/p/reviewboard/issues/detail?id=399&#038;colspec=ID%20Type%20Status%20Priority%20Component%20Owner%20Summary%20Milestone">submitted a bug</a> that I was sure wasn&#8217;t just a quirk of my somewhat odd development environment. Something that looked like a re-factoring edge case that just hadn&#8217;t been caught yet. I included a patch to fix it &#8211; although to be honest, I&#8217;m wasn&#8217;t sure if I should be submitting that to a <a href="http://www.review-board.org/">ReviewBoard</a> instance someone or not, just I just shoved it into the bug.</p>
<p>I think one of the most impressive things about <a href="http://www.review-board.org/">ReviewBoard</a> is that it supports a nice mechanism, and some example scripts, for doing a pre-checkin review. I had naively assumed that I could only get the discussion/review aspects in a post-commit mechanism &#8211; without ever even really looking at the project. While I haven&#8217;t read the <a href="http://code.google.com/p/reviewboard/source/browse/trunk/reviewboard/contrib/tools/post-review">post-review</a> code in depth, it&#8217;s pretty clearly set up with the ReviewBoard server as something where a client could significantly help out with this work.</p>
<p>So it&#8217;s not smooth and super easy. Yet. To be fair, the devs don&#8217;t say it either, and they&#8217;ve got a wiki, issue tracker, and all the code available&#8230; so really its just a matter of time before I get it working to suit me. I&#8217;m really glad they&#8217;ve made this available at all, and I&#8217;m looking forward to seeing if I can really make it sing.</p>
<p><b>Update:</b> The answer is yes &#8211; <a href="http://code.google.com/p/reviewboard/issues/detail?id=399">you should submit updates and patches to the reviewboard</a> at <a href="http://reviews.review-board.org/">http://reviews.review-board.org/</a>.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.rhonabwy.com/wp/2008/02/08/starting-in-with-reviewboard/feed/</wfw:commentRss>
		<slash:comments>2</slash:comments>
		</item>
		<item>
		<title>Django on Ubuntu 7.10 (gutsy)</title>
		<link>http://www.rhonabwy.com/wp/2008/02/07/django-on-ubuntu-710-gutsy/</link>
		<comments>http://www.rhonabwy.com/wp/2008/02/07/django-on-ubuntu-710-gutsy/#comments</comments>
		<pubDate>Thu, 07 Feb 2008 23:33:07 +0000</pubDate>
		<dc:creator>Joe</dc:creator>
				<category><![CDATA[Geekstuff]]></category>
		<category><![CDATA[django]]></category>

		<guid isPermaLink="false">http://www.rhonabwy.com/wp/2008/02/07/django-on-ubuntu-710-gutsy/</guid>
		<description><![CDATA[I slapped together a virtual machine to try out an instance of ReviewBoard. It&#8217;s been a little while since I fiddled with Ubuntu, so I grabbed the latest server release(7.10) and set it up. Then I settled in to get all the various python pieces I&#8217;d need for django&#8230; On a lark, I tried

apt-cache search [...]]]></description>
			<content:encoded><![CDATA[<p>I slapped together a virtual machine to try out an instance of <a href="http://code.google.com/p/reviewboard/">ReviewBoard</a>. It&#8217;s been a little while since I fiddled with <a href="http://www.ubuntu.com/">Ubuntu</a>, so I grabbed the latest server release(7.10) and set it up. Then I settled in to get all the various python pieces I&#8217;d need for django&#8230; On a lark, I tried</p>

<div class="wp_syntax"><div class="code"><pre class="bash" style="font-family:monospace;"><span style="color: #c20cb9; font-weight: bold;">apt-cache</span> search django</pre></div></div>

<p>&#8230; and sure enough, it came back with a hit.</p>
<p>I had a development environment set up in minutes with the following:</p>

<div class="wp_syntax"><div class="code"><pre class="bash" style="font-family:monospace;"><span style="color: #c20cb9; font-weight: bold;">apt-get</span> update
<span style="color: #c20cb9; font-weight: bold;">apt-get</span> dist-upgrade
<span style="color: #666666; font-style: italic;"># dev environment</span>
<span style="color: #c20cb9; font-weight: bold;">apt-get</span> <span style="color: #c20cb9; font-weight: bold;">install</span> python-django python-pysqlite2 
<span style="color: #666666; font-style: italic;"># running with MySQL</span>
<span style="color: #c20cb9; font-weight: bold;">apt-get</span> <span style="color: #c20cb9; font-weight: bold;">install</span> python-mysqldb mysql-server-<span style="color: #000000;">5.0</span> mysql-server python-egenix-mxdatetime</pre></div></div>

<p>Nice!</p>
]]></content:encoded>
			<wfw:commentRss>http://www.rhonabwy.com/wp/2008/02/07/django-on-ubuntu-710-gutsy/feed/</wfw:commentRss>
		<slash:comments>3</slash:comments>
		</item>
		<item>
		<title>benchmarking Django Queue Service</title>
		<link>http://www.rhonabwy.com/wp/2007/11/11/benchmarking-django-queue-service/</link>
		<comments>http://www.rhonabwy.com/wp/2007/11/11/benchmarking-django-queue-service/#comments</comments>
		<pubDate>Sun, 11 Nov 2007 23:55:05 +0000</pubDate>
		<dc:creator>Joe</dc:creator>
				<category><![CDATA[Geekstuff]]></category>
		<category><![CDATA[Ranting and Reflections]]></category>
		<category><![CDATA[django]]></category>

		<guid isPermaLink="false">http://www.rhonabwy.com/wp/2007/11/11/benchmarking-django-queue-service/</guid>
		<description><![CDATA[I took some time this afternoon to benchmark out the work we&#8217;ve been doing with  the Django Queue Service. We haven&#8217;t done anything to optimize it, and we&#8217;re starting to push in some code to make it fully support REST verbs (as opposed to its current REST/RPC mixed style). Seemed like a good time [...]]]></description>
			<content:encoded><![CDATA[<p>I took some time this afternoon to benchmark out the work we&#8217;ve been doing with  the <a href="http://django-queue-service.googlecode.com/">Django Queue Service</a>. We haven&#8217;t done anything to optimize it, and we&#8217;re starting to push in some code to make it fully support REST verbs (as opposed to its current REST/RPC mixed style). Seemed like a good time to get some numbers down.</p>
<p>The results are all from my laptop &#8211; 2GHz Intel Core Duo, 2GB RAM. Running python 2.5 and the current trunk of Django (0.97-pre-SVN-6668).</p>
<p>The test ran through the timing for adding messages into the queue and getting/deleting messages from the queue, scaling the queue size from 0 to 25,000 items. The client that ran these tests was put together with <a href="http://code.google.com/p/httplib2/">httplib2, release 0.40</a> &#8211; running in python on the same machine. Yeah &#8211; so pretty much factor out network latency on this one&#8230;</p>
<p>The adding stayed a fairly consistent 8 ms, deviating around a bit &#8211; but mostly there.</p>
<p><img src="/pics/DQS_add.png" /></p>
<p>The combination of getting a message and deleting it (in our API, the functions are separate &#8211; so it means two calls back to the service) rose linearly with the size of the database. At a base level, it was running about 20 ms and by the time the database size was at 25,000 items the &#8220;get and delete&#8221; operations were taking roughly 165 ms.</p>
<p><img src="/pics/DQS_getdelete.png" /></p>
<p>For SQLite-on-disk database backend, I&#8217;m pretty pleased with those results.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.rhonabwy.com/wp/2007/11/11/benchmarking-django-queue-service/feed/</wfw:commentRss>
		<slash:comments>5</slash:comments>
		</item>
		<item>
		<title>Django Queue Service</title>
		<link>http://www.rhonabwy.com/wp/2007/11/03/django-queue-service-2/</link>
		<comments>http://www.rhonabwy.com/wp/2007/11/03/django-queue-service-2/#comments</comments>
		<pubDate>Sat, 03 Nov 2007 18:54:47 +0000</pubDate>
		<dc:creator>Joe</dc:creator>
				<category><![CDATA[Geekstuff]]></category>
		<category><![CDATA[Ranting and Reflections]]></category>
		<category><![CDATA[django]]></category>

		<guid isPermaLink="false">http://www.rhonabwy.com/wp/2007/11/03/django-queue-service-2/</guid>
		<description><![CDATA[Work has been continuing apace on the Django Queue Service, mostly through the efforts of Rajesh and Marcus who have really done an outstanding job of filling in the holes in testing and structure for the application to make it viable over the long term. We had some good conversations over email the other day [...]]]></description>
			<content:encoded><![CDATA[<p>Work has been continuing apace on the <a href="http://django-queue-service.googlecode.com/">Django Queue Service</a>, mostly through the efforts of Rajesh and Marcus who have really done an outstanding job of filling in the holes in testing and structure for the application to make it viable over the long term. We had some good conversations over email the other day (enough so that I set up a list for it: django-queue-service@googlegroups.com). I&#8217;ve been terrible about arranging anything on IRC &#8211; I know I should to really get us all talking on the same page.</p>
<p>Rajesh apparently picked up a copy of the book <a href="http://www.oreilly.com/catalog/9780596529260/">RESTful Web Services</a> (O&#8217;Reilly), and made a number of suggestions about future direction after reading the book. It really sounded like he got a lot out of the book, so I ordered a copy (through <a href="http://www.queenannebooks.com/">Queen Anne Ave Books</a> cause they&#8217;re cool and local). I should have picked it up Thursday evening, but I was being a slacker and only went by and got it this morning. Anyway, I was starting to read it walking home from the bookstore and I immediately spotted a small chapter/segment in there on doing REST services with Django! Apparently <a href="http://www.jacobian.org/">Jacob</a> helped out with a chapter in there, so there&#8217;s some interesting notes tucked away in Chapter 12 that I&#8217;m interested in getting to. </p>
<p>My knowledge is so scattershot (the trouble with being a technology generalist), that I think I&#8217;m going to take this book through from the start to make sure I catch up on those niggling little details that seem to slip the the cracks. I&#8217;m currently taking a break before seriously digging in to Chapter 2 (writing REST clients), and I&#8217;m glad to see a nice level of detail upcoming on how to actually get the various (what I&#8217;ll call obscure) HTTP verbs functioning from the clients. They have details on several languages, including libraries to use and example code &#8211; Ruby, Python, Java, JavaScript, C#, and so forth. It looks to be a good chapter.</p>
<p>For a long time, my reluctance to really get down to the &#8220;PUT&#8221; and &#8220;DELETE&#8221; verbs was because the libraries just didn&#8217;t easily support them &#8211; and I wasn&#8217;t sure what the &#8220;right way&#8221; of making them work should be. I&#8217;ve been pretty horrifically burned trying to learn the details needed to make some of the WS* bullshit specs work, and that translated pretty directly to a reluctance to learn the details of programmatically creating HTTP requests with the appropriate &#8220;verbing&#8221;. A blank spot, for sure &#8211; and one that I&#8217;m fixing now.</p>
<p>This project (the <a href="http://django-queue-service.googlecode.com/">Django Queue Service</a>) is mostly a &#8220;because I can&#8221; project. I&#8217;m not heavily using it in anything currently, although Rajesh and Marcus are &#8211; and I&#8217;ve heard a few other folks have apparently picked it up and run with implementations from it. I&#8217;m firmly of the opinion that the desktop and web-space cloud will continue to mix things up. A concept that Brent outlined in his <a href="http://inessential.com/?comments=1&#038;postid=3353">Hybrid Apps Presentation at C4</a> over the summer of 2006. (Better have a Mac if you want to see that presentation by the way &#8211; it&#8217;s a <a href="http://flyingmeat.com/voodoopad/">VoodooPad</a> document). I&#8217;ll be the very last to claim that desktop applications are dead &#8211; with the advent of libraries like <a href="http://sparkle.andymatuschak.org/">Sparkle</a> the distribution benefit of the web is just as easy made available to desktop apps as to web applications. And from my own experiences with browsers recently, coming up with fantastic UI functionality that works across browsers is an intense pain in the ass. Its getting better all the time but there are just some things you can&#8217;t do there in terms of interactivity and feedback that I&#8217;d really like to see and want to take advantage of. </p>
]]></content:encoded>
			<wfw:commentRss>http://www.rhonabwy.com/wp/2007/11/03/django-queue-service-2/feed/</wfw:commentRss>
		<slash:comments>4</slash:comments>
		</item>
		<item>
		<title>Django Buildbot</title>
		<link>http://www.rhonabwy.com/wp/2007/09/15/django-buildbot/</link>
		<comments>http://www.rhonabwy.com/wp/2007/09/15/django-buildbot/#comments</comments>
		<pubDate>Sun, 16 Sep 2007 06:22:16 +0000</pubDate>
		<dc:creator>Joe</dc:creator>
				<category><![CDATA[Geekstuff]]></category>
		<category><![CDATA[django]]></category>

		<guid isPermaLink="false">http://www.rhonabwy.com/wp/2007/09/15/django-buildbot/</guid>
		<description><![CDATA[Some very cool news &#8211; Django now has a public build site up (http://buildbot.djangoproject.com/)and running, matching the trunk and one of the branches against an assortment of versions of python and databases. Matt Croydon and I are going to be working together to work out the kinks and continue to drive the build environment forward.
All [...]]]></description>
			<content:encoded><![CDATA[<p>Some very cool news &#8211; Django now has a <a href="http://buildbot.djangoproject.com/">public build site</a> up (<a href="http://buildbot.djangoproject.com/">http://buildbot.djangoproject.com/</a>)and running, matching the trunk and one of the branches against an assortment of versions of python and databases. <a href="http://postneo.com/">Matt Croydon</a> and I are going to be working together to work out the kinks and continue to drive the build environment forward.</p>
<p>All props to <a href="http://postneo.com/">Matt</a> for the initial deployment and use during the <a href="http://code.djangoproject.com/wiki/Sprint14Sep">current sprint</a>. There&#8217;s still some bugs and kinks to work out of the system &#8211; and we&#8217;re going to be hammering those out as soon as the sprint it complete. Since Matt got it functional for the sprint, we didn&#8217;t want to mess with the configurations and start throwing false alarms while there was such dedicated forward progress going on.</p>
<p>Right now, we&#8217;ve got some base builds and tests running against Python 2.4 and 2.5 with Postgres and SQLite to pretty good effect. Still remaining are stable runs against MySQL, anything with Python 2.3 support, and more effective implementations to make it easier for us to support remote build slaves (Oracle? Windows? anyone?) and enable branches to get built a little more easily.</p>
<p>There is plenty to go, and we&#8217;re just getting kicking. I&#8217;m sure you&#8217;ll hear more as we get things nailed down and continue moving forward.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.rhonabwy.com/wp/2007/09/15/django-buildbot/feed/</wfw:commentRss>
		<slash:comments>2</slash:comments>
		</item>
		<item>
		<title>Nice Django/Dojo (Ajax toolkit) tutorial</title>
		<link>http://www.rhonabwy.com/wp/2007/09/05/nice-djangodojo-ajax-toolkit-tutorial/</link>
		<comments>http://www.rhonabwy.com/wp/2007/09/05/nice-djangodojo-ajax-toolkit-tutorial/#comments</comments>
		<pubDate>Thu, 06 Sep 2007 05:47:18 +0000</pubDate>
		<dc:creator>Joe</dc:creator>
				<category><![CDATA[Geekstuff]]></category>
		<category><![CDATA[django]]></category>

		<guid isPermaLink="false">http://www.rhonabwy.com/wp/2007/09/05/nice-djangodojo-ajax-toolkit-tutorial/</guid>
		<description><![CDATA[While out perusing bookmarks and randomly following links, I stumbled across a nice &#8220;from the beginning&#8221; Django tutorial that includes a little bit of Ajax with the Dojo Toolkit. There&#8217;s also a Part 2 to the example, and I think it&#8217;s particularly cool that the author went to the trouble of saving the steps as [...]]]></description>
			<content:encoded><![CDATA[<p>While out perusing bookmarks and randomly following links, I stumbled across <a href="http://www.kunxi.org/archives/2007/09/learning-django-by-example1-start-the-engine/">a nice &#8220;from the beginning&#8221; Django tutorial</a> that includes a little bit of Ajax with the Dojo Toolkit. There&#8217;s also a <a href="http://www.kunxi.org/archives/2007/09/learning-django-by-example2-show-me-your-data/">Part 2</a> to the example, and I think it&#8217;s particularly cool that the author went to the trouble of saving the steps as <a href="http://gelman.googlecode.com/svn/trunk/gelman/">specific revisions within google code</a> so you can &#8220;follow along&#8221; by checking out revisions.</p>
<p>Of course, this is assuming you&#8217;ve got a decent handle on how to check out a specific revision from Subversion. I&#8217;m not sure that always applies to folks looking for a from-the-start tutorial, but the idea is really cool. </p>
]]></content:encoded>
			<wfw:commentRss>http://www.rhonabwy.com/wp/2007/09/05/nice-djangodojo-ajax-toolkit-tutorial/feed/</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
		<item>
		<title>Django Queue Service</title>
		<link>http://www.rhonabwy.com/wp/2007/08/25/django-queue-service/</link>
		<comments>http://www.rhonabwy.com/wp/2007/08/25/django-queue-service/#comments</comments>
		<pubDate>Sun, 26 Aug 2007 06:15:08 +0000</pubDate>
		<dc:creator>Joe</dc:creator>
				<category><![CDATA[Geekstuff]]></category>
		<category><![CDATA[Ranting and Reflections]]></category>
		<category><![CDATA[django]]></category>

		<guid isPermaLink="false">http://www.rhonabwy.com/wp/2007/08/25/django-queue-service/</guid>
		<description><![CDATA[I know I&#8217;ve been quiet on the Django front for a while. Here&#8217;s something to make up for it. Without further ado, let me present to the world the Django Queue Service.
At OSCON 2007, I was hunting around for something to use to deal with background processing initiated from my web application. Not finding anything [...]]]></description>
			<content:encoded><![CDATA[<p>I know I&#8217;ve been quiet on the Django front for a while. Here&#8217;s something to make up for it. Without further ado, let me present to the world the <a href="http://django-queue-service.googlecode.com/">Django Queue Service</a>.</p>
<p>At <a href="http://conferences.oreillynet.com/os2007/">OSCON 2007</a>, I was hunting around for something to use to deal with background processing initiated from my web application. Not finding anything that I could immediately use and implement, I took it as a challenge to knock out something in the time I was there. The result is the <a href="http://django-queue-service.googlecode.com/">django queue service</a>.</p>
<p>It was later in the week (at the Django BOF) that I learned about <a href="http://code.sixapart.com/svn/TheSchwartz/">TheSchwartz</a> and <a href="http://danga.com/gearman/">Gearman</a>, which <a href="http://bradfitz.com/">Brad Fitzpatrick</a> is hacking away it to make a queue mechanism available for fellow Python and Ruby geeks.</p>
<p>At the time, I thought &#8220;I wonder if I can hack this out in a week&#8230;&#8221; Well, yes I could. I modeled the service after the REST API from the <a href="http://www.amazon.com/Simple-Queue-Service-home-page/b?ie=UTF8&#038;node=13584001">Amazon Simple Queue Service</a>, because that seemed both reasonable and effective. And I didn&#8217;t mind the idea of having my own Queue that (mostly) matched that API that I didn&#8217;t have to pay anything to use.</p>
<p>The project also contains from code from the <a href="http://www.cherrypy.org/">CherryPy project</a>. <a href="http://www.compoundthinking.com/blog/">Mark Ramm</a> (a really nice fellow, by the way) gave <a href="http://conferences.oreillynet.com/cs/os2007/view/e_sess/12717">a session at OSCON about WSGI servers</a> that was really intriguing. I&#8217;ve been looking for a &#8220;pure python&#8221; service to run Django with for a while, and after chatting a bit with him, thought I could probably make it happen with the CherryPy WSGI server. So I did. I have <a href="http://django-queue-service.googlecode.com/svn/trunk/server.py">a little piece of linkage code</a> that fires up the CherryPy WSGI server code and links it right on through into Django. I didn&#8217;t want to use the rest of CherryPy, so I nicked <a href="http://django-queue-service.googlecode.com/svn/trunk/wsgiserver/__init__.py">that code</a> and dropped it into this project as a nice reference and a handy way to run the queue.</p>
<p>I suppose this project could easily end here, and of course there was the &#8220;but I want to&#8230;&#8221; list of things that I had in mind to do before I released it into the world. Well &#8211; as they saying goes: &#8220;<a href="http://www.python.org/dev/peps/pep-0020/">Now is better than never.</a>&#8221; so out it goes.</p>
<p>If you are interested in getting involved with the project, sending me patches, or whatever &#8211; let me know. You can leave a comment here or use that spiffy <a href="http://code.google.com/p/django-queue-service/issues/list">Google Code Hosting issue tracker</a>. The project is functional, but not brilliant &#8211; an not entirely cleaned up in terms of its API. But enough excuses &#8211; <a href="http://django-queue-service.googlecode.com/">its there</a>, feel free to use it or not as you like, contribute or not as you like.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.rhonabwy.com/wp/2007/08/25/django-queue-service/feed/</wfw:commentRss>
		<slash:comments>3</slash:comments>
		</item>
		<item>
		<title>OSCON 2007</title>
		<link>http://www.rhonabwy.com/wp/2007/07/24/oscon-2007/</link>
		<comments>http://www.rhonabwy.com/wp/2007/07/24/oscon-2007/#comments</comments>
		<pubDate>Tue, 24 Jul 2007 16:52:20 +0000</pubDate>
		<dc:creator>Joe</dc:creator>
				<category><![CDATA[Geekstuff]]></category>
		<category><![CDATA[Ranting and Reflections]]></category>
		<category><![CDATA[django]]></category>

		<guid isPermaLink="false">http://www.rhonabwy.com/wp/2007/07/24/oscon-2007/</guid>
		<description><![CDATA[Day 1 of OSCON 2007 is done, and we&#8217;re working into Day 2 at this point. The afternoon tutorial &#8220;Django Master Class&#8221; was excellent, and the details of the talk are conveniently available on Jacob&#8217;s web site. Jeremy, Jacob, and Simon did a terrific job of it, and there was a lot of great tidbits [...]]]></description>
			<content:encoded><![CDATA[<p>Day 1 of OSCON 2007 is done, and we&#8217;re working into Day 2 at this point. The afternoon tutorial &#8220;Django Master Class&#8221; was excellent, and the details of the talk are conveniently available on <a href="http://toys.jacobian.org/presentations/2007/oscon/tutorial/">Jacob&#8217;s web site</a>. Jeremy, Jacob, and Simon did a terrific job of it, and there was a lot of great tidbits in there that I hadn&#8217;t seen earlier. Since when did the testing framework get so tremendously improved?! It&#8217;s really impressive!</p>
<p>I also got a chance to meet <a href="http://e-scribe.com/">Paul Bissex</a>, who wrote briefly about <a href="http://e-scribe.com/news/377">the first day of OSCO</a>. He&#8217;s in the Python WSGI session with me now.</p>
<p>Speaking of which, I&#8217;ve now learned about <a href="http://www.opensource4you.com/cgi-bin/gitweb.cgi">FAPWS</a> from <a href="http://william-os4y.livejournal.com/">William</a> (<a href="http://www.opensource4you.com/downloads/">downloads</a>) which was one of the WSGI servers mentioned, and apparently tested with Paul&#8217;s simple wiki code. It uses <a href="http://www.monkey.org/~dugsong/pyevent/">PyEvent</a> under the covers, and apparently achieves some very nice performance characteristics.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.rhonabwy.com/wp/2007/07/24/oscon-2007/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
	</channel>
</rss>
