# Tuesday, June 29, 2010

NOTE: You may have seen this post already – I’ve been having issues with my web host for the past couple of months. This post ended up in memory, but was never flushed to the file system so it was lost. Apologies for the possible duplicate post.

 

First off, apologies for not posting anything in 2 (wait, has it been 3?!?) months – that’s the longest I’ve ever gone without posting anything. Second, apologies for talking about not posting. That’s a no no. Third, apologies for apologizing for… oh, right.

So, what have I been up to.

Long story.

Well, my wife and I are now residents in the Memphis area. Obviously a big change. I had been living and working in Fort Smith, AR for the past 7 years. I’d even been at the same company that whole period. We had always talked about whether or not we would stay there or move and all that, but if you had asked me at the beginning of the year if I thought we’d end up moving, I probably would’ve said no. Well, guess I would’ve been wrong!

I took a job with ServiceU Corporation and I’m just finishing up my first week with them. Other than the obvious location change, the job is also quite a bit different from what I’ve been used to. First off, it’s a much smaller company. Second, technology adoption is pretty serious here. Third and likely most important for me, it’s a software company. You know, the end product we provide is software. Well, okay, technically it’s a service. But you know, that service is fulfilled by software. It’s pretty much summed up by Jeff Atwood's 2007 article entitled, “remember, this stuff is supposed to be fun.” That’s the main reason.

So, what will I be doing? Well, for one, I’ll get to work with ASP.NET MVC 2. I’ve been playing around with it, but I haven’t really worked with web stuff extensively since classic ASP. I’ve delved into Rails a little on my own, but nothing major. It will be interesting to compare what I’ve learned with Rails to ASP.NET MVC. I’m really excited! I’m also planning on getting the rest of my team interested in PowerShell. So don’t worry, the PowerShell posts will continue!

On the DNUG side of things, I’m obviously no longer the FSDNUG president. Jeremy Sloan is the new president and he’s got lots of other great guys helping him out. Over here, I’m planning on getting active with Memphis DNUG. I’m hoping to get to see some of the FSDNUG guys at DevLink. That was a hint, by the way.

On the personal side of things, I hate not seeing all of my Fort Smith area friends as often as we were able to before. Thankfully, Fort Smith and Memphis aren’t that far away from each other. I imagine we’ll be on I-40 quite a bit more than we have in the past.

posted on Tuesday, June 29, 2010 9:03:05 AM (Central Daylight Time, UTC-05:00)  #    Comments [4]
# Tuesday, January 05, 2010

It’s 2010. Seriously. Can you believe it? Aren’t we supposed to have flying cars, hoverboards, and have space ships that can reach Jupiter? I mean, really, we’re way beyond the year 2000 now. As a kid, I remember thinking how awesome it will be to actually get to live in the future. I guess I should be consoled in the fact that TVs are a lot bigger. That’s a plus.

So, with 2009 as a distant and 5 day old memory, I’d like to share my thoughts on how the year went.

Professional Life

FSDNUG has continued to thrive over the past year. I really look forward to the meetings and getting to hang out with everyone. As I mentioned in my last post, I’m taking over as president for 2010. The real test for me will be to see what I will be able to say about the group next year :-)

I continued speaking occasionally at developer events this year, including giving my PowerShell talk the Shreveport, LA DNUG, the Little Rock, AR DNUG and the Conway, AR DNUG as well as at the Northwest Arkansas Code Camp. I’m planning on continuing to practice my speaking skills this year… if I can only pick a topic to talk about! I also gave an open spaces session on Event Driven Architecture at devLink. With all of my presentations this year, I received the INETA Community Champion award!

At work, this past year got me pretty excited because, this year more than any prior year, I get the feeling that more and more people are starting to understand practices like SOLID as well as the purposes behind TDD. We’re also seeing more of a mentorship role starting to occur and, though it is still in its infancy, I think it could really help our developers mature.

Outside of my day job, I got to deploy my first Ruby application, a pretty basic Sinatra application. It gave me the chance to completely step outside of my .NET comfort zone for a little while to just get a taste of what’s possible. I haven’t deployed a Rails app yet, but that’s next on the list. I’m also a huge fan of git now.

Personal Life

Away from the computer, my wife and I took charge of coordinating the LTC (Leadership Training for Christ) activities that our youth group at church works with. To be entirely honest, that role was more intimidating for me than any of my user group presentations had ever been. I feel like I know how to talk to developers. I didn’t really know if I knew how to speak to teenagers. I’m still not sure if I do, but the LTC convention this year was a lot of fun and we’re already ramping up to start for this year.

Looking forward…

I’m planning on increasing my Ruby knowledge even more – I realize now that the best way to do this is to work on something. I’ve already got a project in mind so that’s in the works.

I feel like there is so much out there to learn, and not in a bad way. I love learning something new every day. I just want to do a better job of helping to dispense that knowledge this year!

And by the way, if you happen to know when we’re going to get those flying cars from Back to the Future, my internal 10 year old sure would like to ride in one.

posted on Tuesday, January 05, 2010 1:13:19 PM (Central Standard Time, UTC-06:00)  #    Comments [1]
# Wednesday, February 25, 2009

I couldn’t resist borrowing my title from Christopher Bennage’s post entitled “An Essential Tip for Working with XAML.” My “essential tip” is identical to what he has already shown for WPF (and Fabrice originally) – it just applies to Windows Forms instead of WPF :-)

I’ll mix it up some and show with pictures instead of text, though.

Step 1. Right click on a Form, UserControl, or Component and select “Open With…”

image

Step 2. Select “CSharp Editor” and click “Set as Default” - (note that this setting only applies to C# code, though you can perform the identical setup for VB.NET as well)

image

Step 3. Enjoy your delicious, hot meal of faster Visual Studio!

In case you missed it, the real benefit that you get from this setting is that double clicking a file in the Solution Explorer will now go directly to the code instead of defaulting to the designer view. If you want to get to the designer view, just right click and select “View Designer.”

Thanks again to Christopher and Fabrice who did the real work here!

posted on Wednesday, February 25, 2009 10:32:12 AM (Central Standard Time, UTC-06:00)  #    Comments [0]
# Monday, February 23, 2009

WiX Setup

I’ve been doing some work with MSIs lately, specifically using the WiX toolkit, so I thought I’d share a short primer on using WiX to build your own MSIs, and also to share some links and some tricks to avoid some pitfalls that I ran into.

First off, WiX stands for Windows Installer XML and, from what I understand, is the first Microsoft-supported open source project. Not only that, but it is the way that Microsoft builds their MSIs, too, so it is pretty significant.

To get started, I wouldn’t even bother with the release version of 2.0. The real fun is in version 3.0, which, even though it is in beta, is plenty stable (IMHO) and supports Visual Studio with a project template and intellisense support via schema files. It also makes the building step a lot easier.

image

My First WiX Project

Once you start your project, you’re presented with a WXS file pre-filled with a few initial options that looks like this:

<?xml version="1.0" encoding="UTF-8"?>
<Wix xmlns="http://schemas.microsoft.com/wix/2006/wi">
    <Product Id="de9157d6-2fbf-4c16-9d28-77f790788b28" Name="WixProject1" Language="1033" Version="1.0.0.0" Manufacturer="WixProject1" UpgradeCode="f5614cd8-aa70-4bc4-948b-208b34e16a6d">
        <Package InstallerVersion="200" Compressed="yes" />

        <Media Id="1" Cabinet="media1.cab" EmbedCab="yes" />

        <Directory Id="TARGETDIR" Name="SourceDir">
            <Directory Id="ProgramFilesFolder">
                <Directory Id="INSTALLLOCATION" Name="WixProject1">
                    <!-- TODO: Remove the comments around this Component element and the ComponentRef below in order to add resources to this installer. -->
                    <!-- <Component Id="ProductComponent" Guid="95758d74-281c-4eee-84ce-4fda6ad60557"> -->
                        <!-- TODO: Insert files, registry keys, and other resources here. -->
                    <!-- </Component> -->
                </Directory>
            </Directory>
        </Directory>

        <Feature Id="ProductFeature" Title="WixProject1" Level="1">
            <!-- TODO: Remove the comments around this ComponentRef element and the Component above in order to add resources to this installer. -->
            <!-- <ComponentRef Id="ProductComponent" /> -->
        </Feature>
    </Product>
</Wix>

It has most of the things that you’ll be interested in.

The Product element is likely the most important element as it defines the application that your MSI will install. You’ll notice that WiX is built around a lot of Guids. MSIs, or Windows Installer actually, is built around tables. Using the orca tool that ships with the Windows SDK, you can actually see these tables for any MSI. (FYI, you’ll find your Product Id Guid if you look under \\HKLM\SOFTWARE\Microsoft\Windows\CurrentVersion\Uninstall\ after installation.)

image

You Can Refactor WiX, Too

Before going further with your WiX file, I would strongly recommend refactoring some of the Guids and common strings out into variables like so:

<Wix xmlns="http://schemas.microsoft.com/wix/2006/wi">
  <?define ProductName = "WixProject1"?>
  <?define ProductCode = "de9157d6-2fbf-4c16-9d28-77f790788b28"?>
  <?define UpgradeCode = "f5614cd8-aa70-4bc4-948b-208b34e16a6d"?>
  <?define ProductVersion = "1.0.0.0"?>
  
  <Product Id="$(var.ProductCode)"
           Name="$(var.ProductName)"
           Language="1033"
           Version="$(var.ProductVersion)"
           Manufacturer="WixProject1"
           UpgradeCode="$(var.UpgradeCode)">

Doing this can help you greatly later when you’re trying to figure out which Guid goes where or what the Guid is actually for. The rest of the process of building your WiX file involves mapping out your dependencies. The project template by default already creates Directory elements pointing to the ProgramFilesFolder constant (see http://msdn.microsoft.com/en-us/library/aa370905(VS.85).aspx#system_folder_properties for the other system folder constants). The Component tag resolves to what I think of as a separate installable component. Components go together to form a Feature (think Complete versus Custom installs) so you’ll refer to your Component (by Id) in the Feature element using a ComponentRef element. The template has this commented out, but it shows how this would work. I’ll defer to the WiX Tutorial for specific examples here.

To build your MSI, you just have to do a Visual Studio build because you followed my instructions and installed beta 3.0, which comes with Visual Studio integration! Behind the scenes, though, all the build does is call out to candle.exe passing in your WXS file which results in a wixobj file. Then it calls out to light.exe passing in the wixobj file which results in an MSI. (WiX is pronounced like “wicks” – that should help you get the candle and light jokes… WiX also includes tools like dark, torch, votive, smoke, melt… :-))

Upgrading!

Up to this point, I didn’t really run into any problems with building my MSI. The online resources were fairly good at getting me started. What I wanted was for my MSI to be able to remove existing versions of my software before installing its version. MSIs support three types of upgrades: small update, minor upgrade, and major upgrades. I’d recommend skipping directly to major upgrade. From what I’ve seen so far, the other two options require additional command line arguments to msiexec to actually perform the removal of a prior install of your product.

To get a major upgrade to work, the most important thing you’ll need is your UpgradeCode. This is an attribute off of your Product element tag. Always store that off, regardless of whether or not you plan on allowing upgrades. As soon as you decide you don’t need to upgrade, you’ll want to upgrade. If you don’t have an UpgradeCode, you can’t upgrade.

You’ll use your UpgradeCode in an Upgrade tag like so:

<Upgrade Id='$(var.UpgradeCode)'>
  <UpgradeVersion Minimum='$(var.ProductVersion)'
                  IncludeMinimum='no'
                  OnlyDetect='yes'
                  Property='NEWPRODUCTFOUND' />
  <UpgradeVersion Minimum='$(var.RTMProductVersion)'
                  IncludeMinimum='yes'
                  Maximum='$(var.ProductVersion)'
                  IncludeMaximum='no'
                  Property='UPGRADEFOUND' />
</Upgrade>

Notice how I’m using my predefined variables. Makes it easier, eh? I’ve also added an additional variable defined as RTMProductVersion. This is the version of my installed application that I am upgrading from. UpgradeVersion tags work like ranges. So, for the UPGRADEFOUND to match, the installed application has to match inclusive RTMProductVersion (inclusive because of IncludeMinimum=’yes’) up to exclusive ProductVersion, which is the new version we’re about to install.

Now, changing the version isn’t enough for a major upgrade to work. You also need to change your ProductCode. This is what I continued to miss and why I was getting so frustrated with WiX. Now that I know what it should do (and what to search for), I’m finding plenty of WiX articles on how to do major upgrades! The reasoning for this is because major upgrades only work between two completely different products (think of Visual Studio 2005 and Visual Studio 2008 as having two different ProductCodes). These two products can run side-by-side, hence the different Guids for their product code. These applications allow side-by-side execution so they’re not specifying the removal of the old software, but they certainly could. MSDN has a good article on everything that you’ll need to check before getting an MSI ready for a major upgrade.

Once you have a new version and a new product code, you’ll need to actually tell the MSI to remove the existing version. To do this, you’ll add a RemoveExistingProducts element to an InstallExecuteSequence. Like this:

<InstallExecuteSequence>
  <Custom Action='PreventDowngrading'
          After='FindRelatedProducts'>NEWPRODUCTFOUND</Custom>
  <RemoveExistingProducts After='InstallFinalize' />
</InstallExecuteSequence>

<InstallUISequence>
  <Custom Action='PreventDowngrading'
          After='FindRelatedProducts'>NEWPRODUCTFOUND</Custom>
</InstallUISequence>

<CustomAction Id='PreventDowngrading'
              Error='Newer version already installed' />

In my example, I’ve told RemoveExistingProducts to run after the ‘InstallFinalize’ action, but this is customizable and can have an impact on the efficiency of your installer.

Once I set my WiX project up like this, it worked like a charm.

There are two resources that are essential for getting up to speed with WiX that I’d like to share. One is the WiX Tutorial. I’m probably using about a 10th of the content posted there. Second is Alex Shevchuk’s “From MSI to WiX” articles, particularly his post on major upgrades, which was invaluable to me.

posted on Monday, February 23, 2009 1:38:15 PM (Central Standard Time, UTC-06:00)  #    Comments [1]
# Thursday, January 01, 2009

So, a year ago to the day, I posted my review of 2007 with a look towards 2008. To continue that age old tradition, I will now review 2008.

Learning

I started off the month by stating that I wanted to learn some new languages, primarily Python and Ruby. I’m sad to say that I haven’t made it past the 5th python challenge yet. I pretty much got distracted, which is a lame excuse. On the other hand, instead of learning languages, I’ve learned a ton about editing in VIM and even a little about Emacs (though I have to use viper or vimpulse to be at all productive in Emacs). I’m even using ViEmu in Visual Studio. The Vim key-bindings have become muscle memory now and I consider that a positive thing. I’m still going to try to learn other languages this year, but I’m going to need a project to work on before I can become proficient.

FSDNUG

This year, a very exciting thing for me was the formation of FSDNUG. Michael Paladino pretty much did all of the work, but he lets me call myself a co-leader. Raymond Lewallen opened up the FSDNUG meetings by speaking about Behavior Driven Development. I didn’t really grok BDD at that point, but I’m learning. I most definitely prefer the context/specification style of naming specs over traditional TDD test names.

Conferences

I was fortunate enough to attend both Tech Ed and DevLink this year. I even told people at DevLink that I’d be attending CodeMash, but I sadly won’t be able to make it after all. I have no doubts that it will be an amazing conference, though, and wish I could be there.

Presentations

I presented on PowerShell three times in 2008. Once to FSDNUG, once to MNUG and then once to Harding University CS students. My presentations pretty much took up all of September. It was a great experience and I’m looking forward to speaking to the Shreveport .NET User Group in March!

Posts

My post on “real world debugging witn WinDbg” post was featured on the Tech Ed bloggers site, which led to me being selected as a “featured Tech Ed blogger” for a day. I was also excited to have my PowerShell thumbnail script mentioned on the PowerScripting Podcast.

In closing…

All in all, a really great year. I noted in 2007, that it had been the year of the most growth for me as a developer. That was true… at least until 2008. My opinion right now is that there is no such thing as a good developer, only a better developer. This saying comes from a discussion I had with a coworker a few months back where we came to the conclusion that there isn’t such a thing as a good design or architecture, only a better design or architecture – all because we’ll inevitably have learned a better way to do things in the future.

I hope everyone has a great 2009!

posted on Thursday, January 01, 2009 2:13:41 PM (Central Standard Time, UTC-06:00)  #    Comments [1]
# Tuesday, July 15, 2008

Brian Sullivan tagged me with the latest ongoing meme. I’m really sort of excited because I’ve missed out on all the other memes going around. Jeff Atwood probably wouldn’t even consider me a real geek because of that. (I haven’t updated a Wikipedia page either! Gasp!)

How old were you when you started programming?

I didn’t write my first “Hello World” until I was 18 in COMP 170. I created my first personal website when I was 15 I think, but my primary tools were Netscape Composer and Paint Shop Pro. :-) I think I had figured out by that point some very basic Javascript, but I really had no idea what I was doing.

