<?xml version="1.0"?><!DOCTYPE rss PUBLIC "-//Netscape Communications//DTD RSS 0.91//EN" "http://my.netscape.com/publish/formats/rss-0.91.dtd"><rss version="0.91"><channel>  <title>JezUK News</title>  <description>JezUK Development Notes and Announcements</description>  <link>/notebook</link>  <language>en-gb</language>  <webMaster>jez@jezuk.co.uk</webMaster>  
<item><title>Dear every programmer in the whole world, when your program creates XML output please make sure the output actually is XML</title><link>http://www.jezuk.co.uk/notebook?id=4383</link><description><![CDATA[ <p>Dear every programmer in the whole world, when your program creates XML output please make sure the output actually is XML.  Your pal, Jez</p>
<hr/>
<p>Today's offender is the alledged XML output (which is the default) produced by the <a href='http://subclipse.tigris.org/svnant/svntask.html#log'>SVN log Ant task</a>.  It doesn't escape entities in commit messages, meaning that if any of <code>&lt;</code>, <code>&gt;</code>, or <code>&amp;</code> appear in those messages, the file the log task creates is invalid.</p> ]]></description></item>
<item><title>Innovative phone app for Community Payback</title><link>http://www.jezuk.co.uk/notebook?id=4376</link><description><![CDATA[ <p><a href='http://www.geovation.org.uk/innovative-phone-app-community-payback/'>Innovative phone app for Community Payback</a> - <i><a href="https://challenge.geovation.org.uk/a/dtd/111232-16422" target="_blank">Community Payback Visibility</a> is a mobile app which will enable people to get involved in nominating sites for Community Payback in their neighbourhood. This innovative idea from <a href="http://www.swmprobation.gov.uk/" target="_blank">Staffordshire and West Midlands Probation Trust</a> was awarded &pound;41,000 in innovation funding in our <strong>‘How can we transform neighbourhoods in Britain together?’</strong> GeoVation Challenge.</i></p>
<p><i>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></p>
<p>I'm working with the Probation Trust on this project.  Should be good fun.</p> ]]></description></item>
<item><title>I've just cut a new release of Arabica, my XML and HTML processing library written in C++</title><link>http://www.jezuk.co.uk/notebook?id=4373</link><description><![CDATA[ <p>I've just cut <a href='http://www.jezuk.co.uk/cgi-bin/view/arabica/log?id=4372'>a new release of Arabica</a>, my XML and HTML processing library written in C++.</p> 
 ]]></description></item>
<item><title>CycleStreets android app now with offline maps</title><link>http://www.jezuk.co.uk/notebook?id=4358</link><description><![CDATA[ <span class='linkfarm'><strong><a href='http://www.cyclestreets.net/blog/2012/07/05/android-app-offline-maps/'>CycleStreets android app now with offline maps</a></strong> - <i>We’re pleased to announce a major new version of the <a href='https://play.google.com/store/apps/details?id=net.cyclestreets'>CycleStreets Android App</a> (version 1.4), our fourth update in just over a year. It brings a great new feature … Offline maps!</i></span> ]]></description></item>
<item><title>CycleStreets Android app is one year old</title><link>http://www.jezuk.co.uk/notebook?id=4356</link><description><![CDATA[ <p>The <a href='https://play.google.com/store/apps/details?id=net.cyclestreets'>CycleStreets Android app</a> 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.</p>

<p>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.</p>

<p>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.</p>

<p>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").</p>

<p>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.</p>

<p>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.</p>

<p>Thanks to Martin and Simon at <a href='http://cyclestreets.net/'>CycleStreets</a> HQ, to <a href='http://www.linkedin.com/in/theodorehong'>Theodore Hong</a> 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 :) </p>

