Overriding Alfresco webscript library ftl files

On the whole, Alfresco is pretty good for customising and overriding, and there's been a lot of work done in 4.2 to make it even easier to customise Share and Surf. Overriding the spring beans for Java backed webscripts can be done with a bit of fiddling. One problem we have hit though is with overriding FTL files, especially library ones.

I'll use the Workflow REST API as an example here, as it's one we needed to change, but it applies to a lot of the webscripts too. A common JSON emitting Alfresco REST API has a FTL file somewhat like:

<#import "workflow.lib.ftl" as workflowLib />
   <@workflowLib.taskJSON task=workflowTask detailed=true/>
It imports a library file, then calls one of the functions in there. If you want to inject a few extra bits into the JSON structure, then your only option is to edit the library file, or clone it. For simple libraries with a single macro, you could just clone the whole thing and customise, but for a library with many macros that gets rather nasty especially when upgrading. FreeMarker macros get replaced when a new one is defined with the same name, much like spring beans, so for our hypothetical macro file:

<#macro taskJSON task detailed=false>
<#escape x as jsonUtils.encodeJSONString(x)>
         "id": "${task.id}",

<#macro propertiesJSON properties>
<#escape x as jsonUtils.encodeJSONString(x)>
<#list properties?keys as key>
To change taskJSON to inject some extra bits from the model, we'd have to copy the whole file and customise. However, there is a way that makes things a little less evil, which relies on macros overwriting each other. We take the original file, and copy it to the same directory structure in our module, but with a new name. Instead of workflow.lib.ftl we might instead go for workflow-original.lib.ftl. Next, add a new comment to the top, documenting where it originally came from, what version it is taken from etc. Now, create a new workflow.lib.ftl, and copy into that the whole of the macro we want to override. Add in the extra few JSON clauses. At the top of the file, add some documentation saying what version you copied and pasted from, what file it came from, and what changes you made. Trust me, you'll be thankful you did this when you come to upgrade... Finally, at the top of the file, before your customised macro, add in an include (not import, include) of the renamed original. Your new lib, with the name of the old one, now looks something like:

<#-- Customised File -->
<#-- Original: remote-api/config/alfresco/templates/webscripts/org/alfresco/repository/workflow/workflow.lib.ftl -->
<#-- Alfresco Version: -->
<#-- Modification: Added custom1 and custom2 properties to the JSON -->

<#-- This pulls in all the macros we haven't needed to change -->
<#include "workflow-original.lib.ftl">

<#-- Override and customise the one we do need to change -->
<#macro taskJSON task detailed=false>
<#escape x as jsonUtils.encodeJSONString(x)>
         "id": "${task.id}",
         "myCustom1": ${task.custom1},
         "myCustom1": ${task.custom2}
