<?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"
	>

<channel>
	<title>Graceful Exits &#187; information</title>
	<atom:link href="http://www.jpstacey.info/blog/category/information/www.jpstacey.info/blog/category/information/feed/" rel="self" type="application/rss+xml" />
	<link>http://www.jpstacey.info/blog</link>
	<description>Garbage collection, in a very real sense</description>
	<pubDate>Thu, 14 Aug 2008 09:05:55 +0000</pubDate>
	<generator>http://wordpress.org/?v=2.5.1</generator>
	<language>en</language>
			<item>
		<title>User loading and saving in Drupal 5.x</title>
		<link>http://www.jpstacey.info/blog/2008/06/09/user-loading-and-saving-in-drupal-5x/</link>
		<comments>http://www.jpstacey.info/blog/2008/06/09/user-loading-and-saving-in-drupal-5x/#comments</comments>
		<pubDate>Mon, 09 Jun 2008 15:48:48 +0000</pubDate>
		<dc:creator>jps</dc:creator>
		
		<category><![CDATA[diagnostics]]></category>

		<category><![CDATA[hacking]]></category>

		<category><![CDATA[information]]></category>

		<category><![CDATA[projects]]></category>

		<category><![CDATA[software]]></category>

		<category><![CDATA[5.x]]></category>

		<category><![CDATA[api]]></category>

		<category><![CDATA[core]]></category>

		<category><![CDATA[drupal]]></category>

		<category><![CDATA[hook]]></category>

		<category><![CDATA[id]]></category>

		<category><![CDATA[profile]]></category>

		<category><![CDATA[user]]></category>

		<category><![CDATA[user_load]]></category>

		<category><![CDATA[user_save]]></category>

		<guid isPermaLink="false">http://www.jpstacey.info/blog/2008/06/09/user-loading-and-saving-in-drupal-5x/</guid>
		<description><![CDATA[Workflows of Drupal's user load and save functionality: spot the hooks and win a programmatical prize.]]></description>
			<content:encoded><![CDATA[<p>Recently at <a href="http://torchbox.com/" >Torchbox</a> we&#8217;ve been looking into how to build extra functionality on top of Drupal users. The standard Drupal user object is a combination of the contents from the users table, plus any properties provided by the core <code>profile</code> module. This means that the Drupal user is a combination of rows (and admittedly deserialized, structured data) from a couple of tables in a relational database. </p>
<div style="float: right;"><a title="flowcharts of user_load and user_save" href="#user-flowcharts"><img src="/blog/files/drupal/core/drupal_user_teaser.gif" alt="flowcharts of user_load and user_save" width="145" height="184" /></a></div>
<p>That works just fine for most purposes, but we may have to bring in content from not just outside the core Drupal tables but outside the core database, and even on a remote server through webservices. To this end we&#8217;ve decomposed the core <code>user</code> module&#8217;s <code>user_load()</code> and <code>user_save()</code> functions. This helps us understand better both the workflow and at what points in it our own code can motor into life, query all those extra resources (or set those queries in motion), assemble the rest of the user++ object, and then hand control back over to Drupal.</p>
<p>For those who don&#8217;t know much about Drupal, its core has a <em>hook-based</em> API structure. At certain points in its workflow, it checks all the modules for functions following certain naming conventions (typically the module name followed by the hook name e.g. <code>mymodule_init</code> on response startup, or <code>mymodule_block</code> to return details about the module&#8217;s support for Drupal page furniture). Any matching hook functions are called in the order defined by module weightings, and then page processing will generally continue: you can crowbar a grind-to-a-halt <code>exit()</code> in your hook, but it&#8217;d be unwise, as you can never be sure what tidying up Drupal might need to do after your hook. Outside these hooks, your code has little control over Drupal&#8217;s core functioning, unless you stub out entirely the bits of core you need yourself, and get your request to use those bits instead.z</p>
<p>Because of the way they let your code tag along with Drupal&#8217;s powerful core, hooks are essential to developing modules in the most <em>Drupalish</em> way. With that in mind, <a name="user-flowcharts"></a>here are flow diagrams of the three basic aspects of user functionality&#8212;create new, load, save existing&#8212;lifted straight from examination of the code:</p>
<ul>
<li><a href="/blog/files/drupal/core/drupal_user_load.gif">Loading an existing user with user_load</a></li>
<li><a href="/blog/files/drupal/core/drupal_user_create.gif">Creating a user: saving a new user with user_save</a></li>
<li><a href="/blog/files/drupal/core/drupal_user_update.gif">Updating a user: saving an existing user with user_save</a></li>
</ul>
<p>Although you have to save a user before you can load them, I&#8217;ve put this functionality first in the above (admittedly unordered) list. There are two main reasons for this:</p>
<ol>
<li><code>user_save</code> actually calls <code>user_load</code> a number of times, once or twice, to &#8220;refresh&#8221; the user object</li>
<li><code>user_load</code> is a more primitive function and so bears examination first</li>
</ol>
<p>Stripped down, <code>user_load</code> consists of: querying the database for a core user record matching the search criteria; returning this and the extended profile data; unserializing a free-data field and inserting it into the user object; discovering user roles; <strong>triggering <code>hook_user('load')</code></strong> and returning the object (or boolean false, if no user found).</p>
<p>What this reveals (which I didn&#8217;t realise before) is that <em>the anonymous user is in the Drupal users table</em>, with ID=0. Otherwise, searching for this user would return no records, and the anonymous user object could not be instantiated. You could therefore attach rich data to the anonymous user, if you were in a hacky mood.</p>
<p>The two <code>user_save</code> workflows are fairly similar. Creating a user means obtaining an ID from the database: because some MySQL providers have poorer feature sets than others, referential integrity is ensured at the application level rather than the database level. In place of obtaining an ID, user update <strong>calls <code>hook_user('update')</code> to pre-process</strong> the user. Both workflows then set aside special fields, such as the user&#8217;s password, user roles and any profile fields managed by that module (determined from <code>user_fields()</code>). Then they save this data into the database in slightly different orders, with user creation <code>calling </code><code>hook_user('insert')</code> early on, and the update procedure <code>calling </code><code>hook_user('after_update')</code> much later in the process, just before determining the external authentication mappings (e.g. OpenID) and returning the user object.</p>
<p>What does this mean for us? Well, we&#8217;ll want varying amounts of data to piggyback on the core user object, so we have somewhere to cache it. Ideally this data won&#8217;t be summoned&#8212;brought out of the distributed data &#8216;cloud&#8217;&#8212;on every request/response cycle, so we&#8217;ll need to do some local cacheing, but not so much that we&#8217;ll get out of synch with the cloud (or that we&#8217;ll duplicate sensitive data). We think that, given the pair of hooks in <code>user_save</code> for existing users, we&#8217;ll have just enough leverage to do this: the first hook will effectively &#8220;tear down&#8221; our extra data, so we can do what we want with it, and store it somewhere temporarily; the second hook will &#8220;set up&#8221; the user for the rest of the request, by putting all that data back in. The existence of <code>user_load</code> within <code>user_save</code> complicates things somewhat, but at the same time it gives us some more wiggle room, because each call to that function fires another hook.</p>
<p>A Drupal hook is worth a thousand lines of module code, but they&#8217;re still a bit few and far between for some workflows. Hopefully the accompanying images will help anyone reading to find them, and ditch those thousand lines before they&#8217;re even written.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.jpstacey.info/blog/2008/06/09/user-loading-and-saving-in-drupal-5x/feed/</wfw:commentRss>
		</item>
		<item>
		<title>Django&#8217;s ViewDoesNotExist Heisenbug</title>
		<link>http://www.jpstacey.info/blog/2008/06/08/djangos-viewdoesnotexist-heisenbug/</link>
		<comments>http://www.jpstacey.info/blog/2008/06/08/djangos-viewdoesnotexist-heisenbug/#comments</comments>
		<pubDate>Sun, 08 Jun 2008 17:21:55 +0000</pubDate>
		<dc:creator>jps</dc:creator>
		
		<category><![CDATA[hacking]]></category>

		<category><![CDATA[information]]></category>

		<category><![CDATA[reporting]]></category>

		<category><![CDATA[control]]></category>

		<category><![CDATA[django]]></category>

		<category><![CDATA[error]]></category>

		<category><![CDATA[fusebox]]></category>

		<category><![CDATA[layer]]></category>

		<category><![CDATA[method]]></category>

		<category><![CDATA[pattern]]></category>

		<category><![CDATA[tag]]></category>

		<category><![CDATA[template]]></category>

		<category><![CDATA[url]]></category>

		<category><![CDATA[view]]></category>

		<category><![CDATA[viewdoesnotexist]]></category>

		<guid isPermaLink="false">http://www.jpstacey.info/blog/2008/06/08/djangos-viewdoesnotexist-heisenbug/</guid>
		<description><![CDATA[Django's fusebox sometimes blows one, if you start poking around in it with a template-tag screwdriver.]]></description>
			<content:encoded><![CDATA[<p>To the untrained eye, you might think that you can put any old string in as the second element of one of your <a href="http://www.djangoproject.com/documentation/url_dispatch/" >Django URL dispatcher patterns</a> in <code>urls.py</code>:</p>
<blockquote class="code"><p>
from django.conf.urls.defaults import *</p>
<p>urlpatterns = patterns(&#8221;,<br />
&nbsp;&nbsp;&nbsp;&nbsp;(r&#8217;^$&#8217;, &#8216;myapp.views.webroot&#8217;),<br />
&nbsp;&nbsp;&nbsp;&nbsp;(r&#8217;^a_page/$&#8217;, &#8216;myapp.views.another_page&#8217;),<br />
&nbsp;&nbsp;&nbsp;&nbsp;(r&#8217;^nothing_here_dude/$&#8217;, &#8216;myapp.views.this_view_does_not_exist&#8217;),<br />
)
</p>
</blockquote>
<p>You have a fairly basic Django page which works; you add a new tuple to the URL patterns and refresh the page: it works OK, so if everything runs through the URL dispatcher fusebox, then it must be all right, yeah?</p>
<p>Unfortunately, nonexistent view methods seem to break pages that do a reverse lookup in the URL layer using the <code>{% url %}</code> template tag. You might not use this, but the standard Django admin interface does, several times, on its first page after login e.g:</p>
<blockquote class="code"><p>
&lt;a href=&#8221;{% url django.contrib.admin.views.doc.doc_index %}&#8221;>{% trans &#8216;Documentation&#8217; %}&lt;/a>
</p>
</blockquote>
<p>The above code generates a URL by comparing the view method to the evaluated second arguments of each URL pattern, and evaluation fails at the nonexistent method, giving the error:</p>
<blockquote class="code"><p>
<strong>ViewDoesNotExist at /admin/</strong><br />
Tried options in module myapp.views. Error was: &#8216;module&#8217; object has no attribute &#8216;this_view_does_not_exist&#8217;
</p>
</blockquote>
<p>Sometimes this error isn&#8217;t thrown, so perhaps the underlying code searches a dict of URL patterns in no particular order: that would mean that every now and again it returns the matching view without ever getting to the nonexistent method.</p>
<p>The fix is to comment out the URL. But what if you&#8217;ve got a big codebase, and there are several people working on it, and sometimes nonexistent view methods just get committed? <a href="http://www.djangoproject.com/documentation/testing/" >Testing</a> can help here, specifically interface testing using the fake <code>Client</code> &#8220;browser&#8221;. That&#8217;s not easy when it comes to the out-of-box admin interface, though, because its login procedure seems to require both cookies and a hidden, hashed field to prevent automated logins.</p>
<p>This sounded like it was going somewhere when I started writing it; now, though, I think it&#8217;s just handy to publish it and let it have the Googlejuice, as I couldn&#8217;t find any references online to other people spotting this solution to a reasonably common problem that just&#8212;possibly because another view somewhere else was finally fixed&#8212;suddenly vanishes.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.jpstacey.info/blog/2008/06/08/djangos-viewdoesnotexist-heisenbug/feed/</wfw:commentRss>
		</item>
		<item>
		<title>Library of Congress, Flickr&#8217;d to the max</title>
		<link>http://www.jpstacey.info/blog/2008/01/17/library-of-congress-flickrd-to-the-max/</link>
		<comments>http://www.jpstacey.info/blog/2008/01/17/library-of-congress-flickrd-to-the-max/#comments</comments>
		<pubDate>Thu, 17 Jan 2008 10:43:22 +0000</pubDate>
		<dc:creator>jps</dc:creator>
		
		<category><![CDATA[culture]]></category>

		<category><![CDATA[formats]]></category>

		<category><![CDATA[import/export]]></category>

		<category><![CDATA[information]]></category>

		<category><![CDATA[news]]></category>

		<category><![CDATA[archive]]></category>

		<category><![CDATA[collections]]></category>

		<category><![CDATA[congress]]></category>

		<category><![CDATA[copyright]]></category>

		<category><![CDATA[flickr]]></category>

		<category><![CDATA[free]]></category>

		<category><![CDATA[library]]></category>

		<category><![CDATA[metadata]]></category>

		<category><![CDATA[museum]]></category>

		<category><![CDATA[online]]></category>

		<category><![CDATA[photographs]]></category>

		<category><![CDATA[tagging]]></category>

		<guid isPermaLink="false">http://www.jpstacey.info/blog/2008/01/17/library-of-congress-flickrd-to-the-max/</guid>
		<description><![CDATA[Flickr is working with the Library of Congress on new project The Commons. Currently there are around three thousand photographs up there from two collections, and according to the Commons homepage they&#8217;re all copyright-free. More information in the relevant post on the Flickr blog.
This is wonderful news, especially because the collection is being released through [...]]]></description>
			<content:encoded><![CDATA[<p>Flickr is working with the Library of Congress on new project <a href="http://flickr.com/commons">The Commons</a>. Currently there are around <strong>three thousand</strong> photographs up there from two collections, and according to the Commons homepage they&#8217;re all copyright-free. More information in <a href="http://blog.flickr.com/en/2008/01/16/many-hands-make-light-work/">the relevant post on the Flickr blog</a>.</p>
<p>This is wonderful news, especially because the collection is being released through a slightly adapted version of Flickr&#8217;s existing website. This means, apart from it being an established interface that millions of people already know vaguely how to use, that you can do all the Flickry things with the photos&#8212;dedicated Flickr-heads will hopefully give a more qualified response in due course&#8212;and that third-party tools should already be set up to work with the content. The meta information storage won&#8217;t particularly excite any Dublin-Core enthusiasts&#8212;a block of unstructured HTML in the standard Flickr notes field, plus of course Flickr tagging&#8212;but the whole project is still a fascinating experiment, and interesting for even the casual observer of American history. How exciting does it get? More exciting than the <a href="http://www.flickr.com/photos/library_of_congress/2179047088/in/set-72157603671370361/">World of Mirth Shows</a>?</p>
<p>Thinking offline for a moment, this hopefully presages more leaps forward in <abbr title="Museums, Libraries and Archives">MLA</abbr> culture. One of the first would be to remove the &#8220;NO PHOTOGRAPHS&#8221; signs from all museums. At the very least such signs could be more honest, and instead read &#8220;NO PHOTOGRAPHS; unless our security guards don&#8217;t catch you at it, in which case we&#8217;ll be blissful in our ignorance. Anyway, in five years time it&#8217;ll all be online so we don&#8217;t know why we&#8217;re bothering, to be honest&#8230;.&#8221; On reflection, I suppose they would need bigger signs.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.jpstacey.info/blog/2008/01/17/library-of-congress-flickrd-to-the-max/feed/</wfw:commentRss>
		</item>
		<item>
		<title>&#8220;Skip website&#8221;</title>
		<link>http://www.jpstacey.info/blog/2007/11/04/skip-website/</link>
		<comments>http://www.jpstacey.info/blog/2007/11/04/skip-website/#comments</comments>
		<pubDate>Sun, 04 Nov 2007 20:13:45 +0000</pubDate>
		<dc:creator>jps</dc:creator>
		
		<category><![CDATA[business]]></category>

		<category><![CDATA[culture]]></category>

		<category><![CDATA[information]]></category>

		<category><![CDATA[considered]]></category>

		<category><![CDATA[flash]]></category>

		<category><![CDATA[harmful]]></category>

		<category><![CDATA[humour]]></category>

		<category><![CDATA[intro]]></category>

		<category><![CDATA[movie]]></category>

		<category><![CDATA[skip]]></category>

		<category><![CDATA[splash]]></category>

		<guid isPermaLink="false">http://www.jpstacey.info/blog/2007/11/04/skip-website/</guid>
		<description><![CDATA[Skip intro - or three types of copy the world will never miss
&#8230; Did you think I typed in your URL so I could watch a movie? Duh! I want information and I want it now. Only a fool actively erects barriers between a potential customer and his content&#8230;
I have a suggestion for a more [...]]]></description>
			<content:encoded><![CDATA[<blockquote><p><b>Skip intro -</b> or three types of copy the world will never miss</p>
<p>&#8230; Did you think I typed in your URL so I could watch a movie? Duh! I want information and I want it now. Only a fool actively erects barriers between a potential customer and his content&#8230;</p>
<p>I have a suggestion for a more user-friendly line of copy on the home page. It reads &#8220;Play pointless Flash movie that we paid a fortune for and are now desperate to have you watch.&#8221; Then the small children at whom these animations are so clearly aimed could sit there all day watching zebras turning into photocopiers while the rest of us get on with some work.</p>
</blockquote>
<p>So writes Andy Maslen of <a href="http://www.sunfish.co.uk/">Sunfish</a>, in magazine trade publication <a href="http://www.incirculation.co.uk/">InCirculation</a>. I remember when I was doing my physics DPhil that a certain global electronics manufacturer (that also deals in household goods) lost thousands and thousands of pounds of business from us because I could never get past the Flash splash page. Fast forward six or seven years and lots of companies are still making the same mistake.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.jpstacey.info/blog/2007/11/04/skip-website/feed/</wfw:commentRss>
		</item>
		<item>
		<title>Software simple and software facile</title>
		<link>http://www.jpstacey.info/blog/2007/09/12/software-simple-and-software-facile/</link>
		<comments>http://www.jpstacey.info/blog/2007/09/12/software-simple-and-software-facile/#comments</comments>
		<pubDate>Wed, 12 Sep 2007 09:07:45 +0000</pubDate>
		<dc:creator>jps</dc:creator>
		
		<category><![CDATA[business]]></category>

		<category><![CDATA[culture]]></category>

		<category><![CDATA[enterprise]]></category>

		<category><![CDATA[information]]></category>

		<category><![CDATA[paradigms]]></category>

		<category><![CDATA[api]]></category>

		<category><![CDATA[barcamp]]></category>

		<category><![CDATA[brighton]]></category>

		<category><![CDATA[consumer]]></category>

		<category><![CDATA[development]]></category>

		<category><![CDATA[rest]]></category>

		<category><![CDATA[soap]]></category>

		<category><![CDATA[vendor]]></category>

		<guid isPermaLink="false">http://www.jpstacey.info/blog/2007/09/12/software-simple-and-software-facile/</guid>
		<description><![CDATA[Assaf writes about, among other things, REST as a simplifier of development against an existing system:
REST plays the same role as open source and open APIs: It eliminates tooling and vendoring as artificial barriers to adoption.

Interestingly, a corollary to this was brought up at Barcamp Brighton this weekend. During Gareth Rushgrove&#8217;s talk about REST and [...]]]></description>
			<content:encoded><![CDATA[<p>Assaf writes about, among other things, <a href="http://blog.labnotes.org/2007/09/10/rounded-corners-144-slight-of-hand/">REST as a simplifier of development against an existing system</a>:</p>
<blockquote><p><i>REST plays the same role as open source and open APIs: It eliminates tooling and vendoring as artificial barriers to adoption.</i></p>
</blockquote>
<p>Interestingly, a corollary to this was brought up at Barcamp Brighton this weekend. During <a href="http://www.morethanseven.net/">Gareth Rushgrove&#8217;s</a> talk about REST and <a href="http://www.nabaztag.com/">Nabaztag</a>, a chap whose name I&#8217;ve <em>again</em> forgotten (although I&#8217;m sure someone like <a href="http://fatbusinessman.com/">Fatty</a> will <a href="/blog/2007/09/10/post-mortem-post-brighton/#comments">enlighten me</a>) pointed out that much of the push of SOAP is coming from the vendors, because the vendors make their money from selling tools, and REST development needs very few tools, most of which are free.</p>
<p>Undoubtedly there&#8217;s a set of problems that REST finds hard, but this truism is extended by SOAP vendors to the hard-to-prove (but also hard-to-contradict) claim that it&#8217;s a larger set, or a set more pertinent to enterprise solutions, than the set which SOAP finds hard. It convinces the consumers, because intelligent data mining and storage has always been a difficult problem, and a simple solution like REST feels like underkill for the job in hand. They let you confuse <i>libre</i> and <i>gratis</i>, the vendors point out (I see them sitting on the consumer&#8217;s shoulders with tridents at this point): so where&#8217;s the hidden cost of <em>this</em> free lunch?</p>
<p>(hat tip to <a href="http://simonwillison.net/2007/Sep/10/">Simon Willison</a>)</p>
]]></content:encoded>
			<wfw:commentRss>http://www.jpstacey.info/blog/2007/09/12/software-simple-and-software-facile/feed/</wfw:commentRss>
		</item>
		<item>
		<title>Drupal @ Brighton Barcamp</title>
		<link>http://www.jpstacey.info/blog/2007/09/10/drupal-brighton-barcamp/</link>
		<comments>http://www.jpstacey.info/blog/2007/09/10/drupal-brighton-barcamp/#comments</comments>
		<pubDate>Mon, 10 Sep 2007 20:23:50 +0000</pubDate>
		<dc:creator>jps</dc:creator>
		
		<category><![CDATA[conferences]]></category>

		<category><![CDATA[information]]></category>

		<category><![CDATA[projects]]></category>

		<category><![CDATA[barcamp]]></category>

		<category><![CDATA[brighton]]></category>

		<category><![CDATA[conference]]></category>

		<category><![CDATA[drupal]]></category>

		<category><![CDATA[slides]]></category>

		<category><![CDATA[talk]]></category>

		<guid isPermaLink="false">http://www.jpstacey.info/blog/2007/09/10/drupal-brighton-barcamp/</guid>
		<description><![CDATA[The slides for my Barcamp talk are available, for those who missed it (most of you, you swine). Of interest if you want to see a Drupal site that doesn&#8217;t look like a Drupal site, and how you might go about doing that.
]]></description>
			<content:encoded><![CDATA[<p>The <a href="/blog/files/conference/barcamp_brighton_drupal.pdf.gz" title="Drupal talk @ Barcamp Brighton, gzipped PDF">slides for my Barcamp talk</a> are available, for those who missed it (most of you, you swine). Of interest if you want to see a Drupal site that doesn&#8217;t look like a Drupal site, and how you might go about doing that.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.jpstacey.info/blog/2007/09/10/drupal-brighton-barcamp/feed/</wfw:commentRss>
		</item>
		<item>
		<title>All roads lead to home</title>
		<link>http://www.jpstacey.info/blog/2007/03/08/all-roads-lead-to-home/</link>
		<comments>http://www.jpstacey.info/blog/2007/03/08/all-roads-lead-to-home/#comments</comments>
		<pubDate>Thu, 08 Mar 2007 10:47:58 +0000</pubDate>
		<dc:creator>jps</dc:creator>
		
		<category><![CDATA[information]]></category>

		<category><![CDATA[meta]]></category>

		<guid isPermaLink="false">http://www.jpstacey.info/blog/2007/03/08/all-roads-lead-to-home/</guid>
		<description><![CDATA[This morning a colleague had hardware problems, and duly googled for &#8216;g200 ubuntu dual head&#8216;. Shortly afterwards I did the same, for &#8216;coldfusion introspection &#8220;line number&#8221;&#8216;. We may be on track to produce a zettabyte of data by 2010, but from the looks of it some people are keeping most of it to themselves.
]]></description>
			<content:encoded><![CDATA[<p>This morning a colleague had hardware problems, and duly googled for &#8216;<a href="http://www.google.co.uk/search?q=g200+ubuntu+dual+head" >g200 ubuntu dual head</a>&#8216;. Shortly afterwards I did the same, for &#8216;<a href="http://www.google.co.uk/search?q=coldfusion+introspection+%22line+number%22" >coldfusion introspection &#8220;line number&#8221;</a>&#8216;. We may be on track to produce <a href="http://www.computerworld.com/action/article.do?command=viewArticleBasic&#038;articleId=9012364&#038;intsrc=hm_list" >a zettabyte of data by 2010</a>, but from the looks of it some people are keeping most of it to themselves.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.jpstacey.info/blog/2007/03/08/all-roads-lead-to-home/feed/</wfw:commentRss>
		</item>
	</channel>
</rss>
