Android is a great mobile OS for people who like to tinker and customize things. Virtually every aspect of Google’s default Android install can be replaced with something else. There are a number of alternative SMS clients if you are unhappy with the default, a plethora of alternative Gallery apps, multiple Email replacements, and many more. You can even replace applications that seem ‘core’ to the OS such as the dialer and even the Home Screen Launcher.

The ability to replace the Launcher opens up a world of possibilites for customization. Launchers like LauncherPro and ADW Launcher have tons of options, giving users a lot of control.

One of the features of some of these launchers combines really well with another type of Android app to allow users to solve the problem of cramming too many shortcuts into homescreens.

Continue reading ‘Boost Android Productivity With LauncherPro + Smart Shortcuts’ »


Be Careful With Clover in Jenkins

We’ve got a common library used by a number of projects. This library has it’s own git repository and it’s own job in Jenkins to build it.

One of the tasks of the Jenkins job is to, when the tests pass, copy the jar file artifact into a team-wide Nexus instance, which is added as a repository in our other projects.

Lately I started having a problem where a new project that used this library was unable to run tests correctly – strange failures that seemed unrelated to any actual changes. The culprit wound up being an unlikely source: Clover.

Continue reading ‘Be Careful With Clover in Jenkins’ »


I recently wanted to set up Jenkins on my personal workstation to manage builds for side and personal projects. I was already running Tomcat on the system since I use that to run Subsonic, so I wanted to install Jenkins in the same container.

The process of getting everything working was just short of a nightmare, but I managed to eventually get my Jenkins inside of Tomcat successfully checking out and building projects through Git. While I was dealing with various errors, I was doing a lot of Googling. My searches seemed to indicate that very few people were trying to set things up as I was, because the internet was very little help. When hours of Googling turns up nothing, you know you either have a) a technical problem that nobody else has tried to solve or b) a weird fetish.

So I’ve written this post to explain how to set things up. But rather than a simple tutorial, I’ve written it as a step-by-step account of the various difficulties I had setting it up. I’ve done this partially to draw a little bit of attention to a gap in the error messaging of these tools, but mostly so that the next person who Googles for specific error messages may come across this page and avoid some headaches.

Ultimately, what I wanted was Jenkins installed in Tomcat running as a system service in Ubuntu to be able to check out projects via Git repositories via the SSH protocol. I will assume you already have Git installed because it is awesome, but if not it’s as easy as using your package manager.

Continue reading ‘Ubuntu, Tomcat, Jenkins, Git, and SSH Together’ »


When To Work On Technical Debt

I hear the same complaints and concerns from all sorts of different software development organizations. It seems that development teams only suffer from a small handful of problems in the broad sense, and nearly every team seems to share them.

One problem I encounter constantly is this: “We don’t have time to address our technical debt!”

Every company I’ve ever worked for has had this problem to some degree. The development team realizes that there are some parts of the system that need to be cleaned up, but for a wide variety of different reasons, they feel like they don’t have the time to actually work on improving those areas of the system.

The truth is, this is not actually that difficult a problem to deal solve. As software developers, we deal with significantly more complex problems on a regular basis.

Continue reading ‘When To Work On Technical Debt’ »


I care, probably more than I should, about my résumé. I sort of think of it like a real-life character sheet, so I like to keep it current at all times. But my résumé has always been a source of irritation for me as well, as I have a number of things I would like to do with it that I’ve been unable to do.

  1. I want to have it version-controlled, so it should be plain text.
  2. I want to have a plain HTML version of it that I can post on my blog, here
  3. I want to have a $$\LaTeX$$ version of it, because I like the way it looks, and I’d like to send that version to potential employers.
  4. I would like to have a “master” version of the résumé with all of my data, but be able to easily build customized versions of it. For example, I want to include the sections on what courses I took in school if I’m sending my résumé to an academic institution, but I want to leave that off if I’m applying for an industry job.

I started building some tools that would let me accomplish this, including a specialized résumé data format that I called “rml” but I quickly realized that not everyone wants to store the same data on their résumé, so I kept generalizing and generalizing the tool until I had something usable: Templator.

Templator is a general tool that allows someone to store data in a text file and run that data through various template files to get generated output. It utilizes YAML and ERB, so Ruby programmers should already be comfortable with it.

In this article I’m going to explain how to use Templator to store a version-controllable, customizable résumé.

Continue reading ‘Building a Résumé With Templator’ »