This blog has been moved to Redwerb.com.

Showing posts with label review. Show all posts
Showing posts with label review. Show all posts

Monday, July 16, 2007

SlickRun Review

Summertime has really effected my blogging schedule. I've been spending my freetime working on a website for my neighborhood and building a garden wall. I'm almost done with the wall, but we might end up extending it another 30 feet, so we'll see.

Just recently I've started using a tool called SlickRun. It's a very simple tool that is essentially just a textbox (no form, buttons, etc). It allows you to type in commands similar to the Run (Win+R) dialog built into Windows. The cool thing about SlickRun however, is that you can also add "MagicWords" to it so that you can perform more complex commands with a single word.

SlickRunConfig There are plenty of configuration options for SlickRun to get it to look and work the way you want (see the screenshot to the right). You can even setup SlickRun to run instead of the Windows Run dialog. This is a little tricky since you have to edit the config file (I'm not sure why this setting isn't in the SlickRun config dialog), but once you set it up, when you press Win+R you get SlickRun!

Instructions to setup SlickRun to handle Win+R in Vista
  1. Install SlickRun
  2. Open Windows Explorer (Win+E)
  3. Navigate to your profile directory (C:\Users\<MyUserName>\AppData\Roaming\SlickRun) - AppData is a hidden folder, however, you should be able to type in the path directly.
  4. Open the SlickRun.ini file in your favorite text editor
  5. Locate the GrabWinR setting and change the value to 1 (GrabWinR=1)
    SlickRunIni
  6. Save the changes

Monday, June 25, 2007

Orcas Workshop: Day One

I have completed day one of the Visual Studio "Orcas" and .NET Framework 3.5 Training Workshop. Today included a great overview of many of the new language features coming in this release. Unfortunately there wasn't enough time to go over all of the new features, but the features that I saw, I like.

