SVNKit Command Line Client

With the advent of Subversion 1.4, the working copy meta data changed, which means you can't mix 1.4 clients with earlier clients. Not a huge deal, in general, but I ran into it because I much prefer Subclipse 1.2 to 1.0, and 1.2 uses the Subversion 1.4 working copy structure, but CentOS packages a Subversion 1.3 client (and can't upgrade because of APR conflicts).

But I learned that SVNKit (formerly JavaSVN, and what Subclipse uses under the hood), ships with a command-line client that behaves like the official Subversion one. I figured I'd give it a whirl, since I occasionally need to do SVN stuff from the command line, and it works like a charm.  It even seems faster than the real one, though that might be attributable to the performance improvements in the 1.4 working copy stuff, not the client itself. If you're looking for a 1.4 command-line client and the official one won't work (because you have conflicts, can't install software, etc.), I highly recommend this one. Follow the link to find more girls.

No More Cell Phone

As of the end of the year, my cell phone will no longer work.  It was a company phone and since I'm leaving, I won't be keeping it.  If I replace it, I'll get a Portland number instead of my old Bellingham number, so my current number will stop working regardless.  However, I figure if anyone can't wait until I get home to talk to me, they can buy me a phone, since they're the one that needs it.  If I do get a new one, I'll publicize it.

There is no Spoon

On my last post, Matthew Lesko posted a link to another blog post in a comment.  A very interesting article, and while I've never explicitly thought of it like that, it's my preferred style of doing things.  You have to do some preplanning or you're sunk, but in general, I prefer to have a set of long term goals and just move towards them as I best see fit at the time.

I think this can also be fingered as the reason I don't much care for FLiP.  Which isn't to say FLiP (or any methodology) is devoid of good techniques, but following the "rules" just for the sake of following them is not a good plan.  A process that is inherently friendly to ad hoc problem solving is almost always better in the world of software design because software is so malleable.

On the Topic of System Architecture…

I've been doing a lot of system design and architecture work over the past year, and looking back, wanted to share some thoughts. A little background to start off with. The company I'm leaving in a couple weeks has a product that they've been selling since 1999, and it's showing it's age. Last January the decision was made to rebuild it from scratch, and that's what I've been doing since. Feature complete was slated for the end of the year, but that's been bumped a month or so, due in part to my imminent departure.

First, system architecture is friggin' hard. I don't claim to be a programming god, but I do consider myself fairly competent. It boggles the mind how many times I did stuff wrong over the past year. The mistakes ranged from incredibly minor to somewhat significant, but nothing that took more than a day or so to fix. All things considered, however, I'd say it went remarkably smoothly, and I'm quite happy with the outcome and how little time slippage there has been. In fact, most of the delays have been attributable to my unfamiliarity with the minutiae of Hibernate and SpringMVC and having to learn as I go. Both packages, however, have more made up for the delays with improvements elsewhere.

Second, I went into the project with a heavy dose of "build a fairly complete UML model first," and have abandoned that perspective over the year. I did do a pretty elabrorate model up front, and I'm not sorry I did, but the long term benefits are quite a bit less than I expected. Part of that's because the desired result has evolved over the year, but a lot of it has been the evolution of the system codebase. As time has passed, certain idioms that I'd designed have fallen out of favor and new ones have come to life. Certain technology pieces have also shaped the evolution of the product. The general shape of the original model is still visible in the code today, but most of the specifics have changed.

As my perception of a model's benefits have changed, my use of UML has also changed, and this is really what I wanted to write about. I do most of my design on paper these days, and most of the time the first and last things written on a given sheet are done less than an hour apart. Most of the papers end up burried under others within a day, and aren't looked at again until I realized I've got 40 pages of pictures on my desk and move the old ones to the recycling. I still use a lot of UML nomenclature in the drawings, I just do them by hand. One very interesting facet that I noticed was my member declarations on class diagrams.

What I found was that I almost never supply both a type and a name for a member. It's almost always one or the other, with the missing one implied. More specifically, simple properties and methods usually only have names, while compound properties (i.e. collections) only have types. I think that really drives home the fact that names (both type and member) are really important. I can attest that that's borne out over the life of the project. Intelligible and consistent nomenclature is incredibly important for developer sanity. The primary exception to the rule was collections of simple types, or multiple collections of the same type. List doesn't have much contextual information, for example, let alone if there are multiple properties with that type.