How did you get started in programming?

I remember when my dad got a new PC with Windows 3.1 on it. Prior to that, I knew how to ‘cd’ between directories and how to run ‘dir’. All of these commands were, of course, to get to the directory where my games were installed. :-) I never really stayed in Windows at the time, because all the games were still DOS-based. I didn’t really have much to do with Windows (except for the Hot Dog theme), until Windows 95 came out. That’s when I started becoming more of a computer enthusiast. I remember troubleshooting Dial Up Networking so that our 14.4 modem would connect up. I also remember buying my first piece of hardware, the 3dfx Voodoo card.

As I mentioned, I started doing some basic web pages when I was in high school. This was the time of animated GIFs and tiled backgrounds, if you’re interested. This was also back when 56K modems first came out and there wasn’t yet a clear standard on how 56K modems would talk (you could either go with US Robotics or the cheap brands) and I worked as tech support at a local ISP. It wasn’t hard to do tech support because I had been troubleshooting my own Dial Up Networking problems for a few years already.

Coming from a tech support role, I didn’t really have any programming knowledge. I knew how to build a computer and I even knew about msconfig, but programming??? Nah… not really. Just WYSIWYG HTML.

When I graduated high school, I either wanted to be a musician or work with computers. Seeing as how I didn’t really want to teach high school band, I decided to go to school to learn about computers. I didn’t really know what Computer Science meant, but hey, my grades were pretty good so why not? So, I chose a major of Computer Science and the rest is history.

What was your first language?

Unlike the rest of the programming populace, my first language was actually not BASIC, but C++. I didn’t actually write a line of BASIC until my junior year of college! I would say that I currently prefer C# over VB.NET, but it has more to do with terseness than it does with braces. For the same reason, I’m a fan of Ruby as well.

What was the first real program that you wrote?

Are you saying Hello World doesn’t count? C’mon!

I’m going to define “real program” in this case as something that I could show my parents. I couldn’t show them “Hello World” or a command line application to create a binary search tree because they couldn’t relate to it. However, I could show them a GUI maze application that I wrote in Java. It had four players (one of which could be human controllable) and then each player raced to get to the exit. I also wrote a Solitaire program in C++, a networking Tic Tac Toe game in C++, and a Paint program in C++ (using the Windows API).

My first team application, like Brian’s, was created in the capstone course at Harding. We wrote a version of Othello that had to be networked with an AI. I wrote the networking code in C#. It even had threading code, which of course was written completely wrong. I’m still not entirely convinced that I can write threading code correctly today. :-)

What languages have you used since you started programming?

In college, I primarily used C++ and C#, but I also had some exposure to some Assembler, Java, VB.NET, Perl, and even LISP! My work experience includes a (thankfully short) period of COBOL and JCL on an IBM mainframe, but primarily has been in VBScript (both classic ASP as well as scripts), Javascript, PowerShell, C++, C#, and VB.NET.

In my personal projects, I’ve used C#, VB.NET, JavaScript, PowerShell, PHP, Python, and Ruby. I’m sure I’ve missed something in there.

What was your first professional programming gig?

I got hired out of college to work at Data-Tronics, Corp. where I still am to this day. My role has changed significantly now, where I’m trying hard to push out 40 years of IT practices with more modern methodologies (down Waterfall, down!) and technologies (down Mainframe, down!).

If you knew what you know now, would you have started programming?

You bet. I’m a geek to the core.

If there was one thing you learned along the way that you would tell new developers, what would it be?

I’d have to agree completely with Brian – get involved in the community. Do not let programming become just the job you perform. Like JP, get passionate about developing. If you don’t enjoy what you do, there isn’t any point in doing it. Start reading blogs and going to user groups. You’ll be overwhelmed at how much you didn’t know, but remember that no one else knows it all either. We’re all learning together.

What's the most fun you've ever had... programming?

I can’t think of any one specific instance, but I think one of the best feelings is, after having spent literally hours trying to debug some problem and then giving up and going home, waking up the next day and having the light bulb come on with the solution to this problem. I love solving problems with software.

Tag, you’re it!

Colin Neller, come on down!
Randy Walker, you too!

I’ve got other tags if anyone else is interested. I might even give some out!

posted on Tuesday, July 15, 2008 12:36:10 PM (Central Daylight Time, UTC-05:00)  #    Comments [3]
# Wednesday, June 18, 2008

A couple of weeks ago, I was fortunate enough to attend the Tech Ed 2008 Developer conference. It was my first Tech Ed conference and I had a great time. (Yes, I still need to blog about my experiences there overall and I’m still planning on doing that.) One thing I wanted to bring up if you’ve never been to Tech Ed before is the great experience that the Hands on Labs (HOLs) provided. Basically, you walked up to the HOL computer and, in a few short steps, you had a full development virtual machine ready to go. It was a really nice experience and ensured that you could try out new features without having to set up your own VM or worse, download and install a lot of betas on your own development machine.

Apparently, Microsoft is using the same setup over the web. Maybe I’ve been in the dark for a long time, but I’ve never used a VM in a browser window before. Check the screenshot out:

image

Seriously, look at the browser title – this is in IE. On the right side of the screen, you’ve got the lab walkthrough, too. If you’ve been unable to look at new technology like .NET 3.5, LINQ, WPF, WCF, etc, you should check out Microsoft’s Virtual Labs. The MSDN Virtual Labs are at http://msdn.microsoft.com/en-us/virtuallabs/default.aspx, but TechNet also has labs for things like Windows Server 2008.

image

posted on Wednesday, June 18, 2008 8:01:36 AM (Central Daylight Time, UTC-05:00)  #    Comments [2]
# Thursday, April 24, 2008

image

(Sorry for the lack of substance with this blog post - I'm hoping that just posting anything will spur me on to post something with substance. Wish me luck.)

posted on Thursday, April 24, 2008 9:06:17 AM (Central Daylight Time, UTC-05:00)  #    Comments [0]
# Friday, March 28, 2008

Just a reminder to anyone in the Fort Smith area - we'll be meeting next Monday night at 6:00 to hear Chris Koenig talk about Silverlight. Chris is a Microsoft Developer Evangelist located out of Dallas. I got to meet Chris last year for a grand total of about 5 minutes when I went down for the .NET Roadshow that was hosted at Microsoft's office in Dallas. Chris got to escort me and the others between floors on the elevator :-)

Anyway, if you're in the area, swing by. We'd love to see you. For more information, check out the FSDNUG website.

posted on Friday, March 28, 2008 4:24:36 PM (Central Daylight Time, UTC-05:00)  #    Comments [0]
# Wednesday, March 26, 2008