Perhaps the defining feature of .Net 3.5 is LINQ (I haven't figured out the "official" way of pronouncing this yet, but I heard it pronounced as link at the workshop today). LINQ stands for Language INtegrated Query and is basically just that. LINQ allows for a developer to query any IEnumerable data source using a strongly typed, compiler validated, and Intellisense enabled syntax. If you are familiar with T-SQL, you will probably be comfortable with LINQ. The biggest difference between T-SQL and LINQ is that a LINQ query starts with the From keyword. There are also numerous other differences, however, given the Intellisense, they are easily discoverable (IMHO, one of the most important aspects of any API). 

[UPDATE 06/26/2007]I forgot to mention a couple of things yesterday. According to one of the speakers, the primary performance goal of LINQ is to be as good as a for loop. However, there was a mention of a team working on a divide-and-conquer algorithm that will make it far faster on multi-proc/core machines. At this point it's just research. There is no date for release and there is a possibility that it won't get released. I should also have mentioned that there appear to be many different implementations of LINQ, there is LINQ for SQL (DLinq), LINQ for Entities (Entity Data Model), LINQ for XML (XLinq), and LINQ for Objects. There might be others as well. I'm not entirely sure of all of the terminology or how they are all used.[/UPDATE]

It appears that C# and VB.Net have widely differing capabilities in regards to LINQ. They both support a basic set of LINQ features, but VB.Net has a lot of keywords that are not available with C#. Many of these differences are based on the philosophy of each language team, but I imagine that developers will eventually demand (and hopefully get) features that one language supports that the other does not.

I thought the C++ section was going to be more interesting than it actually was (if you read my previous post about this conference you would know that I didn't think it was going to be that interesting :). I pretty much surfed the Internet the whole time and didn't get anything interesting out of it (sorry for anybody that is interested in the new improvements for C++).

However, I did pay rapt attention to the new language features for C# 3.0 and VB.Net 9.0. Most of the new features either directly support LINQ or are necessary to enable LINQ but can be used for other things as well. One of the cool things about the latter set of language enhancements is that they seem to be backwards compatible with .Net 2.0, so if you use Visual Studio 2008 to create .Net 2.0 applications using the built in ability to target different versions of the .Net framework, you can use some of the new language features!

Below I have included a list of some of the features that I found interesting. Unfortunately, given how quickly the speakers went over these features, I do not fully understand some of them, so if you find something interesting, you might want to look into it further just to make sure I'm not completely wrong about it ;).

New Language Features for C# 3.0

  • var keyword - Declares a variables that will be created as the type that it is set to. This is particularly useful for LINQ, but it can also be used in foreach...

foreach(var cus in customers) // cus is strongly typed as a Customer type.

  • Object initializers - Allows you to initialize an object by setting properties.

var cus = new Customer() { Name = "Boeing" };

  • Collection initializers - Similar to object initializers, but used to load a collection. Any Add method exposed by the the collection can be used to define the initializer. This allows you to add elements to lists as well as dictionaries or any custom Add method that you create.
  • Auto-implemented properties - Allows you to define a property without having to define the field or the get and/or set. The code is inferred by the property.

public string Name { get; set;}  // this is expanded by the compiler to be a standard property with corresponding field

  • Anonymous types - Allows LINQ to automatically create a type when transforming data. The type is not directly available from code, but you still get Intellisense to help you use the object.
  • Lambda expressions (=> operator) - This is basically a lightweight version of anonymous methods. A lambda expression can be passed as a parameter to another method, just define a delegate that matches the lambda expression.
  • Extension methods - Allows a type to "attach" methods to another type. To do this, add the this keyword in front of the first parameter in a static method.

public static string DoSomething(this string s) // This can be called like this - var something = "Hi".DoSomething()

  • Partial Methods - I didn't quite catch how this works, but it seems like it allows designer generated code to define a method that you can implement.

New Language Features for VB.Net 9.0

  • XML Literals - XML is now a first class feature within the language. You can can embed XML directly in the source code (without using quotes) and get Intellisense to boot (if you import your XML namespace). You can also embed ASP.Net-like code in the XML. This gets really interesting when combined with LINQ.

Dim myXml = <People><Person><%= person.FirstName %></Person></People> ' Example of using XML as a native feature in VB

  • New XML API - The new API is much easier to use than the DOM, especially when creating a new XML document. (if you are looking for keywords to find it on Google, try XElement and/or XAttribute). An XElement is automatically created when using a XML literal.
  • XML properties - .., .@, <> can be used like properties. This is a very cool way to get Intellisense support for XPath-like syntax.
  • XML namespaces - XML namespaces can be imported similar to regular .Net namespace imports.

Imports <xmlns:ss="urn:schemas-microsoft-com:office:spreadsheet">

  • Anonymous types - Similar to C# anonymous types above.
  • Into keyword - Calls LINQ aggregate methods, available when using the Group By (I do not believe this is available in Beta 1 of VS 2008)
  • Group Join keyword - Another VB.Net LINQ feature that allows hierarchical results.
  • Aggregate keyword - Alternative starting keyword to LINQ query that will return a scalar value instead of collection. The scalar value can be a complex type, but you will only get one of them. This is typically used with the aggregation methods such as Sum, Average, etc.

Thursday, June 14, 2007

Making the Build

AutomatedBuild I am of the belief that an automated build process is perhaps the most essential element in producing a quality software application. The build process can be used to enforce good practices within the development team and also detect any issues within the application in a timely manner (the sooner you know about a problem, the less code you have to look at to determine what caused it). Even a small team with a simple application can benefit from an automated build process.

Recently I've gotten the opportunity to recreate the build process for the company I work for. The product is over 5 years old, is fairly large and complex (well over 200 separate .Net projects as well as database and legacy code), and has grown a fairly complicated build process using a combination of batch files and custom executables.

The main reason for recreating the build process is due to the difficulty of maintaining it. There were quite a few batch files and it wasn't easy to run. We averaged a build about once a week (builds should be run several times a day, nightly at most) and the unit tests weren't run very often and if they were, the results often times weren't published (it could be months before you find out a unit test no longer works and then who knows what changed that broke it).

I started building my own build software using Windows Workflow (see my April 28th post, Windows Workflow and Your Next Build System). Although it probably could work and is a great way to learn Windows Workflow, I soon remembered one of my life rules, always use the right tool for the job.

I decided to try FinalBuilder instead and boy am I glad I did. FinalBuilder (FB from here on) is a great build tool. They have dozens (maybe hundreds) of different actions (that's what they call activities or tasks) available to use, such as MSBuild, get from VSS, run SQL, update AssemblyInfo, NUnit, send email, etc. They also allow you to write script (either VBScript or JavaScript) that is run during the build. If that isn't enough for you, you can also create your own custom actions using .Net (or other supported languages).

I've looked at several of the build tools available out there today (especially the free ones :) such as MSBuild and NAnt and the thing that strikes me about these tools is that they seem to be designed for full time build engineers. I don't have time to figure out how to setup these tools let alone write a complete build process using them. Perhaps even more frustrating is that I actually did take the time to learn MSBuild at one point and had done some interesting things with it, however, I couldn't tell you the first thing about MSBuild anymore. I wouldn't use MSBuild to create an entire build process for the same reason I wouldn't use Perl to write an entire ERP system (write only code doesn't work well in a complex, constantly evolving product).

I am not sure if it would have taken longer to create the build process using another technology (such as MSBuild or batch files) or not, but the big benefit in using FB is in the ability to maintain it months later and, if I'm lucky, by somebody other than myself (I definitely don't want to be the "build" guy).

I'm sure there are other great build tools out there. If you know of one, feel free to leave a comment (I always love to find out about new tools :). I plan on writing another article within the next week or two that has more concrete tips for creating a build process (perhaps even some source code), so stay tuned.

Sunday, June 03, 2007

Dispatch - Visual Studio 2005 FTP Upload

I've been working on a website for my home owners association (HOA from here on) recently (converting it to ASP.Net). The website includes tons of documents (pdfs and such) and pages (it includes PHPBB). As you can probably imagine, whenever I make a change to the site, I need to upload it to the web host.

Now perhaps I didn't have it configured properly, but I found the FTP support in Visual Studio 2005 (VS from here on) to be woefully inadequate. Perhaps I didn't have it configured right, but it seems that VS wanted to upload the entire website every time I published it. Not only that, but VS completely froze while it did this (no feedback to the user on progress and couldn't do anything else while it was uploading). This might be ok if you only have 1 or 2 files, but when you have hundreds of files, some of them quite large, this is absurd.

The HOA site is currently hosted by Yahoo! Small Business hosting (no, this is not where the ASP.Net 2 hosting is going to be). Yahoo! provides a tool called Yahoo! Site Builder to help build your website. Overall I find the tool crap (though perhaps it is great for users without several years of web development experience), however, their publishing mechanism is great. It keeps track of the files that have been modified and only uploads those.

Well, obviously the VS FTP support was not going to work for me, so I went to Google and hunted down a tool that would provide better support. I found Dispatch. Dispatch is a simple plug-in to VS that keeps track of which files have been updated and allows you to upload those files to the server without causing VS to freeze while you do so and also provided nice feedback on the progress as well.

Dispatch also provides the ability to download remote items as well. Unfortunately it's not obvious how to do that. You first need to right-click on a folder and select "Show Remote View Overlay" and then you get download options. I can understand the need for that (it needs to establish the remote connection in order to do that), but it would be nice to have some sort of contextual help to let you know what is going on. For instance, provide the same context menu whether or not they have connected. If the user hasn't connected yet, prompt to see if they want to.

I don't think that Dispatch would work well in a team environment, but I doubt if a project being developed by a team would require FTP upload. At $15, Dispatch seems to be priced for hobbyists anyway. Overall, I think that Dispatch is a great plugin for VS. It's what Microsoft should have done. If you are working on a website and don't require the formality of a complex build process, Dispatch will make your life much simpler.

I should mention that I also use Beyond Compare for FTP access to the HOA site. It allows me to view what files are different between the local and remote copies and also allows me to view what those differences are. Very handy when you aren't sure what version is accurate or if you don't remember what you changed. Now if only Dispatch had a mechanism to hook up a file diff tool such as Beyond Compare, that would really be something!

Wednesday, May 16, 2007

VB.Net Vs. C# (part 1)

Jeff Atwood from Coding Horror wrote a blog post the other day about C# and some of the deficiencies in the IDE, specifically the lack of automatic background compilation (C# and the Compilation Tax). The comments were very interesting. I love the fact that there are so many people out there that are passionate about development, but sometimes I find it a bit strange what they choose to debate.

I develop in both VB.Net and C#. I spend most of my time in VB.Net because that is the language that the company I work for chose (prior to me getting hired) due to their experience working with Visual Basic (VB6 and VBA). Before I went to work for them, I worked at Microsoft (as a contractor) on a C# project. I also do all of my own personal development using C#.

For all intents and purposes the languages are the same. They are both based on the same libraries and can accomplish the same tasks (perhaps with a couple of minor, mostly esoteric, exceptions). They both compile to the same bits and can easily work with one another when needed. If asked which language I prefer, my answer would probably depend on my mood at the time :).

For the most part, I think VB.Net is a better language, especially when working with events. C# forces you to write far more code into order to create or use events than VB.Net and using the handles keyword in VB.Net really makes removing event handlers easy. I also appreciate the background compilation and case insensitivity of VB.Net (as long as the auto-correct feature is on). I also like optional parameters, as long as they are used judiciously, and the greater flexibility of the Select statement over the C# equivalent switch. Other things I like about VB.Net is that I only have to declare the root namespace in the project settings which means I only have to declare a namespace if I am adding to it.

Of course, C# has some nice features as well. My favorite is that the language is designed to be terse. It also is closer to the underlying MSIL than VB.Net which means that when you write code in C# you will have a better understanding of what is going on behind the scenes (I am always having to explain how events work to VB.Net developers, I think most of them think it's some sort of magic). C# also has anonymous methods and coming in .Net 3.5 are automatic properties.

It seems that if you are working on a LOB (line-of-business) application and want maximum productivity, you should stick with VB.Net. If you want to learn .Net then C# is definitely the language for you.

However, I doubt that the productivity gains from using VB.Net are truly significant when compared to the overall schedule of any software project. I spend far more time eliciting requirements, designing, meeting, testing, etc then I do actually writing code. So in the end, personal preference will probably prevail. Of course, the whole team should be in agreement over which language a particular project should use. Just because it's possible to mix multiple .Net programming languages for a software project doesn't mean that you should.

Saturday, May 12, 2007

Team Foundation Server is Cool, but a Bit Underwhelming

I had the opportunity to evaluate Microsoft Team Foundation Server (TFS from here on) over the last week and I have to say, I'm not as excited about it as I was before. Don't get me wrong, I think TFS is compelling, it's got a lot of great features and they seem to be very well integrated with one another and with Visual Studio. However, it seems to be suffering from an acute case of versiononeitus (though I don't think it's terminal).

My main object was to evaluate the Team Foundation Build (TB from here on) for our product. TB is based on MSBuild. Anything you can do in MSBuild you can do in TB. As far as I can tell, TB is just a way to start a remote MSBuild process and report the results. It is well integrated into the IDE which makes it easy to know the status of the build at any given time.

Unfortunately, because it is based on MSBuild, it is very difficult to configure. MSBuild is a very powerful build system, however, it is not exactly simple to understand. For companies that have a full time, dedicated build engineer, MSBuild is probably great, otherwise, it is difficult to learn and it's easy to forget if you don't use it often (we tend to update the build process about once a year or so). I was not able to find a tool that would allow me to configure an MSBuild project, hopefully somebody is building one.

I have a love/hate relationship with the version control (VC from here on) in TFS as well. It has some very nice, advanced features that are missing from VSS. One of my favorites are shelves. A shelf is a place to put code before it is actually checked in. Other developers can access the shelf if they want (which is great for buddy testing).

Unfortunately, it is lacking in some basic usability features. For instance, depending on context, there are many different menu options that can be disabled and it's not always obvious why they are disabled. If you are used to VSS, trying to figure out how to create a directory in source control can be very frustrating. I think you have to map a workspace (which is similar to working directories in VSS, but slightly different), but it took me a few days to figure that out (and I'm still not sure if that's it or not). If this is the case, why do they have the menu option disabled? Why can't I just map a workspace when I'm creating the directory?

One of the nice things about VSS is that the directory structure in VSS does not have to match your directory structure on your local machine. Our VSS structure at work tends to be a bit deep for the local machine, so we map a couple of different VSS directories to the same directory on the local machine. When I tried to do that with VC, it refused to allow me to do that.

I did not evaluate the issue tracking, but I did glance at it. It certainly seems to be a much better issue tracking system then the one we're using at work now (it's a home-grown system).

