Skip to main content


Building windows installers in a Linux CI environment using wine and innosetup

Quelea is by the "side project" that takes up the majority of my time. To aid with testing, I built in CI relatively early with a Jenkins server running on a custom VM. This was great - I could just push a change to the repo from anywhere, and then point the user to the CI release. They'd download it and be able to confirm whether the fix had worked (or not!)

I've since switched to Travis and retired said VM (it's one less thing to maintain, and now everything is on Github.) But both these setups had one main issue - the windows installer wouldn't get built as part of this process, since they were Linux boxes and innosetup doesn't have a linux distribution. Travis has added windows support, but it's in early release, and in any case I'd like the entire build process to be able to run on any Linux box - it makes it both quicker and more transferrable if we ever need to move elsewhere.

I therefore looked into using wine in the CI release to build th…
Recent posts

An updated Dropbox API example

By far the most popular post on here (shock, I know!) was to do with using the Dropbox Java API from a desktop Java app. At the initial time of writing, this wasn't really documented, so the OAuth flow in particular required a bit of guesswork to get it going.

I haven't done any work with this API in quite a number of years now, and it appears the original v1 API was switched off a few months back, so that example will no longer work. This API has much better documentation than the v1 API did back in 2012, and if you're doing any serious work with it then looking through the SDK and the SDK examples on Github is a must.

That being said, for completeness I thought I'd provide an equivalent code snippet for the v2 API.

You'll need the appropriate Maven or Gradle dependency:

<dependency> <groupid>com.dropbox.core</groupid> <artifactid>dropbox-core-sdk</artifactid> <version>3.0.5</version> </dependency>


ZyXEL ES-1552 - removing ports from the default VLAN

Edit: As of January 2015 the ES-1552 has been discontinued.

The ZyXEL ES-1552 is a 48 port 10/100 switch that's become horrifically good value recently, at the time of writing Ebuyer has it in stock for £27 (including delivery.)(Sorry, it's now out of stock and discontinued.) Granted, it's not gigabit, but still - a fully managed, fanless 48 port switch at that price? (And actually, it does have 2 gigabit ports included, so it's really a 50 port switch, and 52 if you include the two SFP slots. Anyway, I digress.)

However, one of the downsides I keep seeing mentioned is that the web interface annoyingly doesn't let you remove ports from the default VLAN, even when the PVID of that port is set to a different VLAN! This would make it practically useless in a VLAN setting, but fortunately there's an easy workaround which I'll document here.

I'll be using Chrome here, but any other browser with similar developer functionality should work just as well. For de…

Expanding JavaFX's media support

Note: For those that don't want to read through the post and just want the patch for MKV support, you can grab it from this ticket, or here if you don't have a JIRA account.
Background One of the predominant things lacking a "nice" approach in the Java world for years now has been good media support. Oh sure, we had JMF, but anyone who ever had the misfortune of using that will I'm sure understand why that never really took on. (Yes, it really was that bad.) A few other approaches came and went, most notably Java Media Components - but none ever made there way into core Java, and for a long time it became pretty de-facto knowledge that if you wanted any form of comprehensive media support in Java, you used a cross-platform native library, perhaps with a Java wrapper.

However, when JavaFX 2 came along we were provided with a new, baked in media framework that provided this functionality on the Java level! This is a massive step forward, sure it uses GStreamer unde…

Draggable and detachable tabs in JavaFX 2

JavaFX currently doesn't have the built in ability to change the order of tabs by dragging them, neither does it have the ability to detach tabs into separate windows (like a lot of browsers do these days.) There is a general issue for improving TabPanes filed here, so if you'd like to see this sort of behaviour added in the main JavaFX libraries then go ahead and cast your vote, it would be a very welcome addition!

However, as nice as this would be in the future, it's not here at the moment and it looks highly unlikely it'll be here for Java 8 either. I've seen a few brief attempts at reordering tabs in JavaFX, but very few examples on dragging them and nothing to do with detaching / reattaching them from the pane.

Given this, I've decided to create a reusable class that should hopefully be as easy as possible to integrate into existing applciations - it extends from Tab, and for the most part you create it and use it like a normal tab (you can just add it to…

The comprehensive (and free) DVD / Blu-ray ripping Guide!

Note: If you've read this guide already (or when you've read it) then going through all of it each time you want to rip something can be a bit of a pain, especially when you just need your memory jogging on one particular section. Because of that, I've put together a quick "cheat sheet" here which acts as a handy reference just to jog your memory on each key step.

I've seen a few guides around on ripping DVDs, but fewer for Blu-rays, and many miss what I believe are important steps (such as ensuring the correct foreign language subtitles are preserved!) While ripping your entire DVD collection would have seemed insane due to storage requirements even a few years ago, these days it can make perfect sense.

This guide doesn't show you a one click approach that does all the work for you, it's much more of a manual process. But the benefits of putting a bit more effort in really do pay off - you get to use entirely free tools with no demo versions, it's …