If you've been working with the .NET Framework for a while, you're hopefully already using some form of static analysis to help you catch problems with your code. One of the most well known is Microsoft's FxCop, which is now integrated as the Code Analysis feature in Visual Studio 2005 [1] and up. If you're not already using this tool, then please start because it can help you find problem areas like potential NullReferenceExceptions as well as globalization and security issues.

However, while FxCop is great at catching small problems and details, it isn't the best tool to see the big picture regarding your software. Enter NDepend by Patrick Smacchia. Chances are, you've already read Scott Hanselman's great review of NDepend a while back (or heard his podcast on static analysis with NDepend). If you haven't read it, go ahead and check it out. Scott uses NDepend to analyze dasBlog (which I'm running), so you can get the general feel for working with NDepend and what the reports look like.

I'd like to run through a few of the features of NDepend using Rhino Mocks as the target of my static analysis. Rhino Mocks is a neat example because it is only one assembly, but it is the result of an ILMerge of quite a few different libraries, so we get to see how NDepend handles this. Here is NDepend's class browser showing Rhino Mocks:

image

As you can see, it handles Rhino Mocks accurately. In fact, it almost feels like the class browser in Reflector, so that is already a plus. In fact, as you can see, the context menu supports jumping to Reflector for the selected type.

The "Who is directly using me?" option is also pretty cool and highlights the extensive use of CQL in NDepend:

image

CQL, or Code Query Language, is the centerpiece of NDepend and is how all of the analysis happens. You can think of it as SQL against IL. The massive benefit that NDepend has over FxCop IMHO is that you can create your own analysis rules in CQL instead of having to write and compile a DLL to extend FxCop (for an example of this, check out this FxCop rule that ensures that ArrayLists are List<T>s instead). Even better, NDepend provides a complete editor with intellisense that allows you to test your queries out against your assemblies.

image

Take a look at this screenshot. You can see the intellisense at the bottom right hand of the screen. At the top left is the CQL Query Results. The top right is all of the types in the assemblies, but the highlighted ones in blue are those that were returned by the query. This all happened as I typed the query in. Actually, I got red when I typed it in the first time, because my query had some mistakes in it, but NDepend was very helpful in showing me how to correct my query.

The query editor also has different types of intellisense depending on the value.

image

I'll admit that it might seem weird to have a slider when you're just typing a number in, but the cool part is when you change the value, the query results automatically change to reflect the new value. In this case, you can watch the results of the query to get a feel for which types have the most methods.

From an agile coding perspective, NDepend ties in well with Continuous Integration. It ships with both a NANT and an MSBuild task to run the NDepend console against an NDepend project file (which is just XML). The report that it provides is insanely detailed. I'd say this where the value of application-specific CQL queries would come in handy, because you can come up with some detailed queries that are run on every CI build to ensure that the code still matches whatever design criteria was decided upon when the queries were written.

 image

For future versions of the tool, I'd think it would be neat to have a lightweight version of the CQL tool that you could ad hoc queries against assemblies, like as a Reflector addin or something. That'd be cool. Or maybe a Powershell cmdlet/PSDrive provider so that you could do something like this:

Get-ChildItem -Include *.dll -Recurse | Select-Cql -Top 10 -Methods -Where MethodCa -ge 5

Or maybe:

Get-ChildItem -Include *.dll -Recurse | Select-Cql -Top 10 -Methods | Where { $_.MethodCa -ge 5 }

I'm not sure exactly how the syntax might look, but it would be really cool :-)

Hopefully, I've given you a good picture of the some of the features of NDepend. If your interest is at all piqued, there is a "Trial / Open Source / Academic Edition" that you can download for free. Its feature set isn't quite as broad as the Professional edition, but I've used it before and it still provides a lot of functionality. Check it out!

 

Full Disclosure - I used a review copy of NDepend for this post. My company is not (yet) using this tool, but I think that there is interest. I wasn't paid to do this. <kidding>If you, dear reader, would like to pay me, please contact me.</kidding>

 

[1] I don't believe that all of the SKUs of Visual Studio have the Code Analysis feature.

Technorati Tags: ,
posted on Wednesday, March 26, 2008 7:58:49 AM (Central Daylight Time, UTC-05:00)  #    Comments [1]
# Thursday, March 20, 2008

image

Anyone else find this funny? I know I do! I told you I was a beta junkie.

Technorati Tags:
posted on Thursday, March 20, 2008 8:50:31 AM (Central Daylight Time, UTC-05:00)  #    Comments [0]
# Tuesday, February 19, 2008

I was just setting at a command prompt in Vista on my laptop and I typed 'cd /' out of habit and, to my surprise, it worked! Not only that, but tab completion still behaved as expected!

I actually have been using the '/' character in PowerShell because it is easier to type than '\' (not as far to reach) and it is the default in *NIX systems as well (i.e. my Ubuntu installation).

Now granted, I probably shouldn't get used to this in the event that I inadvertently code a '/' character in one of my programs, but then again, I should technically be using the System.IO.Path.PathSeparator anyway.

I get excited about the little things.

NOTE - this might be the result of Service Pack 1 on Vista also...

UPDATE - I lied. You can type 'cd /' and get to the root, but tab completion still completes only for the current directory. In other words, if you're current directory is c:\windows\ and you type 'cd /[tab]', you'll get directories that are in c:\windows. Sorry. My excitement just dropped a little.

posted on Tuesday, February 19, 2008 5:30:08 PM (Central Standard Time, UTC-06:00)  #    Comments [0]
# Monday, February 11, 2008

Last week, a small group of us traveled up to hear Jean-Paul Boodhoo present to the Northwest Arkansas .NET User Group. JP presented on advanced uses of generics in .NET (i.e. more than just strongly typed collections) though we also had a great look at Test Driven Development as well as some of the new features in C# 3.0.

The presentation was great and it got me really excited about user groups in general, which is why I'm also excited to announce that Fort Smith will be getting its own user group! Many thanks to Michael Paladino for doing a lot of the work in getting this started. FSDNUG went live last week. I'm hoping to add a feed to the site at some point so that news can easily be pushed out without continually checking the site, but for now, it is just static HTML.

Raymond Lewallen will be kicking off the group with a presentation on Behavior Driven Development. I've read about BDD and am attempting to practice TDD, so I'm excited to hear Raymond's talk. If you live in the area, be sure to come out for the meeting!

posted on Monday, February 11, 2008 12:43:38 PM (Central Standard Time, UTC-06:00)  #    Comments [4]
# Tuesday, January 01, 2008

It's hard to believe that it is already 2008... 2007 completely flew by. I spent most of this Christmas holiday telling my family I had seen them just a few months ago when, in fact, I hadn't seen them since... last... Christmas.

So, 2008 in review.

Except for my first couple of years in college (I had never written a program until 'Hello World' in C my freshman year), 2007 has got to be the year of the most growth for me as a developer. I never really grasped unit testing/test driven development (I can't put behavior driven development in this just yet) until this year. Does that make me a master at it? Certainly not - but I do understand the need and the drive behind it now. Along with this gradual understanding of the role of tests/specifications, I have come to better appreciate concepts such as dependency injection, inversion of control and separation of concerns. I understand that they may sound like buzz words, but seriously, these practices can completely change the way you architect systems. I can't believe how far behind I've been and, even more so, how far I have to go.

In my quest to become a better developer, I'd like to share some of the blogs/feeds that I've started subscribing to in 2007 that really have helped me become stronger in my craft. J.P. Boodhoo, Jeremy Miller, Dave Laribee, Oren Eini, the reddit programming feed, and Reginald Braithwaite. Certainly some are missing (lifetime achievement awards to Scott Hanselman and Jeff Atwood anyone?), but I still wanted to share a few. I don't think it is a coincidence that a lot of these are heavily involved with ALT.NET.

Looking forward to 2008.

I'm hoping to gain experience and learning from communities outside of the Microsoft ecosystem (i.e. Ruby, Rails, Python, etc.) if for no other reason than to see what it is like. Honestly, the majority of the practices that ALT.NET is pushing have been and are huge parts of these communities. I'd also like to get more involved with one or more open source projects. Lately, I've found myself pulling more and more repositories down to my machine just to study the code and I'd like to give back.

 

Technorati Tags:
posted on Tuesday, January 01, 2008 7:55:07 AM (Central Standard Time, UTC-06:00)  #    Comments [0]
# Wednesday, December 19, 2007

This morning, I had my annual eye appointment and I completely forgot that they might dilate my eyes. Of course, my appointment was also scheduled first thing in the morning - essentially before work. Now, I'm sitting in front of my computer and literally everything is completely blurry. I can't read anything on the screen. It doesn't matter if I get close to the screen or far away, it is all blurry.

Enter ZoomIt! I initially heard about this tool from Scott Hanselman. It is another wonderful tool from Sysinternals (i.e. the guys that make Process Explorer, Process Monitor, etc.) so you know it is pure gold. The tool's primary use is to aide in presentations, so that you can easily zoom in to a portion of the screen so that people can see it better.

Today, I'm using it to just help me read the screen at all. I'm basically touch typing and periodically checking what I've written by zooming in to see if everything looks good. It is actually working pretty well, too.

Thankfully, the blurriness isn't lasting too long. As I'm writing this post, it has already cleared up considerably. Still, ZoomIt has come to the rescue for me this morning.

posted on Wednesday, December 19, 2007 9:22:05 AM (Central Standard Time, UTC-06:00)  #    Comments [0]
# Friday, November 02, 2007

I'm finding myself wondering if I'm a beta junkie or a CTP junkie.

Why?

Because Jeffrey Snover announced that there will be a CTP release of PowerShell 2.0 next week. I'm not waiting for the beta either - I'm downloading the CTP bits as soon as the post announcing its release gets to Google Reader. Maybe I should change my "beta junkie" title to "pre-release junkie" or "I just like to install things junkie."*

PowerShell 1.0 single handedly turned me into a console user. I do 90+% of my file operations from PowerShell instead of Windows Explorer. I also do a large portion of my pseudo coding at the command prompt to see whether a basic algorithm will work the way I expect it to. I'm very excited to see what the team has come up with.

Update (per post from Jeffrey Snover):

The PowerShell V2 CTP is not for everyone. You should read this PowerShell Team blog entry ( http://blogs.msdn.com/powershell/archive/2007/11/02/ctp-watch-this-space.aspx ) to find out what it is and what it isn't and then make an informed decision before installing the CTP.

I may be an "I just like to install things junkie" but that doesn't mean that you should be to. Be responsible with pre-release software. If you've got production code that relies on PowerShell behavior, etc. you should consider holding off on installing it on your development machine.

 

* With all these installs I do, I actually do see UAC prompts a lot. And no, I haven't turned off the prompt.

posted on Friday, November 02, 2007 11:26:11 AM (Central Daylight Time, UTC-05:00)  #    Comments [0]
# Thursday, October 18, 2007

I was reading through my feeds this morning and came across this gem of a paragraph:

Manual testing is immoral. Not only is it high stress, tedious, and error prone; it’s just wrong to turn humans into machines. If you can write a script for a test procedure, then you can write a program to execute that procedure. That program will be cheaper, faster, and more accurate than a human, and will free the human to do what humans to best: create!

The paragraph is actually an aside to the rest of the post, too! Go read the entire TDD post in context at the ObjectMentor blogs.

posted on Thursday, October 18, 2007 8:15:18 AM (Central Daylight Time, UTC-05:00)  #    Comments [0]
# Wednesday, October 03, 2007

image

*sigh*

posted on Wednesday, October 03, 2007 9:44:23 AM (Central Daylight Time, UTC-05:00)  #    Comments [0]
# Wednesday, September 05, 2007

When I was in high school, my first job was preparing food at a local Taco Mayo. I didn't last long there. Soon afterwards, I began working at a local ISP doing tech support. I still remember all of the problems that brand new 56K modems had, because the v92 standard hadn't really been standardized yet.

Anyway, all that to say my first real job was tech support at an ISP. Tonight, I was practicing my troubleshooting skills on my internet connection. I got home from work and couldn't connect to anything except my router.

Here are the steps I took:

1) Opened Outlook and IE and tried to go somewhere. Nothing happened.

2) Recognized there was a problem.

3) Pulled up a command prompt and tried to ping www.google.com and then my ISPs website. No dice.

