March 24, 2008

Best Practices

An oldy, but a goody, one that I haven’t seen before.

One comment I saw recently was “it means ‘practices of the best’” - as in “the things that the best software developers/consultants do”.

I don’t find that argument particularly persuasive.  For several reasons:

  1. No one knows who the very “best” software developer is.
  2. No one even knows who the very best software developer is, in a particular practice area.
  3. Even if we could magically discern who the best software developer was, it is very likely that:
  • Her approach would be highly tuned to the specific company/organization she was with
  • She would have a hard time elaborating and generalizing her approach without diluting its effectiveness
  • Others would point at this poor developer and say “She is only an expert on Y in situation X, but we are in situation Z”

So while I think it is an interesting concept (practices of the best), I can’t acept that interpretation as being any more valid than “the best way to solve this problem”.

Stelligent

To keep everyone in the loop, I’ve taken a job at Stelligent, which is an agile consulting company in Reston, VA.   They have a neat focus on infrastructure instead of process, and since that’s where many of my philosophical struggles with Agile are, I’m excited at the prospect of sharing what I have learned, and learning some new ways to solve some of the sticky wickets of Agile development.

Also, my boss, Andy Glover, is an avid triathlete, which gives us something to talk about at lunch.

Versioning a Hudson job configuration

Let’s say you’re using Hudson as your build/Continuous Integration tool. And let’s assume you have some jobs running inside Hudson that you want to keep running, even if the build machine blows up. You probably want to maintain:

  • Hudson itself
  • All the plugins
  • The overall configuration
  • The per-job configuration

Naturally, then, your thoughts should turn to “How do I put the Hudson configuration into source control?” Here’s what you do:

  1. Make sure your builds are configured and working to your satisfaction, in a directory that I will from now on refer to as HUDSON_HOME.
  2. Copy the entire HUDSON_HOME directory tree to a temporary location called “versioned_build”
    1. In the versioned_build directory, you’ll find the jobs directory, and under that, a directory for each job.
    2. Inside each job directory, you’ll find configuration .xml files and other miscellaneous files, and you’ll find two subdirectories:
      • workspace
      • builds
    3. Empty those two subdirectories of all files, but do not delete the subdirectories.
  3. Repeat this “clean out” process for each job.
  4. import the entire “versioned_build” directory tree into source management.

Now, you have your Hudson configuration in source control. You can start it up, and assuming HUDSON_HOME is set right (see below), you should see your dashboard, and your jobs listed, and properly configured.

Issues

  • You may have to manually kick off your jobs to “prime the pump”
  • Your build number will not start at 0 unless you do not archive the nextBuildNumber file
  • Your HUDSON_HOME environment variable may be incorrect for your machine (see below)

HUDSON_HOME Portability

For ease of checkout and maintenance, I like the following directory setup:

$HUDSON_HOME/

  • hudson/
    • hudson.war
  • jobs/
    • Your Hudson Jobs Here
  • plugins/
    • Your Hudson Plugins Here

Using this configuration, you can create a file in $HUDSON_HOME called, say, hudson.sh, which would look a little something like this:


#!/bin/sh

export HUDSON_HOME=.

export CVS_RSH=/usr/bin/ssh

java -jar hudson/hudson.war



Using this structure, and that hudson.sh script (I presume you can do something similar in Windows) gives you the following benefits:

  1. Your entire Hudson system, including the Hudson war file and the launcher script are all maintained as part of the repository.
  2. You don’t have to set HUDSON_HOME whenever you check the system out of source control - it’s already set by default to the current directory. As long as you run hudson.sh in its own directory, you’ll get the correct value for HUDSON_HOME

Learn from my mistakes!

  • Unless you absolutely must, don’t tell Hudson where to find Ant or the JDK. If they’re on your path, Hudson will find them on its own. If you set them for your build machine, chances are that on the checkout machine they won’t be in exactly the same place
March 17, 2008

More on CruiseControl Dashboard

It took me about an hour and a half to get the dashboard configured properly.  Here’s what I had to do:

  1. I had to copy all of the cruisecontrol jars and all tornei poker on lineworld pokerpoker italiagame on line pokerdownload live pokerstrip poker livesrtip poker gratisgiochi cartepoker scaricabili gratistexas holdem calculator,texas holdem,poker texas holdemtexas holdem italiastreap pokerpoker in tourseven card stud onlinegiochi on line pokergiocare texas holdem online,poker texas holdem online,texas holdem onlineparty poker bonus,poker con bonus,poker bonusstreet poker onlinesexi poker onlinesexy poker onlinehow to play pokergioco carte pokerpoker carte gratistornei di poker gratisonline poker gameparty poker bonuscraps in lineavirtual gamblingscaricare casino gratisonline casino gamesbonus dei casinogioco keno gratiscasino on line roulette,roulette on line,giochi on line roulettegiochi keno inlineagiochi casino pcsistemi roulettecasino tropezgioco craps in lineawww giochi casinoblog casino onlinekeno inlineacasino poker gratisbest casino onlineautomatic video pokercasino tropez bonus codegiochi video pokerroulette strategyrisposte eurobarre casino on netvincere casino onlinelista casino online of the xml-related jars (saxon, jdom, xerces, xml*) into the WEB-INF/lib directory of the dashboard war
  2. I had to update WEB-INF/web.xml and add a context-param to specify the location of the config-xml file.

