<?xml version="1.0" encoding="UTF-8"?>
<?xml-stylesheet type="text/xsl" media="screen" href="/~d/styles/rss2full.xsl"?><?xml-stylesheet type="text/css" media="screen" href="http://feeds.feedburner.com/~d/styles/itemcontent.css"?><rss 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/" version="2.0">

<channel>
	<title>SteveStreeting.com</title>
	
	<link>http://www.stevestreeting.com</link>
	<description>Man bites Ogre</description>
	<lastBuildDate>Sun, 05 Sep 2010 14:33:18 +0000</lastBuildDate>
	<generator>http://wordpress.org/?v=2.9.2</generator>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
			<atom10:link xmlns:atom10="http://www.w3.org/2005/Atom" rel="self" type="application/rss+xml" href="http://feeds.feedburner.com/stevestreeting" /><feedburner:info xmlns:feedburner="http://rssnamespace.org/feedburner/ext/1.0" uri="stevestreeting" /><atom10:link xmlns:atom10="http://www.w3.org/2005/Atom" rel="hub" href="http://pubsubhubbub.appspot.com/" /><item>
		<title>Work 2.0 – the interruptible programmer</title>
		<link>http://www.stevestreeting.com/2010/09/04/work-2-0/</link>
		<comments>http://www.stevestreeting.com/2010/09/04/work-2-0/#comments</comments>
		<pubDate>Sat, 04 Sep 2010 12:25:02 +0000</pubDate>
		<dc:creator>Steve</dc:creator>
				<category><![CDATA[Development]]></category>
		<category><![CDATA[Personal]]></category>
		<category><![CDATA[Productivity]]></category>
		<category><![CDATA[coding]]></category>
		<category><![CDATA[GTD]]></category>
		<category><![CDATA[Health]]></category>
		<category><![CDATA[programming]]></category>

		<guid isPermaLink="false">http://www.stevestreeting.com/?p=2816</guid>
		<description><![CDATA[I&#8217;m 37, and I&#8217;ve been a (professional) developer for 16 years. You would have thought that in that time, I&#8217;d have figured out an effective work style which delivered the desired outcomes (code cut, products shipped etc) without causing detrimental knock-on effects &#8211; but, sadly, you&#8217;d be wrong. I think the style in which I practiced [...]]]></description>
			<content:encoded><![CDATA[<p>I&#8217;m 37, and I&#8217;ve been a (professional) developer for 16 years. You would have thought that in that time, I&#8217;d have figured out an effective work style which delivered the desired outcomes (code cut, products shipped etc) without causing detrimental knock-on effects &#8211; but, sadly, you&#8217;d be wrong. I think the style in which I practiced my craft for the first 15 years of my career was much the same as every other enthusiastic developer: you put a <strong>ton</strong> of hours in. 12-16+ hour days, evening and weekend coding marathons, pizza in the keyboard, crunch times, 3am debugging sessions where you just can&#8217;t go to bed because you can <em>feel the source of that bug just beyond your fingertips, dammit, </em>desperate last-minute sprints to deadlines where you manage to slot that last piece in, Jack Bauer-like, just before the world goes to hell. If you&#8217;re in the demographic I&#8217;m talking about, you&#8217;re nodding sagely, and probably grinning a little too, reminiscing on past trials and glories. This sort of crazy dedication is respected in our circles, and is pretty much expected of any developer who has claimed to earn their stripes.</p>
<p>But, it turns out this kind of thing is not good for your health &#8211; who knew? Those of you who know me or keep up with my blog know that I&#8217;ve been dragged kicking and screaming away from my old ways, because of back issues that I initially ignored, then tried to cope with using token accommodations, and finally succumbed to in a big way. Being self-employed, this was a major problem. Crawling out of the pit I dug for myself took a long time and a lot of frustration &#8211; I read quite a few productivity books on the subject to try to find answers on how to keep working, and in the end found that the answers you mould for yourself tend to be the best ones. I&#8217;d like to share one of the things I learned along the way.</p>
<p><strong>But I&#8217;m &#8216;In The Zone&#8217;!!</strong></p>
<p>So, I want to talk about the biggest problem I encountered: concentration periods. I can&#8217;t sit at a desk for longer than about an hour at a time now; if I don&#8217;t get up and walk around, do some gentle stretching etc, at least this often, I&#8217;ll pay for it badly once I do move, and probably over the next few days too. I also can&#8217;t realistically work more than a standard 8 hour day without pain any more. The problem with this was that, as a programmer, the style which I developed over 15+ years involved getting gradually &#8216;Into The Zone&#8217; and coding for very long periods at a time, uninterrupted. This is a common theme among coders, who like to shut themselves away for hours at a time, wear headphones to avoid distractions, have &#8216;quiet times&#8217; and so on &#8211; and it&#8217;s also why we tend to react really badly when interrupted. Programming requires concentration, and concentration seems to run on a valve system &#8211; it takes time to warm up, and once it&#8217;s going, you don&#8217;t want to turn it off because starting it up again is a major hassle.</p>
<p>I thought there was no way around this, and had begun to resign myself to just being less productive because of it. However, over the last 6  months in particular, I&#8217;ve discovered that, far from being an intractable problem, this &#8217;slow warm up, long uninterrupted focus time&#8217; approach is to a large degree a learned behaviour, and it&#8217;s possible to re-train yourself to cope with things differently. It&#8217;s a little like when people learn to adopt <a href="http://www.everything2.com/index.pl?node_id=892542" target="_blank">polyphasic sleep patterns</a> &#8211; it&#8217;s not that you can&#8217;t do it, it&#8217;s just that when you&#8217;ve become accustomed to doing things a certain way, changing that is initially very, very hard. But it&#8217;s not impossible, given the right amount of motivation and time to adjust.</p>
<p>So, my goal was to acclimatise myself to many shorter work chunks during the day instead of a few very large ones, while still maintaining productivity. The key to this was to learn how to get back &#8216;In The Zone&#8217; in the shortest time possible &#8211; much like the way polyphasic sleepers train themselves to achieve REM sleep more quickly. I&#8217;m mostly there now, or at least way better at it than I was, so, what techniques did I use to make this transition?</p>
<ol>
<li><strong>Embrace interruptions</strong><br />
This is less of a technique and more of a deliberate psychological adjustment which cuts across all the practical approaches I&#8217;ll cover next. Instead of being the typical coder who avoids interruptions at all costs, you need to accept them, and learn to manage them better. It&#8217;s hard &#8211; you have to try to set aside years of resisting interruptions and initially, until you adjust, you&#8217;ll feel like you can&#8217;t get enough done. Many people will probably want to give up, unless there&#8217;s something specific motivating them to push through it &#8211; for me, daily pain was a great motivator. My main message here is that the transition is just a phase, and that it <strong>is</strong> possible to be an interruptable programmer who still gets things done. But you have to learn not to fight against it, hence why this is the first point.</li>
<li><strong>Maintain context outside of your head at all times</strong><br />
Much of the problem with interruptions is that of losing context. When you&#8217;re in that Zone, you&#8217;re juggling a whole bunch of context in your head, adjusting it on the fly, and maintaining and tweaking connections between issues constantly. Interruptions make you drop all that, and it takes time to pick it all up again. My answer to this was to externalise as much as possible, on as many levels as possible:</p>
<ol>
<li><strong>Maintain a running commentary on your current task<br />
<span style="font-weight: normal;">I am my very own chronicler. </span> </strong>I write notes on what I&#8217;m doing all the time, whether it&#8217;s adding a comment line to a ticket, committing frequently and writing detailed commit notes (you do use a DVCS to make light commits more practical, right? <img src='http://www.stevestreeting.com/wp-includes/images/smilies/icon_wink.gif' alt=';)' class='wp-smiley' /> ) scribbling a drawing on (ordered) pieces of paper. This really isn&#8217;t that onerous, and in fact externalising your thoughts can often help you clarify them. Basically the guide is that roughly every 30 minutes, I should have generated some new piece of context which is stored somewhere other than my head. If I haven&#8217;t, then that&#8217;s context I&#8217;d have more trouble re-building mentally if I&#8217;m interrupted. It doesn&#8217;t take much time to do, and it has other benefits too such as recording your thought &amp; decision process.</li>
<li><strong>Ruthlessly ignore tangental issues<br />
<span style="font-weight: normal;">You might have noticed that in the last bullet, I used the words &#8216;current task&#8217;, <em>singular</em>. Not &#8216;tasks&#8217;. There is no such thing as having more than one &#8216;current task&#8217; &#8211; there is only the one task you&#8217;re actually working on, and <em>distractions</em>.</span><br />
<span style="font-weight: normal;">We probably all use bug trackers / ticket systems to track bugs and feature requests, but when you&#8217;re working on a ticket, it&#8217;s very common to spot a new bug, or identify an opportunity for improvement, or think of a cool new feature. How many of us go ahead and deal with that right away, because it&#8217;s in the area we&#8217;re already in, or it&#8217;s &#8216;trivial&#8217;, or it&#8217;s a cool idea that you want to try right now?  I know I did &#8211; but I don&#8217;t any more; any tangental issues not related to what I&#8217;m currently doing get dumped into the ticket system and immediately forgotten until I&#8217;m done with the current task, regardless of their size, relevance or priority. It sounds simple and obvious, and this might even be official procedure in your organisation, but I challenge most coders to say that they actually do this all the time. The benefit is that even the tiniest of distractions add an extra level of context that you have to maintain, which is then harder to pick up again after an interruption.<br />
For this to work, you need a ticket system which is fast, lightweight, and doesn&#8217;t require you to be anal about how much detail you put in initially. You need to be in &amp; out of there in 30 seconds so you can offload that thought without getting distracted &#8211; you can flesh it out later. </span></strong></li>
<li><strong><span style="font-weight: normal;"><strong>Always know what you&#8217;re doing next</strong><br />
This is one from GTD (&#8216;Next actions&#8217;), but it&#8217;s a good one. When you come back from a break or interruption, you should spend no time at all figuring out what you need to be doing next. Your ticket system will help you here, and so will the running commentary that hopefully you&#8217;ve been keeping on your active task. If you&#8217;ve been forced to switch gears or projects, so long as you&#8217;ve maintained this external context universally, you should have no issue knowing what the next actions on each item are. The important thing is to have <em>one</em> next action on each project. If you have several, you&#8217;ll have to spend time choosing between them, and that&#8217;s wasted time (see the next section on prioritisation). At any one time, you should not only have just one current task, but <em>one</em> unambiguous next action on that task. Half the problem of working effectively is knowing what you&#8217;re doing next.</span></strong></li>
</ol>
</li>
<li><strong>Prioritise Negatively</strong><br />
I mentioned next actions in the previous section, but how do you decide what comes next? A lot of time can be frittered away agonising over priorities, and I used to struggle with it; I would plan on the assumption that I wanted to do everything on the list, and I just needed to figure out which I needed to do first. I discovered that I could cut the amount of time I spent on planning, and also get better, less ambiguous priorities by inverting the decision making process &#8211; to assume a baseline that I wouldn&#8217;t do <em>any</em> of the tasks, and assessing the negative outcomes of <em>not</em> doing each one. So instead of &#8216;which of feature A or B is more important to have?&#8217;, it became &#8216;Let&#8217;s assume we ship without feature A and B. What are the issues caused by omitting them in each case?&#8217;. It might appear to be a subtle difference, but having to justify inclusion entirely, rather than trying to establish a relative ordering assuming they all get done eventually, tends to tease out more frank evaluations in my experience.</li>
<li><strong>Recognise the benefits of breaks</strong><br />
Much of the above is about limiting the negative aspects of taking breaks, but the fact is, that they have many work-related benefits too. I&#8217;m willing to bet that all coders have stayed late at work, or late into the night, trying to fix a problem, only to find that they fix it within 15 minutes the next day, or think of the answer in some unlikely place like the shower. The reason for this is very simple &#8211; extended periods of concentration seem productive, and can be on operational / sequential thinking, but for anything else such as creative thinking or problem solving, it&#8217;s very often exactly the opposite. Not only do tired minds think less clearly, but often the answer to a problem lies not in more extensive thinking down the current path which you&#8217;ve been exploring in vain for the last few hours, but in looking at the problem from a completely different perspective. Long periods of concentration tend to &#8216;lock in&#8217; current trains of thought, making inspiration and strokes of genius all too rare. Creativity always happens when you&#8217;re not trying, and it&#8217;s an often under-appreciated but vital element of the programming toolbox. Interrupting that train of thought can actually be a very good thing indeed.</li>
</ol>
<p>There&#8217;s more I could talk about, but that&#8217;s quite enough for now I think. I hope someone finds this interesting or useful <img src='http://www.stevestreeting.com/wp-includes/images/smilies/icon_smile.gif' alt=':)' class='wp-smiley' /> </p>
]]></content:encoded>
			<wfw:commentRss>http://www.stevestreeting.com/2010/09/04/work-2-0/feed/</wfw:commentRss>
		<slash:comments>9</slash:comments>
		</item>
		<item>
		<title>Cocoa tip: using custom outline view cells designed in IB</title>
		<link>http://www.stevestreeting.com/2010/08/08/cocoa-tip-using-custom-table-outline-cells-designed-in-ib/</link>
		<comments>http://www.stevestreeting.com/2010/08/08/cocoa-tip-using-custom-table-outline-cells-designed-in-ib/#comments</comments>
		<pubDate>Sun, 08 Aug 2010 11:13:44 +0000</pubDate>
		<dc:creator>Steve</dc:creator>
				<category><![CDATA[Cocoa]]></category>
		<category><![CDATA[Development]]></category>
		<category><![CDATA[Objective C]]></category>
		<category><![CDATA[custom]]></category>
		<category><![CDATA[Mac]]></category>
		<category><![CDATA[nscell]]></category>
		<category><![CDATA[nsoutlineview]]></category>
		<category><![CDATA[nsview]]></category>
		<category><![CDATA[OS X]]></category>

		<guid isPermaLink="false">http://www.stevestreeting.com/?p=2800</guid>
		<description><![CDATA[I only started learning Objective-C and Cocoa in mid-May, and for the first time I think I actually have a tip to contribute to the wider community. It&#8217;s about using custom cells in NSOutlineView, but those which you want to design inside Interface Builder rather than drawing manually.
If you&#8217;re an iOS developer, you&#8217;ll be wondering [...]]]></description>
			<content:encoded><![CDATA[<p><a href="http://www.stevestreeting.com/wp-content/uploads/2010/08/outlineview_custom.png" rel="shadowbox[post-2800];player=img;"><img class="alignright size-medium wp-image-2807" title="outlineview_custom" src="http://www.stevestreeting.com/wp-content/uploads/2010/08/outlineview_custom-267x300.png" alt="" width="267" height="300" /></a>I only started learning Objective-C and Cocoa in mid-May, and for the first time I think I actually have a tip to contribute to the wider community. It&#8217;s about using custom cells in NSOutlineView, but those which you want to design inside Interface Builder rather than drawing manually.</p>
<p>If you&#8217;re an iOS developer, you&#8217;ll be wondering why this deserves a blog post &#8211; it&#8217;s easy to do in Cocoa Touch! Well, yes it is easy on iOS, because Apple have specifically allowed you to design table view cells in Interface Builder. When targetting Mac OS X though, it&#8217;s actually pretty awkward, and here&#8217;s why: in Cocoa Touch, the class which draws the cells in a table is UITableViewCell, which is a subclass of UIView &#8211; meaning you can drag one onto the canvas in Interface Builder and lay stuff out right there. In Cocoa, in contrast, the cell is simply represented by <a href="http://developer.apple.com/mac/library/documentation/Cocoa/Reference/ApplicationKit/Classes/NSCell_Class/Reference/NSCell.html" target="_blank">NSCell</a>, which is <strong>not</strong> an NSView subclass. This means Interface Builder will not let you play with them, you draw them by implementing <a href="http://developer.apple.com/mac/library/documentation/Cocoa/Reference/ApplicationKit/Classes/NSCell_Class/Reference/NSCell.html#//apple_ref/doc/uid/20000074-BBCCFICJ" target="_blank">drawWithFrame:inView:</a> instead. I think Apple realised the problem with this design in time for Cocoa Touch but obviously felt they couldn&#8217;t break the existing Cocoa interfaces. There are also many differences between the instantiation of NSCell versus UITableViewCell &#8211; there&#8217;s only one NSCell for all rows in a table / outline view, compared to a type-indexed pool in Cocoa Touch.</p>
<p>The problem boiled down to this: if the contents of your table / outline cell is non-trivial, or if you just don&#8217;t want to write a bunch of layout code, it&#8217;s a PITA to implement a custom look in NSOutlineView, such as the one in the picture, especially if you want custom controls embedded in it. For my current Cocoa app, I really wanted to design my cells (and I have 2 different styles for group levels and detail levels) in Interface Builder to save me hassle, including using Cocoa Bindings to hook up some dynamic fields within. Many internet searches later, and mostly the answer I found was that <a href="http://stackoverflow.com/questions/202471/is-it-possible-to-design-nscell-subclasses-in-interface-builder" target="_blank">it couldn&#8217;t be done</a>. Luckily, I&#8217;m too stubborn to take no for an answer, and eventually I figured out a way to do it. Details are after the jump, with an example project to show it in action.</p>
<p><span id="more-2800"></span></p>
<p><a href="http://bitbucket.org/sinbad/cocoacustomoutlineviewcells" target="_blank">Code Example on BitBucket</a></p>
<p><strong>Note: </strong>The project is written with garbage collection <em>required</em>, that&#8217;s because my original project uses that approach (I&#8217;m happy to require ObjC 2.0 / Leopard and don&#8217;t have a need for low-level memory control in this project) and I didn&#8217;t have time to retrofit old-style retain/release patterns to it. If you still use manual memory management in Mac OS X you&#8217;ll need to alter the code.</p>
<p>The answer to this problem involved several pieces:</p>
<ol>
<li>We need a tree model to hold our data. I&#8217;ve included a pretty standard node implementation in the example (ModelTreeNodeBase), and then subclassed it for the specific example (MyTreeNode)</li>
<li>Since we can&#8217;t design NSCell in Interface Builder, we need to design an NSView instead &#8211; in this case I designed one for the group level, and one for the detail level, but you could do more or less if you wanted. For convenience, I put both in one nib (CustomCells.xib).</li>
<li>We need to attach our NSViews as subviews of the outline view, in the appropriate place, at the right time, in order to display them. I do that in our custom NSCell subclass, CustomCell</li>
<li>Since there is only one instance of NSCell for all data rows of an outline view, we can&#8217;t use that to hold row-specific information, such as binding values to fields. So, I use a controller called CustomCellController which provides the linkage between the cell view and the model node (appropriate MVC practice). I use Cocoa Bindings to pull in data from this controller&#8217;s node per row, see the CustomCells.xib setup.</li>
<li>Again because there&#8217;s only one NSCell instance, we need to associate the specific controller instance for the correct row with the NSCell just before drawing. I do this in the NSOutlineView delegate method outlineView:willDisplayCell: , which you&#8217;ll find in the CustomOutlineViewAppDelegate in this case.</li>
<li>The association between the model node and the controller is kept in a simple NSDictionary, just to keep the coupling loose. Note that I use the model node itself as a key (which is why we&#8217;ve implemented the hash and isEqual methods in the model), in my app this is useful anyway because to identify a node uniquely regardless of content values is required.</li>
<li>Because we&#8217;re manually attaching our subviews on display, we also need to remove them at the right time. I do this on outlineViewItemDidCollapse: (and in the real app, I also do it when deleting rows and on drag/drop)</li>
<li>Outline views allow you to click or press enter to edit the main title text, and I support this here too. I have to do a bit of work though, firstly to make the edit box appear in the right place (see CustomCell&#8217;s editWithFrame: and selectWithFrame: methods) based on where we&#8217;ve placed the text in our custom view, and also to place the &#8216;hit box&#8217; in the right place &#8211; in my case I&#8217;ve allowed the hit box to extend over the entire cell, barring the other controls which take precedence if the mouse hits them. See CustomCell hitTestForEvent: for that code.</li>
<li>I also do a little bit of presentation nicety by changing the colour of the text when the row is selected. You get this for free with NSOutlineView normally, but since we&#8217;re using custom views, you don&#8217;t automatically get inverse video on text, so we have to do that ourselves.</li>
<li>To make the cells resize correctly, you use Interface Builder&#8217;s sizing options as per usual. However, it&#8217;s very important that the size values in the NSOutlineView&#8217;s table column, the size of the scroll view containing it, and the initial size of the custom NSViews for the cells are set to the same values in the various nibs. If you get this wrong, resizing won&#8217;t work correctly. As you can see from the example, if you set it up right you can get all the usual content resizing options for free while designing your cells in Interface Builder.</li>
</ol>
<p>Basically, that&#8217;s it &#8211; hopefully you can see the details from the code with those pointers. You&#8217;ll notice that although I used Cocoa Bindings to link the cell values to the model, I used the NSOutlineViewDataSource protocol for the main outline view structure, instead of binding it via a tree controller. The only reason for that was that the example from my project does it this way, because you need to use a custom datasource to handle drag/drop and the pasteboard, so it was simpler this way. There&#8217;s no reason why this wouldn&#8217;t work with a tree controller providing the data too, since all the key moving parts are in the delegate, custom cell and controllers.</p>
<p>Forgive me for any errors or bad practice here, I&#8217;m still relatively new to ObjC / Cocoa. But still, I hadn&#8217;t seen this done anywhere before so I wanted to share the technique I used, because when I was trying to do it I really wished someone had posted an example like this before. This code works well for me, but suggestions, patches &amp; forks on BitBucket are of course welcome if you see something I&#8217;ve done wrong or sub-optimally.</p>
<p>I hope this is useful to someone!</p>
]]></content:encoded>
			<wfw:commentRss>http://www.stevestreeting.com/2010/08/08/cocoa-tip-using-custom-table-outline-cells-designed-in-ib/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Dude, there’s an Ogre on my mantelpiece!</title>
		<link>http://www.stevestreeting.com/2010/07/25/dude-theres-an-ogre-on-my-mantelpiece/</link>
		<comments>http://www.stevestreeting.com/2010/07/25/dude-theres-an-ogre-on-my-mantelpiece/#comments</comments>
		<pubDate>Sun, 25 Jul 2010 11:06:24 +0000</pubDate>
		<dc:creator>Steve</dc:creator>
				<category><![CDATA[OGRE]]></category>
		<category><![CDATA[Personal]]></category>
		<category><![CDATA[gift]]></category>
		<category><![CDATA[ogre]]></category>
		<category><![CDATA[personal]]></category>
		<category><![CDATA[retirement]]></category>
		<category><![CDATA[statue]]></category>

		<guid isPermaLink="false">http://www.stevestreeting.com/?p=2790</guid>
		<description><![CDATA[In a complete and total surprise, my cousin presented to me yesterday the result of a grand conspiracy in the Ogre community to commemorate my time as project lead &#8211; a specially designed, unique Ogre statuette! Thumbnails below, click for more detail&#8230;
 
 
I literally had no idea this was going on, or that my [...]]]></description>
			<content:encoded><![CDATA[<p>In a complete and total surprise, my cousin presented to me yesterday the result of a grand conspiracy in the Ogre community to commemorate my time as project lead &#8211; a specially designed, unique Ogre statuette! Thumbnails below, click for more detail&#8230;<br />
<a title="Receiving the statue by sjstreeting, on Flickr" href="http://www.flickr.com/photos/35150516@N03/4823659995/" target="_blank"><img src="http://farm5.static.flickr.com/4116/4823659995_184298d809_m.jpg" alt="Receiving the statue" width="240" height="180" /></a> <a target="_blank title="Sinbad holding the statue by sjstreeting, on Flickr" href="http://www.flickr.com/photos/35150516@N03/4823660431/"><img src="http://farm5.static.flickr.com/4098/4823660431_40c6290d5a_m.jpg" alt="Sinbad holding the statue" width="240" height="180" /></a><br />
<a target="_blank title="Front of statue by sjstreeting, on Flickr" href="http://www.flickr.com/photos/35150516@N03/4823661079/"><img src="http://farm5.static.flickr.com/4098/4823661079_0475608a4a_m.jpg" alt="Front of statue" width="180" height="240" /></a> <a target="_blank title="Back of the statue by sjstreeting, on Flickr" href="http://www.flickr.com/photos/35150516@N03/4823661589/"><img src="http://farm5.static.flickr.com/4094/4823661589_718dc7b7af_m.jpg" alt="Back of the statue" width="180" height="240" /></a></p>
<p>I literally had no idea this was going on, or that my cousin had been asked to make the delivery that day (I thought we were just meeting for a social). I was completely taken aback and very touched that the people in the community would go to the trouble of doing something like this for me. <img src='http://www.stevestreeting.com/wp-includes/images/smilies/icon_surprised.gif' alt=':-o' class='wp-smiley' />  There&#8217;s<a href="http://www.ogre3d.org/forums/viewtopic.php?f=1&amp;t=59275" target="_blank"> a thread in the forums going into more detail</a> on how they organised it, including the many, many different designs they mocked up and considered before voting for this one. I&#8217;m humbled and flattered.</p>
<p>My sincere thanks to everyone who was involved in organising this, and very well done for creating such an excellent statue and managing so successfully to keep me in the dark about it! You guys are just awesome. </p>
]]></content:encoded>
			<wfw:commentRss>http://www.stevestreeting.com/2010/07/25/dude-theres-an-ogre-on-my-mantelpiece/feed/</wfw:commentRss>
		<slash:comments>18</slash:comments>
		</item>
		<item>
		<title>Arkham Horror: it’s all good fun until someone gets devoured</title>
		<link>http://www.stevestreeting.com/2010/07/17/arkham-horror-its-all-good-fun-until-someone-gets-devoured/</link>
		<comments>http://www.stevestreeting.com/2010/07/17/arkham-horror-its-all-good-fun-until-someone-gets-devoured/#comments</comments>
		<pubDate>Sat, 17 Jul 2010 12:13:51 +0000</pubDate>
		<dc:creator>Steve</dc:creator>
				<category><![CDATA[Games]]></category>
		<category><![CDATA[Personal]]></category>
		<category><![CDATA[arkham horror]]></category>
		<category><![CDATA[board games]]></category>
		<category><![CDATA[call of cthulhu]]></category>
		<category><![CDATA[lovecraft]]></category>

		<guid isPermaLink="false">http://www.stevestreeting.com/?p=2777</guid>
		<description><![CDATA[It was my birthday this week, and from my wife I received Arkham Horror, a co-operative board game based on the classic role-playing game Call of Cthulhu &#8211; which in itself draws much of its content and vibe from the writings of H.P. Lovecraft. Set in 1920&#8217;s New England, in contrast to traditional western &#8216;horror [...]]]></description>
			<content:encoded><![CDATA[<p><a href="http://www.stevestreeting.com/wp-content/uploads/2010/07/arkhamhorror.jpg" rel="shadowbox[post-2777];player=img;"><img class="alignright size-full wp-image-2778" title="arkhamhorror" src="http://www.stevestreeting.com/wp-content/uploads/2010/07/arkhamhorror.jpg" alt="" width="255" height="251" /></a>It was my birthday this week, and from my wife I received <a href="http://en.wikipedia.org/wiki/Arkham_Horror" target="_blank">Arkham Horror</a>, a co-operative board game based on the classic role-playing game <a href="http://catalog.chaosium.com/pages.php?CDpath=29" target="_blank">Call of Cthulhu</a> &#8211; which in itself draws much of its content and vibe from the writings of <a href="http://en.wikipedia.org/wiki/H._P._Lovecraft" target="_blank">H.P. Lovecraft</a>. Set in 1920&#8217;s New England, in contrast to traditional western &#8216;horror stories&#8217; (vampires, werewolves etc &#8211; all a bit pedestrian), Lovecraft&#8217;s world is filled with bizarre creatures and unknowable &#8216;Ancient Ones&#8217; &#8211; slumbering horrors in the outer dimensions who threaten to wake and destroy the world, and the &#8216;Investigators&#8217; the players control &#8211; which include doctors, archaeologists, flappers and gangsters &#8211; are trying to avert this outcome. If you have no idea what this is like, watch the first <a href="http://www.imdb.com/title/tt0167190/" target="_blank">Hellboy</a>, which draws a lot of inspiration from the same material, albeit with a more bombastic, humourous slant. Call of Cthulhu is a fascinating RPG to play simply because it&#8217;s so different to any other, and I was keen to play the board game interpretation to see what it was like.</p>
<p>The board game is set, like the RPG and most Lovecraft stories, in the fictitious town of <a href="http://en.wikipedia.org/wiki/Arkham" target="_blank">Arkham, Massachusetts</a>, where one randomly-chosen Ancient One is threatening to awake and break through to our world. Each Ancient One has slightly different effects on the game as it progresses and each is easier or more difficult to defeat if they eventually do break through (although if they do, chances of success are minimal). Dimensional gates are randomly opening in Arkham to strange other worlds, and it&#8217;s the players&#8217; job to explore and close them, preferably sealing them permanently, in order to avert the final confrontation.</p>
<p>Each player draws or chooses an Investigator, each of which has particular traits and possessions which can help in the game. The board features a number of street regions, each surrounded by places of interest like the Miskatonic University, Arkham Asylum and the Black Cave. There are also a number of &#8216;other dimensions&#8217;, which the players must traverse through gates in order to eventually seal them. The players have to move around Arkham picking up clues, exploring gates that open, and avoiding or confronting monsters that emerge from the gates and wander around the town &#8211; all the while maintaining their Stamina (physical health, worn down in combat) and Sanity (mental health, worn down by &#8217;seeing too much&#8217; and using spells). There are two &#8217;status tracks&#8217; which rack up during the game to illustrate the growing threat in Arkham &#8211; the &#8216;doom track&#8217; which is how close the Ancient One is to awaking, which notches up whenever a gate opens or sometimes through other special events, and a &#8216;terror track&#8217; which represents how afraid the citizens of the town are, and causes some locations to become boarded up when it achieves a certain level (and ultimately, if the terror level reaches 10, the town is considered &#8216;overrun&#8217; and there is no longer a limit to the number of monsters on the board).</p>
<p>We had our first game yesterday, and we were really impressed by the amount of variety in the game &#8211; there are so many variables in play: which of the 8 Ancient Ones is the main enemy, which of the 16 Investigators are being used, what items you have, where the gates open, and so forth. The rules are relatively complicated for a board game, but as pen-and-paper RPG veterans we didn&#8217;t really have any trouble following them, since they are much simplified compared to a traditional RPG. We knew it was going to take a while, particularly since it was our first game, and in fact from set up to completion it ran for a little over 4 hours with 4 investigators. By the end of the game we were much faster at it though, and I think we could have shaved an hour off that time, particularly as we were facing the weakest of the Ancient Ones (Yig).</p>
<p>It makes a change to play a co-operative board game too. If you play RPGs then this will not be a new experience, but it is nice to have a tabletop game which follows this model, and in fact it may be a &#8216;gateway drug&#8217; to friends who perhaps think full RPGs are a little too daunting. Some people might not like the concept of there not being an individual &#8216;winner&#8217; in the game, but rather that the players either win or lose as a group, but as a social game I think this works extremely well.</p>
<p>The game also accurately re-creates the Call of Cthulhu feeling of exponentially creeping doom, and of a desperate but almost certainly futile struggle against powers beyond human understanding. Things start off looking fairly manageable, but things begin to ratchet up pretty fast, as you realise the time it takes to close gates, and to gather the resources to seal them permanently &#8211; the only way to stall the increase of the doom track is to permanently seal gates, but you need to balance gathering the clues you need to do this, with positive action to actually do it. 80% into our first game, we thought we were doing pretty well as we started to make progress on the gates. But in the end, we realised we had left it too late to start tackling them in earnest and eventually Yig emerged and devoured us all. Oh noes! <img src='http://www.stevestreeting.com/wp-includes/images/smilies/icon_smile.gif' alt=':)' class='wp-smiley' /> </p>
<p>Even though our first game ended in crushing failure and the doom of the world, we had a huge amount of fun. It&#8217;s probably an alien concept to some gamers to enjoy a game in which there is a pretty good chance that you&#8217;ll fail at the end &#8211; Call of Cthulhu the pen-and-paper RPG was ever thus, and yet it has a huge cult (no pun intended) following. In my opinion though, extracting fun from a doomed scenario is one of the greatest examples of gaming refinement &#8211; because it&#8217;s the playing that is important, not the winning. Modern gaming far too often concentrates on simply completion &#8211; finish the game, get this achievement, <strong>succeed</strong>!!! In reality, all that matters in a game is that you had fun while playing it. Arkham Horror, like CoC, achieves that in spades in spite of &#8211; or perhaps <em>because</em> &#8211; the end confrontation is not what you&#8217;re rushing towards, but what you&#8217;re trying to avoid, all the while running madly about with your fellow players just trying not to get eaten or go insane. It&#8217;s unique, and I love it.</p>
<p>Summary: highly recommended if you want to play a really interesting, very different social game with well-balanced friends. Just don&#8217;t invite the guy obsessed with winning, he&#8217;ll hate it <img src='http://www.stevestreeting.com/wp-includes/images/smilies/icon_wink.gif' alt=';)' class='wp-smiley' /> </p>
]]></content:encoded>
			<wfw:commentRss>http://www.stevestreeting.com/2010/07/17/arkham-horror-its-all-good-fun-until-someone-gets-devoured/feed/</wfw:commentRss>
		<slash:comments>4</slash:comments>
		</item>
		<item>
		<title>Hosting services: my recommendations</title>
		<link>http://www.stevestreeting.com/2010/07/08/hosting-services-my-recommendations/</link>
		<comments>http://www.stevestreeting.com/2010/07/08/hosting-services-my-recommendations/#comments</comments>
		<pubDate>Thu, 08 Jul 2010 09:32:20 +0000</pubDate>
		<dc:creator>Steve</dc:creator>
				<category><![CDATA[Internet]]></category>
		<category><![CDATA[Tech]]></category>
		<category><![CDATA[Web]]></category>
		<category><![CDATA[bandwidth]]></category>
		<category><![CDATA[dedipower]]></category>
		<category><![CDATA[hosting]]></category>
		<category><![CDATA[hostmatters]]></category>

		<guid isPermaLink="false">http://www.stevestreeting.com/?p=2771</guid>
		<description><![CDATA[After hearing on Twitter how an acquaintance&#8217;s new hosting provider went &#8216;mammaries skyward&#8217; this week, much to their understandable annoyance, it occurred to me that I have some recommendations I can make on this subject. While I don&#8217;t host that many sites, I&#8217;ve been doing it for long enough and had experience of both personal [...]]]></description>
			<content:encoded><![CDATA[<p>After hearing on Twitter how an acquaintance&#8217;s new hosting provider went &#8216;mammaries skyward&#8217; this week, much to their understandable annoyance, it occurred to me that I have some recommendations I can make on this subject. While I don&#8217;t host that many sites, I&#8217;ve been doing it for long enough and had experience of both personal and medium-traffic sites that I&#8217;ve experienced the highs and lows quite a few times already.</p>
<p><strong>The Golden Rule: Support &gt; Everything</strong></p>
<p>When it comes to hosting, the most important thing to look for, beyond what all the statistics of how much space and bandwidth you get, beyond even quoted up-times, is the quality of the support service. The big question is: when things go wrong &#8211; and if you host long enough, eventually they will even in the best possible hosting environment &#8211; how quickly are problems resolved, and how responsive are the support engineers during the process. Literally nothing is more important than this, and unfortunately it&#8217;s the one thing that you&#8217;ll only really learn with experience, unless you&#8217;re hosting a site big enough that you can get a formal <a href="http://en.wikipedia.org/wiki/Service_level_agreement" target="_blank">SLA</a>. Assuming you&#8217;re not going big enough for that, the only way to judge this is by being with a provider for a while, or knowing someone who has been with them, or possibly looking at online review sites &#8211; although frankly these are often highly unreliable, polluted as they are with inaccuracies and omissions either because of ignorance (people who post glowing reviews after being with the site 2 weeks) and unfortunately by frequent shill reviews.</p>
<p>I&#8217;ll post a couple of hosts I&#8217;ve had good experience with over many years later in the post, through good times and bad.</p>
<p><strong>Know Your Bandwidth</strong></p>
<p>Personally, I instantly rule out any host that claims &#8216;unlimited bandwith&#8217;. This is a crock &#8211; there is no such thing, and to claim there is just means the host is already lying to you before you even start &#8211; they have to pay for their bandwidth, so they can&#8217;t possibly allow everyone truly unlimited bandwidth and stay in business. If you <em>really need </em>unlimited bandwidth, i.e. you have a high-traffic site with lots of media files, then you will quickly bump into the way that these sites offer this &#8216;unlimited&#8217; deal &#8211; via throttling. You may not have an absolute physical cap on your bandwidth, but if the tap is locked off to a slow dribble beyond a certain usage, it&#8217;s really worthless. In practice, &#8216;unlimited bandwidth&#8217; is just a marketing point that they hope will draw in people who will only actually use a tiny amount of bandwidth, but will somehow favour them because the offer looks good. Don&#8217;t be one of those dumb guys.</p>
<p>Really you need to establish your bandwidth requirements and head for a host that can fulfil them for a reasonable price. For example, <a href="http://www.ogre3d.org" target="_blank">ogre3d.org</a> uses between 125GB and 250GB per month, which is a reasonable amount, compared to my personal site here which only needs 5-10GB per month.</p>
<p>If you have &#8217;spiky&#8217; bandwidth, i.e. occasionally you need to be able to distribute large amounts of data, but it&#8217;s not a constant stream, it would be best to go for a lower monthly limit and host high-bandwidth items elsewhere. I often use <a href="http://aws.amazon.com/s3/" target="_blank">Amazon S3</a> for this purpose which can be made to look like a sub-domain of your own site, and which charges for bandwidth at a very fine granularity so matches your demand closely &#8211; it&#8217;s more expensive than buying a monthly allowance if you use it a lot, but for on-demand spikes it works very well.</p>
<p><strong>Shared, Dedicated or Virtual/Cloud?</strong></p>
<p>I currently use two shared hosts and one dedicated host, to match the demands of each site. Personally, I&#8217;m still very skeptical about virtual private servers and cloud hosting, due to a bad experience I had a few years back when we tried running ogre3d.org on a VPS. We lasted not much more than a month before we moved the server to a dedicated machine because the VPS simply didn&#8217;t deliver on its promises &#8211; performance was unpredictable and to be honest you had the worst of both worlds &#8211; you had to admin your own server but you still didn&#8217;t have a 100% guarantee that no-one else would be screwing with something on the machine, or that the disk arrays wouldn&#8217;t be hammered by someone else (regardless of CPU assignment), or some other balancing issue. Virtualisation has evolved in the last few years so this may not be an accurate representation anymore, but personally I wouldn&#8217;t go for a VPS again any time soon, unless it was a machine I controlled entirely and partitioned myself into virtuals &#8211; at least with shared and dedicated servers you know exactly what you&#8217;re getting &#8211; either a low-maintenance but shared resource environment, or total control &amp; power. VPS claims to offer a middle ground but in my experience it didn&#8217;t deliver.</p>
<p><strong>So, who do I use?</strong></p>
<p>For my shared hosting, I&#8217;ve been using <a href="http://www.hostmatters.com" target="_blank">Hosting Matters</a> for about 10 years now. I went through a couple of other hosts before them and had terrible experiences, but since I switched to them I&#8217;ve been very happy. I can count the number of hours downtime (that I&#8217;ve been aware of) over those years on one hand, and whenever there&#8217;s an issue they&#8217;re incredibly fast to respond &#8211; they have both community forums and support tickets depending on the urgency. It&#8217;s also very reassuring to see the same names cropping up in the support responses over the years.</p>
<p>Their offerings are pretty standard, nothing that would make them jump off the page for anyone looking for a stellar feature list or super-cheap pricing. But they&#8217;re very reasonable, they&#8217;re honest about what they&#8217;re offering (like bandwidth), and as I said before, support &gt; everything.</p>
<p>For dedicated hosting, since 2007 I&#8217;ve used <a href="http://www.dedipower.com" target="_blank">Dedipower</a>. They&#8217;re based in Reading, their support staff are all local and are on the end of a phone if you need them (no call centres). Having been through a UK dedicated server comparison twice in the last 3 years (once again just recently), Dedipower came out as the most competitive for the service they were willing to offer, and I&#8217;ve been happy with the support service. In once instance in fact, when I moved a sub-site off the server, they were quickly on the phone to me within 10 minutes to tell me it was &#8216;down&#8217; &#8211; at which point I had to explain it was expected &amp; apologise for not notifying them in advance. You really can&#8217;t complain about that.</p>
<p>I hope that&#8217;s useful to someone. In case I need to point this out, I&#8217;m not getting paid or receiving discounts to promote either of these hosts, they&#8217;re just the two I&#8217;ve been most happy with over the ~10 years I&#8217;ve been hosting sites. YMMV but they&#8217;ve worked well for me <img src='http://www.stevestreeting.com/wp-includes/images/smilies/icon_smile.gif' alt=':)' class='wp-smiley' /> </p>
]]></content:encoded>
			<wfw:commentRss>http://www.stevestreeting.com/2010/07/08/hosting-services-my-recommendations/feed/</wfw:commentRss>
		<slash:comments>11</slash:comments>
		</item>
		<item>
		<title>Why I won’t be updating Facebook anymore</title>
		<link>http://www.stevestreeting.com/2010/06/20/why-i-wont-be-updating-facebook-anymore/</link>
		<comments>http://www.stevestreeting.com/2010/06/20/why-i-wont-be-updating-facebook-anymore/#comments</comments>
		<pubDate>Sun, 20 Jun 2010 12:54:18 +0000</pubDate>
		<dc:creator>Steve</dc:creator>
				<category><![CDATA[Personal]]></category>
		<category><![CDATA[Web]]></category>
		<category><![CDATA[facebook]]></category>
		<category><![CDATA[social networks]]></category>
		<category><![CDATA[twitter]]></category>

		<guid isPermaLink="false">http://www.stevestreeting.com/?p=2764</guid>
		<description><![CDATA[I&#8217;ve never really liked Facebook, as regular readers of the blog will be all too aware of, but I&#8217;ve been a user of it in the last couple of years, mostly at the cajoling of friends. During this same period of time I also started using Twitter, a service which I was also skeptical about [...]]]></description>
			<content:encoded><![CDATA[<p>I&#8217;ve never really liked <a href="http://www.facebook.com" target="_blank">Facebook</a>, as regular readers of the blog will be all too aware of, but I&#8217;ve been a user of it in the last couple of years, mostly at the cajoling of friends. During this same period of time I also started using <a href="http://twitter.com/stevestreeting" target="_blank">Twitter</a>, a service which I was also skeptical about initially. Previously, I&#8217;d always relied on my blog, forums and official sites to do my interacting, and I wasn&#8217;t sure I needed anything else.</p>
<p>What&#8217;s happened in the last couple of years is that Twitter has risen inexorably in my daily usage due to being genuinely useful as a networking aid, while Facebook has not fared that well at all. I tried posting updates to it from Twitter for a while via Selective Tweets, which led to a considerable blip in my Facebook usage (even though I wasn&#8217;t using the site) but honestly I can&#8217;t be bothered with it anymore. And not just because of the <a href="http://theoatmeal.com/comics/facebook_suck" target="_blank">rubbish that sloshes around Facebook</a>.</p>
<p>Facebook is &#8217;sold&#8217; on the idea that you can realistically make / be friends with people, or even keep in <em>meaningful</em> personal touch with people you do genuinely know, via short messages and photos on an online service. My personal opinion after trying to use it as such for a while, is that this is a massive crock of elephant dung. Relationships are built on meaningful contact, and Facebook provides &#8211; is only capable of providing &#8211; only meaningless, trivial contact. Of all the ways you can keep in touch with people, it&#8217;s about the very worst you could possibly use, IMHO. It&#8217;s convenient, sure, but convenience doesn&#8217;t make for good personal contact. Honestly, if you can&#8217;t be bothered to make the effort to meet someone in person or talk on the phone (and home video calls aren&#8217;t that hard in the 21st century), then really you&#8217;re not that bothered about keeping in <em>genuine</em> contact with them. It&#8217;s better just to be honest &#8211; you&#8217;re kinda interested in knowing what&#8217;s up in their life, but not interested enough to have coffee with them, or otherwise make any genuine time for them.</p>
<p>In this context, Facebook is a fallacy. The whole point of Facebook versus Twitter or any other public internet medium is that Facebook is &#8216;private&#8217; (barring any changes in rules they might feel like making to make a buck on your data of course). But if you don&#8217;t care enough to speak to someone other than in Facebook, and vis-a-vis you&#8217;re not really that much of a friend, then why would you want them to know things you wouldn&#8217;t post publicly? This is behind many the Facebook fo-pahs that seem to crop up with increasing regularity. Twitter is honest about the level of interaction  you&#8217;re having with people. Facebook tries to make you think it&#8217;s more significant than it is.</p>
<p>Maybe you&#8217;re a highly gregarious person who genuinely has over 100 real friends that you&#8217;d share your private information with. Maybe you feel that personal relationships are upheld and maintained by Facebook messages. I don&#8217;t, and I&#8217;m going to stop pretending that it&#8217;s serving a useful purpose in my life. I have a small collection of friends and family with whom I exchange information by meeting and speaking to them &#8211; these are the only people I&#8217;d consider exchanging genuinely personal information with. There&#8217;s a second much larger collection of people whom I don&#8217;t meet personally but who I&#8217;m interested in keeping in contact with, and by and large they&#8217;re all on Twitter &#8211; which also does a far better job of delivering that information without bombarding me with all kinds of other nonsense. There&#8217;s really no useful middle ground for Facebook to fill, for me. And using Facebook as a supplement with people I already know? Frankly it&#8217;s far more entertaining to talk to them about their week&#8217;s exploits than read about them on Facebook &#8211; in fact Facebook can take the wind out of a good anecdote <img src='http://www.stevestreeting.com/wp-includes/images/smilies/icon_smile.gif' alt=':)' class='wp-smiley' /> </p>
<p>Really, you should never post anything on the Internet that you wouldn&#8217;t mind being public, since Facebook hardly has an unblemished record for actual privacy (whether that&#8217;s via Facebook themselves, or friends or friends-of-friends). I think that a lot of people use Facebook like I use Twitter, except there&#8217;s far more scope for dangerous misunderstandings about what is appropriate to post. I think non-digital social protocols dealt with sensitive &amp; private information much better, and that online services are best used only for non-private things. From now on, that&#8217;s what I&#8217;m going to do, and I&#8217;m <a href="http://blogs.abcnews.com/campuschatter/2010/04/college-students-giving-up-facebook.html" target="_blank">not the only one</a>.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.stevestreeting.com/2010/06/20/why-i-wont-be-updating-facebook-anymore/feed/</wfw:commentRss>
		<slash:comments>17</slash:comments>
		</item>
		<item>
		<title>iPad – my first weekend</title>
		<link>http://www.stevestreeting.com/2010/05/31/ipad-my-first-weekend/</link>
		<comments>http://www.stevestreeting.com/2010/05/31/ipad-my-first-weekend/#comments</comments>
		<pubDate>Mon, 31 May 2010 16:50:32 +0000</pubDate>
		<dc:creator>Steve</dc:creator>
				<category><![CDATA[Personal]]></category>
		<category><![CDATA[Tech]]></category>
		<category><![CDATA[apple]]></category>
		<category><![CDATA[iPad]]></category>
		<category><![CDATA[review]]></category>
		<category><![CDATA[tablet]]></category>
		<category><![CDATA[technology]]></category>

		<guid isPermaLink="false">http://www.stevestreeting.com/?p=2754</guid>
		<description><![CDATA[Apple&#8217;s new flagship product, the iPad, was only just released in countries outside the USA last Friday, and I was fortunate to get my hands on one on launch day. Like many Apple products, this one has divided people, with a lot of people decrying it as a device looking for a purpose, a device [...]]]></description>
			<content:encoded><![CDATA[<p><a href="http://www.stevestreeting.com/wp-content/uploads/2010/01/ipad.jpg" rel="shadowbox[post-2754];player=img;"><img class="alignright size-full wp-image-2537" title="ipad" src="http://www.stevestreeting.com/wp-content/uploads/2010/01/ipad.jpg" alt="" width="250" height="159" /></a><a href="http://www.apple.com" target="_blank">Apple</a>&#8217;s new flagship product, the <a href="http://www.apple.com/ipad/" target="_blank">iPad</a>, was only just released in countries outside the USA last Friday, and I was fortunate to get my hands on one on launch day. Like many Apple products, this one has divided people, with a lot of people decrying it as a device looking for a purpose, a device that falls between two stools (not as portable as a phone, not as functional as a laptop), a device that is stifled within Apple&#8217;s walled garden. Despite there already being a plethora of reviews out there on the internet, I thought I&#8217;d give my initial impressions of it after the first weekend.</p>
<p><strong>First, some context</strong></p>
<p>It would be illustrative first of all to set out my reasons for wanting to lay down some cash on a product such as this, in order to frame the context in which I&#8217;m evaluating it. Some potentially relevant facts:</p>
<ol>
<li><strong>I don&#8217;t have an iPhone</strong>. I work from home, and I consider it extremely impolite to be constantly stabbing away at a phone while in a social gathering (you know who you are), therefore I can&#8217;t justify owning one. I have a far cheaper Nokia smartphone which does what I need just fine for the rare occasions when I need to check the internet on the go.</li>
<li><strong>I like Macs</strong>. This is an opinion which I&#8217;ve come to only in the last few years &#8211; despite studying user interface design as a module of my compsci degree, my interest in practical applications of the subject has only recently been piqued, and I&#8217;ve learned that Apple definitely groks these things better than most. I&#8217;ve also changed &#8211; I used to love taking apart my PCs, customising them to the nth degree, knowing every tweaked and tricked out element of it. Now, after 20 years, I find that kind of a bore and generally just want something that works, gets out of the way and lets me get on with what else I want to do, and I find Macs are good at that.</li>
<li><strong>I find touch interfaces very interesting</strong>. As an RSI sufferer for the last 7 or so years, I&#8217;ve become acutely aware of how terrible mice are as an ergonomic interface. Really, they&#8217;re awful &#8211; the wrist rotation, the fact your arm has to be right out to the side with most setups, these things are ergonomic suicide. At some point, unless you want chronic carpal tunnel syndrome, you&#8217;re going to have to switch to a track ball, a track pad, or one of those vastly overpriced vertically oriented mice. Personally, I try to use the keyboard for most things, which isn&#8217;t great but it&#8217;s better than the mouse, and a track pad on laptops as much as I can, which are much more natural. The prospect of a renaissance of user interfaces designed not to need a mouse, but to be entirely driven by touch, is something very appealing to me. It doesn&#8217;t work at all for sustained use when there are large, immovable vertical screens involved, and it doesn&#8217;t work that well when the device is too small &#8211; to me the pad form factor is the ideal for this approach.</li>
<li><strong>I watched Star Trek:TNG</strong> and lusted after their pads for years (even though they were just fake plastic slabs). Now it&#8217;s a reality! Who wouldn&#8217;t want that? <img src='http://www.stevestreeting.com/wp-includes/images/smilies/icon_wink.gif' alt=';)' class='wp-smiley' /> </li>
</ol>
<p>Perhaps importantly, going into this I wasn&#8217;t one of those people looking to replace another device with the iPad, but I did see it as an opportunity to use an iPad in use cases where I considered the other devices I could already use to be sub-optimal. I&#8217;ll cover those use cases later on when I discuss how things turned out in practice. So now, on to my evalution&#8230;</p>
<p><strong>Physical characteristics</strong></p>
<p>I&#8217;ll try not to cover too much ground that&#8217;s already been adequately covered elsewhere. You already know the iPad is fantastically well constructed, beautiful to look at, has a wonderfully bright and sharp screen (which is prone to finger prints) &#8211; we&#8217;ll take all that as read. In my opinion, it&#8217;s not that heavy, but if you had planned to hold it up in front of your face with one hand for a long time, yeah that&#8217;s going to get uncomfortable. Personally, I don&#8217;t do that &#8211; like when I&#8217;m reading a book of any size, I rest the iPad on my lap, either flat or just propping it up on edge with one hand, and that&#8217;s fine for several hours in my experience. Having said that, the sleek and smooth exterior means you can be afraid of dropping it &#8211; however I&#8217;m using it in a leather flip-case (I&#8217;ll cover that in a future post, it&#8217;s a good one), and in this configuration gripping it becomes a total non-issue.</p>
<p>The screen was sharper than I expected, it seems to have approximately the same pixel size as my MacBook Pro, since even though the resolution is lower, the screen is only 9 inches. The default brightness setting was a little dark for me so I tweaked it up to about 75%, which was perfect. It&#8217;s a glossy screen which you may have problems with outside, but inside in full daylight (we have many windows in our house) and using regular lighting at night, reflection has not been an issue.</p>
<p>As has been pointed out, there are no cameras. Personally, that&#8217;s not something I care about &#8211; I don&#8217;t use my mobile phone camera either and I have a far superior camera within 10 feet of me in my lounge if I need one. I can imagine a camera for video conferencing might be useful to some people, but I&#8217;ve had one in my MacBooks for 3 years and I&#8217;ve never used them, so really, this is not important to me.</p>
<p>Connectivity wise, we&#8217;re talking minimal &#8211; just a dock connector and Wifi. It would have been nice to have a USB slot or two and especially a SD card slot (although you can get an adapter for that), but anyone who&#8217;s bought an iPod before knows the Apple way &#8211; don&#8217;t try to do everything, just try to do the core things better than anyone else. So, did they manage that?</p>
<p><strong>General User Experience</strong></p>
<p>I&#8217;d sum it up on one word &#8211; &#8216;butter&#8217;. The fact is that the iPad comes with only a small piece of card of instructions (and bizarrely, a 300 page downloadable manual which I don&#8217;t think they expect anyone to read), and you don&#8217;t even need to read that. Seriously, a monkey could work this thing, and it wouldn&#8217;t even need any training. I consider myself a geek still, and some geeks seem to find user friendly experiences offensive, as if it undermines the skills they&#8217;ve acquired, but I&#8217;m not one of them, and I admire what&#8217;s going on here. It&#8217;s a very direct, tactile experience that rewards experimentation and exploration, and just says &#8220;hey, come play with me, I won&#8217;t bite&#8221;. This, frankly, is how systems <em>should</em> be designed.</p>
<p>The lack of multitasking (due to be added in <a href="http://www.apple.com/iphone/preview-iphone-os/" target="_blank">OS4</a> later in the year) is much less of an issue than I expected. Apps remember where you were, and tend to launch fast so switching between, say, Safari and an email that you&#8217;re in the middle of writing, works just fine and feels no different to true multitasking. The only thing missing is if you have apps which need to actively do things when you switch &#8211; such as IM or voice messaging, or music players other than the built-in iPod features. But honestly, so far I&#8217;m not missing it, even though I can imagine it being useful in some cases.</p>
<p>Many have said this is a bigger iPod Touch. They&#8217;re right, but in the same way that a bay window is just a bigger porthole. If you think that doesn&#8217;t matter, maybe you wouldn&#8217;t mind replacing all the windows in your house with portholes. In my opinion, the size of this device is absolutely perfect &#8211; for the purposes use it for (see below).</p>
<p><strong>So What&#8217;s It Good For?</strong></p>
<p>These are the primary things the iPad is being used for in our house:</p>
<ol>
<li><strong>Checking mail, web, news, social networks </strong>at home in a casual setting. When we&#8217;re doing things at home, watching TV, playing non-PC games, having guests around, or just between other things, it&#8217;s often useful to quickly check email or look something up on the web. Getting the laptop out takes too much time and it&#8217;s too bulky if you have friends around, and a phone is often too cramped, particularly if you want to show the contents to others or you want to type more comfortably. The iPad has instantly become the way my wife and I do all these things when we&#8217;re not at the PC anyway, and it works really well. Websites display legibly with no scrolling around, typing is fast (slower than a real keyboard but much faster than a phone). Most importantly, it doesn&#8217;t feel like a &#8216;work&#8217; device and fits into a casual / social setting perfectly. My preferred way to check the detail of the day&#8217;s news after breakfast is now on the iPad via the <a href="http://www.reuters.com/tools/mobile/ipad" target="_blank">Reuter&#8217;s app</a>. <a href="http://www.youtube.com" target="_blank">YouTube</a> works great on it too, I can catch up with my subscriptions very comfortably this way. As for the lack of Flash &#8211; in almost 3 days, I haven&#8217;t noticed, and I don&#8217;t think my wife even knows that Flash is not available. Maybe it&#8217;ll be an issue some time, but not so far.</li>
<li><strong>Touch gaming</strong>. I&#8217;ve specifically added &#8216;touch&#8217; there because people trying to play normal games with traditional controls (using virtual joysticks etc) are completely barking up the wrong tree. Games on the iPad, like the iPhone, work best when they&#8217;re designed with a touch interface in mind, or at least adapt well to it (e.g. <a href="http://www.popcap.com/games/pvz" target="_blank">Plants vs Zombies</a>). <a href="http://firemint.com/?page_id=1134" target="_blank">Flight Control</a> and <a href="http://itunes.apple.com/us/app/harbor-master-hd/id363658120?mt=8" target="_blank">Harbormaster</a> are good examples of this, where there&#8217;s just no way you could implement a game like this efficiently with anything other than touch controls, and they click in 2 seconds flat. To be honest, my wife has the most experience of the games so far, but the fact that it&#8217;s hard to get her off them is a fairly solid endorsement of the gaming capabilities of the device <img src='http://www.stevestreeting.com/wp-includes/images/smilies/icon_wink.gif' alt=';)' class='wp-smiley' /> </li>
<li><strong>Documentation. </strong>I don&#8217;t think I&#8217;d use a device like this for casual reading. A paperback is more rugged, cheap, and appropriate in the majority of cases than even dedicated devices like the <a href="http://www.amazon.com/Kindle-Wireless-Reading-Display-Generation/dp/B0015T963C" target="_blank">Kindle</a>, IMO. However, I do think e-readers are perfect for reference documentation, the kind of stuff you need to access randomly, search and dip into at a moment&#8217;s notice, often over several volumes, and for that I&#8217;m using <a href="http://www.goodiware.com/goodreader.html" target="_blank">GoodReader</a>. Of course, if you&#8217;d be using that documentation at a PC anyway, you don&#8217;t need an e-reader. However, if you&#8217;re not at a PC, and you need access to this kind of information, then e-readers suddenly become useful. Because I have a minority usage for this, a dedicated e-reader has never been a worthwhile purchase for me, but as one feature in a multi-function device &#8211; that&#8217;s useful. In particular, I run a D&amp;D campaign one night a week, and thus far have always needed a big stack of books next to me, which is a pain for space when we have a full crowd in. I&#8217;ve tried using laptops before, but they suck &#8211; they take up too much room and if you have them in a comfortable position in front of you they&#8217;re just too distracting. The iPad is the perfect size, and replaces several physical tomes with fully bookmarked, searchable texts, and it can sit to the side of me, available but not obtrusive, large enough to read but not too large to dominate the space. It&#8217;s by far the most practical device I&#8217;ve ever come across for this purpose, and I can&#8217;t help but think others will find places where it&#8217;s useful too.</li>
<li><strong>Photos. </strong>This might seem odd to call out as its own bullet point, but actually I think this is significant. Since we transitioned to digital photos, it&#8217;s made sharing them with family more awkward. Sure, you can use <a href="http://www.facebook.com" target="_blank">Facebook</a>, but firstly &#8211; shockingly &#8211; many friends / family members don&#8217;t use Facebook (and no, I&#8217;m not going to pressure them to use it), and secondly it&#8217;s actually nice to show photos to people <em>in person</em>, and, you know, talk about them. Interact. Face to face. Radical stuff I know, but Facebook doesn&#8217;t solve that problem. In the past we&#8217;ve taken a laptop to other people&#8217;s houses, but that just feels clunky and geeky. And we don&#8217;t want to get them all printed, because that&#8217;s just a massive waste. And digital photo frames of any decent size are too expensive to justify. Enter the iPad &#8211; which can double as a photo frame and is very good at being a medium to share photos in person, just because its form factor works well &#8211; it&#8217;s easy to pass around or look at from multiple directions (rather than everyone crowding around a laptop screen). It&#8217;s a digital photo viewer that works in a multi-person environment, and the display is still large enough to do them justice.</li>
<li><strong>Sketching</strong>. It may not be a match for my wife&#8217;s <a href="http://www.wacom.eu/index2.asp?pid=0&amp;lang=en" target="_blank">Wacom</a> tablet, but as a casual sketching tool (via <a href="http://www.youtube.com/watch?v=uZ44S17mHO4" rel="shadowbox[post-2754];player=swf;width=640;height=385;">SketchBook Pro</a>) it works quite well. Obviously the touch interface is a no-brainer for this &#8211; it&#8217;s missing things like pressure sensitivity and angle detection like the Wacom kit does, but even so it&#8217;s far more natural than drawing with a mouse, and considerably cheaper to try out than buying a full featured tablet.</li>
</ol>
<p>The important thing is that none of these things could be done as well with devices of another form factor, IMO. You could do them, but you&#8217;d be compromising something &#8211; such as screen space, comfort, instant accessibility. I think a pad form factor hits a sweet spot for these things, and that Apple&#8217;s implementation is confident and slick. In the end, that&#8217;s all I really wanted.</p>
<p><strong>Conclusion</strong></p>
<p>My personal opinion is that there definitely is room for a device of this form factor in the lives of many people. You can argue that iPad version 2 will have more features, or that an <a href="http://www.android.com/" target="_blank">Android</a> tablet (whenever they arrive in a product form) will do better later on and will have more apps because of the open architecture, but  I think the phrase &#8216;a bird in the hand is worth 2 in the bush&#8217; is relevant here. In technology, there&#8217;s always going to be something better in the future, that&#8217;s a universal constant at any point in time, for any product. Right now, the iPad pushes exactly the buttons I wanted it to push &#8211; that doesn&#8217;t mean there isn&#8217;t potential for more, but what it does do, it does extremely well. And more importantly, it does it <em>right now</em>, not at some theoretical point in the future. That has value to me.</p>
<p>Perhaps the best illustration is that the iPad has been in pretty much constant use since purchase, barring when it&#8217;s on charge, and so far the split has been 70/30 in favour of my wife, whose review comments are simple: &#8220;It&#8217;s cool&#8221;. I concur.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.stevestreeting.com/2010/05/31/ipad-my-first-weekend/feed/</wfw:commentRss>
		<slash:comments>29</slash:comments>
		</item>
		<item>
		<title>OS X Localisation: incremental genstrings and UTF-8 files</title>
		<link>http://www.stevestreeting.com/2010/05/18/os-x-localisation-incremental-genstrings-and-utf-8-files/</link>
		<comments>http://www.stevestreeting.com/2010/05/18/os-x-localisation-incremental-genstrings-and-utf-8-files/#comments</comments>
		<pubDate>Tue, 18 May 2010 15:18:41 +0000</pubDate>
		<dc:creator>Steve</dc:creator>
				<category><![CDATA[Development]]></category>
		<category><![CDATA[OS X]]></category>
		<category><![CDATA[genstrings]]></category>
		<category><![CDATA[Localization]]></category>
		<category><![CDATA[Mac]]></category>

		<guid isPermaLink="false">http://www.stevestreeting.com/?p=2734</guid>
		<description><![CDATA[I came across a couple of interesting issues when I came to do the first pass of writing the text for the user-visible strings I&#8217;d been setting up for a Cocoa app I&#8217;m writing (painfully slowly as I learn the nuances of the environment), and I thought I&#8217;d share them. Full details are after the [...]]]></description>
			<content:encoded><![CDATA[<p>I came across a couple of interesting issues when I came to do the first pass of writing the text for the user-visible strings I&#8217;d been setting up for a Cocoa app I&#8217;m writing (painfully slowly as I learn the nuances of the environment), and I thought I&#8217;d share them. Full details are after the jump, since I&#8217;ve embedded a large script in the post.</p>
<p>The basic principle for text localisation on OS X is that, like most systems, you externalise your user-visible strings in string tables and reference them by keyed aliases in code &#8211; in this case using NSLocalizedString. Apple provide a tool called &#8216;genstrings&#8217; which extracts all these into a template strings file called Localizable.strings which you can then populate per language &#8211; localised files are kept in folders called en.lproj, fr.lproj etc and helpfully they&#8217;re picked up by default like this.  So far, so good.</p>
<p><span id="more-2734"></span><br />
There are a couple of practical issues though. Firstly, genstrings always overwrites its output file, which means that using it incrementally to add new strings when you&#8217;ve already populated the previous set &#8211; which is bound to be the normal case for most developers &#8211; isn&#8217;t possible out of the box. Luckily I found a <a href="http://blog.joaomoreno.com/incremental-localization-on-xcode-based-projects/" target="_blank">nice little Python script</a> which solves this problem for you by merging the results in to your existing files. I&#8217;ve added a custom target with a Run Script step to my XCode project which uses a modified version of this script (see below) to update my strings files whenever I need to.</p>
<p>The second problem is that genstrings creates UTF-16 encoded files, and there&#8217;s no way to alter this. The problem with UTF-16 is that both Mercurial and Git don&#8217;t like them very much; both system&#8217;s text/binary detection will classify them as binary, meaning you lose the ability to diff and merge these files in any useful way. It&#8217;s not a deal-breaker, but it&#8217;s inconvenient. Couple that with the fact that OS X will quite happily use UTF-8 encoded .strings files directly at run-time (although iPhone will not), and it seemed something that I should resolve. For the convenience of development, I modified the Python script (as shown below) to convert the result of genstrings to UTF-8 via iconv, meaning they always get picked up as text in source control. If you&#8217;re deploying on iPhone, it&#8217;s trivial to write a small build script calling iconv again to convert back to UTF-16 for deployment.</p>
<pre class="brush: python;">
#!/usr/bin/env python
# -*- coding: utf-8 -*-

# Localize.py - Incremental localization on XCode projects
# João Moreno 2009
# http://joaomoreno.com/

# Modified by Steve Streeting 2010 http://www.stevestreeting.com
# Changes
# - Use .strings files encoded as UTF-8
#   This is useful because Mercurial and Git treat UTF-16 as binary and can't
#   diff/merge them. For use on iPhone you can run an iconv script during build to
#   convert back to UTF-16 (Mac OS X will happily use UTF-8 .strings files).
# - Clean up .old and .new files once we're done

from sys import argv
from codecs import open
from re import compile
from copy import copy
import os

re_translation = compile(r'^&quot;(.+)&quot; = &quot;(.+)&quot;;$')
re_comment_single = compile(r'^/\*.*\*/$')
re_comment_start = compile(r'^/\*.*$')
re_comment_end = compile(r'^.*\*/$')

class LocalizedString():
    def __init__(self, comments, translation):
        self.comments, self.translation = comments, translation
        self.key, self.value = re_translation.match(self.translation).groups()

    def __unicode__(self):
        return u'%s%s\n' % (u''.join(self.comments), self.translation)

class LocalizedFile():
    def __init__(self, fname=None, auto_read=False):
        self.fname = fname
        self.strings = []
        self.strings_d = {}

        if auto_read:
            self.read_from_file(fname)

    def read_from_file(self, fname=None):
        fname = self.fname if fname == None else fname
        try:
            f = open(fname, encoding='utf_8', mode='r')
        except:
            print 'File %s does not exist.' % fname
            exit(-1)

        line = f.readline()
        while line:
            comments = [line]

            if not re_comment_single.match(line):
                while line and not re_comment_end.match(line):
                    line = f.readline()
                    comments.append(line)

            line = f.readline()
            if line and re_translation.match(line):
                translation = line
            else:
                raise Exception('invalid file')

            line = f.readline()
            while line and line == u'\n':
                line = f.readline()

            string = LocalizedString(comments, translation)
            self.strings.append(string)
            self.strings_d[string.key] = string

        f.close()

    def save_to_file(self, fname=None):
        fname = self.fname if fname == None else fname
        try:
            f = open(fname, encoding='utf_8', mode='w')
        except:
            print 'Couldn\'t open file %s.' % fname
            exit(-1)

        for string in self.strings:
            f.write(string.__unicode__())

        f.close()

    def merge_with(self, new):
        merged = LocalizedFile()

        for string in new.strings:
            if self.strings_d.has_key(string.key):
                new_string = copy(self.strings_d[string.key])
                new_string.comments = string.comments
                string = new_string

            merged.strings.append(string)
            merged.strings_d[string.key] = string

        return merged

def merge(merged_fname, old_fname, new_fname):
    try:
        old = LocalizedFile(old_fname, auto_read=True)
        new = LocalizedFile(new_fname, auto_read=True)
        merged = old.merge_with(new)
        merged.save_to_file(merged_fname)
    except:
        print 'Error: input files have invalid format.'

STRINGS_FILE = 'Localizable.strings'

def localize(path):
    languages = [name for name in os.listdir(path) if name.endswith('.lproj') and os.path.isdir(name)]

    for language in languages:
        original = merged = language + os.path.sep + STRINGS_FILE
        old = original + '.old'
        new = original + '.new'

        if os.path.isfile(original):
            os.rename(original, old)
            os.system('genstrings -q -o &quot;%s&quot; `find . -name &quot;*.m&quot;`' % language)
            os.system('iconv -f UTF-16 -t UTF-8 &quot;%s&quot; &gt; &quot;%s&quot;' % (original, new))
            merge(merged, old, new)
        else:
            os.system('genstrings -q -o &quot;%s&quot; `find . -name &quot;*.m&quot;`' % language)
            os.rename(original, old)
            os.system('iconv -f UTF-16 -t UTF-8 &quot;%s&quot; &gt; &quot;%s&quot;' % (old, original))

        if os.path.isfile(old):
        	os.remove(old)
        if os.path.isfile(new):
        	os.remove(new)

if __name__ == '__main__':
    localize(os.getcwd())
</pre>
<p>Hopefully this is useful to someone else! I&#8217;m still very much learning on the Mac development side, so if there&#8217;s something I haven&#8217;t considered, please let me know.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.stevestreeting.com/2010/05/18/os-x-localisation-incremental-genstrings-and-utf-8-files/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Taking a bite of the Apple</title>
		<link>http://www.stevestreeting.com/2010/05/16/takinga-bite-of-the-apple/</link>
		<comments>http://www.stevestreeting.com/2010/05/16/takinga-bite-of-the-apple/#comments</comments>
		<pubDate>Sun, 16 May 2010 14:24:47 +0000</pubDate>
		<dc:creator>Steve</dc:creator>
				<category><![CDATA[Development]]></category>
		<category><![CDATA[OS X]]></category>
		<category><![CDATA[Personal]]></category>
		<category><![CDATA[Cocoa]]></category>
		<category><![CDATA[Mac]]></category>
		<category><![CDATA[Objective C]]></category>
		<category><![CDATA[personal]]></category>

		<guid isPermaLink="false">http://www.stevestreeting.com/?p=2727</guid>
		<description><![CDATA[Giving up the leadership of OGRE was a sad moment for me, but in hindsight it has also been rather liberating. For 10 years I&#8217;d spent most of my energy on OGRE or on projects that were related to OGRE. There was an implicit understanding both from the community and from myself that everything I [...]]]></description>
			<content:encoded><![CDATA[<p><img class="alignright size-full wp-image-813" title="apple_logo" src="http://www.stevestreeting.com/wp-content/uploads/2007/07/apple_logo.jpg" alt="" width="100" height="103" align="right" />Giving up the leadership of <a href="http://www.ogre3d.org" target="_blank">OGRE</a> was a sad moment for me, but in hindsight it has also been rather liberating. For 10 years I&#8217;d spent most of my energy on OGRE or on projects that were related to OGRE. There was an implicit understanding both from the community and from myself that everything I embarked on would in some way tie into OGRE &#8211; and indeed my business has always been based on a constant balancing act between how I can make a living while also promoting and advancing OGRE. I&#8217;d tended to major on the latter rather than the former most of the time as it happens, because I had an emotional attachment to the project and a feeling of responsibility and custodianship that I took very seriously. So when I finally admitted to myself that my back couldn&#8217;t take the ongoing demands of being an open source leader as well as making a living, the big question was: what next?</p>
<p>Over the years I&#8217;ve learned a couple of things about choosing what projects to work on &#8211; follow your gut, and work on things you&#8217;d do even if there was no money in it. Yes, you need to do a business case and convince yourself that there&#8217;s a viable market for what you have in mind, but all that&#8217;s irrelevant if you don&#8217;t feel strongly about what you&#8217;re doing, because it&#8217;s passion and enthusiasm that will get you through the difficult times. So I sat down and gave some thought to what really excited me these days, what I liked using and what technical directions piqued my interest. I still find 3D and games fascinating, but they&#8217;re far from my only interests.</p>
<p>So, I realised that one area that I&#8217;ve been dying to get my teeth into properly for ages but had never found the time before, was coding specifically for <a href="http://www.apple.com/macosx/" target="_blank">Mac OS X</a>. In 3 years I&#8217;ve gone from a total newcomer to the platform, to a staunch advocate of it. However until now I&#8217;d never really had time to play with developing on it, beyond porting cross-platform C++ code and providing / using intermediate libraries. One thing I learned in those 3 years as a user was how much better applications designed for OS X felt to use compared to those that were just ported via a common UI layer (like wxWidgets / Qt), and I&#8217;m convinced now that while cross-platform infrastructural code is great, user experiences are <em>far</em> better when designed with the specific platform in mind &#8211; increasingly that means OS and physical device now of course. Sure, cross-platform UIs save the developer time, but the result is often a watered-down experience &#8211; early on I liked OS X applications that felt like Windows, or ran the same on both platforms &#8211; now I  do not. Such carbon-copying applications were helpful while I was unfamiliar with the platform, but now it&#8217;s just glaring to me how basic their compatibility with the OS typically is, and how the UI styles clash with the expected standards.</p>
<p>So, I decided I wanted to learn how to target OS X specifically, and had a couple of ideas for projects I could do with it, which meant learning <a href="http://en.wikipedia.org/wiki/Objective-C" target="_blank">Objective-C</a>. At first, I <em>hated</em> it and tried to escape via more familiar technologies like Objective-C++ and <a href="http://pyobjc.sourceforge.net/" target="_blank">PyObjC</a>. Ultimately I found shortcomings and limitations of those routes and returned to Objective-C, and the more I used it, the more my animosity toward it diminished. In the end I realised the problem was that I needed to adapt to the environment, rather than try to adapt <em>it</em> to my previously learned styles and behaviours. Sure, missing elements like namespaces might still nag me, but on balance the blend of static and dynamic language elements works very well for the intended use. And besides, I really didn&#8217;t want to be &#8216;that guy&#8217; &#8211; the programmer that having decided one language / tech is &#8216;the best&#8217;, then tries to apply it everywhere, regardless of suitability; I like to think I&#8217;m a bit more flexible &amp; multicultural than that.</p>
<p>I&#8217;ve also learned that <a href="http://developer.apple.com/technologies/mac/cocoa.html" target="_blank">Cocoa</a> is a very, very smart system. Mad as a bison if you&#8217;re used to other systems beforehand, but persevere with it and resist the urge to hide it under some vanilla layer that you&#8217;re already familiar with, and you discover it&#8217;s really very powerful. Not to mention the Core Animation and Core Graphics frameworks are a lot of fun.</p>
<p>It&#8217;s funny, I&#8217;ve spent so many years concerning myself with providing compatibility across multiple OS&#8217;s, multiple GPUs, multiple render APIs, and multiple drivers, it&#8217;s a genuine joy to actually forget all that for a while, and concentrate on an end goal with a finite number of permutations for a change &#8211; and not to shy away from using platform-specific features.</p>
<p>While I&#8217;m still very much an advocate of open systems, I look at things slightly differently now &#8211; that data &amp; protocols should be open, and that we should all re-use &amp; collaborate on common, preferably open source infrastructure (like OGRE), but that the &#8216;last mile&#8217; to the user is the <em>least</em> suitable for generalisation, because the more specific you can make that interface to what the user expects on their OS &amp; device, the better that experience will be. And at the end of the day to the user, that experience <em>is</em> the application, and thus all that really matters &#8211; and I feel that Apple gets that, in a way that very few others do.</p>
<p>So, I&#8217;m having a great time learning to be an Apple developer so far, I&#8217;m going to see where this takes me for a while. My gut says it feels right, and I&#8217;ve learned to listen to my gut <img src='http://www.stevestreeting.com/wp-includes/images/smilies/icon_smile.gif' alt=':)' class='wp-smiley' />  I love the platform, it&#8217;s a total change of pace and technology, it&#8217;s something I&#8217;ve had an interest in for a while, and the Mac has quite a thriving community of quality independent app developers that I can try to join &#8211; what&#8217;s not to like?</p>
]]></content:encoded>
			<wfw:commentRss>http://www.stevestreeting.com/2010/05/16/takinga-bite-of-the-apple/feed/</wfw:commentRss>
		<slash:comments>13</slash:comments>
		</item>
		<item>
		<title>Windows 7 switcharoo</title>
		<link>http://www.stevestreeting.com/2010/05/14/windows-7-switcharoo/</link>
		<comments>http://www.stevestreeting.com/2010/05/14/windows-7-switcharoo/#comments</comments>
		<pubDate>Fri, 14 May 2010 12:18:24 +0000</pubDate>
		<dc:creator>Steve</dc:creator>
				<category><![CDATA[Tech]]></category>
		<category><![CDATA[Windows]]></category>
		<category><![CDATA[Microsoft]]></category>
		<category><![CDATA[operating systems]]></category>
		<category><![CDATA[OS]]></category>
		<category><![CDATA[PC]]></category>
		<category><![CDATA[windows 7]]></category>

		<guid isPermaLink="false">http://www.stevestreeting.com/?p=2720</guid>
		<description><![CDATA[Spring is usually a time of change, and I finally got a gap in my schedule where I could wipe my primary Windows machine and install Windows 7 (64-bit). It&#8217;s had XP on it for years &#8211; my experience with Vista on secondary test machines quashed any desire to &#8216;upgrade&#8217; my primary work environment, and despite [...]]]></description>
			<content:encoded><![CDATA[<p><img class="alignright size-full wp-image-2722" title="win7" src="http://www.stevestreeting.com/wp-content/uploads/2010/05/win7.jpg" alt="" width="123" height="113" align="right" />Spring is usually a time of change, and I finally got a gap in my schedule where I could wipe my primary Windows machine and install Windows 7 (64-bit). It&#8217;s had XP on it for years &#8211; my experience with Vista on secondary test machines quashed any desire to &#8216;upgrade&#8217; my primary work environment, and despite owning Windows 7 for some months a number of things have stopped me installing it, from lack of driver support for my office wifi-connected all-in-one printer / scanner, to work commitments where I couldn&#8217;t afford to take the time out to reinstall and set up several complex environments.</p>
<p>So, as someone who hated Vista, what are my impressions? It&#8217;s actually pretty good. It&#8217;s not perfect, but it&#8217;s definitely better than what came before, which is exactly what I expect from an upgrade (and exactly what Vista didn&#8217;t deliver). Things I like:</p>
<ul>
<li><strong>Taskbar</strong> &#8211; clearly inspired by the OS X Dock, but adds some features of its own too like the jump lists and window previews. I&#8217;d prefer if clicking the button when there are multiple windows open switched to the last one you had been using, instead of forcing you to pick one, but on the whole it works well.</li>
<li><strong>Windows Update gets out of my face</strong> &#8211; Vista&#8217;s Windows Update was a dog, while it was kicking in it sucked resources like a bastard and threw off any performance testing I was doing, sometimes for long periods (made worse perhaps by the fact that I didn&#8217;t use Vista that much). The new one seems much lighter.</li>
<li><strong>Responsive</strong> &#8211; they say they&#8217;ve improved the parallelism in many systems, and it certainly feels like it. The same machine feels faster on Windows 7, compared to feeling slower in Vista.</li>
<li><strong>Libraries</strong> &#8211; these are like customising your sidebar in OS X&#8217;s finder, but add more features like grouping and collection searching. Nice.</li>
<li><strong>Devices &amp; Printers</strong> &#8211; when I looked at this view and saw that it came up with photos of my exact mouse, printer etc, without any specific drivers etc installed apart from the base system, I thought that was pretty cool. It&#8217;s actually a useful view in practice too, but the pictures made me grin, because I&#8217;m shallow. But then, if you don&#8217;t smile at least once when you use an OS for the first time, something is wrong on the usability side.</li>
</ul>
<p>There are some stupid things though:</p>
<ul>
<li><strong>UAC remains dumb</strong> &#8211; it still text-matches filenames like &#8216;patch.exe&#8217; and arbitrarily decides that they need to be admin-level. Sure you can tack a manifest onto it to tell it not to, but for Christ sakes, talk about a blunt instrument.</li>
<li><strong>Startup items</strong> &#8211; Why is changing what apps load at login still so esoteric? It hasn&#8217;t changed since Windows 95, and they&#8217;ve hidden the Startup menu by default now (and services are even harder to find). Just not user-friendly at all &#8211; compare to OS X where Login Items is very simple for anyone to use.</li>
<li><strong>Network Drive Login Scope is obscure </strong>- This is new in Windows 7 &#8211; if you connect to a NAS or other network drive, enter your login and click the &#8216;Remember&#8217; checkbox, it only actually remembers until you log out, not permanently as in previous versions. To change this is very obtuse and user-unfriendly &#8211; you have to open Credentials Manager, delete the existing credential (because editing the scope is not possible for no particular reason), and re-create it with the same details (again, scope is not an explicit option so you just have to go on faith here). By doing this the scope becomes &#8216;Enterprise&#8217; rather than &#8216;Session&#8217; (which is obscure in itself) and the result is that your credentials will be remembered across logout / reboots like in XP / Vista. It took me some forum browsing to figure this out, and it&#8217;s just not an intuitive design. Adding a &#8217;scope&#8217; combo to the remember option that says &#8216;Until logout&#8217; or &#8216;Forever&#8217; would solve it, but no, that would just be too simple &amp; intuitive.</li>
<li><strong>Aero Shake</strong> is just silly</li>
</ul>
<p>But, the bottom line is that on balance it&#8217;s pleasant to use despite a few oddities, and I&#8217;m happy with Windows 7 as my main Windows OS now in a way I never was with Vista. I still find OS X more pleasant to use, but this is the closest Windows has ever come to it, and it adds a few ideas of its own too, that importantly actually work &amp; add value &#8211; compared to Vista that mostly imitated and whose additions just fell flat (Flip3D, I&#8217;m looking at you). So, a good OS, and the first one from MS since 2001 that I don&#8217;t regret spending money on.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.stevestreeting.com/2010/05/14/windows-7-switcharoo/feed/</wfw:commentRss>
		<slash:comments>3</slash:comments>
		</item>
	</channel>
</rss>
