<?xml version="1.0" encoding="utf-8"?>
<rss version="2.0" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:sy="http://purl.org/rss/1.0/modules/syndication/" xmlns:admin="http://webns.net/mvcb/" xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#" xmlns:content="http://purl.org/rss/1.0/modules/content/">
	<channel>
		<title>The Watchmaker Project Blog</title>
		<link>http://www.thewatchmakerproject.com/</link>
		<description>Blog entries from The Watchmaker Project, Matthew Pennell.</description>
		<dc:language>en</dc:language>
		<dc:creator>rss@thewatchmakerproject.com</dc:creator>
		<dc:rights>Copyright 2010</dc:rights>
		<dc:date>2010-03-25T11:18:12+00:00</dc:date>
		<admin:generatorAgent rdf:resource="http://expressionengine.com/" />
		
			<item>
				<title>Bill Nighy makes a mean cocktail</title>
				<link>http://www.thewatchmakerproject.com/blog/bill-nighy-makes-a-mean-cocktail/</link>
				<guid>http://www.thewatchmakerproject.com/blog/bill-nighy-makes-a-mean-cocktail/#When:11:18:12Z</guid>
				<content:encoded><![CDATA[<p>I’d been looking forward to the movie for at least thirty seconds, although now I can’t even remember its name. A tired sequel to a Disney franchise, I think; anthropomorphic animals and plants, singing and dancing. Don’t ask me why we wanted to see it. The cinema was actually inside the hotel where she worked, and I was hoping we could make it from the restaurant over to the cinema with enough time to catch the Pepsi adverts.</p>

<p>In the restaurant&mdash;upscale dining, large round tables, food that you know is too expensive but feels like a treat to order&mdash;I caught her arm. We had to go.</p>

<p>“One more order then I’m ready.”</p>

<p>I followed her over to the bar area, dodging the other staff as they swirled and eddied around the tables, almost falling over the girl crouched at the top of the small flight of stairs cleaning cutlery. I leaned against the smooth top of the bar and watched her as she filled her tray; two coffees and a dark, bitter-looking cocktail.</p>

<p>“I’ll take that for you,” said another anonymous waitresses, leaning across the bar, hand extended to claim and balance the laden tray.</p>

<p>“Thanks,” she said. Dropping her apron in a drawer, she took my hand. “Let’s go!”</p>

<p>Through the restaurant entrance hall, we pushed through the heavy double doors and out into the hotel reception area.</p>

<p>“Just a second,” I said, “there’s something I need to do.”</p>

<p>Cutting diagonally across the broad carpeted floor I entered the small hotel bar. It was empty save for the occupants of the only two stools at the counter; a midget wearing a gold lamé suit, and BAFTA award-winning actor Bill Nighy. Turning to regard me, Nighy slowly rose and moved behind the bar.</p>

<p>“Drink?” he asked, placing a whisky in front of me. I sipped it quickly as the pair watched me. The dwarf hopped down from his stool and moved towards the door.</p>

<p>“Another.” insisted Nighy; this time a shot glass of tequila appeared on the bar.</p>

<p>“No, I’m afraid I really have to go,” I protested. The dwarf stood aside as I left the bar, but turning back I bent down to bring myself level with his ear. “Can you tell me where the toilets are?”</p>

<p>Raising one arm he indicated a door further down the corridor. “Thanks,” I said. Sweet relief.</p>

<p>As I pushed hard on the heavy swing door, I woke up. Perhaps unsurprisingly, I really needed to pee.</p>]]></content:encoded>
				<dc:subject>Dreams, Personal, Writing</dc:subject>
				<dc:date>2010-03-25T11:18:12+00:00</dc:date>
			</item>
		
			<item>
				<title>Write PHP Properly</title>
				<link>http://www.thewatchmakerproject.com/blog/write-php-properly/</link>
				<guid>http://www.thewatchmakerproject.com/blog/write-php-properly/#When:15:59:45Z</guid>
				<content:encoded><![CDATA[<p>For your reading pleasure this week, I bring you two cautionary tales on the importance of not taking shortcuts in your PHP code, or making assumptions about your (future) hosting environment.</p>

<h2>Short tags off</h2>

<p>For years I&#8217;ve been using PHP&#8217;s short tags to write out variables within HTML. For this habit I at least partially blame the <a href=”http://codeigniter.com/”>CodeIgniter</a> documentation, which uses short tags liberally to illustrate how to output variables set in the controller into a view file. For example:</p>

<pre class="code">
&lt;p&gt;Welcome back, &lt;?= $name ?&gt;!&lt;/p&gt;
</pre>

<p>Unfortunately this approach falls down when you find yourself deploying to a server that has had PHP compiled with short tag support off. The above code will not be parsed by the PHP engine&#8230; but the presence of angle-brackets will mean that you won&#8217;t see the unparsed output on the web page; so you end up with blank spaces, viz:</p>

<pre class="code">
Welcome back, !
</pre>

<p>The &#8216;fix&#8217; for this laziness is, of course, not to use short tags, even when outputting the simplest of variables:</p>

<pre class="code">
&lt;p&gt;Welcome back, &lt;?php echo $name; ?&gt;!&lt;/p&gt;
</pre>

<p>It is also a good practice to get into in readiness for PHP6, which will be removing the ability to use short tags altogether.</p>

<h2>Don&#8217;t rely on truthy and falsey values</h2>

<p>Like several other languages, PHP has a concept of truthiness and falsiness when it comes to evaluating <a href="http://www.php.net/manual/en/language.types.boolean.php#language.types.boolean.casting" title="PHP.net boolean conversions">boolean</a> expressions. The number zero, an empty string, NULL or undefined will all evaluate to FALSE in a simple expression:</p>

<pre class="code">
&lt;?php
$x = 0;
$y = &#8217;&#8216;;
if ($x || $y || $z) {
&nbsp; echo "This will not be displayed";
}
?&gt;
</pre>

<p>(Yes, I know you can test if a variable is actually FALSE by using the triple-equals sign === in the conditional, but that&#8217;s not what this point is about.)</p>

<p>So we know that we can rely on PHP returning FALSE whenever we test a non-existing, empty or zero variable. Using this knowledge, we can check for the presence of incoming settings before doing things:</p>

<pre class="code">
&lt;?php if ($_GET[&#8216;foo&#8217;]): ?&gt;
&nbsp; &lt;p&gt;You submitted the foo item.&lt;/p&gt;
&lt;?php endif; ?&gt;
</pre>

<p>We can even write quite neat little loops using array indices:</p>

<pre class="code">
&lt;?php
while ($myarr[0])
{
&nbsp; process_item(array_shift($myarr));
}
?&gt;
</pre>

<p>So where&#8217;s the problem here? Well, all of those tests for non-existent variables or array items will throw a PHP <code>E_NOTICE</code> level error. Usually this isn&#8217;t a problem; most apps and PHP installations set the default error reporting value to <code>E_ALL &amp; ~E_NOTICE</code>, which is to say they do not include <code>E_NOTICE</code> errors. No errors are shown on your web pages, and everything is fine.</p>

<p>That is, until you notice that the error_log on your live server has filled up with over a gigabyte of PHP errors per day. Yup, it&#8217;s another server configuration issue, this time one that writes every single notice to a text file. And if, like me, you were relying on the above behaviour then that text file gets very big, very fast.</p>

<p>To fix this problem just takes a little more discipline when coding. In short, always check for the presence of a variable or array key before checking its value:</p>

<pre class="code">
&lt;?php if (isset($_GET[&#8216;foo&#8217;]) &amp;&amp; $_GET[&#8216;foo&#8217;] == &#8216;bar&#8217;): ?&gt;
&nbsp; &lt;p&gt;You submitted the foo item.&lt;/p&gt;
&lt;?php endif; ?&gt;
</pre>

<p>Now the first part of the conditional&mdash;<code>isset($_GET[&#8216;foo&#8217;])</code>&mdash;will fail, and the second part with the non-existent array key will never be evaluated.</p>]]></content:encoded>
				<dc:subject>PHP</dc:subject>
				<dc:date>2010-03-19T15:59:45+00:00</dc:date>
			</item>
		
			<item>
				<title>One quick thought of my own on the new Apple iPad</title>
				<link>http://www.thewatchmakerproject.com/blog/one-quick-thought-of-my-own-on-the-new-apple-ipad/</link>
				<guid>http://www.thewatchmakerproject.com/blog/one-quick-thought-of-my-own-on-the-new-apple-ipad/#When:14:20:52Z</guid>
				<content:encoded><![CDATA[<p>So I just spent my lunch hour catching up with my neglected feedreader (tip: never let your feeds pile up over an Apple event!) and I haven&#8217;t seen anyone else raise this point, so here goes.</p>

<p>I don&#8217;t know about you, but personally my 16Gb iPhone is mostly full of music. There are a few odd podcasts, less than a hundred photos, and a couple-dozen apps, but for the most part&mdash;70, 80-percent&mdash;it&#8217;s music that takes up the space.</p>

<p>And that makes sense for what I use it for&mdash;as a phone, a portable music player, a games device and, occasionally, a camera.</p>

<p>Now consider the new <a href="http://www.apple.com/ipad/">Apple iPad</a>, which comes in 16Gb, 32Gb and 64Gb sizes. If its primary target market is folks sat on their sofa, idly surfing the web, dealing with emails or playing games, does music really fit into that usage profile? I can&#8217;t imagine that the built-in speakers are that much cop, plus if you&#8217;re moving the thing around you&#8217;re hardly experiencing the optimal listening experience. Earphones? Not convenient, not like being able to slip your iPod or iPhone into your pocket when you need to get up and go somewhere. And anyway, who doesn&#8217;t have some other means of listening to music?</p>

<p>So what is going to take up all that flash drive space? It has various &#8220;Productivity&#8221; apps&mdash;word processing, spreadsheets, and so forth&mdash;but those don&#8217;t take up much space. iBooks? Again, they&#8217;re mostly text, they don&#8217;t need the space either.</p>

<h2>So it&#8217;s got to be apps&#8230;</h2>

<p>...and lots of them. Is Apple betting on the iPad to drive even more growth in App Store sales than they&#8217;ve already seen with the iPhone and iPod Touch?</p>

<p>And if you have trouble keeping track of a few dozen apps on your iPhone, how will you cope with a few hundred on an iPad?</p>]]></content:encoded>
				<dc:subject>iPhone, Macintosh</dc:subject>
				<dc:date>2010-02-10T14:20:52+00:00</dc:date>
			</item>
		
			<item>
				<title>Potential EE add&#45;ons: What would you like first?</title>
				<link>http://www.thewatchmakerproject.com/blog/potential-ee-add-ons-what-would-you-like-first/</link>
				<guid>http://www.thewatchmakerproject.com/blog/potential-ee-add-ons-what-would-you-like-first/#When:14:56:31Z</guid>
				<content:encoded><![CDATA[<p>Partly because I really don&#8217;t know, but mostly because I haven&#8217;t got anything else to write about this week for <a href="http://project52.info/">Project 52</a>, here is a list of potential <a href="http://expressionengine.com/">ExpressionEngine</a> add-ons I plan to build&mdash;and I&#8217;d like you to tell me which to do first.</p>

<p>Of course, it&#8217;s entirely possible that someone has already done any or all of these and I just haven&#8217;t found them yet&#8230; in which case please point me in the right direction and save me a ton of unnecessary work!</p>

<h2>Related fieldtype dropdowns</h2>

<p>If you ever have a client with thousands of pages (or products or whatever) that wants to use related entries, the default dropdown format isn&#8217;t very useful for them. This add-on will replace some or all related fieldtypes with those snazzy &#8220;search as you type&#8221; Ajax-powered search fields. Neato!</p>

<h2>Ree-Categorize</h2>

<p>Can&#8217;t make an ExpressionEngine add-on without a double-e pun, right? This idea is an extension to the current way categories work when you delete one that has entries; instead of just leaving a bunch of orphaned entries, it will prompt you to re-categorise them.</p>

<h2>Category Image URL Fieldtype</h2>

<p>Hopefully a simple one, this&mdash;lets you use a helpful file manager fieldtype for the Category Image URL field. At the moment it&#8217;s just a text field, which is not exactly helpful for non-technical clients. Replacing it with something like the <a href="http://www.ngenworks.com/software/ee/ngen-file-field/">nGen File Field</a> file upload tool would be very handy if you rely on category imagery.</p>

<h2>Mac OS X Dashboard Widget</h2>

<p>Okay, this last one isn&#8217;t exactly an EE add-on, but I find it very handy. It&#8217;s a dashboard widget for Mac that just lists all the latest comments on any of your pages, and lets you click through to edit or delete them. It&#8217;s very useful if like me you don&#8217;t get to see any &#8216;new comment&#8217; emails until you get home but want to stay on top of comment spam. I guess it could also be used to keep a count of things like caught spam or Akismet&#8217;s tally too.</p>

<h2>Cast your vote now</h2>

<p>Alright, I&#8217;m not actually taking votes, but I&#8217;d be interested to see what people think of these potential add-ons, and if there&#8217;s a clear winner I&#8217;ll make that my priority for development. Tell me what to do, please&#8230;</p>]]></content:encoded>
				<dc:subject>ExpressionEngine, Macintosh, Personal</dc:subject>
				<dc:date>2010-02-09T14:56:31+00:00</dc:date>
			</item>
		
			<item>
				<title>Reading List 2009</title>
				<link>http://www.thewatchmakerproject.com/blog/reading-list-2009/</link>
				<guid>http://www.thewatchmakerproject.com/blog/reading-list-2009/#When:19:26:55Z</guid>
				<content:encoded><![CDATA[<p>Just as I have done for the last two years, I&#8217;ve been carefully recording my reading material. 2009&#8217;s repository was Nathan Borror&#8217;s excellent new web app, <a href="http://www.readernaut.com/">Readernaut</a> - and the final total is a not completely unimpressive thirty.</p>

<h2>Fiction</h2>

<p>Still trying to improve my consumption of &#8220;classic&#8221; literature, I slogged through Midnight&#8217;s Children last year, which was not an easy read but ultimately rewarding. The only other book that really made an impression was the excellent high-concept novel, The Time Traveller&#8217;s Wife.</p>

<ul>
<li>My Favourite Wife (Tony Parsons)</li>
<li>The Time Traveller&#8217;s Wife (Audrey Niffenegger)</li>
<li>Good Omens (Terry Pratchett, Neil Gaiman)</li>
<li>Revolutionary Road (Richard Yates)</li>
<li>By Design (Richard E Grant)</li>
<li>A Matter For Men (David Gerrold)</li>
<li>Farnham&#8217;s Freehold (Robert A Heinlein)</li>
<li>Time For The Stars (Robert A Heinlein)</li>
<li>Ysabel (Guy Gavriel Kay)</li>
<li>Midnight&#8217;s Children (Salman Rushdie)</li>
<li>The Magicians (Lev Grossman)</li>
<li>Requiem for a Dream (Hubert Selby Jr)</li>
<li>Nation (Terry Pratchett)</li>
</ul>

<h3>eBooks</h3>

<p>As I&#8217;ve been travelling a lot this year, I occasionally found that I didn&#8217;t have the bag space to fit a book into my overnight bag. Thus, eBooks on iPhone have made their first appearance on my reading list. </p>

<ul>
<li>The Adventures of Sherlock Holmes (Arthur Conan Doyle)</li>
<li>The Curious Case of Benjamin Button (F Scott Fitzgerald)</li>
<li>A Princess of Mars (Edgar Rice Burroughs)</li>
</ul>

<h2>Non-fiction</h2>

<ul>
<li>The Audacity of Hope (Barack Obama)</li>
<li>Outliers (Malcolm Gladwell)</li>
<li>Droidmaker (Michael Rubin)</li>
</ul>

<p>Droidmaker, the story behind the birth of movie special effects and George Lucas&#8217; role in that art&#8217;s genesis, was actually a free PDF recommended by Michael Heilemann of <a href="http://www.binarybonsai.com/">Binary Bonsai</a>, but I&#8217;d certainly pick it up for a coffee table book if I saw it in the shops. It was an excellent geek read.</p>

<h2>Fantasy</h2>

<p>Yet more fantasy to pad out my reading list. This year I discovered Robin Hobb, and I&#8217;m slowly slogging through her various trilogies. Looking forward to <a href="http://www.joeabercrombie.com/">Joe Abercrombie</a>&#8216;s new book, due out sometime in 2010.</p>

<ul>
<li>Best Served Cold (Joe Abercrombie)</li>
<li>Tigana (Guy Gavriel Kay)</li>
<li>Assassin&#8217;s Apprentice (Robin Hobb)</li>
<li>Royal Assassin (Robin Hobb)</li>
<li>Assassin&#8217;s Quest (Robin Hobb)</li>
<li>Ship of Magic (Robin Hobb)</li>
<li>The Mad Ship (Robin Hobb)</li>
</ul>

<h3>Graphic Novels</h3>

<p>I re-read Watchmen before going to see the (excellent, faithfully adapted) film in March.</p>

<ul>
<li>Watchmen (Alan Moore, Dave Gibbons)</li>
<li>World War Hulk (Greg Pak)</li>
<li>Batman: The Killing Joke (Alan Moore, Brian Bolland, John Higgins)</li>
<li>Batman: Arkham Asylum (Grant Morrison)</li>
</ul>

<h2>Highlights of 2009</h2>

<p>Despite reading more than in 2008, it&#8217;s difficult to pick out any real standout books from the preceding lists. <a href="http://www.amazon.co.uk/Time-Travelers-Wife-Audrey-Niffenegger/dp/0099464462/thewatchmaker-21" title="The Time Traveller's Wife on Amazon.co.uk">The Time Traveller&#8217;s Wife</a> was clever but ultimately forgettable; <a href="http://www.amazon.co.uk/Midnights-Children-Vintage-Classics-Rushdie/dp/0099511894/thewatchmaker-21" title="Midnight's Children on Amazon.co.uk">Midnight&#8217;s Children</a> was impressive but hard work. So no real recommendations from me, just a reaffirming of my intentions to actually read some more &#8220;proper&#8221; literature in the coming twelvemonth.</p>]]></content:encoded>
				<dc:subject>Books, Personal</dc:subject>
				<dc:date>2010-01-30T19:26:55+00:00</dc:date>
			</item>
		
			<item>
				<title>My World of Warcraft</title>
				<link>http://www.thewatchmakerproject.com/blog/my-world-of-warcraft/</link>
				<guid>http://www.thewatchmakerproject.com/blog/my-world-of-warcraft/#When:20:58:08Z</guid>
				<content:encoded><![CDATA[<p>I don&#8217;t often mention things I do in my spare time on this blog, but this week I&#8217;m going to make an exception and talk about the only game that I could really claim to play: World of Warcraft.</p>

<h2>Now I&#8217;m not much of a gamer</h2>

<p>I have Call of Duty 4 but never play it, and a couple of Lego games on the Wii, but I&#8217;ve never really dedicated all that much of my life to completing video games. There&#8217;s no reason I couldn&#8217;t get myself a Playstation or Xbox, but I tend to think that taking over the living room television to kill terrorists or trash Liberty City is kind of unfair to my wife, who prefers to use the telly in the evening for what is, to be fair, its intended purpose.</p>

<p>So, no real console, and as a Mac user I&#8217;m not exactly blessed with a wide selection of computer games to choose from.</p>

<p>Luckily one of the few games to get a Mac conversion is Blizzard&#8217;s runaway success, World of Warcraft.</p>

<h2>For The Horde!</h2>

<p>I originally started playing in late 2008 after avoiding it for years, and was immediately sucked in by the immersive world, rewarding progression and social interaction. Sucked in a little too far, as it turns out; when I found that I was spending more time reading strategy guides and wowwiki entries on DPS gearing than I was enjoying the game, I uninstalled it and cancelled my account. I didn&#8217;t want to be one of those guys with spreadsheets full of cross-referenced armour points, committed to four hours a night raiding. I left my Level 53 Priest on his horse in Un&#8217;Goro Crater and quit.</p>

<p>Last year I went back, but this time it&#8217;s different. I don&#8217;t care about gear and quick levelling - no addons for me this time around - the only reason to play is for the fun of it. And whatever its detractors might say about geeks pretending to be elves, it is a lot of fun; it&#8217;s got that perfect balance of carrot and stick to constantly have you questing after the ever-so-slightly-better weapon or piece of armour, and the satisfaction of bringing down a particularly troublesome bad guy with the help of a random bunch of people willing to stop what they are doing and help out a stranger is better than any Xbox achievement.</p>

<p>Of course, the real reason for this post is that I wanted an excuse to use the new, embeddable Armoury viewer and show off my current main character:</p>

<p>&nbsp;</p><iframe src="http://eu.wowarmory.com/character-model-embed.xml?r=Steamwheedle+Cartel&amp;cn=Sevenfingers&amp;rhtml=true" scrolling="no" height="588" width="321" frameborder="0"></iframe>

<p>I&#8217;ve kind of reached something of a platform now that he&#8217;s Level 80. Once you hit that top level it gets harder and harder to avoid needing to know your stats if you want to progress, but I really don&#8217;t want to be constantly comparing armour bonuses and running the same dungeons over and over for that elusive cloak. I did my first raid today (until latency overcame me and I had to drop out), but that becomes even more a time-suck.</p>

<p>Still, <a href="http://www.worldofwarcraft.com/cataclysm/">Cataclysm</a> comes out this year, bringing with it two completely new races to play. Oh, and destroying the World As We Know It as well, which should go some way to eliminating the boredom that is just starting to creep in.</p>]]></content:encoded>
				<dc:subject>Games, Personal</dc:subject>
				<dc:date>2010-01-24T20:58:08+00:00</dc:date>
			</item>
		
			<item>
				<title>How to make a quickstart folder for your projects</title>
				<link>http://www.thewatchmakerproject.com/blog/how-to-make-a-quickstart-folder-for-your-projects/</link>
				<guid>http://www.thewatchmakerproject.com/blog/how-to-make-a-quickstart-folder-for-your-projects/#When:12:15:06Z</guid>
				<content:encoded><![CDATA[<p>Here&#8217;s a simple little tip to save a few precious seconds each time you sit down to start work on a website project.</p>

<h2>Bookmark This</h2>

<p>This is certainly true for me, and probably true for all web developers&mdash;when you are working on a project, there is a set of sites and URLs that you need to have open. For me this usually means:</p>

<ul>
<li>The project to-do list in Basecamp</li>
<li>The site on my localhost</li>
<li>The site&#8217;s control panel</li>
<li>phpMyAdmin</li>
<li>The ExpressionEngine documentation</li>
<li>php.net (for looking up the occasional function or when I can&#8217;t remember those damn date formatting letters)</li>
</ul>

<p><img src="http://www.thewatchmakerproject.com/images/uploads/quicklinks-1.jpg" title="All the links I need for work on this client project" alt="An open bookmarks folder on Firefox's toolbar" width="380" height="207" class="col five"></p>

<p>Now you could just open up each site as-and-when you need it, but one trick that I&#8217;ve discovered is to place all of those links into a folder on your browser&#8217;s Bookmarks Toolbar (I keep mine under a master folder named &#8220;Clients&#8221;). Now when you sit down to work on something, go to that folder and Ctrl-click on it (Cmd-click on Mac) or select the &#8220;Open All in Tabs&#8221; option. This shortcut will open up every link in the folder as a new tab; with just one click, your browser is now set up with everything you need to get started on that project.</p>

<h3>Development vs. Live</h3>

<p>This technique can be extended to cover Development vs. Live environments too. Perhaps when working with the live site you need to add your Plesk control panel or links to other third-party services that you are using&mdash;just include any frequently accessed sites in the relevant folder, and you&#8217;re one click away from being ready to work.</p>

<h2>So there you have it</h2>

<p>A simple way to save yourself a little wasted time while you work on the Next Big Thing&trade;.</p>]]></content:encoded>
				<dc:subject>Productivity</dc:subject>
				<dc:date>2010-01-14T12:15:06+00:00</dc:date>
			</item>
		
			<item>
				<title>New Year&#8217;s Resolutions // Project 52</title>
				<link>http://www.thewatchmakerproject.com/blog/new-years-resolutions-project-52/</link>
				<guid>http://www.thewatchmakerproject.com/blog/new-years-resolutions-project-52/#When:16:39:32Z</guid>
				<content:encoded><![CDATA[<p>Perhaps I should feel bad that last year&#8217;s &#8220;Resolutions&#8221; post is still languishing in my Drafts folder, not so much unfinished as barely started. But 2009 kept me so busy that I barely had time to think, let alone blog. That is something I intend to change in 2010.</p>

<h2>2009</h2>

<p>Last year was the first working directly for the Amsterdam office at Booking.com, and the regular travel that entails means that my carbon footprint has taken on Sasquatch-like proportions. I also managed to squeeze in a third trip to <a href="http://www.sxsw.com/">South By South West</a> in March, and a holiday in the Lake District before it all went under water.</p>

<p>2009 was also my busiest freelance year ever, although (happily) that actually meant fewer actual clients. Working with other local freelancers like <a href="http://www.dspoke.com/">Digital Spoke</a> and <a href="http://www.creativefreedom.co.uk/">Creative Freedom</a> meant I could concentrate on what I do best - which, this year, has been exclusively <a href="http://www.expressionengine.com/index.php?affiliate=thewatchmakerproject">ExpressionEngine</a> development. I even managed to make it to the first ever <a href="http://eeci2009.com/">EECI conference</a> in Leiden in October, where I met old friends and took <a href="http://eeinsider.com/blog/matthew-pennells-thorough-eeci-notes/">far too many notes</a>.</p>

<h2>2010 Resolutions</h2>

<ul>
<li><strong>Less freelance work.</strong> While I&#8217;ve definitely learned a lot about what ExpressionEngine can do this year, and the extra money has been nice, I&#8217;m going to try to cut down on freelance work this year to spend more time with my family and on projects around the house.</li>
<li><strong>Get fit.</strong> A side-effect of spending all my time in front of a computer has been a general deterioration in my health - this year will be spent getting back in something resembling shape. Of course, being a geek this may involve gadgets and web apps; more on this topic when I start my <em>Geek&#8217;s Guide To Getting Fit</em> later this month.</li>
<li><strong>Update this site.</strong> Not a redesign, but this site badly needs some attention. It&#8217;s still running EE 1.6.5 for God&#8217;s sake! When I launched it last January I had a to-do list of remaining tasks that has only grown as I&#8217;ve neglected it in favour of paying work.</li>
<li><strong>Less travel.</strong> No SXSW for me this year, and probably no conferences other than work ones.</li>
</ul>

<p>And finally on the list of New Year&#8217;s resolutions&#8230;</p>

<h2>Project 52</h2>

<p>My friend and talented artist <a href="http://www.antonpeck.com/">Anton Peck</a> launched <a href="http://project52.info/">Project 52</a> late last year. From the site:</p>

<blockquote><p>Project 52 is a personal challenge geared toward getting fresh content on your website. The goal is to write at least one new article per week for one year.</p></blockquote>

<p>If you ignore the flurry of activity in October following my trip to the EECI conference, I only managed a paltry seventeen posts last year, so this year I&#8217;ll be joining over 600 other people  and writing a lot more on this blog as my contribution to Project 52. I already have several juicy ideas lined up for you lucky people, including a complete rewrite of my <a href="http://v3.thewatchmakerproject.com/journal/276/building-a-simple-php-shopping-cart" title="A PHP shopping cart tutorial from 2005">simple PHP shopping cart</a> script so I have somewhere to direct the people who still send me weekly support request emails over five years after I wrote the damn thing. (And massive congratulations to Anton for kick-starting this project. Over 600 people - that&#8217;s more than thirty-thousand new pieces of content!)</p>

<h2>So that&#8217;s the plan</h2>

<p>Less work, more exercise, less travel, more writing.</p>

<p>I&#8217;m quite looking forward to 2010.</p>]]></content:encoded>
				<dc:subject>Blogging, ExpressionEngine, Freelancing, Personal, The Site</dc:subject>
				<dc:date>2010-01-05T16:39:32+00:00</dc:date>
			</item>
		
			<item>
				<title>Jonathan Longnecker &#45; From Design To Dynamic: Rapid Development with ExpressionEngine</title>
				<link>http://www.thewatchmakerproject.com/blog/jonathan-longnecker-from-design-to-dynamic-rapid-development-with-expressio/</link>
				<guid>http://www.thewatchmakerproject.com/blog/jonathan-longnecker-from-design-to-dynamic-rapid-development-with-expressio/#When:12:30:46Z</guid>
				<content:encoded><![CDATA[<p>Jonathan Longnecker is a developer with <a href="http://fortysevenmedia.com/">fortyseven media</a>. He discussed the tips and tricks they use to quickly build new ExpressionEngine sites.</p>

<p>Slides and code examples from the talk are on <a href="http://fortysevenmedia.com/blog/archives/eeci2009_slideshow_and_presentation_notes/">Jonathan&#8217;s site</a>.</p>

<h2>Introduction</h2>

<ul>
<li>The problem is that EE developers are too awesome. Add-on development has exploded, and functionality and usefulness is really amazing. <a href="http://buildwithstructure.com/">Structure</a> is a great example of this.</li>
<li>We typically use 15+ addons for every site, with the same kind of templates and global variables</li>
<li>The solution is to set up a sandbox site where the core and all add-ons are kept up-to-date. Add some default templates and global variables, a weblog for content, and some sweet tricks and you have the ability to rapidly build out new sites</li>
<li>We will be adding new things to it as we find great add-ons</li>
</ul>

<h2>Add-Ons</h2>

<ul>
<li><a href="http://leevigraham.com/cms-customisation/expressionengine/lg-addon-updater/">LG Addon Updater</a></li>
<li><a href="http://leevigraham.com/cms-customisation/expressionengine/lg-htaccess-generator/">LG htaccess Generator</a>: Generates your <strong>.htaccess</strong> file, removes <strong>index.php</strong> and much, much more</li>
<li><a href="http://leevigraham.com/cms-customisation/expressionengine/lg-add-sitename/">LG Add Sitename</a>: Enables Control Panel admin page title replacements, client logo</li>
<li><a href="http://leevigraham.com/cms-customisation/expressionengine/lg-tinymce/">LG TinyMCE</a>: Not convinced it&#8217;s the best choice, and it&#8217;s not good with pasted text. Turn off source formatting, spans and brs, take out the image upload, add blockquote</li>
<li><a href="http://www.experienceinternet.co.uk/resources/details/sl-developer-info/">SL Developer Info</a>: Lists all weblogs, templates, and other useful developer shortcuts. Give it it&#8217;s own custom tab in your nav bar</li>
<li><a href="http://www.lumis.com/page/imgsizer/">ImgSizer</a>: Resizes and crops intelligently and creates thumbnails; make sure you create a &#8220;sized&#8221; directory in your images folder</li>
<li><a href="http://www.solspace.com/software/detail/freeform/">Solspace&#8217;s Freeform</a></li>
<li><a href="http://brandon-kelly.com/fieldframe">FieldFrame</a>: Changes the way you can put together certain types of content</li>
<li><a href="http://www.ngenworks.com/software/ee/ngen-file-field/">nGen File Field</a></li>
<li><a href="http://buildwithstructure.com/">Structure</a>: Radically changes the way you handle content pages and navigation. Scared of using it initially as I thought it would lock me into certain way of developing templates, but it really has potential to speed up certain parts of your site; secondary static pages are a lot faster to set up</li>
</ul>

<h2>Tips and tricks</h2>

<ul>
<li>In your <a href="http://expressionengine.com/docs/cp/templates/template_preferences.html">Template Preferences</a>, turn on save template revisions (I use five) for added protection from mistakes, and always save templates as files</li>
<li>Create a &#8220;content&#8221; weblog with custom fields - meta keywords, meta description, a body (TinyMCE field type), and images (an FF Matrix). A <a href="http://vimeo.com/5194268" title="Video tutorial on Vimeo">sweet trick invented by AJ Penninga</a> is to set up your images as a FF Matrix with a File field, title, radio group of sizes, radio group for crop height (optional), and dropdown for alignment. Then to insert the image add <code>{image_1}</code>, <code>{image_2}</code>, etc. in the body content. Your content template then uses <a href="">LG_Replace</a> to loop through the matrix images and replace those tags with the images inside the <code>{images}</code> tag</li>
<li>Create a client member group with access to file uploads, Structure and weblogs</li>
<li>Create <a href="http://expressionengine.com/docs/templates/globals/index.html">global variables</a>: I use html_head (containing doctype, static meta tags, favicon link, etc.), html_closing, jquery, javascript, rss (just your RSS links), and stylesheets</li>
<li>Create templates in site and _global groups: footer, header, nav (containing Structure&#8217;s <code>nav_main</code> tag), sidebar (using Structure&#8217;s <code>nav_sub</code> tag) and content (using Structure&#8217;s <code>title_trail</code> tag to build the <code><title></code> element)</li>
<li>Keep the <code><body></code> tag inside each template so you can add a dynamic CSS id or class to it</li>
<li>Replace the default homepage with a list of what&#8217;s been installed and configured on the sandbox site</li>
<li>Moving servers is now faster than installing a new site, as the sandbox site is ready to go - just copy the database and files over and amend the <strong>config.php</strong> settings</li>
</ul>

<p>Jonathan ended with a live demonstration of creating a new site from scratch, using Structure to create pages and place them in the site <abbr title="Information Architecture">IA</abbr> really quickly, generate automatic navigation, and use Structure&#8217;s Listings feature to attach weblog entries to a page (a la a design portfolio). Structure makes it impressively easy to re-order navigation items.</p>]]></content:encoded>
				<dc:subject>ExpressionEngine</dc:subject>
				<dc:date>2009-10-26T12:30:46+00:00</dc:date>
			</item>
		
			<item>
				<title>Jamie Pittock &#45; The Art Of Proactive Parenting</title>
				<link>http://www.thewatchmakerproject.com/blog/jamie-pittock-the-art-of-proactive-parenting/</link>
				<guid>http://www.thewatchmakerproject.com/blog/jamie-pittock-the-art-of-proactive-parenting/#When:12:27:12Z</guid>
				<content:encoded><![CDATA[<p>Jamie Pittock is Operations Director for Nottingham-based <a href="http://erskinedesign.com/">Erskine Design</a>. He discussed effective ways to develop ExpressionEngine sites that increase understanding and remove uncertainty for your clients.</p>

<p>Jamie&#8217;s slides can be viewed on <a href="http://www.slideshare.net/jamiepittock/the-art-of-proactive-parenting">SlideShare</a>.</p>

<h2>Managing client expectations</h2>

<ul>
<li>Design your content model around the client&#8217;s existing content - take example content from client, and identify the fields, types and field names needed</li>
<li><abbr title="What You See Is What You Get">WYSIWYG</abbr> - clients come wanting total control of their content. They are proposing a solution before you understand their problem. Often they just have specific issues. Designers get lazy and clients shouldn&#8217;t design</li>
<li>You need to think about how you would write this content. Create a template to give to their content creators. <a href="http://www.ngenworks.com/software/ee/ngen-file-field/">nGen File field</a> is the best solution for files at the moment</li>
<li>Live Demo: The new ed_imageresizer plugin from Erskine does image resizing on the fly and caches results. It will be available soon</li>
<li>Don&#8217;t always have to give the client what they ask for. e.g. No WYSIWYG, just multiple images/captions/alignment fields for main body and extended text. We use Textile. What if they want more images? You can only design and model content based on what the client tells you at the time. Don&#8217;t be afraid to tell the client that</li>
<li>Audience comment: &#8220;Publishing online is <strong>not</strong> creating Word documents.&#8221;</li>
<li>Influence and advise client using size of fields, instructions, options available</li>
<li>Make it fun. Clients need to enjoy managing their site. Make them feel like designers. Enable them to do something they never thought they&#8217;d be able to do. Make it feel less like work (and less like Word)</li>
</ul>

<h2>Improve the Control Panel</h2>

<ul>
<li><strong>#8 Signpost using tabs.</strong> Make tabs for things the client needs access to</li>
<li><strong>#7 Remove what isn&#8217;t needed.</strong> Current dashboard is laughable; get rid of notepad, bulletins, comments, etc. Same on Edit tab - opportunities to remove confusion - remove trackback column, comment count, etc.</li>
<li><strong>#6 Improve usability.</strong> Add hover dropdown on edit tab, install <a href="http://expressionengine.com/downloads/details/edit_tab_ajax/">Edit Tab AJAX extension</a></li>
<li><strong>#5 Add extra content.</strong> Add extra columns to Edit page (e.g. Categories)</li>
<li><strong>#4 Content Previews.</strong> Use Live Look. Fix the Publish page buttons and kill the default &#8216;Saved&#8217; page using the <a href="http://www.ngenworks.com/software/ee/publish-tweeks/">Publish Tweaks extension</a></li>
<li><strong>#3 Use jQuery to change stuff.</strong> For example, change the label for the title field on Publish page depending on the weblog they are using. Avoid client confusion. Remove Options checkboxes dynamically. Tiny changes can make a difference to client understanding</li>
<li><strong>#2 Use field instructions.</strong> Include image dimensions, or more complex details. Use jQuery or extensions to add additional detail. Say how content will be displayed</li>
<li><strong>#1 Create a new theme.</strong> This is a lot of work. Does this breach the license agreement? Don&#8217;t know, maybe</li>
</ul>

<h2>Q&amp;A</h2>

<p><strong>How much training do you provide?</strong><br />
No documentation - we create videos and offer staff training. It&#8217;s important to bring the client in as early as possible and get them using EE.</p>

<p>It was also interesting to note that Erskine keep their templates under an /assets/templates/ folder (outside of the system folder).</p>]]></content:encoded>
				<dc:subject>Business, ExpressionEngine, Freelancing</dc:subject>
				<dc:date>2009-10-26T12:27:12+00:00</dc:date>
			</item>
		
	</channel>
</rss>