2013-11-16  Making Jenkins Better - For You

I've just posted the slides and speaker notes from a session I gave a couple of years ago on using the Jenkins CI server. I focussed on the whys and wherefores of writing your own plugins. In time since I wrote and present the session, Jenkins has continued to move on and evolve, but I still believe the slides are valid. To fully exploit a tool, you have to shape it to you, not you to it.

The original abstract reads:

Jenkins is a widely used and extremely capable continuous integration server. While it's been available since 2007, under it's original name of Hudson, in popularity seems to have really taken off in the past year or so. One of the primary reasons for its success is it's extremely flexible configuration. Jenkins has a quite a small core, with most of its functionality provided through plugins. Jenkins plugins provide access to different source code control systems, a wide variety of build tools, test result tracking and charting, static analysis tools, and so on. Nearly every aspect of Jenkins can be customised via a plugin. At time of writing there are over 400 different Jenkins plugins available.

Four hundred is too few.

Over the little while we've from dabbling with CI to Jenkins forming part of our core toolset. Jenkins builds on checkin, yes, but also deploys builds into development environments. It runs performances tests and records the history. It tells us which build contains which bug fixes. It also does our release builds - tagging the repository, building from the tag, writes release notes telling us which work packs have been updated, pushes the build up onto the live server, and emails Ops to say everything is ready to go. The standard plugins provide the foundation, but the our own plugins have put Jenkins at the heart of our development process.

[Add a comment]


Dear every programmer in the whole world, when your program creates XML output please make sure the output actually is XML. Your pal, Jez

Today's offender is the alledged XML output (which is the default) produced by the SVN log Ant task. It doesn't escape entities in commit messages, meaning that if any of <, >, or & appear in those messages, the file the log task creates is invalid.

Opened issue 1488 in the SVNAnt tracker.
jez, 4th Mar 2013

[Add a comment]


Innovative phone app for Community Payback - Community Payback Visibility is a mobile app which will enable people to get involved in nominating sites for Community Payback in their neighbourhood. This innovative idea from Staffordshire and West Midlands Probation Trust was awarded £41,000 in innovation funding in our ‘How can we transform neighbourhoods in Britain together?’ GeoVation Challenge.

Community Payback is unpaid work carried out by offenders on community service and the free mobile app will allow the public to easily nominate sites for Community Payback and upload a photo so it can be quickly assessed by the Probation Service. If it is suitable a work group will be sent out to carry out the work and a photo and feedback posted back on the site so people can see the effect. The app will raise awareness of Community Payback and participation in Community Payback projects.

I'm working with the Probation Trust on this project. Should be good fun.

[Add a comment]


I've just cut a new release of Arabica, my XML and HTML processing library written in C++.

[Add a comment]


CycleStreets android app now with offline maps - We’re pleased to announce a major new version of the CycleStreets Android App (version 1.4), our fourth update in just over a year. It brings a great new feature … Offline maps!
[Add a comment]

2012-06-22  CycleStreets Android app is one year old

The CycleStreets Android app went live for public download from the Android Market a year ago last Wednesday. At the end of that first day there were a mighty 4 of what the Android Market calls "active device installs". As of June 20, there are 10,125.

Over the first six months, installs climbed pretty quickly for the first three months or so, then gradually plateaued at around 5500 active installs for the two months leading up to Christmas. Then Santa arrived. People obviously spent Boxing Day recovering, and then on the 27th of December they cracked out their new gizmos, installs ticked up and have continued on a straight line of about 30 new installs a day ever since.

According to the stats, about half of all installs are on Android version 2.3.3. Installs on Android 4 have gone from under 100 at the start of March to over 2,000 now. The majority of new installs are on Android 4.

95 people have rated the app in the Google Play Market, 79 of them rating it 4 or 5 stars. The people that like it tend to say things like "awesome" and "excellent". The more helpful feedback suggests the biggest problem people have is slow tile downloading. The less useful pick up on some specific quirk of routing locally ("Will not send me down ANY CYCLE PATH, even ones that are clearly show on the map") or overlook a feature it actually has ("many missing features including a proper way to save routes").

Other than "people are installing the app on their new phones and they seem to like it" I'm not entirely sure what these numbers actually tell us. I'm happy with that, though.

For me, it's been an interesting 18 months. I only started writing stuff for Android by accident, and I can't really remember how or why I offered to pitch in to the CycleStreets app. I'm glad I did – it's been good.

Thanks to Martin and Simon at CycleStreets HQ, to Theodore Hong who did the early work on the app that I picked up and without which I doubt I'd have bothered, to the other chaps who've contributed code and/or bug reports, and to those 10000 odd people wandering around with software I wrote in the pocket :)

Wonder where we'll be this time next year.

[Add a comment]

2012-04-27  A love letter to Boost.Spirit

From:  	"Jez Higgins" 
Date:  	Thu, January 4, 2007 11:29 am
To:  	"Kevlin Henney" 

