Scott Hanselman

What is Abandonware?

October 4, '06 Comments [7] Posted in Musings | XML
Sponsored By

TumbleweedI referred to MbUnit once as "abandonware" only to be corrected (rightly so) by Andy Stopford (here's a listserv about the issue). In this case, it was not clear at a cursory glance if it was being "actively developed."  Here's some metrics that were provided by Jay Flowers that prove that MbUnit is very alive:

Google Groups:
MbUnit.Dev - 62 Members with 60 posts last month
MbUnit.User - 120 Members with 35 posts last month

8 Dev Leaders with rights to Subversion

Here is the Svn FishEye:
http://www.mertner.com/fisheye/browse/MbUnit

4 Devs committing changes in Aug
264 files changes/28 revisions in Aug

Other folks have done the same thing to DasBlog that I did to MbUnit. Take a cursory glance at the DasBlog SF.NET Projects Page a few weeks back and you'd fine many unanswered questions. In both instances - DasBlog and MbUnit - the project owners needed to take into consideration the external perception by the community of the projects and tighten the screws a bit, all to avoid the label of "Abandonware."

Another word invented by Roy Osherove was "frozeablilty" (or chance of being frozen/abandoned. Perhaps frozeabilitishipfulness is a better word?:

MbUnit is also one of the topics that I continually have a dilemma about using. Since its not the de-facto standard out there, I always feel there's a chance of it being frozen in mid development, making all those who depend on it frozen along with it.

[Update: Andrew, one of the leads on mbUnit,  makes some good points on why he thinks this is far from happening - which is reassuring, and I'd like to hold out longer before making a final call on it's "frozeability".]

Now, we're picking on DasBlog and MbUnit here, but both actively developed projects that aren't abandoned. But let's talk about the real issue. Is software that has been abandoned bad? Is it un-usable? Should we only use software that is actively developed?

Abandonware Example - A .NET Implementation of Schematron

We recently needed to do some data import work, and we were using XML as the source format and XSD to describe the constraints of the validity of the data. Xml Schema isn't well suited for complex data with conditional interrelationships.

For example, if I have a Payment in Xml Schema, it might have a FromAccountID and an optional DateCompleted (and many other things):

 <xs:complexType name="Payment">
  <xs:sequence>
   <xs:element name="FromAccountID">
    <xs:simpleType>
     <xs:restriction base="xs:string">
      <xs:maxLength value="25"/>
      <xs:whiteSpace value="preserve"/>
     </xs:restriction>
    </xs:simpleType>
   </xs:element>
   <xs:element name="DateCompleted" minOccurs="0">
    <xs:simpleType>
     <xs:restriction base="xs:date"/>
    </xs:simpleType>
   </xs:element>
...

But, there's a business rule that indicates that if FromAccountID is "PAID" then there must be a DateCompleted. This kind of condition isn't expressable in XSD. I started looking for other solutions like RelaxNG or Schematron.

Schematron is an interesting spec, but the nutshell explanation is that you can augment XSD with additional assertions using XPath. You can also (with some implementations) include Schematron patterns inside of existing Xml Schemas using the xs:annotation element. Schematron the spec is being actively talked about (article at IBM from this July), commented on by Microsoft PMs (quote from July) but there's a reference implementation using XSLT but it hasn't been looked at since 2001. Some bloggers have commented on the uneven state of Schematron.

I can extend this XSD with Schematron like this:

 <xs:complexType name="Payment">
  <xs:annotation>
   <xs:appinfo>
    <pattern name="Payment Rules" xmlns="
http://www.ascc.net/xml/schematron">
     <rule context="Payment">
      <assert test="(FromAccountID = 'PAID' and DateCompleted) or 
          (FromAccountID != 'PAID')">
             PAID Payments must have a Date Completed
      </assert>
     </rule>
    </pattern>
   </xs:appinfo>
  </xs:annotation>
...

And this simple example gives me the semantics I need and I get output like this from a console test application that are exactly what I need:

Results from Schematron validation
    From pattern "Payment Rules"
        Assert fails: PAID Payments must have a Date Completed
        At: /FI[1]/Relationship[1]/Payee[1]/Payment[2]
            <Payment>...</Payment>
            (Line: 73, Column: 5)

However, doubts about Schematron persist. Uche Ogbuji says:

"It has been a sketchy time for Schematron fans. Rick Jelliffe, the father of Schematron has had pressing matters that have prevented him from putting much work into Schematron for a while. Many questions still remain about the technology specification, and alas, there appears to be no place to keep discussions going on these and other matters (the mailing list on SourceForge appears to be defunct, with even the archives giving a 404. Here are some notes on recent Schematron developments I've come across."

However, it is moving towards being an ISO spec (or may already be?) and there's active talk going on at the SchematronLoveIn mailing list.

There's also a great (but oldish) article on Introducing the Schematron here. Looks like it might be a fine idea. The XSLT implementation worked group, but I also noticed a native C# .NET implementation at SourceForge. This implementation has the very much added benefit of giving me not only an event when a Schematron assertion fails, but also the line number and additional context. However, it's not been touched since 2002.

Is that a bad thing?

I asked the author of the .NET implementation of Schematron, Daniel Cazzulino, what he thought and he said:

"Mmm... schematron is mostly abandoned as the new compiled XSLT in .NET 2.0 makes the need for an "xpath native" implementation pretty much useless. If you use the reference meta-stylesheet and provide a nice .NET API over it (alongside better results reporting, such as an object model that can also be serialized into XML and/or XSLT'ed into HTML reports), you should be OK. And you would be in a better position feature-wise, as I never got to complete support for diagnostics elements, etc., which is readily implemented in the meta-stylesheet."

To translate Daniel's techno-speak into regular-guy-speak he's saying

"Ya, that sucks. You can write a wrapper around this other thing yourself, and that'd be a good idea in the long run, but ya, that sucks."

However, this project isn't using .NET 2.0 (client requirements) and the existing .NET Schematron stuff not only works, but it works great. It's many times faster than the XSLT implementation and did I mention, it's open source. That means, I have the source.

It's not like the Open Source Fairy is going to delete the software (and source) off my hard drive if a project disappears.

To quote Patrick Cauldwell, "Sure, we are assuming the burden of maintenance when we use it, but we're doing that anyway as there's no assurance that someone in the OS community would care about a bug we found."

This is exemplified by Stuart's recent spitting into the wind with a catastrophic but ignored Subversion case-sensitivity bug.

Moral: What you care about, often ain't what the other guy cares about.

Conclusion: The Schematron .NET implementation is total abandonware and I'm going to use it anyway. Since when did 3 year old software become abandoned. I haven't been in my backyard in 3 years, but if I catch you camping there I'll ask you to leave.


(If you'd like to receive ComputerZen.com via email, you can subscribe to this blog as a newsletter for free. Subscribe to Scott Hanselman - ComputerZen.com by Email)

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

Free ISO Disk Image burning Utility that works on Vista

October 3, '06 Comments [12] Posted in Tools
Sponsored By

BurncdccI found myself on Vista RC1 recently, downloading an ISO DVD disk image of the next build if Vista when I realized I had no way to burn the image to disk! Try as I may, I couldn't find an applet within Vista to burn an ISO and I had to uninstall Nero when I upgraded Vista.

Now, there's lots of ISO burning tools, but BurnCDCC from TerabyteUnlimited (Download via FTP) not only burns and works great on Vista RC1, but it requires no install. That's my kind of utility.

Boom. Copied to my C:\utils folder.

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

$25 Dollars from ING DIRECT with Deposit

October 3, '06 Comments [8] Posted in Musings
Sponsored By

IngdirectofferThis isn't spam, IMHO, but it's a useful enough offer for those of you readers who are interested in personal finance. We have a number of accounts with ING Direct, a bank of which I am a fan. They regularly have basic savings rates that are higher than anything else I have found.

UPDATE:

  • INGDirect gives 4.4% on their Savings and their 12-month CD is 5.1%
  • Praveen points me to HSBCDirect.com with a 5.05% Savings!
  • Kevin says Citibank has competitive rates also with 5.0% but requires a savings and checking out be linked.
  • Emmigrant Direct will do 5.05% also in New York.
  • WAMU will do 5.0% with a checking acount opening.

I like ING Direct because they are always upgrading their login page with new security features and there's no fuss to open an account.

If you sign up at http://www.ingdirect.com and reference code "CK921/hfbtitdex" (unfortunate code that) then you'll get US$25 free with an initial deposit of US$250. Not too bad if you're looking for a place to move your sock money to.

Disclaimer: ING Direct is NOT a Corillian Customer - I just think they are cool. This offer has nothing to do with Corillian. If you sign up, you get $25 immediately with a $250 deposit and I as an ING Direct Customer get $10. I will take that $10 and buy lunch at Chipotle.

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

More on Vista Reparse Points

October 3, '06 Comments [10] Posted in Longhorn | Tools
Sponsored By

SymlinkdVista upgrades NTFS to include some shiny new features, one is Transactional NTFS or "TxF". That means there's a Resource Manager for NTFS so you can batch up a whole transaction worth of file writes and if any of them go wrong - rollback.  I'm having a little trouble with Transactional NTFS right now because the resource manager is shutting down because I need to run chkdsk /f on my drive and I can't, but that's a story for another day.

Philip left a comment in my recent post on improvements in junctions/reparse points/symbolic links in Vista. He said "Have you tried using the new Vista symbolic directory link support available in the command line program "mklink /d". I have successfully used it cross-drive for other directories,though I haven't tested it in your scenario."

Soinks! That's what I get for not keeping up with Junfeng Zhang's excellent blog.

Postulate: Symlink is to Junction in Windows as Symlink is to Hardlink in Unix.

Symlinks can span volumes (wicked useful) and you can also Symlink to UNC paths. Woof. Notice the Command Prompt Screenshot at Right. In this example "My Documents" is a Symlink to another drive, while Junction points locally.

I am still a little unclear about the difference. As I understand it, junctions are "reparse points" and support links to local files and directories while symlinks are built into the NTFS file system at the Kernel level and support spanning drives. Perhaps Mark Russinovich will jump in here and explain.

Here's my DOS prompt removing my non-working junction and using the new MKLINK to get My Documents onto another drive.

C:\Users\Scott>mklink
Creates a symbolic link.

MKLINK [[/D] | [/H] | [/J]] Link Target

        /D      Creates a directory symbolic link.  Default is a file
                symbolic link.
        /H      Creates a hard link instead of a symbolic link.
        /J      Creates a Directory Junction.
        Link    specifies the new symbolic link name.
        Target  specifies the path (relative or absolute) that the new link
                refers to.

C:\Users\Scott>junction "My Documents"

Junction v1.04 - Windows junction creator and reparse point viewer
Copyright (C) 2000-2005 Mark Russinovich
Systems Internals -
http://www.sysinternals.com

C:\Users\Scott\My Documents: JUNCTION
   Substitute Name: D:\Scott\My Documents

C:\Users\Scott>mklink /d "My Documents" "d:\Scott\My Documents"
Cannot create a file when that file already exists.

C:\Users\Scott
>junction /d  "My Documents"

Junction v1.04 - Windows junction creator and reparse point viewer
Copyright (C) 2000-2005 Mark Russinovich
Systems Internals -
http://www.sysinternals.com

Deleted My Documents.

C:\Users\Scott>mklink /d "My Documents" "d:\Scott\My Documents"
symbolic link created for My Documents <<===>> d:\Scott\My Documents

C:\Users\Scott>junction "My Documents"

Junction v1.04 - Windows junction creator and reparse point viewer
Copyright (C) 2000-2005 Mark Russinovich
Systems Internals -
http://www.sysinternals.com

C:\Users\Scott\My Documents: UNKNOWN MICROSOFT REPARSE POINT

C:\Users\Scott>dir "My Documents"
 Volume in drive C is 70 GIGS - SYSTEM
 Volume Serial Number is 88F3-D225

Newjunctionsvista1 Directory of C:\Users\Scott\My Documents

10/02/2006  09:42 PM    <DIR>          .
10/02/2006  09:42 PM    <DIR>          ..
04/23/2005  07:02 PM            37,758 0764576100.01._SCLZZZZZZZ_.jpg
...lots of files here...
...snip...I was able to CD over to another drive transparently...

Turns out I was (half) wrong when I said that Explorer doesn't know about Junctions. It knows enough about Junctions to show the shortcut icon, but that's about it. However, Explorer DOES know enough about Symlinks to show the Target (pointed to) directory in the Properties dialog. Nice.

In Vista, all kinds of things have been moved, and are now using Junctions to point to the new locations:

Was Now
Application Data AppData\Roaming
Cookies \AppData\Roaming\Microsoft\Windows\Cookies
Local Settings \AppData\Local
My Documents \Documents
NetHood \AppData\Roaming\Microsoft\Windows\Network Shortcuts
PrintHood \AppData\Roaming\Microsoft\Windows\Printer Shortcuts
Recent \AppData\Roaming\Microsoft\Windows\Recent
SendTo \AppData\Roaming\Microsoft\Windows\SendTo
Start Menu \AppData\Roaming\Microsoft\Windows\Start Menu
Templates \AppData\Roaming\Microsoft\Windows\Templates

Interesting stuff, I say.

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

How Geeks become Do-It-Yourselfers and Tile their Kitchen

September 30, '06 Comments [24] Posted in Musings
Sponsored By

Josh and Scott Baby PicturesPerhaps you'll see yourself, Dear Reader, in this story.

My family is Handy. Well, let me qualify that. The {set of all people in my family who are not me is Handy}. That's "Handy" with a Capital-H.

My dad, was a Firefighter for thirty years, and my brother

(pictured in a headlock and covered in baking soda at right. He's the short one. Of course, now he's a Triathalon-running-biking-swimming 6'2" ninja, but at the time of this picture I could beat his *ss. Didn't last long, needless to say.)

is also a Firefighter. They are both handy. Josh and his wife also run Starry Nights Stables filled with all sorts of Handy things that they build themselves like horse runs from scratch. 

I, on the other hand, hire a guy to mow my lawn. You get the idea.

Seemed like I'd be the non-Handy Hanselman and I'd resigned myself to the situation. Recently we decided to remodel our kitchen. We'd had a bunch of tiles just fall completely off the counter, messed up cabinets, scratched walls, yada yada yada. Seemed time to do something about it.

We tend to research things a lot before we take action so we started at the library. We got books on tile, on counters, on painting, etc. We went to Lowe's and The Home Despot. I had little confidence in my ability to make this happen, but Josh and Dad said they'd be happy to help. They came up a few weekends (they live 90 minutes away) and helped tear out the old counter and level the cabinets for the new one.

When it came time to decide about the "backsplash" - the tile that's up against the wall, connected to the counter in case there's any confusion ;) - I figured I'd hire a guy. Josh and Dad had really worked hard but I didn't want them to keep driving up to help. Both assured me that I helped them in substantive ways, but for some reason occasionally running Windows Update or installing SpyBot didn't seem to be a fair exchange for tearing up a kitchen. (Yes, I know they are family and family helps folks without the need for payback, but you're missing the point. You have no focus!)

Mo said that if we did the tile ourselves that there'd be a Sense of Accomplishment.™ I figured that we could buy a Sense of Accomplishment™ while sitting on the couch. But, her wisdom prevailed and I declared that I'd be doing the tile myself. We smiled with a feeling of pending accomplishment. This will go well, right? 

Aside: Once three years ago I tried to change out the Water Filter on the Refrigerator and hooked it up backwards. The resulting explosion of carbon dust from the filter is currently hovering over Fiji moving in a South-South-Westerly direction.

Realizing that I am in fact, not Handy, I decided that I'd need to supplement my skills with Tools. This, Dear Reader, is how the Geek becomes a Do-It-Yourselfer. One word people - lasers. But, I'm getting ahead of myself.

Here's how Geeks do Tile.

  • CIMG5816Go to a Tile store and borrow their board of Tile. This is a big wood board covered in Tile.
  • Scan said Tile board. Scan it into PhotoShop. Create a 1:1 scale model of the Tile design and print it out on your Inkjet printer.
    • There's nothing like fake inkjet tile taped to your kitchen wall to give you a clear idea of what the final design is going to look like.
    • Aside: "Random" is hard. I ended up coming up with a pattern for this tile that would look random for a moment, then looked like a pattern later without falling into a checkerboard or moire thing. It also made efficient use of the colors of tile we had. But making it look Random was tricky.
  • Measure like ten times. Seriously. We were using 2" tile that turned out to be actually 1 7/8" so a little thought had to go into it.
  • I estimated I'd need 386 tiles. Apparently they don't sell 2" tiles all onesy-twosy like that, so don't go to a Tile Store and declare "I require 386 two-inch tiles."
  • We ended up buying 12" squares with 36 tiles each and had a few left over.
  • When the tiles show up, lay it ALL out exactly as it should be. Sticking tiles on the wall isn't the time to decide how it ought to look.
  • Get a freakin' laser. Chalk lines? Pencils? For Handy People, I say. Geeks use Lasers. I'd say it made it so much easier, but since this was the first time I'd done tile, I don't have another frame of reference. Still, pencils? Please.
    CIMG5815
  • Did I mention lay it all out ahead of time? Do that. I also put little pieces of paper every 5 tiles so I could tell where 10 inches would be.
  • Decide if you can do the whole thing without cutting a tile. One wall was 81" so I'd need to either use 40 tiles and cut one, or make up the space over the whole span. I was able to add the 1" by making the 1/8" grout an extra 1/40" wider between each tile. You really don't want to show up at the other side of the wall unprepared. :)
  • Spacers - use a metric crapload of them. I used something like 1250 little plastic spacers to make the grout lines just so. Love 'em.
  • Thinset is the cementy glue that you use to make the tile stick. Don't mix it yourself, get the premixed stuff.
  • When you put the tiles on, twist them slightly as you push to get the maximum amount of the Thinset on the back of the thing. Use the Grout Float - that I called the "pressy rubber thing" before I learned it was a Grout Float - to push against the tiles and apply even pressure over the whole field.
    CIMG5817

I'm very happy to announce we now have a Sense of Accomplishment™ and that I have joined the ranks of Handy Hanselmen who are Do-It-Yourselfers.

P.S. I promise I won't even think about the opportunity cost of this whole operation.

P.P.S. OK, maybe a little.

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.