If my company was more willing to spend a lot more time and money on TFS, I'm sure I would be able to get it working to suit our needs very well, however, they're not. I had about a week to evaluate it and put something together that would be functional.

Overall, I really like TFS. There are many products on the market that do similar things and are well integrated, however, none of them seem to do everything (most of them miss the build aspect). I am really looking forward for version 3 (the magic number in software) of Team Foundation Server.

Saturday, April 28, 2007

Windows Workflow and Your Next Build System

Recently I've been messing around with the new workflow foundation developed by Microsoft and included in .Net 3.0. It is very cool! It has great design-time support, it's easy to extend with your own custom activities, and it seems to be very well documented.

At first I was a bit put off by the fact that it doesn't include a simple, run-time configuration process. They do give you the ability to host the designer in your application, but it appears that you have to write a lot of code to make that work (I didn't actually try it, but I did glance over the documentation). However, as I thought about it more, it seems that Visual Studio is a great way to reconfigure the workflow. It might be a bit of overkill for a non-technical person who just wants to reconfigure one or two of the activities, however, if they just go to the workflow designer, it seems pretty easy to use (but what would I know, I'm a developer :). On the other hand, if somebody that is more technically inclined wants to extend the workflow with code, they can do that easily as well.

If you are new to Windows Workflow, I think a build system is a great starter project. It's simple (as far as workflow is concerned anyway), it fits into the workflow concept very well, and it will make your build process easier to configure and extend (if your build process is anything like our current one, as long as it's working, the last thing anybody wants to do is touch it). Even if you don't use it for the build process for the entire product, it can make many tasks that you have to perform on a regular basis on your computer easier (such as preparing your machine for a new build).