Hi Kevlin,

Alongside the normal keynotes, sessions, panel discussions and so on
that conferences usually have, the academic conferences I went to as a
fresh faced young thing also had poster presentations.  A poster
presentation was, as you might have guessed, a poster of usually about
A3 size, which you filled with whatever you fancied.  The posters were
usually displayed on freestanding boards in the mingling/coffee drinking
areas between the main session rooms.  The nice things about doing a
poster were it was easier (because you could present a small piece of
work, or work in progress), it was cheaper (because you didn't actually
have to be there), but you could still list it as a publication.

I appreciate this is rather late in the day, but wondered if BoostCon
might consider posters?  I only bring it up because I doubt I can afford
to attend, it clashes with my wife's birthday in any case, but I do have
the scrap of an idea for a poster.  It would be some little extracts I'd
written about Boost.Spirit while working on an XPath and XSLT engine,
printed in 72pt text.

   XPath: variables returning node-sets
   Made a minor grammar fix, and reworked location steps slightly so
   expressions like $doc/step1/step2 or $doc[pred] work (assuming $doc
   is bound to a node-set obviously).

   Everytime I find a problem in the grammar, which actually isn't very
   often at all, I give thanks to the pragmatic programming Gods that I
   used Spirit rather than rolling my own parser. In this case, I'd
     FilterExpr ::= PrimaryExpr | FilterExpr Predicate
   after eliminating right-recursion as
     FilterExpr = PrimaryExpr >> *(Predicate >> PrimaryExpr);
   rather than
     FilterExpr = PrimaryExpr >> *Predicate;.

   Time to fix - about 30 seconds. Time to fix if I'd hand-rolled -
   don't even want to think about it :)

   Jaxen Bug 94 - http://jira.codehaus.org/browse/JAXEN-94
   "Charles Souillard reports a problem while trying to evaluate the                 
  following expression : 2+1-1+1. It should be 3.0 but is 1.0"

   Jaxen is an XPath engine that uses a hand-built parser.  It turned
   out that evaluation order of the arithmetic operators was wrong, and
   the code had to be patched in many different places to fix it.  Since
   my code implements the grammar as written in the spec, I knew that
   not only did I not have this problem, I *could* not have this

   When is an XPath expression not an XPath expression?
   When it's an XSLT pattern, that's when.

   As an XPath
   selects, for a given node, its child para elements which have ref
   attributes. As an XSLT pattern it tests whether a given node is a
   para element which has a ref attribute.

   Similarly, something like
   tests whether a given node is a para element with a chapter element
   parent.  In XPath terms, you'd express this as something like

   Aside from this sematic difference, syntactically XSLT patterns are
   an XPath subset. I don't have these things evaluating yet but, thanks
   to the miracle that is Boost.Spirit, I've extended Arabica::XPath to
   parse them. Took about half an hour, including writing a pile of test
   cases and getting them passing.  Spirit really is a top piece of
   work. While it's not hard to find people rambling on about how Python
   or Lisp or whatever really is the thing for writing little domain
   specific languages, this kind of thing really shows just how deadly
   cool template metaprogramming can be. Read the EBNF, transcribe it
   into code, compile, and go. Easy, expressive and type-safe. What more
   could you want?

Yes, it's a love letter to Spirit.  Why not?

Hope you're keeping as busy as you'd like, and that you and your family
are well and happy.

[Add a comment]


After hitting a plateau in October, Cyclestreets Android app installs have been steadily climbing again since Christmas. Thanks Santa!
[Add a comment]


The main focus of my development work is, and has been for the past few months, letting the Ops guys drink more tea. I'll be talking, briefly, about it the ACCU Lightning talks on Wednesday, 23 November.
[Add a comment]


So last Sunday evening I was sitting in my attic with three balloons, about to go to bed, when my cheerful bear-like code-friend Olve tweeted

Just submitted my proposals to ACCU 2012. Only 35 minutes till submission dateline so hurry up. #accu2012

So I didn't go to bed. I created a new Bazaar repository, fired up Emacs, and started typing. To my mild alarm, the ACCU submission procedure this year is all through the web, rather than by emailing in and I almost blew it by misreading the sign up form and having to fill it in again. I hit Submit and read

Thank you for your submission. You may revise your abstract until the submission deadline in 28 seconds.
I passed on the option to revise and just went with it :)

Making Jenkins Better

Jenkins is a widely used and extremely capable continuous integration server. While it's been available since 2007, under its original name of Hudson, its popularity seems to have really taken off in the past year or so. One of the primary reasons for its success is its extremely flexible configuration. Jenkins has a quite a small core, with most of its functionality provided through plugins. Jenkins' plugins provide access to different source code control systems, a wide variety of build tools, test result tracking and charting, static analysis tools, and so on. Nearly every aspect of Jenkins can be customised via a plugin. At time of writing there are over 400 different Jenkins plugins available.

