Scott Hanselman

Are you from the Northwest?

September 3, '05 Comments [10] Posted in Musings
Sponsored By

I'm a 3rd generation "native" Oregonian, both my father and 89-year-old grandmother were born here. Northwest Natives take a great deal of pride in it as much of the city is being taken over by Californians. I saw this recently and it was the first list like this where every single item was absolutely spot-on. If you're new to Oregon or Washington (< 5 years) you probably can relate to some of these, likewise if you have a Birkenstock-wearing relative living here.

I'm not sure if #26 is just a NW thing, but it sure is true here.

Are you from the Northwest?

1. You know the state flower (Mildew)
2. You feel guilty throwing aluminum cans or paper in the trash.
3. Use the statement "sun break" and know what it means.
4. You know more than 10 ways to order coffee.
5. You know more people who own boats than air conditioners.
6. You feel overdressed wearing a suit to a nice restaurant.
7. You stand on a deserted corner in the rain waiting for the "Walk" signal.
8. You consider that if  it has no snow or has not recently erupted, it is not a real mountain.
9. You can taste the difference between Starbucks, Seattle's Best, Coffee People and Longbottoms.
10. You know the difference between Chinook, Coho, and Sockeye Salmon.
11. You know how to pronounce Sequim, Puyallup, Issaquah, Oregon, Yakima, and Willamette.
12. You consider swimming an indoor sport.
13. You can tell the difference between Japanese, Chinese, and Thai food.
14. In winter, you go to work in the dark and comehome in the dark-while only working eight-hour days.
15. You never go camping without waterproof matches and a poncho.
16. You are not fazed by "Today's forecast: showers followed by rain," and "Tomorrow's  forecast: rain followed by showers."
17. You have no concept of humidity without precipitation.
18. You know that Boring is a town in Oregon and not just a state of mind.
19. You can point to at least two volcanoes, even if you cannot see through the cloud cover.
20. You notice, "The mountain is out" when it is a pretty day and you can actually see it.
21. You put on your shorts when the temperature gets above 50, but still wear your hiking boots and parka.
22. You switch to your sandals when it gets about 60, but keep the socks on.
23. You have actually used your mountain bike on a mountain.
24. You think people who use umbrellas are either wimps or tourists.
25. You buy new sunglasses every year, because you cannot find the old ones after such a long time.
26. You measure distance in hours.
27. You often switch from "heat" to "a/c" in the same day.
28. You design your kid's Halloween costume to fit under a raincoat.
29. You know all the  important seasons: Almost Winter, Winter, Still Raining (Spring), Road  Construction (Summer), Deer & Elk  Season (Fall).

About Scott

Scott Hanselman is a former professor, former Chief Architect in finance, now speaker, consultant, father, diabetic, and Microsoft employee. He is a failed stand-up comic, a cornrower, and a book author.

facebook twitter subscribe
About   Newsletter
Sponsored By
Hosting By
Dedicated Windows Server Hosting by SherWeb

Review - OnTime Defect Tracker from AxoSoft

September 2, '05 Comments [10] Posted in ASP.NET | Reviews | Javascript | XML | Web Services | Bugs | Tools
Sponsored By

I received an email recently asking if I'd review AxoSoft's OnTime 2005 Team-Based Defect, Feature and Task Tracking software in exchange for a small fee. I'm usually happy to review software and tools when time permits, I'll always do it in an unbiased way to the best of my ability, and the small stipend (or free gadgets) is a nice recognition of the value of my time. This review is by me personally, and has nothing to do with my company who does not use or advocate the user of this tool.

Updated: I haven't been paid for this review and won't be. However, I did receive a free copy of the software.

AxoSoft's "OnTime 2005" - Team-Based Defect, Feature and Task Tracking Software

Axosoft1AxoSoft's OnTime 2005 is .NET-based application suite for managing many aspects of the software development lifecycle. It aims to be a complete system for Software Project Management and provides not only a Web-based solution, but also a complete WinForms solution as well as one that integrates with VS.NET as a toolbox.

They also have an "Enterprise Server" edition that lets remote users connect via Web Service rather than directly to back-end SQL. You can use SQL Server or MSDE for your backend. I used a private MSDE installation with no problems. You of course are bound by MSDE's size and concurrency limitations if you take that road, but a team of 5 could certainly do well with MSDE, IMHO.

