I’m beginning to doubt that my current approach of transporting data from a source to a sink by using threads for each source will ever work. It appeared to be way too simple, too!
Author: Bombe
Where Is Your God Now?
Just when you think “yay, parsing MP3 frame headers is the shit,” somebody comes along and starts hitting you with a book called “MP3 Info Tag.” In the head. Repeatedly.
I Really Hope…
…I can think of a new name for Sonitus rather earlier than later. I don’t really like it very much. Also, it gives way too much Google hits.
New Project: Sonitus
So, a few days ago I started a new project. It’s currently called Sonitus and hopefully will grow into a fully-featured broadcasting application that can use almost any input available, can perform arbitrary processing, and can output the processed results to almost anywhere.
The other day I wanted to extract a part of a filename and was quite dumbfounded when the extracted part came back empty. The regular expression used to extract the part using a capturing group was:
[A-Za-z0-9]*_?([0-9]*)\..*
The filenames fed into this expressing where mostly of the pattern someText_12345.data
. However, occasionally a file named 12345.data
would pass along and even though its name matched the expression, the capturing group came up empty. But… but… why?
This Method Has Been Called Before
Sometimes you have a method that should only be called once, and any further calls to this method are considered to be an error. And you thought you had made sure that this method is only called once. But every now and then you find something in your log file that points to the fact that this method has in fact been called twice. This is an outrage!
So, how do you track down those spurious calls that happen out of nowhere and that can not possibly happen at all? Turns out, it’s not that hard: I thought up this method after reading a bit of log file from a fellow Freenet user. For a single method call it contained two different stack traces, one from the current call, and one from the last call. So after a couple of seconds I came to the conclusion that it has to happen a little bit like this:
public class SomeClass { /* Example UUID: dc033fa4-0102-4051-af9a-df9441312192 */ private Exception firstCallException; public void someMethod() { if (firstCallException != null) { throw new Exception("Method already called!", firstCallException); } /* do stuff here */ firstCallException = new Exception(); } }
What happens here is quite simple, really. firstCallException
is initialized with null
, so on the first execution of someMethod
nothing spectacular happens but at the end of the method firstCallException
is set: a new Exception
is created which also initializes a stack trace for the current thread. On the second call we realize that firstCallException
has already been set so this method must have been called before! We throw a new Exception
which uses the exception of the first method call as root cause; this enables us to get information about both exceptions from the resulting exceptions. Also, this would allow us to chain an arbitrary number of exceptions, e.g. when you have to track all calls to a method.
(This method will fail in some way when accessed by multiple threads — I leave it as an exercise for the reader to make it thread-safe.)