<?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>Stephen Beattie</title>
	<atom:link href="http://www.stephenbeattie.com/feed/" rel="self" type="application/rss+xml" />
	<link>http://www.stephenbeattie.com</link>
	<description>Flash, PHP, Flex and other RIA technologies.</description>
	<lastBuildDate>Sat, 06 Jun 2009 11:46:54 +0000</lastBuildDate>
	<generator>http://wordpress.org/?v=2.8</generator>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
			<item>
		<title>The web is broken, please fix&#8230;</title>
		<link>http://www.stephenbeattie.com/2009/06/06/state-of-the-web/</link>
		<comments>http://www.stephenbeattie.com/2009/06/06/state-of-the-web/#comments</comments>
		<pubDate>Sat, 06 Jun 2009 11:46:54 +0000</pubDate>
		<dc:creator>admin</dc:creator>
				<category><![CDATA[Uncategorized]]></category>

		<guid isPermaLink="false">http://www.stephenbeattie.com/?p=41</guid>
		<description><![CDATA[The web is really broken right now. It takes all sorts of elegant hacks and skill with CSS and Javascript to take something originally intended as a document and turn it into an interface for a fully-functioning web application.  The fact that Google have already managed to pull of Google Maps and GMail so brilliantly [...]]]></description>
			<content:encoded><![CDATA[<p>The web is really broken right now. It takes all sorts of elegant hacks and skill with CSS and Javascript to take something originally intended as a document and turn it into an interface for a fully-functioning web application.  The fact that Google have already managed to pull of Google Maps and GMail so brilliantly is nothing short of amazing given the underlying mess they have inherited to work with.</p>
<p>I think <a href="http://dev.opera.com/articles/view/html-5-canvas-the-basics/">HTML5&#8217;s canvas</a> support could change a lot as it becomes possible to render directly to screen. I wouldn&#8217;t be suprised if Google or some other big organisation release a new kind of markup more suited to laying out application interfaces than HTML to make this easier &#8211; some kind of CanvasML (<strong>Update:</strong> In fact <a href="http://benzilla.galbraiths.org/2009/02/18/bespin-and-canvas-part-2/">Mozilla Thunderhead</a> seems to be pursuing this).</p>
<p><a href="https://bespin.mozilla.com/">Mozilla&#8217;s Bespin</a> looks like an awesome project but the decision to use Canvas as the rendering layer to avoid the overhead of HTML makes me realise why I like developing with Flash and Flex and why <a href="http://silverlight.net/">Silverlight</a> looks like a great option too.  OK so Flash&#8217;s text handling isn&#8217;t brilliant but on the flip-side it&#8217;s going to take years before there is the same level of  Canvas to the same level of rendering capability as Flash and even then there&#8217;s the whole networking and data binding layers.  Javascript just isn&#8217;t as nice to work with as a compiled language like Actionscript 3 or C#.  So, with Canvas applications, aren&#8217;t we just starting over for the sake of &#8220;standards&#8221; ?   Maybe propietary plugins aren&#8217;t so bad after all&#8230; or perhaps <a href="http://www.haxe.org">haXe</a> + <a href="http://xinf.org/">xinf</a> is the open-source answer waiting in the wings?</p>
<p>Seems I&#8217;m <a href="http://www.insideria.com/2009/02/mozilla-thunderhead-a-language.html">not the only one thinking about this</a>.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.stephenbeattie.com/2009/06/06/state-of-the-web/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Upgrading the core of my HTPC</title>
		<link>http://www.stephenbeattie.com/2009/05/24/upgrading-the-core-of-my-htpc/</link>
		<comments>http://www.stephenbeattie.com/2009/05/24/upgrading-the-core-of-my-htpc/#comments</comments>
		<pubDate>Sun, 24 May 2009 15:06:27 +0000</pubDate>
		<dc:creator>admin</dc:creator>
				<category><![CDATA[Computers]]></category>
		<category><![CDATA[Hardware]]></category>

		<guid isPermaLink="false">http://www.stephenbeattie.com/?p=34</guid>
		<description><![CDATA[Following on from my last post, I&#8217;ve ditched the idea of building a new mini-htpc for the time being.   Nothing quite beats building a PC from scratch &#8211; it appeals to the Lego man in me &#8211; but using my existing Antec Fusion mATX media centre case and PSU saves me a considerable amount of [...]]]></description>
			<content:encoded><![CDATA[<p>Following on from my last post, I&#8217;ve ditched the idea of building a new mini-htpc for the time being.   Nothing quite beats building a PC from scratch &#8211; it appeals to the Lego man in me &#8211; but using my existing Antec Fusion mATX media centre case and PSU saves me a considerable amount of money.  I&#8217;d love to build something small and sexy in the future but for now I just need a working system for as little outlay as possible.</p>
<p>I am still sticking with the AMD 780G platform, however.  The desktop (mATX) versions of these boards have recently dropped dramatically in price.  The energy efficient 45W CPUs have gone up slightly since my last post but overall a 780G system is getting cheaper.</p>
<p>Here&#8217;s what I&#8217;ve just bought for £125 at eBuyer:</p>
<ul>
<li>Motherboard: <a href="http://www.ebuyer.com/product/147302">PowerColor RS780G </a><br />
- bumpytrails has a nice <a href="http://www.bumpytrails.co.uk/2009/03/05/unboxing-the-powercolor-rs780g/">unboxing gallery</a> of this board<a href="http://www.bumpytrails.co.uk/2009/03/05/unboxing-the-powercolor-rs780g/"><br />
</a></li>
<li>RAM: <a href="http://www.ebuyer.com/product/143805">Kingston 2GB DDR2 800MHz CL5 1.8V</a><br />
- Single stick. I know they work better in pairs but I&#8217;m on a budget and want to expand later &#8211; the PowerColor only has 2 RAM slots!</li>
<li>CPU: <a href="http://www.ebuyer.com/product/144638">Athlon64X2 4850e 2.5Ghz @45W</a><br />
- Obviously not as power efficient as an Atom but should have no problem transcoding video on the fly.</li>
<li>Extras: <a href="http://www.ebuyer.com/product/139071">Plexus SATA TO IDE Dongle</a><br />
-  The PowerColor motherboard only has one IDE connection so to make use of my existing drive I need to use this adapter.  I&#8217;m waiting for SATA SSDs to come down in price so this is a temporary measure for the system drive.</li>
</ul>
<p>I think this is £125 well spent.  When the bits arrive and I plug it all together I should be good for 1080p playback and reasonably quick video encoding.  This will be a huge step up from the 1.4GHz 512Mb RAM Athlon XP sytem currently squatting in my lounge.  It&#8217;s going to be more powerful than the <a href="http://www.engadget.com/2009/04/23/asus-eeebox-pc-b208-with-discrete-graphics-hdmi-out-in-june/">Eeebox B208</a> system I&#8217;ve somehow convinced myself I NEED too (although I can&#8217;t fix this one to the back of a TV in quite the same way!) .</p>
<p>Software-wise, I&#8217;m going to install Windows 7 and try that version of Media Center out.  I&#8217;ve been looking for a decent media center application and previously tried MythTV (via Mythbuntu).  Ugh! &#8211; I never got it working and wasted days trying to get the RadioTimes TV listing feeds integrated.  Until <a href="http://www.boxee.tv">Boxee </a> has TV tuner support, I&#8217;ll stick with Redmond thanks.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.stephenbeattie.com/2009/05/24/upgrading-the-core-of-my-htpc/feed/</wfw:commentRss>
		<slash:comments>2</slash:comments>
		</item>
		<item>
		<title>A Faster, Smaller, Cheaper, Greener HTPC</title>
		<link>http://www.stephenbeattie.com/2008/09/27/a-faster-smaller-cheaper-greener-htpc/</link>
		<comments>http://www.stephenbeattie.com/2008/09/27/a-faster-smaller-cheaper-greener-htpc/#comments</comments>
		<pubDate>Sun, 28 Sep 2008 00:03:43 +0000</pubDate>
		<dc:creator>admin</dc:creator>
				<category><![CDATA[Computers]]></category>
		<category><![CDATA[Hardware]]></category>

		<guid isPermaLink="false">http://www.stephenbeattie.com/?p=18</guid>
		<description><![CDATA[Update: Apparently the groovy NOAH case only has an 80W PSU.  This is insufficient for the components specified.  However, this is such a nice case I might see if the on-board PSU can be upgraded. 
With all the fuss over the recent Intel Atom processors I thought it time to look at what components I [...]]]></description>
			<content:encoded><![CDATA[<p><strong>Update:</strong> <em>Apparently the groovy NOAH case only has an 80W PSU.  This is insufficient for the components specified.  However, this is such a nice case I might see if the on-board PSU can be upgraded. </em></p>
<p>With all the fuss over the recent Intel Atom processors I thought it time to look at what components I could use to build a smaller, more energy efficient machine than my honking huge lump that&#8217;s too big to fit under my TV.</p>
<p>I am currently running an old 1.4GHz Athlon XP 1600+ with 512Mb RAM which has been just fine for my needs with a regular CRT telly.  My graphics card is a (now ancient) nVidia FX 5200 with a decent S-Video out but incompatible with Vista and while I dearly love my Antec Fusion case it really is too huge to have kicking around my living room floor.</p>
<p>My first thought was whether I could use the cutesy <a href="http://www.asus.com/products.aspx?modelmenu=2&amp;model=2289&amp;l1=24&amp;l2=165&amp;l3=0&amp;l4=0">Asus Eeebox</a> for but reading up on it&#8217;s video playback performance I quickly realised that it&#8217;s no good for content with a resolution above 720p.  The Atom just doesn&#8217;t cut it.</p>
<p>How about two Atom processors then I thought?  The <a href="http://www.newegg.com/Product/Product.aspx?Item=N82E16856167032&amp;nm_mc=AFC-C8Junction&amp;cm_mmc=AFC-C8Junction-_-Barebone+Systems-_-MSI-_-56167032">MSI Wind Desktop barebones</a> kit looked much more  capable but the case was just plain ugly and there doesn&#8217;t seem to be anyone other than Newegg stocking these little boxes &#8211; no good for me as I&#8217;m UK based.</p>
<p>So I paid a trip to <a href="http://www.mini-itx.com">mini-itx.com</a> and wasted an hour or so investigating my options.  I was pleasantly surprised to find it&#8217;s now possible to put together a spec for a mini-itx box that uses a standard desktop processor for a relatively affordable price.  AMD have radically improved the energy efficiency of their processors in the past year and good performance is finally attainable for little power consumption.</p>
<p>So, after a little research to find the best prices from other sites, here&#8217;s my current thinking:</p>
<h3>List of Components</h3>
<p>From <a href="http://www.mini-itx.com">mini-itx.com</a> &#8211; £101.05 (incl. VAT)</p>
<p><a href="http://www.mini-itx.com/store/?c=3#3988"><img class="alignnone size-medium wp-image-24" title="htpc_noah" src="http://www.stephenbeattie.com/wp-content/uploads/2008/09/htpc_noah.jpg" alt="" width="117" height="90" /></a><a href="http://www.mini-itx.com/store/?c=34#p2312"><img class="alignnone size-medium wp-image-26" title="htpc_heatsink" src="http://www.stephenbeattie.com/wp-content/uploads/2008/09/htpc_heatsink1-300x257.jpg" alt="" width="105" height="90" /></a></p>
<ul>
<li><a href="http://www.mini-itx.com/store/?c=3#3988"><strong>Silver Noah 3988 Mini-ITX Case</strong></a> £69.33</li>
<li><strong><a href="http://www.mini-itx.com/store/?c=34#p2312">Silverstone NT07-AM2 Low Profile Heatsink</a> </strong><span class="shortdesc">(space is limited in the Noah case)</span> £22.33</li>
<li>Delivery to UK Mainland  £9.40</li>
</ul>
<p>From <a href="http://www.ebuyer.com">ebuyer.com</a> &#8211; £114.20 (incl.VAT)</p>
<p><a href="http://www.ebuyer.com/product/145256"><img class="alignnone size-medium wp-image-20" title="htpc_dvdrw" src="http://www.stephenbeattie.com/wp-content/uploads/2008/09/htpc_dvdrw.jpg" alt="" width="127" height="90" /></a><a href="http://www.ebuyer.com/product/144638"><img class="alignnone size-medium wp-image-19" title="htpc_cpu" src="http://www.stephenbeattie.com/wp-content/uploads/2008/09/htpc_cpu.jpg" alt="" width="120" height="90" /></a><a href="http://www.ebuyer.com/product/138728"><img class="alignnone size-medium wp-image-25" title="htpc_ram" src="http://www.stephenbeattie.com/wp-content/uploads/2008/09/htpc_ram.jpg" alt="" width="109" height="90" /></a></p>
<ul>
<li><strong><a class="shortdesc" href="http://www.ebuyer.com/product/145256">Pioneer KD-08 Slimline DVDRW</a></strong> <span class="inc">£26.37</span></li>
<li><strong><a class="shortdesc" href="http://www.ebuyer.com/product/144638">AMD Athlon 64 X2 4850e @2.5GHz, 1MB Cache</a></strong> <span class="inc">£39.77</span></li>
<li><strong><a class="shortdesc" href="http://www.ebuyer.com/product/138728">2GB DDR2 800MHz SODIMM</a></strong> <span class="inc" style="display: inline;">£24.03</span></li>
<li><span class="inc" style="display: inline;">Free Delivery</span></li>
</ul>
<p>From <a href="http://www.linintx.com">linintx.com</a> &#8211; £<span class="main">104.58</span> (incl.VAT)</p>
<p><a href="http://linitx.com/viewproduct.php?prodid=12207"><img class="alignnone size-medium wp-image-23" title="htpc_mobo" src="http://www.stephenbeattie.com/wp-content/uploads/2008/09/htpc_mobo.jpg" alt="" width="100" height="90" /></a></p>
<ul>
<li><strong><a class="main" href="http://linitx.com/viewproduct.php?prodid=12207">Jetway JNC81-LF AM2+ AMD780G Mainboard</a><span class="main"> </span></strong><span class="main">£104.58</span><a class="main" href="http://linitx.com/viewproduct.php?prodid=12207"><br />
</a></li>
<li>Free Delivery</li>
</ul>
<p>From my spares &#8211; £0.00 (incl. VAT)</p>
<ul>
<li><strong>80Gb Hitachi SATA 2 2.5&#8243; laptop drive</strong> (small drive needed to use the PCI riser for a TV card in the Noah case)</li>
<li><strong>PCI Digital TV Tuner Card</strong></li>
</ul>
<p>So the grand total for my upgrades would be £319.83.  I&#8217;ll certainly be considering this&#8230;. <img src='http://www.stephenbeattie.com/wp-includes/images/smilies/icon_smile.gif' alt=':-)' class='wp-smiley' /> </p>
]]></content:encoded>
			<wfw:commentRss>http://www.stephenbeattie.com/2008/09/27/a-faster-smaller-cheaper-greener-htpc/feed/</wfw:commentRss>
		<slash:comments>5</slash:comments>
		</item>
		<item>
		<title>Indiana Jones and the Kingdom of the Crystal Skull: Mini Review</title>
		<link>http://www.stephenbeattie.com/2008/06/16/indiana-jones-and-the-kingdom-of-the-crystal-skull-mini-review/</link>
		<comments>http://www.stephenbeattie.com/2008/06/16/indiana-jones-and-the-kingdom-of-the-crystal-skull-mini-review/#comments</comments>
		<pubDate>Tue, 17 Jun 2008 01:04:40 +0000</pubDate>
		<dc:creator>admin</dc:creator>
				<category><![CDATA[Uncategorized]]></category>
		<category><![CDATA[film reviews]]></category>

		<guid isPermaLink="false">http://www.stephenbeattie.com/?p=17</guid>
		<description><![CDATA[A nostalgic, tongue-in-cheek, roller coaster of a film that captures the spirit of the original trilogy.  Plenty of over the top action sequences, comic book villainy and rich special effects that enhance the much-loved Indy aesthetic.
However, the film feels like a cast and crew reunion with Indy as the guest of honour, swept along [...]]]></description>
			<content:encoded><![CDATA[<p>A nostalgic, tongue-in-cheek, roller coaster of a film that captures the spirit of the original trilogy.  Plenty of over the top action sequences, comic book villainy and rich special effects that enhance the much-loved Indy aesthetic.</p>
<p>However, the film feels like a cast and crew reunion with Indy as the guest of honour, swept along in the action rather than being the dynamic pivotal character.  After the &#8216;fridge&#8217; scene, Indy was never in any believable danger and the minimal romance aspects of the plot didn&#8217;t allow Harrison Ford a chance to fully deliver his famous wise-guy charm.</p>
<p>Overall though definitely worth a watch.  Real value for money in terms of sheer entertainment.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.stephenbeattie.com/2008/06/16/indiana-jones-and-the-kingdom-of-the-crystal-skull-mini-review/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Content Modeling with XML</title>
		<link>http://www.stephenbeattie.com/2008/05/20/xml-content-modeling/</link>
		<comments>http://www.stephenbeattie.com/2008/05/20/xml-content-modeling/#comments</comments>
		<pubDate>Tue, 20 May 2008 08:33:04 +0000</pubDate>
		<dc:creator>admin</dc:creator>
				<category><![CDATA[Content Management]]></category>
		<category><![CDATA[PHP]]></category>

		<guid isPermaLink="false">http://www.stephenbeattie.com/?p=14</guid>
		<description><![CDATA[The Content Management System I'm currently working on has some known and reasoned limitations.  It was designed a couple of years back for immediate ease-of-use by clients with simple needs and so i more an Adobe Contribute replacement rather than a full blown enterprise-ready überapp.  There are some dynamic/shared elements such as 'Common [...]]]></description>
			<content:encoded><![CDATA[<p>The Content Management System I'm currently working on has some known and reasoned limitations.  It was designed a couple of years back for immediate ease-of-use by clients with simple needs and so i more an <a title="Adobe Contribute" href="http://www.adobe.com/products/contribute/">Adobe Contribute</a> replacement rather than a full blown enterprise-ready überapp.  There are some dynamic/shared elements such as 'Common  Content' (think footer/sidebar content) and Collections (think <acronym title="Frequently Asked Questions">FAQs</acronym> and lists of things that need to be managed separately but appear on multiple pages).  The navigation also builds itself from the site structure.  It works well and I get good feedback from the clients and developers using it.</p>
<p>However, there normally comes a point when the client wants to do something a bit different.  Lets say that  rather than maintaining a simple list of <acronym title="Frequently Asked Questions">FAQs</acronym> with Collections, they want to create a knowledge base of articles.  Up to this point clients have had to re-purpose a set list of properties for each 'Collection Item'.  The fields were: <strong>publish date</strong>, <strong>title</strong>, <strong>summary</strong>, <strong>thumbnail</strong> and <strong>link</strong>. Thanks to a bit of ingenuity on the part of our developers, these properties were sufficiently generic to be useful in a range of scenarios from making a randomly rotating banner to an events list to a simple photo gallery with albums.  I was surprised how flexible something so statically defined could be.   That said, the fields weren't all used all the time and since the labels were generic, sometimes it has hard for the client to relate which form fields affected the final output on the website.  In short we needed something more scalable and user-friendly.  We needed 'custom' Collections where the form fields could be configured for each type of content the client required.  We needed a way to model content.</p>
<p>It so happened that the way in which I'd designed the database earlier abstracted the notion of a schema for Collection Items away in favour of storing name/value pairs to facilitate versioning.   In fact the static properties discussed above (title, summary etc.) were only enforced as hard-coded items in PHP.  Good so far but I needed a way of mapping some sort of structure to the data on its way into the database as well as on its way out.</p>
<p>XML was the answer.  For each 'Collection' of content added to the site, a collection type is used to provide a 'content schema' for the data.  The basic idea is to have a single XML file that carries just enough information to build a form, validate the user input (and filter it if necessary) and then store the data entered.</p>
<p>A sample collection type is shown below:</p>
<div class="igBar"><span id="lxml-2"><a href="#" onclick="javascript:showPlainTxt('xml-2'); return false;">PLAIN TEXT</a></span></div>
<div class="syntax_hilite"><span class="langName">XML:</span>
<div id="xml-2">
<div class="xml">
<ol>
<li style="font-family: 'Courier New', Courier, monospace; color: black; font-weight: normal; font-style: normal;color:#3A6A8B;">
<div style="font-family: 'Courier New', Courier, monospace; font-weight: normal;"><span style="color: #009900;"><span style="font-weight: bold; color: black;">&lt;</span>?xml <span style="color: #000066;">version</span>=<span style="color: #ff0000;">"1.0"</span>?<span style="font-weight: bold; color: black;">&gt;</span></span></div>
</li>
<li style="font-weight: bold;color:#26536A;">
<div style="font-family: 'Courier New', Courier, monospace; font-weight: normal;"><span style="color: #009900;"><span style="font-weight: bold; color: black;">&lt;collection</span>-types<span style="font-weight: bold; color: black;">&gt;</span></span></div>
</li>
<li style="font-family: 'Courier New', Courier, monospace; color: black; font-weight: normal; font-style: normal;color:#3A6A8B;">
<div style="font-family: 'Courier New', Courier, monospace; font-weight: normal;">&nbsp; &nbsp; <span style="color: #009900;"><span style="color: #808080; font-style: italic;">&lt;!-- DEFAULT --&gt;</span></span></div>
</li>
<li style="font-weight: bold;color:#26536A;">
<div style="font-family: 'Courier New', Courier, monospace; font-weight: normal;">&nbsp; &nbsp; <span style="color: #009900;"><span style="font-weight: bold; color: black;">&lt;collection</span>-type <span style="color: #000066;">guid</span>=<span style="color: #ff0000;">"00000000-0000-0000-0000-000000000000"</span><span style="font-weight: bold; color: black;">&gt;</span></span></div>
</li>
<li style="font-family: 'Courier New', Courier, monospace; color: black; font-weight: normal; font-style: normal;color:#3A6A8B;">
<div style="font-family: 'Courier New', Courier, monospace; font-weight: normal;">&nbsp; &nbsp; &nbsp; &nbsp; <span style="color: #009900;"><span style="font-weight: bold; color: black;">&lt;name<span style="font-weight: bold; color: black;">&gt;</span></span></span><span style="color: #339933;">&lt;![CDATA[Default Collection Type]]&gt;</span><span style="color: #009900;"><span style="font-weight: bold; color: black;">&lt;/name<span style="font-weight: bold; color: black;">&gt;</span></span></span></div>
</li>
<li style="font-weight: bold;color:#26536A;">
<div style="font-family: 'Courier New', Courier, monospace; font-weight: normal;">&nbsp; &nbsp; &nbsp; &nbsp; <span style="color: #009900;"><span style="font-weight: bold; color: black;">&lt;description<span style="font-weight: bold; color: black;">&gt;</span></span></span><span style="color: #339933;">&lt;![CDATA[GCMS v1.0 Collection Type]]&gt;</span><span style="color: #009900;"><span style="font-weight: bold; color: black;">&lt;/description<span style="font-weight: bold; color: black;">&gt;</span></span></span></div>
</li>
<li style="font-family: 'Courier New', Courier, monospace; color: black; font-weight: normal; font-style: normal;color:#3A6A8B;">
<div style="font-family: 'Courier New', Courier, monospace; font-weight: normal;">&nbsp; &nbsp; &nbsp; &nbsp; <span style="color: #009900;"><span style="font-weight: bold; color: black;">&lt;settings</span> <span style="color: #000066;">items-sortable</span>=<span style="color: #ff0000;">"true"</span> <span style="color: #000066;">grid-columns</span>=<span style="color: #ff0000;">"link"</span> <span style="color: #000066;">grid-search</span>=<span style="color: #ff0000;">"title|summary"</span> <span style="font-weight: bold; color: black;">/&gt;</span></span></div>
</li>
<li style="font-weight: bold;color:#26536A;">
<div style="font-family: 'Courier New', Courier, monospace; font-weight: normal;">&nbsp; &nbsp; &nbsp; &nbsp; <span style="color: #009900;"><span style="font-weight: bold; color: black;">&lt;properties<span style="font-weight: bold; color: black;">&gt;</span></span></span></div>
</li>
<li style="font-family: 'Courier New', Courier, monospace; color: black; font-weight: normal; font-style: normal;color:#3A6A8B;">
<div style="font-family: 'Courier New', Courier, monospace; font-weight: normal;">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span style="color: #009900;"><span style="font-weight: bold; color: black;">&lt;property</span> <span style="color: #000066;">id</span>=<span style="color: #ff0000;">"title"</span> <span style="color: #000066;">type</span>=<span style="color: #ff0000;">"TextField"</span> <span style="color: #000066;">label</span>=<span style="color: #ff0000;">"Image"</span> <span style="color: #000066;">required</span>=<span style="color: #ff0000;">"true"</span> <span style="font-weight: bold; color: black;">/&gt;</span></span></div>
</li>
<li style="font-weight: bold;color:#26536A;">
<div style="font-family: 'Courier New', Courier, monospace; font-weight: normal;">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span style="color: #009900;"><span style="font-weight: bold; color: black;">&lt;property</span> <span style="color: #000066;">id</span>=<span style="color: #ff0000;">"summary"</span> <span style="color: #000066;">type</span>=<span style="color: #ff0000;">"RichTextArea"</span> <span style="color: #000066;">label</span>=<span style="color: #ff0000;">"Summary"</span><span style="font-weight: bold; color: black;">&gt;</span></span></div>
</li>
<li style="font-family: 'Courier New', Courier, monospace; color: black; font-weight: normal; font-style: normal;color:#3A6A8B;">
<div style="font-family: 'Courier New', Courier, monospace; font-weight: normal;">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span style="color: #009900;"><span style="font-weight: bold; color: black;">&lt;default</span>-value<span style="font-weight: bold; color: black;">&gt;</span></span><span style="color: #339933;">&lt;![CDATA[blah blah]]&gt;</span><span style="color: #009900;"><span style="font-weight: bold; color: black;">&lt;/default</span>-value<span style="font-weight: bold; color: black;">&gt;</span></span></div>
</li>
<li style="font-weight: bold;color:#26536A;">
<div style="font-family: 'Courier New', Courier, monospace; font-weight: normal;">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span style="color: #009900;"><span style="font-weight: bold; color: black;">&lt;/property<span style="font-weight: bold; color: black;">&gt;</span></span></span></div>
</li>
<li style="font-family: 'Courier New', Courier, monospace; color: black; font-weight: normal; font-style: normal;color:#3A6A8B;">
<div style="font-family: 'Courier New', Courier, monospace; font-weight: normal;">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span style="color: #009900;"><span style="font-weight: bold; color: black;">&lt;property</span> <span style="color: #000066;">id</span>=<span style="color: #ff0000;">"thumbnail"</span> <span style="color: #000066;">type</span>=<span style="color: #ff0000;">"AssetChooser"</span> <span style="color: #000066;">label</span>=<span style="color: #ff0000;">"Image"</span> <span style="font-weight: bold; color: black;">/&gt;</span></span></div>
</li>
<li style="font-weight: bold;color:#26536A;">
<div style="font-family: 'Courier New', Courier, monospace; font-weight: normal;">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span style="color: #009900;"><span style="font-weight: bold; color: black;">&lt;property</span> <span style="color: #000066;">id</span>=<span style="color: #ff0000;">"link"</span> <span style="color: #000066;">type</span>=<span style="color: #ff0000;">"LinkChooser"</span> <span style="color: #000066;">label</span>=<span style="color: #ff0000;">"Link"</span> <span style="font-weight: bold; color: black;">/&gt;</span></span></div>
</li>
<li style="font-family: 'Courier New', Courier, monospace; color: black; font-weight: normal; font-style: normal;color:#3A6A8B;">
<div style="font-family: 'Courier New', Courier, monospace; font-weight: normal;">&nbsp; &nbsp; &nbsp; &nbsp; <span style="color: #009900;"><span style="font-weight: bold; color: black;">&lt;/properties<span style="font-weight: bold; color: black;">&gt;</span></span></span></div>
</li>
<li style="font-weight: bold;color:#26536A;">
<div style="font-family: 'Courier New', Courier, monospace; font-weight: normal;">&nbsp; &nbsp; <span style="color: #009900;"><span style="font-weight: bold; color: black;">&lt;/collection</span>-type<span style="font-weight: bold; color: black;">&gt;</span></span></div>
</li>
<li style="font-family: 'Courier New', Courier, monospace; color: black; font-weight: normal; font-style: normal;color:#3A6A8B;">
<div style="font-family: 'Courier New', Courier, monospace; font-weight: normal;"><span style="color: #009900;"><span style="font-weight: bold; color: black;">&lt;/collection</span>-types<span style="font-weight: bold; color: black;">&gt;</span></span> </div>
</li>
</ol>
</div>
</div>
</div>
<p></p>
<p>As you can see the XML schema is fairly simple.  Each collection type gets a node with a unique identifier by way of the 'guid' attribute.  This <acronym title="Globally Unique Identifier">GUID</acronym> gets stored in the database along with the name and description node values for each Collection and the <acronym title="Globally Unique Identifier">GUID</acronym> is used in an XPath query to retrieve the schema from this document at runtime.</p>
<p>The property nodes define the actual form fields that appear when the user adds/edits Collection Items.  There are various property types which relate to the interface elements used when the form is rendered.  Other attributes on each property node relate to how the data should be validated and filtered (such as have the entered text made uppercase or hyperlinks made clickable).  Some more attributes specify default values that should be used, whether values should match another field, be unique etc.</p>
<p><em>The settings node in the XML document is used when the Collection records are viewed in the Content Management System.  The attribute values are used to determine which properties are displayed in a datagrid and which can be searched.</em></p>
<p>And so, the XML simply defines a form to be rendered but also, the fact that we have a record of the structure of the stored content means that we can use this to publish content from the database into HTML (by means of templating), XML (by using the 'id' attribute of each property node as the tag names) and even to an SQLite database.  Since SQLite supports only a few simple data types I was able to simply map the property types (taking into account their validation rules) and create an SQLite database for each Collection on the fly.  This proved to be an ideal solution for <a title="Hybrid Static/Dynamic Content With SQLite" href="http://www.stephenbeattie.com/2008/05/12/hybrid-staticdynamic-content-with-sqlite">reasons I've mentioned before</a>.</p>
<p>So modeling simple content with XML is a very useful way to make your Content Management System flexible and because the content model is not stored recursively in your database, getting at the schema is simple and quick.  If you're planning a <acronym title="Content Management System">CMS</acronym> then I'd strongly recommend this approach</p>
]]></content:encoded>
			<wfw:commentRss>http://www.stephenbeattie.com/2008/05/20/xml-content-modeling/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Essential Programming Tools</title>
		<link>http://www.stephenbeattie.com/2008/05/17/my-essential-programming-tools/</link>
		<comments>http://www.stephenbeattie.com/2008/05/17/my-essential-programming-tools/#comments</comments>
		<pubDate>Sat, 17 May 2008 15:20:59 +0000</pubDate>
		<dc:creator>admin</dc:creator>
				<category><![CDATA[General Programming]]></category>

		<guid isPermaLink="false">http://www.stephenbeattie.com/2008/05/17/my-essential-programming-tools/</guid>
		<description><![CDATA[Here is a list of programming tools I find essential in my development work.  I'm omitting the obvious PHP, Apache, MySQL, Flash, Flex etc. in the hope of highlighting the smaller utilities.  These are the ones off the top of my head but I hope to add to it later.
General Programming

Aptana - PHP [...]]]></description>
			<content:encoded><![CDATA[<p>Here is a list of programming tools I find essential in my development work.  I'm omitting the obvious <a title="PHP" href="http://www.php.net">PHP</a>, <a title="Apache Web Server" href="http://httpd.apache.org/">Apache</a>, <a title="MySQL" href="http://www.mysql.com/">MySQL</a>, <a title="Flash" href="http://www.adobe.com/products/flash/">Flash</a>, <a title="Flex Builder" href="http://www.adobe.com/products/flex/">Flex</a> etc. in the hope of highlighting the smaller utilities.  These are the ones off the top of my head but I hope to add to it later.</p>
<h4>General Programming</h4>
<ul>
<li><a title="Aptana Studio - Community Edition" href="http://www.aptana.com/products/studio/community">Aptana</a> - PHP and Subversion integration, Dreamweaver "Ctrl+U" upload goodness.</li>
<li><a title="Beyond Compare" href="http://www.scootersoftware.com/moreinfo.php">Beyond Compare</a> - Compare folders, zip files, FTP sites.  Integrates well with <a title="Tortoise SVN" href="http://tortoisesvn.tigris.org/">Tortoise SVN</a> and <a title="Tortoise CVS" href="http://www.tortoisecvs.org/">Tortoise CVS</a>.</li>
<li><a title="Notepad++" href="http://notepad-plus.sourceforge.net/uk/site.htm">Notepad++</a> - Excellent file support, the right balance of being lightweight and feature rich for a text editor.</li>
<li><a title="Tortoise SVN" href="http://tortoisesvn.tigris.org/">Tortoise SVN</a> - Windows Explorer integration, very easy to use and unobtrusive Subversion client.</li>
<li><a title="Console (An improvement on cmd.exe)" href="http://sourceforge.net/projects/console">Enhanced Windows Console</a> - A recent find but looks very useful.</li>
</ul>
<h4>Design Tools</h4>
<ul>
<li><a title="Color Cop" href="http://colorcop.net/">Color Cop</a> - Simple, no-nonsense colour picking.</li>
<li><a title="@icon sushi" href="http://www.towofu.net/soft/e-aicon.php">@icon sushi</a> - A really good little .ICO file editor</li>
</ul>
<h4>Flash Development</h4>
<ul>
<li><a title="FlashDevelop" href="http://www.flashdevelop.org/">FlashDevelop</a> - Nice integration with open-source Flash compilers etc.  Better than the ActionScript editor in Flash IDE anyday.</li>
<li><a title="ServiceCapture by Kevin Langdon" href="http://kevinlangdon.com/serviceCapture/">ServiceCapture</a> - Nice tool for debugging AMF, JSON and SOAP.  Acts as a proxy for your browser and so can also be used to throttle bandwidth for testing.</li>
<li><a title=".sol Editor" href="http://sourceforge.net/projects/soleditor/">.sol Editor</a> - A Flash Shared Object file parser and editor.  Very handy indeed.</li>
</ul>
<h4>Network Tools</h4>
<ul>
<li><a title="WinSCP" href="http://winscp.net/eng/index.php">WinSCP</a> - Good SCP Client for remote file administration.</li>
<li><a title="FileZilla" href="http://filezilla-project.org/">FileZilla</a> - Simple, lightweight and efficient FTP Client.  A handy connection manager interface.  Regularly updated.</li>
<li><a title="PuTTY" href="http://www.chiark.greenend.org.uk/~sgtatham/putty/">PuTTY</a> - Command line console for remote server administration.</li>
</ul>
<h4>Database Design &amp; Management</h4>
<ul>
<li><a title="fabFORCE DBDesigner" href="http://www.fabforce.net/dbdesigner4/">fabFORCE DBDesigner</a> - Great (but slightly buggy) tool for sketching out DB schemas visually. Will create/update/reverse-engineer databases.</li>
<li><a title="SQLite2008 Pro Enterprise Manager" href="http://www.osenxpsuite.net/?xp=3">SQLite2008 Pro Enterprise Manager</a> - Powerful tool for managing SQLite databases.  I've found myself using this a lot lately.</li>
</ul>
<h4>.NET Programming</h4>
<ul>
<li><a title="SharpDevelop" href="http://sharpdevelop.net/OpenSource/SD/Default.aspx">SharpDevelop</a> - Very lightweight compared to VS.NET.  Perfect for the odd bit of ASP.NET 2.0 development.</li>
<li><a title="UtliDev Cassini Web Server" href="http://www.ultidev.com/products/Cassini/">UltiDev Cassini Web Server</a> - A No-frills (embeddable) web server for .NET written in .NET. A great development alternative to IIS.</li>
</ul>
]]></content:encoded>
			<wfw:commentRss>http://www.stephenbeattie.com/2008/05/17/my-essential-programming-tools/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Hybrid Static/Dynamic content with SQLite</title>
		<link>http://www.stephenbeattie.com/2008/05/12/hybrid-staticdynamic-content-with-sqlite/</link>
		<comments>http://www.stephenbeattie.com/2008/05/12/hybrid-staticdynamic-content-with-sqlite/#comments</comments>
		<pubDate>Mon, 12 May 2008 09:38:20 +0000</pubDate>
		<dc:creator>admin</dc:creator>
				<category><![CDATA[Content Management]]></category>
		<category><![CDATA[Uncategorized]]></category>

		<guid isPermaLink="false">http://www.stephenbeattie.com/2008/05/12/hybrid-staticdynamic-content-with-sqlite/</guid>
		<description><![CDATA[I've been reading Deane's posts on Gadgetopia a lot recently and one of them refers to the notions of ' Data Push' and 'Template Pull' in terms of how content gets to the page driven by a CMS.  This was an interesting post for me as I've recently found that a combination of these [...]]]></description>
			<content:encoded><![CDATA[<p>I've been reading <a href="http://www.gadgetopia.com/category/12" title="Gadgetopia - Content Management Posts">Deane's posts on Gadgetopia</a> a lot recently and <a href="http://gadgetopia.com/post/5385" title="Gadgetopia - Content Publishing Models">one of them</a> refers to the notions of ' Data Push' and 'Template Pull' in terms of how content gets to the page driven by a <acronym title="Content Management System">CMS</acronym>.  This was an interesting post for me as I've recently found that a combination of these models provided a solution to a problem I was having.</p>
<p>As part of my work for <a href="http://www.golleyslaterdigital.co.uk" title="Golley Slater Digital" target="_blank">Golley Slater Digital</a> I've been architecting a PHP5-based <acronym title="Content Management System">CMS</acronym> that uses the 'Push' model where content authored on a private 'admin' server is published to a public 'live' server to be viewed by end-users.  Essentially, the <acronym title="Content Management System">CMS</acronym> stores content in <a href="http://www.mysql.com/" title="MySQL Homepage">MySQL</a>, writing it out as a hierarchy of static HTML (well PHP really) pages when the user elects to publish.  These static pages, along with the other assets are 'pushed' live using <a href="http://samba.anu.edu.au/rsync/" title="RSync Homepage">RSync</a> which copies them from one server to the other.</p>
<p>In addition to regular page content, there are other types of content such as 'Collections' that are used in the <acronym title="Content Management System">CMS</acronym> and that need to be copied to the live server.  A Collection is a list of structured data types, Collection Items, that are managed independently from page content.  Collection Items have their own approval workflow, go-live dates etc. and can be bound to pages through the admin UI.  Typically, Collections are used for News, Events, <acronym title="Frequently Asked Questions">FAQ</acronym>'s etc. but really any content type that can be modeled with a simple structure is a candidate.</p>
<p>Now up to last month I had stored published Collection Items in XML which was parsed at runtime on the live site (The XML would get conveniently pushed live with RSync along with the pages).  With PHP 5's improved XML support this was a reasonably performant solution and provided a basic storage mechanism for the structured data.  But what if I had thousands of items in a Collection and wanted to perform a complex search to display the results over a few pages?  Hmmmm.  It was achievable with XML but was going to get tricky with XPath expressions and server resources would definitely suffer when parsing the XML and sorting arrays of data. I needed another way.</p>
<p>Enter <a href="http://www.sqlite.org/" title="SQLite Homepage">SQLite</a>! This database engine is embedded into PHP5, and was the answer to my woes.  <a href="http://www.sqlite.org/" title="SQLite Homepage">SQLite</a> databases require no setup, passwords and are nothing more than regular files so they play very nicely with the <a href="http://samba.anu.edu.au/rsync/" title="RSync Homepage">RSync</a> deployment scheme I use.  On top of that since the vast majority of <acronym title="Structured Query Language">SQL</acronym> can be used to query <a href="http://www.sqlite.org/" title="SQLite Homepage">SQLite</a> databases, searching and paging of results was going to be a breeze.  So I made a change to the <acronym title="Content Management System">CMS</acronym> that saw published collection items going into a local database rather than the XML.</p>
<p>Using <a href="http://www.sqlite.org/" title="SQLite Homepage">SQLite</a> means that the <acronym title="Content Management System">CMS</acronym> can effectively queue-up content ahead of a display date and expire content at some point in the future. What's even better is that the published sites are still standalone in nature and do not need any knowledge of the <acronym title="Content Management System">CMS</acronym> which created them.</p>
<p>O.k. so using <a href="http://www.sqlite.org/" title="SQLite Homepage">SQLite</a> is nothing groundbreaking but the application of it in this context made me stop thinking of a database as something at the bottom of a technology stack and as an portable and intelligent file format that can be shared between applications.  Revelation!</p>
<p>If you're planning a <acronym title="Content Management System">CMS</acronym> then I recommend you look at <a href="http://www.sqlite.org/" title="SQLite Homepage">SQLite</a> for creating hybrid static/dynamic pages.  It certainly opened some doors for me.</p>
<p>Disclaimer: Yes, I used the word 'performant' in this post.  Apparently it's <a href="http://boulter.com/blog/2004/08/19/performant-is-not-a-word/" title="Performant - Not a Word">not a word</a> but I like it. So Sue me.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.stephenbeattie.com/2008/05/12/hybrid-staticdynamic-content-with-sqlite/feed/</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
	</channel>
</rss>

<!-- Dynamic Page Served (once) in 0.633 seconds -->