Before you can start building a workflow, you will need to install .Net 3.0 as well as Visual Studio 2005 extensions for .NET Framework 3.0 (Windows Workflow Foundation). This will provide the necessary pieces that Visual Studio needs to create workflows.

For the build system I'm creating at work, I created a Workflow Activity Library (a project template available in the New Project dialog) that contains most of the activities that I want to use, such as GetFromVSS, CopyFiles, RenameFile, AttachDatabase, RunSQL, etc. Each activity has one or more properties that allow it to be configured (for example, RenameFile has a property for the path to the file and another property for the new name of the file). As you can tell, these are just building blocks for a build system. For the build itself, I create a Sequential Workflow Console Application (this is a new project type installed with the VS 2005 workflow extensions). If you have several different types of builds (such as a developer build, test build, and production build), you can create a separate project for each one.

So what makes Windows Workflow such a great tool for a build system? Other than making configuration easy, you can also disable activities. This is very useful, especially when testing. There are several parts to the build system that I'm working on (for example, compiling the code and building the database), each one is made up of several activities. I can simply create an activity that contains all the activities for that part of the build and, if I don't want to run it, I can simply click on the parent activity and set it's Enabled property to False.

The diagram below shows a very simple workflow diagram in the Visual Studio Workflow designer. It includes two activities, one of the activities has been disabled. As you can see, the Workflow designer is very similar to the WinForm designer. You start by picking the activity that you want to run from the toolbox (on the left) and dragging it onto the workflow. The workflow will show you the places that you are allowed to drop the new activity. Once you drop an activity onto the workflow, you can set the properties associated with it using the property window (on the right).

If there is interest, I might be willing to write a more detailed article for Code Project that includes sample code. So if you want to read more, make sure you leave a comment.

Friday, April 13, 2007

Visual Assist X

I can't believe I haven't blogged about Visual Assist X (VAX from here on) yet! It is one of my favorite developer tools and has changed the way I write code.

VAX is an add-on to Visual Studio that provides a number of features that helps developers be more productive. My favorite feature is the Intellisense filtering. Intellisense is one of the greatest productivity enhancements for developers since the advent of the IDE, however, it can sometimes be difficult to find what you want in the list. VAX filters the Intellisense so that you can find what you want.

For instance, if you have a class that has hundreds of methods including one called DoSomethingReallyCool and you need to call it but can only remember that it contains the word 'Cool' somewhere in it, with typical Intellisense, you have to search every single member of the class. However, with VAX, you just type in 'MyVariable.Cool' and Intellisense will filter the list to include all the members with the word 'Cool' in it (the home page of their website shows this very well).

Using this filtering technology, you can also type 'MyVariable.DSRC' + Tab and it will auto complete for you! Once you become used to this you will find yourself typing far fewer characters. It's like snippets without having to setup snippets.

The Intellisense filtering makes VAX worth every penny of the cost, however, it also includes some other great features...
  • Spell Check - Who doesn't need a spelling checker? VAX will check your strings and comments. It seems to be smart enough to recognize code names in your comments.
  • Enhanced Code Element Visualization - Adds more colors and styles (like bold and italics) to different code elements.
  • Reference Navigation - Provides the ability to navigate to code that references a class, class member, or variable. Very handy when trying to fix a bug in somebody elses code :).

VAX also includes a bunch of other features, but these are the ones that I use most often and have really helped me be more productive. If you like productivity tools, this is definitely one that you should be using.

Tuesday, March 13, 2007

Portable Applications

If you haven't heard yet, portable applications are the new cool thing! Portable applications run from a portable device (usually a USB thumb drive). Typically you install a application launcher on the device and this launcher automatically runs when you connect the device to a computer.

There are many different applications that can be run from a portable device. Some of the more interesting ones include Firefox, OpenOffice (similar to Microsoft Office), Thunderbird (a news/email reader), and many more. One of my favorites is RoboForm2Go (password manager, discussed below).

There are also a number of different application launchers. Portable Apps seems to be a popular (and free) launcher. U3 came installed on the thumb drive I just purchased and it seems to work fairly well. I'm not sure about Portable Apps, but U3 requires a special installation format. However, if you know an application can be portable, you can easily create a U3 installation package by downloading a program called PackageFactory for U3 (ironically, this is not a portable application).

I've been wanting to use portable applications for awhile now and last night I took the plunge. For under $50 I got a 2GB thumb drive that came with an application launcher (U3) and several applications. My primary goal was basically to have a portable password manager and news reader.

The password manager was the most important thing. I have been using a password manager called Billeo for several months. It was nice that I didn't have to remember all of my passwords for all the different sites I visit, but Billeo is basically an Internet bill paying service and they use the password manager to try to get customers. I don't mind the marketing gimmick, but it did mean that the password manager included features I didn't intend to use and thought that perhaps a software company that focused on a password manager might have a better password manager (though Billeo did work very well). Plus, Billeo is not a portable app, so I had to install it on my machine at home and work and then train it (login to a website and save the password) in both places.

The thumb drive came with a password manager, but it didn't work very well. I ended up installing RoboForm2Go instead. RoboForm2Go has all the features I expect in a password manager. Basically, it automatically fills in passwords for me :). It also can be used to populate web forms with common data (such as shipping/billing info). The data can be secured with a master password so that in order to populate the form, you must enter a master password first. With passwords you can protect some and allow others to just automatically populate (for instance, you might want to protect your bank password, but you might not care about your favorite news sites password). RoboForm2Go also includes the ability to have different identities. This is used primarily for filling out forms. You might have one identity with your personal information in it and another for your work information (address, phone, credit card number, etc).

