When it comes to logging in Java™ there is no shortage of alternatives. The one I’ve used the most is log4j by the Apache Foundation. In its basic usage it has no dependencies and you only need to add the ones you’ll use like SMTP support for mailing loggers, JSON configuration support or a JDBC connector to log to your favorite database. The newest version even allows asynchronous logging through the LMAX Distruptor interthread messaging API that promises greater throughput than concurrent queues and lock based thread synchronization.
Since the 2.x version came out, however, the documentation for the 1.x versions has become fragmented. There are dead links everywhere and the XML configuration method reference is not even half complete. A common question about the XML format is about validation. A more thorough search can land you on the source control version of the DTD. Let’s go through the details of what makes a valid log4j XML configuration file.
A quick recipe, converting an int or long like 65 to a string like 000041. It’s useful for converting integer RGB colors to the common #FFBBCC kind of web encoded colors.
int number = 65;
String hexString = String.format("%06X", number);
Today I learned something new about Java exceptions. The always surprising try-catch statement has a concept called suppressed exceptions. The main idea is that a the whole try structure can throw an exception from more than one place:
- The catch block
- The finally block
- The try-with-resources implicit close
So, I was trying to decode some base 64 encoded data to verify a request’s details but openssl kept returning nothing. To see what it expected I encoded a random string and when I saw the output it dawned on me. Base 64 wraps lines of a certain length with new line characters, every 64 characters (bytes, actually).
Wrapping data isn’t that hard, but I suspected there had to be a command that already did something like that. The answer was fold. It wraps lines of input to fit a specified width. The default was 80, but it can be changed with the -w switch. The result is:
input | fold -w 64 | openssl base64 -d | output
The SDK for iOS development is really nifty. It has high level access to a lot of the OS and offers plenty of widgets and utilities. There is, however, one unexpected weakness I had to battle recently. That is NSHTTPURLResponse‘s header management.