4) I rebooted.

5) I pulled up an admin command prompt (UAC) and tried pinging again with no success.

6) I released my IP address and then renewed it (ipconfig /release and then ipconfig /renew - this is why I needed an elevated prompt).

7) I tried pinging again without success.

8) I unplugged my cable modem, waited for 15 seconds, plugged it back up and then tried again... without success.

9) I navigated to my router's page in my browser which came up great.

10) I released and renewed my IP address from the router. Then I tried pinging... once again without success.

11) I bypassed my router and connected my ethernet cable directly to my cable modem.

12) I unplugged and then plugged back in my cable modem and tried pinging without success.

13) I got frustrated and tried most of the above things in random order to try to get it to work.

14) I called tech support.

15) I got more frustrated dealing with the automated answering system.

16) I got FAR more frustrated dealing with the automated tech support - that had me do everything I had already tried.

17) The automated tech support finally asked if I'd like to speak with a real person - I said yes.

18) The real tech support picked up quickly (thankfully) and had me power off my modem and bypass my router (already done) and then try pinging which didn't work.

19) Then he asked me to reboot.

20) Knowing that this was my second reboot, I was skeptical but I went ahead with it for the real tech support guy's benefit.

...

21) It starts working.

22) I look and feel like an idiot.

Moral of the story - rebooting always fixes the problem. Just try it over and over and over again. Until it starts working.

*sigh*

posted on Wednesday, September 05, 2007 10:28:34 PM (Central Daylight Time, UTC-05:00)  #    Comments [0]
# Friday, August 10, 2007

For your enjoyment, here is some great dialogue from the movie Airplane. Why am I providing this? Because it is funny and because I wanted to.

Roger Murdock: We have clearance, Clarence.
Capt. Clarence Oveur: Roger, Roger. What's our vector, Victor?
Tower: Tower Radio, clearance, over.
Oveur: That's 'Clarence Oveur', over.
Tower: Roger.
Roger Murdock: Huh?
Tower: Roger, over.
Roger Murdock: What?
Capt. Oveur: Huh?

Many thanks to Kaelin for providing this.

posted on Friday, August 10, 2007 8:15:34 AM (Central Daylight Time, UTC-05:00)  #    Comments [0]
# Monday, July 16, 2007

I was digging around my old posts and bookmarks and stumbled across my post on the Share Your OPML website from over a year ago. Whatever happened with that site? It quite literally hasn't changed since the service started as far as I can tell. I really like the idea and I wouldn't mind at all if the site added a few services or something. I went ahead and updated my OPML (which has literally doubled) and you can check it out here. If you've got an account with them, go ahead and update your list and then comment with a link to it.

Off-topic, but I wish that Google Reader would start adding some more features. I figure it would be easy to provide a way to subscribe to another users' shared OPML list (as opposed to just items that they mark as shared). Maybe no one else wants that feature, but I think it'd be cool. I already subscribe to a few del.icio.us bookmark feeds and shared feed items. Why not provide a feed that lets me know when someone adds a new feed to their list?

UPDATE:

One small thing to add - Matt brought up the point that there isn't an easy way to get an external link to your own shared OPML list. I've only found two ways to do this so far: 1) Use the "Who Subscribes To..." feature and look for a feed you subscribe to. 2) Google your name and optionally specify the site (site:share.opml.org).

posted on Monday, July 16, 2007 7:26:15 PM (Central Daylight Time, UTC-05:00)  #    Comments [3]
# Monday, June 11, 2007

In case you haven't heard, Apple has released a public beta of Safari, which is their web browser.

The surprising news is that it supports Windows.

David Mohundro

I have to admit that this is a really good move for Apple. Their software has been intriguing me quite a bit lately, and watching John Lam demo Silverlight on a Mac certainly doesn't make me not want to try it out for myself. My only experience with Mac OS X is via tech support while I was in college. We had an iMac desktop in the office for the rare occasion when a Mac user would call in asking for help getting their LAN connection set up (note, the rarity had more to do with the lack of Macs on the network than the lack of problems). The system ran quite slowly because it didn't have enough RAM and it didn't have any software on it. The dock was pretty cool, but it didn't seem to add much value at the time.

Things seem to have changed, though. I would really, really, REALLY like to try out Quicksilver. The Parallels software looks really cool, too. I like Windows too much to switch, but the capability to run both Windows and OS X side by side is very attractive. Everybody seems to like TextMate a lot, too. I do wonder sometimes if I just want Windows ports of these programs or if it really is OS X that seems so nice.

For the time being, I'll probably still stick with Windows Vista. I just like using custom hardware too much to lock myself into Apple hardware right now (that, and I hate not being able to resize windows from the top). If they ever come out with a virtualization option to run OS X on Windows, I would probably give that a try. I would encourage you to check out HardOCP's 30 Days with Mac OS X article if you've been curious what running OS X might be like.

posted on Monday, June 11, 2007 2:55:00 PM (Central Daylight Time, UTC-05:00)  #    Comments [0]
# Wednesday, June 06, 2007

For the past month or so, my internet connection at home has been dropping constantly. There hasn't really seemed to be any rhyme or reason to it either. What's interesting is that one of my neighbors with a similar network setup was experiencing similar behavior.

I decided to take this as an opportunity try out some new firmware for my router (a Linksys WRT54G). I first decided to check for updated official firmware. Luckily enough, there was some updated firmware, though it wasn't what I would call current (i.e. 2005).

Taking a failure to update as a bad sign, I instead took Scott Hanselman's advice and decided to try some alternate firmware. So far, it is working with flying colors and my router suddenly has all sorts of new functionality. It is a little frustrating that the hardware could support this out of the box, but the firmware wouldn't allow it.

Here's what the web administration tool looks like with the DD-WRT firmware installed:

DD-WRT - Setup - Mozilla Firefox

Much snazzier than the "official" firmware.

If you're interested in trying out DD-WRT, look no further than http://www.dd-wrt.com/. I was able to find plenty of resources online for getting DD-WRT working, too. Hopefully, this will fix some of the connection issues I've been having.

UPDATE - Interestingly enough, Lifehacker named DD-WRT their number two network utility of their top 10 network utilities.

posted on Wednesday, June 06, 2007 9:48:04 PM (Central Daylight Time, UTC-05:00)  #    Comments [0]
# Thursday, May 24, 2007

Here's the link: http://worsethanfailure.com/Articles/Film-At-1100.aspx

Wow. We're famous.

My cubicle neighbor pointed it out to me.

posted on Thursday, May 24, 2007 2:58:52 PM (Central Daylight Time, UTC-05:00)  #    Comments [0]
# Tuesday, May 22, 2007

I am nerdier than 74% of all people. Are you a nerd? Click here to find out!

Don't worry, I did this over my lunch break. Because I'm a nerd.

posted on Tuesday, May 22, 2007 12:52:57 PM (Central Daylight Time, UTC-05:00)  #    Comments [1]
# Thursday, May 17, 2007

A few weeks ago, I posted on the Stack Style Tabs extension for Firefox. I used it for a little while and I realized that it wasn't exactly what I was looking for... I think it was because I couldn't use my keyboard arrow keys in addition to ALT-TABing around. What I really wanted was a keyboard-centric way to quickly navigate through my tabs.

Today, I was going through my feeds and noticed a post from Lifehacker on a new experimental feature that Google was working on to allow you to navigate through search results using j/k and a few other keyboard shortcuts. My first thought was that this would be great, because I use the provided keyboard shortcuts to navigate through my feeds in Google Reader all the time. Unfortunately, it was a little rough around the edges still.

Then I saw a comment to the Lifehacker post on vimperator. I had seen posts on vimperator before and had even tried it, but it was a little too weird for me at the time. I mean, I still use my mouse occassionally; however, the comment mentioned that you could type :set guioptions=mTs and get your menu and toolbars back.

So I thought, eh, why not. I'll give it a shot again.

So far, I'm liking it.

First off, I'll recommend turning your menu and toolbars back on using the guioptions setting. It makes the transition to vimperator a little easier. Once you've done that, just start browsing.

Here are a couple of my favorite features so far:

  1. If you press f, you'll get Hit-a-Hint like labels pop up on all of the anchor tags which will be numbered. If you press the number in the label, it will navigate to that link. No mouse!
  2. If you press b (comes from the vim idea of buffers instead of tabs), you'll get a list of your tabs! Just press the number and it will open that tab up! Awesome! THIS is what I wanted for a Firefox extension.

Here's a screenshot of it in action:

There are a lot of other options that are probably great, but I still need to spend more time learning them. I encourage you to give it a try, too. Don't worry if it seems a little overwhelming. You can always turn to vimperator's help, which is excellent.

posted on Thursday, May 17, 2007 9:09:49 PM (Central Daylight Time, UTC-05:00)  #    Comments [0]
# Wednesday, May 16, 2007

This post has absolutely nothing to do with anything. Just some ramblings from my brain this morning.

I got to work a few minutes ago and the first thing I do every morning is go pour myself a cup of coffee. The coffee doesn't bother me too much - at least after I pour some sugar and cream in it and it looks more like milk than coffee. However, others at work despise the stuff. It's the typical coffee you might find at any other corporate office... except maybe Starbucks.

That's when the ironic thought hit me.

What if the coffee that Starbucks has for their employees is the same coffee sludge that every other corporate office has? Wouldn't that be hilarious? Wouldn't it be... ironic?

It must be too early in the morning to form coherent thoughts.

posted on Wednesday, May 16, 2007 7:11:43 AM (Central Daylight Time, UTC-05:00)  #    Comments [0]
# Sunday, May 06, 2007

I've already shared with you about how cubicles really can be annoying when you sit next to the loudest two individuals in the world.

Now, I'd like to point you to a video that Long Zheng posted (from istartedsomething) from when Conan O'Brien visited Intel headquarters.

Here are some similarities between Intel and where I work:

  1. Cubicles really are like parking garages, except that you have assigned spots.
  2. Cubicles really don't have much color or individuality (I do have a National Geographic map on my cubicle wall, though - yay!).
  3. People really are picky about their chairs. Seriously picky.

Here are some differences between Intel and where I work:

  1. No cafeteria.
  2. No "ultra-clean" factory.
  3. Hairnets only come into play on Halloween.
  4. I haven't ever seen kids on a field trip, though we do have kids come around our cubes to sell cookies sometimes (and on Halloween).

One other thing - I think I've met Bill Lumbergh's clone in our cubicle farm. I'm guessing any and all work environments that make use of cubes have their Bill Lumberghs.

posted on Sunday, May 06, 2007 9:42:23 PM (Central Daylight Time, UTC-05:00)  #    Comments [1]
# Friday, April 06, 2007

I'm sure you've seen this page before:

I've seen a million posts on it, too. Jeff Atwood posted about this problem when he was talking about user-friendly 404 pages. Internet Explorer tries to hide ugly error pages from you unless the page displayed is greater than 512 bytes in size.

I used to have this setting turned off, but my employers recently pushed out Internet Explorer 7 to the corporate masses. I already had it installed, but it apparently went over my previous installation, which means that I lost my previously customized settings. Anyway, I spent about an hour trying to figure out why my IIS installation had CustomErrors turned on for everybody before I realized that it was actually Internet Explorer helping me out.

To turn the setting off, go here:

As Jeff points out, the best solution is to make sure that your error pages are bigger than 512 bytes. Most of the time, ASP.NET error pages are far larger than 512 bytes, too. HOWEVER, error messages from HTTP Remoting* are NOT always greater than 512 bytes and I'm not sure if you can customize those or not. So I like to just save myself the headache and turn this off.

