<?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-13473243</id><updated>2012-01-23T12:55:54.442Z</updated><category term='mobile'/><category term='sysadmin'/><category term='maven'/><category term='boys'/><category term='megadata'/><category term='scaling'/><category term='social responsibility'/><category term='objective-c'/><category term='firefox'/><category term='atom jabber xmpp predictions'/><category term='iphone'/><category term='git'/><category term='lakes'/><category term='rails'/><category term='eclipse'/><category term='vodafone'/><category term='hg'/><category term='aws'/><category term='mobileweb'/><category term='blogs'/><category term='facebook'/><category term='scheme'/><category term='diy'/><category term='cameron'/><category term='java'/><category term='cloudfront'/><category term='rants'/><category term='graphite'/><category term='2007'/><category term='wireshark'/><category term='django'/><category term='spain'/><category term='albarracin'/><category term='networking'/><category term='rest'/><category term='climbing'/><category term='gears'/><category term='android'/><category term='baby'/><category term='jaxp'/><category term='mac'/><category term='atom'/><category term='bouldering'/><category term='etags'/><category term='quality'/><category term='scalecamp'/><category term='ubuntu'/><category term='jython'/><category term='oakley'/><category term='vcs'/><category term='karmic'/><category term='vista'/><category term='google'/><category term='svn'/><category term='subversion'/><category term='ruby'/><category term='cryptography'/><category term='javascript'/><category term='apple'/><category term='redis'/><category term='al'/><category term='hacking'/><category term='tomcat'/><category term='mockobjects'/><category term='http'/><category term='osx'/><category term='disruptivechange'/><category term='surgery'/><category term='novarra'/><category term='python'/><category term='amazon'/><category term='wpo'/><category term='windows'/><category term='jmx'/><category term='pipes'/><category term='it support'/><category term='linux'/><category term='recovery'/><category term='appstore'/><category term='guide'/><category term='yorkshire'/><category term='windows problems humour'/><category term='migration'/><category term='repl'/><category term='props'/><category term='backups'/><category term='monitoring'/><category term='font'/><category term='cdn'/><category term='rugby'/><category term='widefinder'/><category term='rwc'/><category term='wikipedia'/><category term='firefox browsers'/><category term='wireless'/><category term='minify'/><category term='closure'/><category term='search'/><category term='microsoft'/><category term='career'/><category term='conneg'/><category term='jruby'/><category term='caching'/><category term='virtualisation'/><title type='text'>James' Pad</title><subtitle type='html'>Musings on my family, work and things I find interesting. Mainly, this was / is intended to record things for my kids so that they can get an insight into how I feel about them, plus I haven't done any writing for a long time, so would like to get some skill in that sphere again.</subtitle><link rel='http://schemas.google.com/g/2005#feed' type='application/atom+xml' href='http://eternusuk.blogspot.com/feeds/posts/default'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/13473243/posts/default?max-results=100'/><link rel='alternate' type='text/html' href='http://eternusuk.blogspot.com/'/><link rel='hub' href='http://pubsubhubbub.appspot.com/'/><link rel='next' type='application/atom+xml' href='http://www.blogger.com/feeds/13473243/posts/default?start-index=101&amp;max-results=100'/><author><name>James Abley</name><uri>http://www.blogger.com/profile/10389773375250732709</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>161</openSearch:totalResults><openSearch:startIndex>1</openSearch:startIndex><openSearch:itemsPerPage>100</openSearch:itemsPerPage><entry><id>tag:blogger.com,1999:blog-13473243.post-2424531401457541592</id><published>2011-12-16T13:02:00.008Z</published><updated>2011-12-16T14:20:12.339Z</updated><category scheme='http://www.blogger.com/atom/ns#' term='subversion'/><category scheme='http://www.blogger.com/atom/ns#' term='osx'/><category scheme='http://www.blogger.com/atom/ns#' term='mac'/><category scheme='http://www.blogger.com/atom/ns#' term='vcs'/><title type='text'>svn merging on OSX</title><content type='html'>I don't always use &lt;code&gt;svn&lt;/code&gt; as a version control system with which I'll need to merge branches, but when I do, I use &lt;a href=""http://www.defraine.net/~brunod/fmdiff/"&gt;fmdiff&lt;/a&gt;.&lt;br /&gt;&lt;br /&gt;&lt;code&gt;$ brew install fmdiff&lt;/code&gt;&lt;br /&gt;&lt;br /&gt;One minor annoyance - &lt;code&gt;fmmerge&lt;/code&gt; (used for interactive conflict resolution) doesn't work. The number of arguments passed to the script has changed since it was first written. I patched it locally, but it still didn't work. FileMerge was launched, I could edit files, etc; but it kept saying that the merge needed resolving. Instead, I just postpone all merge conflicts during the merge, and then use &lt;code&gt;fmresolve&lt;/code&gt; and &lt;code&gt;svn resolve&lt;/code&gt; to resolve any individual merge conflicts.&lt;br /&gt;&lt;br /&gt;[1] I like to branch by feature typically, but occasionally, branch by VCS is used.&lt;div class="blogger-post-footer"&gt;All content Copyright 2005, 2006 James Abley&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/13473243-2424531401457541592?l=eternusuk.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://eternusuk.blogspot.com/feeds/2424531401457541592/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=13473243&amp;postID=2424531401457541592' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/13473243/posts/default/2424531401457541592'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/13473243/posts/default/2424531401457541592'/><link rel='alternate' type='text/html' href='http://eternusuk.blogspot.com/2011/12/svn-merging-on-osx.html' title='svn merging on OSX'/><author><name>James Abley</name><uri>http://www.blogger.com/profile/10389773375250732709</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-13473243.post-5219642842944192189</id><published>2011-10-04T18:31:00.003+01:00</published><updated>2011-10-04T18:35:53.595+01:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='javascript'/><category scheme='http://www.blogger.com/atom/ns#' term='wpo'/><category scheme='http://www.blogger.com/atom/ns#' term='minify'/><category scheme='http://www.blogger.com/atom/ns#' term='closure'/><title type='text'>Minifying Javascript at runtime</title><content type='html'>&lt;a href="http://www.stevesouders.com/"&gt;Steve Souders&lt;/a&gt; &lt;a href="http://twitter.com/souders/status/121257539936591874"&gt;pointed&lt;/a&gt; at &lt;a href="http://www.aliaspooryorik.com/blog/index.cfm/e/posts.details/post/340"&gt;this&lt;/a&gt; today; I've done something similar in the past, but I struggled somewhat with the documentation. Hopefully this might be useful to others.&lt;br /&gt;&lt;br /&gt;&lt;script src="https://gist.github.com/1262250.js?file=ClosureMinifier.java"&gt;&lt;/script&gt;&lt;br /&gt;&lt;br /&gt;As part of a product that serves as a rendering runtime for mobile, this allows authors to create Javascript, and the runtime can optimise and cache on the fly. We like it!&lt;div class="blogger-post-footer"&gt;All content Copyright 2005, 2006 James Abley&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/13473243-5219642842944192189?l=eternusuk.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://eternusuk.blogspot.com/feeds/5219642842944192189/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=13473243&amp;postID=5219642842944192189' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/13473243/posts/default/5219642842944192189'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/13473243/posts/default/5219642842944192189'/><link rel='alternate' type='text/html' href='http://eternusuk.blogspot.com/2011/10/minifying-javascript-at-runtime.html' title='Minifying Javascript at runtime'/><author><name>James Abley</name><uri>http://www.blogger.com/profile/10389773375250732709</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-13473243.post-1327081096242777738</id><published>2011-09-27T11:20:00.002+01:00</published><updated>2011-09-27T11:27:27.267+01:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='graphite'/><category scheme='http://www.blogger.com/atom/ns#' term='python'/><category scheme='http://www.blogger.com/atom/ns#' term='osx'/><category scheme='http://www.blogger.com/atom/ns#' term='monitoring'/><category scheme='http://www.blogger.com/atom/ns#' term='mac'/><title type='text'>Installing Graphite on OSX (Snow Leopard)</title><content type='html'>This wasn't entirely straightforward, so in the hope that it's useful for others:&lt;br /&gt;&lt;br /&gt;python on Snow Leopard doesn't seem to come with the development headers, so we need to address that, since pycairo needs them.&lt;br /&gt;&lt;pre&gt;$ brew install python&lt;/pre&gt;&lt;ul&gt;&lt;li&gt;edit the PATH to have /usr/local/share/python at the start&lt;/li&gt;&lt;li&gt;open a new shell to recognise the new PATH&lt;/li&gt;&lt;li&gt;install cairo as per &lt;a href="http://stackoverflow.com/questions/6886578/how-to-install-pycairo-1-10-on-mac-osx-with-default-python"&gt;http://stackoverflow.com/questions/6886578/how-to-install-pycairo-1-10-on-mac-osx-with-default-python&lt;/a&gt;&lt;/li&gt;&lt;li&gt;I do --use-gcc since it doesn't work with LLVM / LLVM-based GCC.&lt;/li&gt;&lt;/ul&gt;&lt;div class="preformatted panel" style="border-width: 1px;"&gt;&lt;div class="preformattedContent panelContent"&gt; &lt;pre&gt;$ brew install cairo --use-gcc&lt;br /&gt;$ wget http://cairographics.org/releases/py2cairo-1.10.0.tar.bz2&lt;br /&gt;$ tar xjf py2cairo-1.10.0.tar.bz2&lt;br /&gt;$ pushd py2cairo-1.10.0&lt;br /&gt;$ emacs wscript&lt;br /&gt;$ export CC=/usr/bin/gcc&lt;br /&gt;$ export PKG_CONFIG_PATH=/usr/local/Cellar/cairo/1.10.2/lib/pkgconfig/&lt;br /&gt;$ python waf configure&lt;br /&gt;$ python waf build&lt;br /&gt;$ python waf install &lt;/pre&gt; &lt;/div&gt;&lt;/div&gt; &lt;p&gt;Now install python dependencies&lt;/p&gt; &lt;div class="preformatted panel" style="border-width: 1px;"&gt;&lt;div class="preformattedContent panelContent"&gt; &lt;pre&gt;$ pip install django&lt;br /&gt;$ pip install django-tagging&lt;br /&gt;$ pip install twisted&lt;br /&gt;$ pushd path/to/graphite/&lt;br /&gt;$ pushd whisper&lt;br /&gt;$ python setup.py install&lt;br /&gt;$ popd&lt;br /&gt;$ pushd carbon&lt;br /&gt;$ python setup.py install&lt;br /&gt;$ popd &lt;br /&gt;$ python check-dependencies.py&lt;br /&gt;$ python setup.py install&lt;br /&gt;$ pushd /opt/graphite/webapp&lt;br /&gt;$ export PYTHON_PATH=${PYTHON_PATH}:/opt/graphite/webapp&lt;br /&gt;$ pushd graphite&lt;br /&gt;$ python manage.py syncdb &lt;/pre&gt; &lt;/div&gt;&lt;/div&gt; &lt;p&gt;Grabbed this file and put it in /opt/graphite/bin. That means I don't need to setup apache httpd locally.&lt;/p&gt; &lt;div class="preformatted panel" style="border-width: 1px;"&gt;&lt;div class="preformattedContent panelContent"&gt; &lt;pre&gt;$ wget https://raw.github.com/tmm1/graphite/d0f76a659f4f2dea67f19902002710f601f534aa/bin/run-graphite-devel-server.py&lt;br /&gt;$ python /opt/graphite/bin/carbon-cache.py start&lt;br /&gt;$ python /opt/graphite/bin/run-graphite-devel-server.py /opt/graphite &lt;/pre&gt; &lt;/div&gt;&lt;/div&gt; &lt;p&gt;Browse to &lt;a href="http://localhost:8080/"&gt;http://localhost:8080/&lt;/a&gt; and I have a graphite webapp running&lt;/p&gt; &lt;div class="preformatted panel" style="border-width: 1px;"&gt;&lt;div class="preformattedContent panelContent"&gt; &lt;pre&gt;$ python path/to/graphite/examples/example-client.py &lt;/pre&gt; &lt;/div&gt;&lt;/div&gt;  &lt;p&gt;I now have a script putting data into graphite. Might want to tweak  local_settings.py (make it Europe/London, for example), and  conf/carbon.conf to have reasonable retention periods / file sizes for  the whisper data files.&lt;/p&gt;&lt;p&gt;Related links:&lt;/p&gt;&lt;ul&gt;&lt;li&gt;&lt;a href="http://stackoverflow.com/questions/7138076/installing-graphite-on-os-x-lion-how-to-configure-apache2"&gt;http://stackoverflow.com/questions/7138076/installing-graphite-on-os-x-lion-how-to-configure-apache2&lt;/a&gt;&lt;/li&gt;&lt;li&gt;&lt;a href="http://stackoverflow.com/questions/1811783/how-do-you-install-pycairo-on-mac-os-x"&gt;http://stackoverflow.com/questions/1811783/how-do-you-install-pycairo-on-mac-os-x&lt;/a&gt;&lt;/li&gt;&lt;li&gt;&lt;a href="http://stackoverflow.com/questions/6886578/how-to-install-pycairo-1-10-on-mac-osx-with-default-python"&gt;http://stackoverflow.com/questions/6886578/how-to-install-pycairo-1-10-on-mac-osx-with-default-python&lt;/a&gt;&lt;br /&gt;&lt;/li&gt;&lt;/ul&gt;&lt;div class="blogger-post-footer"&gt;All content Copyright 2005, 2006 James Abley&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/13473243-1327081096242777738?l=eternusuk.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://eternusuk.blogspot.com/feeds/1327081096242777738/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=13473243&amp;postID=1327081096242777738' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/13473243/posts/default/1327081096242777738'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/13473243/posts/default/1327081096242777738'/><link rel='alternate' type='text/html' href='http://eternusuk.blogspot.com/2011/09/installing-graphite-on-osx-snow-leopard.html' title='Installing Graphite on OSX (Snow Leopard)'/><author><name>James Abley</name><uri>http://www.blogger.com/profile/10389773375250732709</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-13473243.post-7429596223372406633</id><published>2011-05-31T23:17:00.000+01:00</published><updated>2011-05-31T23:21:15.623+01:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='http'/><category scheme='http://www.blogger.com/atom/ns#' term='caching'/><category scheme='http://www.blogger.com/atom/ns#' term='mobile'/><category scheme='http://www.blogger.com/atom/ns#' term='conneg'/><category scheme='http://www.blogger.com/atom/ns#' term='mobileweb'/><title type='text'>Content Negotiation on Mobile considered harmful</title><content type='html'>This is kind of a follow up to &lt;a href="http://www.blogger.com/2011/01/creating-custom-origin-server-for.html"&gt;my previous post on using Amazon CloudFront&lt;/a&gt;.&lt;br /&gt;&lt;br /&gt;This post is to cover conneg, or &lt;a href="http://en.wikipedia.org/wiki/Content_negotiation"&gt;Content Negotiation&lt;/a&gt;.&lt;br /&gt;&lt;br /&gt;TL;DR - use HTTP as designed and &lt;a href="http://developer.yahoo.com/performance/rules.html"&gt;follow the rules&lt;/a&gt;.&lt;br /&gt;&lt;br /&gt;Alice tries to access http://example.com/ on her iPhone. She gets back some HTML which references some images.&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;img style="display:block; margin:0px auto 10px; text-align:center;cursor:pointer; cursor:hand;width: 222px; height: 211px;" src="http://www.websequencediagrams.com/cgi-bin/cdraw?lz=cGFydGljaXBhbnQgQWxpY2UgYXMgQQoACwxTZXJ2ZXIgYXMgUwoKQS0-UzogR0VUIC8KUy0-QTogaHRtbCByZXNwb25zZQoK&amp;amp;s=napkin" alt="" border="0" /&gt;&lt;br /&gt;&lt;br /&gt;The markup returned to Alice contains references to 3 images. I'll just look at the first one.&lt;br /&gt;&lt;br /&gt;&lt;img style="display:block; margin:0px auto 10px; text-align:center;cursor:pointer; cursor:hand;width: 222px; height: 211px;" src="http://www.websequencediagrams.com/cgi-bin/cdraw?lz=cGFydGljaXBhbnQgQWxpY2UgYXMgQQoACwxTZXJ2ZXIgYXMgUwoKQS0-UzogR0VUIC9pbWFnZXMvMQpTLT5BOiAzMjB4ODAgUE5HIAAVBQoK&amp;amp;s=napkin" /&gt;&lt;br /&gt;&lt;br /&gt;Alice's iPhone made a request for /images/1 and got back a 320x80px PNG image, since we have a clever server-side component which knows about different user-agents and tries to serve the most suitable version of an image for each client.&lt;br /&gt;&lt;br /&gt;Along comes Bob. Bob is using a Google Nexus One. He similarly requests our home page and gets back a link to /images/1. When the Nexus One requests that resource though, it gets back a 420x120px PNG, again thanks to our fancy server-side detection.&lt;br /&gt;&lt;br /&gt;What does this do to our &lt;a href="http://tomayko.com/writings/things-caches-do"&gt;caching&lt;/a&gt;? Well, it stuffs it up completely.&lt;br /&gt;&lt;ol&gt;&lt;li&gt;We're using a canonical URI for the image - /images/1.&lt;/li&gt;&lt;li&gt;We're serving different representations of the image from the same URL.&lt;/li&gt;&lt;li&gt;We cannot easily specify &lt;a href="http://developer.yahoo.com/performance/rules.html#expires"&gt;good HTTP&lt;/a&gt; &lt;a href="http://www.mnot.net/cache_docs/#CACHE-CONTROL"&gt;expiration directives&lt;/a&gt;.&lt;/li&gt;&lt;/ol&gt;Going into point 3 in more detail, we cannot use the Vary header in our response to try to let proxy caches more efficiently. Vary can only specify a request header. This means that something like the User-Agent doesn't work:&lt;br /&gt;&lt;ol&gt;&lt;li&gt;There are &lt;a href="http://deviceatlas.com/devices"&gt;many thousand&lt;/a&gt; User-Agent strings in existence.&lt;/li&gt;&lt;li&gt;How different are these 2 anyway?&lt;ul&gt;&lt;li&gt;Mozilla/5.0 (iPhone; U; CPU iPhone OS 3_0_1 like Mac OS X; en-us) AppleWebKit/528.18 (KHTML, like Gecko)&lt;/li&gt;&lt;li&gt;Mozilla/5.0 (iPhone; U; CPU iPhone OS 3_0_1 like Mac OS X; en-us) AppleWebKit/528.18 (KHTML, like Gecko) Mobile/7A400&lt;/li&gt;&lt;/ul&gt;&lt;/li&gt;&lt;/ol&gt;Let's be conservative and say that there are 5000 different User-Agents hitting our site. That means that we could be telling proxy servers to cache 5000 copies of /images/1, rather than the perhaps 7 different sizes that our application might produce.&lt;br /&gt;&lt;br /&gt;So alternatives to conneg?&lt;br /&gt;&lt;ul&gt;&lt;li&gt;Use a distinct URI for every bag of bytes that the application can serve. This means that your server-side markup generation needs to be a little smarter, so that you render markup containing /images/1/320x80 and /images/1/480x120 for example (see the point in my CloudFront post about not wanting to use query string parameters for this information).&lt;br /&gt;&lt;/li&gt;&lt;li&gt;It's still possible to support the old canonical URLs, either by continuing to perform conneg, or redirecting appropriately.&lt;br /&gt;&lt;/li&gt;&lt;li&gt;Rev your URIs so that you can happily set Far Future Expires directives on these resources; i.e. if the image changes, give it a new URI.&lt;/li&gt;&lt;/ul&gt;I'm still musing on what this means for progressive enhancement. &lt;a href="http://blog.trasatti.it/2011/05/responsive-images-and-tinysrc.html"&gt;Andrea's post&lt;/a&gt; looks like a step in the right direction though.&lt;div class="blogger-post-footer"&gt;All content Copyright 2005, 2006 James Abley&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/13473243-7429596223372406633?l=eternusuk.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://eternusuk.blogspot.com/feeds/7429596223372406633/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=13473243&amp;postID=7429596223372406633' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/13473243/posts/default/7429596223372406633'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/13473243/posts/default/7429596223372406633'/><link rel='alternate' type='text/html' href='http://eternusuk.blogspot.com/2011/03/content-negotiation-on-mobile.html' title='Content Negotiation on Mobile considered harmful'/><author><name>James Abley</name><uri>http://www.blogger.com/profile/10389773375250732709</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-13473243.post-9059901039971428984</id><published>2011-02-08T20:32:00.002Z</published><updated>2011-02-08T20:54:49.618Z</updated><category scheme='http://www.blogger.com/atom/ns#' term='java'/><category scheme='http://www.blogger.com/atom/ns#' term='guide'/><category scheme='http://www.blogger.com/atom/ns#' term='mac'/><category scheme='http://www.blogger.com/atom/ns#' term='iphone'/><category scheme='http://www.blogger.com/atom/ns#' term='objective-c'/><title type='text'>Objective-C concurrency issues</title><content type='html'>Disclaimer - I've not shipped Java Swing / SWT apps. I'm a server guy where markup is the UI. Consequently, I don't have in-depth knowledge of Java to compare against. I'm aware of &lt;a href="http://download.oracle.com/javase/6/docs/api/javax/swing/SwingUtilities.html#invokeLater(java.lang.Runnable)"&gt;SwingUtilities.invokeLater(Runnable)&lt;/a&gt; but otherwise just assume I'm clueless about Swing.&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;First rule of GUI programming - don't block the main thread.&lt;/div&gt;&lt;div&gt;Second rule of GUI programming - don't block the main thread, etc.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;Quantifying this, you have a device running at a refresh rate of 60Hz. So you if you do anything in the main thread, you need it to complete in under 16ms, or your UI will not be smooth and responsive.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;In Java, I would normally look at &lt;a href="http://download.oracle.com/javase/6/docs/api/java/util/concurrent/Executor.html"&gt;Executor&lt;/a&gt;s, &lt;a href="http://download.oracle.com/javase/6/docs/api/java/util/concurrent/Callable.html"&gt;Callable&lt;/a&gt;s, &lt;a href="http://download.oracle.com/javase/6/docs/api/java/lang/Runnable.html"&gt;Runnable&lt;/a&gt;s and related APIs to do things off the main thread. In Objective-C, we have &lt;a href="http://www.google.co.uk/search?ie=UTF-8&amp;amp;q=nsoperationqueue"&gt;NSOperationQueue&lt;/a&gt; and &lt;a href="http://www.google.co.uk/search?ie=UTF-8&amp;amp;q=nsoperation"&gt;NSOperation&lt;/a&gt;. Learn, use and love them. In particular, don't do what I did and start porting java.util.concurrent classes to Objective-C. I wrote a CountdownLatch, which was very nice and taught me about various low-level concurrency primitives. Unfortunately it was completely the wrong solution for the language. What I should have done was to use &lt;a href="http://www.google.co.uk/search?&amp;amp;ie=UTF-8&amp;amp;q=nsoperation+adddependency"&gt;[NSOperation addDependency:]&lt;/a&gt; to chain tasks together.&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;All content Copyright 2005, 2006 James Abley&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/13473243-9059901039971428984?l=eternusuk.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://eternusuk.blogspot.com/feeds/9059901039971428984/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=13473243&amp;postID=9059901039971428984' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/13473243/posts/default/9059901039971428984'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/13473243/posts/default/9059901039971428984'/><link rel='alternate' type='text/html' href='http://eternusuk.blogspot.com/2011/02/objective-c-concurrency-issues.html' title='Objective-C concurrency issues'/><author><name>James Abley</name><uri>http://www.blogger.com/profile/10389773375250732709</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-13473243.post-7297420275710157931</id><published>2011-02-08T20:19:00.003Z</published><updated>2011-02-08T20:28:38.643Z</updated><category scheme='http://www.blogger.com/atom/ns#' term='java'/><category scheme='http://www.blogger.com/atom/ns#' term='guide'/><category scheme='http://www.blogger.com/atom/ns#' term='iphone'/><category scheme='http://www.blogger.com/atom/ns#' term='objective-c'/><title type='text'>Objective-C tooling</title><content type='html'>Java development tools are top of the pile out of anything I've used. The IDEs are massively powerful (they have to be, with the warts on the language). I'm also an emacs user day to day, and pragmatically use vim as well. But Eclipse / IDEA / Netbeans are pretty amazing tools for Java The Language development.&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;Respectively for Objective-C development, Xcode isn't.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;If Apple Ts&amp;amp;Cs allow, IntelliJ could probably make some impressive inroads into that market.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;a href="http://clang.llvm.org/"&gt;clang&lt;/a&gt; is a good (and getting better all the time) addition. The debugger needs some love; I don't find gdb as powerful as Java debuggers.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;In Java-land, one can use maven, ant, ivy, Make, etc to build a project. For iOS development, the IDE rules a lot from the off. There is a command-line tool which can potentially be driven by Jenkins or Thoughtworks Go. That would be my preferred option going forward; in my view, building in an IDE is not a repeatable build process.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;All content Copyright 2005, 2006 James Abley&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/13473243-7297420275710157931?l=eternusuk.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://eternusuk.blogspot.com/feeds/7297420275710157931/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=13473243&amp;postID=7297420275710157931' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/13473243/posts/default/7297420275710157931'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/13473243/posts/default/7297420275710157931'/><link rel='alternate' type='text/html' href='http://eternusuk.blogspot.com/2011/02/objective-c-tooling.html' title='Objective-C tooling'/><author><name>James Abley</name><uri>http://www.blogger.com/profile/10389773375250732709</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-13473243.post-3384212037099653831</id><published>2011-01-07T10:18:00.008Z</published><updated>2011-01-07T11:33:02.334Z</updated><category scheme='http://www.blogger.com/atom/ns#' term='rest'/><category scheme='http://www.blogger.com/atom/ns#' term='cloudfront'/><category scheme='http://www.blogger.com/atom/ns#' term='cdn'/><category scheme='http://www.blogger.com/atom/ns#' term='aws'/><title type='text'>Creating a Custom Origin Server for Amazon CloudFront</title><content type='html'>&lt;p&gt;At the time of writing, tool support is limited to the &lt;a href="http://docs.amazonwebservices.com/AmazonCloudFront/latest/APIReference/index.html?CreateDistribution.html"&gt;REST API&lt;/a&gt;? The intention with this piece of work was to take content being served by our origin server; e.g. http://example.com/images/foo.png; and serve it via Amazon CloudFront on http://cdn.example.com/images/foo.png.&lt;br /&gt;&lt;/p&gt;&lt;ol&gt;&lt;li&gt;Download &lt;a href="http://aws.amazon.com/code/1878"&gt;cfcurl.pl&lt;/a&gt;.&lt;/li&gt;&lt;li&gt;Get any dependencies from CPAN (the cfcurl.pl script tells you how to do that in case you aren't sure).&lt;/li&gt;&lt;li&gt;Create $HOME/.aws-secrets and chmod 600.&lt;br /&gt;&lt;pre&gt;$ cat /Users/jabley/.aws-secrets&lt;br /&gt;%awsSecretAccessKeys = (&lt;br /&gt; # my personal account&lt;br /&gt; 'james-personal' =&gt; {&lt;br /&gt;     id =&gt; 'foo',&lt;br /&gt;     key =&gt; 'bar',&lt;br /&gt; },&lt;br /&gt;&lt;br /&gt; # my corporate account&lt;br /&gt; 'james-work' =&gt; {&lt;br /&gt;     id =&gt; 'AWS-ID',&lt;br /&gt;     key =&gt; 'AWS-Secret-Key',&lt;br /&gt; },&lt;br /&gt;);&lt;br /&gt;&lt;/pre&gt;&lt;/li&gt;&lt;li&gt;Create a file with the request data&lt;br /&gt;&lt;pre&gt;$ cat create-distribution.xml&lt;br /&gt;&amp;lt;?xml version="1.0" encoding="UTF-8"?&gt;&lt;br /&gt;&amp;lt;DistributionConfig xmlns="http://cloudfront.amazonaws.com/doc/2010-11-01/"&gt;&lt;br /&gt;&amp;lt;CustomOrigin&gt;&lt;br /&gt;   &amp;lt;DNSName&gt;example.com&amp;lt;/DNSName&gt;&lt;br /&gt;   &amp;lt;OriginProtocolPolicy&gt;http-only&amp;lt;/OriginProtocolPolicy&gt;&lt;br /&gt;&amp;lt;/CustomOrigin&gt;&lt;br /&gt;&amp;lt;CallerReference&gt;20110106103700&amp;lt;/CallerReference&gt;&lt;br /&gt;&amp;lt;CNAME&gt;cdn.example.com&amp;lt;/CNAME&gt;&lt;br /&gt;&amp;lt;Comment&gt;example.com&lt;comment&gt; CloudFront CDN&amp;lt;/Comment&gt;&lt;br /&gt;&amp;lt;Enabled&gt;true&amp;lt;/Enabled&gt;&lt;br /&gt;&amp;lt;Logging&gt;&lt;br /&gt;   &amp;lt;Bucket&gt;accesslogs-example.com.s3.amazonaws.com&amp;lt;/Bucket&gt;&lt;br /&gt;   &amp;lt;Prefix&gt;cdn.example.com/&amp;lt;/Prefix&gt;&lt;br /&gt;&amp;lt;/Logging&gt;&lt;br /&gt;&amp;lt;/DistributionConfig&gt;&lt;br /&gt;&lt;/comment&gt;&lt;/pre&gt;&lt;/li&gt;&lt;li&gt;POST the file&lt;br /&gt;&lt;pre&gt;   perl cfcurl.pl --keyname james-work -- -X POST -H "Content-Type: text/xml;charset=utf-8" --upload-file \&lt;br /&gt;    create-distribution.xml https://cloudfront.amazonaws.com/2010-11-01/distribution&lt;br /&gt;&lt;/pre&gt;&lt;/li&gt;&lt;li&gt;Poll to see when it has finished creating the distribution:&lt;br /&gt;&lt;pre&gt;   perl cfcurl.pl --keyname james-work -- https://cloudfront.amazonaws.com/2008-06-30/distribution&lt;br /&gt;&lt;/pre&gt;&lt;/li&gt;&lt;li&gt;Configure DNS so that cdn.example.com is a CNAME for the DomainName value of your newly created CloudFront Distribution.&lt;/li&gt;&lt;/ol&gt;&lt;p&gt;You should now be able to request a resource using the new CDN name:&lt;br /&gt;&lt;/p&gt;&lt;pre&gt;$ curl -v -s "http://cdn.example.com/images/foo.png" -o /dev/null&lt;br /&gt;* About to connect() to cdn.example.com port 80 (#0)&lt;br /&gt;*   Trying 192.168.1.1... connected&lt;br /&gt;* Connected to cdn.example.com (192.168.1.1) port 80 (#0)&lt;br /&gt;&gt; GET /images/foo.png HTTP/1.1&lt;br /&gt;&gt; Host: cdn.example.com&lt;br /&gt;&gt; Accept: */*&lt;br /&gt;&gt; User-Agent: curl&lt;br /&gt;&gt;&lt;br /&gt;* HTTP 1.0, assume close after body&lt;br /&gt;&lt; HTTP/1.0 200 OK&lt;br /&gt;&lt; Date: Thu, 06 Jan 2011 18:51:35 GMT&lt;br /&gt;&lt; Server: Apache/2.2.3 (Red Hat)&lt;br /&gt;&lt; Content-Length: 1233&lt;br /&gt;&lt; Cache-Control: max-age=86400&lt;br /&gt;&lt; Content-Type: image/png&lt;br /&gt;&lt; Age: 13311&lt;br /&gt;&lt; X-Cache: Hit from cloudfront&lt;br /&gt;&lt; X-Amz-Cf-Id: b769b423c54e2ffb0a6fb60369e2e0f7b103251ef3e2c549084fb4abe4ef9a236052f8eec40b3a14,80416de274eb8ee87c21ee41c863f9f6f9ef1c251823d9c12c46ab13dc33759dcbb04175b7d4a5a7&lt;br /&gt;&lt; Via: 1.0 83eb7919a5076e946a3a2d59d7f4415b.cloudfront.net:11180 (CloudFront), 1.0 26fb80d2abd86d7f52358cd1c2efd787.cloudfront.net:11180 (CloudFront)&lt;br /&gt;&lt; Connection: close&lt;br /&gt;&lt; &lt;br /&gt;{ [data not shown]&lt;br /&gt;* Closing connection #0 &lt;/pre&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;Note that Amazon CloudFront doesn't support query strings on resources, so you might need to use some &lt;a href="http://serverfault.com/questions/219418/rewriting-apache-urls-to-use-only-paths-and-set-response-headers"&gt;Apache mod_rewrite stuff&lt;/a&gt;.&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;All content Copyright 2005, 2006 James Abley&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/13473243-3384212037099653831?l=eternusuk.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://eternusuk.blogspot.com/feeds/3384212037099653831/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=13473243&amp;postID=3384212037099653831' title='2 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/13473243/posts/default/3384212037099653831'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/13473243/posts/default/3384212037099653831'/><link rel='alternate' type='text/html' href='http://eternusuk.blogspot.com/2011/01/creating-custom-origin-server-for.html' title='Creating a Custom Origin Server for Amazon CloudFront'/><author><name>James Abley</name><uri>http://www.blogger.com/profile/10389773375250732709</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-13473243.post-2656032897180747426</id><published>2010-08-04T08:45:00.003+01:00</published><updated>2010-08-04T09:00:58.355+01:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='appstore'/><category scheme='http://www.blogger.com/atom/ns#' term='iphone'/><category scheme='http://www.blogger.com/atom/ns#' term='apple'/><title type='text'>Apple AppStore feedback</title><content type='html'>This morning the AppStore on my iPod Touch pointed out that the Twitter app had an update. I installed it and launched the app to see what was new. Crash! After 5 crashes in a row without a successful launch, it was obvious that a bad build had snuck into the App Store.&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;code&gt;&lt;/code&gt;&lt;/div&gt;&lt;code&gt;&lt;/code&gt;&lt;div&gt;&lt;code&gt; &lt;p class="p1"&gt;Incident Identifier: 61EE3335-1AD0-4099-8EC6-FAB4B6160A43&lt;/p&gt; &lt;p class="p1"&gt;CrashReporter Key:   001e29bd4aa2ef81d42701ce5325da94b364e27b&lt;/p&gt; &lt;p class="p1"&gt;Process:         Twitter [8470]&lt;/p&gt; &lt;p class="p1"&gt;Path:            /var/mobile/Applications/8E13E345-CDD3-4CA4-899D-8E38BA6661C5/Twitter.app/Twitter&lt;/p&gt; &lt;p class="p1"&gt;Identifier:      Twitter&lt;/p&gt; &lt;p class="p1"&gt;Version:         ??? (???)&lt;/p&gt; &lt;p class="p1"&gt;Code Type:       ARM (Native)&lt;/p&gt; &lt;p class="p1"&gt;Parent Process:  launchd [1]&lt;/p&gt; &lt;p class="p2"&gt;&lt;br /&gt;&lt;/p&gt; &lt;p class="p1"&gt;Date/Time:       2010-08-04 07:58:35.994 +0100&lt;/p&gt; &lt;p class="p1"&gt;OS Version:      iPhone OS 3.1.3 (7E18)&lt;/p&gt; &lt;p class="p1"&gt;Report Version:  104&lt;/p&gt; &lt;p class="p2"&gt;&lt;br /&gt;&lt;/p&gt; &lt;p class="p1"&gt;Exception Type:  EXC_BREAKPOINT (SIGTRAP)&lt;/p&gt; &lt;p class="p1"&gt;Exception Codes: 0x00000001, 0xe7ffdefe&lt;/p&gt; &lt;p class="p1"&gt;Crashed Thread:  0&lt;/p&gt; &lt;p class="p2"&gt;&lt;br /&gt;&lt;/p&gt; &lt;p class="p1"&gt;Dyld Error Message:&lt;/p&gt; &lt;p class="p1"&gt;  Symbol not found: __NSConcreteGlobalBlock&lt;/p&gt; &lt;p class="p1"&gt;  Referenced from: /var/mobile/Applications/8E13E345-CDD3-4CA4-899D-8E38BA6661C5/Twitter.app/Twitter&lt;/p&gt; &lt;p class="p1"&gt;  Expected in: /usr/lib/libSystem.B.dylib&lt;/p&gt; &lt;p class="p1"&gt;  Dyld Version: 149&lt;/p&gt; &lt;p class="p2"&gt;&lt;br /&gt;&lt;/p&gt; &lt;p class="p1"&gt;Binary Images:&lt;/p&gt; &lt;p class="p1"&gt;    0x1000 -   0x14ffff +Twitter armv6  &amp;lt;43ca857e309a61ba8c5da3ab83e42218&gt; /var/mobile/Applications/8E13E345-CDD3-4CA4-899D-8E38BA6661C5/Twitter.app/Twitter&lt;/p&gt;&lt;/code&gt;&lt;p class="p1"&gt;&lt;/p&gt;&lt;p class="p1"&gt;As an iPhone app developer, I think I know what this problem is. We saw this problem in one of our apps. IIRC, the new, preferred llvm compiler has a bug with the new blocks language construct, and gcc doesn't, and the bug only shows up at runtime, in certain environments. To fix it, Twitter are going to have to recompile and use gcc rather than llvm, and then wait for the wheels at Apple to turn.&lt;/p&gt;&lt;p class="p1"&gt;Other people have talked about the frustration of not being able to iterate at web speed or do continuous deployment, but that's part of the ecosystem that you operate in with Apple. &lt;/p&gt;&lt;p class="p1"&gt;Testing, either by the Twitter team, or by Apple when they review the app prior to approving it, should have caught this issue. But these things happen.&lt;/p&gt;&lt;p class="p1"&gt;We had a similar thing happen with an update to one of our apps recently. An update went live and thanks to the apparent difficulty in doing your own testing of the binary that gets sent to Apple, an issue only became apparent when the new version was available through iTunes. To me, this is where the ecosystem is broken. If I have a webapp and I deploy an update, then find an issue (via my cluster-immune system - one day!), I roll it back.&lt;/p&gt;&lt;p class="p1"&gt;iTunesConnect has no rollback, even though it seems like a highly desirable feature. I know in our case, we would have liked the option to rollback to the last known good version and then wait for Apple to review an update, rather than having the world upgrade to a version that we didn't want them to be running. I imagine Twitter would appreciate a similar feature right about now.&lt;/p&gt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;All content Copyright 2005, 2006 James Abley&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/13473243-2656032897180747426?l=eternusuk.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://eternusuk.blogspot.com/feeds/2656032897180747426/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=13473243&amp;postID=2656032897180747426' title='4 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/13473243/posts/default/2656032897180747426'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/13473243/posts/default/2656032897180747426'/><link rel='alternate' type='text/html' href='http://eternusuk.blogspot.com/2010/08/apple-appstore-feedback.html' title='Apple AppStore feedback'/><author><name>James Abley</name><uri>http://www.blogger.com/profile/10389773375250732709</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-13473243.post-263890780033421617</id><published>2010-07-08T10:13:00.004+01:00</published><updated>2010-07-08T10:21:06.135+01:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='mobile'/><category scheme='http://www.blogger.com/atom/ns#' term='mac'/><category scheme='http://www.blogger.com/atom/ns#' term='wireshark'/><category scheme='http://www.blogger.com/atom/ns#' term='iphone'/><category scheme='http://www.blogger.com/atom/ns#' term='android'/><category scheme='http://www.blogger.com/atom/ns#' term='networking'/><title type='text'>Capturing Mobile Network Traffic On OS X</title><content type='html'>Recently had to audit an app to ensure that it wasn't leaking any unwanted details over the network. This was an iPhone app, but the same process can be used for Android, etc.&lt;br /&gt;&lt;ol&gt;&lt;li&gt;Ensure Macbook Pro is plugged into Ethernet.&lt;/li&gt;&lt;li&gt;Open System Preferences&lt;/li&gt;&lt;li&gt;Internet &amp;amp; Wireless | Sharing (in Snow Leopard).&lt;/li&gt;&lt;li&gt;Click Internet Sharing.&lt;/li&gt;&lt;li&gt;From Ethernet&lt;/li&gt;&lt;li&gt;On Airport&lt;/li&gt;&lt;li&gt;Close System Preferences&lt;/li&gt;&lt;li&gt;Click Airport&lt;/li&gt;&lt;li&gt;Select Create Network...&lt;/li&gt;&lt;li&gt;On the phone, open the WiFi controls and connect to the network that you've just created.&lt;/li&gt;&lt;li&gt;Run Wireshark.&lt;/li&gt;&lt;li&gt;Start capturing traffic on the wireless card.&lt;/li&gt;&lt;li&gt;Check stuff is using SSL that should be, etc.&lt;/li&gt;&lt;/ol&gt;&lt;div class="blogger-post-footer"&gt;All content Copyright 2005, 2006 James Abley&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/13473243-263890780033421617?l=eternusuk.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://eternusuk.blogspot.com/feeds/263890780033421617/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=13473243&amp;postID=263890780033421617' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/13473243/posts/default/263890780033421617'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/13473243/posts/default/263890780033421617'/><link rel='alternate' type='text/html' href='http://eternusuk.blogspot.com/2010/07/capturing-mobile-network-traffic-on-os.html' title='Capturing Mobile Network Traffic On OS X'/><author><name>James Abley</name><uri>http://www.blogger.com/profile/10389773375250732709</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-13473243.post-7841443585188764568</id><published>2010-05-20T14:03:00.004+01:00</published><updated>2010-05-20T14:11:55.415+01:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='mac'/><title type='text'>mod_python in apache on OS X with Homebrew</title><content type='html'>Recently had to install mod_python to test something for a customer. It needed some nudging, so including it here. Snow Leopard, Homebrew and default httpd.&lt;div&gt;&lt;br /&gt;&lt;div&gt;&lt;div&gt;&lt;script src="http://gist.github.com/407547.js?file=gistfile1.sh"&gt;&lt;/script&gt;&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;All content Copyright 2005, 2006 James Abley&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/13473243-7841443585188764568?l=eternusuk.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://eternusuk.blogspot.com/feeds/7841443585188764568/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=13473243&amp;postID=7841443585188764568' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/13473243/posts/default/7841443585188764568'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/13473243/posts/default/7841443585188764568'/><link rel='alternate' type='text/html' href='http://eternusuk.blogspot.com/2010/05/modpython-in-apache-on-os-x-with.html' title='mod_python in apache on OS X with Homebrew'/><author><name>James Abley</name><uri>http://www.blogger.com/profile/10389773375250732709</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-13473243.post-9059679998021658178</id><published>2010-01-13T10:21:00.004Z</published><updated>2011-02-08T20:19:51.451Z</updated><category scheme='http://www.blogger.com/atom/ns#' term='java'/><category scheme='http://www.blogger.com/atom/ns#' term='guide'/><category scheme='http://www.blogger.com/atom/ns#' term='iphone'/><category scheme='http://www.blogger.com/atom/ns#' term='objective-c'/><title type='text'>Objective-C - the language</title><content type='html'>First off, I read the &lt;a href="http://developer.apple.com/iphone/library/referencelibrary/GettingStarted/Learning_Objective-C_A_Primer/index.html"&gt;Objective-C Primer&lt;/a&gt; and &lt;a href="http://developer.apple.com/iphone/library/documentation/Cocoa/Conceptual/ObjectiveC/Introduction/introObjectiveC.html"&gt;Objective-C Programming Language&lt;/a&gt; guides. I collect languages, so there was some underlying familiarity there. Ruby, Smalltalk and C obviously shone through for me. Second off, I re-read Smalltalk Best Practice Patterns. I first read that book maybe 6 years ago and it had a massive impact on my Java style. Objective-C is the most Smalltalk-like language that the 'masses' will actually use professionally. Sadly, it's not enough Smalltalk for me, and the C abstractions leak quite a bit.&lt;div class="blogger-post-footer"&gt;All content Copyright 2005, 2006 James Abley&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/13473243-9059679998021658178?l=eternusuk.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://eternusuk.blogspot.com/feeds/9059679998021658178/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=13473243&amp;postID=9059679998021658178' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/13473243/posts/default/9059679998021658178'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/13473243/posts/default/9059679998021658178'/><link rel='alternate' type='text/html' href='http://eternusuk.blogspot.com/2010/01/objective-c-language.html' title='Objective-C - the language'/><author><name>James Abley</name><uri>http://www.blogger.com/profile/10389773375250732709</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-13473243.post-7844850222825019811</id><published>2010-01-13T10:17:00.005Z</published><updated>2011-02-08T20:55:31.158Z</updated><category scheme='http://www.blogger.com/atom/ns#' term='java'/><category scheme='http://www.blogger.com/atom/ns#' term='guide'/><category scheme='http://www.blogger.com/atom/ns#' term='iphone'/><category scheme='http://www.blogger.com/atom/ns#' term='hacking'/><category scheme='http://www.blogger.com/atom/ns#' term='objective-c'/><title type='text'>Java Developers Guide to Objective-C on the iPhone</title><content type='html'>This will be a place-holder page containing links to the other entries that I create in this series. I've got a lot of commercial experience with Java, some Python and Ruby. This has all been server-side; I've not really touched GUIs (apart from GWT, HTML and Javascript) for a while, so this series will necessarily reflect that. Hopefully it will prove useful to others.&lt;br /&gt;&lt;br /&gt;Topics that I hope to cover:&lt;br /&gt;&lt;ul&gt;&lt;li&gt;&lt;a href="http://eternusuk.blogspot.com/2009/12/objective-c-for-java-developers.html"&gt;Initial questions&lt;/a&gt; coming from a mainly Java background.&lt;/li&gt;&lt;li&gt;&lt;a href="http://eternusuk.blogspot.com/2010/01/objective-c-language.html"&gt;Objective-C the language&lt;/a&gt;, including comparisons with Java.&lt;/li&gt;&lt;li&gt;OO with Objective-C, covering how a typical Java app would use interfaces and how Objective-C might approach the problem.&lt;/li&gt;&lt;li&gt;Collections in Java and Objective-C.&lt;br /&gt;&lt;/li&gt;&lt;li&gt;&lt;a href="http://eternusuk.blogspot.com/2011/02/objective-c-concurrency-issues.html"&gt;Concurrency utils in Java and Objective-C&lt;/a&gt;.&lt;br /&gt;&lt;/li&gt;&lt;li&gt;&lt;a href="http://eternusuk.blogspot.com/2011/02/objective-c-tooling.html"&gt;Tools&lt;/a&gt;.&lt;/li&gt;&lt;/ul&gt;&lt;div class="blogger-post-footer"&gt;All content Copyright 2005, 2006 James Abley&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/13473243-7844850222825019811?l=eternusuk.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://eternusuk.blogspot.com/feeds/7844850222825019811/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=13473243&amp;postID=7844850222825019811' title='1 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/13473243/posts/default/7844850222825019811'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/13473243/posts/default/7844850222825019811'/><link rel='alternate' type='text/html' href='http://eternusuk.blogspot.com/2010/01/java-developers-guide-to-objective-c-on.html' title='Java Developers Guide to Objective-C on the iPhone'/><author><name>James Abley</name><uri>http://www.blogger.com/profile/10389773375250732709</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-13473243.post-8862653965719570690</id><published>2009-12-29T23:20:00.006Z</published><updated>2011-02-09T07:11:32.765Z</updated><category scheme='http://www.blogger.com/atom/ns#' term='java'/><category scheme='http://www.blogger.com/atom/ns#' term='guide'/><category scheme='http://www.blogger.com/atom/ns#' term='mac'/><category scheme='http://www.blogger.com/atom/ns#' term='iphone'/><category scheme='http://www.blogger.com/atom/ns#' term='objective-c'/><title type='text'>Objective-C for Java Developers</title><content type='html'>&lt;div&gt;I'm coming from an Eclipse on Ubuntu background, but this is equally applicable for IDEA on Windows. What are the equivalents for iPhone development?&lt;/div&gt;&lt;br /&gt;&lt;table border="1" cellpadding="2" cellspacing="2"&gt;&lt;tbody&gt;  &lt;tr&gt;    &lt;th&gt;Java&lt;/th&gt;     &lt;th&gt;iPhone&lt;/th&gt;      &lt;th&gt;Notes&lt;/th&gt;  &lt;/tr&gt;  &lt;tr&gt;    &lt;td&gt;JUnit (unit testing framework)&lt;/td&gt;    &lt;td style="text-align: center;"&gt;?&lt;/td&gt;     &lt;td&gt;It is possible to use TDD for Swing apps, although I've been predominantly a server-side guy with client stuff happening in the browser for quite a while now. &lt;a href="http://www.google.com/search?&amp;amp;ie=UTF-8&amp;amp;q=cucumber+with+iphone"&gt;Cucumber with iPhone&lt;/a&gt; looks worth exploring...&lt;/td&gt;  &lt;/tr&gt;  &lt;tr&gt;    &lt;td&gt;Hudson (continuous integration tool)&lt;/td&gt;    &lt;td style="text-align: center;"&gt;?&lt;/td&gt;    &lt;td&gt;On my first iPhone app, it rapidly became apparent how easy it was for people to do bad merges and delete classes from the Xcode project file / strings from the UTF-16 l14n Localizable.strings file. You can argue that people should take more care; yeah, that'll fix it. git bisect is great, but a tool that builds on each commit is better.&lt;/td&gt;  &lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;&lt;table&gt;&lt;/table&gt;&lt;div class="blogger-post-footer"&gt;All content Copyright 2005, 2006 James Abley&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/13473243-8862653965719570690?l=eternusuk.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://eternusuk.blogspot.com/feeds/8862653965719570690/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=13473243&amp;postID=8862653965719570690' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/13473243/posts/default/8862653965719570690'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/13473243/posts/default/8862653965719570690'/><link rel='alternate' type='text/html' href='http://eternusuk.blogspot.com/2009/12/objective-c-for-java-developers.html' title='Objective-C for Java Developers'/><author><name>James Abley</name><uri>http://www.blogger.com/profile/10389773375250732709</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-13473243.post-7137271458418984784</id><published>2009-12-26T23:53:00.003Z</published><updated>2009-12-26T23:54:57.791Z</updated><category scheme='http://www.blogger.com/atom/ns#' term='scalecamp'/><title type='text'>ScaleCamp - Queue PUBSUB</title><content type='html'>From some reason I went to this thinking PubSubHubbub, but it was more a refresher about making an app asynchronous, why you'd want to do that and how implementation complexity goes up as you go after certain desirable behaviours.&lt;div class="blogger-post-footer"&gt;All content Copyright 2005, 2006 James Abley&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/13473243-7137271458418984784?l=eternusuk.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://eternusuk.blogspot.com/feeds/7137271458418984784/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=13473243&amp;postID=7137271458418984784' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/13473243/posts/default/7137271458418984784'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/13473243/posts/default/7137271458418984784'/><link rel='alternate' type='text/html' href='http://eternusuk.blogspot.com/2009/12/scalecamp-queue-pubsub.html' title='ScaleCamp - Queue PUBSUB'/><author><name>James Abley</name><uri>http://www.blogger.com/profile/10389773375250732709</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-13473243.post-7376964796250766274</id><published>2009-12-26T23:17:00.006Z</published><updated>2009-12-27T12:23:39.284Z</updated><category scheme='http://www.blogger.com/atom/ns#' term='scalecamp'/><category scheme='http://www.blogger.com/atom/ns#' term='redis'/><title type='text'>ScaleCamp - How do you scale Activity Feeds?</title><content type='html'>Popular session this - standing room only, so no notes from me. &lt;br /&gt;&lt;br /&gt;The short answer is Redis, courtesy of &lt;a href="http://simonwillison.net/"&gt;Simon Willison&lt;/a&gt;. Since the consensus was that Redis would do the trick, we then touched on &lt;a href="http://simonwillison.net/2009/Nov/23/node/"&gt;Simon's other new favourite technology - node.js&lt;/a&gt;.&lt;br /&gt;&lt;br /&gt;Digression: Alex from &lt;a href="http://www.mediamolecule.com/"&gt;mediamolecule&lt;/a&gt; made a comment about 100MB of data in a key-data structure store should only require 100MB of memory to store in such a server app (plus a little extra for housekeeping, but it shouldn't be a 1:10 ratio or similar. I didn't take that as a direct criticism of Redis but more of a reminder about choosing good data structures and the importance of CompSci (says this mathematician). I mention that, since it pricked me to investigate a suspected bad data structure in one of our apps, and coupled with the &lt;a href="http://www.eclipse.org/mat/"&gt;Eclipse Memory Analyser&lt;/a&gt; recommended by the &lt;a href="http://eternusuk.blogspot.com/2009/12/scalecamp-scaling-java-and-oracle-for.html"&gt;Guardian guys&lt;/a&gt;, I found something that was using far too much of the heap for our Tomcat nodes; and had a change rolled out within 4 days of attending this conference. That reduced the memory footprint for that data structure from 250MB to 16MB. Ouch, shocker, but great to have found, prioritised and fixed.&lt;div class="blogger-post-footer"&gt;All content Copyright 2005, 2006 James Abley&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/13473243-7376964796250766274?l=eternusuk.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://eternusuk.blogspot.com/feeds/7376964796250766274/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=13473243&amp;postID=7376964796250766274' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/13473243/posts/default/7376964796250766274'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/13473243/posts/default/7376964796250766274'/><link rel='alternate' type='text/html' href='http://eternusuk.blogspot.com/2009/12/scalecamp-how-do-you-scale-activity.html' title='ScaleCamp - How do you scale Activity Feeds?'/><author><name>James Abley</name><uri>http://www.blogger.com/profile/10389773375250732709</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-13473243.post-4878844961927659913</id><published>2009-12-07T12:11:00.003Z</published><updated>2009-12-26T23:16:09.823Z</updated><category scheme='http://www.blogger.com/atom/ns#' term='scalecamp'/><title type='text'>ScaleCamp - Scaling Java and Oracle for the Guardian</title><content type='html'>Guardian.co.uk&lt;br /&gt;&lt;br /&gt;Graham and various other people from the development and operations team pitching in.&lt;br /&gt;&lt;br /&gt;3 years ago - published static files with apache SSI to fill-in gaps. Moved to a fully dynamic system. Now, they're somewhere in between.&lt;br /&gt;&lt;br /&gt;Stack - &lt;br /&gt;&lt;ul&gt;&lt;li&gt;apache&lt;/li&gt;&lt;br /&gt;&lt;li&gt;resin&lt;/li&gt;&lt;br /&gt;&lt;li&gt;spring / hibernate / velocity&lt;/li&gt;&lt;br /&gt;&lt;li&gt;Oracle DB backend (not recommended!)&lt;/li&gt;&lt;/ul&gt;&lt;br /&gt;&lt;br /&gt;Measured the application - 1300 requests to DB just to render homepage.&lt;br /&gt;&lt;br /&gt;Added ehcache to hibernate as 2nd level cache and added a warmup script before putting into load balancer&lt;br /&gt;&lt;br /&gt;30m unique users per month&lt;br /&gt;270m pages per month&lt;br /&gt;250 requests/second at lunchtime&lt;br /&gt;1500 requests/second peak.&lt;br /&gt;&lt;br /&gt;&lt;h3&gt;GC tools&lt;/h3&gt;&lt;br /&gt;&lt;br /&gt;Google weakref cache (part of &lt;a href="http://code.google.com/p/google-collections/"&gt;Google Collections&lt;/a&gt;)&lt;br /&gt;&lt;br /&gt;&lt;a href="http://www.eclipse.org/mat/"&gt;Eclipse memory analyser&lt;/a&gt; - what's using all my memory?&lt;br /&gt;&lt;br /&gt;Cacti for monitoring - DB usage was killing it.&lt;br /&gt;&lt;br /&gt;8 app servers in each co-lo (London and Manchester).&lt;br /&gt;&lt;br /&gt;400MB used by cache - churn meant was pretty ineffective.&lt;br /&gt;&lt;br /&gt;Tried or considered ehcache distribution and jboss cache distribution.&lt;br /&gt;&lt;br /&gt;Rejected since cache eviction via replication would have thrashed it.&lt;br /&gt;&lt;br /&gt;&lt;h3&gt;memcached&lt;/h3&gt;&lt;br /&gt;&lt;br /&gt;massive improvement in response times, but DB load still high.&lt;br /&gt;&lt;br /&gt;went to caching every query for 5 minutes. DB load vanished and is flat even as more app servers come on-line.&lt;br /&gt;&lt;br /&gt;servlet filter writing to memcached made it stink fast.&lt;br /&gt;&lt;br /&gt;took a days worth of logs and Hadoop to see how long the cache should be. 1 minute was the sweet spot.&lt;br /&gt;&lt;br /&gt;Emergency switch to serve a static copy of the site, minus personalization features.&lt;br /&gt;&lt;br /&gt;Daemon or script scrapes the sit; they can handle 700req/s/node when the site's operating in this mode.&lt;br /&gt;&lt;br /&gt;new content published in this mode has a copy pressed so it can be served from disk - publish is slower than with the other system but updates still possible&lt;br /&gt;&lt;br /&gt;Highly recommend that this sort of emergency degrade read-only mode should be built-in from the off - they've used this approach with the MPs Expenses apps built to crowd-source investigations.&lt;div class="blogger-post-footer"&gt;All content Copyright 2005, 2006 James Abley&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/13473243-4878844961927659913?l=eternusuk.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://eternusuk.blogspot.com/feeds/4878844961927659913/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=13473243&amp;postID=4878844961927659913' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/13473243/posts/default/4878844961927659913'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/13473243/posts/default/4878844961927659913'/><link rel='alternate' type='text/html' href='http://eternusuk.blogspot.com/2009/12/scalecamp-scaling-java-and-oracle-for.html' title='ScaleCamp - Scaling Java and Oracle for the Guardian'/><author><name>James Abley</name><uri>http://www.blogger.com/profile/10389773375250732709</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-13473243.post-5167066460283774412</id><published>2009-12-07T12:09:00.002Z</published><updated>2009-12-26T23:02:26.783Z</updated><category scheme='http://www.blogger.com/atom/ns#' term='scalecamp'/><category scheme='http://www.blogger.com/atom/ns#' term='java'/><category scheme='http://www.blogger.com/atom/ns#' term='django'/><title type='text'>ScaleCamp - Scaling Java with Shared Nothing</title><content type='html'>&lt;a href="http://eternusuk.blogspot.com/2009/12/scalecamp-scaling-with-squid.html"&gt;Thoughtworks guys again&lt;/a&gt;.&lt;br /&gt;&lt;br /&gt;Basic Servlet overview - in-memory sessions don't scale, duh!&lt;br /&gt;&lt;br /&gt;Preferred options - state goes into cookies and serialized. Security, legal aspects? Pretty well common to most frameworks these days.&lt;br /&gt;&lt;br /&gt;Page composition in the server with proxy server holding StringTemplate objects. Interesting idea - &lt;a href="http://www.holovaty.com/writing/django-two-phased-rendering/"&gt;seen variants of this in other place&lt;/a&gt;s. I'm curious as to whether doing this could mean having a poor man's macro system for Java, since XSLTs can be written to create XSLTs; maybe Velocity templates could similarly generate Velocity templates or StringTemplate -&gt; StringTemplate?&lt;br /&gt;&lt;br /&gt;Again, application developers need to have a good idea of caching directives for this to work. One objection I had with this approach is that you potentially increase your hardware requirement and can open the app up to liveness failures here. Request A comes in and is serviced by Thread 1. As part of that, it makes a request to the proxy server for a template. At the proxy server, a cache miss means that another request needs to be made to the app server. Then Request A is tying up 2 app server threads. What about applications which parallelize the requests? They might use more than 2 app server request-handling threads at a time, etc.&lt;br /&gt;&lt;br /&gt;Thoughtworks seem to do fun, interesting work.&lt;div class="blogger-post-footer"&gt;All content Copyright 2005, 2006 James Abley&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/13473243-5167066460283774412?l=eternusuk.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://eternusuk.blogspot.com/feeds/5167066460283774412/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=13473243&amp;postID=5167066460283774412' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/13473243/posts/default/5167066460283774412'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/13473243/posts/default/5167066460283774412'/><link rel='alternate' type='text/html' href='http://eternusuk.blogspot.com/2009/12/scalecamp-scaling-java-with-shared.html' title='ScaleCamp - Scaling Java with Shared Nothing'/><author><name>James Abley</name><uri>http://www.blogger.com/profile/10389773375250732709</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-13473243.post-8028241792297870118</id><published>2009-12-07T12:08:00.004Z</published><updated>2009-12-26T22:41:39.526Z</updated><category scheme='http://www.blogger.com/atom/ns#' term='scalecamp'/><title type='text'>ScaleCamp - LittleBigPlanet</title><content type='html'>Alex and James from mediamolecule.com. Fascinating perspective of embedded developers coming to server-programming and refusing to accept commonly held views on best practices for doing so. This was the surprise hit of the conference for me; I just elected to go since there wasn't anything else in that slot that I was really passionate about. I'd been talking to them both in the queue for tea earlier and made a poorly judged joke about Map-Reduce (&lt;a href="http://browsertoolkit.com/fault-tolerance.png"&gt;we pretty much had this conversation&lt;/a&gt;). The session they ran was an awesome talk about scaling server-side within the games sector - &lt;a href="http://www.littlebigplanet.com/"&gt;Little Big Planet&lt;/a&gt; is theirs.&lt;br /&gt;&lt;br /&gt;Written their own C-based key-data structure store, of which we're spoilt for choice just now. Alex commented that he's looked at Redis and it has some nice stuff, but when they came to need it, there wasn't anything that met their needs, and experience with running the recommended Java stack had left them with the impression that they should stick to what they know. What they know is writing very tight code in constrained environments, so applying that mind-set to server-side development seemed to have yielded some very pleasing numbers. Other parts are in Ruby (presumably 1.9, since they're using Fibers?). I didn't get around to asking James how well that works or which implementation they're using. Very happy with that programming model though - James is or was a Java guy - funny how nice Ruby feels coming from there!&lt;div class="blogger-post-footer"&gt;All content Copyright 2005, 2006 James Abley&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/13473243-8028241792297870118?l=eternusuk.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://eternusuk.blogspot.com/feeds/8028241792297870118/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=13473243&amp;postID=8028241792297870118' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/13473243/posts/default/8028241792297870118'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/13473243/posts/default/8028241792297870118'/><link rel='alternate' type='text/html' href='http://eternusuk.blogspot.com/2009/12/scalecamp-littlebigplanet.html' title='ScaleCamp - LittleBigPlanet'/><author><name>James Abley</name><uri>http://www.blogger.com/profile/10389773375250732709</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-13473243.post-2092157894311788606</id><published>2009-12-07T12:06:00.002Z</published><updated>2009-12-26T22:31:02.795Z</updated><category scheme='http://www.blogger.com/atom/ns#' term='scalecamp'/><title type='text'>ScaleCamp - Varnish</title><content type='html'>Artur Bergman talking about Varnish; this followed on from the Squid talk and most of the same crowd hung around for this one.&lt;br /&gt;&lt;br /&gt;purges gone from multicast to Rabbit MQ (damn can't remember if I got that right or what it means!)&lt;br /&gt;2 8-core servers in London data centre 350MB/s with 5000 requests/sec. Intel X25 SSDs have changed a certain class of application. If disk is the new tape, then it's probably still acceptable to go to disk if you're running those babies. See also &lt;a href="http://blog.last.fm/2009/12/14/launching-xbox-part-2-ssd-streaming"&gt;Last.FMs experience&lt;/a&gt; with them.&lt;br /&gt;&lt;br /&gt;Attempt cache hits in all data centres (UK -&gt; US) before going to the app. Much better performance.&lt;br /&gt;&lt;br /&gt;CDN gets broken with query string parameters - common misconfiguration which can be defended against.&lt;br /&gt;&lt;br /&gt;Varnish protects against thundering herd. Interesting - need to read more about that to better understand it.&lt;div class="blogger-post-footer"&gt;All content Copyright 2005, 2006 James Abley&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/13473243-2092157894311788606?l=eternusuk.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://eternusuk.blogspot.com/feeds/2092157894311788606/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=13473243&amp;postID=2092157894311788606' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/13473243/posts/default/2092157894311788606'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/13473243/posts/default/2092157894311788606'/><link rel='alternate' type='text/html' href='http://eternusuk.blogspot.com/2009/12/scalecamp-varnish.html' title='ScaleCamp - Varnish'/><author><name>James Abley</name><uri>http://www.blogger.com/profile/10389773375250732709</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-13473243.post-2146070016784206879</id><published>2009-12-07T12:05:00.003Z</published><updated>2011-01-28T21:34:39.688Z</updated><category scheme='http://www.blogger.com/atom/ns#' term='scalecamp'/><title type='text'>ScaleCamp - scaling with Squid</title><content type='html'>Summarising a recent Thoughtworks experience with this, from &lt;a href="http://twitter.com/cread"&gt;Chris Read&lt;/a&gt; and &lt;a href="http://www.magpiebrain.com/"&gt;Sam Newman&lt;/a&gt;.&lt;br /&gt;&lt;br /&gt;This was for a high volume retailer. A Proxy / caching solution was supposed to be provided and TW would do the app. At t-4, it turned out that TW would also have to provide the proxy / cache, so this was a hasty investigation into Squid.&lt;br /&gt;&lt;br /&gt;1 hardware LB&lt;br /&gt;2 Squid boxes - 8 core machine&lt;br /&gt;&lt;br /&gt;1 carp process&lt;br /&gt;lots of child processes&lt;br /&gt;&lt;br /&gt;going to 16 app servers.&lt;br /&gt;&lt;br /&gt;16,000 requests per second = 5% of traffic&lt;br /&gt;&lt;br /&gt;TTL for items ranged from 5 minutes to 1 hour for stable furniture.&lt;br /&gt;&lt;br /&gt;whole site does 250 million requests per day&lt;br /&gt;&lt;br /&gt;peak 24,000 requests per second&lt;br /&gt;&lt;br /&gt;importance of good HTTP Caching directives. Discussion of making the application (and by implication, the application developers) aware of considering ETag / Expires / Vary for all parts of the application, versus just adding it via apache ReWrite or similar. Most people in the room (including me, very strongly; RFC2616 is my favourite RFC) were in the former camp.&lt;br /&gt;&lt;br /&gt;heap LFUDA was a good change to make.&lt;br /&gt;&lt;br /&gt;Tried &lt;a href="http://varnish.projects.linpro.no/"&gt;Varnish&lt;/a&gt;, but couldn't get good numbers out of it, in the timescales available. &lt;a href="http://twitter.com/crucially"&gt;Artur&lt;/a&gt; opined that Varnish should provide better numbers than Squid; he's arguably conflicted, but seemed pretty convincing! Another factor in that was very likely that they were running RHEL old shit, and Varnish works best with a shiny new kernel (cite?)&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;b&gt;Update&lt;/b&gt;: they also presented a &lt;a href="http://www.infoq.com/presentations/Squid-Wrangling"&gt;version of this talk&lt;/a&gt; at DevOps 2010.&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;All content Copyright 2005, 2006 James Abley&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/13473243-2146070016784206879?l=eternusuk.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://eternusuk.blogspot.com/feeds/2146070016784206879/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=13473243&amp;postID=2146070016784206879' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/13473243/posts/default/2146070016784206879'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/13473243/posts/default/2146070016784206879'/><link rel='alternate' type='text/html' href='http://eternusuk.blogspot.com/2009/12/scalecamp-scaling-with-squid.html' title='ScaleCamp - scaling with Squid'/><author><name>James Abley</name><uri>http://www.blogger.com/profile/10389773375250732709</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-13473243.post-4554575106118701196</id><published>2009-12-07T12:02:00.008Z</published><updated>2009-12-09T00:33:26.645Z</updated><category scheme='http://www.blogger.com/atom/ns#' term='scalecamp'/><title type='text'>ScaleCamp - State of the Nation for Monitoring</title><content type='html'>&lt;h2&gt;Where are we now and what's broken with it?&lt;/h2&gt;&lt;br /&gt;&lt;ul&gt;&lt;br /&gt;&lt;li&gt;&lt;a href="http://www.cacti.net/"&gt;Cacti&lt;/a&gt;&lt;/li&gt;&lt;br /&gt;&lt;li&gt;&lt;a href="http://collectd.org/"&gt;Collectd&lt;/a&gt;&lt;/li&gt;&lt;br /&gt;&lt;li&gt;&lt;a href="http://munin.projects.linpro.no/"&gt;Munin&lt;/a&gt;&lt;/li&gt;&lt;br /&gt;&lt;li&gt;&lt;a href="http://ganglia.sourceforge.net/"&gt;Ganglia&lt;/a&gt;&lt;/li&gt;&lt;br /&gt;&lt;li&gt;&lt;a href="http://www.hyperic.com/"&gt;Hyperic&lt;/a&gt;&lt;/li&gt;&lt;br /&gt;&lt;li&gt;&lt;a href="http://www.zabbix.com/"&gt;Zabbix&lt;/a&gt;&lt;/li&gt;&lt;br /&gt;&lt;li&gt;&lt;a href="http://www.zenoss.com/"&gt;Zenoss&lt;/a&gt;&lt;/li&gt;&lt;br /&gt;&lt;/ul&gt;&lt;p&gt;People are almost getting to the point of needing more powerful machines to do the monitoring than the app servers! Maybe something's broken somewhere...&lt;/p&gt;&lt;br /&gt;&lt;p&gt;&lt;a href="http://oss.oetiker.ch/rrdtool/"&gt;RRDTool&lt;/a&gt; - overall, the consensus seemed to be that this was a little dated.&lt;/p&gt;&lt;br /&gt;&lt;ol&gt;&lt;br /&gt;&lt;li&gt;Does lots of writes due to the way it stores data&lt;/li&gt;&lt;br /&gt;&lt;li&gt;throws away data by the way it aggregates - to see fine-grained data of last years sales, you need to keep a backup of the files / graphs, rather than being able to query it.&lt;/li&gt;&lt;br /&gt;&lt;li&gt;can't be cleansed of bad data, or it's a bitch of a job to do so.&lt;/li&gt;&lt;br /&gt;&lt;/ol&gt;&lt;br /&gt;&lt;h2&gt;Alternative options&lt;/h2&gt;&lt;br /&gt;&lt;ul&gt;&lt;br /&gt;&lt;li&gt;&lt;a href="http://hadoop.apache.org/hbase/"&gt;hbase&lt;/a&gt;&lt;/li&gt;&lt;br /&gt;&lt;li&gt;&lt;a href="https://labs.omniti.com/trac/reconnoiter"&gt;reconnoiter&lt;/a&gt;&lt;/li&gt;&lt;br /&gt;&lt;li&gt;Tokyo Tyrant / Cabinet&lt;/li&gt;&lt;br /&gt;&lt;li&gt;&lt;a href="http://github.com/crucially/timesplicedb"&gt;timesplicedb&lt;/a&gt; looks to be an interesting attempt to provide a replacement. More language bindings needed, don't be shy!&lt;/li&gt;&lt;br /&gt;&lt;/ul&gt;A good start to the conference for me and it gave me a flavour of the depth and breadth of discussions available.&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;All content Copyright 2005, 2006 James Abley&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/13473243-4554575106118701196?l=eternusuk.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://eternusuk.blogspot.com/feeds/4554575106118701196/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=13473243&amp;postID=4554575106118701196' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/13473243/posts/default/4554575106118701196'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/13473243/posts/default/4554575106118701196'/><link rel='alternate' type='text/html' href='http://eternusuk.blogspot.com/2009/12/scalecamp-monitoring-approaches.html' title='ScaleCamp - State of the Nation for Monitoring'/><author><name>James Abley</name><uri>http://www.blogger.com/profile/10389773375250732709</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-13473243.post-3654551442926849895</id><published>2009-12-07T11:52:00.010Z</published><updated>2009-12-09T00:34:22.839Z</updated><category scheme='http://www.blogger.com/atom/ns#' term='scalecamp'/><title type='text'>ScaleCamp UK 2009</title><content type='html'>On Friday I was fortunate enough to attend the &lt;a href="http://www.scalecamp.org.uk/"&gt;inaugural ScaleCamp UK event&lt;/a&gt;, organised by &lt;a href="http://twitter.com/bruntonspall"&gt;Michael Brunton-Spall&lt;/a&gt; at the Guardian. This was a great conference. It was a BarCamp-style approach (not that I've been to BarCamp yet!) with the &lt;a href="http://spreadsheets.google.com/pub?key=tfGTcXiIm6ejPXHYBpHkxlQ&amp;output=html"&gt;schedule evolving over conversations and planned on a board&lt;/a&gt; in the morning. Some of the sessions I took notes at; others were standing room only, so I'll try to remember what was talked about. Obviously, this is a personal perspective focused on my interests; others should be blogging about Javascript and the like. &lt;br /&gt;&lt;br /&gt;I met lots of very passionate, smart people doing cool stuff. That bodes well for the economy; if you want to do interesting work, then hooking up with any of the people that attended there wouldn't be a bad place to start.&lt;div class="blogger-post-footer"&gt;All content Copyright 2005, 2006 James Abley&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/13473243-3654551442926849895?l=eternusuk.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://eternusuk.blogspot.com/feeds/3654551442926849895/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=13473243&amp;postID=3654551442926849895' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/13473243/posts/default/3654551442926849895'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/13473243/posts/default/3654551442926849895'/><link rel='alternate' type='text/html' href='http://eternusuk.blogspot.com/2009/12/scalecamp-inaugural-event.html' title='ScaleCamp UK 2009'/><author><name>James Abley</name><uri>http://www.blogger.com/profile/10389773375250732709</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-13473243.post-2222041308275203017</id><published>2009-12-03T23:29:00.005Z</published><updated>2009-12-29T22:37:09.878Z</updated><category scheme='http://www.blogger.com/atom/ns#' term='mac'/><title type='text'>iMac - Guide for Linux Users</title><content type='html'>Got a MacBook Pro recently at work, for doing more iPhone stuff. I've long admired Macs as hardware, but haven't ever owned one due to an irrational distrust of Steve Jobs. Oh well, lots of friends recommend them and have told me it's the best computing experience going. I'm expecting a learning curve, but here goes:&lt;br /&gt;&lt;br /&gt;&lt;ol&gt;&lt;li&gt;Go through basic setup for my user account. No friction so far apart from the keyboard. I know which keys to check when I'm installing a Linux, so I do the same. SHIFT+2 and SHIFT+' give me @". WTF? Need to remap certain stuff; that's not the British English layout I'm used to; none of my other computers are Macs and I have 10 years of muscle memory when it comes to typing. I'll come back to fixing that. First off, Apple | System Preferences | Keyboard | Modifier Keys and sort out Caps Lock and CTRL, for good emacs usage.&lt;/li&gt;&lt;br /&gt;&lt;li&gt;Where's a bloody terminal? Spend 5 minutes learning the nuances of the trackpad (I'm used to a nipple) and then drag one out of Applications | Utilities onto the Dock.&lt;/li&gt;&lt;br /&gt;&lt;li&gt;Good, ssh is available. Copy my SSH keys and config off the Dell laptop running Ubuntu 9.10. Test all ssh stuff and grin like a maniac.&lt;/li&gt;&lt;br /&gt;&lt;li&gt;Right, best install any system updates before I start configuring the arse off it. For a Unix, Mac OS X seems to need a lot of restarts for simple stuff like iTunes updates.&lt;/li&gt;&lt;br /&gt;&lt;li&gt;WTF!? Nothing like &lt;a href="http://en.wikipedia.org/wiki/Aptitude_(software)"&gt;aptitude&lt;/a&gt;? That seems like a glaring omission. What are my options? Googling seems to point to &lt;a href="http://www.macports.org/"&gt;Macports&lt;/a&gt;, &lt;a href="http://www.finkproject.org/"&gt;Fink&lt;/a&gt; and &lt;a href="http://github.com/mxcl/homebrew"&gt;Homebrew&lt;/a&gt; as the available options.&lt;/li&gt;&lt;br /&gt;&lt;li&gt;IRC client - download &lt;a href="http://colloquy.info/"&gt;Colloquy&lt;/a&gt; and start talking to real people about their experiences.&lt;/li&gt;&lt;br /&gt;&lt;li&gt;After that very small skewed sample, decide to go with Macports for now with an intention to properly evaluate Homebrew Real Soon Now.&lt;/li&gt;&lt;br /&gt;&lt;li&gt;&lt;a href="http://help.github.com/mac-git-installation/"&gt;Install git with git-svn support&lt;/a&gt;. &lt;code&gt;$ sudo port install git-core +svn gitX&lt;/code&gt;&lt;/li&gt;&lt;br /&gt;&lt;li&gt;Checkout my github stuff. Git is missing something - &lt;a href="http://blog.bitfluent.com/post/27983389/git-utilities-you-cant-live-without"&gt;completion&lt;/a&gt;!&lt;/li&gt;&lt;br /&gt;&lt;li&gt;$ sudo port install bash_completion&lt;br /&gt;$ curl -o git "http://repo.or.cz/w/git.git/blob_plain/HEAD:/contrib/completion/git-completion.bash"&lt;br /&gt;$ sudo mv git /opt/local/etc/bash_completion.d/&lt;/li&gt;&lt;br /&gt;&lt;li&gt;Download the behemoth that is &lt;a href="http://developer.apple.com/technology/xcode.html"&gt;Xcode from the Apple Developer site&lt;/a&gt; and start checking out Objective-C&lt;/li&gt;&lt;br /&gt;&lt;/ol&gt;&lt;br /&gt;&lt;br /&gt;That'll do as a minimally usable system for now. Hardware-wise, it's a delight. Being able to watch all of &lt;a href="http://www.infoq.com/"&gt;InfoQ&lt;/a&gt; content without the teething problems that I always seem to have on Ubuntu is just a major relief - I've got a lot of stuff in delicious tagged from there that I've never managed to watch, so I can start getting through that backlog as well.&lt;div class="blogger-post-footer"&gt;All content Copyright 2005, 2006 James Abley&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/13473243-2222041308275203017?l=eternusuk.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://eternusuk.blogspot.com/feeds/2222041308275203017/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=13473243&amp;postID=2222041308275203017' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/13473243/posts/default/2222041308275203017'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/13473243/posts/default/2222041308275203017'/><link rel='alternate' type='text/html' href='http://eternusuk.blogspot.com/2009/12/imac-guide-for-linux-users.html' title='iMac - Guide for Linux Users'/><author><name>James Abley</name><uri>http://www.blogger.com/profile/10389773375250732709</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-13473243.post-4861816286700467607</id><published>2009-11-11T20:56:00.002Z</published><updated>2009-11-11T21:00:26.037Z</updated><category scheme='http://www.blogger.com/atom/ns#' term='boys'/><title type='text'>Maturity</title><content type='html'>Got home from Font around midnight on Saturday night (Halloween) to see a single carved pumpkin at home with a light inside. In the morning it transpired that someone that evening had taken Connor's pumpkin and smashed it just around the corner. I was taken with his reaction - very laissez-faire and musing on how he had the enjoyment from making the pumpkin. He was just a bit disappointed that I didn't get to see it. He's almost human sometimes!&lt;div class="blogger-post-footer"&gt;All content Copyright 2005, 2006 James Abley&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/13473243-4861816286700467607?l=eternusuk.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://eternusuk.blogspot.com/feeds/4861816286700467607/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=13473243&amp;postID=4861816286700467607' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/13473243/posts/default/4861816286700467607'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/13473243/posts/default/4861816286700467607'/><link rel='alternate' type='text/html' href='http://eternusuk.blogspot.com/2009/11/maturity.html' title='Maturity'/><author><name>James Abley</name><uri>http://www.blogger.com/profile/10389773375250732709</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-13473243.post-8766243631411789383</id><published>2009-11-11T20:12:00.004Z</published><updated>2009-11-11T20:56:27.372Z</updated><category scheme='http://www.blogger.com/atom/ns#' term='bouldering'/><category scheme='http://www.blogger.com/atom/ns#' term='font'/><title type='text'>Font 2009 summary</title><content type='html'>This was a bonus trip. I had a bad back for a month beforehand thanks to a Connor Kung-Fu Panda drop on me when stretching after a run. So no climbing and whacked out on painkillers - not ideal before a bouldering trip.&lt;br /&gt;&lt;br /&gt;Traditional Friday night / Saturday morning driving ferry and drive only to find wet Font greeting us.&lt;br /&gt;&lt;dl&gt;&lt;br /&gt;&lt;dt&gt;Sunday&lt;/dt&gt;&lt;br /&gt;&lt;dd&gt;Apremont&lt;/dd&gt;&lt;br /&gt;&lt;dt&gt;Monday&lt;/dt&gt;&lt;br /&gt;&lt;dd&gt;Cusiniere&lt;/dd&gt;&lt;br /&gt;&lt;dt&gt;Tuesday&lt;/dt&gt;&lt;br /&gt;&lt;dd&gt;Rocher Canon - running&lt;/dd&gt;&lt;br /&gt;&lt;dt&gt;Wednesday&lt;/dt&gt;&lt;br /&gt;&lt;dd&gt;Haute Pleines / Isatis&lt;/dd&gt;&lt;br /&gt;&lt;dt&gt;Thursday&lt;/dt&gt;&lt;br /&gt;&lt;dd&gt;Cuvier - rest day&lt;/dd&gt;&lt;br /&gt;&lt;dt&gt;Friday&lt;/dt&gt;&lt;br /&gt;&lt;dd&gt;95.2&lt;/dd&gt;&lt;br /&gt;&lt;dt&gt;Saturday&lt;/dt&gt;&lt;br /&gt;&lt;dd&gt;Gorge aux Chats&lt;/dd&gt;&lt;br /&gt;&lt;/dl&gt;&lt;br /&gt;&lt;br /&gt;Joined the &lt;a href="http://profiles.bleau.info/james.abley/"&gt;inveterate tickers club&lt;/a&gt; - that and I can't really remember what I've done in Font apart from Carnage, l'Abbatoir and a few others.&lt;br /&gt;&lt;br /&gt;Great trip; too hot for getting on some stuff, but rather that that raining all week. Lucky to get stuff done too, with my lack of preparation. Not done 7b in the forest for a few years!&lt;div class="blogger-post-footer"&gt;All content Copyright 2005, 2006 James Abley&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/13473243-8766243631411789383?l=eternusuk.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://eternusuk.blogspot.com/feeds/8766243631411789383/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=13473243&amp;postID=8766243631411789383' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/13473243/posts/default/8766243631411789383'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/13473243/posts/default/8766243631411789383'/><link rel='alternate' type='text/html' href='http://eternusuk.blogspot.com/2009/11/font-2009-summary.html' title='Font 2009 summary'/><author><name>James Abley</name><uri>http://www.blogger.com/profile/10389773375250732709</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-13473243.post-8229439361969527739</id><published>2009-11-11T20:07:00.002Z</published><updated>2009-11-11T20:12:21.520Z</updated><category scheme='http://www.blogger.com/atom/ns#' term='firefox'/><category scheme='http://www.blogger.com/atom/ns#' term='karmic'/><category scheme='http://www.blogger.com/atom/ns#' term='google'/><category scheme='http://www.blogger.com/atom/ns#' term='gears'/><category scheme='http://www.blogger.com/atom/ns#' term='ubuntu'/><category scheme='http://www.blogger.com/atom/ns#' term='hacking'/><title type='text'>Google Gears for Firefox 3.5 on Ubuntu Karmic 9.10</title><content type='html'>Built my own - seems to work fine so far.&lt;br /&gt;&lt;br /&gt;&lt;pre&gt;&lt;br /&gt;jabley@miq-jabley:~/work/gears-read-only$ svn info&lt;br /&gt;Path: .&lt;br /&gt;URL: http://gears.googlecode.com/svn/trunk&lt;br /&gt;Repository Root: http://gears.googlecode.com/svn&lt;br /&gt;Repository UUID: fe895e04-df30-0410-9975-d76d301b4276&lt;br /&gt;Revision: 3410&lt;br /&gt;Node Kind: directory&lt;br /&gt;Schedule: normal&lt;br /&gt;Last Changed Author: gears.daemon&lt;br /&gt;Last Changed Rev: 3410&lt;br /&gt;Last Changed Date: 2009-11-10 01:49:08 +0000 (Tue, 10 Nov 2009)&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;Made some changes:&lt;br /&gt;&lt;br /&gt;&lt;script src="http://gist.github.com/232250.js"&gt;&lt;/script&gt;&lt;br /&gt;&lt;br /&gt;make mode=OPT&lt;br /&gt;&lt;br /&gt;and then install the resulting xpi.&lt;div class="blogger-post-footer"&gt;All content Copyright 2005, 2006 James Abley&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/13473243-8229439361969527739?l=eternusuk.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://eternusuk.blogspot.com/feeds/8229439361969527739/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=13473243&amp;postID=8229439361969527739' title='1 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/13473243/posts/default/8229439361969527739'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/13473243/posts/default/8229439361969527739'/><link rel='alternate' type='text/html' href='http://eternusuk.blogspot.com/2009/11/google-gears-for-firefox-35-on-ubuntu.html' title='Google Gears for Firefox 3.5 on Ubuntu Karmic 9.10'/><author><name>James Abley</name><uri>http://www.blogger.com/profile/10389773375250732709</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-13473243.post-2457809820368771628</id><published>2009-10-23T15:07:00.001+01:00</published><updated>2009-10-23T15:09:26.655+01:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='git'/><category scheme='http://www.blogger.com/atom/ns#' term='svn'/><category scheme='http://www.blogger.com/atom/ns#' term='hacking'/><title type='text'>updating git svn local copies</title><content type='html'>Post-release in maven, I have a lot of svn modules to update:&lt;br /&gt;&lt;br /&gt;&lt;script src="http://gist.github.com/216917.js"&gt;&lt;/script&gt;&lt;div class="blogger-post-footer"&gt;All content Copyright 2005, 2006 James Abley&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/13473243-2457809820368771628?l=eternusuk.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://eternusuk.blogspot.com/feeds/2457809820368771628/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=13473243&amp;postID=2457809820368771628' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/13473243/posts/default/2457809820368771628'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/13473243/posts/default/2457809820368771628'/><link rel='alternate' type='text/html' href='http://eternusuk.blogspot.com/2009/10/updating-git-svn-local-copies.html' title='updating git svn local copies'/><author><name>James Abley</name><uri>http://www.blogger.com/profile/10389773375250732709</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-13473243.post-6491747120301434433</id><published>2009-10-05T20:53:00.005+01:00</published><updated>2009-10-05T21:20:42.221+01:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='git'/><category scheme='http://www.blogger.com/atom/ns#' term='svn'/><title type='text'>Settig up Git mirrors of SVN</title><content type='html'>At work, I've been using git-svn for quite a while. I like the workflow options, and better merging capabilities. As a casualty from the recent laptop hard drive failure, all of my git repositories had gone, checked out from our main SVN server. I'm the only one using git where I work, but I love the workflow that it gives me and going back to SVN is a no-no. That had previously been created by doing a&lt;br /&gt;&lt;br /&gt;git svn clone -s svn://svn.example.com/module&lt;br /&gt;&lt;br /&gt;That took ages (3 days for all of the stuff I need to work on) and was quite slow when doing commits. My backups are mildly corrupt too, so I've started over, and set it up properly this time. Thanks to the &lt;a href="http://www.pplux.com/2008/11/26/from-subversion-to-git/"&gt;guide here&lt;/a&gt;.&lt;br /&gt;&lt;br /&gt;On the server, I created a directory to hold the git mirrors, and a text file containing the SVN modules that I wanted initially. Then a simple bash script to loop through the file and create a mirror of each SVN module:&lt;br /&gt;&lt;br /&gt;&lt;code&gt;for f in `cat svn-modules.txt` ; do svn2git.sh $f ; done&lt;/code&gt;&lt;br /&gt;&lt;br /&gt;&lt;script src="http://gist.github.com/202391.js"&gt;&lt;/script&gt;&lt;br /&gt;&lt;br /&gt;Then just make the repositories available:&lt;br /&gt;&lt;br /&gt;&lt;code&gt;git-daemon --export-all --base-path=/opt/git --verbose&lt;/code&gt;&lt;br /&gt;&lt;br /&gt;and create a cron job to refresh the git mirrors periodically.&lt;br /&gt;&lt;br /&gt;&lt;code&gt;git --bare svn fetch --all&lt;/code&gt;&lt;br /&gt;&lt;br /&gt;There are other ways, but that's the quick-n-dirty approach. Then a similar script on the client, which used the same list of modules that I wanted to check out.&lt;br /&gt;&lt;br /&gt;&lt;script src="http://gist.github.com/202397.js"&gt;&lt;/script&gt;&lt;br /&gt;&lt;br /&gt;Benefits of this approach: &lt;br /&gt;&lt;ul&gt;&lt;li&gt;Much faster to set up - it took just over a couple of hours this time.&lt;/li&gt;&lt;br /&gt;&lt;li&gt;Available to other people to try out - not just me.&lt;/li&gt;&lt;br /&gt;&lt;li&gt;Provides a migration path off SVN as we eventually migrate off SVN (my long-term aim, muhahaha)&lt;/li&gt;&lt;/ul&gt;&lt;div class="blogger-post-footer"&gt;All content Copyright 2005, 2006 James Abley&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/13473243-6491747120301434433?l=eternusuk.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://eternusuk.blogspot.com/feeds/6491747120301434433/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=13473243&amp;postID=6491747120301434433' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/13473243/posts/default/6491747120301434433'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/13473243/posts/default/6491747120301434433'/><link rel='alternate' type='text/html' href='http://eternusuk.blogspot.com/2009/10/settig-up-git-mirrors-of-svn.html' title='Settig up Git mirrors of SVN'/><author><name>James Abley</name><uri>http://www.blogger.com/profile/10389773375250732709</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-13473243.post-3878360572563472580</id><published>2009-09-21T06:36:00.002+01:00</published><updated>2009-09-21T06:41:55.681+01:00</updated><title type='text'>Separation of concerns</title><content type='html'>&lt;a href="http://www.tbray.org/ongoing/When/200x/2009/09/17/Hotels"&gt;The shower control described here&lt;/a&gt; resonated with me. Having a separate control for temperature and volume appeals to me as a software developer. But most sinks don't work this way. Instead, you have a tap for hot water and one for cold. I've seen a sink which did have controls as per the shower. I liked it; most other people complained and eventually it was replaced with a more typical Western arrangement. I wonder why the idea doesn't transport well from shower to sink, or if there are places where that is the norm?&lt;div class="blogger-post-footer"&gt;All content Copyright 2005, 2006 James Abley&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/13473243-3878360572563472580?l=eternusuk.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://eternusuk.blogspot.com/feeds/3878360572563472580/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=13473243&amp;postID=3878360572563472580' title='3 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/13473243/posts/default/3878360572563472580'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/13473243/posts/default/3878360572563472580'/><link rel='alternate' type='text/html' href='http://eternusuk.blogspot.com/2009/09/separation-of-concerns.html' title='Separation of concerns'/><author><name>James Abley</name><uri>http://www.blogger.com/profile/10389773375250732709</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>3</thr:total></entry><entry><id>tag:blogger.com,1999:blog-13473243.post-4706395553706723729</id><published>2009-09-16T13:06:00.001+01:00</published><updated>2009-09-16T13:09:12.641+01:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='jruby'/><category scheme='http://www.blogger.com/atom/ns#' term='rails'/><category scheme='http://www.blogger.com/atom/ns#' term='tomcat'/><title type='text'>JRuby on Rails Tomcat logging</title><content type='html'>We have a mixed dev team - Windows and Linux currently, although I'm considering a Mac.&lt;br /&gt;&lt;br /&gt;In your environment:&lt;br /&gt;&lt;pre&gt;&lt;br /&gt;os = java.lang.System.get_property 'os.name'&lt;br /&gt;&lt;br /&gt;config.logger = Logger.new('/var/log/my-company/my-app/rails.log', 5, 104857) if os.downcase =~ /linux/&lt;br /&gt;&lt;/pre&gt;&lt;div class="blogger-post-footer"&gt;All content Copyright 2005, 2006 James Abley&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/13473243-4706395553706723729?l=eternusuk.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://eternusuk.blogspot.com/feeds/4706395553706723729/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=13473243&amp;postID=4706395553706723729' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/13473243/posts/default/4706395553706723729'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/13473243/posts/default/4706395553706723729'/><link rel='alternate' type='text/html' href='http://eternusuk.blogspot.com/2009/09/jruby-on-rails-tomcat-logging.html' title='JRuby on Rails Tomcat logging'/><author><name>James Abley</name><uri>http://www.blogger.com/profile/10389773375250732709</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-13473243.post-2712077235959519654</id><published>2009-09-16T10:27:00.003+01:00</published><updated>2009-09-16T11:05:38.550+01:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='maven'/><title type='text'>Maven Woes 2</title><content type='html'>More time spent fighting with maven. Projects which used hibernate starting failing yesterday. We use XDoclet to generate the hibernate mapping files.&lt;br /&gt;&lt;pre&gt;&lt;br /&gt;Unable to find resource 'xdoclet-plugins:xdoclet-plugin-qtags:jar:1.0.4-SNAPSHOT' in repository&lt;br /&gt;central (http://repo1.maven.org/maven2)&lt;br /&gt;[INFO] ------------------------------------------------------------------------&lt;br /&gt;[ERROR] BUILD ERROR&lt;br /&gt;[INFO] ------------------------------------------------------------------------&lt;br /&gt;[INFO] Failed to resolve artifact.&lt;br /&gt;&lt;br /&gt;Missing:&lt;br /&gt;----------&lt;br /&gt;1) xdoclet-plugins:xdoclet-plugin-qtags:jar:1.0.4-SNAPSHOT&lt;br /&gt;Try downloading the file manually from the project website.&lt;br /&gt;&lt;br /&gt;  Then, install it using the command: &lt;br /&gt;      mvn install:install-file -DgroupId=xdoclet-plugins -DartifactId=xdoclet-plugin-qtags -Dversion=1.0.4-SNAPSHOT -Dpackaging=jar -Dfile=/path/to/file&lt;br /&gt;&lt;br /&gt;  Alternatively, if you host your own repository you can deploy the file there: &lt;br /&gt;      mvn deploy:deploy-file -DgroupId=xdoclet-plugins -DartifactId=xdoclet-plugin-qtags -Dversion=1.0.4-SNAPSHOT -Dpackaging=jar -Dfile=/path/to/file -Durl=[url] -DrepositoryId=[id]&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;For whatever reason, maven wouldn't use the SNAPSHOT version that I had locally. I couldn't find a 1.0.4 released version on t'Internet, so I just deployed the snapshot that I had in my local repository as the 1.0.4 released version. Naughty me. Had to do the same for the xdoclet-plugin-hibernate plugin as well.&lt;br /&gt;&lt;br /&gt;UPDATE: And today it's working with the SNAPSHOT versions again. Still just doing &lt;code&gt;mvn clean install&lt;/code&gt;, on Ubuntu, Windows Vista and within Hudson on Red Hat. Silently breaks, and then fixes itself. WTF is that all about?&lt;div class="blogger-post-footer"&gt;All content Copyright 2005, 2006 James Abley&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/13473243-2712077235959519654?l=eternusuk.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://eternusuk.blogspot.com/feeds/2712077235959519654/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=13473243&amp;postID=2712077235959519654' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/13473243/posts/default/2712077235959519654'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/13473243/posts/default/2712077235959519654'/><link rel='alternate' type='text/html' href='http://eternusuk.blogspot.com/2009/09/maven-woes-2.html' title='Maven Woes 2'/><author><name>James Abley</name><uri>http://www.blogger.com/profile/10389773375250732709</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-13473243.post-540258054981889365</id><published>2009-09-16T09:42:00.006+01:00</published><updated>2009-09-16T10:27:52.339+01:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='maven'/><title type='text'>Maven Woes 1</title><content type='html'>My mental model of Maven is that there is a small kernel and lots of plugins which provide functionality. On a daily basis, maven will try to update plugins that it uses; e.g. for dependency resolution. You can configure maven to not upgrade certain core plugins, but people don't tend to do this. Perhaps they should...&lt;br /&gt;&lt;br /&gt;At the beginning of August this year, I started getting this:&lt;br /&gt;&lt;pre&gt;&lt;br /&gt; Unable to find resource 'bouncycastle:bctsp-jdk14:jar:138' in repository&lt;br /&gt;central (http://repo1.maven.org/maven2)&lt;br /&gt;[INFO] ------------------------------------------------------------------------&lt;br /&gt;[ERROR] BUILD ERROR&lt;br /&gt;[INFO] ------------------------------------------------------------------------&lt;br /&gt;[INFO] Failed to resolve artifact.&lt;br /&gt;&lt;br /&gt;Missing:&lt;br /&gt;----------&lt;br /&gt;1) bouncycastle:bctsp-jdk14:jar:138&lt;br /&gt;&lt;br /&gt;  Try downloading the file manually from the project website.&lt;br /&gt;&lt;br /&gt;  Then, install it using the command:&lt;br /&gt;      mvn install:install-file -DgroupId=bouncycastle -DartifactId=bctsp-jdk14 -&lt;br /&gt;Dversion=138 -Dpackaging=jar -Dfile=/path/to/file&lt;br /&gt;&lt;br /&gt;  Alternatively, if you host your own repository you can deploy the file there:&lt;br /&gt;&lt;br /&gt;      mvn deploy:deploy-file -DgroupId=bouncycastle -DartifactId=bctsp-jdk14 -Dv&lt;br /&gt;ersion=138 -Dpackaging=jar -Dfile=/path/to/file -Durl=[url] -DrepositoryId=[id]&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;This broke not only all of our trunk builds, but also previously released items. Bouncy Castle jars presumably aren't in the main repositories due to crypto-export issues for some countries. We don't need to ship them. The cause of the problem? We had a dependency on jasperreports. This has an open-ended dependency:&lt;br /&gt;&lt;pre&gt;&lt;br /&gt;&amp;lt;dependency&amp;gt;&lt;br /&gt;  &amp;lt;groupId&amp;gt;com.lowagie&amp;lt;/groupId&amp;gt;&lt;br /&gt;  &amp;lt;artifactId&amp;gt;itext&amp;lt;/artifactId&amp;gt;&lt;br /&gt;  &amp;lt;version&amp;gt;[1.02b,)&amp;lt;/version&amp;gt;&lt;br /&gt;  &amp;lt;scope&amp;gt;compile&amp;lt;/scope&amp;gt;&lt;br /&gt;&amp;lt;/dependency&amp;gt;&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;Version 2.1.7 of com.lowagie itext (released a couple of months ago) &lt;a href="http://www.mvnrepository.com/artifact/com.lowagie/itext/2.1.7"&gt;introduced a dependency on bouncycastle&lt;/a&gt;. Before that time, maven had been resolving the com.lowagie itext version to use version 1.3.1. Presumably a plugin was updated to fix a known bug in open-ended dependencies like the one in jasperreports and it exposed us to this problem. We were OK until the bug was fixed! Our current solution is to explicitly define the com.lowagie itext version as 2.1.5, which doesn't have the bouncycastle dependency. The closer dependency wins over the transitive dependency, yada...&lt;div class="blogger-post-footer"&gt;All content Copyright 2005, 2006 James Abley&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/13473243-540258054981889365?l=eternusuk.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://eternusuk.blogspot.com/feeds/540258054981889365/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=13473243&amp;postID=540258054981889365' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/13473243/posts/default/540258054981889365'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/13473243/posts/default/540258054981889365'/><link rel='alternate' type='text/html' href='http://eternusuk.blogspot.com/2009/09/maven-woes-1.html' title='Maven Woes 1'/><author><name>James Abley</name><uri>http://www.blogger.com/profile/10389773375250732709</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-13473243.post-8426558255489759038</id><published>2009-09-07T13:19:00.002+01:00</published><updated>2009-09-07T13:22:50.391+01:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='atom jabber xmpp predictions'/><title type='text'>Technology predictions revisited</title><content type='html'>An email that I sent internally about some of our RSS and Atom feed processing, on 2008-03-04:&lt;br /&gt;&lt;br /&gt;"The push aspect is a little annoying. We can do polling quite well now, but push via SFTP is messy. One day people will wake up and do this over Jabber, using something based on Atom, but until then, I guess we need to have a scheduled task that polls the SFTP directory and copies content about. Plus ça change, plus c’est la meme chose..."&lt;br /&gt;&lt;br /&gt;That would be &lt;a href="http://code.google.com/p/pubsubhubbub/"&gt;PubSubHubbub&lt;/a&gt; then.&lt;div class="blogger-post-footer"&gt;All content Copyright 2005, 2006 James Abley&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/13473243-8426558255489759038?l=eternusuk.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://eternusuk.blogspot.com/feeds/8426558255489759038/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=13473243&amp;postID=8426558255489759038' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/13473243/posts/default/8426558255489759038'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/13473243/posts/default/8426558255489759038'/><link rel='alternate' type='text/html' href='http://eternusuk.blogspot.com/2009/09/technology-predictions-revisited.html' title='Technology predictions revisited'/><author><name>James Abley</name><uri>http://www.blogger.com/profile/10389773375250732709</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-13473243.post-6701229352803709654</id><published>2009-07-02T20:28:00.002+01:00</published><updated>2009-07-02T20:35:42.990+01:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='firefox browsers'/><title type='text'>Ubuntu Firefox 3.5 update</title><content type='html'>I've switched to &lt;a href="http://www.asoftsite.org/s9y/archives/160-FAQ-Where-can-I-get-firefox-3.5-for-Ubuntu.html"&gt;3.5 as my main Firefox&lt;/a&gt; (using &lt;a href="http://dev.chromium.org/getting-involved/dev-channel"&gt;Google Chrome&lt;/a&gt; / &lt;a href="https://launchpad.net/~chromium-daily/+archive/ppa"&gt;Chromium Web Browser&lt;/a&gt; as well). Just needed to update the symlink in /usr/bin/firefox so that applications using the system default browser were opening the right version of Firefox.&lt;br /&gt;&lt;br /&gt;$ sudo rm /usr/bin/firefox&lt;br /&gt;$ sudo ln -s /usr/bin/firefox-3.5 /usr/bin/firefox&lt;div class="blogger-post-footer"&gt;All content Copyright 2005, 2006 James Abley&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/13473243-6701229352803709654?l=eternusuk.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://eternusuk.blogspot.com/feeds/6701229352803709654/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=13473243&amp;postID=6701229352803709654' title='6 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/13473243/posts/default/6701229352803709654'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/13473243/posts/default/6701229352803709654'/><link rel='alternate' type='text/html' href='http://eternusuk.blogspot.com/2009/07/ubuntu-firefox-35-update.html' title='Ubuntu Firefox 3.5 update'/><author><name>James Abley</name><uri>http://www.blogger.com/profile/10389773375250732709</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-13473243.post-2756941787703437300</id><published>2009-05-27T10:53:00.005+01:00</published><updated>2009-05-27T23:54:00.975+01:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='jruby'/><category scheme='http://www.blogger.com/atom/ns#' term='jmx'/><category scheme='http://www.blogger.com/atom/ns#' term='sysadmin'/><title type='text'>Scripting JMX via JRuby</title><content type='html'>I'm gradually growing some operations scripts which use JMX to alter application behaviour according to system load / required maintenance, etc. JRuby is a nice easy way to create these scripts.&lt;br /&gt;&lt;br /&gt;&lt;pre&gt;&lt;br /&gt;host = 'some-ip'&lt;br /&gt;port = 'port-number'&lt;br /&gt;serviceUrl = javax.management.remote.JMXServiceURL.new("service:jmx:rmi:///jndi/rmi://#{host}:#{port}/jmxrmi")&lt;br /&gt;connector = javax.management.remote.JMXConnectorFactory.connect(serviceUrl)&lt;br /&gt;remote = connector.getMBeanServerConnection()&lt;br /&gt;remoteRuntime = java.lang.management.ManagementFactory.newPlatformMXBeanProxy(remote, &lt;br /&gt;                     java.lang.management.ManagementFactory::RUNTIME_MXBEAN_NAME, &lt;br /&gt;                     java.lang.management.RuntimeMXBean.java_class)&lt;br /&gt;p remoteRuntime.getName()&lt;br /&gt;connector.close()&lt;br /&gt;&lt;/pre&gt;&lt;div class="blogger-post-footer"&gt;All content Copyright 2005, 2006 James Abley&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/13473243-2756941787703437300?l=eternusuk.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://eternusuk.blogspot.com/feeds/2756941787703437300/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=13473243&amp;postID=2756941787703437300' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/13473243/posts/default/2756941787703437300'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/13473243/posts/default/2756941787703437300'/><link rel='alternate' type='text/html' href='http://eternusuk.blogspot.com/2009/05/scripting-jmx-via-jruby.html' title='Scripting JMX via JRuby'/><author><name>James Abley</name><uri>http://www.blogger.com/profile/10389773375250732709</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-13473243.post-4956621157686382359</id><published>2009-04-19T22:13:00.002+01:00</published><updated>2009-04-19T22:18:07.020+01:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='microsoft'/><title type='text'>Seriously - another standard plugin for viewing video on the web?</title><content type='html'>&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://2.bp.blogspot.com/_IY2ao-kxldk/SeuUxysRmRI/AAAAAAAAAAM/2YunOJkuTe0/s1600-h/lang-symposium-FAIL.png"&gt;&lt;img style="float:right; margin:0 0 10px 10px;cursor:pointer; cursor:hand;width: 320px; height: 200px;" src="http://2.bp.blogspot.com/_IY2ao-kxldk/SeuUxysRmRI/AAAAAAAAAAM/2YunOJkuTe0/s320/lang-symposium-FAIL.png" border="0" alt=""id="BLOGGER_PHOTO_ID_5326514567437719826" /&gt;&lt;/a&gt;&lt;br /&gt;I was trying to view some content via Gilad Bracha but it wasn't easy enough to do and I can't be bothered with it.&lt;br /&gt;&lt;br /&gt;FAIL!&lt;div class="blogger-post-footer"&gt;All content Copyright 2005, 2006 James Abley&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/13473243-4956621157686382359?l=eternusuk.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://eternusuk.blogspot.com/feeds/4956621157686382359/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=13473243&amp;postID=4956621157686382359' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/13473243/posts/default/4956621157686382359'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/13473243/posts/default/4956621157686382359'/><link rel='alternate' type='text/html' href='http://eternusuk.blogspot.com/2009/04/seriously-another-standard-plugin-for.html' title='Seriously - another standard plugin for viewing video on the web?'/><author><name>James Abley</name><uri>http://www.blogger.com/profile/10389773375250732709</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://2.bp.blogspot.com/_IY2ao-kxldk/SeuUxysRmRI/AAAAAAAAAAM/2YunOJkuTe0/s72-c/lang-symposium-FAIL.png' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-13473243.post-1918755975640175619</id><published>2009-04-06T21:46:00.003+01:00</published><updated>2009-04-06T21:55:27.606+01:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='boys'/><category scheme='http://www.blogger.com/atom/ns#' term='climbing'/><category scheme='http://www.blogger.com/atom/ns#' term='lakes'/><title type='text'>Indoctrination</title><content type='html'>&lt;p id="20090406-01-p1"&gt;So it begins. Took the boys climbing today, of sorts. I thought Callum was ready for it; Connor less so, but organisational issues being how they are, I had the big two while Al was off with the little one.&lt;/p&gt;&lt;p id="20090406-01-p2"&gt;The venue was Brant Fell. I'd gone there the previous day and done pretty much everything apart from the traverse and a fingery eliminate at about Font 7b (similar to Perfect Day direct at Gardoms, but smaller holds. Failed with a bad split tip, same as the last time I tried Perfect Day! I think that's related to Callum's steroid cream  thinning my finger-tip skin). Callum was pretty happy, romped up 3 short things. Connor, not so happy. He tied on, but then didn't like it so bailed. He then tried to solo stuff instead. That boy!&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;All content Copyright 2005, 2006 James Abley&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/13473243-1918755975640175619?l=eternusuk.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://eternusuk.blogspot.com/feeds/1918755975640175619/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=13473243&amp;postID=1918755975640175619' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/13473243/posts/default/1918755975640175619'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/13473243/posts/default/1918755975640175619'/><link rel='alternate' type='text/html' href='http://eternusuk.blogspot.com/2009/04/indoctrination.html' title='Indoctrination'/><author><name>James Abley</name><uri>http://www.blogger.com/profile/10389773375250732709</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-13473243.post-2141764310322977759</id><published>2009-03-30T10:58:00.002+01:00</published><updated>2009-03-30T11:30:34.284+01:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='java'/><category scheme='http://www.blogger.com/atom/ns#' term='eclipse'/><category scheme='http://www.blogger.com/atom/ns#' term='hacking'/><title type='text'>Java doesNotUnderstand-like behaviour in Eclipse</title><content type='html'>Kent Beck tweeted &lt;a href="http://twitter.com/KentBeck/status/1400043943"&gt;this&lt;/a&gt; recently. I've been doing this for years, but I guess it's not as widely used as I assumed.&lt;br /&gt;&lt;br /&gt;Window | Preferences | Java | Code Style | Code Templates | Code | Method Body&lt;br /&gt;&lt;br /&gt;&lt;code&gt;&lt;br /&gt;// ${todo} Auto-generated method stub&lt;br /&gt;throw new UnsupportedOperationException("Not implemented");&lt;br /&gt;&lt;/code&gt;&lt;br /&gt;&lt;br /&gt;Then add a breakpoint to your Debugger Breakpoint view:&lt;br /&gt;&lt;br /&gt;&lt;code&gt;New Java Exception for UnsupportedOperationException that hasn't been caught.&lt;/code&gt;&lt;br /&gt;&lt;br /&gt;IDEA supports something similar, since I had it set up then as well, but I've not used IDEA for a couple of years.&lt;br /&gt;&lt;br /&gt;I tend not to use debuggers; I prefer tests, but sometimes a debugger's the thing.&lt;div class="blogger-post-footer"&gt;All content Copyright 2005, 2006 James Abley&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/13473243-2141764310322977759?l=eternusuk.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://eternusuk.blogspot.com/feeds/2141764310322977759/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=13473243&amp;postID=2141764310322977759' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/13473243/posts/default/2141764310322977759'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/13473243/posts/default/2141764310322977759'/><link rel='alternate' type='text/html' href='http://eternusuk.blogspot.com/2009/03/java-doesnotunderstand-like-behaviour.html' title='Java doesNotUnderstand-like behaviour in Eclipse'/><author><name>James Abley</name><uri>http://www.blogger.com/profile/10389773375250732709</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-13473243.post-215521819008462149</id><published>2009-02-01T22:54:00.001Z</published><updated>2009-02-01T22:57:11.923Z</updated><category scheme='http://www.blogger.com/atom/ns#' term='ruby'/><category scheme='http://www.blogger.com/atom/ns#' term='java'/><category scheme='http://www.blogger.com/atom/ns#' term='repl'/><category scheme='http://www.blogger.com/atom/ns#' term='jruby'/><category scheme='http://www.blogger.com/atom/ns#' term='hacking'/><title type='text'>Java REPL</title><content type='html'>Obviously, most good dynamic languages for the JVM have this, but still, it's sweet.&lt;br /&gt;&lt;br /&gt;&lt;pre&gt;&lt;br /&gt;$ jirb &lt;br /&gt;irb(main):001:0&gt; require 'lib/org.restlet.jar'&lt;br /&gt;=&gt; true&lt;br /&gt;irb(main):002:0&gt;  http = Java::OrgRestletData::Protocol::HTTP&lt;br /&gt;=&gt; #&amp;lt;Java::OrgRestletData::Protocol:0x59cbda @java_object=#&lt;Java::JavaObject:0x18600d6&gt;&gt;&lt;br /&gt;irb(main):003:0&gt; client = Java::OrgRestlet::Client.new http &lt;br /&gt;=&gt; #&amp;lt;Java::OrgRestlet::Client:0x800aa1 @java_object=#&lt;Java::JavaObject:0x39da8a&gt;&gt;&lt;br /&gt;irb(main):004:0&gt; r = client.get 'http://www.apache.org/'&lt;br /&gt;01-Feb-2009 22:54:08 org.restlet.engine.http.StreamClientHelper start&lt;br /&gt;INFO: Starting the HTTP client&lt;br /&gt;=&gt; #&amp;lt;Java::OrgRestletData::Response:0x12a416a @java_object=#&lt;Java::JavaObject:0x12cb585&gt;&gt;&lt;br /&gt;&lt;/pre&gt;&lt;div class="blogger-post-footer"&gt;All content Copyright 2005, 2006 James Abley&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/13473243-215521819008462149?l=eternusuk.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://eternusuk.blogspot.com/feeds/215521819008462149/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=13473243&amp;postID=215521819008462149' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/13473243/posts/default/215521819008462149'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/13473243/posts/default/215521819008462149'/><link rel='alternate' type='text/html' href='http://eternusuk.blogspot.com/2009/02/java-repl.html' title='Java REPL'/><author><name>James Abley</name><uri>http://www.blogger.com/profile/10389773375250732709</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-13473243.post-4513805699013158578</id><published>2009-01-26T20:30:00.002Z</published><updated>2009-01-26T20:33:19.300Z</updated><category scheme='http://www.blogger.com/atom/ns#' term='boys'/><title type='text'>Body Swerve</title><content type='html'>Cameron making us laugh again. I picked him up from nursery the other day and got home. Al was in the kitchen with open arms looking for a hug. He started off towards her, then dropped his shoulder, sold a beautiful dummy and went straight for the drawer with the pans to get some out and start banging! Not bad considering he's only been walking properly for less than a month.&lt;div class="blogger-post-footer"&gt;All content Copyright 2005, 2006 James Abley&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/13473243-4513805699013158578?l=eternusuk.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://eternusuk.blogspot.com/feeds/4513805699013158578/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=13473243&amp;postID=4513805699013158578' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/13473243/posts/default/4513805699013158578'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/13473243/posts/default/4513805699013158578'/><link rel='alternate' type='text/html' href='http://eternusuk.blogspot.com/2009/01/body-swerve.html' title='Body Swerve'/><author><name>James Abley</name><uri>http://www.blogger.com/profile/10389773375250732709</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-13473243.post-1515700661340203645</id><published>2009-01-26T20:18:00.004Z</published><updated>2009-01-26T20:30:41.011Z</updated><category scheme='http://www.blogger.com/atom/ns#' term='java'/><category scheme='http://www.blogger.com/atom/ns#' term='jaxp'/><category scheme='http://www.blogger.com/atom/ns#' term='hacking'/><title type='text'>JAXP pipelines using SAX</title><content type='html'>&lt;a href="http://www.w3.org/TR/xproc/"&gt;XProc&lt;/a&gt; looks handy, but is not in a usable state yet. So I had to roll my own pipeline as a one-off recently, and seemed to struggle more than I expected. The requirement was fairly simple&lt;br /&gt;&lt;ol&gt;&lt;br /&gt;&lt;li&gt;Ingest some HTML and convert to well-formed XML for processing;&lt;/li&gt;&lt;br /&gt;&lt;li&gt;filter that XML to remove unwanted content;&lt;/li&gt;&lt;br /&gt;&lt;li&gt;convert the XML to a different format.&lt;/li&gt;&lt;/ol&gt;&lt;br /&gt;&lt;br /&gt;Step 2 was a new bit - I already had well-tested code for the other two parts. So I wanted to re-use that as much as possible. JAXP pipelines using SAX looked to be (and is!) very nice for this, but examples seemed a bit thin on the ground. I've put a version of it here, in the hope that others may find it useful.&lt;br /&gt;&lt;pre&gt;&lt;br /&gt;/* Create an InputSource for the pipeline input document. */&lt;br /&gt;InputSource in = new InputSource(new ByteArrayInputStream(StringUtils.getBytes(text, "utf-8")));&lt;br /&gt;&lt;br /&gt;/* Step 1. TagSoup parsing to get well-formed XML */&lt;br /&gt;XMLReader reader = new Parser();&lt;br /&gt;&lt;br /&gt;try {&lt;br /&gt;    SAXTransformerFactory stf = (SAXTransformerFactory) SAXTransformerFactory.newInstance();&lt;br /&gt;&lt;br /&gt;    StringWriter sb = new StringWriter();&lt;br /&gt;&lt;br /&gt;    OutputFormat outputFormat = new OutputFormat();&lt;br /&gt;    outputFormat.setOmitXMLDeclaration(true);&lt;br /&gt;&lt;br /&gt;    XMLSerializer serializer = new org.apache.xml.serialize.XMLSerializer(outputFormat);&lt;br /&gt;    serializer.setOutputCharStream(sb);&lt;br /&gt;&lt;br /&gt;    /* Step 2. Remove unwanted markup from the well-formed XML. */&lt;br /&gt;    InputStream stripContent = getResourceAsStream("strip-content.xslt");&lt;br /&gt;    XMLFilter removeUnwanted = stf.newXMLFilter(new StreamSource(stripContent));&lt;br /&gt;&lt;br /&gt;    /* Step 3. Convert to preferred markup format. */&lt;br /&gt;    InputStream xsltResourceInputStream = getResourceAsStream("xhtml2dial.xslt");&lt;br /&gt;    XMLFilter xhtml2dial = stf.newXMLFilter(new StreamSource(xsltResourceInputStream));&lt;br /&gt;&lt;br /&gt;    removeUnwanted.setParent(reader);&lt;br /&gt;    xhtml2dial.setParent(removeUnwanted);&lt;br /&gt;    xhtml2dial.setContentHandler(serializer.asContentHandler());&lt;br /&gt;&lt;br /&gt;    reader.parse(in);&lt;br /&gt;&lt;br /&gt;    return sb.toString();&lt;br /&gt;} catch (TransformerException e) {&lt;br /&gt;    throw new ConversionException(e.getMessage(), e);&lt;br /&gt;} catch (IOException e) {&lt;br /&gt;    throw new ConversionException(e.getMessage(), e);&lt;br /&gt;} catch (SAXException e) {&lt;br /&gt;    throw new ConversionException(e.getMessage(), e);&lt;br /&gt;}&lt;br /&gt;&lt;/pre&gt;&lt;div class="blogger-post-footer"&gt;All content Copyright 2005, 2006 James Abley&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/13473243-1515700661340203645?l=eternusuk.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://eternusuk.blogspot.com/feeds/1515700661340203645/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=13473243&amp;postID=1515700661340203645' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/13473243/posts/default/1515700661340203645'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/13473243/posts/default/1515700661340203645'/><link rel='alternate' type='text/html' href='http://eternusuk.blogspot.com/2009/01/jaxp-pipelines-using-sax.html' title='JAXP pipelines using SAX'/><author><name>James Abley</name><uri>http://www.blogger.com/profile/10389773375250732709</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-13473243.post-9108464722645822993</id><published>2008-12-25T21:52:00.005Z</published><updated>2009-01-26T20:40:17.668Z</updated><category scheme='http://www.blogger.com/atom/ns#' term='hg'/><category scheme='http://www.blogger.com/atom/ns#' term='scheme'/><category scheme='http://www.blogger.com/atom/ns#' term='hacking'/><title type='text'>More learning</title><content type='html'>I like &lt;a href="http://www.selenic.com/mercurial/"&gt;Mercurial&lt;/a&gt;. I'm trying to &lt;a href="http://www.bitbucket.org/jabley/eopl3/"&gt;use it more&lt;/a&gt;, to see how it can improve my workflow (and trying to resist the complexity of git for the moment). I'm also trying to do a lot with &lt;a href="http://en.wikipedia.org/wiki/Scheme_(programming_language)"&gt;Scheme&lt;/a&gt;, thus scratching my itch of learning about language design generally and a Lisp in a more in-depth fashion.&lt;br /&gt;&lt;br /&gt;UPDATE: I've actually restricted access to the bitbucket repository at one of the &lt;a href="http://groups.google.com/group/eopl3/browse_thread/thread/4a56952e6bf9c427#"&gt;author's request&lt;/a&gt;. Leave a comment here if you want access and I'll see about allowing access on a per-person basis. Allowing access will at the very least depend on good verification of the requestor and posting to the group to allow any instructors to veto access.&lt;div class="blogger-post-footer"&gt;All content Copyright 2005, 2006 James Abley&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/13473243-9108464722645822993?l=eternusuk.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://eternusuk.blogspot.com/feeds/9108464722645822993/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=13473243&amp;postID=9108464722645822993' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/13473243/posts/default/9108464722645822993'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/13473243/posts/default/9108464722645822993'/><link rel='alternate' type='text/html' href='http://eternusuk.blogspot.com/2008/12/more-learning.html' title='More learning'/><author><name>James Abley</name><uri>http://www.blogger.com/profile/10389773375250732709</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-13473243.post-74150154897458825</id><published>2008-12-25T20:43:00.004Z</published><updated>2008-12-25T21:22:58.922Z</updated><category scheme='http://www.blogger.com/atom/ns#' term='wikipedia'/><title type='text'>Socially responsible internet citizenship</title><content type='html'>I may not yet be knowledgeable enough to contribute editorially, but I can contribute to Wikipedia financially. Just donated. &lt;br /&gt;&lt;br /&gt;&lt;a href="http://wikimediafoundation.org/wiki/Donate/en"&gt;&lt;img border="0" alt="Wikipedia Affiliate Button" src="http://upload.wikimedia.org/wikipedia/foundation/1/1a/2008_fundraiser_banner_button-en.png" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;Update: Not sure how &lt;a href="http://www.w3.org/Provider/Style/URI"&gt;cool a URI&lt;/a&gt; &lt;a href="http://wikimediafoundation.org/wiki/Special:ContributionHistory?offset=1230237936#203340"&gt;this&lt;/a&gt; is - not sure they've read Bill de hÓra's &lt;a href="http://www.dehora.net/journal/2008/07/20/efficient-api-paging-count-down-not-up/"&gt;post on paging&lt;/a&gt;.&lt;div class="blogger-post-footer"&gt;All content Copyright 2005, 2006 James Abley&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/13473243-74150154897458825?l=eternusuk.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://eternusuk.blogspot.com/feeds/74150154897458825/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=13473243&amp;postID=74150154897458825' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/13473243/posts/default/74150154897458825'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/13473243/posts/default/74150154897458825'/><link rel='alternate' type='text/html' href='http://eternusuk.blogspot.com/2008/12/socially-responsible-internet.html' title='Socially responsible internet citizenship'/><author><name>James Abley</name><uri>http://www.blogger.com/profile/10389773375250732709</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-13473243.post-6331081710946387044</id><published>2008-11-23T20:11:00.002Z</published><updated>2008-11-23T20:14:39.803Z</updated><category scheme='http://www.blogger.com/atom/ns#' term='social responsibility'/><title type='text'>mysociety.org - How great!</title><content type='html'>I've previously used &lt;a href="http://WriteToThem.com/"&gt;WriteToThem.com&lt;/a&gt; to communicate my concerns on various government / EU policies. I didn't realise that the people behind that site also had a host of other initiatives. &lt;a href="http://mysociety.org/"&gt;mysociety.org&lt;/a&gt; is a fabulous concept that shows what can be done by moderately organised people with a little bit of  technology.&lt;div class="blogger-post-footer"&gt;All content Copyright 2005, 2006 James Abley&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/13473243-6331081710946387044?l=eternusuk.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://eternusuk.blogspot.com/feeds/6331081710946387044/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=13473243&amp;postID=6331081710946387044' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/13473243/posts/default/6331081710946387044'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/13473243/posts/default/6331081710946387044'/><link rel='alternate' type='text/html' href='http://eternusuk.blogspot.com/2008/11/mysocietyorg-how-great.html' title='mysociety.org - How great!'/><author><name>James Abley</name><uri>http://www.blogger.com/profile/10389773375250732709</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-13473243.post-7795954372458042705</id><published>2008-11-17T09:46:00.002Z</published><updated>2008-11-17T10:03:08.310Z</updated><category scheme='http://www.blogger.com/atom/ns#' term='ubuntu'/><category scheme='http://www.blogger.com/atom/ns#' term='svn'/><title type='text'>Enforced SVN upgrade</title><content type='html'>&lt;p&gt;I migrated from Eclipse Europa (3.3) to Eclipse Ganymede (3.4), re-installed the necessary plugins and noticed an issue with using svn on the CLI.&lt;/p&gt;&lt;br /&gt;&lt;code&gt;&lt;br /&gt;$ svn up&lt;br /&gt;svn: This client is too old to work with working copy '.'; please get a newer Subversion client&lt;br /&gt;&lt;/code&gt;&lt;br /&gt;&lt;code&gt;$ svn --version&lt;br /&gt;svn, version 1.4.6 (r28521)&lt;br /&gt;   compiled Mar 11 2008, 08:26:35&lt;br /&gt;&lt;br /&gt;Copyright (C) 2000-2007 CollabNet.&lt;br /&gt;Subversion is open source software, see http://subversion.tigris.org/&lt;br /&gt;This product includes software developed by CollabNet (http://www.Collab.Net/).&lt;br /&gt;&lt;br /&gt;The following repository access (RA) modules are available:&lt;br /&gt;&lt;br /&gt;* ra_dav : Module for accessing a repository via WebDAV (DeltaV) protocol.&lt;br /&gt;  - handles 'http' scheme&lt;br /&gt;  - handles 'https' scheme&lt;br /&gt;* ra_svn : Module for accessing a repository using the svn network protocol.&lt;br /&gt;  - handles 'svn' scheme&lt;br /&gt;* ra_local : Module for accessing a repository on local disk.&lt;br /&gt;  - handles 'file' scheme&lt;br /&gt;&lt;/code&gt;&lt;br /&gt;&lt;p&gt;Apparently, Subclipse had upgraded my working copies and my CLI client was too old to cope with this. The options appeared to be either upgrade to Ibex, build svn locally or use hardy-backports. Backports seemed like the best option and has a nice &lt;a href="https://help.ubuntu.com/community/UbuntuBackports#Use%20pinning%20to%20limit%20the%20backports%20repository"&gt;option&lt;/a&gt; to restrict what I want to install.&lt;/p&gt;&lt;br /&gt;&lt;code&gt;$ cat /etc/apt/preference&lt;br /&gt;Package: *&lt;br /&gt;Pin: release a=hardy-backports&lt;br /&gt;Pin-Priority: 400&lt;br /&gt;&lt;/code&gt;&lt;br /&gt;&lt;code&gt;$ sudo aptitude install subversion=1.5.1dfsg1-1ubuntu2~hardy2&lt;br /&gt;Reading package lists... Done&lt;br /&gt;Building dependency tree       &lt;br /&gt;Reading state information... Done&lt;br /&gt;Reading extended state information       &lt;br /&gt;Initialising package states... Done&lt;br /&gt;Building tag database... Done      &lt;br /&gt;The following packages are BROKEN:&lt;br /&gt;  subversion &lt;br /&gt;1 packages upgraded, 0 newly installed, 0 to remove and 0 not upgraded.&lt;br /&gt;Need to get 1274kB of archives. After unpacking 713kB will be used.&lt;br /&gt;The following packages have unmet dependencies:&lt;br /&gt;  subversion: Depends: libsvn1 (= 1.5.1dfsg1-1ubuntu2~hardy2) but 1.4.6dfsg1-2ubuntu1 is installed.&lt;br /&gt;Resolving dependencies...&lt;br /&gt;The following actions will resolve these dependencies:&lt;br /&gt;&lt;br /&gt;Upgrade the following packages:&lt;br /&gt;libsvn1 [1.4.6dfsg1-2ubuntu1 (hardy, now) -&gt; 1.5.1dfsg1-1ubuntu2~hardy2 (hardy-backports)]&lt;br /&gt;&lt;br /&gt;Score is 20&lt;br /&gt;&lt;br /&gt;Accept this solution? [Y/n/q/?] Y&lt;br /&gt;The following packages will be upgraded:&lt;br /&gt;  libsvn1 subversion &lt;br /&gt;2 packages upgraded, 0 newly installed, 0 to remove and 0 not upgraded.&lt;br /&gt;Need to get 1995kB of archives. After unpacking 971kB will be used.&lt;br /&gt;Do you want to continue? [Y/n/?] Y&lt;br /&gt;Writing extended state information... Done&lt;br /&gt;Get:1 http://gb.archive.ubuntu.com hardy-backports/main subversion 1.5.1dfsg1-1ubuntu2~hardy2 [1274kB]&lt;br /&gt;Get:2 http://gb.archive.ubuntu.com hardy-backports/main libsvn1 1.5.1dfsg1-1ubuntu2~hardy2 [721kB]                                                                                                                                           &lt;br /&gt;Fetched 1995kB in 27s (72.2kB/s)                                                                                                                                                                                                             &lt;br /&gt;(Reading database ... 169200 files and directories currently installed.)&lt;br /&gt;Preparing to replace subversion 1.4.6dfsg1-2ubuntu1 (using .../subversion_1.5.1dfsg1-1ubuntu2~hardy2_i386.deb) ...&lt;br /&gt;Unpacking replacement subversion ...&lt;br /&gt;Preparing to replace libsvn1 1.4.6dfsg1-2ubuntu1 (using .../libsvn1_1.5.1dfsg1-1ubuntu2~hardy2_i386.deb) ...&lt;br /&gt;Unpacking replacement libsvn1 ...&lt;br /&gt;Setting up libsvn1 (1.5.1dfsg1-1ubuntu2~hardy2) ...&lt;br /&gt;&lt;br /&gt;Setting up subversion (1.5.1dfsg1-1ubuntu2~hardy2) ...&lt;br /&gt;Installing new version of config file /etc/bash_completion.d/subversion ...&lt;br /&gt;Installing new version of config file /etc/subversion/config ...&lt;br /&gt;Installing new version of config file /etc/subversion/servers ...&lt;br /&gt;Processing triggers for libc6 ...&lt;br /&gt;ldconfig deferred processing now taking place&lt;br /&gt;Reading package lists... Done             &lt;br /&gt;Building dependency tree       &lt;br /&gt;Reading state information... Done&lt;br /&gt;Reading extended state information      &lt;br /&gt;Initialising package states... Done&lt;br /&gt;Building tag database... Done      &lt;br /&gt;&lt;/code&gt;&lt;br /&gt;&lt;p&gt;Subversion upgrade - DONE!&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;All content Copyright 2005, 2006 James Abley&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/13473243-7795954372458042705?l=eternusuk.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://eternusuk.blogspot.com/feeds/7795954372458042705/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=13473243&amp;postID=7795954372458042705' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/13473243/posts/default/7795954372458042705'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/13473243/posts/default/7795954372458042705'/><link rel='alternate' type='text/html' href='http://eternusuk.blogspot.com/2008/11/enforced-svn-upgrade.html' title='Enforced SVN upgrade'/><author><name>James Abley</name><uri>http://www.blogger.com/profile/10389773375250732709</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-13473243.post-7002209298767801476</id><published>2008-09-22T23:31:00.003+01:00</published><updated>2008-09-22T23:47:09.460+01:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='ubuntu'/><title type='text'>Ubuntu Hardy issues</title><content type='html'>&lt;p&gt;Just a place holder for stuff as I hit it.&lt;/p&gt;&lt;ol&gt;&lt;li&gt;Hibernate / Resume has stopped working. Damn, now it takes me 10 minutes to start up and shutdown at the end of the day. That's time my employer is losing. With Gutsy, Sleep was great. Just shut the lid and leg it out at the end of the day to beat the traffic and pick up the kids. Now I have to stop writing code early. &lt;a href="https://bugs.launchpad.net/ubuntu/+source/acpi/+bug/270637"&gt;Tracking&lt;/a&gt; this, but I'm don't have an idea of when I might get the old functionality back.&lt;/li&gt;&lt;li&gt;Thunderbird with Lightning 0.8 stopped understanding iCal, VCALENDAR and all remote and local Calendar data disappeared. I eventually narrowed it down to &lt;a href="https://bugs.launchpad.net/ubuntu/+source/thunderbird/+bug/227232"&gt;this&lt;/a&gt;. With libstdc++5 installed locally, a reinstall of the lightning 0.8 plugin brought all my calendars back. Might be moving more of them into the cloud from now on though.&lt;/li&gt;&lt;li&gt;IO seems a slower, or the disk is getting spun quite a lot more. That's just a subjective impression though, and I don't have any Bonnie(++) numbers for my laptop before the upgrade.&lt;/li&gt;&lt;li&gt;Network Manager seems to have a hard time with roaming now. At work, I'm on a LAN all the time. At home, I'm on my LAN or WiFi. Switching at home seems a lot more troublesome that it used to be, and &lt;code&gt;/etc/init.d/dbus restart&lt;/code&gt; as my usual brute force approach seems to stop the NM applet from getting put back into the System Tray. No bug report for that yet, since that sounds a little woolly!&lt;/li&gt;&lt;/ol&gt;&lt;div class="blogger-post-footer"&gt;All content Copyright 2005, 2006 James Abley&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/13473243-7002209298767801476?l=eternusuk.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://eternusuk.blogspot.com/feeds/7002209298767801476/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=13473243&amp;postID=7002209298767801476' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/13473243/posts/default/7002209298767801476'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/13473243/posts/default/7002209298767801476'/><link rel='alternate' type='text/html' href='http://eternusuk.blogspot.com/2008/09/ubuntu-hardy-issues.html' title='Ubuntu Hardy issues'/><author><name>James Abley</name><uri>http://www.blogger.com/profile/10389773375250732709</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-13473243.post-6184481615839832408</id><published>2008-09-09T23:01:00.003+01:00</published><updated>2010-05-25T12:25:59.333+01:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='java'/><category scheme='http://www.blogger.com/atom/ns#' term='cryptography'/><category scheme='http://www.blogger.com/atom/ns#' term='hacking'/><title type='text'>Java Triple DES example</title><content type='html'>I had to do this recently, and the examples that I found through Google seemed a little lacking. So a pointer to others:&lt;br /&gt;&lt;br /&gt;&lt;code&gt;&lt;script src="http://gist.github.com/413030.js?file=gistfile1.pde"&gt;&lt;/script&gt;&lt;br /&gt;&lt;/code&gt;&lt;div&gt;&lt;code&gt;&lt;br /&gt;&lt;/code&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span"  &gt;&lt;span class="Apple-style-span" style="font-size: 13px;"&gt;&lt;b&gt;UPDATE&lt;/b&gt;&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span"  &gt;&lt;span class="Apple-style-span" style="font-size: 13px;"&gt;&lt;b&gt;&lt;br /&gt;&lt;/b&gt;&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span"  &gt;&lt;span class="Apple-style-span" style="font-size: 13px;"&gt;Changed to use a gist on github. That will probably dilute the search ranking of this post (which is reasonably popular) but gives me nicer formatting!&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;All content Copyright 2005, 2006 James Abley&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/13473243-6184481615839832408?l=eternusuk.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://eternusuk.blogspot.com/feeds/6184481615839832408/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=13473243&amp;postID=6184481615839832408' title='13 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/13473243/posts/default/6184481615839832408'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/13473243/posts/default/6184481615839832408'/><link rel='alternate' type='text/html' href='http://eternusuk.blogspot.com/2008/09/java-triple-des-example.html' title='Java Triple DES example'/><author><name>James Abley</name><uri>http://www.blogger.com/profile/10389773375250732709</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>13</thr:total></entry><entry><id>tag:blogger.com,1999:blog-13473243.post-1579804762222479483</id><published>2008-09-08T22:24:00.003+01:00</published><updated>2008-09-08T23:20:08.719+01:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='boys'/><title type='text'>Environmental influences</title><content type='html'>&lt;p id="20080908-2-1"&gt;Thinking back to leaving Yorkshire also popped into my head how we learn things. I left Yorkshire just before I was 10. When I left, I said "Ow" when I fell over. Within a couple of months of living in Warwickshire, I said "Aie-Yah". WTF? Call it mirroring, blending, whatever. I had changed my behaviour from what was previously defined to suit my new environment.&lt;/p&gt;&lt;p id="20080908-2-2"&gt;We've recently had cause to consider how the kids are being raised, after being exposed to some new ideas and rejecting them. That's not what I want to directly talk about now though. It's more how things are learned. We think Connor has a very high tolerance to pain. Obviously, this isn't a boundary that &lt;a href="http://en.wikipedia.org/wiki/Elle_Bishop"&gt;most people&lt;/a&gt; want to find the limits of, so I say that based on watching him when he was smaller, and how he'd happily fall over when learning to walk, and had no fear. When I say fall, face-plant would be more accurate. He never seemed to learn to put his hands out, because nothing hurt him, therefore he never used to cry. But he's learned. Callum is much more vocal when he's upset, even if &lt;a href="http://www.imdb.com/title/tt0071853/quotes#qt0288559"&gt;it's just a flesh wound&lt;/a&gt;. I think Connor has learned to cry from Callum even though he's not hurt, or in pain to the level where it causes him discomfort. But if he falls over, he's learned that he should cry. Interesting.&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;All content Copyright 2005, 2006 James Abley&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/13473243-1579804762222479483?l=eternusuk.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://eternusuk.blogspot.com/feeds/1579804762222479483/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=13473243&amp;postID=1579804762222479483' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/13473243/posts/default/1579804762222479483'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/13473243/posts/default/1579804762222479483'/><link rel='alternate' type='text/html' href='http://eternusuk.blogspot.com/2008/09/environmental-influences.html' title='Environmental influences'/><author><name>James Abley</name><uri>http://www.blogger.com/profile/10389773375250732709</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-13473243.post-8683429660373148216</id><published>2008-09-08T21:54:00.005+01:00</published><updated>2008-09-08T22:08:59.260+01:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='boys'/><category scheme='http://www.blogger.com/atom/ns#' term='yorkshire'/><title type='text'>Crystal tones</title><content type='html'>Al's been pointing out a few occasions when I lapse into Northern; e.g. "Look at them cars, boys!". Not the greatest grammar in the world, and the kids have started to pick up on it. It reminded me of my own childhood, when my folks used to find mine and my brother's habit of dropping our H's quite painful. I often wonder if a contributing factor to leaving Yorkshire was to correct our speaking before it became an insurmountable problem. "'Ow do Fred, what's tha 'aving fer t' tea?". Whereas personally I find it problematic that our kids are currently growing up saying '&lt;a href="http://www.howjsay.com/index.php?word=glass"&gt;glarse&lt;/a&gt;' rather than glas. Oh well, plus ça change, plus c'est la même chose.&lt;div class="blogger-post-footer"&gt;All content Copyright 2005, 2006 James Abley&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/13473243-8683429660373148216?l=eternusuk.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://eternusuk.blogspot.com/feeds/8683429660373148216/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=13473243&amp;postID=8683429660373148216' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/13473243/posts/default/8683429660373148216'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/13473243/posts/default/8683429660373148216'/><link rel='alternate' type='text/html' href='http://eternusuk.blogspot.com/2008/09/crystal-tones.html' title='Crystal tones'/><author><name>James Abley</name><uri>http://www.blogger.com/profile/10389773375250732709</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-13473243.post-8664116049907027773</id><published>2008-08-26T21:29:00.005+01:00</published><updated>2008-08-26T22:08:36.898+01:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='etags'/><title type='text'>Broken ETags in the Wild</title><content type='html'>&lt;p id="20080826-2-1"&gt;I've had a good &lt;a href="http://www.intertwingly.net/blog/2006/06/05/Elevator-Pitch"&gt;teacher&lt;/a&gt;. Just noting some of the things I've come across.&lt;h4&gt;Default Apache httpd configuration in a cluster with multiple filesystems&lt;/h4&gt;&lt;p&gt;By &lt;a href="http://httpd.apache.org/docs/2.2/mod/core.html#fileetag"&gt;default&lt;/a&gt;, Apache httpd generates an ETag of the format &lt;code&gt;inode-filesize-timestamp&lt;/code&gt;. A symptom of this sort of physical architecture is seeing ETags for the same resource and representation that have the same last part; e.g. &lt;code&gt;"518854-3504d-ce290380"&lt;/code&gt; and &lt;code&gt;"c8578-3504d-ce290380"&lt;/code&gt;, and probably the same Last-Modified value too. This can be fixed by changing the Apache &lt;a href="http://developer.yahoo.net/blog/archives/2007/07/high_performanc_11.html"&gt;configuration&lt;/a&gt; or ignoring the ETag and just using Last-Modified. I would normally recommend retaining the ETag and just using the MTime and Size parts to calculate the ETag value.&lt;/p&gt;&lt;h4&gt;&lt;a href="http://www.escenic.com/"&gt;EScenic CMS&lt;/a&gt;&lt;/h4&gt;&lt;p&gt;I'm not sure whether this is an application developer issue, or a problem with the EScenic server itself, but the ETag values that I've seen from this server aren't quoted.&lt;/p&gt;&lt;code&gt;Etag: 20080523124147BST-39-6&lt;/code&gt;&lt;p&gt;The &lt;a href="http://www.w3.org/Protocols/rfc2616/rfc2616-sec3.html#sec3.11"&gt;ETag&lt;/a&gt; value should be a &lt;a href="http://www.w3.org/Protocols/rfc2616/rfc2616-sec2.html#sec2.2"&gt;quoted string&lt;/a&gt;&lt;/p&gt;&lt;br /&gt;&lt;/p&gt;&lt;h4&gt;Django on Google App Engine 1.0 &lt;/h4&gt;&lt;p&gt;The version of Django 0.96.1 that &lt;a href="http://code.google.com/appengine/articles/django.html"&gt;shipped&lt;/a&gt; with Google App Engine had a similar problem to the EScenic Server, so I'd recommend bundling Django with your app until Google update the bundled version. I went to fix this in Django trunk, only to &lt;a href="http://code.djangoproject.com/ticket/7228"&gt;find&lt;/a&gt; someone beat me to it!&lt;/p&gt;&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;All content Copyright 2005, 2006 James Abley&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/13473243-8664116049907027773?l=eternusuk.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://eternusuk.blogspot.com/feeds/8664116049907027773/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=13473243&amp;postID=8664116049907027773' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/13473243/posts/default/8664116049907027773'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/13473243/posts/default/8664116049907027773'/><link rel='alternate' type='text/html' href='http://eternusuk.blogspot.com/2008/08/broken-etags-in-wild.html' title='Broken ETags in the Wild'/><author><name>James Abley</name><uri>http://www.blogger.com/profile/10389773375250732709</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-13473243.post-4466688782657178427</id><published>2008-08-26T20:06:00.007+01:00</published><updated>2008-08-26T21:03:34.067+01:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='boys'/><category scheme='http://www.blogger.com/atom/ns#' term='recovery'/><category scheme='http://www.blogger.com/atom/ns#' term='cameron'/><title type='text'>Cameron</title><content type='html'>&lt;p id="20080826-1-1"&gt;Something happened earlier this year and I'm only now comfortable enough to able to talk about it. It happened on 22nd June. At the time, it was terrifying, but it has a good ending.&lt;/p&gt;&lt;p id="20080826-1-2"&gt;Al had gone away for the weekend and I was at home playing single parent. Sunday morning, not quite woken from my reverie by Cameron crying softly, I got up, changed his nappy then put him on the floor in his room to play. Connor started calling to get me to come help him on the toilet. I left Cameron's room, pulled the stairgate shut and went to the bathroom to help Connor, rubbing the sleep from my eyes. About 10 seconds later I heard the worst sound that I've ever heard. A soft thudding as the boy went down the stairs, followed by immediate screaming. Fuck. I raced down to find a scene from a Tarantino film. I don't know whether the detachment comes from my (long expired) medical training, or that's just what people naturally do in these situations. I noted the pools of blood on the Mediterranean-tiled floor. Then the bump on his forehead where the blood was coming from, as I cradled him. "That's a strange looking bump, more of an indentation. Oh, that's his skull." Reaching for a muslin to try to apply pressure to the wound. It was too wide really anyway to allow effective compression, so I tried to pack the wound while talking to the emergency services operator. It was very hard to hear them with my own state and Cameron either in pain or understandably upset. Got the other two to dress themselves while the ambulance came and I got some clothes on and mopped up the blood. A big part of me even at that point was worrying Al'll kill me if she sees this, and I didn't want his brothers to see all the blood.&lt;/p&gt;&lt;p id="20080826-1-3"&gt;The ambulance came and we all piled in. Callum and Connor were thrilled to be in the van with the sirens going off. I was probably white as and trying to speak calmly to Cameron as they strapped me on the bed and we moved swiftly to Frimley Park. The ambulance crew were great and we got there, Cameron having thrown up on the journey and coming close to closing his eyes a few times.&lt;/p&gt;&lt;p id="20080826-1-4"&gt;A&amp;E was very quiet. Lots of fabulous nursing staff were there, and able to take some of the load in terms of getting out toys for the other two boys and Cameron showed an interest as well. Then I could phone Al at her hotel on the hen-weekend and relay the bad news. She took it as well as could be expected and we had lots of crying phone calls as she was driven from Bath to get to the hospital. Due to the lack of urgency in how we were being treated, I was getting more confident at this point that it wasn't life-threatening. By this time, it was the boy's nap time and the nursing staff were happy enough that he could go to sleep. Al arrived maybe 15 minutes after he went to sleep and came into the ward to see him sleeping with his eyes open, head lolling back in my arms and a cut wider maybe a centimetre wide and 6 centimetres long on his forehead, with the bone showing through. It looked ghastly and we were both crying again. We had some fraught communication with the Reg / SHO about where the best place for treatment was. Doubtless that wasn't helped by our frame of mind, and the language issue with the guy. But we were immensely happy with the level of treatment and service that the emergency services provide. You only really miss something when you don't have it anymore; I don't ever want to experience that loss with our primary medical care.&lt;/p&gt;&lt;p id="20080826-1-5"&gt; Due to the nature of the head injury, Cameron was kept in overnight for observation. Our friends Alan and Alison provided invaluable help in taking the two older boys with them to a rowing regatta where they got spoiled on BBQ and ice-creams until I went to pick them up later. As an indicator of where my head was, I picked them up and promptly drove the wrong way around a roundabout. Fortunately the guy coming the other way was going fairly slowly, then my brain kicked in and I recognised where I was. Al phoned later with the results of the CT scan (she's very persuasive!).&lt;/p&gt;&lt;p id="20080826-1-6"&gt;Cameron and Al were transferred to St George's Tooting to go to the Maxillo Facial surgical unit, where Dr Singh did an amazing job of closing him up. We got to take him home the same day.&lt;p&gt;&lt;p id="20080826-1-7"&gt;We examined the stairgate. It is a retractable one, which clips onto the opposing wall at the top and the bottom. The top clip was on a block screwed into the wall. I had placed the block 4 years earlier, which had then been removed and replaced by the painter, and endured some abuse from the other two swinging on it. We saw that it was fairly easy to just clip the gate on the top alone, without clipping the attachment on the skirting board as well. When set like this, effectively it acted like a catflap and Cameron would have had hardly any resistance to crawling against it. Not ensuring that this was properly attached was completely my fault. We were so lucky with how this turned out; from the blood pattern it looked like he'd surfed on his stomach down the first 5 steps and hit the skirting board with his head. From there, he'd rolled down the rest of the stairs to the tiled floor below, but somehow not done further damage to himself when he got to the tiles. Then the first order was shooting some video so that both sets of grandparents could see the extent of the damage and be assuaged that they didn't need to travel down to see him straight away.&lt;/p&gt;&lt;br /&gt;&lt;object width="425" height="344"&gt;&lt;param name="movie" value="http://www.youtube.com/v/LkBK8SAdjfE&amp;hl=en&amp;fs=1"&gt;&lt;/param&gt;&lt;param name="allowFullScreen" value="true"&gt;&lt;/param&gt;&lt;embed src="http://www.youtube.com/v/LkBK8SAdjfE&amp;hl=en&amp;fs=1" type="application/x-shockwave-flash" allowfullscreen="true" width="425" height="344"&gt;&lt;/embed&gt;&lt;/object&gt;&lt;br /&gt;&lt;p id="20080826-1-8"&gt;So lucky, and so blessed.&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;All content Copyright 2005, 2006 James Abley&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/13473243-4466688782657178427?l=eternusuk.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://eternusuk.blogspot.com/feeds/4466688782657178427/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=13473243&amp;postID=4466688782657178427' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/13473243/posts/default/4466688782657178427'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/13473243/posts/default/4466688782657178427'/><link rel='alternate' type='text/html' href='http://eternusuk.blogspot.com/2008/08/cameron.html' title='Cameron'/><author><name>James Abley</name><uri>http://www.blogger.com/profile/10389773375250732709</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-13473243.post-4633935413503882893</id><published>2008-08-26T07:06:00.001+01:00</published><updated>2008-11-08T22:14:05.911Z</updated><category scheme='http://www.blogger.com/atom/ns#' term='java'/><category scheme='http://www.blogger.com/atom/ns#' term='megadata'/><category scheme='http://www.blogger.com/atom/ns#' term='facebook'/><category scheme='http://www.blogger.com/atom/ns#' term='google'/><category scheme='http://www.blogger.com/atom/ns#' term='hacking'/><title type='text'>Facebook Mega-Data</title><content type='html'>Just noticed that Facebook open-sourced a version of their BigTable data store and it's &lt;a href="http://code.google.com/p/the-cassandra-project/"&gt;hosted&lt;/a&gt; on Google code, written in Java. I'll omit the obvious snickers about Facebook cloning BigTable and then hosting on Google Code.&lt;div class="blogger-post-footer"&gt;All content Copyright 2005, 2006 James Abley&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/13473243-4633935413503882893?l=eternusuk.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://eternusuk.blogspot.com/feeds/4633935413503882893/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=13473243&amp;postID=4633935413503882893' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/13473243/posts/default/4633935413503882893'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/13473243/posts/default/4633935413503882893'/><link rel='alternate' type='text/html' href='http://eternusuk.blogspot.com/2008/08/facebook-mega-data.html' title='Facebook Mega-Data'/><author><name>James Abley</name><uri>http://www.blogger.com/profile/10389773375250732709</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-13473243.post-1309479078446207020</id><published>2008-04-24T20:11:00.003+01:00</published><updated>2008-04-24T20:16:32.457+01:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='windows'/><category scheme='http://www.blogger.com/atom/ns#' term='ubuntu'/><category scheme='http://www.blogger.com/atom/ns#' term='it support'/><title type='text'>FogCreek Copilot - impressed</title><content type='html'>I was hoping that now I don't have a Windows machine any more that I could wriggle out of IT support duties for the family. Well, Copilot works under Wine on Ubuntu 7.10. Arse. I was wondering about talking my folks through installing a VNC server on their machine, but just tried the Copilot quick free demo, and it all worked. And it's free on the weekend. So I guess that's my IT support position.&lt;div class="blogger-post-footer"&gt;All content Copyright 2005, 2006 James Abley&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/13473243-1309479078446207020?l=eternusuk.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://eternusuk.blogspot.com/feeds/1309479078446207020/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=13473243&amp;postID=1309479078446207020' title='1 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/13473243/posts/default/1309479078446207020'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/13473243/posts/default/1309479078446207020'/><link rel='alternate' type='text/html' href='http://eternusuk.blogspot.com/2008/04/fogcreek-copilot-impressed.html' title='FogCreek Copilot - impressed'/><author><name>James Abley</name><uri>http://www.blogger.com/profile/10389773375250732709</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-13473243.post-1695817188627208985</id><published>2008-04-20T22:45:00.004+01:00</published><updated>2008-04-29T13:49:39.024+01:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='migration'/><category scheme='http://www.blogger.com/atom/ns#' term='vista'/><category scheme='http://www.blogger.com/atom/ns#' term='ubuntu'/><title type='text'>How to dismantle an Atomic Bomb (otherwise known as de-stressing by migrating from Vista to Ubuntu)</title><content type='html'>Finally it's happened! I've been able to get off Windows Vista and install Gutsy Gibbon on my work laptop. Herein follows a few notes on things that I noticed, which may help others take the leap. This will probably get updated as I notice things that I've missed, or that went well.&lt;br /&gt;&lt;br /&gt;&lt;ol&gt;&lt;li&gt;Cygwin. I can't say enough good things about that project. It's been great to have on Windows and ultimately played a very important part in getting stuff off my laptop before wiping the hard-drive.  I've found the people involved very helpful and responsive. My initial attempts to rsync data to a safe location failed. &lt;cite&gt;If you're using Windows, go fuck yourself&lt;/cite&gt;, &lt;a href="http://jwz.livejournal.com/801607.html"&gt;jwz, 2007&lt;/a&gt;. Contacting the mailing list led me to try the snapshot versions, report issues and see them fixed very quickly. Thanks Corinna and others.&lt;/li&gt;&lt;br /&gt;&lt;li&gt;Firefox. My profile was split over ${HOME}/AppData/Local/Mozilla/Firefox and ${HOME}/AppData/Roaming/Mozilla/Firefox. I consolidated the two by copying to ~/.mozilla/firefox. The profiles.ini file needed editing, since it has an incorrect relative path to the profile folder. I also needed to rename extensions.rdf, so that a new one is built on startup. This preserved all of my extensions (apart from Google Toolbar; there is a Linux-specific version?) and associated data such as ModifyHeaders values, UserAgentSwitcher values, etc. I have needed to manually edit some preferences, such as Download location, and then restart Firefox for it to take effect, but otherwise it all seems to be working fine. Similarly for Thunderbird, although I should have exported my Lightning Calendars first - I seem to have lost them, but that's no biggie. I still have all of the emails (MBOX!) (although my tags seem to have disappeared. That's a bit of a pisser). Maybe I should have migrated that to GMail, rather than copying mboxes around, but it's worked.&lt;/li&gt;&lt;br /&gt;&lt;li&gt;SSH. I made sure that I copied my keys over and that they all worked. I seem to have missed the full known_hosts file; I have a copy, but some entries are missing, which is slightly annoying. Also, I forgot my System32/drives/etc/hosts changes, so I'll need to recreate the local aliases that I have for some servers. Sure I can remember that, so not too painful an omission.&lt;/li&gt;&lt;br /&gt;&lt;li&gt;sudo aptitude install tofrodos&lt;/li&gt;&lt;br /&gt;&lt;/ol&gt;&lt;br /&gt;Ubuntu just flies, versus the same hardware running Vista. That's a shocker, obviously ;-).&lt;br /&gt;&lt;br /&gt;&lt;strong&gt;Update&lt;/strong&gt;:&lt;br /&gt;&lt;br /&gt;Eclipse was using a lot of &lt;a href="http://www.google.co.uk/search?q=eclipse+ubuntu+too+many+open+files"&gt;file handles&lt;/a&gt; (I just install the world in terms of the number of plugins I have), which required an addition to /etc/security/limits.conf.&lt;br /&gt;&lt;code&gt;&lt;br /&gt;# raise limits due to Eclipse complaining about too many open files&lt;br /&gt;* soft nofile 5120&lt;br /&gt;* hard nofile 5120&lt;br /&gt;&lt;/code&gt;&lt;div class="blogger-post-footer"&gt;All content Copyright 2005, 2006 James Abley&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/13473243-1695817188627208985?l=eternusuk.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://eternusuk.blogspot.com/feeds/1695817188627208985/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=13473243&amp;postID=1695817188627208985' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/13473243/posts/default/1695817188627208985'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/13473243/posts/default/1695817188627208985'/><link rel='alternate' type='text/html' href='http://eternusuk.blogspot.com/2008/04/how-to-dismantle-atomic-bomb-otherwise.html' title='How to dismantle an Atomic Bomb (otherwise known as de-stressing by migrating from Vista to Ubuntu)'/><author><name>James Abley</name><uri>http://www.blogger.com/profile/10389773375250732709</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-13473243.post-6911144643734835958</id><published>2008-04-18T15:12:00.001+01:00</published><updated>2008-04-18T15:14:55.078+01:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='vista'/><category scheme='http://www.blogger.com/atom/ns#' term='windows problems humour'/><category scheme='http://www.blogger.com/atom/ns#' term='ubuntu'/><category scheme='http://www.blogger.com/atom/ns#' term='backups'/><title type='text'>Shell Meme for migrating off Vista</title><content type='html'>Backing up required files to my home machine first, prior to wiping Vista off the laptop this evening...&lt;br /&gt;&lt;br /&gt;&lt;code&gt;&lt;br /&gt;jabley@python:~$ history | awk '{a[$2]++ } END{for(i in a){print a[i] " " i}}' | sort -rn | head&lt;br /&gt;89 ll&lt;br /&gt;70 sudo&lt;br /&gt;61 cd&lt;br /&gt;41 exit&lt;br /&gt;38 aptitude&lt;br /&gt;18 svn&lt;br /&gt;15 rsync&lt;br /&gt;10 mkdir&lt;br /&gt;10 cp&lt;br /&gt;6 which&lt;br /&gt;&lt;/code&gt;&lt;div class="blogger-post-footer"&gt;All content Copyright 2005, 2006 James Abley&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/13473243-6911144643734835958?l=eternusuk.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://eternusuk.blogspot.com/feeds/6911144643734835958/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=13473243&amp;postID=6911144643734835958' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/13473243/posts/default/6911144643734835958'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/13473243/posts/default/6911144643734835958'/><link rel='alternate' type='text/html' href='http://eternusuk.blogspot.com/2008/04/shell-meme-for-migrating-off-vista.html' title='Shell Meme for migrating off Vista'/><author><name>James Abley</name><uri>http://www.blogger.com/profile/10389773375250732709</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-13473243.post-7932032223382195554</id><published>2008-02-07T22:20:00.001Z</published><updated>2008-02-07T22:26:33.365Z</updated><category scheme='http://www.blogger.com/atom/ns#' term='boys'/><title type='text'>Mouse in your hair is nothing</title><content type='html'>&lt;p id="20080207-3-1"&gt;Just finished Russell Brand's Booky Wook, which is what the title references. Interesting in terms of the honest coverage, but it did feel a little rushed (zeitgeist is everything, darling). At one point he talks about when a mouse lived in his hair (I think it was referenced in the Jonathan Ross interview as well). We can top that. Callum has a nit comb from school; apparently part of the national curriculum to inform hygiene issues. Connor was using it on Al the other night and kept lifting her hair.&lt;dl&gt;&lt;dt&gt;Al&lt;/dt&gt;&lt;dd&gt;Connor, what are you doing?&lt;/dd&gt;&lt;dt&gt;Connor&lt;/dt&gt;&lt;dd&gt;Looking for bees, Mummy.&lt;/dd&gt;&lt;dt&gt;Al&lt;/dt&gt;&lt;dd&gt;Not nits, Connor?&lt;/dd&gt;&lt;dt&gt;Connor&lt;/dt&gt;&lt;dd&gt;No Mummy, BEES!&lt;/dd&gt;&lt;/dl&gt;&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;All content Copyright 2005, 2006 James Abley&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/13473243-7932032223382195554?l=eternusuk.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://eternusuk.blogspot.com/feeds/7932032223382195554/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=13473243&amp;postID=7932032223382195554' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/13473243/posts/default/7932032223382195554'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/13473243/posts/default/7932032223382195554'/><link rel='alternate' type='text/html' href='http://eternusuk.blogspot.com/2008/02/mouse-in-your-hair-is-nothing.html' title='Mouse in your hair is nothing'/><author><name>James Abley</name><uri>http://www.blogger.com/profile/10389773375250732709</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-13473243.post-4740170031552279336</id><published>2008-02-07T22:00:00.000Z</published><updated>2008-02-07T22:18:52.100Z</updated><category scheme='http://www.blogger.com/atom/ns#' term='widefinder'/><category scheme='http://www.blogger.com/atom/ns#' term='hacking'/><title type='text'>Minor casualties from the disk crash</title><content type='html'>&lt;p id="20080207-2-1"&gt;There was some loss - mainly source code for personal hacking. My Jython UnicodeData implementation was lost, although I did have a copy of that in my GMail Sent folder which has been contributed to the committers in the hope that someone with more time and enthusiasm than me finds it useful. Apparently they have. The other thing lost was my WideFinder sketching. I surprisingly did have an early warning that the disk was close to failure, when my implementation (which was clocking ten seconds  or something) suddenly started taking twenty minutes to complete. Obviously I didn't pick up on this warning; instead blaming it on some horrible mistake in my code. Some learnings from my WideFinder experience.&lt;ul&gt;&lt;li&gt;NIO can be tricky, and should probably have an easier API in comparison to classical IO. It was nice to look at this anyway, and I'll probably have a read of the Jython and JRuby IO stuff to see how others do it, and also the &lt;a href="http://mina.apache.org/"&gt;Apache NIO stuff&lt;/a&gt;.&lt;/li&gt;&lt;li&gt;Java string matching is slow using regexp. I'd not got as far as implementing Boyer-Moore or similar, but I expected to get a big hike out of my 10 second time when switching to that.&lt;/li&gt;&lt;li&gt;CAS is good, versus synchronized blocks. Brian Goetz has talked about the advantages of non-blocking forms &lt;a href="http://www.ibm.com/developerworks/java/library/j-jtp04186/index.html"&gt;elsewhere&lt;/a&gt;.&lt;/li&gt;&lt;li&gt;Java is quite restrictive. I must have been doing too much Common Lisp, Erlang and Scheme recently!&lt;/li&gt;&lt;/ul&gt;&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;All content Copyright 2005, 2006 James Abley&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/13473243-4740170031552279336?l=eternusuk.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://eternusuk.blogspot.com/feeds/4740170031552279336/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=13473243&amp;postID=4740170031552279336' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/13473243/posts/default/4740170031552279336'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/13473243/posts/default/4740170031552279336'/><link rel='alternate' type='text/html' href='http://eternusuk.blogspot.com/2008/02/minor-casualties-from-disk-crash.html' title='Minor casualties from the disk crash'/><author><name>James Abley</name><uri>http://www.blogger.com/profile/10389773375250732709</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-13473243.post-5440920270379340002</id><published>2008-02-07T20:36:00.000Z</published><updated>2008-02-07T21:59:50.205Z</updated><category scheme='http://www.blogger.com/atom/ns#' term='backups'/><title type='text'>MTBF</title><content type='html'>(File under this will happen to you)&lt;br /&gt;&lt;br /&gt;&lt;p id="20090207-1-1"&gt;Former colleagues may recall how smug I once had occasion to be, when I migrated my old home machine from dual boot with Linux and W2K to solely Ubuntu. My preparation for that was very informed by &lt;a href="http://www.tbray.org/ongoing/When/200x/2006/01/31/Data-Protection"&gt;this&lt;/a&gt;, but it was still slightly nerve-wracking to delete everything and start from scratch. After that, my backups got a little slack. A single 40GB IBM Deskstar with content being intermittently copied over to my external USB drive, with very infrequent backups to DVD. Then the IBM drive crashed. Arse. Oh well, still got the USB drive. Then the USB drive crashed two days later. Oh shit, that's five years of my life in pictures and film gone. The first photos of all the boys...&lt;br /&gt;I was feeling physically sick. A few days later and I have a better appreciation for what I've lost. Personal stuff - nothing. The USB drive started working again after leaving it on for half an hour. Everything was taken off that and put on my work laptop, and I still had photos and video on the cameraflash disk and digital tape respectively. Thank fuck for that.&lt;/p&gt;&lt;p id="20080207-1-2"&gt;Rebuilt machine - two Maxtor 360GB PATA drives (hey, my motherboard is seven years old!). My motherboard aslo has RAID 1 capabilities, but didn't appear to &lt;a href="https://bugs.launchpad.net/ubuntu/+source/grub/+bug/8978"&gt;work&lt;/a&gt; too well when I installed Gutsy. It &lt;a href="http://lists.gnu.org/archive/html/bug-grub/2004-07/msg00113.html"&gt;might&lt;/a&gt; be possible to do it, but I didn't have the patience and was worried about what happens the next time I upgrade the kernel. So I went for the &lt;a href="http://mywheel.net/blog/index.php/software-raid-in-ubuntu/"&gt;software&lt;/a&gt; &lt;a href="http://www.howtoforge.com/linux_software_raid"&gt;RAID&lt;/a&gt; &lt;a href="http://ubuntuforums.org/archive/index.php/t-3136.html"&gt;option&lt;/a&gt; &lt;a href="http://jeestirling.info/wp/2007/11/11/xubuntu-71-gutsy-gibbon-with-software-raid/"&gt;instead&lt;/a&gt;. I'm now doing the backups more frequently along with using S3 for anything that would give me serious pain to lose.&lt;/p&gt;&lt;p id="20080207-1-3"&gt;So just adding to the &lt;a href="http://jwz.livejournal.com/801607.html"&gt;general&lt;/a&gt; &lt;a href="http://www.codinghorror.com/blog/archives/001045.html"&gt;noise&lt;/a&gt; &lt;a href="http://norman.walsh.name/2008/01/26/agony"&gt;around&lt;/a&gt; this issue. Look after your data, people!&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;All content Copyright 2005, 2006 James Abley&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/13473243-5440920270379340002?l=eternusuk.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://eternusuk.blogspot.com/feeds/5440920270379340002/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=13473243&amp;postID=5440920270379340002' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/13473243/posts/default/5440920270379340002'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/13473243/posts/default/5440920270379340002'/><link rel='alternate' type='text/html' href='http://eternusuk.blogspot.com/2008/02/mtbf.html' title='MTBF'/><author><name>James Abley</name><uri>http://www.blogger.com/profile/10389773375250732709</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-13473243.post-7992521470345531802</id><published>2008-02-06T20:28:00.000Z</published><updated>2008-02-07T20:35:47.298Z</updated><category scheme='http://www.blogger.com/atom/ns#' term='boys'/><title type='text'>Clever!!!</title><content type='html'>&lt;p id="20080206-1-1"&gt;Cooking pancakes with the boys today, and Connor was getting a bit impatient waiting for a pancake to cool.&lt;/p&gt;&lt;br /&gt;&lt;dl&gt;&lt;dt&gt;Connor&lt;/dt&gt;&lt;dd&gt;Can I have it?&lt;/dd&gt;&lt;dt&gt;Me&lt;/dt&gt;&lt;dd&gt;No Connor, it's too hot.&lt;/dd&gt;&lt;/dl&gt;&lt;p&gt;Cue the boy going into the cooking draw to get the oven gloves to pick up his pancake. Clever!&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;All content Copyright 2005, 2006 James Abley&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/13473243-7992521470345531802?l=eternusuk.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://eternusuk.blogspot.com/feeds/7992521470345531802/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=13473243&amp;postID=7992521470345531802' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/13473243/posts/default/7992521470345531802'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/13473243/posts/default/7992521470345531802'/><link rel='alternate' type='text/html' href='http://eternusuk.blogspot.com/2008/02/clever.html' title='Clever!!!'/><author><name>James Abley</name><uri>http://www.blogger.com/profile/10389773375250732709</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-13473243.post-5353871043149469048</id><published>2007-12-07T21:55:00.000Z</published><updated>2007-12-07T22:01:03.162Z</updated><category scheme='http://www.blogger.com/atom/ns#' term='quality'/><category scheme='http://www.blogger.com/atom/ns#' term='ubuntu'/><category scheme='http://www.blogger.com/atom/ns#' term='apple'/><title type='text'>Apple envy</title><content type='html'>Does Apple have some quality issues? I'm in the market for a new laptop, and was considering a Mac, having heard good things from some. But recently, &lt;a href="http://www.tbray.org/ongoing/When/200x/2007/12/03/Hate-Apple-Day"&gt;there&lt;/a&gt; seems to be a &lt;a href="http://scobleizer.com/2007/11/16/caught-in-apple-restart-hell/"&gt;spate&lt;/a&gt; of &lt;a href="http://norman.walsh.name/2007/12/07/encryptionLossage"&gt;problems&lt;/a&gt;. Think I'll be staying with Ubuntu on something for now, thanks all the same.&lt;div class="blogger-post-footer"&gt;All content Copyright 2005, 2006 James Abley&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/13473243-5353871043149469048?l=eternusuk.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://eternusuk.blogspot.com/feeds/5353871043149469048/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=13473243&amp;postID=5353871043149469048' title='1 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/13473243/posts/default/5353871043149469048'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/13473243/posts/default/5353871043149469048'/><link rel='alternate' type='text/html' href='http://eternusuk.blogspot.com/2007/12/apple-envy.html' title='Apple envy'/><author><name>James Abley</name><uri>http://www.blogger.com/profile/10389773375250732709</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-13473243.post-8820367626815740461</id><published>2007-12-07T21:37:00.000Z</published><updated>2007-12-07T21:38:50.976Z</updated><category scheme='http://www.blogger.com/atom/ns#' term='scaling'/><category scheme='http://www.blogger.com/atom/ns#' term='hacking'/><title type='text'>Scaling</title><content type='html'>Now here's a &lt;a href="http://www.1060.org/blogxter/entry?publicid=23AE9FADDAE7A343528B4FAF6244949A"&gt;subject&lt;/a&gt; I'd love to read a book about...&lt;div class="blogger-post-footer"&gt;All content Copyright 2005, 2006 James Abley&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/13473243-8820367626815740461?l=eternusuk.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://eternusuk.blogspot.com/feeds/8820367626815740461/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=13473243&amp;postID=8820367626815740461' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/13473243/posts/default/8820367626815740461'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/13473243/posts/default/8820367626815740461'/><link rel='alternate' type='text/html' href='http://eternusuk.blogspot.com/2007/12/scaling.html' title='Scaling'/><author><name>James Abley</name><uri>http://www.blogger.com/profile/10389773375250732709</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-13473243.post-4637837652735723587</id><published>2007-12-07T20:52:00.000Z</published><updated>2007-12-07T20:54:43.314Z</updated><category scheme='http://www.blogger.com/atom/ns#' term='windows problems humour'/><title type='text'>What if pedantic civil servants wrote software?</title><content type='html'>Well, it &lt;a href="http://blog.pmarca.com/2007/12/best-software-e.html"&gt;looks&lt;/a&gt; like &lt;a href="http://en.wikipedia.org/wiki/Bernard_Woolley"&gt;Bernard Woolley&lt;/a&gt; has started to do just that!&lt;div class="blogger-post-footer"&gt;All content Copyright 2005, 2006 James Abley&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/13473243-4637837652735723587?l=eternusuk.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://eternusuk.blogspot.com/feeds/4637837652735723587/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=13473243&amp;postID=4637837652735723587' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/13473243/posts/default/4637837652735723587'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/13473243/posts/default/4637837652735723587'/><link rel='alternate' type='text/html' href='http://eternusuk.blogspot.com/2007/12/what-if-pedantic-civil-servants-wrote.html' title='What if pedantic civil servants wrote software?'/><author><name>James Abley</name><uri>http://www.blogger.com/profile/10389773375250732709</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-13473243.post-839792358720517075</id><published>2007-11-25T23:54:00.000Z</published><updated>2007-11-26T00:26:07.039Z</updated><category scheme='http://www.blogger.com/atom/ns#' term='java'/><category scheme='http://www.blogger.com/atom/ns#' term='widefinder'/><category scheme='http://www.blogger.com/atom/ns#' term='hacking'/><title type='text'>WideFinder - late entrant</title><content type='html'>&lt;p id="20071125-3-1"&gt;Snagged me a log file and starting cranking out some code tonight. I  had some free time to think about this a couple of weeks ago, and got some sketches down, but I've only recently got the data to start seeing how the code can fly. So, I'm starting out on my work Dell laptop, Dual Core Pentium 2GHz with 2GB RAM and a really shitty disk, judging by the slowness and noises it makes (or is that just Vista?) [stay on topic! - Ed]. The Ruby version runs in just over a minute, once all of the caches are warmed up. My initial naive Java version runs in 14 seconds (I haven't figured out yet how to run it using &lt;code&gt;time&lt;/code&gt; as per *nix environments - Cygwin says it can't find the time command when I pipe zcat output into it).&lt;/p&gt;&lt;p id="20071125-3-2"&gt;Now to start implementing my ideas. I have what I think is the shared update of the accumulator as well as I'm going to get it. I'm hypothesising that most of the updates are uncontended and so don't require the full weight of Java's locking capabilities. Now I just need to parallelize the I/O and determine the most efficient matching algorithm, which seems to be Boyer-Moore from reading the Wide-Finder series. That particular algorithm seems to &lt;a href="http://highscalability.com/paper-wikipedias-site-internals-configuration-code-examples-and-management-issues"&gt;pop up&lt;/a&gt; fairly regularly in searching. Might be interesting to see what else is available in that field, but it should be in a library, surely?&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;All content Copyright 2005, 2006 James Abley&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/13473243-839792358720517075?l=eternusuk.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://eternusuk.blogspot.com/feeds/839792358720517075/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=13473243&amp;postID=839792358720517075' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/13473243/posts/default/839792358720517075'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/13473243/posts/default/839792358720517075'/><link rel='alternate' type='text/html' href='http://eternusuk.blogspot.com/2007/11/widefinder-late-entrant.html' title='WideFinder - late entrant'/><author><name>James Abley</name><uri>http://www.blogger.com/profile/10389773375250732709</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-13473243.post-1559683142562546809</id><published>2007-11-25T20:15:00.000Z</published><updated>2007-11-25T20:18:38.757Z</updated><category scheme='http://www.blogger.com/atom/ns#' term='boys'/><title type='text'>Development updates</title><content type='html'>&lt;p id="20071125-2-1"&gt;Just logging the early signs. Connor was walking to nursery with Al the other day, and kicked a cat. There is a history there, the cat had previously scratched him, but even so! The other sign to be aware of is from when the boys recently watched the middle Star Wars trilogy. Afterwards, Callum wanted to role play and be Luke. Connor wanted to be Darth Vader. Enough said.&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;All content Copyright 2005, 2006 James Abley&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/13473243-1559683142562546809?l=eternusuk.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://eternusuk.blogspot.com/feeds/1559683142562546809/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=13473243&amp;postID=1559683142562546809' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/13473243/posts/default/1559683142562546809'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/13473243/posts/default/1559683142562546809'/><link rel='alternate' type='text/html' href='http://eternusuk.blogspot.com/2007/11/development-updates.html' title='Development updates'/><author><name>James Abley</name><uri>http://www.blogger.com/profile/10389773375250732709</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-13473243.post-7016615006327911867</id><published>2007-11-25T19:55:00.000Z</published><updated>2007-11-25T20:15:01.546Z</updated><category scheme='http://www.blogger.com/atom/ns#' term='props'/><category scheme='http://www.blogger.com/atom/ns#' term='oakley'/><title type='text'>Oakley For Ever</title><content type='html'>&lt;p id="20071125-1-1"&gt;I love &lt;a href="http://www.oakley.co.uk/"&gt;Oakley&lt;/a&gt; &lt;sub&gt;[&lt;a href="#20071125-n-1"&gt;1&lt;/a&gt;]&lt;/sub&gt;, and not just for the quality of the purchased product.&lt;ul&gt;&lt;li&gt;From Lance Armstrong's book, he recounts telling his Oakley sponsor that he's been diagnosed with cancer, but he's not got health insurance. The guy from Oakley tells Armstrong not to worry and he sorts it out by telling the insurance company that Armstrong had better damn well be covered, otherwise Oakley will stop doing their company heath insurance scheme through that insurance company. I'm happy spending money with a company that employs that sort of human being.&lt;/li&gt;&lt;li&gt;When I recently lost one of the rubber noseclips from one of my pairs of Oakleys, I phoned up customer service and they posted some out the same day, no charge. That's just great service, and ensures that I'll continue to buy Oakleys and will probably be getting them from my three sons over time as well. Why aren't more companies that switched on about having a great long-term relationship with customers?&lt;/li&gt;&lt;/ul&gt;&lt;/p&gt;&lt;p id="20071125-1-2"&gt;&lt;a name="20071125-n-1"&gt;&lt;/a&gt;[1] Ok, the website does appear to suck somewhat!&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;All content Copyright 2005, 2006 James Abley&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/13473243-7016615006327911867?l=eternusuk.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://eternusuk.blogspot.com/feeds/7016615006327911867/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=13473243&amp;postID=7016615006327911867' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/13473243/posts/default/7016615006327911867'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/13473243/posts/default/7016615006327911867'/><link rel='alternate' type='text/html' href='http://eternusuk.blogspot.com/2007/11/oakley-for-ever.html' title='Oakley For Ever'/><author><name>James Abley</name><uri>http://www.blogger.com/profile/10389773375250732709</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-13473243.post-6952960839487071212</id><published>2007-11-10T00:27:00.000Z</published><updated>2007-11-10T00:49:04.805Z</updated><category scheme='http://www.blogger.com/atom/ns#' term='bouldering'/><category scheme='http://www.blogger.com/atom/ns#' term='spain'/><category scheme='http://www.blogger.com/atom/ns#' term='climbing'/><category scheme='http://www.blogger.com/atom/ns#' term='albarracin'/><category scheme='http://www.blogger.com/atom/ns#' term='2007'/><title type='text'>Albarracin trip day six - return to Sol</title><content type='html'>&lt;p id="20071026-1-1"&gt;Went back to Sol, to go to the other end of it. Really struggled warming up; my arms would not work, and I have very mushy thin tips on all of my fingers and thumbs. Scott did a nice roof, first or second go. I really struggled to link it until I just got really angry, and just pissed up it. Why didn't I do that the first time and save all of the skin and energy, fool? Found it hard to get pysched today, tiredness and missing the family is starting to tell. Next we tried a really cool roof traverse into a slopey top-out. Great moves, but a bit hard for me in that state. Around 7a again, but I split a tip on about fourth go and that was me done. I'd got overlapping halves on it apart from topping out, which I'd split my tip on. Scottie got overlapping halves and topped out, but then seemed to lose power, the sun came around a bit more or something and he didn't look as smooth on it. I then tucked into the baguettes while he thrashed himself on a couple of other things.&lt;/p&gt;&lt;p id="20071026-1-1"&gt;While we were in the area, we went over to Masia. That looks like it's got a few nice things to do as well, so something else to go back for. Final night, we went back to El Molina del Gato, which serves nice beer, has strange music and all of the climbing topos, including French ones so we could work out where we'd gone wrong in looking for Tierra Media. And then another disappointing meal in a place off the main square. Not sure about Spanish food; it must be better than that. Maybe we couldn't speak the language that well, but people couldn't recommend stuff either, and we were getting cold peppers out of a tin served with bad fries and indeterminate meat. Not inspiring. I was already dreaming of Thai green chicken curry.&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;All content Copyright 2005, 2006 James Abley&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/13473243-6952960839487071212?l=eternusuk.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://eternusuk.blogspot.com/feeds/6952960839487071212/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=13473243&amp;postID=6952960839487071212' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/13473243/posts/default/6952960839487071212'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/13473243/posts/default/6952960839487071212'/><link rel='alternate' type='text/html' href='http://eternusuk.blogspot.com/2007/11/albarracin-trip-day-six-return-to-sol.html' title='Albarracin trip day six - return to Sol'/><author><name>James Abley</name><uri>http://www.blogger.com/profile/10389773375250732709</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-13473243.post-7275945532664730293</id><published>2007-11-10T00:16:00.000Z</published><updated>2007-11-10T00:27:39.902Z</updated><category scheme='http://www.blogger.com/atom/ns#' term='bouldering'/><category scheme='http://www.blogger.com/atom/ns#' term='spain'/><category scheme='http://www.blogger.com/atom/ns#' term='climbing'/><category scheme='http://www.blogger.com/atom/ns#' term='albarracin'/><category scheme='http://www.blogger.com/atom/ns#' term='2007'/><title type='text'>Albarracin trip day five - return to Arrastradero</title><content type='html'>&lt;p id="20071025-1-1"&gt;Had some unfinished business with a sit down start to an arete here, so wanted to go back. Mint conditions, quite cold and hard to warm up. Skin still felt trashed. Met up with the two guys from Bristol that we'd met at the car park earlier in the week. I think it was their first time to the area, so they were running around dead keen. Managed to do a few nice things; there was a place round the back quite similar to l'Elephant with sloping flared cracks. There was a really good-looking 7a rib (8a sit start) which I didn't try due to trying to preserve skin, and the original walls that we'd seen on our first visit to this area that we still hadn't tackled. Oh well...&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;All content Copyright 2005, 2006 James Abley&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/13473243-7275945532664730293?l=eternusuk.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://eternusuk.blogspot.com/feeds/7275945532664730293/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=13473243&amp;postID=7275945532664730293' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/13473243/posts/default/7275945532664730293'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/13473243/posts/default/7275945532664730293'/><link rel='alternate' type='text/html' href='http://eternusuk.blogspot.com/2007/11/albarracin-trip-day-five-return-to.html' title='Albarracin trip day five - return to Arrastradero'/><author><name>James Abley</name><uri>http://www.blogger.com/profile/10389773375250732709</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-13473243.post-3185865039147532863</id><published>2007-11-10T00:01:00.001Z</published><updated>2007-11-10T00:15:45.964Z</updated><category scheme='http://www.blogger.com/atom/ns#' term='bouldering'/><category scheme='http://www.blogger.com/atom/ns#' term='spain'/><category scheme='http://www.blogger.com/atom/ns#' term='climbing'/><category scheme='http://www.blogger.com/atom/ns#' term='albarracin'/><category scheme='http://www.blogger.com/atom/ns#' term='2007'/><title type='text'>Albarracin trip day four - rest day</title><content type='html'>&lt;p id="20071024-1-1"&gt;Day four for the first rest day? Well, not really. The first day wasn't much; an hour or so of tinkering. So we've pretty much done the 2 days on, 1 day off thing. It seems to have worked out well, as this was a planned rest day, and it started raining last night.&lt;/p&gt;&lt;p id="20071024-1-2"&gt;So a very late start today, after a lot of vino tinto last night. We decided to go exploring and work out where best to go on our last two days. First off, up towards Techo. This was the first area that we found using the topo and didn't get lost! This looks like quite a brutal hardcore place. OK, so it was a rest day and we're feeling (or I am anyway) quite shredded, but most stuff here looks like you need to be doing 7b to get much out of coming here. There were some inspiring roof lines that looked around 8a; I'll save them until I've lost 10 kg and got strong again.&lt;/p&gt;&lt;p id="20071024-1-3"&gt;We carried on up the hill towards Madriles and Pyschokiller; more big stepped roofs again. Although apparently Pyschokiller might not allow climbing there. Some of the areas are restricted, but not at the time we were here.&lt;/p&gt;&lt;p id="20071024-1-4"&gt;Then we went looking for the visitor's centre that was listed on the national park signs. Unfortunately, our written Spanish was enough to understand that it was only open at weekends and holiday periods. But the drive to get there was quite something. The park seems to be raised about the plateau, and we had some fantastic views of the flood plain and the sandstone towers elsewhere. It looked like going for a walk in that area would be worthwhile on the rest day as well, if we were there for a longer period.&lt;/p&gt;&lt;p id="20071024-1-5"&gt;To round off the day, we tried to find Tierra Media, but our Spanish wasn't up to the task. We did find some striking red trees though; not sure if they were seasonally that colour, or that was their natural plumage, so to speak.&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;All content Copyright 2005, 2006 James Abley&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/13473243-3185865039147532863?l=eternusuk.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://eternusuk.blogspot.com/feeds/3185865039147532863/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=13473243&amp;postID=3185865039147532863' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/13473243/posts/default/3185865039147532863'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/13473243/posts/default/3185865039147532863'/><link rel='alternate' type='text/html' href='http://eternusuk.blogspot.com/2007/11/albarracin-trip-day-four-rest-day.html' title='Albarracin trip day four - rest day'/><author><name>James Abley</name><uri>http://www.blogger.com/profile/10389773375250732709</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-13473243.post-3438096780045977061</id><published>2007-11-09T23:24:00.000Z</published><updated>2007-11-09T23:49:34.203Z</updated><category scheme='http://www.blogger.com/atom/ns#' term='bouldering'/><category scheme='http://www.blogger.com/atom/ns#' term='spain'/><category scheme='http://www.blogger.com/atom/ns#' term='climbing'/><category scheme='http://www.blogger.com/atom/ns#' term='albarracin'/><category scheme='http://www.blogger.com/atom/ns#' term='2007'/><title type='text'>Albarracin trip day three - Sol</title><content type='html'>&lt;p id="20071023-1-1"&gt;Well, a bit more about where we're staying. We're at &lt;a href="http://www.campingalbarracin.com/"&gt;Camping Albarracin&lt;/a&gt;. It's a somewhat strange place in terms of requiring an international bank transfer to pay the deposit, but they accept Visa when I came to pay the balance on arrival. We're in a bungalow advertised as being suitable for four, and it would do that, but it feels very bijou with just the two of us. Not sure how Andy, Emma et al will find it next week!&lt;/p&gt;&lt;p id="20071023-1-2"&gt;Went to Sol today, and again had slight problems finding our way there. We followed our Spanish topo, but went a bit far before breaking up the hill parallel to the road. Sol was good, lots of stuff to warm-up on. My skin is feeling it already though. Trying a big roof today; I couldn't quite use Scott's sequence due to not having sixty foot arms, but need to work on press moves a bit more. I couldn't quite press out over the lip enough.&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;All content Copyright 2005, 2006 James Abley&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/13473243-3438096780045977061?l=eternusuk.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://eternusuk.blogspot.com/feeds/3438096780045977061/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=13473243&amp;postID=3438096780045977061' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/13473243/posts/default/3438096780045977061'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/13473243/posts/default/3438096780045977061'/><link rel='alternate' type='text/html' href='http://eternusuk.blogspot.com/2007/11/albarracin-trip-day-three-sol.html' title='Albarracin trip day three - Sol'/><author><name>James Abley</name><uri>http://www.blogger.com/profile/10389773375250732709</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-13473243.post-8119821630930886613</id><published>2007-11-09T23:11:00.000Z</published><updated>2007-11-09T23:24:38.168Z</updated><category scheme='http://www.blogger.com/atom/ns#' term='bouldering'/><category scheme='http://www.blogger.com/atom/ns#' term='spain'/><category scheme='http://www.blogger.com/atom/ns#' term='climbing'/><category scheme='http://www.blogger.com/atom/ns#' term='albarracin'/><category scheme='http://www.blogger.com/atom/ns#' term='2007'/><title type='text'>Albarracin trip day two - Arrastradero</title><content type='html'>&lt;p id="20071022-1-1"&gt;Had the most awful food at Hotel Albarracin last night. It was steak, but well-done at one end and completely raw (proper raw, not just the raw that I've had in certain French establishments. So, late start before getting up to go climbing. Lovely day again, got a bit lost going to where we intended. We went up to the main car park, and then along the road a bit before striking left into the forest, past a collection of cave paintings. This was thanks to our reading of the topo, and we had inadvertently gone to the wrong side of the hill. We noticed some enticing looking walls on the left (minimum 7a?, so a bit hard to warm up on) and eventually got to where we wanted to be. What we should have done is walked up past the swing park, until you see the climbing area on your right. But our Spanish was non-existent. Another good day, good rock and lovely area. I'm not getting any power onto the rock really, been pulling on blobs too much and got no topping out skills for these slopey topouts, so I'm struggling on everything except the crimpy overhanding walls. Scott is climbing really well, but then he climbs on rock lots! Jealous, moi!?&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;All content Copyright 2005, 2006 James Abley&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/13473243-8119821630930886613?l=eternusuk.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://eternusuk.blogspot.com/feeds/8119821630930886613/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=13473243&amp;postID=8119821630930886613' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/13473243/posts/default/8119821630930886613'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/13473243/posts/default/8119821630930886613'/><link rel='alternate' type='text/html' href='http://eternusuk.blogspot.com/2007/11/albarracin-trip-day-two-arrastradero.html' title='Albarracin trip day two - Arrastradero'/><author><name>James Abley</name><uri>http://www.blogger.com/profile/10389773375250732709</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-13473243.post-8746834888169540600</id><published>2007-11-09T22:58:00.000Z</published><updated>2007-11-09T23:08:15.396Z</updated><category scheme='http://www.blogger.com/atom/ns#' term='bouldering'/><category scheme='http://www.blogger.com/atom/ns#' term='spain'/><category scheme='http://www.blogger.com/atom/ns#' term='climbing'/><category scheme='http://www.blogger.com/atom/ns#' term='albarracin'/><category scheme='http://www.blogger.com/atom/ns#' term='2007'/><title type='text'>Albarracin trip day one</title><content type='html'>&lt;p id="20071021-1-1"&gt;Flew into Madrid, managed to get all of the bouldering kit including my unfeasibly large extending stick on the plane and then drove the Albarracin. No map in the hire care (thanks Europcar!) but a combination of the AA and Google Maps directions got us there without any mishaps. We got there at about six in the evening and Scott was mad keen. I was more up for a beer, but we went for a drive, found some rocks and had a quick play. The rock and national park is really cool, and we were climbing as the moon came up. Beautiful. Sadly Al's got the camera this week, so I hope that my phone will suffice. Think we're going to have a good week.&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;All content Copyright 2005, 2006 James Abley&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/13473243-8746834888169540600?l=eternusuk.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://eternusuk.blogspot.com/feeds/8746834888169540600/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=13473243&amp;postID=8746834888169540600' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/13473243/posts/default/8746834888169540600'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/13473243/posts/default/8746834888169540600'/><link rel='alternate' type='text/html' href='http://eternusuk.blogspot.com/2007/11/albarracin-trip-day-one.html' title='Albarracin trip day one'/><author><name>James Abley</name><uri>http://www.blogger.com/profile/10389773375250732709</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-13473243.post-4878079251855126897</id><published>2007-10-20T20:02:00.002+01:00</published><updated>2008-08-09T17:13:41.342+01:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='boys'/><category scheme='http://www.blogger.com/atom/ns#' term='diy'/><title type='text'>How to remove a key when a 2 year old has snapped the key off in the lock</title><content type='html'>&lt;p id="20071020-1-1"&gt;Google to the rescue again. In case this helps anyone else avoid locksmith callout charges on a Saturday, I started off &lt;a href="http://www.wikihow.com/Repair-a-Broken-Key-While-It's-in-the-Lock"&gt;here&lt;/a&gt; and &lt;a href="http://www.ehow.com/how_117121_extract-broken-key.html"&gt;here&lt;/a&gt;, and was sufficiently enlightened as to solve it myself. Try checking that the key is in the correct orientation to be removed, twisting using a screwdriver where necessary. Then you should hopefully be able to use another key to push it out from the other side, and use tweezers to coax it out the rest of the way. The suggested superglue method wasn't necessary, but is a nice trick.&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;All content Copyright 2005, 2006 James Abley&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/13473243-4878079251855126897?l=eternusuk.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://eternusuk.blogspot.com/feeds/4878079251855126897/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=13473243&amp;postID=4878079251855126897' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/13473243/posts/default/4878079251855126897'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/13473243/posts/default/4878079251855126897'/><link rel='alternate' type='text/html' href='http://eternusuk.blogspot.com/2007/10/how-to-remove-key-when-2-year-old-has.html' title='How to remove a key when a 2 year old has snapped the key off in the lock'/><author><name>James Abley</name><uri>http://www.blogger.com/profile/10389773375250732709</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-13473243.post-2539330417526327260</id><published>2007-10-08T13:16:00.000+01:00</published><updated>2007-10-08T13:20:18.998+01:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='java'/><category scheme='http://www.blogger.com/atom/ns#' term='mockobjects'/><category scheme='http://www.blogger.com/atom/ns#' term='hacking'/><title type='text'>Java Mock Objects tip</title><content type='html'>&lt;p id="20071008-1-1"&gt;Discovered while using JMock, but I would imagine it's also good for EasyMock, RMock, ...&lt;code&gt;&lt;br /&gt;&lt;pre&gt;&lt;br /&gt;checking(new Expectations() {&lt;br /&gt;    {&lt;br /&gt;        one(httpServletRequest).getParameter("c");&lt;br /&gt;        will(returnValue("-2"));&lt;br /&gt;&lt;br /&gt;        one(httpServletRequest).getParameterNames();&lt;br /&gt;&lt;br /&gt;        // StringTokenizer implements Enumeration. A bit cheeky!&lt;br /&gt;        will(returnValue(new StringTokenizer("c")));&lt;br /&gt;    }&lt;br /&gt;});&lt;br /&gt;&lt;/pre&gt;&lt;/code&gt;&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;All content Copyright 2005, 2006 James Abley&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/13473243-2539330417526327260?l=eternusuk.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://eternusuk.blogspot.com/feeds/2539330417526327260/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=13473243&amp;postID=2539330417526327260' title='1 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/13473243/posts/default/2539330417526327260'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/13473243/posts/default/2539330417526327260'/><link rel='alternate' type='text/html' href='http://eternusuk.blogspot.com/2007/10/java-mock-objects-tip.html' title='Java Mock Objects tip'/><author><name>James Abley</name><uri>http://www.blogger.com/profile/10389773375250732709</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-13473243.post-6190043433462313484</id><published>2007-10-04T22:31:00.000+01:00</published><updated>2007-10-07T22:38:57.165+01:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='surgery'/><title type='text'>Surgery</title><content type='html'>&lt;p id="20070204-1-1"&gt;How I love the smell of burning vas in the evening! Recovery tips:&lt;ul&gt;&lt;li&gt;treat it as a soft tissue injury and ICE it!&lt;/li&gt;&lt;li&gt;Arnica; there's going to be a lot of bruising, so any old snake oil is worth a try.&lt;/li&gt;&lt;/ul&gt;&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;All content Copyright 2005, 2006 James Abley&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/13473243-6190043433462313484?l=eternusuk.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://eternusuk.blogspot.com/feeds/6190043433462313484/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=13473243&amp;postID=6190043433462313484' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/13473243/posts/default/6190043433462313484'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/13473243/posts/default/6190043433462313484'/><link rel='alternate' type='text/html' href='http://eternusuk.blogspot.com/2007/10/surgery.html' title='Surgery'/><author><name>James Abley</name><uri>http://www.blogger.com/profile/10389773375250732709</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-13473243.post-4211629794677617912</id><published>2007-10-02T21:35:00.000+01:00</published><updated>2007-10-07T22:25:56.555+01:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='disruptivechange'/><category scheme='http://www.blogger.com/atom/ns#' term='vodafone'/><category scheme='http://www.blogger.com/atom/ns#' term='mobileweb'/><category scheme='http://www.blogger.com/atom/ns#' term='novarra'/><title type='text'>Novarra makes a play for End Game</title><content type='html'>&lt;p id="20071002-1-1"&gt;So there's been a bit of a &lt;a href="http://wurfl.sourceforge.net/vodafonerant/"&gt;kerfuffle&lt;/a&gt; over here. What's happened is that Vodafone UK have started using &lt;a href="http://www.novarra.com/"&gt;Novarra&lt;/a&gt;'s &lt;a href="http://www.novarra.com/Solutions/nweb/ewdserver.htm"&gt;content adaptation&lt;/a&gt; technology to transcode the internet for mobile phones. Why has this caused such irate responses in some quarters? Well, a history lesson seems to be in order...&lt;/p&gt;&lt;p id="20071002-1-2"&gt;&lt;A href="http://en.wikipedia.org/wiki/Image:Mobile_web_standards_evolution.png" title="Evolution of Mobile Internet Standards"&gt;&lt;img src="http://upload.wikimedia.org/wikipedia/en/thumb/2/23/Mobile_web_standards_evolution.png/400px-Mobile_web_standards_evolution.png" alt="Evolution of Mobile Internet Standards" /&gt;&lt;/a&gt;&lt;/p&gt;&lt;p id="20071002-1-3"&gt;The mobile internet started out with devices unable to render nearly all of the internet due to hardware constraints. &lt;a href="http://en.wikipedia.org/wiki/Wireless_Markup_Language"&gt;WML&lt;/a&gt; was introduced as a very limited markup which phones were able to use to display content. Early WML sites were, needless to say, fairly limited in functionality, and tended to be exposed as distinct resources; e.g. Apache user-agent detection would be used to send you to http://wap.example.com/ if you accessed http://www.example.com/ with your phone. Moore's law still holds in this arena; devices got a bit more capable and iMode (&lt;a href="http://en.wikipedia.org/wiki/C-HTML"&gt;CHTML&lt;/a&gt;) was introduced in Japan. This was initially something like HTML 2.0 / 3.2 without &amp;lt;table/&amp;gt;s, but with the better networks over there, this was somewhat more successful in the marketplace. The W3C stuck in their thumb and pulled out &lt;a href="http://en.wikipedia.org/wiki/XHTML_Basic"&gt;XHTML Basic&lt;/a&gt;, and then there was the related &lt;a href="http://en.wikipedia.org/wiki/XHTML_Mobile_Profile"&gt;XHTML Mobile Profile&lt;/a&gt;.&lt;/p&gt;&lt;p id="20071002-1-4"&gt;So who is so offended by what Vodafone UK and Novarra have done? Well, mainly the mobile internet community. The solutions that the community provide have evolved over time from hand-coded WML sites, iMode sites, XHTML Basic sites, sites where the view renders the model to the appropriate markup and &lt;a href="http://www.w3.org/TR/dial/"&gt;DIAL&lt;/a&gt; processors / &lt;a href="http://www.drutt.com/"&gt;Drutt&lt;/a&gt; / &lt;a href="http://www.volantis.com/"&gt;Volantis&lt;/a&gt;'s offerings in this market. There is an entire industry sector dedicated to providing solutions in this area and nearly all of those solutions rely on the HTTP header &lt;a href="http://www.w3.org/Protocols/rfc2616/rfc2616-sec14.html#sec14.43"&gt;User-Agent&lt;/a&gt; being present and being a reliable indicator of the requesting client. Novarra / Vodafone UK have introduced a fairly &lt;a href="http://en.wikipedia.org/wiki/Disruptive_technology"&gt;disruptive change&lt;/a&gt; which could be viewed as an attempt to change the rules of the game. They're making some pretty &lt;a href="http://lists.w3.org/Archives/Public/public-bpwg-ct/2007Sep/0029.html"&gt;provacative statements&lt;/a&gt; along the way.&lt;/p&gt;&lt;quote&gt;2.3.1.7 A content transformation server can do a better job of following&lt;br /&gt;mobile best practices&lt;br /&gt;The "Mobile Web Best Practices 1.0" W3C Proposed Recommendation [1]&lt;br /&gt;contains many recommendations for authoring content that is intended for&lt;br /&gt;viewing on a mobile device.  A well-designed content transformation&lt;br /&gt;server can do a better job of following the mobile best practices than a&lt;br /&gt;human author, especially when taking into account the capabilities of&lt;br /&gt;the many different mobile devices.  The result will be a more&lt;br /&gt;consistent, uniform experience.&lt;quote&gt;&lt;br /&gt;&lt;p id="20071002-1-6"&gt;I call BS. The incumbent mobile content industry is feeling the pain, but this could just be a game-changing move like Google upp-ing the storage limits on webmail. Time will tell whether the market (mobile phone customers) feels that the Vodafone UK solution is good enough, or whether a more open market will be preferred. I'm all for the &lt;a href="http://www.w3.org/UbiWeb/"&gt;Ubiquitous Web&lt;/a&gt; when it's good for the customer. So here's a little gedank-experiment. What happens to the mobile content industry if all carriers start using a content-adaptation proxy? How else is your company adding value? Evolving markets are hardly a new phenomenon, although maybe the rate of change is a little faster in these modern times...&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;All content Copyright 2005, 2006 James Abley&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/13473243-4211629794677617912?l=eternusuk.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://eternusuk.blogspot.com/feeds/4211629794677617912/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=13473243&amp;postID=4211629794677617912' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/13473243/posts/default/4211629794677617912'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/13473243/posts/default/4211629794677617912'/><link rel='alternate' type='text/html' href='http://eternusuk.blogspot.com/2007/10/novarra-makes-play-for-end-game.html' title='Novarra makes a play for End Game'/><author><name>James Abley</name><uri>http://www.blogger.com/profile/10389773375250732709</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-13473243.post-3798974427621466220</id><published>2007-09-30T22:58:00.000+01:00</published><updated>2007-09-30T23:04:46.183+01:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='boys'/><title type='text'>Connor responding to discipline</title><content type='html'>&lt;p&gt;We were out in a restaurant for Al's birthday meal and Connor was playing with the door where we were sitting. We warned him not to do that or the waitress would come over and tell him off. Five minutes later, the waitress came over and the boy's first reaction?&lt;/p&gt;&lt;p&gt;"I'm not touching it!"&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;All content Copyright 2005, 2006 James Abley&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/13473243-3798974427621466220?l=eternusuk.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://eternusuk.blogspot.com/feeds/3798974427621466220/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=13473243&amp;postID=3798974427621466220' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/13473243/posts/default/3798974427621466220'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/13473243/posts/default/3798974427621466220'/><link rel='alternate' type='text/html' href='http://eternusuk.blogspot.com/2007/09/connor-responding-to-discipline.html' title='Connor responding to discipline'/><author><name>James Abley</name><uri>http://www.blogger.com/profile/10389773375250732709</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-13473243.post-891045018274465084</id><published>2007-09-30T22:38:00.000+01:00</published><updated>2007-09-30T22:48:55.647+01:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='blogs'/><title type='text'>Key log</title><content type='html'>&lt;p&gt;Not blogged for a &lt;a href="http://catskillarchive.com/rrextra/lgjam.Html"&gt;while&lt;/a&gt;. Usual issues:&lt;ol&gt;&lt;li&gt;Been busy at work.&lt;/li&gt;&lt;br /&gt;&lt;li&gt;Been on holiday and had a lot of catching up (reading blogs!)&lt;/li&gt;&lt;br /&gt;&lt;li&gt;Been ill&lt;/li&gt;&lt;/ol&gt;Well, I can fix the second one at least - the first thing isn't really something to complain about, and there's not a lot I can do about the third. Unsubscribed from &lt;a href="http://planet.intertwingly.net/"&gt;Planet Intertwingly&lt;/a&gt; (sob). That should free up some more time to finish off Jython UnicodeData, read stuff and do more hacking.&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;All content Copyright 2005, 2006 James Abley&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/13473243-891045018274465084?l=eternusuk.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://eternusuk.blogspot.com/feeds/891045018274465084/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=13473243&amp;postID=891045018274465084' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/13473243/posts/default/891045018274465084'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/13473243/posts/default/891045018274465084'/><link rel='alternate' type='text/html' href='http://eternusuk.blogspot.com/2007/09/key-log.html' title='Key log'/><author><name>James Abley</name><uri>http://www.blogger.com/profile/10389773375250732709</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-13473243.post-3703379744532647137</id><published>2007-09-29T23:50:00.000+01:00</published><updated>2007-09-30T22:57:49.450+01:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='al'/><title type='text'>Happy Birthday Babe</title><content type='html'>8 years ago I met my wife. She still amazes me every day and I can't believe how lucky I am.&lt;div class="blogger-post-footer"&gt;All content Copyright 2005, 2006 James Abley&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/13473243-3703379744532647137?l=eternusuk.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://eternusuk.blogspot.com/feeds/3703379744532647137/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=13473243&amp;postID=3703379744532647137' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/13473243/posts/default/3703379744532647137'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/13473243/posts/default/3703379744532647137'/><link rel='alternate' type='text/html' href='http://eternusuk.blogspot.com/2007/09/happy-birthday-babe.html' title='Happy Birthday Babe'/><author><name>James Abley</name><uri>http://www.blogger.com/profile/10389773375250732709</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-13473243.post-2255174370880431740</id><published>2007-09-07T20:00:00.000+01:00</published><updated>2007-09-07T21:03:15.605+01:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='rugby'/><category scheme='http://www.blogger.com/atom/ns#' term='rwc'/><title type='text'>Rugby World Cup - France vs Argentina</title><content type='html'>&lt;p id="20070709-2-1"&gt;I don't think much of the English chances, but &lt;strong&gt;bring it on!&lt;/strong&gt;&lt;/p&gt;&lt;p&gt;&lt;strong&gt;Update 1&lt;/strong&gt; 9 - 17. The French seem to be choking. Lots of basic errors and not converting their chances. The Pumas are really going for it. We could be on for a massive upset and blow to the hosts (and favourites in some eyes) chances... (Loving Will Greenwood as a pundit as well).&lt;p&gt;&lt;div class="blogger-post-footer"&gt;All content Copyright 2005, 2006 James Abley&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/13473243-2255174370880431740?l=eternusuk.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://eternusuk.blogspot.com/feeds/2255174370880431740/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=13473243&amp;postID=2255174370880431740' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/13473243/posts/default/2255174370880431740'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/13473243/posts/default/2255174370880431740'/><link rel='alternate' type='text/html' href='http://eternusuk.blogspot.com/2007/09/rugby-world-cup-france-vs-argentina.html' title='Rugby World Cup - France vs Argentina'/><author><name>James Abley</name><uri>http://www.blogger.com/profile/10389773375250732709</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-13473243.post-4219397892217331313</id><published>2007-09-07T06:54:00.000+01:00</published><updated>2007-09-07T06:59:15.531+01:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='blogs'/><category scheme='http://www.blogger.com/atom/ns#' term='search'/><category scheme='http://www.blogger.com/atom/ns#' term='google'/><title type='text'>All consuming</title><content type='html'>&lt;a href="http://googlereader.blogspot.com/2007/09/we-found-it.html" title="Google Reader adds search"&gt;That's&lt;/a&gt; a major one of my frustrations with my current feed reader of choice dealt with then. Now, about those &lt;a href="http://eternusuk.blogspot.com/2007/07/google-reader-bug-report-use-atom.html"&gt;duplicate entries&lt;/a&gt;...&lt;div class="blogger-post-footer"&gt;All content Copyright 2005, 2006 James Abley&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/13473243-4219397892217331313?l=eternusuk.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://eternusuk.blogspot.com/feeds/4219397892217331313/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=13473243&amp;postID=4219397892217331313' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/13473243/posts/default/4219397892217331313'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/13473243/posts/default/4219397892217331313'/><link rel='alternate' type='text/html' href='http://eternusuk.blogspot.com/2007/09/all-consuming.html' title='All consuming'/><author><name>James Abley</name><uri>http://www.blogger.com/profile/10389773375250732709</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-13473243.post-8603223091289540558</id><published>2007-08-18T14:03:00.000+01:00</published><updated>2007-08-18T14:20:10.286+01:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='amazon'/><title type='text'>Amazon losing capability in core function?</title><content type='html'>&lt;p id="20070818-1-p1"&gt;I was watching &lt;a href="http://blip.tv/file/319044/"&gt;Steve Yegge's talk&lt;/a&gt; from OSCON about branding, and one of the things he touched on was Amazon's brand is books, and they want to get out of that since Jeff Bezos thinks that certain consumables will become totally digitized. My current thinking is that they are focusing on other things anyway (hosting, anyone?) and maybe this is taking away from their original core competency. &lt;a href="http://eternusuk.blogspot.com/2007/06/career-development.html"&gt;Recent orders&lt;/a&gt; of mine have taken a lot longer than they used to. Previously, I'd order stuff on a Monday and it would arrive on Wednesday or Thursday the same week, with Super Saver Delivery. Now it takes a lot longer. So I'm still waiting for the &lt;a href="http://www.pragmaticprogrammer.com/titles/jaerlang/"&gt;Erlang&lt;/a&gt;, &lt;a href="http://www.pragmaticprogrammer.com/title/tpantlr/"&gt;ANTLR&lt;/a&gt;, &lt;a href="http://www.cs.nott.ac.uk/~gmh/book.html"&gt;Haskell&lt;/a&gt; and &lt;a href="http://www.crummy.com/writing/RESTful-Web-Services/"&gt;REST&lt;/a&gt; books to arrive that I'd hoped to read on holiday.&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;All content Copyright 2005, 2006 James Abley&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/13473243-8603223091289540558?l=eternusuk.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://eternusuk.blogspot.com/feeds/8603223091289540558/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=13473243&amp;postID=8603223091289540558' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/13473243/posts/default/8603223091289540558'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/13473243/posts/default/8603223091289540558'/><link rel='alternate' type='text/html' href='http://eternusuk.blogspot.com/2007/08/amazon-losing-capability-in-core.html' title='Amazon losing capability in core function?'/><author><name>James Abley</name><uri>http://www.blogger.com/profile/10389773375250732709</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-13473243.post-8051592695089877097</id><published>2007-08-02T23:57:00.001+01:00</published><updated>2007-08-03T00:00:51.744+01:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='boys'/><title type='text'>Hello Cameron</title><content type='html'>There we go, another smasher has arrived. I think there were various events and conversations that I wanted to record today, but it's late and I'm knackered. Blog more with photos tomorrow or the weekend.&lt;div class="blogger-post-footer"&gt;All content Copyright 2005, 2006 James Abley&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/13473243-8051592695089877097?l=eternusuk.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://eternusuk.blogspot.com/feeds/8051592695089877097/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=13473243&amp;postID=8051592695089877097' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/13473243/posts/default/8051592695089877097'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/13473243/posts/default/8051592695089877097'/><link rel='alternate' type='text/html' href='http://eternusuk.blogspot.com/2007/08/hello-cameron.html' title='Hello Cameron'/><author><name>James Abley</name><uri>http://www.blogger.com/profile/10389773375250732709</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-13473243.post-513006464977384885</id><published>2007-08-02T22:48:00.000+01:00</published><updated>2007-08-02T23:56:51.401+01:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='java'/><category scheme='http://www.blogger.com/atom/ns#' term='jython'/><category scheme='http://www.blogger.com/atom/ns#' term='hacking'/><title type='text'>Jython UnicodeData hacking in the CDS</title><content type='html'>&lt;p&gt;Got numeric and decimal working today in between contractions in the Central Delivery Suite at Frimley Park Hospital today. Nearly got categories working as well, except I'm not clear how CPython has implemented unicodedata.category for undefined codepoints.&lt;/p&gt;&lt;p&gt;e.g. Python 2.5 uses Unicode 4.2 for the Unicode database. The integer codepoint 13313(decimal) / 3401 (hex) is not defined within Unicode 4.1.&lt;/p&gt;&lt;pre&gt;3400;&lt;CJK Ideograph Extension A, First&gt;;Lo;0;L;;;;;N;;;;;&lt;br /&gt;4DB5;&lt;CJK Ideograph Extension A, Last&gt;;Lo;0;L;;;;;N;;;;;&lt;/pre&gt;&lt;p&gt;It isn't defined in Unicode 5.0, which is what I've been using to do the Jython implementation.&lt;/p&gt;&lt;pre&gt;3400;&lt;CJK Ideograph Extension A, First&gt;;Lo;0;L;;;;;N;;;;;&lt;br /&gt;4DB5;&lt;CJK Ideograph Extension A, Last&gt;;Lo;0;L;;;;;N;;;;;&lt;/pre&gt;&lt;p&gt;So how does CPython define unicodedata.category(unichr(13313)) to be 'Lo'? And it doesn't seem to be just 'Lo' in all cases of undefined items. I'm speculating that it might be falling back to the preceding valid codepoint category. Think I need to post to a CPython list to confirm.&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;All content Copyright 2005, 2006 James Abley&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/13473243-513006464977384885?l=eternusuk.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://eternusuk.blogspot.com/feeds/513006464977384885/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=13473243&amp;postID=513006464977384885' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/13473243/posts/default/513006464977384885'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/13473243/posts/default/513006464977384885'/><link rel='alternate' type='text/html' href='http://eternusuk.blogspot.com/2007/08/jython-unicodedata-hacking-in-cds.html' title='Jython UnicodeData hacking in the CDS'/><author><name>James Abley</name><uri>http://www.blogger.com/profile/10389773375250732709</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-13473243.post-1340284550410965224</id><published>2007-07-31T20:18:00.000+01:00</published><updated>2007-07-31T20:38:23.616+01:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='atom'/><category scheme='http://www.blogger.com/atom/ns#' term='google'/><category scheme='http://www.blogger.com/atom/ns#' term='hacking'/><title type='text'>Google Reader Bug report - use Atom &lt;id/&gt; elements</title><content type='html'>&lt;p id="20070731-1-1"&gt;I am directly subscribed to &lt;a href="http://intertwingly.net/blog/index.atom"&gt;Sam Ruby's feed&lt;/a&gt;. I recently added &lt;a href="http://planet.intertwingly.net/atom.xml"&gt;Planet Intertwingly&lt;/a&gt; as well, which contains Sam's blog. Both feeds are served as &lt;code&gt;application/atom+xml&lt;/code&gt;. In Google Reader, duplicate items show up (for Sam, Steve Loughran, and others that overlap from my other subscriptions. I don't want to remove individual subscriptions in case Sam removes them from Planet Intertwingly.&lt;/p&gt;&lt;p id="20070731-1-2"&gt;From my readings of the spec a while ago, that was an explicit rationale for having id's associated with each entry. As you would expect, the id's are the same. From Planet Intertwingly:&lt;/p&gt;&lt;pre&gt;&lt;br /&gt;  &amp;lt;entry&amp;gt;&lt;br /&gt;    &amp;lt;id&amp;gt;tag:intertwingly.net,2004:2619&amp;lt;/id&amp;gt;&lt;br /&gt;    &amp;lt;link href="http://intertwingly.net/blog/2007/07/31/Agile-Financial-Publishing" rel="alternate" type="text/html"/&amp;gt;&lt;br /&gt;    &amp;lt;link href="http://intertwingly.net/blog/2619.atom" rel="replies" type="text/html"/&amp;gt;&lt;br /&gt;    &amp;lt;title&amp;gt;Agile Financial Publishing&amp;lt;/title&amp;gt;&lt;br /&gt;    ...&lt;br /&gt;  &amp;lt;/entry&amp;gt;&lt;br /&gt;&lt;/pre&gt;&lt;p id="20070731-1-3"&gt;From Intertwingly:&lt;/p&gt;&lt;pre&gt;&lt;br /&gt;  &amp;lt;entry&amp;gt;&lt;br /&gt;    &amp;lt;id&amp;gt;tag:intertwingly.net,2004:2619&amp;lt;/id&amp;gt;&lt;br /&gt;    &amp;lt;link href="2007/07/31/Agile-Financial-Publishing"/&amp;gt;&lt;br /&gt;    &amp;lt;link rel="replies" href="2619.atom" thr:count="1" thr:updated="2007-07-31T12:15:28-04:00"/&amp;gt;&lt;br /&gt;    &amp;lt;title&amp;gt;Agile Financial Publishing&amp;lt;/title&amp;gt;&lt;br /&gt;    ...&lt;br /&gt;  &amp;lt;/entry&amp;gt;&lt;br /&gt;&lt;/pre&gt;&lt;p id="20070731-1-4"&gt;Those &lt;a href="http://tools.ietf.org/html/rfc4287#section-4.2.6.1"&gt;atom:id element IRIs&lt;/a&gt; appear to be the same to me...&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;All content Copyright 2005, 2006 James Abley&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/13473243-1340284550410965224?l=eternusuk.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://eternusuk.blogspot.com/feeds/1340284550410965224/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=13473243&amp;postID=1340284550410965224' title='3 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/13473243/posts/default/1340284550410965224'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/13473243/posts/default/1340284550410965224'/><link rel='alternate' type='text/html' href='http://eternusuk.blogspot.com/2007/07/google-reader-bug-report-use-atom.html' title='Google Reader Bug report - use Atom &amp;lt;id/&amp;gt; elements'/><author><name>James Abley</name><uri>http://www.blogger.com/profile/10389773375250732709</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>3</thr:total></entry><entry><id>tag:blogger.com,1999:blog-13473243.post-7257321980015608734</id><published>2007-07-25T20:14:00.000+01:00</published><updated>2007-07-28T21:39:11.328+01:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='vista'/><category scheme='http://www.blogger.com/atom/ns#' term='rants'/><title type='text'>Objective review of why Vista pisses me off (or Why isn't Vista more like Ubuntu?</title><content type='html'>&lt;p id="20070725-1-1"&gt;So I'm being completely upfront in the title as to where I am on this one, but I think that it's worth giving some airtime to a few of these. Readers might care to note that they should route around the "grumpy Yorkshireman that doesn't like change" for some of these. You never know, I might get some comments explaining why I'm a &lt;a href="http://c2.com/cgi/wiki?SetTheBozoBit"&gt;bozo&lt;/a&gt; when it comes to Windows.&lt;/p&gt;&lt;br /&gt;&lt;dl&gt;&lt;dt&gt;Avalon and the new Windows Aero UI.&lt;/dt&gt;&lt;dd&gt;I gave it two weeks and then I'd had enough. Does it really make me more productive having all that shit, or is it just effects for the sake of it? I have the same opinion on &lt;a href="http://compiz.org/Home/Screenshots" title="Compiz screenshots"&gt;Compiz&lt;/a&gt; - I haven't yet seen a compelling reason for it to exist, beyond being secretly sponsored by Nvidia / ATI to make people get shiny new graphics cards. Let the conspiracy theorists chew on that one. And despite paying Dell more for a fancy graphics card in this laptop, &lt;br/&gt;&lt;br/&gt;&lt;a href="http://www.flickr.com/photos/58197404@N00/898501608/" title="Photo Sharing"&gt;&lt;img src="http://farm2.static.flickr.com/1130/898501608_1483deb675_o.png" width="1000" height="750" alt="WindowsExperienceIndex-20070605" /&gt;&lt;/a&gt;&lt;br/&gt;&lt;br/&gt; apparently it's not that good.&lt;/dd&gt;&lt;br /&gt;&lt;dt&gt;&lt;a href="http://en.wikipedia.org/wiki/Blue_Screen_of_Death"&gt;Blue screen of Death&lt;/a&gt;&lt;/dt&gt;&lt;dd&gt;No really, I had one in my first week, and I've had one since then. Lovely. Occasionally (once a quarter?) when running Ubuntu Dapper, I've had X lock up on me and be completely unresponsive, to the extent that I couldn't even switch to a virtual terminal or ssh into the box and do something to it. The first time this happened, I went climbing at lunchtime, came back and it was still borked, so just a hard reboot to fix that. A reboot once a quarter on a development machine doesn't strike me as too bad. Vista is managing once a week at the moment, and in neither case am I writing C or any system level code. It's all Java / Python / Ruby and that sort of level.&lt;/dd&gt;&lt;br /&gt;&lt;dt&gt;&lt;a href="http://en.wikipedia.org/wiki/Black_Screen_of_Death"&gt;Black screen of death&lt;/a&gt;&lt;/dt&gt;&lt;dd&gt;That was a Vista new feature for me; I've never had that on previous versions of Windows. This is progress people!&lt;/dd&gt;&lt;br /&gt;&lt;dt&gt;Still no decent shell&lt;/dt&gt;&lt;dd&gt;I'm using Cygwin, but it doesn't seem to let me tail files and press Return to get some space in between lines. Minor, but annoying.&lt;/dd&gt;&lt;br /&gt;&lt;dt&gt;Continual swapping&lt;/dt&gt;&lt;dd&gt;Previously I was on a 2GB RAM Dell workstation, and now I have a 2GB RAM Dell laptop. The laptop is always swapping. What's changed? Well, I'm now on Vista rather than Ubuntu and I'm not running Oracle XE anymore, but otherwise the services running are much the same. IDEA / Eclipse, Tomcat, MySQL, Firefox, intermittent email client and a text editor. Don't know why Vista is always swapping (TaskMngr thinks it has 700MB free) but it's bloody annoying.&lt;/dd&gt;&lt;br /&gt;&lt;dt&gt;Broken file permissions&lt;/dt&gt;&lt;dd&gt;Doing a release today, the VPN crashed (don't know if that was Vista, BT, the Windows 2003 Server or something else. That appears to have left me with the following undeletable file. &lt;br/&gt;&lt;br/&gt;&lt;a href="http://www.flickr.com/photos/58197404@N00/898623910/" title="Photo Sharing"&gt;&lt;img src="http://farm2.static.flickr.com/1152/898623910_38b4ea7e84_o.png" width="829" height="572" alt="no-permissions-on-file" /&gt;&lt;/a&gt; &lt;br/&gt;&lt;br/&gt;So Vista has let me create a file that I don't have the rights to delete. That's smashing!&lt;br/&gt;&lt;br/&gt;&lt;a href="http://www.flickr.com/photos/58197404@N00/898501628/" title="Photo Sharing"&gt;&lt;img src="http://farm2.static.flickr.com/1305/898501628_ca7fbe5690_o.png" width="1130" height="311" alt="undeletable-file" /&gt;&lt;/a&gt;&lt;/dd&gt;&lt;br /&gt;&lt;dt&gt;Random security policies&lt;/dt&gt;&lt;dd&gt;Or that's what I'm guessing is causing this anyway. If so, then a learning mode like &lt;a href="http://en.opensuse.org/Apparmor"&gt;AppArmor&lt;/a&gt; has would be nice. See &lt;br/&gt;&lt;br/&gt;&lt;a href="http://www.flickr.com/photos/58197404@N00/898501564/" title="Photo Sharing: Exhibit A"&gt;&lt;img src="http://farm2.static.flickr.com/1141/898501564_66f43c01be_o.png" width="384" height="185" alt="Java-Virtual-Machine-Launcher-Error" /&gt;&lt;/a&gt;&lt;br/&gt; and&lt;br/&gt;&lt;br/&gt; &lt;a href="http://www.flickr.com/photos/58197404@N00/898501552/" title="Photo Sharing: Exhibit B"&gt;&lt;img src="http://farm2.static.flickr.com/1222/898501552_8061d05208_o.png" width="735" height="228" alt="java-heap-allocation-failure" /&gt;&lt;/a&gt;&lt;br/&gt;&lt;br/&gt; No, when I ask for a large amount of heap to be allocated for my Java process, I don't really know what I'm doing, so please stop me. Thank you Vista, you're my hero.&lt;/dd&gt;&lt;br /&gt;&lt;/dl&gt;&lt;p&gt;&lt;Strong&gt;Update:&lt;/strong&gt; LazyWeb to the rescue, at least about the &lt;a href="http://www.windowssecrets.com/2007/07/26/01-Vista-resume-bug-plagues-laptop-users"&gt;disk thrashing issue&lt;/a&gt;.&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;All content Copyright 2005, 2006 James Abley&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/13473243-7257321980015608734?l=eternusuk.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://eternusuk.blogspot.com/feeds/7257321980015608734/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=13473243&amp;postID=7257321980015608734' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/13473243/posts/default/7257321980015608734'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/13473243/posts/default/7257321980015608734'/><link rel='alternate' type='text/html' href='http://eternusuk.blogspot.com/2007/07/objective-review-of-why-vista-pisses-me.html' title='Objective review of why Vista pisses me off (or Why isn&apos;t Vista more like Ubuntu?'/><author><name>James Abley</name><uri>http://www.blogger.com/profile/10389773375250732709</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-13473243.post-6277594915718568972</id><published>2007-07-24T23:50:00.000+01:00</published><updated>2007-07-25T00:05:39.018+01:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='boys'/><title type='text'>The Hustler</title><content type='html'>&lt;p id="20070724-1-1"&gt;There was a bag of sweets up on the kitchen top. Connor spotted these and was after them, but I told him "Not for breakfast". After I'd gone to work, he asked Al the same and got the same response. His reaction?&lt;/p&gt;&lt;br /&gt;&lt;dl&gt;&lt;dt&gt;Connor:&lt;/dt&gt;&lt;dd&gt;OK Mummy, me just hold it, OK?&lt;/dd&gt;&lt;br /&gt;&lt;dt&gt;Al:&lt;/dt&gt;&lt;dd&gt;OK Connor.&lt;/dd&gt;&lt;/dl&gt;&lt;br /&gt;&lt;p id="20070724-1-2"&gt;(Al continues ironing. Some time passes)&lt;/p&gt;&lt;br /&gt;&lt;dl&gt;&lt;dt&gt;Connor: (Coming back into the kitchen)&lt;/dt&gt;&lt;dd&gt;Look Mummy, me just hold it, OK?&lt;/dd&gt;&lt;br /&gt;&lt;dt&gt;Al:&lt;/dt&gt;&lt;dd&gt;Well done Connor.&lt;/dd&gt;&lt;/dl&gt;&lt;br /&gt;&lt;p id=""20070724-1-3&gt;(More time passes)&lt;/p&gt;&lt;br /&gt;&lt;dl&gt;&lt;dt&gt;Connor: (Comes back into the kitchen again)&lt;/dt&gt;&lt;dd&gt;Look Mummy, me still hold it&lt;/dd&gt;&lt;br /&gt;&lt;dt&gt;Al:&lt;/dt&gt;&lt;dd&gt;Good boy, Connor!&lt;/dd&gt;&lt;/dl&gt;&lt;p id="2000724-1-4"&gt;After an hour, the ironing is done and Al's about to phone me to say how well-disciplined the boy's been, just holding the sweets. So she takes the ironing upstairs and comes back down to see Connor doing his Muttley laugh and just shy of shovelling all of the sweets into his mouth! Gamed by a 2 year old.&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;All content Copyright 2005, 2006 James Abley&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/13473243-6277594915718568972?l=eternusuk.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://eternusuk.blogspot.com/feeds/6277594915718568972/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=13473243&amp;postID=6277594915718568972' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/13473243/posts/default/6277594915718568972'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/13473243/posts/default/6277594915718568972'/><link rel='alternate' type='text/html' href='http://eternusuk.blogspot.com/2007/07/hustler.html' title='The Hustler'/><author><name>James Abley</name><uri>http://www.blogger.com/profile/10389773375250732709</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-13473243.post-2698420445418675648</id><published>2007-07-20T10:24:00.000+01:00</published><updated>2007-07-24T23:34:31.346+01:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='java'/><category scheme='http://www.blogger.com/atom/ns#' term='hacking'/><category scheme='http://www.blogger.com/atom/ns#' term='etags'/><title type='text'>Good ETag support requires thinking about it up-front</title><content type='html'>&lt;p id="20070720-1-1"&gt;I posted a comment on &lt;a href="http://www.dehora.net/journal/2007/07/earned_value.html" title="Bill de hÓra: Design for the web"&gt;this&lt;/a&gt; but I thought it worthwhile going a little deeper.&lt;/p&gt;&lt;p id="20070720-1-2"&gt;Blogger doesn't support &lt;a href="http://en.wikipedia.org/wiki/Trackback" title="Wikipedia: Trackback"&gt;Trackback&lt;/a&gt; so I'll just post and link.&lt;/p&gt;&lt;p id="20070720-1-3"&gt;My point was not to argue about how little code is required to implement sending an ETag and checking an ETag based on the MD5 hash of your content (that's pretty much a library issue which should level out to be equal over time) but to go a little deeper into ETags.&lt;/p&gt;&lt;p id="20070720-1-4"&gt;I've been reading &lt;a href="http://intertwingly.net/blog/"&gt;Sam Ruby&lt;/a&gt; long enough to have had the benefit of ETags drummed into me. The posts that Bill links to are focused on the network savings aspect of conditional GET. But you can also save server processing power, if you put a &lt;a href="http://bitworking.org/news/150/REST-Tip-Deep-etags-give-you-more-benefits" title="Joe Gregorio"&gt;little more thought&lt;/a&gt; into your application model.&lt;/p&gt;&lt;p id="20070720-1-4"&gt;So we come back to the requirements for Java frameworks to support ETags such that it is possible to avoid doing the bulk of the server side processing. &lt;em&gt;Caveat this could well be premature optimization, and is merely me thinking out loud.&lt;/em&gt; Struts is the one I'm most familiar with and I think with the &lt;a href="http://wiki.apache.org/struts/StrutsChain"&gt;struts-chain &lt;/a&gt;RequestProcessor, this approach could be used, but anything that works as a chain would do for this (so pure Filters would also work).&lt;/p&gt;&lt;br /&gt;&lt;pre&gt;&lt;br /&gt;&lt;code&gt;public void doFilter(ServletRequest request, ServletResponse response,&lt;br /&gt;        FilterChain filterChain) throws IOException, ServletException {&lt;br /&gt;&lt;br /&gt;    HttpServletRequest httpRequest = (HttpServletRequest) request;&lt;br /&gt;    &lt;br /&gt;    /*&lt;br /&gt;     * Do something that works out what is required to render a response &lt;br /&gt;     * for this request and generate an ETag based on that. So here we &lt;br /&gt;     * have moved away from the approach of generating ETags from MD5 &lt;br /&gt;     * hashes of the response body.&lt;br /&gt;     */&lt;br /&gt;    ETag currentResourceETag = calculateETag(httpRequest);&lt;br /&gt;    ETag incomingETag = extractETag(httpRequest);&lt;br /&gt;&lt;br /&gt;    if (currentResourceETag.equals(incomingETag)) {&lt;br /&gt;        response.sendStatus(HttpServletResponse.SC_NOT_MODIFIED);&lt;br /&gt;    } else {&lt;br /&gt;        filterChain.doFilter(request, response);&lt;br /&gt;        response.addHeader("Etag", currentResourceETag.stringValue());&lt;br /&gt;    }&lt;br /&gt;    &lt;br /&gt;}&lt;/code&gt;&lt;/pre&gt;&lt;p id="20070720-1-6"&gt;You would need to be able to obtain the items responsible for determining the ETag value reasonably early in the request processing, before any really expensive operations. Not sure what implications that has for the layers in your application, or if you were using strict MVC how disruptive / worthwhile it would be to try this approach...&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;All content Copyright 2005, 2006 James Abley&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/13473243-2698420445418675648?l=eternusuk.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://eternusuk.blogspot.com/feeds/2698420445418675648/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=13473243&amp;postID=2698420445418675648' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/13473243/posts/default/2698420445418675648'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/13473243/posts/default/2698420445418675648'/><link rel='alternate' type='text/html' href='http://eternusuk.blogspot.com/2007/07/good-etag-support-requires-thinking.html' title='Good ETag support requires thinking about it up-front'/><author><name>James Abley</name><uri>http://www.blogger.com/profile/10389773375250732709</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-13473243.post-5260474341560625198</id><published>2007-07-18T23:43:00.000+01:00</published><updated>2007-07-18T23:50:15.165+01:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='java'/><category scheme='http://www.blogger.com/atom/ns#' term='jython'/><category scheme='http://www.blogger.com/atom/ns#' term='hacking'/><title type='text'>Jython - UnicodeData mirrored is complete!</title><content type='html'>&lt;pre&gt;&lt;br /&gt;&lt;code&gt;from test_support import verify, verbose&lt;br /&gt;import sha&lt;br /&gt;&lt;br /&gt;encoding = 'utf-8'&lt;br /&gt;&lt;br /&gt;def test_mirrored():&lt;br /&gt;    &lt;br /&gt;    h = sha.sha()&lt;br /&gt;    &lt;br /&gt;    for i in range(65536):&lt;br /&gt;        c = unichr(i)&lt;br /&gt;        h.update(str(unicodedata.mirrored(c)))&lt;br /&gt;        print  "%i : %i%c" % (i, unicodedata.mirrored(c), unichr(10)),&lt;br /&gt;        &lt;br /&gt;    # Value returned by Python 2.5, which uses Unicode 4.2&lt;br /&gt;    #verify('91cd30c6c81911835dbcbed083f99fc9fc073e4a' ==  h.hexdigest(), &lt;br /&gt;    #       h.hexdigest())&lt;br /&gt;    &lt;br /&gt;    # Value returned by current Jython implementation, which uses Unicode 5.0&lt;br /&gt;    verify('595795a212ca0ac629d6b2dfb09c703a472adb03' ==  h.hexdigest(), &lt;br /&gt;           h.hexdigest())&lt;br /&gt;&lt;br /&gt;# Add next test!&lt;br /&gt;    &lt;br /&gt;if __name__ == '__main__':&lt;br /&gt;    import unicodedata&lt;br /&gt;    test_mirrored()&lt;br /&gt;&lt;/code&gt;&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;p&gt;OK, it's only for the BMP, but it's a good start. Supporting supplementary characters (in Java terminology) or the other sixteeen planes would need a more fundamental change to PyUnicode, methinks. Now I need to start adding the other unicodedata methods which should be fairly straightforward. Then I'll have a working implementation to post to the dev list. Maybe end of this month, unless Baby comes and I lose my late night hacking time?&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;All content Copyright 2005, 2006 James Abley&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/13473243-5260474341560625198?l=eternusuk.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://eternusuk.blogspot.com/feeds/5260474341560625198/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=13473243&amp;postID=5260474341560625198' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/13473243/posts/default/5260474341560625198'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/13473243/posts/default/5260474341560625198'/><link rel='alternate' type='text/html' href='http://eternusuk.blogspot.com/2007/07/jython-unicodedata-mirrored-is-complete.html' title='Jython - UnicodeData mirrored is complete!'/><author><name>James Abley</name><uri>http://www.blogger.com/profile/10389773375250732709</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-13473243.post-6918571215269856731</id><published>2007-07-18T22:19:00.000+01:00</published><updated>2007-07-18T22:29:18.066+01:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='java'/><category scheme='http://www.blogger.com/atom/ns#' term='jython'/><category scheme='http://www.blogger.com/atom/ns#' term='hacking'/><title type='text'>Jython UnicodeData mirroring</title><content type='html'>&lt;code&gt;&lt;br /&gt;&lt;pre&gt;&lt;br /&gt;for i in range(65536):&lt;br /&gt;        c = unichr(i)&lt;br /&gt;        print  "%i : %i%c" % (i, unicodedata.mirrored(c), unichr(10)) ,&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;/code&gt;&lt;br /&gt;&lt;pre&gt;&lt;br /&gt;jabley@miq-jabley ~/work/eclipse/workspaces/personal/jython-trunk/jython&lt;br /&gt;$ diff jython-mirrored.txt python-mirrored.txt&lt;br /&gt;10177c10177&lt;br /&gt;&lt; 10176 : 0&lt;br /&gt;---&lt;br /&gt;&gt; 10176 : 1&lt;br /&gt;10180,10183c10180,10183&lt;br /&gt;&lt; 10179 : 0&lt;br /&gt;&lt; 10180 : 0&lt;br /&gt;&lt; 10181 : 0&lt;br /&gt;&lt; 10182 : 0&lt;br /&gt;---&lt;br /&gt;&gt; 10179 : 1&lt;br /&gt;&gt; 10180 : 1&lt;br /&gt;&gt; 10181 : 1&lt;br /&gt;&gt; 10182 : 1&lt;br /&gt;11779,11782c11779,11782&lt;br /&gt;&lt; 11778 : 0&lt;br /&gt;&lt; 11779 : 0&lt;br /&gt;&lt; 11780 : 0&lt;br /&gt;&lt; 11781 : 0&lt;br /&gt;---&lt;br /&gt;&gt; 11778 : 1&lt;br /&gt;&gt; 11779 : 1&lt;br /&gt;&gt; 11780 : 1&lt;br /&gt;&gt; 11781 : 1&lt;br /&gt;11786,11787c11786,11787&lt;br /&gt;&lt; 11785 : 0&lt;br /&gt;&lt; 11786 : 0&lt;br /&gt;---&lt;br /&gt;&gt; 11785 : 1&lt;br /&gt;&gt; 11786 : 1&lt;br /&gt;11789,11790c11789,11790&lt;br /&gt;&lt; 11788 : 0&lt;br /&gt;&lt; 11789 : 0&lt;br /&gt;---&lt;br /&gt;&gt; 11788 : 1&lt;br /&gt;&gt; 11789 : 1&lt;br /&gt;11805,11806c11805,11806&lt;br /&gt;&lt; 11804 : 0&lt;br /&gt;&lt; 11805 : 0&lt;br /&gt;---&lt;br /&gt;&gt; 11804 : 1&lt;br /&gt;&gt; 11805 : 1&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;I was hoping to use &lt;code&gt;java.lang.Character.isMirrored(char)&lt;/code&gt;, but the above is the result of diffing the output for jython and python running my test and diff-ing the output. Looking in more detail, Java 1.4 supports UCD 3.2, then Java 5 and Java 6 both only have support for UCD 4.0.&lt;br /&gt;&lt;pre&gt;&lt;br /&gt;jabley@miq-jabley ~/work/eclipse/workspaces/personal/jython-trunk/jython&lt;br /&gt;$ python&lt;br /&gt;Python 2.5.1 (r251:54863, May 18 2007, 16:56:43)&lt;br /&gt;[GCC 3.4.4 (cygming special, gdc 0.12, using dmd 0.125)] on cygwin&lt;br /&gt;Type "help", "copyright", "credits" or "license" for more information.&lt;br /&gt;&gt;&gt;&gt; import unicodedata&lt;br /&gt;&gt;&gt;&gt; unicodedata.unidata_version&lt;br /&gt;'4.1.0'&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;And I'm getting the sneaking feeling that I've done something like that before, but it's been so long since I did any development in this area that I've forgotten it!&lt;div class="blogger-post-footer"&gt;All content Copyright 2005, 2006 James Abley&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/13473243-6918571215269856731?l=eternusuk.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://eternusuk.blogspot.com/feeds/6918571215269856731/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=13473243&amp;postID=6918571215269856731' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/13473243/posts/default/6918571215269856731'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/13473243/posts/default/6918571215269856731'/><link rel='alternate' type='text/html' href='http://eternusuk.blogspot.com/2007/07/jython-unicodedata-mirroring.html' title='Jython UnicodeData mirroring'/><author><name>James Abley</name><uri>http://www.blogger.com/profile/10389773375250732709</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-13473243.post-101616075894305382</id><published>2007-07-13T23:23:00.000+01:00</published><updated>2007-07-24T23:41:22.289+01:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='boys'/><title type='text'>The Graduate</title><content type='html'>The Bash had his nursery graduation a couple of weeks ago (must put the photos up on Flickr) and then his last day in nursery was yesterday. He didn't seem too bothered; more excited about going on holiday and spending the summer with Al. But that 4 years has gone by fast!&lt;div class="blogger-post-footer"&gt;All content Copyright 2005, 2006 James Abley&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/13473243-101616075894305382?l=eternusuk.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://eternusuk.blogspot.com/feeds/101616075894305382/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=13473243&amp;postID=101616075894305382' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/13473243/posts/default/101616075894305382'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/13473243/posts/default/101616075894305382'/><link rel='alternate' type='text/html' href='http://eternusuk.blogspot.com/2007/07/graduate.html' title='The Graduate'/><author><name>James Abley</name><uri>http://www.blogger.com/profile/10389773375250732709</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-13473243.post-5118609182886960797</id><published>2007-07-08T21:55:00.000+01:00</published><updated>2007-07-08T22:15:03.219+01:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='boys'/><title type='text'>Our little philosopher</title><content type='html'>&lt;dl&gt;&lt;dt&gt;Me&lt;/dt&gt;&lt;dd&gt;Callum, we don't need to take your toys into Legoland since there's enough things in there to keep you busy. How does playing with your toys make you feel versus going on a ride?&lt;/dd&gt;&lt;br /&gt;&lt;dt&gt;Callum&lt;/dt&gt;&lt;dd&gt;Happy.&lt;/dd&gt;&lt;br /&gt;&lt;dt&gt;Me&lt;/dt&gt;&lt;dd&gt;So what's a ride like then...like playing with toys.&lt;/dd&gt;&lt;br /&gt;&lt;dt&gt;Callum&lt;/dt&gt;&lt;dd&gt;So Daddy, when you're on the ride, it's like the ride is playing with you. You're the toy!&lt;/dd&gt;&lt;br /&gt;&lt;dt&gt;Me (slightly shocked)&lt;/dt&gt;&lt;dd&gt;Yes, that's right Callum. Good analogy.&lt;/dd&gt;&lt;br /&gt;&lt;dt&gt;Me&lt;/dt&gt;&lt;dd&gt;So Callum, your homework is to write an essay on the &lt;a href="http://www.google.co.uk/search?q=inside+brick+feynman"&gt;inside of a brick&lt;/a&gt;.&lt;/dd&gt;&lt;br /&gt;&lt;dt&gt;Callum&lt;/dt&gt;&lt;dd&gt;Silly Daddy, that's just pretend!&lt;/dd&gt;&lt;br /&gt;&lt;/dl&gt;&lt;br /&gt;He's sharp, that one.&lt;div class="blogger-post-footer"&gt;All content Copyright 2005, 2006 James Abley&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/13473243-5118609182886960797?l=eternusuk.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://eternusuk.blogspot.com/feeds/5118609182886960797/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=13473243&amp;postID=5118609182886960797' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/13473243/posts/default/5118609182886960797'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/13473243/posts/default/5118609182886960797'/><link rel='alternate' type='text/html' href='http://eternusuk.blogspot.com/2007/07/our-little-philosopher.html' title='Our little philosopher'/><author><name>James Abley</name><uri>http://www.blogger.com/profile/10389773375250732709</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-13473243.post-4675016219894256376</id><published>2007-06-30T22:50:00.000+01:00</published><updated>2007-07-01T21:44:39.466+01:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='boys'/><title type='text'>The Negotiator</title><content type='html'>&lt;p id="20070630-p201"&gt;A breakfast discussion with Connor:&lt;/p&gt;&lt;dl&gt;&lt;br /&gt;&lt;dt&gt;Me&lt;/dt&gt;&lt;dd&gt;What would you like, Golden Nuggets?&lt;/dd&gt;&lt;br /&gt;&lt;dt&gt;Connor&lt;/dt&gt;&lt;dd&gt;Schweetie.&lt;/dd&gt;&lt;br /&gt;&lt;dt&gt;Me&lt;/dt&gt;&lt;dd&gt;No Connor, no sweetie for breakfast. Crispies?&lt;/dd&gt;&lt;br /&gt;&lt;dt&gt;Connor&lt;/dt&gt;&lt;dd&gt;OK Daddy.&lt;/dd&gt;&lt;br /&gt;&lt;dt&gt;Connor&lt;/dt&gt;&lt;dd&gt;Wee schweetie (holding his thumb and middle finger to indicate the size).&lt;/dd&gt;&lt;br /&gt;&lt;/dl&gt;&lt;div class="blogger-post-footer"&gt;All content Copyright 2005, 2006 James Abley&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/13473243-4675016219894256376?l=eternusuk.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://eternusuk.blogspot.com/feeds/4675016219894256376/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=13473243&amp;postID=4675016219894256376' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/13473243/posts/default/4675016219894256376'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/13473243/posts/default/4675016219894256376'/><link rel='alternate' type='text/html' href='http://eternusuk.blogspot.com/2007/06/negotiator.html' title='The Negotiator'/><author><name>James Abley</name><uri>http://www.blogger.com/profile/10389773375250732709</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-13473243.post-870714993812044526</id><published>2007-06-30T22:08:00.000+01:00</published><updated>2007-06-30T22:30:06.478+01:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='linux'/><category scheme='http://www.blogger.com/atom/ns#' term='virtualisation'/><category scheme='http://www.blogger.com/atom/ns#' term='wireless'/><category scheme='http://www.blogger.com/atom/ns#' term='ubuntu'/><title type='text'>Linux goodness</title><content type='html'>I'm posting this using the &lt;a href="http://www.ubuntu.com/"&gt;Ubuntu&lt;/a&gt; Feisty Live Disk running on my work laptop. I was able to connect to my wireless connection and it Just Worked, WEP using a passphrase as well, rather than requiring the large hexadecimal keys. So colour me happy with that  (for anyone that's interested, this is on a Dell Latitude D820, more details available on request) Think I'll be grabbing an XP install disk from our MSDN Universal subscription or whatever it's called these days and taking a &lt;a href="http://blog.codefront.net/2007/06/26/installing-xen-on-ubuntu-feisty-fawn-the-complete-newbies-guide/"&gt;serious look&lt;/a&gt; at Xen, along with possibly trying to pick &lt;a href="http://www.1060.org/blogxter/entry?publicid=99E039B20862BFF4CC09D21A1D94E4F9"&gt;Steve Loughran's brain&lt;/a&gt; about virtualisation on Linux.&lt;div class="blogger-post-footer"&gt;All content Copyright 2005, 2006 James Abley&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/13473243-870714993812044526?l=eternusuk.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://eternusuk.blogspot.com/feeds/870714993812044526/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=13473243&amp;postID=870714993812044526' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/13473243/posts/default/870714993812044526'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/13473243/posts/default/870714993812044526'/><link rel='alternate' type='text/html' href='http://eternusuk.blogspot.com/2007/06/linux-goodness.html' title='Linux goodness'/><author><name>James Abley</name><uri>http://www.blogger.com/profile/10389773375250732709</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-13473243.post-1325603577648652220</id><published>2007-06-26T20:56:00.000+01:00</published><updated>2007-06-26T21:28:54.411+01:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='hacking'/><category scheme='http://www.blogger.com/atom/ns#' term='career'/><title type='text'>Career Development</title><content type='html'>&lt;p id="20070626-01"&gt; Steve Yegge's recent &lt;a href="http://steve-yegge.blogspot.com/2007/06/rich-programmer-food.html"&gt;post&lt;/a&gt; about  the second most important course in CS made me smile. I discovered Eric Raymond's &lt;a href="http://www.catb.org/~esr/faqs/hacker-howto.html"&gt;How To Become A Hacker&lt;/a&gt; fairly early on in my career, and to a Mathematics graduate with a job doing Visual Basic 6.0, that was eye-opening stuff. But you always have to remember that all authors have an agenda &lt;em&gt;(including this one, obviously - Ed)&lt;/em&gt; and it has been commented by people other than myself that esr's HOWTO could be alternatively titled 'How To Be Like Eric Raymond'. Well, so be it. It's always the journey that's the interesting part. So can we consider Steve's post to be an equivalent 'How To Be Like Steve Yegge'? Doesn't matter. Again, it's the journey that has value.&lt;/p&gt;&lt;p id="20070626-02"&gt;As an aside, I had an email from Amazon today.&lt;br /&gt;&lt;pre&gt;Your order #xxx-xxxxxxx-xxxxxxx (received 27-March-2007)&lt;br /&gt;-------------------------------------------------------------------------&lt;br /&gt;Ordered  Title                          Price  Dispatched  Subtotal  &lt;br /&gt;---------------------------------------------------------------------&lt;br /&gt;Amazon.co.uk items (Sold by Amazon EU S.a.r.L.):&lt;br /&gt;&lt;br /&gt;   1     Compilers: Principles, Tec...   £47.49      1   £47.49&lt;br /&gt;&lt;br /&gt;Shipped via Home Delivery Network Limited (estimated arrival date: &lt;br /&gt;28-June-2007).&lt;br /&gt;&lt;/pre&gt;Note the order date as well. Three months to get that book. Ouch! But at least it's given me time to read &lt;a href="http://www.amazon.co.uk/exec/obidos/ASIN/0126339511/203-1281903-2407963"&gt;these&lt;/a&gt; &lt;a href="http://www.amazon.co.uk/exec/obidos/ASIN/0262510871/203-1281903-2407963"&gt;two&lt;/a&gt;, and I can interpret Steve's post (and Joe's &lt;a href="http://bitworking.org/news/205/Dragon-Book"&gt;comment&lt;/a&gt;) as a good barometer of where I'm heading.&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;All content Copyright 2005, 2006 James Abley&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/13473243-1325603577648652220?l=eternusuk.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://eternusuk.blogspot.com/feeds/1325603577648652220/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=13473243&amp;postID=1325603577648652220' title='1 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/13473243/posts/default/1325603577648652220'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/13473243/posts/default/1325603577648652220'/><link rel='alternate' type='text/html' href='http://eternusuk.blogspot.com/2007/06/career-development.html' title='Career Development'/><author><name>James Abley</name><uri>http://www.blogger.com/profile/10389773375250732709</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-13473243.post-2558338455080564276</id><published>2007-06-14T23:37:00.001+01:00</published><updated>2007-06-14T23:43:03.130+01:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='boys'/><title type='text'>Seasonal Suffering</title><content type='html'>&lt;p&gt;I took the boys to the park yesterday and Callum was very chatty. He noticed that I was quite snottery* and talked about how I had B-fever, rather than hayfever. Clever!&lt;/p&gt;&lt;br /&gt;&lt;p&gt;* I must have been married to a Scot for too long to corrupt the English language so.&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;All content Copyright 2005, 2006 James Abley&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/13473243-2558338455080564276?l=eternusuk.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://eternusuk.blogspot.com/feeds/2558338455080564276/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=13473243&amp;postID=2558338455080564276' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/13473243/posts/default/2558338455080564276'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/13473243/posts/default/2558338455080564276'/><link rel='alternate' type='text/html' href='http://eternusuk.blogspot.com/2007/06/seasonal-suffering.html' title='Seasonal Suffering'/><author><name>James Abley</name><uri>http://www.blogger.com/profile/10389773375250732709</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-13473243.post-6454093576968868775</id><published>2007-06-14T22:52:00.001+01:00</published><updated>2007-06-30T22:08:09.674+01:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='java'/><category scheme='http://www.blogger.com/atom/ns#' term='jython'/><category scheme='http://www.blogger.com/atom/ns#' term='hacking'/><title type='text'>Jython Update - actually doing some work on UnicodeData</title><content type='html'>&lt;p id="20070614-01"&gt;So I had put this on hold to finish reading Josh Bloch and Neal Gafter's Java Puzzlers. Great book; highlighted some new things for me, which is all I ask for in any book. Partly that is since I'm still not doing Java 5 apart from at home for various minor things, but it was good.&lt;/p&gt;&lt;/p id="20070614-02"&gt;So now back to Jython, finally. Well, reasons for my procrastination first:&lt;ol&gt;&lt;li&gt;New Job - busy as hell.&lt;/li&gt;&lt;br /&gt;&lt;li&gt;New job comes with a new laptop, which I was hoping would be a big step up from my nearly six year old self-built machine. The new laptop has reasonably impressive hardware specification, but it's running Vista. What an absolute pile of shit. I honestly don't know how developers are productive using that OS. I've given it nearly two months, just to be sure that it's not the fact that I've been off Windows for three years that is causing me all of the problems, but really. It's got to the point where I'm looking seriously at Xen on Ubuntu for the odd application that I do need to run Windows for. The other alternative would be to install XP, put up with the &lt;a href="http://diveintomark.org/archives/2003/08/04/xp"&gt;half life cost&lt;/a&gt; and initial downtime of getting the laptop set up for development all over again. I'll enumerate my grievances in a separate post. I don't think XP would get in my way as much as Vista (I did knock up the &lt;a href="http://xmlunit.sourceforge.net/" title="XMLUnit"&gt;xmlunit&lt;/a&gt; &lt;a href="http://sourceforge.net/tracker/index.php?func=detail&amp;aid=1630204&amp;group_id=23187&amp;atid=377771"&gt;XMLSchema validation patch&lt;/a&gt; on my wife's XP machine over Christmas and it wasn't that painful), but I'm not a fan of Windows after using GNU/Linux exclusively for three years.&lt;/li&gt;&lt;/ol&gt;&lt;/p&gt;&lt;p id="20070614-03"&gt;So I've been doing a little work on UnicodeData again. Since I've not touched it for so long, I wanted to get some code up and running to start seeing how many tests were failing. Until Jython goes to Java 5 and above, I can't use java.lang.Character to do parts of it, or I could do a piecemeal approach of use java.lang.Character for the BMP, and then implement a new part for supplementary characters, or try to provide behaviour based on the running JVM. All a bit more work than I wanted to do, laziness and hubris being key. Instead, go for the brute force approach of the simplest thing that will possibly work. So I wrote a Python script (what else - it's a nice way of bootstrapping this problem) to parse the UnicodeData.txt file and generate some Java classes. The initial approach was to partition the UnicodeData.txt into a class for each plane in Unicode. Anyone that knows Unicode and the assigned codepoints will know that the BMP will take up most of this, but I was interested in getting something working, and then maybe refine it once the tests are passing. Well, my first cut was to have a simple interface:&lt;br /&gt;&lt;br /&gt;&lt;code&gt;&lt;br /&gt;interface UnicodePlane {&lt;br /&gt;&lt;br /&gt;    /**&lt;br /&gt;     * Return a UnicodeCodepoint for the specified codepoint.&lt;br /&gt;     *&lt;br /&gt;     * @param codepoint the Unicode codepoint&lt;br /&gt;     *&lt;br /&gt;     * @return a UnicodeCodepoint, or null if there is no match&lt;br /&gt;     */    &lt;br /&gt;    UnicodeCodepoint getCodepoint(int codepoint);&lt;br /&gt;&lt;br /&gt;}&lt;br /&gt;&lt;/code&gt;&lt;br /&gt;&lt;br /&gt;I would have a class that implements this interface for each plane and a static initializer within each class that fills a Map of UnicodeCodepoint classes keyed by Integer codepoint.&lt;br /&gt;&lt;br /&gt;Eclipse gives me this error:&lt;br /&gt;&lt;br /&gt;&lt;pre&gt;&lt;br /&gt;The code for the static initializer is exceeding the 65535 bytes limit &lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;Whereas ANT gave me this variation:&lt;br /&gt;&lt;pre&gt;&lt;br /&gt;    [javac] Compiling 2 source files to c:\Users\jabley\work\eclipse\workspaces\personal\jython-trunk\jython\build&lt;br /&gt;    [javac] c:\Users\jabley\work\eclipse\workspaces\personal\jython-trunk\jython\UnicodeData\generated-src\org\python\modules\unicodedata\UnicodeCharacterDataBasicMultilingualPlane&lt;br /&gt;.java:11: code too large&lt;br /&gt;    [javac]     private static final Map CODEPOINTS = new HashMap();&lt;br /&gt;    [javac]                              ^&lt;br /&gt;    [javac] 1 error&lt;br /&gt;&lt;br /&gt;BUILD FAILED&lt;br /&gt;c:\Users\jabley\work\eclipse\workspaces\personal\jython-trunk\jython\build.xml:456: Compile failed; see the compiler error output for details.&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;So I need to think a bit harder about the data structures. Turning to Bentley's Programming Pearls, the sparseness of certain items stands out, like the mirrored property.&lt;/p&gt;&lt;p id="20070614-04"&gt;I'll have a think. At least with the Python script that I have to cut up the UnicodeData.txt file, it's very easy to add another list comprehension to it, to see how many items in the file exhibit a certain property. The other way I'm considering is to just generate a properties file and lazily populate a Map as required. That's probably what I'll try next, rather than thinking too hard about how to compress a 1038607 bytes data file into something more reasonable.&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;All content Copyright 2005, 2006 James Abley&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/13473243-6454093576968868775?l=eternusuk.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://eternusuk.blogspot.com/feeds/6454093576968868775/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=13473243&amp;postID=6454093576968868775' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/13473243/posts/default/6454093576968868775'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/13473243/posts/default/6454093576968868775'/><link rel='alternate' type='text/html' href='http://eternusuk.blogspot.com/2007/06/jython-update-actually-doing-some-work.html' title='Jython Update - actually doing some work on UnicodeData'/><author><name>James Abley</name><uri>http://www.blogger.com/profile/10389773375250732709</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-13473243.post-8470799911778555218</id><published>2007-06-14T22:50:00.001+01:00</published><updated>2007-06-14T22:52:02.957+01:00</updated><title type='text'>Sleekit plumbing</title><content type='html'>Feels like Thames Water have reduced the water pressure in an effort to conserve reserves over the summer. Either that, or reserves are already low enough to cause a pressure drop. Either way, it means that the toilet can take more flushes to clear, and at nine litres a flush, I'm not sure how much water that conserves.&lt;div class="blogger-post-footer"&gt;All content Copyright 2005, 2006 James Abley&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/13473243-8470799911778555218?l=eternusuk.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://eternusuk.blogspot.com/feeds/8470799911778555218/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=13473243&amp;postID=8470799911778555218' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/13473243/posts/default/8470799911778555218'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/13473243/posts/default/8470799911778555218'/><link rel='alternate' type='text/html' href='http://eternusuk.blogspot.com/2007/06/sleekit-plumbing.html' title='Sleekit plumbing'/><author><name>James Abley</name><uri>http://www.blogger.com/profile/10389773375250732709</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-13473243.post-3709587831917632525</id><published>2007-06-14T22:48:00.000+01:00</published><updated>2007-06-14T23:42:09.810+01:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='boys'/><title type='text'>Happy Birthday!</title><content type='html'>Had a party for both the boys at the weekend. Knackering!&lt;div class="blogger-post-footer"&gt;All content Copyright 2005, 2006 James Abley&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/13473243-3709587831917632525?l=eternusuk.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://eternusuk.blogspot.com/feeds/3709587831917632525/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=13473243&amp;postID=3709587831917632525' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/13473243/posts/default/3709587831917632525'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/13473243/posts/default/3709587831917632525'/><link rel='alternate' type='text/html' href='http://eternusuk.blogspot.com/2007/06/happy-birthday.html' title='Happy Birthday!'/><author><name>James Abley</name><uri>http://www.blogger.com/profile/10389773375250732709</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-13473243.post-357752123664195077</id><published>2007-05-09T22:07:00.000+01:00</published><updated>2007-06-14T23:41:41.994+01:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='boys'/><title type='text'>Connor PeePee</title><content type='html'>&lt;p id="20070509-p1"&gt;Connor used his potty today for the first time.&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;All content Copyright 2005, 2006 James Abley&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/13473243-357752123664195077?l=eternusuk.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://eternusuk.blogspot.com/feeds/357752123664195077/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=13473243&amp;postID=357752123664195077' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/13473243/posts/default/357752123664195077'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/13473243/posts/default/357752123664195077'/><link rel='alternate' type='text/html' href='http://eternusuk.blogspot.com/2007/05/connor-peepee.html' title='Connor PeePee'/><author><name>James Abley</name><uri>http://www.blogger.com/profile/10389773375250732709</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-13473243.post-6113795531840467244</id><published>2007-04-25T22:01:00.000+01:00</published><updated>2007-05-10T22:07:00.094+01:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='boys'/><title type='text'>Cheeky Mouse</title><content type='html'>&lt;p id="20070425-p1"&gt;The boys had both been given a chocolate log and some sweets. Connor troughed his as normal and was watching CBeebies when Callum came to tell me about his day. We spotted Connor going for Callum's chocolate log in his bowl on the couch and told him to leave it. He grabbed it and did it in one with a chuckle!&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;All content Copyright 2005, 2006 James Abley&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/13473243-6113795531840467244?l=eternusuk.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://eternusuk.blogspot.com/feeds/6113795531840467244/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=13473243&amp;postID=6113795531840467244' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/13473243/posts/default/6113795531840467244'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/13473243/posts/default/6113795531840467244'/><link rel='alternate' type='text/html' href='http://eternusuk.blogspot.com/2007/05/cheeky-mouse.html' title='Cheeky Mouse'/><author><name>James Abley</name><uri>http://www.blogger.com/profile/10389773375250732709</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>
