<?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-21612553</id><updated>2012-01-26T11:21:03.974+11:00</updated><category term='gc'/><category term='sun jdk'/><category term='ubuntu'/><category term='java'/><category term='steve jobs'/><title type='text'>robertmaldon</title><subtitle type='html'>Will Code for Food</subtitle><link rel='http://schemas.google.com/g/2005#feed' type='application/atom+xml' href='http://robertmaldon.blogspot.com/feeds/posts/default'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/21612553/posts/default?max-results=100'/><link rel='alternate' type='text/html' href='http://robertmaldon.blogspot.com/'/><link rel='hub' href='http://pubsubhubbub.appspot.com/'/><link rel='next' type='application/atom+xml' href='http://www.blogger.com/feeds/21612553/posts/default?start-index=101&amp;max-results=100'/><author><name>Robert Maldon</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><generator version='7.00' uri='http://www.blogger.com'>Blogger</generator><openSearch:totalResults>244</openSearch:totalResults><openSearch:startIndex>1</openSearch:startIndex><openSearch:itemsPerPage>100</openSearch:itemsPerPage><entry><id>tag:blogger.com,1999:blog-21612553.post-6669789665909781684</id><published>2011-09-25T20:59:00.002+10:00</published><updated>2011-09-25T21:19:03.924+10:00</updated><title type='text'>Build your own (killer) Drone</title><content type='html'>&lt;a href="http://techcrunch.com/2011/09/24/droning-on-towards-destiny/"&gt;Droning On Towards A Date With Destiny?&lt;/a&gt; is a thought-provoking post that "connects the dots" with a number of stories I've seen recently, pointing out that Drone technology is quickly becoming a commodity.&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;a href="http://diydrones.com/"&gt;DIY Drones&lt;/a&gt; gives you step-by-step instructions for building your own drone.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;Can't easily acquire a part? Then use one of those new 3D printers to &lt;a href="http://www.guardian.co.uk/world/2011/sep/21/printed-drones-southampton-university"&gt;print your own drone&lt;/a&gt;. (It is going to be a real issue in the near future for governments and law enforcement to prevent people from "printing" all sort of &lt;a href="http://techcrunch.com/2011/09/20/is-printing-a-gun-the-same-as-buying-a-gun/"&gt;dangerous&lt;/a&gt; or &lt;a href="http://krebsonsecurity.com/2011/09/gang-used-3d-printers-for-atm-skimmers/"&gt;illegal&lt;/a&gt; things.)&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/21612553-6669789665909781684?l=robertmaldon.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://robertmaldon.blogspot.com/feeds/6669789665909781684/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=21612553&amp;postID=6669789665909781684' title='1 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/21612553/posts/default/6669789665909781684'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/21612553/posts/default/6669789665909781684'/><link rel='alternate' type='text/html' href='http://robertmaldon.blogspot.com/2011/09/build-your-own-killer-drone.html' title='Build your own (killer) Drone'/><author><name>Robert Maldon</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-21612553.post-8404256299801541560</id><published>2011-09-16T20:39:00.000+10:00</published><updated>2011-09-16T20:39:00.908+10:00</updated><title type='text'>The Ultimate Base Class</title><content type='html'>An interesting proof-of-concept ruby library called &lt;a href="https://www.destroyallsoftware.com/blog/2011/one-base-class-to-rule-them-all"&gt;Base&lt;/a&gt; (&lt;a href="https://github.com/garybernhardt/base"&gt;source&lt;/a&gt;) was released last week - at least I hope it is not a serious project!.&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;The author describes it like this:&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;i&gt;&lt;b&gt;People love Base classes! They have tons of methods waiting to be used. Just check out ActiveRecord::Base's method list:&lt;/b&gt;&lt;/i&gt;&lt;/div&gt;&lt;div&gt;&lt;i&gt;&lt;b&gt;&lt;br /&gt;&lt;/b&gt;&lt;/i&gt;&lt;/div&gt;&lt;div&gt;&lt;i&gt;&lt;b&gt;&amp;gt;&amp;gt; ActiveRecord::Base.methods.length&lt;/b&gt;&lt;/i&gt;&lt;/div&gt;&lt;div&gt;&lt;i&gt;&lt;b&gt;=&amp;gt; 530&lt;/b&gt;&lt;/i&gt;&lt;/div&gt;&lt;div&gt;&lt;i&gt;&lt;b&gt;&lt;br /&gt;&lt;/b&gt;&lt;/i&gt;&lt;/div&gt;&lt;div&gt;&lt;i&gt;&lt;b&gt;But why stop there? Why not have even more methods? In fact, let's put every method on one Base class!&lt;/b&gt;&lt;/i&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;Yep, I've got to agree that many developers I've worked with love making beefy base classes.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;So how does Base work? First, you create a class that inherits from Base like so:&lt;/div&gt;&lt;br /&gt;&lt;pre&gt;class Utility &amp;lt; Base&lt;br /&gt;end&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;div&gt;and through the magic of ruby's method_missing it will effectively attach every method of every Module in its runtime environment (which will be quite a few if running under Rails, for example) to your class.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;And what happens if two or more modules have the same method name? You'll get the first one that was loaded!&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;I like it! Now we need one database table to rule them all!&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/21612553-8404256299801541560?l=robertmaldon.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://robertmaldon.blogspot.com/feeds/8404256299801541560/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=21612553&amp;postID=8404256299801541560' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/21612553/posts/default/8404256299801541560'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/21612553/posts/default/8404256299801541560'/><link rel='alternate' type='text/html' href='http://robertmaldon.blogspot.com/2011/09/ultimate-base-class.html' title='The Ultimate Base Class'/><author><name>Robert Maldon</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-21612553.post-6094231360143753930</id><published>2011-09-16T20:13:00.001+10:00</published><updated>2011-09-16T20:13:00.777+10:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='steve jobs'/><title type='text'>Now he is no longer CEO of Apple, what does a typical day for Steve Jobs look like?</title><content type='html'>&lt;div style="text-align: left;"&gt;Courtesy of &lt;a href="http://www.geekculture.com/joyoftech/joyarchives/1583.html"&gt;The Joy of Tech&lt;/a&gt; :&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;div&gt;&lt;span class="Apple-style-span" style="color: rgb(0, 0, 238); -webkit-text-decorations-in-effect: underline; "&gt;&lt;img src="http://4.bp.blogspot.com/--yMGEddFjyE/TnLbhE_Ty_I/AAAAAAAAA0w/ZpDGvVtN0dI/s400/steve-jobs-retired-ceo-calendar.jpg" border="0" alt="" id="BLOGGER_PHOTO_ID_5652821843624840178" style="display: block; margin-top: 0px; margin-right: auto; margin-bottom: 10px; margin-left: auto; text-align: center; cursor: pointer; width: 308px; height: 400px; " /&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span" style="color: rgb(0, 0, 238); -webkit-text-decorations-in-effect: underline; "&gt;&lt;br /&gt;&lt;/span&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/21612553-6094231360143753930?l=robertmaldon.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://robertmaldon.blogspot.com/feeds/6094231360143753930/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=21612553&amp;postID=6094231360143753930' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/21612553/posts/default/6094231360143753930'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/21612553/posts/default/6094231360143753930'/><link rel='alternate' type='text/html' href='http://robertmaldon.blogspot.com/2011/09/now-he-is-no-longer-ceo-of-apple-what.html' title='Now he is no longer CEO of Apple, what does a typical day for Steve Jobs look like?'/><author><name>Robert Maldon</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://4.bp.blogspot.com/--yMGEddFjyE/TnLbhE_Ty_I/AAAAAAAAA0w/ZpDGvVtN0dI/s72-c/steve-jobs-retired-ceo-calendar.jpg' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-21612553.post-6524639749348959698</id><published>2011-08-18T20:31:00.006+10:00</published><updated>2012-01-19T12:58:08.384+11:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='sun jdk'/><category scheme='http://www.blogger.com/atom/ns#' term='ubuntu'/><title type='text'>Installing the Sun (Oracle) JDK on Ubuntu</title><content type='html'>&lt;span style="font-weight: bold;"&gt;Update&lt;/span&gt;: Due to changes by Oracle in licensing for the JDK &lt;a href="https://lists.ubuntu.com/archives/ubuntu-security-announce/2012-January/001554.html"&gt;all Java packages in the Ubuntu Partner archive to be removed on 2012-02-16&lt;/a&gt;. Bummer. It looks like you will have to manually download and install a TAR or RPM version of the JDK from the &lt;a href="http://www.oracle.com/technetwork/java/javase/downloads/index.html"&gt;Oracle download site&lt;/a&gt;.&lt;br /&gt;&lt;br /&gt;I've had to do this a lot lately, so it's worth writing a post to remind myself of the steps.&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;By default Ubuntu packages that depend on Java (JRE or JDK) usually depend on &lt;a href="http://openjdk.java.net/"&gt;OpenJDK&lt;/a&gt;. OpenJDK seems 98% compatible with the Sun (now Oracle) JDK, but chances are you'll hit an edge case that works only on the Sun JDK.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;So let's install the Sun JDK!&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;The following steps will work with Ubuntu 9.10 (Karmic Koala) or newer.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;b&gt;Install wget&lt;/b&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;I personally prefer wget over curl for the simple stuff.&lt;/div&gt;&lt;br /&gt;&lt;br /&gt;&lt;pre&gt;sudo apt-get install -y wget&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;&lt;div&gt;&lt;b&gt;Install python-software-properties&lt;/b&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;The python-software-properties includes a handy command-line utility called &lt;i&gt;&lt;b&gt;add-apt-repository&lt;/b&gt;&lt;/i&gt;, which adds packages repositories to you apt sources.list file. Instead of using this utility you can hand edit /etc/apt/sources.list if you prefer.&lt;/div&gt;&lt;br /&gt;&lt;br /&gt;&lt;pre&gt;sudo apt-get install -y python-software-properties&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;&lt;div&gt;&lt;b&gt;Add the 'Canonical partners' package repository to the package sources list&lt;/b&gt;&lt;/div&gt;&lt;br /&gt;&lt;br /&gt;&lt;pre&gt;sudo add-apt-repository "deb http://archive.canonical.com/ubuntu $(lsb_release -s -c) partner"&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;&lt;div&gt;or manually add the corresponding entry to your /etc/apt/sources.list file. e.g.&lt;/div&gt;&lt;br /&gt;&lt;br /&gt;&lt;pre&gt;deb http://archive.canonical.com/ubuntu natty partner&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;&lt;div&gt;&lt;b&gt;Rebuild the package index&lt;/b&gt;&lt;/div&gt;&lt;br /&gt;&lt;br /&gt;&lt;pre&gt;sudo apt-get update&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;&lt;div&gt;&lt;b&gt;Avoid the annoying prompt to accept the license&lt;/b&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;When you install the Sun JDK you will be prompted to read and accept a license. I personally like stuff to install without requiring manual interaction, so do the following to bypass the license prompt (of course we accept the license!):&lt;/div&gt;&lt;br /&gt;&lt;br /&gt;&lt;pre&gt;echo sun-java6-jdk shared/accepted-sun-dlj-v1-1 select true | sudo /usr/bin/debconf-set-selections&lt;br /&gt;echo sun-java6-jre shared/accepted-sun-dlj-v1-1 select true | sudo /usr/bin/debconf-set-selections&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;&lt;div&gt;&lt;b&gt;Install Sun JDK 6&lt;/b&gt;&lt;/div&gt;&lt;br /&gt;&lt;br /&gt;&lt;pre&gt;sudo apt-get install -y sun-java6-jdk sun-java6-plugin&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;&lt;div&gt;&lt;b&gt;Update the Java system default to the Sun version&lt;/b&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;Ubuntu allows multiple JVMs to be installed at any one time. To switch the "default" to the Sun JVM do the following:&lt;/div&gt;&lt;br /&gt;&lt;br /&gt;&lt;pre&gt;sudo update-java-alternatives -v -s java-6-sun&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;&lt;div&gt;And that's it! Phew!&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;b&gt;The future is OpenJDK&lt;/b&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;Oracle are currently saying the official JDK reference implementation from Java 7 onwards will be OpenJDK, so assuming OpenJDK gets fully functional then you won't have to go through all of the steps in this blog post!&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/21612553-6524639749348959698?l=robertmaldon.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://robertmaldon.blogspot.com/feeds/6524639749348959698/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=21612553&amp;postID=6524639749348959698' title='2 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/21612553/posts/default/6524639749348959698'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/21612553/posts/default/6524639749348959698'/><link rel='alternate' type='text/html' href='http://robertmaldon.blogspot.com/2011/08/installing-sun-oracle-jdk-on-ubuntu.html' title='Installing the Sun (Oracle) JDK on Ubuntu'/><author><name>Robert Maldon</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>2</thr:total></entry><entry><id>tag:blogger.com,1999:blog-21612553.post-5239481827962169885</id><published>2009-05-25T15:18:00.003+10:00</published><updated>2009-05-25T15:34:10.939+10:00</updated><title type='text'>Stop the short URL rot - use HugeURL!</title><content type='html'>URL shortening services such as &lt;a href="http://tinyurl.com/"&gt;tinyurl&lt;/a&gt; and &lt;a href="http://bit.ly/"&gt;bit.ly&lt;/a&gt; have been gaining a new life recently because of Twitter's 140 character per "tweet" limit.&lt;br /&gt;&lt;br /&gt;For those with a rye sense of humour you can fight back by turning all your links into really, really long ones with &lt;a href="http://www.hugeurl.com/"&gt;HugeURL&lt;/a&gt;.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/21612553-5239481827962169885?l=robertmaldon.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://robertmaldon.blogspot.com/feeds/5239481827962169885/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=21612553&amp;postID=5239481827962169885' title='2 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/21612553/posts/default/5239481827962169885'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/21612553/posts/default/5239481827962169885'/><link rel='alternate' type='text/html' href='http://robertmaldon.blogspot.com/2009/05/stop-short-url-rot-use-hugeurl.html' title='Stop the short URL rot - use HugeURL!'/><author><name>Robert Maldon</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>2</thr:total></entry><entry><id>tag:blogger.com,1999:blog-21612553.post-3438241701673627303</id><published>2009-05-25T10:15:00.007+10:00</published><updated>2009-05-25T21:14:40.970+10:00</updated><title type='text'>R.I.P. Portfolio.com 2007-2009</title><content type='html'>&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://3.bp.blogspot.com/_3mcDdIZRKc0/ShomvuQwtLI/AAAAAAAAAu4/z2RL5vwblvw/s1600-h/end-wall-st-bull-collapsed-slide.jpg"&gt;&lt;img style="margin: 0px auto 10px; display: block; text-align: center; cursor: pointer; width: 400px; height: 243px;" src="http://3.bp.blogspot.com/_3mcDdIZRKc0/ShomvuQwtLI/AAAAAAAAAu4/z2RL5vwblvw/s400/end-wall-st-bull-collapsed-slide.jpg" alt="" id="BLOGGER_PHOTO_ID_5339622909515183282" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;I was disappointed to learn a couple of weeks ago about the &lt;a href="http://www.walletpop.com/blog/2009/04/27/adieu-portfolio-conde-nast-shuts-down-its-paen-to-the-gilded-a/"&gt;demise of Portfolio magazine&lt;/a&gt; and its companion website &lt;a href="http://www.portfolio.com/"&gt;portfolio.com&lt;/a&gt;. I was part of the team that built the original version of portfolio.com, so I would like to honour the gutsy efforts of those that tried to build a new magazine in such trying times with some memories, thoughts and questions.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;Built From Scratch In Just 6 Weeks&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;Even though Portfolio magazine had been in the planning stages for a couple of years and CondeNast allegedly spent $150+ million on the launch, portfolio.com itself was built almost from scratch in just 6 weeks by a team of about 15 techies - and of course the rest of the staff that provided the content.&lt;br /&gt;&lt;br /&gt;There were some concept screen shots (good ol Photoshop) and the base infrastructure was a standard CondeNast webapp infrastrcuture (Akamai web cache + Java application server + CMS + Spring + Hibernate + Oracle), but everything else had to be built from scratch.&lt;br /&gt;&lt;br /&gt;Building the website was very tight, but we had a lot of very talented people working on it, and none of us doubted we would hit the deadline. To celebrate the launch of the website management gave everybody involved a Portoflio.com branded bottle of wine, featuring a rocket taking off! (The wine itself was a pretty cheap German riesling, but the branding was a nice touch.)&lt;br /&gt;&lt;br /&gt;Probably the most interesting technical challenge building the website was integrating data feeds from 10+ sources. Some feeds were semi-realtime - e.g. recent news updated every 5 minutes, market indicies updated every 15 minutes - while others were updated once a week. The feeds were in a variety of formats, everything from &lt;a href="http://en.wikipedia.org/wiki/NewsML"&gt;NewsML&lt;/a&gt; to &lt;a href="http://en.wikipedia.org/wiki/Comma-separated_values"&gt;CSV&lt;/a&gt;, pulled via FTP, web services, etc. To handle the workflow required to publish this data - pull the feed, transform the data, pushing the data through the CMS, invalidate the Akamai web cache - a batch processor similiar to (but pre-dates) &lt;a href="http://static.springframework.org/spring-batch/"&gt;Spring Batch&lt;/a&gt; was created. This was a pretty useful framework and I suspect it still lives on somewhere inside CondeNast.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;Who were the target market for Portfolio?&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;I never got a clear and consistent answer to the questions: What is the editorial direction for Portfolio? Who were the target market?&lt;br /&gt;&lt;br /&gt;If you google for stories about the closing of Portfolio you will get a whole bunch of opinions on who the target market for the magazine were. I suspect the editorial theme was something that kept evolving.&lt;br /&gt;&lt;br /&gt;At the time of the magazine launch the best answers to this question I got were:&lt;br /&gt;&lt;ul&gt;&lt;li&gt;Target market: CEOs and wannabe CEOs.&lt;/li&gt;&lt;li&gt;Editorial direction: If you can interview the CEO of a Fortune 500 company or an interview with a 6 foot tall supermodel-like CEO of a startup go with the supermodel!&lt;/li&gt;&lt;li&gt;Editorial direction: Choose stories that other business magazines are likely to ignore and that have a "shelf life" of a few weeks. (Business Magazines tend to publish stories that will have an interest of a few days, maybe a week or two.)&lt;br /&gt;&lt;/li&gt;&lt;/ul&gt;So it was aimed at the those interested in the excesses of life on Wall St and the extreme wealth at the time? Was it trying to create a genre that other business magazines hadn't figured out? Maybe.&lt;br /&gt;&lt;br /&gt;&lt;a href="http://www.businessweek.com/innovate/FineOnMedia/archives/2009/04/conde_nast_shut_1.html?campaign_id=rss_daily"&gt;One journalists opinion&lt;/a&gt;:&lt;br /&gt;&lt;br /&gt;&lt;span style="font-style: italic;"&gt;They thought there was a hole in Conde Nast's portfolio (sorry) of magazines, which primarily targeted upscale women. They believed that a business magazine--when added to fashion titles GQ and Details and its smaller golf magazines--would significantly bulk up its audience of upscale men.&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;One of the portfolio.com bloggers, Jeff Bercovici, offers his insight:&lt;br /&gt;&lt;br /&gt;&lt;span style="font-style: italic;"&gt;"Conde Nast, as successful a company as it is, it's not in the business of publishing business news. It's in the business of aggregating high-end readers and selling them to luxury advertisers," Bercovici told me by phone this morning. He was, for the record, drinking a beer at his desk, upholding a sacred layoffs tradition begun at Portfolio in late October, during its first round of sweeping layoffs at the magazine and web site.&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;I'm still confused :)&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;Money, Money, Money&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;Was money being splashed around for the launch? Maybe on the print magazine. I didn't see too much excess at portfolio.com, although I'm sure the late start proved expensive with the number of consultants they had to hire. Many of the deals with 3rd content providers would have cost a lot. Then there was the portfolio.com manager lured from Yahoo! Finance that bragged about his new $5,000 suit :)&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;Why did the magazine fail?&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;Again many opinions. Some blame it on the collapse of the Wall St excesses Portfolio may have been trying to target. Others blame it on &lt;a href="http://gawker.com/5229944/inside-fort-polio-a-former-staffer-on-what-went-wrong"&gt;lack of forsight and direction from the chief editor&lt;/a&gt;.&lt;br /&gt;&lt;br /&gt;portfolio.com was slowly gaining more and more readers, but the print magazine was failing to meet its readership targets.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;A website with a life of its own?&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;All of the CondeNast websites are really just extra marketing for the published magazines. Most of their content is dervied from the print magazines. None of this is surprising since CondeNast gets the great majority of its revenus from magazine subscriptions and print advertising.&lt;br /&gt;&lt;br /&gt;At the launch of portfolio.com the staffers were very confident the website would be closely tied to the magazine (they had agreement from editorial that the content of the magazine would be available in full on the website), but have a life of its own, offering more and different content to keep websurfers coming back regularly.&lt;br /&gt;&lt;br /&gt;How was this vision going to be realised? Like editorial direction I don't think the strategy was well defined. Various reports say the magazine editor did not support portfolio.com's independence.&lt;br /&gt;&lt;br /&gt;So what additonal compelling content did portfolio.com strive to offer?&lt;br /&gt;&lt;br /&gt;First it offered the same stuff other financial websites had so that you didn't need to go elsewhere - e.g. market news, market data, "blogs", reader comments and information on companies and executives.&lt;br /&gt;&lt;br /&gt;Beyond the same stuff I didn't see much else that portfolio.com had to offer.&lt;br /&gt;&lt;br /&gt;In more recent times they produced a lot of &lt;a href="http://www.walletpop.com/blog/2009/04/27/adieu-portfolio-conde-nast-shuts-down-its-paen-to-the-gilded-a/"&gt;Flash-based info-graphics and "zany viral videos"&lt;/a&gt;.&lt;br /&gt;&lt;br /&gt;At launch they were looking at using a number of other technologies such as a product that did voice recognition to produce a transcript for videos - which made the videos more search-engine friendly.&lt;br /&gt;&lt;br /&gt;And then there was the Hype Report. Disclaimer: this was something I implemented for the website launch and I was disappointed it didn't survive for too long. The idea behind the Hype Report was this: the "blogosphere" (i.e. many of the hosted blog sites across the internet) were crawled and indexed daily. From the raw data it could be calculated how frequentely a term was used (e.g. a company or executive name) and it could also be calculated how the frequency of these terms changed from day to day. So the hype report gave you a table of companies and executives with a frequency change of how often they were mentioned in the blogosphere twice a day. Someone from portfolio.com was supposed to provide some editorial around the "movers" in the hype report, but the reasons for the move were sometimes obvious (e.g. an annual report or takeover), sometimes accidental (e.g. Michael Jordan, the CEO of Westinghouse Electric, appeared to get a lot of hype because Michael Jordan the basketball player was going through a bitter divorce at the time :)) and often unknown. I was disappointed they didn't take the Hype Report to the next level, such as linking to the blogs that provided the raw data for the Hype Report.&lt;br /&gt;&lt;br /&gt;So what type of content would have kept me coming back to portfolio.com? Here are a few suggestions:&lt;br /&gt;&lt;ul&gt;&lt;li&gt;Instead of the occasional article it would be nice to have a searchable database of exclusive stuff. e.g. details of all of the exclusive country clubs, golf courses, etc including location, satellite views, how much you have to earn before they are likely to accept your application.&lt;/li&gt;&lt;li&gt;Randomised home page. Lots of good stuff is buried deep inside the website, so instead of relying on users to randomly find it why not bring some of it to the homepage?&lt;/li&gt;&lt;li&gt;Mashups! There is already a large database of stuff that might be easily exposed via an API. e.g. the "Executive Profiles" could be rendered in a more friendly chart like &lt;a href="http://orgchart.forbes.com/"&gt;Forbes OrgChart Wiki&lt;/a&gt;.&lt;br /&gt;&lt;/li&gt;&lt;li&gt;Try random stuff. A common thing I see with "corporate" websites is a push-back from operations people when others want to experiment with site. Operations of course prefer to have a stable, controlled existance; it can be embarrassing when your website goes down. On the other hand too tight a control can stifle creativity. I have long championed experimentation of ideas, letting them live or die via &lt;a href="http://startuplessonslearned.blogspot.com/2008/12/getting-started-with-split-testing.html"&gt;split testing&lt;/a&gt;. If stability is a great concern then deploy the experimental stuff on seperate servers, making the functionality available as includeable widgets (and grecefully handling the failures of the widgets).&lt;/li&gt;&lt;li&gt;The Hype Report v2.0 :)&lt;br /&gt;&lt;/li&gt;&lt;/ul&gt;&lt;span style="font-weight: bold;"&gt;Survival of Print Publications&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;I wish I had a magic answer for how print publications can survive. It would be a shame to see them die.&lt;br /&gt;&lt;br /&gt;Some people think newspapers need to offer most of their content instantaneously on line, paying journalists on a "micro-publishing" basis. Others talk about Google subsidising publications on an AdWord basis. Mr Murdoch is beginning to charge more and more for his content. Glossy magazines like the CondeNast magazines could in theory be replaced by &lt;a href="http://www.engadget.com/2009/05/07/amazon-takes-70-percent-of-kindle-newspaper-revenues/"&gt;tablet devices&lt;/a&gt; if they have decent resolution. Maybe &lt;a href="http://en.wikipedia.org/wiki/Electronic_paper"&gt;e-paper&lt;/a&gt; technology will mature in the coming years.&lt;br /&gt;&lt;br /&gt;It is more likely a new equilibrium will be reached. In decades past many small newspapers were gobbled up by larger newspapers. Now the reverse is happening, with many small news websites slowly gaining at the expense of the larger newspapers.&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;&lt;br /&gt;And Then There Was Gawker&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://3.bp.blogspot.com/_3mcDdIZRKc0/ShnziU-ujmI/AAAAAAAAAuw/xMuin1Y7q8Q/s1600-h/portfolio-greenspan.jpg"&gt;&lt;img style="margin: 0px auto 10px; display: block; text-align: center; cursor: pointer; width: 400px; height: 218px;" src="http://3.bp.blogspot.com/_3mcDdIZRKc0/ShnziU-ujmI/AAAAAAAAAuw/xMuin1Y7q8Q/s400/portfolio-greenspan.jpg" alt="" id="BLOGGER_PHOTO_ID_5339566604297342562" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;One of the favourite topics of conversation amongst the Portfolio staff was how the publishing industry gossip site Gawker talked about the magazine. Gawker definately had it in for Portfolio from the &lt;a href="http://gawker.com/252487/your-portfolio-has-finally-arrived"&gt;start&lt;/a&gt; and reveled in the apparent turmoil amongst the editors and lower than hoped circulation numbers. Why did they give Portfolio &lt;a href="http://gawker.com/291252/why-people-care-about-portfolio"&gt;such a hard time&lt;/a&gt;?&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/21612553-3438241701673627303?l=robertmaldon.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://robertmaldon.blogspot.com/feeds/3438241701673627303/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=21612553&amp;postID=3438241701673627303' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/21612553/posts/default/3438241701673627303'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/21612553/posts/default/3438241701673627303'/><link rel='alternate' type='text/html' href='http://robertmaldon.blogspot.com/2009/05/rip-portfoliocom-2007-2009.html' title='R.I.P. Portfolio.com 2007-2009'/><author><name>Robert Maldon</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://3.bp.blogspot.com/_3mcDdIZRKc0/ShomvuQwtLI/AAAAAAAAAu4/z2RL5vwblvw/s72-c/end-wall-st-bull-collapsed-slide.jpg' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-21612553.post-8741487265574178970</id><published>2009-05-11T21:07:00.008+10:00</published><updated>2009-05-11T21:07:00.768+10:00</updated><title type='text'>Should hand shaking be phased out?</title><content type='html'>&lt;div style="text-align: center;"&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://3.bp.blogspot.com/_3mcDdIZRKc0/SgeYxE1NfuI/AAAAAAAAAuI/nMOsM6LDJ8M/s1600-h/hand-shake.jpg"&gt;&lt;img style="margin: 0px auto 10px; display: block; text-align: center; cursor: pointer; width: 296px; height: 223px;" src="http://3.bp.blogspot.com/_3mcDdIZRKc0/SgeYxE1NfuI/AAAAAAAAAuI/nMOsM6LDJ8M/s400/hand-shake.jpg" alt="" id="BLOGGER_PHOTO_ID_5334400252521578210" border="0" /&gt;&lt;/a&gt;&lt;span style="font-weight: bold;"&gt;The "power" shake&lt;/span&gt;&lt;br /&gt;&lt;/div&gt;&lt;br /&gt;&lt;a href="http://www.techcrunch.com/2009/05/09/hand-shaking-is-so-medieval-lets-end-it/"&gt;Hand Shaking Is So Medieval. Let’s End It&lt;/a&gt; is an interesting blog post that got me thinking about hand shaking and its place in society. According to &lt;a href="http://en.wikipedia.org/wiki/Hand_shake"&gt;Wikipedia&lt;/a&gt; it's been around at least since the 2nd Century and originated as a peace gesture, showing the other person you are not holding a weapon. In the age of Swine Flu and other highly contagous diseases should we continue to shake?&lt;br /&gt;&lt;br /&gt;The blog posts some interesting alternatives to hand shaking, such as the "elbow bump" or the Vulcan salute.&lt;br /&gt;&lt;br /&gt;&lt;div style="text-align: center;"&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://4.bp.blogspot.com/_3mcDdIZRKc0/SgeZA3WX2BI/AAAAAAAAAuQ/s6ga7heGfC8/s1600-h/vulcan-greeting.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/_3mcDdIZRKc0/SgeZA3WX2BI/AAAAAAAAAuQ/s6ga7heGfC8/s400/vulcan-greeting.jpg" alt="" id="BLOGGER_PHOTO_ID_5334400523780478994" border="0" /&gt;&lt;/a&gt;&lt;span style="font-weight: bold;"&gt;The Vulcan Salute&lt;/span&gt;&lt;br /&gt;&lt;/div&gt;&lt;br /&gt;However, there are also plenty of cultural grettings that more easily lend themselves to spreading disease.&lt;br /&gt;&lt;br /&gt;&lt;div style="text-align: center;"&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://2.bp.blogspot.com/_3mcDdIZRKc0/SgeZk8wN9aI/AAAAAAAAAuY/Gl8qCBQHc1c/s1600-h/hawaiian-lei-greeting.jpg"&gt;&lt;img style="margin: 0px auto 10px; display: block; text-align: center; cursor: pointer; width: 400px; height: 249px;" src="http://2.bp.blogspot.com/_3mcDdIZRKc0/SgeZk8wN9aI/AAAAAAAAAuY/Gl8qCBQHc1c/s400/hawaiian-lei-greeting.jpg" alt="" id="BLOGGER_PHOTO_ID_5334401143706351010" border="0" /&gt;&lt;/a&gt;&lt;span style="font-weight: bold;"&gt;Hawaiian lei greeting&lt;/span&gt;&lt;br /&gt;&lt;/div&gt;&lt;br /&gt;&lt;div style="text-align: center;"&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://1.bp.blogspot.com/_3mcDdIZRKc0/SgeZwIXvA2I/AAAAAAAAAug/8uz2ALFF9Bo/s1600-h/maori-rub-nose-greeting.jpg"&gt;&lt;img style="margin: 0px auto 10px; display: block; text-align: center; cursor: pointer; width: 215px; height: 300px;" src="http://1.bp.blogspot.com/_3mcDdIZRKc0/SgeZwIXvA2I/AAAAAAAAAug/8uz2ALFF9Bo/s400/maori-rub-nose-greeting.jpg" alt="" id="BLOGGER_PHOTO_ID_5334401335803446114" border="0" /&gt;&lt;/a&gt;&lt;span style="font-weight: bold;"&gt;Maori nose rub greeting&lt;/span&gt;&lt;br /&gt;&lt;/div&gt;&lt;br /&gt;And of course there are more culturally exotic greetings...&lt;br /&gt;&lt;br /&gt;&lt;div style="text-align: center;"&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://3.bp.blogspot.com/_3mcDdIZRKc0/SgeaE-O6q-I/AAAAAAAAAuo/f9_EdSC6VTk/s1600-h/hawaiin-three-fingers-folded-wave.jpg"&gt;&lt;img style="margin: 0px auto 10px; display: block; text-align: center; cursor: pointer; width: 400px; height: 300px;" src="http://3.bp.blogspot.com/_3mcDdIZRKc0/SgeaE-O6q-I/AAAAAAAAAuo/f9_EdSC6VTk/s400/hawaiin-three-fingers-folded-wave.jpg" alt="" id="BLOGGER_PHOTO_ID_5334401693859359714" border="0" /&gt;&lt;/a&gt;&lt;span style="font-weight: bold;"&gt;Hawaiian three-fingers-folded wave&lt;/span&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/21612553-8741487265574178970?l=robertmaldon.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://robertmaldon.blogspot.com/feeds/8741487265574178970/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=21612553&amp;postID=8741487265574178970' title='1 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/21612553/posts/default/8741487265574178970'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/21612553/posts/default/8741487265574178970'/><link rel='alternate' type='text/html' href='http://robertmaldon.blogspot.com/2009/05/should-hand-shaking-be-phased-out.html' title='Should hand shaking be phased out?'/><author><name>Robert Maldon</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://3.bp.blogspot.com/_3mcDdIZRKc0/SgeYxE1NfuI/AAAAAAAAAuI/nMOsM6LDJ8M/s72-c/hand-shake.jpg' height='72' width='72'/><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-21612553.post-9076701580272779984</id><published>2009-05-07T11:41:00.002+10:00</published><updated>2009-05-07T11:44:14.802+10:00</updated><title type='text'>Will Code For Hope - My Obama-like poster</title><content type='html'>&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://1.bp.blogspot.com/_3mcDdIZRKc0/SgI8qlnSGXI/AAAAAAAAAuA/HGOqHSo5zqU/s1600-h/codeforhope.png"&gt;&lt;img style="margin: 0px auto 10px; display: block; text-align: center; cursor: pointer; width: 268px; height: 400px;" src="http://1.bp.blogspot.com/_3mcDdIZRKc0/SgI8qlnSGXI/AAAAAAAAAuA/HGOqHSo5zqU/s400/codeforhope.png" alt="" id="BLOGGER_PHOTO_ID_5332891611109136754" border="0" /&gt;&lt;/a&gt;Courtesy of &lt;a href="http://obamiconme.pastemagazine.com/entries/new.html"&gt;Obamicon.ME&lt;/a&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/21612553-9076701580272779984?l=robertmaldon.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://robertmaldon.blogspot.com/feeds/9076701580272779984/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=21612553&amp;postID=9076701580272779984' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/21612553/posts/default/9076701580272779984'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/21612553/posts/default/9076701580272779984'/><link rel='alternate' type='text/html' href='http://robertmaldon.blogspot.com/2009/05/will-code-for-hope-my-obama-like-poster.html' title='Will Code For Hope - My Obama-like poster'/><author><name>Robert Maldon</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://1.bp.blogspot.com/_3mcDdIZRKc0/SgI8qlnSGXI/AAAAAAAAAuA/HGOqHSo5zqU/s72-c/codeforhope.png' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-21612553.post-2362749323304884313</id><published>2009-05-07T11:24:00.003+10:00</published><updated>2009-05-07T11:28:41.590+10:00</updated><title type='text'>Get your own bailout package from the Bank Of Obama</title><content type='html'>&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://1.bp.blogspot.com/_3mcDdIZRKc0/SgI4l5MZdkI/AAAAAAAAAt4/BQIhggNtAHI/s1600-h/bankofobama.png"&gt;&lt;img style="margin: 0px auto 10px; display: block; text-align: center; cursor: pointer; width: 400px; height: 170px;" src="http://1.bp.blogspot.com/_3mcDdIZRKc0/SgI4l5MZdkI/AAAAAAAAAt4/BQIhggNtAHI/s400/bankofobama.png" alt="" id="BLOGGER_PHOTO_ID_5332887132419225154" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;Feel like you're missing out on all of the cash currently being splashed around? Well now you can get your share from the &lt;a href="http://www.bankofobama.org/"&gt;Bank Of Obama&lt;/a&gt;!&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/21612553-2362749323304884313?l=robertmaldon.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://robertmaldon.blogspot.com/feeds/2362749323304884313/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=21612553&amp;postID=2362749323304884313' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/21612553/posts/default/2362749323304884313'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/21612553/posts/default/2362749323304884313'/><link rel='alternate' type='text/html' href='http://robertmaldon.blogspot.com/2009/05/get-your-own-bailout-package-from-bank.html' title='Get your own bailout package from the Bank Of Obama'/><author><name>Robert Maldon</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://1.bp.blogspot.com/_3mcDdIZRKc0/SgI4l5MZdkI/AAAAAAAAAt4/BQIhggNtAHI/s72-c/bankofobama.png' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-21612553.post-5255474714078746131</id><published>2009-05-07T11:05:00.003+10:00</published><updated>2009-05-07T11:18:52.713+10:00</updated><title type='text'>Pairing as part of a job interview</title><content type='html'>A small company &lt;a href="http://www.cio.com/article/print/478106"&gt;gets candidates to "pair" during their job interview process&lt;/a&gt; in order to test their ability to do things the &lt;a href="http://en.wikipedia.org/wiki/Extreme_Programming"&gt;XP way&lt;/a&gt; (more details &lt;a href="http://www.menloinnovations.com/freestuff/whitepapers/extremeinterviewing.htm"&gt;here&lt;/a&gt;).&lt;br /&gt;&lt;br /&gt;I don't know how effective such a short test would be in identifying Agile individuals, but it doesn't sound any more arbitrary than other things I've done in job interviews (brain teasers, code a small project, whiteboarding software architectures, etc) :)&lt;br /&gt;&lt;br /&gt;An interesting quote from the interview that rings very true:&lt;br /&gt;&lt;br /&gt;&lt;strong style="font-style: italic;"&gt;Sheridan&lt;/strong&gt;&lt;span style="font-style: italic;"&gt;: The traditional interviewing process is two people pleasantly lying to one another for an hour or two and then making a really big decision that they will live with for years to come. Harkening back to &lt;/span&gt;&lt;a style="font-style: italic;" title="More stories related to Thomas Edison" href="http://www.cio.com/article/478106/subject/Thomas+Edison"&gt;Thomas Edison&lt;/a&gt;&lt;span style="font-style: italic;"&gt;'s interview process: Try as hard as you can to simulate the work environment in the interview process. &lt;/span&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/21612553-5255474714078746131?l=robertmaldon.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://robertmaldon.blogspot.com/feeds/5255474714078746131/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=21612553&amp;postID=5255474714078746131' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/21612553/posts/default/5255474714078746131'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/21612553/posts/default/5255474714078746131'/><link rel='alternate' type='text/html' href='http://robertmaldon.blogspot.com/2009/05/pairing-as-part-of-job-interview.html' title='Pairing as part of a job interview'/><author><name>Robert Maldon</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-21612553.post-6425187260319091086</id><published>2009-05-07T10:35:00.003+10:00</published><updated>2009-05-07T10:56:00.928+10:00</updated><title type='text'>Have your business cards printed on meat!</title><content type='html'>Do you want a way to differentiate your business cards from the rest? You could get them printed with transparent sections or sparkly bits.&lt;br /&gt;&lt;br /&gt;But for a truly unique card have a look at &lt;a href="http://www.meatcards.com/"&gt;MEAT CARDS&lt;/a&gt;, who have come up with a creative way of combining beef jerky and a 150 Watt CO2 laser :)&lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://3.bp.blogspot.com/_3mcDdIZRKc0/SgItC94PqZI/AAAAAAAAAtw/ZqvsxCGzWwU/s1600-h/meatcards.jpg"&gt;&lt;img style="margin: 0px auto 10px; display: block; text-align: center; cursor: pointer; width: 238px; height: 400px;" src="http://3.bp.blogspot.com/_3mcDdIZRKc0/SgItC94PqZI/AAAAAAAAAtw/ZqvsxCGzWwU/s400/meatcards.jpg" alt="" id="BLOGGER_PHOTO_ID_5332874437753547154" border="0" /&gt;&lt;/a&gt;&lt;a href="http://www.davonsite.com/simpsons/sounds/homer/allmms.wav"&gt;Mmmmm&lt;/a&gt;, yummy business cards.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/21612553-6425187260319091086?l=robertmaldon.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://robertmaldon.blogspot.com/feeds/6425187260319091086/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=21612553&amp;postID=6425187260319091086' title='1 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/21612553/posts/default/6425187260319091086'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/21612553/posts/default/6425187260319091086'/><link rel='alternate' type='text/html' href='http://robertmaldon.blogspot.com/2009/05/have-your-business-cards-printed-on.html' title='Have your business cards printed on meat!'/><author><name>Robert Maldon</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://3.bp.blogspot.com/_3mcDdIZRKc0/SgItC94PqZI/AAAAAAAAAtw/ZqvsxCGzWwU/s72-c/meatcards.jpg' height='72' width='72'/><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-21612553.post-1894071807210417062</id><published>2009-04-15T20:36:00.000+10:00</published><updated>2009-04-15T20:36:00.207+10:00</updated><title type='text'>The CSS coffee mug</title><content type='html'>&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://2.bp.blogspot.com/_3mcDdIZRKc0/SeVkgufoq8I/AAAAAAAAAto/oApezW8DJ08/s1600-h/css-is-awesome-mug.png"&gt;&lt;img style="margin: 0px auto 10px; display: block; text-align: center; cursor: pointer; width: 311px; height: 311px;" src="http://2.bp.blogspot.com/_3mcDdIZRKc0/SeVkgufoq8I/AAAAAAAAAto/oApezW8DJ08/s400/css-is-awesome-mug.png" alt="" id="BLOGGER_PHOTO_ID_5324772647834790850" border="0" /&gt;&lt;/a&gt;If I have to explain why &lt;a href="http://www.zazzle.com/css_is_awesome_mug-168716435071981928"&gt;this mug&lt;/a&gt; is funny then you haven't used CSS enough :)&lt;br /&gt;&lt;br /&gt;(Might make a good interview question...)&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/21612553-1894071807210417062?l=robertmaldon.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://robertmaldon.blogspot.com/feeds/1894071807210417062/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=21612553&amp;postID=1894071807210417062' title='3 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/21612553/posts/default/1894071807210417062'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/21612553/posts/default/1894071807210417062'/><link rel='alternate' type='text/html' href='http://robertmaldon.blogspot.com/2009/04/css-coffee-mug.html' title='The CSS coffee mug'/><author><name>Robert Maldon</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://2.bp.blogspot.com/_3mcDdIZRKc0/SeVkgufoq8I/AAAAAAAAAto/oApezW8DJ08/s72-c/css-is-awesome-mug.png' height='72' width='72'/><thr:total>3</thr:total></entry><entry><id>tag:blogger.com,1999:blog-21612553.post-4410440659075278508</id><published>2008-10-28T21:33:00.000+11:00</published><updated>2008-10-28T21:46:17.677+11:00</updated><title type='text'>Microsoft joins AMQP enterprise messaging effort</title><content type='html'>Surprising news that &lt;a href="http://www.interopnews.com/analysis/microsoft-embraces-amqp-open-middleware-standard.html"&gt;Microsoft have joined the AMQP working group&lt;/a&gt;, whose aim is to standardize a wire-level messaging protocol, allowing financial firms large and small to break free of the near monopoly IBM (Websphere MQ) and Tibco (RV and EMS) have with enterprise messaging.&lt;br /&gt;&lt;br /&gt;The news is surprising to me because Microsoft have their own proprietary messaging protocols that they have been pushing (which I have yet to see deployed on a large scale), and supporting AMQP will in many cases mean Microsoft on the client side and something else on the server side.&lt;br /&gt;&lt;br /&gt;I've personally never had major issues with MQ, RV or EMS (except for the occasional trade message RV loses:)), but I always wecome choice. So go Redmond!!!&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/21612553-4410440659075278508?l=robertmaldon.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://robertmaldon.blogspot.com/feeds/4410440659075278508/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=21612553&amp;postID=4410440659075278508' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/21612553/posts/default/4410440659075278508'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/21612553/posts/default/4410440659075278508'/><link rel='alternate' type='text/html' href='http://robertmaldon.blogspot.com/2008/10/microsoft-joins-amqp-enterprise.html' title='Microsoft joins AMQP enterprise messaging effort'/><author><name>Robert Maldon</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-21612553.post-4888883792861367463</id><published>2008-10-13T21:50:00.001+11:00</published><updated>2008-10-28T22:04:42.646+11:00</updated><title type='text'>$1 trillion in subprime == a $62 trillion financial crisis? wtf?</title><content type='html'>My wife and I have been puzzled about the actual size of the current financial crisis. The huge sums of money being set aside to bail out failed banks seemed to be so much larger than could be possible for a country of 300 million to rack up in mortgage debt.&lt;br /&gt;&lt;br /&gt;Here are a few sums, if I can believe &lt;a href="http://en.wikipedia.org/wiki/Subprime_mortgage_crisis"&gt;Wikipedi&lt;/a&gt;a:&lt;br /&gt;&lt;ul&gt;&lt;li&gt;The U.S. mortgage market is estimated at $12 trillion&lt;/li&gt;&lt;li&gt;Approximately 9.2% of loans &lt;span style="color: black; background-color: rgb(250, 128, 114);" id="dnl2baSTH-instance44" class="dnl2baSTH-term dnl2baSTH-termColor3"&gt;&lt;/span&gt;&lt;span style="color: black; background-color: rgb(255, 0, 255);" id="dnl2baSTH-instance45" class="dnl2baSTH-term dnl2baSTH-termColor4"&gt;&lt;/span&gt;either delinquent or in foreclosure through August 2008&lt;/li&gt;&lt;li&gt;Subprime ARMs only represent 6.8% of the loans outstanding&lt;br /&gt;&lt;/li&gt;&lt;/ul&gt;So even if we double the current deliquent loses to 20% that would equate to 20% x $12 trillion = $2.4 trillion. While that is a very large number, the amount of money being throw at the problem world wide is much larger. Something is not right and smells of a &lt;a href="http://en.wikipedia.org/wiki/Chewbacca_defence#Chewbacca_defense"&gt;Chewbacca Defence&lt;/a&gt; to me.&lt;br /&gt;&lt;br /&gt;Our suspicions may be confirmed by &lt;a href="http://www.nytimes.com/2008/10/12/opinion/12dooling.html"&gt;this article&lt;/a&gt; talking about how the Wall St quants and traders built a pyramid of debt on top of relatively few assets (&lt;a href="http://en.wikipedia.org/wiki/Asset-backed_security"&gt;ABS&lt;/a&gt;, &lt;a href="http://en.wikipedia.org/wiki/Collateralized_debt_obligation"&gt;CDO&lt;/a&gt;), and then used the speed and power of computers to disguise the true value of the assets:&lt;br /&gt;&lt;br /&gt;&lt;span style="font-style: italic;"&gt;Somehow the genius quants — the best and brightest geeks Wall Street firms could buy — fed $1 trillion in subprime mortgage debt into their supercomputers, added some derivatives, massaged the arrangements with computer algorithms and — poof! — created $62 trillion in imaginary wealth. It’s not much of a stretch to imagine that all of that imaginary wealth is locked up somewhere inside the computers, and that we humans, led by the silverback males of the financial world, Ben Bernanke and Henry Paulson, are frantically beseeching the monolith for answers.&lt;/span&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/21612553-4888883792861367463?l=robertmaldon.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://robertmaldon.blogspot.com/feeds/4888883792861367463/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=21612553&amp;postID=4888883792861367463' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/21612553/posts/default/4888883792861367463'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/21612553/posts/default/4888883792861367463'/><link rel='alternate' type='text/html' href='http://robertmaldon.blogspot.com/2008/10/1-trillion-in-subprime-62-trillion.html' title='$1 trillion in subprime == a $62 trillion financial crisis? wtf?'/><author><name>Robert Maldon</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-21612553.post-5328980719298078030</id><published>2008-09-30T21:52:00.000+10:00</published><updated>2008-09-30T22:49:02.206+10:00</updated><title type='text'>Eight reasons CIOs think developers are clueless</title><content type='html'>I usually blog about things from a developer's perspective, so to give some balance here are some thoughts about how, according to some CIO's,  &lt;a href="http://www.infoworld.com/archives/emailPrint.jsp?R=printThis&amp;amp;A=/article/08/09/03/Eight_reasons_CIOs_think_developers_are_clueless_1.html"&gt;developers need to gain the bigger-picture view of their organisations&lt;/a&gt;:&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;1. Developers Don't Think Practically&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span class="artText"&gt;&lt;span style="font-style: italic;"&gt;Developers often look for an elegant or slick solution to a problem, but they don't always look for the practical one.&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;2. Developers Still Don't See the End-User Perspective&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-style: italic;"&gt;"A development team can create an application that does everything from balance your checkbook to burning your toast, but if the user interface sucks, no one will use it-period. No amount of training or re-training will make users sign on to an application with a difficult UI. That simple concept seems to be a struggle for developers to understand."&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;3. Developers Can't Get Away from the "Wow" Factor&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-style: italic;"&gt;Developers love the "cool" or "wow" factor of applications. CIOs seek stability and standardization. &lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;4. Developers Don't Think About ROI, TCO, and Other Business Priorities&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-style: italic;"&gt;"The developers have a limited number of tasks to do and can pretty much concentrate on one item. Many have spent their career focusing on the development of simple working units, not running a business."&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;5. Developers Don't Get the Underlying IT Value Proposition&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-style: italic;"&gt;The executives that CIOs have as customers are trying to get an answer, perform some function and get their jobs done. "IT to them is like electricity: they need it, but they don't appreciate it."&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;6. Developers Don't Have (or Want) Corporate Skillsets&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-style: italic;"&gt;"I think a survey would show that 80 percent of the CIOs that came up through IT to be a CIO came through the operations side."&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;7. Developers Aren't Into "Group Think"&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-style: italic;"&gt;"Each technical person is different and when asked individually you will find that they do not all share the group opinion, thus solving for the group's suggestions won't bring about all of the desired results."&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;8. Developers Don't Understand Staffing&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-style: italic;"&gt;One CIO says that developers think that profitable companies shouldn't have layoffs, which the CIO feels is clueless. "That's like saying as long as the flowers are growing, you shouldn't prune," the CIO says. "Efficient companies need prune back in areas they grow out of to preserve the strength of the overall company."&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;I don't agree with many of the above generalisations (are you surprised by that? :) ).&lt;br /&gt;&lt;br /&gt;Some developers take a deep interest in a business, others may consider the work as just another job.  That is not particular to developers.&lt;br /&gt;&lt;br /&gt;It is in the interest of management to &lt;/span&gt;&lt;span class="artText"&gt;facilitate getting developers and end-users working closely togther as it usually results in better outcomes.&lt;/span&gt;&lt;span class="artText"&gt; However, in many highly hierarchical and/or highly political work environments it is common practice for managers to keep developers and end-users apart so that all issues and decisions must flow through the manager; the manager often has an incentive (bonus, promotion, etc) to be seen as the driving force of an initiative.&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;I wasn't surprised by the suggestion that 80% of CIOs come up through the operations side of the businesses.&lt;br /&gt;&lt;br /&gt;It's often useful to consider the other point of view :)&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/21612553-5328980719298078030?l=robertmaldon.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://robertmaldon.blogspot.com/feeds/5328980719298078030/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=21612553&amp;postID=5328980719298078030' title='2 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/21612553/posts/default/5328980719298078030'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/21612553/posts/default/5328980719298078030'/><link rel='alternate' type='text/html' href='http://robertmaldon.blogspot.com/2008/09/eight-reasons-cios-think-developers-are.html' title='Eight reasons CIOs think developers are clueless'/><author><name>Robert Maldon</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>2</thr:total></entry><entry><id>tag:blogger.com,1999:blog-21612553.post-6825928712153195785</id><published>2008-09-30T21:41:00.000+10:00</published><updated>2008-09-30T21:50:44.188+10:00</updated><title type='text'>Tsunami Invisibility Cloak</title><content type='html'>&lt;div style="text-align: center;"&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://3.bp.blogspot.com/_3mcDdIZRKc0/SOIQrP_m7iI/AAAAAAAAAho/coKiqwnjs58/s1600-h/tsumani-invisibility-cloak.jpg"&gt;&lt;img style="margin: 0px auto 10px; display: block; text-align: center; cursor: pointer;" src="http://3.bp.blogspot.com/_3mcDdIZRKc0/SOIQrP_m7iI/AAAAAAAAAho/coKiqwnjs58/s400/tsumani-invisibility-cloak.jpg" alt="" id="BLOGGER_PHOTO_ID_5251778450681163298" border="0" /&gt;&lt;/a&gt;&lt;span style="font-weight: bold;"&gt;An invisibility cloak for water waves&lt;/span&gt;&lt;br /&gt;&lt;/div&gt;&lt;br /&gt;A really exciting invention is the above &lt;a href="http://technology.newscientist.com/article/dn14829-invisibility-cloaks-could-take-sting-out-of-tsunamis.html?DCMP=ILC-hmts&amp;amp;nsref=tech1_head_Invisibility%20cloaks%20could%20take%20sting%20out%20of%20tsunamis"&gt;water "invisibility cloak"&lt;/a&gt;. Based on research with bending waves of light around an object to make the object invisible, the same principles have been applied to bending waves of water around an object.&lt;br /&gt;&lt;br /&gt;This technology could be applied on a medium scale to protect things like oil rigs from Tsunamis, and I wonder if a large variation of this could protect small islands?&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/21612553-6825928712153195785?l=robertmaldon.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://robertmaldon.blogspot.com/feeds/6825928712153195785/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=21612553&amp;postID=6825928712153195785' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/21612553/posts/default/6825928712153195785'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/21612553/posts/default/6825928712153195785'/><link rel='alternate' type='text/html' href='http://robertmaldon.blogspot.com/2008/09/tsunami-invisibility-cloak.html' title='Tsunami Invisibility Cloak'/><author><name>Robert Maldon</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://3.bp.blogspot.com/_3mcDdIZRKc0/SOIQrP_m7iI/AAAAAAAAAho/coKiqwnjs58/s72-c/tsumani-invisibility-cloak.jpg' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-21612553.post-4883819880088733808</id><published>2008-09-30T21:33:00.000+10:00</published><updated>2008-09-30T21:37:36.288+10:00</updated><title type='text'>The US government is behind the Nigerian email scam!</title><content type='html'>I had a suspicion the people behind the scam are &lt;a href="http://mashable.com/2008/09/26/us-financial-crisis/"&gt;not the poor Nigerians&lt;/a&gt;...&lt;br /&gt;&lt;blockquote&gt;&lt;p&gt; &lt;span style="font-style: italic;"&gt;From: Henry Paulson&lt;/span&gt;&lt;br /&gt;&lt;span style="font-style: italic;"&gt; Date: 9/23/2008&lt;/span&gt;&lt;br /&gt;&lt;span style="font-style: italic;"&gt; Subject: Urgent transaction - need your help &lt;/span&gt;&lt;/p&gt; &lt;p style="font-style: italic;"&gt;Bright Greetings Dear American:&lt;/p&gt; &lt;p style="font-style: italic;"&gt;I need to ask you to support an urgent and important business relationship with a transfer of funds of great magnitude.&lt;/p&gt; &lt;p style="font-style: italic;"&gt;I am Ministry of Treasury of the Republic of America. My country has had a crisis that has caused the need for a large transfer of funds of 700 billion dollars US. If you would assist me in this transfer, it would be most profitable to you.&lt;/p&gt; &lt;p style="font-style: italic;"&gt;I am working with renowned Mr. Phil Gram, lobbyist for UBS, who will be my replacement as Ministry of Treasury in January. As a Senator, you may know him as the leader of the American banking deregulation movement in the 1990s. This transaction is 100% safe.&lt;/p&gt; &lt;p style="font-style: italic;"&gt;This is a matter of great urgency. We need a blank check. We need the funds as quickly as possible. We cannot directly transfer these funds in the names of our close friends because we are constantly under surveillance. My family lawyer advised me that I should look for reliable and trustworthy person who will act as a next of kin so the funds can be transferred.&lt;/p&gt; &lt;p style="font-style: italic;"&gt;Please reply with all of your bank account, IRA and college fund account numbers and those of your children and grandchildren &lt;span class="4bc4b64"&gt;&lt;a href="mailto:towallstreetbailout@treasury.gov"&gt;towallstreetbailout@treasury.gov&lt;/a&gt;&lt;/span&gt; so that we transfer your commission for this transaction. After I receive you’re information, I will respond with detailed information about safeguards that will be used to protect the funds.&lt;/p&gt; &lt;p style="font-style: italic;"&gt;Wonderful salutations to you cherish friend from Republic of America.&lt;/p&gt; &lt;p style="font-style: italic;"&gt;Yours Faithfully,&lt;br /&gt;Minister of Treasury Paulson &lt;/p&gt;&lt;/blockquote&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/21612553-4883819880088733808?l=robertmaldon.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://robertmaldon.blogspot.com/feeds/4883819880088733808/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=21612553&amp;postID=4883819880088733808' title='1 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/21612553/posts/default/4883819880088733808'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/21612553/posts/default/4883819880088733808'/><link rel='alternate' type='text/html' href='http://robertmaldon.blogspot.com/2008/09/us-government-is-behind-nigerian-email.html' title='The US government is behind the Nigerian email scam!'/><author><name>Robert Maldon</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-21612553.post-3358793856772866927</id><published>2008-09-16T22:03:00.000+10:00</published><updated>2008-09-16T22:14:30.351+10:00</updated><title type='text'>Using your mobile phone to automate proximity computer actions</title><content type='html'>A &lt;a href="http://lifehacker.com/software/hack-attack/automate-proximity-and-location+based-computer-actions-265822.php"&gt;really interesting idea with lots of potential&lt;/a&gt;: using the Bluetooth device in your mobile phone your computer detects when you leave your desk or arrive back at your desk and takes pre-programmed actions, such as locking/unlocking the screen, performing backups, etc.&lt;br /&gt;&lt;br /&gt;Integrating it with a clock and calender could lead to other possible applications such as auto-emailing people when you are headed to a meeting, emailing/IMing the wife when you are heading home, etc.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/21612553-3358793856772866927?l=robertmaldon.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://robertmaldon.blogspot.com/feeds/3358793856772866927/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=21612553&amp;postID=3358793856772866927' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/21612553/posts/default/3358793856772866927'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/21612553/posts/default/3358793856772866927'/><link rel='alternate' type='text/html' href='http://robertmaldon.blogspot.com/2008/09/using-your-mobile-phone-to-automate.html' title='Using your mobile phone to automate proximity computer actions'/><author><name>Robert Maldon</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-21612553.post-5352915638800213254</id><published>2008-09-16T21:27:00.000+10:00</published><updated>2008-09-16T21:35:16.102+10:00</updated><title type='text'>Anti-Theft Lunch Bag Deters Sandwich Thieves</title><content type='html'>&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://2.bp.blogspot.com/_3mcDdIZRKc0/SM-Yexz5SzI/AAAAAAAAAhg/QbbX3Vwyoi8/s1600-h/anti-theft-lunch-bag.png"&gt;&lt;img style="margin: 0px auto 10px; display: block; text-align: center; cursor: pointer;" src="http://2.bp.blogspot.com/_3mcDdIZRKc0/SM-Yexz5SzI/AAAAAAAAAhg/QbbX3Vwyoi8/s400/anti-theft-lunch-bag.png" alt="" id="BLOGGER_PHOTO_ID_5246579745444416306" border="0" /&gt;&lt;/a&gt;Here is a simple but clever idea to &lt;a href="http://lifehacker.com/5050046/anti+theft-lunch-bag-deters-sandwich-thieves"&gt;keep people in the office from pinching your food&lt;/a&gt; (although they may instead throw it out!).&lt;br /&gt;&lt;br /&gt;It reminds me of people I've met in the past who write disgusting things all over their favourite basketball or &lt;a href="http://lifehacker.com/396527/ugly-your-bike-to-deter-thieves"&gt;make their bikes ugly&lt;/a&gt; to deter people from stealing them.&lt;br /&gt;&lt;br /&gt;I wonder if there are benefits to uglifying code? Hhhmmm...&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/21612553-5352915638800213254?l=robertmaldon.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://robertmaldon.blogspot.com/feeds/5352915638800213254/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=21612553&amp;postID=5352915638800213254' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/21612553/posts/default/5352915638800213254'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/21612553/posts/default/5352915638800213254'/><link rel='alternate' type='text/html' href='http://robertmaldon.blogspot.com/2008/09/anti-theft-lunch-bag-deters-sandwich.html' title='Anti-Theft Lunch Bag Deters Sandwich Thieves'/><author><name>Robert Maldon</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://2.bp.blogspot.com/_3mcDdIZRKc0/SM-Yexz5SzI/AAAAAAAAAhg/QbbX3Vwyoi8/s72-c/anti-theft-lunch-bag.png' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-21612553.post-5957230819485665305</id><published>2008-09-13T10:14:00.001+10:00</published><updated>2008-09-13T10:41:59.962+10:00</updated><title type='text'>US election hots up: Palin in a bikini, Battlestar Galactica stars enter the race</title><content type='html'>The US presidential election continues to serve up all sorts of surprises.&lt;br /&gt;&lt;br /&gt;Last year it looked like &lt;a href="http://robertmaldon.blogspot.com/2007/09/bush-cheney-08.html"&gt;Bush and Cheney would ignore the constitution&lt;/a&gt; and make run for a third term.&lt;br /&gt;&lt;br /&gt;Recently McCain made a bold choice in selecting a young-ish, female, gun-toting outsider as his Vice Presidential running mate.&lt;br /&gt;&lt;br /&gt;&lt;div style="text-align: center;"&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://1.bp.blogspot.com/_3mcDdIZRKc0/SMsHjgnhLFI/AAAAAAAAAhQ/1jhl9OpWMzw/s1600-h/PalinInBikini.jpg"&gt;&lt;img style="margin: 0px auto 10px; display: block; text-align: center; cursor: pointer;" src="http://1.bp.blogspot.com/_3mcDdIZRKc0/SMsHjgnhLFI/AAAAAAAAAhQ/1jhl9OpWMzw/s400/PalinInBikini.jpg" alt="" id="BLOGGER_PHOTO_ID_5245294497635576914" border="0" /&gt;&lt;/a&gt;&lt;span style="font-weight: bold;"&gt;&lt;a href="http://elections.foxnews.com/2008/09/10/cnn-reports-palin-bikini-photo-but-fails-to-tell-viewers-its-a-fake/"&gt;Sarah Palin, the next US Vice Preseident&lt;/a&gt;?&lt;/span&gt;&lt;br /&gt;&lt;/div&gt;&lt;br /&gt;And now inspired by McCain's Vietnam war experiences and hard line on terrorism a couple of the characters from Battlestar Galactica have thrown their hat into the ring.&lt;br /&gt;&lt;br /&gt;&lt;div style="text-align: center;"&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://4.bp.blogspot.com/_3mcDdIZRKc0/SMsJHt-I2VI/AAAAAAAAAhY/dOw5bni0Ef4/s1600-h/tighroslin.jpg"&gt;&lt;img style="margin: 0px auto 10px; display: block; text-align: center; cursor: pointer;" src="http://4.bp.blogspot.com/_3mcDdIZRKc0/SMsJHt-I2VI/AAAAAAAAAhY/dOw5bni0Ef4/s400/tighroslin.jpg" alt="" id="BLOGGER_PHOTO_ID_5245296219207031122" border="0" /&gt;&lt;/a&gt;&lt;a href="http://tighroslin2008.com/"&gt;&lt;span style="font-weight: bold;"&gt;tighroslin2008.com&lt;/span&gt;&lt;br /&gt;&lt;/a&gt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/21612553-5957230819485665305?l=robertmaldon.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://robertmaldon.blogspot.com/feeds/5957230819485665305/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=21612553&amp;postID=5957230819485665305' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/21612553/posts/default/5957230819485665305'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/21612553/posts/default/5957230819485665305'/><link rel='alternate' type='text/html' href='http://robertmaldon.blogspot.com/2008/09/us-election-hots-up-palin-in-bikini.html' title='US election hots up: Palin in a bikini, Battlestar Galactica stars enter the race'/><author><name>Robert Maldon</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://1.bp.blogspot.com/_3mcDdIZRKc0/SMsHjgnhLFI/AAAAAAAAAhQ/1jhl9OpWMzw/s72-c/PalinInBikini.jpg' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-21612553.post-8668509086436555081</id><published>2008-08-25T22:45:00.000+10:00</published><updated>2008-08-25T23:06:01.861+10:00</updated><title type='text'>Nearly Half of Employers Have Caught a Lie on a Resume</title><content type='html'>Half of the employers in &lt;a href="http://www.careerbuilder.com/share/aboutus/pressreleasesdetail.aspx?id=pr448&amp;amp;sd=7%2f30%2f2008&amp;amp;ed=12%2f31%2f2008&amp;amp;siteid=cbpr&amp;amp;sc_cmp1=cb_pr448_&amp;amp;cbRecursionCnt=2&amp;amp;cbsid=8d0a84f846bd4cd691030e51212f769e-272969087-VI-4"&gt;this survey&lt;/a&gt; have caught candidates lying on their resume, with some of the more outrageous lies being:&lt;br /&gt;&lt;ul&gt;&lt;li&gt;&lt;span class="cb_style"&gt;Claimed to be a member of the Kennedy family &lt;/span&gt;&lt;/li&gt;&lt;li&gt;&lt;span class="cb_style"&gt;Claimed to be a member of Mensa (duh!)&lt;/span&gt;&lt;/li&gt;&lt;li&gt;&lt;span class="cb_style"&gt;Claimed to have worked for the hiring manager before, but never had &lt;/span&gt;&lt;/li&gt;&lt;li&gt;&lt;span class="cb_style"&gt;Claimed to be the CEO of a company when the candidate was an hourly employee &lt;/span&gt;&lt;/li&gt;&lt;li&gt;&lt;span class="cb_style"&gt;Listed military experience dating back to before he was born &lt;/span&gt;&lt;/li&gt;&lt;li&gt;&lt;span class="cb_style"&gt;Included samples of work, which the interviewer actually did &lt;/span&gt;&lt;/li&gt;&lt;li&gt;&lt;span class="cb_style"&gt;Claimed to be Hispanic when he was 100 percent Caucasian &lt;/span&gt;&lt;/li&gt;&lt;li&gt;&lt;span class="cb_style"&gt;Claimed to have been a professional baseball player &lt;/span&gt;&lt;/li&gt;&lt;/ul&gt;Those beats the guy I interviewed two years ago who claimed to have developed with Spring 5 and Hibernate 6 :)&lt;br /&gt;&lt;br /&gt;Just as interesting are the keywords that employers use to search for candidates (SDLC, e-commerce and n-tier are no longer in vogue!):&lt;br /&gt;&lt;ul&gt;&lt;li&gt;problem-solving and decision-making skills (50 percent)&lt;/li&gt;&lt;li&gt;oral and written communications (44 percent)&lt;/li&gt;&lt;li&gt;customer service or retention (34 percent)&lt;/li&gt;&lt;li&gt;performance and productivity improvement (32 percent)&lt;/li&gt;&lt;li&gt;leadership (30 percent)&lt;/li&gt;&lt;li&gt;technology (27 percent)&lt;/li&gt;&lt;li&gt;team-building (26 percent)&lt;/li&gt;&lt;li&gt;project management (20 percent)&lt;/li&gt;&lt;li&gt;bilingual (14 percent)&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/21612553-8668509086436555081?l=robertmaldon.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://robertmaldon.blogspot.com/feeds/8668509086436555081/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=21612553&amp;postID=8668509086436555081' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/21612553/posts/default/8668509086436555081'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/21612553/posts/default/8668509086436555081'/><link rel='alternate' type='text/html' href='http://robertmaldon.blogspot.com/2008/08/nearly-half-of-employers-have-caught.html' title='Nearly Half of Employers Have Caught a Lie on a Resume'/><author><name>Robert Maldon</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-21612553.post-6411713275177418192</id><published>2008-08-25T22:33:00.000+10:00</published><updated>2008-08-25T22:44:35.684+10:00</updated><title type='text'>Build your own Charging Station</title><content type='html'>A couple of months ago I saw this &lt;a href="http://www.instructables.com/id/Night-Stand-Charging-Station-Lamp/?ALLSTEPS#"&gt;DIY charging stand&lt;/a&gt;:&lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://3.bp.blogspot.com/_3mcDdIZRKc0/SLKnSo_8cEI/AAAAAAAAAhI/6LBGoKgp9o4/s1600-h/diy-charging-stand.jpg"&gt;&lt;img style="margin: 0px auto 10px; display: block; text-align: center; cursor: pointer;" src="http://3.bp.blogspot.com/_3mcDdIZRKc0/SLKnSo_8cEI/AAAAAAAAAhI/6LBGoKgp9o4/s400/diy-charging-stand.jpg" alt="" id="BLOGGER_PHOTO_ID_5238433255270412354" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;What is a charging stand? Its a place where you can plug in all your gadgets for charging overnight.&lt;br /&gt;&lt;br /&gt;If you think about it a "typical" family has lots of gadgets, say a mobile phone for every member of the family, mp3 players, gameboys, iPhone for daddy, portable DVD players, laptops, etc. Instead of having chargers lying all around the house I could see a dedicated charging station as a useful way to tidy things up.&lt;br /&gt;&lt;br /&gt;As one of the comments to the above charging station points out all of the chargers draw power even when their gadgets are not plugged in, so it would be a useful improvement if the charging station turned off when no gadgets are connected.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/21612553-6411713275177418192?l=robertmaldon.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://robertmaldon.blogspot.com/feeds/6411713275177418192/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=21612553&amp;postID=6411713275177418192' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/21612553/posts/default/6411713275177418192'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/21612553/posts/default/6411713275177418192'/><link rel='alternate' type='text/html' href='http://robertmaldon.blogspot.com/2008/08/build-your-own-charging-station.html' title='Build your own Charging Station'/><author><name>Robert Maldon</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://3.bp.blogspot.com/_3mcDdIZRKc0/SLKnSo_8cEI/AAAAAAAAAhI/6LBGoKgp9o4/s72-c/diy-charging-stand.jpg' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-21612553.post-7590691827047573576</id><published>2008-08-25T21:45:00.000+10:00</published><updated>2008-08-25T22:28:20.154+10:00</updated><title type='text'>The Agile Elevator Pitch: It's all about Low Risk</title><content type='html'>I recently saw a technically-focused manager, who was talking to a marketing person, point to an early version (sprint 1) of an application and say:&lt;br /&gt;&lt;br /&gt;&lt;span style="font-style: italic;"&gt;You see, agile means you don't get everything you wanted.&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;The remark surprised me since this manager had been heavily involved in the planning of the application, including prioritising which functionality got built every sprint.&lt;br /&gt;&lt;br /&gt;This got me to thinking once more how I often have to describe agile in 30 second "&lt;a href="http://en.wikipedia.org/wiki/Elevator_pitch"&gt;elevator pitches&lt;/a&gt;" to non-technical people. In the past I've tried to describe agile using terms like "hyper-productive environments" and "delivering increments of functionality", but that never seemed to convey the meaning behind agile. More and more agile seems to me to be all about risk, so I think my elevator pitch is evolving into something like:&lt;br /&gt;&lt;br /&gt;&lt;span style="font-style: italic;"&gt;Agile is a set of low risk practices for delivering working software within the usual constraints of project management (scope, resources, time and quality).&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;What do I mean by low risk? The opposite of high risk :) High risk practices include spending too much time on analysis,  not recognising that requirements will change as people get a chance to interact with the application, trying to build a complex solution based on possible future requirements instead of just what you need for now, putting people in strict roles instead of allowing them to freely interact with each other, and many more. Of course a project may still succeed using high risk practices, it just has a lower probability of doing so.&lt;br /&gt;&lt;br /&gt;So back to the remark that started this train of thought. How would I respond to "agile means you don't get everything you want"? Simply: Regardless of whatever practices or methodologies you use you are still constrained by the usual project management variables (scope, resources, time and quality). Agile or not you will have to make choices.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/21612553-7590691827047573576?l=robertmaldon.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://robertmaldon.blogspot.com/feeds/7590691827047573576/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=21612553&amp;postID=7590691827047573576' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/21612553/posts/default/7590691827047573576'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/21612553/posts/default/7590691827047573576'/><link rel='alternate' type='text/html' href='http://robertmaldon.blogspot.com/2008/08/agile-elevator-pitch-its-all-about-low.html' title='The Agile Elevator Pitch: It&apos;s all about Low Risk'/><author><name>Robert Maldon</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-21612553.post-7516237029367750056</id><published>2008-08-19T21:09:00.000+10:00</published><updated>2008-08-19T21:10:05.221+10:00</updated><title type='text'>.NET 3.5 SP1 Runs Managed Applications From Network Shares</title><content type='html'>&lt;a href="http://www.infoq.com/news/2008/08/.NET-3.5-SP1-Runs-Managed-Code"&gt;Finally!!!&lt;/a&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/21612553-7516237029367750056?l=robertmaldon.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://robertmaldon.blogspot.com/feeds/7516237029367750056/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=21612553&amp;postID=7516237029367750056' title='1 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/21612553/posts/default/7516237029367750056'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/21612553/posts/default/7516237029367750056'/><link rel='alternate' type='text/html' href='http://robertmaldon.blogspot.com/2008/08/net-35-sp1-runs-managed-applications.html' title='.NET 3.5 SP1 Runs Managed Applications From Network Shares'/><author><name>Robert Maldon</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-21612553.post-2700096310389296251</id><published>2008-08-07T18:14:00.001+10:00</published><updated>2008-08-07T20:52:26.579+10:00</updated><title type='text'>Verizon gives someone the Libshitz</title><content type='html'>When I was living in New York it was TimeWarner Cable that often made my blood boil with their poor customer service and lazy attitude to fixing their broken equipment, but TimeWarner is not alone in dragging out issues.&lt;br /&gt;&lt;br /&gt;The &lt;a href="http://www.philly.com/philly/hp/news_update/26089374.html"&gt;sad story of Herman Libshitz&lt;/a&gt; who, when he tried to upgrade from AT&amp;amp;T dial-up to Verizon DSL, was told by Verizon they couldn't do it because his last name contained a naughty word. It turns out their account software had some sort of profanity filter, so Verizon managers suggested Mr Lipshitz deliberatley mis-spell his name instead of going to the effort of requesting the development team in India make a change to the account software.&lt;br /&gt;&lt;br /&gt;As a side note, I've often hoped for the opportunity to write a profanity filter. The actual implementation should be just a basic list matching algo, but it will be fun putting together a list of profane words, variations (e.g. one of two character differences), multiple languages, etc!&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/21612553-2700096310389296251?l=robertmaldon.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://robertmaldon.blogspot.com/feeds/2700096310389296251/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=21612553&amp;postID=2700096310389296251' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/21612553/posts/default/2700096310389296251'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/21612553/posts/default/2700096310389296251'/><link rel='alternate' type='text/html' href='http://robertmaldon.blogspot.com/2008/08/verizon-gives-someone-libshitz.html' title='Verizon gives someone the Libshitz'/><author><name>Robert Maldon</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-21612553.post-6849570460503227604</id><published>2008-08-07T17:58:00.001+10:00</published><updated>2008-08-07T18:13:28.578+10:00</updated><title type='text'>Buzzword Survivor - 36 hours straight of meetings!</title><content type='html'>How many meetings do you think can you handle at a single stretch? Do you think you can sit through 36 hours of vendor presentations - and pay attention- with only 10 minute breaks between presentations? Only the most experienced meeting facilitators will survive &lt;a href="https://forum.defcon.org/forumdisplay.php?f=352"&gt;Buzzword Survivor&lt;/a&gt; and share in $10,000.&lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://2.bp.blogspot.com/_3mcDdIZRKc0/SJqs2-3yuhI/AAAAAAAAAhA/4dqDwkQhLS4/s1600-h/meetings.jpg"&gt;&lt;img style="margin: 0px auto 10px; display: block; text-align: center; cursor: pointer;" src="http://2.bp.blogspot.com/_3mcDdIZRKc0/SJqs2-3yuhI/AAAAAAAAAhA/4dqDwkQhLS4/s400/meetings.jpg" alt="" id="BLOGGER_PHOTO_ID_5231683977734175250" 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/21612553-6849570460503227604?l=robertmaldon.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://robertmaldon.blogspot.com/feeds/6849570460503227604/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=21612553&amp;postID=6849570460503227604' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/21612553/posts/default/6849570460503227604'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/21612553/posts/default/6849570460503227604'/><link rel='alternate' type='text/html' href='http://robertmaldon.blogspot.com/2008/08/buzzword-survivor-36-hours-of-meetings.html' title='Buzzword Survivor - 36 hours straight of meetings!'/><author><name>Robert Maldon</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://2.bp.blogspot.com/_3mcDdIZRKc0/SJqs2-3yuhI/AAAAAAAAAhA/4dqDwkQhLS4/s72-c/meetings.jpg' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-21612553.post-8563941331830645807</id><published>2008-08-06T22:31:00.000+10:00</published><updated>2008-08-06T22:40:37.732+10:00</updated><title type='text'>DoubleClick (Google) to serve ads using Silverlight</title><content type='html'>Google looks like &lt;a href="http://mashable.com/2008/08/05/doubleclick-to-serve-silverlight-ads/"&gt;getting first mover advantage in the Silverlight advertising space&lt;/a&gt;. &lt;a href="http://en.wikipedia.org/wiki/Silverlight"&gt;Silverlight&lt;/a&gt; is of course a Microsoft RIA technology, so MS looks pretty foolish in not leveraging Silverlight for such an obvious use earlier than a major competitor.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/21612553-8563941331830645807?l=robertmaldon.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://robertmaldon.blogspot.com/feeds/8563941331830645807/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=21612553&amp;postID=8563941331830645807' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/21612553/posts/default/8563941331830645807'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/21612553/posts/default/8563941331830645807'/><link rel='alternate' type='text/html' href='http://robertmaldon.blogspot.com/2008/08/doubleclick-google-to-serve-ads-using.html' title='DoubleClick (Google) to serve ads using Silverlight'/><author><name>Robert Maldon</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-21612553.post-7421987631364042032</id><published>2008-07-27T21:04:00.001+10:00</published><updated>2008-08-06T22:47:12.095+10:00</updated><title type='text'>Completion Bonds for software projects</title><content type='html'>My friend &lt;a href="http://ericlefevre.net/wordpress/2008/07/11/agile-2008-whats-in-breaking-acts/"&gt;Eric&lt;/a&gt;, who will be presenting at Agile 2008, points to an &lt;a href="http://submissions.agile2008.org/node/1977"&gt;interesting talk&lt;/a&gt; to be presented at the conference: insuring IT projects by using the equivalent of a &lt;a href="http://en.wikipedia.org/wiki/Completion_guarantee"&gt;completion bond&lt;/a&gt; (&lt;a href="http://www.skillset.org/film/knowledge/article_5105_1.asp"&gt;more&lt;/a&gt; &lt;a href="http://www.eqgroup.com/completion_bond.htm"&gt;info&lt;/a&gt;). [The &lt;a href="http://www.bossavit.com/pivot/pivot/entry.php?id=293"&gt;original idea&lt;/a&gt; is from a Valtec colleague of Eric's.]&lt;br /&gt;&lt;br /&gt;A completion bond, also known as a completion guarantee, is a legal undertaking by the guarantor to the film's financier(s) that the film will be completed and delivered to the specification agreed (i.e. based on the agreed script, featuring the agreed principal cast, being of roughly the agreed length etc.), by the date agreed in their contracts with the producer and within the agreed budget. The guarantor works closely with the films producer and may "step in" (take over) one or more aspects of the film if things are not going according to plan. Corrective action could involve anything from minor tweaks to the budget to bringing in a new director. In the worst case the guarantor will repay the film's financiers, but usually it is usually in everybody's interests to deliver a film, even if it does not meet the full original vision. The guarantor of course charges a fee, which is typically 4% - 6% of the film's budget.&lt;br /&gt;&lt;br /&gt;As a side note, big budget Hollywood films are "self-guaranteed" :)&lt;br /&gt;&lt;br /&gt;It is interesting to contemplate if such a bond could work for IT projects. Some of the pros I can think of:&lt;br /&gt;&lt;ul&gt;&lt;li&gt;Assuming you can find a guarantor with enough IT experience, the guarantor can validate whether the scope/budget/deadlines of the project are realistic or not. (If they are not realistic then the guarantor will sell the bond for a very high price!)&lt;br /&gt;&lt;/li&gt;&lt;li&gt;Many financial clients would be comfortable with the concept of insurance and terms like "strike price" ("production price")&lt;/li&gt;&lt;li&gt;A guarantor would have the authority to force the hard decisions to keep a project on track&lt;br /&gt;&lt;/li&gt;&lt;/ul&gt;and some of the cons:&lt;br /&gt;&lt;ul&gt;&lt;li&gt;I could see the temptation for a guarantor to mainly tweak the budget, rather than guiding major aspects of the project (depends on the skill set of the guarantor I guess)&lt;br /&gt;&lt;/li&gt;&lt;li&gt;Giving regular updates to the guarantor could add significant overhead to small (3-5 people) projects&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/21612553-7421987631364042032?l=robertmaldon.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://robertmaldon.blogspot.com/feeds/7421987631364042032/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=21612553&amp;postID=7421987631364042032' title='2 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/21612553/posts/default/7421987631364042032'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/21612553/posts/default/7421987631364042032'/><link rel='alternate' type='text/html' href='http://robertmaldon.blogspot.com/2008/07/completion-bonds-for-software-projects.html' title='Completion Bonds for software projects'/><author><name>Robert Maldon</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>2</thr:total></entry><entry><id>tag:blogger.com,1999:blog-21612553.post-8837088825305333838</id><published>2008-07-26T20:52:00.001+10:00</published><updated>2008-07-27T21:03:26.099+10:00</updated><title type='text'>Using multi-threaded javascript to simplify AJAX</title><content type='html'>&lt;a href="http://jsthread.sourceforge.net/"&gt;Concurrent.Thread&lt;/a&gt; is a JavaScript library that provides a thread-like syntax similar to that found in Java and C#. e.g. create, stop, sleep, notify and yield methods. (Finally, a sleep function for JavaScript!) This allows you to program in a synchronous way, possibly simplifying code flow and readability compared to the usual callback style of JavaScript.&lt;br /&gt;&lt;br /&gt;For example, a typical asynchronous XMLHttpRequest (AJAX) flow that looks something like this:&lt;br /&gt;&lt;br /&gt;&lt;pre&gt;&lt;br /&gt;var req = new XMLHttpRequest();&lt;br /&gt;req.open("GET", url, true);&lt;br /&gt;req.onreadystatechange = callback1;&lt;br /&gt;req.send(null);&lt;br /&gt;&lt;br /&gt;function callback1() {&lt;br /&gt;  if (req.readyState == 4) {&lt;br /&gt;    if (req.status == 200) {&lt;br /&gt;      alert(req.responseText);&lt;br /&gt;    } else {&lt;br /&gt;      alert(req.statusText); // Error&lt;br /&gt;    }&lt;br /&gt;  }&lt;br /&gt;}&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;could alternatively be implemented in a synchronous way like so:&lt;br /&gt;&lt;br /&gt;&lt;pre&gt;&lt;br /&gt;&amp;lt;script type="text/javascript" src="Concurrent.Thread.js"&amp;gt;&amp;lt;/script&amp;gt;&lt;br /&gt;&amp;lt;script type="text/x-script.multithreaded-js"&amp;gt;&lt;br /&gt;var req = Concurrent.Thread.Http.get(url, ["Accept", "*"]);&lt;br /&gt;if (req.status == 200) {&lt;br /&gt;  alert(req.responseText);&lt;br /&gt;} else {&lt;br /&gt;  alert(req.statusText);&lt;br /&gt;}&lt;br /&gt;&amp;lt;/script&amp;gt;&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;The synchronous code appears more compact, which could help make large application more readable.&lt;br /&gt;&lt;br /&gt;How does Concurrent.Thread implement multi-threading in single threaded browser JavaScript engines? By simulating threads with time slicing.&lt;br /&gt;&lt;br /&gt;Any downsides to using Concurrent.Thread? I suspect it will be a little slower due to simulating threads. It is also a very large download at 500k! (gzip it!)&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/21612553-8837088825305333838?l=robertmaldon.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://robertmaldon.blogspot.com/feeds/8837088825305333838/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=21612553&amp;postID=8837088825305333838' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/21612553/posts/default/8837088825305333838'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/21612553/posts/default/8837088825305333838'/><link rel='alternate' type='text/html' href='http://robertmaldon.blogspot.com/2008/07/using-multi-threaded-javascript-to.html' title='Using multi-threaded javascript to simplify AJAX'/><author><name>Robert Maldon</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-21612553.post-410407607799427904</id><published>2008-07-11T22:50:00.001+10:00</published><updated>2008-12-12T05:35:49.144+11:00</updated><title type='text'>Agile Smells - Do you need agile deodorant?</title><content type='html'>&lt;a href="http://www.notesfromatooluser.com/2008/06/agilescrum-smells.html"&gt;"Agile Smells"&lt;/a&gt; is a catalog of warning signs that your agile project may (or may not) be about to go horribly wrong.&lt;br /&gt;&lt;br /&gt;Let me contribute a few other smells I've come across:&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;"Can you change that estimate? / Can you revise the remaining estimates DOWN?"&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;This is a variation of &lt;a href="http://scrumalliance.pbwiki.com/Executive+Pressure"&gt;Executive Pressure&lt;/a&gt;. After a few sprints the teams velocity stabilizes and it becomes clear the hoped for project deadline can not be met. Instead of adjusting the usual project management variables - time, scope, resources (and quality, although quality should be the last variable to be sacrificed) - the initial reaction is to apply pressure to the developers to work longer hours . In most cases it was not the developers who set the original project deadline. A more constructive approach is to and adjust the usual variables as the project progresses.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;Sign-Off&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;"You can't change your mind. It's been signed off!" You're still thinking waterfall. Accept that the business owners will change their minds - for any number of reasons - even after the corresponding story has been completed. Any changes become a new story, which of course has to be prioritised.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;"What is a chicken?"&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;Although people may say they have committed to using agile it is often not a priority for them to do some basic reading on the subject. For example, I've lent people the very thin and straight-to-the-point &lt;a href="http://www.amazon.com/Agile-Software-Development-SCRUM/dp/0130676349/ref=sr_11_1?ie=UTF8&amp;amp;qid=1215781423&amp;amp;sr=11-1"&gt;Agile Software Development with Scrum&lt;/a&gt;, but if a few days later they can't tell me the story of the Chicken and the Pig then I know they are not that interested in the subject.&lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://4.bp.blogspot.com/_3mcDdIZRKc0/SHdZu51_TMI/AAAAAAAAAg4/ENvtHXYLrJQ/s1600-h/ham_and_eggs.jpg"&gt;&lt;img style="margin: 0px auto 10px; display: block; text-align: center; cursor: pointer;" src="http://4.bp.blogspot.com/_3mcDdIZRKc0/SHdZu51_TMI/AAAAAAAAAg4/ENvtHXYLrJQ/s400/ham_and_eggs.jpg" alt="" id="BLOGGER_PHOTO_ID_5221740955295501506" 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/21612553-410407607799427904?l=robertmaldon.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://robertmaldon.blogspot.com/feeds/410407607799427904/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=21612553&amp;postID=410407607799427904' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/21612553/posts/default/410407607799427904'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/21612553/posts/default/410407607799427904'/><link rel='alternate' type='text/html' href='http://robertmaldon.blogspot.com/2008/07/agile-smells-do-you-need-agile.html' title='Agile Smells - Do you need agile deodorant?'/><author><name>Robert Maldon</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://4.bp.blogspot.com/_3mcDdIZRKc0/SHdZu51_TMI/AAAAAAAAAg4/ENvtHXYLrJQ/s72-c/ham_and_eggs.jpg' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-21612553.post-3486658044188220215</id><published>2008-07-11T22:24:00.001+10:00</published><updated>2008-07-11T22:45:18.695+10:00</updated><title type='text'>150 Funniest Resume Mistakes, Bloopers and Blunders Ever</title><content type='html'>If you've ever had to wade through a ton of resumes to find a few good people then you may have come across &lt;a href="http://jobmob.co.il/blog/funniest-resume-mistakes/"&gt;a few of these&lt;/a&gt;:&lt;br /&gt;&lt;ul&gt;&lt;li&gt;“Career break in 1999 to renovate my horse”&lt;/li&gt;&lt;li&gt;Hobbies: “enjoy cooking Chinese and Italians”&lt;/li&gt;&lt;li&gt;Candidate wrote résumé as a play - Act 1, Act 2, etc.&lt;/li&gt;&lt;li&gt;“Skills: Strong Work Ethic, Attention to Detail, Team Player, Self Motivated, Attention to Detail”&lt;/li&gt;&lt;li&gt;Why Interested in Position: “to keep my parole officer from putting back me in jail”&lt;/li&gt;&lt;li&gt;Experience: “Have not yet been abducted by aliens.”&lt;/li&gt;&lt;li&gt;“Consistently tanked as top sales producer for new accounts.”&lt;/li&gt;&lt;li&gt;“It’s best for employers that I not work with people.”&lt;/li&gt;&lt;li&gt;“Personal interests: donating blood. Fourteen gallons so far.”&lt;/li&gt;&lt;li&gt;Skills: “I have technical skills that will take your breath away.”&lt;/li&gt;&lt;li&gt;Accomplishments: “Brought in a balloon artist to entertain the team.”&lt;/li&gt;&lt;li&gt;Personal: “My family is willing to relocate. However not to New England (too cold) and not to Southern California (earthquakes). Indianapolis or Chicago would be fine. My youngest prefers Orlando’s proximity to Disney World.”&lt;/li&gt;&lt;li&gt;Background: “28 dog years of experience in sales (four human).”&lt;/li&gt;&lt;li&gt;Objective: “I am anxious to use my exiting skills.”&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/21612553-3486658044188220215?l=robertmaldon.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://robertmaldon.blogspot.com/feeds/3486658044188220215/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=21612553&amp;postID=3486658044188220215' title='1 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/21612553/posts/default/3486658044188220215'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/21612553/posts/default/3486658044188220215'/><link rel='alternate' type='text/html' href='http://robertmaldon.blogspot.com/2008/07/150-funniest-resume-mistakes-bloopers.html' title='150 Funniest Resume Mistakes, Bloopers and Blunders Ever'/><author><name>Robert Maldon</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-21612553.post-8414363341421840692</id><published>2008-07-03T21:51:00.000+10:00</published><updated>2008-12-12T05:35:49.865+11:00</updated><title type='text'>Google/Yahoo! may soon be able to "search" your Flash applications</title><content type='html'>A consideration for building any consumer focused website is that many of the new breed of &lt;a href="http://en.wikipedia.org/wiki/Rich_Internet_application"&gt;Rich Internet Application (RIA)&lt;/a&gt; technologies (AJAX,&lt;span style="text-decoration: underline;"&gt;&lt;/span&gt; Flash, Silverlight, etc) are not easily navigated by search engines ("indexed"), and therefore sites that are RIA-heavy do not appear at the top of searches people do for relevant terms.&lt;br /&gt;&lt;br /&gt;Those &lt;a href="http://en.wikipedia.org/wiki/Search_engine_optimization"&gt;Search Engine Optimization (SEO)&lt;/a&gt;  consultants you've hired to look over your website probably told you to go easy on the &lt;a href="http://en.wikipedia.org/wiki/Adobe_Flash"&gt;Flash&lt;/a&gt; animations. But that may be about to change. Adobe &lt;a href="http://www.adobe.com/aboutadobe/pressroom/pressreleases/200806/070108AdobeRichMediaSearch.html"&gt;announced a couple of days ago&lt;/a&gt; that they will be working closely with Google and Yahoo! to &lt;a href="http://blog.digitalbackcountry.com/?p=1470"&gt;provide technology to extract indexable content from Flash files&lt;/a&gt;:&lt;br /&gt;&lt;br /&gt;&lt;span style="font-style: italic;"&gt;"...We are giving a special, search-engine optimized Flash Player to Yahoo and Google which is going to help them crawl through every bit of your SWF file. This Flash Player will act just like a person would in some cases. It will click on your buttons, it will move through the states of your application, get data from the server when your application normally would, and it will capture all of the text and data that you’ve got inside of your Flash-based application..."&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;That sounds pretty grand. Google have posted a more down-to-earth explanation of &lt;a href="http://googlewebmastercentral.blogspot.com/2008/06/improved-flash-indexing.html"&gt;what they expect to index from Flash files&lt;/a&gt;, which includes text-based stuff like blocks of text and URLs. (You can hide text from Google by turning it into an image :))&lt;br /&gt;&lt;br /&gt;&lt;div style="text-align: center;"&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://4.bp.blogspot.com/_3mcDdIZRKc0/SGzIiGBRLrI/AAAAAAAAAgw/zuwo6njO6qs/s1600-h/flashplayer_for_search_indexing.jpg"&gt;&lt;img style="margin: 0px auto 10px; display: block; text-align: center; cursor: pointer;" src="http://4.bp.blogspot.com/_3mcDdIZRKc0/SGzIiGBRLrI/AAAAAAAAAgw/zuwo6njO6qs/s400/flashplayer_for_search_indexing.jpg" alt="" id="BLOGGER_PHOTO_ID_5218766556272602802" border="0" /&gt;&lt;/a&gt;(Picture from &lt;a href="http://dougmccune.com/blog/2008/07/02/how-adobes-special-search-indexing-flash-player-works/"&gt;Doug McCune's blog&lt;/a&gt;)&lt;br /&gt;&lt;/div&gt;&lt;br /&gt;So how do you get your Flash-heavy site to the top of Google? Nobody knows since the Google rank algorithm is proprietary and constantly being tweaked. [NOTE TO SELF - Which reminds me, I must get around to doing a blog post on SEO since I've seen many clients come up with a grand vision for a website, only to have to make radical changes once SEO is considered.]&lt;br /&gt;&lt;br /&gt;Equally interesting is the fact that Microsoft was not mentioned in the press release. Was Microsoft given the opportunity to participate? Did they not want to participate as that may give Flash an advantage over their own &lt;a href="http://en.wikipedia.org/wiki/Silverlight"&gt;Silverlight&lt;/a&gt; RIA technology? Or maybe Microsoft are interested in promoting a &lt;a href="http://www.techcrunch.com/2008/07/02/interview-with-barney-pell-and-ramez-naam-about-microsoft%e2%80%99s-powerset-acquisition-integration-to-begin-this-year/"&gt;non-keyword based way to search&lt;/a&gt;.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/21612553-8414363341421840692?l=robertmaldon.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://robertmaldon.blogspot.com/feeds/8414363341421840692/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=21612553&amp;postID=8414363341421840692' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/21612553/posts/default/8414363341421840692'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/21612553/posts/default/8414363341421840692'/><link rel='alternate' type='text/html' href='http://robertmaldon.blogspot.com/2008/07/googleyahoo-may-soon-be-able-to-search.html' title='Google/Yahoo! may soon be able to &quot;search&quot; your Flash applications'/><author><name>Robert Maldon</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://4.bp.blogspot.com/_3mcDdIZRKc0/SGzIiGBRLrI/AAAAAAAAAgw/zuwo6njO6qs/s72-c/flashplayer_for_search_indexing.jpg' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-21612553.post-6940924364030532741</id><published>2008-06-28T21:19:00.000+10:00</published><updated>2008-06-28T21:46:12.575+10:00</updated><title type='text'>Is Iona finally in the deadpool?</title><content type='html'>Iona Technologies, a company that caused me a lot of pain with their complex and buggy &lt;a href="http://en.wikipedia.org/wiki/Corba"&gt;CORBA&lt;/a&gt; products, was &lt;a href="http://www.ireland.com/newspaper/frontpage/2008/0626/1214432054131.html?via=me"&gt;sold a few days ago for just $162 million dollars&lt;/a&gt; - or $4 a share, down from $98 a share at the dot com hight in 2000.&lt;br /&gt;&lt;br /&gt;Iona was an early implementer of CORBA in both the C++ and Java spaces with their &lt;a href="http://en.wikipedia.org/wiki/Orbix"&gt;Orbix&lt;/a&gt; product. Typical of early implementations of new technologies they did proprietary extensions to fill obvious gaps in the CORBA specs, and just as typical of early implementors they got lazy and failed to keep up with cleaner ways of doing things as the specs evolved. gggrrrr. Orbix became one of those license fee legacy cash cows.&lt;br /&gt;&lt;br /&gt;I got some perverse enjoyment replacing Orbix with the open source &lt;a href="http://omniorb.sourceforge.net/"&gt;omniORB&lt;/a&gt; (solid as a rock!) whenever I had the chance. Its poor performance inspired a colleague and myself to begin writing a "real-time" ORB, but we never finished the product.&lt;br /&gt;&lt;br /&gt;On a scary note I mentioned the Iona acquisition to a mid-level developer colleague of mine and he asked "What is CORBA?". I'm getting to old for this sh... shell scripting.&lt;br /&gt;&lt;br /&gt;Although Iona is no more I'm sure Orbix will live on in legacy systems for a while. We'll meet again :)&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/21612553-6940924364030532741?l=robertmaldon.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://robertmaldon.blogspot.com/feeds/6940924364030532741/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=21612553&amp;postID=6940924364030532741' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/21612553/posts/default/6940924364030532741'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/21612553/posts/default/6940924364030532741'/><link rel='alternate' type='text/html' href='http://robertmaldon.blogspot.com/2008/06/is-iona-finally-in-deadpool.html' title='Is Iona finally in the deadpool?'/><author><name>Robert Maldon</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-21612553.post-7510129642973111813</id><published>2008-06-28T21:05:00.001+10:00</published><updated>2008-07-06T21:20:26.235+10:00</updated><title type='text'>UK students "outsource" their IT coursework to India</title><content type='html'>Students who don't want to do their assignments have traditionally ask a friend or tried to borrow a copy from someone in previous years. Now they have another option - &lt;a href="http://management.silicon.com/careers/0,39024849,39250909,00.htm"&gt;outsource the assignment to India!&lt;/a&gt; :&lt;br /&gt;&lt;br /&gt;&lt;span style="font-style: italic;"&gt;"A-level and university pupils are logging onto computer coding websites and farming out their work to foreign IT graduates...&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-style: italic;"&gt;The majority of these students are studying an IT-related course and about one third are from the UK.&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-style: italic;"&gt;Students contract their work to the lowest bidder, with prices ranging from £5 for simple undergraduate coursework, to £100 for postgraduate dissertations...&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-style: italic;"&gt;Lancaster and fellow City lecturer Robert Clarke are calling on the government to set up a national database of university assignments so they can be matched against contract requests on coding websites and traced back to students."&lt;/span&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/21612553-7510129642973111813?l=robertmaldon.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://robertmaldon.blogspot.com/feeds/7510129642973111813/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=21612553&amp;postID=7510129642973111813' title='2 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/21612553/posts/default/7510129642973111813'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/21612553/posts/default/7510129642973111813'/><link rel='alternate' type='text/html' href='http://robertmaldon.blogspot.com/2008/06/uk-students-outsource-their-it.html' title='UK students &quot;outsource&quot; their IT coursework to India'/><author><name>Robert Maldon</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>2</thr:total></entry><entry><id>tag:blogger.com,1999:blog-21612553.post-645893653097377613</id><published>2008-06-21T22:02:00.001+10:00</published><updated>2008-06-23T17:51:31.913+10:00</updated><title type='text'>Yahoo! Rezinr - a Do-It-Yourself Resignation Letter</title><content type='html'>Things are looking pretty grim at Yahoo! with &lt;a href="http://www.techcrunch.com/2008/06/21/updated-yahoo-exec-tracker-114-execs-left-since-january-2007/"&gt;a large number of executives resigning&lt;/a&gt;. To help Yahoo! employees some kind sole has created a tool to &lt;a href="http://www.yahoorezinr.com/"&gt;help you write a resignation letter&lt;/a&gt;!&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/21612553-645893653097377613?l=robertmaldon.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://robertmaldon.blogspot.com/feeds/645893653097377613/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=21612553&amp;postID=645893653097377613' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/21612553/posts/default/645893653097377613'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/21612553/posts/default/645893653097377613'/><link rel='alternate' type='text/html' href='http://robertmaldon.blogspot.com/2008/06/yahoo-rezinr-do-it-yourself-resignation.html' title='Yahoo! Rezinr - a Do-It-Yourself Resignation Letter'/><author><name>Robert Maldon</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-21612553.post-611318928461450284</id><published>2008-06-21T17:32:00.000+10:00</published><updated>2008-06-21T17:41:55.071+10:00</updated><title type='text'>Never mind the email Spam, watch out for the SPIT (SPam over Internet Telephony)</title><content type='html'>I don't know why it hadn't occurred to me before, particularly since I got rid of my home phone a few years ago in favor of a mobile phone for quick calls and a VoIP solution (Skype, Yahoo! Voice, etc) for longer calls, but I can't wait for &lt;a href="http://arxivblog.com/?p=467"&gt;spam to interrupt one of my VoIP calls&lt;/a&gt;.&lt;br /&gt;&lt;br /&gt;Semi-related: &lt;a href="http://www.itsecurity.com/features/diy-wiretapping-061708/"&gt;DIY Wiretapping&lt;/a&gt; (including &lt;a href="http://www.macvoip.com/resources/voip_record_calls.php"&gt;recording VoIP calls&lt;/a&gt;).&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/21612553-611318928461450284?l=robertmaldon.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://robertmaldon.blogspot.com/feeds/611318928461450284/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=21612553&amp;postID=611318928461450284' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/21612553/posts/default/611318928461450284'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/21612553/posts/default/611318928461450284'/><link rel='alternate' type='text/html' href='http://robertmaldon.blogspot.com/2008/06/never-mind-email-spam-watch-out-for.html' title='Never mind the email Spam, watch out for the SPIT (SPam over Internet Telephony)'/><author><name>Robert Maldon</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-21612553.post-3457065809865403016</id><published>2008-05-30T15:53:00.000+10:00</published><updated>2008-05-30T16:26:49.922+10:00</updated><title type='text'>The end of the set-top box, powered by Java (true2way)?</title><content type='html'>Sony and six large US cable companies - Comcast , Time Warner Cable, Cox, Charter, Cablevision and Bright House Networks - have &lt;a href="http://www.pcmag.com/article2/0,2817,2309865,00.asp"&gt;agreed to adopt a standard&lt;/a&gt; that will allow consumers to access interactive digital and high-definition video without the assistance of a set-top cable box.&lt;br /&gt;&lt;br /&gt;The hardware interface is governed by the &lt;a href="http://en.wikipedia.org/wiki/CableCARD"&gt;CableCard&lt;/a&gt; standard, and &lt;a href="http://en.wikipedia.org/wiki/Tru2Way"&gt;true2way&lt;/a&gt; is the Java-based middleware software used to control services.&lt;br /&gt;&lt;br /&gt;True2way was previously known as &lt;a href="http://en.wikipedia.org/wiki/OpenCable"&gt;OpenCable&lt;/a&gt;. true2way specs, Java sdk, etc are &lt;a href="http://www.opencable.com/"&gt;here&lt;/a&gt;; developer community site &lt;a href="https://opencable.dev.java.net/"&gt;here&lt;/a&gt;.&lt;br /&gt;&lt;br /&gt;The real goal behind these standards is to prevent any one set-top company from dominating and dictating to the cable companies. Currently Motorola and Scientific Atlanta (owned by Cisco)  are the two leading set-top providers in the US.&lt;br /&gt;&lt;br /&gt;I'm curious to see if adoption of these standards will create a market for small content providers, or will the cable companies who control the "gateways" to your TV restrict access like the telcos did when they adopted WAP? Or will the convergence of PC/Internet/TV kill cable?&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/21612553-3457065809865403016?l=robertmaldon.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://robertmaldon.blogspot.com/feeds/3457065809865403016/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=21612553&amp;postID=3457065809865403016' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/21612553/posts/default/3457065809865403016'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/21612553/posts/default/3457065809865403016'/><link rel='alternate' type='text/html' href='http://robertmaldon.blogspot.com/2008/05/end-of-set-top-box-powered-by-java.html' title='The end of the set-top box, powered by Java (true2way)?'/><author><name>Robert Maldon</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-21612553.post-8269748748223929546</id><published>2008-05-29T15:34:00.000+10:00</published><updated>2008-05-29T16:09:10.807+10:00</updated><title type='text'>Reduce your server load by using Google hosted open source javascript libraries</title><content type='html'>When building a medium- to heavily-used webapp a common best practice is to separate the static content (static html, images, javascript files) from the dynamic content, then have the static content served up by Apache/IIS or even a web cache. Generally you try to off load whatever content you can from your dynamic content server to something that can handle static content more efficiently.&lt;br /&gt;&lt;br /&gt;If you are using one of the common open source javascript libraries like Dojo, prototype or jQuery you'll have to bundle a copy of said library with your application, which of course will be downloaded to the browser from your website because browsers are not smart enough to realize that "I already downloaded and cached Dojo version 1.1 from another website I looked at recently".&lt;br /&gt;&lt;br /&gt;Wouldn't it be great if a company with a reputation for high availability and lots of bandwidth hosted some of the common javascript libraries so that your website and others could benefit from caching? Well, &lt;a href="http://code.google.com/apis/ajaxlibs/"&gt;Google AJAX Libraries API&lt;/a&gt; provides such a service. A downside of course is that Google could track some of the users of your website :)&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/21612553-8269748748223929546?l=robertmaldon.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://robertmaldon.blogspot.com/feeds/8269748748223929546/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=21612553&amp;postID=8269748748223929546' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/21612553/posts/default/8269748748223929546'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/21612553/posts/default/8269748748223929546'/><link rel='alternate' type='text/html' href='http://robertmaldon.blogspot.com/2008/05/reduce-your-server-load-by-using-google.html' title='Reduce your server load by using Google hosted open source javascript libraries'/><author><name>Robert Maldon</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-21612553.post-335574901769774920</id><published>2008-05-29T14:28:00.001+10:00</published><updated>2008-06-03T14:49:13.222+10:00</updated><title type='text'>Real-time stock quotes soon to be free over the internet?</title><content type='html'>20 years ago if you wanted a real-time stock quote you had to phone up your broker.&lt;br /&gt;&lt;br /&gt;Then along came the internet and you could get real-time quotes for a fee from your broker's website or for free with a 15-20 minute delay on sites like Yahoo! Finance and money.cnn.com.&lt;br /&gt;&lt;br /&gt;Now, Bats Trading, one of the larger ECN alternatives to the NYSE and Nasdaq has agreed to &lt;a href="http://www.finextra.com/fullstory.asp?id=18523"&gt;stream real-time quotes direct to Yahoo! Finance&lt;/a&gt;.&lt;br /&gt;&lt;br /&gt;Gotta love competition in big markets like the US :)&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold; font-style: italic;"&gt;Update&lt;/span&gt;: Now the &lt;a href="http://www.finextra.com/fullstory.asp?id=18538"&gt;Nasdaq have agreed to provide real-time quotes&lt;/a&gt; to Google Finance, the Wall Street Journal, CNBC and Xignite.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/21612553-335574901769774920?l=robertmaldon.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://robertmaldon.blogspot.com/feeds/335574901769774920/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=21612553&amp;postID=335574901769774920' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/21612553/posts/default/335574901769774920'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/21612553/posts/default/335574901769774920'/><link rel='alternate' type='text/html' href='http://robertmaldon.blogspot.com/2008/05/real-time-stock-quotes-soon-to-be-free.html' title='Real-time stock quotes soon to be free over the internet?'/><author><name>Robert Maldon</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-21612553.post-6559787108757424153</id><published>2008-05-25T20:38:00.000+10:00</published><updated>2008-05-25T21:50:37.281+10:00</updated><title type='text'>Cisco Etch - a replacement for SOAP, or just another CORBA? And why is there still no binary protocol version of SOAP?</title><content type='html'>I see that Cisco are planning to &lt;a href="http://www.cio.com/article/print/365513"&gt;release and open source a new RPC protocol called Etch&lt;/a&gt; later this year. Goals of Etch:&lt;br /&gt;&lt;ul&gt;&lt;li&gt;RPC protocol without the compatibility and complexity issues of SOAP&lt;br /&gt;&lt;/li&gt;&lt;li&gt;Mappings across many langauges (C# and Java to begin with, Python and Ruby later)&lt;/li&gt;&lt;li&gt;&lt;a href="http://en.wikipedia.org/wiki/Interface_description_language"&gt;IDL&lt;/a&gt; based&lt;br /&gt;&lt;/li&gt;&lt;li&gt;IDE support&lt;/li&gt;&lt;/ul&gt;Performance is supposed to be significantly better than SOAP:&lt;br /&gt;&lt;br /&gt;&lt;span style="font-style: italic;"&gt;In a testbed environment where SOAP was managing around 900 calls a second, Etch generated more than 50,000 messages in a one-way mode, and 15,000 transactions with a full round-trip, company officials stated.&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;Although not mentioned in the article I'm willing to bet Etch is a binary protocol (implied by performance and Cisco's network heritage). So if it is cross-language, IDL based and binary, what is the difference between Etch and &lt;a href="http://en.wikipedia.org/wiki/CORBA"&gt;CORBA&lt;/a&gt;?&lt;br /&gt;&lt;br /&gt;The performance of SOAP is something that constantly disappoints me whenever I develop a large-scale web service. After many years debating the topic the SOAP standards people&lt;a href="http://en.wikipedia.org/wiki/Binary_XML"&gt; still haven't come up with a binary version&lt;/a&gt;. Because text based XML is a 'standard' there is little you can do to boost SOAP performance other than throw more hardware at it, usually by running many instances of the web service.&lt;br /&gt;&lt;br /&gt;I haven't had the cash to try xml &lt;a href="http://www-306.ibm.com/software/integration/datapower/"&gt;hardware&lt;/a&gt; &lt;a href="http://softwarecommunity.intel.com/isn/downloads/intelavx/Intel%20XML%20Parsing%20Accelerator%20w%20Intel%20SSE4_WP.pdf"&gt;acceleration&lt;/a&gt; :)&lt;br /&gt;&lt;br /&gt;Microsoft have a proprietary .NET-to-.NET binary version of SOAP,  and &lt;a href="http://hessian.caucho.com/"&gt;Hessian&lt;/a&gt; is a notable open source  binary SOAP (&lt;a href="http://daniel.gredler.net/2008/01/07/java-remoting-protocol-benchmarks/"&gt;benchmarks here&lt;/a&gt;).&lt;br /&gt;&lt;br /&gt;When I get the time I'm curious to see if the &lt;a href="http://vtd-xml.sourceforge.net/"&gt;VTD-XML&lt;/a&gt; parser can help boost application performance. The doco for this project implies that the author first tried to patent his XML parsing techniques and sell them to the likes of Sun, but for some reason nobody bought it. Now the author has released C, Java and C# implementations under the GPL license, but he won't release the source code :)&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/21612553-6559787108757424153?l=robertmaldon.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://robertmaldon.blogspot.com/feeds/6559787108757424153/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=21612553&amp;postID=6559787108757424153' title='1 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/21612553/posts/default/6559787108757424153'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/21612553/posts/default/6559787108757424153'/><link rel='alternate' type='text/html' href='http://robertmaldon.blogspot.com/2008/05/cisco-etch-replacement-for-soap-or-just.html' title='Cisco Etch - a replacement for SOAP, or just another CORBA? And why is there still no binary protocol version of SOAP?'/><author><name>Robert Maldon</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-21612553.post-7122630680885363289</id><published>2008-05-22T17:59:00.000+10:00</published><updated>2008-05-22T18:24:45.540+10:00</updated><title type='text'>Build your own Java CMS?</title><content type='html'>I've encountered a number of &lt;a href="http://en.wikipedia.org/wiki/Content_management_system"&gt;Content Management Systems (CMS)&lt;/a&gt; in recent web based projects, both commercial and open source. Many of them can cope with minor tweaks, but even the open source variants cannot be easily modified to add significant features (I'm looking at you &lt;a href="http://www.alfresco.com/"&gt;Alfresco&lt;/a&gt; :)). Or maybe this is true with just the Java open source variants (I haven't tried some of the heavily used PHP CMSssss like &lt;a href="http://www.joomla.org/"&gt;Joomla&lt;/a&gt;).&lt;br /&gt;&lt;br /&gt;My thoughts on CMS have been drifting towards a CMS core that is only a core, much like &lt;a href="http://lucene.apache.org/"&gt;Lucene&lt;/a&gt; is just a core search engine without being tied to a particular UI or data store. Today I might have stumbled across such a CMS core - &lt;a href="http://www.riotfamily.org/"&gt;riotfamily.org&lt;/a&gt;. I'll definitely look into it in more detail.&lt;br /&gt;&lt;br /&gt;The downside of using a core is, of course, that you have to build supporting infrastructure around it - which is no big deal for someone like me who writes custom applications for a living :)&lt;br /&gt;&lt;br /&gt;The &lt;a href="http://www.cmsmatrix.org/"&gt;CMS Matrix&lt;/a&gt; has a pretty extensive comparison of CMS products.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/21612553-7122630680885363289?l=robertmaldon.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://robertmaldon.blogspot.com/feeds/7122630680885363289/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=21612553&amp;postID=7122630680885363289' title='16 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/21612553/posts/default/7122630680885363289'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/21612553/posts/default/7122630680885363289'/><link rel='alternate' type='text/html' href='http://robertmaldon.blogspot.com/2008/05/build-your-own-java-cms.html' title='Build your own Java CMS?'/><author><name>Robert Maldon</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>16</thr:total></entry><entry><id>tag:blogger.com,1999:blog-21612553.post-9220493691816215642</id><published>2008-05-22T17:26:00.000+10:00</published><updated>2008-05-22T17:58:12.557+10:00</updated><title type='text'>Moody's coding error gave AAA rating to CPDOs?</title><content type='html'>A &lt;a href="http://www.ft.com/cms/s/0/0c82561a-2697-11dd-9c95-000077b07658.html"&gt;story&lt;/a&gt; on how Moody's gave AAA ratings to the then new debt instrument Constant Proportion Debt Obligations - &lt;a href="http://www.ft.com/cms/s/0/09a762ee-2699-11dd-9c95-000077b07658,dwp_uuid=5fd271ee-61f6-11dc-bdf6-0000779fd2ac.html"&gt;CPDOs&lt;/a&gt; (not C3POs!) - only to later discover an error in their models should have rated the instruments as much riskier&lt;span style="text-decoration: underline;"&gt;&lt;/span&gt;. Ouch. What makes it worse, however, is that Moody's managers kept quiet about it when they discovered the flaw.&lt;br /&gt;&lt;br /&gt;The story sounds a little suspicious to me (I smell a scapegoat) because Standard &amp;amp; Poors, the other major ratings agency, gave the same AAA rating to the instruments. Did both agencies "arrive" at the same rating under pressure by various financial institutions? (It takes rating from two agencies before a new instrument can be traded.)&lt;br /&gt;&lt;br /&gt;If the subprime crisis hasn't already reminded people that you can't blindly trust the ratings agencies...&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/21612553-9220493691816215642?l=robertmaldon.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://robertmaldon.blogspot.com/feeds/9220493691816215642/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=21612553&amp;postID=9220493691816215642' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/21612553/posts/default/9220493691816215642'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/21612553/posts/default/9220493691816215642'/><link rel='alternate' type='text/html' href='http://robertmaldon.blogspot.com/2008/05/moodys-coding-error-gave-aaa-rating-to.html' title='Moody&apos;s coding error gave AAA rating to CPDOs?'/><author><name>Robert Maldon</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-21612553.post-4989314333212251769</id><published>2008-05-15T19:57:00.000+10:00</published><updated>2008-05-15T20:20:09.989+10:00</updated><title type='text'>eBoostr - bring Vista's ReadyBoost and SuperFetch to XP</title><content type='html'>Although many people say Vista's &lt;a href="http://en.wikipedia.org/wiki/ReadyBoost"&gt;ReadyBoost&lt;/a&gt; - uses portable massive flash storage as a drive for disk cache - doesn't improve performance I was interested to see a private company had come up with a similar solution for XP.&lt;br /&gt;&lt;br /&gt;The &lt;a href="http://www.eboostr.com/"&gt;eBoostr&lt;/a&gt; software allows you to use a USB drive as a memory cache. As a number of people have commented, for the price of the software ($39) plus the cost of the USB drive you could get on board memory for cheaper. However, I might have a use for this: In the past some of my clients have been reluctant to supply PCs with enough memory to run a full development environment (e.g. Java + Eclipse + JBoss + MS Office) , so instead of making an issue of it a nice solution would be to install eBoostr :)&lt;br /&gt;&lt;br /&gt;Speaking of USB drives, I'm tempted to try out &lt;a href="http://www.mojopac.com/"&gt;MojoPac&lt;/a&gt; which allows you to carry around your own XP data files, applications and environment on a USB drive :)&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/21612553-4989314333212251769?l=robertmaldon.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://robertmaldon.blogspot.com/feeds/4989314333212251769/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=21612553&amp;postID=4989314333212251769' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/21612553/posts/default/4989314333212251769'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/21612553/posts/default/4989314333212251769'/><link rel='alternate' type='text/html' href='http://robertmaldon.blogspot.com/2008/05/eboostr-bring-vistas-readyboost-and.html' title='eBoostr - bring Vista&apos;s ReadyBoost and SuperFetch to XP'/><author><name>Robert Maldon</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-21612553.post-7295904373460681629</id><published>2008-05-15T19:40:00.000+10:00</published><updated>2008-05-15T19:54:58.213+10:00</updated><title type='text'>Google Doctype - web developer resource encyclopedia</title><content type='html'>When I first heard Google launched "Google Doctype" I thought "oh no, Google are creating their own web page DOCTYPEs?" Fortuntely the answer is no.&lt;br /&gt;&lt;br /&gt;&lt;a href="http://code.google.com/docreader/#p%28doctype%29s%28doctype%29t%28Welcome%29"&gt;Google Doctype&lt;/a&gt; is an encyclopedia for web developers, containing pretty complete HTML, DOM and CSS references as well as some useful javascript snippets and HOWTOs on security, style, DOM manipulation, etc.&lt;br /&gt;&lt;br /&gt;If you have a Google account you can also hit the Edit link, wiki style :)&lt;br /&gt;&lt;br /&gt;I'll have to try out this reference with my next web project. I looks like it could save my time trawling through the verbose &lt;a href="http://www.w3.org/"&gt;w3c specs&lt;/a&gt; or the poorly designed (but still useful) &lt;a href="http://www.w3schools.com/"&gt;w3schools&lt;/a&gt; site.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/21612553-7295904373460681629?l=robertmaldon.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://robertmaldon.blogspot.com/feeds/7295904373460681629/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=21612553&amp;postID=7295904373460681629' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/21612553/posts/default/7295904373460681629'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/21612553/posts/default/7295904373460681629'/><link rel='alternate' type='text/html' href='http://robertmaldon.blogspot.com/2008/05/google-doctype-web-developer-resource.html' title='Google Doctype - web developer resource encyclopedia'/><author><name>Robert Maldon</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-21612553.post-3011335491532768403</id><published>2008-05-13T17:23:00.000+10:00</published><updated>2008-12-12T05:35:50.622+11:00</updated><title type='text'>Who is the Fifth Cylon?</title><content type='html'>There is some &lt;a href="http://screenrant.com/archives/who-is-the-last-cylon-on-battl-1592.html"&gt;pretty creative speculatio&lt;/a&gt;n going on about who is the fifth and final "skin job" Cylon in the final season of &lt;a href="http://www.scifi.com/battlestar/"&gt;Battlestar Galactica&lt;/a&gt;.&lt;br /&gt;&lt;br /&gt;Of course it can't be one of the Centurions from the original series...&lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://1.bp.blogspot.com/_3mcDdIZRKc0/SClDyzfOo5I/AAAAAAAAAdQ/ah7KB1oJNKo/s1600-h/bsg-old-cylon-out-of-work.jpg"&gt;&lt;img style="margin: 0px auto 10px; display: block; text-align: center; cursor: pointer;" src="http://1.bp.blogspot.com/_3mcDdIZRKc0/SClDyzfOo5I/AAAAAAAAAdQ/ah7KB1oJNKo/s400/bsg-old-cylon-out-of-work.jpg" alt="" id="BLOGGER_PHOTO_ID_5199761784869659538" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;And it can't be one of the new Centurions...&lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://4.bp.blogspot.com/_3mcDdIZRKc0/SClEKjfOo6I/AAAAAAAAAdY/nC7ruGG3t00/s1600-h/bsg-old-cylon-new-cylon.jpg"&gt;&lt;img style="margin: 0px auto 10px; display: block; text-align: center; cursor: pointer;" src="http://4.bp.blogspot.com/_3mcDdIZRKc0/SClEKjfOo6I/AAAAAAAAAdY/nC7ruGG3t00/s400/bsg-old-cylon-new-cylon.jpg" alt="" id="BLOGGER_PHOTO_ID_5199762192891552674" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;And allegedly it is someone who is not in the "last supper" promo picture...&lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://3.bp.blogspot.com/_3mcDdIZRKc0/SClElTfOo7I/AAAAAAAAAdg/1uMh4DIQSGU/s1600-h/bsg-last-supper.jpg"&gt;&lt;img style="margin: 0px auto 10px; display: block; text-align: center; cursor: pointer;" src="http://3.bp.blogspot.com/_3mcDdIZRKc0/SClElTfOo7I/AAAAAAAAAdg/1uMh4DIQSGU/s400/bsg-last-supper.jpg" alt="" id="BLOGGER_PHOTO_ID_5199762652453053362" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;My money is on either Baltar (or else they better explain those hallucination sequences with the Six) or Rosiland. But I love the theory that everyone is a Cyclon except for the tribe that originally fled to Earth :)&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/21612553-3011335491532768403?l=robertmaldon.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://robertmaldon.blogspot.com/feeds/3011335491532768403/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=21612553&amp;postID=3011335491532768403' title='3 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/21612553/posts/default/3011335491532768403'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/21612553/posts/default/3011335491532768403'/><link rel='alternate' type='text/html' href='http://robertmaldon.blogspot.com/2008/05/who-is-fifth-cylon.html' title='Who is the Fifth Cylon?'/><author><name>Robert Maldon</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://1.bp.blogspot.com/_3mcDdIZRKc0/SClDyzfOo5I/AAAAAAAAAdQ/ah7KB1oJNKo/s72-c/bsg-old-cylon-out-of-work.jpg' height='72' width='72'/><thr:total>3</thr:total></entry><entry><id>tag:blogger.com,1999:blog-21612553.post-2508648767787350949</id><published>2008-04-28T10:18:00.000+10:00</published><updated>2008-04-28T10:20:32.339+10:00</updated><title type='text'>Your Password Must Be at Least 18770 Characters and Cannot Repeat Any of Your Previous 30689 Passwords</title><content type='html'>And I thought a 10+ character password requirement was extreme... &lt;a href="http://support.microsoft.com/kb/276304"&gt;http://support.microsoft.com/kb/276304&lt;/a&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/21612553-2508648767787350949?l=robertmaldon.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://robertmaldon.blogspot.com/feeds/2508648767787350949/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=21612553&amp;postID=2508648767787350949' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/21612553/posts/default/2508648767787350949'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/21612553/posts/default/2508648767787350949'/><link rel='alternate' type='text/html' href='http://robertmaldon.blogspot.com/2008/04/your-password-must-be-at-least-18770.html' title='Your Password Must Be at Least 18770 Characters and Cannot Repeat Any of Your Previous 30689 Passwords'/><author><name>Robert Maldon</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-21612553.post-2579147554995208139</id><published>2008-04-08T14:13:00.000+10:00</published><updated>2008-04-08T14:27:30.907+10:00</updated><title type='text'>Microsoft release XAML/WPF Specifications</title><content type='html'>Microsoft have released an &lt;a href="http://www.microsoft.com/downloads/details.aspx?FamilyId=3356AF19-A36E-4D6D-9D13-C37DB81EE607&amp;amp;displaylang=en"&gt;early draft of the XAML and WPF specifications&lt;/a&gt;. The XAML specifications are divided into two parts: First is the Xaml Object Mapping Specification. This defines the XAML language itself and focuses heavily on parsing. The second specification is the WPF Xaml Vocabulary Specification, which describes the WPF file format.&lt;br /&gt;&lt;br /&gt;The specs are released under the &lt;a href="http://www.microsoft.com/interop/osp/default.mspx"&gt;Microsoft Open Specification Promise&lt;/a&gt; license, which basically says that if Microsoft has a patent on a covered specification, then the patent will never be enforced against any implementation of said specification.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/21612553-2579147554995208139?l=robertmaldon.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://robertmaldon.blogspot.com/feeds/2579147554995208139/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=21612553&amp;postID=2579147554995208139' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/21612553/posts/default/2579147554995208139'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/21612553/posts/default/2579147554995208139'/><link rel='alternate' type='text/html' href='http://robertmaldon.blogspot.com/2008/04/microsoft-release-xamlwpf.html' title='Microsoft release XAML/WPF Specifications'/><author><name>Robert Maldon</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-21612553.post-580201409341880955</id><published>2008-03-19T12:51:00.000+11:00</published><updated>2008-12-12T05:35:50.874+11:00</updated><title type='text'>FlatWire : Wire your house without drilling holes in the wall</title><content type='html'>&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://4.bp.blogspot.com/_3mcDdIZRKc0/R-ByhwZWrXI/AAAAAAAAAZQ/ftwtxGFkroI/s1600-h/flatwire.jpg"&gt;&lt;img style="margin: 0px auto 10px; display: block; text-align: center; cursor: pointer;" src="http://4.bp.blogspot.com/_3mcDdIZRKc0/R-ByhwZWrXI/AAAAAAAAAZQ/ftwtxGFkroI/s400/flatwire.jpg" alt="" id="BLOGGER_PHOTO_ID_5179265495728565618" border="0" /&gt;&lt;/a&gt;&lt;a href="http://www.flatwireready.com/"&gt;FlatWire&lt;/a&gt; is an interesting alternative to drilling holes in your wall. Stick the flat wire to your wall and hide the wire by painting over it! Pretty expensive though: $37 for 25 feet of speaker wire, for example, plus the price of connectors, which run about $25.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/21612553-580201409341880955?l=robertmaldon.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://robertmaldon.blogspot.com/feeds/580201409341880955/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=21612553&amp;postID=580201409341880955' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/21612553/posts/default/580201409341880955'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/21612553/posts/default/580201409341880955'/><link rel='alternate' type='text/html' href='http://robertmaldon.blogspot.com/2008/03/flatwire-wire-your-house-without.html' title='FlatWire : Wire your house without drilling holes in the wall'/><author><name>Robert Maldon</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://4.bp.blogspot.com/_3mcDdIZRKc0/R-ByhwZWrXI/AAAAAAAAAZQ/ftwtxGFkroI/s72-c/flatwire.jpg' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-21612553.post-8450000971170610969</id><published>2008-03-12T10:16:00.003+11:00</published><updated>2008-09-16T21:50:02.164+10:00</updated><title type='text'>CSS tricks that target specific browsers</title><content type='html'>I've recently helped a client re-skin an existing webapp. Apart from changing the colors, images, fonts, etc one of the bigger changes was migrating layouts that used HTML TABLEs to Cascading Style Sheets (CSS).&lt;br /&gt;&lt;br /&gt;Any good web designer will tell you the "proper" way to lay out web elements is to use DIVs and SPANs and CSS instead of TABLEs.&lt;br /&gt;&lt;br /&gt;CSS, however, does have its challenges since different browsers render CSS differently.&lt;br /&gt;&lt;br /&gt;Right now the three major browsers by market share are IE6, IE7 and Firefox 2. Firefox and IE7 render CSS pretty much the same way (more standards compliant), while IE6 often does its own thing. The good news is that if you can get a page to render the same in IE6, IE7 and Firefox then the page will probably look the same in other browsers such as Safari and Opera.&lt;br /&gt;&lt;br /&gt;No matter what you try, however, it is sometimes impossible to use the same CSS for IE6, IE7 and Firefox. However, although it can get a little messy, there are some CSS syntax tricks you can use to apply specific styles to specific browsers.&lt;br /&gt;&lt;br /&gt;Before we talk about those tricks, however, lets talk about the different rendering modes used by browsers.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;Quirks mode and Standards mode&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;In the beginning Internet Explorer was playing catch up to the disruptive technology that was the Netscape browser. IE added many IE-specific features and only half-heartedly supported new web standards like CSS and XHTML. Netscape too was also slow to adopt the w3c standards. Eventually IE killed off Netscape. Microsoft was then left with a choice: Do they change IE to render according to web standards, thereby breaking many web sites that came to rely on the pre-standards way IE rendered, or ignore w3c standards?&lt;br /&gt;&lt;br /&gt;Microsoft decided to support &lt;span style="font-style: italic; font-weight: bold;"&gt;both&lt;/span&gt;. The old rendering was dubbed &lt;a href="http://en.wikipedia.org/wiki/Quirks_mode"&gt;quirks mode&lt;/a&gt; while the new rendering was dubbed &lt;span style="font-weight: bold;"&gt;standards mode&lt;/span&gt; (sometimes called &lt;span style="font-weight: bold;"&gt;strict mode&lt;/span&gt;).&lt;br /&gt;&lt;br /&gt;Similarly Mozilla, the successor to Netscape, also supports a quirks mode and a standards mode.&lt;br /&gt;&lt;br /&gt;So how does IE and Firefox know which mode to render a page in? By default it is assumed a page should be rendered in quirks mode, unless the HTML 4+ or XHTML 1.0+ doctype appears at the top of the page, in which case the page will be rendered in standards mode. e.g.&lt;br /&gt;&lt;br /&gt;&lt;pre&gt;&lt;br /&gt;&amp;lt;!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01//EN"&amp;gt;&lt;br /&gt;&amp;lt;html&amp;gt;&lt;br /&gt;&amp;lt;head&amp;gt;&lt;br /&gt;&amp;lt;title&amp;gt;Hello Title!&amp;lt;/title&amp;gt;&lt;br /&gt;&amp;lt;link rel="stylesheet" type="text/css" href="hellostyle.css" /&amp;gt;&lt;br /&gt;&amp;lt;/head&amp;gt;&lt;br /&gt;&amp;lt;body&amp;gt;&lt;br /&gt;&amp;lt;div class="hello"&amp;gt;&lt;br /&gt;  Hello Style!&lt;br /&gt;&amp;lt;/div&amp;gt;&lt;br /&gt;&amp;lt;/body&amp;gt;&lt;br /&gt;&amp;lt;/html&amp;gt;&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;Wikipedia has an excellent &lt;a href="http://en.wikipedia.org/wiki/Quirks_mode#Comparison_of_document_types"&gt;table showing doctypes and how they effect the rendering mode of various browsers&lt;/a&gt;.&lt;br /&gt;&lt;br /&gt;To make matters more complicated IE7 is more standards compliant than IE6 but still not as compliant as it should be; in other words IE7 has an "almost-standards" mode.&lt;br /&gt;&lt;br /&gt;For the upcoming IE8 Microsoft are still skittish about making IE more compliant and "breaking the web" that relies on existing IE rendering behavior, so they plan to have a quirks mode, an IE7 almost-standards mode and an IE8 standards mode. &lt;a href="http://blogs.msdn.com/ie/archive/2008/03/03/microsoft-s-interoperability-principles-and-ie8.aspx"&gt;IE8 standards mode will be the default standards mode in IE8&lt;/a&gt;. To trigger IE7 standards mode in IE8 the web page must contain the HTML or XHTML doctype and &lt;a href="http://alistapart.com/articles/beyonddoctype"&gt;an additional META tag specifying IE7&lt;/a&gt;. e.g.&lt;br /&gt;&lt;br /&gt;&lt;pre&gt;&lt;br /&gt;&amp;lt;!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01//EN"&amp;gt;&lt;br /&gt;&amp;lt;html&amp;gt;&lt;br /&gt;&amp;lt;head&amp;gt;&lt;br /&gt;&amp;lt;title&amp;gt;Hello Title!&amp;lt;/title&amp;gt;&lt;br /&gt;&amp;lt;meta http-equiv="X-UA-Compatible" content="IE=7" /&amp;gt;&lt;br /&gt;&amp;lt;link rel="stylesheet" type="text/css" href="hellostyle.css" /&amp;gt;&lt;br /&gt;&amp;lt;/head&amp;gt;&lt;br /&gt;&amp;lt;body&amp;gt;&lt;br /&gt;&amp;lt;div class="hello"&amp;gt;&lt;br /&gt;  Hello Style!&lt;br /&gt;&amp;lt;/div&amp;gt;&lt;br /&gt;&amp;lt;/body&amp;gt;&lt;br /&gt;&amp;lt;/html&amp;gt;&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;So, on to some CSS tricks.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;Update&lt;/span&gt;: Joel has an &lt;a href="http://www.joelonsoftware.com/items/2008/03/17.html"&gt;opinion on IE8 and its standards mode&lt;/a&gt;. I wouldn't be too surprised if his prediction about the IE team reversing at the last minute the decision to make IE8 standards mode the default given the number of websites that currently look ugly in IE8.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;Update 2&lt;/span&gt;: Yes, it looks like &lt;a href="http://www.theregister.co.uk/2008/08/29/hakon_lie_ie8_interoperability/"&gt;MS have broken the standards mode promise&lt;/a&gt; with the release of IE8 beta 2. Compatibility Mode is the default, and if a web page is marked as standards compliant then IE will show a "broken page" icon :(&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;Internet Explorer Conditional Comments&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;Introduced in IE5, &lt;a href="http://msdn2.microsoft.com/en-us/library/ms537512.aspx"&gt;conditional comments&lt;/a&gt; are an IE-specific hack to standard HTML comments that allow IE to render part of an HTML page if the specified version matches, while all other browsers will ignore what is inside the HTML comment.&lt;br /&gt;&lt;br /&gt;For example:&lt;br /&gt;&lt;br /&gt;&lt;pre&gt;&lt;br /&gt;&amp;lt;!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01//EN"&amp;gt;&lt;br /&gt;&amp;lt;html&amp;gt;&lt;br /&gt;&amp;lt;head&amp;gt;&lt;br /&gt;&amp;lt;title&amp;gt;Hello Title!&amp;lt;/title&amp;gt;&lt;br /&gt;&amp;lt;link rel="stylesheet" type="text/css" href="hellostyle.css" /&amp;gt;&lt;br /&gt;&amp;lt;!--[if IE 7]&amp;gt;&lt;br /&gt;    &amp;lt;style type="text/css"&amp;gt;&lt;br /&gt;body {&lt;br /&gt;background-color: #00AA00;&lt;br /&gt;}&lt;br /&gt;    &amp;lt;/style&amp;gt;&lt;br /&gt;&amp;lt;![endif]--&amp;gt;&lt;br /&gt;&amp;lt;/head&amp;gt;&lt;br /&gt;&amp;lt;body&amp;gt;&lt;br /&gt;&amp;lt;div class="hello"&amp;gt;&lt;br /&gt;    Hello Style!&lt;br /&gt;&amp;lt;/div&amp;gt;&lt;br /&gt;&amp;lt;/body&amp;gt;&lt;br /&gt;&amp;lt;/html&amp;gt;&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;All browsers will read styles from the file hellostlye.css, while only IE7 will override the body background color.&lt;br /&gt;&lt;br /&gt;While this can be useful, conditional comments only work inside HTML files. What would be more useful is conditional behavior inside CSS files or style blocks.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;Internet Explorer: The Underscore Hack and the Asterisk Hack&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;Let's set up a CSS example.&lt;br /&gt;&lt;br /&gt;Say we have an HTML file with the following contents:&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;hellostyle.html&lt;/span&gt;&lt;br /&gt;&lt;pre&gt;&lt;br /&gt;&amp;lt;!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01//EN"&amp;gt;&lt;br /&gt;&amp;lt;html&amp;gt;&lt;br /&gt;&amp;lt;head&amp;gt;&lt;br /&gt;&amp;lt;title&amp;gt;Hello Title!&amp;lt;/title&amp;gt;&lt;br /&gt;&amp;lt;link rel="stylesheet" type="text/css" href="hellostyle.css" /&amp;gt;&lt;br /&gt;&amp;lt;/head&amp;gt;&lt;br /&gt;&amp;lt;body&amp;gt;&lt;br /&gt;&amp;lt;div class="hello"&amp;gt;&lt;br /&gt;    Hello Style!&lt;br /&gt;&amp;lt;/div&amp;gt;&lt;br /&gt;&amp;lt;/body&amp;gt;&lt;br /&gt;&amp;lt;/html&amp;gt;&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;and a companion CSS file with the contents:&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;hellostyle.css&lt;/span&gt;&lt;br /&gt;&lt;pre&gt;&lt;br /&gt;.hello {&lt;br /&gt;text-align: center;&lt;br /&gt;background-color: #FF0000;&lt;br /&gt;*background-color: #00FF00;&lt;br /&gt;_background-color: #0000FF;&lt;br /&gt;}&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;If you are familiar with CSS you'll understand all of the syntax except for the "*" and "_" in front of the background-color properties. What do they do?&lt;br /&gt;&lt;br /&gt;The CSS specs say that browsers should read any property names they know about and ignore any property names they don't know about. In the above CSS the spec compliant browsers know about a property named "background-color" but don't know about properties named "*background-color" and "_background-color".&lt;br /&gt;&lt;br /&gt;To cut a long story short, the Internet Explorer CSS parser is overly aggressive at trying to discover the names of properties and will in fact ignore leading non-alphanumeric characters. From my testing this appears to be the case from at least IE5 onwards.&lt;br /&gt;&lt;br /&gt;It became convention amongst web developers to used an underscore in front of property names when targeting CSS for IE, although any non-alphanumeric character will work. However, the CSS 2.1 spec made underscore a valid character in a property name, so IE7 specifically removed underscore from their aggressive parsing. From IE7 onwards web developers have been using an asterisk instead of an underscore when targeting CSS at IE, although any non-alphanumeric character will do. Interestingly, the removal of the underscore hack in IE7 allows you to target CSS at pre-IE7 (using underscore) and post-IE7 (using asterisk or some other non-alphanumeric character) browsers.&lt;br /&gt;&lt;br /&gt;So with this background knowledge here is how the above CSS would be interpreted by different browsers:&lt;br /&gt;&lt;ul&gt;&lt;li&gt;Firefox, Opera, Safari and all non-IE browsers would correctly parse "background-color", fail to parse "*background-color" and "_background-color", and will set the background color of the div with class "hello" to red.&lt;/li&gt;&lt;li&gt;IE6 and earlier versions of IE will successfully parse "background-color", "*background-color" and "_background-color". The background color value will come from the last successfully parsed property, so the background color of the div with class "hello" will be set to blue.&lt;/li&gt;&lt;li&gt;IE7 and later versions of IE will successfully parse "background-color", "*background-color" but fail to parse "_background-color". The background color value will come from the last successfully parsed property, so the background color of the div with class "hello" will be set to green.&lt;/li&gt;&lt;/ul&gt;One final note on this IE leading non-alphanumeric character hack: It is invalid CSS so the strictest parsers will give you an error.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;IE8 CSS Extensions&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;Microsoft have listed the &lt;a href="http://blogs.msdn.com/ie/archive/2008/09/08/microsoft-css-vendor-extensions.aspx"&gt;CSS extensions available with IE8&lt;/a&gt;. The main change is that previous IE-specific extensions will now be required to be prefixed with '-ms-'. e.g. "overflow-x" now becomes "-ms-overflow-x".&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;Firefox CSS Hacks&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;There are plenty of CSS hacks for IE, but what about Firefox?&lt;br /&gt;&lt;br /&gt;I've found one hack that allows you to target Firefox 2 or Firefox 3, but some versions of IE also pick up the CSS intended for Firefox. Extending our CSS file above:&lt;br /&gt;&lt;br /&gt;&lt;pre&gt;&lt;br /&gt;.hello {&lt;br /&gt;text-align: center;&lt;br /&gt;background-color: #FF0000;&lt;br /&gt;*background-color: #00FF00;&lt;br /&gt;_background-color: #0000FF;&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;/* Target Firefox 3 */&lt;br /&gt;.hello, x:-moz-any-link, x:default {&lt;br /&gt;background-color: #FFFFFF;&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;/* Target Firefox 2 */&lt;br /&gt;.hello, x:-moz-any-link {&lt;br /&gt;background-color: #FF00FF;&lt;br /&gt;}&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;In Firefox 2 the background color of the div with class "hello" will be pink, but strangely it will also be pink in IE5 and IE7 (they will pick up the last CSS property intended for Firefox), and blue in IE5.5 and IE6 (they don't pick up the CSS intended for Firefox).&lt;br /&gt;&lt;br /&gt;If you find any Firefox CSS hacks that will only be applied to Firefox please let me know.&lt;br /&gt;&lt;br /&gt;The closet thing to &lt;a href="http://developer.mozilla.org/En/CSS_Reference:Mozilla_Extensions"&gt;official CSS extensions for Firefox is here&lt;/a&gt;.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;Other Browser CSS Hacks&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;a href="http://www.webdevout.net/css-hacks"&gt;http://www.webdevout.net/css-hacks&lt;/a&gt; contains a good summary of the known CSS hacks.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;Useful Tools to test Browser Rendering&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;If you have IE7 installed but want to test earlier versions of IE then use &lt;a href="http://tredosoft.com/Multiple_IE"&gt;Multiple-IE&lt;/a&gt; to install and test &lt;a href="http://en.wikipedia.org/wiki/Internet_Explorer#.22Standalone.22_Internet_Explorer"&gt;standalone&lt;/a&gt; versions of IE from IE3 to IE6.&lt;br /&gt;&lt;br /&gt;If you have IE6 installed and want to use IE7 then try &lt;a href="http://tredosoft.com/IE7_standalone"&gt;IE7s&lt;/a&gt;. Beware that, at the time of writing this blog post, pop ups and combo boxes don't work in IE7s.&lt;br /&gt;&lt;br /&gt;&lt;a href="https://addons.mozilla.org/en-US/firefox/addon/1843"&gt;Firebug&lt;/a&gt; is a Firefox add on that allows you to, amongst many other things, inspect and change CSS on-the-fly.&lt;br /&gt;&lt;br /&gt;&lt;a href="http://www.microsoft.com/downloads/details.aspx?FamilyID=E59C3964-672D-4511-BB3E-2D5E1DB91038&amp;amp;displaylang=en"&gt;Internet Explorer Developer Toolbar&lt;/a&gt; provides similar functionality to Firebug for IE.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/21612553-8450000971170610969?l=robertmaldon.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://robertmaldon.blogspot.com/feeds/8450000971170610969/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=21612553&amp;postID=8450000971170610969' title='6 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/21612553/posts/default/8450000971170610969'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/21612553/posts/default/8450000971170610969'/><link rel='alternate' type='text/html' href='http://robertmaldon.blogspot.com/2008/03/css-tricks-that-target-specific.html' title='CSS tricks that target specific browsers'/><author><name>Robert Maldon</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>6</thr:total></entry><entry><id>tag:blogger.com,1999:blog-21612553.post-2045829288371670677</id><published>2008-03-07T14:14:00.000+11:00</published><updated>2008-03-07T14:25:47.680+11:00</updated><title type='text'>ADO connection string reference</title><content type='html'>Can't remember the &lt;a href="http://connectionstrings.com/default.aspx?article=what_is_a_connection_string"&gt;ADO connection string&lt;/a&gt; syntax for Firebird, SQL Server 2005 Compact Edition or another one of the many ADO data sources? &lt;a href="http://connectionstrings.com/"&gt;connectionstrings.com&lt;/a&gt; is a very useful reference site.&lt;span style="text-decoration: underline;"&gt;&lt;/span&gt;&lt;a href="http://connectionstrings.com/?carrier=sqlserver2005ce" title="SQL Server 2005 Compact Edition"&gt;&lt;br /&gt;&lt;/a&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/21612553-2045829288371670677?l=robertmaldon.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://robertmaldon.blogspot.com/feeds/2045829288371670677/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=21612553&amp;postID=2045829288371670677' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/21612553/posts/default/2045829288371670677'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/21612553/posts/default/2045829288371670677'/><link rel='alternate' type='text/html' href='http://robertmaldon.blogspot.com/2008/03/ado-connection-string-reference.html' title='ADO connection string reference'/><author><name>Robert Maldon</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-21612553.post-3574134207764924489</id><published>2008-03-04T13:49:00.000+11:00</published><updated>2008-03-04T14:08:39.170+11:00</updated><title type='text'>Powerpoint Karaoke</title><content type='html'>Unless you are German and a geek you probably have never heard of the bar/pub game called "&lt;a href="http://www.boston.com/bostonglobe/ideas/articles/2008/03/02/slide_show/?page=2"&gt;Powerpoint Karaoke&lt;/a&gt;": with the assistance of a little bit of liquid courage people get up in front of an audience and present a powerpoint they've never seen before. Of course you can make up a story if you have no idea what the slides are talking about. Crazy! Insane!&lt;br /&gt;&lt;br /&gt;(This craze was invented by Holm Friebe (Zentrale Intelligenz Agentur) and held for the &lt;a href="http://www.flickr.com/search/?q=powerpoint+karaoke"&gt;very first time in Berlin on January 25th, 2006&lt;/a&gt;.)&lt;br /&gt;&lt;br /&gt;You can use the &lt;a href="http://www.slidesharetoys.com/karaoke"&gt;Slideshare Karaoke&lt;/a&gt; webapp to randomly choose from public domain presentations.&lt;br /&gt;&lt;br /&gt;What will those wacky Germans think of next? MS Project Karaoke, where somebody makes up tasks and dates for a project? Wait, that's called project management...&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/21612553-3574134207764924489?l=robertmaldon.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://robertmaldon.blogspot.com/feeds/3574134207764924489/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=21612553&amp;postID=3574134207764924489' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/21612553/posts/default/3574134207764924489'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/21612553/posts/default/3574134207764924489'/><link rel='alternate' type='text/html' href='http://robertmaldon.blogspot.com/2008/03/powerpoint-karaoke.html' title='Powerpoint Karaoke'/><author><name>Robert Maldon</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-21612553.post-5583826303723389375</id><published>2008-03-04T02:26:00.000+11:00</published><updated>2008-03-04T02:39:02.814+11:00</updated><title type='text'>How to answer the "What salary are you looking for?" interview question</title><content type='html'>I think &lt;a href="http://www.theonion.com/"&gt;The Onion&lt;/a&gt; last year had the best answer to the toughest interview question there is: "My greatest weakness is how I answer this question".&lt;br /&gt;&lt;br /&gt;Another tough question is when they ask you what salary you want for the job. &lt;a href="http://blog.penelopetrunk.com/2008/02/19/the-answer-to-the-toughest-interview-question/"&gt;This article offers some good advice on how to negotiate salary&lt;/a&gt;:&lt;br /&gt;&lt;br /&gt;&lt;span style="font-style: italic;"&gt;The right answer to the question, “What’s your salary range?” is almost always some version of “I’m not telling you.”&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-style: italic;"&gt;The person who gives the first number sets the starting point. But if that’s you, you lose... The more times you can fend off the question, the less likely you will have to be the one to give the first number...&lt;/span&gt;&lt;span style="font-style: italic;"&gt;&lt;/span&gt;&lt;span style="font-style: italic;"&gt;&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-style: italic; font-weight: bold;"&gt;What did you make at your last job?&lt;/span&gt;&lt;br /&gt;&lt;span style="font-style: italic;"&gt;“This position is not exactly the same as my last job. So let’s discuss what my responsibilities would be here and then determine a fair salary for this job.” It’s hard to argue with words like “fair” and “responsibilities”—you’re earning respect with this one.&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-style: italic; font-weight: bold;"&gt;What are you expecting to make in terms of salary?&lt;/span&gt;&lt;br /&gt;&lt;span style="font-style: italic;"&gt;“I am interested in finding a job that is a good fit for me. I’m sure whatever salary you’re paying is consistent with the rest of the market.” In other words, I respect myself and I want to think I can respect this company.&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-style: italic; font-weight: bold;"&gt;I need to know what salary you want in order to make you an offer. Can you tell me a range?&lt;/span&gt;&lt;br /&gt;&lt;span style="font-style: italic;"&gt;“I’d appreciate it if you could make me an offer based on whatever you have budgeted for this position and we can go from there.” This is a pretty direct response, so using words like “appreciate” focuses on drawing out the interviewer’s better qualities instead of her tougher side.&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-style: italic; font-weight: bold;"&gt;Why don’t you want to give your salary requirements?&lt;/span&gt;&lt;br /&gt;&lt;span style="font-style: italic;"&gt;“I think you have a good idea of what this position is worth to your company, and that’s important information for me to know.” Enough dancing–this is one last attempt to force you to give the number first. Hold your line here and you win.&lt;/span&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/21612553-5583826303723389375?l=robertmaldon.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://robertmaldon.blogspot.com/feeds/5583826303723389375/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=21612553&amp;postID=5583826303723389375' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/21612553/posts/default/5583826303723389375'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/21612553/posts/default/5583826303723389375'/><link rel='alternate' type='text/html' href='http://robertmaldon.blogspot.com/2008/03/how-to-answer-what-salary-are-you.html' title='How to answer the &quot;What salary are you looking for?&quot; interview question'/><author><name>Robert Maldon</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-21612553.post-8200738796088345230</id><published>2008-02-19T13:26:00.000+11:00</published><updated>2008-02-19T13:40:47.115+11:00</updated><title type='text'>Will using ASP.NET MVC confuse developers?</title><content type='html'>There seem to be a few interesting opinions flying around about &lt;a href="http://weblogs.asp.net/scottgu/archive/2007/10/14/asp-net-mvc-framework.aspx"&gt;Microsoft announcing they will finally add MVC to their ASP.NET offering&lt;/a&gt; - only 27 years after &lt;a href="http://en.wikipedia.org/wiki/Model-view-controller"&gt;MVC&lt;/a&gt; was first created :)&lt;br /&gt;&lt;br /&gt;David Heinemeier Hansson, the creator of Ruby on Rails, &lt;a href="http://www.eweek.com/index2.php?option=content&amp;amp;task=view&amp;amp;id=46442&amp;amp;pop=1&amp;amp;hide_ads=1&amp;amp;page=0&amp;amp;hide_js=1"&gt;says&lt;/a&gt;: "The proposed MVC extensions to ASP.NET bear more than a striking resemblance to the way we implemented things in Rails. That's, of course, flattering to have a giant like Microsoft attempt to copy many of the ideas that we've been championing for years now, but they do appear to be a little late to the party."&lt;br /&gt;&lt;br /&gt;Joel Spolsky, author of the popular &lt;a href="http://joelonsoftware.com/"&gt;Joel on Software blog&lt;/a&gt; and the man responsible for integrating Visual Basic into Office, &lt;a href="http://www.eweek.com/index2.php?option=content&amp;amp;task=view&amp;amp;id=46442&amp;amp;pop=1&amp;amp;hide_ads=1&amp;amp;page=0&amp;amp;hide_js=1"&gt;adds&lt;/a&gt;: "It’s clear that the ASP.NET team is trying to clone some of the popular benefits of Ruby on Rails. I’m disappointed that Microsoft forces you to choose whether your app is MVC or not before you write the first line of code. It’s a very different way of organizing code than traditional ASP.NET, and the way it looks now in the CTP [Community Technology Preview], it’s going to confuse new developers who now have one more decision to make about how to build an ASP.NET site. It does address one of the weaknesses of ASP.NET, which was how to organize large sites."&lt;br /&gt;&lt;br /&gt;Oh, and you have to upgrade to IIS 7.0 in order to use ASP.NET MVC.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/21612553-8200738796088345230?l=robertmaldon.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://robertmaldon.blogspot.com/feeds/8200738796088345230/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=21612553&amp;postID=8200738796088345230' title='2 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/21612553/posts/default/8200738796088345230'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/21612553/posts/default/8200738796088345230'/><link rel='alternate' type='text/html' href='http://robertmaldon.blogspot.com/2008/02/will-using-aspnet-mvc-confuse.html' title='Will using ASP.NET MVC confuse developers?'/><author><name>Robert Maldon</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>2</thr:total></entry><entry><id>tag:blogger.com,1999:blog-21612553.post-5307450596090630781</id><published>2008-02-19T13:17:00.000+11:00</published><updated>2008-02-19T13:26:45.729+11:00</updated><title type='text'>Digital photo frames contain viruses????</title><content type='html'>About 4 years ago I stopped using good 'ol film cameras and went fully digital. I've been thinking for a while what to do with the digital photos long term. Technology changes quickly and in the space of a couple of decades my photo collection could be effectively lost to future generations.&lt;br /&gt;&lt;br /&gt;Long term the only viable solution is probably to print out the photos onto decent quality photo paper.&lt;br /&gt;&lt;br /&gt;Short term I  have been considering buying some digital photo frames, loading them up with photos and sending them to family members - until I found out &lt;a href="http://www.sfgate.com/cgi-bin/article.cgi?file=/c/a/2008/02/15/BU47V0VOH.DTL&amp;amp;type=printable"&gt;some hackers have managed to load viruses onto photo frames that are sold in large US chain stores&lt;/a&gt;.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/21612553-5307450596090630781?l=robertmaldon.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://robertmaldon.blogspot.com/feeds/5307450596090630781/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=21612553&amp;postID=5307450596090630781' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/21612553/posts/default/5307450596090630781'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/21612553/posts/default/5307450596090630781'/><link rel='alternate' type='text/html' href='http://robertmaldon.blogspot.com/2008/02/digital-photo-frames-contain-viruses.html' title='Digital photo frames contain viruses????'/><author><name>Robert Maldon</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-21612553.post-7895233983739125309</id><published>2008-02-15T13:14:00.000+11:00</published><updated>2008-12-12T05:35:51.264+11:00</updated><title type='text'>Geek Parents: Please Don't Dress Your Children Like This</title><content type='html'>&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://2.bp.blogspot.com/_3mcDdIZRKc0/R7Xkxk4Ua3I/AAAAAAAAAZI/kwq0n9gSVao/s1600-h/geek-children-ipod-baby.jpg"&gt;&lt;img style="margin: 0px auto 10px; display: block; text-align: center; cursor: pointer;" src="http://2.bp.blogspot.com/_3mcDdIZRKc0/R7Xkxk4Ua3I/AAAAAAAAAZI/kwq0n9gSVao/s400/geek-children-ipod-baby.jpg" alt="" id="BLOGGER_PHOTO_ID_5167287687842130802" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://4.bp.blogspot.com/_3mcDdIZRKc0/R7XksE4Ua2I/AAAAAAAAAZA/pgrDETdDt00/s1600-h/geek-children-mario.jpg"&gt;&lt;img style="margin: 0px auto 10px; display: block; text-align: center; cursor: pointer;" src="http://4.bp.blogspot.com/_3mcDdIZRKc0/R7XksE4Ua2I/AAAAAAAAAZA/pgrDETdDt00/s400/geek-children-mario.jpg" alt="" id="BLOGGER_PHOTO_ID_5167287593352850274" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;Although it is &lt;a href="http://www.photobasement.com/8-good-examples-of-what-happens-when-geeks-have-children/"&gt;pretty tempting&lt;/a&gt;...&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/21612553-7895233983739125309?l=robertmaldon.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://robertmaldon.blogspot.com/feeds/7895233983739125309/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=21612553&amp;postID=7895233983739125309' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/21612553/posts/default/7895233983739125309'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/21612553/posts/default/7895233983739125309'/><link rel='alternate' type='text/html' href='http://robertmaldon.blogspot.com/2008/02/geek-parents-please-dont-dress-your.html' title='Geek Parents: Please Don&apos;t Dress Your Children Like This'/><author><name>Robert Maldon</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://2.bp.blogspot.com/_3mcDdIZRKc0/R7Xkxk4Ua3I/AAAAAAAAAZI/kwq0n9gSVao/s72-c/geek-children-ipod-baby.jpg' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-21612553.post-5224370246957590876</id><published>2008-02-13T13:17:00.000+11:00</published><updated>2008-02-14T06:25:30.671+11:00</updated><title type='text'>World-wide Outsourcing Pay Rates</title><content type='html'>Outsourcing marketplace &lt;a href="http://www.odesk.com/"&gt;oDesk&lt;/a&gt; have been kind enough to put together a Google Maps mashup showing the &lt;a href="http://www.odesk.com/community/oconomy/global_provider_map"&gt;average pay rates for outsourcing providers in many countries&lt;/a&gt; to help you decide if you want to outsource work to Finland ($31 per hour), USA ($23 per hour) or Kyrgyzstan ($11 per hour).&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/21612553-5224370246957590876?l=robertmaldon.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://robertmaldon.blogspot.com/feeds/5224370246957590876/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=21612553&amp;postID=5224370246957590876' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/21612553/posts/default/5224370246957590876'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/21612553/posts/default/5224370246957590876'/><link rel='alternate' type='text/html' href='http://robertmaldon.blogspot.com/2008/02/world-wide-outsourcing-pay-rates.html' title='World-wide Outsourcing Pay Rates'/><author><name>Robert Maldon</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-21612553.post-3224114201347562465</id><published>2008-02-06T13:17:00.001+11:00</published><updated>2008-12-12T05:35:51.645+11:00</updated><title type='text'>Kerviel is not a computer genius?</title><content type='html'>&lt;a href="http://www.theregister.co.uk/2008/01/31/kerviel/print.html"&gt;An interesting - but &lt;span style="font-weight: bold; font-style: italic;"&gt;purely speculative&lt;/span&gt; - article&lt;/a&gt; on how Jerome Kerviel, the junior trader being blamed for a recent $7.1 billion Société Générale loss, managed to get away with making large bets. The author has worked in trading environments and some of the "bending" of compliance rules he talks about does have a ring of truth to it.&lt;br /&gt;&lt;br /&gt;A few things of note in the article:&lt;br /&gt;&lt;ul&gt;&lt;li&gt;Kerviel was a junior trader, supposed to be doing riskless arbitrage, not making large bets.&lt;/li&gt;&lt;li&gt;Kerviel worked in the risk management department, so he may have been able to explain away some of his fictious trades as "we're working on the reports right now, the numbers in them are not quite right".&lt;/li&gt;&lt;li&gt;Being part of the risk management department he might have also had direct access to systems or been told "super user" passwords, allowing him to bypass security.&lt;br /&gt;&lt;/li&gt;&lt;/ul&gt;Oh, if you're interested here is Mr Kerviel's resume:&lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://2.bp.blogspot.com/_3mcDdIZRKc0/R6n6otc4PHI/AAAAAAAAAY4/Dc57G-K_bQI/s1600-h/jerome_kerviel_resume.gif"&gt;&lt;img style="margin: 0px auto 10px; display: block; text-align: center; cursor: pointer;" src="http://2.bp.blogspot.com/_3mcDdIZRKc0/R6n6otc4PHI/AAAAAAAAAY4/Dc57G-K_bQI/s400/jerome_kerviel_resume.gif" alt="" id="BLOGGER_PHOTO_ID_5163934025059417202" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold; font-style: italic;"&gt;Update&lt;/span&gt;: It appears Mr Kerviel was able to commit the fraud with &lt;a href="http://www.theregister.co.uk/2008/01/30/socgen_hack/"&gt;low-tech techniques&lt;/a&gt; like using his colleagues' access codes, sending fake emails used to open accounts and disabling warning systems that might have alerted people to what he was doing (probably just by hacking the production spreadsheets). We'll see if he can develop a fool-proof way to prevent others from using similar techniques at his new &lt;a href="http://www.iht.com/articles/2008/04/25/business/socgen.php"&gt;computer security consultancy job&lt;/a&gt; :)&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/21612553-3224114201347562465?l=robertmaldon.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://robertmaldon.blogspot.com/feeds/3224114201347562465/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=21612553&amp;postID=3224114201347562465' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/21612553/posts/default/3224114201347562465'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/21612553/posts/default/3224114201347562465'/><link rel='alternate' type='text/html' href='http://robertmaldon.blogspot.com/2008/02/kerviel-is-not-computer-genius.html' title='Kerviel is not a computer genius?'/><author><name>Robert Maldon</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://2.bp.blogspot.com/_3mcDdIZRKc0/R6n6otc4PHI/AAAAAAAAAY4/Dc57G-K_bQI/s72-c/jerome_kerviel_resume.gif' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-21612553.post-6532654802733302771</id><published>2008-01-31T14:09:00.000+11:00</published><updated>2008-02-01T06:13:14.307+11:00</updated><title type='text'>Amazon "cloud" web services use up more bandwidth than Amazon.com</title><content type='html'>An interesting note from Amazon's &lt;a href="http://biz.yahoo.com/bw/080130/20080130006013.html?.v=1"&gt;fourth quarter earnings&lt;/a&gt;:&lt;br /&gt;&lt;br /&gt;&lt;span style="font-style: italic;"&gt;Adoption of Amazon Elastic Compute Cloud (EC2) and Amazon Simple Storage Service (S3) continues to grow. As an indicator of adoption, bandwidth utilized by these services in fourth quarter 2007 was even greater than bandwidth utilized in the same period by all of Amazon.com’s global websites combined.&lt;/span&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/21612553-6532654802733302771?l=robertmaldon.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://robertmaldon.blogspot.com/feeds/6532654802733302771/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=21612553&amp;postID=6532654802733302771' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/21612553/posts/default/6532654802733302771'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/21612553/posts/default/6532654802733302771'/><link rel='alternate' type='text/html' href='http://robertmaldon.blogspot.com/2008/01/amazon-cloud-web-services-use-up-more.html' title='Amazon &quot;cloud&quot; web services use up more bandwidth than Amazon.com'/><author><name>Robert Maldon</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-21612553.post-6996489701620689360</id><published>2008-01-31T13:39:00.000+11:00</published><updated>2008-02-11T07:41:31.936+11:00</updated><title type='text'>Build your own operating system in .NET with Cosmos</title><content type='html'>&lt;a href="http://gocosmos.org/"&gt;Cosmos&lt;/a&gt; looks like a project that could be fun to play with. It's goal is to allow you to build your own operating system in .NET!&lt;br /&gt;&lt;br /&gt;The magic happens by compiling .NET CIL bytecode to x86 assembly.&lt;br /&gt;&lt;br /&gt;The core is written in C#, but you should be able to use any .NET language to add your own extensions.&lt;br /&gt;&lt;br /&gt;You can deploy your build as an ISO or PXE, or run it under a number of emulators like QEMU, VMWare and VirtualPC.&lt;br /&gt;&lt;br /&gt;The project is still in the early stages, providing just console interaction. Future releases will add PCI enumeration, Ethernet, TCP/IP, extended file system support  and maybe even GUIs.&lt;br /&gt;&lt;br /&gt;UPDATE: There appear to be a couple of competitors, the open source &lt;a href="http://www.sharpos.org/redmine/wiki/3"&gt;SharpOS&lt;/a&gt; (very, very early stages) and Microsoft &lt;a href="http://research.microsoft.com/os/singularity/"&gt;Singularity&lt;/a&gt; (available only to academic institutions).&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/21612553-6996489701620689360?l=robertmaldon.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://robertmaldon.blogspot.com/feeds/6996489701620689360/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=21612553&amp;postID=6996489701620689360' title='4 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/21612553/posts/default/6996489701620689360'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/21612553/posts/default/6996489701620689360'/><link rel='alternate' type='text/html' href='http://robertmaldon.blogspot.com/2008/01/build-your-own-operating-system-in-net.html' title='Build your own operating system in .NET with Cosmos'/><author><name>Robert Maldon</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>4</thr:total></entry><entry><id>tag:blogger.com,1999:blog-21612553.post-7561931655267042230</id><published>2008-01-28T05:06:00.000+11:00</published><updated>2008-12-12T05:35:52.287+11:00</updated><title type='text'>Make Your Own Roll-Up Keyboard</title><content type='html'>&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://3.bp.blogspot.com/_3mcDdIZRKc0/R5zIyNc4PGI/AAAAAAAAAYw/zd-2z5P8Z8M/s1600-h/roll-up-keyboard.jpg"&gt;&lt;img style="margin: 0px auto 10px; display: block; text-align: center; cursor: pointer;" src="http://3.bp.blogspot.com/_3mcDdIZRKc0/R5zIyNc4PGI/AAAAAAAAAYw/zd-2z5P8Z8M/s400/roll-up-keyboard.jpg" alt="" id="BLOGGER_PHOTO_ID_5160220037989547106" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;Next time I get hold of an old USB keyboard I've got to &lt;a href="http://www.instructables.com/id/Make-your-own-Roll-Up-Keyboard/"&gt;make one of these&lt;/a&gt; :)&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/21612553-7561931655267042230?l=robertmaldon.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://robertmaldon.blogspot.com/feeds/7561931655267042230/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=21612553&amp;postID=7561931655267042230' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/21612553/posts/default/7561931655267042230'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/21612553/posts/default/7561931655267042230'/><link rel='alternate' type='text/html' href='http://robertmaldon.blogspot.com/2008/01/make-your-own-roll-up-keyboard.html' title='Make Your Own Roll-Up Keyboard'/><author><name>Robert Maldon</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://3.bp.blogspot.com/_3mcDdIZRKc0/R5zIyNc4PGI/AAAAAAAAAYw/zd-2z5P8Z8M/s72-c/roll-up-keyboard.jpg' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-21612553.post-7134512163563549468</id><published>2008-01-28T04:55:00.000+11:00</published><updated>2008-02-09T17:20:10.719+11:00</updated><title type='text'>Web service to clean your computer screen</title><content type='html'>Too lazy to wipe the dirt and grease off your monitor? A clever programmer has created a &lt;a href="http://www.zippyvideos.com/6068179747417086/screenclean/"&gt;web page that will clean your monitor for you&lt;/a&gt;.&lt;br /&gt;&lt;br /&gt;(Original link was &lt;a href="http://www.roberthein.dk/screenclean.swf"&gt;here&lt;/a&gt;, but I guess the site got too much traffic and was removed.)&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/21612553-7134512163563549468?l=robertmaldon.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://robertmaldon.blogspot.com/feeds/7134512163563549468/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=21612553&amp;postID=7134512163563549468' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/21612553/posts/default/7134512163563549468'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/21612553/posts/default/7134512163563549468'/><link rel='alternate' type='text/html' href='http://robertmaldon.blogspot.com/2008/01/web-service-to-clean-your-computer.html' title='Web service to clean your computer screen'/><author><name>Robert Maldon</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-21612553.post-7861326023130992598</id><published>2008-01-28T02:56:00.000+11:00</published><updated>2008-01-28T03:18:47.727+11:00</updated><title type='text'>Alternative Dictionaries</title><content type='html'>Apart from traditional dictionaries where you look up a word based on its spelling (e.g. dictionary.com) there are websites that provide alternative ways to find words:&lt;br /&gt;&lt;ul&gt;&lt;li&gt;&lt;a href="http://www.onelook.com/reverse-dictionary.shtml"&gt;Reverse Dictionary&lt;/a&gt; - describe the concept to get the word. Checkout the matches for "&lt;a href="http://www.onelook.com/?w=*&amp;amp;loc=revfp2&amp;amp;clue=computer+programmer"&gt;computer programmer&lt;/a&gt;"&lt;br /&gt;&lt;/li&gt;&lt;li&gt;&lt;a href="http://visual.merriam-webster.com/"&gt;Visual Dictionary&lt;/a&gt; - click on the images that describe the category, etc, drill down to the word&lt;/li&gt;&lt;li&gt;&lt;a href="http://www.acronymfinder.com/"&gt;Abbreviation and Acronyms Dictionary&lt;/a&gt; - checkout the matches for &lt;a href="http://www.acronymfinder.com/af-query.asp?string=exact&amp;amp;acronym=cep&amp;amp;s=r"&gt;CEP&lt;/a&gt;&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/21612553-7861326023130992598?l=robertmaldon.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://robertmaldon.blogspot.com/feeds/7861326023130992598/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=21612553&amp;postID=7861326023130992598' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/21612553/posts/default/7861326023130992598'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/21612553/posts/default/7861326023130992598'/><link rel='alternate' type='text/html' href='http://robertmaldon.blogspot.com/2008/01/alternative-dictionaries.html' title='Alternative Dictionaries'/><author><name>Robert Maldon</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-21612553.post-4999265137115210953</id><published>2008-01-13T07:41:00.000+11:00</published><updated>2008-01-13T07:46:24.033+11:00</updated><title type='text'>How long does is take to get from "Here" to "There"? 7 hours 51 minutes</title><content type='html'>Google truly knows everything! According to Google Maps it takes 7 hours and 51 minutes to &lt;a href="http://maps.google.com/maps?f=d&amp;amp;hl=en&amp;amp;geocode=&amp;amp;time=&amp;amp;date=&amp;amp;ttype=&amp;amp;saddr=Here&amp;amp;daddr=there&amp;amp;sll=45.916655,2.979575&amp;amp;sspn=3.630568,10.217285&amp;amp;ie=UTF8&amp;amp;z=7&amp;amp;om=1"&gt;drive from Here to There&lt;/a&gt; :)&lt;br /&gt;&lt;br /&gt;(This trivia courtesy of &lt;a href="http://digg.com/odd_stuff/It_Takes_7_Hrs_and_51_Mins_to_Get_From_Here_to_There"&gt;Digg&lt;/a&gt;)&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/21612553-4999265137115210953?l=robertmaldon.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://robertmaldon.blogspot.com/feeds/4999265137115210953/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=21612553&amp;postID=4999265137115210953' title='2 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/21612553/posts/default/4999265137115210953'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/21612553/posts/default/4999265137115210953'/><link rel='alternate' type='text/html' href='http://robertmaldon.blogspot.com/2008/01/how-long-does-is-take-to-get-from-here.html' title='How long does is take to get from &quot;Here&quot; to &quot;There&quot;? 7 hours 51 minutes'/><author><name>Robert Maldon</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>2</thr:total></entry><entry><id>tag:blogger.com,1999:blog-21612553.post-1704995618296049684</id><published>2008-01-09T13:49:00.000+11:00</published><updated>2008-12-12T05:35:52.438+11:00</updated><title type='text'>How to make a disco ball from used CDs</title><content type='html'>&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://3.bp.blogspot.com/_3mcDdIZRKc0/R4Q2iHhQAYI/AAAAAAAAAX8/C8zgVcEAZac/s1600-h/cd-disco-ball.jpg"&gt;&lt;img style="margin: 0px auto 10px; display: block; text-align: center; cursor: pointer;" src="http://3.bp.blogspot.com/_3mcDdIZRKc0/R4Q2iHhQAYI/AAAAAAAAAX8/C8zgVcEAZac/s400/cd-disco-ball.jpg" alt="" id="BLOGGER_PHOTO_ID_5153303833380651394" border="0" /&gt;&lt;/a&gt;Finally, a good use for all of those old MSDN and Oracle CDs.  &lt;a href="http://www.wikihow.com/Make-a-Disco-Ball-With-CDs"&gt;Turn them into a disco ball!&lt;/a&gt;. You can hang it near your desk and use it as a conversation starter instead of that &lt;a href="http://setiathome.berkeley.edu/sah_graphics.php"&gt;3D SETI screensaver&lt;/a&gt;.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/21612553-1704995618296049684?l=robertmaldon.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://robertmaldon.blogspot.com/feeds/1704995618296049684/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=21612553&amp;postID=1704995618296049684' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/21612553/posts/default/1704995618296049684'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/21612553/posts/default/1704995618296049684'/><link rel='alternate' type='text/html' href='http://robertmaldon.blogspot.com/2008/01/how-to-make-disco-ball-from-used-cds.html' title='How to make a disco ball from used CDs'/><author><name>Robert Maldon</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://3.bp.blogspot.com/_3mcDdIZRKc0/R4Q2iHhQAYI/AAAAAAAAAX8/C8zgVcEAZac/s72-c/cd-disco-ball.jpg' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-21612553.post-5301699295565069945</id><published>2007-12-28T03:32:00.000+11:00</published><updated>2008-02-07T05:09:26.339+11:00</updated><title type='text'>Emacs.NET coming soon?</title><content type='html'>Why is Microsoft writing a &lt;a href="http://www.douglasp.com/blog/2007/12/27/EmacsNet.aspx"&gt;.NET version of the good 'ol UNIX text editor Emacs&lt;/a&gt;?&lt;br /&gt;&lt;br /&gt;I suspect it will be not a direct clone of Emacs, but like Emacs will be a text editor that is largely written in and customized by .NET scripting languages (&lt;a href="http://en.wikipedia.org/wiki/IronRuby"&gt;IronRuby&lt;/a&gt;, &lt;a href="http://en.wikipedia.org/wiki/Visual_Basic"&gt;VB&lt;/a&gt;, etc), maybe even integrated with &lt;a href="http://en.wikipedia.org/wiki/PowerShell"&gt;PowerShell&lt;/a&gt;.&lt;br /&gt;&lt;br /&gt;Will it be open source?&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;Update&lt;/span&gt;: The mystery has become a little less mysterious. The editor mentioned above will be called "Intellipad". It is apparently going to be part of Microsoft's SOA offering, code named "Oslo". Another major component of Oslo is a declarative “textual modeling language” called "&lt;a href="http://blogs.zdnet.com/microsoft/?p=1159"&gt;D&lt;/a&gt;", which will be based on &lt;a href="http://en.wikipedia.org/wiki/Extensible_Application_Markup_Language"&gt;XAML&lt;/a&gt;. Dunno how a modeling language like D could be based on a markup language like XAML...&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/21612553-5301699295565069945?l=robertmaldon.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://robertmaldon.blogspot.com/feeds/5301699295565069945/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=21612553&amp;postID=5301699295565069945' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/21612553/posts/default/5301699295565069945'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/21612553/posts/default/5301699295565069945'/><link rel='alternate' type='text/html' href='http://robertmaldon.blogspot.com/2007/12/emacsnet-coming-soon.html' title='Emacs.NET coming soon?'/><author><name>Robert Maldon</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-21612553.post-8798126420049915965</id><published>2007-12-25T12:41:00.000+11:00</published><updated>2008-12-12T05:35:54.833+11:00</updated><title type='text'>Last Minute Geek Xmas Gifts</title><content type='html'>Looking for a last minute xmas gift for that special geek someone? Are you a geek with lots of gift cards to get rid of? Here are my suggestions for 2007:&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;8. Reindeer Computer Carton&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://4.bp.blogspot.com/_3mcDdIZRKc0/R3BqzXhQAMI/AAAAAAAAAWc/37NCkVpYHyE/s1600-h/reindeer_computer_carton.jpg"&gt;&lt;img style="margin: 0px auto 10px; display: block; text-align: center; cursor: pointer;" src="http://4.bp.blogspot.com/_3mcDdIZRKc0/R3BqzXhQAMI/AAAAAAAAAWc/37NCkVpYHyE/s400/reindeer_computer_carton.jpg" alt="" id="BLOGGER_PHOTO_ID_5147731804803825858" border="0" /&gt;&lt;/a&gt;Feeling creative? Don't know what to do with all of that packaging that came with your new computer? &lt;a href="http://www.instructables.com/id/Make-a-Reindeer-from-a-Computer-Carton/"&gt;Make a reindeer&lt;/a&gt; out of it!&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;7. Disembodied Remote Controlled Hand&lt;/span&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://2.bp.blogspot.com/_3mcDdIZRKc0/R3Bp83hQALI/AAAAAAAAAWU/Oksx_WoWyHU/s1600-h/disembodied_remote_control_hand.gif"&gt;&lt;img style="margin: 0px auto 10px; display: block; text-align: center; cursor: pointer;" src="http://2.bp.blogspot.com/_3mcDdIZRKc0/R3Bp83hQALI/AAAAAAAAAWU/Oksx_WoWyHU/s400/disembodied_remote_control_hand.gif" alt="" id="BLOGGER_PHOTO_ID_5147730868500955314" border="0" /&gt;&lt;/a&gt;Just like Thing from the Adams Family. Get your own &lt;a href="http://www.hawkin.com/rkMain.asp?PAGEID=20670&amp;amp;STK_PROD_CODE=08080&amp;amp;CTL_CAT_CODE=2124"&gt;remote control hand&lt;/a&gt; that crawls across the floor on its fingers!&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;6. Toilet Aquarium&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://2.bp.blogspot.com/_3mcDdIZRKc0/R3BkB3hQAII/AAAAAAAAAV8/S3GJxuHSXN0/s1600-h/fish-n-flush.jpg"&gt;&lt;img style="margin: 0px auto 10px; display: block; text-align: center; cursor: pointer;" src="http://2.bp.blogspot.com/_3mcDdIZRKc0/R3BkB3hQAII/AAAAAAAAAV8/S3GJxuHSXN0/s400/fish-n-flush.jpg" alt="" id="BLOGGER_PHOTO_ID_5147724357330534530" border="0" /&gt;&lt;/a&gt;Turn your boring toilet into a &lt;a href="http://www.fishnflush.com/"&gt;Fish 'N Flush&lt;/a&gt; "nautical wonderland"! Fish not included.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;5. Fun Toilet Paper&lt;/span&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://2.bp.blogspot.com/_3mcDdIZRKc0/R3Bnj3hQAJI/AAAAAAAAAWE/FKom-6CDQd8/s1600-h/revenge_toilet_paper.jpg"&gt;&lt;img style="margin: 0px auto 10px; display: block; text-align: center; cursor: pointer;" src="http://2.bp.blogspot.com/_3mcDdIZRKc0/R3Bnj3hQAJI/AAAAAAAAAWE/FKom-6CDQd8/s400/revenge_toilet_paper.jpg" alt="" id="BLOGGER_PHOTO_ID_5147728239980970130" border="0" /&gt;&lt;/a&gt;You're not going anywhere until you wipe. &lt;a href="http://www.prankplace.com/revengetp.htm"&gt;Revenge Toilet Paper&lt;/a&gt; looks like the real thing but cannot be torn!&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://4.bp.blogspot.com/_3mcDdIZRKc0/R3BnwXhQAKI/AAAAAAAAAWM/WsSpbyZ8Chw/s1600-h/hillary_toilet_paper.jpg"&gt;&lt;img style="margin: 0px auto 10px; display: block; text-align: center; cursor: pointer;" src="http://4.bp.blogspot.com/_3mcDdIZRKc0/R3BnwXhQAKI/AAAAAAAAAWM/WsSpbyZ8Chw/s400/hillary_toilet_paper.jpg" alt="" id="BLOGGER_PHOTO_ID_5147728454729334946" border="0" /&gt;&lt;/a&gt;Give politicians back the same stuff they give you with &lt;a href="http://www.prankplace.com/bathroom_toiletpaper.htm"&gt;Political Toilet Paper&lt;/a&gt;.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;4. A Chair That Follows You&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;For the ultimate in lazy the “&lt;a href="http://freshome.com/2007/12/14/take-a-seat-a-chair-that-follows-you/"&gt;Take-A-Seat&lt;/a&gt;” is a chair concept that follows you wherever you go!&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;3. Wi-Fi Detector Shirt&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://1.bp.blogspot.com/_3mcDdIZRKc0/R3BglnhQAGI/AAAAAAAAAVs/RnJC9aXoKbM/s1600-h/wifi_shirt.gif"&gt;&lt;img style="margin: 0px auto 10px; display: block; text-align: center; cursor: pointer;" src="http://1.bp.blogspot.com/_3mcDdIZRKc0/R3BglnhQAGI/AAAAAAAAAVs/RnJC9aXoKbM/s400/wifi_shirt.gif" alt="" id="BLOGGER_PHOTO_ID_5147720573464346722" border="0" /&gt;&lt;/a&gt;Display the current wi-fi signal strength to yourself and everyone around you with this stylish &lt;a href="http://www.thinkgeek.com/tshirts/generic/991e/"&gt;Wi-Fi Detector Shirt&lt;/a&gt;. The glowing bars on the front of the shirt dynamically change as the surrounding wi-fi signal strength fluctuates!&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;2. iPod Accessories&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://1.bp.blogspot.com/_3mcDdIZRKc0/R3BtInhQANI/AAAAAAAAAWk/J9RSz9B_3XM/s1600-h/rock-my-teeth-ipod.jpg"&gt;&lt;img style="margin: 0px auto 10px; display: block; text-align: center; cursor: pointer;" src="http://1.bp.blogspot.com/_3mcDdIZRKc0/R3BtInhQANI/AAAAAAAAAWk/J9RSz9B_3XM/s400/rock-my-teeth-ipod.jpg" alt="" id="BLOGGER_PHOTO_ID_5147734368899301586" border="0" /&gt;&lt;/a&gt;Let your favorite tunes clean your teeth with &lt;a href="http://www.rockmyteeth.com/"&gt;Rock My Teeth&lt;/a&gt;.&lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://2.bp.blogspot.com/_3mcDdIZRKc0/R3BtP3hQAOI/AAAAAAAAAWs/vUwcwwoyBYI/s1600-h/dog-ipod-boombox.jpg"&gt;&lt;img style="margin: 0px auto 10px; display: block; text-align: center; cursor: pointer;" src="http://2.bp.blogspot.com/_3mcDdIZRKc0/R3BtP3hQAOI/AAAAAAAAAWs/vUwcwwoyBYI/s400/dog-ipod-boombox.jpg" alt="" id="BLOGGER_PHOTO_ID_5147734493453353186" border="0" /&gt;&lt;/a&gt;Turn your dog into a boom box with the &lt;a href="http://www.onthewei.com/new_html/12345678-main.htm"&gt;dog-jacket iPod dock&lt;/a&gt;.&lt;br /&gt;&lt;br /&gt;Checkout some other &lt;a href="http://www.podcastingnews.com/2007/12/14/podcasting-news-guide-to-icrap/"&gt;iCrap&lt;/a&gt;.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;1. Motorized Cooler&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://1.bp.blogspot.com/_3mcDdIZRKc0/R3BiHnhQAHI/AAAAAAAAAV0/RjYGGCVsqdc/s1600-h/cruzin_cooler.jpg"&gt;&lt;img style="margin: 0px auto 10px; display: block; text-align: center; cursor: pointer;" src="http://1.bp.blogspot.com/_3mcDdIZRKc0/R3BiHnhQAHI/AAAAAAAAAV0/RjYGGCVsqdc/s400/cruzin_cooler.jpg" alt="" id="BLOGGER_PHOTO_ID_5147722257091526770" border="0" /&gt;&lt;/a&gt;Ever drive to a park or friends house for a BBQ and then discover you have to carry a heavy cooler full of food and drink to some far off area? No more! Let your &lt;a href="http://www.cruzincooler.com/"&gt;Cruzin Cooler&lt;/a&gt; take you and your food to the party in style!&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/21612553-8798126420049915965?l=robertmaldon.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://robertmaldon.blogspot.com/feeds/8798126420049915965/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=21612553&amp;postID=8798126420049915965' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/21612553/posts/default/8798126420049915965'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/21612553/posts/default/8798126420049915965'/><link rel='alternate' type='text/html' href='http://robertmaldon.blogspot.com/2007/12/last-minute-geek-xmas-gifts.html' title='Last Minute Geek Xmas Gifts'/><author><name>Robert Maldon</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://4.bp.blogspot.com/_3mcDdIZRKc0/R3BqzXhQAMI/AAAAAAAAAWc/37NCkVpYHyE/s72-c/reindeer_computer_carton.jpg' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-21612553.post-6396549924362260130</id><published>2007-12-17T10:31:00.000+11:00</published><updated>2007-12-17T10:36:28.618+11:00</updated><title type='text'>Changing Windows Process Scheduling with ProcessTamer</title><content type='html'>For years I've been disappointed with the &lt;a href="http://www.808multimedia.com/winnt/kernel.htm"&gt;Windows process scheduler&lt;/a&gt;. It is so easy for a process to suddenly take up all of the CPU and completely "freeze" your PC for minutes at a time.&lt;br /&gt;&lt;br /&gt;Fair &lt;a href="http://en.wikipedia.org/wiki/Process_scheduling"&gt;scheduling&lt;/a&gt; is something high-end UNIX variants like Solaris have dealt with successfully for a while now, while &lt;a href="http://en.wikipedia.org/wiki/Completely_Fair_Scheduler"&gt;Linux&lt;/a&gt; is still coming to terms with.&lt;br /&gt;&lt;br /&gt;An interesting freeware tool I've been trying out recently is &lt;a href="http://www.donationcoder.com/Software/Mouser/proctamer/index.html"&gt;ProcessTamer&lt;/a&gt;, a Windows utility that runs in your system tray and constantly monitors the cpu usage of other processes. When it sees a process that is overloading your cpu, it reduces the priority of that process temporarily, until its cpu usage returns to a reasonable level. Now my PC doesn't become completely unresponsive for long periods of time, but on the downside some applications like Firefox take longer to start up.&lt;br /&gt;&lt;br /&gt;Sad that I have to consider using tools like ProcessTamer, but so far it has done a pretty decent job.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/21612553-6396549924362260130?l=robertmaldon.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://robertmaldon.blogspot.com/feeds/6396549924362260130/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=21612553&amp;postID=6396549924362260130' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/21612553/posts/default/6396549924362260130'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/21612553/posts/default/6396549924362260130'/><link rel='alternate' type='text/html' href='http://robertmaldon.blogspot.com/2007/12/changing-windows-process-scheduling.html' title='Changing Windows Process Scheduling with ProcessTamer'/><author><name>Robert Maldon</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-21612553.post-2422862623745283234</id><published>2007-12-17T09:35:00.000+11:00</published><updated>2007-12-17T10:31:07.552+11:00</updated><title type='text'>Virtualization == Increased Latency?</title><content type='html'>An interesting quote that caught my eye while reading about the &lt;a href="http://www.nytimes.com/idg/IDG_002570DE00740E18002573B100020F62.html?ex=1355288400&amp;amp;en=1a1c847788830aeb&amp;amp;ei=5088&amp;amp;partner=rssnyt&amp;amp;emc=rss/ru/"&gt;NYSEs replacement of UNIX servers with Linux&lt;/a&gt; (nothing really new there since many of my financial clients started on that 5+ years ago) was this:&lt;br /&gt;&lt;br /&gt;&lt;span style="font-style: italic;"&gt;One technology that the NYSE isn't adopting so eagerly is server &lt;a href="http://en.wikipedia.org/wiki/Virtualization"&gt;virtualization&lt;/a&gt;, which comes with a system latency price that Rubinow said he can't afford to pay. In a system that is processing hundreds of thousands of transactions per second, virtualization produces "a noticeable overhead" that can slow down throughput, according to Rubinow. "Virtualization is not a free technology from a latency perspective, so we don't use it in the core of what we do," he said.&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-style: italic;"&gt;Charles King, an analyst at Pund-IT Inc. in Hayward, Calif., believes there is a broader concern among IT managers about virtualization overhead and its impact on transaction processing. "It's one of the reasons why even the staunchest advocates of x86 virtualization recommend extensive testing prior to moving systems into production," King said.&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;I haven't heard this particular concern until now, but I can imagine it to be a big one since one thing you will hear talked about again and again and again if you work on trading systems is "low latency".&lt;br /&gt;&lt;br /&gt;So what can be done to reduce latency in a virtualized environment? Depends on how much you're prepared to spend.&lt;br /&gt;&lt;ul&gt;&lt;li&gt;Software virtualization like &lt;a href="http://en.wikipedia.org/wiki/VMware"&gt;VMWare&lt;/a&gt; or &lt;a href="http://www.parallels.com/"&gt;Parallels&lt;/a&gt; is likely to incur some extra latency above native-run applications, even though they take advantage of recent &lt;a href="http://en.wikipedia.org/wiki/X86_virtualization#Hardware_support"&gt;hardware virtualization hooks&lt;/a&gt;. In theory the more powerful the hardware the lower the latency.&lt;/li&gt;&lt;br /&gt;&lt;li&gt;The top of the line virtualization (i.e. very expensive) offering is probably still &lt;a href="http://www.azulsystems.com/features/virtualization.htm"&gt;Azul&lt;/a&gt;. This is a hardware platform for running virtual machines across a pool of Azul "appliances". The hardware has been optimized for application context switching, large memory heaps, etc. Azul like to call their offering "application virtualization" and products like VMWare are called "OS-level virtualization".&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/21612553-2422862623745283234?l=robertmaldon.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://robertmaldon.blogspot.com/feeds/2422862623745283234/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=21612553&amp;postID=2422862623745283234' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/21612553/posts/default/2422862623745283234'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/21612553/posts/default/2422862623745283234'/><link rel='alternate' type='text/html' href='http://robertmaldon.blogspot.com/2007/12/virtualization-increased-latency.html' title='Virtualization == Increased Latency?'/><author><name>Robert Maldon</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-21612553.post-7134998556966776950</id><published>2007-12-13T12:36:00.000+11:00</published><updated>2007-12-13T13:14:12.061+11:00</updated><title type='text'>Using Web 2.0 to find the nearest toilet</title><content type='html'>I was excited to see the recent launch of &lt;a href="http://www.mizpee.com/"&gt;MizPee&lt;/a&gt;, a website with SMS support that can help you find the nearest toilet in your hour of greatest need.&lt;br /&gt;&lt;br /&gt;MizPee serves up a list of nearby toilets, how far away the toilet is, a rating and whether or not there is a charge. Other details may include disabled access, whether the restroom includes a diaper-changing station. Users can also leave comments.&lt;br /&gt;&lt;br /&gt;There were &lt;a href="http://www.techcrunch.com/2007/06/27/when-youve-got-to-go-go-to-mizpeecom/"&gt;many critical comments about the site&lt;/a&gt;, but having been a tourist I can say that not every city has a Starbucks or McDonalds on every block and not every restaurant is happy to let people walk in off the street and use their loos. While one comment said "web 2.0 just jumped the shark" I've got to say that it is a good thing the barrier to entry for a webapp is now so low that a niche application like this can exist.&lt;br /&gt;&lt;br /&gt;A niche idea I've had for a while: In the part of Brooklyn I live there is the joy of alternate side street parking, which means I have to move my car at least once a week. I'de love to put together a webapp that could help me locate the nearest parking spot. Big challenges in keeping that info up to date since spots come and go very quickly.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/21612553-7134998556966776950?l=robertmaldon.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://robertmaldon.blogspot.com/feeds/7134998556966776950/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=21612553&amp;postID=7134998556966776950' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/21612553/posts/default/7134998556966776950'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/21612553/posts/default/7134998556966776950'/><link rel='alternate' type='text/html' href='http://robertmaldon.blogspot.com/2007/12/using-web-20-to-find-nearest-toilet.html' title='Using Web 2.0 to find the nearest toilet'/><author><name>Robert Maldon</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-21612553.post-6422967656010499775</id><published>2007-12-10T06:45:00.000+11:00</published><updated>2007-12-10T07:04:09.835+11:00</updated><title type='text'>Crowdsourcing your next development project</title><content type='html'>Wikipedia defines &lt;a href="http://en.wikipedia.org/wiki/Crowdsourcing"&gt;crowdsourcing&lt;/a&gt; as:&lt;br /&gt;&lt;br /&gt;&lt;span style="font-style: italic;"&gt;The act of taking a task traditionally performed by an employee or contractor, and outsourcing it to an undefined, generally large group of people, in the form of an open call. For example, the public may be invited to develop a new technology, carry out a design task, refine an algorithm or help capture, systematize or analyze large amounts of data.&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;Although it has had some success I wonder can it work for developing large, complex applications like many of the financial applications I work on for a living. I can see it working for fairly generic applications (e.g. many webapps), but complexity takes a lot of managing. Many of the finance companies would also be reluctant to make requirements publicly available, exposing their intellectual property to their competitors.&lt;br /&gt;&lt;br /&gt;However, a large chunk of any application is plumbing code. &lt;a href="http://www.computerworld.com/action/article.do?command=printArticleBasic&amp;amp;articleId=9050920"&gt;This article on crowdsourcing&lt;/a&gt; demonstrates how one company opened up about half of an application to crowdsourcing and is committed to do th rest of the integration work:&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-style: italic;"&gt;In Baltimore-based Constellation Energy's case, the $19.3 billion energy company didn't stage a completely open call; rather, it worked with TopCoder , a Connecticut-based company that stages regular coding competitions, ranks developers who compete and then makes this talent available to businesses that need systems built, also through a competition-based model. TopCoder currently has about 130,000 members from more than 200 countries.&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-style: italic;"&gt;A TopCoder project manager assessed the needs of Constellation Energy's commodities group, broke up the system design into dozens of small components and released about half of those component requirements to member developers, who could send in their best coding effort. (Constellation decided to build some of the components in-house.)&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-style: italic;"&gt;Submissions -- which continue to roll in -- are rated using a standardized scorecard, and winners are rewarded anywhere from $500 to close to $2,000. When all the components are complete, TopCoder will work with Constellation to integrate them into a functional system.&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;It will be interesting to see how this project turns out.&lt;br /&gt;&lt;br /&gt;I had a client a couple of years ago that was not happy with the quality of code coming back from an outsourcing vendor and had the idea that he would set up a team in NY to integrate (and fix!) code coming back from this vendor, but I don't see why this integration team couldn't integrate the best code from a few competing vendors!&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/21612553-6422967656010499775?l=robertmaldon.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://robertmaldon.blogspot.com/feeds/6422967656010499775/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=21612553&amp;postID=6422967656010499775' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/21612553/posts/default/6422967656010499775'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/21612553/posts/default/6422967656010499775'/><link rel='alternate' type='text/html' href='http://robertmaldon.blogspot.com/2007/12/crowdsourcing-your-next-development.html' title='Crowdsourcing your next development project'/><author><name>Robert Maldon</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-21612553.post-6443067387702657298</id><published>2007-12-10T06:31:00.000+11:00</published><updated>2007-12-10T06:40:44.304+11:00</updated><title type='text'>Google Mobile Maps pin points your location without GPS</title><content type='html'>Google continues to innovate. Last week they released an update to their Google Maps for mobile suite with an application called "&lt;a href="http://www.google.com/intl/en/press/annc/20071128_maps_mobile_my_location.html"&gt;My Location&lt;/a&gt;", a technology which uses cell tower ID information to provide users with their approximate location. Good for people with ancient cell phones sans GPS like me! (&lt;a href="http://www.youtube.com/v/v6gqipmbcok&amp;amp;rel=1&amp;amp;border=0"&gt;video explanation here&lt;/a&gt;)&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/21612553-6443067387702657298?l=robertmaldon.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://robertmaldon.blogspot.com/feeds/6443067387702657298/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=21612553&amp;postID=6443067387702657298' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/21612553/posts/default/6443067387702657298'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/21612553/posts/default/6443067387702657298'/><link rel='alternate' type='text/html' href='http://robertmaldon.blogspot.com/2007/12/google-mobile-maps-pin-points-your.html' title='Google Mobile Maps pin points your location without GPS'/><author><name>Robert Maldon</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-21612553.post-9178651320353446539</id><published>2007-12-08T13:45:00.000+11:00</published><updated>2008-12-12T05:35:57.818+11:00</updated><title type='text'>Instaling and Configuring the Perforce Eclipse Plugin</title><content type='html'>A few clients I've had this year use Perforce for source control. I didn't find the &lt;a href="http://www.perforce.com/perforce/doc.current/user/p4wsadnotes.txt"&gt;official Perforce Eclipse plug-in installation notes&lt;/a&gt; detailed enough, so here is my version:&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;Prerequisites&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;1. If you haven't got the Perforce client already installed (the Eclipse plug-in uses the p4.exe command-line tool) then download it from &lt;a href="http://www.perforce.com/perforce/loadprog.html"&gt;here&lt;/a&gt; and install.&lt;br /&gt;&lt;br /&gt;2. Create a Perforce workspace for your project.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;Eclipse Install and Configuration&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;1. If you are behind a corporate firewall configure Eclipse to use the firewall HTTP proxy. Proxy configuration steps vary with the version of Eclipse, but for Eclipse 3.1 it is :&lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://2.bp.blogspot.com/_3mcDdIZRKc0/R1oIo30mWnI/AAAAAAAAATs/nbQT-1xBK8s/s1600-h/eclipse-inet-proxy.png"&gt;&lt;img style="margin: 0px auto 10px; display: block; text-align: center; cursor: pointer;" src="http://2.bp.blogspot.com/_3mcDdIZRKc0/R1oIo30mWnI/AAAAAAAAATs/nbQT-1xBK8s/s400/eclipse-inet-proxy.png" alt="" id="BLOGGER_PHOTO_ID_5141431422869199474" border="0" /&gt;&lt;/a&gt;a.&lt;span style="font-weight: bold;"&gt; Windows &gt; Preferences &gt; Internet &gt; Proxy Settings&lt;/span&gt;&lt;br /&gt;b. Check &lt;span style="font-weight: bold;"&gt;Enable Proxy&lt;/span&gt;&lt;br /&gt;c. Type in the &lt;span style="font-weight: bold;"&gt;Proxy host&lt;/span&gt; and &lt;span style="font-weight: bold;"&gt;Proxy port&lt;/span&gt;&lt;br /&gt;d. Click &lt;span style="font-weight: bold;"&gt;OK&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;2. Add the Perforce plug-in remote site&lt;br /&gt;&lt;br /&gt;a.&lt;span style="font-weight: bold;"&gt; Help&lt;/span&gt; &gt; &lt;span style="font-weight: bold;"&gt;Software Updates&lt;/span&gt; &gt; &lt;span style="font-weight: bold;"&gt;Find and Install&lt;/span&gt;&lt;br /&gt;b. Click “&lt;span style="font-weight: bold;"&gt;Search for new features to install&lt;/span&gt;” &gt; &lt;span style="font-weight: bold;"&gt;Next&lt;/span&gt;&lt;br /&gt;c. Click “&lt;span style="font-weight: bold;"&gt;New Remote Site&lt;/span&gt;”&lt;br /&gt;d. In the dialog box enter&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;Perforce Plugin&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;for “&lt;span style="font-weight: bold;"&gt;Name&lt;/span&gt;” and&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;http://www.perforce.com/downloads/http/p4-wsad/install/&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;for “&lt;span style="font-weight: bold;"&gt;URL&lt;/span&gt;” &gt; &lt;span style="font-weight: bold;"&gt;OK&lt;/span&gt;&lt;br /&gt;e. Click &lt;span style="font-weight: bold;"&gt;Finish&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;3. Download the plug-in&lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://2.bp.blogspot.com/_3mcDdIZRKc0/R1oZQ30mWoI/AAAAAAAAAT0/wdhp6ftkfdQ/s1600-h/esclipse-p4plugin-install.png"&gt;&lt;img style="margin: 0px auto 10px; display: block; text-align: center; cursor: pointer;" src="http://2.bp.blogspot.com/_3mcDdIZRKc0/R1oZQ30mWoI/AAAAAAAAAT0/wdhp6ftkfdQ/s400/esclipse-p4plugin-install.png" alt="" id="BLOGGER_PHOTO_ID_5141449702250011266" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;a. Check the “&lt;span style="font-weight: bold;"&gt;Perforce Plugin&lt;/span&gt;” checkbox &gt; &lt;span style="font-weight: bold;"&gt;Finish&lt;br /&gt;&lt;br /&gt;&lt;/span&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://2.bp.blogspot.com/_3mcDdIZRKc0/R2tSkHhQAFI/AAAAAAAAAVk/z9X_vBS_3bE/s1600-h/esclipse-p4plugin-updates.png"&gt;&lt;img style="margin: 0px auto 10px; display: block; text-align: center; cursor: pointer;" src="http://2.bp.blogspot.com/_3mcDdIZRKc0/R2tSkHhQAFI/AAAAAAAAAVk/z9X_vBS_3bE/s400/esclipse-p4plugin-updates.png" alt="" id="BLOGGER_PHOTO_ID_5146297779648200786" border="0" /&gt;&lt;/a&gt;b. Check the “&lt;span style="font-weight: bold;"&gt;Perforce Plugin&lt;/span&gt;” checkbox &gt; &lt;span style="font-weight: bold;"&gt;Next&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://1.bp.blogspot.com/_3mcDdIZRKc0/R1oa-n0mWpI/AAAAAAAAAT8/OWX7eYfHfTU/s1600-h/esclipse-p4plugin-license.png"&gt;&lt;img style="margin: 0px auto 10px; display: block; text-align: center; cursor: pointer;" src="http://1.bp.blogspot.com/_3mcDdIZRKc0/R1oa-n0mWpI/AAAAAAAAAT8/OWX7eYfHfTU/s400/esclipse-p4plugin-license.png" alt="" id="BLOGGER_PHOTO_ID_5141451587740654226" border="0" /&gt;&lt;/a&gt;c. Click “&lt;span style="font-weight: bold;"&gt;I accept the terms in the license agreement&lt;/span&gt;” radio button &gt; &lt;span style="font-weight: bold;"&gt;Next&lt;br /&gt;&lt;br /&gt;&lt;/span&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://2.bp.blogspot.com/_3mcDdIZRKc0/R1ocX30mWrI/AAAAAAAAAUM/BTEkyScBSjI/s1600-h/esclipse-p4plugin-location.png"&gt;&lt;img style="margin: 0px auto 10px; display: block; text-align: center; cursor: pointer;" src="http://2.bp.blogspot.com/_3mcDdIZRKc0/R1ocX30mWrI/AAAAAAAAAUM/BTEkyScBSjI/s400/esclipse-p4plugin-location.png" alt="" id="BLOGGER_PHOTO_ID_5141453121043978930" border="0" /&gt;&lt;/a&gt;d. Accept the default plug-in install location by clicking &lt;span style="font-weight: bold;"&gt;Finish&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://1.bp.blogspot.com/_3mcDdIZRKc0/R1owsn0mWxI/AAAAAAAAAU8/TaU_b8EyVIc/s1600-h/esclipse-p4plugin-verification.png"&gt;&lt;img style="margin: 0px auto 10px; display: block; text-align: center; cursor: pointer;" src="http://1.bp.blogspot.com/_3mcDdIZRKc0/R1owsn0mWxI/AAAAAAAAAU8/TaU_b8EyVIc/s400/esclipse-p4plugin-verification.png" alt="" id="BLOGGER_PHOTO_ID_5141475467758820114" border="0" /&gt;&lt;/a&gt;e. Click &lt;span style="font-weight: bold;"&gt;Install All&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://3.bp.blogspot.com/_3mcDdIZRKc0/R1obaH0mWqI/AAAAAAAAAUE/RYrYPIHv9T0/s1600-h/esclipse-p4plugin-restart.png"&gt;&lt;img style="margin: 0px auto 10px; display: block; text-align: center; cursor: pointer;" src="http://3.bp.blogspot.com/_3mcDdIZRKc0/R1obaH0mWqI/AAAAAAAAAUE/RYrYPIHv9T0/s400/esclipse-p4plugin-restart.png" alt="" id="BLOGGER_PHOTO_ID_5141452060187056802" border="0" /&gt;&lt;/a&gt;f. Click &lt;span style="font-weight: bold;"&gt;Yes&lt;/span&gt; when asked if you want to restart Eclipse&lt;br /&gt;&lt;br /&gt;4. Enable label decorations&lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://1.bp.blogspot.com/_3mcDdIZRKc0/R1od1n0mWsI/AAAAAAAAAUU/WBWOyNz6Omk/s1600-h/esclipse-p4plugin-enable-p4-label-decorations.png"&gt;&lt;img style="margin: 0px auto 10px; display: block; text-align: center; cursor: pointer;" src="http://1.bp.blogspot.com/_3mcDdIZRKc0/R1od1n0mWsI/AAAAAAAAAUU/WBWOyNz6Omk/s400/esclipse-p4plugin-enable-p4-label-decorations.png" alt="" id="BLOGGER_PHOTO_ID_5141454731656714946" border="0" /&gt;&lt;/a&gt;&lt;span&gt;a.&lt;/span&gt;&lt;span style="font-weight: bold;"&gt; Windows&lt;/span&gt; &gt; &lt;span style="font-weight: bold;"&gt;Preferences&lt;/span&gt; &gt; &lt;span style="font-weight: bold;"&gt;General&lt;/span&gt; &gt; &lt;span style="font-weight: bold;"&gt;Appearance&lt;/span&gt; &gt; &lt;span style="font-weight: bold;"&gt;Label Decorations&lt;/span&gt;&lt;br /&gt;b. Check “&lt;span style="font-weight: bold;"&gt;Perforce&lt;/span&gt;” &gt; &lt;span style="font-weight: bold;"&gt;OK&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;5. Configure your favorite Perforce Label Decorations&lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://2.bp.blogspot.com/_3mcDdIZRKc0/R1ogU30mWuI/AAAAAAAAAUk/Tsn5gpWebPo/s1600-h/esclipse-p4plugin-p4-label-decorations.png"&gt;&lt;img style="margin: 0px auto 10px; display: block; text-align: center; cursor: pointer;" src="http://2.bp.blogspot.com/_3mcDdIZRKc0/R1ogU30mWuI/AAAAAAAAAUk/Tsn5gpWebPo/s400/esclipse-p4plugin-p4-label-decorations.png" alt="" id="BLOGGER_PHOTO_ID_5141457467550882530" border="0" /&gt;&lt;/a&gt;&lt;span&gt;a.&lt;/span&gt;&lt;span style="font-weight: bold;"&gt; Windows&lt;/span&gt; &gt; &lt;span style="font-weight: bold;"&gt;Preferences&lt;/span&gt; &gt; &lt;span style="font-weight: bold;"&gt;Team&lt;/span&gt; &gt; &lt;span style="font-weight: bold;"&gt;Perforce &gt; Label Decorations&lt;br /&gt;&lt;/span&gt;b. Select the decorators and decorator locations from the "&lt;span style="font-weight: bold;"&gt;File Decoration Icons&lt;/span&gt;" combo boxes&lt;br /&gt;c. Click &lt;span style="font-weight: bold;"&gt;OK&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;6. Configure Eclipse to point to the p4 executable&lt;br /&gt;&lt;br /&gt;If the Perforce p4.exe command-line tool is not in your PATH then you will need to explicitly set the location of it.&lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://2.bp.blogspot.com/_3mcDdIZRKc0/R1ofI30mWtI/AAAAAAAAAUc/JlZCMWsf_nc/s1600-h/esclipse-p4plugin-p4exe-location.png"&gt;&lt;img style="margin: 0px auto 10px; display: block; text-align: center; cursor: pointer;" src="http://2.bp.blogspot.com/_3mcDdIZRKc0/R1ofI30mWtI/AAAAAAAAAUc/JlZCMWsf_nc/s400/esclipse-p4plugin-p4exe-location.png" alt="" id="BLOGGER_PHOTO_ID_5141456161880824530" border="0" /&gt;&lt;/a&gt;&lt;span&gt;a.&lt;/span&gt;&lt;span style="font-weight: bold;"&gt; Windows&lt;/span&gt; &gt; &lt;span style="font-weight: bold;"&gt;Preferences&lt;/span&gt; &gt; &lt;span style="font-weight: bold;"&gt;Team&lt;/span&gt; &gt; &lt;span style="font-weight: bold;"&gt;Perforce&lt;/span&gt;&lt;br /&gt;b. Click the "&lt;span style="font-weight: bold;"&gt;Location&lt;/span&gt;" radio button&lt;br /&gt;c. Enter the full path to the p4.exe in the text box e.g. C:\Program Files\Perforce\p4.exe&lt;br /&gt;d. Click &lt;span style="font-weight: bold;"&gt;OK&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;7. Configure your project to point to your Perforce workspace&lt;br /&gt;&lt;br /&gt;a. In the Eclipse project hierarchy right-click the name of your project &gt; &lt;span style="font-weight: bold;"&gt;Team&lt;/span&gt; &gt; &lt;span style="font-weight: bold;"&gt;Share Project…&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://1.bp.blogspot.com/_3mcDdIZRKc0/R1oh6n0mWvI/AAAAAAAAAUs/Ad5EAdDZ5CI/s1600-h/esclipse-p4plugin-share-proj1.png"&gt;&lt;img style="margin: 0px auto 10px; display: block; text-align: center; cursor: pointer;" src="http://1.bp.blogspot.com/_3mcDdIZRKc0/R1oh6n0mWvI/AAAAAAAAAUs/Ad5EAdDZ5CI/s400/esclipse-p4plugin-share-proj1.png" alt="" id="BLOGGER_PHOTO_ID_5141459215602572018" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;b. Click “&lt;span style="font-weight: bold;"&gt;Perforce&lt;/span&gt;” &gt; &lt;span style="font-weight: bold;"&gt;Next&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://4.bp.blogspot.com/_3mcDdIZRKc0/R1ovJX0mWwI/AAAAAAAAAU0/4esHePJcfFs/s1600-h/esclipse-p4plugin-share-proj2.png"&gt;&lt;img style="margin: 0px auto 10px; display: block; text-align: center; cursor: pointer;" src="http://4.bp.blogspot.com/_3mcDdIZRKc0/R1ovJX0mWwI/AAAAAAAAAU0/4esHePJcfFs/s400/esclipse-p4plugin-share-proj2.png" alt="" id="BLOGGER_PHOTO_ID_5141473762656803586" border="0" /&gt;&lt;/a&gt;c. Enter the PERFORCE_SERVER_NAME:PERFORCE_SERVER_PORT for “&lt;span style="font-weight: bold;"&gt;Port&lt;/span&gt;”, &lt;your_user_id&gt;the Perforce user name for  “&lt;span style="font-weight: bold;"&gt;User&lt;/span&gt;” and Perforce workspace&lt;your_workspace_name&gt; for “&lt;span style="font-weight: bold;"&gt;Client Workspace&lt;/span&gt;” &gt; &lt;span style="font-weight: bold;"&gt;Finish&lt;/span&gt;&lt;/your_workspace_name&gt;&lt;/your_user_id&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;Recovering Your Eclipse Workspace&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;One situation you're likely to come across when using the Perforce plug-in is this: if Eclipse does not shut down properly (e.g. Eclipse crashes or your PC did a forced reboot) then chances are pretty good your Eclipse workspace will be corrupted.&lt;br /&gt;&lt;br /&gt;The symptom of this is that when you try to start Eclipse the splash screen will appear, then disappear and then nothing happens. i.e. Eclipse fails to start. You can verify the cause by looking for Perforce plug-in failure messages in the WORKSPACE_DIR/.metadata/.log file.&lt;br /&gt;&lt;br /&gt;There are two solutions to this:&lt;br /&gt;&lt;br /&gt;1.  Re-create your workspace from scratch, which can take a while.&lt;br /&gt;2.  Manually uninstall and re-install the Perforce plug-in.&lt;br /&gt;&lt;br /&gt;To manually uninstall and re-install the Perforce plug-in do the following:&lt;br /&gt;&lt;br /&gt;i. Exit Eclipse if it is running.&lt;br /&gt;ii. Move the sub-directories beginning with com.perforce found in ECLIPSE_INSTALL_DIR/plugins to a temporary directory (e.g. c:\Temp). In the version of the Perforce plug-in I installed these sub-directories are named&lt;br /&gt;&lt;br /&gt;&lt;ul&gt;&lt;li&gt;com.perforce.p4api_2006.2.4136&lt;/li&gt;&lt;li&gt;com.perforce.p4wsad_2006.2.4136&lt;/li&gt;&lt;li&gt;com.perforce.team.core_2006.2.4136&lt;/li&gt;&lt;li&gt;com.perforce.team.ui_2006.2.4136&lt;/li&gt;&lt;/ul&gt;&lt;br /&gt;iii. Start Eclipse, let it load the workspace, then exit Eclipse normally&lt;br /&gt;iv. Move the Perforce plugin sub-directories back to ECLIPSE_INSTALL_DIR/plugins&lt;br /&gt;v. Start Eclipse&lt;br /&gt;vi. Re-associate the project with the Perforce workspace as per step 7 above&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/21612553-9178651320353446539?l=robertmaldon.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://robertmaldon.blogspot.com/feeds/9178651320353446539/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=21612553&amp;postID=9178651320353446539' title='6 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/21612553/posts/default/9178651320353446539'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/21612553/posts/default/9178651320353446539'/><link rel='alternate' type='text/html' href='http://robertmaldon.blogspot.com/2007/12/instaling-and-configuring-perforce.html' title='Instaling and Configuring the Perforce Eclipse Plugin'/><author><name>Robert Maldon</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://2.bp.blogspot.com/_3mcDdIZRKc0/R1oIo30mWnI/AAAAAAAAATs/nbQT-1xBK8s/s72-c/eclipse-inet-proxy.png' height='72' width='72'/><thr:total>6</thr:total></entry><entry><id>tag:blogger.com,1999:blog-21612553.post-1836403386097423229</id><published>2007-12-05T10:53:00.000+11:00</published><updated>2008-12-12T05:35:57.942+11:00</updated><title type='text'>Konsultant Number One</title><content type='html'>My first Kid Consultant (Konsultant) Jacqueline joined the ranks of the Maldon Family Consultancy (MFC) last week.&lt;br /&gt;&lt;div style="text-align: center;"&gt; &lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://4.bp.blogspot.com/_3mcDdIZRKc0/R1Xo2n0mWmI/AAAAAAAAATk/5wrULBwarv0/s1600-h/konsultant_number_one.jpg"&gt;&lt;img style="margin: 0px auto 10px; display: block; text-align: center; cursor: pointer;" src="http://4.bp.blogspot.com/_3mcDdIZRKc0/R1Xo2n0mWmI/AAAAAAAAATk/5wrULBwarv0/s400/konsultant_number_one.jpg" alt="" id="BLOGGER_PHOTO_ID_5140270574813469282" border="0" /&gt;&lt;/a&gt;&lt;span style="font-weight: bold;"&gt;Architect Jackie helps JSP Monkey daddy debug a webapp&lt;/span&gt;&lt;br /&gt;&lt;/div&gt;&lt;br /&gt;If you would like to hire her then here is a summary of her resume (following the industry standard of experience exaggeration):&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;Roles&lt;/span&gt;: New Media Architect, iCommerce eGuru, Hungry Baby&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;Certifications&lt;/span&gt;: Scrum Master, Lean Wizard&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;Experience&lt;/span&gt;:&lt;br /&gt;&lt;ul&gt;&lt;li&gt;25 years &lt;a href="http://www.jroller.com/Solomon/entry/good_understanding_of_poop"&gt;Principles of Object Oriented Programming (POOP)&lt;/a&gt;&lt;/li&gt;&lt;li&gt;15 years B2B, C2C and D2D&lt;/li&gt;&lt;li&gt;13 years Enterprise Service Bus (ESB), Complex Event Processing (CEP)&lt;br /&gt;&lt;/li&gt;&lt;li&gt;12 years Ruby beyond Rails (RbR)&lt;/li&gt;&lt;/ul&gt;&lt;span style="font-weight: bold;"&gt;Patterns&lt;/span&gt;: Singleton (is there any other pattern than singleton?)&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;Technologies&lt;/span&gt;:&lt;br /&gt;&lt;ul&gt;&lt;li&gt;Awesome Modeling Language (AML) 3.0, Spring 8.0, Hibernate 9.3, Oracle 53.6.0.2&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/21612553-1836403386097423229?l=robertmaldon.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://robertmaldon.blogspot.com/feeds/1836403386097423229/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=21612553&amp;postID=1836403386097423229' title='2 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/21612553/posts/default/1836403386097423229'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/21612553/posts/default/1836403386097423229'/><link rel='alternate' type='text/html' href='http://robertmaldon.blogspot.com/2007/12/konsultant-number-one.html' title='Konsultant Number One'/><author><name>Robert Maldon</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://4.bp.blogspot.com/_3mcDdIZRKc0/R1Xo2n0mWmI/AAAAAAAAATk/5wrULBwarv0/s72-c/konsultant_number_one.jpg' height='72' width='72'/><thr:total>2</thr:total></entry><entry><id>tag:blogger.com,1999:blog-21612553.post-6999081764762645445</id><published>2007-11-26T08:30:00.000+11:00</published><updated>2007-11-26T09:35:17.325+11:00</updated><title type='text'>CEP Round Table Discussion</title><content type='html'>&lt;a href="http://www.watersonline.com/"&gt;Waters magazine&lt;/a&gt; have posted a pretty interesting &lt;a href="http://mediazone.brighttalk.com/comm/Waters/778a1fc43d-5543-1259-5153"&gt;"round table" discussion on the state of Complex Event Processing (CEP)&lt;/a&gt; featuring some of the vendors in this space and an implementor at HSBC. WARNING: Very long, but pretty comprehensive.&lt;br /&gt;&lt;br /&gt;Some of the highlights:&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;Current Uses&lt;/span&gt;&lt;br /&gt;&lt;ul&gt;&lt;li&gt;Front-office and some middle-office applications&lt;/li&gt;&lt;li&gt;Goal: Externalize business rules from embedded code to a CEP intermediate language. (Nothing new here, Wall St firms have been trying to do this for years with expert systems and rules engines.)&lt;br /&gt;&lt;/li&gt;&lt;li&gt;Managing the "lifecycle" of a trade. This may involve doing pre-trade processing - such as risk limits or satisfying legal requirements such as &lt;a href="http://en.wikipedia.org/wiki/Mifid"&gt;MiFID&lt;/a&gt; and &lt;a href="http://en.wikipedia.org/wiki/RegNMS"&gt;RegNMS&lt;/a&gt; - or post-trade processing. Few people thought CEP implementations would be performant enough to do complex analytics that some algo trading systems do, but some said it was currently being used to do algo trading.&lt;br /&gt;&lt;/li&gt;&lt;/ul&gt;&lt;span style="font-weight: bold;"&gt;Inappropriate Uses&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;Things CEP is not suited for:&lt;br /&gt;&lt;ul&gt;&lt;li&gt;Capturing "tick" data&lt;/li&gt;&lt;li&gt;Correlating large amounts of data. This is more a problem with algorithms rather than a particular CEP implementation&lt;br /&gt;&lt;/li&gt;&lt;/ul&gt;&lt;span style="font-weight: bold;"&gt;HSBC Implementation&lt;/span&gt;&lt;br /&gt;&lt;ul&gt;&lt;li&gt;HSBC have implemented their own CEP infrastructure using open source components (&lt;a href="http://esper.codehaus.org/"&gt;Esper&lt;/a&gt;?). Open source was a key feature because it allowed them to put together a new and possibly risky technology stack cheaply and quickly (6 months from design to production).&lt;/li&gt;&lt;li&gt;One application using this CEP stack is &lt;a href="http://www.watersonline.com/public/showPage.html?page=637373"&gt;Barracuda&lt;span style="font-weight: bold;"&gt;&lt;/span&gt;&lt;/a&gt;&lt;/li&gt;&lt;/ul&gt;&lt;span style="font-weight: bold;"&gt;Standards&lt;/span&gt;&lt;br /&gt;&lt;ul&gt;&lt;li&gt;There are no current standards around CEP&lt;/li&gt;&lt;li&gt;Most CEP implementations provide an SQL-like interface - see &lt;a href="http://magmasystems.blogspot.com/2007/11/more-on-first-cep-use-case.html"&gt;Marc's post&lt;/a&gt; for a good example of this. The panel agreed this was probably because SQL was familiar to many IT people, but not suitable for everyone (e.g. traders)&lt;/li&gt;&lt;li&gt;One CEP vendor said their "rules GUI" provided a competitive advantage&lt;/li&gt;&lt;li&gt;The HSBC representative preferred a UML-like GUI rather than SQL&lt;/li&gt;&lt;li&gt;A barrier to implementing CEP is to convince business that it is ok to reimplement logic from their trusted embedded code to a new CEP language&lt;/li&gt;&lt;/ul&gt;&lt;span style="font-weight: bold;"&gt;Benchmarks&lt;/span&gt;&lt;br /&gt;&lt;ul&gt;&lt;li&gt;No standard benchmarks yet, but the old chestnuts throughput and latency were mentioned&lt;br /&gt;&lt;/li&gt;&lt;/ul&gt;&lt;span style="font-weight: bold;"&gt;Future Uses&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;Although the "C" in CEP stands for "Complex", most current uses of CEP involve capturing relatively simple events. Some potential future uses for CEP:&lt;br /&gt;&lt;ul&gt;&lt;li&gt;Increasingly complex real-time correlations. One example given was that of a hurricane reported heading for the Gulf of Mexico. Commodity traders typically react to such news by selling &lt;span style="font-style: italic;"&gt;everything&lt;/span&gt; related to oil assets in the gulf. After they sell the traders then they analyze the news in more detail, determining exactly what assets could be effected. If they find assets that will be spared by the hurricane they start buying again. A CEP system might help the traders determine which assets will be effected more quickly than their rivals.&lt;/li&gt;&lt;li&gt;Regulation are likely to require companies to store more and more data&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/21612553-6999081764762645445?l=robertmaldon.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://robertmaldon.blogspot.com/feeds/6999081764762645445/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=21612553&amp;postID=6999081764762645445' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/21612553/posts/default/6999081764762645445'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/21612553/posts/default/6999081764762645445'/><link rel='alternate' type='text/html' href='http://robertmaldon.blogspot.com/2007/11/cep-round-table-discussion.html' title='CEP Round Table Discussion'/><author><name>Robert Maldon</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-21612553.post-1642494609407811899</id><published>2007-11-22T14:50:00.000+11:00</published><updated>2007-11-22T15:36:39.913+11:00</updated><title type='text'>GMail upgrade breaks Greasemonkey Ad Remover scripts, adds API for Greasemonkey</title><content type='html'>On October 29 GMail did an &lt;a href="http://gmailblog.blogspot.com/2007/10/code-changes-to-prepare-gmail-for.html"&gt;upgrade&lt;/a&gt; that changed many of the internal HTML elements used to display email. i.e. many of then element id's and class names changed. Unfortunately this broke some of my favorite &lt;a href="http://en.wikipedia.org/wiki/Greasemonkey"&gt;Greasemonkey&lt;/a&gt; scripts such as &lt;a href="http://userscripts.org/scripts/show/5884"&gt;GMail Ad Remover&lt;/a&gt; (removes the Sponsored Links) and &lt;a href="http://userscripts.org/scripts/show/9409"&gt;GMail Full Width&lt;/a&gt; (removes Sponsored Links and widens the conversation area by moving buttons around).&lt;br /&gt;&lt;br /&gt;Some of the other fans of the ad remover scripts &lt;a href="http://groups.google.com/group/greasemonkey-users/browse_thread/thread/6bcd9a2b2a4b942a"&gt;also noticed it had been broken&lt;/a&gt;. Very interestingly the GMail developers had this to say:&lt;br /&gt;&lt;br /&gt;&lt;span style="font-style: italic;"&gt;While we (like most web services) don't officially support third-party extensions like Greasemonkey scripts, we realize that some of our most active users want to write and run them. Because these scripts directly modify a web service's code rather than using a stable API, they tend to be fragile to even small changes in a web app's code (and can even create bugs in the web app itself).&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-style: italic;"&gt;To make this easier on our Greasemonkey users, we've recently added an experimental &lt;/span&gt;&lt;a style="font-style: italic;" href="http://code.google.com/p/gmail-greasemonkey/wiki/GmailGreasemonkey10API"&gt;Gmail/Greasemonkey API&lt;/a&gt;&lt;span style="font-style: italic;"&gt; that should make these types of scripts easier to write and more robust to code changes.&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;Wow! Of course Google are not under any obligation to support third-party extensions (after all you can't call HTML page layouts an "external API"). It is pretty impressive that a company as big as Google are attempting to provide a compatibility layer for a third-party extension they have no financial interest in.&lt;br /&gt;&lt;br /&gt;So what does a Greasemonkey script that hides GMail ads and uses this new API look like? This does the trick:&lt;br /&gt;&lt;br /&gt;&lt;a href="http://geocities.com/robertmaldon/gmailadremover.user.js"&gt;gmailadremover.user.js&lt;/a&gt;&lt;br /&gt;&lt;pre&gt;&lt;br /&gt;// ==UserScript==&lt;br /&gt;// @name           Gmail Ad Remover&lt;br /&gt;// @namespace      http://robertmaldon.blogspot.com/gmailadremover&lt;br /&gt;// @description    Remove the Sponsored Links from GMail&lt;br /&gt;// @include        http://mail.google.com/*&lt;br /&gt;// @include        https://mail.google.com/*&lt;br /&gt;// ==/UserScript==&lt;br /&gt;&lt;br /&gt;window.addEventListener('load', function() {&lt;br /&gt;if (unsafeWindow.gmonkey) {&lt;br /&gt; unsafeWindow.gmonkey.load('1.0', function(gmail) {&lt;br /&gt;   function removeAds() {&lt;br /&gt;     if (gmail.getActiveViewType() == 'cv') {&lt;br /&gt;       var sponsored = gmail.getConvRhsElement().lastChild;&lt;br /&gt;    sponsored.style.display = 'none';&lt;br /&gt;     }&lt;br /&gt;   }&lt;br /&gt;   gmail.registerViewChangeCallback(removeAds);&lt;br /&gt;   removeAds();&lt;br /&gt; });&lt;br /&gt;}&lt;br /&gt;}, true);&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;While the ads are hidden, however, the table column that held the ads - and the "Print all", "Expand all", etc buttons - still take up a lot of space. So a quick and dirty GMail Full Width script that hides the whole column (including the buttons unfortunately) looks like:&lt;br /&gt;&lt;br /&gt;&lt;a href="http://geocities.com/robertmaldon/gmailadcolumnremover.user.js"&gt;gmailadcolumnremover.user.js&lt;/a&gt;&lt;br /&gt;&lt;pre&gt;&lt;br /&gt;// ==UserScript==&lt;br /&gt;// @name           Gmail Ad Column Remover&lt;br /&gt;// @namespace      http://robertmaldon.blogspot.com/gmailadcolumnremover&lt;br /&gt;// @description    Remove the Sponsored Links table column from GMail&lt;br /&gt;// @include        http://mail.google.com/*&lt;br /&gt;// @include        https://mail.google.com/*&lt;br /&gt;// ==/UserScript==&lt;br /&gt;&lt;br /&gt;window.addEventListener('load', function() {&lt;br /&gt;if (unsafeWindow.gmonkey) {&lt;br /&gt; unsafeWindow.gmonkey.load('1.0', function(gmail) {&lt;br /&gt;   function removeAdColumn() {&lt;br /&gt;     if (gmail.getActiveViewType() == 'cv') {&lt;br /&gt;    var sponsored = gmail.getConvRhsElement().lastChild;&lt;br /&gt;    var sponsoredColumn = sponsored.parentNode.parentNode;&lt;br /&gt;    sponsoredColumn.style.display = 'none';&lt;br /&gt;    var convTable = gmail.getConvRhsElement().parentNode.parentNode.parentNode;&lt;br /&gt;    convTable.width = '100%';&lt;br /&gt;     }&lt;br /&gt;   }&lt;br /&gt;   gmail.registerViewChangeCallback(removeAdColumn);&lt;br /&gt;   removeAdColumn();&lt;br /&gt; });&lt;br /&gt;}&lt;br /&gt;}, true);&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;When I get some more time I'll have to explore the power of this new API - and write a proper full width script that moves the buttons to a different location!&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/21612553-1642494609407811899?l=robertmaldon.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://robertmaldon.blogspot.com/feeds/1642494609407811899/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=21612553&amp;postID=1642494609407811899' title='3 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/21612553/posts/default/1642494609407811899'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/21612553/posts/default/1642494609407811899'/><link rel='alternate' type='text/html' href='http://robertmaldon.blogspot.com/2007/11/gmail-upgrade-breaks-greasemonkey-ad.html' title='GMail upgrade breaks Greasemonkey Ad Remover scripts, adds API for Greasemonkey'/><author><name>Robert Maldon</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>3</thr:total></entry><entry><id>tag:blogger.com,1999:blog-21612553.post-470834224411876469</id><published>2007-11-22T11:55:00.000+11:00</published><updated>2008-12-12T05:35:58.338+11:00</updated><title type='text'>UML is dead, long live LSD</title><content type='html'>As part of a project hand-over I've recently done at a client there was the inevitable set of "standard" documents to write, such as a Design Document and a Troubleshooting guide.&lt;br /&gt;&lt;br /&gt;There was no standard template for the Design Document, so amongst other things I included some &lt;a href="http://en.wikipedia.org/wiki/Class_diagram"&gt;UML class diagrams&lt;/a&gt;.&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://1.bp.blogspot.com/_3mcDdIZRKc0/R0ThJeUNtoI/AAAAAAAAATc/KzXUrL1sQ-E/s1600-h/umlisdead.jpg"&gt;&lt;img style="margin: 0px auto 10px; display: block; text-align: center; cursor: pointer;" src="http://1.bp.blogspot.com/_3mcDdIZRKc0/R0ThJeUNtoI/AAAAAAAAATc/KzXUrL1sQ-E/s400/umlisdead.jpg" alt="" id="BLOGGER_PHOTO_ID_5135477027982128770" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;I was not specifically asked to include UML diagrams, but there was no objection to including them.&lt;br /&gt;&lt;br /&gt;On reflection I haven't been asked by a client to specifically do UML diagrams for about 2 years now. Is this an indicator that UML is dead?&lt;br /&gt;&lt;br /&gt;If UML is on its last legs what has replaced it? Seems to be what we had before Booch, Rumbaugh and the whole UML craze came along: ah-hoc component diagrams and sequence diagrams. (Although component and sequence diagrams are part of UML the UML versions have a particular look and convention to them.) Specs also seem to be getting thinner. I think the mainstreaming of &lt;a href="http://en.wikipedia.org/wiki/Agile_software_development"&gt;Agile&lt;/a&gt; and &lt;a href="http://en.wikipedia.org/wiki/Lean_software_development"&gt;Lean Software Development&lt;/a&gt; (&lt;a href="http://en.wikipedia.org/wiki/LSD"&gt;&lt;strike&gt;LSD&lt;/strike&gt;&lt;/a&gt;) ideas are taking effect.&lt;br /&gt;&lt;br /&gt;btw, if you are using Eclipse there are a bunch of &lt;a href="http://eclipse-plugins.2y.net/eclipse/plugins.jsp?category=UML"&gt;UML plugins&lt;/a&gt; that can help you draw UML diagrams. Most are a real pain to install. &lt;a href="http://amateras.sourceforge.jp/cgi-bin/fswiki_en/wiki.cgi?page=AmaterasUML"&gt;AmaterasUML&lt;/a&gt;, however, is very easy to install and has just enough features to make it useful (e.g. drag a Java class from the Java view and just drop it on to an AmaterasUML diagram view).&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/21612553-470834224411876469?l=robertmaldon.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://robertmaldon.blogspot.com/feeds/470834224411876469/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=21612553&amp;postID=470834224411876469' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/21612553/posts/default/470834224411876469'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/21612553/posts/default/470834224411876469'/><link rel='alternate' type='text/html' href='http://robertmaldon.blogspot.com/2007/11/uml-is-dead-long-live-lsd.html' title='UML is dead, long live LSD'/><author><name>Robert Maldon</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://1.bp.blogspot.com/_3mcDdIZRKc0/R0ThJeUNtoI/AAAAAAAAATc/KzXUrL1sQ-E/s72-c/umlisdead.jpg' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-21612553.post-4904871391294495447</id><published>2007-11-19T11:17:00.000+11:00</published><updated>2007-11-19T11:29:36.987+11:00</updated><title type='text'>Minimial rsync/ssh for Windows</title><content type='html'>Every now and again I'm required to synchronize files between Windows and UNIX, usually a Windows desktop and UNIX server. Some of the commons tools for this task include a &lt;a href="http://en.wikipedia.org/wiki/Samba"&gt;&lt;strike&gt;Samba&lt;/strike&gt;&lt;/a&gt; &lt;a href="http://en.wikipedia.org/wiki/Samba_%28software%29"&gt;Samba&lt;/a&gt; / &lt;a href="http://en.wikipedia.org/wiki/Robocopy"&gt;robocopy&lt;/a&gt; combination, or installing the UNIX-like &lt;a href="http://en.wikipedia.org/wiki/Cygwin"&gt;cygwin&lt;/a&gt; tools to use &lt;a href="http://en.wikipedia.org/wiki/Rsync"&gt;rsync&lt;/a&gt;/&lt;a href="http://en.wikipedia.org/wiki/Secure_copy"&gt;scp&lt;/a&gt;.&lt;br /&gt;&lt;br /&gt;I personally think for this purpose cygwin is overkill and robocopy is slow and not very intuitive to use. With this bias in mind I was happy to stumble upon this article on &lt;a href="http://optics.ph.unimelb.edu.au/help/rsync/rsync_pc1.html"&gt;installing a minimal rsync/ssh package on Windows&lt;/a&gt;. I must try this package out next opportunity!&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/21612553-4904871391294495447?l=robertmaldon.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://robertmaldon.blogspot.com/feeds/4904871391294495447/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=21612553&amp;postID=4904871391294495447' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/21612553/posts/default/4904871391294495447'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/21612553/posts/default/4904871391294495447'/><link rel='alternate' type='text/html' href='http://robertmaldon.blogspot.com/2007/11/minimial-rsyncssh-for-windows.html' title='Minimial rsync/ssh for Windows'/><author><name>Robert Maldon</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-21612553.post-4667081139088406685</id><published>2007-11-19T10:28:00.001+11:00</published><updated>2008-10-28T21:47:48.882+11:00</updated><title type='text'>RedHat buys then open sources AMQP implementation</title><content type='html'>How did I miss this event?&lt;br /&gt;&lt;br /&gt;Previously I've &lt;a href="http://robertmaldon.blogspot.com/2006/10/john-davies-podcast-on-current.html"&gt;blogged&lt;/a&gt; about &lt;a href="http://en.wikipedia.org/wiki/AMQP"&gt;Advanced Message Queue Protocol (AMQP)&lt;/a&gt;, an effort by JPMorgan to commoditize messaging and break the back (i.e. save on the hugely expensive licensing costs) of the messaging behemoths Tibco and IBM.&lt;br /&gt;&lt;br /&gt;According to &lt;a href="http://www.news.com/8301-13580_3-9818217-39.html?tag=nefd.lede"&gt;this article&lt;/a&gt; RedHat bought an AMQP implementation from JPMorgan, improved it, then gave the implementation to the Apache Foundation as the &lt;a href="http://cwiki.apache.org/qpid/"&gt;QPid&lt;/a&gt; project. Currently there is a Java and C++ broker with clients in C++, Java (JMS), Ruby, Pyhton and C# for .NET.&lt;br /&gt;&lt;br /&gt;Red Hat has the ambitious goal of enabling a server to process 1 million messages per second.&lt;br /&gt;&lt;br /&gt;I guess JP didn't have an interest in maintaining the AMQP implementation, but RedHat are not exactly cheap when it comes to maintenance fees (but so far cheaper than Tibco and IBM).&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;Update&lt;/span&gt;: &lt;a href="http://robertmaldon.blogspot.com/2008/10/microsoft-joins-amqp-enterprise.html"&gt;Microsoft have joined the AMQP working group&lt;/a&gt;!&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/21612553-4667081139088406685?l=robertmaldon.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://robertmaldon.blogspot.com/feeds/4667081139088406685/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=21612553&amp;postID=4667081139088406685' title='2 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/21612553/posts/default/4667081139088406685'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/21612553/posts/default/4667081139088406685'/><link rel='alternate' type='text/html' href='http://robertmaldon.blogspot.com/2007/11/redhat-buys-then-open-sources-amqp.html' title='RedHat buys then open sources AMQP implementation'/><author><name>Robert Maldon</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>2</thr:total></entry><entry><id>tag:blogger.com,1999:blog-21612553.post-6708820014059718723</id><published>2007-11-16T14:44:00.000+11:00</published><updated>2008-12-12T05:35:58.574+11:00</updated><title type='text'>When Network Cables Attack</title><content type='html'>&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://2.bp.blogspot.com/_3mcDdIZRKc0/Rz0SfeUNtnI/AAAAAAAAATU/VOc_Gi9aB8c/s1600-h/network-cables-gone-wild.jpg"&gt;&lt;img style="margin: 0px auto 10px; display: block; text-align: center; cursor: pointer;" src="http://2.bp.blogspot.com/_3mcDdIZRKc0/Rz0SfeUNtnI/AAAAAAAAATU/VOc_Gi9aB8c/s400/network-cables-gone-wild.jpg" alt="" id="BLOGGER_PHOTO_ID_5133279482195326578" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;I bet you this is Time-Warner's data center...&lt;br /&gt;&lt;br /&gt;(Picture from &lt;a href="http://kevinremde.members.winisp.net/images/yellow_wall.jpg"&gt;http://kevinremde.members.winisp.net/images/yellow_wall.jpg&lt;/a&gt;)&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/21612553-6708820014059718723?l=robertmaldon.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://robertmaldon.blogspot.com/feeds/6708820014059718723/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=21612553&amp;postID=6708820014059718723' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/21612553/posts/default/6708820014059718723'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/21612553/posts/default/6708820014059718723'/><link rel='alternate' type='text/html' href='http://robertmaldon.blogspot.com/2007/11/when-network-cables-attack.html' title='When Network Cables Attack'/><author><name>Robert Maldon</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://2.bp.blogspot.com/_3mcDdIZRKc0/Rz0SfeUNtnI/AAAAAAAAATU/VOc_Gi9aB8c/s72-c/network-cables-gone-wild.jpg' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-21612553.post-1874032748691422053</id><published>2007-11-15T13:58:00.000+11:00</published><updated>2008-12-12T05:35:58.755+11:00</updated><title type='text'>Swing gets even slower by using Vector Graphics</title><content type='html'>In &lt;a href="http://robertmaldon.blogspot.com/2006/09/swing-gone-crazy.html"&gt;previous posts&lt;/a&gt; I've lamented how Swing had great potential to capture the hearts and minds of GUI developers, but stubbornness on not using native widgets and a bad implementation means they have forfeited GUI applications to competitors like .NET. Most new thick GUIs that our financial clients ask us to develop are .NET GUIs (C# is the language of choice).&lt;br /&gt;&lt;br /&gt;I was reminded recently of the pitfalls of the Swing draw-each-widget-pixel-by-pixel approach when I used a simple GUI like JConsole to access an application that I was JMX-ising:&lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://2.bp.blogspot.com/_3mcDdIZRKc0/Rzu4H-UNtmI/AAAAAAAAATM/Qs01F-OPm4s/s1600-h/slowswing.png"&gt;&lt;img style="margin: 0px auto 10px; display: block; text-align: center; cursor: pointer;" src="http://2.bp.blogspot.com/_3mcDdIZRKc0/Rzu4H-UNtmI/AAAAAAAAATM/Qs01F-OPm4s/s400/slowswing.png" alt="" id="BLOGGER_PHOTO_ID_5132898647445190242" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;Horrible refresh problem. Swing applications seem to be much more prone to this than native applications.&lt;br /&gt;&lt;br /&gt;Can I blame this on the pixel-by-pixel approach, or just Swing's implementation of it? One other implementation of pixel-by-pixel that I played with a few years ago is &lt;a href="http://www.thinlet.com/"&gt;Thinlet&lt;/a&gt;, a remarkably tiny GUI toolkit. I have never put a Thinlet application into production (only recently have clients gotten comfortable with the LGPL license), but I was impressed with the speed of it.&lt;br /&gt;&lt;br /&gt;Recently I read an article &lt;a href="http://www.infoq.com/news/2007/09/nimbus-vector-laf"&gt;Nimbus&lt;/a&gt;, a new sexy look-and-feel that the Sun Swing engineers are working hard on. When I read that Nimbus used vector graphics I cringed. Even with faster CPUs I bet the performance will still be similar to the current pixel-by-pixel approach. i.e. sucks&lt;br /&gt;&lt;br /&gt;Don't get me wrong. Having a vector graphics option is good for some GUIs, but I really wish Sun (or whoever ends up driving the GUI side of Java) would also standardize a fast GUI toolkit. &lt;a href="http://en.wikipedia.org/wiki/Standard_Widget_Toolkit"&gt;SWT&lt;/a&gt; is one option. Thinlet is another.&lt;br /&gt;&lt;br /&gt;It is also interesting to note that &lt;a href="http://google-code-updates.blogspot.com/2007/11/android-sdk-msm7k-kernel-patches-and.html"&gt;Android&lt;/a&gt;, Google's Java-based framework for developing mobile phone applications, &lt;a href="http://www.infoq.com/news/2007/11/android-java"&gt;does not include any of the standard AWT or Swing libraries&lt;/a&gt;, instead using OpenGL C/C++ bindings.&lt;br /&gt;&lt;br /&gt;Shame Sun, Shame for missing the opportunity to take over the desktop.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/21612553-1874032748691422053?l=robertmaldon.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://robertmaldon.blogspot.com/feeds/1874032748691422053/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=21612553&amp;postID=1874032748691422053' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/21612553/posts/default/1874032748691422053'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/21612553/posts/default/1874032748691422053'/><link rel='alternate' type='text/html' href='http://robertmaldon.blogspot.com/2007/11/swing-gets-even-slower-by-using-vector.html' title='Swing gets even slower by using Vector Graphics'/><author><name>Robert Maldon</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://2.bp.blogspot.com/_3mcDdIZRKc0/Rzu4H-UNtmI/AAAAAAAAATM/Qs01F-OPm4s/s72-c/slowswing.png' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-21612553.post-2605010337052276199</id><published>2007-11-05T13:39:00.000+11:00</published><updated>2007-11-05T14:37:32.363+11:00</updated><title type='text'>Dynamically add to the Eclipse JUnit classpath</title><content type='html'>When you run JUnit tests inside Eclipse something that may bite you is the fact that the compile classpath and runtime classpath are separate.&lt;br /&gt;&lt;br /&gt;Let's say your Eclipse project directories are layed out something like the following:&lt;br /&gt;&lt;br /&gt;PROJ_ROOT&lt;br /&gt;&lt;ul&gt;&lt;li&gt;bin&lt;/li&gt;&lt;li&gt;conf&lt;/li&gt;&lt;li&gt;src&lt;/li&gt;&lt;li&gt;test&lt;/li&gt;&lt;/ul&gt;where &lt;span style="font-weight: bold;"&gt;src&lt;/span&gt; contains your core application source code and &lt;span style="font-weight: bold;"&gt;test&lt;/span&gt; contains your JUnit tests.&lt;br /&gt;&lt;br /&gt;When a JUnit test runs, by default the base run directory and the classpath root is the PROJ_ROOT directory. Therefore, if your unit test loads a file relative to the the PROJ_ROOT, say:&lt;br /&gt;&lt;br /&gt;&lt;pre&gt;&lt;br /&gt;new FileInputStream("conf/context.xml");&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;or&lt;br /&gt;&lt;br /&gt;&lt;pre&gt;&lt;br /&gt;Thread.currentThread().getContextClassLoader().getResourceAsStream("conf/context.xml");&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;it will work. If, however, you've told Eclipse that &lt;span style="font-weight: bold;"&gt;conf&lt;/span&gt; is a "src" directory (i.e. part of the compile classpath) and then try to load a file from somewhere in the classpath from your unit  test like so:&lt;br /&gt;&lt;br /&gt;&lt;pre&gt;&lt;br /&gt;Thread.currentThread().getContextClassLoader().getResourceAsStream("context.xml");&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;it will fail.&lt;br /&gt;&lt;br /&gt;So what can you do to change the classpath for the unit tests that need it?&lt;br /&gt;&lt;br /&gt;You can manually add the conf directory to the runtime classpath for just those unit tests that need them, but unfortunately so does everyone else in your team.&lt;br /&gt;&lt;br /&gt;A cute trick is to change the thread classloader to a URLClassLoader, whose constructor allows you to add URLs (including directories) to the runtime classpath:&lt;br /&gt;&lt;br /&gt;&lt;pre&gt;&lt;br /&gt;ClassLoader currentThreadClassLoader&lt;br /&gt; = Thread.currentThread().getContextClassLoader();&lt;br /&gt;&lt;br /&gt;// Add the conf dir to the classpath&lt;br /&gt;// Chain the current thread classloader&lt;br /&gt;URLClassLoader urlClassLoader&lt;br /&gt; = new URLClassLoader(new URL[]{new File("conf").toURL()},&lt;br /&gt;                      currentClassLoader);&lt;br /&gt;&lt;br /&gt;// Replace the thread classloader - assumes&lt;br /&gt;// you have permissions to do so&lt;br /&gt;Thread.currentThread().setContextClassLoader(urlClassLoader);&lt;br /&gt;&lt;br /&gt;// This should work now!&lt;br /&gt;Thread.currentThread().getContextClassLoader().getResourceAsStream("context.xml");&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;To give credit where it is due the above is a slightly simplified version of a solution from my colleague &lt;a href="http://www.linkedin.com/in/rfaust"&gt;Randy&lt;/a&gt; who came up with it when we worked together on a project earlier this year. His solution makes the assumption that the JVMs system classloader is a URLClassLoader (may not be true for all JVMs) and uses a bit of reflection magic to add to the classpath:&lt;br /&gt;&lt;br /&gt;&lt;pre&gt;&lt;br /&gt;public void addURL(URL url) throws Exception {&lt;br /&gt;  URLClassLoader classLoader&lt;br /&gt;         = (URLClassLoader) ClassLoader.getSystemClassLoader();&lt;br /&gt;  Class clazz= URLClassLoader.class;&lt;br /&gt;&lt;br /&gt;  // Use reflection&lt;br /&gt;  Method method= clazz.getDeclaredMethod("addURL", new Class[] { URL.class });&lt;br /&gt;  method.setAccessible(true);&lt;br /&gt;  method.invoke(classLoader, new Object[] { url });&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;addURL(new File("conf").toURL());&lt;br /&gt;&lt;br /&gt;// This should work now!&lt;br /&gt;Thread.currentThread().getContextClassLoader().getResourceAsStream("context.xml");&lt;br /&gt;&lt;/pre&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/21612553-2605010337052276199?l=robertmaldon.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://robertmaldon.blogspot.com/feeds/2605010337052276199/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=21612553&amp;postID=2605010337052276199' title='1 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/21612553/posts/default/2605010337052276199'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/21612553/posts/default/2605010337052276199'/><link rel='alternate' type='text/html' href='http://robertmaldon.blogspot.com/2007/11/dynamically-add-to-eclipse-junit.html' title='Dynamically add to the Eclipse JUnit classpath'/><author><name>Robert Maldon</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-21612553.post-6557021335919179236</id><published>2007-11-05T03:46:00.000+11:00</published><updated>2007-11-05T03:57:32.911+11:00</updated><title type='text'>When Teachers Attack - Caught On Mobile Phone Camera</title><content type='html'>My own experience of High School showed me teachers were a mixed bag - some excellent, some very average and some very lazy. Occasionally good teachers had bad moments.&lt;br /&gt;&lt;br /&gt;I've got mixed feelings about &lt;a href="http://www.cracked.com/article_15630_youtubes-7-scariest-teachers.html"&gt;YouTube's 7 Scariest Teachers&lt;/a&gt;, a selection of teacher rants caught by students with mobile (cell) phone cameras. Should teachers, who are already struggling to teach &lt;a href="http://c4vct.com/kym/humor/nymath.htm"&gt;unmotivated students&lt;/a&gt;, be exposed to public ridicule like this? On the other hand this could help weed out people who shouldn't be teaching.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/21612553-6557021335919179236?l=robertmaldon.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://robertmaldon.blogspot.com/feeds/6557021335919179236/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=21612553&amp;postID=6557021335919179236' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/21612553/posts/default/6557021335919179236'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/21612553/posts/default/6557021335919179236'/><link rel='alternate' type='text/html' href='http://robertmaldon.blogspot.com/2007/11/when-teachers-attack-caught-on-mobile.html' title='When Teachers Attack - Caught On Mobile Phone Camera'/><author><name>Robert Maldon</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-21612553.post-8681714623482697805</id><published>2007-11-05T02:17:00.000+11:00</published><updated>2007-11-05T02:44:11.044+11:00</updated><title type='text'>What keywords do recruiters search for?</title><content type='html'>It's well known that recruiters / job agents do a lot of filtering of resumes using keyword searches. (I get a lot of spam from recruiters based on a technology I might have used once or twice in my career that I mentioned on my resume at some point in the past.)&lt;br /&gt;&lt;br /&gt;But what keywords are hot right now? Marketing job website MktgLadder have made available a regularly updated &lt;a href="http://marketing-jobs.theladders.com/toprecruiterkeywords"&gt;Top 100 Keywords&lt;/a&gt; searched for by recruiters. I would like to see this feature added to some of the more IT-centric job sites like &lt;a href="http://career-resources.dice.com/it-job-market/Q3-2007/new_york.shtml"&gt;Dice&lt;/a&gt;.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/21612553-8681714623482697805?l=robertmaldon.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://robertmaldon.blogspot.com/feeds/8681714623482697805/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=21612553&amp;postID=8681714623482697805' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/21612553/posts/default/8681714623482697805'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/21612553/posts/default/8681714623482697805'/><link rel='alternate' type='text/html' href='http://robertmaldon.blogspot.com/2007/11/what-keywords-do-recruiters-search-for.html' title='What keywords do recruiters search for?'/><author><name>Robert Maldon</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-21612553.post-2063308647502354601</id><published>2007-10-20T13:09:00.000+10:00</published><updated>2007-10-20T13:31:04.911+10:00</updated><title type='text'>Microsoft Silverlight is anti-competitive?</title><content type='html'>It seems that &lt;a href="http://arstechnica.com/news.ars/post/20071018-seven-states-move-to-extend-final-judgement-against-microsoft.html"&gt;seven U.S. states consider Microsoft has been dragging its feet&lt;/a&gt; in providing information about its server protocols as required to do so when it lost an anti-trust case a few years ago. Fearing that technologies like &lt;a href="http://en.wikipedia.org/wiki/Silverlight"&gt;Silverlight&lt;/a&gt; "substantially depend upon the browser" and that Internet Explorer is still bundled with Windows the states are asking for an extension to the anti-trust judgment.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/21612553-2063308647502354601?l=robertmaldon.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://robertmaldon.blogspot.com/feeds/2063308647502354601/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=21612553&amp;postID=2063308647502354601' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/21612553/posts/default/2063308647502354601'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/21612553/posts/default/2063308647502354601'/><link rel='alternate' type='text/html' href='http://robertmaldon.blogspot.com/2007/10/microsoft-silverlight-is-anti.html' title='Microsoft Silverlight is anti-competitive?'/><author><name>Robert Maldon</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-21612553.post-432509755859543143</id><published>2007-10-20T09:42:00.000+10:00</published><updated>2007-10-20T09:51:04.674+10:00</updated><title type='text'>Reading DOCX and other Office 2007 formats using older versions of Office</title><content type='html'>If you're like me and haven't had a need to upgrade from Office 2000 but get sent a file in one of the new Office 2007 formats then you might be able to open up these files in your old version of Office using the &lt;a href="http://www.microsoft.com/downloads/details.aspx?FamilyId=941B3470-3AE9-4AEE-8F43-C6BB74CD1466&amp;amp;displaylang=en"&gt;Microsoft Office Compatibility Pack&lt;/a&gt;, a free download.&lt;br /&gt;&lt;br /&gt;There also seem to be a couple of free conversion services on the web if you're willing to upload your docs: &lt;a href="http://www.docx2doc.com/"&gt;docx2doc.com&lt;/a&gt; and &lt;a href="http://docx-converter.com/"&gt;docx-converter.com&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;I'll have to give &lt;a href="http://www.openoffice.org/"&gt;OpenOffice&lt;/a&gt; a try some time :)&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/21612553-432509755859543143?l=robertmaldon.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://robertmaldon.blogspot.com/feeds/432509755859543143/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=21612553&amp;postID=432509755859543143' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/21612553/posts/default/432509755859543143'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/21612553/posts/default/432509755859543143'/><link rel='alternate' type='text/html' href='http://robertmaldon.blogspot.com/2007/10/reading-docx-and-other-office-2007.html' title='Reading DOCX and other Office 2007 formats using older versions of Office'/><author><name>Robert Maldon</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-21612553.post-7132498406727518036</id><published>2007-10-18T13:02:00.000+10:00</published><updated>2007-10-18T13:22:39.488+10:00</updated><title type='text'>BEA Event Server based on open source Esper project</title><content type='html'>While reading &lt;a href="http://www.infoq.com/news/2007/10/esper"&gt;Catching up with Esper: Event Stream Processing Framework&lt;/a&gt; I couldn't help but notice this little gem: BEA's recently launched &lt;a href="http://www.bea.com/framework.jsp?CNT=pr01807.htm&amp;amp;FP=/content/news_events/press_releases/2007&amp;amp;WT.ac=infoQ-news"&gt;WebLogic Event Server&lt;/a&gt; is based on a modified version of the open source &lt;a href="http://esper.codehaus.org/"&gt;Esper&lt;/a&gt; event stream processing (ESP) and complex event processing (CEP)  project.&lt;br /&gt;&lt;br /&gt;This is a departure from the normal behavior of BEA, which is buy a product/vendor if the other vendor is small enough or license it if the other vendor is big. I can only assume that there are not that many vendors in the CEP space and that Esper is reasonably mature.&lt;br /&gt;&lt;br /&gt;So what value add does the BEA version contain? Not much info on this, but appears to offer an entire server architecture - including deployment, admin, security, etc - for those that don't want to build their own. Interestingly this product is not based on WebLogic, but is a more light-weight stack based around an &lt;a href="http://en.wikipedia.org/wiki/Osgi"&gt;OSGi&lt;/a&gt; model.&lt;br /&gt;&lt;br /&gt;The Esper API looks suspiciously like the &lt;a href="http://www.progress.com/apama/"&gt;Apama&lt;/a&gt; API :)&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/21612553-7132498406727518036?l=robertmaldon.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://robertmaldon.blogspot.com/feeds/7132498406727518036/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=21612553&amp;postID=7132498406727518036' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/21612553/posts/default/7132498406727518036'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/21612553/posts/default/7132498406727518036'/><link rel='alternate' type='text/html' href='http://robertmaldon.blogspot.com/2007/10/bea-event-server-based-on-open-source.html' title='BEA Event Server based on open source Esper project'/><author><name>Robert Maldon</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-21612553.post-691805999703239142</id><published>2007-10-11T02:13:00.000+10:00</published><updated>2007-10-11T02:39:21.536+10:00</updated><title type='text'>The 4-Hour Workweek: Tips on managing your time in the era of email, IM, etc</title><content type='html'>Intro video on the Tim Ferriss book &lt;a href="http://www.amazon.com/4-Hour-Workweek-Escape-Live-Anywhere/dp/0307353133/ref=pd_bxgy_b_img_b/102-7906249-0452138&amp;amp;tag=gizmodo-20"&gt;The 4-Hour Workweek&lt;/a&gt;.&lt;br /&gt;&lt;br /&gt;&lt;object height="350" width="425"&gt;&lt;param name="movie" value="http://www.youtube.com/v/k24zlb2KR9I"&gt;&lt;param name="wmode" value="transparent"&gt;&lt;embed src="http://www.youtube.com/v/k24zlb2KR9I" type="application/x-shockwave-flash" wmode="transparent" height="350" width="425"&gt;&lt;/embed&gt;&lt;/object&gt;&lt;br /&gt;&lt;br /&gt;Tim manages a medium-sized company with domestic and international customers. Like many of us in the digital age he has struggled to manage his time in an era with constant round-the-clock email/IM/cell phone/etc interruptions. Some of his tips:&lt;br /&gt;&lt;br /&gt;&lt;ul&gt;&lt;li&gt;&lt;span style="font-weight: bold;"&gt;Batch email&lt;/span&gt;. Tim looks at his email only twice a day, 11am and 4pm. So that staff and customers won't get angry at not getting an immediate response Tim has an auto-responder that replied back telling people when he looks at his email, and if anything requires an urgent response then they should call him on his cell phone.&lt;/li&gt;&lt;li&gt;&lt;span style="font-weight: bold;"&gt;80/20 rule&lt;/span&gt;. If a customer takes up a lot of time but does not contribute much revenue then be minimally responsive to them. (I think it might also help to let the customer why they are not getting much of a response.)&lt;/li&gt;&lt;li&gt;&lt;span style="font-weight: bold;"&gt;Outsource your life&lt;/span&gt;. Always have a plan for your day before getting out of bed. If something takes lots of time but can easily and cheaply be performed by others (e.g. research) then outsource it to them. Tim says that people in India and Canada are available for such work at $5 per hour. Check out websites like &lt;a href="http://www.getfriday.com/"&gt;getfriday.com&lt;/a&gt; and &lt;a href="http://workaholicsforhire.com/"&gt;workaholicsforhire.com&lt;/a&gt;&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/21612553-691805999703239142?l=robertmaldon.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://robertmaldon.blogspot.com/feeds/691805999703239142/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=21612553&amp;postID=691805999703239142' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/21612553/posts/default/691805999703239142'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/21612553/posts/default/691805999703239142'/><link rel='alternate' type='text/html' href='http://robertmaldon.blogspot.com/2007/10/4-hour-workweek-tips-on-managing-your.html' title='The 4-Hour Workweek: Tips on managing your time in the era of email, IM, etc'/><author><name>Robert Maldon</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-21612553.post-3829204365221470669</id><published>2007-10-10T12:30:00.000+10:00</published><updated>2008-12-12T05:35:59.129+11:00</updated><title type='text'>Banner Ad Blindness</title><content type='html'>&lt;a href="http://www.useit.com/alertbox/banner-blindness.html"&gt;This article&lt;/a&gt; presents research on how regular web surfers are used to ignoring ads, or even content that looks like ads or content that is in places where they expect ads to be. (Some nice heat maps of where people's eyes wandered on test web pages.)&lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://3.bp.blogspot.com/_3mcDdIZRKc0/Rww68Id0gdI/AAAAAAAAATE/yhs3NOprlfU/s1600-h/banner-blindness-examples.jpg"&gt;&lt;img style="margin: 0px auto 10px; display: block; text-align: center; cursor: pointer;" src="http://3.bp.blogspot.com/_3mcDdIZRKc0/Rww68Id0gdI/AAAAAAAAATE/yhs3NOprlfU/s400/banner-blindness-examples.jpg" alt="" id="BLOGGER_PHOTO_ID_5119531681152532946" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;How does the author propose to get more eyeballs on ads? &lt;span style="font-weight: bold;"&gt;Make the ads look like content :)&lt;/span&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/21612553-3829204365221470669?l=robertmaldon.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://robertmaldon.blogspot.com/feeds/3829204365221470669/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=21612553&amp;postID=3829204365221470669' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/21612553/posts/default/3829204365221470669'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/21612553/posts/default/3829204365221470669'/><link rel='alternate' type='text/html' href='http://robertmaldon.blogspot.com/2007/10/banner-ad-blindness.html' title='Banner Ad Blindness'/><author><name>Robert Maldon</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://3.bp.blogspot.com/_3mcDdIZRKc0/Rww68Id0gdI/AAAAAAAAATE/yhs3NOprlfU/s72-c/banner-blindness-examples.jpg' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-21612553.post-8131574397310231563</id><published>2007-10-10T11:54:00.000+10:00</published><updated>2007-10-10T11:59:44.344+10:00</updated><title type='text'>Sick Of Waiting For An Install, 75-Year-Old Woman Smashes Up Comcast Office With Hammer</title><content type='html'>After being on the receiving end of poor service from Time Warner I can really sympathize with this woman...&lt;br /&gt;&lt;br /&gt;&lt;span style="font-style: italic;"&gt;"&lt;/span&gt;&lt;a style="font-style: italic;" href="http://consumerist.com/consumer/customer-service/sick-of-waiting-for-an-install-75+year+old-woman-smashes-up-comcast-office-with-hammer-308498.php"&gt;Have I got your attention now?&lt;/a&gt;&lt;span style="font-style: italic;"&gt;" asked Mona Shaw of the Comcast payment center employees as she smashed their keyboard, monitor and telephone...&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-style: italic;"&gt;"It's totally not like me to do stuff like this," said Shaw. "But it is so irresponsible and so disrespectful. I can't think of any company reacting that way. It's like they got you in their clutches and they'll do what they damn well please."&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;Something that might come in handy if you get the cable company runaround: &lt;a href="http://consumerist.com/consumer/comcast/executive-customer-service/"&gt;contact info for cable company executives&lt;/a&gt;.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/21612553-8131574397310231563?l=robertmaldon.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://robertmaldon.blogspot.com/feeds/8131574397310231563/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=21612553&amp;postID=8131574397310231563' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/21612553/posts/default/8131574397310231563'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/21612553/posts/default/8131574397310231563'/><link rel='alternate' type='text/html' href='http://robertmaldon.blogspot.com/2007/10/sick-of-waiting-for-install-75-year-old.html' title='Sick Of Waiting For An Install, 75-Year-Old Woman Smashes Up Comcast Office With Hammer'/><author><name>Robert Maldon</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-21612553.post-6940465977968295704</id><published>2007-10-05T14:35:00.000+10:00</published><updated>2007-10-05T14:42:18.600+10:00</updated><title type='text'>World's longest stack trace?</title><content type='html'>I really love all of the useful libraries that have grown out of the open source movement in the last couple of decades. It really makes assembling powerful applications out of freely available components very easy (as long as you use robust components!), but when the stack gets big and things go wrong it's kind of worrying when you see stack trace this long:&lt;br /&gt;&lt;br /&gt;&lt;pre&gt;&lt;br /&gt;ERROR [org.jboss.ejb.plugins.LogInterceptor] EJBException in method: public abstract org.hyperic.util.pager.PageList org.hyperic.hq.bizapp.shared.MeasurementBoss.findMeasurementData(int,org.hyperic.hq.appdef.shared.AppdefEntityID,org.hyperic.hq.measurement.shared.MeasurementTemplateValue,long,long,long,boolean,org.hyperic.util.pager.PageControl) throws org.hyperic.hq.auth.shared.SessionNotFoundException,org.hyperic.hq.auth.shared.SessionTimeoutException,org.hyperic.hq.measurement.data.DataNotAvailableException,org.hyperic.hq.appdef.shared.AppdefEntityNotFoundException,org.hyperic.hq.authz.shared.PermissionException,org.hyperic.hq.measurement.MeasurementNotFoundException,java.rmi.RemoteException, causedBy:&lt;br /&gt;java.lang.ArithmeticException: / by zero&lt;br /&gt; at org.hyperic.hq.measurement.server.session.DataManagerEJBImpl.getHistoricalData(DataManagerEJBImpl.java:800)&lt;br /&gt; at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)&lt;br /&gt; at sun.reflect.NativeMethodAccessorImpl.invoke(Unknown Source)&lt;br /&gt; at sun.reflect.DelegatingMethodAccessorImpl.invoke(Unknown Source)&lt;br /&gt; at java.lang.reflect.Method.invoke(Unknown Source)&lt;br /&gt; at org.jboss.invocation.Invocation.performCall(Invocation.java:345)&lt;br /&gt; at org.jboss.ejb.StatelessSessionContainer$ContainerInterceptor.invoke(StatelessSessionContainer.java:214)&lt;br /&gt; at org.jboss.resource.connectionmanager.CachedConnectionInterceptor.invoke(CachedConnectionInterceptor.java:149)&lt;br /&gt; at org.jboss.ejb.plugins.StatelessSessionInstanceInterceptor.invoke(StatelessSessionInstanceInterceptor.java:154)&lt;br /&gt; at org.jboss.webservice.server.ServiceEndpointInterceptor.invoke(ServiceEndpointInterceptor.java:54)&lt;br /&gt; at org.jboss.ejb.plugins.CallValidationInterceptor.invoke(CallValidationInterceptor.java:48)&lt;br /&gt; at org.hyperic.hq.application.HQApp$Snatcher.invokeNextBoth(HQApp.java:118)&lt;br /&gt; at org.hyperic.hq.application.HQApp$Snatcher.invokeNext(HQApp.java:141)&lt;br /&gt; at org.hyperic.txsnatch.TxSnatch.invoke(TxSnatch.java:71)&lt;br /&gt; at org.jboss.ejb.plugins.AbstractTxInterceptor.invokeNext(AbstractTxInterceptor.java:106)&lt;br /&gt; at org.jboss.ejb.plugins.TxInterceptorCMT.runWithTransactions(TxInterceptorCMT.java:300)&lt;br /&gt; at org.jboss.ejb.plugins.TxInterceptorCMT.invoke(TxInterceptorCMT.java:166)&lt;br /&gt; at org.jboss.ejb.plugins.SecurityInterceptor.invoke(SecurityInterceptor.java:153)&lt;br /&gt; at org.jboss.ejb.plugins.LogInterceptor.invoke(LogInterceptor.java:192)&lt;br /&gt; at org.jboss.ejb.plugins.ProxyFactoryFinderInterceptor.invoke(ProxyFactoryFinderInterceptor.java:122)&lt;br /&gt; at org.jboss.ejb.SessionContainer.internalInvoke(SessionContainer.java:624)&lt;br /&gt; at org.jboss.ejb.Container.invoke(Container.java:873)&lt;br /&gt; at org.jboss.ejb.plugins.local.BaseLocalProxyFactory.invoke(BaseLocalProxyFactory.java:415)&lt;br /&gt; at org.jboss.ejb.plugins.local.StatelessSessionProxy.invoke(StatelessSessionProxy.java:88)&lt;br /&gt; at $Proxy259.getHistoricalData(Unknown Source)&lt;br /&gt; at org.hyperic.hq.bizapp.server.session.MeasurementBossEJBImpl.findMeasurementData(MeasurementBossEJBImpl.java:1586)&lt;br /&gt; at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)&lt;br /&gt; at sun.reflect.NativeMethodAccessorImpl.invoke(Unknown Source)&lt;br /&gt; at sun.reflect.DelegatingMethodAccessorImpl.invoke(Unknown Source)&lt;br /&gt; at java.lang.reflect.Method.invoke(Unknown Source)&lt;br /&gt; at org.jboss.invocation.Invocation.performCall(Invocation.java:345)&lt;br /&gt; at org.jboss.ejb.StatelessSessionContainer$ContainerInterceptor.invoke(StatelessSessionContainer.java:214)&lt;br /&gt; at org.jboss.resource.connectionmanager.CachedConnectionInterceptor.invoke(CachedConnectionInterceptor.java:149)&lt;br /&gt; at org.jboss.ejb.plugins.StatelessSessionInstanceInterceptor.invoke(StatelessSessionInstanceInterceptor.java:154)&lt;br /&gt; at org.jboss.webservice.server.ServiceEndpointInterceptor.invoke(ServiceEndpointInterceptor.java:54)&lt;br /&gt; at org.jboss.ejb.plugins.CallValidationInterceptor.invoke(CallValidationInterceptor.java:48)&lt;br /&gt; at org.hyperic.hq.application.HQApp$Snatcher.invokeNextBoth(HQApp.java:118)&lt;br /&gt; at org.hyperic.hq.application.HQApp$Snatcher.invokeNext(HQApp.java:141)&lt;br /&gt; at org.hyperic.txsnatch.TxSnatch.invoke(TxSnatch.java:71)&lt;br /&gt; at org.jboss.ejb.plugins.AbstractTxInterceptor.invokeNext(AbstractTxInterceptor.java:106)&lt;br /&gt; at org.jboss.ejb.plugins.TxInterceptorCMT.runWithTransactions(TxInterceptorCMT.java:335)&lt;br /&gt; at org.jboss.ejb.plugins.TxInterceptorCMT.invoke(TxInterceptorCMT.java:166)&lt;br /&gt; at org.jboss.ejb.plugins.SecurityInterceptor.invoke(SecurityInterceptor.java:153)&lt;br /&gt; at org.jboss.ejb.plugins.LogInterceptor.invoke(LogInterceptor.java:192)&lt;br /&gt; at org.jboss.ejb.plugins.ProxyFactoryFinderInterceptor.invoke(ProxyFactoryFinderInterceptor.java:122)&lt;br /&gt; at org.jboss.ejb.SessionContainer.internalInvoke(SessionContainer.java:624)&lt;br /&gt; at org.jboss.ejb.Container.invoke(Container.java:873)&lt;br /&gt; at sun.reflect.GeneratedMethodAccessor458.invoke(Unknown Source)&lt;br /&gt; at sun.reflect.DelegatingMethodAccessorImpl.invoke(Unknown Source)&lt;br /&gt; at java.lang.reflect.Method.invoke(Unknown Source)&lt;br /&gt; at org.jboss.mx.interceptor.ReflectedDispatcher.invoke(ReflectedDispatcher.java:141)&lt;br /&gt; at org.jboss.mx.server.Invocation.dispatch(Invocation.java:80)&lt;br /&gt; at org.jboss.mx.server.Invocation.invoke(Invocation.java:72)&lt;br /&gt; at org.jboss.mx.server.AbstractMBeanInvoker.invoke(AbstractMBeanInvoker.java:245)&lt;br /&gt; at org.jboss.mx.server.MBeanServerImpl.invoke(MBeanServerImpl.java:644)&lt;br /&gt; at org.jboss.invocation.local.LocalInvoker$MBeanServerAction.invoke(LocalInvoker.java:155)&lt;br /&gt; at org.jboss.invocation.local.LocalInvoker.invoke(LocalInvoker.java:104)&lt;br /&gt; at org.jboss.invocation.InvokerInterceptor.invokeLocal(InvokerInterceptor.java:179)&lt;br /&gt; at org.jboss.invocation.InvokerInterceptor.invoke(InvokerInterceptor.java:165)&lt;br /&gt; at org.hyperic.hq.application.HQApp$Snatcher.invokeProxyNext(HQApp.java:135)&lt;br /&gt; at org.hyperic.txsnatch.ProxySnatch.invoke(ProxySnatch.java:37)&lt;br /&gt; at org.jboss.proxy.TransactionInterceptor.invoke(TransactionInterceptor.java:46)&lt;br /&gt; at org.jboss.proxy.SecurityInterceptor.invoke(SecurityInterceptor.java:55)&lt;br /&gt; at org.jboss.proxy.ejb.StatelessSessionInterceptor.invoke(StatelessSessionInterceptor.java:97)&lt;br /&gt; at org.jboss.proxy.ClientContainer.invoke(ClientContainer.java:86)&lt;br /&gt; at $Proxy231.findMeasurementData(Unknown Source)&lt;br /&gt; at org.hyperic.hq.ui.action.resource.common.monitor.visibility.CurrentHealthAction.execute(CurrentHealthAction.java:123)&lt;br /&gt; at org.apache.struts.tiles.actions.TilesAction.execute(TilesAction.java:73)&lt;br /&gt; at org.hyperic.hq.ui.action.BaseRequestProcessor.processActionPerform(BaseRequestProcessor.java:63)&lt;br /&gt; at org.apache.struts.action.RequestProcessor.process(RequestProcessor.java:236)&lt;br /&gt; at org.apache.struts.action.ActionServlet.process(ActionServlet.java:1196)&lt;br /&gt; at org.apache.struts.action.ActionServlet.doGet(ActionServlet.java:414)&lt;br /&gt; at javax.servlet.http.HttpServlet.service(HttpServlet.java:697)&lt;br /&gt; at javax.servlet.http.HttpServlet.service(HttpServlet.java:810)&lt;br /&gt; at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:252)&lt;br /&gt; at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:173)&lt;br /&gt; at org.apache.catalina.core.ApplicationDispatcher.invoke(ApplicationDispatcher.java:672)&lt;br /&gt; at org.apache.catalina.core.ApplicationDispatcher.doInclude(ApplicationDispatcher.java:574)&lt;br /&gt; at org.apache.catalina.core.ApplicationDispatcher.include(ApplicationDispatcher.java:499)&lt;br /&gt; at org.apache.struts.tiles.UrlController.execute(UrlController.java:89)&lt;br /&gt; at org.apache.struts.taglib.tiles.InsertTag$InsertHandler.doEndTag(InsertTag.java:875)&lt;br /&gt; at org.apache.struts.taglib.tiles.InsertTag.doEndTag(InsertTag.java:462)&lt;br /&gt; at org.apache.jsp.portal.ColumnsLayout_jsp._jspx_meth_tiles_insert_0(Unknown Source)&lt;br /&gt; at org.apache.jsp.portal.ColumnsLayout_jsp._jspx_meth_c_forEach_1(Unknown Source)&lt;br /&gt; at org.apache.jsp.portal.ColumnsLayout_jsp._jspx_meth_c_forEach_0(Unknown Source)&lt;br /&gt; at org.apache.jsp.portal.ColumnsLayout_jsp._jspService(Unknown Source)&lt;br /&gt; at org.apache.jasper.runtime.HttpJspBase.service(HttpJspBase.java:97)&lt;br /&gt; at javax.servlet.http.HttpServlet.service(HttpServlet.java:810)&lt;br /&gt; at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:252)&lt;br /&gt; at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:173)&lt;br /&gt; at org.apache.catalina.core.ApplicationDispatcher.invoke(ApplicationDispatcher.java:672)&lt;br /&gt; at org.apache.catalina.core.ApplicationDispatcher.doInclude(ApplicationDispatcher.java:574)&lt;br /&gt; at org.apache.catalina.core.ApplicationDispatcher.include(ApplicationDispatcher.java:499)&lt;br /&gt; at org.apache.jasper.runtime.JspRuntimeLibrary.include(JspRuntimeLibrary.java:966)&lt;br /&gt; at org.apache.jasper.runtime.PageContextImpl.include(PageContextImpl.java:604)&lt;br /&gt; at org.apache.struts.tiles.TilesUtilImpl.doInclude(TilesUtilImpl.java:99)&lt;br /&gt; at org.apache.struts.tiles.TilesUtil.doInclude(TilesUtil.java:135)&lt;br /&gt; at org.apache.struts.taglib.tiles.InsertTag.doInclude(InsertTag.java:760)&lt;br /&gt; at org.apache.struts.taglib.tiles.InsertTag$InsertHandler.doEndTag(InsertTag.java:892)&lt;br /&gt; at org.apache.struts.taglib.tiles.InsertTag.doEndTag(InsertTag.java:462)&lt;br /&gt; at org.apache.jsp.portal.MainLayout_jsp._jspx_meth_tiles_insert_3(Unknown Source)&lt;br /&gt; at org.apache.jsp.portal.MainLayout_jsp._jspx_meth_html_html_0(Unknown Source)&lt;br /&gt; at org.apache.jsp.portal.MainLayout_jsp._jspService(Unknown Source)&lt;br /&gt; at org.apache.jasper.runtime.HttpJspBase.service(HttpJspBase.java:97)&lt;br /&gt; at javax.servlet.http.HttpServlet.service(HttpServlet.java:810)&lt;br /&gt; at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:252)&lt;br /&gt; at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:173)&lt;br /&gt; at org.apache.catalina.core.ApplicationDispatcher.invoke(ApplicationDispatcher.java:672)&lt;br /&gt; at org.apache.catalina.core.ApplicationDispatcher.processRequest(ApplicationDispatcher.java:463)&lt;br /&gt; at org.apache.catalina.core.ApplicationDispatcher.doForward(ApplicationDispatcher.java:398)&lt;br /&gt; at org.apache.catalina.core.ApplicationDispatcher.forward(ApplicationDispatcher.java:301)&lt;br /&gt; at org.apache.struts.action.RequestProcessor.doForward(RequestProcessor.java:1085)&lt;br /&gt; at org.apache.struts.tiles.TilesRequestProcessor.doForward(TilesRequestProcessor.java:263)&lt;br /&gt; at org.apache.struts.tiles.TilesRequestProcessor.processTilesDefinition(TilesRequestProcessor.java:239)&lt;br /&gt; at org.apache.struts.tiles.TilesRequestProcessor.internalModuleRelativeForward(TilesRequestProcessor.java:341)&lt;br /&gt; at org.apache.struts.action.RequestProcessor.processForward(RequestProcessor.java:572)&lt;br /&gt; at org.apache.struts.action.RequestProcessor.process(RequestProcessor.java:221)&lt;br /&gt; at org.apache.struts.action.ActionServlet.process(ActionServlet.java:1196)&lt;br /&gt; at org.apache.struts.action.ActionServlet.doGet(ActionServlet.java:414)&lt;br /&gt; at javax.servlet.http.HttpServlet.service(HttpServlet.java:697)&lt;br /&gt; at javax.servlet.http.HttpServlet.service(HttpServlet.java:810)&lt;br /&gt; at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:252)&lt;br /&gt; at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:173)&lt;br /&gt; at org.apache.catalina.core.ApplicationDispatcher.invoke(ApplicationDispatcher.java:672)&lt;br /&gt; at org.apache.catalina.core.ApplicationDispatcher.processRequest(ApplicationDispatcher.java:463)&lt;br /&gt; at org.apache.catalina.core.ApplicationDispatcher.doForward(ApplicationDispatcher.java:398)&lt;br /&gt; at org.apache.catalina.core.ApplicationDispatcher.forward(ApplicationDispatcher.java:301)&lt;br /&gt; at org.apache.struts.action.RequestProcessor.doForward(RequestProcessor.java:1085)&lt;br /&gt; at org.apache.struts.tiles.TilesRequestProcessor.doForward(TilesRequestProcessor.java:263)&lt;br /&gt; at org.apache.struts.action.RequestProcessor.processForwardConfig(RequestProcessor.java:398)&lt;br /&gt; at org.apache.struts.tiles.TilesRequestProcessor.processForwardConfig(TilesRequestProcessor.java:318)&lt;br /&gt; at org.apache.struts.action.RequestProcessor.process(RequestProcessor.java:241)&lt;br /&gt; at org.apache.struts.action.ActionServlet.process(ActionServlet.java:1196)&lt;br /&gt; at org.apache.struts.action.ActionServlet.doGet(ActionServlet.java:414)&lt;br /&gt; at javax.servlet.http.HttpServlet.service(HttpServlet.java:697)&lt;br /&gt; at javax.servlet.http.HttpServlet.service(HttpServlet.java:810)&lt;br /&gt; at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:252)&lt;br /&gt; at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:173)&lt;br /&gt; at org.hyperic.hq.ui.AuthenticationFilter.doFilter(AuthenticationFilter.java:110)&lt;br /&gt; at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:202)&lt;br /&gt; at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:173)&lt;br /&gt; at org.hyperic.hibernate.filter.SessionFilter$1.run(SessionFilter.java:59)&lt;br /&gt; at org.hyperic.hq.hibernate.SessionManager.runInSessionInternal(SessionManager.java:78)&lt;br /&gt; at org.hyperic.hq.hibernate.SessionManager.runInSession(SessionManager.java:68)&lt;br /&gt; at org.hyperic.hibernate.filter.SessionFilter.doFilter(SessionFilter.java:57)&lt;br /&gt; at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:202)&lt;br /&gt; at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:173)&lt;br /&gt; at org.jboss.web.tomcat.filters.ReplyHeaderFilter.doFilter(ReplyHeaderFilter.java:81)&lt;br /&gt; at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:202)&lt;br /&gt; at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:173)&lt;br /&gt; at org.hyperic.hq.product.servlet.filter.JMXFilter.doFilter(JMXFilter.java:324)&lt;br /&gt; at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:202)&lt;br /&gt; at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:173)&lt;br /&gt; at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:213)&lt;br /&gt; at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:178)&lt;br /&gt; at org.jboss.web.tomcat.security.CustomPrincipalValve.invoke(CustomPrincipalValve.java:39)&lt;br /&gt; at org.jboss.web.tomcat.security.SecurityAssociationValve.invoke(SecurityAssociationValve.java:159)&lt;br /&gt; at org.jboss.web.tomcat.security.JaccContextValve.invoke(JaccContextValve.java:59)&lt;br /&gt; at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:126)&lt;br /&gt; at org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:105)&lt;br /&gt; at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:107)&lt;br /&gt; at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:148)&lt;br /&gt; at org.apache.coyote.http11.Http11Processor.process(Http11Processor.java:856)&lt;br /&gt; at org.apache.coyote.http11.Http11Protocol$Http11ConnectionHandler.processConnection(Http11Protocol.java:744)&lt;br /&gt; at org.apache.tomcat.util.net.PoolTcpEndpoint.processSocket(PoolTcpEndpoint.java:527)&lt;br /&gt; at org.apache.tomcat.util.net.MasterSlaveWorkerThread.run(MasterSlaveWorkerThread.java:112)&lt;br /&gt; at java.lang.Thread.run(Unknown Source)&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;(Stack trace from the pretty good &lt;a href="http://www.hyperic.com/"&gt;Hyperic HQ&lt;/a&gt; monitoring tool)&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/21612553-6940465977968295704?l=robertmaldon.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://robertmaldon.blogspot.com/feeds/6940465977968295704/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=21612553&amp;postID=6940465977968295704' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/21612553/posts/default/6940465977968295704'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/21612553/posts/default/6940465977968295704'/><link rel='alternate' type='text/html' href='http://robertmaldon.blogspot.com/2007/10/worlds-longest-stack-trace.html' title='World&apos;s longest stack trace?'/><author><name>Robert Maldon</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-21612553.post-2678180520644518737</id><published>2007-10-05T02:09:00.000+10:00</published><updated>2008-12-12T05:35:59.275+11:00</updated><title type='text'>The 8-bit tie available now!</title><content type='html'>Nostalgic for the video games of old on the Atari ST, Commodore 64, ZX Spectrum, etc? &lt;a href="http://www.thinkgeek.com/apparel/hats-ties/9352/"&gt;Order your 8-bit tie now&lt;/a&gt;!&lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://2.bp.blogspot.com/_3mcDdIZRKc0/RwUQfod0gcI/AAAAAAAAAS8/HnX3h68dgHM/s1600-h/eight-bit-tie.jpg"&gt;&lt;img style="margin: 0px auto 10px; display: block; text-align: center; cursor: pointer;" src="http://2.bp.blogspot.com/_3mcDdIZRKc0/RwUQfod0gcI/AAAAAAAAAS8/HnX3h68dgHM/s400/eight-bit-tie.jpg" alt="" id="BLOGGER_PHOTO_ID_5117514687200920002" 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/21612553-2678180520644518737?l=robertmaldon.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://robertmaldon.blogspot.com/feeds/2678180520644518737/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=21612553&amp;postID=2678180520644518737' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/21612553/posts/default/2678180520644518737'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/21612553/posts/default/2678180520644518737'/><link rel='alternate' type='text/html' href='http://robertmaldon.blogspot.com/2007/10/8-bit-tie-available-now.html' title='The 8-bit tie available now!'/><author><name>Robert Maldon</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://2.bp.blogspot.com/_3mcDdIZRKc0/RwUQfod0gcI/AAAAAAAAAS8/HnX3h68dgHM/s72-c/eight-bit-tie.jpg' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-21612553.post-7069965033585752840</id><published>2007-10-04T12:35:00.000+10:00</published><updated>2007-10-04T12:50:46.523+10:00</updated><title type='text'>Browser detection using known HTML parser bugs</title><content type='html'>If you've developed webapps then it is likely you've had to detect what browser is accessing the site and then use javascript or CSS to do something special for that browser. &lt;a href="http://wafful.org/2007/10/01/html-20-browser-detection-3/"&gt;This dude&lt;/a&gt; has found a way to use known HTML parser rendering bugs to identify Firefox, IE, Safari, Opera, Lynx and other browsers using just plain HTML. Here is some sample code (I must get round to converting this to Java):&lt;br /&gt;&lt;br /&gt;&lt;pre&gt;&lt;br /&gt;#!/usr/bin/perl&lt;br /&gt;print qq{&lt;br /&gt;&amp;lt;img /src\x00="ie.gif"&lt;br /&gt;  /''src\x00="firefox1_5.gif"&lt;br /&gt; /''src="firefox2_0.gif"&lt;br /&gt; /""src="gecko_others.gif"&lt;br /&gt; "s\x00rc="safari2.gif"&lt;br /&gt; "src="safari3.gif"&lt;br /&gt; ""src="konqueror.gif"&lt;br /&gt; src\x00="w3m.gif"&lt;br /&gt; src\x0c="opera.gif"&lt;br /&gt; src="others.gif"&lt;br /&gt; src="lynx.gif"&lt;br /&gt;/&amp;gt; };&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;This technique is reported to work with many HTML tags, not just IMG. Clever hack!&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/21612553-7069965033585752840?l=robertmaldon.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://robertmaldon.blogspot.com/feeds/7069965033585752840/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=21612553&amp;postID=7069965033585752840' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/21612553/posts/default/7069965033585752840'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/21612553/posts/default/7069965033585752840'/><link rel='alternate' type='text/html' href='http://robertmaldon.blogspot.com/2007/10/browser-detection-using-known-html.html' title='Browser detection using known HTML parser bugs'/><author><name>Robert Maldon</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-21612553.post-9034754415871510130</id><published>2007-09-29T06:45:00.001+10:00</published><updated>2011-11-29T12:33:53.112+11:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='java'/><category scheme='http://www.blogger.com/atom/ns#' term='gc'/><title type='text'>More human-friendly Java GC timestamps</title><content type='html'>&lt;b&gt;Update&lt;/b&gt;: If you are using the Sun (Oracle) JVM version 6u4 or newer then using the command line option -XX:+PrintGCDateStamps instead of -XX:+PrintGCTimeStamps will output a current date rather than a relative time in the GC logs.&lt;br /&gt;&lt;br /&gt;If you've working on a medium to large Java project then one of the aspects of application performance you're probably (should be!) monitoring is garbage collection.&lt;br /&gt;&lt;br /&gt;If you're using the Sun JVM or compatible JVM then I recommend you enable verbose garbage collection output with at least the following command-line options:&lt;br /&gt;&lt;br /&gt;&lt;pre&gt;&lt;br /&gt;java -XX:+PrintGCDetails -XX:+PrintGCTimeStamps -verbose:gc ...&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;This will print something like the following to stdout :&lt;br /&gt;&lt;br /&gt;&lt;pre&gt;&lt;br /&gt;83.304: [GC 83.304: [DefNew: 890K-&amp;gt;64K(960K), 0.0044947 secs] 890K-&amp;gt;217K(5056K), 0.0046062 secs]&lt;br /&gt;83.390: [GC 83.390: [DefNew: 960K-&amp;gt;64K(960K), 0.0043936 secs] 1113K-&amp;gt;376K(5056K), 0.0044796 secs]&lt;br /&gt;83.534: [GC 83.534: [DefNew: 951K-&amp;gt;64K(960K), 0.0046934 secs] 1263K-&amp;gt;467K(5056K), 0.0048648 secs]&lt;br /&gt;83.638: [GC 83.638: [DefNew: 960K-&amp;gt;64K(960K), 0.0041580 secs] 1363K-&amp;gt;658K(5056K), 0.0042530 secs]&lt;br /&gt;83.783: [GC 83.784: [DefNew: 960K-&amp;gt;64K(960K), 0.0030418 secs] 1554K-&amp;gt;748K(5056K), 0.0031353 secs]&lt;br /&gt;83.921: [GC 83.921: [DefNew: 960K-&amp;gt;55K(960K), 0.0019457 secs] 1644K-&amp;gt;794K(5056K), 0.0020575 secs]&lt;br /&gt;91.655: [GC 91.655: [DefNew: 951K-&amp;gt;19K(960K), 0.0012843 secs] 1690K-&amp;gt;808K(5056K), 0.0013694 secs]&lt;br /&gt;94.198: [Full GC (System) 94.198: [Tenured: 788K-&amp;gt;759K(4096K), 0.0428238 secs] 883K-&amp;gt;759K(5056K), [Perm : 2095K-&amp;gt;2095K(12288K)], 0.0429641 secs]&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;As an alternative to writing to stdout - e.g. gc logging may get mixed up with a lot of non-gc related output - you can have the JVM log gc to a file with timestamps automatically enabled by using the -Xloggc option:&lt;br /&gt;&lt;br /&gt;&lt;pre&gt;&lt;br /&gt;java -XX:+PrintGCDetails -Xloggc:logs/gc.log ...&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;One small annoyance I have with this logging is that the timestamp - which is of the format SSSS.MMMM where SSSS it the elapsed seconds and MMMM is the elapsed millisecs - is relative to when the JVM started. I would find it more useful if the timestamp told me the date and time of day that the logging occurred.&lt;br /&gt;&lt;br /&gt;So here is a short list of requirements for more "human-friendly" timestamping:&lt;br /&gt;&lt;br /&gt;&lt;ul&gt;&lt;li&gt;Log a timestamp that contains the date and time of day of the logging event, preferably in a configurable format. e.g. see &lt;a href="http://java.sun.com/j2se/1.5.0/docs/api/java/text/SimpleDateFormat.html"&gt;java.text.SimpleDateFormat&lt;/a&gt;&lt;/li&gt;&lt;li&gt;Work in a JVM-neutral and platform-neutral way&lt;/li&gt;&lt;/ul&gt;Given the above requirements what are my options?&lt;br /&gt;&lt;br /&gt;Diving into the &lt;a href="http://openjdk.java.net/"&gt;openjdk&lt;/a&gt; source code I found that the verbose gc logging is implemented in native C code.&lt;br /&gt;&lt;br /&gt;From Java 5 onwards some of the garbage collection information is exposed via the &lt;a href="http://java.sun.com/j2se/1.5.0/docs/api/java/lang/management/GarbageCollectorMXBean.html"&gt;GarbageCollectorMXBean&lt;/a&gt; JMX bean, but what is not exposed is any type of notification/callback when the gc actually occurs or more collector-specific information. e.g. for the parallel garbage collector how much time was spent in stop-the-world phase and how much time was spent in other phases.&lt;br /&gt;&lt;br /&gt;Given this info I found two solutions:&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;1. Use a native wrapper around the JVM that timestamps messages logged to stdout&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;For this option I could use something like the very mature and useful utility &lt;a href="http://wrapper.tanukisoftware.org/doc/english/introduction.html"&gt;Java Service Wrapper&lt;/a&gt; that provides this sort of wrapper around stdout (among other useful features), or possibly roll my own native code that redirects stdout  (nightmare!).&lt;br /&gt;&lt;br /&gt;A disadvantage of this approach is that you will have to deploy native libraries along with your application, which may not be easy to integrate into application servers, clustered environments, etc.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;2. Create a thread that occasionally polls the GarbageCollectorMXBeans and logs the number of collections and collection time since the last poll&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;The code for this approach looks something like this:&lt;br /&gt;&lt;br /&gt;&lt;pre&gt;&lt;br /&gt;package robertmaldon.gc;&lt;br /&gt;&lt;br /&gt;import java.lang.management.GarbageCollectorMXBean;&lt;br /&gt;import java.lang.management.ManagementFactory;&lt;br /&gt;import java.text.SimpleDateFormat;&lt;br /&gt;import java.util.Date;&lt;br /&gt;import java.util.List;&lt;br /&gt;&lt;br /&gt;public class GCTimeStamper implements Runnable {&lt;br /&gt;&lt;br /&gt;  private SimpleDateFormat dateFormat = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss,SSS");&lt;br /&gt;&lt;br /&gt;  private GarbageCollectorMXBean minorGCBean;&lt;br /&gt;  private long lastMinorCollectionCount;&lt;br /&gt;  private long lastMinorCollectionTime;&lt;br /&gt;&lt;br /&gt;  private GarbageCollectorMXBean fullGCBean;&lt;br /&gt;  private long lastFullCollectionCount;&lt;br /&gt;  private long lastFullCollectionTime;&lt;br /&gt;&lt;br /&gt;  public GCTimeStamper() {&lt;br /&gt;  }&lt;br /&gt;&lt;br /&gt;  public void run() {&lt;br /&gt;      List&amp;lt;GarbageCollectorMXBean&amp;gt; gcMBeans = ManagementFactory.getGarbageCollectorMXBeans();&lt;br /&gt;&lt;br /&gt;      for (GarbageCollectorMXBean gcBean : gcMBeans) {&lt;br /&gt;          if ("Copy".equals(gcBean.getName())) {&lt;br /&gt;              minorGCBean = gcBean;&lt;br /&gt;          } else if ("MarkSweepCompact".equals(gcBean.getName())) {&lt;br /&gt;              fullGCBean = gcBean;&lt;br /&gt;          } else if ("ParNew".equals(gcBean.getName())) {&lt;br /&gt;              minorGCBean = gcBean;&lt;br /&gt;          } else if ("ConcurrentMarkSweep".equals(gcBean.getName())) {&lt;br /&gt;              fullGCBean = gcBean;&lt;br /&gt;          } else {&lt;br /&gt;              System.err.println("Unable to classify GarbageCollectorMXBean [" + gcBean.getName() + "]");&lt;br /&gt;          }&lt;br /&gt;    }&lt;br /&gt;&lt;br /&gt;    try {&lt;br /&gt;        while (true) {&lt;br /&gt;            if (minorGCBean.getCollectionCount() != lastMinorCollectionCount) {&lt;br /&gt;                long diffCount = minorGCBean.getCollectionCount() - lastMinorCollectionCount;&lt;br /&gt;                long diffTime = minorGCBean.getCollectionTime() - lastMinorCollectionTime;&lt;br /&gt;                System.out.println(getTimeStamp() + "Minor GC x " + diffCount + ", " + diffTime + " millisecs");&lt;br /&gt;    &lt;br /&gt;                lastMinorCollectionCount = minorGCBean.getCollectionCount();&lt;br /&gt;                lastMinorCollectionTime = minorGCBean.getCollectionTime();&lt;br /&gt;            }&lt;br /&gt;&lt;br /&gt;            if (fullGCBean.getCollectionCount() != lastFullCollectionCount) {&lt;br /&gt;                long diffCount = fullGCBean.getCollectionCount() - lastFullCollectionCount;&lt;br /&gt;                long diffTime = fullGCBean.getCollectionTime() - lastFullCollectionTime;&lt;br /&gt;                System.out.println(getTimeStamp() + "Full GC x " + diffCount + ", " + diffTime + " millisecs");&lt;br /&gt;    &lt;br /&gt;                lastFullCollectionCount = fullGCBean.getCollectionCount();&lt;br /&gt;                lastFullCollectionTime = fullGCBean.getCollectionTime();&lt;br /&gt;            }&lt;br /&gt;&lt;br /&gt;            // Sleep a little bit before the next poll&lt;br /&gt;            Thread.sleep(1000);&lt;br /&gt;          }&lt;br /&gt;        } catch (Exception ex) {&lt;br /&gt;            // Do nothing except exit this thread&lt;br /&gt;        }&lt;br /&gt;    }&lt;br /&gt;&lt;br /&gt;  private String getTimeStamp() {&lt;br /&gt;      Date now = new Date();&lt;br /&gt;&lt;br /&gt;      long upTime = ManagementFactory.getRuntimeMXBean().getUptime();&lt;br /&gt;      long upTimeSecs = upTime / 1000;&lt;br /&gt;      long upTimeMillis = upTime % 1000;&lt;br /&gt;&lt;br /&gt;      return dateFormat.format(now) + " [" + upTimeSecs + "." + upTimeMillis + "] ";&lt;br /&gt;  }&lt;br /&gt;}&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;The above class would be started with a new Thread(new GCTimeStamper()).start() or a TaskExecutor, and you can replace the System.out statements with calls to log4j or whatever.&lt;br /&gt;&lt;br /&gt;The output of this class mixed with the gc output looks something like this:&lt;br /&gt;&lt;br /&gt;&lt;pre&gt;&lt;br /&gt;83.304: [GC 83.304: [DefNew: 890K-&amp;gt;64K(960K), 0.0044947 secs] 890K-&amp;gt;217K(5056K), 0.0046062 secs]&lt;br /&gt;83.390: [GC 83.390: [DefNew: 960K-&amp;gt;64K(960K), 0.0043936 secs] 1113K-&amp;gt;376K(5056K), 0.0044796 secs]&lt;br /&gt;83.534: [GC 83.534: [DefNew: 951K-&amp;gt;64K(960K), 0.0046934 secs] 1263K-&amp;gt;467K(5056K), 0.0048648 secs]&lt;br /&gt;83.638: [GC 83.638: [DefNew: 960K-&amp;gt;64K(960K), 0.0041580 secs] 1363K-&amp;gt;658K(5056K), 0.0042530 secs]&lt;br /&gt;83.783: [GC 83.784: [DefNew: 960K-&amp;gt;64K(960K), 0.0030418 secs] 1554K-&amp;gt;748K(5056K), 0.0031353 secs]&lt;br /&gt;83.921: [GC 83.921: [DefNew: 960K-&amp;gt;55K(960K), 0.0019457 secs] 1644K-&amp;gt;794K(5056K), 0.0020575 secs]&lt;br /&gt;2007-09-28 17:03:59,037 [84.80] Minor GC x 6, 22 millisecs&lt;br /&gt;91.655: [GC 91.655: [DefNew: 951K-&amp;gt;19K(960K), 0.0012843 secs] 1690K-&amp;gt;808K(5056K), 0.0013694 secs]&lt;br /&gt;2007-09-28 17:04:07,036 [92.79] Minor GC x 1, 1 millisecs&lt;br /&gt;94.198: [Full GC (System) 94.198: [Tenured: 788K-&amp;gt;759K(4096K), 0.0428238 secs] 883K-&amp;gt;759K(5056K), [Perm : 2095K-&amp;gt;2095K(12288K)], 0.0429641 secs]&lt;br /&gt;2007-09-28 17:04:10,036 [95.79] Full GC x 1, 42 millisecs&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;This class will print the approximate date/time a gc occurred as well as the time relative to the start of the JVM, so you can then use that to correlate with the more verbose output in the gc.log file.&lt;br /&gt;&lt;br /&gt;Another interesting problem is determining which gc was minor and which was full (major). If you're using the Sun JVM and the default gc settings then a collector named "Copy" does minor collections and a collector named "MarkSweepCompact" does full collections. If you're using the Sun JVM with the -XX:+UseConcMarkSweepGC option then a collector named "ParNew" seems to do minor collections and a collector named "ConcurrentMarkSweep" seems to do full collections. (I say "seems to" because the behavior changes depending on if you're running on a one cpu or multi-cpu machine.)&lt;br /&gt;&lt;br /&gt;Not an ideal solution, but if anybody knows a better way I would be interested in hearing from you!&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/21612553-9034754415871510130?l=robertmaldon.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://robertmaldon.blogspot.com/feeds/9034754415871510130/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=21612553&amp;postID=9034754415871510130' title='10 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/21612553/posts/default/9034754415871510130'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/21612553/posts/default/9034754415871510130'/><link rel='alternate' type='text/html' href='http://robertmaldon.blogspot.com/2007/09/more-human-friendly-java-gc-timestamps.html' title='More human-friendly Java GC timestamps'/><author><name>Robert Maldon</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>10</thr:total></entry><entry><id>tag:blogger.com,1999:blog-21612553.post-8578198184465511412</id><published>2007-09-27T02:12:00.000+10:00</published><updated>2007-09-27T02:17:41.815+10:00</updated><title type='text'>The most complete list of -XX options for Java 6 JVM</title><content type='html'>The Sun JVM has many, many, many non-standard options (i.e. may not be supported by other JVMs), and most are not documented on the official Sun website.&lt;br /&gt;&lt;br /&gt;&lt;a href="http://www.md.pp.ru/%7Eeu/jdk6options.html"&gt;Here&lt;/a&gt; is a pretty comprehensive listing of the -XX options for the Java 6 JVM.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/21612553-8578198184465511412?l=robertmaldon.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://robertmaldon.blogspot.com/feeds/8578198184465511412/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=21612553&amp;postID=8578198184465511412' title='1 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/21612553/posts/default/8578198184465511412'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/21612553/posts/default/8578198184465511412'/><link rel='alternate' type='text/html' href='http://robertmaldon.blogspot.com/2007/09/most-complete-list-of-xx-options-for.html' title='The most complete list of -XX options for Java 6 JVM'/><author><name>Robert Maldon</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-21612553.post-4167773874360452795</id><published>2007-09-27T02:08:00.000+10:00</published><updated>2007-09-27T02:12:08.745+10:00</updated><title type='text'>Google, Yahoo Sued For Stealing Names From Tanzanian Tribes</title><content type='html'>Another frivolous lawsuit?&lt;br /&gt;&lt;br /&gt;&lt;span style="font-style: italic;"&gt;...He claims that both Google and Yahoo &lt;/span&gt;&lt;a style="font-style: italic;" href="http://techdirt.com/articles/20070925/012311.shtml"&gt;stole their names from Tanzanian tribes&lt;/a&gt;&lt;span style="font-style: italic;"&gt; -- and now they should pay up. Specifically, he claims that Google took its name from the Gogo tribe and Yahoo took its name from the Yao tribe. Conveniently, this guy happens to be a descendant of both tribes. He's merely asking for both companies to pay $10,000 each to every member of both tribes, going back three generations...&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;How do you say "MSN", "Ask.com" or "Slashdot" in Tanzanian?&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/21612553-4167773874360452795?l=robertmaldon.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://robertmaldon.blogspot.com/feeds/4167773874360452795/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=21612553&amp;postID=4167773874360452795' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/21612553/posts/default/4167773874360452795'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/21612553/posts/default/4167773874360452795'/><link rel='alternate' type='text/html' href='http://robertmaldon.blogspot.com/2007/09/google-yahoo-sued-for-stealing-names.html' title='Google, Yahoo Sued For Stealing Names From Tanzanian Tribes'/><author><name>Robert Maldon</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-21612553.post-5159031007079491771</id><published>2007-09-11T12:24:00.001+10:00</published><updated>2008-12-12T05:35:59.780+11:00</updated><title type='text'>Bush Cheney '08</title><content type='html'>A trend that appears to be gaining momentum on both sides of politics...&lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://4.bp.blogspot.com/_3mcDdIZRKc0/RuX_Kx9pPYI/AAAAAAAAASc/pB8ErNRsQq0/s1600-h/bush-cheney-08-bumper-sticker.gif"&gt;&lt;img style="margin: 0px auto 10px; display: block; text-align: center; cursor: pointer;" src="http://4.bp.blogspot.com/_3mcDdIZRKc0/RuX_Kx9pPYI/AAAAAAAAASc/pB8ErNRsQq0/s400/bush-cheney-08-bumper-sticker.gif" alt="" id="BLOGGER_PHOTO_ID_5108769912997363074" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://1.bp.blogspot.com/_3mcDdIZRKc0/RuX_TB9pPZI/AAAAAAAAASk/StUaElyUa8M/s1600-h/bush-cheney-08-bumper-sticker2.jpg"&gt;&lt;img style="margin: 0px auto 10px; display: block; text-align: center; cursor: pointer;" src="http://1.bp.blogspot.com/_3mcDdIZRKc0/RuX_TB9pPZI/AAAAAAAAASk/StUaElyUa8M/s400/bush-cheney-08-bumper-sticker2.jpg" alt="" id="BLOGGER_PHOTO_ID_5108770054731283858" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://2.bp.blogspot.com/_3mcDdIZRKc0/RuX_5R9pPbI/AAAAAAAAAS0/bjRlLXOTDpw/s1600-h/bush-cheney-08-tshirt.jpg"&gt;&lt;img style="margin: 0px auto 10px; display: block; text-align: center; cursor: pointer;" src="http://2.bp.blogspot.com/_3mcDdIZRKc0/RuX_5R9pPbI/AAAAAAAAAS0/bjRlLXOTDpw/s400/bush-cheney-08-tshirt.jpg" alt="" id="BLOGGER_PHOTO_ID_5108770711861280178" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;&lt;ul&gt;&lt;li&gt;&lt;span style=""&gt;&lt;span class="a"&gt;&lt;/span&gt;&lt;/span&gt;&lt;a href="http://www.bushcheney08.org/"&gt;www.bushcheney08.org&lt;/a&gt; Petition To Amend the Constitution&lt;br /&gt;&lt;/li&gt;&lt;li&gt;&lt;a href="http://www.cafepress.com/rightwingswag.45978282"&gt;RightWingSwag bumper sticker&lt;/a&gt;&lt;/li&gt;&lt;li&gt;&lt;a href="http://www.spreadshirt.com/us/US/BUSH-CHENEY--08/Designs-63/marketplace/designs/detail/design/2067981/"&gt;Stay the Course t-shirts&lt;/a&gt;&lt;/li&gt;&lt;/ul&gt;&lt;span style="font-weight: bold;"&gt;Update&lt;/span&gt;: &lt;a href="http://robertmaldon.blogspot.com/2008/09/us-election-hots-up-palin-in-bikini.html"&gt;US election hots up: Palin in a bikini, Battlestar Galactica stars enter the race&lt;/a&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/21612553-5159031007079491771?l=robertmaldon.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://robertmaldon.blogspot.com/feeds/5159031007079491771/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=21612553&amp;postID=5159031007079491771' title='1 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/21612553/posts/default/5159031007079491771'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/21612553/posts/default/5159031007079491771'/><link rel='alternate' type='text/html' href='http://robertmaldon.blogspot.com/2007/09/bush-cheney-08.html' title='Bush Cheney &apos;08'/><author><name>Robert Maldon</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://4.bp.blogspot.com/_3mcDdIZRKc0/RuX_Kx9pPYI/AAAAAAAAASc/pB8ErNRsQq0/s72-c/bush-cheney-08-bumper-sticker.gif' height='72' width='72'/><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-21612553.post-5754283152908423415</id><published>2007-09-11T12:03:00.000+10:00</published><updated>2008-12-12T05:35:59.790+11:00</updated><title type='text'>How to Launder Money</title><content type='html'>&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://2.bp.blogspot.com/_3mcDdIZRKc0/RuX3pR9pPXI/AAAAAAAAASU/QkRZkXP3X9A/s1600-h/laundered-money.jpg"&gt;&lt;img style="margin: 0px auto 10px; display: block; text-align: center; cursor: pointer;" src="http://2.bp.blogspot.com/_3mcDdIZRKc0/RuX3pR9pPXI/AAAAAAAAASU/QkRZkXP3X9A/s400/laundered-money.jpg" alt="" id="BLOGGER_PHOTO_ID_5108761640890350962" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;The clearest explanation of money laundering that I've ever seen :)&lt;br /&gt;&lt;br /&gt;(Picture from &lt;a href="http://www.wisebread.com/how-to-launder-money/"&gt;this blog post&lt;/a&gt;)&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/21612553-5754283152908423415?l=robertmaldon.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://robertmaldon.blogspot.com/feeds/5754283152908423415/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=21612553&amp;postID=5754283152908423415' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/21612553/posts/default/5754283152908423415'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/21612553/posts/default/5754283152908423415'/><link rel='alternate' type='text/html' href='http://robertmaldon.blogspot.com/2007/09/how-to-launder-money.html' title='How to Launder Money'/><author><name>Robert Maldon</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://2.bp.blogspot.com/_3mcDdIZRKc0/RuX3pR9pPXI/AAAAAAAAASU/QkRZkXP3X9A/s72-c/laundered-money.jpg' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-21612553.post-6325155118585447525</id><published>2007-09-08T09:06:00.000+10:00</published><updated>2007-09-08T13:54:31.159+10:00</updated><title type='text'>Programmatically Configuring log4j - and the Future of Java Logging</title><content type='html'>&lt;a href="http://logging.apache.org/log4j/"&gt;log4j&lt;/a&gt; is probably the most common logging framework in use in the Java world. Even if a project/framework uses &lt;a href="http://commons.apache.org/logging/"&gt;commons-logging&lt;/a&gt; most deployments configure log4j to be the underlying logger.&lt;br /&gt;&lt;br /&gt;log4j is usually configured via a properties file (most common, in my experience) or an XML file (more powerful). There are a few situations, however, where I've found it useful to programmatically configure log4j, and since there is very little info on the web on how to do this I thought I'd write a short blog entry on the subject.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;Why configure log4j programmatically?&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;Two situations I've found it useful to configure log4j in code are:&lt;br /&gt;&lt;ul&gt;&lt;li&gt;&lt;span style="font-weight: bold;"&gt;During running of Unit Tests&lt;/span&gt;. Since unit tests are fine grained it helps to enable more verbose logging for just the area a particular test targets instead of for the whole suite. Also, if you are running single test inside your IDE you may want to output to the console, but if you run your whole suite from the command line you may want to output to a file.&lt;br /&gt;&lt;/li&gt;&lt;li&gt;&lt;span style="font-weight: bold;"&gt;Changing logging dynamically via JMX&lt;/span&gt;. log4j has some &lt;a href="http://logging.apache.org/log4j/1.2/apidocs/org/apache/log4j/jmx/package-summary.html#package_description"&gt;basic JMX support&lt;/a&gt;, but if you want to do anything mildly complicated then you'll have to roll your own.&lt;/li&gt;&lt;/ul&gt;&lt;span style="font-weight: bold;"&gt;log4j initialization&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;Whenever a &lt;a href="http://logging.apache.org/log4j/1.2/apidocs/org/apache/log4j/Logger.html"&gt;Logger&lt;/a&gt; is first used log4j goes through a &lt;a href="http://logging.apache.org/log4j/1.2/manual.html#defaultInit"&gt;default initialization procedure&lt;/a&gt; to find a log4j.properties or a log4j.xml configuration file. If the initialization procedure fails you typically get an error message like this:&lt;br /&gt;&lt;br /&gt;&lt;pre&gt;&lt;br /&gt;log4j:WARN No appenders could be found for logger (net.sf.ehcache.CacheManager).&lt;br /&gt;log4j:WARN Please initialize the log4j system properly.&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;when a Logger is used.&lt;br /&gt;&lt;br /&gt;The simplest way to detect if log4j was initialized or not is to ask the &lt;a href="http://logging.apache.org/log4j/1.2/apidocs/org/apache/log4j/spi/RootLogger.html"&gt;root logger&lt;/a&gt; if it has any appenders attached to it:&lt;br /&gt;&lt;br /&gt;&lt;pre&gt;&lt;br /&gt;import org.apache.log4j.Logger;&lt;br /&gt;&lt;br /&gt;Logger root = Logger.getRootLogger();&lt;br /&gt;if (!root.getAllAppenders().hasMoreElements()) {&lt;br /&gt;// No appenders means log4j is not initialized!&lt;br /&gt;}&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;A minimal default log4j configuration might be to add a single console appender to the root logger; this is in fact what the convenience method &lt;a href="http://logging.apache.org/log4j/1.2/apidocs/org/apache/log4j/BasicConfigurator.html#configure%28%29"&gt;BasicConfigurator.configure()&lt;/a&gt; does:&lt;br /&gt;&lt;br /&gt;&lt;pre&gt;&lt;br /&gt;import org.apache.log4j.ConsoleAppender;&lt;br /&gt;import org.apache.log4j.Logger;&lt;br /&gt;import org.apache.log4j.PatternLayout;&lt;br /&gt;&lt;br /&gt;Logger root = Logger.getRootLogger();&lt;br /&gt;root.addAppender(new ConsoleAppender(&lt;br /&gt;    new PatternLayout(PatternLayout.TTCC_CONVERSION_PATTERN)));&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;If not explicitly set the default the log level will be DEBUG.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;Example&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;So let's put these things together in a scenario: If I run my unit test suite from Ant then I add a log4j.properties to the classpath that directs log4j logging to a file. If I run a unit test from inside Eclipse then I deliberately want log4j initialization to fail, allowing me to initialize it programatically; log everything from the robertmaldon.moneymachine package to the console at DEBUG level, and log everything else to the console at INFO level.&lt;br /&gt;&lt;br /&gt;&lt;pre&gt;&lt;br /&gt;package robertmaldon.moneymachine;&lt;br /&gt;&lt;br /&gt;import org.junit.BeforeClass;&lt;br /&gt;&lt;br /&gt;import org.apache.log4j.ConsoleAppender;&lt;br /&gt;import org.apache.log4j.Logger;&lt;br /&gt;import org.apache.log4j.PatternLayout;&lt;br /&gt;&lt;br /&gt;public class OrderTest {&lt;br /&gt;&lt;br /&gt;@BeforeClass&lt;br /&gt;public static void classSetUp() {&lt;br /&gt;  Logger rootLogger = Logger.getRootLogger();&lt;br /&gt;  if (!rootLogger.getAllAppenders().hasMoreElements()) {&lt;br /&gt;      rootLogger.setLevel(Level.INFO);&lt;br /&gt;      rootLogger.addAppender(new ConsoleAppender(&lt;br /&gt;             new PatternLayout("%-5p [%t]: %m%n")));&lt;br /&gt;&lt;br /&gt;      // The TTCC_CONVERSION_PATTERN contains more info than&lt;br /&gt;      // the pattern we used for the root logger&lt;br /&gt;      Logger pkgLogger = rootLogger.getLoggerRepository().getLogger("robertmaldon.moneymachine");&lt;br /&gt;      pkgLogger.setLevel(Level.DEBUG);&lt;br /&gt;      pkgLogger.addAppender(new ConsoleAppender(&lt;br /&gt;             new PatternLayout(PatternLayout.TTCC_CONVERSION_PATTERN)));&lt;br /&gt;  }&lt;br /&gt;}&lt;br /&gt;}&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;The above code creates a new Logger and chains it to the root logger. Instances of Logger can not be instantiated directly, but have to be created from a &lt;a href="http://logging.apache.org/log4j/1.2/apidocs/org/apache/log4j/spi/LoggerRepository.html"&gt;LoggerRepository&lt;/a&gt; (a factory pattern).&lt;br /&gt;&lt;br /&gt;The equivalent log4j.properties would look something like:&lt;br /&gt;&lt;br /&gt;&lt;pre&gt;&lt;br /&gt;log4j.rootLogger=INFO, A&lt;br /&gt;&lt;br /&gt;log4j.appender.A=org.apache.log4j.ConsoleAppender log4j.appender.A.layout=org.apache.log4j.PatternLayout&lt;br /&gt;log4j.appender.A.layout.ConversionPattern=%-5p [%t]: %m%n&lt;br /&gt;&lt;br /&gt;log4j.logger.robertmaldon.moneymachine=DEBUG, B&lt;br /&gt;&lt;br /&gt;log4j.appender.B=org.apache.log4j.ConsoleAppender log4j.appender.B.layout=org.apache.log4j.PatternLayout&lt;br /&gt;log4j.appender.B.layout.ConversionPattern=%r [%t] %p %c %x - %m%n&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;So not too difficult to do after all :)&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;The Future of Java Logging&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;In recent weeks I've noticed some discussion and dissension in the Java logging world.&lt;br /&gt;&lt;br /&gt;Some &lt;a href="http://blog.organicelement.com/2006/12/21/commons-logging-classloader-woes/"&gt;implementation issues&lt;/a&gt; with &lt;a href="http://commons.apache.org/logging/"&gt;commons-logging&lt;/a&gt; spurred a number of the Apache projects to switch to a replacement called &lt;a href="http://www.slf4j.org/"&gt;SLF4j&lt;/a&gt; (Simple Logging Framework).&lt;br /&gt;&lt;br /&gt;The original creator of log4j has been hard at work on a successor called &lt;a href="http://logback.qos.ch/"&gt;LOGBack&lt;/a&gt;, which is an evolution of log4j rather than a revolution. e.g. smaller memory footprint, faster, better filtering and evaluation capabilities.&lt;br /&gt;&lt;br /&gt;One feature of LOGBack that really caught my eye was that of &lt;span style="font-weight: bold; font-style: italic;"&gt;parameterized logging&lt;/span&gt;. In log4j you might write logging code like:&lt;br /&gt;&lt;br /&gt;&lt;pre&gt;&lt;br /&gt;if( logger.isDebugEnabled() ) {&lt;br /&gt;  logger.debug( "User with account "&lt;br /&gt;      + user.getAccount() + " failed authentication; "&lt;br /&gt;      + "supplied crypted password " + user.crypt(password)&lt;br /&gt;      + " does not match." );&lt;br /&gt;}&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;The isDebugEnabled() check is usually a performance thing - there is no need to call expensive methods like the crypt() method above if the current logging level is higher than DEBUG. The equivalent code in LOGBack would be:&lt;br /&gt;&lt;br /&gt;&lt;pre&gt;&lt;br /&gt;logger.debug( "User with account {} failed authentication; "&lt;br /&gt;            + "supplied crypted password {} does not match.",&lt;br /&gt;            user.getAccount(), user.crypt(password) );&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;which allows LOGBack to defer calling getAccount() and crypt() until it has determined that the log level will cause the logging to be generated. The less "if"s the better!&lt;br /&gt;&lt;br /&gt;LOGBack natively implements the SLF4j APIs, but provides a bridge for applications currently using the log4j APIs. SLF4j provides a bridge for applications currently using the commons-logging APIs.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/21612553-6325155118585447525?l=robertmaldon.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://robertmaldon.blogspot.com/feeds/6325155118585447525/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=21612553&amp;postID=6325155118585447525' title='7 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/21612553/posts/default/6325155118585447525'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/21612553/posts/default/6325155118585447525'/><link rel='alternate' type='text/html' href='http://robertmaldon.blogspot.com/2007/09/programmatically-configuring-log4j-and.html' title='Programmatically Configuring log4j - and the Future of Java Logging'/><author><name>Robert Maldon</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>7</thr:total></entry><entry><id>tag:blogger.com,1999:blog-21612553.post-4897883378087909037</id><published>2007-09-06T06:58:00.000+10:00</published><updated>2008-12-12T05:35:59.900+11:00</updated><title type='text'>Graphing website relationships with TouchGraph Google Browser</title><content type='html'>&lt;a href="http://www.touchgraph.com/TGGoogleBrowser.html"&gt;TouchGraph Google Browser&lt;/a&gt; is a cute Java applet that, given a Google keyword search, graphs the relationships between websites from Google search results.&lt;br /&gt;&lt;br /&gt;Below is the result for a search on my company, Finetix. Most of the relationships look right (employees, press releases, alliances, memberships, etc) but I'm most curious about the link between Finetix blogs and guinness.com :)&lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://3.bp.blogspot.com/_3mcDdIZRKc0/Rt8ZWB9pPWI/AAAAAAAAASM/BlhAEnNTwns/s1600-h/touchgraph-finetix.png"&gt;&lt;img style="margin: 0px auto 10px; display: block; text-align: center; cursor: pointer;" src="http://3.bp.blogspot.com/_3mcDdIZRKc0/Rt8ZWB9pPWI/AAAAAAAAASM/BlhAEnNTwns/s400/touchgraph-finetix.png" alt="" id="BLOGGER_PHOTO_ID_5106828368736238946" 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/21612553-4897883378087909037?l=robertmaldon.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://robertmaldon.blogspot.com/feeds/4897883378087909037/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=21612553&amp;postID=4897883378087909037' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/21612553/posts/default/4897883378087909037'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/21612553/posts/default/4897883378087909037'/><link rel='alternate' type='text/html' href='http://robertmaldon.blogspot.com/2007/09/graphing-website-relationships-with.html' title='Graphing website relationships with TouchGraph Google Browser'/><author><name>Robert Maldon</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://3.bp.blogspot.com/_3mcDdIZRKc0/Rt8ZWB9pPWI/AAAAAAAAASM/BlhAEnNTwns/s72-c/touchgraph-finetix.png' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-21612553.post-1592765627545290167</id><published>2007-09-04T11:19:00.000+10:00</published><updated>2008-12-12T05:36:00.250+11:00</updated><title type='text'>Chill out with air-conditioned clothing</title><content type='html'>The worst of the summer heat is over for this year, but I'll have to remember to try out some of this &lt;a href="http://www.cool-off.com/articles/cool-gadgets.html"&gt;air-conditioned clothing&lt;/a&gt; next year, like the USB-powered neck tie. Ah, those crazy Japanese...&lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://1.bp.blogspot.com/_3mcDdIZRKc0/RtyzkR9pPVI/AAAAAAAAASE/g-bQsq-8Wfo/s1600-h/usb-fan-tie.jpg"&gt;&lt;img style="margin: 0px auto 10px; display: block; text-align: center; cursor: pointer;" src="http://1.bp.blogspot.com/_3mcDdIZRKc0/RtyzkR9pPVI/AAAAAAAAASE/g-bQsq-8Wfo/s400/usb-fan-tie.jpg" alt="" id="BLOGGER_PHOTO_ID_5106153513409920338" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://1.bp.blogspot.com/_3mcDdIZRKc0/RtyzNR9pPUI/AAAAAAAAAR8/vX6rFx162Wk/s1600-h/air-conditioned-clothing.jpg"&gt;&lt;img style="margin: 0px auto 10px; display: block; text-align: center; cursor: pointer;" src="http://1.bp.blogspot.com/_3mcDdIZRKc0/RtyzNR9pPUI/AAAAAAAAAR8/vX6rFx162Wk/s400/air-conditioned-clothing.jpg" alt="" id="BLOGGER_PHOTO_ID_5106153118272929090" 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/21612553-1592765627545290167?l=robertmaldon.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://robertmaldon.blogspot.com/feeds/1592765627545290167/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=21612553&amp;postID=1592765627545290167' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/21612553/posts/default/1592765627545290167'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/21612553/posts/default/1592765627545290167'/><link rel='alternate' type='text/html' href='http://robertmaldon.blogspot.com/2007/09/chill-out-with-air-conditioned-clothing.html' title='Chill out with air-conditioned clothing'/><author><name>Robert Maldon</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://1.bp.blogspot.com/_3mcDdIZRKc0/RtyzkR9pPVI/AAAAAAAAASE/g-bQsq-8Wfo/s72-c/usb-fan-tie.jpg' height='72' width='72'/><thr:total>0</thr:total></entry></feed>