Four hundred is too few.

Over the past two years, we've gone from dabbling with CI to Jenkins forming part of our core toolset. Jenkins builds on checkin, yes, but also deploys builds into development environments. It runs performances tests and records the history. It tells us which build contains which bug fixes. It also does our release builds - tagging the repository, building from the tag, writes release notes telling us which work packs have been updated, pushes the build up onto the live server, and emails Ops to say everything is ready to go. The standard plugins provide the foundation, but our own plugins have put Jenkins at the heart of our development process.

If you want to get the most from Jenkins, you really should write your own plugins. This session will explain why you should, what you can change or add to Jenkins, and how to do it.

[Add a comment]

2011-09-27  CycleStreets Android App Development Builds

The CycleStreets Android App is available through the Android Market. Like other apps, if you install from the Market, you will be informed of new updates as they are released. Unlike most other apps, the CycleStreets app is free software - the code is available for anyone to poke around with, build on, add to, and so on.

The code is more or less constantly evolving, so there are often new features or bug fixes in the code some time before a release to the Android Market. Features or bug fixes you might like to have. Of course, not everyone has the time or skills to build the code themselves. Fortunately, we have software to that for us.

Each time I make a change to my copy of the app's code, a new build of the app will appear here. Whatever I'm working on might not be entirely complete, but it'll be the very latest code there is.

Once I have finished a feature, I push the code into the main branch. Those builds will appear here, in the master directory. Builds of this branch will happen less often, but new features should be complete.

To install any of these builds, you will first need to uninstall any existing version of the CycleStreets app you might have on your phone, and then turn on the "Unknown sources" setting. With that done, download the build and, once the download completes, select it. Your phone should offer to install it.

Unfortunately, there's no way to automatically update an application you've downloaded like this. The best I can offer is an RSS feed of builds.

[Add a comment]

2011-06-23  CycleStreets for Android now available

CycleStreets, providing cycle routing for the UK, is now available on Android – Install the app from the Android Market now - for free!

I picked up this project at the start of the year, when it was essentially dormant, and now it's live just in time for Bike Week. Read more about it on the CycleStreets blog or poke around in the code on GitHub.

[Add a comment]


Whenever you find XML being processed with regular expressions, stop right there because that's where the bugs are.
Now you have two problems
jez, 3rd Jun 2011

[Add a comment]

2010-12-22  Patching Clang for Ubuntu 10.10 Maverick Meerkat

If you're trying to use the Clang C++ compiler on Maverick and you're getting link failures like

 undefined reference to
