Scott Hanselman

Introducing BabySmash - A WPF Experiment

June 2, '08 Comments [39] Posted in BabySmash | Learning .NET | Windows Client | WPF
Sponsored By

screenshot1 WPF (Windows Presentation Foundation) is confusing, to me at least. It's one of those things that is so completely different from how things were done in the past that it's not only hard to just pick up, but it's hard to tell what's the right way to do things. Often, there's a half-dozen ways to do something but no way to know which is the right. By right, I mean, most robust, most reliable, most future-proof, most supported, most compatible. It's powerful, but the power isn't immediately discoverable.

A Little Personal History

I'm a Win32 guy from way back. To be honest, I'm a Win16 guy. I cut my teeth when Hello World was 92 lines of C code on Windows 3.0, not counting the dialog resources. I worked on internationalizing applications in '95 when thunking (translating between 16 and 32-bit) was all the rage. We had an educational security application that needed to run in DOS, Windows 3.1 and Windows 95, and they wanted to re-use as much code as possible, so I #ifdef'd my way to glory.

I not only understand Win32, but I understand it's historical context and many of the design decisions behind it. Certainly not as much as Raymond Chen, but I devoured Petzold's legendary book, as did we all, and when MFC came out, I understand exactly what it abstracted and what it didn't.

WinForms is a managed layer over Win32 Windowing, and not only does Win32 sneak out occasionally in your code, but so does (of course) many other Win32 APIs.


OK, fast forward to this past weekend. My 2.5 year old and 6 month olds are constantly smashing on the various computers around the house. There's two Macs and four PCs in various locations. I've got a great free toddler-specific  application called AlphaBaby installed on the Mac that makes sounds, shows letters and numbers while ostensibly protecting the machine (the software at least) from the kids. When I see my kids playing with it with such enthusiasm, I always think of the Incredible Hulk when he says "Hulk! Smash!" so this is "Baby! Smash!"

I always wanted a Windows version of AlphaBaby, and some Googling didn't find me what I wanted, although I knew it must be out there. (Of course, now many of you have shared with me your favorite toddler programs. Someone should re-write KidPix for the PC. THAT was a great application.)

Learning WPF