Note: You might think that you can give it the correct filename at the web interface, but that never worked for me, no matter how I tried to tweak it.

At the end of the day, cruisecontrol requires a great deal of by-hand tweaking to get it to work for your project.  That’s not necessarily the end of the world, but it is a little disconcerting, since the documentation isn’t really clear about how you do this setup, where and so forth.

CruiseControl….

Well, I’m having a bit of an adventure with CruiseControl.  Some tips, perhaps just for myself:

  1. You have to check your project out of source control into the appropriate checkout directory under the cruisecontrol/ build directory before CruiseControl proper will consider building it.
  2. You have to merge unit test results in by hand
  3. You have to set up your dashboard by hand, and (at least as of today) you have to find the missing classes that it needs and include them

More later…

Groovy: no such property: X for class Y

Having taken up the task of learning Groovy, I stumbled early, as I tried to figure out how to integrate groovy-based unit tests with my java code. I had a java class called ContactScreen, and I wrote a groovy test case:

class ContactScreenTest extends GroovyTestCase {
    void testStandardEmailScreen() {
       screen = ContactHelper.getStandardContactScreen( Contact.EMAIL )
       assertTrue( screen instanceof AnyDayEmailScreen )
    }
}

Which failed when I tried to run it via Eclipse, giving the following error:

testStandardEmailScreen(ContactScreenTest)groovy.lang.MissingPropertyException: No such property: screen for class: ContactScreenTest

I stared at that error for a long time, wondering what the heck it meant. I mean, I’ve seen all sorts of example groovy scripts that don’t require definitions. In fact, the code I was modeling mine after used this very format. What is going on?

Finally, I turned to the groovy user group to help debug my groovy test case. Here’s what I found:

  1. The code I was looking at, circa 2004, is now victim to a fairly significant shift in language specification. In other words, it won’t compile anymore.
  2. The rules for declaring variables is different for scripts versus classes. In other words, if you are just running a script, you don’t need to declare variables. If you are building a class, you have to declare the members of the class via def.

So the working code looks like this:

class ContactScreenTest extends GroovyTestCase {
 void testStandardEmailScreen() {
 	def screen = ContactHelper.getStandardContactScreen( Contact.EMAIL )
 	assertTrue( screen instanceof AnyDayEmailScreen )
 }
}
March 14, 2008

Retro

The latest in retro gadgets.  What… they couldn’t put this in a shoe?

Can you imagine the looks you’d get, walking down the street, talking on one of those.

What retro gadget can you come up with?

This is cool

Visit this page: http://css-tricks.com/examples/StarryNight/

and once you get there, resize your browser. What a trippy effect.

March 11, 2008

Battlestar Galactica -> April 4th

The final season of BG starts April 4th.  Visiting the Battlestar G. page at Scifi gives you the opportunity for an 8-minute recap of the story so far, and an interesting picture at the bottom, with fairly disturbing implications if taken literally.

But should we take it literally?  What was the intent of the artist?     For all we know, it’s just a joke, and not to be taken seriously.  Maybe its deliberately deceptive, to lead you astray.  Maybe it’s just a cool picture, with no real meaning at all.  Most people look at a design and make snap judgments about what it means, and how to interpret what they see.     Be careful what you draw from pictures like this, because it may not lead you where you need to go.

Without being able to have a conversation with the artist/visionary/designer, it’s not really possible to know.    And that has implications in software development as well.

March 5, 2008

Global Warming, Global Government

The only way to truly manage global warming is if we establish a global government with the power to control every human’s carbon emissions.    Anything less than this, and it falls apart, because any individual nation-state’s ability to self-manage will be taken advantage of by other nation-states.   See: The Mote in God’s Eye.

Discuss!

Gary Gygax and the Early days…

Gary Gygax affected my life quite a bit, affecting my imagination, my understanding of statistics, rules, processes, probability, ethics and many, many other areas.     One thing I have noticed is many people are celebrating how his work in the early days paved the path for the world of RPGs and MMOs today.

Don’t get me wrong, this is absolutely true, but one thing that I feel a need to stress is that it is always the early days.   Now, today, right this minute is the “early days” for some other major shift in the way a chunk of people think about the world.    This is the world in which you live - one where new ideas are constantly bubbling and frothing, and every month of every year provides an opportunity for someone to invent the next big thing.

Why can’t you be the person who came up with that next big idea?  Gary was in his 30s when he and Dave Arneson developed the ideas behind D&D.  And labored at it for years before it became successful.

March 4, 2008

Truer words…

This is an exceptionally precise recipe. And differs only in spirit from the way my wife and I got together.

The corollary for geek guys who want to meet regular girls? Go tutor math at the local elementary school. You’ll be snapped up *edit* - by an unmarried mom or teacher - in no time.