A month or so ago, I decided I really should spend some time learning Git to see what all the fuss was about. Unfortunately, nearly everything I work on is in Subversion repositories. Thus, I really don’t have an opportunity to really see everything that Git has to offer.

However, I did decide to give the git-svn integration a whirl to start getting a feel for git. Basically, learn some of the basic commands, experiment with the tools, etc…. I must admit, I’ve been pleasantly surprised and I now feel that git-svn is nearly the perfect svn client. I don’t think I’ll be going back to normal svn clients for day-to-day work anytime soon. Why do I like it?

  • It’s fast – a “git pull” is much faster than a “svn update”. What’s more, “git pull” updates all branches, not just the one I’m working on. Other options like “git blame” and “git log” and such are nearly immediate where with svn, they take forever.
  • Disk space – yes, disk space is cheap these days, but it does matter. A fresh “svn checkout” of CXF trunk takes about 225MB of space. A fresh “git clone” of CXF takes about 154Mb of space. The git version also has the advantage of having all the branches and tags in that 154MB of space. With svn, I need an additional 225MB for each tag/branch.
  • Works better with tools – thing like “grep -r” and “find . -name” and such work much better with git as there is only the top level “.git” dir, not a “.svn” all over the place. I had to create a bunch of silly wrappers to various things to make using those tools in svn easier.
  • All tags/branches are available – if someone posts a stack trace to a JIRA, it’s trivial to flip over to whatever tag they are reporting it against to see what lines the line numbers line up with. Takes just a couple seconds. No “svn checkout” of various tags (or keeping 225MB of space per tag around) or digging through fisheye or similar.
  • Saves me a TON of time by allowing me to test multiple “commits” together.

That last entry is really key. If you read my last blog post, you know I’m a firm believer in “DON’T BREAK THE BUILD”. The best way to achieve that is to run the full set of tests before committing any changes. However, the full CXF test suite takes a little over 1/2 hour to run on my machine. Thus, it’s not something you WANT to run on all the little changes. It kind of becomes a limiting factor with how many commits/changes you can do in a day if you always run it.

That’s where git-svn comes in. It’s brilliant. With svn, if you make a small change and then “svn commit”, it’s immediately sent to the central repository for all (and the CI builds) to grab. Thus, you BETTER have run all the tests. With “git commit -a”, you just commit the changes locally on your branch. Thus, I can make some changes, run just the unit tests and maybe a couple of related sys tests, commit the changes, then move to the next JIRA/bud, make some changes, run a few tests, commit, etc… Basically, collect the changes as individual commits in my local git branch. At the end of the day, run a full “mvn install” to make sure ALL the tests pass. If so, run “git svn dcommit” to push the changes back into SVN. The way “git svn dcommit” works is that each commit to the branch goes to SVN as an individual commit. Thus, each JIRA or other change that was worked on and committed locally appears in SVN as an individual commit. This is good as you may need to merge (or backout) just those individual changes. With SVN, I always ended up committing several things together as a single commit which made things harder to track/merge to the fixes branches and such. Separate commits also help boost your commit count. :-)

There are some downsides to using git-svn:

  • The egit eclipse plugin sucks, even compared to the subversion eclipse plugins. Call it a “work in progress”.
  • Merge tracking – for CXF, we’ve decided to use the svnmerge.py script to track merges between the fixes branches. This doesn’t work with git so I still need the fixes branches checked out to do the merging. Ideally, everything would be “pure git” and we could all use the git merging, but that day isn’t going to come any time soon. :-(
  • No integration with maven release plugin – I have no idea how the release plugin would deal with git-svn. Releases still need a “pure” svn checkout.

Anyway, I’ve started pretty much using git-svn for most of my work. I’m definitely happy with it. I’d be happier if Apache would allow us to go 100% git and not have the svn repo, but for now, this is certainly better than svn.

Throughout my career as a developer, one “mantra” that has been deeply ingrained into my brain is “commit away, but DON’T BREAK THE BUILD!”. Breaking the build can include things like breaking checkstyle/pmd checks, committing code that doesn’t even compile, having unit/system test failures, sticking dependencies in the poms that don’t exist in declared repos (example: depending on a SNAPSHOT you built locally) , etc… Bunches of things.

Breaking a build on something you’re the only one working on is usually not a huge issue. Just commit a fix at some point and no-one will ever know. However, when working with a large team or working on OpenSource where people all over the world could be building it, break a build can be a serious issue. If the build is broken, you can easily have MANY engineers wasting a lot of time trying to debug something they shouldn’t be. That can be quite “expensive”.

For example, if I run the tests and see a test failure, I assume one of my changes is the cause of that. Thus, I start debugging and try and figure out what I did. I shouldn’t be trying to debug into tests that aren’t caused by my changes. The code base should be stable and just work.

Unfortunately and apparently, there are a lot of people that don’t believe the same as I do. The Hudson Continuous Integration Game plugin provides an interesting way to see who believes what. Basically, for each build done in Hudson, the plugin assigns a score. If the build succeeds cleanly, all developers that contributed changes get a point. If the build fails spectacularly (fails to even compile), it’s -10 points. A failing unit test is a minus point. Fixing a failing test is a plus point. etc… Thus, over time, people that tend to break things end up with less points (even negative) and those that tend to fix things and/or commit clean code end up positive. Obviously, it’s not perfect. People that commit a LOT can earn higher scores as they can get one point per commit. I commit a couple times a day. Thus, I have potential to get more points than someone who only commits a couple times a week.

Looking at the Apache Hudson Instance Leader Board, you can see quite a range of scores. IMO, there are entirely too many people with negative scores. Something for those people to start working on. Get to work! :-)