So what have I learned? UML is great, but trying to make a blueprint up front is folly. Much better to just sketch. If you name stuff well, you'll save yourself a lot of work. Don't expect to get stuff right up front. If your first shot is mostly right 60% of the time, you're doing awesome; if you're ever perfectly right, you're divine. Designing in a bubble doesn't work; you have to have conversations to drive the design, even if they're not with techies. Non-programmers can't articulate ideas with the clarity of a programmer, but they can still articulate them, and having to do the translation in your head makes you really get into the guts of the task at hand. And, of course, code is massively more expensive to refactor than some pencil sketches (or even some formal diagrams). That's really the whole point of separating the design/architecture phase from the coding phase, and it's essential for anything more complex than a static HTML "hello, world" app.

Akismet for Spam

I've been using WordPress for a little while now, and it ships with Akismet spam blocking plugin. I was a little skeptical after all the issues I had with Movable Type's spam blocking tools, but I'm impressed with Akismet. It's not perfect, but it does a good job. I'm going to wait a couple more weeks before final judgement, but the way things look right now, I'm probably going to be able to safely disable comment moderation.

For those of you not using WordPress, Akismet is particularly nice in that it's a hosted service, which means it learns from everyone and can be used with any blogging system (or anything else that does spam processing). There's libraries and plugins available for a wide variety of platforms, including CF, Java, Ruby, and .NET.

Best of all, it's a free service for personal use. If you're making money with your site, you need to buy a license, but if not, it won't cost you a thing.

Barney "No Ball" Boisvert

Due to the unending courtesy of Sim, I am now known as "no ball", it seems.  I want to clarify that I do have balls (two of them, to be precise), and that they are in perfect working order.  The only change is that the sperm they produce will no longer be leaving my body.  As expected my vasectomy took all of 30 minutes, and I was back at the house within an hour of arriving at the doctor's.  Couple little snips, a touch with the lightsaber of death, and then some sutures and I'm golden.  Post-op, including a sperm count to confirm my infertility, is scheduled in 10 weeks, but hopefully it won't take that long to clear the existing sperm out.  Right Heather?  ;)

The State of the Barney

Another year draws to a close and I thought I'd take the time to do a general update of my life for the world.

Top of mind is that I'm leaving AudienceCentral for Mentor Graphics at the end of the year. The past five years have been great, and the company has some huge potential waiting to be released. The past year I've been doing a huge amount of Java work, and really quite enjoyed myself. The tools and packages available put everything ColdFusion has to offer to shame. Which isn't to say CF's a bad language, of course; CFQUERY alone makes up for a wide array of shortcomings and it's Java underpinnings give it the raw power where it's needed. At Mentor, I'll be back to almost entirely CF development. From the brief preview of what we've got ahead of us as a team, there's some exciting stuff coming down the pipe with some really neat problems to solve. In addition, the CF focus will give me the opportunity to delve back into the CF community to a greater degree than I have in the past year, which is a nice benefit for me.

Also common knowledge is that my blog server died last month. The switch to WordPress on a PHP (et al) host was quite trivial thanks to the Movable Type underpinnings of my old blog, but man have I come to hate PHP. It's a relatively new language to me, so I don't have the idiomatic familiarity I do with other languages, but even so, it's nasty to work with. Fortunately, WordPress works well enough out of the box that I can continually procrastinate on all the tweaks and mods I should be making to flesh out photo galleries and stuff for my quartet of blogmistresses (Heather, Chloe, Peggy, and Moira).

Lindsay will be three years old next month, and is turning into a person instead of a child in a lot of ways, which is exciting. It's also annoying because she's turning into a stubborn, arrogant pain in the neck, just like her father. Damn heredity. Unfortunately, she seems to also have inherited my skin issues, particularly the sensitivity to cold. Coupled with her burning desire to spend every minute of every day wearing nothing by her panties, she itches a lot. Speaking of panties, aside from wiping after pooping, she's totally potty trained since the beginning of the effort has had fewer accidents than I have fingers.

Emery's 16 months old at the moment and also transitioning, though from an infant to a child. He's running around the house, and in the past week or so just started the blabbering that indicates it's about time to start talking. He's learned a fair number of signs for various things, but real speech will be nice. From the first signs, however, I think we'll have some issues converting the signs he knows into spoken words, just like with Lindsay. Unlike Lindsay, he doesn't have a strong interest in reading. Doesn't seem to have affected his language skills at all (at least the listening part), but we'll see when he starts talking.

We're just shy of a year in this house, and it's still treating us well. Biggest issue we've run into was that the furnace didn't want to light this evening. So have to call some heating guy tomorrow and see about getting that fixed. Even though we're out in unincorporated Washington County, it's still a city which I could do without, but such is life. Better than in an apartment downtown somewhere.

