<?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:gd='http://schemas.google.com/g/2005' xmlns:thr='http://purl.org/syndication/thread/1.0'><id>tag:blogger.com,1999:blog-2311776355674459132</id><updated>2011-12-19T13:50:42.316-08:00</updated><title type='text'>Michael's Barrel of Monkeys</title><subtitle type='html'></subtitle><link rel='http://schemas.google.com/g/2005#feed' type='application/atom+xml' href='http://michaelneale.blogspot.com/feeds/posts/default'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/2311776355674459132/posts/default?max-results=100'/><link rel='alternate' type='text/html' href='http://michaelneale.blogspot.com/'/><link rel='hub' href='http://pubsubhubbub.appspot.com/'/><author><name>Michael Neale</name><uri>http://www.blogger.com/profile/14670410000512777421</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='30' src='http://www.users.on.net/~michaelneale/michael.jpg'/></author><generator version='7.00' uri='http://www.blogger.com'>Blogger</generator><openSearch:totalResults>89</openSearch:totalResults><openSearch:startIndex>1</openSearch:startIndex><openSearch:itemsPerPage>100</openSearch:itemsPerPage><entry><id>tag:blogger.com,1999:blog-2311776355674459132.post-15915781158849146</id><published>2011-12-19T13:50:00.001-08:00</published><updated>2011-12-19T13:50:42.331-08:00</updated><title type='text'>I've got 99 problems</title><content type='html'>I guest posted over at CloudBees &lt;a href="http://blog.cloudbees.com/2011/12/ive-got-99-problems-but-scala-aint-one.html"&gt;http://blog.cloudbees.com/2011/12/ive-got-99-problems-but-scala-aint-one.html&lt;/a&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/2311776355674459132-15915781158849146?l=michaelneale.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/2311776355674459132/posts/default/15915781158849146'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/2311776355674459132/posts/default/15915781158849146'/><link rel='alternate' type='text/html' href='http://michaelneale.blogspot.com/2011/12/ive-got-99-problems.html' title='I&apos;ve got 99 problems'/><author><name>Michael Neale</name><uri>http://www.blogger.com/profile/14670410000512777421</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='30' src='http://www.users.on.net/~michaelneale/michael.jpg'/></author></entry><entry><id>tag:blogger.com,1999:blog-2311776355674459132.post-1050443768938211536</id><published>2011-11-20T15:02:00.000-08:00</published><updated>2011-11-20T15:29:07.670-08:00</updated><title type='text'>Errors and Exceptions at OSDC</title><content type='html'>I spoke at the Open Source Developers Conference (canberra, au) and did a talk on what turned out to be the erlang way of building apps:&lt;br /&gt;&lt;br /&gt;&lt;div style="width:425px" id="__ss_10245364"&gt; &lt;strong style="display:block;margin:12px 0 4px"&gt;&lt;a href="http://www.slideshare.net/michaelneale/osdc-2011-michaelneale" title="Osdc 2011 michael_neale" target="_blank"&gt;Osdc 2011 michael_neale&lt;/a&gt;&lt;/strong&gt; &lt;iframe src="http://www.slideshare.net/slideshow/embed_code/10245364" width="425" height="355" frameborder="0" marginwidth="0" marginheight="0" scrolling="no"&gt;&lt;/iframe&gt; &lt;div style="padding:5px 0 12px"&gt; View more &lt;a href="http://www.slideshare.net/" target="_blank"&gt;presentations&lt;/a&gt; from &lt;a href="http://www.slideshare.net/michaelneale" target="_blank"&gt;Michael Neale&lt;/a&gt; &lt;/div&gt; &lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/2311776355674459132-1050443768938211536?l=michaelneale.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/2311776355674459132/posts/default/1050443768938211536'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/2311776355674459132/posts/default/1050443768938211536'/><link rel='alternate' type='text/html' href='http://michaelneale.blogspot.com/2011/11/errors-and-exceptions-at-osdc.html' title='Errors and Exceptions at OSDC'/><author><name>Michael Neale</name><uri>http://www.blogger.com/profile/14670410000512777421</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='30' src='http://www.users.on.net/~michaelneale/michael.jpg'/></author></entry><entry><id>tag:blogger.com,1999:blog-2311776355674459132.post-6540408915210402645</id><published>2011-10-30T01:58:00.001-07:00</published><updated>2011-10-30T01:58:59.217-07:00</updated><title type='text'>Google+ a place for interesting discussions</title><content type='html'>&lt;div class='posterous_autopost'&gt;Much as I don&amp;#39;t need *another* social network, google plus has, well, some pluses ! Seems a good place for in-depth discussion - I expect that is largely due to the early adopter crowd, but we will see.  &lt;p /&gt;&lt;div&gt;&lt;a href="https://plus.google.com/u/0/109005609397751560350/posts/BtqhhEsek3J"&gt;https://plus.google.com/u/0/109005609397751560350/posts/BtqhhEsek3J&lt;/a&gt;&lt;/div&gt; &lt;p style="font-size: 10px;"&gt; &lt;a href="http://posterous.com"&gt;Posted via email&lt;/a&gt;  from &lt;a href="http://michaelneale.posterous.com/google-a-place-for-interesting-discussions"&gt;Michael's posterous&lt;/a&gt; &lt;/p&gt; &lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/2311776355674459132-6540408915210402645?l=michaelneale.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/2311776355674459132/posts/default/6540408915210402645'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/2311776355674459132/posts/default/6540408915210402645'/><link rel='alternate' type='text/html' href='http://michaelneale.blogspot.com/2011/10/google-place-for-interesting.html' title='Google+ a place for interesting discussions'/><author><name>Michael Neale</name><uri>http://www.blogger.com/profile/14670410000512777421</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='30' src='http://www.users.on.net/~michaelneale/michael.jpg'/></author></entry><entry><id>tag:blogger.com,1999:blog-2311776355674459132.post-1241229250550282951</id><published>2011-10-16T18:20:00.000-07:00</published><updated>2011-10-16T18:24:02.105-07:00</updated><title type='text'>Resilient processes (and erlang)</title><content type='html'>So of late - Erlang has been a great tool I have been using as part of the day job. &lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;Its headline feature seems to be concurrency - and whilst that is part of it - I think the real secret sauce is reliability. We have concurrent software, we have fast software, but we don't really have a lot of reliable software. &lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;At its core it is quite simple: take the semantics of operating system processes, and their isolation from each other, and scale that down so you can have thousands of them. A typical Erlang application is made up of many processes (not to be confused with OS processes) - which are light, disposable and have their own memory heap, garbage collector etc... &lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;I did a talk on this recently (and will be refining this for an upcoming talk):&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;br /&gt;&lt;div style="width:425px" id="__ss_9276342"&gt; &lt;strong style="display:block;margin:12px 0 4px"&gt;&lt;a href="http://www.slideshare.net/michaelneale/errors-and-handling-them-yow-nights-sydney-2011" title="Errors and handling them. YOW nights Sydney 2011" target="_blank"&gt;Errors and handling them. YOW nights Sydney 2011&lt;/a&gt;&lt;/strong&gt; &lt;iframe src="http://www.slideshare.net/slideshow/embed_code/9276342" width="425" height="355" frameborder="0" marginwidth="0" marginheight="0" scrolling="no"&gt;&lt;/iframe&gt; &lt;div style="padding:5px 0 12px"&gt; View more &lt;a href="http://www.slideshare.net/" target="_blank"&gt;presentations&lt;/a&gt; from &lt;a href="http://www.slideshare.net/michaelneale" target="_blank"&gt;Michael Neale&lt;/a&gt; &lt;/div&gt; &lt;/div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;It is worth noting that Erlang draws inspiration from both functional programming, and logic programming, both things near and dear to my heart, it is no surprising I found it quite pleasant in almost every way. &lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/2311776355674459132-1241229250550282951?l=michaelneale.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/2311776355674459132/posts/default/1241229250550282951'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/2311776355674459132/posts/default/1241229250550282951'/><link rel='alternate' type='text/html' href='http://michaelneale.blogspot.com/2011/10/resilient-processes-and-erlang.html' title='Resilient processes (and erlang)'/><author><name>Michael Neale</name><uri>http://www.blogger.com/profile/14670410000512777421</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='30' src='http://www.users.on.net/~michaelneale/michael.jpg'/></author></entry><entry><id>tag:blogger.com,1999:blog-2311776355674459132.post-556406718877763167</id><published>2011-05-30T21:55:00.001-07:00</published><updated>2011-05-30T21:55:45.776-07:00</updated><title type='text'>Elasticness and Clouds</title><content type='html'>&lt;div class='posterous_autopost'&gt;Amazon pretty much claimed the word &amp;quot;elastic&amp;quot; in computing when they delivered their Elastic Compute Cloud (EC2) years ago. One of the key features of this is, unsurprisingly, that it is elastic: you use an API (ideally) or a web interface, to provision resources on demand. &lt;p /&gt;&lt;div&gt;This works nicely - except when it doesn&amp;#39;t. After years of experience with this - I have noticed that (in general) at the first sign of trouble the API will start failing, requests dropping, timing out. (sometimes that can even be an early warning sign of impending doom). &lt;/div&gt; &lt;p /&gt;&lt;div&gt;It is worth noting that most clouds seem to have similar issues regarding APIs  - they often don&amp;#39;t have the same quality of service that your servers get. This wouldn&amp;#39;t normally be a problem, but a common strategy with infrastructure clouds is to make use of this elasticness (duh !) day to day for your operations, as well as recovery. Frustratingly, due to this behaviour you have to either accept this QoS limitation, or plan around it by consuming extra resources ahead of time. The latter approach somewhat undoes the benefit of having a highly elastic API - but here we are anyway. &lt;/div&gt; &lt;p /&gt;&lt;div&gt;Somewhere, there is a balance, but at the moment, the big users of the public clouds are treating them increasingly as a less than elastic resource pool (look up Netflix and their use of Amazon for an example of this). I can&amp;#39;t help but wonder if this means APIs will fall out of favour for highly elastic workloads, or if the QoS of these APIs will improve over time...&lt;/div&gt; &lt;p style="font-size: 10px;"&gt; &lt;a href="http://posterous.com"&gt;Posted via email&lt;/a&gt;  from &lt;a href="http://michaelneale.posterous.com/elasticness-and-clouds"&gt;Michael's posterous&lt;/a&gt; &lt;/p&gt; &lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/2311776355674459132-556406718877763167?l=michaelneale.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/2311776355674459132/posts/default/556406718877763167'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/2311776355674459132/posts/default/556406718877763167'/><link rel='alternate' type='text/html' href='http://michaelneale.blogspot.com/2011/05/elasticness-and-clouds.html' title='Elasticness and Clouds'/><author><name>Michael Neale</name><uri>http://www.blogger.com/profile/14670410000512777421</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='30' src='http://www.users.on.net/~michaelneale/michael.jpg'/></author></entry><entry><id>tag:blogger.com,1999:blog-2311776355674459132.post-7088693644082431290</id><published>2011-03-18T17:32:00.001-07:00</published><updated>2011-03-18T17:32:53.493-07:00</updated><title type='text'>How to waste a friday</title><content type='html'>&lt;div class='posterous_autopost'&gt;A unusually verbose writeup on network issues and what they will do at &lt;a href="http://status.aws.amazon.com"&gt;status.aws.amazon.com&lt;/a&gt;:&lt;p /&gt;&lt;div&gt;Repeated here for posterity (E-BS is a story for another day, but for now): &lt;/div&gt; &lt;p /&gt;&lt;div&gt;&lt;div style=""&gt;&lt;p&gt;From 7:28pm PDT to 9:56pm PDT, a networking issue affected connectivity to a significant number of instances in the US-EAST-1 region. Affected instances experienced degraded network connectivity to the Internet and to instances in other availability zones.&lt;/p&gt; &lt;p&gt;The root cause of last night&amp;#39;s issue was when a core network routing device experienced a partial failure. While the router was causing packet loss, the failure was not detected by surrounding network devices and therefore they did not automatically fail traffic over to redundant network paths as intended.&lt;/p&gt; &lt;p&gt;Additionally, our network monitoring tools failed to help our network operators locate the specific source of the connectivity issues. Once our networking team determined the location of the impact, they were able to identify the failing router and manually failed traffic routes away from it. At this point, all affected instances regained full connectivity.&lt;/p&gt; &lt;p&gt;We will be completely replacing the failed network device and our team will work on the failed device to understand the source of the failure. More importantly, we will be working to understanding why our network monitoring did not allow our team to quickly isolate the problem and force the manual failover to redundant network routes. We rely on this monitoring to help us deal with partial failures which defeat the normal redundancy built into high availability network architectures. We understand the impact this event had on some of our users, this just took us too long to figure out, and will be intensely focused on improving our monitoring and addressing the root cause of this failure.&lt;/p&gt; &lt;/div&gt;&lt;br /&gt; &lt;/div&gt; &lt;p style="font-size: 10px;"&gt; &lt;a href="http://posterous.com"&gt;Posted via email&lt;/a&gt;  from &lt;a href="http://michaelneale.posterous.com/how-to-waste-a-friday"&gt;Michael's posterous&lt;/a&gt; &lt;/p&gt; &lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/2311776355674459132-7088693644082431290?l=michaelneale.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/2311776355674459132/posts/default/7088693644082431290'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/2311776355674459132/posts/default/7088693644082431290'/><link rel='alternate' type='text/html' href='http://michaelneale.blogspot.com/2011/03/how-to-waste-friday.html' title='How to waste a friday'/><author><name>Michael Neale</name><uri>http://www.blogger.com/profile/14670410000512777421</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='30' src='http://www.users.on.net/~michaelneale/michael.jpg'/></author></entry><entry><id>tag:blogger.com,1999:blog-2311776355674459132.post-4166164734472732631</id><published>2011-01-31T23:48:00.001-08:00</published><updated>2011-01-31T23:48:54.398-08:00</updated><title type='text'>CloudBees runtime</title><content type='html'>&lt;div class='posterous_autopost'&gt;So one of the things I have been working on a bit lately is now finally live: &lt;p /&gt;&lt;div&gt;&lt;a href="http://www.cloudbees.com/run.cb"&gt;http://www.cloudbees.com/run.cb&lt;/a&gt;&lt;/div&gt;&lt;p /&gt;&lt;div&gt;The short version: very much like GAE but without the google. On top of this, this works with the so called &amp;quot;dev@cloud&amp;quot; (which is hudson - no renamed to Jenkins - still with me?) so you can have a code push -&amp;gt; test -&amp;gt; run cycle all in one place (if you like).  &lt;/div&gt;&lt;p /&gt;&lt;div&gt;Zero proprietary apis, the data remains yours of course. There will always be a free runtime in the cloud, I think it is necessary to &amp;quot;keep the dream alive&amp;quot; so to speak. Signup is free of course (you may need to put in your phone number so it can check you are human). &lt;/div&gt; &lt;p /&gt;&lt;div&gt;It has been nice building something that I want to use. It is a nice place to be. &lt;/div&gt;&lt;p /&gt;&lt;div&gt;Enjoy !&lt;/div&gt; &lt;p style="font-size: 10px;"&gt; &lt;a href="http://posterous.com"&gt;Posted via email&lt;/a&gt;  from &lt;a href="http://michaelneale.posterous.com/cloudbees-runtime"&gt;Michael's posterous&lt;/a&gt; &lt;/p&gt; &lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/2311776355674459132-4166164734472732631?l=michaelneale.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/2311776355674459132/posts/default/4166164734472732631'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/2311776355674459132/posts/default/4166164734472732631'/><link rel='alternate' type='text/html' href='http://michaelneale.blogspot.com/2011/01/cloudbees-runtime.html' title='CloudBees runtime'/><author><name>Michael Neale</name><uri>http://www.blogger.com/profile/14670410000512777421</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='30' src='http://www.users.on.net/~michaelneale/michael.jpg'/></author></entry><entry><id>tag:blogger.com,1999:blog-2311776355674459132.post-5692514851102612696</id><published>2011-01-06T15:14:00.000-08:00</published><updated>2011-01-06T15:18:54.771-08:00</updated><title type='text'>The Sun</title><content type='html'>&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://2.bp.blogspot.com/_KukQ8TlQMz8/TSZNttQvpyI/AAAAAAAAAmQ/Z2q4fqswkbs/s1600/BackyardPanorama.jpeg"&gt;&lt;img style="display:block; margin:0px auto 10px; text-align:center;cursor:pointer; cursor:hand;width: 400px; height: 97px;" src="http://2.bp.blogspot.com/_KukQ8TlQMz8/TSZNttQvpyI/AAAAAAAAAmQ/Z2q4fqswkbs/s400/BackyardPanorama.jpeg" border="0" alt="" id="BLOGGER_PHOTO_ID_5559216237674735394" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://2.bp.blogspot.com/_KukQ8TlQMz8/TSZNbgX3zVI/AAAAAAAAAmI/7Sh5mif2-cY/s1600/Screen%2Bshot%2B2011-01-07%2Bat%2B10.15.31%2BAM.png"&gt;&lt;img style="float:left; margin:0 10px 10px 0;cursor:pointer; cursor:hand;width: 303px; height: 400px;" src="http://2.bp.blogspot.com/_KukQ8TlQMz8/TSZNbgX3zVI/AAAAAAAAAmI/7Sh5mif2-cY/s400/Screen%2Bshot%2B2011-01-07%2Bat%2B10.15.31%2BAM.png" border="0" alt="" id="BLOGGER_PHOTO_ID_5559215924977323346" /&gt;&lt;/a&gt;Thanks to generous subsidies (state government - it went way beyond what they expected and had to be wound down), a significant portion of my power is from the sun. Surprising how light the array panels are - and they have coped just fine through some furious storms. &lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;Only a tiny system, 1.5k rating for the array, but it often gets close to 2K being generated on a sunny day (thankfully the inverter is over-rated for over 2K). &lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;(photo above is panorama from the deck below the panels)&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/2311776355674459132-5692514851102612696?l=michaelneale.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/2311776355674459132/posts/default/5692514851102612696'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/2311776355674459132/posts/default/5692514851102612696'/><link rel='alternate' type='text/html' href='http://michaelneale.blogspot.com/2011/01/sun.html' title='The Sun'/><author><name>Michael Neale</name><uri>http://www.blogger.com/profile/14670410000512777421</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='30' src='http://www.users.on.net/~michaelneale/michael.jpg'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://2.bp.blogspot.com/_KukQ8TlQMz8/TSZNttQvpyI/AAAAAAAAAmQ/Z2q4fqswkbs/s72-c/BackyardPanorama.jpeg' height='72' width='72'/></entry><entry><id>tag:blogger.com,1999:blog-2311776355674459132.post-9015262237979856633</id><published>2010-11-24T22:56:00.001-08:00</published><updated>2010-11-24T22:56:46.501-08:00</updated><title type='text'>Homebrew: if you develop on OS-X...</title><content type='html'>&lt;div class='posterous_autopost'&gt;If you don&amp;#39;t already have homebrew, run, don&amp;#39;t walk, and install &lt;a href="https://github.com/mxcl/homebrew"&gt;https://github.com/mxcl/homebrew&lt;/a&gt;&lt;p /&gt;&lt;div&gt;A really well done package manager for developers on OS-X (as opposed to a tool for administrators).&lt;p /&gt;  &lt;/div&gt; &lt;p style="font-size: 10px;"&gt; &lt;a href="http://posterous.com"&gt;Posted via email&lt;/a&gt;  from &lt;a href="http://michaelneale.posterous.com/homebrew-if-you-develop-on-os-x"&gt;Michael's posterous&lt;/a&gt; &lt;/p&gt; &lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/2311776355674459132-9015262237979856633?l=michaelneale.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/2311776355674459132/posts/default/9015262237979856633'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/2311776355674459132/posts/default/9015262237979856633'/><link rel='alternate' type='text/html' href='http://michaelneale.blogspot.com/2010/11/homebrew-if-you-develop-on-os-x.html' title='Homebrew: if you develop on OS-X...'/><author><name>Michael Neale</name><uri>http://www.blogger.com/profile/14670410000512777421</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='30' src='http://www.users.on.net/~michaelneale/michael.jpg'/></author></entry><entry><id>tag:blogger.com,1999:blog-2311776355674459132.post-5371160496716047551</id><published>2010-10-17T22:36:00.001-07:00</published><updated>2010-10-17T22:37:26.600-07:00</updated><title type='text'>Getting running with Postgres (on OS-X)</title><content type='html'>&lt;div class="posterous_autopost"&gt;So I spent the best part of a friday morning "yak shaving" - getting postgres to run on OS-X in a development friendly way. I consulted The Google - and found thousands of ways one could install postgresql for development. I think the core of my problem is that a lot of the guides want you to have a hardened production installation. &lt;p&gt;&lt;/p&gt;&lt;div&gt;So what I recommend (thanks to Simon Harris): &lt;/div&gt;&lt;p&gt;&lt;/p&gt;&lt;div&gt;Install homebrew ! &lt;/div&gt;&lt;div&gt;brew install postgresql&lt;/div&gt;&lt;p&gt;&lt;/p&gt;&lt;div&gt;(have a coffee)&lt;/div&gt;&lt;p&gt;&lt;/p&gt;&lt;div&gt;After it is installed, it spits out instructions on how to start, you may miss that, so here it is repeated: &lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;/div&gt;&lt;div&gt; &lt;p class="p1"&gt;If this is your first install, create a database with:&lt;/p&gt; &lt;p class="p1"&gt;    initdb /usr/local/var/postgres&lt;/p&gt; &lt;p class="p2"&gt;&lt;br /&gt;&lt;/p&gt; &lt;p class="p1"&gt;If this is your first install, automatically load on login with:&lt;/p&gt; &lt;p class="p1"&gt;    cp /usr/local/Cellar/postgresql/9.0.1/org.postgresql.postgres.plist ~/Library/LaunchAgents&lt;/p&gt; &lt;p class="p1"&gt;    launchctl load -w ~/Library/LaunchAgents/org.postgresql.postgres.plist&lt;/p&gt; &lt;p class="p2"&gt;&lt;br /&gt;&lt;/p&gt; &lt;p class="p1"&gt;If this is an upgrade and you already have the org.postgresql.postgres.plist loaded:&lt;/p&gt; &lt;p class="p1"&gt;    launchctl unload -w ~/Library/LaunchAgents/org.postgresql.postgres.plist&lt;/p&gt; &lt;p class="p1"&gt;    cp /usr/local/Cellar/postgresql/9.0.1/org.postgresql.postgres.plist ~/Library/LaunchAgents&lt;/p&gt; &lt;p class="p1"&gt;    launchctl load -w ~/Library/LaunchAgents/org.postgresql.postgres.plist&lt;/p&gt; &lt;p class="p2"&gt;&lt;br /&gt;&lt;/p&gt; &lt;p class="p1"&gt;Or start manually with:&lt;/p&gt; &lt;p class="p1"&gt;    pg_ctl -D /usr/local/var/postgres -l /usr/local/var/postgres/server.log start&lt;/p&gt; &lt;p class="p2"&gt;&lt;br /&gt;&lt;/p&gt; &lt;p class="p1"&gt;And stop with:&lt;/p&gt; &lt;p class="p1"&gt;    pg_ctl -D /usr/local/var/postgres stop -s -m fast&lt;/p&gt; &lt;p class="p2"&gt;&lt;br /&gt;&lt;/p&gt; &lt;p class="p1"&gt;If you want to install the postgres gem, including ARCHFLAGS is recommended:&lt;/p&gt; &lt;p class="p1"&gt;    env ARCHFLAGS="-arch x86_64" gem install pg&lt;/p&gt;&lt;p class="p1"&gt;&lt;br /&gt;&lt;/p&gt;&lt;p class="p1"&gt;Finally - this is all running as your current user - no super user, no postgres user. You can simply run: &lt;/p&gt; &lt;p class="p1"&gt;&lt;br /&gt;&lt;/p&gt;&lt;p class="p1"&gt;createdb yourdbname-here&lt;/p&gt;&lt;p class="p1"&gt;dropdb etc... &lt;/p&gt;&lt;p class="p1"&gt;It will always use your current user - which is perfect for development. Much easier than trying to shoehorn in server grade configurations. &lt;/p&gt;&lt;p class="p1"&gt;Another top tip, import a dump with all permissions stripped: &lt;/p&gt;&lt;p class="p1"&gt; &lt;/p&gt;&lt;p class="p1"&gt;&lt;br /&gt;&lt;/p&gt; &lt;p class="p2"&gt;pg_restore --dbname=yourdevdb --no-privileges --no-owner yourdatabase.dump&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;p class="p1"&gt;&lt;br /&gt;&lt;/p&gt; &lt;/div&gt; &lt;p style="font-size: 10px;"&gt; &lt;a href="http://posterous.com/"&gt;Posted via email&lt;/a&gt;  from &lt;a href="http://michaelneale.posterous.com/getting-running-with-postgres-on-os-x"&gt;Michael's posterous&lt;/a&gt; &lt;/p&gt; &lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/2311776355674459132-5371160496716047551?l=michaelneale.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/2311776355674459132/posts/default/5371160496716047551'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/2311776355674459132/posts/default/5371160496716047551'/><link rel='alternate' type='text/html' href='http://michaelneale.blogspot.com/2010/10/getting-running-with-postgres-on-os-x.html' title='Getting running with Postgres (on OS-X)'/><author><name>Michael Neale</name><uri>http://www.blogger.com/profile/14670410000512777421</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='30' src='http://www.users.on.net/~michaelneale/michael.jpg'/></author></entry><entry><id>tag:blogger.com,1999:blog-2311776355674459132.post-1124881838388667482</id><published>2010-09-14T01:15:00.001-07:00</published><updated>2010-09-14T01:15:38.125-07:00</updated><title type='text'>Remote workers vs Distributed team</title><content type='html'>&lt;div class='posterous_autopost'&gt;&lt;img src="http://posterous.com/getfile/files.posterous.com/michaelneale/q448rMq1MqIzRiUIvJ4prc1tMd8KXZC65HLOqnNvKdWCTQDQaDZ0h0sTb4fx/remote-dist-venn.png" width="338" height="220"/&gt; &lt;p&gt;This is one of those things that is obvious once someone clearly writes about it (something Bob is great at doing)&lt;/p&gt;&lt;p /&gt;&lt;div&gt;&lt;a href="http://bob.mcwhirter.org/blog/2010/09/13/remote-worker-distributed-team/"&gt;http://bob.mcwhirter.org/blog/2010/09/13/remote-worker-distributed-team/&lt;/a&gt;&lt;/div&gt; &lt;p style="font-size: 10px;"&gt; &lt;a href="http://posterous.com"&gt;Posted via email&lt;/a&gt;  from &lt;a href="http://michaelneale.posterous.com/remote-workers-vs-distributed-team"&gt;Michael's posterous&lt;/a&gt; &lt;/p&gt; &lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/2311776355674459132-1124881838388667482?l=michaelneale.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/2311776355674459132/posts/default/1124881838388667482'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/2311776355674459132/posts/default/1124881838388667482'/><link rel='alternate' type='text/html' href='http://michaelneale.blogspot.com/2010/09/remote-workers-vs-distributed-team.html' title='Remote workers vs Distributed team'/><author><name>Michael Neale</name><uri>http://www.blogger.com/profile/14670410000512777421</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='30' src='http://www.users.on.net/~michaelneale/michael.jpg'/></author></entry><entry><id>tag:blogger.com,1999:blog-2311776355674459132.post-2739516242293561674</id><published>2010-08-29T17:20:00.001-07:00</published><updated>2010-08-29T17:20:35.833-07:00</updated><title type='text'>The cloudbees blog</title><content type='html'>&lt;div class='posterous_autopost'&gt;I will shortly be blogging at the &lt;a href="http://blog.cloudbees.com"&gt;cloudbees blog&lt;/a&gt; - at least as soon as I can talk about what we are doing/what we have done without sounding like a complete idiot. Hopefully some useful lessons others can benefit from.  &lt;p style="font-size: 10px;"&gt; &lt;a href="http://posterous.com"&gt;Posted via email&lt;/a&gt;  from &lt;a href="http://michaelneale.posterous.com/the-cloudbees-blog"&gt;Michael's posterous&lt;/a&gt; &lt;/p&gt; &lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/2311776355674459132-2739516242293561674?l=michaelneale.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/2311776355674459132/posts/default/2739516242293561674'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/2311776355674459132/posts/default/2739516242293561674'/><link rel='alternate' type='text/html' href='http://michaelneale.blogspot.com/2010/08/cloudbees-blog.html' title='The cloudbees blog'/><author><name>Michael Neale</name><uri>http://www.blogger.com/profile/14670410000512777421</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='30' src='http://www.users.on.net/~michaelneale/michael.jpg'/></author></entry><entry><id>tag:blogger.com,1999:blog-2311776355674459132.post-3686195899718826480</id><published>2010-08-26T18:48:00.001-07:00</published><updated>2010-08-26T18:48:43.406-07:00</updated><title type='text'>It's alive !</title><content type='html'>&lt;div class='posterous_autopost'&gt;&lt;img src="http://posterous.com/getfile/files.posterous.com/michaelneale/R0j3X0k7Y0eteSxvu1LWqJSWddKm4ZB63467FDZKQPVhMRR7ebs60JF8KRTO/bee-and-flower.jpg" width="400" height="351"/&gt; &lt;p&gt;So phase 1 of my new company is alive &lt;a href="http://www.cloudbees.com"&gt;www.cloudbees.com&lt;/a&gt; or at least open to beta signups.&lt;/p&gt;&lt;div&gt;Its really &amp;quot;hudson as a service&amp;quot; with a few twists (which mostly make things faster and cheaper for users than they might initially realise). &lt;/div&gt; &lt;p /&gt;&lt;div&gt;Phase 2 is still being worked on... hopefully will have some more interesting things to say one day soon. &lt;/div&gt; &lt;p style="font-size: 10px;"&gt; &lt;a href="http://posterous.com"&gt;Posted via email&lt;/a&gt;  from &lt;a href="http://michaelneale.posterous.com/its-alive"&gt;Michael's posterous&lt;/a&gt; &lt;/p&gt; &lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/2311776355674459132-3686195899718826480?l=michaelneale.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/2311776355674459132/posts/default/3686195899718826480'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/2311776355674459132/posts/default/3686195899718826480'/><link rel='alternate' type='text/html' href='http://michaelneale.blogspot.com/2010/08/it-alive.html' title='It&amp;#39;s alive !'/><author><name>Michael Neale</name><uri>http://www.blogger.com/profile/14670410000512777421</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='30' src='http://www.users.on.net/~michaelneale/michael.jpg'/></author></entry><entry><id>tag:blogger.com,1999:blog-2311776355674459132.post-6586314392447453104</id><published>2010-08-26T16:36:00.001-07:00</published><updated>2010-08-26T16:36:44.736-07:00</updated><title type='text'>SJUG presentation on cloud APIs</title><content type='html'>&lt;div style="width:425px" id="__ss_5064198"&gt;&lt;strong style="display:block;margin:12px 0 4px"&gt;&lt;a href="http://www.slideshare.net/michaelneale/sjug-aug-2010cloud" title="Sjug aug 2010_cloud"&gt;Sjug aug 2010_cloud&lt;/a&gt;&lt;/strong&gt;&lt;object id="__sse5064198" width="425" height="355"&gt;&lt;param name="movie" value="http://static.slidesharecdn.com/swf/ssplayer2.swf?doc=sjugaug2010cloud-100826181103-phpapp01&amp;stripped_title=sjug-aug-2010cloud" /&gt;&lt;param name="allowFullScreen" value="true"/&gt;&lt;param name="allowScriptAccess" value="always"/&gt;&lt;embed name="__sse5064198" src="http://static.slidesharecdn.com/swf/ssplayer2.swf?doc=sjugaug2010cloud-100826181103-phpapp01&amp;stripped_title=sjug-aug-2010cloud" type="application/x-shockwave-flash" allowscriptaccess="always" allowfullscreen="true" width="425" height="355"&gt;&lt;/embed&gt;&lt;/object&gt;&lt;div style="padding:5px 0 12px"&gt;View more &lt;a href="http://www.slideshare.net/"&gt;presentations&lt;/a&gt; from &lt;a href="http://www.slideshare.net/michaelneale"&gt;Michael Neale&lt;/a&gt;.&lt;/div&gt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/2311776355674459132-6586314392447453104?l=michaelneale.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/2311776355674459132/posts/default/6586314392447453104'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/2311776355674459132/posts/default/6586314392447453104'/><link rel='alternate' type='text/html' href='http://michaelneale.blogspot.com/2010/08/sjug-presentation-on-cloud-apis.html' title='SJUG presentation on cloud APIs'/><author><name>Michael Neale</name><uri>http://www.blogger.com/profile/14670410000512777421</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='30' src='http://www.users.on.net/~michaelneale/michael.jpg'/></author></entry><entry><id>tag:blogger.com,1999:blog-2311776355674459132.post-1028033318773340482</id><published>2010-07-13T17:34:00.001-07:00</published><updated>2010-07-13T17:34:16.115-07:00</updated><title type='text'>Ephemeral - the word of the week (cloud)</title><content type='html'>&lt;div class='posterous_autopost'&gt;So part of what I have been working on has been touching on 2 fairly popular &amp;quot;infrastructure clouds&amp;quot; Amazon EC2 and Rackspace CloudServers. Infrastructure as a service == IaaS == servers on demand (via some api, with illusion of infinite numbers of these resources available - lots more written elsewhere on the web so I won&amp;#39;t repeat). I pronounce IaaS &amp;quot;yass&amp;quot; but a good friend of mine says &amp;quot;I Ass&amp;quot; which I may adapt, except in polite company. &lt;p /&gt;&lt;div&gt;In any case, there is a bit of a misunderstanding as to what &amp;quot;ephemeral&amp;quot; means for these virtual cloud machines: with amazons &amp;quot;instance storage&amp;quot; - people still seem to think that if you restart, you lose your storage, heck you even loose your ip. But this is NOT the case ! The only time you lose that storage is if the machine dies in some catastrophic way - or you terminate it. Restarting is just fine. In this sense Rackspace and EC2 are very similar (Rackspace has a higher QoS on their instance stores which is at least equaled by using an EBS store on ec2). &lt;/div&gt; &lt;p /&gt;&lt;div&gt;I am surprised that this confusion lives on, but reading the above paragraph for jargon its probably not surprising why. As always experience cures all this. &lt;/div&gt; &lt;p style="font-size: 10px;"&gt; &lt;a href="http://posterous.com"&gt;Posted via email&lt;/a&gt;  from &lt;a href="http://michaelneale.posterous.com/ephemeral-the-word-of-the-week-cloud"&gt;Michael's posterous&lt;/a&gt; &lt;/p&gt; &lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/2311776355674459132-1028033318773340482?l=michaelneale.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/2311776355674459132/posts/default/1028033318773340482'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/2311776355674459132/posts/default/1028033318773340482'/><link rel='alternate' type='text/html' href='http://michaelneale.blogspot.com/2010/07/ephemeral-word-of-week-cloud.html' title='Ephemeral - the word of the week (cloud)'/><author><name>Michael Neale</name><uri>http://www.blogger.com/profile/14670410000512777421</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='30' src='http://www.users.on.net/~michaelneale/michael.jpg'/></author></entry><entry><id>tag:blogger.com,1999:blog-2311776355674459132.post-8153404310379667694</id><published>2010-06-17T17:57:00.001-07:00</published><updated>2010-06-17T17:57:01.063-07:00</updated><title type='text'>VMWare and owning the cloud</title><content type='html'>&lt;div class='posterous_autopost'&gt;I seem to be frequently asked about my thoughts on VMWare (and to some extent Spring Source) and their acquisitions, or rumoured acquisitions - in terms of what they are doing &amp;quot;with the cloud&amp;quot;.  &lt;div&gt;To me its pretty simple: Machine virtualisation is what enabled the so-called cloud computing evolution to start happening - making use of excess physical capacity, portable workloads, management apis etc. - and continues to be the cornerstone of clouds (with the notable exception of &lt;a href="http://newservers.com"&gt;newservers.com&lt;/a&gt; !). &lt;/div&gt; &lt;p /&gt;&lt;div&gt;Of course, my personal first experience with virtualisation was with VMWare itself - usually in places where it was used to slice up machines for multiple test environments. I would bet it is the same for many. I think VMWare see themselves are the originator of this revolution/evolution and see it as their rightful place to be a top tier cloud service provider (both in terms of software, and providing, possibly, publicly available servers on demand). It might mess with their software licence business model, but to them, it doesn&amp;#39;t matter, as they see themselves has having a right to be up there with ec2, with rackspace etc ! Good luck to them. &lt;/div&gt; &lt;p style="font-size: 10px;"&gt; &lt;a href="http://posterous.com"&gt;Posted via email&lt;/a&gt;  from &lt;a href="http://michaelneale.posterous.com/vmware-and-owning-the-cloud"&gt;Michael's posterous&lt;/a&gt; &lt;/p&gt; &lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/2311776355674459132-8153404310379667694?l=michaelneale.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/2311776355674459132/posts/default/8153404310379667694'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/2311776355674459132/posts/default/8153404310379667694'/><link rel='alternate' type='text/html' href='http://michaelneale.blogspot.com/2010/06/vmware-and-owning-cloud.html' title='VMWare and owning the cloud'/><author><name>Michael Neale</name><uri>http://www.blogger.com/profile/14670410000512777421</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='30' src='http://www.users.on.net/~michaelneale/michael.jpg'/></author></entry><entry><id>tag:blogger.com,1999:blog-2311776355674459132.post-2734047724607101800</id><published>2010-06-17T17:51:00.001-07:00</published><updated>2010-06-17T17:51:27.790-07:00</updated><title type='text'>Awesome video/talk on personal motivation</title><content type='html'>&lt;div class='posterous_autopost'&gt;&lt;object height="417" width="500"&gt;&lt;param name="movie" value="http://www.youtube.com/v/u6XAPnuFjJc&amp;hl=en&amp;fs=1" /&gt;&lt;/param&gt;&lt;param name="wmode" value="window" /&gt;&lt;param name="allowFullScreen" value="true" /&gt;&lt;/param&gt;&lt;param name="allowscriptaccess" value="always" /&gt;&lt;/param&gt;&lt;embed src="http://www.youtube.com/v/u6XAPnuFjJc&amp;hl=en&amp;fs=1" allowfullscreen="true" type="application/x-shockwave-flash" allowscriptaccess="always" wmode="window" height="417" width="500"&gt;&lt;/embed&gt;&lt;/object&gt; &lt;p style="font-size: 10px;"&gt; &lt;a href="http://posterous.com"&gt;Posted via email&lt;/a&gt;  from &lt;a href="http://michaelneale.posterous.com/awesome-videotalk-on-personal-motivation"&gt;Michael's posterous&lt;/a&gt; &lt;/p&gt; &lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/2311776355674459132-2734047724607101800?l=michaelneale.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/2311776355674459132/posts/default/2734047724607101800'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/2311776355674459132/posts/default/2734047724607101800'/><link rel='alternate' type='text/html' href='http://michaelneale.blogspot.com/2010/06/awesome-videotalk-on-personal.html' title='Awesome video/talk on personal motivation'/><author><name>Michael Neale</name><uri>http://www.blogger.com/profile/14670410000512777421</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='30' src='http://www.users.on.net/~michaelneale/michael.jpg'/></author></entry><entry><id>tag:blogger.com,1999:blog-2311776355674459132.post-3139791765758536314</id><published>2010-06-02T20:01:00.001-07:00</published><updated>2010-06-07T17:28:29.320-07:00</updated><title type='text'>If getting errors in an IDEA scala project...</title><content type='html'>&lt;div style="text-align: center;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div class="posterous_autopost"&gt;Just a quick note, if you are getting lots of errors when trying to build a scala project in IDEA (typically one you just created) try this:  &lt;p&gt;&lt;/p&gt;&lt;div&gt;Open the module settings, click on the scala facet (if you don't have a scala facet then you need to add one !) - then uncheck the option that says "U&lt;/div&gt;&lt;div&gt;se scala library from specified jars" - instead, ad the appropriate scala-compiler.jar to your modules dependency list (but don't export it) - and away you go ! It has been this way for a while, never found a suitable explanation why, but hope this helps others if they see this:&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;img src="http://2.bp.blogspot.com/_KukQ8TlQMz8/TA2OiZoFSOI/AAAAAAAAAkY/2c53z32_0wA/s400/Screen+shot+2010-06-08+at+10.19.55+AM.png" style="display:block; margin:0px auto 10px; text-align:center;cursor:pointer; cursor:hand;width: 400px; height: 62px;" border="0" alt="" id="BLOGGER_PHOTO_ID_5480193043225463010" /&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt; &lt;p style="font-size: 10px;"&gt; &lt;a href="http://posterous.com/"&gt;Posted via email&lt;/a&gt;  from &lt;a href="http://michaelneale.posterous.com/if-getting-errors-in-an-idea-scala-project"&gt;Michael's posterous&lt;/a&gt; &lt;/p&gt; &lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/2311776355674459132-3139791765758536314?l=michaelneale.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/2311776355674459132/posts/default/3139791765758536314'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/2311776355674459132/posts/default/3139791765758536314'/><link rel='alternate' type='text/html' href='http://michaelneale.blogspot.com/2010/06/if-getting-errors-in-idea-scala-project.html' title='If getting errors in an IDEA scala project...'/><author><name>Michael Neale</name><uri>http://www.blogger.com/profile/14670410000512777421</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='30' src='http://www.users.on.net/~michaelneale/michael.jpg'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://2.bp.blogspot.com/_KukQ8TlQMz8/TA2OiZoFSOI/AAAAAAAAAkY/2c53z32_0wA/s72-c/Screen+shot+2010-06-08+at+10.19.55+AM.png' height='72' width='72'/></entry><entry><id>tag:blogger.com,1999:blog-2311776355674459132.post-6889596190061248212</id><published>2010-04-08T20:54:00.001-07:00</published><updated>2010-04-08T20:54:56.352-07:00</updated><title type='text'>SJUG March 2010 Restful design</title><content type='html'>My recent presentation at the Sydney JUG on restful design (went pretty well !)&lt;div style="width:425px" id="__ss_3671546"&gt;&lt;strong style="display:block;margin:12px 0 4px"&gt;&lt;a href="http://www.slideshare.net/michaelneale/sjug-march-2010-restful-design" title="SJUG March 2010 Restful design"&gt;SJUG March 2010 Restful design&lt;/a&gt;&lt;/strong&gt;&lt;object width="425" height="355"&gt;&lt;param name="movie" value="http://static.slidesharecdn.com/swf/ssplayer2.swf?doc=sjugfeb2010rest-100408222820-phpapp02&amp;stripped_title=sjug-march-2010-restful-design" /&gt;&lt;param name="allowFullScreen" value="true"/&gt;&lt;param name="allowScriptAccess" value="always"/&gt;&lt;embed src="http://static.slidesharecdn.com/swf/ssplayer2.swf?doc=sjugfeb2010rest-100408222820-phpapp02&amp;stripped_title=sjug-march-2010-restful-design" type="application/x-shockwave-flash" allowscriptaccess="always" allowfullscreen="true" width="425" height="355"&gt;&lt;/embed&gt;&lt;/object&gt;&lt;div style="padding:5px 0 12px"&gt;View more &lt;a href="http://www.slideshare.net/"&gt;presentations&lt;/a&gt; from &lt;a href="http://www.slideshare.net/michaelneale"&gt;Michael Neale&lt;/a&gt;.&lt;/div&gt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/2311776355674459132-6889596190061248212?l=michaelneale.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/2311776355674459132/posts/default/6889596190061248212'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/2311776355674459132/posts/default/6889596190061248212'/><link rel='alternate' type='text/html' href='http://michaelneale.blogspot.com/2010/04/sjug-march-2010-restful-design.html' title='SJUG March 2010 Restful design'/><author><name>Michael Neale</name><uri>http://www.blogger.com/profile/14670410000512777421</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='30' src='http://www.users.on.net/~michaelneale/michael.jpg'/></author></entry><entry><id>tag:blogger.com,1999:blog-2311776355674459132.post-2540109619803528230</id><published>2010-04-05T18:50:00.001-07:00</published><updated>2010-04-05T18:50:53.527-07:00</updated><title type='text'>Speaking at SJUG - April 09</title><content type='html'>&lt;div class='posterous_autopost'&gt;I am speaking at the Sydney JUG this thursday - on RESTful design principles and practice. It is at the Atlassian offices in the city (corner Sussex &amp;amp; Market Streets - go around the back). &lt;p style="font-size: 10px;"&gt; &lt;a href="http://posterous.com"&gt;Posted via email&lt;/a&gt;  from &lt;a href="http://michaelneale.posterous.com/speaking-at-sjug-april-09"&gt;Michael's posterous&lt;/a&gt; &lt;/p&gt; &lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/2311776355674459132-2540109619803528230?l=michaelneale.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/2311776355674459132/posts/default/2540109619803528230'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/2311776355674459132/posts/default/2540109619803528230'/><link rel='alternate' type='text/html' href='http://michaelneale.blogspot.com/2010/04/speaking-at-sjug-april-09.html' title='Speaking at SJUG - April 09'/><author><name>Michael Neale</name><uri>http://www.blogger.com/profile/14670410000512777421</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='30' src='http://www.users.on.net/~michaelneale/michael.jpg'/></author></entry><entry><id>tag:blogger.com,1999:blog-2311776355674459132.post-6945494848349527819</id><published>2010-03-30T17:17:00.001-07:00</published><updated>2010-03-30T17:17:17.930-07:00</updated><title type='text'>Leaving...</title><content type='html'>&lt;div class='posterous_autopost'&gt;&lt;div&gt;Well it has been a blast - but after some time, I am leaving Red Hat - when I can I will blog more on the details of what is next for me. &lt;/div&gt;&lt;p /&gt;&lt;div&gt;I had a great time there, was privileged to work with people way smarter than me, on projects that matter to the world of open source, and are widely used. I got paid to work on open source. I got paid to work with ruby, scala, python and a whole heap of &amp;quot;cutting edge&amp;quot; things as well. I learned a lot. I can&amp;#39;t really imagine there could be a better place to work. I got to work when and where I wanted, often on what I wanted. Wait - what the hell am I doing again? I must be completely insane.  &lt;/div&gt; &lt;p /&gt;&lt;div&gt;So long.. and thanks for all the fish. &lt;/div&gt; &lt;p style="font-size: 10px;"&gt; &lt;a href="http://posterous.com"&gt;Posted via email&lt;/a&gt;  from &lt;a href="http://michaelneale.posterous.com/leaving-933"&gt;Michael's posterous&lt;/a&gt; &lt;/p&gt; &lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/2311776355674459132-6945494848349527819?l=michaelneale.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/2311776355674459132/posts/default/6945494848349527819'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/2311776355674459132/posts/default/6945494848349527819'/><link rel='alternate' type='text/html' href='http://michaelneale.blogspot.com/2010/03/leaving.html' title='Leaving...'/><author><name>Michael Neale</name><uri>http://www.blogger.com/profile/14670410000512777421</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='30' src='http://www.users.on.net/~michaelneale/michael.jpg'/></author></entry><entry><id>tag:blogger.com,1999:blog-2311776355674459132.post-1642403815518594994</id><published>2010-02-28T00:23:00.001-08:00</published><updated>2010-02-28T00:23:37.558-08:00</updated><title type='text'>Chromium updater for mac</title><content type='html'>&lt;div class='posterous_autopost'&gt;       &lt;div style='padding: 5px 5px 10px 5px; margin-top: 5px; border: 1px solid #ddd; background-color: #fff;line-height: 16px;'&gt;       &lt;div style="float: left; margin-right: 5px; overflow: visible;"&gt;&lt;a href='http://posterous.com/getfile/files.posterous.com/michaelneale/VxfS7IZeYtvVm32WQIfab7buSEJvUw9q4k7gmPNpjFSTLRcJZr5zRSzR2yQm/ChromiumUpdater.zip' style='color: #bc7134;'&gt;&lt;img src='http://posterous.com/images/filetypes/zip.png' style='border: none;'/&gt;&lt;/a&gt;&lt;/div&gt;       &lt;div style="font-size: 10px; color: #424037;line-height: 16px;"&gt;Click here to download:&lt;/div&gt;       &lt;b&gt;&lt;a href='http://posterous.com/getfile/files.posterous.com/michaelneale/VxfS7IZeYtvVm32WQIfab7buSEJvUw9q4k7gmPNpjFSTLRcJZr5zRSzR2yQm/ChromiumUpdater.zip' style='color: #bc7134;'&gt;ChromiumUpdater.zip&lt;/a&gt;&lt;/b&gt; &lt;span style="font-size: 10px; color: #424037;"&gt;(86 KB)&lt;/span&gt;       &lt;br style="clear: both;"/&gt;&lt;/div&gt;      &lt;p&gt;A simple utility to grab the latest nightly of Chromium for OS-X and run it (see attached).&lt;p /&gt;Just run this when you want to start chromium, it will get the latest nightly build.&lt;/p&gt; &lt;p style="font-size: 10px;"&gt; &lt;a href="http://posterous.com"&gt;Posted via email&lt;/a&gt;  from &lt;a href="http://michaelneale.posterous.com/chromium-updater-for-mac"&gt;Michael's posterous&lt;/a&gt; &lt;/p&gt; &lt;/div&gt;  &lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/2311776355674459132-1642403815518594994?l=michaelneale.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/2311776355674459132/posts/default/1642403815518594994'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/2311776355674459132/posts/default/1642403815518594994'/><link rel='alternate' type='text/html' href='http://michaelneale.blogspot.com/2010/02/chromium-updater-for-mac.html' title='Chromium updater for mac'/><author><name>Michael Neale</name><uri>http://www.blogger.com/profile/14670410000512777421</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='30' src='http://www.users.on.net/~michaelneale/michael.jpg'/></author></entry><entry><id>tag:blogger.com,1999:blog-2311776355674459132.post-2008461007080276083</id><published>2010-02-14T21:52:00.001-08:00</published><updated>2010-02-14T21:52:25.026-08:00</updated><title type='text'>The forgotten service: DNS</title><content type='html'>&lt;div class='posterous_autopost'&gt;I have been guest blogging over &lt;a href="http://cloudpress.org"&gt;here&lt;/a&gt; - for example &lt;a href="http://cloudpress.org/2010/02/09/domain-name-system-the-forgotten-cloud-service/"&gt;http://cloudpress.org/2010/02/09/domain-name-system-the-forgotten-cloud-service/&lt;/a&gt;  &lt;p style="font-size: 10px;"&gt; &lt;a href="http://posterous.com"&gt;Posted via email&lt;/a&gt;  from &lt;a href="http://michaelneale.posterous.com/the-forgotten-service-dns"&gt;Michael's posterous&lt;/a&gt; &lt;/p&gt; &lt;/div&gt;  &lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/2311776355674459132-2008461007080276083?l=michaelneale.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/2311776355674459132/posts/default/2008461007080276083'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/2311776355674459132/posts/default/2008461007080276083'/><link rel='alternate' type='text/html' href='http://michaelneale.blogspot.com/2010/02/forgotten-service-dns.html' title='The forgotten service: DNS'/><author><name>Michael Neale</name><uri>http://www.blogger.com/profile/14670410000512777421</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='30' src='http://www.users.on.net/~michaelneale/michael.jpg'/></author></entry><entry><id>tag:blogger.com,1999:blog-2311776355674459132.post-6671806334731423398</id><published>2010-02-05T20:09:00.001-08:00</published><updated>2010-02-05T20:09:13.670-08:00</updated><title type='text'>A new project</title><content type='html'>&lt;div class='posterous_autopost'&gt;I have had a need to have a simple DNS server I can run (for testing &amp;quot;cloud&amp;quot; related services) - and I came across &lt;a href="http://www.unlogic.se/projects/eagledns/"&gt;EagleDNS&lt;/a&gt; - a authoritative DNS written in java (by Robert Olofsson). I was able to patch it to automatically reload zone files (it uses the same zone file format that BIND and others use, and are referred to in the RFC) when they are changed - something that seems strangely challenging for the more common DNS servers. &lt;p /&gt;&lt;div&gt;Happily my patch has been accepted and I am now a contributor: &lt;a href="http://www.unlogic.se/core/projects/eagledns/page/changelog-1.0.1"&gt;http://www.unlogic.se/core/projects/eagledns/page/changelog-1.0.1&lt;/a&gt;&lt;p /&gt; I have spent way too much time looking at and thinking about  and understanding DNS - but still, I guess learning about the fabric of the web is character building. Or something.  &lt;/div&gt; &lt;p style="font-size: 10px;"&gt; &lt;a href="http://posterous.com"&gt;Posted via email&lt;/a&gt;  from &lt;a href="http://michaelneale.posterous.com/a-new-project-9"&gt;Michael's posterous&lt;/a&gt; &lt;/p&gt; &lt;/div&gt;  &lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/2311776355674459132-6671806334731423398?l=michaelneale.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/2311776355674459132/posts/default/6671806334731423398'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/2311776355674459132/posts/default/6671806334731423398'/><link rel='alternate' type='text/html' href='http://michaelneale.blogspot.com/2010/02/new-project.html' title='A new project'/><author><name>Michael Neale</name><uri>http://www.blogger.com/profile/14670410000512777421</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='30' src='http://www.users.on.net/~michaelneale/michael.jpg'/></author></entry><entry><id>tag:blogger.com,1999:blog-2311776355674459132.post-5814168356700006126</id><published>2010-01-17T14:35:00.001-08:00</published><updated>2010-01-17T14:35:23.628-08:00</updated><title type='text'>Simulating push messaging - the long poll</title><content type='html'>&lt;div class='posterous_autopost'&gt;I often end up in discussions on how &amp;quot;push&amp;quot; messaging works to a browser, a phone or a client behind a firewall/NAT. The use case being that the device appears to get real time notification that something happens, a message pops up etc... without having to poll for it.  &lt;p /&gt;&lt;div&gt;Really, they all use the same mechanism, just over various protocols. In all these environments, you can assume that the device can not be reached from an &amp;quot;inbound&amp;quot; connection (ie a network connection that starts outside, and wants to reach the device) - but only in response to the device reaching out over the network to a server. &lt;/div&gt; &lt;p /&gt;&lt;div&gt;So the solution is to have a &amp;quot;long poll&amp;quot; or &amp;quot;slow poll&amp;quot; - in http sometimes it is called a &amp;quot;hanging get&amp;quot; - I think this is also similar to what HTML5 is standardising as WebSockets (but I haven&amp;#39;t looked specifically at it). The client device opens a connection (http or whatever) and the server end just lets it hang - holds it open (via whatever means) - and either it times out (in which case the client just reconnects, and it starts again) or the server has a message to send to the client, which it then sends as the reply, immediately. Thus you get something that is close to push in terms of the user experience (the only time there would be a lag would be between a timeout and a reconnect - but that would be milliseconds, ideally, so not too noticeable). &lt;/div&gt; &lt;p /&gt;&lt;div&gt;It really isn&amp;#39;t a huge mystery, and has been done for a long time. Unfortunately, on my iphone at least, it just ends up chomping batteries, but that is another story. &lt;/div&gt; &lt;p style="font-size: 10px;"&gt; &lt;a href="http://posterous.com"&gt;Posted via email&lt;/a&gt;  from &lt;a href="http://michaelneale.posterous.com/simulating-push-messaging-the-long-poll"&gt;Michael's posterous&lt;/a&gt; &lt;/p&gt; &lt;/div&gt;  &lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/2311776355674459132-5814168356700006126?l=michaelneale.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/2311776355674459132/posts/default/5814168356700006126'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/2311776355674459132/posts/default/5814168356700006126'/><link rel='alternate' type='text/html' href='http://michaelneale.blogspot.com/2010/01/simulating-push-messaging-long-poll.html' title='Simulating push messaging - the long poll'/><author><name>Michael Neale</name><uri>http://www.blogger.com/profile/14670410000512777421</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='30' src='http://www.users.on.net/~michaelneale/michael.jpg'/></author></entry><entry><id>tag:blogger.com,1999:blog-2311776355674459132.post-6308181809166692801</id><published>2010-01-17T01:32:00.001-08:00</published><updated>2010-01-17T01:32:52.914-08:00</updated><title type='text'>More people using scala?</title><content type='html'>&lt;div class='posterous_autopost'&gt;&lt;a href='http://posterous.com/getfile/files.posterous.com/michaelneale/M81IbiJ4sW24QVqGeFIgD9x39emOwMQmzlh41EHySyFKoLdphY3QuIHklA8p/Screen_shot_2010-01-17_at_8.29.png'&gt;&lt;img src="http://posterous.com/getfile/files.posterous.com/michaelneale/bE1OYgx7GERA6BBHixCrTyA04rgpp39ZYAS9BcRfRo3FrPi1HxqInvjb3JcJ/Screen_shot_2010-01-17_at_8.29.png.scaled.500.jpg" width="500" height="306"/&gt;&lt;/a&gt; &lt;p&gt;In my presentation at OSDC, a few big users of scala were mentioned, I thought it would be interesting to add &lt;a href="http://etherpad.com/"&gt;EtherPad&lt;/a&gt; (which was aquired by Google - their team members are now on the Google Wave team - and the EtherPad codebase was open-sourced as part of this) and my new favourite toy: &lt;a href="http://www.foursquare.com"&gt;Foursquare&lt;/a&gt; (location based social app). &lt;/p&gt; &lt;p style="font-size: 10px;"&gt; &lt;a href="http://posterous.com"&gt;Posted via email&lt;/a&gt;  from &lt;a href="http://michaelneale.posterous.com/more-people-using-scala"&gt;Michael's posterous&lt;/a&gt; &lt;/p&gt; &lt;/div&gt;  &lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/2311776355674459132-6308181809166692801?l=michaelneale.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/2311776355674459132/posts/default/6308181809166692801'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/2311776355674459132/posts/default/6308181809166692801'/><link rel='alternate' type='text/html' href='http://michaelneale.blogspot.com/2010/01/more-people-using-scala.html' title='More people using scala?'/><author><name>Michael Neale</name><uri>http://www.blogger.com/profile/14670410000512777421</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='30' src='http://www.users.on.net/~michaelneale/michael.jpg'/></author></entry><entry><id>tag:blogger.com,1999:blog-2311776355674459132.post-3672073636968321009</id><published>2010-01-16T23:53:00.000-08:00</published><updated>2010-01-17T01:04:01.219-08:00</updated><title type='text'>Some recent presentations</title><content type='html'>The end of 2009 was fair busy travel wise for me (a mixture of holiday travel and work travel - Singapore, Byron Bay, Brisbane and Coffs Harbour) and I forgot to post some presentations I did recently that were pretty well received. &lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;I attended the &lt;a href="http://www.osdc.com.au/"&gt;Open Source Developers Conference&lt;/a&gt; in Brisbane in late November, and did a couple of presentations. &lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;On my own I presented on Complex Event Processing (best left the explanation to the slides): &lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;div style="width:425px;text-align:left; opacity: 1.000 !important; -moz-opacity: 1 !important; filter: alpha(opacity=1) !important;" id="__ss_2604026"&gt;&lt;a style="font:14px Helvetica,Arial,Sans-serif;display:block;margin:12px 0 3px 0;text-decoration:underline;" href="http://www.slideshare.net/michaelneale/osdc-complex-event-processing" title="Osdc Complex Event Processing"&gt;Osdc Complex Event Processing&lt;/a&gt;&lt;object style="margin:0px; opacity: 1.000 !important; -moz-opacity: 1 !important; filter: alpha(opacity=1) !important;" width="425" height="355"&gt;&lt;param name="movie" value="http://static.slidesharecdn.com/swf/ssplayer2.swf?doc=osdccep2009-091128154726-phpapp02&amp;amp;stripped_title=osdc-complex-event-processing"&gt;&lt;param name="allowFullScreen" value="true"&gt;&lt;param name="allowScriptAccess" value="always"&gt;&lt;embed src="http://static.slidesharecdn.com/swf/ssplayer2.swf?doc=osdccep2009-091128154726-phpapp02&amp;amp;stripped_title=osdc-complex-event-processing" type="application/x-shockwave-flash" allowscriptaccess="always" allowfullscreen="true" width="425" height="355"&gt;&lt;/embed&gt;&lt;/object&gt;&lt;div style="font-size:11px;font-family:tahoma,arial;height:26px;padding-top:2px;"&gt;View more &lt;a style="text-decoration:underline;" href="http://www.slideshare.net/"&gt;presentations&lt;/a&gt; from &lt;a style="text-decoration:underline;" href="http://www.slideshare.net/michaelneale"&gt;Michael Neale&lt;/a&gt;.&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;I also did a (now mandatory) scala presentation with my friend &lt;a href="http://www.deskchecked.com/"&gt;Tom Lee&lt;/a&gt; (who I often pepper with questions of an arcane nature about scala or python). We focussed on the good and easy and fun bits of scala, and how it compares to dynamically typed languages. &lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;div style="width:425px;text-align:left; opacity: 1.000 !important; -moz-opacity: 1 !important; filter: alpha(opacity=1) !important;" id="__ss_2604035"&gt;&lt;a style="font:14px Helvetica,Arial,Sans-serif;display:block;margin:12px 0 3px 0;text-decoration:underline;" href="http://www.slideshare.net/michaelneale/on-scala-slides-osdc-2009" title="On Scala Slides - OSDC 2009"&gt;On Scala Slides - OSDC 2009&lt;/a&gt;&lt;object style="margin:0px; opacity: 1.000 !important; -moz-opacity: 1 !important; filter: alpha(opacity=1) !important;" width="425" height="355"&gt;&lt;param name="movie" value="http://static.slidesharecdn.com/swf/ssplayer2.swf?doc=onscalaslides-091128154908-phpapp02&amp;amp;stripped_title=on-scala-slides-osdc-2009"&gt;&lt;param name="allowFullScreen" value="true"&gt;&lt;param name="allowScriptAccess" value="always"&gt;&lt;embed src="http://static.slidesharecdn.com/swf/ssplayer2.swf?doc=onscalaslides-091128154908-phpapp02&amp;amp;stripped_title=on-scala-slides-osdc-2009" type="application/x-shockwave-flash" allowscriptaccess="always" allowfullscreen="true" width="425" height="355"&gt;&lt;/embed&gt;&lt;/object&gt;&lt;div style="font-size:11px;font-family:tahoma,arial;height:26px;padding-top:2px;"&gt;View more &lt;a style="text-decoration:underline;" href="http://www.slideshare.net/"&gt;presentations&lt;/a&gt; from &lt;a style="text-decoration:underline;" href="http://www.slideshare.net/michaelneale"&gt;Michael Neale&lt;/a&gt;.&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;Both presentations went down quite well, were well attended, and some great discussion happened. The conference was a bit quieter than last year in Sydney, but had a nicely chilled vibe (probably due to being in the bush in Bardon, just west of Brisbane city). &lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/2311776355674459132-3672073636968321009?l=michaelneale.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/2311776355674459132/posts/default/3672073636968321009'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/2311776355674459132/posts/default/3672073636968321009'/><link rel='alternate' type='text/html' href='http://michaelneale.blogspot.com/2010/01/some-recent-presentations.html' title='Some recent presentations'/><author><name>Michael Neale</name><uri>http://www.blogger.com/profile/14670410000512777421</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='30' src='http://www.users.on.net/~michaelneale/michael.jpg'/></author></entry><entry><id>tag:blogger.com,1999:blog-2311776355674459132.post-2787406251803008337</id><published>2009-12-03T16:12:00.001-08:00</published><updated>2009-12-03T16:12:12.201-08:00</updated><title type='text'>Launching applications in OS-X "minified"</title><content type='html'>Santa recently got a hackintosh for a certain nice little girl. To fit &lt;br /&gt;photobooth on the screen, he had to use an (apple) script like: &lt;p /&gt; do shell script "defaults write -g AppleDisplayScaleFactor 0.8" &lt;br /&gt;tell application "Photo Booth" to launch &lt;br /&gt;do shell script "defaults write -g AppleDisplayScaleFactor 1" &lt;p /&gt; Handy ! launches the app at 80% size (need to reset the scale after it &lt;br /&gt;is launched). &lt;p style="font-size: 10px;"&gt; &lt;a href="http://posterous.com"&gt;Posted via email&lt;/a&gt;  from &lt;a href="http://michaelneale.posterous.com/launching-applications-in-os-x-minified"&gt;Michael's posterous&lt;/a&gt; &lt;/p&gt;   &lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/2311776355674459132-2787406251803008337?l=michaelneale.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/2311776355674459132/posts/default/2787406251803008337'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/2311776355674459132/posts/default/2787406251803008337'/><link rel='alternate' type='text/html' href='http://michaelneale.blogspot.com/2009/12/launching-applications-in-os-x.html' title='Launching applications in OS-X &amp;quot;minified&amp;quot;'/><author><name>Michael Neale</name><uri>http://www.blogger.com/profile/14670410000512777421</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='30' src='http://www.users.on.net/~michaelneale/michael.jpg'/></author></entry><entry><id>tag:blogger.com,1999:blog-2311776355674459132.post-604438601548493457</id><published>2009-10-26T03:37:00.001-07:00</published><updated>2009-10-26T14:33:37.507-07:00</updated><title type='text'>From the Future, another angle on concurrency</title><content type='html'>&lt;div style="text-align: center;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://2.bp.blogspot.com/_KukQ8TlQMz8/SuWIgjPcEmI/AAAAAAAAAi0/tEJ6_MBXNyY/s1600-h/Screen+shot+2009-10-26+at+9.36.26+PM.png"&gt;&lt;/a&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://2.bp.blogspot.com/_KukQ8TlQMz8/SuWAfcMNRnI/AAAAAAAAAis/7mfU7rKpA6U/s1600-h/Screen+shot+2009-10-26+at+8.56.00+PM.png" style="text-decoration: none;"&gt;&lt;img style="display:block; margin:0px auto 10px; text-align:center;cursor:pointer; cursor:hand;width: 143px; height: 121px;" src="http://2.bp.blogspot.com/_KukQ8TlQMz8/SuWAfcMNRnI/AAAAAAAAAis/7mfU7rKpA6U/s400/Screen+shot+2009-10-26+at+8.56.00+PM.png" border="0" alt="" id="BLOGGER_PHOTO_ID_5396861006105101938" /&gt;&lt;/a&gt;(Warning contains graphic abuse of the type system in Scala code).&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;In languages like Scala, and of course Erlang, a lot of the focus is on Actors and message passing as a way to achieve concurrency and parallelism without using share-memory threads. &lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;This is great, works awesome, and I love it. But its not all of the story. Sometimes you have a need to "fan out" a whole lot of slow/blocking things, and then join it all back together later on - a classic example used is hitting up a lot of remote resources at once (and very easy to do). Or, perhaps you have quite a few processors available, and a few computationally heavy tasks to do etc... &lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;Well despite the bashing multi-threaded programming gets, the reality is threads are here to stay. But they are hard and I can't really do then. &lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;Thankfully there are those smarter than me that have built lovely frameworks that take away most of the management of threads from us mortals (such as Doug Lea and java.util.concurrent on the JVM, and Grand Central Dispatch on OS-X - (and soon to be in BSD !)).&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;Speaking to Jon Tirsen of Google, he was musing over the idea of a language based around 100% async dispatch where everything was returned as a Future - pretty much the opposite to to lazy languages: &lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;So I looked into java.util.concurrent.Executors - you can create executors (based on thread pools that you don't manage) and pass it "callable" tasks to run asynchronously. The trick is getting results back - this is where Futures come in. So when you submit a task to an executor, it returns a Future immediately - the future is a promise of a value at some point. When you call "get()" on the Future, it then blocks until it has a result (or course, hopefully it already has one). In java, this is understandable cumbersome, but works: &lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-tab-span" style="white-space:pre"&gt;&lt;span class="Apple-style-span"  style="font-family:'courier new';"&gt; &lt;/span&gt;&lt;/span&gt;&lt;span class="Apple-style-span"  style="font-family:'courier new';"&gt;ExecutorService service = ...&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-tab-span" style="white-space:pre"&gt;&lt;span class="Apple-style-span"  style="font-family:'courier new';"&gt; &lt;/span&gt;&lt;/span&gt;&lt;span class="Apple-style-span"  style="font-family:'courier new';"&gt;Future&lt;/span&gt;&lt;string&gt;&lt;span class="Apple-style-span"  style="font-family:'courier new';"&gt; result = service.submit(new Callable&lt;/span&gt;&lt;string&gt;&lt;span class="Apple-style-span"  style="font-family:'courier new';"&gt;() {&lt;/span&gt;&lt;/string&gt;&lt;/string&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-tab-span" style="white-space:pre"&gt;&lt;span class="Apple-style-span"  style="font-family:'courier new';"&gt;  &lt;/span&gt;&lt;/span&gt;&lt;span class="Apple-style-span"  style="font-family:'courier new';"&gt;public String call() {&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-tab-span" style="white-space:pre"&gt;&lt;span class="Apple-style-span"  style="font-family:'courier new';"&gt;   &lt;/span&gt;&lt;/span&gt;&lt;span class="Apple-style-span"  style="font-family:'courier new';"&gt;return ... expensive computation ...&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-tab-span" style="white-space:pre"&gt;&lt;span class="Apple-style-span"  style="font-family:'courier new';"&gt;  &lt;/span&gt;&lt;/span&gt;&lt;span class="Apple-style-span"  style="font-family:'courier new';"&gt;}&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-tab-span" style="white-space:pre"&gt;&lt;span class="Apple-style-span"  style="font-family:'courier new';"&gt; &lt;/span&gt;&lt;/span&gt;&lt;span class="Apple-style-span"  style="font-family:'courier new';"&gt;});&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;So result is of type Future of T - where T is the type of the real result. You have to call result.get() and then it will block... ugh, crazy... but worth it.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;Enter Scala, before creating a whole new language as Jon suggested, I thought I would give ordinary Scala a go: &lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;Wouldn't it be nice to take a piece of code like: &lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-tab-span" style="white-space:pre"&gt; &lt;/span&gt;&lt;span class="Apple-style-span"  style="font-family:'courier new';"&gt;val result = someExpensiveFunction(42)&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;and make it async, and not worry about Future and all that? Well by the power of greyskull, thunking and implicit conversions this is possible: &lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-tab-span" style="white-space:pre"&gt; &lt;/span&gt;&lt;span class="Apple-style-span"  style="font-family:'courier new';"&gt;val result = future { someExpensiveFunction(42) }&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;Note that I didn't have to change anything other then wrap future {.. } around it. Now, as Scala has type inference, this looks cleaner, but future is of type Future[T], where T is the return type of someExpensiveFunction. However, due to implicit conversions, we can pretend it isn't - it will return immediately, and you can pass it around, and once it actually needs the value of result, then, and only then will it block (automagically) - hopefully by then it will have its result !&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;So, how does it work: &lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span class="Apple-tab-span" style="white-space:pre"&gt; &lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-tab-span" style="white-space:pre"&gt;&lt;/span&gt;&lt;span class="Apple-tab-span" style="white-space:pre"&gt;&lt;span class="Apple-style-span"  style="font-family:'courier new';"&gt;&lt;span class="Apple-style-span"  style="font-size:small;"&gt; &lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="Apple-style-span"  style="font-family:'courier new';"&gt;&lt;span class="Apple-style-span"  style="font-size:small;"&gt;object FutureProcess {&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span"  style="font-family:'courier new';"&gt;&lt;span class="Apple-style-span"  style="font-size:small;"&gt;      &lt;/span&gt;&lt;/span&gt;&lt;span class="Apple-tab-span" style="white-space:pre"&gt;&lt;span class="Apple-style-span"  style="font-family:'courier new';"&gt;&lt;span class="Apple-style-span"  style="font-size:small;"&gt;  &lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="Apple-style-span"  style="font-family:'courier new';"&gt;&lt;span class="Apple-style-span"  style="font-size:small;"&gt;val executor = Executors.newCachedThreadPool&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-tab-span" style="white-space:pre"&gt;&lt;span class="Apple-style-span"  style="font-family:'courier new';"&gt;&lt;span class="Apple-style-span"  style="font-size:small;"&gt; &lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="Apple-style-span"  style="font-family:'courier new';"&gt;&lt;span class="Apple-style-span"  style="font-size:small;"&gt; &lt;span class="Apple-tab-span" style="white-space:pre"&gt; &lt;/span&gt;implicit def fromFuture[T](future: Future[T]) : T = future.get&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span"  style="font-family:'courier new';"&gt;&lt;span class="Apple-style-span"  style="font-size:small;"&gt;      &lt;/span&gt;&lt;/span&gt;&lt;span class="Apple-tab-span" style="white-space:pre"&gt;&lt;span class="Apple-style-span"  style="font-family:'courier new';"&gt;&lt;span class="Apple-style-span"  style="font-size:small;"&gt;  &lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="Apple-style-span"  style="font-family:'courier new';"&gt;&lt;span class="Apple-style-span"  style="font-size:small;"&gt;def future[T](lambda: =&gt; T) : Future[T] = &lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span"  style="font-family:'courier new';"&gt;&lt;span class="Apple-tab-span" style="white-space:pre"&gt;&lt;span class="Apple-style-span"  style="font-size:small;"&gt;    &lt;/span&gt;&lt;/span&gt;&lt;span class="Apple-style-span"  style="font-size:small;"&gt;executor.submit(new Callable[T] { def call=&lt;/span&gt;&lt;/span&gt;&lt;span class="Apple-style-span"  style="font-family:'courier new';"&gt;&lt;span class="Apple-style-span"  style="font-size:small;"&gt;lambda })&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-tab-span" style="white-space:pre"&gt;&lt;span class="Apple-style-span"  style="font-family:'courier new';"&gt;&lt;span class="Apple-style-span"  style="font-size:small;"&gt;   &lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="Apple-style-span"  style="font-family:'courier new';"&gt;&lt;span class="Apple-style-span"  style="font-size:small;"&gt;}&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div style="text-align: left;"&gt;&lt;span class="Apple-style-span"  style="color:#0000EE;"&gt;&lt;span class="Apple-style-span" style="color: rgb(0, 0, 0); "&gt;So the above is all of it. &lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;div style="text-align: left;"&gt;&lt;ol&gt;&lt;li&gt;we create an executor (its in an object so we only have one instance of it, easy). In this case its just a thread pool (but  you could size it based on CPU cores if you like). &lt;/li&gt;&lt;li&gt;we have an implicit def, which when it sees a Future of T, but needs T, it will call "get" (ie block and wait for result). &lt;/li&gt;&lt;li&gt;the Future function: take any "block" of code, which returns T, and submit it wrapped in a Callable (nice how compact it is). The only clever bit is the "thunk" - the "=&gt; T" bit - which means it is a parameter which isn't evaluated when it is called, but when it is needed - this is important as it means it isn't evaluated until it is safely submitted to the executor (and thus has a separate thread doing it) and can return immediately. &lt;/li&gt;&lt;/ol&gt;&lt;/div&gt;&lt;div style="text-align: left;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div style="text-align: left;"&gt;So the happy result is that all you do is import FutureProcess, and then wrap future { ... } around the bits you want done async, but really, no other code changes. Classic scala, slightly mind bending at the library level, but a breeze to use. &lt;/div&gt;&lt;div style="text-align: left;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div style="text-align: left;"&gt;Enjoy. &lt;/div&gt;&lt;div style="text-align: left;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div style="text-align: left;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div style="text-align: left;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div style="text-align: left;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div style="text-align: left;"&gt;&lt;span class="Apple-style-span"  style="color:#0000EE;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;&lt;div style="text-align: center;"&gt;&lt;span class="Apple-style-span"  style="color:#0000EE;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt; &lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/2311776355674459132-604438601548493457?l=michaelneale.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/2311776355674459132/posts/default/604438601548493457'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/2311776355674459132/posts/default/604438601548493457'/><link rel='alternate' type='text/html' href='http://michaelneale.blogspot.com/2009/10/from-future-another-angle-on.html' title='From the Future, another angle on concurrency'/><author><name>Michael Neale</name><uri>http://www.blogger.com/profile/14670410000512777421</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='30' src='http://www.users.on.net/~michaelneale/michael.jpg'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://2.bp.blogspot.com/_KukQ8TlQMz8/SuWAfcMNRnI/AAAAAAAAAis/7mfU7rKpA6U/s72-c/Screen+shot+2009-10-26+at+8.56.00+PM.png' height='72' width='72'/></entry><entry><id>tag:blogger.com,1999:blog-2311776355674459132.post-441141361344541702</id><published>2009-10-07T16:06:00.001-07:00</published><updated>2009-10-07T16:06:32.727-07:00</updated><title type='text'>New podcast episode is up</title><content type='html'>&lt;a href="http://asylum.jboss.org/"&gt;http://asylum.jboss.org/&lt;/a&gt; &lt;p /&gt; Still getting the hang of mixing it - more compression needed. And &lt;br /&gt;cowbell. 0% cowbell in this episode, unfortunately. &lt;p style="font-size: 10px;"&gt; &lt;a href="http://posterous.com"&gt;Posted via email&lt;/a&gt;  from &lt;a href="http://michaelneale.posterous.com/new-podcast-episode-is-up"&gt;Michael's posterous&lt;/a&gt; &lt;/p&gt;   &lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/2311776355674459132-441141361344541702?l=michaelneale.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/2311776355674459132/posts/default/441141361344541702'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/2311776355674459132/posts/default/441141361344541702'/><link rel='alternate' type='text/html' href='http://michaelneale.blogspot.com/2009/10/new-podcast-episode-is-up.html' title='New podcast episode is up'/><author><name>Michael Neale</name><uri>http://www.blogger.com/profile/14670410000512777421</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='30' src='http://www.users.on.net/~michaelneale/michael.jpg'/></author></entry><entry><id>tag:blogger.com,1999:blog-2311776355674459132.post-8684427236918736110</id><published>2009-09-28T23:26:00.001-07:00</published><updated>2009-09-28T23:26:46.375-07:00</updated><title type='text'>A visual comparison of a java to scala port</title><content type='html'>... of a single class. In this case port was mechanical, I only did to &lt;br /&gt;avoid mixed java/scala source in the one project (which you can of &lt;br /&gt;course do, but I don't like doing it, and it was just one class). &lt;p /&gt; I didn't change the code really (except for dealing with a null, which &lt;br /&gt;is just too nice with a match). &lt;p /&gt; You can guess which one is which (the scala one still ends up a little &lt;br /&gt;bit shorter, mostly due to the constructor magic) but a whole lot more &lt;br /&gt;pleasing to my eye anyway.&lt;p&gt;&lt;a href='http://posterous.com/getfile/files.posterous.com/michaelneale/qiN7rf0Xdh2PBVwP6LyHS13SFRUfc5fxxCv95113ZA4uMPZ4Pm5GjYyAtusy/Screen_shot_2009-09-29_at_4.21.png'&gt;&lt;img src="http://posterous.com/getfile/files.posterous.com/michaelneale/umDSkDVf1q2G9IU7Wv1f2R4OUmT1kJ8TRbQp8IopkFlvbidr9Lb6tyOHr9Tl/Screen_shot_2009-09-29_at_4.21.png.scaled.500.jpg" width="500" height="332"/&gt;&lt;/a&gt; &lt;a href='http://posterous.com/getfile/files.posterous.com/michaelneale/oH14TusCU1bhLa4fsfYm4QmKA9zTPZvQ9RHJkfYXmR7G2nklY0FCYjbSAgmz/0Screen_shot_2009-09-29_at_4.21.png'&gt;&lt;img src="http://posterous.com/getfile/files.posterous.com/michaelneale/l3QDbPlJdx29HpzVARwDGorrG9cGusp7FK9p1ur9tXLoFF1IBIredBx4VLJK/0Screen_shot_2009-09-29_at_4.21.png.scaled.500.jpg" width="500" height="256"/&gt;&lt;/a&gt; &lt;div&gt;&lt;a href='http://michaelneale.posterous.com/a-visual-comparison-of-a-java-to-scala-port'&gt;See and download the full gallery on posterous&lt;/a&gt;&lt;/div&gt;&lt;/p&gt; &lt;p style="font-size: 10px;"&gt; &lt;a href="http://posterous.com"&gt;Posted via email&lt;/a&gt;  from &lt;a href="http://michaelneale.posterous.com/a-visual-comparison-of-a-java-to-scala-port"&gt;Michael's posterous&lt;/a&gt; &lt;/p&gt;   &lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/2311776355674459132-8684427236918736110?l=michaelneale.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/2311776355674459132/posts/default/8684427236918736110'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/2311776355674459132/posts/default/8684427236918736110'/><link rel='alternate' type='text/html' href='http://michaelneale.blogspot.com/2009/09/visual-comparison-of-java-to-scala-port.html' title='A visual comparison of a java to scala port'/><author><name>Michael Neale</name><uri>http://www.blogger.com/profile/14670410000512777421</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='30' src='http://www.users.on.net/~michaelneale/michael.jpg'/></author></entry><entry><id>tag:blogger.com,1999:blog-2311776355674459132.post-2721978808925297992</id><published>2009-09-24T05:49:00.001-07:00</published><updated>2009-09-24T05:49:34.193-07:00</updated><title type='text'>A new podcast</title><content type='html'>I recently started working on a podcast on all things jboss.org, R&amp;D &lt;br /&gt;related, with Max Andersen and Emmanuel Bernard. I am the only one &lt;br /&gt;without an accent ;) &lt;p /&gt; Editing podcasts is much less fiddly then editing music, but still &lt;br /&gt;takes work and practice. &lt;p /&gt; Content is syndicated through libsyn here: &lt;a href="http://asylum.libsyn.com/"&gt;http://asylum.libsyn.com/&lt;/a&gt; &lt;p /&gt; It is also available on itunes of course. &lt;p style="font-size: 10px;"&gt; &lt;a href="http://posterous.com"&gt;Posted via email&lt;/a&gt;  from &lt;a href="http://michaelneale.posterous.com/a-new-podcast"&gt;Michael's posterous&lt;/a&gt; &lt;/p&gt;   &lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/2311776355674459132-2721978808925297992?l=michaelneale.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/2311776355674459132/posts/default/2721978808925297992'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/2311776355674459132/posts/default/2721978808925297992'/><link rel='alternate' type='text/html' href='http://michaelneale.blogspot.com/2009/09/new-podcast.html' title='A new podcast'/><author><name>Michael Neale</name><uri>http://www.blogger.com/profile/14670410000512777421</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='30' src='http://www.users.on.net/~michaelneale/michael.jpg'/></author></entry><entry><id>tag:blogger.com,1999:blog-2311776355674459132.post-1852501318174307553</id><published>2009-09-23T21:35:00.001-07:00</published><updated>2009-09-23T21:35:50.918-07:00</updated><title type='text'>Deltacloud.org...</title><content type='html'>&lt;a href='http://posterous.com/getfile/files.posterous.com/michaelneale/B1MigRD31QjREGFSTN0dpidaj2Vy5xdNHF3OhoQAj35N7LzDWCDVreh74Sao/Screen_shot_2009-09-24_at_2.34.png'&gt;&lt;img src="http://posterous.com/getfile/files.posterous.com/michaelneale/Q7hFreLpoQVVjDQ0tMWFJzluERA24DcT3Vc9KESTozM31sCQrz2DyX25kLbZ/Screen_shot_2009-09-24_at_2.34.png.scaled.500.jpg" width="500" height="57"/&gt;&lt;/a&gt; &lt;p&gt;I recently took a look at Delta Cloud - a good start at providing some &lt;br /&gt;ability to switch "between clouds" or at least work across them &lt;br /&gt;(including "clouds" based on virtualisation managers like RHEV-M from &lt;br /&gt;Red Hat and VMWare). &lt;p /&gt; Rackspace seems pretty sweet, has a nice RESTful style API to manage &lt;br /&gt;stuff, so it was easy to write a driver for deltacloud.org (which I &lt;br /&gt;did): &lt;p /&gt; Get the good stuff here: (should be upstream shortly) &lt;br /&gt;&lt;a href="http://github.com/michaelneale/driver-rackspace/"&gt;http://github.com/michaelneale/driver-rackspace/&lt;/a&gt; &lt;p /&gt; The deltacloud framework itself is a RESTful rails app (and the &lt;br /&gt;"drivers" are written in ruby).&lt;/p&gt; &lt;p style="font-size: 10px;"&gt; &lt;a href="http://posterous.com"&gt;Posted via email&lt;/a&gt;  from &lt;a href="http://michaelneale.posterous.com/deltacloudorg"&gt;Michael's posterous&lt;/a&gt; &lt;/p&gt;   &lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/2311776355674459132-1852501318174307553?l=michaelneale.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/2311776355674459132/posts/default/1852501318174307553'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/2311776355674459132/posts/default/1852501318174307553'/><link rel='alternate' type='text/html' href='http://michaelneale.blogspot.com/2009/09/deltacloudorg.html' title='Deltacloud.org...'/><author><name>Michael Neale</name><uri>http://www.blogger.com/profile/14670410000512777421</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='30' src='http://www.users.on.net/~michaelneale/michael.jpg'/></author></entry><entry><id>tag:blogger.com,1999:blog-2311776355674459132.post-5055697285951717516</id><published>2009-09-16T16:05:00.000-07:00</published><updated>2009-09-16T16:15:24.749-07:00</updated><title type='text'>Infinispan - distributed cache/data grid</title><content type='html'>&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://1.bp.blogspot.com/_KukQ8TlQMz8/SrFxcPLpsiI/AAAAAAAAAh4/ABO-ZmIyo4c/s1600-h/Picture+1.png"&gt;&lt;img style="display:block; margin:0px auto 10px; text-align:center;cursor:pointer; cursor:hand;width: 400px; height: 192px;" src="http://1.bp.blogspot.com/_KukQ8TlQMz8/SrFxcPLpsiI/AAAAAAAAAh4/ABO-ZmIyo4c/s400/Picture+1.png" border="0" alt="" id="BLOGGER_PHOTO_ID_5382207759610130978" /&gt;&lt;/a&gt;&lt;br /&gt;One has to have a hobby. Tragically mine is perilously close to work. So as part of learning about Infinispan (a distributed data grid) I created a RESTful server front end for it (in scala, of course), posted about it &lt;a href="http://infinispan.blogspot.com/"&gt;here&lt;/a&gt;.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/2311776355674459132-5055697285951717516?l=michaelneale.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/2311776355674459132/posts/default/5055697285951717516'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/2311776355674459132/posts/default/5055697285951717516'/><link rel='alternate' type='text/html' href='http://michaelneale.blogspot.com/2009/09/infinispan-distributed-cachedata-grid.html' title='Infinispan - distributed cache/data grid'/><author><name>Michael Neale</name><uri>http://www.blogger.com/profile/14670410000512777421</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='30' src='http://www.users.on.net/~michaelneale/michael.jpg'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://1.bp.blogspot.com/_KukQ8TlQMz8/SrFxcPLpsiI/AAAAAAAAAh4/ABO-ZmIyo4c/s72-c/Picture+1.png' height='72' width='72'/></entry><entry><id>tag:blogger.com,1999:blog-2311776355674459132.post-1314413149268999720</id><published>2009-09-15T16:46:00.000-07:00</published><updated>2009-09-15T16:49:02.031-07:00</updated><title type='text'>Book review: Dependency Injection</title><content type='html'>&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://4.bp.blogspot.com/_KukQ8TlQMz8/SrAnoLfJt9I/AAAAAAAAAhQ/bi1ZykcdN4Y/s1600-h/Screen+shot+2009-09-16+at+9.44.56+AM.png" style="text-decoration: none;"&gt;&lt;img style="display:block; margin:0px auto 10px; text-align:center;cursor:pointer; cursor:hand;width: 156px; height: 194px;" src="http://4.bp.blogspot.com/_KukQ8TlQMz8/SrAnoLfJt9I/AAAAAAAAAhQ/bi1ZykcdN4Y/s400/Screen+shot+2009-09-16+at+9.44.56+AM.png" border="0" alt="" id="BLOGGER_PHOTO_ID_5381845125939443666" /&gt;&lt;/a&gt;&lt;br /&gt;My good friend Dhanji Prasanna from Google recently finished his &lt;a href="http://www.manning.com/prasanna/"&gt;book on DI practices and patterns&lt;/a&gt;. I was given a copy for review - I am by no means a DI expert (barely know what it is).&lt;br /&gt;&lt;br /&gt;To be honest I am/was a DI skeptic, I view it as a way to make up for weaknesses of statically typed mainstream languages (such as C# or Java). And thus DI brings in a raft of type unsafety issues, leading to runtime hassles (without the productivity/joy of a dynamically typed or scripting language).&lt;br /&gt;&lt;br /&gt;However, the book always circles back to how to solve a problem in a type safe way - were code is more correct (and the compiler verifies it) before any runtime error occurs (any runtime DI activity is for performance and functional) - and leads to less surprises and biting in the ass.&lt;br /&gt;&lt;br /&gt;The style of the book seems to be to show the problem in its raw form, using various tricks to try and get around it, failing and then introducing a DI framework, and showing the various solutions with the framework. Each section usually resolves to a simple solution that provides compile time type safety - I can reasonably assume this is Dhanji's intent, to gently "show you the way" - ie "the right way" of doing it.  Dhanji is a Guice committer, so of course the best side of Guice is shown, but I believe he also does the best with the other frameworks he has a lot of experience with (personally I admire Guice a lot, I think it has learned from all the frameworks before it and been battle hardened).&lt;div&gt;&lt;br /&gt;Well if you do large scale java apps, you probably want to have someone on the team have this book.&lt;br /&gt;&lt;br /&gt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/2311776355674459132-1314413149268999720?l=michaelneale.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/2311776355674459132/posts/default/1314413149268999720'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/2311776355674459132/posts/default/1314413149268999720'/><link rel='alternate' type='text/html' href='http://michaelneale.blogspot.com/2009/09/book-review-dependency-injection.html' title='Book review: Dependency Injection'/><author><name>Michael Neale</name><uri>http://www.blogger.com/profile/14670410000512777421</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='30' src='http://www.users.on.net/~michaelneale/michael.jpg'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://4.bp.blogspot.com/_KukQ8TlQMz8/SrAnoLfJt9I/AAAAAAAAAhQ/bi1ZykcdN4Y/s72-c/Screen+shot+2009-09-16+at+9.44.56+AM.png' height='72' width='72'/></entry><entry><id>tag:blogger.com,1999:blog-2311776355674459132.post-1034797742907341388</id><published>2009-09-15T00:07:00.001-07:00</published><updated>2009-09-15T00:34:52.193-07:00</updated><title type='text'>Quick update - a Scala presentation</title><content type='html'>I did a fairly well taken presentation at the Sydney JUG recently (trying to convince scala skeptics), thought I would put it here:&lt;div&gt;&lt;br /&gt;&lt;div style="width:425px;text-align:left" id="__ss_1980970"&gt;&lt;a style="font:14px Helvetica,Arial,Sans-serif;display:block;margin:12px 0 3px 0;text-decoration:underline;" href="http://www.slideshare.net/michaelneale/scala-sjug-09" title="Scala Sjug 09"&gt;Scala Sjug 09&lt;/a&gt;&lt;object style="margin:0px" width="425" height="355"&gt;&lt;param name="movie" value="http://static.slidesharecdn.com/swf/ssplayer2.swf?doc=scalasjug09-090910185924-phpapp01&amp;stripped_title=scala-sjug-09" /&gt;&lt;param name="allowFullScreen" value="true"/&gt;&lt;param name="allowScriptAccess" value="always"/&gt;&lt;embed src="http://static.slidesharecdn.com/swf/ssplayer2.swf?doc=scalasjug09-090910185924-phpapp01&amp;stripped_title=scala-sjug-09" type="application/x-shockwave-flash" allowscriptaccess="always" allowfullscreen="true" width="425" height="355"&gt;&lt;/embed&gt;&lt;/object&gt;&lt;div style="font-size:11px;font-family:tahoma,arial;height:26px;padding-top:2px;"&gt;View more &lt;a style="text-decoration:underline;" href="http://www.slideshare.net/"&gt;documents&lt;/a&gt; from &lt;a style="text-decoration:underline;" href="http://www.slideshare.net/michaelneale"&gt;Michael Neale&lt;/a&gt;.&lt;/div&gt;&lt;/div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;Errata: I made a few boo-boos in explaining things:&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;ul&gt;&lt;li&gt; I didn't realise you could "return" at any point in a function, but you have to explicitly annotate the return type of the function, for one ;) &lt;/li&gt;&lt;li&gt;The Eclipse plugin seems to be useful to some people (wasn't great last time I tried). &lt;/li&gt;&lt;li&gt;In ScalaCheck, you have to do a little more work to make it generate Arbitrary Instances of non "built in" types. &lt;/li&gt;&lt;li&gt;Probably many more... &lt;/li&gt;&lt;/ul&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/2311776355674459132-1034797742907341388?l=michaelneale.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/2311776355674459132/posts/default/1034797742907341388'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/2311776355674459132/posts/default/1034797742907341388'/><link rel='alternate' type='text/html' href='http://michaelneale.blogspot.com/2009/09/quick-update-scala-presentation.html' title='Quick update - a Scala presentation'/><author><name>Michael Neale</name><uri>http://www.blogger.com/profile/14670410000512777421</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='30' src='http://www.users.on.net/~michaelneale/michael.jpg'/></author></entry><entry><id>tag:blogger.com,1999:blog-2311776355674459132.post-4016851293824352263</id><published>2009-08-17T02:55:00.001-07:00</published><updated>2009-09-15T00:11:09.378-07:00</updated><title type='text'>Web apps are cheaper then desktop apps</title><content type='html'>&lt;div&gt;I find it interesting that Google, in all their might, still consider the reasons for targeting web apps to be (at least in part) economical: &lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;a href="http://blogs.ft.com/techblog/2009/07/app-stores-are-not-the-future-says-google/"&gt;http://blogs.ft.com/techblog/2009/07/app-stores-are-not-the-future-says-google/&lt;/a&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;I mean, if even Google balks at the cost of multiple client platforms (mobile and otherwise) what hope to mortals have? &lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;Thus for many things web apps (as opposed to web sites) are the future. I am sure there is a kernel of apps that require desktop presence for the time being (video and audio editing, development for example) but otherwise, it looks like we have to look towards web tech for the future of client side computing. &lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/2311776355674459132-4016851293824352263?l=michaelneale.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/2311776355674459132/posts/default/4016851293824352263'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/2311776355674459132/posts/default/4016851293824352263'/><link rel='alternate' type='text/html' href='http://michaelneale.blogspot.com/2009/08/web-apps-are-cheaper-then-desktop-apps.html' title='Web apps are cheaper then desktop apps'/><author><name>Michael Neale</name><uri>http://www.blogger.com/profile/14670410000512777421</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='30' src='http://www.users.on.net/~michaelneale/michael.jpg'/></author></entry><entry><id>tag:blogger.com,1999:blog-2311776355674459132.post-2526908804774817060</id><published>2009-05-17T18:16:00.000-07:00</published><updated>2009-05-28T19:55:50.101-07:00</updated><title type='text'>JAOO - Sydney and Brisbane</title><content type='html'>I was fortunate enough to speak at the JAOO conferences in Sydney and Brisbane recently, my talk is below (thanks to slideshare).&lt;br /&gt;&lt;div style="width: 425px; text-align: left;" id="__ss_1449487"&gt;&lt;br /&gt;JAOO is an impressive conference, with a good (and no doubt expensive) list of international speakers.  I highly recommend it, as a "bring the world to you" local conference (next year will be Brisbane and Melbourne I hear) - although the full price is quite an ask in this day and age....&lt;br /&gt;&lt;br /&gt;Well my thoughts on interesting sessions I went to:&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;How to build an iPhone app in 45 Mins (&lt;a href="http://jaoo.com.au/sydney-2009/file?path=/jaoo-sydney-2009/slides/PatrickLinskey_HowToBuildAnIPhoneApplicationIn45Minutes.pdf"&gt;Patrick Linksey&lt;/a&gt;):&lt;/span&gt;&lt;br /&gt;Lots of fun - probably most popular session - a bit of an Objective C intro to those that didn't know it. I was quite enjoying the nuances of it until I realised the bits that were entertaining me was the manual management - I guess after almost 10 years of not worrying about it you forget the bad...&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;Speeding Ducks (&lt;a href="http://jaoo.com.au/sydney-2009/file?path=/jaoo-sydney-2009/slides/AviBryant_SpeedingDucks.pdf"&gt;Avi Bryant&lt;/a&gt;):&lt;/span&gt;&lt;br /&gt;Great talk on VM performance - the sydney one turned into a bit of discussion/hand wringing on who would pay for the development of advanced VMs for Ruby... interesting...&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;Consistency, Storage, and Reliability in the Cloud (Jonas S Karlsson)&lt;/span&gt;:&lt;br /&gt;Jonas introduced Google's Megastore, which introduces some interesting bits from RDBMS into googles big table storage system - including transactions etc... (its not "ACID" but it does allow things to scale in the way that google needs them to).&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;Deception and Estimation: How We Fool Ourselves (&lt;/span&gt;&lt;a style="font-weight: bold;" href="http://jaoo.com.au/sydney-2009/file?path=/jaoo-sydney-2009/slides/LindaRising_DeceptionAndEstimationHowWeFoolOurselves.pdf"&gt;Linda Rising&lt;/a&gt;&lt;span style="font-weight: bold;"&gt;):&lt;/span&gt;&lt;br /&gt;This was more a shallow dive into psychology, why we willfully deceive ourselves, and why its probably a good thing... very interesting, and actually a lot of fun to listen to (I got the impression people felt relieved and uplifted by it).&lt;br /&gt;&lt;br /&gt;Of course &lt;span style="font-weight: bold;"&gt;Josh Blocks puzzlers&lt;/span&gt; was fun: note to self, don't ever ever use inheritance again if you can at all help it (all the questions are secret as he is doing the presentation I think at JavaOne).&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;Writing Large Applications in JavaScript (&lt;/span&gt;&lt;a style="font-weight: bold;" href="http://jaoo.com.au/brisbane-2009/file?path=/jaoo-sydney-2009/slides/DouglasCrockford_WritingLargeApplicationsInJavaScript.pdf"&gt;Douglas Crockford&lt;/a&gt;&lt;span style="font-weight: bold;"&gt;):&lt;/span&gt;&lt;br /&gt;Great talk on javascript in general, the the hilarious way it inserts semicolons (a dirty hack even by my low standards !).&lt;br /&gt;&lt;br /&gt;A picture from the stunning conference centre in Sydney:&lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://1.bp.blogspot.com/_KukQ8TlQMz8/Sh9OgN33CCI/AAAAAAAAAeY/DYeJf1B71z0/s1600-h/IMG_0093.jpg"&gt;&lt;img style="margin: 0px auto 10px; display: block; text-align: center; cursor: pointer; width: 320px; height: 240px;" src="http://1.bp.blogspot.com/_KukQ8TlQMz8/Sh9OgN33CCI/AAAAAAAAAeY/DYeJf1B71z0/s320/IMG_0093.jpg" alt="" id="BLOGGER_PHOTO_ID_5341073998471432226" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;a style="margin: 12px 0pt 3px; font-family: Helvetica,Arial,Sans-serif; font-style: normal; font-variant: normal; font-weight: normal; font-size: 14px; line-height: normal; font-size-adjust: none; font-stretch: normal; display: block; text-decoration: underline;" href="http://www.slideshare.net/michaelneale/jaoo-michael-neale-09?type=powerpoint" title="Jaoo Michael Neale 09"&gt;Jaoo Michael Neale 09&lt;/a&gt;&lt;object style="margin: 0px;" width="425" height="355"&gt;&lt;param name="movie" value="http://static.slidesharecdn.com/swf/ssplayer2.swf?doc=jaoomichaelneale09-090517190918-phpapp02&amp;amp;stripped_title=jaoo-michael-neale-09"&gt;&lt;param name="allowFullScreen" value="true"&gt;&lt;param name="allowScriptAccess" value="always"&gt;&lt;embed src="http://static.slidesharecdn.com/swf/ssplayer2.swf?doc=jaoomichaelneale09-090517190918-phpapp02&amp;amp;stripped_title=jaoo-michael-neale-09" type="application/x-shockwave-flash" allowscriptaccess="always" allowfullscreen="true" width="425" height="355"&gt;&lt;/embed&gt;&lt;/object&gt;&lt;div style="font-size: 11px; font-family: tahoma,arial; height: 26px; padding-top: 2px;"&gt;View more &lt;a style="text-decoration: underline;" href="http://www.slideshare.net/"&gt;presentations&lt;/a&gt; from &lt;a style="text-decoration: underline;" href="http://www.slideshare.net/michaelneale"&gt;Michael Neale&lt;/a&gt;.&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;/div&gt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/2311776355674459132-2526908804774817060?l=michaelneale.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/2311776355674459132/posts/default/2526908804774817060'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/2311776355674459132/posts/default/2526908804774817060'/><link rel='alternate' type='text/html' href='http://michaelneale.blogspot.com/2009/05/jaoo-sydney-and-brisbane.html' title='JAOO - Sydney and Brisbane'/><author><name>Michael Neale</name><uri>http://www.blogger.com/profile/14670410000512777421</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='30' src='http://www.users.on.net/~michaelneale/michael.jpg'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://1.bp.blogspot.com/_KukQ8TlQMz8/Sh9OgN33CCI/AAAAAAAAAeY/DYeJf1B71z0/s72-c/IMG_0093.jpg' height='72' width='72'/></entry><entry><id>tag:blogger.com,1999:blog-2311776355674459132.post-8183897496492041290</id><published>2009-03-25T14:46:00.000-07:00</published><updated>2009-03-25T15:05:16.217-07:00</updated><title type='text'>Single vendor hell - aka "one neck to choke"</title><content type='html'>A colleague lamented the other day about the uber consolidation that is going on with the largest of IT vendors (and has been for some time).&lt;br /&gt;&lt;br /&gt;I can't help but think its the "IT consumers" who share part of the blame for this: For years, in the late 90's and early 2000's people wanted to have less vendors to deal with, less overlap and "one neck to choke", well, guess what:&lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://4.bp.blogspot.com/_KukQ8TlQMz8/ScqpnqcVWyI/AAAAAAAAAdg/ZHlfnIrkn1A/s1600-h/mission-accomplished.jpg"&gt;&lt;img style="margin: 0px auto 10px; display: block; text-align: center; cursor: pointer; width: 320px; height: 240px;" src="http://4.bp.blogspot.com/_KukQ8TlQMz8/ScqpnqcVWyI/AAAAAAAAAdg/ZHlfnIrkn1A/s320/mission-accomplished.jpg" alt="" id="BLOGGER_PHOTO_ID_5317248808937413410" border="0" /&gt;&lt;/a&gt;It has kind of happened. But this is a terrible terrible thing for IT consumers: who on earth would think that it could work out well for "IT consumers" to have one vendor providing the full stack? Its a testament to the genius of the vendors that the convinced people that a single vendor providing all parts of "the stack" was a good idea and a worthy goal.&lt;br /&gt;&lt;br /&gt;Choice is a tiring thing to have, but its also a good thing, like exercise.&lt;br /&gt;&lt;br /&gt;Be careful what you wish for - it might just come true. So IT consumers will now need to be doubly diligent to have a few suppliers in the mix lest the obvious happen to them.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/2311776355674459132-8183897496492041290?l=michaelneale.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/2311776355674459132/posts/default/8183897496492041290'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/2311776355674459132/posts/default/8183897496492041290'/><link rel='alternate' type='text/html' href='http://michaelneale.blogspot.com/2009/03/single-vendor-hell-aka-one-neck-to.html' title='Single vendor hell - aka &quot;one neck to choke&quot;'/><author><name>Michael Neale</name><uri>http://www.blogger.com/profile/14670410000512777421</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='30' src='http://www.users.on.net/~michaelneale/michael.jpg'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://4.bp.blogspot.com/_KukQ8TlQMz8/ScqpnqcVWyI/AAAAAAAAAdg/ZHlfnIrkn1A/s72-c/mission-accomplished.jpg' height='72' width='72'/></entry><entry><id>tag:blogger.com,1999:blog-2311776355674459132.post-4971973817924452756</id><published>2009-02-09T15:04:00.000-08:00</published><updated>2009-02-09T15:26:25.722-08:00</updated><title type='text'>Back it up</title><content type='html'>Backing up personal data is like flossing, you know you should do it...&lt;br /&gt;&lt;br /&gt;Personally I use time machine on the macs in the house, on other boxen (linux) I tend to copy/rsync home directories. But in many cases most data I care about is "in the cloud" (so I have washed my hands of responsibility of its safety - now is that a good thing ???).&lt;br /&gt;&lt;br /&gt;What does interest me though is all the many ways that specific server apps demand they be backed up. Isn't that annoying for operations people? They need to have DBA/specialists for every single app to know how to back it up, each has their own process.&lt;br /&gt;&lt;br /&gt;This is silly and not sustainable, thankfully modern filesystems can help. When you think about it, it is obvious. A backup really needs to help you out with 2 things: 1) allow you to recover in the event of a disaster of some sort - so you go back as recently as possible and continue processing. and 2) go back to a point in time.&lt;br /&gt;&lt;br /&gt;File system snapshotting (via &lt;a href="http://blogs.sun.com/timf/entry/zfs_automatic_snapshots_0_8"&gt;ZFS&lt;/a&gt;, or using virtual machines, whatever) seems good enough for most of this (#2 can be a bit of a problem - you need to keep sensible snapshots frozen in time, and be vigilant to watch out for data corruption inside an app - having versions of data inside an app can help this, but this is then not an IT infrastructure issue, no generic solution can help).&lt;br /&gt;&lt;br /&gt;Certainly a whole lot less hassle for IT if they can just reset elements of infrastructure back to how they were at a single point in time. Everyone wins.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/2311776355674459132-4971973817924452756?l=michaelneale.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/2311776355674459132/posts/default/4971973817924452756'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/2311776355674459132/posts/default/4971973817924452756'/><link rel='alternate' type='text/html' href='http://michaelneale.blogspot.com/2009/02/back-it-up.html' title='Back it up'/><author><name>Michael Neale</name><uri>http://www.blogger.com/profile/14670410000512777421</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='30' src='http://www.users.on.net/~michaelneale/michael.jpg'/></author></entry><entry><id>tag:blogger.com,1999:blog-2311776355674459132.post-3079671876679611335</id><published>2009-02-04T16:38:00.000-08:00</published><updated>2009-02-04T16:55:48.077-08:00</updated><title type='text'>Poor mans lambdas</title><content type='html'>A lot of my recent work has been in scala (I try to do any "green fields" work now in scala) so closures/lambdas are very pretty and flow freely in scala.&lt;br /&gt;&lt;br /&gt;I did however read with interest about "lambda4jdt" a way of making code in java "look like" it is using a real lambda, but only really as a UI trick in eclipse. Interestingly I recall &lt;a href="http://beust.com/weblog/"&gt;Cedric Beust&lt;/a&gt; talking about this previously (that is, the idea that IDEs can change the appearance of code from the underlying character stream).&lt;br /&gt;&lt;a href="http://code.google.com/p/lambda4jdt/"&gt;&lt;br /&gt;Lambda 4JDT&lt;/a&gt;:&lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://3.bp.blogspot.com/_KukQ8TlQMz8/SYo31pKQTmI/AAAAAAAAAcM/62oFQqVRxLY/s1600-h/Picture+1.png"&gt;&lt;img style="margin: 0px auto 10px; display: block; text-align: center; cursor: pointer; width: 320px; height: 121px;" src="http://3.bp.blogspot.com/_KukQ8TlQMz8/SYo31pKQTmI/AAAAAAAAAcM/62oFQqVRxLY/s320/Picture+1.png" alt="" id="BLOGGER_PHOTO_ID_5299109306276269666" border="0" /&gt;&lt;/a&gt;So screw the dead JLS (Java Language Spec), just go an add it in as low cal eye candy ! I like it !&lt;br /&gt;With some excitement I went to IntelliJ's bug tracker to put in a similar &lt;a href="http://www.jetbrains.net/jira/browse/IDEADEV-34469"&gt;feature request&lt;/a&gt; (I always struggled to explain what sort of "code folding" I wanted). I found out in a matter of minutes the feature is coming in IDEA 9 ! Nice !&lt;br /&gt;&lt;br /&gt;In early versions, they used an actual lambda character:&lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://2.bp.blogspot.com/_KukQ8TlQMz8/SYo41jInBtI/AAAAAAAAAcU/7g7ah7PTs-4/s1600-h/21d3a98d6f0b6bf49e99aadd33c88f2802186d07.png"&gt;&lt;img style="margin: 0px auto 10px; display: block; text-align: center; cursor: pointer; width: 320px; height: 87px;" src="http://2.bp.blogspot.com/_KukQ8TlQMz8/SYo41jInBtI/AAAAAAAAAcU/7g7ah7PTs-4/s320/21d3a98d6f0b6bf49e99aadd33c88f2802186d07.png" alt="" id="BLOGGER_PHOTO_ID_5299110404170385106" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;(apparently it won't be exactly like that in the final version).&lt;br /&gt;&lt;br /&gt;In any case I prefer scala in almost all ways, but for existing/legacy code, nice to have smart IDEs to present things as they should be.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/2311776355674459132-3079671876679611335?l=michaelneale.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/2311776355674459132/posts/default/3079671876679611335'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/2311776355674459132/posts/default/3079671876679611335'/><link rel='alternate' type='text/html' href='http://michaelneale.blogspot.com/2009/02/poor-mans-lambdas.html' title='Poor mans lambdas'/><author><name>Michael Neale</name><uri>http://www.blogger.com/profile/14670410000512777421</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='30' src='http://www.users.on.net/~michaelneale/michael.jpg'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://3.bp.blogspot.com/_KukQ8TlQMz8/SYo31pKQTmI/AAAAAAAAAcM/62oFQqVRxLY/s72-c/Picture+1.png' height='72' width='72'/></entry><entry><id>tag:blogger.com,1999:blog-2311776355674459132.post-6404002936484644750</id><published>2009-01-12T14:13:00.001-08:00</published><updated>2009-01-12T14:13:51.461-08:00</updated><title type='text'>MySQL developers denied .au visas due to local competition</title><content type='html'>This is madness: &lt;a href="http://blogs.mysql.com/kaj/2009/01/12/on-open-source-and-open-competition-in-a-not-so-open-world"&gt;http://blogs.mysql.com/kaj/2009/01/12/on-open-source-and-open-competition-in-a-not-so-open-world&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;Very disappointing.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/2311776355674459132-6404002936484644750?l=michaelneale.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/2311776355674459132/posts/default/6404002936484644750'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/2311776355674459132/posts/default/6404002936484644750'/><link rel='alternate' type='text/html' href='http://michaelneale.blogspot.com/2009/01/mysql-developers-denied-au-visas-due-to.html' title='MySQL developers denied .au visas due to local competition'/><author><name>Michael Neale</name><uri>http://www.blogger.com/profile/14670410000512777421</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='30' src='http://www.users.on.net/~michaelneale/michael.jpg'/></author></entry><entry><id>tag:blogger.com,1999:blog-2311776355674459132.post-2928769963807048490</id><published>2009-01-05T19:00:00.000-08:00</published><updated>2009-01-05T19:15:02.820-08:00</updated><title type='text'>Reading old code</title><content type='html'>I am mostly terrible at reading old code, ESPECIALLY my own. I sort of stare and curse at it for a while, eventually it makes sense. Normally having runnable unit tests make it much easier.&lt;br /&gt;&lt;br /&gt;However, I found some &lt;a href="http://xircles.codehaus.org/projects/ruby-rules"&gt;old ruby code&lt;/a&gt; of mine (a pre-historic simple rule engine, using YAML as the syntax - called "ruby rules"), and strangely it made sense (and I swear I have no recollection of writing it):&lt;br /&gt;&lt;br /&gt;&lt;pre&gt;- rule: Foo&lt;br /&gt; set: Driver, Vehicle&lt;br /&gt; if: driver.age &lt; 21 and vehicle.high_performance&lt;br /&gt; then: reject application&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;And a programmatic rule:&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;#now lets  try it out&lt;br /&gt;rule = Rule.new :declarations =&gt; ["a", "b"],&lt;br /&gt;               :types =&gt; [String.class, String.class],&lt;br /&gt;               :condition =&gt;"a == '42' and b == '42'",&lt;br /&gt;               :action =&gt; "puts 'PASSED RULE 1'"&lt;br /&gt;&lt;br /&gt;&lt;/pre&gt;So what does this mean? I guess people smarter then me are right - ruby is a really friendly language. At least following the popular conventions for it leads to code that you could read well into the future (even without the comfort of static type guarantees).&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/2311776355674459132-2928769963807048490?l=michaelneale.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/2311776355674459132/posts/default/2928769963807048490'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/2311776355674459132/posts/default/2928769963807048490'/><link rel='alternate' type='text/html' href='http://michaelneale.blogspot.com/2009/01/reading-old-code.html' title='Reading old code'/><author><name>Michael Neale</name><uri>http://www.blogger.com/profile/14670410000512777421</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='30' src='http://www.users.on.net/~michaelneale/michael.jpg'/></author></entry><entry><id>tag:blogger.com,1999:blog-2311776355674459132.post-2263771894802788938</id><published>2008-12-05T18:28:00.000-08:00</published><updated>2008-12-05T18:30:26.352-08:00</updated><title type='text'>OSDC slides/presentation details</title><content type='html'>I just got back from &lt;a href="http://www.osdc.com.au"&gt;OSDC&lt;/a&gt; and my slides are up on &lt;a href="http://www.slideshare.net/michaelneale/osdc-michael-neale-2008-presentation"&gt;slideshare&lt;/a&gt;.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/2311776355674459132-2263771894802788938?l=michaelneale.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/2311776355674459132/posts/default/2263771894802788938'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/2311776355674459132/posts/default/2263771894802788938'/><link rel='alternate' type='text/html' href='http://michaelneale.blogspot.com/2008/12/osdc-slidespresentation-details.html' title='OSDC slides/presentation details'/><author><name>Michael Neale</name><uri>http://www.blogger.com/profile/14670410000512777421</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='30' src='http://www.users.on.net/~michaelneale/michael.jpg'/></author></entry><entry><id>tag:blogger.com,1999:blog-2311776355674459132.post-6499956801822739473</id><published>2008-11-30T15:03:00.000-08:00</published><updated>2008-11-30T15:08:10.893-08:00</updated><title type='text'>3 year anniversary</title><content type='html'>It was 3 years ago (way back in innocent 2005) that I joined JBoss (as it was then). Since that time quite a bit has happened - I am grateful to have traveled over lots of the world, met great people and had a whole lot of fun.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/2311776355674459132-6499956801822739473?l=michaelneale.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/2311776355674459132/posts/default/6499956801822739473'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/2311776355674459132/posts/default/6499956801822739473'/><link rel='alternate' type='text/html' href='http://michaelneale.blogspot.com/2008/11/3-year-anniversary.html' title='3 year anniversary'/><author><name>Michael Neale</name><uri>http://www.blogger.com/profile/14670410000512777421</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='30' src='http://www.users.on.net/~michaelneale/michael.jpg'/></author></entry><entry><id>tag:blogger.com,1999:blog-2311776355674459132.post-6816370146031146638</id><published>2008-11-25T15:05:00.000-08:00</published><updated>2008-11-25T15:13:46.153-08:00</updated><title type='text'>JavaScript and the Next Big Language - problems</title><content type='html'>Steve Yegge is famous for talking about &lt;a href="http://steve-yegge.blogspot.com/2007/02/next-big-language.html"&gt;Javascript as the Next Big Language&lt;/a&gt;.&lt;br /&gt;&lt;br /&gt;I believe he was talking about Javascript 2/ECMA Script 4, which is currently in a "holding pattern". I personally believe this is great for the browser implementers and the web, but terrible for javascript growing into a language suitable for programming in the large (which is what I was hoping for some time this year).&lt;br /&gt;&lt;br /&gt;&lt;a href="http://blog.stackoverflow.com/"&gt;Joel S mentioned once&lt;/a&gt; that he views C++ as a failure/disappointment (of course being a failure doesn't stop him and millions of others from using it) because it failued to have a String "type". In his words: &lt;span style="font-weight: bold;"&gt;"String is too important to be left to library implementers"&lt;/span&gt;.&lt;br /&gt;&lt;br /&gt;I would like to generalise this concept: while many popular languages can quite happily be "extended" by libraries, this doesn't mean that the language designers should leave out important features and leave it up to library writers to provide implementations just becuase they can (as it almost always turns into a zoo in about 30 seconds).&lt;br /&gt;&lt;br /&gt;&lt;span style="font-style: italic;"&gt;Some features are just too important to be left to library writers &lt;/span&gt;;)&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/2311776355674459132-6816370146031146638?l=michaelneale.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/2311776355674459132/posts/default/6816370146031146638'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/2311776355674459132/posts/default/6816370146031146638'/><link rel='alternate' type='text/html' href='http://michaelneale.blogspot.com/2008/11/javascript-and-next-big-language.html' title='JavaScript and the Next Big Language - problems'/><author><name>Michael Neale</name><uri>http://www.blogger.com/profile/14670410000512777421</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='30' src='http://www.users.on.net/~michaelneale/michael.jpg'/></author></entry><entry><id>tag:blogger.com,1999:blog-2311776355674459132.post-2613353655218923536</id><published>2008-10-29T19:23:00.000-07:00</published><updated>2008-10-29T21:23:57.717-07:00</updated><title type='text'>The Real web apps stand up</title><content type='html'>There are 2 types of people in the world. Those that build user interfaces, and those that have an opinion on how they should be built (and unfortunately try to build frameworks).&lt;br /&gt;&lt;br /&gt;The term "web app" came to mean apps that you access through a web browser. Most of them are (still) not a whole lot more then &lt;a href="http://en.wikipedia.org/wiki/IBM_3270"&gt;3270 screen apps&lt;/a&gt; with colour. Actually 3270 devices were slightly smarter then most web apps. Even today, many web apps (and their supporting frameworks) follow this model. Since about 2000 people started using and abusing javascript to give these apps some of the responsiveness that we had back in the 70s. Yay. The term Ajax was coined when people realised they could fetch data in the background for these elements.&lt;br /&gt;&lt;br /&gt;GMail came along and showed the first "mainstream" Real web app. It is just one "page" - which then uses the browser as the powerful GUI platform it is to render itself, in the client, and handle user gestures, in the client. What a client was meant to be, what "MVC" was meant to be. Kind of a simplified version of what people did 1000's of years ago with those xerox smalltalk and lisp machines.&lt;br /&gt;&lt;br /&gt;This is not to say that the "ye olde" style web apps don't have a use - they certainly do. In fact the web is and should be mostly of this type of app/site (which is really a web site with dynamic content behind it). But they aren't really Applications from the user experience - at least not all they could be. Wonderful frameworks like rails seem to take things as far as they can go for content driven web sites - but most people find they want more (more importantly their users expect more) for richer apps (this is only a small subset of app out there). So you either have to find a front end Real app framework for your big complex app (like google and others do), or don't let your apps get complex, build smaller apps that can live as content driven web sites (like 37 signals do) - both are great approaches. Its just upsetting when people get confused (and you get a web site trying to be a big ugly complex app, or a hulking app for something simple that could have been done as a web site).&lt;br /&gt;&lt;br /&gt;Some popular examples:&lt;br /&gt;&lt;br /&gt;&lt;ul&gt;&lt;li&gt;GMail - an app&lt;/li&gt;&lt;li&gt;Facebook - a web site with a little ajax (increasingly becoming an app - but it still relies on page refreshes)&lt;/li&gt;&lt;li&gt;Twitter - a web site (and rightly so, twitter is perfect as it is). &lt;/li&gt;&lt;/ul&gt;&lt;br /&gt;Well, no one could say it better then the authors of the truly amazing &lt;a href="http://cappuccino.org/"&gt;Cappuccino&lt;/a&gt; framework:&lt;br /&gt;&lt;br /&gt;&lt;h2 style="font-style: italic; text-align: justify;"&gt;Designed for Applications&lt;/h2&gt;&lt;div style="font-style: italic; text-align: justify;"&gt;  &lt;/div&gt;&lt;p style="font-style: italic; text-align: justify;"&gt;Nobody will deny that there is a distinct difference between a web site and a desktop application. Similarly, we believe there is a big difference between a static web page and a full fledged web application. Cappuccino is designed for applications, not web pages.&lt;/p&gt;&lt;div style="font-style: italic; text-align: justify;"&gt;  &lt;/div&gt;&lt;p style="font-style: italic; text-align: justify;"&gt;Instead of doing all or most of the work on the server, Cappuccino applications do as much as possible in the client. A typical application would never reload, but rather send and recieve data using traditional AJAX techniques and then present that data in the client code. &lt;a href="http://280slides.com/"&gt;280 Slides&lt;/a&gt; is the first Cappuccino application, and it's a showcase of what is possible with this new framework.&lt;/p&gt;&lt;div style="font-style: italic; text-align: justify;"&gt;  &lt;/div&gt;&lt;p style="font-style: italic; text-align: justify;"&gt;Instead of worrying about how to implement drag and drop, copy and paste (of text &lt;em&gt;and objects&lt;/em&gt;), undo and redo, document saving, rich cross-browser drawing and graphics, and a slew of other features, developers are free to focus on specific problems like PowerPoint support, or Twitter integration, or whatever else makes their application unique and compelling.&lt;/p&gt;&lt;div style="font-style: italic; text-align: justify;"&gt;  &lt;/div&gt;&lt;h2 style="font-style: italic; text-align: justify;"&gt;How does Cappucino Compare to Other Frameworks?&lt;/h2&gt;&lt;div style="font-style: italic; text-align: justify;"&gt;   &lt;/div&gt;&lt;p style="font-style: italic; text-align: justify;"&gt;Cappuccino is &lt;em&gt;not&lt;/em&gt; designed for building web sites, or making existing sites more "dynamic". We think these goals are too far removed from those of application development to be served well by a single framework. Projects like Prototype and jQuery are excellent at those tasks, but they are forced by their nature to make compromises which render them ineffective at application development.&lt;/p&gt;&lt;div style="font-style: italic; text-align: justify;"&gt;  &lt;/div&gt;&lt;p style="font-style: italic; text-align: justify;"&gt;On the other end of the existing frameworks are technologies like SproutCore. While SproutCore set out with similar goals to Cappuccino, it takes a distincly different approach. It still relies on HTML, CSS, JavaScript, Prototype, and an entirely new and unique set of APIs. It also requires special development software and a cumbersome compilation step. We think this is the wrong approach.&lt;/p&gt;&lt;div style="text-align: justify;"&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/2311776355674459132-2613353655218923536?l=michaelneale.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/2311776355674459132/posts/default/2613353655218923536'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/2311776355674459132/posts/default/2613353655218923536'/><link rel='alternate' type='text/html' href='http://michaelneale.blogspot.com/2008/10/real-web-apps-stand-up.html' title='The Real web apps stand up'/><author><name>Michael Neale</name><uri>http://www.blogger.com/profile/14670410000512777421</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='30' src='http://www.users.on.net/~michaelneale/michael.jpg'/></author></entry><entry><id>tag:blogger.com,1999:blog-2311776355674459132.post-4386527593383970918</id><published>2008-10-23T15:27:00.000-07:00</published><updated>2008-10-23T15:43:30.266-07:00</updated><title type='text'>Bob on Rails</title><content type='html'>My good friend &lt;a href="http://www.fnokd.com/"&gt;Bob McW&lt;/a&gt; (Codehaus.org founder, who actually started Drools waaay back, and who is responsible for the name "Drools), is now back working in JBoss/Red Hat in Research and Prototyping. &lt;br /&gt;&lt;br /&gt;He is working on making Rails deployable "natively" (in place rails apps, using all the usual rails infrastructure and deployment stuff) to finely tuned JBoss AS (5). As a bonus he is making clustering easy, and demoing the whole lot on "The Cloud".&lt;br /&gt;&lt;br /&gt;It was &lt;a href="http://michaelneale.blogspot.com/2007/10/rails-on-jboss.html"&gt;some time ago&lt;/a&gt; that I noodled with getting Rails to run on JBoss on Fedora, but its nice to see bob taking this very seriously.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/2311776355674459132-4386527593383970918?l=michaelneale.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/2311776355674459132/posts/default/4386527593383970918'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/2311776355674459132/posts/default/4386527593383970918'/><link rel='alternate' type='text/html' href='http://michaelneale.blogspot.com/2008/10/bob-on-rails.html' title='Bob on Rails'/><author><name>Michael Neale</name><uri>http://www.blogger.com/profile/14670410000512777421</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='30' src='http://www.users.on.net/~michaelneale/michael.jpg'/></author></entry><entry><id>tag:blogger.com,1999:blog-2311776355674459132.post-5397991101314825392</id><published>2008-10-20T19:24:00.000-07:00</published><updated>2008-10-20T23:28:53.682-07:00</updated><title type='text'>Cross platform icons</title><content type='html'>And by cross platform icons I don't mean some format that caters to all the whims of gnome, windows, or OSX etc.. but I mean icons that don't look too out of place on each platform.&lt;br /&gt;&lt;br /&gt;Eclipse !&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://2.bp.blogspot.com/_KukQ8TlQMz8/SP1FqfVp4eI/AAAAAAAAAUs/_oc-Ywn-_Co/s1600-h/eclipse-icons.png"&gt;&lt;img style="margin: 0px auto 10px; display: block; text-align: center; cursor: pointer;" src="http://2.bp.blogspot.com/_KukQ8TlQMz8/SP1FqfVp4eI/AAAAAAAAAUs/_oc-Ywn-_Co/s320/eclipse-icons.png" alt="" id="BLOGGER_PHOTO_ID_5259436536107753954" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;These can work quite well in a web app. Of course I have made the mistake in the past (well I still do) of only providing icons - the "hieroglyphic" user interface it is sometimes called. Whoops. Well they are nice complement to text, buttons, menus etc, if used sparingly can draw the eye to what matters, and provide a little consistency. Plus they don't look too out of place on different operating systems.&lt;br /&gt;&lt;br /&gt;The eclipse people have done a great job !&lt;br /&gt;&lt;br /&gt;Its all here in a &lt;a href="http://www.michaelneale.net-a.googlepages.com/eclipse-icons.zip"&gt;zip.&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;Probably the last blog post (hopefully) before I take some time off for "paternity" leave for child number 2.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/2311776355674459132-5397991101314825392?l=michaelneale.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/2311776355674459132/posts/default/5397991101314825392'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/2311776355674459132/posts/default/5397991101314825392'/><link rel='alternate' type='text/html' href='http://michaelneale.blogspot.com/2008/10/cross-platform-icons.html' title='Cross platform icons'/><author><name>Michael Neale</name><uri>http://www.blogger.com/profile/14670410000512777421</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='30' src='http://www.users.on.net/~michaelneale/michael.jpg'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://2.bp.blogspot.com/_KukQ8TlQMz8/SP1FqfVp4eI/AAAAAAAAAUs/_oc-Ywn-_Co/s72-c/eclipse-icons.png' height='72' width='72'/></entry><entry><id>tag:blogger.com,1999:blog-2311776355674459132.post-2960015557073617765</id><published>2008-08-17T22:38:00.000-07:00</published><updated>2008-08-17T22:44:31.577-07:00</updated><title type='text'>GWT and closures talk</title><content type='html'>I spoke the other day at the Sydney Java Users Group on my experiences with GWT, and I then attempted the dodgiest segway into the closures debate, with some examples in a variety of JVM languages (Scala, scheme, jython etc).&lt;br /&gt;&lt;br /&gt;Anyway, &lt;a href="http://www.michaelneale.net-a.googlepages.com/SJUG_Aug_2008.ppt"&gt;here&lt;/a&gt; are the slides. I believe it was video'd too, as the slides won't make a whole lot of sense without the context (I did a lot of live coding).&lt;br /&gt;&lt;br /&gt;My opinion on the closures debate depends on what mood I am in, and how much I am prepared to argue with people (in general I think the Java language needs a LOT of work, and it should happen, breaking backwards source capability if necessary).&lt;br /&gt;&lt;br /&gt;Following is the view off the back deck of my new office (the office itself has a deck, which is nice and sunny):&lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://4.bp.blogspot.com/_KukQ8TlQMz8/SKkMFZ1TGxI/AAAAAAAAARs/JvCFKjkkMsU/s1600-h/IMG_0624.jpg"&gt;&lt;img style="margin: 0px auto 10px; display: block; text-align: center; cursor: pointer;" src="http://4.bp.blogspot.com/_KukQ8TlQMz8/SKkMFZ1TGxI/AAAAAAAAARs/JvCFKjkkMsU/s320/IMG_0624.jpg" alt="" id="BLOGGER_PHOTO_ID_5235729328768228114" border="0" /&gt;&lt;/a&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/2311776355674459132-2960015557073617765?l=michaelneale.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/2311776355674459132/posts/default/2960015557073617765'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/2311776355674459132/posts/default/2960015557073617765'/><link rel='alternate' type='text/html' href='http://michaelneale.blogspot.com/2008/08/gwt-and-closures-talk.html' title='GWT and closures talk'/><author><name>Michael Neale</name><uri>http://www.blogger.com/profile/14670410000512777421</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='30' src='http://www.users.on.net/~michaelneale/michael.jpg'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://4.bp.blogspot.com/_KukQ8TlQMz8/SKkMFZ1TGxI/AAAAAAAAARs/JvCFKjkkMsU/s72-c/IMG_0624.jpg' height='72' width='72'/></entry><entry><id>tag:blogger.com,1999:blog-2311776355674459132.post-1745700456864185160</id><published>2008-08-09T20:16:00.000-07:00</published><updated>2008-08-09T20:52:04.020-07:00</updated><title type='text'>Why is usability and user experience terrible in open source apps?</title><content type='html'>I am a big fan of the &lt;a href="http://www.drunkandretired.com/"&gt;Drunk and Retired podcast&lt;/a&gt;. Recently they had some discussion on why proprietary software, in general, has a better user experience then equivalent open source software, which is a fair generalisation. &lt;br /&gt;&lt;br /&gt;I think Charles hit the nail on the head, its really painful work. Sometimes its quite hard, most times its just really really painful.&lt;br /&gt;&lt;br /&gt;And open source is generally built either by volunteers (as I do part time) or paid staff (as I do full time) - but generally even in the case of the latter it is with a fraction of the level of investment that commercial vendors bring to bear on equivalent products, hence user experience can tend to suffer for a bit (certainly its probably the last bit that gets looked at).&lt;br /&gt;&lt;br /&gt;Also - as different areas of software become “commoditised” its a great way for pay-for products to differentiate themselves - invest a lot in usability and it makes your product more likely to sell itself.&lt;br /&gt;&lt;br /&gt;But I think its also a bit of a lost art - for some reason its seen as unsexy to care about user interface, or user experience compared with “hard core” parts (eg linux kernel developers are revered as having some magical power).&lt;br /&gt;&lt;br /&gt;Furthermore, the web is to blame for a lot of this. In the 90’s .com goldrush graphic designers became web developers when following the money, but graphic design is only one small part of interface design and very little to do with user experience. However, the n-tiered approach to building apps meant that there was a “user interface layer” which became a detail to be worried about afterwards, (and often by people who would have been failed graphic designers in another life).&lt;br /&gt;&lt;br /&gt;I intend to do my best to reverse this imbalance.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/2311776355674459132-1745700456864185160?l=michaelneale.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/2311776355674459132/posts/default/1745700456864185160'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/2311776355674459132/posts/default/1745700456864185160'/><link rel='alternate' type='text/html' href='http://michaelneale.blogspot.com/2008/08/why-is-usability-and-user-experience.html' title='Why is usability and user experience terrible in open source apps?'/><author><name>Michael Neale</name><uri>http://www.blogger.com/profile/14670410000512777421</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='30' src='http://www.users.on.net/~michaelneale/michael.jpg'/></author></entry><entry><id>tag:blogger.com,1999:blog-2311776355674459132.post-67938840503289131</id><published>2008-06-24T22:46:00.001-07:00</published><updated>2008-06-24T22:53:24.039-07:00</updated><title type='text'>When is compiling not compiling</title><content type='html'>I was annoyed by a post I read somewhere that talked about shells and compiling and why they don't like compiling etc...&lt;br /&gt;&lt;br /&gt;Its 2008, and practically no modern programming tools really can't be made interpreted, or compiled as needed. The differences are fading (eg Java, C++ can all be made to work in shells if you like).&lt;br /&gt;&lt;br /&gt;In my day job our rule engine is compiled, kinda. But to make the point that things can be totally interpreted, I wrapped a command line shell around the clips language module:&lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://1.bp.blogspot.com/_KukQ8TlQMz8/SGHc5BVpHiI/AAAAAAAAAQU/ZxhE_2m99tc/s1600-h/Picture+1.png"&gt;&lt;img style="margin: 0px auto 10px; display: block; text-align: center; cursor: pointer;" src="http://1.bp.blogspot.com/_KukQ8TlQMz8/SGHc5BVpHiI/AAAAAAAAAQU/ZxhE_2m99tc/s320/Picture+1.png" alt="" id="BLOGGER_PHOTO_ID_5215692715641609762" border="0" /&gt;&lt;/a&gt;So there. Its actually becoming pretty handy. Also, Lisp dialects are soooo nice on the command line. Balanced expressions make the perfect unit to ship to the interpreter without trying to guess where it is up to.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/2311776355674459132-67938840503289131?l=michaelneale.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/2311776355674459132/posts/default/67938840503289131'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/2311776355674459132/posts/default/67938840503289131'/><link rel='alternate' type='text/html' href='http://michaelneale.blogspot.com/2008/06/when-is-compiling-not-compiling.html' title='When is compiling not compiling'/><author><name>Michael Neale</name><uri>http://www.blogger.com/profile/14670410000512777421</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='30' src='http://www.users.on.net/~michaelneale/michael.jpg'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://1.bp.blogspot.com/_KukQ8TlQMz8/SGHc5BVpHiI/AAAAAAAAAQU/ZxhE_2m99tc/s72-c/Picture+1.png' height='72' width='72'/></entry><entry><id>tag:blogger.com,1999:blog-2311776355674459132.post-7514302761055445506</id><published>2008-05-21T16:52:00.001-07:00</published><updated>2008-05-22T18:21:08.327-07:00</updated><title type='text'>STOP THE LOGGING MADNESS PLEASE !!</title><content type='html'>A personal pet peeve of mine is the proliferation of logging frameworks. Log4J was fine, but Sun had to go and not use it for the JDK. There is/was commons logging (which was not maintained) and now there is sl4j.&lt;br /&gt;&lt;br /&gt;90% of libraries that have logging requirements should not have logging in them. I don't mean that they shouldn't *be able* to log, but they should do it via a callback interface (what would be a "closure" where you pass in a bit of code to be called when a log event occurs).&lt;br /&gt;&lt;br /&gt;Instead what we have now are several jars needed to support different flavours of logging. Annoying.&lt;br /&gt;&lt;br /&gt;I know lots of people have opinions on logging, and they shouldn't, they are wrong. Its a symptom of the problem known as "&lt;a href="http://www.unixguide.net/freebsd/faq/16.19.shtml"&gt;what colour should be the bike shed be&lt;/a&gt;". (Which is to say if you are thinking about it, you are not really thinking about what is important, and often times people do that because its a form of procrastination - instead of solving the problem at hand they obsess over trivial details).&lt;br /&gt;&lt;br /&gt;So please, library authors, just stop it. Now. **&lt;br /&gt;&lt;br /&gt;** EDIT: This includes me, I am very guilty of terrible crimes against humanity in this area.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/2311776355674459132-7514302761055445506?l=michaelneale.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/2311776355674459132/posts/default/7514302761055445506'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/2311776355674459132/posts/default/7514302761055445506'/><link rel='alternate' type='text/html' href='http://michaelneale.blogspot.com/2008/05/stop-logging-madness-please.html' title='STOP THE LOGGING MADNESS PLEASE !!'/><author><name>Michael Neale</name><uri>http://www.blogger.com/profile/14670410000512777421</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='30' src='http://www.users.on.net/~michaelneale/michael.jpg'/></author></entry><entry><id>tag:blogger.com,1999:blog-2311776355674459132.post-9008099210049398608</id><published>2008-05-20T18:13:00.000-07:00</published><updated>2008-05-20T18:31:54.878-07:00</updated><title type='text'>Tech that makes people crazy</title><content type='html'>Lately I have been implementing a WebDAV filesystem. OH the pain. The frustration in trying to make it work right on different platforms (I am looking at you, OSX finder). Something about filesystems makes you go insane. Just look at Hans Reiser.&lt;br /&gt;&lt;br /&gt;At the other extreme of the stack of technology, we have javascript. Something about JS makes people insane. I have lots of anecdotal evidence of crazy behaviour - DomAPI suddenly going proprietary, and of course the ExtJS fiasco where they tricked people into contributing to an LGPL project (with illegitimate and unenforceable additions to the LGPL licence) and then bait and switch to a GPL licence (upsetting as it took attention away from other toolkits which are under more liberal licences - heck if even started as a layer on YUI).&lt;br /&gt;&lt;br /&gt;Well, its open source, so Use the Fork, Luke !&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/2311776355674459132-9008099210049398608?l=michaelneale.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/2311776355674459132/posts/default/9008099210049398608'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/2311776355674459132/posts/default/9008099210049398608'/><link rel='alternate' type='text/html' href='http://michaelneale.blogspot.com/2008/05/tech-that-makes-people-crazy.html' title='Tech that makes people crazy'/><author><name>Michael Neale</name><uri>http://www.blogger.com/profile/14670410000512777421</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='30' src='http://www.users.on.net/~michaelneale/michael.jpg'/></author></entry><entry><id>tag:blogger.com,1999:blog-2311776355674459132.post-6950608078502808027</id><published>2008-05-18T04:17:00.000-07:00</published><updated>2008-05-18T05:22:06.454-07:00</updated><title type='text'>The tyranny of patents</title><content type='html'>I am a iphone user, and fan. Its my first experience with a "touch" user interface since I played with old HP machines back in the 80s (one of my school friends' dad was a HP executive and often had different models home to try out, which I loved).&lt;br /&gt;&lt;br /&gt;There has been some talk as to why it has taken 20 or 30 years for touch UI to be an "overnight success". I think a big part of the reason is the patents involved: http://en.wikipedia.org/wiki/Touchscreen#Development&lt;br /&gt;&lt;br /&gt;Patents are a terrible, terrible thing for innovation. Having an idea is such a small part of innovation, especially in software as well (where the idea is pretty close to the implementation).&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/2311776355674459132-6950608078502808027?l=michaelneale.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/2311776355674459132/posts/default/6950608078502808027'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/2311776355674459132/posts/default/6950608078502808027'/><link rel='alternate' type='text/html' href='http://michaelneale.blogspot.com/2008/05/tyranny-of-patents.html' title='The tyranny of patents'/><author><name>Michael Neale</name><uri>http://www.blogger.com/profile/14670410000512777421</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='30' src='http://www.users.on.net/~michaelneale/michael.jpg'/></author></entry><entry><id>tag:blogger.com,1999:blog-2311776355674459132.post-6270704426918662990</id><published>2008-05-10T17:02:00.001-07:00</published><updated>2008-05-10T17:15:15.656-07:00</updated><title type='text'>JavaOne 2008</title><content type='html'>&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://4.bp.blogspot.com/_KukQ8TlQMz8/SCY3ywZsbDI/AAAAAAAAAO4/xmMUkRCot_k/s1600-h/IMG_0453.jpg"&gt;&lt;img style="margin: 0px auto 10px; display: block; text-align: center; cursor: pointer;" src="http://4.bp.blogspot.com/_KukQ8TlQMz8/SCY3ywZsbDI/AAAAAAAAAO4/xmMUkRCot_k/s320/IMG_0453.jpg" alt="" id="BLOGGER_PHOTO_ID_5198904164971473970" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;I made the trek across "the ditch" to San Francisco for JavaOne 2008. Its pretty convenient from Sydney, direct flight, comfortable. What is not comfortable is the jet lag. I have never had it so bad, unbelievably bad.&lt;br /&gt;&lt;br /&gt;Well the conference was not terribly exciting, but talking to everyone is always worth the effort. Its still very much Sun's conference, not the communities. Sun tend to have their influence everywhere - from their shoe-horning glassfish into all sorts of irrelevant places, and keynotes that "announce" tech that really have nothing to do with the community (JavaFX). That much is disappointing. Even the irrelevant fact that glassfish has a "kernel" of 98K was mentioned in the keynote ! What does that mean ! Nothing ! Its not really a kernel, but whatever. Sun seem to be driven partly out of spite, creating competing tech (or aquiring) - with no aim to make money, but only to compete etc.. Its not terribly surprising they are no longer making money - they had a terrible result recently. Terrible - makes me sad as they were a jewel of silicon valley once, and a good contributor to open source.&lt;br /&gt;&lt;br /&gt;I liked JavaFX, would consider using it if it took off.&lt;br /&gt;&lt;br /&gt;The most interesting thing all week was the Scala "lift off" conference I went to on saturday. I went with the express aim (and some preparation) to convince people how great it would be for scalac (compiler) to be able to have java and scala source mixed, including in IDE tooling. It turns out it is already on the way !&lt;br /&gt;&lt;br /&gt;With such a smart group of people working on and around scala, and funded, it has a bright future. And not a moment too soon.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/2311776355674459132-6270704426918662990?l=michaelneale.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/2311776355674459132/posts/default/6270704426918662990'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/2311776355674459132/posts/default/6270704426918662990'/><link rel='alternate' type='text/html' href='http://michaelneale.blogspot.com/2008/05/javaone-2008.html' title='JavaOne 2008'/><author><name>Michael Neale</name><uri>http://www.blogger.com/profile/14670410000512777421</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='30' src='http://www.users.on.net/~michaelneale/michael.jpg'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://4.bp.blogspot.com/_KukQ8TlQMz8/SCY3ywZsbDI/AAAAAAAAAO4/xmMUkRCot_k/s72-c/IMG_0453.jpg' height='72' width='72'/></entry><entry><id>tag:blogger.com,1999:blog-2311776355674459132.post-3511057382584185121</id><published>2008-04-06T16:03:00.000-07:00</published><updated>2008-04-06T16:42:49.190-07:00</updated><title type='text'>Melbourne demos</title><content type='html'>I was lucky enough to visit Melbourne, Australia's most livable city, and talk to a whole lot of people about drools stuff.&lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://4.bp.blogspot.com/_KukQ8TlQMz8/R_lYktciKJI/AAAAAAAAANo/_Ksl4n0dYM0/s1600-h/Picture+1.png"&gt;&lt;img style="margin: 0px auto 10px; display: block; text-align: center; cursor: pointer;" src="http://4.bp.blogspot.com/_KukQ8TlQMz8/R_lYktciKJI/AAAAAAAAANo/_Ksl4n0dYM0/s320/Picture+1.png" alt="" id="BLOGGER_PHOTO_ID_5186273833591646354" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;Unfortunately I had a raging cold the whole time, and was barely lucid, but I got to see the new Red Hat office, put faces to names etc. Room service is really nice when you are sick as a dog in bed.&lt;br /&gt;&lt;br /&gt;One of the most interesting reflections I had on talking to people, was that open source isn't considered just because its open source (as in the fact that it is cheaper up front) but more on feature for feature merits. This is quite a change from years past.&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://1.bp.blogspot.com/_KukQ8TlQMz8/R_laD9ciKKI/AAAAAAAAANw/GGhNFxLM_GM/s1600-h/Picture+2.png"&gt;&lt;img style="margin: 0px auto 10px; display: block; text-align: center; cursor: pointer;" src="http://1.bp.blogspot.com/_KukQ8TlQMz8/R_laD9ciKKI/AAAAAAAAANw/GGhNFxLM_GM/s320/Picture+2.png" alt="" id="BLOGGER_PHOTO_ID_5186275469974186146" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;The demonstrations of the BRMS and other new features went really well (surprisingly for me) - I was really happy with it (as were others).&lt;br /&gt;&lt;br /&gt;While there I also joined, remotely, a Dallas user group for rule based tech users. That was quite interesting (James Owen was speaking) - I will definitely join next month as the timezone is perfect for me. Lots to learn...&lt;br /&gt;&lt;br /&gt;I still have a nasty cold, but its on the mend, hopefully soon, as at the end of the week I am returning to Sydney (Blue Mountains to be more accurate). Whence I will spend my spare time scanning realestate.com.au and domain.com.au for a house to live in ;)&lt;br /&gt;&lt;br /&gt;There presentation I did is &lt;a href="http://wiki.jboss.org/wiki/_Files/MichaelFromThomasRules/DroolsApril08.ppt"&gt;here&lt;/a&gt;.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/2311776355674459132-3511057382584185121?l=michaelneale.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/2311776355674459132/posts/default/3511057382584185121'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/2311776355674459132/posts/default/3511057382584185121'/><link rel='alternate' type='text/html' href='http://michaelneale.blogspot.com/2008/04/melbourne-demos.html' title='Melbourne demos'/><author><name>Michael Neale</name><uri>http://www.blogger.com/profile/14670410000512777421</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='30' src='http://www.users.on.net/~michaelneale/michael.jpg'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://4.bp.blogspot.com/_KukQ8TlQMz8/R_lYktciKJI/AAAAAAAAANo/_Ksl4n0dYM0/s72-c/Picture+1.png' height='72' width='72'/></entry><entry><id>tag:blogger.com,1999:blog-2311776355674459132.post-5850495606792577556</id><published>2008-03-24T15:19:00.000-07:00</published><updated>2008-04-05T22:09:44.647-07:00</updated><title type='text'>Travel and talks</title><content type='html'>I am speaking at the local ACS special interests group this Wednesday (the 25th). Next week I will be in Melbourne seeing various people, not sure if there are general meetups though (I have been ignoring email, a bad^H^H^H good habit of mine).&lt;br /&gt;&lt;br /&gt;The week after we are moving to Sydney (after 4 years in Brisbane) so the times, they are a-changing.&lt;br /&gt;&lt;br /&gt;Now I need to find some stuff to talk about (I really don't like demos - mostly cause I stop in the middle, crack open the code and change/fix something that is bugging me, not so great for the perplexed people watching).&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/2311776355674459132-5850495606792577556?l=michaelneale.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/2311776355674459132/posts/default/5850495606792577556'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/2311776355674459132/posts/default/5850495606792577556'/><link rel='alternate' type='text/html' href='http://michaelneale.blogspot.com/2008/03/travel-and-talks.html' title='Travel and talks'/><author><name>Michael Neale</name><uri>http://www.blogger.com/profile/14670410000512777421</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='30' src='http://www.users.on.net/~michaelneale/michael.jpg'/></author></entry><entry><id>tag:blogger.com,1999:blog-2311776355674459132.post-3794958101742069252</id><published>2008-03-21T04:00:00.000-07:00</published><updated>2008-03-21T04:05:14.391-07:00</updated><title type='text'>How a sewing machine works?</title><content type='html'>As a frequent sufferer of insomnia - I like to think about trivial but unsolved tricks on how everyday things work (how a boat sails against the wind, how a sewing machine works for instance).&lt;br /&gt;&lt;br /&gt;Well, now I will have to find something else:&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://2.bp.blogspot.com/_KukQ8TlQMz8/R-OWJtciKHI/AAAAAAAAANA/aWm7gX_0CQo/s1600-h/ani_lockstitch2.gif"&gt;&lt;img style="margin: 0px auto 10px; display: block; text-align: center; cursor: pointer;" src="http://2.bp.blogspot.com/_KukQ8TlQMz8/R-OWJtciKHI/AAAAAAAAANA/aWm7gX_0CQo/s320/ani_lockstitch2.gif" alt="" id="BLOGGER_PHOTO_ID_5180149089968466034" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;Well if a picture is worth 1000 words, an animated gif must be worth 10^6? I love that this is such a clear explanation to something that would be impossible to describe with words.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/2311776355674459132-3794958101742069252?l=michaelneale.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/2311776355674459132/posts/default/3794958101742069252'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/2311776355674459132/posts/default/3794958101742069252'/><link rel='alternate' type='text/html' href='http://michaelneale.blogspot.com/2008/03/how-sewing-machine-works.html' title='How a sewing machine works?'/><author><name>Michael Neale</name><uri>http://www.blogger.com/profile/14670410000512777421</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='30' src='http://www.users.on.net/~michaelneale/michael.jpg'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://2.bp.blogspot.com/_KukQ8TlQMz8/R-OWJtciKHI/AAAAAAAAANA/aWm7gX_0CQo/s72-c/ani_lockstitch2.gif' height='72' width='72'/></entry><entry><id>tag:blogger.com,1999:blog-2311776355674459132.post-2559276142403771281</id><published>2008-03-17T17:01:00.000-07:00</published><updated>2008-03-17T17:05:32.996-07:00</updated><title type='text'>Stop iphone opening iphoto</title><content type='html'>As a part time mac-tard, and iphone user, it irritates me how it opens iPhoto. I saw some overcomplicated trick at 37 signals blog, but then found out that it is a setting in Image Capture.app ! (preferences of course).&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/2311776355674459132-2559276142403771281?l=michaelneale.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/2311776355674459132/posts/default/2559276142403771281'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/2311776355674459132/posts/default/2559276142403771281'/><link rel='alternate' type='text/html' href='http://michaelneale.blogspot.com/2008/03/stop-iphone-opening-iphoto.html' title='Stop iphone opening iphoto'/><author><name>Michael Neale</name><uri>http://www.blogger.com/profile/14670410000512777421</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='30' src='http://www.users.on.net/~michaelneale/michael.jpg'/></author></entry><entry><id>tag:blogger.com,1999:blog-2311776355674459132.post-2101165585632279523</id><published>2008-03-02T14:45:00.000-08:00</published><updated>2008-03-02T14:56:24.743-08:00</updated><title type='text'>Writing a language in itself</title><content type='html'>I have always been fascinated by the art of writing programming languages themselves  - in some ways, its an easier problem to wrap your head around. Well perhaps not easier in the technical sense, but in terms of requirements/design etc, mostly you can fit it all in your head at once (unlike solving say, a Real World problem !).&lt;br /&gt;&lt;br /&gt;I was curious about the newly minted OpenJDK6 source code that has been released (open sourced, finally), so I ran the trusty sloccount command line tool to count lines, here are the results:&lt;br /&gt;&lt;br /&gt;&lt;span class="comment"&gt;&lt;span style="color:#000000;"&gt;&lt;/span&gt;&lt;p&gt;&lt;span style="color:#000000;"&gt;java:       2393565 (72.63%) cpp:         462235 (14.03%) ansic:       419499 (12.73%) sh:           17089 (0.52%) asm:           1936 (0.06%) awk:            598 (0.02%) lisp:           449 (0.01%) cs:              72 (0.00%) jsp:             24 (0.00%) csh:              3 (0.00%)&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style="color:#000000;"&gt;There is lisp in there? I am betting elisp for an emacs major mode or something. But 72% Java. c/c++ would be for posix interfaces, and probably enough core VM code, and perhaps hotspot stuff.&lt;/span&gt;&lt;/p&gt;&lt;/span&gt;Conclusion: Java is written mostly in Java, which is the way it should be (if you were looking at smalltalk, I bet it would be much much more then 70%, more like 95%). Compare to MRI ruby, which is 90% C, or JRuby, which is 90% Java.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/2311776355674459132-2101165585632279523?l=michaelneale.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/2311776355674459132/posts/default/2101165585632279523'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/2311776355674459132/posts/default/2101165585632279523'/><link rel='alternate' type='text/html' href='http://michaelneale.blogspot.com/2008/03/writing-language-in-itself.html' title='Writing a language in itself'/><author><name>Michael Neale</name><uri>http://www.blogger.com/profile/14670410000512777421</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='30' src='http://www.users.on.net/~michaelneale/michael.jpg'/></author></entry><entry><id>tag:blogger.com,1999:blog-2311776355674459132.post-3296009072218461852</id><published>2008-02-13T15:03:00.000-08:00</published><updated>2008-02-13T15:06:42.060-08:00</updated><title type='text'>IBM (and the old PwC) bankrupts 170 year old business</title><content type='html'>It is with dismay I read this: &lt;a href="http://blogs.zdnet.com/projectfailures/?p=583"&gt;http://blogs.zdnet.com/projectfailures/?p=583&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;I am pretty sure I smell the stench of the Pricewaterhousecoopers trouble makers inside IBM services. Shame.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/2311776355674459132-3296009072218461852?l=michaelneale.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/2311776355674459132/posts/default/3296009072218461852'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/2311776355674459132/posts/default/3296009072218461852'/><link rel='alternate' type='text/html' href='http://michaelneale.blogspot.com/2008/02/ibm-and-old-pwc-bankrupts-170-year-old.html' title='IBM (and the old PwC) bankrupts 170 year old business'/><author><name>Michael Neale</name><uri>http://www.blogger.com/profile/14670410000512777421</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='30' src='http://www.users.on.net/~michaelneale/michael.jpg'/></author></entry><entry><id>tag:blogger.com,1999:blog-2311776355674459132.post-268765906523183880</id><published>2008-01-28T02:31:00.000-08:00</published><updated>2008-01-28T17:58:52.312-08:00</updated><title type='text'>Should you test libraries?</title><content type='html'>&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://4.bp.blogspot.com/_KukQ8TlQMz8/R56HKjg1QCI/AAAAAAAAAMg/i9t2KAvUxDQ/s1600-h/IMG_0015.jpg"&gt;&lt;img style="margin: 0px auto 10px; display: block; text-align: center; cursor: pointer;" src="http://4.bp.blogspot.com/_KukQ8TlQMz8/R56HKjg1QCI/AAAAAAAAAMg/i9t2KAvUxDQ/s320/IMG_0015.jpg" alt="" id="BLOGGER_PHOTO_ID_5160710838414557218" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;Thought of the day: if you depend on libraries behavior, you *should* have some tests to confirm it? (ie not just experiment, but keep some unit tests around to check it).&lt;br /&gt;&lt;br /&gt;Sounds sensible to me, but others probably think I am nuts.&lt;br /&gt;&lt;br /&gt;The upside: When upgrading lib versions, you know if your assumptions still hold.&lt;br /&gt;&lt;br /&gt;The downside: People think you are nuts for writing tests for NONE of you own code !&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;Well, I like it, I do it, its how I experiment and learn what a lib does, so may as well keep them around as tests (and I am not dead yet).&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/2311776355674459132-268765906523183880?l=michaelneale.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/2311776355674459132/posts/default/268765906523183880'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/2311776355674459132/posts/default/268765906523183880'/><link rel='alternate' type='text/html' href='http://michaelneale.blogspot.com/2008/01/should-you-test-libraries.html' title='Should you test libraries?'/><author><name>Michael Neale</name><uri>http://www.blogger.com/profile/14670410000512777421</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='30' src='http://www.users.on.net/~michaelneale/michael.jpg'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://4.bp.blogspot.com/_KukQ8TlQMz8/R56HKjg1QCI/AAAAAAAAAMg/i9t2KAvUxDQ/s72-c/IMG_0015.jpg' height='72' width='72'/></entry><entry><id>tag:blogger.com,1999:blog-2311776355674459132.post-4156908185887794354</id><published>2008-01-19T02:40:00.000-08:00</published><updated>2008-01-19T02:43:09.313-08:00</updated><title type='text'>Still here</title><content type='html'>Tend to do more interesting blog entries to do with my &lt;a href="http://blog.athico.com"&gt;day job&lt;/a&gt;.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/2311776355674459132-4156908185887794354?l=michaelneale.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/2311776355674459132/posts/default/4156908185887794354'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/2311776355674459132/posts/default/4156908185887794354'/><link rel='alternate' type='text/html' href='http://michaelneale.blogspot.com/2008/01/still-here.html' title='Still here'/><author><name>Michael Neale</name><uri>http://www.blogger.com/profile/14670410000512777421</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='30' src='http://www.users.on.net/~michaelneale/michael.jpg'/></author></entry><entry><id>tag:blogger.com,1999:blog-2311776355674459132.post-3871899217312913710</id><published>2007-12-02T23:21:00.000-08:00</published><updated>2007-12-02T23:28:19.699-08:00</updated><title type='text'>Open Source Developer Conference - 2007</title><content type='html'>I was fortunate enough to attend www.osdc.com.au in Brisbane. (Being home city for me, really wasn't much trouble).&lt;br /&gt;&lt;br /&gt;It is really a conference for app developers and script kiddies, although there were a smattering of linux kernel die hards. About 40% of the people there were paid (in some form) to work on open source as part of their job. That was surprisingly high to me.&lt;br /&gt;&lt;br /&gt;Some general observations:&lt;br /&gt;&lt;br /&gt;&lt;ul&gt;&lt;li&gt;C is still used for everything, in some way. Nothing is likely to replace this language for a long time. However, if it is in fact replaced, it will possibly be due to the changing architectures of CPUs (getting wider rather then just faster).&lt;br /&gt;&lt;/li&gt;&lt;li&gt;I now make the assumption that nothing on the web is secure. There are too many vectors for XSS to make its way into your browsing. People want features more then absolute security. One tip: use a totally separate browser for "sensitive" things, like internet banking etc (and another browser for general browsing - keep your "secure" browser ONLY for those sites, NOTHING else).&lt;br /&gt;&lt;/li&gt;&lt;li&gt;FLOSS has under 2% participation rate of women. This is much less then the 28% for the general IT industry. Yeah, its not a great thing. But, of that 28% - I would wager its taking into account larger parts of organisations that would almost never exist in open source groups, so that may exlpain the skew. No one really knows why. I think men are genetically pre-disposed to have an unhealthy obsession with minutia, which helps in this industry.&lt;br /&gt;&lt;/li&gt;&lt;li&gt;http://www.oncetechnologies.com/radix/ is very interesting. I will keep an eye on it, if it keeps going, and stays open source, may be something we can build on top of.&lt;br /&gt;&lt;/li&gt;&lt;/ul&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/2311776355674459132-3871899217312913710?l=michaelneale.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/2311776355674459132/posts/default/3871899217312913710'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/2311776355674459132/posts/default/3871899217312913710'/><link rel='alternate' type='text/html' href='http://michaelneale.blogspot.com/2007/12/open-source-developer-conference-2007.html' title='Open Source Developer Conference - 2007'/><author><name>Michael Neale</name><uri>http://www.blogger.com/profile/14670410000512777421</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='30' src='http://www.users.on.net/~michaelneale/michael.jpg'/></author></entry><entry><id>tag:blogger.com,1999:blog-2311776355674459132.post-9044832152759624933</id><published>2007-11-20T04:16:00.000-08:00</published><updated>2007-11-20T04:19:15.969-08:00</updated><title type='text'>So Javascript 2 is the Next Big Thing?</title><content type='html'>Well it must have been at least 20 minutes since I started using a completely different language, the latest one is ActionScript 3 (media stuff with flash). Which is approximately Javascript 2.&lt;br /&gt;&lt;br /&gt;All find and dandy, but you get a type warning on this:&lt;br /&gt;&lt;br /&gt; var boo = true;&lt;br /&gt;&lt;br /&gt;Really, come on. Surely there is *some* merit in the most obvious literal type inference. There is none, nada. I know there is some debate on the appropriateness of type inference (mostly due to the fact that if you or the compiler get something wrong, the error messages can be impenetrable), but surely its safe enough for literal vars.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/2311776355674459132-9044832152759624933?l=michaelneale.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/2311776355674459132/posts/default/9044832152759624933'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/2311776355674459132/posts/default/9044832152759624933'/><link rel='alternate' type='text/html' href='http://michaelneale.blogspot.com/2007/11/so-javascript-2-is-next-big-thing.html' title='So Javascript 2 is the Next Big Thing?'/><author><name>Michael Neale</name><uri>http://www.blogger.com/profile/14670410000512777421</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='30' src='http://www.users.on.net/~michaelneale/michael.jpg'/></author></entry><entry><id>tag:blogger.com,1999:blog-2311776355674459132.post-4019905855490958674</id><published>2007-10-24T23:38:00.001-07:00</published><updated>2007-11-18T20:19:35.319-08:00</updated><title type='text'>Rails on JBoss</title><content type='html'>Finally had some more time to do some more work in rails. I heard about "goldspike" - a framework to use jruby to allow you to get rails apps into a war, and deployed on an app server.&lt;br /&gt;&lt;br /&gt;I am reproducing the very very very simple instructions on how I did this mostly for my own benefit.&lt;br /&gt;&lt;br /&gt;Step 1: hack your rails app, just as normal&lt;br /&gt;Step 2: gem install ActiveRecord-JDBC&lt;br /&gt;Step 3:  ruby script/plugin install "svn://rubyforge.org/var/svn/jruby-extras/trunk/rails-integration/plugins/goldspike"&lt;br /&gt;Step 4: rake war:standalone:create&lt;br /&gt;&lt;br /&gt;Thats it ! Well there are a lot of optional configurations, but that will generate a war you can drop and run immediately. No need to get jruby separately.&lt;br /&gt;&lt;br /&gt;I may have a concrete use for this very very shortly.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/2311776355674459132-4019905855490958674?l=michaelneale.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/2311776355674459132/posts/default/4019905855490958674'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/2311776355674459132/posts/default/4019905855490958674'/><link rel='alternate' type='text/html' href='http://michaelneale.blogspot.com/2007/10/rails-on-jboss.html' title='Rails on JBoss'/><author><name>Michael Neale</name><uri>http://www.blogger.com/profile/14670410000512777421</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='30' src='http://www.users.on.net/~michaelneale/michael.jpg'/></author></entry><entry><id>tag:blogger.com,1999:blog-2311776355674459132.post-3043234942512299643</id><published>2007-10-24T03:33:00.000-07:00</published><updated>2007-10-24T03:39:17.546-07:00</updated><title type='text'>Dynamic Language Wizards</title><content type='html'>I enjoy looking into the history of programming languages (tragically, its one of the few things that is a hobby of mine). I came across this video (2001) about "dynamic languages"  - a panel of gurus. Its the only time I have seen Guy Steele and Paul Graham in the same room. Its quite interesting and has held up very accurately over time. Well worth a watch: &lt;a href="http://www.ai.mit.edu/projects/dynlangs/wizards-panels.html"&gt;click here&lt;/a&gt;.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/2311776355674459132-3043234942512299643?l=michaelneale.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/2311776355674459132/posts/default/3043234942512299643'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/2311776355674459132/posts/default/3043234942512299643'/><link rel='alternate' type='text/html' href='http://michaelneale.blogspot.com/2007/10/dynamic-language-wizards.html' title='Dynamic Language Wizards'/><author><name>Michael Neale</name><uri>http://www.blogger.com/profile/14670410000512777421</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='30' src='http://www.users.on.net/~michaelneale/michael.jpg'/></author></entry><entry><id>tag:blogger.com,1999:blog-2311776355674459132.post-1882817209388635543</id><published>2007-10-23T02:06:00.000-07:00</published><updated>2007-10-23T02:09:27.895-07:00</updated><title type='text'>Another reason why we all suck.</title><content type='html'>I thought XUL from Mozilla was dead (although I really liked its idea) but someone showed me a working &lt;a href="http://www.faser.net/mab/chrome/content/mab.xul"&gt;rich UI&lt;/a&gt;. Oh man, everything else kinda sucks.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/2311776355674459132-1882817209388635543?l=michaelneale.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/2311776355674459132/posts/default/1882817209388635543'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/2311776355674459132/posts/default/1882817209388635543'/><link rel='alternate' type='text/html' href='http://michaelneale.blogspot.com/2007/10/another-reason-why-we-all-suck.html' title='Another reason why we all suck.'/><author><name>Michael Neale</name><uri>http://www.blogger.com/profile/14670410000512777421</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='30' src='http://www.users.on.net/~michaelneale/michael.jpg'/></author></entry><entry><id>tag:blogger.com,1999:blog-2311776355674459132.post-485669264617392757</id><published>2007-10-09T16:07:00.000-07:00</published><updated>2007-10-09T17:03:28.417-07:00</updated><title type='text'>Scala Scala Scala &amp; why it can do what dynamic languages can do</title><content type='html'>Recently I have been doing some research and study into the Scala language (and also some side stuff with Haskell to learn and refresh some concepts in my mind which are related).&lt;br /&gt;&lt;br /&gt;I did a talk on Monday night at the local JUG (www.qjug.org) in terms of presenting scala gently to people NOT from a functional programming background (specifically, people who know Java or dynamic languages). I have attached the presentation for this (some of the jokes won't make sense without the talk but it wasn't recorded).&lt;br /&gt;&lt;br /&gt;The 2 interesting parts of it were how do to "duck typing", and how to add in functionality to existing objects - these are both things that people like to do with dynamic languages. I showed how you could do this in scala without escaping the type system, and how neat and easy it could be.&lt;br /&gt;&lt;br /&gt;"Duck typing" - that one is easy, thanks to Scala 2.6 you have structural types (basically declare a method parameter as requiring certain methods and thats all you need to do).&lt;br /&gt;&lt;br /&gt;"Decorating" existing objects - that was not quite so obvious. Using "implicit defs" in scala allows you do to this - the compiler will see that you are trying to access a method  on an object that doesn't exist, and it will see if there are any implicit defs in scope that can convert the object to another object that does implement the method (all using the type system).&lt;br /&gt;&lt;br /&gt;Well, I don't really feel like repeating myself right now so to make more sense of that you will need to look at the attached presentation.&lt;br /&gt;&lt;br /&gt;I think there is a lot of work to be done in educating people whos only experience of type system is what mainstream languages (C#, Java etc) provide, and showing them how it was "meant" to be without throwing too many concepts in their face.&lt;br /&gt;&lt;br /&gt;Presentation is &lt;a href="http://www.michaelneale.net-a.googlepages.com/Scala-talk.pdf"&gt;here&lt;/a&gt;.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/2311776355674459132-485669264617392757?l=michaelneale.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/2311776355674459132/posts/default/485669264617392757'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/2311776355674459132/posts/default/485669264617392757'/><link rel='alternate' type='text/html' href='http://michaelneale.blogspot.com/2007/10/scala-scala-scala-why-it-can-do-what.html' title='Scala Scala Scala &amp; why it can do what dynamic languages can do'/><author><name>Michael Neale</name><uri>http://www.blogger.com/profile/14670410000512777421</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='30' src='http://www.users.on.net/~michaelneale/michael.jpg'/></author></entry><entry><id>tag:blogger.com,1999:blog-2311776355674459132.post-3780057708498742731</id><published>2007-09-24T04:12:00.000-07:00</published><updated>2010-09-29T02:15:55.895-07:00</updated><title type='text'>Python decision tables in under 77 lines</title><content type='html'>&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://2.bp.blogspot.com/_KukQ8TlQMz8/RvelvxcZ-BI/AAAAAAAAALk/mQJ-3Hexwac/s1600-h/Picture+1.png"&gt;&lt;img style="margin: 0px auto 10px; display: block; text-align: center; cursor: pointer;" src="http://2.bp.blogspot.com/_KukQ8TlQMz8/RvelvxcZ-BI/AAAAAAAAALk/mQJ-3Hexwac/s320/Picture+1.png" alt="" id="BLOGGER_PHOTO_ID_5113738142047402002" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;A colleague at work heard I knew a thing or two about  rule engines, asked if I could help him build something to triage his support queues. Working where I do, python is kind of a Big Thing, and I knew he was a big fan of the Django web framework, so I thought I would have a crack at doing some python (a very simple decision table implementation). I tried to learn and follow python idioms, and basically ignored the python OO style, instead going for a quasi functional approach (which python shines at, its OO feels kind of odd).&lt;br /&gt;&lt;br /&gt;Key to this are map() and filter(). Python has lots of built in functions. This makes it a little hard sometimes to find where something is (if its a class method, its easy just &gt;dir(classname) will give you a list of methods - but you sometimes forget what is a build in function or what is a method, but anyway).&lt;br /&gt;&lt;br /&gt;map takes a procedure (function pointer ) and a list of things to do stuff over (in no particular order), and produces a list, filter is similar, but only returns items where the procedure returns true. I think map isn't truly functional, as it operates on the list in place (there is no deep copying going on like in haskell).  The lambda in python is pretty limited, I would say useless. But no matter, you can "nest" function definitions, and then you just pass the name of the function.&lt;br /&gt;&lt;br /&gt;Anyway, the code &lt;a href="http://github.com/michaelneale/Python-Decision-tables"&gt;here&lt;/a&gt;. I was amazed I was able to do it in under 77 lines (including a few comments). Python is nicely terse, but the enforce whitespace makes it very readable. And the functional style is certainly compact.  And I think it looks pretty. Currently parses XLS (but I intended to allow other front end parsers).&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/2311776355674459132-3780057708498742731?l=michaelneale.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/2311776355674459132/posts/default/3780057708498742731'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/2311776355674459132/posts/default/3780057708498742731'/><link rel='alternate' type='text/html' href='http://michaelneale.blogspot.com/2007/09/python-decision-tables.html' title='Python decision tables in under 77 lines'/><author><name>Michael Neale</name><uri>http://www.blogger.com/profile/14670410000512777421</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='30' src='http://www.users.on.net/~michaelneale/michael.jpg'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://2.bp.blogspot.com/_KukQ8TlQMz8/RvelvxcZ-BI/AAAAAAAAALk/mQJ-3Hexwac/s72-c/Picture+1.png' height='72' width='72'/></entry><entry><id>tag:blogger.com,1999:blog-2311776355674459132.post-421357769402896632</id><published>2007-09-15T03:19:00.000-07:00</published><updated>2007-09-16T16:26:57.821-07:00</updated><title type='text'>Scheme and how the world has gone crazy</title><content type='html'>I have been spending time working through the videos of SICP (you can get them on google video) - from MIT. I like to follow along, pause, and try and solve the problems in Dr Scheme or GUILE before they show the solution. The course uses Scheme of course (which they call LISP - although since that time, most people think you mean common lisp when you say lisp, but scheme has just as much or perhaps more right to be called "lisp" then CL does).&lt;br /&gt;&lt;br /&gt;What is interesting is watching it in 2007 and realise that since that time (this was recorded in the early 80's, but the course goes back even further), is how really nothing much has progressed in software at all. Sure things are faster, and we have new applications (like the web) which are amazing compared to at the time, but in terms of art/engineering/science of creating software, we have gone backwards.&lt;br /&gt;&lt;br /&gt;Some interesting points:&lt;br /&gt;&lt;ul&gt;&lt;li&gt;The concept of "DSLs" was pretty clear in the early lectures. They go far as to say Lisp is a bad language to solve your problems in, but its a brilliant language to build a embedded language which will allow you to solve you problems now and into the future (ie language abstractions, rather then fussing with APIs and up front design).&lt;/li&gt;&lt;li&gt;The foolishness of the divide and conquer mentality and up front design (ie basically most mainstream "methodologies" and the foolishness of a using a traditional process in coming up with solutions). Yet still people try on the same old ideas, over and over, and still get the same results, and still are surprised.   &lt;/li&gt;&lt;/ul&gt;&lt;br /&gt;There was so much achieved from the 60's to the early 80's, yet since then, not much. We went from not having the concept of a programming language (or barely) to using AI techniques to get computers to design VLSI chips. Now what do we have? All it takes to be "innovative" these days is a new framework for CRUD. Or a website that allows you to do what IRC did in the 80's.&lt;br /&gt;&lt;br /&gt;Overall I feel depressed about the whole situation. The day may come where its too much and I will just give up.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/2311776355674459132-421357769402896632?l=michaelneale.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/2311776355674459132/posts/default/421357769402896632'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/2311776355674459132/posts/default/421357769402896632'/><link rel='alternate' type='text/html' href='http://michaelneale.blogspot.com/2007/09/scheme-and-how-world-has-gone-crazy.html' title='Scheme and how the world has gone crazy'/><author><name>Michael Neale</name><uri>http://www.blogger.com/profile/14670410000512777421</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='30' src='http://www.users.on.net/~michaelneale/michael.jpg'/></author></entry><entry><id>tag:blogger.com,1999:blog-2311776355674459132.post-1983685466400985971</id><published>2007-09-05T01:42:00.000-07:00</published><updated>2007-09-05T01:51:37.492-07:00</updated><title type='text'>Espresso &amp; stuff</title><content type='html'>&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://4.bp.blogspot.com/_KukQ8TlQMz8/Rt5t1MljFkI/AAAAAAAAALU/0Rul3qz5RVM/s1600-h/Photo+26.jpg"&gt;&lt;img style="margin: 0pt 10px 10px 0pt; float: left; cursor: pointer;" src="http://4.bp.blogspot.com/_KukQ8TlQMz8/Rt5t1MljFkI/AAAAAAAAALU/0Rul3qz5RVM/s320/Photo+26.jpg" alt="" id="BLOGGER_PHOTO_ID_5106639788163929666" border="0" /&gt;&lt;/a&gt;For working at home, a mans best friend is his espresso machine. Gaggia Baby D. Accept no substitute. Only italians and germans should be legally allowed to make espresso machines.&lt;br /&gt;&lt;br /&gt;I am slowly but slackly migrating my personal web content to &lt;a href="http://www.michaelneale.net"&gt;www.michaelneale.net&lt;/a&gt;.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/2311776355674459132-1983685466400985971?l=michaelneale.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/2311776355674459132/posts/default/1983685466400985971'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/2311776355674459132/posts/default/1983685466400985971'/><link rel='alternate' type='text/html' href='http://michaelneale.blogspot.com/2007/09/espresso-stuff.html' title='Espresso &amp; stuff'/><author><name>Michael Neale</name><uri>http://www.blogger.com/profile/14670410000512777421</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='30' src='http://www.users.on.net/~michaelneale/michael.jpg'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://4.bp.blogspot.com/_KukQ8TlQMz8/Rt5t1MljFkI/AAAAAAAAALU/0Rul3qz5RVM/s72-c/Photo+26.jpg' height='72' width='72'/></entry><entry><id>tag:blogger.com,1999:blog-2311776355674459132.post-8147250980003593577</id><published>2007-08-13T22:21:00.000-07:00</published><updated>2007-08-13T22:25:09.420-07:00</updated><title type='text'>Enabling scroll wheel in fedora</title><content type='html'>This is a slightly mindless post - it is really a tip that I am recording so I can remember, and perhaps will help google find the answers.&lt;br /&gt;&lt;br /&gt;I am currently heavily using VMWare Fusion on OSX, and running Fedora 7 (no core any more !). This works great, but I had hassles getting the scroll wheel to work on the mouse (this includes double finger dragging on the macbook pro - see previous post for photos !).&lt;br /&gt;&lt;br /&gt;The magic trick is to crack open xorg.conf (as root - in /etc/X11) and find the section on the mouse, and add to the section "InputDevice" that refers to the mouse:&lt;br /&gt;&lt;br /&gt;Option "ZAxisMapping" "4 5"&lt;br /&gt;&lt;br /&gt;Ahhhh.... well thats why well all love X :(&lt;br /&gt;&lt;br /&gt;but anyway, it works.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/2311776355674459132-8147250980003593577?l=michaelneale.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/2311776355674459132/posts/default/8147250980003593577'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/2311776355674459132/posts/default/8147250980003593577'/><link rel='alternate' type='text/html' href='http://michaelneale.blogspot.com/2007/08/enabling-scroll-wheel-in-fedora.html' title='Enabling scroll wheel in fedora'/><author><name>Michael Neale</name><uri>http://www.blogger.com/profile/14670410000512777421</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='30' src='http://www.users.on.net/~michaelneale/michael.jpg'/></author></entry><entry><id>tag:blogger.com,1999:blog-2311776355674459132.post-4482939350739514839</id><published>2007-07-22T03:20:00.000-07:00</published><updated>2007-07-22T04:19:09.056-07:00</updated><title type='text'>New Toys</title><content type='html'>&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://1.bp.blogspot.com/_KukQ8TlQMz8/RqM8U9qYRnI/AAAAAAAAAJ4/7YgokIBxMSo/s1600-h/100_4750.jpg"&gt;&lt;img style="margin: 0pt 10px 10px 0pt; float: left; cursor: pointer;" src="http://1.bp.blogspot.com/_KukQ8TlQMz8/RqM8U9qYRnI/AAAAAAAAAJ4/7YgokIBxMSo/s320/100_4750.jpg" alt="" id="BLOGGER_PHOTO_ID_5089978334706157170" border="0" /&gt;&lt;/a&gt;I finally for the first time every bought *myself* a mac - a macbook pro. So, I thought I would celebrate the new arrival by letting my 3 and 3/4 year old open it, and start it up. How hard can it be?&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;The box is really really easy to open:&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://4.bp.blogspot.com/_KukQ8TlQMz8/RqM7GtqYRiI/AAAAAAAAAJQ/tydKlX8BdYA/s1600-h/100_4751.jpg"&gt;&lt;img style="margin: 0pt 10px 10px 0pt; float: left; cursor: pointer;" src="http://4.bp.blogspot.com/_KukQ8TlQMz8/RqM7GtqYRiI/AAAAAAAAAJQ/tydKlX8BdYA/s320/100_4751.jpg" alt="" id="BLOGGER_PHOTO_ID_5089976990381393442" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;Mm... the narcotic smell of the apple factory... see the eyes?&lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://3.bp.blogspot.com/_KukQ8TlQMz8/RqM7PdqYRjI/AAAAAAAAAJY/UeZpl5PjDeg/s1600-h/100_4752.jpg"&gt;&lt;img style="margin: 0pt 10px 10px 0pt; float: left; cursor: pointer;" src="http://3.bp.blogspot.com/_KukQ8TlQMz8/RqM7PdqYRjI/AAAAAAAAAJY/UeZpl5PjDeg/s320/100_4752.jpg" alt="" id="BLOGGER_PHOTO_ID_5089977140705248818" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;Lots of bits. Chloe's favourite component is the remote (of course).&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://3.bp.blogspot.com/_KukQ8TlQMz8/RqM7WdqYRkI/AAAAAAAAAJg/cSzaBKONK7Q/s1600-h/100_4753.jpg"&gt;&lt;img style="margin: 0pt 10px 10px 0pt; float: left; cursor: pointer;" src="http://3.bp.blogspot.com/_KukQ8TlQMz8/RqM7WdqYRkI/AAAAAAAAAJg/cSzaBKONK7Q/s320/100_4753.jpg" alt="" id="BLOGGER_PHOTO_ID_5089977260964333122" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://4.bp.blogspot.com/_KukQ8TlQMz8/RqM7dtqYRlI/AAAAAAAAAJo/zNz9z9DrFtw/s1600-h/100_4754.jpg"&gt;&lt;img style="margin: 0pt 10px 10px 0pt; float: left; cursor: pointer;" src="http://4.bp.blogspot.com/_KukQ8TlQMz8/RqM7dtqYRlI/AAAAAAAAAJo/zNz9z9DrFtw/s320/100_4754.jpg" alt="" id="BLOGGER_PHOTO_ID_5089977385518384722" border="0" /&gt;&lt;/a&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://1.bp.blogspot.com/_KukQ8TlQMz8/RqM7i9qYRmI/AAAAAAAAAJw/j390EuONmEA/s1600-h/100_4755.jpg"&gt;&lt;img style="margin: 0pt 10px 10px 0pt; float: left; cursor: pointer;" src="http://1.bp.blogspot.com/_KukQ8TlQMz8/RqM7i9qYRmI/AAAAAAAAAJw/j390EuONmEA/s320/100_4755.jpg" alt="" id="BLOGGER_PHOTO_ID_5089977475712697954" border="0" /&gt;&lt;/a&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/2311776355674459132-4482939350739514839?l=michaelneale.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/2311776355674459132/posts/default/4482939350739514839'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/2311776355674459132/posts/default/4482939350739514839'/><link rel='alternate' type='text/html' href='http://michaelneale.blogspot.com/2007/07/new-toys.html' title='New Toys'/><author><name>Michael Neale</name><uri>http://www.blogger.com/profile/14670410000512777421</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='30' src='http://www.users.on.net/~michaelneale/michael.jpg'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://1.bp.blogspot.com/_KukQ8TlQMz8/RqM8U9qYRnI/AAAAAAAAAJ4/7YgokIBxMSo/s72-c/100_4750.jpg' height='72' width='72'/></entry><entry><id>tag:blogger.com,1999:blog-2311776355674459132.post-1280217820627639941</id><published>2007-06-28T00:52:00.000-07:00</published><updated>2007-07-03T23:28:38.522-07:00</updated><title type='text'>Google Developer Day 2007 (Sydney)</title><content type='html'>I managed to get to the Google Developer Day mini-conference in Sydney, was well worth the trip, and much better then a poke in the eye.&lt;br /&gt;&lt;br /&gt;Its interesting that in the past it was Sun, Microsoft, Oracle etc hosting these sort of corporate sponsored developer events, now its google that seems to have taken the mantle. It was a great turn out, a surprising amount of energy. Its now clear to me that Google are one of the New Platforms (perhaps the biggest one) that makes operating systems, if not irrelevant, then less central then they were. The network truly is the computer (finally).&lt;br /&gt;&lt;br /&gt;My take aways:&lt;br /&gt;&lt;br /&gt;&lt;ul&gt;&lt;li&gt;Atom is an important protocot. Its behind all GData stuff. Atom + REST == good ! I wish I had time to look more into Atom, but it looks like its based on concepts that I agree with.&lt;/li&gt;&lt;li&gt;If you want to write apps for The Google Platform, Gadgets are the way !&lt;/li&gt;&lt;li&gt;Google gears was announced - 'nuf said ! The interesting thing for me was their worker pool and message based concurrency for multi threading - that will result in much less broken apps then modifying Javascript itself to cope with threads. I like that.&lt;/li&gt;&lt;li&gt;Lots was said of the greatness of GWT - I already knew all that (as a user) - GWT is something I thought I would hate, but it seems to work well in all the right ways (it has shocked me). Google are very keen on this (especially for their larger team apps). It was interesting that Java was chosen entirely for tooling, not cause its a great language (as a language it has lots of well documented failings - which are slowly being addressed - not fast enough for my taste though). It is a users first toolkit (not developers) - its hard to make an unresponsive GUI with GWT - and CSS for layout and design is a sweet spot (although I am not that great at it myself).&lt;/li&gt;&lt;li&gt;Google want to make targeted, isolated strategic improvements to the browser, not replace it. Hence the gears design approach. I like that, well, actually I don't know any better but I would guess Google know what they are talking about. &lt;/li&gt;&lt;/ul&gt;&lt;br /&gt;&lt;br /&gt;Here is a happy snap of me (on the left) and Shane Bryzak (from JBoss) on the right:&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://2.bp.blogspot.com/_KukQ8TlQMz8/Ros9zxMJgpI/AAAAAAAAAIw/C8Y_38eeokc/s1600-h/GoogleDD07.jpg"&gt;&lt;img style="margin: 0px auto 10px; display: block; text-align: center; cursor: pointer;" src="http://2.bp.blogspot.com/_KukQ8TlQMz8/Ros9zxMJgpI/AAAAAAAAAIw/C8Y_38eeokc/s320/GoogleDD07.jpg" alt="" id="BLOGGER_PHOTO_ID_5083224564004651666" border="0" /&gt;&lt;/a&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/2311776355674459132-1280217820627639941?l=michaelneale.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/2311776355674459132/posts/default/1280217820627639941'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/2311776355674459132/posts/default/1280217820627639941'/><link rel='alternate' type='text/html' href='http://michaelneale.blogspot.com/2007/06/google-developer-day-2007-sydney.html' title='Google Developer Day 2007 (Sydney)'/><author><name>Michael Neale</name><uri>http://www.blogger.com/profile/14670410000512777421</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='30' src='http://www.users.on.net/~michaelneale/michael.jpg'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://2.bp.blogspot.com/_KukQ8TlQMz8/Ros9zxMJgpI/AAAAAAAAAIw/C8Y_38eeokc/s72-c/GoogleDD07.jpg' height='72' width='72'/></entry><entry><id>tag:blogger.com,1999:blog-2311776355674459132.post-1010477521876599407</id><published>2007-06-24T20:05:00.000-07:00</published><updated>2007-06-27T00:17:30.877-07:00</updated><title type='text'>creating languages and syntax error messages</title><content type='html'>One of the hardest things I know from experience about creating new languages, is how to report error messages (syntax) in a helpful way (ie reduces peoples urge to hunt down and kill you).&lt;br /&gt;&lt;br /&gt;The current trend to create DSLs willy nilly (yes, I like using the term willy nilly) is that there is scant regard for this - I hope this doesn't mean there is a legacy of apps out there which will doom their maintainers to years of pain and frustration (I am afraid it will). DSLs are really nice, but they do cause frustration.&lt;br /&gt;&lt;br /&gt;Unfortunately, I don't really know the answer to this. I know I have my favorite compilers in terms of nice messages, and my least favorite (good == most python interpreters, bad == ruby, good == JDT from Eclipse, bad == any open source Common Lisp implementation I have tried to date, good==guile - its scheme, but it doesn't freak me out when I do something silly).&lt;br /&gt;&lt;br /&gt;I wish I know what made things good or bad. Maybe its taste - I tend to prefer syntax error messages which are less jargon and more plain language explanation, often with suggestions. I guess if you have and take the time to master a language, it kind of blends into the background, so perhaps thats why people don't tend to focus on it as much as I think they should.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/2311776355674459132-1010477521876599407?l=michaelneale.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/2311776355674459132/posts/default/1010477521876599407'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/2311776355674459132/posts/default/1010477521876599407'/><link rel='alternate' type='text/html' href='http://michaelneale.blogspot.com/2007/06/creating-languages-and-syntax-error.html' title='creating languages and syntax error messages'/><author><name>Michael Neale</name><uri>http://www.blogger.com/profile/14670410000512777421</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='30' src='http://www.users.on.net/~michaelneale/michael.jpg'/></author></entry><entry><id>tag:blogger.com,1999:blog-2311776355674459132.post-922809481144183384</id><published>2007-05-28T15:32:00.000-07:00</published><updated>2007-06-03T00:46:23.249-07:00</updated><title type='text'>Ruby talk - RubyGnome2/GTK</title><content type='html'>I spoke at Brisbane.rb meetup recently (Brisbane Ruby Brigade). I did half the talk - showing off what you can do with RubyGnome2.&lt;br /&gt;&lt;br /&gt;As promised, here are some resources/examples for getting started with it. Lots of the examples out there neglect the "Gtk.init" call, which is annoying, probably stops a lot of people in their tracks, but in any case, the following should work well.&lt;br /&gt;&lt;br /&gt;I found that a lot of the examples on the web either didn't work as advertised, or just had typos, or were missing Gtk.init call. So here I my examples that I promised worked for me ! (and I have witnesses to prove it !). You will need the ruby GTK2 stuff installed, and libglade2 for ruby as well.&lt;br /&gt;The presentation + example files are &lt;a href="http://www.users.on.net/%7Emichaelneale/work/ruby-gtk-gui-talk.zip"&gt;here&lt;/a&gt;.&lt;br /&gt;&lt;br /&gt;I keep some handy articles on &lt;a href="http://del.icio.us/michaelneale/ruby+gtk"&gt;del.icio.us/michaelneale/ruby+gtk.&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;For a really simple example, my "DSL" for a form was:&lt;br /&gt;&lt;br /&gt;&lt;span style="font-family:courier new;"&gt;input_data = {&lt;br /&gt;               :name =&gt; "Michael",&lt;br /&gt;               :age =&gt; 42,&lt;br /&gt;               :topping =&gt; "Chilli",&lt;br /&gt;               :drink =&gt; "Beer"&lt;br /&gt;            }&lt;br /&gt;&lt;br /&gt;popup_dialog :data =&gt; input_data,&lt;br /&gt;      :icon =&gt; "hoff.jpeg",&lt;br /&gt;      :actions =&gt; {&lt;br /&gt;                       :quit =&gt; lambda { Gtk.main_quit },&lt;br /&gt;                    :dump =&gt; lambda { puts input_data.to_s }&lt;br /&gt;                  }&lt;/span&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/2311776355674459132-922809481144183384?l=michaelneale.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/2311776355674459132/posts/default/922809481144183384'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/2311776355674459132/posts/default/922809481144183384'/><link rel='alternate' type='text/html' href='http://michaelneale.blogspot.com/2007/05/ruby-talk-rubygnome2gtk.html' title='Ruby talk - RubyGnome2/GTK'/><author><name>Michael Neale</name><uri>http://www.blogger.com/profile/14670410000512777421</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='30' src='http://www.users.on.net/~michaelneale/michael.jpg'/></author></entry><entry><id>tag:blogger.com,1999:blog-2311776355674459132.post-2476420755870321931</id><published>2007-05-23T23:34:00.000-07:00</published><updated>2007-05-23T23:41:08.449-07:00</updated><title type='text'>Jython is alive and Kicking !!</title><content type='html'>Mark (Proctor) got an email from Frank Wierdbicki - who (as it turns out) is a colleague at Red Hat. He is the Jython lead. For some time now I have heard (and probably propagated the myth) that Jython has kind of petered out.&lt;br /&gt;&lt;br /&gt;That is not so ! Frank has a &lt;a href="http://fwierzbicki.blogspot.com/"&gt;blog&lt;/a&gt;, and is actively getting Jython up to speed for a new release. They had to play some catchup with CPython (the official version anyway) and some major re-engineering meant it looked like they went quiet.&lt;br /&gt;&lt;br /&gt;But they are on the case, and Frank seems like he is on this full time, which is great. He also mentioned that he has been in touch with Charles Nutter from the JRuby project to see what dynamic JVM tricks that can share, and how to make the JRE a better environment for dynamic languages.&lt;br /&gt;&lt;br /&gt;I have a growing affection with Python of late (nothing to do with Java) so this is also good news for me.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/2311776355674459132-2476420755870321931?l=michaelneale.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/2311776355674459132/posts/default/2476420755870321931'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/2311776355674459132/posts/default/2476420755870321931'/><link rel='alternate' type='text/html' href='http://michaelneale.blogspot.com/2007/05/jython-is-alive-and-kicking.html' title='Jython is alive and Kicking !!'/><author><name>Michael Neale</name><uri>http://www.blogger.com/profile/14670410000512777421</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='30' src='http://www.users.on.net/~michaelneale/michael.jpg'/></author></entry><entry><id>tag:blogger.com,1999:blog-2311776355674459132.post-6494498232047897527</id><published>2007-05-07T22:44:00.000-07:00</published><updated>2007-05-07T22:47:02.973-07:00</updated><title type='text'>AJAX frameworks are NOT pointless</title><content type='html'>&lt;div class="commentTop"&gt;The following was from a Slashdot post, incredibly detailed, but is a great analysis on why ajax is harder then meets the eye, and why you should use a mature framework for it.&lt;br /&gt;(from &lt;a href="http://developers.slashdot.org/comments.pl?sid=233203&amp;cid=18972115"&gt;here&lt;/a&gt;.)&lt;br /&gt;--------------------------------------------------------------------------------------------&lt;br /&gt; &lt;div class="title"&gt;    &lt;h4&gt;&lt;a name="18972115"&gt;AJAX frameworks are NOT pointless&lt;/a&gt;&lt;/h4&gt;       &lt;span id="comment_score_18972115" class="score"&gt;&lt;br /&gt;&lt;/span&gt;   &lt;/div&gt;   &lt;div class="details"&gt;    by &lt;a href="http://slashdot.org/%7Efrancium+de+neobie"&gt;francium de neobie (590783)&lt;/a&gt;     &lt;span class="otherdetails" id="comment_otherdetails_18972115"&gt;     on Thursday May 03, @10:24AM (&lt;a href="http://developers.slashdot.org/comments.pl?sid=233203&amp;amp;cid=18972115"&gt;#18972115&lt;/a&gt;)   &lt;small&gt;&lt;br /&gt;(&lt;a href="http://martinkou.blogspot.com/"&gt;http://martinkou.blogspot.com/&lt;/a&gt;) &lt;/small&gt; &lt;/span&gt;   &lt;/div&gt;  &lt;/div&gt;  &lt;div class="commentBody"&gt;    &lt;div id="comment_body_18972115"&gt;There are many little funny things that just happens when you're coding a web application in JavaScript without a framework/library/toolkit helping you. Unless you're really an AJAX/JavaScript wizard, coding an AJAX-enabled web application on your own and mixing online code receipts is a very dangerous thing to do.&lt;br /&gt;&lt;br /&gt;&lt;b&gt;Browser inconsistencies&lt;/b&gt;&lt;br /&gt;This is the most obvious one, but only the entry to the rabbit hole. If you are not familiar with the example (maybe not exactly the same, but any AJAX web developer worth his salt should have seen one like that) I give below, then please, PLEASE, do yourself, your fellow developers and your users a favor, resist the urge to hack things together for once, use a mature AJAX framework.&lt;br /&gt;&lt;br /&gt;An important part of AJAX is that you need to update what is displayed on the web browser in the client side (by JavaScript), without refreshing the page. This implies that you're very likely to have to create and destroy DOM nodes on the fly. Now, how do you create a radio button in JavaScript?&lt;br /&gt;&lt;br /&gt;How about...&lt;br /&gt;&lt;blockquote&gt; &lt;div&gt;&lt;tt&gt;var node = document.createElement("input");&lt;br /&gt;node.type = "radio"&lt;br /&gt;node.name =&lt;nobr&gt; &lt;wbr&gt;&lt;/nobr&gt;...&lt;br /&gt;node.value =&lt;nobr&gt; &lt;wbr&gt;&lt;/nobr&gt;...&lt;/tt&gt;&lt;/div&gt; &lt;/blockquote&gt;&lt;br /&gt;That's what you would do if you follow the DOM standard. But sorry, this does not work. Try to create a radio button with the above code segment in Internet Explorer 6, you'll get a broken radio button - you can't select it. The correct way to create a radio button by DOM manipulation is described in &lt;a href="http://msdn2.microsoft.com/en-us/library/ms536389.aspx" title="microsoft.com"&gt;this MSDN article&lt;/a&gt; [microsoft.com]:&lt;blockquote&gt; &lt;div&gt;&lt;tt&gt;newRadioButton = document.createElement("&lt;input name="'RADIOTEST'" value="'Second" type="'RADIO'"&gt;")&lt;/tt&gt;&lt;/div&gt; &lt;/blockquote&gt;&lt;br /&gt;&lt;br /&gt;&lt;b&gt;Memory leaks&lt;/b&gt;&lt;br /&gt;The last one was easy. Do you know you can make a web application that leaks memory like a sieve in Internet Explorer 6 by making a simple circular reference like the following one?&lt;blockquote&gt; &lt;div&gt;&lt;tt&gt;var node = document.createElement("div");&lt;br /&gt;node.someAttr = node;&lt;/tt&gt;&lt;/div&gt; &lt;/blockquote&gt; If you're a good programmer, I might have sounded an alarm in your head right now - any circular references involving DOM nodes in IE6 results in memory leaks that persist after URL changes or page refreshes - unless you use an AJAX toolkit that takes care of the issue for you. Have you assigned a DOM as an attribute value under another DOM node in the past? Yes? Then you'd better check your web application for memory leaks with &lt;a href="http://www.outofhanwell.com/ieleak/index.php?title=Main_Page" title="outofhanwell.com"&gt;Drip&lt;/a&gt; [outofhanwell.com], now.&lt;br /&gt;&lt;br /&gt;What's more, it's not just assigning DOM nodes as attributes that would result in memory leaks, closures in JavaScript can also form circular references and cause memory leaks. What makes closures particularly dangerous is that circular references with closures are not easy to spot. For example, the following code segment leaks:&lt;blockquote&gt; &lt;div&gt;&lt;tt&gt;var node = document.createElement("div");&lt;br /&gt;var clickHandler = function(){};&lt;br /&gt;node.onclick = clickHandler;&lt;/tt&gt;&lt;/div&gt; &lt;/blockquote&gt; Looks innocent enough, but you've already formed a leaky circular reference here. node-&gt;clickHandler-&gt;node.&lt;br /&gt;&lt;br /&gt;For more information about memory leaks under IE6, read these:&lt;br /&gt;&lt;a href="http://www.bazon.net/mishoo/articles.epl?art_id=824" title="bazon.net"&gt;Mihai Bazon's blog entry&lt;/a&gt; [bazon.net]&lt;br /&gt;&lt;a href="http://msdn.microsoft.com/library/en-us/IETechCol/dnwebgen/ie_leak_patterns.asp?frame=true" title="microsoft.com"&gt;MSDN's lengthy and confusing description of the problem &lt;/a&gt; [microsoft.com]&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;b&gt;The XMLHttpRequest object is not as simple as you think&lt;/b&gt;&lt;br /&gt;Much of the magic of AJAX comes from the XMLHttpRequest object (or its ActiveX equivalent, or an iframe, etc.), right? Sure. If you're only doing something simple via AJAX (like, updating the server time), then you can just copy an XMLHttpRequest code snippet from &lt;a href="http://developer.apple.com/internet/webcontent/xmlhttpreq.html" title="apple.com"&gt;sites like this&lt;/a&gt; [apple.com] and hack away, right?&lt;br /&gt;&lt;br /&gt;Wrong! Those XMLHttpRequest code snippets are one of the very reasons why people are thinking AJAX as a hack - it sometimes doesn't work! The XMLHttpRequest code snippet given on Apple's site can be broken in commonly encountered situations, and you can simulate that yourself:&lt;br /&gt;&lt;br /&gt;&lt;ol&gt;&lt;li&gt;Write a simple AJAX web application that retrieves and displays the current server time on a web browser using Apple's code snippet.&lt;/li&gt;&lt;li&gt;Test it yourself under normal conditions. So it works and it's safe to use, right? Let's see...&lt;/li&gt;&lt;li&gt;Change your computer's routing table such that you can have no route to the web server.&lt;/li&gt;&lt;li&gt;Now test your application again in Firefox. Your application should fail. But does it fail gracefully? No. You see an error message in Firefox's error console stating that the XMLHttpRequest object's status attribute cannot be read. If you have coded something to handle AJAX request failures, your handler won't be called.&lt;/li&gt;&lt;/ol&gt; Why is that happening? It is because, any socket errors happening during an AJAX request will cause the onreadystatechange handler to be called under Firefox, yet the status attribute cannot be read. Reading it causes a JavaScript error and stops JavaScript execution (unless you add a try...catch... block there, but that assumes you already know about the problem so it's moot)! Under Internet Explorer, reading the status attribute in the same situation gives you the socket error code instead. Don't know about these stuff? Please, use a mature AJAX framework.&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;b&gt;Performance problems&lt;/b&gt;&lt;br /&gt;Coding AJAX applications is just like writing things in C++ or Java - so long as you're using efficient algorithms, your application should run fast, right?&lt;br /&gt;&lt;br /&gt;Of course, you are wrong again. Let's say... in some part of your application, you want to concatenate a lot of string fragments together to form a long string in a for loop, how do you do it? How about...&lt;blockquote&gt; &lt;div&gt;&lt;tt&gt;var targetString = "";&lt;br /&gt;for(var i=0;i&lt;somearray.length;i++) targetstring=""&gt;&lt;/somearray.length;i++)&gt;&lt;/tt&gt;&lt;/div&gt;&lt;tt&gt; &lt;/tt&gt;&lt;/blockquote&gt;&lt;tt&gt; That's the way most programmers would think of, intuitively. But the performance of that sucks under Internet Explorer. The correct way to combine strings under JavaScript is to use the Array.join() operation. You can read more about this &lt;a href="http://www.comet.co.il/en/articles/performance/article.html" title="comet.co.il"&gt;here&lt;/a&gt; [comet.co.il]. The optimization I talked about is also implemented in Dojo Toolkit (kudos to Alex Russell), and I believe any reasonably robust AJAX framework should have it too. Not knowing about such problems, had you hacked together a fairly sophisticated AJAX web application yourself, you would be running into performance hell sooner or later.&lt;br /&gt;&lt;br /&gt;Taking 646ms to combine strings still doesn't sound very slow for you, right? There are many more performance traps in JavaScript. Do you know there's a very significant performance difference between the following two code snippets?&lt;br /&gt;&lt;br /&gt;First code snippet:&lt;/tt&gt;&lt;blockquote&gt;&lt;div&gt;&lt;nobr&gt;&lt;tt&gt; &lt;wbr&gt;&lt;/tt&gt;&lt;/nobr&gt;&lt;tt&gt;&lt;tt&gt;// placing 5000 "Hello World" messages in random positions&lt;br /&gt;for(var i=0;i&lt;5000;i++) node =" document.createElement(" position = "absolute" left =" parseInt(Math.random()" top =" parseInt(Math.random()"&gt;&lt;/tt&gt;&lt;/tt&gt;&lt;/div&gt;&lt;tt&gt;&lt;tt&gt; &lt;/tt&gt;&lt;/tt&gt;&lt;/blockquote&gt;&lt;tt&gt;&lt;tt&gt; Second code snippet:&lt;/tt&gt;&lt;/tt&gt;&lt;blockquote&gt;&lt;div&gt;&lt;nobr&gt;&lt;tt&gt;&lt;tt&gt; &lt;wbr&gt;&lt;/tt&gt;&lt;/tt&gt;&lt;/nobr&gt;&lt;tt&gt;&lt;tt&gt;&lt;tt&gt;// placing 5000 "Hello World" messages in random positions&lt;br /&gt;for(var i=0;i&lt;5000;i++) node =" document.createElement(" position = "absolute" left =" parseInt(Math.random()" top =" parseInt(Math.random()"&gt;&lt;/tt&gt;&lt;/tt&gt;&lt;/tt&gt;&lt;/div&gt;&lt;tt&gt;&lt;tt&gt;&lt;tt&gt; &lt;/tt&gt;&lt;/tt&gt;&lt;/tt&gt;&lt;/blockquote&gt;&lt;tt&gt;&lt;tt&gt;&lt;tt&gt;&lt;br /&gt;&lt;br /&gt;The only difference between the two code snippets is the placement of the document.body.appendChild() line. But if you actually test them out, the second code snippet is much faster, under both IE and Firefox. The performance difference has nothing to do with your algorithms - you just shuffled one line of code around; it has to do with how the browser render the randomly placed DIV nodes. Ever wondered why your hacked together web application is taking half a minute running JavaScript after all the files are loaded?&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;So, unless you're already a programming god or don't mind spending lots of time solving bugs that you shouldn't have solved; you really, really should use some of these AJAX frameworks if you're making anything fairly sophisticated with AJAX.&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;Disclaimer: I'm also a developer of an AJAX toolkit myself, but I did that for my &lt;a href="https://fypms.cse.ust.hk/registration_summary.php" title="cse.ust.hk"&gt;final year project (project group DE3)&lt;/a&gt; [cse.ust.hk] in my university. So it's more a project for fun rather than a serious contender to industry strength toolkits like GWT or Dojo. My project website: &lt;a href="http://wt-toolkit.sourceforge.net/" title="sourceforge.net"&gt;WT Toolkit&lt;/a&gt; [sourceforge.net].&lt;/tt&gt;&lt;/tt&gt;&lt;/tt&gt;&lt;/div&gt;&lt;tt&gt;&lt;tt&gt;&lt;tt&gt;  &lt;/tt&gt;&lt;/tt&gt;&lt;/tt&gt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/2311776355674459132-6494498232047897527?l=michaelneale.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/2311776355674459132/posts/default/6494498232047897527'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/2311776355674459132/posts/default/6494498232047897527'/><link rel='alternate' type='text/html' href='http://michaelneale.blogspot.com/2007/05/ajax-frameworks-are-not-pointless.html' title='AJAX frameworks are NOT pointless'/><author><name>Michael Neale</name><uri>http://www.blogger.com/profile/14670410000512777421</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='30' src='http://www.users.on.net/~michaelneale/michael.jpg'/></author></entry><entry><id>tag:blogger.com,1999:blog-2311776355674459132.post-3168367565321493396</id><published>2007-04-13T05:49:00.000-07:00</published><updated>2007-04-13T05:54:33.937-07:00</updated><title type='text'>Rules with Spring</title><content type='html'>Its odd, normally google searches work quite well into our Wiki (JBoss Rules), but for some reason when serching spring, it doesn't show up &lt;a href="http://wiki.jboss.org/wiki/Wiki.jsp?page=RulesWithSpringFramework"&gt;this&lt;/a&gt;.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/2311776355674459132-3168367565321493396?l=michaelneale.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/2311776355674459132/posts/default/3168367565321493396'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/2311776355674459132/posts/default/3168367565321493396'/><link rel='alternate' type='text/html' href='http://michaelneale.blogspot.com/2007/04/rules-with-spring.html' title='Rules with Spring'/><author><name>Michael Neale</name><uri>http://www.blogger.com/profile/14670410000512777421</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='30' src='http://www.users.on.net/~michaelneale/michael.jpg'/></author></entry><entry><id>tag:blogger.com,1999:blog-2311776355674459132.post-6487533951016446417</id><published>2007-04-06T21:36:00.000-07:00</published><updated>2007-04-06T21:38:07.735-07:00</updated><title type='text'>Is.This.A.Type.Or.A.Method.Or.What ?</title><content type='html'>The title of this post is a comment on the stupidity of Microsoft's contrarian coding standards they adopt for C# in particular, just to avoid camelCase, or even acknowledging that Java ever existed.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/2311776355674459132-6487533951016446417?l=michaelneale.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/2311776355674459132/posts/default/6487533951016446417'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/2311776355674459132/posts/default/6487533951016446417'/><link rel='alternate' type='text/html' href='http://michaelneale.blogspot.com/2007/04/isthisatypeoramethodorwhat.html' title='Is.This.A.Type.Or.A.Method.Or.What ?'/><author><name>Michael Neale</name><uri>http://www.blogger.com/profile/14670410000512777421</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='30' src='http://www.users.on.net/~michaelneale/michael.jpg'/></author></entry><entry><id>tag:blogger.com,1999:blog-2311776355674459132.post-2486253933420205340</id><published>2007-04-04T15:40:00.000-07:00</published><updated>2007-04-04T15:55:45.676-07:00</updated><title type='text'>The Language of the Year</title><content type='html'>For some time now I have tried to follow the dogma of the &lt;a href="http://www.pragmaticprogrammer.com/"&gt;Pragmatic Programmers.&lt;/a&gt;&lt;br /&gt;Specificially, the learn one new programming language a year (I am sure I am not the only one to notice the irony of the increasing dogma that the PP guys are emitting, but it doesn't really bother me too much, they need to sell books, and their advice is great anyway).&lt;br /&gt;&lt;br /&gt;&lt;ul&gt;&lt;li&gt;So 2005 was the year of C#, well that took all of 10 minutes.&lt;br /&gt;&lt;/li&gt;&lt;li&gt;2006 was the year of Ruby - I feel I have come close to mastering Ruby - mainly I tackled the meta programming and other areas that I found trickiest, and the rest seems like gravy.&lt;/li&gt;&lt;li&gt;2007 Lisp&lt;br /&gt;&lt;/li&gt;&lt;/ul&gt;&lt;br /&gt;I have been a ruby fan since 2000, since it became "cool" around 2004 I kind of moved away from the hype though, but things have calmed down a bit. Ruby is an easy language to use to get stuff done. Recently I have been also dabbling with python for the same things to keep it fresh (please don't hate me !).&lt;br /&gt;&lt;br /&gt;But, 2007 is the year of Lisp (2006 I dabbled, as I had to, to learn a sub dialect of Lisp - CLIPS). My attention is wavering towards Haskell though, I feel the need for functional purity to clean my mind, as Lisp seems to be capable of anything, it could well blow my mind. But, so far, so good.&lt;br /&gt;&lt;br /&gt;Not many people know that the first programming language I learnt properly was Miranda, and I hated every second of it. Many people theorise that we could get better teaching results by teaching student FP first - well, I am only a single datapoint, but it didn't work that great for me. It scared me off the "purer" aspects of CS and more into engineering, where C was a higher level tool for when you couldn't handle the ASM (and C made soooo much more sense, as did pascal, modula 2, anything imperative). So for me, the FP myth was busted, but as I said, just a single data point.&lt;br /&gt;&lt;br /&gt;But now I am ready, and besides, a need an academic excuse to get that multi core laptop I want.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/2311776355674459132-2486253933420205340?l=michaelneale.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/2311776355674459132/posts/default/2486253933420205340'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/2311776355674459132/posts/default/2486253933420205340'/><link rel='alternate' type='text/html' href='http://michaelneale.blogspot.com/2007/04/language-of-year.html' title='The Language of the Year'/><author><name>Michael Neale</name><uri>http://www.blogger.com/profile/14670410000512777421</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='30' src='http://www.users.on.net/~michaelneale/michael.jpg'/></author></entry><entry><id>tag:blogger.com,1999:blog-2311776355674459132.post-7861589934658813891</id><published>2007-03-24T21:22:00.000-07:00</published><updated>2007-03-24T21:34:26.532-07:00</updated><title type='text'>Trademark hyperbole</title><content type='html'>The dark clouds of a FUD storm have appeared, and rained, regarding Red Hat sending out a letter about Hibernate trade mark infringments.&lt;br /&gt;&lt;br /&gt;Below I have a quote from Mark Webbink, our friendly general council pimp (thats a lawyer - a law-talking guy).&lt;br /&gt;&lt;br /&gt;Basically to spell it out clearly, here it is:&lt;br /&gt;&lt;br /&gt;&lt;ul&gt;&lt;li&gt;&lt;span style="font-weight: bold;"&gt;NAUGHTY USAGE OF TRADEMARK:&lt;/span&gt;&lt;/li&gt;&lt;ul&gt;&lt;li&gt;&lt;span style="font-weight: bold;"&gt;   &lt;/span&gt;&lt;span style="font-style: italic;"&gt;Hibernate Training&lt;/span&gt;&lt;/li&gt;&lt;/ul&gt;&lt;li&gt;&lt;span style="font-weight: bold;"&gt;GOOD USAGE OF TRADEMARK&lt;/span&gt;&lt;span style="font-style: italic;"&gt;&lt;span style="font-weight: bold;"&gt;&lt;span style="font-style: italic;"&gt;&lt;span style="font-style: italic;"&gt;&lt;span style="font-style: italic;"&gt;:&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/li&gt;&lt;ul&gt;&lt;li&gt;&lt;span style="font-style: italic;"&gt;&lt;span style="font-weight: bold;"&gt;&lt;span style="font-style: italic;"&gt;&lt;span style="font-style: italic;"&gt;&lt;span style="font-style: italic;"&gt;   &lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="font-style: italic;"&gt;&lt;span style="font-style: italic;"&gt;&lt;span style="font-style: italic;"&gt;Hibernate (R) Object Relational software training&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/li&gt;&lt;/ul&gt;&lt;/ul&gt;&lt;span style="font-style: italic;"&gt;&lt;span style="font-style: italic;"&gt;&lt;span style="font-style: italic;"&gt;&lt;span style="font-style: italic;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;Yes, the differences are subtle, get over it. Even the Apache Foundation will defend its trademarks in the same fashion. An guess what, law is subtle, and fussy about syntax - just like a compiler !&lt;br /&gt;&lt;br /&gt;You can of course become a partner and then you are licensed to use the trademark fully- its part of the value of being a partner.&lt;br /&gt;&lt;br /&gt;OK, well Mark's response appears below in full:&lt;br /&gt;&lt;br /&gt;&lt;span style="font-style: italic;"&gt;"I am writing to clarify the issues raised by the publication of Ms. Robertson's communication on behalf of Red Hat. First, the letter is not placed into the context of the situation it was addressing. That presents the opportunity for misinterpretation. At the same time, I would agree that the letter is less than precise in defining what has been done wrong and the corrective action that is required. Ultimately, that is my fault as the person in charge of trademark enforcement at Red Hat. &lt;/span&gt;&lt;br /&gt; &lt;br /&gt;&lt;div style="text-align: left;"&gt;&lt;span style="font-style: italic;"&gt;Contrary to Gavin's statements above, you cannot offer HIBERNATE Training or JBOSS Training. This is an improper use of Red Hat trademarks in that the marks are being used (a) either as nouns or (b) to promote a good or service that is directly branded with Red Hat owned marks. What is permissable, and I am sure this is what Gavin meant, is that you are permitted to offer HIBERNATE(R) Object Relational Mapping Software Training or, as another example, JBoss(R) Application Server Training. Here the marks are being applied to the goods in a proper manner and it is clear that the training is being provided for that branded technology, not by the brand owner. As a further common courtesy, it would also be appropriate for those properly using the marks in this manner to make clear that they are not in anyway associated with Red Hat or its JBoss Division. &lt;/span&gt;&lt;br /&gt; &lt;br /&gt;&lt;span style="font-style: italic;"&gt;With that clarification I hope I have resolved the confusion and/or discontent around this issue. More extensive information on the permitted uses of Red Hat marks can be found at http://www.redhat.com/about/companyprofile/trademark/ &lt;/span&gt;&lt;br /&gt; &lt;br /&gt;&lt;span style="font-style: italic;"&gt;I would also ask, as a courtesy to Ms. Robertson, that the party who posted her letter please indicate that they were the party posting the letter, not Ms. Robertson. &lt;/span&gt;&lt;br /&gt; &lt;br /&gt;&lt;span style="font-style: italic;"&gt;My apologies for any confusion that has been caused. "&lt;/span&gt;&lt;br /&gt; &lt;br /&gt;&lt;span style="font-style: italic;"&gt;Mark Webbink &lt;/span&gt;&lt;br /&gt;&lt;span style="font-style: italic;"&gt;Deputy General Counsel &lt;/span&gt;&lt;br /&gt;&lt;span style="font-style: italic;"&gt;Red Hat, Inc.&lt;br /&gt;&lt;br /&gt;&lt;/span&gt;OK - everyone happy now? Defcon 1 again? calm down, take a deep breath. Nothing to see here.&lt;span style="font-style: italic;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/2311776355674459132-7861589934658813891?l=michaelneale.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/2311776355674459132/posts/default/7861589934658813891'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/2311776355674459132/posts/default/7861589934658813891'/><link rel='alternate' type='text/html' href='http://michaelneale.blogspot.com/2007/03/trademark-hyperbole.html' title='Trademark hyperbole'/><author><name>Michael Neale</name><uri>http://www.blogger.com/profile/14670410000512777421</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='30' src='http://www.users.on.net/~michaelneale/michael.jpg'/></author></entry><entry><id>tag:blogger.com,1999:blog-2311776355674459132.post-5283953612930365741</id><published>2007-01-20T20:30:00.000-08:00</published><updated>2007-01-20T20:51:58.507-08:00</updated><title type='text'>The future of storage</title><content type='html'>Is &lt;a href="http://pressesc.com/01169313759_image_on_photon"&gt;here&lt;/a&gt;.&lt;br /&gt;&lt;br /&gt;And I survived the trip back home.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/2311776355674459132-5283953612930365741?l=michaelneale.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/2311776355674459132/posts/default/5283953612930365741'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/2311776355674459132/posts/default/5283953612930365741'/><link rel='alternate' type='text/html' href='http://michaelneale.blogspot.com/2007/01/future-of-storage.html' title='The future of storage'/><author><name>Michael Neale</name><uri>http://www.blogger.com/profile/14670410000512777421</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='30' src='http://www.users.on.net/~michaelneale/michael.jpg'/></author></entry><entry><id>tag:blogger.com,1999:blog-2311776355674459132.post-820315352297117455</id><published>2007-01-14T12:47:00.000-08:00</published><updated>2007-01-14T12:48:22.454-08:00</updated><title type='text'>Relocation relocation</title><content type='html'>Well its time, have had a blast in London. But time to return to the land down under. See you all on the other side (man I hate flying).&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/2311776355674459132-820315352297117455?l=michaelneale.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/2311776355674459132/posts/default/820315352297117455'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/2311776355674459132/posts/default/820315352297117455'/><link rel='alternate' type='text/html' href='http://michaelneale.blogspot.com/2007/01/relocation-relocation.html' title='Relocation relocation'/><author><name>Michael Neale</name><uri>http://www.blogger.com/profile/14670410000512777421</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='30' src='http://www.users.on.net/~michaelneale/michael.jpg'/></author></entry><entry><id>tag:blogger.com,1999:blog-2311776355674459132.post-3044830483047822661</id><published>2007-01-05T01:24:00.000-08:00</published><updated>2007-01-05T01:33:53.937-08:00</updated><title type='text'>Voice quality on phones</title><content type='html'>I am a little old fashioned, and still occasionally like to use a phone for, well, speaking to other people. My wife is nagging for a black berry (I am avoiding them), and I think the mobile tech is great.&lt;br /&gt;&lt;br /&gt;But, why is voice quality so bad? Someone decided long ago, that only 300Hz to 3kHz was needed to reproduce the human voice for verbal communication. BOLLOCKS ! This was an engineering compromise with the amazingly primitive tech they had at the time. Yet nothing has changed. It kind of makes commercial sense these days to limit bandwidth, but still, why can't I PAY for MORE quality? I want to talk to someone and hear every nuance and sigh as they smirk at my clueless-ness. &lt;br /&gt;&lt;br /&gt;I would be happy to pay a premium to be able to have premium quality voice connections when I need it. Otherwise, I just prefer IM and email, communication over the phone is futile.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/2311776355674459132-3044830483047822661?l=michaelneale.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/2311776355674459132/posts/default/3044830483047822661'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/2311776355674459132/posts/default/3044830483047822661'/><link rel='alternate' type='text/html' href='http://michaelneale.blogspot.com/2007/01/voice-quality-on-phones.html' title='Voice quality on phones'/><author><name>Michael Neale</name><uri>http://www.blogger.com/profile/14670410000512777421</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='30' src='http://www.users.on.net/~michaelneale/michael.jpg'/></author></entry><entry><id>tag:blogger.com,1999:blog-2311776355674459132.post-3176273620185432546</id><published>2007-01-04T01:37:00.000-08:00</published><updated>2007-01-04T01:52:54.195-08:00</updated><title type='text'>Climbing the charts</title><content type='html'>Was doing some ego surfing, and I noticed &lt;a href="http://www.users.on.net/%7Emichaelneale/"&gt;my long time home page&lt;/a&gt; (from my trusty ISP internode) is climbing the charts when I do a google search for Michael Neale, which is good, in case I go all Momento or anything.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/2311776355674459132-3176273620185432546?l=michaelneale.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/2311776355674459132/posts/default/3176273620185432546'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/2311776355674459132/posts/default/3176273620185432546'/><link rel='alternate' type='text/html' href='http://michaelneale.blogspot.com/2007/01/climbing-charts.html' title='Climbing the charts'/><author><name>Michael Neale</name><uri>http://www.blogger.com/profile/14670410000512777421</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='30' src='http://www.users.on.net/~michaelneale/michael.jpg'/></author></entry><entry><id>tag:blogger.com,1999:blog-2311776355674459132.post-2139059894683609815</id><published>2006-12-13T13:33:00.000-08:00</published><updated>2006-12-13T13:35:32.131-08:00</updated><title type='text'>migrating here</title><content type='html'>I think I will move all my personal blogging stuff to here.&lt;br /&gt;&lt;br /&gt;At present all my relevant (non) personal info is &lt;a href="http://users.on.net/michaelneale"&gt;here&lt;/a&gt;. &lt;span class="down" style="display: block;" id="formatbar_CreateLink" title="Link" onmouseover="ButtonHoverOn(this);" onmouseout="ButtonHoverOff(this);" onmouseup="" onmousedown="CheckFormatting(event);FormatbarButton('richeditorframe', this, 8);ButtonMouseDown(this);"&gt;&lt;br /&gt;Blogspot is quite nice to use, so am happy to move to it (but I still like a olde fashioned vim friendly home page, you can pry that out of my cold dead hands).&lt;br /&gt;&lt;br /&gt;What with Christmas coming up (in Paris this year) and then moving back to Sydney, will be quiet for a while.&lt;br /&gt;&lt;/span&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/2311776355674459132-2139059894683609815?l=michaelneale.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/2311776355674459132/posts/default/2139059894683609815'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/2311776355674459132/posts/default/2139059894683609815'/><link rel='alternate' type='text/html' href='http://michaelneale.blogspot.com/2006/12/migrating-here.html' title='migrating here'/><author><name>Michael Neale</name><uri>http://www.blogger.com/profile/14670410000512777421</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='30' src='http://www.users.on.net/~michaelneale/michael.jpg'/></author></entry></feed>
