A collection of thoughts, ideas and rants inspired by my career as a tech consultant in the finance industry.

Git baffles

I’ve been using DVCSs for more than four years and I love them. Both Git and Mercurial are excellent source control tools, each with their strong points and their warts. The biggest difference between the two is the learning curve. I was very comfortable with Mercurial after only a few weeks and the same has held true wherever I’ve introduced it. It took me about six months to get to the same comfort level with Git. [Read More]

Netezza: failed to create external table for bulk load

I came across an interesting problem recently in some JDBC code that was inserting rows into a Netezza database. The Java code was doing something like this: Statement stmt ... for( SomeObject o : listOfObjects) { String sql = "INSERT INTO tbl(col1, col2) values (?,?)"; ... stmt.addBatch(sql); } stmt.executeBatch(); On the “executeBatch()”, a SQLException was being thrown that said “failed to create external table for bulk load”. What? But it wasn’t a bulk load. [Read More]

Bi-temporal Data Model

A bi-temporal data model is a fancy way of saying that all tables have 2 pairs of dates: business from/to, and audit from/to. The business dates track expected day-over-day changes in business data such as the varying quantities of widgets in stock. The audit dates are used to track when the data was loaded into the database, and any data fixes applied by IT. In essence, every table contains the current record as well as the full log of all the changes that were ever made to that record. [Read More]

Throwing Under The Bus

Throwing somebody under the bus (ref) is a cowardly act, and one that particularly irks me. Nobody likes to be humiliated in front of others. I’ve seen this happen countless time when a developer will point out a bug or error of another developer and use it as an excuse for not delivering on their own work. “I couldn’t load the data because of a bug in Johnny’s code”. Bullshit. If you were a team player then you would have pulled up a chair next to Johnny and tried to fix the bug so that the project could move forward. [Read More]

Thoughts on Netezza

I’ve been using Netezza for a few months now and this post captures my opinions based on my limited experience. For context, I’m populating a Netezza database for a client. The database schema is managed by the client, and Netezza was selected prior to my involvement. Netezza is their data warehouse, but they’re also using it a little like an application database. They’re using a bi-temporal model, but that’s a subject for another post. [Read More]

He who estimates, implements

I’ve been over the high-level requirements and think it’ll probably take 8 weeks with 2 developers, so you should be able to deliver this by X. Well, that’s great. Can I presume that you’re one of the two developers working on it? I didn’t think so. Nothing irks me more than being handed a batch of work along with the timeline for delivering it. If you want to estimate my work for me, then you can also go ahead and build it. [Read More]

Hauppauge 950Q doesn't work with WD Live

According to the Hauppauge website, the Western Digital Live Hub works with the Hauppauge WinTV-HVR-950Q TV tuner. It does not. The Hauppauge app does the channel scan, but freezes when you try to change channels. In other words you have to reboot the WD Live box whenever you want to change channels. That doesn’t count as working in my books. Just sayin’… A bit of Googling has shown that 950Q hardware Rev B may have worked, but the version commonly available in stores is Rev E. [Read More]

@Value not resolved when using @PropertySource annotation.

Spring’s gotcha-of-the-day is around using @Value to resolve property placeholders in combination with @PropertySource. I had the following Spring Java configuration: @Configuration @PropertySource("classpath:/test.properties") public class TestAppConfig { @Value("${queue.name}") private String queue; @Bean(name="queue") public String getQueue() { return queue; } } But the value in “queue” was not resolving - it returned “${queue.name}” as the value. It turns out that I needed the following magical incantation to get it to work. [Read More]

Interviewing

I’ve been interviewing candidates quite a bit lately and I must admit that I quite enjoy the process. I get to meet new people and learn about how they work, and things they’ve worked on, and about technologies that I haven’t used or haven’t heard of. At Intelliware we usually conduct two separate interviews: the first is a personality/fit interview intended to answer the questions, “Can we work with this person, and would they be happy here? [Read More]

Scheduled tasks with Spring and Java configs

Spring 3.2 has some very nice features for scheduling tasks. The pure Java way of doing this looks something like private ScheduledExecutorService executor = Executors.newSingleThreadScheduledExecutor(); class ScheduledTask implements Runnable { @Override public void run() { System.out.println("Running scheduled task"); } } // Schedule a task every 5 seconds executor.scheduleAtFixedRate(new ScheduledTask(), 1, 5, TimeUnit.SECONDS); // If you don't do this then the JVM won't exit cleanly executor.shutdown(); But now, with the snazzy new Spring scheduling annotations, it can be as simple as this [Read More]