<?xml version='1.0' encoding='UTF-8'?><?xml-stylesheet href="http://www.blogger.com/styles/atom.css" type="text/css"?><feed xmlns='http://www.w3.org/2005/Atom' xmlns:openSearch='http://a9.com/-/spec/opensearchrss/1.0/' xmlns:georss='http://www.georss.org/georss' xmlns:thr='http://purl.org/syndication/thread/1.0'><id>tag:blogger.com,1999:blog-3710772025484430360</id><updated>2010-06-20T19:35:49.994+10:00</updated><title type='text'>Dave's Blog</title><subtitle type='html'>This blog is not creatively titled. I dunno, I'm lazy these days. This is updated infrequently!</subtitle><link rel='http://schemas.google.com/g/2005#feed' type='application/atom+xml' href='http://blog.symonds.id.au/feeds/posts/default'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/3710772025484430360/posts/default?orderby=updated'/><link rel='alternate' type='text/html' href='http://blog.symonds.id.au/'/><link rel='hub' href='http://pubsubhubbub.appspot.com/'/><author><name>Dave</name><uri>http://www.blogger.com/profile/01539305803408371819</uri><email>dsymonds@gmail.com</email></author><generator version='7.00' uri='http://www.blogger.com'>Blogger</generator><openSearch:totalResults>16</openSearch:totalResults><openSearch:startIndex>1</openSearch:startIndex><openSearch:itemsPerPage>25</openSearch:itemsPerPage><entry><id>tag:blogger.com,1999:blog-3710772025484430360.post-4688952288998379543</id><published>2009-09-04T00:10:00.005+10:00</published><updated>2009-09-04T00:27:23.233+10:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='software'/><title type='text'>People are cool and like free software</title><content type='html'>MarcoPolo is free software (as in speech &lt;em&gt;and&lt;/em&gt; beer). I do it for the love of programming, and for the challenge of tackling a problem and coming up with a useful, original solution. It's very much a part-time pursuit, and I don't get to it as often as I'd like, but that's fine too. I'm in it for love, not money or acclaim.&lt;br /&gt;&lt;br /&gt;I remember not long after releasing MarcoPolo someone emailed me to ask if they could donate. I was flabbergasted. I didn't understand. He convinced me to add a PayPal link to my website. Someone else suggested an Amazon wish list, so I added one of those too. I seem to get a trickle of donations from both. It's far from enough to live on, but it handily covers my web hosting, and gives me some entertaining reading and listening. And every time someone donates it gives me a warm buzz. Why? Because no-one is legally or morally obligated to do that, but they do it anyway. It validates what I've done as something that matters to someone else, and matters enough for them to give up some money. Even a "thank you" email contributes to that, and I love reading that people's computing lives are a little more simple or joyous because of software that I wrote.&lt;br /&gt;&lt;br /&gt;So a big thank you to everyone who has sent me a donation of any kind, or an appreciative email. I hope I can strive to keep making gradual process with this massive rewrite, and produce a piece of free software that's even better than before.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/3710772025484430360-4688952288998379543?l=blog.symonds.id.au' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://blog.symonds.id.au/feeds/4688952288998379543/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='https://www.blogger.com/comment.g?blogID=3710772025484430360&amp;postID=4688952288998379543' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/3710772025484430360/posts/default/4688952288998379543'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/3710772025484430360/posts/default/4688952288998379543'/><link rel='alternate' type='text/html' href='http://blog.symonds.id.au/2009/09/people-are-cool-and-like-free-software.html' title='People are cool and like free software'/><author><name>Dave</name><uri>http://www.blogger.com/profile/01539305803408371819</uri><email>dsymonds@gmail.com</email><gd:extendedProperty xmlns:gd='http://schemas.google.com/g/2005' name='OpenSocialUserId' value='02658359108351948244'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-3710772025484430360.post-4426777338427567517</id><published>2009-08-08T18:18:00.003+10:00</published><updated>2009-08-08T18:35:51.479+10:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='design'/><category scheme='http://www.blogger.com/atom/ns#' term='marcopolo'/><title type='text'>JavaScript rules</title><content type='html'>I'm fairly happy with how the sensor framework is looking now. It is solid and reliable, resilient to crashing sensors, and fully &lt;abbr title="Key-Value Observing"&gt;KVO&lt;/abbr&gt; so sensor value changes get reflected immediately.&lt;br /&gt;&lt;br /&gt;The next step is to design the rules. In the past there have been many requests for more complex rule types (though people usually don't phrase it that way). Simple things like saying "when this device is *not* plugged in, ..." or "when *both* of these devices are present, ..." are impossible to do directly with the old MarcoPolo. I had originally planned to make MarcoPolo accept the wrapping of existing rule types in boolean operators (NOT, AND, OR), but now I think I have a better idea.&lt;br /&gt;&lt;br /&gt;Here's the concept: embed &lt;a href="http://code.google.com/p/v8/"&gt;V8&lt;/a&gt;, and allow rules to be written in JavaScript. There would be pre-made buttons to create standard matching rules so that most users wouldn't notice the difference, and power users would be able to write arbitrarily-complex rules in an expressive programming language.&lt;br /&gt;&lt;br /&gt;Here's what a simple USB matching rule might look like:&lt;br /&gt;&lt;pre&gt;&lt;br /&gt;function match(valueSet) {&lt;br /&gt;  if ('usb' in valueSet) {&lt;br /&gt;    var devs = valueSet['USB'];&lt;br /&gt;    for (i = 0; i &lt; devs.length; ++i) {&lt;br /&gt;      if (devs[i].vendor_id == 0x046D &amp;&amp;&lt;br /&gt;          devs[i].product_id == 0xC03D))&lt;br /&gt;        return true;&lt;br /&gt;    }&lt;br /&gt;  }&lt;br /&gt;  return false;&lt;br /&gt;}&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;That would be a bit unwieldily for something that should be easy, so there can be builtin functions:&lt;br /&gt;&lt;pre&gt;&lt;br /&gt;function match(valueSet) {&lt;br /&gt;  return mp.hasExactMatch(valueSet, 'USB',&lt;br /&gt;                          {'vendor_id': 0x046D, 'product_id': 0xC03D});&lt;br /&gt;}&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;Of course then it can get complex very easily:&lt;br /&gt;&lt;pre&gt;&lt;br /&gt;function match(valueSet) {&lt;br /&gt;  return mp.hasExactMatch(valueSet, 'USB',&lt;br /&gt;                          {'vendor_id': 0x046D, 'product_id': 0xC03D}) &amp;&amp;&lt;br /&gt;         mp.hasExactMatch(valueSet, 'RunningApplication',&lt;br /&gt;                          'com.apple.Xcode') &amp;&amp;&lt;br /&gt;         !mp.hasExactMatch(valueSet, 'RunningApplication',&lt;br /&gt;                          'com.apple.iTunes');&lt;br /&gt;}&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;That rule would match if my mouse is plugged in, Xcode is running, but iTunes is not running.&lt;br /&gt;&lt;br /&gt;Anyone got any thoughts? Can you see this being beneficial? Or is it just massive over-engineering?&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/3710772025484430360-4426777338427567517?l=blog.symonds.id.au' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://blog.symonds.id.au/feeds/4426777338427567517/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='https://www.blogger.com/comment.g?blogID=3710772025484430360&amp;postID=4426777338427567517' title='3 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/3710772025484430360/posts/default/4426777338427567517'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/3710772025484430360/posts/default/4426777338427567517'/><link rel='alternate' type='text/html' href='http://blog.symonds.id.au/2009/08/javascript-rules.html' title='JavaScript rules'/><author><name>Dave</name><uri>http://www.blogger.com/profile/01539305803408371819</uri><email>dsymonds@gmail.com</email><gd:extendedProperty xmlns:gd='http://schemas.google.com/g/2005' name='OpenSocialUserId' value='02658359108351948244'/></author><thr:total>3</thr:total></entry><entry><id>tag:blogger.com,1999:blog-3710772025484430360.post-7058919599240514113</id><published>2009-05-01T18:08:00.002+10:00</published><updated>2009-05-01T18:13:46.135+10:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='programming'/><category scheme='http://www.blogger.com/atom/ns#' term='google'/><title type='text'>Learning New Stuff</title><content type='html'>Here's something cool: in the 16 months that I've been working at Google, I've learned &lt;em&gt;five&lt;/em&gt; new programming languages. Yep, &lt;em&gt;five&lt;/em&gt;: &lt;a href="http://www.python.org/"&gt;Python&lt;/a&gt;, &lt;a href="http://en.wikipedia.org/wiki/JavaScript"&gt;JavaScript&lt;/a&gt;, &lt;a href="http://labs.google.com/papers/sawzall.html"&gt;Sawzall&lt;/a&gt;, and two others that are so secret that I can't tell you their names. It's been an awesome learning experience, and I feel like the best is still yet to come.&lt;br /&gt;&lt;br /&gt;I've still studiously avoided using &lt;a href="http://java.sun.com/"&gt;Java&lt;/a&gt;, though.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/3710772025484430360-7058919599240514113?l=blog.symonds.id.au' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://blog.symonds.id.au/feeds/7058919599240514113/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='https://www.blogger.com/comment.g?blogID=3710772025484430360&amp;postID=7058919599240514113' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/3710772025484430360/posts/default/7058919599240514113'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/3710772025484430360/posts/default/7058919599240514113'/><link rel='alternate' type='text/html' href='http://blog.symonds.id.au/2009/05/learning-new-stuff.html' title='Learning New Stuff'/><author><name>Dave</name><uri>http://www.blogger.com/profile/01539305803408371819</uri><email>dsymonds@gmail.com</email><gd:extendedProperty xmlns:gd='http://schemas.google.com/g/2005' name='OpenSocialUserId' value='02658359108351948244'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-3710772025484430360.post-7331020831204367816</id><published>2009-03-29T12:59:00.002+11:00</published><updated>2009-03-29T13:08:22.526+11:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='design'/><category scheme='http://www.blogger.com/atom/ns#' term='programming'/><category scheme='http://www.blogger.com/atom/ns#' term='marcopolo'/><title type='text'>Sensor IPC</title><content type='html'>I've got a basic sensor IPC going now. Similar to &lt;a href="http://www.google.com/chrome"&gt;Chrome&lt;/a&gt;'s process model whereby every tab runs in its own distinct process, MarcoPolo 3 now has each sensor running in its own distinct process. This means that an unreliable sensor, whether by memory leaks, buggy Apple APIs or my own mistakes will not bring down MarcoPolo itself. Nifty!&lt;br /&gt;&lt;br /&gt;So far it only does the START and STOP messages, but it's a good start. Here's to more reliable software! If you are tracking the git repo, update it and then you should be able to run the SensorTester app.&lt;br /&gt;&lt;br /&gt;You could even run the sensors directly:&lt;br /&gt;&lt;pre&gt;&lt;br /&gt;$ xcodebuild -target SensorTester -configuration Debug&lt;br /&gt;$ build/Debug/SensorRunner build/Debug/PowerSensor.sensor&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;Type in "START" or "STOP" and you'll be interacting with the sensor in the same way that MarcoPolo will be.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/3710772025484430360-7331020831204367816?l=blog.symonds.id.au' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://blog.symonds.id.au/feeds/7331020831204367816/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='https://www.blogger.com/comment.g?blogID=3710772025484430360&amp;postID=7331020831204367816' title='2 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/3710772025484430360/posts/default/7331020831204367816'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/3710772025484430360/posts/default/7331020831204367816'/><link rel='alternate' type='text/html' href='http://blog.symonds.id.au/2009/03/sensor-ipc.html' title='Sensor IPC'/><author><name>Dave</name><uri>http://www.blogger.com/profile/01539305803408371819</uri><email>dsymonds@gmail.com</email><gd:extendedProperty xmlns:gd='http://schemas.google.com/g/2005' name='OpenSocialUserId' value='02658359108351948244'/></author><thr:total>2</thr:total></entry><entry><id>tag:blogger.com,1999:blog-3710772025484430360.post-5381733416254241451</id><published>2009-01-11T16:55:00.004+11:00</published><updated>2009-01-11T17:00:48.967+11:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='design'/><category scheme='http://www.blogger.com/atom/ns#' term='ui'/><category scheme='http://www.blogger.com/atom/ns#' term='marcopolo'/><title type='text'>Context view (Part 2)</title><content type='html'>Below is another screenshot of the context view. The only visible changes are corrected alignment of the context group state (the currently "selected" context), and the button that will remove contexts and context groups.&lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://3.bp.blogspot.com/_gmXa9tRmcbc/SWmJ_zq428I/AAAAAAAAATk/axhGiG6WAEw/s1600-h/context+view+two.png"&gt;&lt;img style="margin:0 10px 10px 0;cursor:pointer; cursor:hand;width: 320px; height: 320px;" src="http://3.bp.blogspot.com/_gmXa9tRmcbc/SWmJ_zq428I/AAAAAAAAATk/axhGiG6WAEw/s320/context+view+two.png" border="0" alt=""id="BLOGGER_PHOTO_ID_5289910966618217410" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;The lack of visible changes belies the &lt;a href="http://git.symonds.id.au/gitweb.cgi?p=marcopolo3.git;a=commitdiff;h=aa0a1c0087a39def5fb82874c4015d0a90b98ae3"&gt;massive changes under the hood&lt;/a&gt;. It's now using bindings to connect the NSOutlineView to an NSTreeController that is directly using the context models. This will make my work much easier in the future.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/3710772025484430360-5381733416254241451?l=blog.symonds.id.au' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://blog.symonds.id.au/feeds/5381733416254241451/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='https://www.blogger.com/comment.g?blogID=3710772025484430360&amp;postID=5381733416254241451' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/3710772025484430360/posts/default/5381733416254241451'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/3710772025484430360/posts/default/5381733416254241451'/><link rel='alternate' type='text/html' href='http://blog.symonds.id.au/2009/01/context-view-part-2.html' title='Context view (Part 2)'/><author><name>Dave</name><uri>http://www.blogger.com/profile/01539305803408371819</uri><email>dsymonds@gmail.com</email><gd:extendedProperty xmlns:gd='http://schemas.google.com/g/2005' name='OpenSocialUserId' value='02658359108351948244'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://3.bp.blogspot.com/_gmXa9tRmcbc/SWmJ_zq428I/AAAAAAAAATk/axhGiG6WAEw/s72-c/context+view+two.png' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-3710772025484430360.post-8522160917198004856</id><published>2008-10-01T09:40:00.003+10:00</published><updated>2009-01-10T14:20:11.524+11:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='marcopolo'/><category scheme='http://www.blogger.com/atom/ns#' term='iphone'/><title type='text'>Two More Quick Things</title><content type='html'>&lt;ol&gt;&lt;br /&gt;&lt;li&gt;The MarcoPolo rewrite is moving again; watch the &lt;a href="http://git.symonds.id.au"&gt;git repository&lt;/a&gt; for details.&lt;/li&gt;&lt;br /&gt;&lt;li&gt;I did end up getting an iPhone, after &lt;a href="http://www.virginmobile.com.au/"&gt;Virgin Mobile&lt;/a&gt; came out with much more reasonable plans. I still claim that I don't have a phone -- I have a very small portable computer that can also make and receive phone calls.&lt;/li&gt;&lt;br /&gt;&lt;/ol&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/3710772025484430360-8522160917198004856?l=blog.symonds.id.au' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://blog.symonds.id.au/feeds/8522160917198004856/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='https://www.blogger.com/comment.g?blogID=3710772025484430360&amp;postID=8522160917198004856' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/3710772025484430360/posts/default/8522160917198004856'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/3710772025484430360/posts/default/8522160917198004856'/><link rel='alternate' type='text/html' href='http://blog.symonds.id.au/2008/10/two-more-quick-things.html' title='Two More Quick Things'/><author><name>Dave</name><uri>http://www.blogger.com/profile/01539305803408371819</uri><email>dsymonds@gmail.com</email><gd:extendedProperty xmlns:gd='http://schemas.google.com/g/2005' name='OpenSocialUserId' value='02658359108351948244'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-3710772025484430360.post-9030262923559442411</id><published>2008-10-26T08:49:00.003+11:00</published><updated>2009-01-10T14:19:15.025+11:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='programming'/><category scheme='http://www.blogger.com/atom/ns#' term='google'/><title type='text'>Google Summer of Code</title><content type='html'>This year I was a mentor for the &lt;a href="http://code.google.com/soc/2008/"&gt;Google Summer of Code&lt;/a&gt; (GSoC), specifically the &lt;a href="http://code.google.com/soc/2008/git/about.html"&gt;Git organisation&lt;/a&gt;. It was a really good experience, and I'm keen to do it again next year.&lt;br /&gt;&lt;br /&gt;Right now, I'm at the GSoC mentor summit, sitting in the Tunis tech talk room of Building 43 at Google's Mountain View campus. There's a lot of really big nerds here: there's a few people sitting nearby discussing optimal Huffman coding for audio and video compression, and small groups scattered all over Building 43 discussing other similarly technical topics.&lt;br /&gt;&lt;br /&gt;We've been discussing a lot of topics to do with open source, using an &lt;a href="http://en.wikipedia.org/wiki/Unconference"&gt;Unconference&lt;/a&gt;-style system. I led/motivated/moderated a discussion session this morning about distributed version control (fitting for a git representative, of course!), and even though it was only 45 minutes we covered a lot of ground. We're going to have a session tomorrow that is specifically about converting project's source code archives to git.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/3710772025484430360-9030262923559442411?l=blog.symonds.id.au' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://blog.symonds.id.au/feeds/9030262923559442411/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='https://www.blogger.com/comment.g?blogID=3710772025484430360&amp;postID=9030262923559442411' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/3710772025484430360/posts/default/9030262923559442411'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/3710772025484430360/posts/default/9030262923559442411'/><link rel='alternate' type='text/html' href='http://blog.symonds.id.au/2008/10/google-summer-of-code.html' title='Google Summer of Code'/><author><name>Dave</name><uri>http://www.blogger.com/profile/01539305803408371819</uri><email>dsymonds@gmail.com</email><gd:extendedProperty xmlns:gd='http://schemas.google.com/g/2005' name='OpenSocialUserId' value='02658359108351948244'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-3710772025484430360.post-7234343765941880957</id><published>2008-11-18T19:53:00.003+11:00</published><updated>2009-01-10T14:19:07.909+11:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='podcast'/><category scheme='http://www.blogger.com/atom/ns#' term='marcopolo'/><title type='text'>MarcoPolo mentioned on Mac Geek Gab podcast</title><content type='html'>This is &lt;a href="http://www.macobserver.com/podcast/2008/11/10.1.shtml"&gt;the second time MarcoPolo has been discussed&lt;/a&gt; on the &lt;a href="http://www.macobserver.com/podcast/"&gt;Mac Geek Gab podcast&lt;/a&gt;; &lt;a href="http://www.macobserver.com/podcast/2007/07/24.1.shtml"&gt;the first time&lt;/a&gt; was back in July 2007, so I forgive them for forgetting it. Kudos to those kind folk who wrote into them to tell them about MarcoPolo!&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/3710772025484430360-7234343765941880957?l=blog.symonds.id.au' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://blog.symonds.id.au/feeds/7234343765941880957/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='https://www.blogger.com/comment.g?blogID=3710772025484430360&amp;postID=7234343765941880957' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/3710772025484430360/posts/default/7234343765941880957'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/3710772025484430360/posts/default/7234343765941880957'/><link rel='alternate' type='text/html' href='http://blog.symonds.id.au/2008/11/marcopolo-mentioned-on-mac-geek-gab.html' title='MarcoPolo mentioned on Mac Geek Gab podcast'/><author><name>Dave</name><uri>http://www.blogger.com/profile/01539305803408371819</uri><email>dsymonds@gmail.com</email><gd:extendedProperty xmlns:gd='http://schemas.google.com/g/2005' name='OpenSocialUserId' value='02658359108351948244'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-3710772025484430360.post-1631162926060016654</id><published>2008-12-23T17:25:00.003+11:00</published><updated>2009-01-10T14:18:59.860+11:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='google'/><title type='text'>HTC Dream (G1): First Thoughts</title><content type='html'>As a full-time Google employee, &lt;a href="http://www.informationweek.com/blog/main/archives/2008/12/hollydazed_goog.html"&gt;I got given an HTC G1&lt;/a&gt;, the first commercially-available Android handset. It's got a nifty pattern etched on its back (specially for Google), and is completely unlocked.&lt;br /&gt;&lt;br /&gt;I'm not sure what I'm going to do with it. I'm doing just fine with my iPhone (only about 4 months old), and there's enough shortcomings that rule it out as a full-time replacement:&lt;br /&gt;&lt;ul&gt;&lt;br /&gt;  &lt;li&gt;No multi-touch (this is only a software issue, though)&lt;/li&gt;&lt;br /&gt;  &lt;li&gt;No support for multiple Google accounts&lt;/li&gt;&lt;br /&gt;  &lt;li&gt;Non-standard headphone jack&lt;/li&gt;&lt;br /&gt;&lt;/ul&gt;&lt;br /&gt;&lt;br /&gt;The lack of multi-touch is a killer, for me. I took a quick photo soon after charging the G1, and tried to zoom in on it by using the iPhone-standard pinch manoeuvre. I also found the Google Maps application on the G1 quite clunky without multi-touch. Ugh, patents suck.&lt;br /&gt;&lt;br /&gt;The keyboard is quite neat, though. I've gotten used to the iPhone's on-screen keyboard, but I can appreciate the tactile feeling that only a physical keyboard gives.&lt;br /&gt;&lt;br /&gt;The fact that I can write software and run it on the physical phone is a big plus. I'm not pleased that I'm expected to pay $99 and ask Apple nicely before I can put my own software on my own iPhone. I haven't written anything yet for Android, though.&lt;br /&gt;&lt;br /&gt;Finally, because it's officially a developer phone, it's fully unlocked. It's a quad-band phone, so it might work well as a travel phone. I don't travel too much (just twice this year), but the G1 could come in handy for my next trip, whenever that is.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/3710772025484430360-1631162926060016654?l=blog.symonds.id.au' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://blog.symonds.id.au/feeds/1631162926060016654/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='https://www.blogger.com/comment.g?blogID=3710772025484430360&amp;postID=1631162926060016654' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/3710772025484430360/posts/default/1631162926060016654'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/3710772025484430360/posts/default/1631162926060016654'/><link rel='alternate' type='text/html' href='http://blog.symonds.id.au/2008/12/htc-dream-g1-first-thoughts.html' title='HTC Dream (G1): First Thoughts'/><author><name>Dave</name><uri>http://www.blogger.com/profile/01539305803408371819</uri><email>dsymonds@gmail.com</email><gd:extendedProperty xmlns:gd='http://schemas.google.com/g/2005' name='OpenSocialUserId' value='02658359108351948244'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-3710772025484430360.post-7091247508513353277</id><published>2009-01-10T14:12:00.004+11:00</published><updated>2009-01-10T14:18:33.482+11:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='design'/><category scheme='http://www.blogger.com/atom/ns#' term='marcopolo'/><title type='text'>Context view</title><content type='html'>Here's a screenshot of a development version of MarcoPolo 3, showing the new context view:&lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://2.bp.blogspot.com/_gmXa9tRmcbc/SWgShnEVZrI/AAAAAAAAATc/nITkLJY6zAI/s1600-h/early+context+view.png"&gt;&lt;img style="display:block; margin:0px auto 10px; text-align:center;cursor:pointer; cursor:hand;width: 320px; height: 299px;" src="http://2.bp.blogspot.com/_gmXa9tRmcbc/SWgShnEVZrI/AAAAAAAAATc/nITkLJY6zAI/s320/early+context+view.png" border="0" alt=""id="BLOGGER_PHOTO_ID_5289498130978793138" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;It's still obviously rough around the edges, but it shows off the new important concept of &lt;i&gt;context groups&lt;/i&gt;. In this situation, I can track my physical location context &lt;i&gt;independent&lt;/i&gt; of my network location context. This will make it easier to have complex rule/action setups. Of course the context groups themselves are configurable just as much as the context trees, so you could have, for instance, a mood context group that is managed by a collection of light sensor rules.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/3710772025484430360-7091247508513353277?l=blog.symonds.id.au' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://blog.symonds.id.au/feeds/7091247508513353277/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='https://www.blogger.com/comment.g?blogID=3710772025484430360&amp;postID=7091247508513353277' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/3710772025484430360/posts/default/7091247508513353277'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/3710772025484430360/posts/default/7091247508513353277'/><link rel='alternate' type='text/html' href='http://blog.symonds.id.au/2009/01/context-view.html' title='Context view'/><author><name>Dave</name><uri>http://www.blogger.com/profile/01539305803408371819</uri><email>dsymonds@gmail.com</email><gd:extendedProperty xmlns:gd='http://schemas.google.com/g/2005' name='OpenSocialUserId' value='02658359108351948244'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://2.bp.blogspot.com/_gmXa9tRmcbc/SWgShnEVZrI/AAAAAAAAATc/nITkLJY6zAI/s72-c/early+context+view.png' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-3710772025484430360.post-5333574436306270154</id><published>2008-10-01T09:23:00.003+10:00</published><updated>2008-10-01T09:26:24.490+10:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='podcast'/><category scheme='http://www.blogger.com/atom/ns#' term='mac'/><title type='text'>Mac Developer Roundtable</title><content type='html'>I have appeared on another &lt;a href="http://www.mac-developer-network.com/podcasts/macdeveloperroundtable/"&gt;Mac Developer Roundtable&lt;/a&gt;. We just finished recording, so it should appear after Scotty finishes editing it sometime in the next week or two.&lt;br /&gt;&lt;br /&gt;It was good fun. I really wish there were outtakes on podcasts, since there's always a lot of funny stuff happening between the officially recorded bits.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/3710772025484430360-5333574436306270154?l=blog.symonds.id.au' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://blog.symonds.id.au/feeds/5333574436306270154/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='https://www.blogger.com/comment.g?blogID=3710772025484430360&amp;postID=5333574436306270154' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/3710772025484430360/posts/default/5333574436306270154'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/3710772025484430360/posts/default/5333574436306270154'/><link rel='alternate' type='text/html' href='http://blog.symonds.id.au/2008/10/mac-developer-roundtable.html' title='Mac Developer Roundtable'/><author><name>Dave</name><uri>http://www.blogger.com/profile/01539305803408371819</uri><email>dsymonds@gmail.com</email><gd:extendedProperty xmlns:gd='http://schemas.google.com/g/2005' name='OpenSocialUserId' value='02658359108351948244'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-3710772025484430360.post-1803311263022782854</id><published>2008-07-12T19:55:00.002+10:00</published><updated>2008-07-12T20:45:48.176+10:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='iphone'/><title type='text'>Not getting an iPhone 3G</title><content type='html'>I was really looking forward to getting myself an &lt;a href="http://www.apple.com/iphone/"&gt;iPhone 3G&lt;/a&gt;, which would have been my first mobile phone. Yes, really. I'm one of them. &lt;i&gt;Rage against the telecommunications machine!&lt;/i&gt; However, it's not going to happen, because Australian phone companies suck.&lt;br /&gt;&lt;br /&gt;The three options who carry the iPhone 3G are Telstra (the incumbent), Optus and Vodafone.&lt;br /&gt;&lt;ul&gt;&lt;br /&gt;&lt;li&gt;Telstra is a miss. They are generally incompetent, overpriced and an arrogant company. You can get, say, an $89 plan which includes 107 MB (WTF?), though you can buy a "browsing pack" to increase the pitiful data allowance (most useful: 1 GB for $89, 3 GB for $119).&lt;/li&gt;&lt;br /&gt;&lt;li&gt;Optus is promising, but the only plans with even 1 GB data are the $100 pre-paid plan and the $149 post-paid plan.&lt;/li&gt;&lt;br /&gt;&lt;li&gt;Vodafone was hoped to have much better pricing, but they are even worse than Optus, with the cheapest plan with 1 GB data being $169. What a joke. They don't say how much excess data costs; not even in the fine print.&lt;/li&gt;&lt;br /&gt;&lt;/ul&gt;&lt;br /&gt;&lt;br /&gt;All in all, I'm reminded why Australia is often seen as a backwater country. No decent data plans to be seen at all.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/3710772025484430360-1803311263022782854?l=blog.symonds.id.au' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://blog.symonds.id.au/feeds/1803311263022782854/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='https://www.blogger.com/comment.g?blogID=3710772025484430360&amp;postID=1803311263022782854' title='2 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/3710772025484430360/posts/default/1803311263022782854'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/3710772025484430360/posts/default/1803311263022782854'/><link rel='alternate' type='text/html' href='http://blog.symonds.id.au/2008/07/not-getting-iphone-3g.html' title='Not getting an iPhone 3G'/><author><name>Dave</name><uri>http://www.blogger.com/profile/01539305803408371819</uri><email>dsymonds@gmail.com</email><gd:extendedProperty xmlns:gd='http://schemas.google.com/g/2005' name='OpenSocialUserId' value='02658359108351948244'/></author><thr:total>2</thr:total></entry><entry><id>tag:blogger.com,1999:blog-3710772025484430360.post-8247720493511564048</id><published>2008-06-19T09:00:00.000+10:00</published><updated>2008-06-19T09:12:24.445+10:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='design'/><category scheme='http://www.blogger.com/atom/ns#' term='programming'/><category scheme='http://www.blogger.com/atom/ns#' term='marcopolo'/><title type='text'>Lessons Learned from MarcoPolo v1 and v2</title><content type='html'>So &lt;a href="http://blog.symonds.id.au/2008/06/marcopolo-starts-again.html"&gt;I'm rewriting MarcoPolo from scratch&lt;/a&gt;, and so here's a few technical notes as to &lt;em&gt;why&lt;/em&gt; I'm doing it.&lt;br /&gt;&lt;br /&gt;&lt;ol&gt;&lt;br /&gt;&lt;li&gt;&lt;b&gt;Don't fight The Cocoa Way&lt;/b&gt;. I came from a background of writing C/C++ programs that used toolkits like &lt;a href="http://www.gtk.org/"&gt;GTK+&lt;/a&gt; and &lt;a href="http://www.wxwidgets.org/"&gt;wxWidgets&lt;/a&gt;. They are both really good UI toolkits, but they are very different in design to Cocoa. I didn't fully embrace The Cocoa Way, and so I spent far too much time adding little hacks and tweaks to get MarcoPolo to work properly. This boils down to doing proper &lt;a href="http://en.wikipedia.org/wiki/Model-view-controller"&gt;MVC&lt;/a&gt; design, and not being afraid to write wrapper classes to keep it that way.&lt;br /&gt;&lt;/li&gt;&lt;br /&gt;&lt;br /&gt;&lt;li&gt;&lt;b&gt;Spend time mulling over architectural decisions&lt;/b&gt;. Once you start building a huge edifice, it's a lot of effort to go back and make changes. Moreover, it conditions your brain to think along those design lines, so it's harder to notice fundamental mistakes.&lt;br /&gt;&lt;/li&gt;&lt;br /&gt;&lt;br /&gt;&lt;li&gt;&lt;b&gt;Unit tests are good&lt;/b&gt;. In line with lesson #1 above, the code design of the models and controllers were so entangled that it was impossible to unit test them to ensure that sweeping changes I made would not break things.&lt;br /&gt;&lt;/li&gt;&lt;br /&gt;&lt;/ol&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/3710772025484430360-8247720493511564048?l=blog.symonds.id.au' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://blog.symonds.id.au/feeds/8247720493511564048/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='https://www.blogger.com/comment.g?blogID=3710772025484430360&amp;postID=8247720493511564048' title='2 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/3710772025484430360/posts/default/8247720493511564048'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/3710772025484430360/posts/default/8247720493511564048'/><link rel='alternate' type='text/html' href='http://blog.symonds.id.au/2008/06/lessons-learned-from-marcopolo-v1-and.html' title='Lessons Learned from MarcoPolo v1 and v2'/><author><name>Dave</name><uri>http://www.blogger.com/profile/01539305803408371819</uri><email>dsymonds@gmail.com</email><gd:extendedProperty xmlns:gd='http://schemas.google.com/g/2005' name='OpenSocialUserId' value='02658359108351948244'/></author><thr:total>2</thr:total></entry><entry><id>tag:blogger.com,1999:blog-3710772025484430360.post-3988271903760814435</id><published>2008-06-15T10:13:00.005+10:00</published><updated>2008-06-15T15:37:52.667+10:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='design'/><category scheme='http://www.blogger.com/atom/ns#' term='programming'/><category scheme='http://www.blogger.com/atom/ns#' term='marcopolo'/><title type='text'>MarcoPolo starts again</title><content type='html'>&lt;a href="http://www.symonds.id.au/marcopolo/"&gt;MarcoPolo&lt;/a&gt; is now back in active development, and I've started rewriting from scratch. I'm aiming to have a v3.0 released by early October -- newer, more reliable, more flexible and more useful than ever before.&lt;br /&gt;&lt;br /&gt;So why am I rewriting it from scratch? Because the existing (or "old", as I'm now thinking of it) codebase is not good. It was my first significant project using Cocoa and Objective-C, my first significant Mac project, and it's got classic beginner mistakes all over it, everywhere from the class design to the object coupling methods. It's reached the point where it's unfeasible to keep extending it to do new and wonderful things, such as negative rules, logic-operator-grouped rules, multiple simultaneous contexts, etc. And that's just the tip of the iceberg of what I hope MarcoPolo could get to.&lt;br /&gt;&lt;br /&gt;At the same time, I'm now looking for a better bug tracker. &lt;a href="http://trac.edgewall.org/"&gt;Trac&lt;/a&gt; works okay, but it doesn't (yet) have decent git integration, and is lacking in several other features I'd like. I'm looking at &lt;a href="http://lighthouseapp.com/"&gt;Lighthouse&lt;/a&gt; (probably in combination with &lt;a href="http://github.com/"&gt;GitHub&lt;/a&gt;, but my search has only just begun. I welcome any suggestions.&lt;br /&gt;&lt;br /&gt;The new git repository is at &lt;a href="http://git.symonds.id.au/marcopolo3.git"&gt;http://git.symonds.id.au/marcopolo3.git&lt;/a&gt; (it is also &lt;a href="http://git.symonds.id.au/gitweb.cgi?p=marcopolo3.git"&gt;web browseable&lt;/a&gt;).&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/3710772025484430360-3988271903760814435?l=blog.symonds.id.au' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://blog.symonds.id.au/feeds/3988271903760814435/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='https://www.blogger.com/comment.g?blogID=3710772025484430360&amp;postID=3988271903760814435' title='4 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/3710772025484430360/posts/default/3988271903760814435'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/3710772025484430360/posts/default/3988271903760814435'/><link rel='alternate' type='text/html' href='http://blog.symonds.id.au/2008/06/marcopolo-starts-again.html' title='MarcoPolo starts again'/><author><name>Dave</name><uri>http://www.blogger.com/profile/01539305803408371819</uri><email>dsymonds@gmail.com</email><gd:extendedProperty xmlns:gd='http://schemas.google.com/g/2005' name='OpenSocialUserId' value='02658359108351948244'/></author><thr:total>4</thr:total></entry><entry><id>tag:blogger.com,1999:blog-3710772025484430360.post-6405747768725247616</id><published>2008-05-13T13:20:00.000+10:00</published><updated>2008-05-13T13:20:19.342+10:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='design'/><category scheme='http://www.blogger.com/atom/ns#' term='programming'/><category scheme='http://www.blogger.com/atom/ns#' term='google'/><title type='text'>Rigorous Engineering: Testing</title><content type='html'>I've been working for Google for about four months now, and I thought I'd reflect for a short time on how that has affected my software engineering practice. This post I want to concentrate on &lt;em&gt;testing&lt;/em&gt;.&lt;br /&gt;&lt;br /&gt;Testing is a concept that can strike fear into the most hardened of developers. Before working at Google, my testing regime was almost completely manual, with me writing small snippets of code to run a particular function, or manually hardcoding some values to simulate an error condition, or clicking around a GUI extensively. That worked quite well for me, and caught almost all my bugs before I released the code.&lt;br /&gt;&lt;br /&gt;Unsurprisingly, Google's standards are a fair bit higher, and it's expected that code will be written in testable units wherever possible, and accompanied by unit tests. I've unit tested before, but not to the extent that is done here. On one hand, it's a real pain: I've laboured writing great code, thought hard about it to make sure it's correct, and I &lt;em&gt;still&lt;/em&gt; need to prove it to my fellow engineers. On the other hand, unit tests I've written have caught a few silly mistakes I've made and they've better clarified the purpose of the code I'm writing. That latter consideration has helped a great deal when working in a team.&lt;br /&gt;&lt;br /&gt;That's enough for now. Time to do some work.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/3710772025484430360-6405747768725247616?l=blog.symonds.id.au' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://blog.symonds.id.au/feeds/6405747768725247616/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='https://www.blogger.com/comment.g?blogID=3710772025484430360&amp;postID=6405747768725247616' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/3710772025484430360/posts/default/6405747768725247616'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/3710772025484430360/posts/default/6405747768725247616'/><link rel='alternate' type='text/html' href='http://blog.symonds.id.au/2008/05/rigorous-engineering-testing.html' title='Rigorous Engineering: Testing'/><author><name>Dave</name><uri>http://www.blogger.com/profile/01539305803408371819</uri><email>dsymonds@gmail.com</email><gd:extendedProperty xmlns:gd='http://schemas.google.com/g/2005' name='OpenSocialUserId' value='02658359108351948244'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-3710772025484430360.post-3354134593562433606</id><published>2008-05-09T21:45:00.000+10:00</published><updated>2008-05-09T21:50:54.782+10:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='blog'/><title type='text'>First Post</title><content type='html'>Hello, and welcome to this blog.&lt;br /&gt;&lt;br /&gt;This is a personal blog, though I am not going to get personal. I'm planning to write about my ideas as they relate to various topics I care about, including software engineering, user interface design, cool technology, grammar, maths and physics. I invite comments about anything at least peripherally related to what I write about here, so feel free to go nuts.&lt;br /&gt;&lt;br /&gt;This blog is not going to be one of those blogs that's updated each day, or possibly even each week. If you're going to follow it, I'd &lt;em&gt;strongly&lt;/em&gt; recommend just adding the feed to your favourite feed reader, since you'll be wasting your time visiting this web page every day. I personally use &lt;a href="http://reader.google.com/"&gt;Google Reader&lt;/a&gt;.&lt;br /&gt;&lt;br /&gt;My &lt;a href="http://www.symonds.id.au/"&gt;personal web site&lt;/a&gt; (very sparsely populated) houses my most recent free (as in speech) software projects, namely &lt;a href="http://www.symonds.id.au/marcopolo/"&gt;MarcoPolo&lt;/a&gt; (context-aware computing for Mac OS X), and &lt;a href="http://www.symonds.id.au/inodemon/"&gt;iNodeMon&lt;/a&gt; (Mac OS X menubar application for &lt;a href="http://www.internode.on.net/"&gt;Internode ADSL&lt;/a&gt;).&lt;br /&gt;&lt;br /&gt;I also work for Google as a Software Engineer, currently posted at the Google Sydney office. I might write later on about how that's going.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/3710772025484430360-3354134593562433606?l=blog.symonds.id.au' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://blog.symonds.id.au/feeds/3354134593562433606/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='https://www.blogger.com/comment.g?blogID=3710772025484430360&amp;postID=3354134593562433606' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/3710772025484430360/posts/default/3354134593562433606'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/3710772025484430360/posts/default/3354134593562433606'/><link rel='alternate' type='text/html' href='http://blog.symonds.id.au/2008/05/first-post.html' title='First Post'/><author><name>Dave</name><uri>http://www.blogger.com/profile/01539305803408371819</uri><email>dsymonds@gmail.com</email><gd:extendedProperty xmlns:gd='http://schemas.google.com/g/2005' name='OpenSocialUserId' value='02658359108351948244'/></author><thr:total>0</thr:total></entry></feed>