Thursday, December 15, 2005

Damn Right, I've Got the Blues

This is just wrong. I was browsing through iTunes' Blues section and found this album cover.

Monday, December 12, 2005

Crash Course in Brain Surgery

As I've stated in a couple of previous posts, I am using Agile development methodologies. I'm not using one particular discipline, but my own Frankenstein creation that borrows from Scrum, Crystal Clear and XP. I thought I would share a few of the books I found useful with my 2, no make that 3 readers. After getting a comment from a guy I used to work with, I discovered I had 3 readers. Anyway, here are 3 of the books that really helped me discover Agile development...

Crystal Clear: A Human-Powered Methodology for Small Teams by Alistair Cockburn
User Stories Applied by Mike Cohn
Agile Project Management with Scrum by Ken Schwaber

I also have Agile Project Management by Jim Highsmith which I have not finished yet. So far, it's been a little tougher to read than the others.

I am starting to work on a series of articles on unit testing. I'm not sure how often I will post them here, but be looking for the first one next week.

This is not a paid endorsement, I am not an affiliate of Amazon.

Listening: 'Til the Day I Die - Third Day

Friday, December 09, 2005

Key to the Highway

I understand that HOV lanes are a big hit in some areas, such as L.A. and other big cities. There is even talk of allowing single occupied vehicles access to the lanes via a toll, which would be a moving price based on demand. Here in Nashville, single occupied vehicles don't have to pay a toll to ride in the HOV lane. They just do it. And there is no penalty for this action because there is no enforcement of the law.

I don't like HOV lanes. I believe they make traffic worse, not better. And the impact on the environment is negligible at best. Every driver is paying for the interstate system, yet we are not allowed to use certain lanes at certain times of the day. And for those of us that do follow the law, we must deal with three different types of asshats on the roads.

Asshat #1 - The person just flat out ignores the HOV lane signs. This is the guy who just doesn't care about the signs. That is, until they are getting ready to pass a cop. Which is very rare, because the police never watch for HOV lane violators and if an officer happens to be on the interstate, they are usually going faster than everyone else, so the violator never catches up to them. This morning I saw the king of these asshats. He whizzes past at about 85 in the HOV lane, obviously alone in his Buick Rendevouz. It has dealer plates, so the guy is probably a car salesman, which already makes him an asshat. He comes up behind a car going 65 in the HOV lane (see next paragraph) and proceeds to tailgate the offending car. I don't mean a "I’m a slightly unsafe distance from your car" tailgating, I mean a "stuntman can jump from my hood to your trunk" tailgating. I pass both of them in the lane next to the HOV lane. He squeezes between me and the car, rides my bumper until he gets around and starts to try to squeeze back to the left lane, getting very close to my bumper. I, of course, let off the gas so the gap doesn't widen as quick as he estimated, but he missed me.

Asshat #2 - The person who thinks because they have 2 people in the car, they MUST ride in the HOV lane. Okay, the idea behind the HOV lane is that when traffic gets heavy, those who are carpooling can ride in a less congested lane, thereby going faster than other traffic. If regular traffic is going as fast as the HOV lane, there's no reason to ride in it, if you are planning on going slower than traffic. That is what the right hand lane is for. The person who was being tailgated in the above example was this type of asshat. She was going 65 (the speed limit is 70) in the far left lane when just about everyone else was going 70. Tennessee (and most other states) specify that slower traffic must keep right. Which leads us to our final asshat type (at least for today).

Asshat #3 - The person who drives slow in the left most, non-HOV lane. When the HOV lane is in effect, the lane next to it should become the "left" lane for single occupied vehicles. For example, there are 4 lanes at one point of my commute. Starting with 1 for the right lane, you would have 4 3 2 1. 4 is the HOV lane. So 3 should be the "fast" lane for non-HOV cars. Some people don't get this. They driver slower than traffic in that lane. I can't pass on the left without breaking the law and I can't pass on the right because they get people seem to get a herd mentality on the interstate where they want to drive in tight packs with other drivers.

