Archive Quality MP3 Ripping

When I started using MP3 music files in 1998, the standard was to use 112 kbps encoding, which produced a notable loss of quality when played on speakers of any quality. One of the great things about the iPod, and the increasing size of hard disks generally, is that these days there’s no point being so stingy about the quality of your MP3s.

So now I use high-quality VBR encoding, which tends to give a bit rate around 200 kbps. The files are therefore almost twice the size compared with 112 kbps encoding, but the result is music that sounds great even on a decent hifi. Such MP3 encoding has become known as ‘archive quality’ since it produces the kind of files you’d want to keep in case you lost the original source.

To produce such MP3’s I use 2 pieces of free software. For ripping I use Exact Audio Copy, which isn’t quick, but guarantees a ‘perfect rip’. This hooks in with the separately downloadable LAME, available here. These 2 combined give me an average 4x ripping speed on a 1 year-old PC.

One hint if you try these yourself – LAME has a special setting that sets all the various options to a mix that a bunch of people with better hearing than me reckon is the best audable MP3 quality you can get, for the smallest file size. To use this, go to the EAC menu, select ‘compression options’, ‘External Compression’ tab, and set the ‘Additional Command Line options’ to ‘–r3mix %s %d’ (having already selected to use the external lame.exe as your MP3 encoder.)

Handling Continuous Integration Failures

My blogging activity has been subdued recently. To try and remedy this I’ve decided to write some entries on build engineering, a subject I’ve looked at in some depth over the last few years.

To start off with, here’s an entry about Automated Continuous Integration. Automated CI is normally widely accepted when introduced to a team. However there’s often confusion about what to do when the automated build breaks but developers are able to build without problem on their own machine.

The 2 reasons I’ve seen most often that cause this are:

1 – Problems retrieving updates from Source Control

2 – The part of the build that’s failing is not used by developers

The first of these is normally easy to diagnose since it happens early in the build process before anything else has a chance to run. It can occur when a file checked into source control is overwritten by the build process. Often the simplest solution is to delete the build server’s copy of the source tree totally, and check it out cleanly from Source Control.

The second part can be caught much more easily using the following pattern:

Be able to run the complete integration build from any development machine

Typically a full integration build should include the following tasks:

– Full, clean compile

– Deployment to local app server

– Running all the tests

– Publishing of distributable files to file server

– Labelling of source control

People sometimes setup specific scripts that are only available on the build server that perform some of these functions. This causes pain in exactly the situation when the build script starts failing. If you can run the entire build on a developer machine using sensible default values (e.g. using a ‘test’ name for labelling and distributable locations), you can debug the problem without having to go onto the build server.

Moreover, If you have the ability to easily to perform a full, clean, compile; deployment; and test in one easy step from a developer machine, then developers will likely use this and catch any problems before checking in broken code.

Here’s an example of this using NAnt and CruiseControl.NET.

In NAnt, we can have the following in a build script to define some properties and specify how to publish a distributable file:

<property name=”publish.basedir” value=”publish” />

<property name=”label-to-apply” value=”temp” />

<target name=”dist.publish” depends=”dist”>

<property name=”publish.dir” value=”${publish.basedir}\${label-to-apply}” />

<mkdir dir=”${publish.dir}” />

<copy todir=”${publish.dir}”>

<fileset basedir=”dist”>

<includes name=”*”/>




The ‘dist.publish’ target relies on the 2 properties publish.basedir and label-to-apply. By setting them in the script we give these values sensible defaults for running on a developer machine. However, we want them to be more specific when running on the real build machine. We can do this by specifying values for the properties when NAnt is started which override these defaults.

If we’re using CruiseControl.NET, the ‘label-to-apply’ property is always set to the build number for us. We can override other variables using the following CCNet Configuration option:


<project name=”MyProject”>

<build type=”nant”>









So, summing up, automated CI build failures are bound to occur. However, if we set up a build process that is repeatable on machines other than the build server it is easier to solve such problems.

Settling back in London

I’ve now been back in London for a little over 3 weeks, living in a new flat about a mile north-west of Paddington (so about 5 minutes walk from Warwick Avenue on the Bakerloo line 🙂 ). Its great to be back and have the chance to catch up with everyone I’ve missed over the summer.

Its strange, but memories from America are already fading, I think mostly due to how busy I’ve been sorting everything out at home. I’m looking forward to going through photos of the summer to remind myself of all the places and people I was fortunate enough to see.

