Wednesday, December 23, 2009

"To tag" en francais

Searching for how to write taguer/tagger/tagguer in French. I won't use etiqueter neither. Nobody will understand...

So I found this. Not sure that's conclusive either...

Fun read anyway. In particular the longest sentence written using the 4 ADN 'letters' A, C, G and T.

Here's my version:

"Cata, ta tata gaga gâta, tagga 'caca! tacatac !', ça t'agaça !

Monday, December 21, 2009

Kung-fu coding

Derived from KUNG FU FIGHTING (Douglas, 1974)

Everybody was kung-fu coding
Those devs were fast as lightning
In fact it was a little bit frightning
But they coded with expert timing

They were funky Geeky men from funky Geekytown
They were coding things up and they were hacking them down
It's an ancient Geeky art and everybody knew their part
From a fix into a script, and coding from the heart

Everybody was kung-fu coding
Those devs were fast as lightning
In fact it was a little bit frightning
But they coded with expert timing

There was funky Billy Joy and little Sam Ruby
He said here comes the big job, lets get it on
We took a bow and made a stand, started writing with the hand
The sudden action made me flip now we're into a brand knew trip

Everybody was kung-fu coding
Those devs were fast as lightning
In fact it was a little bit frightning
But they coded with expert timing

(repeat)..make sure you have expert timing
Kung-fu coding, had to be fast as lightning

Licensed under fair-use/parody/whatever you have to do to not get sued for copyright infrigement these days.

(first one to upload a video on youtube with him singing that song, dressed as a kungfu coder gets some drinks from me)

Monday, December 7, 2009

Interesting CI / test distribution strategy

From: the hudson user list

In order to split our build across multiple servers, we have implemented a JUnit "PartitionedSuite" class. When we run our build in maven, we say -Dtest=PartitionedSuite and we pass in an "x/y" parameter like "2/5" or "1/5". The "PartitionedSuite" class scans the classpath for JUnit test classes and puts them in "y" buckets based on the hash of the Test Class name, and then only executes the Tests in bucket number "x". This way, we just define the "x/y" parameter as a per-server variable, and execute the build on y servers, and each server runs one "Partition" of Tests.

Secret questions

Just saw that Flickr requires me now to have 2 secret questions for password recovery needs. Among the proposed questions:

  • name of favorite author
  • name of favorite book
  • name of favorite movie character
  • etc

Are those answers supposed to be immutable ? Is my taste cast in stone ?

Update: one of my answers involved a 3 letters name, but Yahoo refused it as it isn't long enough.

Saturday, December 5, 2009

Skandiabanken with chromium

Now that basic SSL certificate support has been committed, it is possible to get Skandiabanken to work on Chromium Linux. It lacks a UI. Here are the steps I followed to get it to work.

Wednesday, November 25, 2009

Efficiency of a one time debugging session.

Value stream mapping of a debugging session of a fast moving open source project.

  • svn update: 3 min
  • mvn install (downloads the world) [FAILURE]: 3 min
  • mvn clean install (downloads the world) [FAILURE]: 3 min
  • manualy clean the workspace (remove deleted files): 1 min
  • mvn install (finishes downloading the world): 5 min
  • mvn -DdownloadSources=true idea:idea (downloads the world II, the source return): 10 min
  • start idea: 3 min
  • open project inside idea: 5 min
  • configure a newer JDK in idea: 3 min
  • start the program in debugging mode: 30 sec
  • add a breakpoint: 15 sec
  • reproduce the problem: 15 sec
  • find the bug: 15 sec
  • mail the user: 1 min

Total time: 48 min 15 sec
Time effectively spent on the issue: 2 min 15 sec
Efficiency: 4.66%

YMMV. Done on an almost 3 years old laptop running Ubuntu (1.83GHz Dual core, 2G RAM, 320G disk).

