<?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-506664790362054788</id><updated>2011-12-14T23:56:38.653-08:00</updated><category term='GAE'/><category term='GWT'/><title type='text'>Computer Says No!</title><subtitle type='html'>Problems solved, error messages deciphered and other time saving tit bits mainly focused on Java web development with a mac.</subtitle><link rel='http://schemas.google.com/g/2005#feed' type='application/atom+xml' href='http://jdpatterson.blogspot.com/feeds/posts/default'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/506664790362054788/posts/default?max-results=100'/><link rel='alternate' type='text/html' href='http://jdpatterson.blogspot.com/'/><link rel='hub' href='http://pubsubhubbub.appspot.com/'/><author><name>John Patterson</name><uri>http://www.blogger.com/profile/07694246973945758038</uri><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>27</openSearch:totalResults><openSearch:startIndex>1</openSearch:startIndex><openSearch:itemsPerPage>100</openSearch:itemsPerPage><entry><id>tag:blogger.com,1999:blog-506664790362054788.post-1718586539121271359</id><published>2011-09-17T03:24:00.000-07:00</published><updated>2011-09-17T03:24:38.382-07:00</updated><title type='text'>Google breadcrumbs - itemscope must be first attribute</title><content type='html'>I want nice breadcrumbs to show on my Google search results as defined here:&lt;br /&gt;&lt;br /&gt;http://www.google.com/support/webmasters/bin/answer.py?hl=en&amp;amp;answer=185417&lt;br /&gt;&lt;br /&gt;My web framework must use well formed XML templates so instead of the &lt;i&gt;itemscope&lt;/i&gt; attribute (a boolean attribute which is not valid xml) I used itemscope="itemscope"&lt;br /&gt;&lt;br /&gt;The handy&amp;nbsp;&lt;a href="http://www.google.com/webmasters/tools/richsnippets"&gt;Rich Snippets Testing Tool&lt;/a&gt;&amp;nbsp;showed that my breadcrumbs were not being picked up. &amp;nbsp;After a frustrating process of elimination I realised that the itemscope attribute must be the &lt;i&gt;first &lt;/i&gt;attribute in the element or Google will not recognise it. &amp;nbsp;Thats not very XML friendly but probably a good performance optimisation.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/506664790362054788-1718586539121271359?l=jdpatterson.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://jdpatterson.blogspot.com/feeds/1718586539121271359/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=506664790362054788&amp;postID=1718586539121271359' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/506664790362054788/posts/default/1718586539121271359'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/506664790362054788/posts/default/1718586539121271359'/><link rel='alternate' type='text/html' href='http://jdpatterson.blogspot.com/2011/09/google-breadcrumbs-itemscope-must-be.html' title='Google breadcrumbs - itemscope must be first attribute'/><author><name>John Patterson</name><uri>http://www.blogger.com/profile/07694246973945758038</uri><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-506664790362054788.post-9198819285008927920</id><published>2011-08-24T07:18:00.000-07:00</published><updated>2011-08-24T07:21:19.198-07:00</updated><title type='text'>Janrain Sign-in</title><content type='html'>Have been looking at allowing users to sign in to the site I'm building using OpenId and FaceBook. &amp;nbsp;But what about hotmail users? &amp;nbsp;People I know have either Hotmail accounts, Google accounts and / or FaceBook accounts. &amp;nbsp;Perhaps Yahoo also.&lt;br /&gt;&lt;br /&gt;Janrain seems to cover all the bases, but when I use their &lt;a href="http://engage-sample.janraindemo.com/"&gt;demo &lt;/a&gt;and try to login with my FaceBook account it asks for a ton of permissions that I simply do not want most websites to have. &amp;nbsp;Why the fuck do they need to write on my wall? &amp;nbsp;"Access my data anytime" just sounds creepy even though its probably a pretty basic permission.&lt;br /&gt;&lt;br /&gt;I think a lot of people will react like me when a FaceBook connected site asks for too much - I just hit the back button and do not register. &amp;nbsp;Go to another site. &amp;nbsp;Customer lost. &amp;nbsp;Creepy bastards, wanting too much access to my shit. &amp;nbsp;Next thing they'll be sending friend requests.&lt;br /&gt;&lt;br /&gt;Their Google account integration must be using an older Google API (not OpenId) cos the UI looks a little clunky. &amp;nbsp;The top of the page says "MYACCOUNT.rpxnow.com is asking for some information from your Google Account". Who or what is rpxnow.com???? Well I know now that it was the old name for Janrain's Engage product but it should NOT be used at the top of my login page. &amp;nbsp;My site is not rpxnow.com&lt;br /&gt;&lt;br /&gt;Sure, if you pay Janrain then you can use your own domain name - but I am cheap and the FaceBook permissions thing is kind of a deal breaker anyway.  I'll use App Engine's built in OpenId support directly (that will cover Google, Yahoo, Twitter) then use FaceBook s JavaScript API to add those chaps and maybe, just maybe, add Microsoftcocks own protocol later.&lt;br /&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/506664790362054788-9198819285008927920?l=jdpatterson.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://jdpatterson.blogspot.com/feeds/9198819285008927920/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=506664790362054788&amp;postID=9198819285008927920' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/506664790362054788/posts/default/9198819285008927920'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/506664790362054788/posts/default/9198819285008927920'/><link rel='alternate' type='text/html' href='http://jdpatterson.blogspot.com/2011/08/janrain-sign-in.html' title='Janrain Sign-in'/><author><name>John Patterson</name><uri>http://www.blogger.com/profile/07694246973945758038</uri><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-506664790362054788.post-6289097298680700800</id><published>2011-07-23T08:43:00.000-07:00</published><updated>2011-07-23T08:43:04.973-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='GAE'/><category scheme='http://www.blogger.com/atom/ns#' term='GWT'/><title type='text'>GWT Developer mode quietly failing</title><content type='html'>I got this error message starting GWT dev server but no exception in the dev mode console.&lt;br /&gt;&lt;br /&gt;"Plugin failed to connect to development mode server at localhost:9997"&lt;br /&gt;&lt;br /&gt;It had been running fine last time I debugged my GWT stuff so why not now?&lt;br /&gt;&lt;br /&gt;In the end I had old App Engine jars in my class path after upgrading to the latest and greatest.&lt;br /&gt;&lt;br /&gt;In summary: check your app classpath and also your WEB-INF/lib folders for older versions still hanging about.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/506664790362054788-6289097298680700800?l=jdpatterson.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://jdpatterson.blogspot.com/feeds/6289097298680700800/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=506664790362054788&amp;postID=6289097298680700800' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/506664790362054788/posts/default/6289097298680700800'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/506664790362054788/posts/default/6289097298680700800'/><link rel='alternate' type='text/html' href='http://jdpatterson.blogspot.com/2011/07/gwt-developer-mode-quietly-failing.html' title='GWT Developer mode quietly failing'/><author><name>John Patterson</name><uri>http://www.blogger.com/profile/07694246973945758038</uri><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-506664790362054788.post-2099261375747577943</id><published>2011-07-22T19:43:00.000-07:00</published><updated>2011-07-22T19:43:45.033-07:00</updated><title type='text'>We have Citikey!</title><content type='html'>Just launched the new version of Citikey a free business listing service for the UK. &lt;br /&gt;&lt;br /&gt;&lt;a href="http://www.citikey.co.uk/"&gt;www.citikey.co.uk&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;Its built using the Google stack: Google App Engine, Google Web Toolkit, Google Maps.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/506664790362054788-2099261375747577943?l=jdpatterson.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://jdpatterson.blogspot.com/feeds/2099261375747577943/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=506664790362054788&amp;postID=2099261375747577943' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/506664790362054788/posts/default/2099261375747577943'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/506664790362054788/posts/default/2099261375747577943'/><link rel='alternate' type='text/html' href='http://jdpatterson.blogspot.com/2011/07/we-have-citikey.html' title='We have Citikey!'/><author><name>John Patterson</name><uri>http://www.blogger.com/profile/07694246973945758038</uri><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-506664790362054788.post-8204993066469554506</id><published>2011-07-01T23:30:00.000-07:00</published><updated>2011-07-01T23:30:21.688-07:00</updated><title type='text'>com.google.api.client.http.HttpResponseException: 400 Bad Request</title><content type='html'>I got this error message trying to log into Google App Engine using the Eclipse plugin. &amp;nbsp;I think the error can occur with any Google API that uses OAuth.&lt;br /&gt;&lt;br /&gt;com.google.api.client.http.HttpResponseException: 400 Bad Request&lt;br /&gt;&lt;br /&gt;The solution was to correct my system clock. &amp;nbsp;The time had become incorrect for some weird Windows reason (time to go back to using a mac) and adjusting it fixed the problem.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/506664790362054788-8204993066469554506?l=jdpatterson.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://jdpatterson.blogspot.com/feeds/8204993066469554506/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=506664790362054788&amp;postID=8204993066469554506' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/506664790362054788/posts/default/8204993066469554506'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/506664790362054788/posts/default/8204993066469554506'/><link rel='alternate' type='text/html' href='http://jdpatterson.blogspot.com/2011/07/comgoogleapiclienthttphttpresponseexcep.html' title='com.google.api.client.http.HttpResponseException: 400 Bad Request'/><author><name>John Patterson</name><uri>http://www.blogger.com/profile/07694246973945758038</uri><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-506664790362054788.post-4397365791441707642</id><published>2011-03-23T03:18:00.000-07:00</published><updated>2011-03-23T03:18:29.102-07:00</updated><title type='text'>100% height page in IE8</title><content type='html'>I set body and html to 100% height and then an inner container element to min-height: 100%&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;This worked in Chrome and Firefox but in IE8 the container element was not stretching to the bottom of the page.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;Eventually I found that the GWT date picker widget and photo viewer on the page were not being included in the height of the page. &amp;nbsp;By setting a specific height on these elements (reserving the space) IE displays the page correctly. &amp;nbsp;It also makes the page load look smoother.&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/506664790362054788-4397365791441707642?l=jdpatterson.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://jdpatterson.blogspot.com/feeds/4397365791441707642/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=506664790362054788&amp;postID=4397365791441707642' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/506664790362054788/posts/default/4397365791441707642'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/506664790362054788/posts/default/4397365791441707642'/><link rel='alternate' type='text/html' href='http://jdpatterson.blogspot.com/2011/03/100-height-page-in-ie8.html' title='100% height page in IE8'/><author><name>John Patterson</name><uri>http://www.blogger.com/profile/07694246973945758038</uri><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-506664790362054788.post-2002106545318491973</id><published>2011-03-22T20:38:00.000-07:00</published><updated>2011-03-22T20:38:15.282-07:00</updated><title type='text'>AppEngine logging level</title><content type='html'>I tried to change the logging level in my Google App Engine app to FINE to see what was happening in Sitebricks. &amp;nbsp;I edited the /WEB-INF/logging.properties file to read:&lt;br /&gt;&lt;br /&gt;&lt;blockquote&gt;.level = INFO&lt;br /&gt;com.google.sitebricks.level = FINE&amp;nbsp;&lt;/blockquote&gt;&amp;nbsp;But still only WARN messages were logged to the console.&lt;br /&gt;&lt;br /&gt;Finally I realised that on the launcher&amp;nbsp;dialogue&amp;nbsp;panel for GWT I had to also set the level to DEBUG. &amp;nbsp;But when I did that the console was flooded with GWT compile messages. &amp;nbsp;This is due to a new bug in GAE's logging where it tries to use the same settings as GWT but gives you no control of the GWT part.&lt;br /&gt;&lt;br /&gt;So I installed a simple logging handler to get around this:&lt;br /&gt;&lt;br /&gt;&lt;span class="Apple-style-span" style="font-family: arial, sans-serif; font-size: 13px;"&gt;&lt;/span&gt;&lt;br /&gt;&lt;pre style="font-size: 12px; max-width: 80em; padding-left: 0.7em; white-space: pre-wrap;"&gt;Put this in app init&lt;br /&gt;&lt;blockquote&gt;&lt;br /&gt;if (isDevelopment())&lt;br /&gt;{&lt;br /&gt; Logger.getLogger("").addHandler(new WorkaroundHander());&lt;br /&gt;}&lt;br /&gt;&lt;/blockquote&gt;&lt;br /&gt;&lt;blockquote&gt;public boolean isDevelopment()&lt;br /&gt;{&lt;br /&gt; return System.getProperty("com.google.appengine.runtime.environment").equals("Development");&lt;br /&gt;}&lt;br /&gt;&lt;/blockquote&gt;&lt;br /&gt;&lt;blockquote&gt;private static class WorkaroundHander extends Handler&lt;br /&gt;{&lt;br /&gt; public WorkaroundHander()&lt;br /&gt; {&lt;br /&gt;  setFormatter(new TextLogFormatter(false));&lt;br /&gt;  setLevel(Level.ALL);&lt;br /&gt; }&lt;/blockquote&gt;&lt;blockquote&gt; @Override&lt;br /&gt; public void publish(LogRecord record)&lt;br /&gt; {&lt;br /&gt;  if (isLoggable(record))&lt;br /&gt;  {&lt;br /&gt;   System.out.println(getFormatter().format(record));&lt;br /&gt;  }&lt;br /&gt; }&amp;nbsp;&lt;/blockquote&gt;&lt;blockquote&gt;&lt;br /&gt; @Override&lt;br /&gt; public void flush()&lt;br /&gt; {&lt;br /&gt; }&lt;br /&gt; @Override&lt;br /&gt; public void close() throws SecurityException&lt;br /&gt; {&lt;br /&gt; }&lt;br /&gt;}&lt;/blockquote&gt;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;Now I I happily see all the FINE messages that Sitebricks has for me.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/506664790362054788-2002106545318491973?l=jdpatterson.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://jdpatterson.blogspot.com/feeds/2002106545318491973/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=506664790362054788&amp;postID=2002106545318491973' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/506664790362054788/posts/default/2002106545318491973'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/506664790362054788/posts/default/2002106545318491973'/><link rel='alternate' type='text/html' href='http://jdpatterson.blogspot.com/2011/03/appengine-logging-level.html' title='AppEngine logging level'/><author><name>John Patterson</name><uri>http://www.blogger.com/profile/07694246973945758038</uri><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-506664790362054788.post-3419066097589237173</id><published>2010-11-26T20:04:00.000-08:00</published><updated>2010-11-26T20:14:50.012-08:00</updated><title type='text'>New Mail Client for Windows</title><content type='html'>I had to switch back to a Windows PC recently and found that no email client is installed be default.  Unfortunately Gmail does not deal so well with multiple accounts and is a bit clunky off-line.  &lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;I tried Windows Live Mail which showed some promise but eventually proved to be so slow and has a very annoying bug which makes writing in-line replies impossible.  It sometimes won't let you hit enter and write your reply interleaved with the receivers.  Sometimes it does sometimes it doesn't.... very annoying.  You just cannot break through that thick black line.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;So then I tried Mozilla Thunderbird which I had previously rejected just because the user interface looks a bit clunky.  But I tried it again and so far have found it a real pleasure to use.  It is very functional and stable.  Much better than Apple Mail which would often "wedge" itself when checking for mail and leave me wondering why no emails were received for hours.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/506664790362054788-3419066097589237173?l=jdpatterson.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://jdpatterson.blogspot.com/feeds/3419066097589237173/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=506664790362054788&amp;postID=3419066097589237173' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/506664790362054788/posts/default/3419066097589237173'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/506664790362054788/posts/default/3419066097589237173'/><link rel='alternate' type='text/html' href='http://jdpatterson.blogspot.com/2010/11/new-mail-client-for-windows.html' title='New Mail Client for Windows'/><author><name>John Patterson</name><uri>http://www.blogger.com/profile/07694246973945758038</uri><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-506664790362054788.post-182628640974248008</id><published>2010-10-12T23:36:00.001-07:00</published><updated>2010-10-12T23:36:55.662-07:00</updated><title type='text'>Lubuntu install removed Windows boot option</title><content type='html'>&lt;p&gt;I bought an HP Mini 210 netbook which is a great little machine but Windows 7 Starter uses almost all of the meagre 1GB RAM for itself making everything painfully slow. &amp;nbsp;After a little research I found that the Lubuntu Linux distribution claims to have the lowest memory use of any of the Debian based desktops so I'm giving it a try.&lt;/p&gt;&lt;p&gt;I found I had to be online with an ethernet cable to finish the install because it could not recognise the WiFi card without installing extra drivers. &amp;nbsp;After updating the software with Synaptic and rebooting I found that the windows options had&amp;nbsp;disappeared&amp;nbsp;from the boot menu.&amp;nbsp;&lt;/p&gt;&lt;p&gt;To get them back I needed to run:&lt;/p&gt;&lt;blockquote&gt;&lt;p&gt;sudo apt-get install os-probe&lt;/p&gt;&lt;p&gt;sudo os-probe&lt;/p&gt;&lt;p&gt;sudo update-grub&lt;/p&gt;&lt;/blockquote&gt;&lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;p&gt;Now the windows options are back in the boot menu!&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/506664790362054788-182628640974248008?l=jdpatterson.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://jdpatterson.blogspot.com/feeds/182628640974248008/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=506664790362054788&amp;postID=182628640974248008' title='2 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/506664790362054788/posts/default/182628640974248008'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/506664790362054788/posts/default/182628640974248008'/><link rel='alternate' type='text/html' href='http://jdpatterson.blogspot.com/2010/10/lubuntu-install-removed-windows-boot.html' title='Lubuntu install removed Windows boot option'/><author><name>John Patterson</name><uri>http://www.blogger.com/profile/07694246973945758038</uri><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-506664790362054788.post-1887440927638674015</id><published>2010-07-21T08:30:00.001-07:00</published><updated>2010-07-21T08:34:18.285-07:00</updated><title type='text'>New optimisation in Twig for merged parent queries</title><content type='html'>&lt;p&gt;I have just added a really nifty corner-case optimisation&amp;nbsp;to&amp;nbsp;&lt;a href="http://code.google.com/p/twig-persist/"&gt;Twig&lt;/a&gt; for merged parent queries (relation index entities) which is needed for Target Rooms location based search. &amp;nbsp;Target Rooms searches a number of map blocks at the same time using async parallel queries and then merges the results together to get rid of the duplicates. You can see the blocks it chooses by adding the debug parameter:&lt;/p&gt;&lt;p&gt;&lt;a href="http://www.targetrooms.com/place/montpellier?debug"&gt;http://www.targetrooms.com/place/montpellier?debug&lt;/a&gt;&lt;/p&gt;&lt;p&gt;See how tightly the blocks fit to the map? &amp;nbsp;It chooses the blocks using a lowest-cost formula to minimize the amount of overlap and the number of blocks queried. If there is a major city just off the screen Twig may need to sort through thousands of hotels to find the best available prices and then throw them away because they are not on the map. That makes a really slow worst case that was actually quite common before this best-fit approach.&lt;/p&gt;&lt;p&gt;It now asks each child query which entities it wants and gets rid of duplicates before sending off a single request to the datastore for all of them. &amp;nbsp;When any of the children needs more parent entities it asks this EntitySupplier for more which in turn asks all of the children again if they need any more.&lt;/p&gt;&lt;p&gt;It has speed up the geospatial search HUGELY! &amp;nbsp;I only recently realised that the complex part of the query (searching 6 blocks of geospatial data in parallel and sorting it by price) was completing in about 50ms!!! &amp;nbsp;The simple part (bulk get of the parent results) was taking between 200 and 1200ms to do 6 bulk gets. &amp;nbsp;What a surprise. You can actually see in the &lt;a href="http://code.google.com/status/appengine/detail/datastore/2010/07/13#ae-trust-detail-datastore-get-latency"&gt;Google App Engine Status&lt;/a&gt;&amp;nbsp;page that some days each simple get (not even bulk get) can take like 500ms.&lt;/p&gt;&lt;p&gt;Now Twig combines all bulk gets for each child query into a single bulk get which has made a huge improvement.&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/506664790362054788-1887440927638674015?l=jdpatterson.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://jdpatterson.blogspot.com/feeds/1887440927638674015/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=506664790362054788&amp;postID=1887440927638674015' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/506664790362054788/posts/default/1887440927638674015'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/506664790362054788/posts/default/1887440927638674015'/><link rel='alternate' type='text/html' href='http://jdpatterson.blogspot.com/2010/07/new-optimisation-in-twig-for-merged.html' title='New optimisation in Twig for merged parent queries'/><author><name>John Patterson</name><uri>http://www.blogger.com/profile/07694246973945758038</uri><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-506664790362054788.post-5411840765184947435</id><published>2010-07-21T08:09:00.001-07:00</published><updated>2010-07-21T08:09:41.128-07:00</updated><title type='text'>Eclipse debug running very slow</title><content type='html'>&lt;p&gt;I hit a problem developing with App Engine which took me a long time to figure out. &amp;nbsp;I have been flipping between projects so didn't really notice when GAE and GWT started so run so slowly. &amp;nbsp;I have also been experimenting with JRebel and messing with JVM memory parameters. &amp;nbsp;Well "suddenly" every started running really really slowly and App Engine would take around 10 minutes to start up and run my 6 async parallel queries. &amp;nbsp;Was it the new version of App Engine Java introducing a concurrency problem? &amp;nbsp;Was it that my local datastore local_db.bin was too big - holy shit its 10MB!&lt;/p&gt;&lt;p&gt;After a lot of kafuffle I finally removed all break points and viola -&amp;nbsp;Every thing was lightening fast again!&amp;nbsp;&amp;nbsp;Even though they were not being hit they somehow slowed the dev server down to a crawl. &amp;nbsp;What a massive waste of time.&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/506664790362054788-5411840765184947435?l=jdpatterson.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://jdpatterson.blogspot.com/feeds/5411840765184947435/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=506664790362054788&amp;postID=5411840765184947435' title='6 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/506664790362054788/posts/default/5411840765184947435'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/506664790362054788/posts/default/5411840765184947435'/><link rel='alternate' type='text/html' href='http://jdpatterson.blogspot.com/2010/07/eclipse-debug-running-very-slow.html' title='Eclipse debug running very slow'/><author><name>John Patterson</name><uri>http://www.blogger.com/profile/07694246973945758038</uri><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-506664790362054788.post-2951938067582576628</id><published>2010-03-17T22:20:00.000-07:00</published><updated>2010-03-17T22:24:59.685-07:00</updated><title type='text'>GWT Eclipse and testing with Parallels</title><content type='html'>I use Parallels to run IE6, 7 and 8 for testing my GWT site.  I use Bonjour to easily find my local server running on the mac without fiddling with ip addresses that change often.  From a windows VM I use something like http://my-computer-name.local:8888/?gwt.codesvr=my-computer-name:9997"&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;Suddenly after upgrading GWT to 2.0.2 this stopped working - at least the GWT part did but the page still loaded.  &lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;The trick is to add an argument to the launch config: -bindAddress 0.0.0.0&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;Seems that 2.0.2 added a new feature to only bind to localhost by default.&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/506664790362054788-2951938067582576628?l=jdpatterson.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://jdpatterson.blogspot.com/feeds/2951938067582576628/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=506664790362054788&amp;postID=2951938067582576628' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/506664790362054788/posts/default/2951938067582576628'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/506664790362054788/posts/default/2951938067582576628'/><link rel='alternate' type='text/html' href='http://jdpatterson.blogspot.com/2010/03/gwt-eclipse-and-testing-with-parallels.html' title='GWT Eclipse and testing with Parallels'/><author><name>John Patterson</name><uri>http://www.blogger.com/profile/07694246973945758038</uri><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-506664790362054788.post-9067509920677059569</id><published>2010-03-17T20:55:00.000-07:00</published><updated>2010-03-17T21:05:25.862-07:00</updated><title type='text'>Author name JavaDoc on Eclipse Mac</title><content type='html'>To change the author name from you login name like "john" to your  full name and email like "John Patterson &lt;john@vercer.com&gt;" open the Application bundle by right clicking on the Eclipse app and selecting "Show package contents".  Then edit the MacOS/eclipse.ini file to include the line:&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;-Duser.name=My Name &lt;myemail@somwhere.com&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;Restart Eclipse and voila!&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/506664790362054788-9067509920677059569?l=jdpatterson.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://jdpatterson.blogspot.com/feeds/9067509920677059569/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=506664790362054788&amp;postID=9067509920677059569' title='1 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/506664790362054788/posts/default/9067509920677059569'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/506664790362054788/posts/default/9067509920677059569'/><link rel='alternate' type='text/html' href='http://jdpatterson.blogspot.com/2010/03/author-name-javadoc-on-eclipse-mac.html' title='Author name JavaDoc on Eclipse Mac'/><author><name>John Patterson</name><uri>http://www.blogger.com/profile/07694246973945758038</uri><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-506664790362054788.post-7085679383898535219</id><published>2010-02-23T00:43:00.000-08:00</published><updated>2010-02-23T00:52:01.378-08:00</updated><title type='text'>GWT and Google Maps - Opening an Info Window on a Marker</title><content type='html'>I am using the Google GWT APIs library to use maps on www.targetrooms.com&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;Opening the info window at a certain location worked fine but when I tried to open it over a marker an error was thrown.&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span" style="font-family: arial, sans-serif; font-size: 12px; "&gt;&lt;p&gt;This works:&lt;br /&gt;&lt;/p&gt;&lt;p&gt;map.getInfoWindow().open(latLng, content);&lt;br /&gt;&lt;/p&gt;&lt;p&gt;But this:&lt;br /&gt;&lt;/p&gt;&lt;p&gt;map.getInfoWindow().open(marker, content);&lt;br /&gt;&lt;/p&gt;&lt;div&gt;&lt;p&gt;throws this:&lt;br /&gt;&lt;/p&gt;&lt;p&gt;com.google.gwt.core.client.JavaScriptException: (TypeError): b is&lt;br /&gt;undefined&lt;br /&gt; fileName: &lt;a target="_blank" rel="nofollow" href="http://www.google.com/url?sa=D&amp;amp;q=http://maps.gstatic.com/intl/en_ALL/mapfiles/193c/maps2.api/main.js&amp;amp;usg=AFQjCNEuO39NEF-Y7-yutXCNcUTmPd-yZw" style="color: rgb(0, 0, 204); "&gt;http://maps.gstatic.com/intl/en_ALL/mapfiles/193c/maps2.api/main.js&lt;/a&gt;&lt;br /&gt; lineNumber: 1224 &lt;/p&gt;&lt;p&gt;By using FireBug to break on the exception I found that the maps were looking for an anchor point for the info window:&lt;/p&gt;&lt;p&gt;line 1224: b=a.infoWindowAnchor&lt;/p&gt;&lt;p&gt;So by setting an anchor point on the markers icon before using it like so:&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;p style="margin: 0.0px 0.0px 0.0px 0.0px; font: 11.0px Monaco"&gt;icon.setInfoWindowAnchor(Point.newInstance(10, 10));&lt;/p&gt; &lt;p style="margin: 0.0px 0.0px 0.0px 0.0px; font: 11.0px Monaco"&gt;MarkerOptions options = MarkerOptions.newInstance(icon);&lt;/p&gt;&lt;p style="margin: 0.0px 0.0px 0.0px 0.0px; font: 11.0px Monaco"&gt;&lt;/p&gt;&lt;p style="margin: 0.0px 0.0px 0.0px 0.0px; font: 11.0px Monaco"&gt;Marker marker = &lt;span style="color: #7f0055"&gt;new&lt;/span&gt; Marker(latLng, options);&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;the info window now opens as expected.&lt;/p&gt;&lt;/div&gt;&lt;/span&gt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/506664790362054788-7085679383898535219?l=jdpatterson.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://jdpatterson.blogspot.com/feeds/7085679383898535219/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=506664790362054788&amp;postID=7085679383898535219' title='1 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/506664790362054788/posts/default/7085679383898535219'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/506664790362054788/posts/default/7085679383898535219'/><link rel='alternate' type='text/html' href='http://jdpatterson.blogspot.com/2010/02/gwt-and-google-maps-opening-info-window.html' title='GWT and Google Maps - Opening an Info Window on a Marker'/><author><name>John Patterson</name><uri>http://www.blogger.com/profile/07694246973945758038</uri><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-506664790362054788.post-2330316962820724746</id><published>2009-09-05T10:37:00.000-07:00</published><updated>2009-09-05T10:47:49.142-07:00</updated><title type='text'>We have Twig!</title><content type='html'>I have just made my first commit to Twig on Google Code: http://code.google.com/p/twig-persist/&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;This is my first open source project and in all likelihood my last.  I worked quite solidly for two weeks on it although at first I imagined it would be 3 or 4 days work.  So probably one of my more accurate predictions actually!&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;My meagre unit tests pass and now I can spend some time actually using it on a real project before alerting the rest of the app engine crew that there has been a shift in the force.  JDO is not my father... it is a piece of shit.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/506664790362054788-2330316962820724746?l=jdpatterson.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://jdpatterson.blogspot.com/feeds/2330316962820724746/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=506664790362054788&amp;postID=2330316962820724746' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/506664790362054788/posts/default/2330316962820724746'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/506664790362054788/posts/default/2330316962820724746'/><link rel='alternate' type='text/html' href='http://jdpatterson.blogspot.com/2009/09/we-have-twigi-have-just.html' title='We have Twig!'/><author><name>John Patterson</name><uri>http://www.blogger.com/profile/07694246973945758038</uri><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-506664790362054788.post-6756235193100243729</id><published>2009-08-18T22:06:00.000-07:00</published><updated>2009-08-18T22:15:25.561-07:00</updated><title type='text'>GWT - Unhelpful RPC serialization message</title><content type='html'>&lt;span class="Apple-style-span"   style="  border-collapse: collapse; white-space: pre; -webkit-border-horizontal-spacing: 2px; -webkit-border-vertical-spacing: 2px; font-family:'Lucida Grande';font-size:11px;"&gt;&lt;div&gt;There are a number of causes for this error message:&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;span class="Apple-style-span" style="border-collapse: separate; font-family: 'Trebuchet MS', 'Lucida Grande', Verdana, Georgia, sans-serif; font-size: 12px; white-space: normal; -webkit-border-horizontal-spacing: 0px; -webkit-border-vertical-spacing: 0px; color: rgb(85, 85, 85); "&gt;com.google.gwt.user.client.rpc.SerializationException: Type ‘blah.blah.blah’ was not included in the set of types which can be serialized by this SerializationPolicy or its Class object could not be loaded. For security purposes, this type will not be serialized.&lt;/span&gt;&lt;br /&gt;&lt;/span&gt;&lt;div&gt;&lt;span class="Apple-style-span"   style="font-family:'Lucida Grande', -webkit-fantasy;font-size:100%;"&gt;&lt;span class="Apple-style-span"  style="border-collapse: collapse;  white-space: pre; -webkit-border-horizontal-spacing: 2px; -webkit-border-vertical-spacing: 2px;font-size:11px;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span"   style="font-family:'Lucida Grande', -webkit-fantasy;font-size:100%;"&gt;&lt;span class="Apple-style-span"  style="border-collapse: collapse;  white-space: pre; -webkit-border-horizontal-spacing: 2px; -webkit-border-vertical-spacing: 2px;font-size:11px;"&gt;Check: I have a no args constructor (private is OK)&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span"   style="font-family:'Lucida Grande', -webkit-fantasy;font-size:100%;"&gt;&lt;span class="Apple-style-span"  style="border-collapse: collapse;  white-space: pre; -webkit-border-horizontal-spacing: 2px; -webkit-border-vertical-spacing: 2px;font-size:11px;"&gt;Check: I have implemented IsSerializable&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span"   style="font-family:'Lucida Grande', -webkit-fantasy;font-size:100%;"&gt;&lt;span class="Apple-style-span"  style="border-collapse: collapse;  white-space: pre; -webkit-border-horizontal-spacing: 2px; -webkit-border-vertical-spacing: 2px;font-size:11px;"&gt;Check: It is on my source path for my module - in &lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span"   style="font-family:'Lucida Grande', -webkit-fantasy;font-size:100%;"&gt;&lt;span class="Apple-style-span"  style="border-collapse: collapse;  white-space: pre; -webkit-border-horizontal-spacing: 2px; -webkit-border-vertical-spacing: 2px;font-size:11px;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span"   style="font-family:'Lucida Grande', -webkit-fantasy;font-size:100%;"&gt;&lt;span class="Apple-style-span"  style="border-collapse: collapse;  white-space: pre; -webkit-border-horizontal-spacing: 2px; -webkit-border-vertical-spacing: 2px;font-size:11px;"&gt;What else could be wrong?&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span"   style="font-family:'Lucida Grande', -webkit-fantasy;font-size:100%;"&gt;&lt;span class="Apple-style-span"  style="border-collapse: collapse;  white-space: pre; -webkit-border-horizontal-spacing: 2px; -webkit-border-vertical-spacing: 2px;font-size:11px;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span"   style="font-family:'Lucida Grande', -webkit-fantasy;font-size:100%;"&gt;&lt;span class="Apple-style-span"  style="border-collapse: collapse;  white-space: pre; -webkit-border-horizontal-spacing: 2px; -webkit-border-vertical-spacing: 2px;font-size:11px;"&gt;It turned out that one of the fields within my class was not Serializable due to not implementing IsSerializable.&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/506664790362054788-6756235193100243729?l=jdpatterson.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://jdpatterson.blogspot.com/feeds/6756235193100243729/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=506664790362054788&amp;postID=6756235193100243729' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/506664790362054788/posts/default/6756235193100243729'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/506664790362054788/posts/default/6756235193100243729'/><link rel='alternate' type='text/html' href='http://jdpatterson.blogspot.com/2009/08/gwt-unhelpful-rpc-serialization-message.html' title='GWT - Unhelpful RPC serialization message'/><author><name>John Patterson</name><uri>http://www.blogger.com/profile/07694246973945758038</uri><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-506664790362054788.post-8197619973594022</id><published>2009-08-16T23:53:00.000-07:00</published><updated>2009-08-17T00:18:42.174-07:00</updated><title type='text'>Recover deleted photos on a Mac for free!</title><content type='html'>Oops... someone deleted all the photos on the camera after our holiday instead of just one.  It was Mr or Ms nobody.  Fear not, because as long as you don't fill the camera with new photos the old ones will still be there - just hidden from the operating system.&lt;br /&gt;&lt;br /&gt;Firstly you need a usb card reader so your computer can get direct access to the "drive".  I bought a cheap one from Tescos here in Thailand for 140 baht (3 quid) that reads my large CF card and many others.&lt;br /&gt;&lt;br /&gt;I downloaded a free demo of a program called PhotoRecovery for Mac by AppleXsoft that found my photos but wanted 50 bucks to give them to me.  That gave me the confidence that they were indeed still accessible so I googled on the interweb a bit more and came up with this:&lt;br /&gt;&lt;br /&gt;http://www.cgsecurity.org/wiki/PhotoRec&lt;br /&gt;&lt;br /&gt;It is a command line tool you can download or you can install it straight from the brilliant MacPorts by typing&lt;br /&gt;&lt;br /&gt;sudo port install testdisk&lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://3.bp.blogspot.com/_7B93mJJvwto/SokCDeO2f4I/AAAAAAAAABc/-O1tTI0Rfts/s1600-h/Picture+2.png"&gt;&lt;img style="cursor:pointer; cursor:hand;width: 400px; height: 257px;" src="http://3.bp.blogspot.com/_7B93mJJvwto/SokCDeO2f4I/AAAAAAAAABc/-O1tTI0Rfts/s400/Picture+2.png" border="0" alt="" id="BLOGGER_PHOTO_ID_5370826289294245762" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;TestDisk is the package that contains the photorec command.&lt;br /&gt;&lt;br /&gt;Now type "photorec" and the UI kicks in to guide you through the process of selecting the drive etc.&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://3.bp.blogspot.com/_7B93mJJvwto/SokBrSyW1xI/AAAAAAAAABU/TP3gX6CpMP0/s1600-h/pastedGraphic.png"&gt;&lt;img style="cursor:pointer; cursor:hand;width: 400px; height: 317px;" src="http://3.bp.blogspot.com/_7B93mJJvwto/SokBrSyW1xI/AAAAAAAAABU/TP3gX6CpMP0/s400/pastedGraphic.png" border="0" alt="" id="BLOGGER_PHOTO_ID_5370825873905080082" /&gt;&lt;/a&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://3.bp.blogspot.com/_7B93mJJvwto/SokBrSyW1xI/AAAAAAAAABU/TP3gX6CpMP0/s1600-h/pastedGraphic.png"&gt;&lt;/a&gt;I chose the drive by guessing from its size - my card was 1GB so I chose the 991 MB option&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;Then I had to guess a filesystem type - I chose EFI for lack of a better idea.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;Then I chose where to save the files and the program started doing its thing.  Like so:&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;img style="cursor:pointer; cursor:hand;width: 400px; height: 330px;" src="http://1.bp.blogspot.com/_7B93mJJvwto/SokDbUfsLLI/AAAAAAAAABk/XkeMUlvc0qI/s400/Picture+3.png" border="0" alt="" id="BLOGGER_PHOTO_ID_5370827798509006002" /&gt;&lt;br /&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;and low and behold the damn thing worked like a charm and spat out all my deleted photos into the folder I chose.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;img style="cursor:pointer; cursor:hand;width: 400px; height: 342px;" src="http://1.bp.blogspot.com/_7B93mJJvwto/SokEESw0ctI/AAAAAAAAABs/6wiTOFtcQ7k/s400/Picture+4.png" border="0" alt="" id="BLOGGER_PHOTO_ID_5370828502418617042" /&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;Sing hallelujah!&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/506664790362054788-8197619973594022?l=jdpatterson.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://jdpatterson.blogspot.com/feeds/8197619973594022/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=506664790362054788&amp;postID=8197619973594022' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/506664790362054788/posts/default/8197619973594022'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/506664790362054788/posts/default/8197619973594022'/><link rel='alternate' type='text/html' href='http://jdpatterson.blogspot.com/2009/08/recover-deleted-photos-on-mac-for-free.html' title='Recover deleted photos on a Mac for free!'/><author><name>John Patterson</name><uri>http://www.blogger.com/profile/07694246973945758038</uri><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/_7B93mJJvwto/SokCDeO2f4I/AAAAAAAAABc/-O1tTI0Rfts/s72-c/Picture+2.png' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-506664790362054788.post-4250290287257030134</id><published>2009-06-28T00:51:00.001-07:00</published><updated>2009-06-28T01:04:26.085-07:00</updated><title type='text'>Dropbox as source code repository</title><content type='html'>I have just started to use Mercurial as my SCM on my latest project and so far it seems great.  When you have a functioning unit of change you commit it to your development local (or remote) repository and when you have an entire feature ready you can push it to your "central" repository for testing.  In theory repositories should not have half finished non-compiling work in them.&lt;br /&gt;&lt;br /&gt;But often I move from my Desktop to my laptop in the middle of development while everything is still up in the air.  I would also like a backup of my work in progress without having to commit to the repository.  This is where Dropbox comes in.  &lt;br /&gt;&lt;br /&gt;Install Dropbox from www.getdropbox.com and it creates a folder that is always synchronised to the server as long as you are connected to the internet.  It is free for up to 2GB of storage, private unless I choose to share files, and has simple revision control to revert back or download an older version from the web interface.  Brilliant and simple.&lt;br /&gt;&lt;br /&gt;I created a symbolic link from ~/Dropbox to my project folder and suddenly every time I save a file it is synchronised with the version on the server.  I don't need to remember to commit small changes and always have the latest version when I change dev machines.&lt;br /&gt;&lt;br /&gt;The best part is that I am no longer tempted to check in half backed code.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/506664790362054788-4250290287257030134?l=jdpatterson.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://jdpatterson.blogspot.com/feeds/4250290287257030134/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=506664790362054788&amp;postID=4250290287257030134' title='1 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/506664790362054788/posts/default/4250290287257030134'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/506664790362054788/posts/default/4250290287257030134'/><link rel='alternate' type='text/html' href='http://jdpatterson.blogspot.com/2009/06/dropbox-as-source-code-repository.html' title='Dropbox as source code repository'/><author><name>John Patterson</name><uri>http://www.blogger.com/profile/07694246973945758038</uri><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-506664790362054788.post-1964612253184520195</id><published>2009-05-31T10:11:00.000-07:00</published><updated>2009-05-31T10:26:10.207-07:00</updated><title type='text'>Google App Engine with Maven</title><content type='html'>Google App Engine has an Eclipse plugin to help with uploading and enhancing your JDO classes.  It also sets up the dependancies and exposes the GAR API.  Very handy.  But it doesn't play nicely with maven because the two of them assume a different project layout.  Maven expects your webapp source to live under src/main/webapp/ and it builds an exploded war under target/ .  Meanwhile, the Google App Engine plugin for eclipse is hardcoded to look for both source and target under the root folder war/&lt;br /&gt;&lt;br /&gt;The google team will probably allow this configuration soon but until then you can update your maven pox.xml like this:&lt;br /&gt;&lt;br /&gt;&amp;lt;plugin&amp;gt;&lt;br /&gt;        &amp;lt;groupId&amp;gt;org.apache.maven.plugins&amp;lt;/groupId&amp;gt;&lt;br /&gt;        &amp;lt;artifactId&amp;gt;maven-war-plugin&amp;lt;/artifactId&amp;gt;&lt;br /&gt;        &amp;lt;version&amp;gt;2.0&amp;lt;/version&amp;gt;&lt;br /&gt;        &amp;lt;configuration&amp;gt;&lt;br /&gt;     &amp;lt;directory&amp;gt;war&amp;lt;/directory&amp;gt;&lt;br /&gt;     &amp;lt;warSourceDirectory&amp;gt;war&amp;lt;/warSourceDirectory&amp;gt;&lt;br /&gt;          &amp;lt;webappDirectory&amp;gt;war&amp;lt;/webappDirectory&amp;gt;&lt;br /&gt;        &amp;lt;/configuration&amp;gt;&lt;br /&gt;      &amp;lt;/plugin&amp;gt;&lt;br /&gt;&lt;br /&gt;You may also need to create a appengine-web.xmlfile under war/WEB-INF/ to get the plugin to work if you are using appengine on an existing project.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/506664790362054788-1964612253184520195?l=jdpatterson.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://jdpatterson.blogspot.com/feeds/1964612253184520195/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=506664790362054788&amp;postID=1964612253184520195' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/506664790362054788/posts/default/1964612253184520195'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/506664790362054788/posts/default/1964612253184520195'/><link rel='alternate' type='text/html' href='http://jdpatterson.blogspot.com/2009/05/google-app-engine-with-maven.html' title='Google App Engine with Maven'/><author><name>John Patterson</name><uri>http://www.blogger.com/profile/07694246973945758038</uri><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-506664790362054788.post-8490262346518312890</id><published>2009-05-14T09:43:00.000-07:00</published><updated>2009-05-14T09:45:43.856-07:00</updated><title type='text'>Maven error</title><content type='html'>In case someone comes accross the same problem - I came hit this exception and fixed it by deleting my target directory and clean-ing the project from Eclipse to rebuild the classes.&lt;br /&gt;&lt;br /&gt;[INFO] [war:war]&lt;br /&gt;[INFO] Packaging webapp&lt;br /&gt;[INFO] ------------------------------------------------------------------------&lt;br /&gt;[ERROR] FATAL ERROR&lt;br /&gt;[INFO] ------------------------------------------------------------------------&lt;br /&gt;[INFO] modelEncoding : modelEncoding&lt;br /&gt;---- Debugging information ----&lt;br /&gt;message             : modelEncoding : modelEncoding&lt;br /&gt;cause-exception     : com.thoughtworks.xstream.mapper.CannotResolveClassException&lt;br /&gt;cause-message       : modelEncoding : modelEncoding&lt;br /&gt;class               : org.apache.maven.plugin.war.util.WebappStructure&lt;br /&gt;required-type       : org.apache.maven.model.Dependency&lt;br /&gt;path                : /webapp-structure/dependenciesInfo/org.apache.maven.plugin.war.util.DependencyInfo/dependency/modelEncoding&lt;br /&gt;line number         : 1108&lt;br /&gt;-------------------------------&lt;br /&gt;[INFO] ------------------------------------------------------------------------&lt;br /&gt;[INFO] Trace&lt;br /&gt;com.thoughtworks.xstream.converters.ConversionException: modelEncoding : modelEncoding&lt;br /&gt;---- Debugging information ----&lt;br /&gt;message             : modelEncoding : modelEncoding&lt;br /&gt;cause-exception     : com.thoughtworks.xstream.mapper.CannotResolveClassException&lt;br /&gt;cause-message       : modelEncoding : modelEncoding&lt;br /&gt;class               : org.apache.maven.plugin.war.util.WebappStructure&lt;br /&gt;required-type       : org.apache.maven.model.Dependency&lt;br /&gt;path                : /webapp-structure/dependenciesInfo/org.apache.maven.plugin.war.util.DependencyInfo/dependency/modelEncoding&lt;br /&gt;line number         : 1108&lt;br /&gt;-------------------------------&lt;br /&gt; at com.thoughtworks.xstream.core.TreeUnmarshaller.convert(TreeUnmarshaller.java:63)&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/506664790362054788-8490262346518312890?l=jdpatterson.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://jdpatterson.blogspot.com/feeds/8490262346518312890/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=506664790362054788&amp;postID=8490262346518312890' title='4 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/506664790362054788/posts/default/8490262346518312890'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/506664790362054788/posts/default/8490262346518312890'/><link rel='alternate' type='text/html' href='http://jdpatterson.blogspot.com/2009/05/maven-error.html' title='Maven error'/><author><name>John Patterson</name><uri>http://www.blogger.com/profile/07694246973945758038</uri><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-506664790362054788.post-8647812929986490397</id><published>2009-04-18T05:27:00.000-07:00</published><updated>2009-04-18T05:48:14.330-07:00</updated><title type='text'>Plotting graphs on the Mac</title><content type='html'>I am developing an iPhone pedometer application that uses the accelerometer to count paces.  My tests generate a lot of data - 40 readings per seconds - that I wanted to visualise some how to allow me to develop an algorithm to count the paces.  After a test run with my POC app I had a file with about 100,000 lines of float data.&lt;br /&gt;&lt;br /&gt;I first tried Apples Numbers which is a part of iWork which chocked on the data and became impossibly slow to use.  It also does not have many options regarding the presentation of the graph.&lt;br /&gt;&lt;br /&gt;After a quick Google search I found gnuplot which can be installed using macports like this&lt;br /&gt;&lt;br /&gt;: sudo port install gnuplot&lt;br /&gt;&lt;br /&gt;However it would not start on my Leopard machine until I reinstalled X11 from here:&lt;br /&gt;&lt;br /&gt;http://xquartz.macosforge.org/trac/wiki&lt;br /&gt;&lt;br /&gt;after installing the latest X11 everything ran perfectly.  It plotted my 100k points in a split second making Numbers look like the bloated eye candy that I have come to expect from iWork.  The degree of flexibility is amazing and the ability to use standard unix file manipulation commands adds even more options.  But I was a bit frustrated that I could not use transparency in the current version (4.2.4) and it was a pain in the ass to change the background colour; you need to set a command line property when you launch it.  &lt;br /&gt;&lt;br /&gt;Then I found Plot which seems to have a lot of the options that gnuplot has but all packaged up into a nice UI.  &lt;br /&gt;&lt;br /&gt;http://plot.micw.eu/&lt;br /&gt;&lt;br /&gt;It was easy to change background colours and set transparency etc.  I think this will be very useful in visualising my data points and creating some pretty graphs for documentation pages.  It does not handle 3D graphs but that is not a problem for me.&lt;br /&gt;&lt;br /&gt;The options in Plot are astounding - curve fitting, smoothing, many buttons that have complicated sounding names.  It all makes me wonder why anyone would create such an elaborate program for free.  Perhaps they make money from donations?  Or perhaps they don't think about money quite as much as I do.  Or maybe that is the reason that the last version was released over two years ago and has not reached 1.0 yet.  &lt;br /&gt;&lt;br /&gt;But good workMichael Wesemann of Berlin!  The world is a slightly better place due to your free program.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/506664790362054788-8647812929986490397?l=jdpatterson.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://jdpatterson.blogspot.com/feeds/8647812929986490397/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=506664790362054788&amp;postID=8647812929986490397' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/506664790362054788/posts/default/8647812929986490397'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/506664790362054788/posts/default/8647812929986490397'/><link rel='alternate' type='text/html' href='http://jdpatterson.blogspot.com/2009/04/plotting-graphs-on-mac.html' title='Plotting graphs on the Mac'/><author><name>John Patterson</name><uri>http://www.blogger.com/profile/07694246973945758038</uri><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-506664790362054788.post-9196563460314212982</id><published>2009-03-05T16:21:00.000-08:00</published><updated>2009-03-05T16:34:52.649-08:00</updated><title type='text'>Thread dump in Jetty</title><content type='html'>Normally if you have a problem with dead-locked threads or you want to know what is taking so long in a running application you can get the JVM to do a thread dump for you by sending the QUIT signal like this:&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;First get the process id using &lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;ps | grep java&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;then send the quit signal&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;kill -QUIT &amp;lt;your-pid&amp;gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;But this was not working for me on my server running Jetty 6.1 as installed by the .deb installation.  The logs showed nothing.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;After a bit of searching on the interweb I found the new (to me) method of generating stack traces using &lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;sudo jstack &amp;lt;pid&amp;gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;This was slightly more helpful and told me:&lt;/div&gt;&lt;div&gt;&lt;br /&gt;"Unable to open socket file: target process not responding or HotSpot VM not loaded"&lt;br /&gt;&lt;br /&gt;At last I had something to go on and found that jstack must be run as the same user as the java process - which in the case of Jetty as installed by the debian install files is "jetty"&lt;br /&gt;&lt;br /&gt;sudo -u jetty jstack &amp;lt;your-pid&amp;gt;&lt;br /&gt;&lt;br /&gt;worked a treat and so did&lt;br /&gt;&lt;br /&gt;sudo -u jetty kill -QUIT &amp;lt;your-pid&amp;gt;&lt;br /&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/506664790362054788-9196563460314212982?l=jdpatterson.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://jdpatterson.blogspot.com/feeds/9196563460314212982/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=506664790362054788&amp;postID=9196563460314212982' title='1 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/506664790362054788/posts/default/9196563460314212982'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/506664790362054788/posts/default/9196563460314212982'/><link rel='alternate' type='text/html' href='http://jdpatterson.blogspot.com/2009/03/thread-dump-in-jetty.html' title='Thread dump in Jetty'/><author><name>John Patterson</name><uri>http://www.blogger.com/profile/07694246973945758038</uri><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-506664790362054788.post-1004134484222642692</id><published>2009-01-19T05:23:00.000-08:00</published><updated>2010-07-21T08:01:55.190-07:00</updated><title type='text'>Debugging in Eclipse very slow</title><content type='html'>&lt;p&gt;I hit a problem developing with App Engine which took me a long time to figure out. &amp;nbsp;I have been flipping between projects so didn't really notice when GAE and GWT started so run so slowly. &amp;nbsp;I have also been experimenting with JRebel and messing with JVM memory parameters. &amp;nbsp;Well "suddenly" every started running really really slowly and App Engine would take around 10 minutes to start up and run my 6 async parallel queries. &amp;nbsp;Was it the new version of App Engine Java introducing a concurrency problem? &amp;nbsp;Was it that my local datastore local_db.bin was too big - holy shit its 10MB!&lt;/p&gt;&lt;p&gt;After a lot of kafuffle I finally removed all break points and viola! &amp;nbsp;Every thing was lightening fast again! &amp;nbsp;What a massive waste of time.&lt;/p&gt;&lt;p&gt;Actually I have just added a really nifty&amp;nbsp;optimisation&amp;nbsp;to &lt;a href="http://code.google.com/p/twig-persist/"&gt;Twig&lt;/a&gt; for when you are merging multiple parent queries (relation index entities) which is needed for Target Rooms geo search. &amp;nbsp;It now asks each child query which entities it wants and gets rid of duplicates before sending off a single request for all of them. &amp;nbsp;When any of the children needs more parent entities it asks this EntitySupplier for more which in turn asks all of the children again if they need any more.&lt;/p&gt;&lt;p&gt;It has speed up the geospatial search HUGELY! &amp;nbsp;I only recently realised that the complex part of the query (searching 6 blocks of geospatial data in parallel and sorting it by price) was completing in about 50ms!!! &amp;nbsp;The simple part (bulk get of the parent results) was taking between 200 and 1200ms to do 6 bulk gets. &amp;nbsp;What a surprise. &amp;nbsp;You can actually see in the &lt;a href="http://code.google.com/status/appengine/detail/datastore/2010/07/13#ae-trust-detail-datastore-get-latency"&gt;Google App Engine Status&lt;/a&gt;&amp;nbsp;page that some days each simple get (not even bulk get) can take like 500ms.&lt;/p&gt;&lt;p&gt;Now Twig combines all bulk gets for each child query into a single bulk get which has made a huge improvement.&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/506664790362054788-1004134484222642692?l=jdpatterson.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://jdpatterson.blogspot.com/feeds/1004134484222642692/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=506664790362054788&amp;postID=1004134484222642692' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/506664790362054788/posts/default/1004134484222642692'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/506664790362054788/posts/default/1004134484222642692'/><link rel='alternate' type='text/html' href='http://jdpatterson.blogspot.com/2009/01/apache-commons-email-client-with-gmail.html' title='Debugging in Eclipse very slow'/><author><name>John Patterson</name><uri>http://www.blogger.com/profile/07694246973945758038</uri><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-506664790362054788.post-6357330353543014726</id><published>2008-11-30T04:08:00.000-08:00</published><updated>2008-11-30T05:23:12.903-08:00</updated><title type='text'>Firefox Radio Button Alignment</title><content type='html'>I have been doing a bit of front end work on a web site and while I am still developing ideas I have been viewing my results in Safari because that it allows me to use cool CSS 3 effects like -webkit-box-shadow and -webkit-border-radius for rounded corners.  This is great for design mock ups because it is so much quicker than creating bitmaps and then maybe deciding not to use them.&lt;p&gt;I can see that WebKit also has a lot more install for Safari users with &lt;a href="http://webkit.org/blog/175/introducing-css-gradients/"&gt;gradients&lt;/a&gt;, &lt;a href="http://webkit.org/blog/181/css-masks/"&gt;masks&lt;/a&gt; and &lt;a href="http://www.sitepoint.com/blogs/2008/04/25/css-gradients-transforms-animations-and-masks/"&gt;more&lt;/a&gt;.  But my current version of Safari does not include these features yet.&lt;/p&gt;&lt;p&gt;But then I noticed that when I looked at my page on FireFox all the radio buttons seemed out of alignment and looked very messy.  I wasted hours trying to figure out if my style sheet was the culprit. Then I noticed that even Google looked weird so it was not something I was doing to mess up the formatting:&lt;/p&gt;&lt;p&gt;Safari:&lt;/p&gt;&lt;p&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://3.bp.blogspot.com/_7B93mJJvwto/STKGsP3G9jI/AAAAAAAAAAc/kAcKR6VMBgE/s1600-h/Picture+2.png"&gt;&lt;img style="margin: 0pt 10px 10px 0pt; float: left; cursor: pointer; width: 400px; height: 69px;" src="http://3.bp.blogspot.com/_7B93mJJvwto/STKGsP3G9jI/AAAAAAAAAAc/kAcKR6VMBgE/s400/Picture+2.png" alt="" id="BLOGGER_PHOTO_ID_5274426208334313010" border="0" /&gt;&lt;/a&gt;&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;Internet Explorer:&lt;br /&gt;&lt;/p&gt;&lt;p&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://2.bp.blogspot.com/_7B93mJJvwto/STKStET5KGI/AAAAAAAAAAs/9UD89QqllPM/s1600-h/Picture+5.png"&gt;&lt;img style="margin: 0pt 10px 10px 0pt; float: left; cursor: pointer; width: 400px; height: 83px;" src="http://2.bp.blogspot.com/_7B93mJJvwto/STKStET5KGI/AAAAAAAAAAs/9UD89QqllPM/s400/Picture+5.png" alt="" id="BLOGGER_PHOTO_ID_5274439416553220194" border="0" /&gt;&lt;/a&gt;&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;Firefox:&lt;/p&gt;&lt;p&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://2.bp.blogspot.com/_7B93mJJvwto/STKHAHKRDnI/AAAAAAAAAAk/xLn2yoNZ3DM/s1600-h/Picture+3.png"&gt;&lt;img style="margin: 0pt 10px 10px 0pt; float: left; cursor: pointer; width: 400px; height: 96px;" src="http://2.bp.blogspot.com/_7B93mJJvwto/STKHAHKRDnI/AAAAAAAAAAk/xLn2yoNZ3DM/s400/Picture+3.png" alt="" id="BLOGGER_PHOTO_ID_5274426549596130930" border="0" /&gt;&lt;br /&gt;&lt;/a&gt;&lt;br /&gt;&lt;/p&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;Notice how the radio buttons seem to float above the text.&lt;br /&gt;&lt;br /&gt;After a bit of experimenting with various alignment options I found that setting vertical-align: text-top made the alignment look OK in Safari and Firefox but terrible in IE.&lt;br /&gt;&lt;br /&gt;For now I have given up on Firefox and just accept that its looks a bit shit.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/506664790362054788-6357330353543014726?l=jdpatterson.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://jdpatterson.blogspot.com/feeds/6357330353543014726/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=506664790362054788&amp;postID=6357330353543014726' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/506664790362054788/posts/default/6357330353543014726'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/506664790362054788/posts/default/6357330353543014726'/><link rel='alternate' type='text/html' href='http://jdpatterson.blogspot.com/2008/11/firefox-radio-button-alignment.html' title='Firefox Radio Button Alignment'/><author><name>John Patterson</name><uri>http://www.blogger.com/profile/07694246973945758038</uri><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/_7B93mJJvwto/STKGsP3G9jI/AAAAAAAAAAc/kAcKR6VMBgE/s72-c/Picture+2.png' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-506664790362054788.post-7798697048484052468</id><published>2008-11-20T07:13:00.000-08:00</published><updated>2008-11-20T09:35:16.572-08:00</updated><title type='text'>Copying music off an iPod</title><content type='html'>My external hard drive broke taking with it my iTunes library.  All my music is also on my 80GB iPod but iTunes annoyingly does not let you copy music from your iPod back to your computer.  I guess it was one of the conditions Apple negotiated with the record companies when setting up the iTunes store.&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;When my iPod is connected to my Mac Mini it shows in the Finder as an external hard drive but the music folder is hidden.  From the command line&lt;br /&gt;&lt;/div&gt;&lt;br /&gt;&lt;pre&gt;&lt;br /&gt;john@mini:~$ ll /Volumes/John\ Patterson’s\ iPod/&lt;br /&gt;total 64&lt;br /&gt;drwxr-xr-x   4 john  staff   136B 30 May 19:55 Backup&lt;br /&gt;drwxr-xr-x   2 john  staff    68B  1 Jan  2000 Calendars&lt;br /&gt;drwxr-xr-x   2 john  staff    68B  1 Jan  2000 Contacts&lt;br /&gt;-rw-r--r--@  1 john  staff   1.0K 16 Dec  2007 Desktop DB&lt;br /&gt;-rw-r--r--@  1 john  staff     2B 16 Dec  2007 Desktop DF&lt;br /&gt;drwxr-xr-x   3 john  staff   102B  1 Jan  2000 Notes&lt;br /&gt;drwxr-xr-x   6 john  staff   204B 18 May  2008 Photos&lt;br /&gt;drwxr-xr-x   2 john  staff    68B  1 Jan  2000 Recordings&lt;br /&gt;drwxr-xr-x@ 11 john  staff   374B 16 Dec  2007 iPod_Control&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;Now we can see the iPod_Control directory that contains all the music&lt;br /&gt;Simply copy the music onto your local disc:&lt;br /&gt;&lt;pre&gt;&lt;br /&gt;john@mini:~$ cp -r /Volumes/John\ Patterson’s\ iPod/iPod_Control/Music/ /Volumes/External/Music/iPod&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;The folders are still hidden so you need to remove the hidden attribute like this&lt;br /&gt;&lt;br /&gt;&lt;pre&gt;xattr -d com.apple.FinderInfo /Volumes/External/Music/iPod/F*&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;And when that is done drag the whole folder onto your iTunes icon and all the music files will be imported into your current library.  If you have iTunes set up to keep your music folders organised it will rename the cryptically named music files and create correctly named folders for you.  Neat.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/506664790362054788-7798697048484052468?l=jdpatterson.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://jdpatterson.blogspot.com/feeds/7798697048484052468/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=506664790362054788&amp;postID=7798697048484052468' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/506664790362054788/posts/default/7798697048484052468'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/506664790362054788/posts/default/7798697048484052468'/><link rel='alternate' type='text/html' href='http://jdpatterson.blogspot.com/2008/11/copying-music-off-ipod.html' title='Copying music off an iPod'/><author><name>John Patterson</name><uri>http://www.blogger.com/profile/07694246973945758038</uri><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-506664790362054788.post-9188183816494212994</id><published>2008-11-13T12:01:00.001-08:00</published><updated>2008-11-13T12:31:21.791-08:00</updated><title type='text'>Watching BBC online overseas</title><content type='html'>I need to watch the &lt;a href="http://www.allblacks.com/fixtures/"&gt;All Black playing Ireland on Sunday&lt;/a&gt; but here in Spain I have no idea where to watch the game with English commentary.  BBC makes a lot of video content available on their website but only if you are in the UK.&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;I have servers running in the UK and knew it must be possible to somehow use them as a proxy so that the British Broadcasting Commissioners think that I too am in old Blighty.  But how to hook it all up?&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;After a bit of Googling on the interweb I discovered that OpenSSH can be used as a SOCKS proxy which creates a secure connection to any server you can ssh into and then fires off your requests from there.  OpenSSH is the flavour of SSH that runs on Mac OS X so all I had to do was type this at the terminal to start the proxy:&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;ssh -ND 9999 myserver.co.uk&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;The -N just tells ssh that I don't want to send any commands - just set up the proxy and listen on local port 9999.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;Then you need to tell your browser to use the SOCKS proxy.  Safari proxy settings are just the system wide network preferences.  Just click on advanced and then Proxies and add a SOCKS proxy at localhost port 9999 and voila!.  But I don't want all my browsing to use the proxy - most sites should connect directly.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;So I installed the handy little FireFox plugin, &lt;a href="http://foxyproxy.mozdev.org/"&gt;FoxyProxy&lt;/a&gt;, which can selectively send some requests through the proxy and not others.  It looks pretty flexible but I simply set it to use my proxy for all URL's and then used Safari as normal for direct browsing.  &lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;Now I can watch Top Gear on BBC too!  And also, when I look at my website which has advertising including Google AdSense and Yahoo PPC ads I can see the same ads that users of my site in the UK see!&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;Nice.&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/506664790362054788-9188183816494212994?l=jdpatterson.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://jdpatterson.blogspot.com/feeds/9188183816494212994/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=506664790362054788&amp;postID=9188183816494212994' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/506664790362054788/posts/default/9188183816494212994'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/506664790362054788/posts/default/9188183816494212994'/><link rel='alternate' type='text/html' href='http://jdpatterson.blogspot.com/2008/11/watching-bbc-sports-overseas.html' title='Watching BBC online overseas'/><author><name>John Patterson</name><uri>http://www.blogger.com/profile/07694246973945758038</uri><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-506664790362054788.post-417825945936744762</id><published>2008-11-04T11:47:00.000-08:00</published><updated>2008-11-05T02:37:32.141-08:00</updated><title type='text'>Filtering resources in Eclipse</title><content type='html'>When you have a lot of files in an Eclipse 3.4 workspace things pretty much grind to a halt.  I have a folder containing 200,000 images for a web project I'm working on and I need to include in the workspace.  Starting Eclipse with this folder takes forever and Subversive hangs trying to to something with all the files.&lt;br /&gt;&lt;div&gt;&lt;br /&gt;I filed a bug report on this issue 3 years ago!  https://bugs.eclipse.org/bugs/show_bug.cgi?id=84988.  Eclipse development seems to move slowly.&lt;br /&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;I can exclude files from the Package Explore using a filter but the problem remains.  Under the covers Eclipse is still monitoring these files at the resource level.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;I found this plugin which claims to do what I want but I could not get it to work for me.&lt;br /&gt;&lt;br /&gt;https://sourceforge.net/projects/eclipseresfltr/&lt;br /&gt;&lt;br /&gt;Some people have posted about adding a "resource filter" to filter out files at a lower level&lt;br /&gt;&lt;/div&gt;&lt;div&gt;In the Resource Navigator (Window -&gt; Show View -&gt; Navigator) you can choose to filter resources that match .* or *.class but you cannot add your own filters.  These default ones are added by plugins as extension points.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;But you can add your own filters by messing with an existing Plugin and adding a filter definition to its plugin.xml.  Just find a plugin that is not in a jar file - they are signed so you cannot alter their contents.  I chose the jdt plugin org.eclipse.jdt.debug_3.4.0.v20080604 and added this to its plugin.xml&lt;br /&gt;&lt;br /&gt;&amp;lt;extension point="org.eclipse.ui.ide.resourceFilters"&amp;gt;&lt;br /&gt;  &amp;lt;filter selected="false" pattern="my-large-folder"&amp;gt;&amp;lt;/filter&amp;gt;&lt;br /&gt;&amp;lt;/extension&amp;gt;&lt;extension point="org.eclipse.ui.ide.resourceFilters"&gt;&lt;br /&gt; &lt;filter selected="true" pattern="my-big-folder"&gt;&lt;/filter&gt;&lt;/extension&gt;&lt;br /&gt;However, this does NOT stop the resources from being scanned for updates for some reason.  It just hides the folder from view but my machine was still pegged on close to 100% CPU.&lt;br /&gt;&lt;br /&gt;Then I re-read one of the comments on my bug report above and finally solved the problem.&lt;br /&gt;&lt;ol&gt;&lt;li&gt;Move the large folder outside your workspace.&lt;/li&gt;&lt;li&gt;In the Package Explorer New -&gt; File&lt;/li&gt;&lt;li&gt;Enter the name of the large folder as the filename&lt;/li&gt;&lt;li&gt;Click Advanced and check "Link to file in the filesystem"&lt;/li&gt;&lt;li&gt;Enter /dev/null (on Mac OS X) and click finish&lt;br /&gt;&lt;/li&gt;&lt;li&gt;Move the large folder back to your workspace.&lt;br /&gt;&lt;/li&gt;&lt;/ol&gt;&lt;/div&gt;&lt;div&gt;Now the null file hides your folder.  I also added a filter to the Package Exploer so the linked null file does not show.  Now when I refresh the workspace or restart my machine no longer hangs.  Nice one.&lt;br /&gt;&lt;br /&gt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/506664790362054788-417825945936744762?l=jdpatterson.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://jdpatterson.blogspot.com/feeds/417825945936744762/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=506664790362054788&amp;postID=417825945936744762' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/506664790362054788/posts/default/417825945936744762'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/506664790362054788/posts/default/417825945936744762'/><link rel='alternate' type='text/html' href='http://jdpatterson.blogspot.com/2008/11/filtering-resources-in-eclipse.html' title='Filtering resources in Eclipse'/><author><name>John Patterson</name><uri>http://www.blogger.com/profile/07694246973945758038</uri><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></feed>