My wife was watching some horrific movie on Lifetime (seriously, Patrick Swayze was in it and it wasn't Dirty Dancing) so I figured I'd spend a few hours and bang out a little application for the boys. Then I realized that this was a fine opportunity to learn WPF. I understand the general ideas behind WPF and Chris Sells has explained some aspects of it to me. Suffice it to say, WPF is a complete re-imagining of how Windows Client Developer should work - hence it's relative inaccessibility to folks like me who are deeply routed in PeekMessage. ;)

File|New WPF Application and some poking around got me some progress, but I was really trying to make the code clean. I had two goals: make it work and do it well.

Then, it hit me. "Make it work' usually is the most important goal, so I accepted that I don't know WPF and just made it work using techniques I already knew. About 6 hours later, a lot of hacking, some sample wav files of kids laughing, a quick web search for free "Web 2.0 templates," register a domain, upload, and I had and a workable ClickOnce WPF application that's about 60% of where I want it.


Here's some of the "features." Note that some of these are technical features. Some are kind of obscure, but as a whole, I think these represent a good representative mix of the kinds of things that Windows Client Programmers might find themselves trying to figure out. I think it's a decent sample because it's complex without being oppressively so, it's easy to get one's head around the requirements, it has a lot of possibilities, and it touches all over the platform (BCL, WinForms, Win32, WPF).

Current Features

  • Silly Graphics
  • Options Dialog and Settings saved in Isolated Storage
  • Keyboard Hooks - Disabled Windows Key, ALT-TAB, Ctrl-Esc
  • ClickOnce (is it viable? sure makes auto-updating easy)
  • Kiosk Mode (Full Screen)
  • Multi-monitor Support (almost)
  • Multimedia, Playing audio files
  • Text to Speech

Future Features Ideas

  • 3D? Animations? Gradients?
  • Code Signing Certificate to avoid warning
  • Mouse drag/painting support  
  • Better/more Multimonitor options
    • Simultaneously add shapes on n monitors
  • Optional install as Screensaver?
  • When .NET 3.5 is released, support the smaller .NET 3.5 Client Install
  • Add custom WAV files (my voice?) for letters/shapes, rather than TTS
    • Maybe let parents record their own voices
  • Localized?
    • Does it work on non-English Keyboards/Systems?
    • Does it make sense/is it useful with non-Latin languages? Chinese, Arabic?
  • Logging/phone-home when exceptions happen
  • About Box (woohoo!)

Did I mention the code sucks deeply?

it also has some "hidden features." By hidden features, I mean, the code sucks. Deeply. Which is kind of the whole point. After I abandoned my "do it well" goal and focused on "make it work," I made ridiculous progress. Of course, I'm not sure the fate of my immortal soul after writing this code, but calling back to last week's post on how none of us really knows what we're doing, why not use this as a learning experience?

I decided to not only hack this together, but also to consciously not do a refactoring pass. This is the code exactly and horribly as written the first time, comments, dead code, duplicated blocks, and random copy-pastes from the bathroom wall of code CodeProject and MSDN. Don't judge me too harshly because you KNOW you've written this kind of crap yourself, Dear Reader. The kind of code that makes you need a shower later, but it works and it solved the problem.

Problems as I see them

The code is on CodePlex, and this is my own stream-of-consciousness review of the code and functionality.

  • No real design
  • No separations of concerns between objects
  • Utils class (isn't there always a Utils class?) is schizophrenic
  • Unclear to me how to convert the low level Win32 calls to WPF-eese.
  • I think there's easier way to have "stroked" (outined) characters.
  • Not modular - no way to add new shapes and have sounds associated with them.
  • ConfigurationManager/IsolatedStorage - feels like I shouldn't have had to do that.
  • Audio - used Win32 APIs. Do the WPF managed API have the same perf?
  • If you slam on the keyboard too fast, like wipe your hand over it, it can crash in un-managed code. Is this the global keyboard hook gone wrong or something more sinister?
  • Need to capture Alt-Space
  • Relationship between Main Window, Options, and configuration details is shaky at best. There should be a pattern for chunks of config state that might change during the process.
  • The random letter/shape positioning has some hard-coded fudge factors that feel gross.
  • No tests - how would you test something like this?
  • No thought to threading issues (do I have any?)
  • Multimonitor is cheesy, and the Windows on other monitors don't update unless they have focus. How can dispatch (Replay/Tivo?) keystrokes/events too n windows at once so they all update?
  • Multimonitor - I'd like to detect on window being closed, then close them all.
  • Splash screen?
  • No tracing, debugging, exception handling, logging.
  • I keep calling into System.Windows.Forms. Are there known WPF limitations on keyboard handling?
  • If you hit enough keys fast enough, you have to wait for the "queue" to empty. Can I solve that and drop keys if something fills to fast? My own key queue?
  • Not localized - magic strings.
  • I'm not really using XAML. Is there a better, more declarative way to do some of this?

The Experiment

image I'd like to try two things here. First, what I'd like to do is have a group code review. Leave your thoughts in the CodePlex Issue Tracker and code in <pre> tags. Be sure to read them first so you aren't duplicating effort. Of course, even better, feel free to blog your improvements and diffs or email me diff files (firstname at

Second, I'm going to hunt down WPF programmers. Not just Microsoft Employees, although I'll go find the WPF team and ask them, but I want to talk people who have succeeded and failed at WPF applications and get their ideas on refactorings, structure, design, and correctness. Help me (us) understand how it works and if it's better.

Then (hopefully) over a series of blog posts and maybe a podcast or two, we'll have two applications, before and after, that we can look at. One will be my initial hacked-together-but-functional application, and one will be a completely refactored, group-vetted, expert-reviewed sample that represents (theoretically) a well-written WPF application. The app will implement all the features above and more, and each "feature" will be a little best-practice that someone can use in their app. This way we'll have not just a random sample - with credit to Rob Conery's MVC Storefront application and his transparent design process - but two, before and after, and at some point I'm hoping my brain will break out of my Win32 thinking and I'll better understand WPF idioms.

I will tag the posts on my blog in the BabySmash category. I'll also be trying some other mostly unrelated experiments, as I'll use Git for local, offline source control, but I'll be pushing my major commits from Git to TFS (Team Foundation Server) at CodePlex as well as using TFS for issue tracking.

Have at it, the source is up on CodePlex, you can download a ZIP.

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

Professionalism, Programming, and Punditry and Success as a Metric

May 31, '08 Comments [28] Posted in Musings | Programming
Sponsored By

Jeff Atwood has one of his best posts in months that was inspired by Alastair Rankine's post "Blogging Horror" explaining why he's unsubscribed from Jeff's blog. I too, have been less compelled to read Jeff's blog lately, but he's an excellent writer and he's consistent, so I read it at least a few times a week. Kudos to Jeff for keeping up the pace and for inspiring conversation.

Alastair says:

"In other words, Atwood seems to be setting himself up as an authority figure on software development and, well, I have some issues with this."

This is something I've struggled with as I've been blogging. I mean, it's just a blog. Look at my first post. Once while presenting in the Midwest a gentleman asked me a question along the lines of "how did you get so good?"

I said, "What gave you that idea? Don't mistake loud with good. Start writing and talking, you can be loud, too."

I like what Dave Winer said that Jeff quoted:

"Blogging is an amateur activity. It's users writing about what they do, not professionals writing about what users do."

I'm definitely not an authority figure on software development. I'll go so far as to put words in the mouth of Martin Fowler (we'll see if he comments), but from my interactions with him, I'd venture to say he wouldn't consider himself an authority either. He's a traveler on the path, as are we. He thinks, shares, asks good questions and starts interesting conversations. What more could one ask from a member of the community?

We're all just learning together. I started blogging so I could Google myself later, that's all. I taught as an adjunct professor so I could know the topics better as there is no better way to learn a thing deeply than to teach it. I worked on a few books so I could really dig deep, but I'm the first guy to say "dude, I have no idea." My brain bit-rots as yours does.

None of us (in software) really knows what we're doing. Buildings have been built for thousands of years and software has been an art/science for um, significantly less (yes, math has been around longer, but you know.) What just know what's worked for us in the past.

There was an interesting conversation in the second ALT.NET podcast (not my show) where the folks in the conversation were disparaging Database Driven Development over Model/Domain Driven Development. It may not be pure, but it must have worked for someone or it wouldn't exist, just like the Scrummerfall Project Management Methodology. ;)

Once years ago when working at a large NW Bank I was in a meeting with a young man who had been hired by a consulting company and had only worked at that one company. He was a "college hire" and had no experience other than "whiteboarding for money." I really don't like to get into measuring contests but I was weak in this instance. I took the bait and said "well, I like to use success as my metric, what have you shipped lately?" It was a nasty room-quieting thing to say and I'm not proud of it. But, I was really frustrated and I didn't know what it was going to take to get it across to this gentleman that we were more interested in shipping software than his brand of architecture astronomy. If you're in college, definitely ship some software or work on some open source applications to get some really good failures under your belt, before you enter the workforce.

One of the things that I enjoyed so much about my recent show with Richard Campbell is that we've both being doing this for so long (15,20 years respectively) that we've go so many stories of failure. Folks are really teasing Twitter for being down all the time. People blame Rails, the blame the team, but think of what they are learning! Even better if they share it with us in detail.

I respect failure a great deal. So does Jeff. Success is a good metric but failure is pretty useful as well - certainly more useful than putting MCSE, MCSD, MC*.* after your name. When I hear that someone has a lot of experience, I'm most interested in their horrible failures and how they dealt with it. My best blog posts have been pulling about success out of crap, fixing bugs, slinging code, fighting with the machine.

Jeff says about himself:

"But I have an ace up my sleeve that most don't: what I lack in talent, I make up in intensity."

Not only am I in no way an expert in software, Microsoft or otherwise, I explicitly assume that you aren't either. I have had conversations with high level VP types at banks who have said things like "I read on this guy's blog blah blah blah, it sounds good. What do you think?" and my questions back at them are "Have you tried it? What do you think?"

The blogosphere is a network of trust, so certainly there are some people that I trust because they make sense and other folks think they make sense also.

Still, ultimately, it's about thinking, talking to each other, and thinking some more. The real content in any blog, this one included, is in the comments, and that's why I like you all so darn much, Dear Readers.

If you've got experience, share it. If you don't, then do some work and fail fast so you can gain experience. Read, write, talk and test. Have fun, write code.

"Talk is cheap, show me the code" - Linus

Related Links

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

Pure Digital Flip Video Ultra Review

May 30, '08 Comments [17] Posted in Reviews
Sponsored By

31t9tfsQuXL._SS400_Turns out you can get the Pure Digital Flip Video Camera for only $119 for a while at Amazon. I paid $144 just yesterday. Shoot.

I bought this for The Wife's birthday because the babies are always doing something awesome and we have no easy way to capture it. We had a Casio Exilim that did video, but it had too many knobs and buttons for her taste and getting the uncompressed video off the camera with a docking station, USB, more button pushing, not to mention getting it online was non-trivial and not something she was willing to put up with.

Hence, the PureDigital Flip Video Ultra. Cheap, with one major button, minimal moving parts, built in software (the software lives on the camera and autoruns when you plug it in), 60 minutes of recording time and it's purse-sized.

Is there anything wrong with it? Not that I can see. My ONLY beef, and I mean ONLY, is that I can't just plug it into my Xbox, but that's actually a beef with the Xbox!

The Flip does 30fps MP4 video at 640x480 (4:3) and looks great on DVDs. It's a ~4000kbps video bitrate and a 177kbps audio rate. It's best feature? Fantastic exposure control. Low light, bright light, it just looks great.

It has ZERO frills. That means no microphone jack, NO settings (just one setting - awesome) and she immediately knew how to use it. But enough typing, this is a review about a portable video camera, here's a video review!

You'll enjoy using the Flip, it's a STEAL for the price/functionality ratio. The WAF (Wife Acceptance Factor) is very high on this product.

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

Community Call to Action: NOT Northwind

May 30, '08 Comments [82] Posted in Musings | NotNorthwind
Sponsored By

northwind_thumbI'm just sick of Northwind. Sick to death of the Northwind Database. You know, this is the Products, Categories, Suppliers, yada yada yada sample database that you've been seeing in Microsoft demos since the beginning of time. (FYI, the beginning of time was about 1997. ;) )

Why do we use it? Because it's there. Because it's easy, it exists, and it takes two seconds to install. It's full of good sample data that has international characters. It has a few views and a few sprocs and it's wholly harmless.

Now, some folks don't like Microsoft's (often) focus on "Database Driven Development," and I'm basically Switzerland at this point. Consider me neutral because I've done it both ways, both Domain Driven and Database Driven. With an ORM and without. I'm not 100% convinced either way and I like to have choice.

Plus, when I'm showing some technology that is talking to a Database or to POCO (Plain Ol' CLR Objects) I still need good sample data to pull from. Thus, the Northwind Virus continues.

And I hate it with the heat of a thousand suns.

There are others I could use, like AdventureWorks and its variants and specifically the AdventureWorksLT example is pretty lightweight, but still it doesn't quite turn me on.

I suspect, though, that if we (the community) took a few weeks, did some Skype conference calls, assigned some tasks, brainstormed and did it, we could come up with NotNorthwind. The Lazy Web, the Web of Clay Shirkey, .NET Flash Mobs included, could create a sample database, (we can argue about whether to start in the middle or in the db in the first meeting) as well as some good examples of things like NHibernate, LINQ to SQL or Whatever,


  • Complex enough to be called Real World but simple enough that someone could "get it" in 5-10 minutes
  • In a familiar Domain Space that makes sense to folks all over the world
  • Has a decent amount of sample data with strings that are more than just [a-z|A-Z|0-9]


  • Have a single .SQL file that one can run and immediately get a working database
  • Sample Code for any of a number of Database access patterns, ORMs, whatever. This might require a few subtle versions.

I'm making and I want:

  • A Project Manager (probably best if it's not me)
  • Modelers, Sample Code Writers
  • Sample Data Creators
  • Documentation Person
  • Release Manager

Who's with me? Leave a comment with your CodePlex Username, Skype Username, your TimeZone offset, and your level of interest and let's do a Skype call to kick this off and be rid of Northwind. Also, if you think this is a stupid idea, why?

Oh, by the way, if you're at TechEd US this next week, be sure to say Hi if you see me, and let's talk about this project, because most of my demos at TechEd 2008 are <gulp> Northwindian in their heritage.

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

ASP.NET MVC Preview 3

May 27, '08 Comments [36] Posted in ASP.NET | ASP.NET MVC | Screencasts | Source Code
Sponsored By

The Gu has announced another regular drop of ASP.NET MVC. This one is Preview 3 and the goodness can be found at the landing page.

How does this relate to Visual Studio 2008/.NET 3.5 SP1 Beta

It doesn't. For now ASP.NET MVC is an out-of-band Web downloadable thing. It's bin deployable (meaning you don't HAVE to put them in the GAC) and you don't even need to tell your hosting/ISP. They are what they are - three DLLs in a folder. Bam. Phil has more details on his blog from last week with regard to MVC Preview 2, but the idea still holds. He says:

"MVC Preview 3 will not be affected by having SP1 installed. Preview 3 will include newer privately versioned bin deployable builds of the Routing and Abstractions DLLs. That way these assemblies will not be affected by the versions in the GAC installed by SP1, because they will have different version numbers."


ASP.NET MVC Preview 3 Beginner Videos

I did two quick updated beginner introductory videos specific to Preview 3, but the original Preview 2 videos are still up and still mostly valid. As I've said before, there will be more videos as we get closer to release. These are safe to show your CTO and they are short - on purpose - so he or she doesn't fall asleep.

Introduction to ASP.NET MVC Preview 3
Scott Hanselman walks you through an ASP.NET MVC Hello World example in this video updated for Preview 3. He also explains the lifecycle of an ASP.NET MVC application.

Basic Application Building with ASP.NET MVC Preview 3
Scott Hanselman uses a sample database to create a basic Product Catalog management application with create, read, update and delete functionality. You can download the source for this application at Phil Haack's blog.


One cool new development is that my team added Rob's Storefront Videos to the site and you can check out the first ten videos here. The benefits are several, first, Rob won't have to pay for bandwidth, but we've also transcoded his videos into a bunch of formats for those of you that are passionate about your specific format. You know who you are. Me, I use just WMV or MP4 (DivX/xVid) and think that that's one too many, but you've can you choose from WMV, Zune, iPod, PSP, MPEG-4, and 3GP if it make you happy.

Updated ASP.NET MVC Preview 3 Sample

Phil has updated the Northwind MVC Sample for ASP.NET MVC Preview 3 and you can get it at Phil's Blog.

Preview 3 is also makes it way easier to test Controllers because they return ActionResults now, which gets the Controller out of the call stack and lets the Test focus on what the controller really intends to do, rather than worrying about mocking side effects of what the Controller might have done. As usual ScottGu has left me with nothing good to write about because he's already done a fine post with lots of detail on the changes. So selfish! ;)

BTW, if you're digging the Gu's black code theme, blame me for converting him and go check out the Visual Studio Programmer Themes Gallery, I believe he's still using Rob Conery's Textmate Take 2 theme.

Technorati Tags: ,

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.