* As a note, a useful tip for debugging HTTP remoting applications is to browse to your registered channel (i.e. http://localhost/remotingEndPoint.rem) with a browser. If there are any problems with your remoting configuration or with your assemblies being loaded, you'll get the friendly ASP.NET error message displayed to you. If you don't get an ASP.NET error, you'll usually get a message that looks like this:

System.Runtime.Remoting.RemotingException: Requested Service not found

It basically means that you're configured correctly and that the server didn't find a service based on your HTTP GET. I prefer checking remoting servers this way because it is easier to read messages in your browser than trying to interpret a binary serialization exception while in your remoting client.

posted on Friday, April 06, 2007 10:31:23 AM (Central Daylight Time, UTC-05:00)  #    Comments [0]
# Thursday, March 29, 2007

If you're not already subscribed to Jeremy Miller's blog, do so now. I'll wait for you to come back.

Okay, now that you've done that, read his latest post on sunk costs and architectural decisions. I'll keep waiting.

Done? Good.

As I was reading his post, I found myself nodding my head in agreement over and over again because I've been dealing with the exact same issues at work for the past few months. Sunk costs are something that every business deals with. A sunk cost is when you've already spent money on something and you later wish that you hadn't spent that money. The Wikipedia example that Jeremy cites of going to see a bad movie is the classic example of sunk costs.

One of the biggest problems with sunk costs isn't the actual cost involved but the fact that as soon as you admit you're dealing with a sunk cost, you're also admitting that a bad decision was made somewhere. This can lead to hurt feelings, hurt pride, etc. Jeremy points out that there can be political implications of this as well. Management will not be happy to find out that this awesome tool that was supposed to bring world peace, cure cancer, and solve the energy crisis actually is too slow for the masses to effectively use. They're likely going to question more than just the tool afterwards.

However, I submit that these same sunk costs can provide an incredible benefit to developers. One of the quickest and most efficient ways to learn is to make mistakes. If you get burned badly enough, you're not going to touch the hot stove again, because you now know that it is hot. If you're the one who is responsible for the bug that cost your company thousands or millions of dollars, will you make that same mistake again? Of course not!

Learn from your mistakes! I've been fortunate to be a part of a similar process and the results so far have been very positive. Our team has really come together and pushed out some really good code that our users are very happy with. Prior to starting the rework, we had all been dreading continuing to deal with the prior version of the product, because we knew we would be spending our time hunting down obscure bugs and hearing complaints from users. The question we continually heard from users was, "why is this better than before?" We hated the question because we didn't like the system either! Now, we can tell them with confidence that our work is without a doubt better and that we're behind it 100%.

From the management side, I submit that managers who give their teams a chance to fix mistakes and start over can gain a great deal of respect from their team. Our manager had ties to the prior system, but he also knew there were problems with it. The system had gone through three different groups before we had ever been given responsibility over it! No one even knew the system anymore! Not only did we come together as a team more, we also became more familiar with the code and were able to really take ownership of it. A positive response to problems or mistakes reflects a real maturity in leadership.

You can treat sunk costs as a straight loss and accept defeat. The better alternative is to treat them as a training expense. The benefits from training are not tangible, but most companies still spend money on their employees because they can become more efficient. Similarly, when we respond to sunk costs positively, they can provide the same kind of intangible benefits as training. Mistakes were made, but mistakes are an opportunity for growth. We all write bad code. Just be sure you learn from it and become a better developer!

UPDATE: Some clarification on sunk costs - a reader pointed out that a sunk cost isn't necessarily a bad decision or mistake, just an unrecoverable past expenditure. I'm no economist, but it seems that the term typically carries negative connotations.

posted on Thursday, March 29, 2007 8:39:07 AM (Central Daylight Time, UTC-05:00)  #    Comments [0]
# Tuesday, March 20, 2007

This is completely off-topic, but I thought it was pretty funny.

I had this past Monday off from work and when I got into the office today, I noticed that I had a voicemail. As a programmer, that usually isn't a good sign, because many times it means a user has tried to call to let you know about a problem. When I noticed the message was left on Saturday morning, that made it seem even worse.

Then I actually listened to the message.

"If you would like to accept this call, please press 3... now."

I won't give you the rest of the message. Needless to say, hearing that prerecorded voice telling me my options for a collect call that I wasn't able to accept made me feel much better about my day.

I hope a user wasn't trying to call me collect.

posted on Tuesday, March 20, 2007 7:09:34 AM (Central Daylight Time, UTC-05:00)  #    Comments [0]
# Thursday, March 15, 2007

So, want to improve at what you're doing?

In a phrase, don't stop learning.

In my profession (software development), this is even more important, because the field sure isn't going to wait for you. Jeremy Miller posted about how developers need to get out and "see the world." He was specifically talking about checking out other technologies like Ruby because it can help to see how things can be done differently, but he makes one statement that I liked in particular:

Software development is still a young profession that's in a state of constant flux and it's just not smart to put your head in the sand.

...

Yeah, I know, we all want work to end at 5 pm.  But development is the profession we chose, and if constant learning doesn't suit you, it's time to move onto something else.

This reminds me of a phrase that Scott Hanselman used in his recent podcast on "Hiring and Interviewing Engineers." Here's the relevant snippet from the podcast:

Scott Hanselman: ... I also ask
people about what blogs they read, what books
they read, how do they become lifelong
learners
...

Carl Franklin: Yeah, very important.

Scott Hanselman: ...because it is not that you
want them to be people who are necessarily
working on Open Source projects at night, but
they should be enthused; they should be stoked
about whatever they are working on.

I actually typically use my lunch hour to catch up on feeds, which are an excellent source of continuing learning. As far as books... well, I've got like 5 or 6 at home that I need to read. I still need to work on that.

What are your tips on continual learning?

(man, this post reads a lot like those cheesy "the more you know" commercials from TV... sorry...)

posted on Thursday, March 15, 2007 1:36:50 PM (Central Daylight Time, UTC-05:00)  #    Comments [0]
# Thursday, March 08, 2007

I'm sure I'm the only one that has ever messed up like this, but anyway...

My TV is one of the 30" HDTV monitors. It was cheaper at the time and the box didn't mention anything about it not being a true "HD" TV. In other words, it doesn't support HD without a tuner. Regardless, though, it was cheap and it has a great picture.

Unfortunately, it doesn't have HDMI input, so when I upgraded from the old HD package from Dish Network to their HD/DVR service, the upgraded receiver I got only had component output and HDMI output.

Big deal, right? Surely I can deal with component.

Except that my Xbox 360 takes up one of my component inputs and my Wii SHOULD take up the other component input. I'm out of component inputs.

I did what any other self-respecting geek would do and headed over to monoprice.com, which is by far the best place to get cables or adapters... period. I ordered an HDMI to DVI converter a few days after ordering my Wii component cables. The Wii cables came first, so my 360 was unhooked for a few days while I could enjoy some 480p Wii goodness (it does look better than the 480i with the prepackaged composite cables by the way).

Today, my HDMI to DVI converter came.

And I goofed up.

I ordered the DVI (male) to HDMI (female) converter.

Not the DVI (female) to HDMI (male) converter.

The plugs don't work that way.

*sigh*

What's even better is I didn't realize this until I had already pulled the TV out, unhooked the satellite receiver from the component and rehooked the 360 component back in.

Moral of the story: double check your cables before you buy new cables.

posted on Thursday, March 08, 2007 6:37:08 PM (Central Standard Time, UTC-06:00)  #    Comments [0]
# Friday, March 02, 2007

Your programmer personality type is:
DHSC

You're a Doer.
You are very quick at getting tasks done. You believe the outcome is the most important part of a task and the faster you can reach that outcome the better. After all, time is money.
You like coding at a High level.
The world is made up of objects and components, you should create your programs in the same way.
You work best in a Solo situation.
The best way to program is by yourself. There's no communication problems, you know every part of the code allowing you to write the best programs possible.
You are a Conservative programmer.
The less code you write, the less chance there is of it containing a bug. You write short and to the point code that gets the job done efficiently.

Find out your score at http://www.doolwind.com/index.php?page=11.

posted on Friday, March 02, 2007 7:36:27 AM (Central Standard Time, UTC-06:00)  #    Comments [0]
# Thursday, March 01, 2007

You know about NTWind even if you don't think you do... NTWind is where you can get such awesome tools as WinSnap and TaskSwitchXP. The site has had a blog link on the side for a while, but it had been "under construction" for a few months...

Until now!

So go add the NTWind feed to your reader so that you'll always know when there is an update for one of the NTWind tools!

posted on Thursday, March 01, 2007 8:09:45 AM (Central Standard Time, UTC-06:00)  #    Comments [0]
# Tuesday, February 27, 2007

Jeff Atwood posted a great article talking about programmers that can't actually program.

I've been thinking about this a lot lately. Actually, lately is probably the wrong word, because I really started thinking about this way back when Joel Spolsky posted his infamous article on why he believes that colleges should teach C instead of Java. When that article came out, I had only been out of college for about a couple of years, but during that time, I had already seen my share of examples of programmers who couldn't program. Joel's article couldn't solve this problem for me, though, because these programmers would have had just as much trouble developing in Java as in C.

For many (non-)programmers, there seems to be a fundamental misunderstanding about programming in general, particularly with the ability to formulate basic algorithms to solve simple tasks. One example involved a programmer that had trouble with anything beyond placing formatted data to an HTML form. This programmer was tasked with moving through a DOM table to highlight cells that had certain values in them. In programming terms, he basically had to traverse an array checking for conditions - a very simple algorithm. However, he froze when he got to that part of his project, because he hadn't been trained in thinking about problems and how to solve them.

The examples that Jeff notes are just as much or more appalling and also show that these aren't isolated incidents.

What do we do about this problem?

At the end of his post, Jeff notes Steve McConnell's book on the profession of software development. It is an interesting concept and reminds me of a conversation I had with a pharmacist I met in my MBA program. He noted that some professions, such as pharmacy, have certifications to let the rest of us know that an individual actually knows what he or she is talking about regarding their profession while there are other professions that don't provide any sort of guarantee as to the actual knowledge someone possesses. I'm reminded of my wife in this case, because she has certifications for speech and language pathology. One of the requirements for her to keep her certifications is that she must have X number of hours of continuing education each year.

Could something like this work with software development?

There are obviously already many different certifications that exist (Microsoft certifications, Sun certifications, Oracle certifications, the list goes on), but that really brings out one of the problems with certifications in software development. I don't want to be a good developer with just Microsoft tools - I want to be a good developer period. If a software development certification existed that could ensure that someone was a competent developer and had a good knowledge of programming in general, it might work, but then again, the field changes constantly.

"OOP all the way!"

"No! TDD all the way!"

"Oh yeah, well, what about functional programming?"

"But... you can have functional and TDD at the same time!"

"You guys are all morons, QUANTUM programming is the way to go!"

It would be nigh impossible to have a certification that would be relevant and, more importantly, STAY relevant.

I'm sure I'm not adding anything new to this subject, but it has been on my mind for a while. I think I like the idea of a certification that requires continuing education - that almost seems like a must with software development. I primarily work with .NET 2.0 right now but it almost feels like what I'm working on isn't even relevant because of all the talk about .NET 3.0 (I know, just an extension of .NET 2.0) and LINQ, DLINQ, etc (actually coming from the upcoming new version of the framework.... 3.5?).

How would continuing education be defined in software development? Is it conferences? Reading blogs or books? Working on a variety of different projects so that you gain experience with different technologies?

Can the problem of programmers who can't program even be solved?

(By the way, before someone starts griping, I'm not advocating certifications... at least I don't think I am. I just want to see this problem fixed. Isn't that what all programmers want to do? Solve problems?)

...

I think this might be one of the longest posts I've ever written.

NOTE: This post was NOT inspired by anyone in particular... don't worry. Don't go thinking you're an awful programmer and I hate you.  :-)

posted on Tuesday, February 27, 2007 12:53:07 PM (Central Standard Time, UTC-06:00)  #    Comments [0]
# Monday, February 26, 2007

I guess Worse Than Failure fits a little better than what I had resorted to calling it on my own: "Where's the Function?"

It didn't communicate the same feeling of horror and disbelief as the actual, intended acronym, but it was cleaner and easier to speak openly about among the cubicle farm :-)

Now to get used to the new name.

posted on Monday, February 26, 2007 7:18:23 AM (Central Standard Time, UTC-06:00)  #    Comments [0]
# Thursday, January 18, 2007

I probably should have just submitted this one to Overheard at the Office, but I'd rather post it here.

"It's not that I'm lazy, it's just that I want to be thorough."

This was from one of my coworkers who was speaking to a user upstairs.

I found it hilarious.

posted on Thursday, January 18, 2007 1:20:52 PM (Central Standard Time, UTC-06:00)  #    Comments [0]
# Wednesday, January 10, 2007

A recent post by Lee Holmes on breaking your writer's (blogger's?) block is prompting this post. I recently finished reading Steve McConnell's book, Code Complete*, over the Christmas holidays and the book was amazing. As I read it, I began taking lists of things I wanted to post on that were excellent advice... and ran into a block because there was just so much I wanted to say about. I still plan on writing more detailed posts on the issue but, as Lee suggests, I need to just get out here and post more.

So anyway.

Recently, I posted an entry on calculating file hashes with PowerShell and promptly had to put an update because the PowerShell Community Extensions (PsCx) had provided a better file hash function. The good thing about PsCx is that it really provides a good example of PowerShell code and has a lot of cmdlets that drive home automating PowerShell for your needs.

One of my favorite functions is incredibly simple but it highlights how you can save just a few keystrokes for more productivity. The Edit-File function uses a predefined variable that points to an EXE path and runs the EXE with the specified parameter. There is also an alias for it (e) so you can type something like "e somefile.txt" and it will open. I like this method a little better than actually renaming notepad.exe to n.exe (*cough* Scott Hanselman *cough* :-) ). It actually prompted me to create multiple, similar functions so that I can open files in different editors (I use Ultra-Edit, Notepad2, Notepad++, or who knows what else) without having to respecify the editor variable. Now I type "u somefile.txt" to open a file in Ultra-Edit.