<p>Wonder where we'll be this time next year.</p> ]]></description></item>
<item><title>A love letter to Boost.Spirit</title><link>http://www.jezuk.co.uk/notebook?id=4349</link><description><![CDATA[ <pre>
From:  	"Jez Higgins" <jez@jezuk.co.uk>
Date:  	Thu, January 4, 2007 11:29 am
To:  	"Kevlin Henney" <kevlin@curbralan.com>

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
   transcribed
     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
   problem.

   When is an XPath expression not an XPath expression?
   ----------------------------------------------------
   When it's an XSLT pattern, that's when.

   As an XPath
     para[@ref]
   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
     chapter/para
   tests whether a given node is a para element with a chapter element
   parent.  In XPath terms, you'd express this as something like
     boolean(self::para[parent::chapter]).

   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.
Jez
</pre> ]]></description></item>
<item><title>After hitting a plateau in October, Cyclestreets Android app installs have been steadily climbing again since Christmas</title><link>http://www.jezuk.co.uk/notebook?id=4336</link><description><![CDATA[ <p>After hitting a plateau in October, <a href='http://cyclestreets.net/'>Cyclestreets</a> <a href='https://market.android.com/details?id=net.cyclestreets'>Android app</a> installs have been steadily climbing again since Christmas. Thanks Santa!</a> ]]></description></item>
<item><title>The main focus of my development work is, and has been for the past few months, letting the Ops guys drink more tea</title><link>http://www.jezuk.co.uk/notebook?id=4319</link><description><![CDATA[ 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 <a href='http://www.eventbrite.com/event/2452318952'>the ACCU Lightning talks</a> on Wednesday, 23 November.
 ]]></description></item>
<item><title>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</title><link>http://www.jezuk.co.uk/notebook?id=4313</link><description><![CDATA[ <p>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 <a href='http://olvemaudal.wordpress.com/'>Olve</a> <a href='http://twitter.com/#!/olvemaudal/status/125699059477524480'>tweeted</a> <blockquote>
Just submitted my proposals to ACCU 2012. Only 35 minutes till submission dateline so hurry up. <a href='http://twitter.com/#%21/search?q=%23accu2012'>#accu2012</a>
</blockquote></p>
<p>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 
<blockquote>Thank you for your submission.  You may revise your abstract until the submission deadline in 28 seconds.</blockquote>
I passed on the option to revise and just went with it :)</p>
<hr/>
<h3>Making Jenkins Better</h3>
<p><a href='http://http://jenkins-ci.org/'>Jenkins</a> 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.</p>
<p>Four hundred is too few.</p>
<p>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.</p>
<p>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.</p>
 ]]></description></item>
<item><title>CycleStreets Android App Development Builds</title><link>http://www.jezuk.co.uk/notebook?id=4300</link><description><![CDATA[ <p>The <a href='http://cyclestreets.net/'>CycleStreets</a> Android App is available through the <a href='https://market.android.com/details?id=net.cyclestreets'>Android Market</a>.  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 - <a href='https://github.com/cyclestreets/android'>the code is available</a> for anyone to poke around with, build on, add to, and so on.</p>
    <p>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.</p>
    <p>Each time I make a change to my copy of the app's code, a new build of the app will appear <a href='/cyclestreets/jezhiggins'>here</a>.  Whatever I'm working on might not be entirely complete, but it'll be the very latest code there is.</p>
    <p>Once I have finished a feature, I push the code into the main branch.  Those builds will appear <a href='/cyclestreets/master'>here, in the master directory</a>.  Builds of this branch will happen less often, but new features should be complete.</p>
    <p>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 "<a href='http://androidtipsblog.com/how-to-install-apps-from-unknown-sources-on-android/'>Unknown sources</a>" setting.  With that done, download the build and, once the download completes, select it.  Your phone should offer to install it.</p>
    <p>Unfortunately, there's no way to automatically update an application you've downloaded like this.  The best I can offer is <a href='http://jezuk.dnsalias.net/jenkins/view/CycleStreets/rssAll'>an RSS feed</a> of builds.</p>
 ]]></description></item>

</channel></rss>