
Brits, sign this official petition
For all you British people, you need to sign this official government petition that is against software patents. Ex-pats can sign it too.
[Click here to sign the petition](https://petitions.pm.gov.uk/softwarepatents/).
This is important, head over and do your thang.

2006 Retrospective
This time one year ago, I was peering into 2006 wondering what the year would bring. Back then I worked at [OpenAdvantage](https://www.openadvantage.org/) as an Open Source Advocate. I knew 2006 would be a challenging year, and back then I was gritted and determined to help push free software and myself as best as I could. In the tradition of others providing a retrospective, I figured I will follow the flock like the sheep I am and weigh in on my own 2006. What a year it has been…
* **Work** – As I just said, back at the start of 2006 I was working at OpenAdvantage. I knew back then that the project was going to finish in March 2007, and I knew that I would likely need to consider a new job by the end of the year. One of the problems with my line of work is that there are *very few* people paid to be Open Source advocates. As such, the scope of companies was and is fairly restrictive. That was not the real sucker-punch though, oh no. The real kick in the goolies was that being a good advocate means you *have* to advocate things that you *truly believe in*. As such, this mean’t I could only reasonably work for companies that make the software and subscribe the ethics and direction that I believe in. From a distribution stand-point this locked out Novell, Yellow Dog, Mandriva, Red Hat and more – they all do great work, but I was and am an Ubuntu guy. As such, Canonical were always my #1 choice for my next step. Back in May when I started talking to Mark about the job, I never anticipated looking for work until later in the year, but [this blog entry](https://www.markshuttleworth.com/archives/35) started the discussion. After a lengthy interview process (apparently the job was very heavily applied for) I got the good news and [Mark announced it](https://www.markshuttleworth.com/archives/53) and [so did I](https://archivedblog.jonobacon.com/?p=737). OpenAdvantage was a truly awesome place to work at and I miss them all hugely. Working there was a fulfilling, inspiring experience and I hope to work with my friends there again. Now I am at Canonical and working longer days, getting more email and looking after an incredible worldwide community of Ubuntu contributors. Moving to Canonical was daunting, but has been a great experience and I am loving every moment of it.
* **Family** – 2006 was a great but challenging year for family. Just prior to new year 2006 my nanna sadly died and I attended and spoke at her funeral in the tiny village of Kirby Hill in North Yorkshire. In other bad news [Banger died](https://archivedblog.jonobacon.com/?p=762) rather surprisingly and I felt a level of grief and sadness I had never experienced, not even with my nan’s death. It was a dark, intense time, but Sooz, Frankie and I managed to get through it. Despite the sadness, the awesome bundle of joy that is [Pepper entered our lives](https://archivedblog.jonobacon.com/?p=803). In non-dog-family related news the Bacon and Curtis clans remained safe, healthy and together for another year.
* **Jokosher** – This time last year Jokosher never existed, which is nuts. I am hugely proud of the achievements made in the Jokosher team in the last ten months, and I am proud that our little project has gone on to not only achieve success but to also be revered by many as an important project for the Linux desktop. Its been a tough ride, and we have all worked long hours and spent lots of time thinking and working on hard problems, but our efforts have been made easier by the awesome development team that has formed. [Laszlo blogged about his views](https://laszlok2.blogspot.com/2006/12/my-year-in-review.html), and I am similarly enamoured to have worked with such incredible people. 2007 is the year when we *really* kick some ass. No kidding. It is the year when we not only match our competitors, but really stick the boot in and take some names. Keep your eyes peeled folks.
* **LUGRadio** – After three years of LUGRadio, we always expected the interest to die down a little and the show to hit hard times, but the LUGRadio rollercoaster keeps on rolling. This year has seen yet more growth in the show, and the year saw LUGRadio Live 2006 happen, which was a great success. Our community has grown, we have seen a fan podcast appear in the form of [hashlugradio](https://planet.lugradio.org/hashlugradio/) and I feel that artistically the show has remained true to the original recipe. We have had on some excellent guests, covered some important, inspiring and ridiculous subjects and we have always involved our insanely cool community at every step. This year we also became the *Award Winning LUGRadio* and got written up in a bunch of magazines and websites. I *love* the LUGRadio community, and again, I am proud to know so many of them. Thanks guys!
* **Music** – 2006 was a turbulent year for my musical interests. On the Seraphidian side we started out well, doing lots of gigs and finished writing our second album with the working title of *Death Blow*. We were scheduled to hit the studio to record Death Blow in September when we heard that our drummer Jon needed to take some time away from the band. Since then we have been writing and recording and looking for a new drummer – more on that in 2007. On my solo music side, [Recreant View](https://www.recreantview.org/) has been getting more and more attention, and my [last.fm page](https://www.last.fm/music/Jono+Bacon) has been getting hot too – just need a MySpace page now. 😛 In 2006 I wrote and recorded seven songs, and I am tickled pink with them all. I also grew the studio in 2006 and at some point I plan on building a dedicated studio and recording bands and artists.
* **Speaking** – 2006 has been a good year for refining my public speaking. At the start of the year I set myself the goal of *”getting good at public speaking”* and throughout the year I did 18 speaking gigs. Included here were my first gigs in the USA and Spain and a UK LUG Tour with my pal and yours Ted Haeger. I am pleased with the progress I have made, and 2007 is shaping up to be a good year for speaking, with four countries and five dates already booked for the first three months. I hope to be in your part of the world next year.
* **Writing** – 2006 saw a change in my writing. As the year has progressed I have done less and less magazine writing due to time constraints, but pushed out two books – [The Official Ubuntu Book](https://www.amazon.com/Official-Ubuntu-Book-Benjamin-Mako/dp/0132435942/sr=8-4/qid=1167532008/ref=sr_1_4/105-1977198-6274851?ie=UTF8&s=books) and [Practical PHP and MySQL](https://www.amazon.com/Practical-PHP-MySQL-Building-Applications/dp/0132239973/sr=8-1/qid=1167532008/ref=pd_bbs_sr_1/105-1977198-6274851?ie=UTF8&s=books). I have written many of my articles and thoughts on my blog as opposed to in article form or on my O’Reilly Blog, as my blog is now far better syndicated and read than it used to be. As such, my views and thoughts and occasional tutorials will now appear here on jonobacon.com. I really wish I had the time to do more magazine work, and I would love to continue writing for Linux Format and Linux User & Developer, but alas, there are only some hours in the day. Not sure what 2007 will see in terms of writing – although I would like to write another book, but on community/advocacy. Who knows?
* **Community** – This year has been a great year for community. I *love* the free software community, and it has been great to get to know more and more people. This year I have got to know more and more GNOME, GStreamer, Ubuntu, KDE, LUGRadio and FSF people, and got to meet lots of old and new friends alike. Many people get a kick out of meeting so-called celebrities in the Open Source world, and I have been fortunate in that I have got to know a bunch of these celebrities through work and travelling, but for me, I find the most fun and inspirational people are the guys and girls on the ground. As an example, meeting people like Melissa, Joey, Mark, Jorge, Brandon, Jenda, Scott and Matt from the Ubuntu community, or Edward, Jan, Thomas, Christian, Wim and Tim from the GStreamer community is truly inspiring. The celebrities will always get the attention, and the celebrities will always get the focus, but it is these people on the ground that I love to get to know, drink beer with, exchange stories with and work with in our incredible free software community. We need to *never* lose sight of this.
So, enough babble from me. 2006 has been one hell of a year, and I know 2007 is going to be even more insane than this year was. Lets all head into 2007 together and really start the free software smackdown. 🙂

Reflections
I have released a new song – [Reflections](https://www.recreantview.org/blog/?page_id=76). Not the usual thumping metal but a good-time acoustic tune. I am quite pleased with it, and it is quite different to my usual style, even the acoustic work I have done.
Download the [Ogg](https://www.recreantview.org/songs/jonobacon-reflections.ogg) or [MP3](https://www.recreantview.org/songs/jonobacon-reflections.mp3).
As usual, the rest of my music is at [Recreant View](https://www.recreantview.org/).

Five pointless facts
I normally don’t do memes, but I figured [this one](https://blogs.msdn.com/markjo/archive/2006/12/28/5-things-you-didn-t-know-about-me.aspx) from my friend Mark Johnson at Microsoft may be interesting. So, I have been trying to think of things you lot may not know about me, and I have come up with the following:
* **I am related to [Ronan Keating](https://en.wikipedia.org/wiki/Ronan_Keating)** – My nephew Jack (the inspiration behind the LUGRadio theme music tune [Jacks Playing Ball](https://www.recreantview.org/blog/?page_id=8) is the second cousin of Irish pop legend Ronan Keating. Albeit blurry, that technically makes me related to the foppy haired crooner. Thats right, metal meets Boyzone is a clash of pure glory.
* **When partying/drunk/social I take photos of myself with people** – I like to work, and I like to play, and when I play I often drink beer and if there is a camera handy, I take photos of myself with the people I meet, many of which are complete strangers. I don’t think I have been out on a night at conference or at a gig and not met a bunch of people who I look at the following day on my camera and wonder who the hell they are. There is plenty of evidence in [my photo gallery](https://archivedblog.jonobacon.com/gallery). [EuroFoo](https://archivedblog.jonobacon.com/gallery/main.php?g2_view=core.ShowItem&g2_itemId=595&g2_page=7) was a particularly crazy example – I woke up the following morning in my hotel room with wet feet, not remembering a thing – it turns out that after the hotel bar shut, I ended up in a University freshers foam party. Each disastrous memory was refreshed a I flicked through the photos on my camera. If you are at a conference, you are not safe – be warned. 😛
* **XInit systems gave me my break** – When I was 17 I set up a website called linuxuk.co.uk. Back then it was a statically updated site, but pretty unique for the UK Linux community. Rafiu Fakunle from [XInit Systems](https://www.xinit.com/) got in touch and offered to help me by giving me a laptop, web server and funding. This was a big deal for a straggly haired youth with a Slayer t-shirt. That was my break into the Linux world and I will always be grateful to Rafiu.
* **My writing is filled with in-jokes and personal references** – Of particular note is my latest book, [Practical PHP and MySQL](https://www.amazon.com/Practical-PHP-MySQL-Building-Applications/dp/0132239973/sr=8-1/qid=1167440596/ref=pd_bbs_sr_1/105-1977198-6274851?ie=UTF8&s=books) which is jam packed with references to many of my close friends in the examples. There are also many in-jokes – the calendar example is *James Hillchin’s calendar* which when shortened, the name would be *Jimmy Hillchin* (a reference to chin/beard humour in the UK), and I also mention *Jinny* in an example, referring to *Jinny Reckon* (similar to Chinny Reckon, yet another chin/beard British schoolboy reference).
* **Someone took a shit on my Fiat Uno Van** – When I was about 19, my band (Seraphidian) had done our second gig to a packed out venue that went completely nuts, and I was awake all night listening to metal with sheer excitement. At about 8am I got dressed to go to work, got in my crappy student Fiat Uno van (rather ironically known as the ‘stinkmobile’ back then), and drove off. Bleary eyed from tiredness, I pulled up at some traffic lights and out of the corner of my eye noticed a big brown jobby on the car bonnet (the ‘hood’ for my American friends). Stunned, I tried to drive fast and brake in the hopes that said jobby would fall off, but it clung on for dear life. As such, I pulled over at the next bin (outside a school, which retrospectively was a bad choice as the kids were walking to school at the time), and wiped it off with a newspaper. I hope it would be a clean break, but the jobby left quite clear tanlines, so I needed to stop at a service station and get the car washed. I arrived at work 20 minutes late and my boss did not believe a word of my story – ’twas all true though. And yes, it was not from a cat or dog, it was a proper human log. Questions on a postcard to the usual address…
More pointless facts in the [FAQ](https://archivedblog.jonobacon.com/?page_id=774), as usual.
I want to see the same from the following carefully selected victims:
* Luis Villa
* Daniel Holbach
* Laszlo Pandy
* Jen Phillips
* Ted Haeger

Using Gnonlin with GStreamer and Python
*I actually started writing this tutorial back in September but have been hugely busy and not got round to posting it. Well, I managed to pull my finger out and get it online. Enjoy!*
Friends, a while back I posted a short tutorial to get you lovely people up and running using GStreamer and Python. I wrote the tutorial, partially so we get more people using GStreamer, and partially to encourage more people to hack on the awesome [Jokosher project](https://www.jokosher.org/). Right now I am sat on a plane bored out of my tiny little mind on the way to Florida for my hols, so I figured I would now write a tutorial about how to use GStreamer and Edward Hervey’s fantastic [Gnonlin](https://gnonlin.sourceforge.net/) set of elements.
As ever, feel free to use the comments on this blog entry to ask and answer questions. The last tutorial seemed to encourage some discussion, and I would love this one to do so too. So, lets crack on. 🙂
## What is Gnonlin exactly?
Ever since the birth of the GStreamer project, the developers have wanted it to be used for a variety of different purposes, including both media playback tools (such as Totem, Rhythmbox and Banshee) as well as media creation tools (such as Jokosher, PiTiVi and Buzztard). When building applications for creating media, many of them share the common theme of a timeline with individual clips on it that can be moved around, split, and played in different ways. These applications are called *non-linear* editors. In virtually all of these applications, the act of splitting the events on the timeline, moving them around and suchlike does NOT actually modify the original content. As an example, when you import a song into Jokosher and split it in half, Jokosher does not actually modify the original audio file – it instead rather cleverly figures out which bits to play so that the split exists when you hear it. This is called *non-destructive* editing, and this is what Gnonlin is here to help us with.
Gnonlin provides a collection of GStreamer elements that can be used in your GStreamer pipelines, and the elements help you to build non-linear editors that are non-destructive. Gnonlin is written by the awesome Edward Hervey, who is a core GStreamer developer. Gnonlin is used extensively in Jokosher and PiTiVi and there are sure to be more applications using it, particularly once you lovely people have read this tutorial and are feeling the Gnonlin love. 😛
## How Gnonlin works
Gnonlin has been well designed and is a fairly logical system to work with. The way gnonlin works can be fairly accurately tied to the concept of how a timeline works.
Imagine for a second you have a timeline with three clips on it (so it looks like a ruler with three blocks on it). In the timeline I import a song and chop it into chunks, so each chunk plays a separate little bit of the original song that I imported. Each chunk of audio plays one by one as the playhead moves across the timeline.
In Gnonlin, the container for a bunch of chunks of media (the timeline) is called a `gnlcomposition`. The `gnlcomposition` is a single container that in turn holds a bunch of chunks of media (such as our audio clips above). Each audio clip (or video clip if you like) is contained in a `gnlfilesource`. Technically, it is a `gnlsource` but the `gnlfilesource` element is used in virtually all cases. So, in our example above, each chunk of audio is a separate `gnlfilesource` and they all live in the same `gnlcomposition`. When you create your `gnlcomposition` and add your `gnlfilesource`s, you set some properties on each `gnlfilesource` to indicate which media file and which bits of that file should be played.
The humble `gnlfilesource` is quite a clever little thing. When you create one, you tell it which media file it should use, and it will construct a pipeline internally for you. As such, when you create a `gnlfilesource` you just tell it which file it should use (irrespective of format) and *thats it* – Gnonlin takes care of the heavy lifting of figuring out the relevant pipeline. This makes using Gnonlin a nice clean experience…and we all love nice clean experiences. No sniggering at the back please…
## Writing some code
Right, lets dig in and write some code. Once again, I am going to make the assumption that you are familiar with using a Glade GUI (if you are not see [this fantastic tutorial](https://www.learningpython.com/2006/05/30/building-an-application-with-pygtk-and-glade/). You should also be familiar with the basics of GStreamer and Python – see [my own tutorial](https://archivedblog.jonobacon.com/?p=750) for a primer on this.
Now, download the code for our first example:
* [Download gnonlin-tutorial1.py](https://archivedblog.jonobacon.com/files/gnonlin-tutorial1.py)
* [Download gui.glade](https://archivedblog.jonobacon.com/files/gui.glade)
This example will construct a `gnlcomposition`, put a `gnlfilesource` in it, and play a portion of the file. This is the kind of code that would be run when you have imported an audio file into the timeline in Jokosher and trimmed it so that only a portion of the file is left.
We are going to create the following approximate pipeline:
`gnlcomposition ( gnlfilesource ) ! audioconvert ! alsasink`
We will create a `gnlcomposition` that contains one or more `gnlfilesource` elements, and the `gnlcomposition` will hook up to an `audioconvert` before then hooking up to an `alsasink`.
Lets get started. First of all, import a bunch of things:
#!/usr/bin/python
import pygst
pygst.require(“0.10”)
import gst
import pygtk
import gtk
import gtk.glade
Note how we don’t import a different gnonlin module, the gnonlin elements are just normal GStreamer elements and part of GStreamer itself (although you do need to make sure you have installed the gnonlin package for your distribution). Now create a class and create its constructor:
class Main:
def __init__(self):
Then get the glade goodness going:
# set up the glade file
self.wTree = gtk.glade.XML(“gui.glade”, “mainwindow”)
signals = {
“on_play_clicked” : self.OnPlay,
“on_stop_clicked” : self.OnStop,
“on_quit_clicked” : self.OnQuit,
}
self.wTree.signal_autoconnect(signals)
Here we have three methods for the GUI to Play, Stop and Quit. We will look at these later. Now create a pipeline:
# creating the pipeline
self.pipeline = gst.Pipeline(“mypipeline”)
Then create a `gnlcomposition`:
# creating a gnlcomposition
self.comp = gst.element_factory_make(“gnlcomposition”, “mycomposition”)
self.pipeline.add(self.comp)
self.comp.connect(“pad-added”, self.OnPad)
Here you create the element and add it to the pipeline. You then create a callback for the `pad-added` signal that is part of the `gnlcomposition`. The reason for this is that the `gnlcomposition` has *dynamic pads*. Hold fire though, I will fill you in on the details about this later.
Now create the `audioconvert` and `alsasink` and add them to the pipeline:
# create an audioconvert
self.compconvert = gst.element_factory_make(“audioconvert”, “compconvert”)
self.pipeline.add(self.compconvert)
# create an alsasink
self.sink = gst.element_factory_make(“alsasink”, “alsasink”)
self.pipeline.add(self.sink)
self.compconvert.link(self.sink)
Notice how we link the `audioconvert` to the `alsasink`, but remember that we have not linked the `gnlcomposition` to the `audioconvert`. More on that later.
Now create a `gnlfilesource` element, and instead of adding it to the pipeline, remember that it needs to be part of the `gnlcomposition`, so we add it there:
# create a gnlfilesource
self.audio1 = gst.element_factory_make(“gnlfilesource”, “audio1”)
self.comp.add(self.audio1)
Right, this is where we delve into the specifics of which bits of the audio file are played. The `gnlfilesource` has a number of properties that can be set to indicate which bit of the audio file should be played at which time:
# set the gnlfilesource properties
self.audio1.set_property(“location”, “/home/jono/Desktop/jonobacon-littlecoalnose.ogg”)
self.audio1.set_property(“start”, 0 * gst.SECOND)
self.audio1.set_property(“duration”, 5 * gst.SECOND)
self.audio1.set_property(“media-start”, 10 * gst.SECOND)
self.audio1.set_property(“media-duration”, 5 * gst.SECOND)
Lets look at what these properties do. The first sets the media file:
* `location` – this is the location of the media file to be played. Each `gnlfilesource` uses one media file.
The remaining properties can be thought of in pairs. The first two (`start` and `duration`) refer to at what point on the timeline media should be played, and the second pair (`media-start` and `media-duration`) specify which bits of the actual media file in the `gnlfilesource` should be played. So lets look at them:
* `start` – the start point in which the media is played on the timeline
* `duration` – how long the media should be played for
* `media-start` – the start point in the media file to play the content
* `media-duration` – how long the content should be played for
If you look at the code above you can see that we specify a value (such as 10) and multiply it by `gst.SECOND` – this is a convenient way of referring to seconds in GStreamer. As such `10 * gst.SECOND` equates to 10 seconds.
Look at the properties we have set in the code and you can see that we specify the `start` time to be `0` and and the `duration` to be `5`. These properties say that in the timeline we will play something from 0 to 5 seconds. To specify what (because remember it does not have to be the first five seconds of the media file) we use the `media-start` and `media-duration` properties. Here we specify `10` for `media-start` and `5` for `media-duration`. As such, between 0 and 5 seconds in the timeline, we will play from 0.10 – 0.15 in the media file.
This is quite complex to get you head around at first, so re-read the above few paragraphs until you get the hang of it.
Right, now show the window:
# show the window
self.window = self.wTree.get_widget(“mainwindow”)
self.window.show_all()
We now need to create some callbacks. Lets first start with `OnPad()`. Earlier I deferred discussion of this, so lets look at it now. 🙂
In GStreamer there is a concept called *Dynamic Pads*. What this means is that with some objects in GStreamer, pads only get added when other things have been processed, and one such item is the `gnlcomposition`. Before the `gnlcomposition` can know what pads should be added, it needs to check which `gnlfilesource`s it has and automatically figure out which elements are required to process the media that you want to play. All of this happens automatically, but it means that you cannot assume that it will have a pad – once the `gnlcomposition` has figured out what it is doing with its `gnlfilesource`s it will then provide a pad. See [GStreamer Dynamic Pads, Explained](https://archivedblog.jonobacon.com/?p=810) for more details on this.
When you initialise the pipeline and set it to `READY`, `PAUSED` or `PLAYING`, the `gnlcomposition` does its processing and emits a ‘pad-added’ signal to announce the pad is ready. Earlier we set up a connection so that when this signal is emitted, we connect our `OnPad()` method to it. This is that method:
def OnPad(self, comp, pad):
print “pad added!”
convpad = self.compconvert.get_compatible_pad(pad, pad.get_caps())
pad.link(convpad)
The signal gives you a pad (referenced with `pad`) and with it we use `get_compatible_pad()` on our `audioconvert` element to return a pad that is compatible with our `gnlcomposition`. We then link the `gnlcomposition` pad to the `audioconvert` pad. Job done.
Now add the other methods:
def OnPlay(self, widget):
print “play”
self.pipeline.set_state(gst.STATE_PLAYING)
def OnStop(self, widget):
print “stop”
self.pipeline.set_state(gst.STATE_NULL)
def OnQuit(self, widget):
print “quitting”
gtk.main_quit()
Finally, set it off:
start=Main()
gtk.main()
When you run the script and press the Play button, you will hear hear five seconds of audio played (0 – 5 secs on the timeline) but the audio played is 0.10 – 0.15 secs in the media file – remember we set the `start`, `duration`, `media-start` and `media-duration` properties to make this happen.
Now, it gets particularly interesting when you add more than one `gnlfilesource` to your composition, and set different media times – you then feel how Gnonlin manages different clips of audio or video. Go and download [gnonlin-tutorial2.py](https://archivedblog.jonobacon.com/files/gnonlin-tutorial2.py) which adds the following additional `gnlfilesource`:
# create another gnlfilesource
self.audio2 = gst.element_factory_make(“gnlfilesource”, “audio2”)
self.comp.add(self.audio2)
# set the second gnlfilesource properties
self.audio2.set_property(“location”, “/home/jono/Desktop/jonobacon-littlecoalnose.ogg”)
self.audio2.set_property(“start”, 5 * gst.SECOND)
self.audio2.set_property(“duration”, 5 * gst.SECOND)
self.audio2.set_property(“media-start”, 0 * gst.SECOND)
self.audio2.set_property(“media-duration”, 5 * gst.SECOND)
This should all look familiar, but we have changed the property times to play the second `gnlfilesource1` from 5 – 10 seconds in the timeline (immediately after the first one), but to play 0.00 – 0.05 from the media file. Feel free to change the second `gnlfilesource` so it uses a different media file if you like. With two `gnlfilesource`s in the composition, you can imagine this like having a single timeline with two audio clips on it.
## Concluding
We have only just scraped the surface of Gnonlin, and this guide is intended to get you started and playing with it. Gnonlin supports a number of other cool things though:
* **Operations** – you can add a `gnloperation` which will apply whatever is in that operation to the audio. So, if you had a LADSPA audio effect in the `gnloperation` (in a similar way to how a `gnlfilesource` is in a `gnlcomposition`), it will apply that effect to the relevant portion. We use this in Jokosher to apply audio effects.
* **Priorities** – what happens if you have a few different `gnlfilesource`s in the same `gnlcomposition` and they are set to play at the same time? You can set a priority to determine which ones play.
* **Default Sources** – A *default source* is what is played in the gaps between your `gnlfilesource`s. In Gnonlin *something* must be playing at all times, and invariably you want something in-between your media clips. So, as an example, in Jokosher, between audio clips we want silence to be played. To do this, we created a default source that just plays silence. The default source is automatically played when nothing else is playing.
If I get some time I hope to write some additional tutorials to show some of these features. But, in the meantime, I hope this tutorial has been of some use to get you started, and remember you can always ask questions in `#gstreamer` on `irc.freenode.net` and you are welcome to post questions in the comments on this entry.
Good luck!

Raise a glass
Well, its late on Christmas Eve and I am a bit drunk and about to get to bed. I just wanted to say a quick Happy Christmas to everyone! This has been a roller-coaster of a year for me, and a lot of people have helped it to run smoothly. A quick thanks to the incredible family and friends I have and the awesome LUGRadio/Jokosher/Ubuntu/WolvesLUG communities that have all grown hugely this year. I wish I could reel off everyone here, but it would result in a very boring and lengthy blog entry. It has been a privilege to work and play with you all.
A good year for free software, and 2007 is going to *really* kick some ass. So, lets raise a glass to friends, community and free software for 2007!

Know your limits
I suck at coding. I really do. Its odd y’know, as when I was a kid I really, *really* wanted to be a good coder, the whole idea of writing code and running programs excited me. The idea of controlling the raw power of that 386 got me all-a-fruity sometimes. Not for want of trying, I went to night-school at 14 to learn C, read countless books, learned C++ for the KDE project and recently Python for various projects such as Jokosher. Although I can get by and write code, it is not particularly elegant code – I am a hobbyist coder, and it looks that way. My code is akin to those people who are convinced they can play the bagpipes – they can utter a *sort of* tune, but it is no where near the quality of an experienced bag-pipeist (if that is a word…maybe it should be bag-pipician).
Now, when Jokosher started out life, we had basically no-one involved. Not a sausage. With only a few hands on the deck I needed to muck in and help out like anyone else. I wrote chunks of the GStreamer support in it, wrote the LADSPA effects support, the track minimisation, instruments, preset support and fixed bugs where I could. At this point, life was about *writing code* and *making it happen* – we were all so determined to make Jokosher a success that some of my less-than-stellar code was acceptable. This is not to say Jokosher is riddled with bad code – the code was not that bad, it was just not as good as it could have been, and any bad code that I wrote got fixed by better coders such as Laszlo.
Things are different now. We have a growing development team, a community forming, and the project is finding its feet. As Jokosher becomes its own thing, it is important that my less-than-stellar code does not hold it back. My strengths in the project have been far more suited to the design, usability and community building aspects than my coding abilities. And now the project is up on its feet more, I am going to step back from writing as much code and instead concentrate on the design, usability and community building. This means (a) more time spent on things that I know I am half decent at, and (b) I am not compromising the quality of the code. Laszlo Pandy, one of the hackers who writes a huge chunk of the code is a stunning example of someone who truly understands coding, structure and elegance. 5% of his coding ability is my 100% – I admire him for his talents and commitment to Jokosher. Actually, I *hate* him and envy him, the clever shit, but lets keep that out of the picture… 😛
I have always followed the belief that a good leader steps down when appropriate, and although I am not stepping down at all from the project, I also believe a good leader needs to identify their strengths and play to them when the community no longer needs them contribute with their weaknesses. There are too many projects out there with leaders who turn control-freak and demand control over every aspect of their project, despite having better people to make those changes and decisions. Those people irk me, and I *never* want to be one of them.
So, expect less code from me, but more of the other stuff like UI and community building. We have a really rather special project here with Jokosher, and the possibility to kick some serious arse in the multi-tracking world. It is an exciting time, and who knows what is possible? 🙂

Site updates
Just a quick housekeeping update. I made some changes to jonobacon.com to tidy some things up:
* [Speaking Events](https://archivedblog.jonobacon.com/?page_id=703) – Speaking events are listed much more clearly now, and I have also added my current schedule of events for the first few months of 2007. Its gonna be a busy year, so do keep an eye on that page for updates.
* [Recorded Presentations](https://archivedblog.jonobacon.com/?page_id=703#media) – I have now re-added a couple of presentations that were recorded and made available in flash format. They are at the bottom of the [Speaking](https://archivedblog.jonobacon.com/?page_id=703) page – check out [Building the Next Generation Linux Desktop](https://archivedblog.jonobacon.com/presentations/jonobacon-buildingthenextgenerationlinuxdesktop.swf) from SCALE in Los Angeles earlier this year and [On The Front Line: Convincing People The Inconvincible](https://archivedblog.jonobacon.com/presentations/jonobacon-onthefrontline.swf) from Manchester LUG, again earlier this year. Please right click and download them first and *then* view them in your browser.
* [About](https://archivedblog.jonobacon.com/?page_id=697) – Updated the About page with current information and added a photo that my girlfriend believes actually makes me look rather camp. I think it looks moody and cool, but there you go…
I still have a raft of things that need updating, namely the [FAQ](https://archivedblog.jonobacon.com/?page_id=774), but that’s it for now.

Exaile
Another post outlining something that seems rather cool, but unnoticed. [Last time](https://archivedblog.jonobacon.com/?p=835) it was [Flightgear](https://www.flightgear.org/).
A mail to the LUGRadio email address pointed to a media player called [Exaile](https://www.exaile.org/). It is a GTK based media player using GStreamer, written in Python, and aims to be the same kind of kitchen-sink media player that Amarok is to the KDE desktop. I know, I know, the last thing we need is *another* media player…
So, I gave it a whirl, and I am pretty impressed. My media player requirements have grown quite a bit in recent months, and although happy with Rhythmbox, this little gem has a bunch of other things that I dig:
* Build in Internet radio – I love listening to some of the death metal stations, and I have been waiting for an eternity for Internet radio from something such as Streamtuner to be built into a media player. Good work.
* Information – it will grab information from wikipedia and lyrics.
* Tablature – for the song you are listening to, the tab will be grabbed if available. This is wicked-cool.
It also has the things I come to expect from a media player:
* GStreamer support.
* Album art.
* OSD.
* last.fm support.
This little dude also supports CDs and iPod’s, although I have not tested it yet.
So yeah, pretty decent jobby from my initial testing, and because it is written in Python and using GStreamer and GTK, it subscribes to the holy platform of greatness. Amazingly, it seems the whole thing was written by one guy – Adam Olsen. What an incredible achievement. 🙂
I think the only thing I would like to see is some more love on the UI – I know this is intended to be a hardcore media player like Amarok, but I think it could do with some UI love to make things easier to navigate and use.

Getting the new tune…
…is proving difficult right now as [Recreant View](https://www.recreantview.org/) is having DNS problems. Jokosher.org is also having the same DNS quirks.
I have copied the new blastbeat-double-bass-drum-metal-tastic tune to jonobacon.com so you can grab it.
So, to hear Take The Test, go and [download the Ogg](https://archivedblog.jonobacon.com/files/jonobacon-takethetest.ogg) or [download the MP3](https://archivedblog.jonobacon.com/files/jonobacon-takethetest.mp3).
Normal service should be resumed shortly. Hopefully.