(those timings are from memory, but they seem consistent with the time I used between my mails.

Potential conclusions:

  • don't do random development on semi-complex open source projects ?
  • use less complex toolkits/development environments. I usually just read the code in less, nano or gedit. Hint: if someone gives me a simple editor that allows me to navigate between classes, that fires up very quickly, by just reading a maven pom, that would be pretty cool. If that editor had a terminal, even better. Maybe it is time for me to revisit emacs and its ecb...

There was a time when firing IDEA was a joy. Is my machine too old ? Did I lose something?

ssh/sftp in java

Some years ago, we had to deal with SFTP file transfers. We solved the problem by reusing the Apache licensed projects Commons VFS and the org.apache.commons.vfs.provider.sftp.SftpFileProvider class. This reuses the jsch library, and after having to troubleshoot some issues wrt threads and strange disconnections, it left a sour taste in my mouth. (jsch code isn't really my taste, and there's little logging for example, even though the author praises openssh's -v arguments. I don't want to diminish the author's accomplishments, but debugging production server issues with a debugger isn't fun).

I've found the Trilead project, but this project is unsupported now. Latest code is available e.g. from here.

Then another blog entry (also rambling on the code quality of the jsch project...) led me to commons-net-ssh, which sounds like a compelling alternative for SFTP file transfers.

Apache licensed, it looks active, somewhat documented and with a couple of unit tests...

The README says "GSOC project "SSH and SCP for Apache Commons-Net"", and this blog entry hints that the project should be retrofitted one day into apache commons-net. Can't wait for that.

Tuesday, November 24, 2009

xhtml, html and file extensions

I lost 30 min trying to understand why my proposal for handling String timezones in maven POM files (a la 'Europe/Oslo' instead of '+1' that doesn't take into account summer time) wasn't working in firefox 3.5.5 but was working in chrome and opera 10.01:

If I understood well, files served as .html are loaded as HTML files not as XHTML files in firefox, even if the doctype is XHTML transitional. So >script ... /> are turned into >script< and thus mess up the next element... w3c validation doesn't say anything.

I am still unsure this is how it should work, but using <script ...></script> solves it.

thanks to #firefox on moznet for help.

Thursday, November 19, 2009

Strategies for managing many small maven2 and hudson projects

So you finally decided to structure your maven2 projects properly, e.g. identify the correct set of plugin versions/configurations that work well in your environment, introduce a set of corporate POMs.... You also decided to clean up your hudson usage, use new plugins, etc...

You have to change many POMs, probably adapt hudson projects as well. You don't want to change all those configurations one by one. The good news is that both maven and hudson use XML as storage for the config files.

Here are some tips and tools you might want to use:

Tuesday, October 27, 2009

Tips: extra contextual shell information for multiple environments

On my desktop, I often work on multiple projects at the same time and I am a fan of command line and terminals.

These projects have different environments (e.g. java 1.5 and maven 2.2.1 on one, java 1.6 and maven 2.0.9 on the other one).

In order to have information about the projects quickly available, I display some version information in the terminal title.

[ANNOUNCE] Groovy cmd module

Introducing Groovy Cmd, a very basic Groovy module allowing to create line oriented command interpreters in Groovy. Based on jline. MIT Licensed.

update: renamed from grails_cmd into groovy_cmd..

Friday, October 16, 2009

Flash least green desktop application ?

After a while, Flash consistently takes 80-100% CPU on my desktop. Whether it is youtube, grooveshark or any other media player, I end up having to kill the browser and restart it. This with chrome and firefox (on Linux). I keep reading similar comments on the web, apparently also for people not using Linux.

I wonder what impact does this have on the world. How many trees per day would we save by not using a broken media player ?

Thursday, October 15, 2009

Split testing

Found this little django framework to implement split testing. Nice. Do you do split testing ?

Some links. A 1h video from Google (too long, I want the slides), a nice s5 presentation.


Wednesday, October 14, 2009

Is the market getting better ?

I compiled jobserve UK stats out of my gmail IMAP box, thanks to mathplotlib. Note the graph depicts j2ee related jobs in Europe between July 2007 and now. These are not new jobs, but the amount of jobs advertised by Jobserve UK per day.

Here are the scripts.

Tuesday, October 13, 2009

Bank terminal GPRS failure

bank terminal receipt showing Java stack trace

be.banksys.smash.UnexpectedErrorSmashException: Timeout occured.

I don't think this was expected to be printed out as is on the credit card receipt !

Happened to me yesterday while paying for a lunch in town. Someone from BBS might want to look at that ;) Feel free to contact me for more info, if needed.

Monday, October 12, 2009

Backup failures on small servers

In light of a catastrophic data loss @ T-Mobile, I went to verify backup setups I am responsible of and found out that one of them wasn't working as expected. Damn it. That's what happens when you have very little resources for a custom solution.

Online (free) issue trackers

I've been trying and using various issue trackers in the past months, in particular task2gather and pivotal tracker. This for very small projects (1-3 developers).

Synchronize firefox and chrome profiles passwords

I have been using chromium more and more on Linux. But all my passwords are saved in Firefox profile. So I wrote 2 tools to help me deal with my use of both chromium and firefox. One to dump firefox passwords, one to merge the dump into chromium's profile. Seems to work in my very limited test...

Friday, October 9, 2009

[ANNOUNCE] nosyd 0.0.5

Changes since last announced version:

0.0.5 (2009-10-09)

- Nosyd should now run on Mac OS X
- Mac OS X / Growl notifier support (
- new Django builder
- new CLI options (--stop)
- be smarter at identifying the monitored project files
- some performance improvements (cache some of the monitored files resolution to lower CPU usage)
- auto-rebuild project when .nosy file is changed

0.0.4 (2009-10-06)

- setuptools support. Project split into multiple files

pynotify support

Growl support

More info here. Code still on github.

(Thanks to Sergio for testing on Mac OX X)

Python Oslo Group

Today we hold our first meeting of the new Oslo Python/Django discussion group. Feel free to join! We will try to meet once a month.

Wednesday, October 7, 2009

Skype ramblings

For years Skype has been a second class citizen on my desktop of choice, Linux.

Consider using application level checksums

From this 1999 document titled When The CRC and TCP Checksum Disagree, analysing abnormous rates of errors in network transfers.

Our conclusion is that vital applications should strongly consider augmenting the TCP checksum with an application sum.

Even if you're not concerned with security, it maybe wise to implement an MD5 check (or like) at the application level for your multi-gigs file transfer before you start processing them.

Source: slashdot.

Saturday, September 26, 2009

[ANNOUNCE] nosyd 0.0.3

Some more features since 0.0.1:

  • support of maven2/surefire builds and (untested) trial
  • new command line features: --clean
  • auto-reload of nosyd and project configurations
  • configuration for nosyd
  • try to be more cross platform (untested)

Friday, September 25, 2009

CITConf Paris followup

I was supposed to attend CITConf last week-end, but some real-life virus forced me to cancel my trip. The same virus that kept me in bed most of the week. #&#"(¤/"

There have been interesting discussions on the mailing list:

[ANNOUNCE] nosyd 0.0.1

I got tired of having multiple windows. So I daemonized the whole thing to run a unique instance per user.

Forget (my version of) nosy, here's nosyd, the _minimalist_ personal command line friendly CI server. It's initialy geared towards building python projects (hence the name).

Thursday, September 24, 2009

Lightweight personal continous integration

Getting timely feedback is the key to improved software development productivity and software quality. That's why we have automated testing and CI servers.

Running a full CI server on your machine is a solution I've used in the past for some middle size projects. Using a personnal branch on a distributed SCM is another solution for complex projects / long running branches.

For simple projects, you can easily run a basic CI-like system on your machine. I call this lightweight personal CI.

Jeff Winkler's original nosy script is a great reminder that software should be kept simple and right to the point.

See also Doug Latornell's version

Here's my humble version, with a couple of extra features, in particular Gnome notifications and parsing of the XUnit like XML result.

Too bad I am hitting a lib notify Markup notification issue on Ubuntu 9.04, I can't display pretty HTML. On an unrelated note, launchpad 3.0 launched yesterday.

Building python projects on VPS currently use CentOs 5.2 and python 2.4. Here's my worklog for getting python2.6 projects to build with nose on my hudson server hosted by

Here's the result:

G1 / Android settings for 3G / MMS in Norway

If you need to configure your Android phone for 3G / MMS, look into this page from the XDA developers wiki.

For my operator, the information could also be found on Telenor's web site, but Telenor doesn't seem to support the G1 not make it as easy as the XDA page to configure your Android phone.

Wednesday, September 23, 2009 crappy security policy

We're in 2009 and we still have web merchants able to resend you your exact password if you have forgotten it. I just tested this with a UK sells it all web site (no link to them sorry. Bad boys!) which I just used to purchase "Amazing Grace" (nice movie BTW).

Hey guys, if you don't fix this, I won't place an order again with you.

Because if I you treat my password like other data I gave you (in particular my credit card details), I can't give you my money.

Can't you do the right thing ? Some tips (at a minimum):

  • store the hash of the password
  • salt it
  • compare salted password hashes !
  • regenerate a new password randomly if the user has lost his password

Why ? Because someone (a cracker or a disgruntled employee) could fetch the customer / passwords list and as most people don't have a new password per site, use it to not only make purchases on, but to access all other accounts, up to probably the customer's mail box. And from there access all his accounts.

Note to self: always test the "send me my password" function on any new web site I use.

Update: at least some other sites know what they are doing

Thursday, September 17, 2009

nose, subversion and executable bits

For some reason, nose wasn't executing some of my tests. I found out that nose doesn't select test files if they have an executable bit, and that subversion was configured to create the files with the executable bit. That's a bit unfortunate as I want some python files to be executable, other not. I guess I will let them non executable by default. Worklog below

Friday, September 11, 2009

Britain apologies to Alan Turing

The official site of the UK Prime Minister's office just published Gordon Brown's apologies to Alan Turing.

Kind of them to finally recognize the contribution and inhumane treatment of this great man without who I might not have worked in IT (and might speak German as well).

Thanks Alan.

And when I think about the changes in the society in the past 60 years, I can't help to feel lucky, happy, and somewhat scared that this could regress pretty quickly... We've still a long road ahead though.

Software commit guidelines and tips

Having and following good commit guidelines is critical to ensure you're not doing cowboy coding. Here are my guidelines. I will update them as time goes. Feel free to comment.

Tuesday, September 8, 2009

Tips for autodeploying J2EE apps on Unix platforms

With a little bit of configuration you can have a nice autodeployment setup to save you time and remove potential errors.

For example this is something I can usually do after spending a few hours on the development infrastructure:

# from the build server, deploy the latest build for the specified project onto the 3 dev servers
deploy_build projectName trunk latest dev1 dev2 dev3

# deploy specified build for specified project
deploy_build projectName trunk build65 dev4

# deploy latest branch 2.0 onto specified server
deploy_build projectName 2.0 latest dev5

Also with a little bit more glue code those same commands can be run through your CI server interface, allowing one click deployment from the CI server GUI.

This is one way of achieving it, using standard Unix tools.

Wednesday, September 2, 2009

Python and testing

Here's a list of links I've found when building my python testing knowledge, categorized under Unit testing, Mocks, Articles, Web testing, Google App Engine and Code Coverage.

Hudson, maven and git on VPS

VPS hosting from is a reasonable compromise between cost and hosting service quality. I use it to host a hudson CI server.

This entry explains how I set it up up to a point where I can build using maven a java project hosted on a ssh protected git repository (on github). I will not go into the hudson specific stuff, the hudson wiki is usually complete & well worded. But I will spend more time on the OS specific stuff such as daemon configuration, ssh specifics, etc...

Thursday, May 7, 2009

Temporarily using a different python version on Debian/Ubuntu

On my Ubuntu 9.04 box, python 2.4, 2.5 and 2.6 are installed. 2.6 is used by default. repo, the android git wrapper script requires python 2.5. If you use 2.6, you get the following nasty error:

/home/jerome/Code/OSS/android/.repo/repo/codereview/ DeprecationWarning: the md5 module is deprecated; use hashlib instead
import md5
Traceback (most recent call last):
File "/home/jerome/Code/OSS/android/.repo/repo/", line 34, in
from manifest import Manifest
File "/home/jerome/Code/OSS/android/.repo/repo/", line 21, in
from project import Project, MetaProject, R_HEADS
File "/home/jerome/Code/OSS/android/.repo/repo/", line 27, in
from gerrit_upload import UploadBundle
File "/home/jerome/Code/OSS/android/.repo/repo/", line 21, in
from codereview.proto_client import HttpRpc, Proxy
File "/home/jerome/Code/OSS/android/.repo/repo/codereview/", line 31, in
from need_retry_pb2 import RetryRequestLaterResponse;
File "/home/jerome/Code/OSS/android/.repo/repo/codereview/", line 9, in
from froofle.protobuf import descriptor_pb2
File "/home/jerome/Code/OSS/android/.repo/repo/froofle/protobuf/", line 879, in
class FileDescriptorSet(message.Message):
File "/home/jerome/Code/OSS/android/.repo/repo/froofle/protobuf/", line 155, in __init__
superclass.__init__(cls, name, bases, dictionary)
TypeError: Error when calling the metaclass bases
type.__init__() takes 1 or 3 arguments

As I don't want to change the default python version, and until Google comes with a proper repo script, I used the following ugly trick:

ln -s /usr/bin/python2.5 python
export PATH=`pwd`:$PATH

If someone has a better idea, let me know.