There is an SDK in the form of a rich Web Services interface into the OnTime system for integrating into other lifecycle management systems that you may already have in place. This is pretty powerful stuff and it's a shame more applications don't take the effort to expose their core engine as Web Services. (example screencast) I can imagine building defect submission directly into a Help|About box or a global exception handler. Patrick Cauldwell mentioned today that he heard at Devscovery yesterday a koan that really resonated with him: "If you have get an unhandled exception, you've never executed that code in that way before." Integrating the defect tracking system with the application itself is cool thing. AxoSoft also offers a Customer-facing Portal that can enable users to report bugs themselves.

Finally, if you're not into managing the infrastructure or SQL/Windows licenses yourself, there's a hosted plan. However, my take is this. They offer a FREE single user version. Not a trial. Free. That'd be a great way to start out with lifecycle management tools for the independent developer and gives AxoSoft a way to compete with the free BugZilla tools. Also, for a limited time they've got a free 2-user license if you mention their software (so they get Google Juice). Not sure how long that will last, but free software is always a good thing.

Axosoft2I installed a private instance of MSDE that I called (local)/OnTime before starting. Then I installed the WinForms, Web and VS.NET versions of OnTime. They came in three MSIs, and we're trivial installs (next, next, next, finish). On running each application I was prompted to connect the database. I was a little confused since I used MSDE and had forgotten the (local)/instance style of connection string. It would have been nice had that tip (or a step-by-step MSDE vs. SQL quick start) been in the OnTime help file. They suggest in the Planning Section to use MSDE Instances, but then Instances aren't mentioned later in the help. Also, I installed my MSDE instance as "Windows Integrated Auth" only, and I should have used Mixed Mode, allowing both Windows users and SQL users to connect. This caused trouble when I tried to run the Web version of OnTime. Once I switched over to Mixed Mode it was cool. It would be nice if OnTime helped diagnose that likely common problem in a friendlier way. However, these are nits, and the install in total was all of 10 minutes.

I was pretty pleased to see on the database configuration dialog a "Populate New Database with Sample Data" checkbox. I love stuff like that. Simple and does the job. Of course, checked. The sample data is pretty extensive and include three fictional projects and their numerous associated sub-projects. It's fairly classic three-pane style with tabs. (screenshot above). The datagrids include excellent filtering, grouping, sorting, yada yada support. They also handled my crazy font changes. I always mess with the defaults to see if an app can handle it. Plus, it makes it easier to see. No problems there.

The WinForms and the WebForms applications have surprising parity of look and functionality. I can see using either without any concerns that I'm "not seeing something" by using the Web version. The Web version did have what I feel are VERY heavy page weights. The home page with grid populated with the default sample data was over 125K, not counting images, graphics, css, and considerable amounts of included javascript. Additionally IIS wasn't configured optimally with "If-Modified-Since" set for the various static directories. Consequently there were times when I felt the site was a little slower than it could me. This was more client-side rendering than server-side it seems. When I manually added Content Expiration for the directories containing static content to expire in 1 month the speed picked up. I suspect that adding HTTP Compression would also make a huge difference. I think the installer should set reasonable defaults in all cases. These optimizations are easy to do and only make the product look better.

Axosoft3The WinForms has a nice, speedy UI with splitter support in all the appropriate panes. The dialogs are logical and well laid out and I didn't need to read any documentation to get started immediately. I was able to add a custom field to my bugs (I added "locale") and associate a pick-list with choices (en-us, es-mx, etc) without trouble. There are Defects, Features and Tasks and all support an unlimited number of custom fields. 

Some of the dialogs were not resizable and should have been, with the User Options dialog being the most obvious omission. There were a few subtle dialog updating bugs I found like the Windows Common Font Dialog isn't populated with the current font when you press "..." in the User Options dialog. I suspect it'll be fixed when they read this review. :) However, I didn't have any crashing bugs and didn't come upon any major functional bugs in my week with the application.

There is a QuickAdd feature in the WebForms version that would be a nice addition to the WinForms version. The dialogs in the WinForms version, particularly for editing an item are modal, and AxoSoft could really increase usability by making them modeless and allowing multiple simultaneous views/edits.