`std::basic_streambuf<char, std::char_traits<char> >::seekoff(long, std::_Ios_Seekdir, std::_Ios_Openmode)
you're just going to have to patch it and build it yourself. It's actually pretty easy, it just takes a few minutes.

  • Check out the LLVM & Clang source and build it as described on the Clang website.
  • Open up ~/llvm/tools/clang/lib/Frontend/InitHeaderSearch.cpp in your favourite text editor.
  • Add the following at line 627, just under the case for llvm::Triple::Linux
        // Ubuntu 10.10 "Maverick Meerkat" -- gcc-4.4.5 
                                    "i686-linux-gnu", "", "64", triple);
  • Build again. It'll be much quicker this time around.
  • Install - sudo make install

With any luck Clang will be patched up in pretty short order, thus rendering this a historical curiosity.

Ok, this turns out not be a complete fix, but it's probably good enough. I'm still getting link failures -
undefined reference to `std::basic_streambuf >::pbackfail(int)'
undefined reference to `std::basic_streambuf >::overflow(int)'
in one of my builds. Other things using wide streams are linking ok, so I'm not entirely sure what I'm doing differently in this one. Wide streams are probably a minority interest though so, in lieu of a proper fix, what I've described above is still worth a go.
jez, 22nd Dec 2010

[Add a comment]

2010-10-27  New release: The Mango Library

The 2010 October release of the Mango library is available now.
[Add a comment]

2010-10-24  New release: Arabica XML and HTML Processing Toolkit

The 2010 November release of the Arabica XML and HTML Processing Toolkit is available now.
[Add a comment]

2010-08-02  New release: Dublin Core and eGMS Metadata Viewer for Firefox

Just uploaded a new release of the Dublin Core and eGMS Metadata Viewer add-on for Firefox. Slightly wackily, it will also display metadata from the NASA taxonomy too.
[Add a comment]


Whenever I see an XML library described as "easy to use" I know the bloke who wrote it knew stuff all about XML.

[Add a comment]


So what is this scripting language?

It's Groovy.

Yes, but what's it called?

It's Groovy.

I've been working on a small application to help automate application deployments. We have some existing infrastructure built with Ant, but it's rather clunky, some of how it works is non-obvious, and it still requires more manual intervention that I'd like.

For some time, my friend Russel has been extrolling the virtures of Gant as a build tool. Gant is a wrapper, written in Groovy, for Ant which allows Ant tasks and Groovy scripts to be combined together in one big happy build script. I'd never really understood why you'd want access to a general purpose language in your build scripts, largely because I'd never needed to. Now that I was thinking of deployments as a 'build-like' operation (even though it really isn't), the appeal was obvious. I grabbed Gant and used it to bootstrap my application.

Groovy is a dynamic language for the JVM. Unlike many other dynamic languages on the JVM, especially those that originated elsewhere, Groovy takes a 'Java+' approach. Groovy looks like Java with extra bits, which makes it very approachable. You can start quite gently, writing code that looks just like Java and become groovier over time - looser typing, list and map literals, fewer semicolons, closures, and so on. Groovy does all the normal things you'd expect from a modern dynamic language (REPL available but can also be compiled, metaobject protocol, closures, duck typing, and so on). In addition, it operates seamlessly with Java code and libraries, in both directions. Seamless is a much overused term, but here it is entirely accurate. Groovy can freely use Java classes, and Groovy can be compiled to classes which can be called from Java.

It's pretty good fun, and I'm enjoying working with it. Right now, having previously used Jython and Javascript, Groovy would be my first-choice for a dynamic language on the JVM.

[Add a comment]

2010-01-24  Continuous Integration for One

Executive summary : It's a good thing, but not for the reasons you expect

Like many of my programming chums, I believe in the importance of the build. Breaking the build is a bad thing. Knowingly breaking the build is, well I'm not a religious man, but it's a sin.

Sometimes the build goes wonky or tests start failing because of mishap or misfortune. Someone makes a change to one place in the code, somebody else makes a change in another part, something goes awry and oopsy. Of course, tools can help us here. If you've got something that regularly checks your source code repository for changes and rebuilds everything as soon as it does, then you can find out if there's a problem sooner rather than later.

These tools have a name, continuous integration servers, and are so called because they automate the process of continuous integration as described by Martin Fowler. You can put something together yourself pretty easily, but there are a ton of them available. We've been using CruiseControl, one of the more widely used CI servers, to reasonable effect over the past few months of pretty intense a development.

We want to push our automated build a little bit further. For various reasons that I haven't the energy to go into here, our environment is awkward. Putting a release up into the test servers is complex and still involves a certain amount of time and a degree of manual intervention. Consequently, it probably doesn't happen as often as it should. We're in a quieter period at the moment, but when things kick off again it's going to be a problem. What we'd like to do is finish automating that process, and having done that get our CI server to build and deploy nightly into our test environment. With that complete, we're going to try and kick off the gui testing scripts as well. Our testers can spend more time with their feet on the desk drinking tea, while the developers can be secure that yesterday's work does actually work.

Anyway, it's fallen to me to actually do this. One of the things I need to do was spent a bit of time fiddling with the build server. CruiseControl, while a sound piece of kit, doesn't lend itself to easy fiddling. It's driven by configuration files and every time you change the configuration you need to bounce the server, if you get something wrong it's not necessarily obvious why, and that just a faff and a time consuming one. By coincidence, several people on the accu-general mailing list had been discussing the Hudson build server. One thing that stuck in my mind was that Hudson could be configured entirely though its GUI. And so I gave it a try. I'm slightly ashamed to say that's the reason why, but I'm glad I did. Hudson is extremely easy to fiddle with - setting up builds, chaining different builds together, tool integration, and so on, are all straightforward and can be done via a web browser. I doubt there's anything it can do that can't be done with CruiseControl, but for exploratory work it's streets ahead.

Because I was in a poking about mode, I installed Hudson on the my own server. Working against the machine sitting on the floor by my right ankle was just easier than working against a machine several steps away on the other side of a Citrix connection that isn't exactly snappy and which occasionally slows to a treacly crawl. So I had Hudson and I needed some code. Fortunately, I had some. From installation to building the Mango library and running its tests, via installing a plugin to pull code from Bazaar repositories, took about five minutes.

I poked around Hudson a bit more and found a setting to draw a chart of test results. I can see why such a thing is useful in a team situation, but Mango is one man project. I build it and run the tests whenever I work on it. Poking some more, I found another setting that drew a chart of compiler warnings. That's when I had a little revelation.

Continuous integration servers are touted because they'll let you know, and know quickly when the build has broken. And that's true and it's a real benefit. But it doesn't apply for a one man project. In fact, I'm not even sure it's true for most multi-person projects either. What CI servers can do for the one man project is remember. Remember your test results. Keeping track of build times. Remember your compiler warnings. Stuff you wouldn't yourself record unless you were an outrageously meticulous record keeper.

As it happened, Mango had no compiler warnings in the build. However I had other code that did. Written in Java several years ago, I hadn't had reason to work on it for quite some time. Building with a modern Java compiler produced a slew of warnings, which I'd not had the inclination to fix. Hooking up Hudson to build it, within moments I had a chart telling me exactly how many warnings I had - seventy - together with breakdowns of warnings by type and class name, hyperlinked into the source.

As I explored the warnings report, some of them looked very simple to fix. So I fixed them and committed the changes. So Hudson rebuild the code and sent me an email telling me it had. That prompted me to look at the Hudson build console, where I saw the warnings graph had gone down a little. Which prompted me to fix another warning. You can probably fill in the rest.

By remembering what had happened in previous builds and then telling me in an easy to understand way, Hudson prompted me to fix a codebase that had languished for years. The second spike on the chart above is where, having sorted out everything in the main code, I turned on warnings in the test code.

The psychological effect of that graph was really remarkable. I decided to make deliberate use of it. When building Arabica I use GCC's default warnings. Recently I've been exchanging emails with Ash Berlin, who's using Arabica to provide XML support for the Flusspferd Javascript project. Flusspferd build at a higher warning level than I do and Ash had sent me a few patches to silence various things he was seeing. Setting up Hudson to build Arabica took, again, only a couple of minutes even though it's a C++ project using Autotools rather than a Java project using Ant. I cranked up the warning level. 600 hundred warnings! Blimey!

I suspect that Hudson's GCC warnings parser isn't quite as refined as the Java warnings parser, so I don't believe that was the true number. Neverhteless it was still a lot and rather more that I was expecting. They were gone in 15 builds. All of them, gone. I didn't have to make 600 individual fixes - a change in an include file can wipe out several warning messages at a stroke - but I think that's pretty quick. And I know I'll keep those warnings at zero too.

When I started looking at Hudson, I was just after something I could easily fiddle around with while working on our build and deploy. I didn't expect that it would creep into my brain and change the way I worked on my individual projects.

[Add a comment]

2009-12-08  Dublin Core and eGMS Metadata Viewer

HTML and XHTML can contain metadata embedded in its head section. It may contain all kinds of useful information, but web browsers don't provide a means to display it. At the prompting of my internet chum Andy Mabbett, I rewrote an existing Firefox add-on to provide a viewer for embedded Dublin Core and eGMS metadata.

The viewer is available for download from Mozilla Add-ons. It's currently marked as experimental, which is Mozilla Add-on speak for newly released, rather than a warning it might trash your machine. It won't, and there are people who've been running it for several weeks without issue. It is, after all, just a bit of Javascript.

[Add a comment]

2009-11-24  Presenting at accu2010

My collegue James Reddick and I will be presenting Wrestling With Giants at ACCU 2010 Conference. The Conference is being held at the Barcelo Hotel in Oxford, from April 14 to 17 2010.
[Add a comment]

2009-11-22  accu2010 Keynotes Announced

The keynote speakers and pre-conference tutorials at ACCU 2010 have been announced, and they look pretty good to me. The keynoters are

The pre-conference tutorials are

No official news on the rest of the programme, but it can't be long now. Reading the smoke signals suggest James' and my proposal didn't quite make the cut. I'm a wee bit disappointed because I think it would have been a pretty lively session. Still, have to wait for the thanks/no thanks email to be certain. Fingers still crossed.

Huzzah! Just had an acceptance email. So much for my smoke signal reading skills.
jez, 24th Nov 2009

[Add a comment]


New Mango Library release.
[Add a comment]

2009-09-30  accu2010 Proposal : Wrestling with Giants

Large software components - content management systems, workflow engines, ERP systems, CRM tools - promise much, but often seem to deliver less and with great difficulty. There sometimes seems to be some distance between what the product claims to do, and what it actually does. Sometimes it almost does what you need, but not quite. It may present a myriad of possibilities, but give no guidance as to the best path. Alternatively, it may promote one true way and punish those who need to take the highways and byways. However, all these types of systems have one thing in common - you have no choice but to use what's in front of you.

Recently, we (that's the corporate we) have replaced a large web application developed in-house over many years with an equivalent system developed atop a 3rd-party content management system of precisely the category described above. The project went live on 6 September, having slipped 5 weeks on a 9 month plan.

This talk is not about how wonderful our CMS is or how wonderful we are. Nor can it examine the reasons why the previous application was obsoleted, or how the substrate for the new development was chosen. Instead, we want to look at the obstacles presented by our content management system and of our own devising, and how we overcame them. From that we'll try to draw lessons that implementors on and (this may be wishful thinking) vendors of large software systems might do well to learn.

The "we" doing the presenting here is myself and m'water-polo-playing colleague James. The "we" who actually did stuff is everyone we work with. Working with large lumps of other people's code is something that lots of programmers have to deal with at some point in their career. After a bit of a wobbly start, we did eventually start to motor, and our new system did go live pretty much on time. We learned stuff. Lots of stuff. Hopefully we'll get a chance to describe and discuss some of it at the ACCU Conference 2010 next April.

You nailed the title, Jez.
Thomas Guest [e] [w], 1st Oct 2009
Thanks. Let's hope we can nail the content too!
jez, 1st Oct 2009
Excellent topic, I look forward to it.

Just don't let them schedule it on the Wednesday 'cos I won't be there.
allankellynet, 8th Oct 2009

[Add a comment]

2009-08-07  Security: Yesterday, Today, and Tomorrow

On November 7th 2009, the ACCU will be holding a one day conference at Bletchley Park, home of the legendary World War II 'Enigma' code breakers, and the site at which the world's first digital computer went operational.

Confirmed speakers (alphabetical order) include:

  • Tony Sale, lead on the working reconstruction of 'Colossus', the world's first digital computer. The original was used to break the German 'Lorenz' code, and played a vital role in the the run up to the Allied invasion of Europe. Personal web site at http://www.codesandciphers.org.uk/
  • Simon Singh, author, journalist and TV producer, specialising in science and mathematics, and author of 'The Code Book', a history of codes and code breaking from Ancient Egypt to the Internet. Personal web site at http://www.simonsingh.net/
  • Phil Zimmermann, the original creator of the PGP e-mail encryption package, which despite three years of government persecution became the most widely used e-mail encryption software in the world. Personal web site at http://www.philzimmermann.com/EN/background/index.html

The Conference will be held in the elegant Victorian Bletchley Park Mansion, at the centre of Bletchley Park itself, allowing conference attendees the opportunity to visit the exhibits on show at the National Museum of Computing and the rest of Bletchley Park. Bletchley Park is home to a number of unique artifacts, including the Colossus, the Bombe (including the mock-up that featured in the film 'Enigma'), original Enigma machines, and a Lorenz coding machine. The Bletchley Park web site is at http://www.bletchleypark.org.uk/. The National Museum of Computing web site is at http://www.tnmoc.org/

The conference is organised by the ACCU. The ACCU is an organisation of programmers who care about professionalism in programming and are dedicated to raising the standard of programming. The proceeds of the conference will go to the Bletchley Park Trust to help with the upkeep of Bletchley Park. Conference rates have not yet been finalised, but will be in the region of £95/person. The ACCU web site is at http://accu.org/. A full schedule will be available on the ACCU web site shortly.

For further information contact: Astrid Byro, or Alan Lenton

[Add a comment]

2009-08-06  Call for Participation - ACCU 2010

April 14-17, 2010. Barcelo Oxford Hotel, Oxford, UK
Submission deadline: 30th of September 2009
Highlight: Special track on software testing, please read on
Email proposals to: Giovanni Asproni, conference@accu.org

We would like to invite you to present a session at this leading software development conference.

We have a long tradition of high quality sessions covering many aspects of software development, from programming languages (e.g., C, C++, Java, C#, Ruby, Groovy, Python, Erlang, Haskell, etc.), and technologies (libraries, frameworks, databases, etc.) to subjects about the wider development environment such as testing, development process, design, analysis, patterns, project management, and softer aspects such as team building, communication and leadership.

In particular, this year we are going to have a special track on software testing--we are interested in experience reports, techniques, lessons learned, etc.

Sessions may be either tutorial-based, presentations of case studies, or take the form of interactive workshops. We are always open to novel formats, so please contact us with your idea.

The standard length of a session is 90 minutes, with some exceptions. In order to allow less experienced speakers to speak at the conference without the pressure of filling a full 90 minutes, we reserve a number of shorter 45 minute sessions.

If you would like to run a session please let us know by emailing your proposals to conference@accu.org by the 30th of September 2009 at the latest.

Please include the following to support your proposal:

  • Title (a working title if necessary)
  • Type (tutorial, workshop, case study, etc.)
  • Duration (45/90 min)
  • Speaker name(s)
  • Speaker biography (max 150 words)
  • Description (approx 250 words)

Proposals about specific products and technologies will be taken under consideration only if they are open source and available for free (at least for non-commercial use). If you are interested in talking about a proprietary technology, there is the possibility of "sponsored sessions" which are presented outside the standard conference schedule. Please email conference@accu.org for more information.

If you are interested in knowing more about the conference you may like to consult the website for previous years' editions at www.accu.org/conference for background information.

Speakers running one or more full 90 minute sessions receive a special conference attendance package including free attendance, and assistance with their travel and accommodation costs. Speakers filling a 45 minute slot qualify for free conference attendance on the day of their session.

The conference has always benefited from the strength of its programme, making it the highlight of the year for many attendees. Please help us make 2010 another successful event.

I'm looking forward to seeing you there,
Giovanni Asproni
ACCU 2010 Conference Chair

[Add a comment]


Arabica development snapshot released.
[Add a comment]


New Arabica release. This release provides incremental improvements to the XSLT library.
[Add a comment]

2008-11-20  The Great JezUK Computing Lab Infrastructure Rejiggle of 2008 - A Magic Piece of Software

So I've got a computer constantly reminding me of its age, a fear of breaking stuff that already works, no real desire to buy lots of new kit, and (if I'm being honest) a big case of the lazies. I know I'm going to have to rejig my various machines, ideally bringing all their functions together onto one box running a reasonable recent Linux, but I don't want to break anything that already works in the process.

Using Linux for your home server really isn't something you need to think too hard about. It doesn't cost anything, for a start, and it works with pretty much any hardware you throw it at. More importantly, everything you can control through a shiny GUI you can also control through the command line. This means your server doesn't need to have a keyboard, mouse, and monitor connected to it. You can just login in as and when you need to, do whatever it is, and clear out again. Anyone who tells you that you can remotely administer a Windows box with the same ease had never had to troll down four flights of stairs, sign for a key, and proceed with a minder through two sets of security doors to gain access to a server, solely to spend thirty seconds dinking round with a mouse.

As a further block to my actually doing anything, Etrigan, the box that I would use as the all-in-one server was running Windows. Installing Linux alongside an existing Windows installation tends to involve repartitioning the disk. When I read words like repartitioning what I hear is potentially destructive low-level disk voodoo. Now while I know lots of people have done this kind of thing without a problem (indeed I've done it myself in the past), these days I take a rather more conservative view. It's not data loss I'm worried about here, it's (as I'm sure you've gathered by now) utility loss. So I didn't do anything.

I briefly considered virtualisation. Running a Linux server inside a virtual machine running on the Windows box is entirely possible, and even rather useful. However, I'm not sure it really makes for a sensible long term solution. Not for an amateur sysadmin, who'd really rather not touch anything ever again once it's all up and going.

And then one day, while I was reading about something entirely unrelated I saw a reference to a something else that reminded me of yet another a thing, and suddenly all the dominoes were in a row and the magical inertia busting piece of software I needed revealed itself to me. That software is Wubi.

Wubi is ...

an officially supported Ubuntu installer for Windows users that can bring you to the Linux world with a single click. Wubi allows you to install and uninstall Ubuntu as any other Windows application, in a simple and safe way.
Linux installed onto a Windows filesystem, with only the boot record updated. OK, modifying the MBR still smacks of potentially destructive low-level disk voodoo, but it's significant lower risk than repartitioning. If a repartition goes wonky you've probably had it, but an MBR should be repairable.

So I downloaded Wubi and had a go. There's not a great deal to tell after that, because it did exactly what it said it would. It installed Linux onto my machine, adding a new boot option. If I boot into Windows, the machine is just as it was before. If I boot into Linux, I get a shiny new Linux box to prod and poke and configure.

And that's really bloody marvellous. I can take as long as I like to configure the Linux personality, because the Windows personality is always there to fall back on. If I get a bit carried away with apt-get and screw up the Linux install, I can flip back to Windows to uninstall and just start again.

I did, in fact, have to do that. The current Ubuntu release didn't play nicely with my machine and its AMD Athlon 64 processor. It would run for a little while perfectly normally, then completely freeze. I'm assuming some kernel strangeness. I had another go, this time using the previous release, and it's been absolutely fine.

A few hours fiddling later, I was viewing everything from entirely the other side. Before, I considered myself pragmatic and careful. Now, I saw myself as having been conservative to the point of paralysis, and wondering what on Earth it was I'd been worried about. With Etrigan now handling the email and serving up Subversion repositories, I took a bit of breath, gave Animal's power switch a firm push, and everything carried on working. Only much more quietly.

Executive summary: Wubi - remarkable piece of kit.

[Add a comment]

2008-11-17  The Great JezUK Computing Lab Infrastructure Rejiggle of 2008 - A Noisy Fan

The noisy fan belonged to Animal, my email and subversion server. It was never the quietest machine and it had gradually become noiser and noisier over the years. In the past few months, it had started intermittently clattering. Now one noisy cooling fan doesn't a impending catastrophic hardware failure make, but it was a constant nagging reminder that the machine was ever more aging. Rather than wait for the box to eventually keel over I decided, in a non-specific mañana kind of way, to preempt it by doing an infrastructure makeover.

Over the past year or so, I'd toyed with buying another Linkstation, reflashing it to turn it into a proper little computer (rather than a dedicated fileserver) and set that up to handle the email. It's sounds like a fun little project, but the seemingly non-stop changes in hardware and the necessary knock changes to software make for somewhat of a moving target. Plus I'm naturally inclined to laziness.

Clattery-clattery ... but I had to do something. I had, after all, decided. I just needed something to come along and magically make rejiggling less faff, while simultaneously avoiding the risk of breaking anything that already works. And where do you find something like that ...

[Add a comment]

2008-11-14  The Great JezUK Computing Lab Infrastructure Rejiggle of 2008

Because I like to at least pretend to be a proper software professional, I have more than one computer. Some of them of just lying around the place gathering dust, there's a laptop I permit the family to abuse, I have a laptop of my own, and then there are the three that sit under my desk serving things. These three boxes constitute the length and most of the breadth of what I laughingly refer to as the JezUK Computing Lab.

The first of the three boxes is Falcon, a little linkstation, which sits there whirring away serving files. I got it a couple of years ago to replace the previous fileserver, which was an old PC which had finally surcome to repeated exposure to houses being replastered. It's a dinky little box and if you're after that kind of thing, you should give them a look. This box it replaced, Hawk, was one of a pair of machines that have been hanging around under my desk for about ten years. As in real life (or as real as pro-wrestling gets) while Hawk is no longer with us, Animal is still soldiering on while being, by modern standards, pretty thoroughly washed up. Running an aged SuSE Linux release, Animal was an email toaster and also hosted my subversion repositories. The final box, Etrigan, a tower system so large and black and solid it looks like an escapee from a Stanley Kubrick film, was, until recently, my main dev machine. It had the scanner and printer plugged into it, and so even when it was retired from every day use got left on so that people could scan and, erm, print.

Because everything worked, I've always been loathe to change anything simply for the sake of changing. Indeed, previous changes have, generally, been precipitated by failure. A fileserver failure about 4 years provided the opportunity, for instance, to move my email clients to IMAP rather than POP3, requiring the email toaster setup. (I know this reverses the usual server cause-and-effect chain, but it's my lab, my rules.) It's a shift I'd hinted at at least a year before, but it wasn't until provoked by dying hardware that I made the change. Once Animal was set up and handling the mail properly, I didn't touch it again. No package updates, no kernel rebuilds, no nothing. Why break something that worked? This conservatism/pragmatism/laziness has been a signature feature of my infrastructure management, and I commend it to you. Print it up on a big piece of paper and pin it up on the wall - If it works, don't touch it.

In the last week though, I have made considered, unpanicked, and significant changes to the way things work, to the point where I powered down Animal (probably for the last time) and I'm looking to power down Falcon sometime relatively soon. Two things prompted these changes - a noisy fan and some very clever software.

I'll burble about both those things later ...

[Add a comment]


New Arabica release. This release adds an HTML parser, and significant improvements to the XSLT library.
[Add a comment]


Introduction to Arabica, Library of the Month feature for Software Developer's Journal.
[Add a comment]


Iterators: It's Just One Damn Thing After Another presentation to ACCU Cambridge.
[Add a comment]


Arabica patch release, fixing a build problem with older versions of GCC.
[Add a comment]


Arabica release, fixing build issues on some platforms.
[Add a comment]


New Arabica release.
[Add a comment]


New WheresKal release. Adds new procrastination breaker module.
[Add a comment]


New Arabica release. This release adds an XSLT engine to the existing SAX, DOM, and XPath implementations.
[Add a comment]


New Mango release. It adds two new iterators.
[Add a comment]

2006-09-27  XSLT Scrapbook: Pretty Printing

Pretty printing XML looks like something that should be trivial in XSLT. Something like

<xsl:stylesheet ...>
  <xsl:output method="xml" indent="yes"/>
  <xsl:strip-space elements="*"/>

  <xsl:template match="/">
    <xsl:copy-of select="."/>
perhaps? Sadly that only seems to work with Saxon.

Here's a more general solution, cooked up from suggestions here. It produces identical results for the transformers I tested - Saxon, Saxon8, Xalan and MSXML.

  <xsl:output method="xml" indent="no"/>
  <xsl:strip-space elements="*"/>

  <xsl:param name="indent-increment" select="'  '" />

  <xsl:template match="*">
    <xsl:param name="indent" select="'&#xA;'"/>

    <xsl:value-of select="$indent"/>
      <xsl:copy-of select="@*" />
        <xsl:with-param name="indent" 
                select="concat($indent, $indent-increment)"/>
      <xsl:if test="*">
        <xsl:value-of select="$indent"/>

  <xsl:template match="comment()|processing-instruction()">


[Add a comment]

2006-05-23  XSLT Scrapbook: The default is probably not what you want

The empty stylesheet almost certainly does the wrong thing.

<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="1.0">


The default processing is equivalent to

<xsl:template match="*">

<xsl:template match="text()">
  <xsl:value-of select="."/>

All the text gets dumped out and everything else is lost. When starting a new stylesheet, you probably want to start by passing through everything or suppressing everything. You almost certainly do not want the default behaviour.

[Add a comment]

2006-05-23  XSLT Scrapbook: Suppress Everything

Here's a stylesheet that generates no output

<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="1.0">

  <xsl:template match="node()"/>


It's a good starting point for building a new stylesheet.

[Add a comment]

2005-07-01  XSLT Scrapbook: Identity transform

The identity transform - what goes in is what comes out.

<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="1.0">
  <xsl:template match="@*|node()">
      <xsl:apply-templates select="@*|node()"/>

[Add a comment]

Jez Higgins