(It's probably best to put your custom json at the start or end, to make upgrading easier)

Overriding built-in Java backed WebScripts in Alfresco

Generally, Alfresco makes it fairly easy for you to override the built-in core repository Services. There's this wiki page and this one to get you started, then once you know about Spring you can largely make it happen.

The Alfresco spring context file load order for services etc is controlled by application-context.xml. The last bean defined with a given name wins, so if Alfresco ships with a bean definition for fooService and you define your own one later with the same name, yours will be used. Handily, as shown in that context file, spring context files in /extensions/ and /modules/ are loaded late, so your modules can include override services.

The picture is not quite so rosy for overriding the built-in webscripts. Here, the key context file is web-application-context.xml. This loads application-context.xml which we saw above, and then it loads the web scripts. This means that the built-in webscritps are always loaded after modules, so your module can never override a built in webscript.

However, at the bottom of that file we see the answer - we need to provide a single alfresco/extension/custom-web-context.xml which pulls in our module webscripts. That gets loaded last, so will win!

For my current project, we have added the following file as alfresco/extension/custom-web-context.xml

<?xml version='1.0' encoding='UTF-8'?>
<!DOCTYPE beans PUBLIC '-//SPRING//DTD BEAN//EN' 'http://www.springframework.org/dtd/spring-beans.dtd'>
    <import resource="classpath*:alfresco/module/*/module-webscripts-context.xml" />
All of our Repository modules already had a module-context.xml file in alfresco/module/<name>/. Those that need to override webscripts can now also provide a second file in that directory, module-webscripts-context.xml, and any webscripts defined in there can be guaranteed to win and be used.

(The new custom-web-context.xml file can be bundled in a jar, shipped in an existing AMP, packaged as a brand new AMP, or dropped in your classes override directory similar to your repository properties file - it all depends what'll be cleaner for your setup)

Spring in a QName

This post was originally written in September 2010, and was available at http://blogs.alfresco.com/wp/nickb/2010/09/28/spring-in-a-qname/ - I have reposted it here as that blog is no longer online.

Within Alfresco, we make a lot of use of Qualified Names (QNames) for addressing and naming things. Generally, when configuring Alfresco through Spring or properties files, we can use the short form, eg

<bean id="coreBean" class="org.alfresco.some.thing.core">
  <property name="typeQName">

Within the bean, the NamespaceResolver is used to turn the friendly, short form (eg cm:description) into the full form (eg {http://www.alfresco.org/model/content/1.0}description).

However, every so often you may find yourself trying to configure something with Spring that no-one ever expected you to be trying to do… In this situation, the string form isn’t accepted by the class, and only a real QName object may be sprung in.

As it turns out, creating a real QName object from within Spring isn’t actually too hard to do. So, in case you ever find yourself needing to do it, the definition will look something like this:

<bean id="coreBean" class="org.alfresco.some.thing.core">
  <property name="typeQName">
      <bean class="org.alfresco.service.namespace.QName"
        <constructor-arg value="http://www.alfresco.org/model/content/1.0" />
        <constructor-arg value="description"/>

Adding new Apache Tika Plugins to Alfresco (Part 3)

This post was originally written in October 2010, and was available at http://blogs.alfresco.com/wp/nickb/2010/10/27/adding-new-apache-tika-plugins-to-alfresco-part-3/ - I have reposted it here as that blog is no longer online.

In Part 1 we saw what Apache Tika is and does, and in Part 2 we saw what it has brought to Alfresco. Now it’s time to look at adding new Tika Parsers, to support new file formats.

Firstly, why might you want to add a new parser? The most common reason is licensing – all the parsers that ship as standard with Apache Tika are Apache Licensed or similar, along with their dependencies, and so can be freely distributed and included in other projects. However, some file formats only have libraries that are available under GPL or proprietary licenses, and so these can’t be included in the standard Tika distribution.

There is a list of available 3rd party parsers on the Tika 3rd Party Plugins wiki page, currently made up of GPL licensed parsers + dependencies. If your format isn’t listed there, and you want to add it to Tika within Alfresco, then what to do?

Firstly, you need to write / acquire a Tika Parser. Writing a Tika Parser is quite easy, as the 5 minute parser guide explains. There are basically two methods to implement:

Set getSupportedTypes(ParseContext context);
void parse(InputStream stream, ContentHandler handler, Metadata metadata,
           ParseContext context) throws IOException, SAXException, TikaException;

The first allows you to indicate the file types your parser can handle. This is needed when registering the parser with the AutoDetectParser and similar, but isn’t needed if you select the parser explicitly. The second method is the one where you do the real work of outputting the contents and populating the metadata object.

To see this in action, let’s take a look at a simple “Hello World” Tika Parser:

package example;
public class HelloWorldParser implements Parser {
  public Set getSupportedTypes(ParseContext context) {
    Set types = new HashSet();
    return types;
  public void parse(InputStream stream, ContentHandler handler,
         Metadata metadata, ParseContext context) throws SAXException {
    XHTMLContentHandler xhtml = new XHTMLContentHandler(handler, metadata);
    xhtml.characters("Hello, World!");

    metadata.set("title","Hello World!");
    metadata.set("custom1","Hello, Custom Metadata 1!");
    metadata.set("custom2","Hello, Custom Metadata 2!");

Before we can use this in Alfresco, we need to compile this against tika-core.jar (note – you may need to implement the parse method without a ParseContext object if you’re using an older version of Tika), and then wrap our classfile up in a jar. Once our jar is deployed into our application container (eg the shared lib of tomcat), we’re ready to configure it.

For 3rd party parsers which provide the Tika service metadata files, if we don’t want to control the registration in Alfresco then we can simply allow the default Tika-Auto metadata and transformer classes to handle it. In our case, we want to register it explicitly. To do that, we’ll create a new extension spring context file, and populate it:

<?xml version='1.0' encoding='UTF-8'?>
<!DOCTYPE beans PUBLIC '-//SPRING//DTD BEAN//EN' 'http://www.springframework.org/dtd/spring-beans.dtd'>
    <bean id="extracter.MyCustomTika"
          parent="baseMetadataExtracter" >
        <!-- This is the name of our example parser compiled above -->
        <property name="tikaParserName">

         <!-- Use the default mappings from TikaSpringConfiguredMetadataExtracter.properties -->
        <property name="inheritDefaultMapping">
        <!-- Map our extra keys to the content model -->
        <property name="mappingProperties">
                <prop key="namespace.prefix.cm">http://www.alfresco.org/model/content/1.0</prop>
                <prop key="custom1">cm:description</prop>
                <prop key="custom2">cm:author</prop>

    <bean id="transformer.MyCustomTika"
        <!-- Same as above -->
        <property name="tikaParserName">

To test this, we’ll need a node with the special fake mimetype of “hello/world”, which is what our Tika Parser is configured to handle. We can do that with a snippet of JavaScript like this:

var doc = userhome.createFile("hello.world");
doc.content = "This text will largely be ignored";
doc.mimetype = "hello/world";

If we run the above JavaScript, we’ll get a node called “hello.world”. If we run the “extract common metadata fields” action on it, we’ll then see the metadata properties showing through. Then, if we transform it to text/html, then we see a text heading of “Hello, World”. Thus we have verified that our custom Tika parser has been wired into Alfresco, is available for text transformation, and can do metadata extraction including custom keys.

More information on Tika and Alfresco is available on the Alfresco wiki.

Apache Tika powered updates to Alfresco (Part 2)

This post was originally written in September 2010, and was available at http://blogs.alfresco.com/wp/nickb/2010/09/24/apache-tika-powered-updates-to-alfresco-part-2/ - I have reposted it here as that blog is no longer online.

In Part 1, we learnt a little about what Apache Tika is and does. In this part, we’ll see what new features using Tika gives us in Cheetah.

On the metadata side, Tika delivers three important things for us. These are support for a wider range of formats (see below), enhanced ease of adding custom parsers (you can just spring in a bean with the class name of your parser and you’re done), and consistent metadata.

This last one is less of an issue for Alfresco users than for many other users, but is a real issue for extractor developers. Within Alfresco, we always map the raw properties onto ones in the content model, but this is handled at the extractor level. As such, it shouldn’t matter to the user if one document format has a “last author”, another “last editor” and a third “last edited by”, they’ll all turn up in the same property in Alfresco. However, the extractor writer has to know about this, to provide the mapping, and this makes writing an extractor harder, and increases the chance of error.

Within Tika, there is a set list of common metadata keys, and each Tika parser internally maps its properties onto these. As such, when you receive your metadata back from Tika, it all looks the same no matter what file you got it from. If the metadata is a date, then Tika will also take care of converting it to a common format, so you don’t have to worry about parsing a dozen different date representations.

Finally, because the metadata is in a common format, we can more easily map it to the content model. Thus, in Alfresco 3.4, we see most of the common extractors have a wider range of metadata mappings to the content model as standard. One big example of this is in the case of images – EXIF tags are now automatically extracted and mapped onto the content model, and if the image was geotagged, then the location of the image is also mapped onto the content model.

Give it a try – upload a geotagged image to Alfresco share in 3.4, and see all the new metadata that shows up such as the location, camera, focal length and more!

In the past, most text extractors that were used in Alfresco only able to produce plain text. However, all the Tika parsers generate XHTML sax events, and sure are able to produce not only plain text, but also HTML and XHTML. Also, since Tika the XHTML is a true XML document, we can make use of XSLT to chain transformations.

The immediate benefit then is that all plain text content transformers that are powered by Tika can deliver an HTML version at no effort. Thus, HTML versions of PDFs, Word Documents etc can now be requested.

(At the moment, the HTML generated is very clean, but not always all that complex. The Tika community is gradually improving the markup generated to include more meaning, especially semantic information, and Alfresco is pleased to be involved in this effort)

Does being able to generate XHTML help that much? I’d say yes! With the forthcoming WCM Quick Start, we’ll shortly be adding some features around HTML versions of some kinds of uploaded documents. Using Tika, we were able to implement this feature very quickly, allowing us to concentrate the developer time on enhancing Tika. Next up, for some cases we wanted a whole XHTML document, and others we only wanted the body content. Using Tika and the SAX handlers, it’s a one line change to toggle between the whole document, or just the body contents, by picking a different transform handler. Finally, the output is XHTML, so for demo’s we’ve been able to use XSLT and E4X (from within a script action) to effortlessly manipulate the content.

Finally, as mentioned, using Tika delivers us support for a large number of new file formats. The current list of files supported via Tika is:

  • Audio – wav, riff, midi
  • DWG (CAD files)
  • Epub
  • RSS and ATOM feeds
  • True Type Fonts
  • HTML
  • Image – JPEG, PNG, Gif, TIFF and Bitmap (including EXIF information where found)
  • iWork (Keynote, Pages etc)
  • Mbox mail
  • Microsoft Office – Word, PowerPoint, Excel, Visio, Outlook, Publisher, Works
  • Microsoft Office OOXML – Word (docx), PowerPoint (pptx), Excel (xlsx)
  • MP3 (ID3 v1 and v2)
  • CDF (scientific data)
  • Open Document Format
  • PDF
  • Zip and Tar archives
  • RDF
  • Plain Text
  • FLV Video
  • XML
  • Java class files

What’s more, generally it’s just a case of dropping new Tika jars into Alfresco with little/no configuration changes, so we can look forward to easy addition of new formats with each new Alfresco release as the Tika support grows!

In Part 3, we will look at mapping between Tika’s common metadata, and the Alfresco content model.

More information on Tika and Alfresco is available on the Alfresco Wiki. Tika will also be discussed at the Alfresco Developer Conferences in Paris and New York later this year.

Apache Tika and Alfresco – Part 1

This post was originally written in September 2010, and was available at http://blogs.alfresco.com/wp/nickb/2010/09/24/apache-tika-and-alfresco-part-1/ - I have reposted it here as that blog is no longer online.

For the forthcoming Project Cheetah release, there have been a number of improvements to Metadata Extraction and Content Transformations. These improvements have been delivered by using Apache Tika to power many of the standard extractors and transformers.

In this series of blog posts, we’ll be looking at what Apache Tika is and what it does, how it fits into Alfresco, what new features it has delivered, how you can customise how Tika works, and how you can add new Tika parsers to easily support new formats.

The idea for Apache Tika was hatched in 2006, largely from people involved in Apache Lucene, who were struggling to sensibly index all of their documents. The project went through the Apache Incubator, and after a period of time as a Lucene sub-project, in 2010 became it’s own top level Apache project. Tika is used by people indexing content, spidering the web, doing NLP and text processing, as well as with content repositories.

For all these use cases, the problems are largely the same. You start with a number of documents in a variety of formats. You wish to know what they are, and hence which libraries may be useful in processing them. You then want to get some consistent metadata out of them, and possibly a rich textual representation of the content. You also probably wanted all of this yesterday!

(As a side note, Alfresco users have historically been in a more fortunate position than most when faced with these challenges, as the Metadata Extractor and Content Transformation services have handled most of these for you.)

What services does Tika provide then?

Firstly, Tika offers content and language detection. Through this, you can pass Tika a piece of unknown content, and get back information on what kind of file it is (eg pdf, docx), along with what language the text is written in (eg utf-8 english). Within Alfresco we tend to already know this information, so as yet don’t make much use of detection.

Secondly, through the parser system, Tika provides access to the metadata of the document. You can use Tika to find out the last author of a word file, the title of an HTML page, or even the location where a geo-tagged image was taken. In addition, Tika provides a consistent view across the different format’s metadata, mapping internally from document specific to general metadata entries. As such, you don’t need to know if a format uses “last author”, “last editor” or “last edited by”, Tika instead always provides the same information. We’ll see more on using Tika for metadata in part 2.

Thirdly, through the parsers, Tika provides access to the textual content of files. The text is available as plain text, html and xhtml, with the latter offering options for onward transformations through SAX and XSLT to additional representations. This can be used for full text indexing, for web previews, and much more. Again in part 2 we’ll see how this is being used in Alfresco.

Finally, Tika provides access to the embedded resources within files. This could be 2 images embedded in a word document, or an excel spreadsheet held within an powerpoint file, or even half a dozen PDFs contained within a zip file. This is quite a new Tika feature, and we’ll hopefully be making more use of it in the future. For now, it offers the adventurous a consistent way to get at resources inside other files.

In Part 2, we’ll look at the new features and support that Tika delivers to Cheetah.

More information on Tika and Alfresco is available on the Alfresco Wiki. Tika will also be discussed at the Alfresco Developer Conferences in Paris and New York later this year.

Oxford Digital Switchover and DVB-Apps

If you use Linux with the DVB-Apps to watch TV, and you're in Oxford, then as of today (28th September 2011) you'll need to re-tune. (Well, everyone in Oxford has to too!)

One slight snag is that the command line scanning tools (like scan) take an initial tuning file, and the one that ships in Debian / Ubuntu / Hg isn't yet updated.

Armed with the data from ukfree.tv and some trial and error, I've got what looks to be the correct new tuning file. Debian / Ubuntu users will want to place this in /usr/share/dvb/dvb-t/uk-Oxford (other users wherever you want!) and then run a scan. (You could also use w_scan, which iterates each frequency in turn, but scan with a start file is normally much quicker)

# Post-Switchover

# Local, C51, details TBA, not yet transmitting as of Nov 2011
T 713833000 8MHz 2/3 NONE QAM64 2k 1/32 NONE

# PSB1 BBC-A, C53+. Apparently 730.2 but actually looks to be 730.167
T 730167000 8MHz 2/3 NONE QAM64 8k 1/32 NONE

# ArqB (COM6), C55, 746.0
T 746000000 8MHz 2/3 NONE QAM64 8k 1/32 NONE

# PSB3 BBC-B, C57, 256QAM DVB-T2
T 762000000 8MHz 2/3 NONE QAM256 8k 1/32 NONE

# ArqA (COM5), C59-, Apparently 777.8 but actually looks to be 777.833
T 777833000 8MHz 2/3 NONE QAM64 8k 1/32 NONE

# PSB2, D3+4, C60-, Apparently 785.0 but actually looks to be 785.833
T 785833000 8MHz 2/3 NONE QAM64 8k 1/32 NONE

# SDN (COM4), C62, 802.0
T 802000000 8MHz 2/3 NONE QAM64 8k 1/32 NONE

Note - as of 2011-12-08 these changes have been accepted into the upstream Linux Media repo. Depending on the age of your distro / checkout / etc, you may or may not need to update to the above by hand.

Having done that, you should be able to run something like scan -v -a 0 uk-Oxford > new-channels.conf to build your new channels.conf file. The result should be something like this:


Finally, you'll want to do a full rescan in MythTV, which is a faff... :(

Upcoming Conferences

For anyone who doesn't hawkishly follow my Lanyrd upcoming events page, here's a quick round-up of some of the conferences I'm speaking at / helping with in the near future.

Coming up in just under a fortnight (mental note - must finish my talk...) is Transfer Summit, 7-8 September. Handily located in Keble, so no need to leave Oxford, this conference is back for it's 2nd year covering open source, open development, innovation and collaboration. Last year featured loads of very interesting talks, and this year's looking promising too. If you're interested in open source, open development, academic to business transitions for software, or just a fun conference in Oxford, come join us!

The weekend following Transfer Summit we have BarCampApacheOxford, once again being held in the University Club. This year we're on Sunday 11th September, with a meal the night before. As usual, we'll have a wide range of sessions, including (but not limited to!) ones on the Apache Software Foundation and it's projects. We'll also likely have things on mapping, Django, Arduino, OpenOffice, Paper Aeroplanes and listening to Satellites, so it should be a great mix! If you want to come, sign up on the wiki ASAP, so you can ensure you get one of the spots that includes a free lunch :)

A month later, I'm off to Amsterdam for a few days. On Thursday 13th and Friday 14th October I'll be at GotoCon Amsterdam, mostly going to the great sessions on offer, but also talking as well. There's a good mix of sessions across lots of different areas of software development, and we've an Apache track on there too on the Friday. If you are thinking of coming, you can use the code burc200 for 20% off the registration price.

On Saturday 15th, the day after GotoCon, we're also doing an Apache Hackathon + mini BarCamp in Amsterdam. Hippo are kindly hosting us, and should be a fun chance to get Apache types from Europe together for a chat, some coding, and hopefully also share some knowledge amongst ourselves. It's open to not only Apache committers, but also anyone who contributes code or documentation to Apache (basically anyone on a dev list), sign up on the wiki and come along if you're in Amsterdam that weekend!

Next up is the Alfresco DevCon 2011 USA in San Diego. Not sure yet what I'm speaking on (though I think I'm down for a few sessions...). It's a chance to learn about developing solutions with and on top of Alfresco, in the lovely surroundings of San Diego, so who wouldn't want to go :)

Finally (for now, but possibly not for this year...) is ApacheCon NA 2011 in Vancouver, 7-11 November (plus hopefully a BarCamp on the 12th). We've an amazing set of speakers and talks lined up as usual, and it's looking promising for a great conference. Early bird rates end soon, so sign up!

Fringe 2011

Last weekend I was up at the Edinburgh Fringe, and once again I managed to see quite a few shows, with a few gems amongst them. I tweeted reviews of most of them at the time (where wifi permitted!), but this is aiming to be a slightly more expanded set. Mostly to help with picking shows next year, it must be said, but there is a day or two of the fringe left for other people to use them!

Stupid People Will Be Offended - Free standup by Mikey Mileos at Dropkick Murphy's. We happened across this show when we got to The Vaults early, and nipped over the road for a drink. Only caught the first half of the show, but for free standup it was pretty good. I'd say probably half the jokes worked, which beats some paid-for fringe standup shows I've seen! Could be one to watch for next year, if he can improve over the year. 3*

Sherica - Shred Productions at Paradise in the Vault. Possibly summed up by the line early on: Sorry. Stop ... This isn’t me. I don’t visit prostitutes. For God’s sake – I read the Guardian!. This dark and thought-provoking piece follows the downward spiral after a teacher falls for a sex worker who turns out to be the sister of one of his pupils. Add in some blackmail, a new academy school struggling with the change, and it's a good piece. Not as good as Paper Birds were when they tackled a similar subject with In A Thousand Pieces, but good none the less. 4*

What You Will - Shrewsbury School at C. Their own musical telling of Shakespeare's Twelfth Night worked out really well, with some good songs but still keeping the original a lot. Good lunchtime fun, 4*

Lethal Injection - Five One Productions at C ECA. A compelling, minimalist production about 4 men on death row, and their guard. As their time approaches, we learn of their crimes and how they ended there, all for very different reasons. 4*

Sanctuary - Little Room Productions at Paradise in the Vault. A new opera set just before the apocalypse, as a father and daughter hide. Then others try to seek sanctuary with them. Very very operatic, which sometimes worked, but often got in the way. 3*

Matt Kirshen at Underbelly. Self-deprecating stories from his life, with the odd bit of politics in there as well. Funny, smart and enjoyable comedy. 4*

Wasted Love - One Academy Productions at C. This musical tells the story of a relationship support group, which despite how it may sounds was excellent. Great singing, great storytelling, heartbreak into uplifting redemption then sometimes tumbling back down again. This is what new and different musicals at the fringe should be like, 5*

Principal Parts - Strip Theatre at C soco. Surrealist telling of a group trying to assassinate Archduke Franz Ferdinand in Sarajevo, despite their incompetences. Good fun, 4*

Sunday in the Park with George - One Academy Productions again (twice in an afternoon!) at C. A full 2 hour production of Sondheim's musical about Georges Seurat's painting. A good (but not amazing) production of this good (but not amazing) musical. 4*

Sammy J and Randy: Ricketts Lane at Udderbelly Pasture. On top form again, this time Sammy J and his friend Randy (the foul mouthed purple puppet) are battling tax avoidance amidst their domestic misadventures. Silly tales, word plays, long running gags (can I get a pwappwa new guinea, pwappwa new guinea!), and generally very very very funny. 5*

Belt Up's Outland - Belt Up in C Soco once again. A smaller set of shows to last year, and in a small and intimate setting for this immersive theatre production. This time it's related to Lewis Carroll's worlds and life. Similar to last year's The Boy James, more static and less interactive than some of their have been. Generally good, but one or two bits felt a little too similar to some of their past shows. 4*

Isy Suttie at Pleasance was another funny, well done telling of the tale of her friend's relationship. Cheery comedy, with some good songs in it too, generally feel-good with laughs. 4*

Horne Section was late night music and banter in the Spiegel Tent. Quite a bit of live jazz, with some standup and silly games thrown in, not to mention the crazy but great Jazz/Morris Dancing Crossover version of a Beyonce song! Some good guests too the night we saw it. 4*

Street Dreams - Little Cauliflower at Underbelly. A puppetry show, but not really as you know it. Instead, an amazingly done piece of abstract storytelling, as an old man goes about his day pestered and chased by a variety of everyday objects. Sweet, funny, sad, brilliantly done and engaging. A little hard to describe, true, but an enchanting hour not to be missed! 5*

Which One's Fergal by Garrett Millerick at Just the Tonic at the Caves. A series of strong character sketches, satirical but well done, with a great mix of laughs and cringes. Garrett weaves his way between God's gift to Advertising Execs, a Traffic Warden, a failed motivational Hip-Hop singer and more. Biting but funny, a solid 4*

Flanders and Swan - Tim FitzHigham and Duncan Walsh Atkins at the Pleasance. An excellent hour of Flanders and Swan songs and tales, with just the right amount of sillyness (the music stand french horn anyone?). 4*

Seagull Effect - Idle Motion at Zoo Roxy. The Oxford based group were back again, after last year's great The Vanishing Horizon, this time with a tale of the 1987 hurricane. Once again they had a great mix of theatre, multimedia, and the odd bit of dance and physical theatre. The stories of different people interleave with archive footage and sound, with stories swirling together as the storm approaches. Great stuff, but not quite as good as last year. 4*

Belt Up's 20 minutes to 9 - back to C Soco for another Belt Up production. This one-woman immersive show takes us through recollections, stories and social observations of an aging apparently well-off woman. At times funny, others odd, almost always engaging, but you're never entirely sure quite what's going on, in that way that Belt Up can do well. Great stuff, but not quite as good as they have been before. 4*

Sammy J with Potentially at Underbelly is last but not least. Back again with stories, songs, and silly anecdotes that slowly stitch together to reveal the ridiculous but true linked narrative. Cruise Ships, Possums, a mystery man with a death wish in a red g-string, children's stories and a hell of a lot of laughs fill the hour. On top form again, 5*

Only 19 shows this year, in just over 3 days, but I'm sure we'll get the show count back up again next year!

Streetcar - first experiences

A bit over a month ago, the friend who was letting me borrow their parking space moved out of Oxford, and the cost of renting a space was a bit insane given how little I drive at the moment. So, I sadly sold my car (it's found a good new home down in Devon!), and I decided to get by with just renting cars as needed.

(I had been hoping that CommonWheels would be able to get a space near me, and either adopt my car or get a new one to go there, but alas they couldn't get the council to give them a parking space)

CommonWheels don't have any cars near me, but Streetcar have 3 within a 10 minute walk of my flat, so that seemed a good bet for getting a car when I needed one, especially as they offer rentals as short as an hour, and have a nifty online booking system. I managed to find a signup voucher with £40 of credit (no longer available sadly, but this link will get you £20), and I figured that the £40 of credit would help offset the ~£60 signup fee for the year.

As they said it might take a few days for the license check, I signed up just after selling the car, as I figured I should probably try to be organised and get it all sorted before I actually wanted to book something. As it turned out, the license check was completed very quickly (a quick conference call with streetcar and the DVLA and it was sorted), so I was actually good to go sooner than expected. This did present a slight snag, as the £40 "welcome credit" I'd got turned out to only be valid for 30 days, and not for the year as I'd expected... Luckily the streetcar team are nice and friendly, so when I emailed them about this they extended the validity of the welcome credit by a few more weeks, so it was still valid when I came to want to use the car for the first time.

A little over a month after signing up, I finally had a spare weekend with a vague excuse to do something needing a car, so I booked the nearest car to me for as long as my welcome credit would allow. The car nearest to me is one of their swisher cars, a BMW, so I only got 9.30am - 3pm for my credit, rather than until 4pm if I'd gone for the Golf that's a few minutes further away. Still, I figured a BMW might be fun to drive, and it's nearer! I booked the car online, confirmed with my friends when I'd pick them up, got a friendly confirmation text and read their helpful instructions online about the car.

Roll on to this morning, and it was time to give it a whirl. I got to the car just after half 9, eventually found it (not in it's space as the booking said, but not too far away), figured out where to wave my streetcard to open it (magic box on the dashboard), and unlocked the car. In the glove box was the magic widget as expected, I tapped in my pin and it gave me the keys. Then it was onto the first challenge, checking for damage.

When I do a normal hire car, they normally have a sheet with all the existing damage marked on it (certainly with Hertz, less so with some of the others). It's then a quick walk around the car checking that everything's on there, then you're away. With Streetcar it's not so simple. In the instruction booklet is the damage log, but each bit of damage has it's own entry, and for this car the damage log went over about 5 pages. So, as I walked round the car, at each thing I spotted I had to check each (small) entry over many pages to see if it was mentioned, then move onto the next scratch and start again. It was really rather tedious to not have a summary, but have to check each thing in turn. Then the bad news, there were a couple of scratches not in the log. This meant a call to Streetcar to let them know, on their 0845 number (so instead of the call being free with inclusive minutes, I had to pay 35p/minute to call them, grr...). The call to let them know about the damage was fairly quick, but did have a rather long recorded message first, and as well as getting a damage reference for the log book I was also able to alert them to the fact that the car hadn't been left very clean inside as it was supposed to be. Having written the details in the log, I could finally hop in, adjust the mirrors and be off. I'd say the process took about twice as long from arriving to driving off as it's taken me the last few times I've got a car from Hertz, which is a bit pesky.

The car itself was fine, nice to drive, and after picking up my friends and running some errands we headed south to visit a National Trust property (Basildon Park near Reading, worth a visit!). Around 2pm we headed back, figuring an hour should be fine.

One of the conditions of hiring a streetcar, along with not leaving it a mess, is that you need to return it with at least 1/4 of a tank of fuel. The car had only just had over a quarter of a tank when I collected it, which meant I was the one standing when the music stopped. The cars all come with a fuel card, so all you need to do is swing by a petrol station, fill it up, charge it to the fuel card and you're away. Not too bad, but it does take a bit of time to do, or slightly longer if you're like me and tried to go to a petrol station that wasn't where I thought it was, doh! This meant I was cutting it a bit fine to return the car for 3pm after all, so we tried texting (my passenger rather than me I should add!) to try to extend the booking by 30 minutes. A rather nifty feature I must say, just a shame someone else had booked it for 3pm... At 2.58 when we were still a few minutes off making it to the carpark we rung up to say we'd be late, and were told that they'd let the next person know but we had a few minutes grace. On returning to the carpark at about 3.03 we found someone else had parked in the streetcar space (it has a sign and everything!), so we had to find another space and ring customer services once again to let them know where the car was. Just as we were leaving the carpark we spotted the next people getting to the car, sorry for making you a minute or two late whoever you were...!

Finally at home I checked my account to see the cost. As we'd driven to near Reading and back, we'd clocked up 61 miles, of which only 20 were included in the hire. That means there was an extra charge of £9.43 (it's 23p/mile, as shown on their pricing page). Having filled the tank up I know that's more than the cost of the diesel, but not too much more and they've a business to run. I'd also got a £3.62 "Unauthorized Extension" charge, I guess for being a few minutes late. Total cost was £52.93, or £12.93 after the credit. If I'd gone for the VW Polo that's a 10 minute walk from my flat (rather than the BMW at 5 minutes), it would only have been £41.81 for the 5.5 hours.

Out of interest, I checked with Hertz about how much it'd cost to hire from them. They're just over a 10 minute walk from my flat (just past the Streetcar VW Polo), so if I was to go for the cheapest streetcar they're probably a fair comparison. On a weekend, they're only open on Saturday mornings, so not as convenient. However, to hire a car slightly bigger than a VW Polo from Saturday morning to Monday morning, their website quoted me £43.60 (plus any petrol used). For the same journey I'd just done, that would mean a cost of about £50, but instead of only having the car for 5.5 hours, I'd not have had to worry about being late back, and I'd have the car for all of tomorrow too. Streetcar want £105 for to have their polo for an equivalent 48 hours, that's with 40 miles included, which seems rather bad value. In the week Hertz are open a lot more, and they only want £22.40 for a 24 hour hire (plus petrol). Add in a bit of fuel, and any hire over about 3 hours looks to be cheaper to go with Hertz, which was a surprise to discover. That's not even taking account of the £60/year Streetcar fee.

Overall, the process with Streetcar was ok, but averages out not quite as quick and easy as Hertz, but certainly better than other car hire places I've used. Cost wise, if you just want a car for an hour or two, it's handy and (fairly) quick and better value than a taxi. For me though, any hire over a few hours and I'm better off just going with Hertz for the day, as long as I'm not doing a last minute night or Sunday booking. It's a bit disappointing to discover this, but at least now I know. I'm sure I'll be using my Streetcar membership a lot more this coming year, just only for short trips or last minute things, otherwise you'll find me heading to Hertz for a longer hire, or on the train!