There are 17 built-in reports that will meet 85-90% of your needs I suspect and 100% of Mort's needs. The lack of an editable report maker was the only real missing chunk of desirable functionality that I found, but I suspect I could use any reporting tool to make my own pretty easily. I do wish though, that the charting colors were at least configurable for red-green colorblindness. In the WebForms application the reports are automatically exported as PDFs, and in the WinForms application they are exportable PDFs in an embedded control within the application.

The configurable workflow capabilities really shone, I thought. The default five defect steps are typical, but you can add your own, as well as modify many of the items fields as they move through the process. You're not able to provide arbitrary script or modify your custom fields from the workflow that I could see. The features don't come with automatically configured workflows, but they can be added exactly as with defects. The workflow dialogs are simple, but provide logical defaults for what a small team would need to manage a defect's lifecycle.

Axosoft4Email notification also plays a big part in OnTime, and the you or anyone in the team can be notified as items move through the process. I also noted that I didn't have to explicitly opt-in to including my custom "locale" field into the emails. It was added automatically. You can imagine that this saved me the time of digging wondering why it wasn't included.

An Audit Trail is also included for all events and can be filtered by any aspect including the source of the event - was the item changed manually, as a result of a workflow, via data import or by a customer on the portal?

Exporting of data is only supported in CSV, and it would be nice if they'd include an XML feature, but the XML Web Services interface from the OnTime SDK can arguably serve one's purposes as well.

I liked the flexibility of Security Roles for giving certain classes of users add, manage, delete, etc capabilities to projects. However, it appears you can't change the "verbs" on a project by project based. Meaning that if Tester Fred can add defects on project A, then he can add them anywhere. They do get around this in a reasonable way by combining roles and projects into project-specific roles ("Tester - Project A"). Since a user can be a member of any number of groups this technique works fine. I think though the that the presentation of this information, while complex, could have been more explicitly expressed.


The VS.NET view is a composite that appears as a toolbar within VS.NET and for me, it looks a bit like Team System except it's running on Visual Studio 2003. The grid in VS.NET includes tasks, features and defects all in the same grid. After using it for a while exclusively within VS.NET, I found myself wishing that this composite view was available in the WinForm and/or WebForms application.

All in all, OnTime 2005 Small Team Edition offers a great deal of value for the $ in my opinion. The single user version is free, and $495 for 5 users or $995 for 10 seems very reasonable for any small development shop using the Small Team Edition. The pricing for the Standard Edition (for > 10 users) is much less compelling per-seat at nearly double the price for license that let users use any version (Win/Web/VS.NET) of the product. The Small Team Edition is definitely worth a good look.

P.S. They are also looking at Source Control Integration directly into OnTime, which sounds pretty sweet.

About Scott

Scott Hanselman is a former professor, former Chief Architect in finance, now speaker, consultant, father, diabetic, and Microsoft employee. He is a failed stand-up comic, a cornrower, and a book author.

facebook twitter subscribe
About   Newsletter
Sponsored By
Hosting By
Dedicated Windows Server Hosting by SherWeb

Indigo comes to PDX

September 2, '05 Comments [0] Posted in ASP.NET | Speaking | XML
Sponsored By

Ted Neward was in Portland this week speaking to PADNUG and you should've been there. He gave the crowd a lot to think about in his own Ted Newardy way. If you haven't seen him speak, he's a very dynamic extemporaneous speaker and really engages the audience. The topic was the objects/database/xml impedence mismatch and included discussion around NHibernate as well as Ted's confirmation that DataSets may well be evil. Also in the audience was Rick Strahl who spoke on Client-side Callbacks last month. 

On September 28th the Indigo Roadshow comes through town and registration is required but is free. The registration form is a single submit, so no worries about filling out giant forms.  The event is happening at Intel-Jones Farm Campus at 6:30pm. I'm glad that Microsoft considers Portland when bringing roadshows like this around the country.

If you haven't visited PADNUG, you're missing out and should come by!


About Scott

Scott Hanselman is a former professor, former Chief Architect in finance, now speaker, consultant, father, diabetic, and Microsoft employee. He is a failed stand-up comic, a cornrower, and a book author.

facebook twitter subscribe
About   Newsletter
Sponsored By
Hosting By
Dedicated Windows Server Hosting by SherWeb

Gas Prices around the world

September 1, '05 Comments [10] Posted in Africa
Sponsored By