Agile build engineering worthy of more research

I’ve spent the last 5 months on a build engineering engagement. Its been enjoyable, for the following reasons:

– The projects I was working with were implemented in .NET so it was an opportunity to explore build techniques that I know from the Java world and see how they apply in .NET

– I was working with several separate, but related, teams and therefore was exploring how to best integrate the projects.

I’m hoping to think about these areas more, but there’s a couple of brief points that I thought were interesting.

Importance of IDE build engineering in .NET

In .NET its worth considering how the IDE fits in with the build environment. Unlike Java based projects we are pretty much guaranteed the IDE is Visual Studio. Moreover, a lot of .NET developers have come through the Visual Studio history, and so are used to working solely within the IDE. Tools like the NUnit Visual Studio Plugin aid this command-line-free method of work for the interactive development process.

All this being said, we must remember that agile development places a premium on repeatable, maintainable, automated processes for tasks outside that of the interactive development flow, such as continuous integration and deployment. Therefore there exists a question of how we marry these 2 worlds together.

The basic premise is that using Visual Studio project definitions within your automated process means that your interactive and automated processes remain closely tied, and updating your project structure through the IDE automatically updates your automated process (so aiding maintainability.)

You can implement this into a NAnt automation setup by using NAnt’s new <solution> task, or by calling Visual Studio from the command line (using the ‘devenv’ application). We do still need to use something like NAnt since VS only covers a subset of what we want to automate, i.e. it doesn’t cover packaging, testing, etc.

What remains to be seen is whether <solution> or calling devenv directly is the best way to go, and how much we do still need a command line environment in the development process (e.g. for deploying an application locally for acceptance tests.)

Managing project dependencies

The other point to come up was how projects relate to each other, and specifically how to manage dependencies between projects. Things to think about are:

– How to specify dependencies in a convenient way

– How to manage build- vs run-time dependencies

– How to manage chained dependencies

– How versioning comes into play, and can we used ‘ranged’ versions with fixed ‘published’ interfaces

– How to allow a project to depend on either a fixed version, or ‘latest’ version of another project

– Where ‘fixed’ version requirements exist, how to perform pre-emptive ‘gump style‘ continuous integration for the head revision of all projects.

– What needs to be tested for each project’s build

I heard someone talking about Continous Integration the other day, and I’d forgotten the value of the simplicity of having ‘one build’ even for a larger team (since these problems become less important). But where you have long build-times and/or different deliverable timeframes it is worth considering breaking up the project. I think this would become a valid option when the agile community has tools and practices to solve the above questions.

Goodbye Boston, see you later America

5 Months ago I was sitting on a plane to Boston for my first extended stay out of the UK. Today I’m sitting on a plane going back home.

Its been a facinating summer. The United States has such a variety of attitudes, cultures and environments that its strange that its only 1 country. I’ve been to 5 US cities this summer – Boston, New York, Chicago, New Orleans and San Francisco. Boston has (as everyone told me before I came) a very european feel, yet there is an unmistakable north-eastern ‘no BS’ attitude about the place. It also has a commuter-city feel about it and there seems to be a conflict in attitude between this largely republican middle class cross-section of american life, and the massive liberal student populous that also inhabits the city for most of the year.

New York City could be London’s younger brother that has outperformed its sibling. It must be the most concentrated, cosmopolitan city on the planet. It is full of life, opinion and opportunity. 9/11 was obviously a tragedy, but I can understand why an enemy of the west would want to strike at New York since it is an arrogant city in some ways and also highly visible to the world, yet there is enough strength and hope there for it to have picked itself up and carried on unperturbed. There is no way I would ever want to grow old there, or bring up a family there, but I definitely hope to live in NYC for some period of my life.

Chicago has the feeling of someone who has been there, done that and is confident in their own abilities. It is an open, friendly and relaxed place that offers much to all walks of life. Chicago is one of those few world-class cities that I *could* imagine bringing up a family in (the only one I’ve been to apart from Chicago would be Auckland, New Zealand). Chicago will be on my ‘must-live-in’ list just as soon as I can come to the terms of living through a long, freezing winter. 🙂 (Oh, and how to cope with traffic problems even LA would be proud of…)

