<?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/"
	xmlns:georss="http://www.georss.org/georss" xmlns:geo="http://www.w3.org/2003/01/geo/wgs84_pos#" xmlns:media="http://search.yahoo.com/mrss/"
	>

<channel>
	<title>Pycruft Blog</title>
	<atom:link href="http://pycruft.wordpress.com/feed/" rel="self" type="application/rss+xml" />
	<link>http://pycruft.wordpress.com</link>
	<description>Meandering through a codified whimsy</description>
	<lastBuildDate>Mon, 21 Feb 2011 10:19:09 +0000</lastBuildDate>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
	<generator>http://wordpress.com/</generator>
<cloud domain='pycruft.wordpress.com' port='80' path='/?rsscloud=notify' registerProcedure='' protocol='http-post' />
<image>
		<url>http://0.gravatar.com/blavatar/e4664f9d9d04062efebc8555657e40f0?s=96&#038;d=http%3A%2F%2Fs2.wp.com%2Fi%2Fbuttonw-com.png</url>
		<title>Pycruft Blog</title>
		<link>http://pycruft.wordpress.com</link>
	</image>
	<atom:link rel="search" type="application/opensearchdescription+xml" href="http://pycruft.wordpress.com/osd.xml" title="Pycruft Blog" />
	<atom:link rel='hub' href='http://pycruft.wordpress.com/?pushpress=hub'/>
		<item>
		<title>Python 3.2 Is Released</title>
		<link>http://pycruft.wordpress.com/2011/02/21/python-3-2-is-released/</link>
		<comments>http://pycruft.wordpress.com/2011/02/21/python-3-2-is-released/#comments</comments>
		<pubDate>Mon, 21 Feb 2011 10:15:28 +0000</pubDate>
		<dc:creator>pycruft</dc:creator>
				<category><![CDATA[Uncategorized]]></category>
		<category><![CDATA[Python]]></category>

		<guid isPermaLink="false">http://pycruft.wordpress.com/?p=122</guid>
		<description><![CDATA[Python 3.2 is released. That is all. Except that I neglected to highlight the release of the 1.2.5 &#38; 1.1.4 security patches for Django a couple of weeks ago. Tsk. Slack. &#160;<img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=pycruft.wordpress.com&amp;blog=13782223&amp;post=122&amp;subd=pycruft&amp;ref=&amp;feed=1" width="1" height="1" />]]></description>
			<content:encoded><![CDATA[<p><a href="http://www.python.org/download/releases/3.2/">Python 3.2 is released</a>. That is all.</p>
<p>Except that I neglected to highlight the release of the <a href="http://www.djangoproject.com/weblog/2011/feb/08/security/">1.2.5 &amp; 1.1.4 security patches</a> for Django a couple of weeks ago. Tsk. Slack.</p>
<p>&nbsp;</p>
<br />  <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gocomments/pycruft.wordpress.com/122/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/comments/pycruft.wordpress.com/122/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godelicious/pycruft.wordpress.com/122/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/delicious/pycruft.wordpress.com/122/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gofacebook/pycruft.wordpress.com/122/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/facebook/pycruft.wordpress.com/122/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gotwitter/pycruft.wordpress.com/122/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/twitter/pycruft.wordpress.com/122/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gostumble/pycruft.wordpress.com/122/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/stumble/pycruft.wordpress.com/122/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godigg/pycruft.wordpress.com/122/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/digg/pycruft.wordpress.com/122/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/goreddit/pycruft.wordpress.com/122/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/reddit/pycruft.wordpress.com/122/" /></a> <img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=pycruft.wordpress.com&amp;blog=13782223&amp;post=122&amp;subd=pycruft&amp;ref=&amp;feed=1" width="1" height="1" />]]></content:encoded>
			<wfw:commentRss>http://pycruft.wordpress.com/2011/02/21/python-3-2-is-released/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
	
		<media:content url="http://0.gravatar.com/avatar/4a839932df915d7850d6a2b58dd2d32d?s=96&#38;d=identicon&#38;r=G" medium="image">
			<media:title type="html">pycruft</media:title>
		</media:content>
	</item>
		<item>
		<title>udev ate my hamster</title>
		<link>http://pycruft.wordpress.com/2010/09/21/udev-ate-my-hamster/</link>
		<comments>http://pycruft.wordpress.com/2010/09/21/udev-ate-my-hamster/#comments</comments>
		<pubDate>Tue, 21 Sep 2010 14:19:25 +0000</pubDate>
		<dc:creator>pycruft</dc:creator>
				<category><![CDATA[Uncategorized]]></category>
		<category><![CDATA[linux]]></category>
		<category><![CDATA[sysadmin]]></category>
		<category><![CDATA[ubuntu]]></category>

		<guid isPermaLink="false">http://pycruft.wordpress.com/?p=118</guid>
		<description><![CDATA[I upgraded one of my elderly and somewhat unloved Ubuntu boxes recently and on reboot the new kernel (2.6.32-24) failed to boot complaining that udev wasn&#8217;t configured. I have no idea what udev is. Hmmm. It was late. What to &#8230; <a href="http://pycruft.wordpress.com/2010/09/21/udev-ate-my-hamster/">Continue reading <span class="meta-nav">&#8594;</span></a><img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=pycruft.wordpress.com&amp;blog=13782223&amp;post=118&amp;subd=pycruft&amp;ref=&amp;feed=1" width="1" height="1" />]]></description>
			<content:encoded><![CDATA[<p>I upgraded one of my elderly and somewhat unloved <a href="http://www.ubuntu.com/">Ubuntu</a> boxes recently and on reboot the new kernel (2.6.32-24) failed to boot complaining that <a href="http://en.wikipedia.org/wiki/Udev">udev</a> wasn&#8217;t configured. I have no idea what udev is.</p>
<p>Hmmm. It was late. What to do? Yes, emulate the best, most dedicated sysadmins! I went to bed and forgot about it for a few days.</p>
<p>Eventually I decided I ought to actually go and &#8230; you know &#8230; <em>fix</em> it. Or at least put the error message into Google and see what came back. Google tells me that udev isn&#8217;t configured, probably because the install actually didn&#8217;t complete properly.</p>
<p>One of the lovely things about Linux and especially the <a href="http://en.wikipedia.org/wiki/Advanced_Packaging_Tool">apt</a> (<a href="http://www.debian.org/">Debian</a>) based distros like Ubuntu is that several previous kernel versions are usually readily available to boot into. So I boot into a previous version and run <strong>dpkg -a &#8211;configure</strong>. Doesn&#8217;t work. Pants.</p>
<p>Try a system update. Also doesn&#8217;t work. Also Pants.</p>
<p>Use <a href="http://en.wikipedia.org/wiki/Aptitude_%28software%29">aptitude</a> to reinstall udev. Also doesn&#8217;t work.</p>
<p>Ponder and cogitate on the problem.</p>
<p>Interestingly at around this point I finally notice that I&#8217;ve not been booting into a previous kernel version exactly as I&#8217;d meant to, but without paying enough attention into <em>image-2.6.32-24-generic</em> rather than <em>image-2.6.32-24-386</em> (the default). Light slowly dawns and I use aptitude to reinstall the <em>-386</em> version.</p>
<p><strong>sudo aptitude reinstall linux-image-2.6.32-24-386</strong></p>
<p>And bob&#8217;s yer uncle: all back working again.</p>
<br />  <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gocomments/pycruft.wordpress.com/118/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/comments/pycruft.wordpress.com/118/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godelicious/pycruft.wordpress.com/118/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/delicious/pycruft.wordpress.com/118/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gofacebook/pycruft.wordpress.com/118/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/facebook/pycruft.wordpress.com/118/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gotwitter/pycruft.wordpress.com/118/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/twitter/pycruft.wordpress.com/118/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gostumble/pycruft.wordpress.com/118/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/stumble/pycruft.wordpress.com/118/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godigg/pycruft.wordpress.com/118/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/digg/pycruft.wordpress.com/118/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/goreddit/pycruft.wordpress.com/118/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/reddit/pycruft.wordpress.com/118/" /></a> <img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=pycruft.wordpress.com&amp;blog=13782223&amp;post=118&amp;subd=pycruft&amp;ref=&amp;feed=1" width="1" height="1" />]]></content:encoded>
			<wfw:commentRss>http://pycruft.wordpress.com/2010/09/21/udev-ate-my-hamster/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
	
		<media:content url="http://0.gravatar.com/avatar/4a839932df915d7850d6a2b58dd2d32d?s=96&#38;d=identicon&#38;r=G" medium="image">
			<media:title type="html">pycruft</media:title>
		</media:content>
	</item>
		<item>
		<title>Django 1.2.3 released</title>
		<link>http://pycruft.wordpress.com/2010/09/13/django-1-2-3-released/</link>
		<comments>http://pycruft.wordpress.com/2010/09/13/django-1-2-3-released/#comments</comments>
		<pubDate>Mon, 13 Sep 2010 09:21:01 +0000</pubDate>
		<dc:creator>pycruft</dc:creator>
				<category><![CDATA[Uncategorized]]></category>
		<category><![CDATA[Django]]></category>

		<guid isPermaLink="false">http://pycruft.wordpress.com/?p=116</guid>
		<description><![CDATA[Only two days after the 1.2.2 Security Patch comes a 1.2.3 Release.<img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=pycruft.wordpress.com&amp;blog=13782223&amp;post=116&amp;subd=pycruft&amp;ref=&amp;feed=1" width="1" height="1" />]]></description>
			<content:encoded><![CDATA[<p>Only two days after the 1.2.2 Security Patch comes a <a href="http://www.djangoproject.com/weblog/2010/sep/10/123/">1.2.3 Release</a>.</p>
<br />  <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gocomments/pycruft.wordpress.com/116/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/comments/pycruft.wordpress.com/116/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godelicious/pycruft.wordpress.com/116/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/delicious/pycruft.wordpress.com/116/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gofacebook/pycruft.wordpress.com/116/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/facebook/pycruft.wordpress.com/116/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gotwitter/pycruft.wordpress.com/116/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/twitter/pycruft.wordpress.com/116/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gostumble/pycruft.wordpress.com/116/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/stumble/pycruft.wordpress.com/116/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godigg/pycruft.wordpress.com/116/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/digg/pycruft.wordpress.com/116/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/goreddit/pycruft.wordpress.com/116/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/reddit/pycruft.wordpress.com/116/" /></a> <img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=pycruft.wordpress.com&amp;blog=13782223&amp;post=116&amp;subd=pycruft&amp;ref=&amp;feed=1" width="1" height="1" />]]></content:encoded>
			<wfw:commentRss>http://pycruft.wordpress.com/2010/09/13/django-1-2-3-released/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
	
		<media:content url="http://0.gravatar.com/avatar/4a839932df915d7850d6a2b58dd2d32d?s=96&#38;d=identicon&#38;r=G" medium="image">
			<media:title type="html">pycruft</media:title>
		</media:content>
	</item>
		<item>
		<title>Django 1.2.2 Security release</title>
		<link>http://pycruft.wordpress.com/2010/09/10/django-1-2-2-security-release/</link>
		<comments>http://pycruft.wordpress.com/2010/09/10/django-1-2-2-security-release/#comments</comments>
		<pubDate>Fri, 10 Sep 2010 11:44:55 +0000</pubDate>
		<dc:creator>pycruft</dc:creator>
				<category><![CDATA[Uncategorized]]></category>
		<category><![CDATA[Django]]></category>

		<guid isPermaLink="false">http://pycruft.wordpress.com/?p=112</guid>
		<description><![CDATA[The Django team have put out a security fix of 1.2. See their blog post. (download).<img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=pycruft.wordpress.com&amp;blog=13782223&amp;post=112&amp;subd=pycruft&amp;ref=&amp;feed=1" width="1" height="1" />]]></description>
			<content:encoded><![CDATA[<p>The Django team have put out a security fix of 1.2. See <a href="http://www.djangoproject.com/weblog/2010/sep/08/security-release/">their blog post</a>.</p>
<p>(<a href="http://www.djangoproject.com/download/">download</a>).</p>
<br />  <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gocomments/pycruft.wordpress.com/112/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/comments/pycruft.wordpress.com/112/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godelicious/pycruft.wordpress.com/112/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/delicious/pycruft.wordpress.com/112/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gofacebook/pycruft.wordpress.com/112/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/facebook/pycruft.wordpress.com/112/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gotwitter/pycruft.wordpress.com/112/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/twitter/pycruft.wordpress.com/112/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gostumble/pycruft.wordpress.com/112/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/stumble/pycruft.wordpress.com/112/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godigg/pycruft.wordpress.com/112/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/digg/pycruft.wordpress.com/112/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/goreddit/pycruft.wordpress.com/112/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/reddit/pycruft.wordpress.com/112/" /></a> <img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=pycruft.wordpress.com&amp;blog=13782223&amp;post=112&amp;subd=pycruft&amp;ref=&amp;feed=1" width="1" height="1" />]]></content:encoded>
			<wfw:commentRss>http://pycruft.wordpress.com/2010/09/10/django-1-2-2-security-release/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
	
		<media:content url="http://0.gravatar.com/avatar/4a839932df915d7850d6a2b58dd2d32d?s=96&#38;d=identicon&#38;r=G" medium="image">
			<media:title type="html">pycruft</media:title>
		</media:content>
	</item>
		<item>
		<title>Should developers have access to Production?</title>
		<link>http://pycruft.wordpress.com/2010/08/04/should-developers-have-access-to-production/</link>
		<comments>http://pycruft.wordpress.com/2010/08/04/should-developers-have-access-to-production/#comments</comments>
		<pubDate>Wed, 04 Aug 2010 22:09:16 +0000</pubDate>
		<dc:creator>pycruft</dc:creator>
				<category><![CDATA[Uncategorized]]></category>
		<category><![CDATA[deployment]]></category>
		<category><![CDATA[sysadmin]]></category>
		<category><![CDATA[test]]></category>
		<category><![CDATA[website]]></category>

		<guid isPermaLink="false">http://pycruft.wordpress.com/?p=101</guid>
		<description><![CDATA[There&#8217;s an interesting blog post over on ServerFault at the moment: Should Developers have Access to Production? The argument presented is that sysadmins should deploy and manage production websites rather than developers, and it&#8217;s a fairly convincing argument. I&#8217;ve recently &#8230; <a href="http://pycruft.wordpress.com/2010/08/04/should-developers-have-access-to-production/">Continue reading <span class="meta-nav">&#8594;</span></a><img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=pycruft.wordpress.com&amp;blog=13782223&amp;post=101&amp;subd=pycruft&amp;ref=&amp;feed=1" width="1" height="1" />]]></description>
			<content:encoded><![CDATA[<p>There&#8217;s an interesting blog post over on <a href="http://serverfault.com/">ServerFault</a> at the moment: <a href="http://blog.serverfault.com/post/893001713/should-developers-have-access-to-production">Should Developers have Access to Production?</a></p>
<p>The argument presented is that sysadmins should deploy and manage  production websites rather than developers, and it&#8217;s a fairly convincing  argument.</p>
<p>I&#8217;ve recently started a new job and the company I&#8217;ve  joined has a slightly different take on things which I think is an  interesting additional angle to bring to the question.</p>
<p>The developers will have a keen understanding of the system being deployed, where its boundaries are, how things need to be configured and why. Sysadmins will have broader experience building and monitoring production systems in general, will be responsible for the rest of the installed software and appreciation of how systems need to be managed once they&#8217;re exposed to the real world.</p>
<p>There is a third group, however. Testers.</p>
<p>Test Engineers have a foot in both camps &#8211; they need to be technical enough to pull the code apart, inspect it, provoke it and generally stress it. They know about settings machines up and managing them since it will be likely that&#8217;s a regular feature of their day. They also already have responsibility for signing off the code as ready to be seen externally. (Arguably they &#8216;own&#8217; the system at that point).</p>
<p>Of course there&#8217;s an unspoken assumption that I&#8217;m making, here: that Test is a first-class function of the workflow and not, as is usually the case, the unpopular cousin who has to be invited but whom everyone secretly hopes can&#8217;t make it this time.</p>
<p>It&#8217;s interesting to work in an environment where Test Engineers are given a first-class role alongside everyone else, involved in projects from day #1. Responsible for advising and supporting developers, observing the system as it&#8217;s developed and through out into the live environment. The place I now work has testers in every team and attempts to have a 1:1 balance of coders and testers. That&#8217;s in rather stark contrast to most places I&#8217;ve worked where a handful of overworked testers get dragged onto a project at the last minute to run through as much testing as they can before the immovable shipping deadline rolls over them.</p>
<p>As a developer I quite like this scenario &#8211; I&#8217;m relatively close to test &amp; therefore production, but there&#8217;s a strong level of sanity checking before I&#8217;m allowed to monkey around with a live system (not that I would ever monkey around with a live system, you understand!).</p>
<p>I&#8217;m not sure there&#8217;s a right answer for any <em>one </em>organisation, let alone <em>every </em>organisation, but I do think there are more than two options on the table and it&#8217;s interesting to explore them all.</p>
<br />  <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gocomments/pycruft.wordpress.com/101/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/comments/pycruft.wordpress.com/101/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godelicious/pycruft.wordpress.com/101/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/delicious/pycruft.wordpress.com/101/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gofacebook/pycruft.wordpress.com/101/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/facebook/pycruft.wordpress.com/101/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gotwitter/pycruft.wordpress.com/101/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/twitter/pycruft.wordpress.com/101/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gostumble/pycruft.wordpress.com/101/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/stumble/pycruft.wordpress.com/101/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godigg/pycruft.wordpress.com/101/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/digg/pycruft.wordpress.com/101/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/goreddit/pycruft.wordpress.com/101/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/reddit/pycruft.wordpress.com/101/" /></a> <img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=pycruft.wordpress.com&amp;blog=13782223&amp;post=101&amp;subd=pycruft&amp;ref=&amp;feed=1" width="1" height="1" />]]></content:encoded>
			<wfw:commentRss>http://pycruft.wordpress.com/2010/08/04/should-developers-have-access-to-production/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
	
		<media:content url="http://0.gravatar.com/avatar/4a839932df915d7850d6a2b58dd2d32d?s=96&#38;d=identicon&#38;r=G" medium="image">
			<media:title type="html">pycruft</media:title>
		</media:content>
	</item>
		<item>
		<title>Why is my auth backend silently failing?</title>
		<link>http://pycruft.wordpress.com/2010/06/23/auth_backend_failing/</link>
		<comments>http://pycruft.wordpress.com/2010/06/23/auth_backend_failing/#comments</comments>
		<pubDate>Wed, 23 Jun 2010 22:24:44 +0000</pubDate>
		<dc:creator>pycruft</dc:creator>
				<category><![CDATA[Uncategorized]]></category>
		<category><![CDATA[Django]]></category>
		<category><![CDATA[Python]]></category>

		<guid isPermaLink="false">http://pycruft.wordpress.com/?p=74</guid>
		<description><![CDATA[Investigating why my custom authentication backend was silently failing  <a href="http://pycruft.wordpress.com/2010/06/23/auth_backend_failing/">Continue reading <span class="meta-nav">&#8594;</span></a><img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=pycruft.wordpress.com&amp;blog=13782223&amp;post=74&amp;subd=pycruft&amp;ref=&amp;feed=1" width="1" height="1" />]]></description>
			<content:encoded><![CDATA[<p>Having written my own Django <a href="http://docs.djangoproject.com/en/1.2/topics/auth/#writing-an-authentication-backend">authentication backend</a>, I was tripped up recently by the way it was handled when I introduced a bug.</p>
<p>While testing my auth procedure, I kept seeing a NotImplementedError exception being thrown in my view.</p>
<blockquote><p>login(request, user) &#8230;</p>
<p>django\contrib\auth\__init__.py in  login<br />
user.save() &#8230;</p>
<p>django\contrib\auth\models.py in save<br />
raise  NotImplementedError</p></blockquote>
<p>Which confused me a bit, but I had a strong suspicion this was because my user, returned from django.contrib.auth.authenticate(), was an <a href="http://docs.djangoproject.com/en/1.2/topics/auth/#anonymous-users">AnonymousUser</a> object rather than a proper user (something the docs confirmed).</p>
<p>However, my initial debugging implied that my authenticate() method was at least being called, and was passing the initial checks, so was executing the code I was expecting. Where was this coming from? If my method was being called why wasn&#8217;t it either throwing an Exception or returning a valid user? There wasn&#8217;t actually a path which could return &#8216;None&#8217; &#8211; which should have been the only way to generate that AnonymousUser.</p>
<p>After adding much logging and poking about in the code, I discovered a simple typo in my backend:</p>
<pre class="brush: python;">
user = User.objects.create_user(nickname)
</pre>
<p>create_user takes two arguments (nickname and email), not one.</p>
<p>Ok, bug fixed and everything starts working. But this is odd. Why no exception?</p>
<p>The answer to that lies with <a href="http://code.djangoproject.com/browser/django/trunk/django/contrib/auth">django.contrib.auth</a>&#8216;s <a href="http://code.djangoproject.com/browser/django/trunk/django/contrib/auth/__init__.py#L44">authenticate</a>() function which I shall reproduce here.</p>
<pre class="brush: python;">
def authenticate(**credentials):
    &quot;&quot;&quot;
    If the given credentials are valid, return a User object.
    &quot;&quot;&quot;
    for backend in get_backends():
        try:
            user = backend.authenticate(**credentials)
        except TypeError:
            # This backend doesn't accept these credentials as arguments. Try the next one.
            continue
        if user is None:
            continue
        # Annotate the user object with the path of the backend.
        user.backend = &quot;%s.%s&quot; % (backend.__module__, backend.__class__.__name__)
        return user
</pre>
<p>Notice the try/except &#8230; it specifically catches <a href="http://docs.python.org/library/exceptions.html#exceptions.TypeError">TypeError</a>.</p>
<p>And what gets thrown when a function is called with too few arguments?</p>
<pre class="brush: python;">
&gt;&gt;&gt; def fun(a,b):
	pass

&gt;&gt;&gt; fun(1)

Traceback (most recent call last):
  File &quot;&lt;pyshell#64&gt;&quot;, line 1, in &lt;module&gt;
    fun(1)
TypeError: fun() takes exactly 2 arguments (1 given)
</pre>
<p>Ah yes, a TypeError.</p>
<p>Indeed that is exactly <em>why</em> TypeError is being caught, of course: because we want to skip over calls to authenticate() methods which don&#8217;t take the arguments we&#8217;ve been given.</p>
<p>My code just happened to be buggy in exactly the way that authenticate() would hide!</p>
<br />  <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gocomments/pycruft.wordpress.com/74/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/comments/pycruft.wordpress.com/74/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godelicious/pycruft.wordpress.com/74/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/delicious/pycruft.wordpress.com/74/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gofacebook/pycruft.wordpress.com/74/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/facebook/pycruft.wordpress.com/74/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gotwitter/pycruft.wordpress.com/74/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/twitter/pycruft.wordpress.com/74/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gostumble/pycruft.wordpress.com/74/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/stumble/pycruft.wordpress.com/74/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godigg/pycruft.wordpress.com/74/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/digg/pycruft.wordpress.com/74/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/goreddit/pycruft.wordpress.com/74/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/reddit/pycruft.wordpress.com/74/" /></a> <img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=pycruft.wordpress.com&amp;blog=13782223&amp;post=74&amp;subd=pycruft&amp;ref=&amp;feed=1" width="1" height="1" />]]></content:encoded>
			<wfw:commentRss>http://pycruft.wordpress.com/2010/06/23/auth_backend_failing/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
	
		<media:content url="http://0.gravatar.com/avatar/4a839932df915d7850d6a2b58dd2d32d?s=96&#38;d=identicon&#38;r=G" medium="image">
			<media:title type="html">pycruft</media:title>
		</media:content>
	</item>
		<item>
		<title>Today I stumbled upon Django-Registration</title>
		<link>http://pycruft.wordpress.com/2010/06/18/django-registration/</link>
		<comments>http://pycruft.wordpress.com/2010/06/18/django-registration/#comments</comments>
		<pubDate>Fri, 18 Jun 2010 21:06:41 +0000</pubDate>
		<dc:creator>pycruft</dc:creator>
				<category><![CDATA[Uncategorized]]></category>
		<category><![CDATA[Django]]></category>
		<category><![CDATA[Python]]></category>

		<guid isPermaLink="false">http://pycruft.wordpress.com/?p=69</guid>
		<description><![CDATA[Django-Registration is a tool built by James Bennett who wrote some thoughts about it in this blog post (and has some very interesting thoughts on WSGI, too). It looks very flexible and has a sister project Django-Profiles to handle user &#8230; <a href="http://pycruft.wordpress.com/2010/06/18/django-registration/">Continue reading <span class="meta-nav">&#8594;</span></a><img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=pycruft.wordpress.com&amp;blog=13782223&amp;post=69&amp;subd=pycruft&amp;ref=&amp;feed=1" width="1" height="1" />]]></description>
			<content:encoded><![CDATA[<p><a href="http://bitbucket.org/ubernostrum/django-registration/wiki/Home">Django-Registration</a> is a tool built by <a href="http://www.b-list.org/">James Bennett</a> who wrote some thoughts about it in <a href="http://www.b-list.org/weblog/2009/oct/14/registration/">this blog post</a> (and has some very interesting thoughts on <a href="http://www.b-list.org/weblog/2009/aug/10/wsgi/">WSGI</a>, too). It looks very flexible and has a sister project <a href="http://www.bitbucket.org/ubernostrum/django-profiles/wiki/Home">Django-Profiles</a> to handle user profile info.</p>
<p>As these things always seem to happen, I&#8217;ve stumbled upon it half way through my user handling development and when I seem to have no time to investigate new libraries and tools. Of course what I want to do doesn&#8217;t align perfectly with Django-Registration&#8217;s default config so it&#8217;ll need some hacking about, probably some integration with <a href="http://github.com/openid/python-openid">OpenId</a>, <a href="http://github.com/simplegeo/python-oauth2">Oauth</a> and possibly Google&#8217;s <a href="http://code.google.com/appengine/docs/python/users/">user API</a>.</p>
<p>So, yet again I&#8217;ve got that decision to make: do I spend time looking at a new, likely more solid approach using someone else&#8217;s older, more robust code, possibly to find it doesn&#8217;t work at all. Or do I plough on, head down and write my own implementation which will definitely do what I want, but probably be pretty rough and shoddy at least in the early iterations.</p>
<p>Am thinking that I&#8217;ll definitely need to invest some time investigating Django-Registration, even if it&#8217;s just to learn about someone else&#8217;s approach &amp; tools.</p>
<p>Reading James&#8217;s blog has also pointed me towards <a href="http://lucumr.pocoo.org/">Armin Ronacher&#8217;s</a> blog which looks well worth a read.Lucky I have so much time on my hands. Oh. Damn.</p>
<br />  <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gocomments/pycruft.wordpress.com/69/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/comments/pycruft.wordpress.com/69/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godelicious/pycruft.wordpress.com/69/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/delicious/pycruft.wordpress.com/69/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gofacebook/pycruft.wordpress.com/69/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/facebook/pycruft.wordpress.com/69/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gotwitter/pycruft.wordpress.com/69/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/twitter/pycruft.wordpress.com/69/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gostumble/pycruft.wordpress.com/69/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/stumble/pycruft.wordpress.com/69/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godigg/pycruft.wordpress.com/69/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/digg/pycruft.wordpress.com/69/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/goreddit/pycruft.wordpress.com/69/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/reddit/pycruft.wordpress.com/69/" /></a> <img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=pycruft.wordpress.com&amp;blog=13782223&amp;post=69&amp;subd=pycruft&amp;ref=&amp;feed=1" width="1" height="1" />]]></content:encoded>
			<wfw:commentRss>http://pycruft.wordpress.com/2010/06/18/django-registration/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
	
		<media:content url="http://0.gravatar.com/avatar/4a839932df915d7850d6a2b58dd2d32d?s=96&#38;d=identicon&#38;r=G" medium="image">
			<media:title type="html">pycruft</media:title>
		</media:content>
	</item>
		<item>
		<title>mod_python is dead.</title>
		<link>http://pycruft.wordpress.com/2010/06/17/mod_python-is-dead/</link>
		<comments>http://pycruft.wordpress.com/2010/06/17/mod_python-is-dead/#comments</comments>
		<pubDate>Thu, 17 Jun 2010 20:09:37 +0000</pubDate>
		<dc:creator>pycruft</dc:creator>
				<category><![CDATA[Uncategorized]]></category>
		<category><![CDATA[Python]]></category>

		<guid isPermaLink="false">http://pycruft.wordpress.com/?p=66</guid>
		<description><![CDATA[According to Graham Dumpleton&#8217;s blog (and he should know), the Apache Software Foundation has decided as of its 16th June Board meeting to move the Quetzalcoatl Project (i.e. mod_python) to the Attic (i.e. cease development). Hardly unexpected news &#8211; mod_wsgi &#8230; <a href="http://pycruft.wordpress.com/2010/06/17/mod_python-is-dead/">Continue reading <span class="meta-nav">&#8594;</span></a><img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=pycruft.wordpress.com&amp;blog=13782223&amp;post=66&amp;subd=pycruft&amp;ref=&amp;feed=1" width="1" height="1" />]]></description>
			<content:encoded><![CDATA[<p>According to <a href="http://blog.dscpl.com.au/2010/06/modpython-project-is-now-officially.html">Graham Dumpleton&#8217;s blog</a> (and he should know), the Apache Software Foundation has decided as of its 16th June Board meeting to move the Quetzalcoatl Project (i.e. mod_python) to the <a href="http://attic.apache.org/">Attic</a> (i.e. cease development).</p>
<p>Hardly unexpected news &#8211; <a href="http://www.modwsgi.org/">mod_wsgi</a> has been the preferred option for a year or two and there was explicitly no development progressing on mod_python. Graham <a href="http://blog.dscpl.com.au/2010/05/modpython-project-soon-to-be-officially.html">announced in May</a> that this move would be on the cards.</p>
<p>So long <a href="http://www.modpython.org/">mod_python</a>.</p>
<br />  <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gocomments/pycruft.wordpress.com/66/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/comments/pycruft.wordpress.com/66/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godelicious/pycruft.wordpress.com/66/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/delicious/pycruft.wordpress.com/66/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gofacebook/pycruft.wordpress.com/66/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/facebook/pycruft.wordpress.com/66/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gotwitter/pycruft.wordpress.com/66/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/twitter/pycruft.wordpress.com/66/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gostumble/pycruft.wordpress.com/66/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/stumble/pycruft.wordpress.com/66/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godigg/pycruft.wordpress.com/66/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/digg/pycruft.wordpress.com/66/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/goreddit/pycruft.wordpress.com/66/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/reddit/pycruft.wordpress.com/66/" /></a> <img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=pycruft.wordpress.com&amp;blog=13782223&amp;post=66&amp;subd=pycruft&amp;ref=&amp;feed=1" width="1" height="1" />]]></content:encoded>
			<wfw:commentRss>http://pycruft.wordpress.com/2010/06/17/mod_python-is-dead/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
	
		<media:content url="http://0.gravatar.com/avatar/4a839932df915d7850d6a2b58dd2d32d?s=96&#38;d=identicon&#38;r=G" medium="image">
			<media:title type="html">pycruft</media:title>
		</media:content>
	</item>
		<item>
		<title>Navigating Many-to-many relationships in Django templates</title>
		<link>http://pycruft.wordpress.com/2010/06/16/m2m-in-django-templates/</link>
		<comments>http://pycruft.wordpress.com/2010/06/16/m2m-in-django-templates/#comments</comments>
		<pubDate>Wed, 16 Jun 2010 16:06:14 +0000</pubDate>
		<dc:creator>pycruft</dc:creator>
				<category><![CDATA[Uncategorized]]></category>
		<category><![CDATA[Django]]></category>
		<category><![CDATA[Python]]></category>

		<guid isPermaLink="false">http://pycruft.wordpress.com/?p=61</guid>
		<description><![CDATA[Every now and again I need to do this, and for some reason whenever I do I discover I&#8217;ve forgotten how. If we, say, have a user who may have multiple profiles and we wish to display that set to &#8230; <a href="http://pycruft.wordpress.com/2010/06/16/m2m-in-django-templates/">Continue reading <span class="meta-nav">&#8594;</span></a><img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=pycruft.wordpress.com&amp;blog=13782223&amp;post=61&amp;subd=pycruft&amp;ref=&amp;feed=1" width="1" height="1" />]]></description>
			<content:encoded><![CDATA[<p>Every now and again I need to do this, and for some reason whenever I do I discover I&#8217;ve forgotten how.</p>
<p>If we, say, have a user who may have multiple profiles and we wish to display that set to them in a particular view, we can navigate that set within the view fairly simply</p>
<pre class="brush: python;">

class CommonProfileInfo(models.Model):
    user = models.ForeignKey(User, related_name='my_profiles')
    # ... whatever else
</pre>
<p>Within a view we would use</p>
<pre class="brush: python;">
    for prof in user.my_profiles.all():
        # do whatever
</pre>
<p>But if we try to do the same thing directly in a template the django templating language won&#8217;t let us use parentheses in a variable name. This trips me up every time until I eventually re-discover the bullet points in the <a href="http://docs.djangoproject.com/en/1.2/topics/templates/#variables">variables documentation</a> which note that</p>
<p><em>Technically, when the template system encounters a dot, it tries the following lookups, in this order:</em></p>
<ul>
<li><em>Dictionary lookup</em></li>
<li><em>Attribute lookup</em></li>
<li><em>Method call</em></li>
<li><em>List-index lookup</em></li>
</ul>
<p>Ah, yes &#8211; you can make a parameterless method call</p>
<pre class="brush: plain;">
    {% for prof in user.my_profiles.all %}
        ...
</pre>
<p>It&#8217;s so simple. Maybe from now on I&#8217;ll remember it and not waste an hour trying to figure it out all over again.</p>
<br />  <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gocomments/pycruft.wordpress.com/61/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/comments/pycruft.wordpress.com/61/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godelicious/pycruft.wordpress.com/61/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/delicious/pycruft.wordpress.com/61/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gofacebook/pycruft.wordpress.com/61/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/facebook/pycruft.wordpress.com/61/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gotwitter/pycruft.wordpress.com/61/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/twitter/pycruft.wordpress.com/61/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gostumble/pycruft.wordpress.com/61/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/stumble/pycruft.wordpress.com/61/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godigg/pycruft.wordpress.com/61/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/digg/pycruft.wordpress.com/61/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/goreddit/pycruft.wordpress.com/61/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/reddit/pycruft.wordpress.com/61/" /></a> <img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=pycruft.wordpress.com&amp;blog=13782223&amp;post=61&amp;subd=pycruft&amp;ref=&amp;feed=1" width="1" height="1" />]]></content:encoded>
			<wfw:commentRss>http://pycruft.wordpress.com/2010/06/16/m2m-in-django-templates/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
	
		<media:content url="http://0.gravatar.com/avatar/4a839932df915d7850d6a2b58dd2d32d?s=96&#38;d=identicon&#38;r=G" medium="image">
			<media:title type="html">pycruft</media:title>
		</media:content>
	</item>
		<item>
		<title>iPad Arrives</title>
		<link>http://pycruft.wordpress.com/2010/06/14/ipad-arrives/</link>
		<comments>http://pycruft.wordpress.com/2010/06/14/ipad-arrives/#comments</comments>
		<pubDate>Mon, 14 Jun 2010 12:25:47 +0000</pubDate>
		<dc:creator>pycruft</dc:creator>
				<category><![CDATA[Uncategorized]]></category>

		<guid isPermaLink="false">http://pycruft.wordpress.com/?p=55</guid>
		<description><![CDATA[I was lucky enough to be offered a more or less free iPad (or vouchers for) a few weeks ago. Haven&#8217;t been particularly interested in it, but it would be daft not to get one for more or less nothing &#8230; <a href="http://pycruft.wordpress.com/2010/06/14/ipad-arrives/">Continue reading <span class="meta-nav">&#8594;</span></a><img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=pycruft.wordpress.com&amp;blog=13782223&amp;post=55&amp;subd=pycruft&amp;ref=&amp;feed=1" width="1" height="1" />]]></description>
			<content:encoded><![CDATA[<p>I was lucky enough to be offered a more or less free iPad (or vouchers for) a few weeks ago. Haven&#8217;t been particularly interested in it, but it would be daft not to get one for more or less nothing so we placed an order with the local Apple Store a couple of weeks ago. On Saturday we got the notification email giving us 24hrs notice to pick it up (nice, huh? lucky we weren&#8217;t away for the weekend!). Picked up yesterday and I&#8217;ve basically had a couple of hours this morning to play with it. This is the thoughts thus-far.</p>
<p>I&#8217;ve not really read around the device much or taken a huge amount of interest generally. I guess I had assumed it was a media-consumption device and wasn&#8217;t sure what, if anything, else it could really do.</p>
<p>First thought on opening the box: it&#8217;s smaller than I expected. I knew it was quite small, but hadn&#8217;t really appreciated how small. With a couple of hours use, however, it&#8217;s not <em>too</em> small. It&#8217;s probably about right. Although a bigger screen would be nice, its about on the edge of what would be unwieldy, I think.</p>
<p>Second thought: why does it need to be connected to iTunes?</p>
<div class="wp-caption alignright" style="width: 212px"><a href="http://pycruft.files.wordpress.com/2010/06/ipad_connected_to_itunes.png"><img class="size-full wp-image-56" title="connect  me to iTunes now!" src="http://pycruft.files.wordpress.com/2010/06/ipad_connected_to_itunes.png?w=202&#038;h=184" alt="iPad needs to be connected to iTunes on first boot" width="202" height="184" /></a><p class="wp-caption-text">iPad  needs to be connected to iTunes on first boot</p></div>
<p>Can&#8217;t I do <em>anything</em> with it until then? No, you can&#8217;t. It won&#8217;t even boot properly first time without being USB connected to a PC with iTunes on. Perhaps I should&#8217;ve known that in advance, but it was still rather a shock and not at all clear why. Once it has acknowledge that iTunes exists, somewhere, you can disconnect it and set everything up on the device itself.</p>
<p>I set up wifi &#8211; took a little while to find the mac address (I have an access-list on my wifi) and typing my wifi passphrase on the keyboard was interesting &#8211; it doesn&#8217;t provide both letters &amp; numbers on the same keyboard so I was constantly swapping back and forth. Couldn&#8217;t &#8220;unhide&#8221; the password either, so I had to be careful to remember where I was in it &#8211; and if I miss-hit a key it was a matter of carefully counting the dots to work out how much to remove &amp; redo. Still, once set up it worked fine.</p>
<p>You tube works. Safari works. Don&#8217;t have any email servers/services I want to sync it with just at the moment so haven&#8217;t really tested that.</p>
<p>That does bring me on to an interesting note, tho, which I knew but hadn&#8217;t fully appreciated earlier. This is a personal device. It&#8217;s simply not designed (as far as I can tell) to be shared. If you want to share the iPad you&#8217;ll have to share your email, preferences, settings, accounts and so forth too because it has no &#8216;logins&#8217; or &#8216;accounts&#8217; of its own to keep those things separate.</p>
<p>I suppose that I had in mind that it would be like a small computer, but really it&#8217;s much more like a big phone from most perspectives.</p>
<p>So, how to get media on to it? Well, obviously the preferred way is through iTunes. And when I say &#8216;preferred&#8217; I mean &#8216;only&#8217;.</p>
<p>iTunes is &#8230; interesting. I&#8217;ve not used it before. It is really <em>really</em> keen on you getting all your media through Apple. It does kind of support external media, but that really feels like a hotchpotch of vague afterthoughts. Doesn&#8217;t appear to support .ogg format which makes about half of my music collection immediately redundant. Supports movies (downloaded via iTunes store, naturally), but doesn&#8217;t seem to support local files such as .AVIs etc. (whether it can play them or not, I simply couldn&#8217;t find an interface to even find/load them).</p>
<p>One observation I made while poking around was that if you asked it to import a file it didn&#8217;t understand it just did nothing. No error, or warning or anything, it just silently failed which left me hunting around on several occasions looking to see when stuff had gone.</p>
<p>Couldn&#8217;t figure out how to sync photos across to the iPad for a while, but eventually discovered it was because I hadn&#8217;t &#8220;registered&#8221; it. Apart from agreeing to a software licence (for what software? the iPad had been working just fine all morning &#8230; still not sure what it applied to) it&#8217;s not really clear what that actually involved. I don&#8217;t have an Apple account or iTunes Store account yet (which it asked for and nagged me to create) but they didn&#8217;t seem to actually be necessary.</p>
<p>Once all that nagging was over with it turned out that you could only install whole directories of photos/images at a time. My general &#8216;graphics&#8217; directory is a little over 32GB or more than will fit on this iPad model. The granularity of work seems to be the subdirectory (folder) &#8211; no selecting individual files or similar as far as I can see. Will have to rearrange any pics I want moved across &#8211; will probably make dedicated copies in a separate directory somewhere. I&#8217;m sure it&#8217;ll work, as a work-around, but it&#8217;s not exactly elegant.</p>
<p>Uploading &#8216;home movies&#8217; and other vids I&#8217;ve got kicking about on my harddrive looks like being a matter of putting them in the same place as the photos. Not entirely sure what, if anything, the iPad will be able to play. As noted above, iTunes itself doesn&#8217;t seem to be able to cope with vids just laying around on the local HDD.</p>
<p>So, moving on from that. The App Store. You can browse around it, but can&#8217;t download/install anything without an iTunes Store Account, even free things. Curiously you don&#8217;t seem to be able to filter or order on price which I find interesting &#8211; looks like Apple doesn&#8217;t want you filtering out paid apps or anything (unless I&#8217;ve just missed that part of the interface, which is possible: didn&#8217;t play for long).</p>
<p>General interface is interesting. You seem to have to use the &#8216;home&#8217; button to shut apps down which I still find confusing &#8211; I want to press/push/drag something on the main screen. Screen-press to open, button to close seems a creaky UI paradigm to me. Maybe I just need to get used to it. On which subject: from the Home screen, a swift drag-right gets you to the Search screen. I got onto this screen many times, initially, by not being careful enough poking icons. I&#8217;d press the &#8216;settings&#8217; icon and discover I was looking at a search box without understanding why.</p>
<p>The general &#8216;drag&#8217; and &#8216;resize&#8217; interface works well enough but it&#8217;s a lot more limited than I&#8217;d expected. You can&#8217;t just zoom willy nilly, or drag things around as you see fit: only certain things can be sized, and in certain ways and only certain things can be dragged.</p>
<p>Mostly these all seem sensible &#8211; only a few times have I found myself trying to drag or zoom something and it won&#8217;t work.</p>
<p>The keyboard seems fine although it did confuse the Mrs at one point. &#8220;Where&#8217;s Return?&#8221; &#8211; having a button which changed label depending on context became a UI hindrance rather than a help. I think I must have already known that it did that, because it didn&#8217;t surprise me. I do find it a bit tricky to type on &#8211; quite often hitting the wrong keys.</p>
<p>At one point I mistyped a word of a multi-word search and when I went back to correct it, it offered me some sensible alternatives for just that word: very nicely done.</p>
<p>Screen is already covered in greasy finger marks but seems to cope well &#8211; I haven&#8217;t really noticed anything too bad in general use.</p>
<p>Overall: glad I didn&#8217;t pay full price for it! Maybe once I&#8217;ve found some Apps it might start to seem useful, but at the moment it&#8217;s looking like a device to give to the Mrs for shopping while watching TV.I guess that&#8217;s in some ways fair enough: the Apps are kind of the <em>point </em>of it. But I was sort of hoping for something a bit more, out of the box.</p>
<p>Would I buy one for the £500+? No. But maybe I&#8217;ll change my mind after a few days/weeks use.</p>
<br />  <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gocomments/pycruft.wordpress.com/55/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/comments/pycruft.wordpress.com/55/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godelicious/pycruft.wordpress.com/55/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/delicious/pycruft.wordpress.com/55/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gofacebook/pycruft.wordpress.com/55/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/facebook/pycruft.wordpress.com/55/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gotwitter/pycruft.wordpress.com/55/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/twitter/pycruft.wordpress.com/55/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gostumble/pycruft.wordpress.com/55/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/stumble/pycruft.wordpress.com/55/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godigg/pycruft.wordpress.com/55/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/digg/pycruft.wordpress.com/55/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/goreddit/pycruft.wordpress.com/55/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/reddit/pycruft.wordpress.com/55/" /></a> <img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=pycruft.wordpress.com&amp;blog=13782223&amp;post=55&amp;subd=pycruft&amp;ref=&amp;feed=1" width="1" height="1" />]]></content:encoded>
			<wfw:commentRss>http://pycruft.wordpress.com/2010/06/14/ipad-arrives/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
	
		<media:content url="http://0.gravatar.com/avatar/4a839932df915d7850d6a2b58dd2d32d?s=96&#38;d=identicon&#38;r=G" medium="image">
			<media:title type="html">pycruft</media:title>
		</media:content>

		<media:content url="http://pycruft.files.wordpress.com/2010/06/ipad_connected_to_itunes.png" medium="image">
			<media:title type="html">connect  me to iTunes now!</media:title>
		</media:content>
	</item>
	</channel>
</rss>