If you are one of these types of asshats, pay attention to your driving! Quit shaving, putting on makeup, eating, talking on the phone, reading the newspaper, reading a book or sending e-mail* and drive!

*Yes, I've seen all of those things being done by someone while driving.

Listening: Trip Through Your Wires - U2

Friday, December 02, 2005

Practice What You Preach

Creating software is all about delivering value to the customer. By focusing on features of the software instead of framework, you are free to concentrate on delivering that value. Your users don't care about your object model or customizable database schema. They care about what the software DOES and how they interact with it.

You may be creating software that uses all the latest buzz words and is a technological marvel, but unless your customer getting more value from these technologies, it is pointless. I realize they may not realize immediate value, because some decisions are made to make the software more customizable or flexible in the future. But if all you are doing is pulling data from a database (which is what 90% of all applications I've ever worked on were doing), you don't need to spend the next year creating a distributed database engine with 456 abstract classes that are the basis for on-the-fly generated code to handle XML in Swahili*.

Business software development is not an academic exercise. Just like a manufacturer who produces widgets to sell to Wal-Mart, we must create software that gives the user more value than it cost them to purchase our software. So, quit reading this and go write something useful. Unless you are not a developer, then go do whatever it is that you do. Just stay away from Microsoft Access©.

*unless Swahili support is on the feature list

Listening: On Any Other Day - The Police

Wednesday, November 23, 2005

Working Too Hard

The past few weeks have been very busy at work. The good thing is, it has been very productive. I feel like we are starting to get a handle on agile development and we are seeing pretty good results.

Software development is very much a "what have you done for me lately?" career. It doesn't matter if you delivered your last project early and it wowed everyone. If your current project is late, you're in for it. I think we are getting back on track and agile is helping us deliver often, which shows our progress. At the end of August, we were given 4 projects and asked if we could deliver them all by the end of the year. 3 were small projects, one was big. As of right now, one has been delivered and is in use; one has been delivered and is in use, but still has some defects to fix (will be done by today); one has been completed, pending some requested changes from the demo, and will be in place and running by Dec 1; the other is in it's 2nd 2 week iteration with more features completed during the 1st than planned. Even though I feel like we can meet our goal, I will still be amazed if we reach it.

Happy Thanksgiving!

Listening: Would? - Alice in Chains

Thursday, November 17, 2005

Tuesday, November 15, 2005

A Fool Such As I

Sometimes I doubt my intelligence when writing code. This morning I was working along, writing code and tests, running them in nUnit. I added a new test and some code and suddenly got an error in nUnit:

nunit-gui.exe has encountered a problem and needs to close. We are sorry for the inconvenience.

If you were in the middle of something, the information you were working on might be lost.

I had the option to Debug or Close. I closed it, looked at my test and didn't see anything out of whack, so I tried it again. Same issue. So the next time I chose to Debug. I loaded it into my open copy of VS 2005 and got the message below.

This was on the code in my service that the unit test was calling. So I look at the code a little closer.

public DataSet GetPrimeInvoices(string employeeCode)


return this.GetPrimeInvoices(employeeCode);


See anything wrong with that?

The function I was calling was an overload of another function that took 2 parameters. I forgot to add the 2nd parameter to the call, so it was just calling itself until it crashed. I added the 2nd parameter

public DataSet GetPrimeInvoices(string employeeCode)


return this.GetPrimeInvoices(employeeCode, Level.ProjectManager);


I reran my tests and got the beautiful green dot...

Listening: Mr. Soul - Rush

Friday, November 11, 2005

Am I Evil?

I'm tired of the comment spam! So anyone who wants to comment will now have to use word verification. I'm sorry to my 2 readers that you will have to go through this ordeal, but I can't handle the spam anymore.

Now I will never have any comments because no one ever reads this except the spammers!

Listening: Fife and Drum - John Petrucci & Jordan Rudess

A Little Bit More

I predict future happiness for Americans if they can prevent the government from wasting the labors of the people under the pretense of taking care of them.
--Thomas Jefferson

I'm in a good mood today because I passed my 2nd Microsoft certification exam this morning (See my other blog). And now I can start reading the book I got from Amazon yesterday: User Stories Applied : For Agile Sotware Development by Mike Cohn.

Listening: My Black Cadillac - Lightnin' Hopkins

Thursday, October 13, 2005

Deleted Comments

You may see some comments that say they were deleted by the blog admin. I'm not censoring anyone, I just had some spammer try to pass off a advertisement as a comment.

Friday, June 24, 2005

A moment of silence...

Let us have a moment of silence for the death of private property rights. They have been on life support for a while now. Yesterday, the Supreme Court took them out behind the barn and finished them off.

I just read a story in my local paper about the cost of land in my area. There are people who bought land in the 50's and 60's for $100 an acre. That land is now selling to developers for $50,000 - $75,000 an acre. Now, the local government could just declare that building a neighborhood is better for the public good than having a farm or wooded area. The developers would no longer have to pay 50K per acre because they can just bribe an elected official (yes, that happens) and get it on the cheap.

This is just further evidence of our "government knows best" nanny state. The Constitution was written to protect the rights of individuals and to limit government. Where is the protection for the individual in this situation?

Friday, May 06, 2005

Gemini IssueTracker

I recently set up Gemini to be a part of my build system. Gemini is an awesome product. I am using SQL Server 2005 Beta 2 as my database and had some issues getting Gemini's DB setup script to work on 2005, but was able to easily fix them. Here are my notes...

Installed Gemini to local machine using Setup.msi and had no problems.

Ran SetupDB.msi and got this error for several stored procs…

Msg 4104, Level 16, State 1, Procedure gemini_getlut_1, Line 18

Multi-part identifier 'b.username' could not be bound.

Msg 104, Level 16, State 1, Procedure gemini_getlut_1, Line 18

ORDER BY items must appear in the select list if the statement contains

a UNION operator.

Contacted support via email at 2:07pm, received reply at 2:15pm (awesome support). Support said they do not support SQL Server 2005 yet, but that other customers had modified the install scripts to work. They did not say what changes those customers had made. So I opened the Create_Procs.sql script in Deploy\Step1_SQL_Database.

I edited the following stored procs…

  • gemini_getlut_1
  • gemini_getissueupdatedata
  • gemini_getlutentries
  • gemini_getxplutentries

I changed the order by clause for the union all to "username" instead of "b.username", i.e.

union all

select a.userid, b.firstname + N' ' + b.surname as username from projectresource a, users b

where a.projid=@projid and b.userid=a.userid and a.isactive = 'y'

order by b.username


union all

select a.userid, b.firstname + N' ' + b.surname as username from projectresource a, users b

where a.projid=@projid and b.userid=a.userid and a.isactive = 'y'

order by username

Ran the script file and everything installed correctly.

Logged in using admin/admin and created a new user with admin privileges.

To move to my build machine, I backed up the database and restored it on the target server. Installed the executables (setup.msi) to the target machine and edited the web.config to point to the new server. Also pointed web.config to SMTP server for e-mail.

Sorry for the incomplete sentences and any grammatical mistakes. I was just recording my steps in OneNote as I was working through the process and I am posting them unedited.

Friday, April 29, 2005

XML and

Wow, doesn't like XML. It doesn't support the code or pre tag at all. And in the XML file example below, the first two elements should be...

Project DefaultTargets="Build"


Target Name="Build"

For some reason it cut the words Project and Target off.

Continuous Integration with Visual Studio 2005

Working in a beta version of Visual Studio 2005 presented some challenges when attempting to use continuous (a.k.a. continual) integration. Several of the tools are not yet available in .Net 2.0 versions. And nAnt, the backbone of automated building, doesn't understand VS 2005 project or solution files. You could build your build file by hand, but since laziness is a vitue in programmers1 , I don't want to do that. I am going to create a series of articles covering CI with .Net 2.0. As I learn things, I will share them with you.

Automated Building

The backbone of continuous integration is automated building. This is the process that the CI server kicks off to build your code, run automated tests, document, deploy and whatever else you want to happen. Most systems currently use nAnt, which is a very powerful build system. When I started examining continuous integration, I downloaded nAnt and started testing with it. I quickly found that it does not understand Visual Studio 2005 solution files. I did not want to have to maintain two files everytime I added a new file to a project, so I looked at MSBuild, which ships with the .Net 2.0 framework. MSBuild not only understands VS 2005 solution files, it also allows you to execute different tasks and develop your own tasks just like nAnt. And since it comes with the framework, you do not have to have Visual Studio on your build machine.

If you just want to build your project and not execute any tasks, you simply execute MSBuild in your project's directory. If you run it with no parameters, it defaults to the .csproj file in the directory. If you have a solution with multiple projects, you can pass the solution filename as a command line parameter.

c:\buildsrc\TestSolution>MSBuild TestSolution.sln

This is just a very basic example of what MSBuild can do. You can pass properties on the command line also, so if you want to switch between Debug and Release, you can pass which configuration you want to use.

c:\buildsrc\TestSolution>MSBuild TestSolution.sln /p:Configuration=Debug

You could create a complex command line to pass to MSBuild and maintain it in your continuous integration configuration, but it is easier to create a .msbuild file for your project. This file can be used by MSBuild to not only build your project, but also to execute other tasks such as automated testing and documentation. A .msbuild file is a simple XML file. Here is a sample file.

< name="Build">
< !-- Clean, then rebuild entire solution -->
MSBuild Projects="Project.sln" Targets="Clean;Rebuild" />

< !-- Run nUnit-->

< !-- Run FxCop analysis -->
< command="FxCopCmd.exe /file:\buildsrc\Project\bin\debug\Project.dll /out:\buildsrc\Project\Project.FxCop.xml" workingdirectory="\buildtools\FxCop" continueonerror="true">

< !-- Run nDoc-->

< command="ndocconsole.exe \buildsrc\Project\bin\debug\Project.dll -documenter=MSDN -OutputDirectory=\buildsrc\doc\Project -OutputType=Web -Title=Project" workingdirectory="\buildtools\nDoc\bin\.net-1.1" continueonerror="false">

< /Target>
< /Project>

(Excuse the spaces between the <>

This file builds the solution (which includes two projects), runs my nUnit tests (outputting the results to XML for the continuous integration server), runs FxCop analysis (outputting the results to XML for the continuous integration server) and runs nDoc to document the code. The ContinueOnError property you see tells MSBuild whether or not to fail the build if the task returns an error code.

You must setup your continuous integration server to run the command line...

MSBuild TestSolution.msbuild

I am using CruiseControl.Net as my CI server. One thing you must do with ccnet is use the command line builder task. There is a MSBuild builder task in development, so as soon as that comes out, I will switch to it. The one drawback to using the command line builder is that it does not pass the build label to MSBuild like it does with nAnt. This limits the ability of the build process to use the build label in the version number. I have written a MSBuild task (I'll cover that in another article) that generates an AssemblyInfo.cs file so I can generate the version number at build time. However, there is no way in ccnet to pass it to the command line builder. That has been my biggest complaint about ccnet. Obviously, the build label is stored somewhere because it passes it to nAnt, why not make it available via an environment variable or some other method so I can access it from MSBuild? Hopefully the MSBuild builder type will fix this problem. For now, I just have my version information hard coded. Nothing has gone to production yet, so it's not an issue at this time.

I am still learning the powers of MSBuild. I believe it will soon be comparable to nAnt in features. The MSBuild team is using Scrum as their development methodology and you can read Chris Flaat's (MSBuild team member)blog about what is going on with the project.

1 Larry Wall, Programming Perl, O'Reilly & Associates, 1991

Thursday, March 24, 2005


Hey MediaPlay, just drop the "Computer Manuals" section of your book department. It's a joke. In fact, your whole book department is a joke. I stopped in last night looking for a project management book. I'm used to Borders, where the books are arranged by topic. So if I want a book on C#, I start in the programming section, find the C# section and all of the books on C# are right there together. So I start scanning titles looking for something about project management to get a starting point. There's "Absolute Beginner's Guide to VB.Net", next is a book on Photoshop, next is one on QuickBooks. I think, "these aren't grouped by subject, they must be in alpha order by author." Let's see, T, D, L, O; nope! Alpha by title? Not a chance. Publisher? Nyet. Color? Height? Number of pages? Price? Anything? Not a thing. They were in no discernable order. Now when I go to a used book store, I'm willing to browse through looking for that great find, or even at retail stores when they have their bargain table. But not when I'm going to pay full list price. They may have had the perfect project management book (although I doubt it, the entire section took up about 5 shelves that were maybe 10 feet long), but I'm not going to waste my time looking at every book in there.

Click the time below to get a trackback URL.

Wednesday, February 16, 2005

Police Pursuit

Why is that every time some worthless criminal runs from the cops in a high speed pursuit and causes a wreck, the police get blamed? The state troopers were not involved in the wreck, the guy they were chasing caused it. He is the one to blame for this. If the police had a policy to back off anytime a chase hit a certain speed, then a lot more people would run from the cops, endangering all of us.

And the guy who is suing the THP? He's a 50 year old gas station cashier and he's asking for $1.5 million? Come on! What's he make, $8 an hour? So if he never works again, he's going to be out about $250,000. Throw in the cost of the van ($20,000) and the medical bills and you're at $500,000 tops. This guy got hooked up w/ a lawyer (Bart Durham is one of those local firms that advertises on daytime TV about personal injury cases) and they started talking about more money than he would ever earn in his lifetime, so he signed up for the lawsuit. Why aren't they suing the guy who actually hit him? Because Javon Palmer (the man running from THP) doesn't have $1.5 million. Legal wisdom says you sue the party with money, even if it's not their fault.

And what about Javon Palmer? Why did he run? His reason: "I got no license."


Palmer has a long history of driving without a license and evading arrest, with more than 28 such charges since 1996

This guy does this all the time. The police cannot just let people get away with running. If they start doing that, more people will drive dangerously to get police to back off.

Friday, January 14, 2005

TennCare redux

320,000 to lose TennCare insurance

The local newspapers and TV are going crazy with the TennCare coverage. They are profiling some of the people who may lose their coverage. Why aren't they profiling the people who live in other states that are on TennCare illegally? What about the ones who lie about their income so they can get coverage, or the ones who turn down coverage from their job and get TennCare because it's cheaper and has more benefits? What about the people who are willfully unemployed? Why not profile all the crooks and scam artists?

And what people don't seem to remember is that 10 years ago before TennCare was instituted, these people didn't have any coverage. TennCare was covering people who were uninsurable and didn't qualify for Medicade. Some of those people are going to lose their coverage and that's really sad, but they didn't have it 10 years ago and TennCare has failed miserably because of fraud and abuse.

This type of program will never work. They have attempted to take private enterprise style insurance and make it a government program. The problem here is that in the private enterprise, the risk is spread among all the participants. A medical insurance plan will have some members that are health, others that are sick. For example, in the 14 years I've been an adult, I've never used more in insurance benefits than I've paid in premiums. There are some members who use more in benefits than they pay in premiums. But it balances out in the end. Government programs like TennCare are only helping the sick. TennCare collected premiums from some of the members, but these were the uninsurable that use far more resources than they pay for. Also, private insurance usually has some type of deductible or copay. Many TennCare recipients had no copay at all. Everything was free. The copay encourages conservation and preventative healthcare. It only costs me $20 to go to the doctor's office, but $75 to go to the emergency room. So I'm only going to the emergency room in a true emergency. If I have the flu, I'm going to wait until the next morning and go see my doctor. If there is no difference in cost between an office visit and an emergency room visit, TennCare users would just go to the emergency room for minor stuff.

Personally, I'm glad TennCare is getting cutoff. I feel compassion for those that will not have insurance, and I hope they seek out charitable organizations for help. But government is not the solution to their problems.

Friday, January 07, 2005

MCSD Diary

I haven't updated in a while, so I have no business creating a new blog, but I'm doing it anyway. I decided to get my MCSD certification and am keeping a diary of my progress. Updates there won't be as lengthy as my news commentary, so maybe I will update it more often.

Here's the link...

And the RSS Feed