This also prompted me to set up the winmerge function below:

function winmerge ([string]$path1, [string]$path2) {

    $winmergePath = "c:\program files\winmerge\winmerge.exe"
    . $winmergePath $path1 $path2
}

It allows me to quickly see the comparisons between two different files without having to preselect them with the mouse. It is simple, but quite convenient. And I also don't have to go adding all sorts of random directories to my PATH just so I can get to them more quickly.

So there you go: my PowerShell automation.

I also promised some unrelated updates. On Monday, January 8, I had LASIK surgery on both of my eyes to correct my extreme nearsightedness. The whole operation took 15 minutes and the only discomfort I had was a headache and some stinging eyes on the day of the operation. Since that time, my left eye can already see with 20/15 vision. My right eye is still a little fuzzy, but that is supposed to clear up in another day or so - it took the laser twice as long to correct my right eye as it did my left eye!

If anyone is interested in more details on my experiences with LASIK, I'd be happy to provide a follow-up post on it.

* - Jeff Atwood really should get some sort of referral rewards for recommending Code Complete... I mean seriously...

posted on Wednesday, January 10, 2007 9:38:44 PM (Central Standard Time, UTC-06:00)  #    Comments [0]
# Tuesday, October 31, 2006

Colin has raved about the joys of middle clicking for a while now, but I was never able to enjoy it because clicking my mouse's middle button never seemed to do all of the cool things that his did. Mine brought up a really weird multi-directional arrow thing that was supposed to let me scroll in any direction I wanted - except that it rarely worked the way I wanted it to.

Well, I finally decided it was time to fix it once and for all so that I could enjoy middle clicking like the rest of the world.

The mouse in question that I'm using is the Logitech MX700 *.

Here's what my mouse settings dialog looked like when it didn't work:

Now that it does work, it looks like this:

The difference is subtle, but all I did was change the functionality for the middle button from "Universal Scroll" to "Middle Button." That was way too easy for me to have missed it for this long, but I'm glad I finally found it. If you're having a similar problem getting your MX700 (or other similar Logitech mouse) doing middle clicks the way you want, check out what your setting is.

* - The Logitech MX700 is a great mouse that has a recharging dock so you don't have to buy batteries all of time... I've been using mine for almost 3 years without any new batteries. I can also highly recommend the Logitech MX1000, which I use at home. I plan on sticking with Logitech mice unless Microsoft ever releases a wireless mouse with a rechargeable dock. That rechargeable dock makes all of the difference.

posted on Tuesday, October 31, 2006 2:13:17 PM (Central Daylight Time, UTC-05:00)  #    Comments [0]
# Monday, October 30, 2006

I'm having my first 9 minutes of fame... ever!

Check it out here!

(from Jon Galloway)

posted on Monday, October 30, 2006 1:58:00 PM (Central Daylight Time, UTC-05:00)  #    Comments [0]
# Tuesday, October 24, 2006

For those of you who don't subscribe to digg, check this out.

From the website:

"The Microsoft Internet Explorer Team sent us a cake for the upcoming release of Firefox 2!"

(via digg)

posted on Tuesday, October 24, 2006 7:30:04 PM (Central Daylight Time, UTC-05:00)  #    Comments [0]
# Wednesday, October 18, 2006

Earlier this week, I posted on some major problems I was having with trackback spam. By way of a comment, Tim Rayburn pointed me to his post on Akismet support that the nightly builds of dasBlog now included.

As a result, last night, I downloaded the latest build of dasBlog and uploaded the new binaries to my blog. Shortly thereafter, I was able to log onto my blog and see the section for Akismet. Sweet! I went ahead and signed up for a Wordpress account (by doing so, you can get a free Akismet API code). Things were looking great so I thought I'd let it go and check it the next day.

Today is the next day and I just finished deleting about 250 spam trackbacks on various posts. Needless to say, I've disabled Trackback support on my blog again.