This past week, the Apache CXF team released the latest patch for the 2.2.x series: 2.2.2. Normally, patch releases aren’t very exciting. Usually just a bunch of bug fixes. However, this release provides two extremely noteworthy bullets:

  • JAX-RS 1.0 – 2.2.2 is the first release of Apache CXF to pass the JAX-RS 1.0 TCK. The 2.1.x versions of Apache CXF introduced some preliminary versions of JAX-RS based around the 0.6 and 0.8 versions of JAX-RS. 2.2.0 updated the basica API’s to 1.0 level, but was not fully JAX-RS 1.0 compliant. We finally got access to the TCK a short while ago and 2.2.2 includes all the patches and fixes necessary to get CXF to pass the 1.0 TCK. We still have a bunch of ideas and plans to make the REST/JAX-RS support in CXF even better, but passing the TCK is an exciting milestone.
  • JBoss-WS – the JBoss WebServices team released JBossWS-CXF 3.1.2 based on Apache CXF 2.2.2. This release of JBossWS-CXF is the first to completely pass the various JAX-WS/JWS/SAAJ/JAXR parts of the J2EE CTS/TCK. This is just the first results of the JBoss/CXF collaboration. To achieve this, JBoss did identify and submit patches for several issues in CXF. They also done extensive testing with their own stack, .NET, and others to make sure CXF will completely meet their needs. JBossWS-CXF 3.1.2 is a result of all of that, but it’s also just a beginning. Now that the TCK is passing, we hope to expand the collaboration into more than just “tck bug fixes” with new features, new ideas, etc…

Anyway, definitely another exciting week for Apache CXF. Many thanks go out to the entire Apache CXF team, the JBoss folks that identified and fixed issues, and the Progress FUSE team for helping with the testing and development.

Last week, we went on a vacation to Aruba. In general, the vacation was definitely a nice getaway from all the work and stuff that’s been keeping me busy for the last several months. Generally pleasant and relaxing.

However, there was one little “issue” that was kind of a negative on the vacation: a trip the Aruba Emergency Room. ER trips are definitely not something you like to deal with on vacations. In this case, my youngest son Nathan (10 months old) did not drink a bottle or really eat anything for over a day and a half. That’s very unusual for him and with the heat in Aruba, we were very concerned and decided an ER trip was warranted. Turns out that was a good call as he had “Acute Tonsillitis” (basically, a throat infection) and required some antibiotics and pain meds. Within a couple days, he was somewhat back to normal so the meds were definitely the right solution.

This was the second vacation in a row that ended up with an ER visit for Nathan. Our Christmas trip to Florida to visit my parents ended up with an ER visit (on Christmas day even) due to an ear infection. Generally, Nathan is very healthy (much healthier than Ryan was at that age). He just times his sickness to coincide with trips. Gotta love him.

This was my first experience with a Non-US emergency room. Actually, first Non-US medical care experience. Definitely different than what I’m used to. The first difference was very immediate: to even drive onto the hospital campus, you had to pass through a security checkpoint that took your name and “reason” for being there. From there, the security guard directed you to a secondary gate depending on your destination. (ER parking has a gate, outpatient has a gate, etc….) I’ve never seen that at a hospital. I’ve always just drove in, parked, walked in.

The next set of “strange happenings” was the check in procedure. There was an “outside” window for “registration” (kind of like a ticket booth) where you had to go to register. Again, this is outside in the Aruba heat. We’re not into the waiting room yet. After that, we had to go to a cashier window (again, like another outside ticket booth) to pay a $90US “down payment”. Once that was done, we could then sit in the air conditioned waiting room. I’m just so used to having all of that being IN the waiting room area. Kind of strange. A little while later, the triage nurse called our name to then take temperature and get additional history information and all that. Then back to the waiting room.

The actual ER rooms and the ER experience with the doctor was pretty much the same as in the states. No major issues there at all. Relatively pleasant.

However, the NEXT interesting thing happened when the doctor wrote the prescription for the meds and was preparing to discharge us. She didn’t hand them to me. Instead, they went into the file. To get them, I had to go back to the cashier and pay the remaining balance (another $19US). When the account was settled, they gave us the prescriptions. Definitely didn’t expect that.

In general, it wasn’t bad, just different. On a positive note, the whole ER visit just cost $109US. I don’t think an ER visit anywhere in the states would be that low. I need to figure out how to submit that to my insurance and stuff, but in general, pretty cheap.

I bought my wife a Kindle 2 as an early birthday/mothers day present. I gave it to her a bit early so that she could use it for our vacation to Aruba. It’s definitely a nice little gadget. I’m quite impressed. Excellent battery life. Very easy to read, even one handed. That’s perfect when trying to snuggle an sick infant to sleep.

