The Johnson Blog

Ramblings of a geek with a few hobbies…

Tag: Development

  • Note to self: software idea

    I would like a software product that would allow me to define “profiles” of windows services to be running or stopped.  For instance, there are times when I’m not on my LAN at home and want to code on my laptop.  That entails having my sql server instance up and running.  But I don’t want it running the vast majority of the times hogging resources.

    So if I could have this little app and just click a button to start/stop a group of services, that’d be great.

  • Current Book

    I am reading Code Complete, 2nd Edition (great Valentine’s Day gift Ana! 😉 and must say that it’s much better and far more interesting than I expected it to be. I thought of it as being one of those books that you just have to read, but would probably be a chore to do so. Boy was I wrong.

    If you’re in the business of writing software, you DO have to read this. It isn’t a high-level, software design book. Instead, it’s all about the small things you do and decisions you make at the mundane levels of coding – the naming of methods, size of methods, general formatting, comments, etc.

    It’s great to see this stuff written down.  In the time I’ve been coding, I’ve noticed myself continually refining my style and gradually honing in on many of the techniques and suggestions recommended in this book.  Now that I’ve seen it written down, I can have more confidence in my style – that it isn’t just my gut feeling about how the code should be written.

    I think that if I were running my own shop, I’d put this on a mandatory reading list for all of my developers.   It would fit in nicely with The Pragmatic Programmer and result in better code by better developers.

  • Visual Studio on Vista

    As mentioned I installed Vista on my new desktop, since I have been running it on my laptop with Visual Studio for a month now without any real problems. Go figure, I ran into an issue that has been bugging me for the past couple days.

    The symptoms are as follows:

    • Every time I start VS, it prompts me for which initial environment I’d like to use (C#, C++, etc).
    • If I look at Tools..Options..Import/Export Settings, the settings file path doesn’t include a drive and root directory – it’s just Visual Studio 2005/Settings/CurrentSettings.vssettings.
    • If I go to that Import/Export Settings screen and then try to leave it without changing anything, it blows up regarding the messed up path.
    • Each time I exit and re-enter VS and view that setting, it has appended a new number to the filename. Sure enough, I can see lots of those files being created.

    The problem?

    It turns out that VS didn’t like the fact that I changed the Location of my Documents folder to point to a network share. Pretty odd behavior though, glad I remembered I made that change.

  • Visual Studio followup

    Just a little follow-up regarding my issue with Visual Studio 2005 and Vista – I was able to make the problem go away by installing a hotfix for KB912019.

  • Vista and Visual Studio 2005

    I knew I was taking a slight risk installing Vista on my laptop, where I do quite a bit of my coding.  I’m having a big problem with the Chef solution in Vista – it compiles and runs just fine but in the Visual Studio IDE I cannot open the WinForm Designer for anything but the simple forms.  Scenarios I have that cause the designer to blow up:

    • System.Windows.Forms.Form derived form that references controls that reside in another, referenced assembly
    • UserControl that derives from another custom UserControl that resides in the same assembly, and which can be designed.

    I wonder how long this is going to take to get fixed.  I don’t see this issue on their “known issues” list, maybe I should dig around and find out how to submit it.

  • Strong Naming

    As a continuation of my last post, I thought some of you .net developers may be interested in hearing about some of the issues I ran into when strong naming.

    Admittedly, this is my first real attempt at using strong naming as it’s intended and therefore I just wasn’t aware of a few things when I was writing the code for Chef. Two days ago I created myself a strong name key (sn -k keyfile.snk) to sign my assemblies with. Due to the obfuscation step I need to do between compile and packaging, I need to delay sign the assemblies.

    In an exercise in curiosity I decided to sign the assemblies with the public key half of my keypair and keep the private key “secret”. Which really means just not kept inline with the sourcecode, but rather living in a key container in the machine store on the build box. This process was mostly problem-free, I used the sn.exe utility to: create a keypair; import the keypair into a key container; extract a public key from the key container; tell .NET to allow me to run partially signed assemblies with that public key token (sn -Vr *,) for debugging purposes. It all went well until I went into visual studio and told it to use the public key for signing – it kept telling me that it was password protected and prompting me for the password. I never put a password on it.

    So to get around that, I did the first step (creating the keypair) from Visual Studio and gave it a password, then it all worked just fine.

    One feature in Chef is the ability to create bookmarks. In my ignorance, I was simply using the BinaryFormatter in .NET and serializing to disk an array of these things for loading later. Little did I realize that all of the version information for the objects is written out – and if the objects live in a strong named assembly and the assembly version changes, it cannot deserialize! There’s supposed to be a way you can get around this, by setting AssemblyFormat on the formatter to Simple but it continued to write the version information. I also tried the route of using a custom Binder during deserialization and that didn’t work either.

    As a result, last night I rewrote that code to serialize/deserialize the information myself with XmlWriter and XPathDocument rather than rely on .NET. Version issues gone. That’ll definitely be something I’m not likely to forget anytime soon. I need to rewrite one other small area this weekend for a similar problem, then I can move on. All that’s standing between me and Beta 2 is some thorough testing, a website update, and a file upload. Should all happen this weekend.

  • Automated Builds

    Several hours today were spent advancing my automated build process for Chef. I’ve had CruiseControl.NET building the software for months now but I’ve had a gaping hole in the processes that has been staring at me since I started it.
    What is this hole you ask? Version numbering.

    Why is versioning so hard in this day and age? Seriously. With .NET there are all these really nice and easy attributes that all you have to do is type in the version string you want your assembly/binaries to have. That works really well, until you want those numbers to be dynamic – then it requires modifying a sourcecode file with a new hard coded string. But what about 1.0.*? you ask, referring to the ability to have the compiler generate parts of it for you. Well, what real good is it to have version numbers that you don’t control? If they get generated by the compiler it just makes everything difficult – like translating between a version label from CruiseControl to the state of source control at the time of the build. Maybe I’m missing something here, but I don’t think I am.

    Another versioning issue is setup projects. The setup projects created in Visual Studio have a version number, product code, and upgrade code. Counter to intuition, the upgrade code is the same across versions for a given product and it’s the product code that changes between versions. Sooo, if you bump the version number you also need to create a new Product Code guid. Again, there’s no way (that I know of) to do this via command-line. Microsoft thinks you should open the setup project and bump the version number manually. They even go as far as prompting you to create the new Product Code guid when you do this. Microsoft, the creator of the great tool that is Visual Studio, make it very hard to do the Right Thing and have automated builds. Tisk, tisk.
    And finally, the version string has implications on product keys – both generation and verification. For instance, if Suzie buys Chef 1.2, I need to have a way to have that license key work for 1.2.5, 1.4, and 1.9; but not 2.1. And I need to be able to forget about the details rather than think about it every single time I create a release. (Chef Beta 2 is days away, by the way).

    My solution to these problems required a little planning, a little coding, and a lot of time waiting for test builds to be created. My process is as follows.

    • I go to the CruiseControl.NET Dashboard website and click Force to initiate the build.
    • The last successful build label is incremented (from 0.9.2.2 to 0.9.2.3, for instance).
    • The latest sourcecode is retrieved from the Perforce depot
    • The code I wrote tonight gets executed on the sourcecode tree, passing in the newly incremented build number
    • A new product code guid is generated
    • Every AssemblyInfo.cs file is edited and all AssemblyVersion attributes are changed to use the new version number
    • The specified .vdproj files (Visual Studio setup projects) are edited to modify the ProductVersion with a trimmed version of the current build version/label. The new ProductCode is also inserted
    • Visual Studio is called upon to perform the compile.
    • CruiseControl puts the generated installation packages out on the network
    • A sourcecontrol Label is created in the Perforce depot, denoting the state of the sourcecode at the time of the build.

    And that’s it. With a single click I have installation packages created with no further involvement. The files included in the package all have a version number that I can trace back to a CruiseControl label (to view build logs and in the future unit test results) and then back to a Perforce label with the same name to view the sourcecode files at were a part of the build. I’ll then also be able to compare those file versions with the recorded version numbers of bug fixes in FogBugz – something that will surely save time once Chef is in the wild.

    Microsoft, please please please make this better in the future.

  • Bug Tracking

    The development of Chef has been pretty interesting thus far. I had almost forgotten how much work is involved in getting an application shippable like this. My previous experience was with the release WakeUp! Alarm Clock, but that was as off-the-cuff as you can get: simple version control (umm, none at first then graduated to CVS); no bug tracking; no build process – builds were simply done on my development box; no unit test for regression testing (unit tests, what are those?!); and really no plan whatsoever. But I was in college and had no real experience in software, it was my first.
    In these regards, Chef is completely different. I mean completely. My development environment is quite extensive in comparison to the days of old: Perforce for source control; FogBugz for bug tracking, support, forums and a bunch of other things; an automated build system driven by CruiseControl that give me a build and install at the click of a button; full NUnit test cases for the entire Chef API; and multiple VMWare environments for testing. Future posts may include some information on some of these topics, but for now a little information about FogBugz.

    (more…)

  • Perforce

    A while back I discussed needing to look into a new source control solution for Chef.  To recap, CVS had just gotten on my nerves for a few things: file deletion and moving; pretty crappy windows client support (gui); clunky (to me) branch management; and poor infrastructure on my network.  I just don’t feel comfortable using it on Chef going forward.

    Some of my requirements for the replacement system:  stable; reliable; simple backup/restores; good Windows GUI tools for management; inexpensive (read Free); intuitive; good documentation; preferrably a Windows server (to simplify my backups).   The two forerunners were a coworker’s recommended, SourceGear Vault, and Perforce.  Vault was built as a Visual Source Safe replacement and is free for a single user.  Perforce, I learned, is a very popular and robust scm server that is free for 2 users or 5 workstations.  After comparing the two for a while I settled on Perforce mostly because it met all of my requirements, and did so in a very elegant and polished fashion.  Documentation has been spot-on and things work as advertised.  I was able to import Chef, get it backed up and configure Visual Studio’s Source Control integration all in a span of a couple hours.  Pretty impressive. Thank you Perforce for the free license.

  • Chef Beta 1!

    Well it’s a week and two days later than desired, but it’s finally here.  The first beta of the new Chef!  For those of you that are going to be trying it out and providing your feedback, thank you very much – I really appreciate it.

    Details available at www.ejichef.com.