My problem is that I'm not sure if I messed up on my upgrade or if there is a problem with the Akismet support... OR maybe it is because of the possibility that my web host doesn't allow web requests (see Phil's post on WebPermission and Akismet in SubText). I'm not in control of the web server my blog runs on, so I wouldn't be at all surprised to find that my blog doesn't have WebPermission. I guess my problem is that I'm not really sure if that's the problem or if it is something else entirely. I'm blogging this from work over my lunch break, so I don't have time to dig through logs right now.

I guess I'm just blogging because I'm a little down because Trackback spam won today.

Spam is stupid.

posted on Wednesday, October 18, 2006 1:07:51 PM (Central Daylight Time, UTC-05:00)  #    Comments [0]
# Monday, October 16, 2006
I finally had to disable trackbacks on my blog. Even with some of the antispam features of dasBlog, I was still getting hit like crazy. Just today, I got about 150 spam trackbacks to 3 or 4 of my posts. And I'm even running version 1.9.6264.0! I did notice this post about an HttpModule that will block trackbacks based on regular expression patterns. I was curious if anyone else had used this or another method to effectively fight (or even prevent) trackback spam. Or maybe I'm just missing an updated blacklist for my configuration.

Help anyone?

UPDATE: Thanks to a post from Tim Rayburn (and a comment directing me there!), it looks like the newest nightly build of dasBlog supports Akismet -- and Akismet apparently also supports better Trackback spam blocking! Looks like I might be dogfooding the latest build of dasBlog soon!

posted on Monday, October 16, 2006 5:07:39 PM (Central Daylight Time, UTC-05:00)  #    Comments [1]
# Thursday, September 28, 2006

Great news!

Google Reader has been updated and it is usable now!

Find out more here!

(Thank you Digg!!!)

posted on Thursday, September 28, 2006 9:25:37 PM (Central Daylight Time, UTC-05:00)  #    Comments [0]
# Wednesday, September 13, 2006

I recently upgraded Firefox to the 2.0 beta version. It has some nice features built in and it seems a lot more stable than the previous beta version. One complaint I had with it was the lack of support for extensions, though Mike Gunderloy pointed out the Nightly Tester Tools that will attempt to make extensions compatible - and for me, 99% of the time, the Nightly Tester Tools works. In fact, it worked for 100% of my extensions, but Tab Mix Plus didn't pull all its functionality along with it to 2.0. The extension shows as working correctly, but it doesn't actually work correctly and really, it only states compatability with 1.6+ so I shouldn't be surprised. However, as Colin pointed out, Tab Mix Plus has some really great functionality, and I was missing it in Firefox 2.0, like the ability to keep sessions for the next load of Firefox.

I recently discovered that Firefox 2.0 has this ability built in, but it isn't the most intuitive to find yet, at least for me. Here's a screenshot of what the options dialog looks like on my PC:

Firefox Options

What's funny is that this option is right on the Main tab! I guess I should have looked more closely, but I had spent most of the time looking in the tab options. If you're wondering where to find this new functionality, look no further.

posted on Wednesday, September 13, 2006 7:21:01 AM (Central Daylight Time, UTC-05:00)  #    Comments [0]
# Friday, September 08, 2006

Windows One Care doesn't work in RC1, but they've still included it in the "Offers from Microsoft" section of Vista's welcome center. That's sort of annoying, because I've already signed up for Windows One Care, but now I can't use it in the system that actually is trying to get me to use it!

UPDATE: Now it does!

posted on Friday, September 08, 2006 5:28:19 PM (Central Daylight Time, UTC-05:00)  #    Comments [0]
# Saturday, August 26, 2006
Jeff Atwood just posted an excellent Programmer's Bill of Rights, which suggests things such as providing at least two monitors for every programmer, providing a fast PC, etc. One thing in particular that he mentioned is that all programmers should have quiet working conditions, and I couldn't agree more, because I sit near some of loudest people at work. Of course, we're all in cubes, too, so it isn't like I can shut the door. I hear more about someone's daughter than I do about work, too. I ended up taking Jeff's advice and dropping some money on some nice headphones that drown out some of the noise, but I think I would end up blowing my ear drums out before I'd drown out all of the noise. I recently moved cubes over to this new, loud area, but it wasn't much better before - I used to sit next to the break room, so you can imagine what it was like there, too.
posted on Saturday, August 26, 2006 9:33:57 PM (Central Daylight Time, UTC-05:00)  #    Comments [0]
# Wednesday, August 02, 2006
wikiality (wi-ki-al-i-ty) - the process of creating "reality" (see reality) by making something up on Wikipedia enough that more and more people agree with you.

It looks like Stephen Colbert from the Colbert Report on Comedy Central had some fun with Wikipedia recently. Check it out.
posted on Wednesday, August 02, 2006 1:37:32 PM (Central Daylight Time, UTC-05:00)  #    Comments [0]
# Tuesday, July 18, 2006
Earlier today, Mark Russinovich announced that Microsoft had acquired Winternals and Sysinternals. In other words, some of the best administration tools available will be moving to Microsoft. Not only that, but by having Mark on board at Microsoft, they will have a great developer working with them. I think that this is a great move as far as bringing Mark on board. As far as acquiring Winternals and Sysinternals, I'm excited about that as well, so long as the products continue to be supported by Microsoft. I'm quite confident they will, too, because I know that Microsoft uses a lot of their tools as well (i.e. Process Explorer, RegMon, FileMon, etc).

Congratulations and I look forward to hearing more!
posted on Tuesday, July 18, 2006 12:11:58 PM (Central Daylight Time, UTC-05:00)  #    Comments [0]
# Thursday, July 13, 2006

Last night, Cara and I were driving back from church during a thunderstorm. The entire time, I kept wishing that I had my digital camera with me, because the lightning was amazing! The storm was almost past just as the sun was going down, so the entire sky was almost golden in color. There was also a full rainbow all the way across the sky. While all of this was going on, the lightning was filling the sky, shooting from cloud to cloud. (side note - I'm not a writer, so if my descriptive writing skills are lacking, I apologize)

Well, today at work, I notice a post on digg about "incredible pictures" and "the moment lightning shared the sky with a rainbow." Hmm... that's interesting. But surely it couldn't be Fort Smith, Arkansas, now could it? But it is! Check out the digg post here.

The actual website with pictures is here at Daily Mail. The craziest part of all is that this Daily Mail site is apparently a British site! Be sure to check out the pictures.

posted on Thursday, July 13, 2006 12:24:56 PM (Central Daylight Time, UTC-05:00)  #    Comments [0]
# Tuesday, July 11, 2006

Just last month, I posted on how much I hated corporate content filters, specifically for blocking sites such as Scott Hanselman's site and del.icio.us, labeling them as "personal" sites. I've got good news and bad news regarding my rant from earlier. I spoke with some of my supervisors at work and the technology argument won over regarding Scott's site - they've unblocked it because it is a great technological resource. Unfortunately, del.icio.us does not fall into that category.

Today, I discovered another site that apparently is not a good resource for information: Wikipedia. I guess because users decide on the content of this online encyclopedia, it must be personal. In fact, here is what I see when I attempt to go there at work:

The following error was encountered:

  • Access Denied by SmartFilter: Forbidden, this page (http://en.wikipedia.org/) is categorized as: Personal.

I would post a screenshot, but it has the phone number for the corporate help desk and other related information. You know, one of the things that is most frustrating of all is that the entire content filtering system has nothing to do with productivity at work. Why? Because ESPN.com isn't blocked. And no, my company has NOTHING to do with sports. Enough people would complain if ESPN were blocked that they keep it open, while blocking sites that are actually beneficial to work, such as Wikipedia and del.icio.us. Oh, and by the way, Chris Sell's site is blocked because it is personal, too.

Just another frustration from the life of a programmer I suppose.

posted on Tuesday, July 11, 2006 4:39:37 PM (Central Daylight Time, UTC-05:00)  #    Comments [0]
# Monday, July 10, 2006

This will be a short post, but someone at work emailed me a link to a page that will let you see how fast you can type. Check it out here! Here are my results from my last run:

---------------------------
Windows Internet Explorer
---------------------------
Wow! Your typing speed (with 5 mistakes) is:

104.55 wpm
438.62 cpm
---------------------------
OK  
---------------------------

Not too bad, eh?

posted on Monday, July 10, 2006 10:08:02 PM (Central Daylight Time, UTC-05:00)  #    Comments [0]
# Thursday, June 22, 2006
I hate corporate proxies and content filters!

First, it starts blocking Scott Hanselman's site for "personal" reasons. Apparently, we can't be looking at the "personal" weblog of a technical speaker and great technical resource!

Give me a break!

Well, now it is blocking del.icio.us!!! For "personal" reasons!

I've got plenty of technical related bookmarks stored out there! It is a great resource!

Who knows, my blog may be blocked soon for "personal" reasons!

Who runs this junk anyway?!?

(I realize that there are completely legitimate reasons for proxies and content filters, but blocking sites for blanket personal reasons is a little ridiculous.)
posted on Thursday, June 22, 2006 7:36:13 AM (Central Daylight Time, UTC-05:00)  #    Comments [0]
# Wednesday, June 21, 2006

Has anyone ever heard that saying? One of my MBA professors said that it was the number one rule for managers. "You get what you reward." Basically, the idea is that if you want a team to work together, then you need to reward good team behavior. It is all about recognizing what true motivation is, because the reward has to be perceived as a reward. A nice pat on the back isn't a real reward for someone unless that pat on the back will motivate them.

Hacknot recently posted an article related to technical leadership and common mistakes related to leading in a technology environment. One of the mistakes he lists is "employing hokey motivational techniques."

...managers value perception and status, so being presented with an award in front of everyone, or receiving a plaque to display on their wall where everyone can see it, may well be motivating to them. However programmers tend to be focused on the practical and functional, and value things that they can use to some advantage. Programmers regard the sorts of rewards that managers typically receive as superficial and trite.

How true that statement is. One of the things I've learned to think about in my MBA program is that good leaders recognize that not everyone is the same. In the same way that people from different cultural backgrounds are motivated by different things (i.e. an individualistic culture versus a collective culture), people in different professions are also motivated by different things. Honestly, different professions ARE different cultures.

It sounds like a fairly simple concept, but apparently it is a lot harder to understand than I realize. That, or more people need to start reading Hacknot.

posted on Wednesday, June 21, 2006 12:56:40 PM (Central Daylight Time, UTC-05:00)  #    Comments [0]
# Wednesday, June 07, 2006
I'll apologize ahead of time... one of the features that I am (or was?) looking most forward to in Office 2007 is the ability to save as PDF. Will I ever use it? I have no idea, but I've really wanted to be able to do that for a long time. And then Adobe goes and messes the whole thing up. How in the world can they truthfully justify letting everyone else (Apple, OpenOffice, etc) have this feature, but Microsoft can't?!? Give me a break! If they didn't want companies putting this feature in, they never should have opened the format in the first place! Via this digg post, I came across this article from the Washington Post. The article states it best:
Then there's the thought that Adobe's Acrobat, at $299, will compete poorly with any free save-as-PDF option. But Adobe had to have foreseen that possibility when it issued a blanket invitation to the world to write PDF-compatible software. As its own documentation reads, "Adobe gives anyone copyright permission, subject to the conditions stated below, to . . . Write drivers and applications that produce output represented in the Portable Document Format."
Super.

By the way, totally unrelated to this entire post, if you haven't checked out Foxit Reader, I would highly recommend it. :-)
posted on Wednesday, June 07, 2006 7:36:15 AM (Central Daylight Time, UTC-05:00)  #    Comments [0]
# Tuesday, June 06, 2006
As many of you are aware, if you attempt to access your Outlook data using some of the Outlook Interop assemblies, you'll be seeing a security dialog informing you that something is attempting to access your emails and whether or not you will allow this. If you're like me, you've run into this before and attempted to circumvent it.

Well, with the advent of Office 2007, we can all breathe a huge sigh of relief. Why, you ask? Because the fine folks at Microsoft heard our collective annoyances about the security model and fixed it! For the long story, check out this MSDN article. Here's the gist of it:
Outlook 2007 introduces an important change in the way that the Outlook object model guard operates. While the behavior of the object model guard has not changed significantly for Outlook add-ins, Outlook 2007 allows external applications to run without object model guard prompts—provided that the computer on which your code is running has functional antivirus software installed and that all antivirus definitions are current."
I've bolded the important part for you. Now, you'll only get the warning if your antivirus software is out of date. You also have the option to either always show the warnings (yeah, right) or completely disable the warnings. Your choice.

Great news!
posted on Tuesday, June 06, 2006 4:54:50 PM (Central Daylight Time, UTC-05:00)  #    Comments [0]
# Tuesday, May 30, 2006
One of my co-workers was recently chided for emailing a password to access an internal server recently. "Don't email passwords! Email isn't secure!" I don't know if those were the exact words, but you get the point. Don't send around secure data by insecure means, right?

Later, this same co-worker of mine was handed a sticky note with a server name, userid, and password with which to access a different internal server. This note was from the same group who has been preaching on not sending secure data by insecure means like email.

Let that sink in for a second.

I just have a simple question... what makes a sticky note stuck on a monitor any more secure than sending an email? Just curious...
posted on Tuesday, May 30, 2006 4:27:14 PM (Central Daylight Time, UTC-05:00)  #    Comments [0]
# Tuesday, May 16, 2006
Marcos, thanks for the heads up on the captcha image not working...

I just tried the comment link myself and it failed. I copied the source for the image it was trying to load and the page I got gave me an error about XML parsing - "no element found". Anyone else having any problems with dasBlog and the captcha image not working?

Am I running an older version? Has there been an update?

I finally got the captcha image up, but it would appear it was more because of my persistence than actually changing anything (aka I kept clicking comments... something about definition of insanity...).
posted on Tuesday, May 16, 2006 12:42:18 PM (Central Daylight Time, UTC-05:00)  #    Comments [3]
# Wednesday, May 10, 2006
Well, I jumped on the Share Your OPML bandwagon today...

Scott is right, too - one of the most interesting aspects of the website is the Subscriptions Like Mine section.

Is it a surprise to anyone that the subscription most like mine is Colin's? (or is mine most like his???) Also, I have to say, I can't believe that some people out there have almost 3000 feeds they subscribe to (see Most Prolific Subscribers). Can we say information overload?
posted on Wednesday, May 10, 2006 12:54:40 PM (Central Daylight Time, UTC-05:00)  #    Comments [0]
# Thursday, April 27, 2006

I've really become a fan of MSN Desktop Search at work. I don't really use the toolbar at all, because I've got tabbed browsing in both Firefox and the IE7 beta, but the search features are great. I also like it better than Google's offering because the results don't pull up in a webpage. Even with all the buzz over AJAX lately, there is still a lot more interaction that can happen with a true client application.

Anyway, on to Desktop Search. It makes finding emails SO MUCH easier. The ability to use special search keywords makes it even better. For example, let's say I wanted to find all emails from me. Here's what I could do:

kind:mail from:David Mohundro

Voila! I now have all emails from me. The kind keyword lets you specify things like mail, pictures, documents, etc. If you want to get even more detailed, you can use things like the ext keyword and specify file extensions. Here's a search to find all icon files that have 'mail' in the name.

ext:ico mail

I haven't seen an all-encompassing list of all of the different keywords that you can use with Desktop Search, but there are quite a few if you'll look in the Desktop Search Help under Advanced Users.

And don't forget to use CTRL+ALT+M to get focus to your search box!

NOTE: If you're running into performance problems with it, check out this KB download. It really helped speed Desktop Search up on my PC. I couldn't work without it now.

posted on Thursday, April 27, 2006 12:47:24 PM (Central Daylight Time, UTC-05:00)  #    Comments [0]
# Thursday, April 13, 2006
Check out this article on ABC News. Or this press release from Winternals.

Apparently, a few members of Geek Squad have been using pirated versions of software from Winternals. In case you're unfamiliar with Winternals, they're the enterprise side of Sysinternals, which provides the excellent Process Explorer as well as a few other invaluable tools. Mark Russinovich, who discovered the original Sony DRM rootkit, is one of the people who established the company.

Way to go Best Buy.
posted on Thursday, April 13, 2006 1:06:37 PM (Central Daylight Time, UTC-05:00)  #    Comments [0]
# Friday, March 31, 2006

Yesterday afternoon, I posted on ShellExecuteEx and executing files with unknown file extensions. I was really confused, though, because my feed just wouldn't show up in my aggregator (RSS Bandit). I knew it wasn't my reader, though, because I had navigated to my feed's address (http://feeds.feedburner.com/DavidMohundro) and it wasn't displaying my added post. I threw a few test posts out there but nothing would show up. I'll admit, I couldn't help but wonder if something had happened with FeedBurner. I shouldn't have doubted, though. It was indirectly my fault.

You see, FeedBurner has a nice report called FeedMedic (located under their Troubleshootize tab). I hadn't found that report until this afternoon. It informed me that my source feed was too large.

Wha???

Apparently, my last post on file extensions was too big. I ended up editing the last post and taking out a lot of the unnecessary HTML that came out of my code to HTML addin. I ended up using Jeff Atwood's great FormatToHtml VS2005 macro. The HTML it generates is a lot simpler, but also a lot cleaner. That solution alone dropped my post under the "large" size. Now everyone can happily see my posts again!

posted on Friday, March 31, 2006 6:04:26 PM (Central Daylight Time, UTC-05:00)  #    Comments [0]
# Wednesday, March 29, 2006

If Hollywood had its way with history, this might be what it would like.

It is basically the history of the world if every movie actually happened.

Nice.

(via Woot)

posted on Wednesday, March 29, 2006 9:10:03 AM (Central Daylight Time, UTC-05:00)  #    Comments [0]
# Friday, March 24, 2006

Yesterday, after I had been at work for about an hour, Outlook started giving me some weird errors (something about cyclic redundancy checks). I googled the error and found a KB article that suggested that I try chkdsk. I tried that and it found some bad sectors on my drive. Afterwards, my computer booted back up and from then on... utter mayhem. Explorer would die with "Unknown hard errors" all over the place.

Below is a screenshot of my eventvwr after my disk was ghosted to a new, working drive. As you can see, the all-wise eventvwr knew there were problems before I did.

posted on Friday, March 24, 2006 6:09:06 PM (Central Daylight Time, UTC-05:00)  #    Comments [0]
# Monday, March 20, 2006

It looks like the build from MIX06 has been released.

Check out the post from the IEBlog here!

posted on Monday, March 20, 2006 2:00:53 PM (Central Daylight Time, UTC-05:00)  #    Comments [0]

Some of you may be aware that I'm currently pursuing my MBA. (I would've preferred to get my master's degree in CS or something like that, but there weren't any good options nearby that would allow me to get my degree part-time.)

One of the things that I've often heard in my classes is how a system of reviews is needed. One popular form of reviews that is mentioned often is anonymous 360 degree reviews. Basically, you not only get the standard review from your supervisor, but you also give anonymous reviews back to your supervisor as well as to the others in your department. With this system, peers can share feedback and supervisors get to hear how the area thinks they're doing.

Personally, I really like this idea. It gives everyone the chance to share ideas and feedback on how everyone is doing without worrying about hurt feelings. Not only that, but employees don't have to worry about the pointy-haired boss not liking them anymore because they suggested a different way of doing things.

In a programming environment, it would be a good way to suggest to management things like employing unit tests or to let a peer know that they really need to work on their documentation in their projects. It seems like a simple and cost-effective means of spreading knowledge and getting people involved.

What do you think? Am I off base here or do you think this really works? Does anyone actually have any experience with this, particularly in a software environment? I mean, even Dilbert has 360 degree reviews!

(I wonder if I should have a Business category for posts like this...)

posted on Monday, March 20, 2006 1:57:21 PM (Central Daylight Time, UTC-05:00)  #    Comments [0]
# Saturday, March 18, 2006
As some of you may have noticed, I changed my blog's theme ever so slightly to encorporate the cool, orange feed icon:

 

It is quickly becoming the standard way to indicate to users that a feed is available for aggregation. By way of FeedBurner, I found the Feed Icons website, which is striving to help establish the icon as a standard. There, you can download the icon in different colors so it better fits your existing theme. If you've got a site that has a feed, you might consider updating your site to use the new icons. I believe that FireFox was the first to use the icon, but now Internet Explorer has decided to use the icon as well. Standardization is a great thing, eh?

posted on Saturday, March 18, 2006 6:36:23 PM (Central Daylight Time, UTC-05:00)  #    Comments [0]
# Friday, March 10, 2006

The majority of the time I spend in front of computers is at work where a proxy has been set up. I don't have a problem with proxies, but it does really annoy me when I try out applications that have very limited support for them. It doesn't help any that the configuration for the proxy at work is through a configuration script (in Internet Explorer, see Tools -> Internet Options -> Connections -> LAN settings -> Use automatic configuration script).

In using configuration scripts, we avoid having to hardcode proxy addresses, ports, userids and passwords. Instead, we are just prompted for our userid and password every time we start up a program that connects to the internet (annoying on its own)... so long as that program supports configuration scripts. The only Internet-capable applications I currently use that support these scripts (as far as I know) are Internet Explorer and Firefox. Period. Take RSS Bandit, which I use every day. I've got a hard-coded proxy address, port, userid and password in there just so that it will work. Every time I change my network password, I have to go in there and change it there as well. Annoying. The second example is PostXING. I've really, really been looking forward to the new release of this application. I never was able to get the prior version to work with proxies. Well, yesterday the beta of the new release was released... and I can't get it to work through proxies. I've used PostXING at home many times and I really like it, but I just can't use it at work... where I spend most of my time.

Now, I have no idea what it takes to program support for proxies and configuration scripts. For all I know, configuration scripts may not even be used mainstream, even in corporate environments. Maybe I should research that. Anyway, my short rant has gotten longer than I intended.

NOTE: Don't take my comments as negative towards RSS Bandit or PostXING. I highly recommend them. I just wish they supported my corporate setup a little better :-)

posted on Friday, March 10, 2006 7:23:43 AM (Central Standard Time, UTC-06:00)  #    Comments [0]
# Thursday, March 09, 2006

Words can't describe this. You've got to see it for yourself.

(Can you imagine programming at 10240x3072?)

(via Digg)

posted on Thursday, March 09, 2006 7:25:13 AM (Central Standard Time, UTC-06:00)  #    Comments [0]
# Wednesday, March 08, 2006

Live.com received a makeover recently, and their search engine has been revamped. I've played around with Live.com before, but never really used it. The changes they've made are definitely an improvement, but after adding a few of my own feeds to it, I'm still seeing some unexpected behavior such as sections overlapping each other. I'm using the IE7 beta 2 preview.

The search engine has some pretty nice features, like smart scrolling, which allows you to scroll all of the results instead of having to go between pages. It is interesting at the very least. A cool idea is the ability to search within pages directly from the search results page. It is worth having a look. I did run into a few issues with it such as getting some permission denied JavaScript errors after a couple of searches.

I would consider using it more after some of the edges are cleaned up.

UPDATE: I tried the search feature again... it is really pretty cool. I haven't used it enough to get a feel for how accurate the search results are, but I really do like the way it handles scrolling. We'll see how continued usage goes.

posted on Wednesday, March 08, 2006 12:46:12 PM (Central Standard Time, UTC-06:00)  #    Comments [0]
# Saturday, March 04, 2006

I recently moved my feeds over to FeedBurner, so if you're subscribed to my feed, please point over to my new FeedBurner address at http://feeds.feedburner.com/DavidMohundro.

Also, thanks to Darren Neimke for moving his feed over in the first place. I hadn't considered looking at FeedBurner until he mentioned it for his blog.

posted on Saturday, March 04, 2006 3:11:51 PM (Central Standard Time, UTC-06:00)  #    Comments [0]
# Wednesday, March 01, 2006
Check out Open Web Design.

They've got some web templates out there that look great. And they're open source, too! Looks like the perfect tool for people who want their websites to look cool, but don't have an eye for it.

(via Digg)
posted on Wednesday, March 01, 2006 1:02:59 PM (Central Standard Time, UTC-06:00)  #    Comments [0]
# Thursday, February 23, 2006
Jeff Atwood posted a very interesting article today detailing the effects of icons, text, and combinations of the two in toolbars. I particularly liked his comparison of using different icon sets for toolbars. The image of Word with all possible toolbars displayed was particularly horrifying, though.

There is something to be said for having both icons and text. I think of Outlook a few years ago versus Outlook today. I believe Outlook 97 defaulted to just displaying icons. It was also one of the most complicated email programs out there. Today, Outlook is my preferred email client, and it has a nice combination of displaying ToolStrip items with icons and text both. The text tells us exactly what it does, but the icons do have meaning. I keep thinking back to all of the comments to posts on the IEBlog. There was a lot of positive response to the standardization of the RSS icon. There have been a lot of negative responses to some of the changes to the other IE icons, though, in particularly the combination of refresh and stop that they had prior to the Beta 2 Preview. (that might have more to do with having one button do multiple things, though).

Anyway, as I said, an interesting post, so check it out!
posted on Thursday, February 23, 2006 7:33:39 AM (Central Standard Time, UTC-06:00)  #    Comments [0]
# Monday, February 20, 2006

Okay, I couldn't resist this. How often is it that you see CNN.com post something about Tiger Poo?!?

Sorry, I'm easily entertained.

posted on Monday, February 20, 2006 7:54:46 AM (Central Standard Time, UTC-06:00)  #    Comments [0]
# Saturday, February 18, 2006

When I registered www.mohundro.com, it was always my intention to have a technical blog (what you're reading) and a personal site where my wife and I could post pictures and news. I wanted the primary site to be for family, etc, so I made that the root directory. My technical blog (which likely will get more visitors) would live in a subfolder.

Well, I've finally put a site out there for my wife and I and it is at http://www.mohundro.com. Easy enough to remember if you can get to this page. I've also added a link under my navigation to get there. I plan on blogging about some of the techniques I used with it soon so, if you're interested, check back soon.

posted on Saturday, February 18, 2006 8:02:23 PM (Central Standard Time, UTC-06:00)  #    Comments [0]
# Thursday, February 09, 2006

Rory Blyth, the man who brought us the "steel cage death match" of the Avalon authors, tells us what happens when public speaking goes wrong. The way I see it, if you never get in the car in the first place, you can't ever run someone over. Let someone else do the driving.

(My driving comments were an allusion to his post... I do drive my car each and every day to work... in case you were wondering...)

posted on Thursday, February 09, 2006 7:44:18 AM (Central Standard Time, UTC-06:00)  #    Comments [0]
# Monday, February 06, 2006

There has been a lot of talk recently about VMware releasing a version of their VMware server product for free. The beta version was released today, though the big news to me is that there are a multitude of free "pre-built, ready-to-run virtual appliances" available for use with VMware server. Of course, as these "appliances" are free, don't expect to see a Windows VM image. It WOULD be a good way to easily play around with different versions of Linux like Red Hat or Ubuntu. I'm curious how Microsoft will respond with their Virtual PC product.

posted on Monday, February 06, 2006 12:43:11 PM (Central Standard Time, UTC-06:00)  #    Comments [0]
# Thursday, January 26, 2006

Check this out.

"The A to Z of Programmer Predilictions" is a funny little article that categorizes programmers into various stereotypes, most of which are surprisingly accurate. As I read through the descriptions, I started spotting people in my organization. Though I (and everyone else) can probably fit into a variety of different personas described there, I probably am most like "Zealous Zack." I DO download all of the betas (even at work!) and, when someone blogs about the "Next New Thing," I've got the download started before I've finished reading the post about it.

Speaking of, I need to download the newest WinFX bits...

(via Digg)

posted on Thursday, January 26, 2006 7:41:44 AM (Central Standard Time, UTC-06:00)  #    Comments [0]
# Friday, January 13, 2006

Do you like C-based languages like C, C++, Java, and C#? Or do you like BASIC instead? It doesn't matter what your answer is, though, because the two links below are hilarious either way.

History of the BASIC family of languages
History of the C family of languages

(via Rockford Lhotka)

posted on Friday, January 13, 2006 2:54:49 PM (Central Standard Time, UTC-06:00)  #    Comments [0]
# Saturday, January 07, 2006

This may seem a little weird, but I was checking my webstats for the blog and I saw that one of the Googlebots came across it. That prompted curiosity on my part to see if I could find this page by searching for it. I didn't find my site yet, but I sure found some other stuff.

I got into the web around 1996 or 1997, right when the internet was becoming more mainstream. I remember using Netscape Composer to build websites back then (I wasn't cool enough to be one of those guys who coded their entire site in Notepad) and the coolest webpages had billions of animated GIFs, a tiled background, and a guestbook. Most of the search results I found were my signing of other people's guestbooks in hopes of having them come and sign MY guestbook. 

The other cool thing to do was to display all of the "awards" that your site had won. They were basically just cooked up images that ANYONE could create. All anyone had to do to get the award was ask for it and then link back to your site. It was all pretty ridiculous, but then again, no one knew better. I actually found one of my awards still being displayed on some site that I have no recollection of ever visiting.

Wow, memories.

posted on Saturday, January 07, 2006 2:17:33 PM (Central Standard Time, UTC-06:00)  #    Comments [0]
# Monday, January 02, 2006

I'm finally a part of the blogosphere. I'll plan on this being a place to post primarily .NET related news as well as tools or other technical related news. We'll see what happens.

posted on Monday, January 02, 2006 10:59:43 PM (Central Standard Time, UTC-06:00)  #    Comments [1]