Thunderbird was the other important portable application for me. I subscribe to a number of RSS feeds. Thunderbird has been my RSS reader of choice because I like the preview window. However, the problem with the standard version is that if I wanted to read RSS feeds at home, I wouldn't be able to know which feeds I've already read. Portable Thunderbird solves this problem. I can open Thunderbird from my thumb drive at work or home without having to deal with this issue.

So what portable applications do I have installed?

  • CruzerSync U3 Edition - Backup software that came with the device. I'm not sure if I'll use this or not. It's nice backup software, but I've got a USB backup drive for that (which I believe this is the same software I use for it, though named differently).
  • Process Explorer - This is an advanced version of Windows Task Manager (Ctrl+Shift+Esc). I use it mainly to make comments on what is running on my machine. This allows me to know what all of the software on my machine is for (I hate unknown processes). What I am hoping for (but haven't verified yet) is that the comments are stored in a way that are portable with the application. Probably not, but we'll see.
  • Snippet Compiler - This is a very cool .Net tool that allows you to quickly and easily test out code without having to create a project or anything like that. I just found it and haven't had much of a chance to play with it, but it seems interesting.
  • Color Cop - Allows you to pick colors off of the screen. Very handy when trying to match a color. It gives the value in many different formats so it is easy to import into just about any application that is requesting a color code.
  • RoboForm2Go - This is a password manager (discussed in detail above).
  • Lutz Roeder's .Net Reflector - This is a must-have tool for any .Net developer. It allows you to decompile .Net assemblies and read the code in whatever .Net language you choose (C#, VB.Net, etc). I have used this frequently to learn how different parts of the .Net framework work.
  • Notepad2 - Very similar to Notepad (the text editor built into Windows), but with a few extra features and more reliable. What's nice about Notepad2 is that it is not trying to be a code editor or anything else.
  • avast! antivirus - This is a free antivirus utility. It has gotten a lot of positive feedback, but I already have an antivirus, so it's unlikely I will use it.

Thursday, February 22, 2007

Book Review - The Four Steps to the Epiphany

Book: The Four Steps to the Epiphany: Successful Strategies for Products that Win.

Author: Steven Gary Blank

Rating*: Recommended

Review: Perhaps one of the worst edited books I've read, but it's got great content. This book outlines how to develop a business that focuses on the customer. It defines what strategies to use at each stage of a business based on the type of market the business is in. Blank uses business that have failed as warnings to others (reminds me of a great demotivational poster).

mistakes

My favorite example was Webvan and how it grew too fast, too quickly and spent too much money before proving that they had a product that could support such growth.

This book breaks down the process of building a business into many steps, each with it's own set of deliverables. The process actually reminds me a bit of agile development applied to a business process. Basically, take small bites and iterate until you are ready to move to the next stage. It's difficult to predict where the market might take you so be flexible, preserve capital, and don't jump ahead of the market (spending millions on branding is not always the best use of capital before the product is even available as is pointed out in a couple examples in the book).

What I like most about this book is the focus on the customer and market type. These are very important concepts when starting a business but are often times overlooked, especially by entrepreneurs that have a technical background. If you're starting a business and you want to succeed, you should definitely read this book.

*NOTE: The book reviews on my blog are written for developers considering starting a Micro ISV. The rating (recommended, not recommended, etc) is based on content from that perspective only.

Tuesday, February 20, 2007

Fog Creek Copilot

I had the chance to use Copilot this evening. According to the website, Copilot is remote assistance software that is easy to install and use and works through most firewalls. Of course, I put this to the test this evening.

My uncle was having some computer problems. He's fairly new to computers and has a hard time understanding the basic concepts of the Windows (every software engineer needs to talk to somebody like my uncle in order to understand how bad software usability truly is). He's been trying to install a Hewlett Packard printer and it refused to install. He didn't get anywhere with Hewitt Packard phone support, which they offshored to India (see my earlier post today, and yes, the article mentioned is written by the co-founder of Fog Creek software who makes the Copilot software I'm reviewing), so he called me.

I quickly realized that I was not going to be able to help him over the phone and he lives a few states away from me so I couldn't exactly drive to his house. I needed a remote solution. There are several to choose from and some of them are free, but the one I picked was Fog Creek Copilot. I picked it because I enjoy reading Joel on Software and they seem like a good company to do business with. They also claim that their Copilot software is really easy to use which was very important in this case.

I was happy to find they had a test drive that would allow me to control his computer for a couple minutes in order to make sure it would really work before I had to give up any credit card information (that really helped put my mind at ease about the software). I also found it ridiculously easy to install the software and get it running on my machine. Now comes the difficult part, getting the software to run on my uncle's machine.

He was having some trouble with his email and so I didn't want to send him an email about the service so I had him open up his browser and type in the URL. He had some difficulty spelling it, but he finally was able to get to the webpage. Once there he had a very difficult time finding the textbox to enter the code in. I explained to him about the green box and the white box to enter text in it, but that didn't seem to help. After several minutes, he finally figured out where to put the code I gave him. He was able to figure out how to hit Go after a couple of minutes and then he had trouble figuring out how to download the software. Several dialog boxes popped up warning him of the software (I know Fog Creek doesn't control this, this is Microsoft's bad) and I had to walk him through each one. He was finally able to connect and it worked great, for 2 minutes, the length of the test drive.