For the actual body of Barney, things are good. Had the hernia taken care of and it's doing admirably. Still a little tender to firm pressure, but no problems moving around as I did before. My "skin rot" hasn't bothered me much this year either, though with the cold it's started to return somewhat. Ball severing (i.e. vasectomy) tomorrow to cement my "no more kids" status. I will certainly admit to being a lot less active this year, largely because I'm not riding my motorcycle to work every day and hiking down to the office from where the free parking is up the hill. I've mitigated a large part of that with evening walks, and starting next year will be back on the bike for the commute each day. Certainly not in the shape I was six years ago, but among the general population of 26 year old males, I'd say I'm doing pretty well.

Looking forward to 2007, I think it'll be a good year. More of my life is dedicated to work than sleep, so that's an important indicator of my well being, and the outlook is good. CF has really matured in the past year or two, and while it's still lacking in a lot of ways, I'm excited to get back into it. The kids will both be old enough to have a lot of fun playing this summer. Not that we didn't last summer, but Emery still wasn't walking at all, which makes outdoor activities a bit less engaging. Only time will tell, of course, but the future's looking bright.

Moving Time Again…

It's just about the turn of the year, and as you all know, that's the time of year for major life changes.  Giving myself a 20 day window around new years (from Dec 20 to Jan 10), the past six years have included these events:

  • The end of my swimming career
  • The purchase of our first house
  • The birth of our first kid (Lindsay)
  • The sale of our first house
  • The purchase of our second house
  • The move from meat-space commuting to telecommuting

With the advent of 2007, it's time to move again, though this time between jobs.  After five years at AudienceCentral, I've accepted a position at Mentor Graphics in Wilsonville starting January 2nd.  There's an array of subtopics (both good and bad) that I can't really talk about, so I'll just say that I'm excited for the change.  Mentor's a very different place than AudienceCentral (for example, it has about 400 times as many employees), but they've got some cool projects coming down the pipe, and I'm looking forward to the camaraderie that sharing a hallway with the rest of the team provides.

Software Aging

With technologists (aka "geeks"), there is often a "latest and greatest is best" mindset that pervades the psyche. I'm certainly guilty. It's worth keeping in mind that just because something is newer, more feature rich, along a defined upgrade path, etc., doesn't necessarily mean you should switch. A standout example of this is Hal Helms' site. "Why?" you ask, well let me tell you.

Hal is a guy that has done some amazing things for the CF community. He's been a driving force behind Fusebox for many years, he was a driving force behind the creation of Mach-II, he's a huge proponent of OO software design with CFCs, and he's a nice guy to boot. And guess what? His site is running Fusebox 2. Yes. Fusebox 2. Because it's perfectly adequate.

I would never recommend building a new site in FB2. Never. But upgrading from FB2? If you need to, I suppose. Every time I end up on Hal's site for some reason, I remember noticing it was FB2 back in the heyday of FB3, and always go check the source to see if it still is. A little reminder in the chaotic world we all live in that the latest and greatest isn't always the best.

Clearsilver on OSX

It's been a while since I've posted, but I've got a lot to talk about. First up is Clearsilver on OSX.

For those of you who don't know, Clearsilver is a lightweight templating engine written in C. It has bindings for a wide array of languages, including Java. Java bindings, of course, mean ColdFusion can use it as well. It's very low-level, which is both good and bad, but it's crazy fast and quite easy to work with. However, I had been unable to get it to compile on OSX until recently. Fortunately, the fix is simple once I figured it out.

Download the source tarball and unpack. Open up `rules.mk.in` in the root directory and around line 91 or so, replace "-shared" with "-dynamiclib" in the LDSHARED and CPPLDSHARED lines. Now run `./configure` with the appropriate options. Now open up `java-jni/Makefile` and around line 10, change "libclearsilver-jni.so" to "libclearsilver-jni.jnilib" in the NEO_UTIL_SO line. Do your normal make process and you should be greeted with working Java bindings. Just drop clearsilver.jar and libclearsilver-jni.jnilib in your classpath, subject to the standard JNI caveats about multiple loads per JVM instance.

I'm a total noob with C tooling, so I'm sure there's a better way to approach this (probably with some magical setting in the autoconf scripts). However, I don't know what it is, and making two little text changes wasn't enough of a burden to make me dig deeper. If anyone has a better solution, however, I'd be interested to hear about it.

On a related note, some of the code I contributed has made it into the official distributions.  While I'm sure they're not using the Java bindings (which is all I contributed to), it's still pretty cool to be able to say a package I helped develop powers Google Groups, WUnderground, and Trac, among others.