In this time of higher gas prices, I would remind those who are frustrated and complaining (like the woman on NPR just now who found it “horrifying” that she might need to carpool or pay $40 to fill up) that there are those in Zimbabwe who have queued for petrol for as long as 4 days (96 hours) to pay the equivalent of $5 a gallon, or nearly 30% of their monthly salary.

Now playing: Will Smith - Switch

About Scott

Scott Hanselman is a former professor, former Chief Architect in finance, now speaker, consultant, father, diabetic, and Microsoft employee. He is a failed stand-up comic, a cornrower, and a book author.

facebook twitter subscribe
About   Newsletter
Sponsored By
Hosting By
Dedicated Windows Server Hosting by SherWeb

Making the XmlSerializer output alternate values for simple types

September 1, '05 Comments [4] Posted in ASP.NET | XmlSerializer
Sponsored By

Given a class like this:

public class Student
    public int SSN = 555555555;
    public decimal GPA = 0.1;
    public bool cool = false;
    public DateTime birthday = DateTime.Now;
    public long Height = 80;

The XmlSerializer will output XML like this:


As you'd expect. Note the standard 8601 DateTime and the word "false" for the boolean element "cool."

However, what if you want to output "bar" for false and "foo" for true? Here's one way that we've built into some code generation templates. The trick is that the actual boolean that the developer accesses is marked as XmlIgnore, and a parallel string value is marked with and [XmlElement] attribute that changes the name of the serialized element.

    1 using System;
    2 using System.Xml;
    3 using System.Collections;
    4 using System.Xml.Serialization;
    5 using System.IO;
    7 public class SerTest
    8 {
    9     public static void Main(string[] args)
   10     {
   11         Student[] students = new Student[2];
   13         students[0] = new Student();
   14         students[0].SSN = 555555555;
   15         students[0].GPA = 0.1M;
   16         students[0].Height = 60;
   17         students[0].cool = false;
   19         students[1] = new Student();
   20         students[1].SSN = 555554444;
   21         students[1].GPA = 3.1M;
   22         students[1].Height = 160;
   23         students[1].cool = true;
   26         XmlSerializer mySerializer = new 
   27             XmlSerializer(typeof(Student[] ));
   29         StreamWriter myWriter = new StreamWriter("Students.xml");
   30         mySerializer.Serialize(myWriter, students);
   32         myWriter.Close();
   33         StreamReader myReader = new StreamReader("Students.xml");
   34         Student[] somefolks = (Student[])mySerializer.Deserialize(myReader);
   35     }
   36 }
   38 public class Student
   39 {
   40     public int SSN;
   42     public decimal GPA;
   44     //It is assumed that the values "FOO" and "BAR" are put here by
   45     // a code generator, so it's not that big of a deal that they are 
   46     // duplicated in this code. Just trying to cover all bases. 
   47     [XmlIgnore]
   48     public bool cool
   49     {
   50         get
   51         {
   52             if (coolStringValue == null || coolStringValue.Length == 0) return false;
   54             if (CaseInsensitiveComparer.DefaultInvariant.Compare(coolStringValue,"FOO") == 0)
   55             {
   56                 return true;
   57             }
   58             else if (CaseInsensitiveComparer.DefaultInvariant.Compare(coolStringValue,"BAR") == 0)
   59             {
   60                 return false;
   61             }
   62             throw new ApplicationException(coolStringValue + " 
is neither FOO (true) nor BAR (false). This is an invalid state for this boolean.");
   63         }
   64         set
   65         {
   66             coolStringValue = (value ? "FOO" : "BAR" );            
   67         }
   68     }    
   69     [XmlElementAttribute(ElementName="cool",DataType="string")]
   70     public string coolStringValue = "bar";
   72     public DateTime birthday = DateTime.Now;
   74     public long Height = 80;
   75 }

This code listing outputs this XML:

<?xml version="1.0" encoding="utf-8"?>
<ArrayOfStudent xmlns:xsd="

About Scott

Scott Hanselman is a former professor, former Chief Architect in finance, now speaker, consultant, father, diabetic, and Microsoft employee. He is a failed stand-up comic, a cornrower, and a book author.

facebook twitter subscribe
About   Newsletter
Sponsored By
Hosting By
Dedicated Windows Server Hosting by SherWeb

Disclaimer: The opinions expressed herein are my own personal opinions and do not represent my employer's view in any way.