I was happy that I could use the test drive to make sure the software was going to work, but I was disappointed that I was disconnected after the 2 minutes was up. I had to close the software, go back to the website, enter my credit card information, and then get another code. This caused my uncle to have to enter a new code in and download the software again, which I had to walk him through again :(. What's worse, the other version of Copilot was still running and without being able to see the screen, I couldn't help him close it (as I mentioned, he doesn't really understand the concept of Windows). I ended up just having him restart his computer (I knew the steps to do that) and then had to walk him through all the steps to install Copilot again.

During this process he had indicated that he was having trouble viewing the fonts on the screen (they were a bit small for him) so I installed IE7 for him (the magnification feature is great for this). This required a reboot. The reboot disconnected us from the remote session. This caused me to have to walk him through the process again (by this time he was able to do some of it on his own, but not everything). Through the process of helping him, we had to restart the machine several times, each time got easier, but I still had to walk him through a lot of it.

I didn't look at other remote software out there, but my guess is that Copilot compares favorably to most other programs out there for ease of use. This test was particularly challenging and I did find some deficiencies, but overall, I was very happy with the product. I was able to talk him through the installation process, it performed well with my DSL and his cable, and it worked without any special configuration. I will definitely be using this software again.

If Fog Creek happens to read this post, here are my suggestions for improving the software...

  1. Avoid disconnects at all costs. Allow payments to be made during a session (I should be able to enter payment information directly from the software) and automatically reestablish a connection after restarting the computer (even a shortcut on the desktop would be better than having to go through the website each time).
  2. If trying to connect and Copilot is already running, either close the previous instance or use the new code. Don't fail. It may seem obvious to anybody with some computer experience to know how to shut it down, but it wasn't to my uncle and I had no way of helping him because I didn't know what the screen looked like.
  3. Make the Receive Help page easier to use. If it only had the box for entering the code, that would be useful. A large blinking arrow pointing to the textbox would have been very useful (horribly tacky, but easy to explain over the phone). Don't change the screen. I know it seems like a nice feature to allow them to reconnect to the previous session, but as the person giving help, I didn't know what the screen looked like and couldn't help him find the correct link.
  4. Provide screenshots to the person giving help of all the different screens possible that the person receiving help will see that the person giving help won't (both on the website and in the product). This could be done in a few minutes and might help out on a few of the previous issues (like the disconnect button in #2 and the connect to previous session link in #3). Put these screenshots directly on the Help Someone page to make them very easy to find. It would be nice if the page included a script as well. Being a software engineer, I may not realize that some of the terms I use are considered advanced and probably confused my uncle. If a script was provided for me, perhaps it would use more appropriate terminology.

Wednesday, February 14, 2007

NLog, NUnit, NDoc, NAnt. DotNet development tools brought to you by the letter N.

Do all developer tools that target the .Net platform need to start with N? Ok, I have to admit that it makes it easy to identify .Net developer tools and that I might be influenced by the naming convention when looking for such tools.

For instance, the other day I was looking for a good .Net library for logging and found a few that looked interesting. The one I decided to download and install was NLog.

NLog Project

Although I don't have much experience with NLog yet (or experience with other logging libraries for that matter), I like what I've seen so far. Within a few minutes of installing it, I was logging simple messages. I was able to figure out how to log different levels of messages (simply call different methods on the logger) and how to change what gets logged.

NLog uses a XML config file that is separate from the application config file which is very convenient for portability reasons (I can send somebody a NLog config file and not have it mess up their app settings). It also has a XSD file that makes it very easy to discover the elements and attributes that are available.

According to the website, NLog claims that their interface is similar to Log4Net (a port of the log4j framework for java by the Apache Software Foundation), but simpler to configure and use.

The main gripe I have with it is the documentation. Perhaps I just haven't spent enough time with it to understand how it's put together, but for the most part, the documentation seems to be comprised of a dump of the code comments with a couple of incomplete tutorials thrown in. Of course, lack of good documentation for development tools is as common as development tools that start with the letter N.

Friday, January 12, 2007

The Great 2006 Software Review

2006 was a great year for software. I thought I would make my first post of the new year as a review of the software that was released last year that caught my interest. This is software that I think will have an impact on the world (some big, some small). It is not necessarily software that I use on a regular basis (or at all :).

I know I'm going to miss some great software, so please feel free to post anything I might have missed.

NOTE: Most of the links go to the original announcements. Some are official press releases, others are just blog entries.

Google Bookmarks (via the toolbar) - January 30th

Everybody that uses a browser knows what bookmarks are (also known as favorites). The Google difference is that these bookmarks are stored online, but are accessible through the Google toolbar in the browser.

I love being able to share my bookmarks between home and work and that I don't have to remember to back them up before I get a new computer.

Google Calendar - April 13th

My wife and I now share a calendar. This is a very convenient way to communicate events between us. There is also a very handy Google calendar gadget for the Google Sidebar that shows me the calendar right on my desktop at work so I always know what's coming up.

Windows Live Writer (beta) - August 11th

I'm using this software write now to create this post. It is a very nice blog entry tool. There are still a few kinks to work out, but overall it's great! It was very easy to set it up to upload my posts to my blog.

Firebird 2.0 RC3 - August 13th

This is a great database. It's reliable, performs well, easy to use, and it's free with no limitations. I've been using the previous version of the DB for close to a year and have been very impressed with it.

Of course most people need more than a command-line utility to create and manage a database (not to mention testing it). IBExpert is a great commercial product with a free version for individual developers (it's limited, but you can still do a lot of stuff with it). If you've used SQL Server Enterprise Manager you can probably imagine what features it has (I actually believe that IBExpert has more features than SQL Server Enterprise Manager).

Logitech MX Revolution Mouse - August 24th

Ok, this isn't software, but I'm still damn excited about it! Mostly it's the flywheel for scrolling. It actually switches between a flywheel and ratchet (standard scroll wheel behavior) depending on the application you are using.

PowerShell RC 2 - September 26th

Command-line + .Net, what's not to like :). If they can fix the performance issues, I'm sure that many Windows admins are going to be very happy people.

Google Docs & Spreadsheets - October 11th

The future of the office software suite is here! Google has created an Internet based document editor (like Word) and spreadsheet application (like Excel). They allow for a high degree of collaboration, including the ability to work on the same document at the same time and receive live updates, almost like an instant messenger program (as rumor has it anyway, I haven't had the opportunity to see that work).

Internet Explorer 7 - October 18th

It's about time Microsoft updated its browser! They have done a great job of cleaning up the UI and providing the features that experienced web surfers have come to expect (such as tabbed browsing).

Firefox 2 - October 25th

I am very impressed with the improvements that have been made in such a short amount of time by an open-source project. It's great to see a viable alternative to Internet Explorer (if for no other reason than to encourage Microsoft to keep its browser up to date).

Microsoft Windows Desktop Search 3.0 - October 25th

This is the most effective way to search your Outlook email that I'm aware of. It also searches other documents (including MS Office) on your system as well. It's easy to use, fast, and produces good results.

.Net 3 (including WPF and WCF) - November 6th

These technologies will definitely have an impact on the world, especially Windows Presentation Foundation (WPF), though it may take a few years for the hardware to catch up. Expect to see some amazing consumer applications coming out soon.

Basically the WPF (not to be confused with WTF) allows designers to create graphically intense (including animations) user interfaces quickly and easily. .Net 3 comes installed on Windows Vista and can also be installed on Windows XP and Windows 2003 Server.

Windows Vista - November 8th

Microsoft's new OS is possibly one of the best yet (based on the presentations I've had of it anyway). It has some great features for security and usability. As I look into my crystal ball, I see a new computer with Windows Vista on it in my future :).

I really looking forward to Windows Home Server. Home Server is essentially an appliance that you can hook up to your network for file sharing and other nifty things (it's a full version of Windows Vista). Unfortunately it's not due out until the second half of 2007. If you're interested in this, here's a great Ch 9 Video.

SQL Prompt 3 (beta) - ~December 11th

It's about time somebody added Intellisense to my SQL scripts. This has made writing SQL much less painful. I know longer need to scan the object browser every time I need to find a table or field.

Google Patent Search - December 14th

Patent surfing just might be the next big time-waster (ok, probably not). Google has certainly made looking for patents much, much simpler. You can now search for patents from the comfort of your home using Google's excellent search capabilities in order to make sure that your new "great idea" is not already patented.

Again, if you know of something I missed, please post it.

Monday, December 11, 2006

The beta for SQL Prompt 3 is now available

I just installed the beta for SQL Prompt 3 today. For those that don't know what SQL Prompt is, it is basically Intellisense for Query Analyzer. They are currently giving away v2, but they are planning on selling v3 (get v2 while it lasts). If you like Intellisense in Visual Studio and you also write T-SQL, you'll probably appreciate the productivity improvements with SQL Prompt.

They've made some great improvements to the Intellisense dropdown. It is, of course, context sensitive, but it is also organized in categories. It allows you to view just a certain set of candidates (such as columns or functions). It's vaguely reminiscent of Visual Assist X (VA). It would be nice if they made it work more like VA. One of the things I like most about VA is that I can type any part of a method/property/etc and it will list it in the dropdown. If you have a couple of hundred choices, being able to type "order" and getting all of the candidates that include "order" somewhere in the name is very handy!

Another feature that I really like about the new SQL Prompt 3 is the auto-expand. If you type out a stored procedure name, SQL Prompt 3 can automatically expand the statement to include the parameters as well. You can also expand a * to the complete list of columns simply by hitting TAB when the caret is next to the *.

SQL Prompt 3 offers many configurable options to allow you to setup your environment the way you like it. It also includes the ability to add snippets that can be automatically expanded for common or complex SQL statements.

I'm glad they decided to limit the number of products they support. I use Query Analyzer exclusively for writing SQL (I tried using Visual Studio, but could never get used to it). I would much prefer a product that works very well for one or two products than one that almost works ok for a half dozen very different products. One thing I often wonder is why they didn't just create their own IDE for SQL scripts. It seems like it would integrate well with their other products (which I haven't used, but they look intriguing). It would be nice to have a SQL IDE that integrated with VSS. Perhaps they could have even integrated it with Visual Studio (or at least be able to open up Visual Studio projects to get to the SQL scripts embedded in them).

A word of warning, the Automatic Closing Characters feature doesn't work very well. In fact, I had to turn it off. Often times I would type a single tick and it wouldn't add the second tick. However, when I added the second one, it would add a third! Fairly annoying. Even when it did work correctly, it still suffers the same annoying problem as most tools that implement this which is if you type the closing character yourself, you end up having to remove the extras. VA handles this much better. It seems to remember when it automatically adds a closing char and will remove it if you type it yourself (VA is the first tool that I have not turned this feature off).

Another issue that I've seen with SQL Prompt 3 are that the columns in the dropdown cannot be resized. This means I usually only see the first part of the column name and rarely see the column type. I can expand the whole dropdown, but all of the columns expand with it. This means the dropdown has to be absurdly wide in order to show the entire column name (good thing I have a widescreen monitor :).

If red-gate is reading this, a couple of features that I would like to see in the release (at least the next version), are...

  • Expand UPDATE and INSERT statements. It would really save me a lot of time if I was able to type "UPDATE MyTable[TAB]" and have the columns laid out for me similar to the auto-expand feature for stored procedures. It's much easier to delete the ones I don't want (even if it's most of them) than to add the ones I do want.
  • Being able to view a list of references in a script. For instance, view all the lines that use the Employee table or the FirstName column from the Employee table, or the @DoSomething variable.
  • Provide some SQL refactoring capabilities. Changing the name of a variable is the only one that comes to mind, but I'm sure if I spent some time on this I would find some other useful refactorings in a SQL script.
  • Spell check. Who can't use a good spell check program to check their comments :). This is something I didn't realize I needed in an IDE until I installed VA.

If you develop T-SQL scripts, SQL Prompt 3 will greatly improve your productivity. This is a must-have tool for all T-SQL developers.

Here's the link to the announcement on red-gates website...

http://www.red-gate.com/messageboard/viewtopic.php?t=3811

This post turned out much longer than I planned :). I hope you have found the information useful.

Wednesday, November 08, 2006

ClickOnce Deployment Rocks!

Just recently I configured an internal tool I'm working on to use ClickOnce deployment. It is the first time I've used it and I have to say that it certainly lives up to it's name.

At least for a small, simple application like the one I've been working on, all you have to do is open up the project properties and push the "Publish Now" button under the Publish tab (VB.Net anyway).

It automatically generates a webpage that other people can use to install the application and, if the application is updated, it will automatically reinstall the next time the user opens it.

For the app I was working on, the most difficult thing to figure out was how to include some assemblies I was referencing from the GAC. To do this, open the project properties, go to the Publish tab, open Application Files, and change the Publish Status to Include. When somebody installs the application, the assemblies are automatically copied locally (they are not installed to the GAC).

If you are interested in where the files are installed on the users machine, it appears they are placed in C:\Documents and Settings\<user>\Local Settings\Apps\2.0\. The application will be in a directory with a randomly generated name.

Monday, November 06, 2006

Book Review - Engineering Your Start-up

Book: Engineering Your Start-Up: A Guide for the High-Tech Entrepreneur

Author: James A. Swanson, Michael L. Baird

Rating: Recommended

Review: This book is focused on financing a high-tech startup. Although I recommend the self-funded approach, it's important to know the ins and outs of financing so that when you want to grow your self-funded company, you haven't made any major mistakes that will make that more difficult than it already is.

This book is a bit dry and technically challenging (at least for non-finance people). However, the authors do a decent job of defining the jargon used in the industry.

A few of the gold nuggets in the book...

  • Ch 6, Startup Financing Terminology and Stages - This includes some of the most basic terminology that a entrepreneur should know to keep from looking too foolish :).
  • Ch 8, Evaluate Markets and Target Customers - Reinforces the arguments for a small (but potentially profitable), niche market and discusses ways to analyze the market to make sure that you can succeed (at least increase your chances).
  • Ch 20, The Legal Form of Your Startup - Definitions for all of the basic types of organizations (Class C, Class S, Partnerships, etc).
  • Ch 21, Making the Startup Decision - Things you need to consider when starting a business, especially while still working for another company.

Friday, October 20, 2006

IE 7

I've been using Firefox for some time now and I really like it. However, being a technology junky, I felt compelled to install IE 7 as soon as it was released (I tend to avoid betas if at all possible).

IE 7 definitely feels like a modern browser. It has tabbed navigation, redesigned and streamlined toolbars, and a built-in RSS feed reader (though I plan on continuing to use Thunderbird for the RSS feeds I subscribe to). IE 7 also has the ability to add extensions, however, I haven't found any that I want to use (where's the Bork Bork Bork! translator?) and most of them cost money.

Firefox still has some very compelling features (specifically a better selection of extensions), however, I think I will stick with IE 7 for now (at least until Firefox 2 is released :).

Thursday, October 19, 2006

Project Vote Smart

If you're planning to vote, you should check out Project Vote Smart. It's a great, non-partisan website that essentially aggregates a lot of information about politics, including voting records.

They also offer a survey that candidates can fill out (voluntary) that helps them define their position on many relevant issues (the survey is called NPAT - National Political Awareness Test). You can find out some very interesting (scary?) stuff about candidates positions.

The one thing I would love to see on the website is more community discussion. It would be interesting to be able to have an open debate about current issues, especially over legislation. We always hear about how important legislation is often hijacked to get unpopular (corrupt?) legislation passed. An open community discussion on this website would quickly show bad legislation for what it is and maybe start finding out some bad legislators.

Personally, I'm not too happy about Donald Young (R) the Alaskan representative and chair of the Transportation and Infrastructure committee.

``I'd be silly if I didn't take advantage of my chairmanship,'' Young said, according to the Anchorage Daily News. ``I think I did a pretty good job.'' Bloomberg, Sept 2nd, 2006

Tuesday, October 10, 2006

PowerShell Developer's Conference

I just finished the PowerShell developer's conference and it looks like Microsoft is pretty serious about it. A number of Microsoft teams are developing enterprise products around PowerShell (such as Exchange 2007).

Microsoft is pushing the use of PowerShell snapins to be coupled with MMC 3.0 snapins. Basically they want developers to create PowerShell snapins that provide the functionality to administer an application and then create a MMC 3.0 snapin to provide the GUI environment (this would use the PowerShell API to run the PowerShell snapin).

This approach makes administering an application across the enterprise much simpler. Many I.T. administrators prefer a command-line over a GUI, especially if they can create a script to perform repetitive tasks.

I'm hoping that Microsoft builds PowerShell into Visual Studio. It would be nice to have such a rich command-line hosted within VS, especially if it has full access to the IDE object model (possibly an alternative to some macros). Unfortunately they were unable to give us any news about upcoming uses of PowerShell because the event was being recorded for distribution on the Internet and so it was not considered an "NDA" event.

They did have good swag (second definition:)though. They gave out a PowerShell labeled USB drive and t-shirt as well as a Microsoft System Center scarf and a foam Ch 9 guy.

Friday, October 06, 2006

PowerShell = Command-line + .Net

PowerShell is the future of the command-line for Windows. It's most significant feature is the fact that it is built around .Net and is easily extendable by .Net. In fact, you can use reflection to access any .Net object!

It includes the ability to assign alias's to frequently used commands, define functions, and call a number of pre-defined (and very useful) CmdLets (the equivalent of a command-line utility). It also has it's own scripting language including looping and conditional constructs reminiscent of C#.

Another feature I really like is the ability to navigate to non-filesystem drives, such as the registry. This allows you to navigate the registry the same way you would navigate the file system. You can define your own drives based on the drive providers that come with PowerShell (there are a number of them) or you can create your own provider using .Net.

PowerShell has not been released yet (due Q4 2006), however, you can download RC2.

PowerShell Home Page

Download PowerShell

PowerShell Team Blog