Julie generally reads about 2 or 3 books a week. More on vacation. Thus, the Kindle helped save a bit of space/weight in the luggage. (important now that they charge $50/bag if you go over their weight limit) Most of what she reads she checks out of the library. However, she does purchase quite a bit as well, especially for just released additions to the series she reads. Those tend to be the expensive hard back versions. Thus, long term, it may save some money, though I doubt it.

I guess the real loser in this will be the Framingham Public Library. They always ended up with the books she purchased when she was done with them. Sorry!

For the last couple of days, Ryan, my oldest son, hasn’t been calling me Daddy. He’s just referring to me as “Dad”. I’m not exactly sure where he picked that up. Probably day care. (always blame everything on day care. Somehow, it’s always their fault) I knew this day would come, I just didn’t expect it so soon. He’s not even 3 yet!

I must admit, it’s quite “strange” to hear him say it. Caught me COMPLETELY off guard the first time he did it. Almost laughed.

Sigh….. they grow up SOOO quick.

:-(

….but sometimes I have to wonder.

I really do live in a pretty tightly packed residential area. Lot sizes around a 1/4 acre or so. But once in a while, I really do have to wonder. We’ve lived in the house for close to 9 years now. In that time, we’ve encountered:

1) 3 separate instances where my dogs (2 cocker spaniels) have cornered skunks in the back yard. Yea, not fun. You think the dogs would learn, but NOOOOoo….. “Black and white cats in my yard. Must Attack!!!!”

2) A pack of wolves (yes a pack of wolves) killed a dog up the street. An emergency alert went out so we had to keep the dogs inside for while.

3) One night, one of my dogs brought a possum into the house. (they have a dog door so they can come and go. Brought him right in through the door) Luckily it was just a possum that just played dead on the living room floor until I got a shovel to move it outside.

4) Yesterday, when we left to head out to see “grandma” in the morning, a racoon apparently snuck into the garage and got trapped there when we closed the door to leave. Got into the dog food, trash, and probably the supply of ant/mouse traps. When we came home and opened the door, trash was all over the floor and the coon was dead in the middle of a pile of dog food. Not sure if he ate himself to death or did get into the mouse/ant traps or what.

Kind of scary actually. We opened the garage door when Julie took Ryan out to the car to get him buckled in and get his dvd playing. She left the car door open and stepped back into the house to get Nathan. The coon could have jumped right in.

I just noticed that I’m at the very top of the Apache Hudson instance leader board: http://hudson.zones.apache.org/hudson/cigame/. I’m not really sure what that implies. Maybe I spend too much time fixing builds. Maybe I write good code. Maybe I commit too often. Don’t really know

Of course, by the time you read this, I’ll probably have committed something that breaks everything and I could be in last place. At least for now, I’m at the top!

:-)

The deadline for students to submit proposals for Google Summer of Code is fast approaching. Students really should be getting their proposals submitted. If you are still looking for ideas, definitely look at the list at Apache. There are a lot of good ideas there, but coming up with your own ideas is also a great differentiator.

When looking at Apache ideas, one thing to keep in mind is that when “scoring” your proposal, whether the student has interacted with the dev community during the proposal writing is considered as part of the score. Apache is all about the community so making sure the student is engaging with the community is important.

Of course, I definitely recommend students look at the ideas for CXF, ServiceMix, and Camel. High quality projects with very good communities behind them.

I’ve had the WORST luck with return flights lately. My last three trips ALL had issues with the return flights.

It started over Christmas for our flight back from Ft. Lauderdale. I got an email the night before saying our flight was canceled. That’s never a good thing. I called JetBlue and they did get us on a flight 3 hours earlier. However, when we got to the airport, that flight was delayed. We ended up taking off roughly the same time as our original flight. Basically, had to spend a few extra hours in the airport with a 2 year old and a 6 month old. In this case, the cancellation/delays were weather related (huge snowstorm in the northeast) so not really something that the Airline could be faulted for.

The flight back from The Server Side Java Symposium in Vegas on the 20th also ended up being delayed. I had specifically grabbed the 11pm red-eye from Vegas to Boston so that I could be back home by 9am on Saturday to take my kids to swimming lessons. However, the plane had a “water leak in one of the Galleys” and it didn’t end up taking off till about 1am. Didn’t get back in time, kids missed their lesson. :-( To JetBlue’s credit, they DID send out a travel credit due to the delay not being weather related.

Then, last Friday, I was flying back from Emerging Technologies conference in Philly and, once again, delay. I had planned to get back home right at 8:30 which is when my kids go to bed so I could say good night. That didn’t happen. This was a “two part” delay. The plane was late getting there due to weather conditions someplace. However, even after it got there and we boarded, we ended up sitting for another half hour or so because the “safety seal” on the Fire Extinguisher has broke and we had to wait for maintenance to swap it out. Ended up getting home at 10:15. Not a thing from US-Air, possibly because the original delay was weather related.

So, if you are planning to travel someplace, make sure you and I aren’t on the same return flight. :-)