My visit to New Orleans was brief but surprising. After being in the 3 ultra-modern cities described above it was strange to visit NOLO and see how it had not rushed along with the rest of the country. New Orleans really shows up the embarrassment of riches that the US has with regards to culture. Its one of the smaller cities, yet it still has unique music, architecture and lifestyle that are worth experiencing. NYC has become a safer city for newcomers and tourists in recent times – I hope New Orleans manages find the resources to follow suit as it is a gem of a place.

San Francisco, and its bay area, is miles away from the east cost more than geographically. The arrogance and brashness that the world sees stereotypically in the US just doesn’t seem to fit out west. I don’t know whether its the fantastic amounts of sunshine Californians get but they definitely have a more relaxed view on life. The Bay Area’s geography is stunning and beats anything the UK has to offer.

But Boston’s where I’ve spent most of my time and I actually feel a little sad about leaving. Its a hard place to be by yourself, since its not a big city by ‘world’ standards, and for the most part I’ve felt quite alone being here. In the last few weeks though I’ve started appreciating it more (finding some good friends helped!) I think yesterday summed it up – there was a jazz festival in the ‘south end’ of the city that if it had been in London would have been packed out. But this was Boston so we could sit on some grass with plenty of room to spread out and enjoy the music, the sun and some good barbeque’d ribs. There was a large mix of people – from students to families, black and white. We walked back to one of my friend’s apartments (Boston’s small enough to do that) and then went to a couple of (very different) bars in the evening. It was an enjoyable, chilled day.

So the US is a place of extremes. There’s things I don’t like about it, including the overridingly right-wing and money-oriented politics of the country. But it has so much to offer in exchange including a richness of culture, and sense of opportunity, unrivalled in the world. I hope the US manages to reconcile its leadership in the world with some more humanity-based politics and then it really will deserve its place in history.

I hope to come back and live here again. 🙂

GadgetWatch – Palm Tungsten T3

I bought a Sharp Zaurus PDA about a year ago and it hasn’t really worked out for me. The chief problems have been:

– size: it doesn’t quite fit in a trouser pocket, which makes it too big

– ease of integration with other apps on my actual PC

– like most Linux systems, doing anything new is non-trivial and therefore too much effort for someone as lazy as me.

So, taking the same route as I did with my iPod (i.e. find out what I *actually* want, and then buy it, even if its more expensive), I’ve just bought the new Palm Tungsten T3. What attracted me was the following:

– size: its small enough to fit in my pocket

– UI: Pocket PC just doesn’t cut it still for usability and Palm’s longevity in the market shows through.

– integrated bluetooth: Primarily so that when I’m arguing about a movie with friends in the pub I can connect to the internet using a bluetooth mobile phone and consult IMDB. 🙂

– good screen definition – the T3 has a 320 x 480 screen, viewable in landscape as well as portrait, which makes it one of the best displays on the PDA market.

So far I’m impressed, and it’s already helping me organise myself a little better. If in 6 months time I’m as happy with it as I continue to be with my iPod, it will be money well spent.

Across the Golden Gate

So the holiday rolls on (and I’m using my computer, I know, I know…) Wednesday we mooched around a bit, including going up Mount Hamilton on the eastern side of the valley. Unfortunately there was too much haze / smog to get a good view of below once we’d got to the top.

Thursday I took the scenic route from San Jose to San Francisco – up the 280 which sweeps through wooded foothills while you can watch the cloud creeping over the main valley side, then along the winding 92 to Half Moon Bay, then up Highway 1 along the precarious cliffside. Once in San Francisco I saw large lumps of Golden Gate Park (including the buffalo!), parts of the Presidio (check out the photo of me by the Golden Gate bridge here) and finally the Palace of Fine Arts (which is functionally pointless, but beatiful nevertheless!) Then I picked up one of my friends and we drove up to the Russian River area, about an hour and a half north of SF, where we’re staying for a few days. I like being on holiday. 🙂

Back in California

So after 3 1/2 years, I’ve returned to California for a holiday, and its great to be back. 🙂 I’d forgotten just how stunning the geography and climate are here.

Today was spent waking up in San Jose, then visiting Monteray and the adjacent spectacular 17 Mile Drive. During this trip the temperature varied between 60 and 90 degrees (15 and 32 degrees for the rest of us!), and that was all during the day without climbing to any kind of altitude.

California is so different to the east coast, where I’ve been living for the last 3 months, that it might as well be a different country. The buildings are different, the attitude is different, even the road signs are different (well actually, there aren’t any. Not any of any use that is. Not that I missed the on-ramp to the 101 or anything, nonono…)

Photos to come (eventually!)