Saving Windows RT

I consider the release of Windows RT to the consumer market to be one of the worst decisions Microsoft has made in recent years, and I have an $853MM writedown to back me up.  RT shipped primarily on a Surface RT, which isn’t an attractive personal device—it’s small, relatively costly, difficult to connect to the usual suite of peripherals and doesn’t sit well in your lap.  Additionally, here was a version of Windows which wouldn’t run any previous Windows program.  Consumers were used to getting a new computer with a new version of Windows and simply reinstalling their favorite old greeting card maker or photo editor.  Months later, when Windows 8 was released, confusion multiplied—now there were two versions of Windows—a “right one” and a “wrong one”, and your average consumer couldn’t tell the difference by looking.  Consumers literally needed someone with technical knowledge to tell the devices apart.  Add to that an a store which had few desirable apps and it’s no wonder interest was really low for RT.  The release of the Surface 3 running only Windows 8 puts the future of RT into greater doubt.

Having said that, RT could still be one of the greatest versions of Windows of all time.  How?  Improve the concept of enterprise application stores, and make RT the next Windows Embedded.  It’s not as crazy as it sounds.  I’ve helped manage installations of WinTerms for sales teams, and hundreds of handheld and lift mount devices in multiple warehouses, and this idea is a bit of a dream come true.

Windows 8 ships with a hard-coded attachment to the Microsoft store.  Make it simpler for enterprises to set up their own internal app store, and control the store setting via group policy.  Enterprises could easily distribute their in-house apps, or those supplied by ERP/WMS/etc vendors to the issued devices.  At a previous employer—a warehousing company—we had to manage hundreds of devices in multiple warehouses around the country.  We had to have someone onsite manually dock each one, and we had to go through a complicated set of steps to update the wimpy onboard apps.  If we could have posted an updated app on our internal store and have every device update itself automatically in seconds, that would have been a dream come true.  Intermec and Symbol should be all over this idea.

Take this one step further.  Remember the fires in Tesla Model S?  A software fix to correct how the car rides at freeway speed was downloaded to all the Model Ss.  Now imagine Ford replacing Sync with RT, and being able to do the same for control or entertainment systems.  Speaking of entertainment systems. keep the linkage to the movies and music stores so movies can be downloaded while parked at a McDonald’s.  The capabilities in RT would put Ford years ahead of its competitors in regards to onboard systems.  This could be extended into on-board systems for trucks as well.

Take this one more step.  Imagine battlefield updates to combat systems, downloaded via AWACs or properly equipped drones from a secure DOD app store.  It’s not too far-fetched.

Vehicles and warehouse equipment alone offers the potential of millions of devices running RT.  By looking at RT as a new Windows Embedded, Microsoft thinks big by thinking small.

An Updated Simple Passphrase Generator

(Note: The original version of this work is published at, this is a long overdue update)

Just about 9 years ago I was building a partner-facing reporting website, and I needed a way to generate passwords when partners were added by customer service (no public registration) as well as to generate new ones easily when a password needed to be reset.  I wanted to generate a passphrase, which is usually easier to remember than a random string of gibberish.  Some of the “more experienced” among us will recognize this format as AOL-style passwords, which were printed on the 3.5″ floppies we received in the mail or our PC magazines of the day.

In 2014, we have nearly a decade of breaches and crappy passwords being stolen.  Even today, weak and obvious passwords are some of the most popular choices.  My hope is passphrases may become more of a standard, but I doubt it.  Some of the text of the original article is republished below; some of the links are broken, and I’ve replaced them where I could find a suitable alternative.

You can find the updated code in my BitBucket Git repo, at  It’s pretty simple–one library project, a few tests in another project, and a console app to display the passphrases.  Use the library wherever it will run if you so wish, or fire up the console app anytime you need a good passphrase yourself.

Why Passphrases?

Perhaps first we should ask “What is a passphrase?”  Wikipedia may say it best:

A passphrase is a collection of ‘words’ used for access control, typically used to gain access to a computer system.

Passphrases were first proposed in 1981 by Sigmund Porter. Passphrases are distinguished from passwords by their virtue of being comprised of several words separated by spaces. Passphrases can satisfy even stringent security requirements, while being easier for the users to remember ( It’s this combination of complexity and ease of remembrance that make passphrases a good part of a password policy.

Our decision to use passphrases included another reason. By using passphrases when a user’s account is set up, we hoped to set an example to our users to use passphrases as well. We hoped that users would follow our example and choose passphrases they could remember easily, and that would be more than their dog’s name concatenated with a number 1. As a precedent, I cited that AOL has for years used multiple word passphrases as the login associated with all those floppies and CDs they send out. PGP and its variants also require using secure passphrases as your private key.

Recommended Passphrase Best Practices

With the intrinsic strength of some of the modern encryption, authentication, and message digest algorithms such as RSA, MD5, SHS and IDEA the user password or phrase is becoming more and more the focus of vulnerability. (

String passphrases are only one part of a comprehensive security policy. For additional security, you should include other best practices in your application’s login components. Microsoft makes a number of recommendations for Windows networks which are also applicable for ASP.NET applications ( These recommendations include:

  • Enforcing strong passwords
  • Ensure regular password changes
  • Maintain a history to prevent immediate reuse
  • Lock out accounts after a certain number of failed attempts

In a very good series of articles, Jesper Johansson reiterates many of these recommendations (, but disagrees about using account lockout policies. Several myths surrounding Windows passwords are addressed by Mark Burnett (, and although focused on Windows passwords, some of the information is also applicable to ASP.NET applications. Designing a component that includes these recommendations is beyond the scope of this article, but you should familiarize yourself with these recommendations and incorporate the pertinent ones into your application.

Generating Passphrases

FAQ: How do I choose a good password or phrase?

ANS: Shocking nonsense makes the most sense. (

There are a number of methods for generating passwords and passphrases. In this article, we’ll modify a method known as Diceware ( This method consists of a numbered word list and five dice. Each word is assigned a 5-digit number, with only numbers 1-6 at each position, and covering every combination of numbers. The five dice are rolled, and the numbers are read from each face to form a 5-digit number. This number is cross-referenced with a word in the word list, which is then the first word in the passphrase. This process is repeated until the requisite length or number of words has been reached.

Instead of rolling dice, we’ll use pseudo-random number generators to simulate dice rolls. To make cross referencing easier, we’ll use the original wordlist loaded as a Dictionary object.  This version of the generator uses the RngCryptoServiceProvider to simulate the rolls of the dice.

A Simple Unit Test Script for SQL Server

As we develop applications, it often makes sense to put some functions in a SQL CLR assembly.  As these assemblies are deployed through test, beta and production environments we need an easy way to ensure the assemblies have been updated correctly and are functioning as designed.  Many things can go wrong—incorrect permissions, deploying the wrong version of an assembly, even assumptions we made in the business logic.  I’m a big fan of RedGate’s SQL Test plugin—it’s an attractive SSMS plugin which organizes and runs tests via an easy to read panel—and the tSQLt (a unit testing framework for SQL Serve) which SQL Test is based on.  My next post will show recreate the testing strategy shown here using SQL Test.

One downside to tSQt is that you have to install a number of stored procedures and functions into your database.  Depending on your choice of database, permissions in your database and willingness to add additional objects to your database which aren’t drectly related to the data, using tSQLt may not be an option.  Although we’re testing a user defined function, we could also test stored procedures and SQLCLR assemblies.  This technique is also not limited to SQL Server—I use this in both SQL Server and VistaDB.  As you build out your application, you may want to consider adding diagnostic pages (or screens) where you can execute these testing procedures should your application start throwing errors.

The function we’ll be testing will be simple—we’ll pass in an nvarchar, and return the same nvarchar with the word “wombat” added to the end.

Start by creating a custom function:

( @phrase NVarChar(50)
return @phrase + ' wombat'

Now it’s time for the test harness.  I’m using VistaDB, creating a stored procedure and using table variables, syntax supported by more recent versions of SQL Server.  You may need to optimize for the database you’re using.  The first table holds our test cases—the test name, the value we want to pass into our function, and the expected result.  We then loop through all the tests, calling the function we want to test, and updating the result.  Our result comparison is very simple, similar to an Assert.AreEqual.  With a little more work, additional test types could be added, and the test indicated in the test case.

create procedure TestAddWombat as

TestName NVARCHAR(100),
TestCase NVARCHAR(100),
Expected NVARCHAR(100),
Result NVARCHAR(20));

DECLARE @testname VARCHAR(100);
declare @testcase nvarchar(MAX);
DECLARE @result NVARCHAR(max);

DECLARE @testCaseCount INT;
DECLARE @counter INT;

SET @counter = 1;

INSERT INTO @testcases
( TestName ,
TestCase ,

VALUES  ( N'should_return_hello_wombat' , -- TestName - nvarchar(100)
N'Hello, ' , -- TestCase - nvarchar(100)
N'Hello, wombat'  -- Expected - nvarchar(100)

INSERT INTO @testcases
( TestName ,
TestCase ,

VALUES  ( N'should_return_null' , -- TestName - nvarchar(100)
NULL , -- TestCase - nvarchar(100)
NULL -- Expected - nvarchar(100)

SELECT @testCaseCount = count(*) FROM @testcases

WHILE @counter <= @testCaseCount


SELECT @testname = TestName,
@expected = Expected,
@testcase = TestCase
FROM @testcases
WHERE TestNumber = @counter

SELECT @result = dbo.AddWombat(@testcase)

IF(@expected is NULL)
IF(@result is NULL)
UPDATE @testcases SET Result = 'True' WHERE TestNumber = @counter
UPDATE @testcases SET Result = 'False' WHERE TestNumber = @counter
IF(@expected = @result)
UPDATE @testcases SET Result = 'True' WHERE TestNumber = @counter
UPDATE @testcases SET Result = 'False' WHERE TestNumber = @counter
SET @counter = @counter + 1;


SELECT * FROM @testcases




Running this sproc returns the following results:




From here, we have a very basic test harness which we can easily add additional test cases, and easily extend.  TDD is a best practice in any aspect of application development, but database development is often not treated as application development and is far behind adopting practices common to C# developers.  This script is a simple way to introduce some TDD into database development.

Hosting your own URL shortener with YOURLS, Azure Web Site and WebMatrix

For a couple years now, I’ve been paying for a private-label URL-shortening service.  I’ve amassed hundreds of links, and don’t want to lose any of the shortcuts, but the cost has gone up with no change in features.  I would love to have better metrics, and certainly a lower cost.  Having a small Azure benefit gives me a level of free hosting with an Azure website.  I hunted around and found several open source URL shorteners.  I decided on using YOURLS, a PHP-based application with all the features I want and then some (nice charts, plugins, social sharing, an API and bookmarklets).  Plus, it looked insanely easy to install.  Here’s how I set up YOURLS on Azure (this blog post took longer and is more difficult to read than the actual process, it was that easy).  There are a couple paths you can follow here, yours may differ from mine since I already had some existing services set up.

Step 1: MySQL on Azure

YOURLS uses MySQL as its database.  There are two primary ways you can host MySQL on Azure:

  • ClearDB offers hosted MySQL databases on Azure, with a 20 MB developer instance for free.  This is plenty to play around with, but if you want more you can.  There are two ways to set up CleaDB on Azure: How to Create a MySQL Database in Windows Azure.
  • Spin up a VM (Linux or Windows) and host a MySQL instance on it.  This is probably the more expensive option, but gives you the utmost control.  If you wanted to use this VM to host your YOURLS, you could, but that’s another blog post.

I already had my developer instance set up from an earlier WordPress experiment.  I created this instance as a linked resource for Windows Azure Web Site previously, which is an easy way to get started, but limits you to the 20 MB limit.

Either way, follow one of the sets of instructions at to get started.

If you’re sharing a MySQL database, by default the Yourls tables are created with yourls_ prefix, so you can separate new tables from existing ones.

Step 2: Creating the Web Site

As with the MySQL database, you can do this in one of two ways.  If you have already followed, or plan to follow, the instructions for creating a MySQL database as a linked resource, use that and skip this step.  In that process, you’ll create a site in the Azure portal, then create a CleaDB MySQL instance linked to the site.

If you have a existing MySQL database, but need to create the website, you can create the site from within WebMatrix 3, which is what I did (if you don’t have WebMatrix 3, you will need to update to the latest version).

From the start screen, New >> Empty Site starts the process.


The next step is to find a unique name for your site, and a location to host it.  At this step you’re configuring the long name for your site.  Later you can configure a custom URL for your website.



A local and remote site are created




At this point, you’re read to start working.  You’ll be working in a local version of your website, not directly in the website.

Step 3: Installing and Configuring YOURLS

To get started this way, download the most recent version from (cloning and publishing via Git will be discussed in another post).  Unzip the download into the folder for the website created above.

Configuration options are explained at  The main ones to configure are:

  2. YOURLS_DB_PASS (remember this will be stored in plain text)
  5. YOURLS_DB_PREFIX (this is how you can separate YOURLS tables from any others in the same MySQL database)
  6. YOURLS_SITE (use the temporary URL until DNS propagates)
  7. YOURLS_COOKIEKEY (generate at
  8. $yourls_user_passwords (this is how you’ll log into the admin portal, you can encrypt these per

Do not put the config file in a publicly available location!  You have secrets in this file, make sure it stays private.

In order to view admin pages, you’ll also need to add a web.config to the root folder of your YOURLS site; see for a sample file.

Step 4: Publishing to Azure and Installing Database Tables

If you used WebMatrix to create your Azure Web Site, all you need to do now is click Publish and your files will be transferred automatically.  If you created your database and site via the Azure Portal, you’ll be prompted to either choose an existing Azure Web Site, use WebDeploy, or manually configure FTP.  This is a one-time configuration—every subsequent time you can just hit Publish.

After the site is deployed, there is a one time installation.  Simply go to http://<yoursite>, log in with the credentials you saved in the config file, and follow whatever prompts you’re given.

Step 5: Custom URL on Azure

Custom URLs for Azure Web Sites are not technically free, but you can apply Azure credits via an MSDN subscription (which I do) or pony up for a paid subscription.  Instructions for configuring a custom domain name for an Azure Web Site are at

You’ll need to have custom DNS for your site, usually this is done by using your registrar’s nameservers and custom DNS settings.  If your registrar doesn’t offer such a service, look into a service like  You’ll need to configure both a CNAME and an A record.  Do not forward your domain name.  After you configure your DNS, it’ll take a day or so to propagate completely.  Once the DNS is propagated, you’ll need to edit the config file and set the YOURLS_SITE to the custom domain name and republish.

Step 6: Track those clicks!

You should be fully running, you can extend YOURLS with some of the plugins found at

Happy shortening!

How to buy tickets for CodeMash

CodeMash is a very, very popular conference—demand for tickets far exceeds supply.  CodeMash sells out in minutes, and try as they might, the organizers simply can’t make everyone happy, nor assure anyone other than speakers and sponsors get tickets.  Whether you’re registering as a returning alum, or in the general admission, here are a few hints to make your registration easier.

Update: General tickets for CodeMash 2014 go on sale at 3:05 PM ET on 10/29.  If you didn’t know this until now, pay special attention to the section immediately below.  To check the time, you should probably use something accurate, like your cell phone, rather than your watch or the clock on the microwave.

Pay attention to the details

The organizers communicate a lot of information in the Google Group at!forum/codemash.  Pay attention to the details—the day and time registration starts, when alumni emails are being sent.  If you don’t get your alumni email when you should, check your spam folder.  Contact the organizers in the Google Group within a day of them sending the emails.  Do not wait until the last minute!  Set appointments in whatever calendar app you use so you don’t miss the start times.

Tickets are purchased via EventBrite, not through the CodeMash site.  Don’t go to the CodeMash site to register—there is nothing there for you.

Also, understand the rules.  Alumni emails are sent only to attendees from the previous year.  If you went two years ago but not last year, no dice.

Anytime before registration starts

CodeMash uses EventBrite for tickets and PayPal for payments.  You can make your registration a little less stressful by creating accounts on each of these sites, and making sure your profile information is complete and accurate.  If you have a PayPal account but don’t want to use those funds to pay for your tickets, you may need to create a new account and connect it to the credit card you want to use.

Pro tip: use a personal email address to register!  People change jobs, and alumni emails are sent to addresses on record.  Use an address you won’t lose if your employment changes.

Day of alumni registration – reserve hotel room

The CodeMash hotel room block opens up at 8am ET on the day of Alumni registration.  You need to call and say you’re reserving a room for CodeMash.  Be patient, the Kalahari registration staff knows the drill and is awesome.

If you don’t get a room at the Kalahari, make a reservation at a nearby venue, and check back.  There is a great deal of room speculation, and as the speculators don’t get tickets, the rooms free up again.  Continue right up until the conference starts.  Also, in the Google Group, there are often requests for roommates and carpools.

About 10 minutes before registration

Open two tabs in your browser and log into Eventbrite and PayPal.  Confirm your information is correct.  After you log into Eventbrite, open the CodeMash registration page.

Decide what ticket you want—conference only (Thurs & Fri), conference plus one day of precompiler (Weds-Fri), or conference plus two days of precompiler (Tues-Fri).  Make up your mind before you try and register—going back during registration has caused problems and delayed or prevented people from registering.

If you buy a conference only and decide you want to upgrade to precompiler, you can sometimes upgrade at a later date, subject to availability.  No guarantees.

At registration time

Until the exact second registration starts, you’ll see a “no tickets available” (or similar) message.  Use control+F5 to reload the page over and over.  When you see a list of tickets, choose the one you want, and continue registration.  Now, relax.  The worst is over—you have 45 minutes to complete your purchase, and Eventbrite shows you a countdown clock.  Since you should be already logged in, you just need to confirm your information and continue on.

To pay, you’ll be transferred to PayPal.  You should still be logged in, but if not, log in again.  Again, be calm.  45 minutes.  Choose your payment method, complete your purchase.  Make sure you click the link to go back to Eventbrite and complete your purchase!  Once you’re transferred back to Eventbrite, you should see a purchase confirmation.  You’re done, celebrate all over social media and start planning your outfits.

If you don’t get a ticket

Ticket sessions are reserved for 45 minutes.  If a ticket isn’t purchased within 45 minutes, it’s released back into the pool.  About 40 minutes after registration started, come back and try again.  Keep trying, since sessions all started at different times.  If you still don’t get a ticket, put yourself on the wait list and keep watching the Google Group—tickets are canceled up until the conference starts, especially in the final week leading up to the conference and you may be able to score one of these.

If you get a ticket

Check out my post An Unofficial Guide to CodeMash:

If you can’t get a room at the Kalahari

There are a lot of nearby hotels in Sandusky, including a Great Wolf Lodge (that’ll show ’em–get admission to two indoor water parks!).  Grab a room at a nearby hotel and watch the Google group–people’s plans change and rooms become available, especially in the two weeks leading up to CodeMash.  The Kalahari will have a shuttle to the nearest hotels, see!topic/codemash/sjL8fHEcPrE.

Review: Acer Iconia W3

I was an attendee at Build 2013, and received an Acer Iconia W3 and accessories as an attendee gift.  Now that I’ve had a couple months to use the device, it’s time to share my thoughts.  If you’ve ever said, “I’d love an iPad or a Kindle, but I wish I could use Office on them”, the W3 is definitely something to consider.

First Impressions

The Iconia W3 is designed to be held and work in portrait mode; others (such as the Surface) are designed to sit on a table in a widescreen format like a tiny laptop.  When you pick it up, you can tell the W3 is meant to be held in your hand and used for reading and consuming media.  Pre-installed Kindle, Hulu Plus and Netflix apps confirm this idea.  At a tad over one pound, the Iconia W3 feels solid but not too heavy.  The screen is bright and easy to read, and the new Windows 8 start screen makes navigating applications easy.  The screen is 8.1”, and fits nicely in one hand for me.  The advantage to a full Windows tablet is that actual Windows applications run on it—most notably Office, including Outlook.  Complex spreadsheets would be difficult on the small screen, but basic word processing and email are fine.  The Windows Store is packed full of apps, more than likely everything you want is now available.  You can browse the Windows app store at

Comparable Tablets

To put the Iconia W3 into the proper context, it’s similar to the iPad Mini, Galaxy Note 7 and the Kindle Fire HD.  Each of these tablets has a screen around 7”-8” and other similar features.  I do not have any of these devices, so I can’t do a side-by-side comparison.  If you’re looking for a smaller tablet device, this is your comparison group.  The Iconia is cheaper than an iPad Mini, search your favorite purchasing sites for prices on the other devices.


The Iconia W3 is comparable in specs to some of the more recent netbook computers:

  • 32 bit Windows 8 (current Win 8 versions can be upgraded to 8.1 for free)
  • 2 GB SDRAM (RAM cannot be upgraded since the device is sealed)
  • 32 or 64 GB Flash Storage (the 64 GB version has 49 GB of actual usable space due to the OS and pre-installed apps, but storage can be increased with a Micro SD card)
  • 8.1” screen with 5-point touch control (high end devices have 10-point touch, so the W3 supports the basic gestures but not some of the more advanced ones)
  • dual core 1.5 GHz Atom Z2760 processor, which is hyperthreaded.  Don’t let the seemingly slow speed of the processor fool you, this is pretty good.  If you’re used to seeing desktops at around 3 GHz, this may seem weird, but GHz is really an old benchmark that no longer accurately describes a processor’s performance.  It’s just the thing everyone knows.


  • Small size
  • Windows 8
  • Micro USB 2.0 (you need a USB 2.0 dongle for a full size USB port)
  • Micro HDMI port (to connect to a TV or a monitor, you need to get a micro HDMI to HDMI cable, or a micro HDMI dongle to use a regular HDMI cable)
  • Mini SD card slot, so you can add up to 32GB more storage
  • Long battery life
  • 1280 x 800 px 8.1” screen, capable of displaying 720 px HD
  • Bluetooth, so you can connect a mouse or keyboard

Unlike iOS, Windows 8 allows you to set up a number of users, and can designate child accounts.  With Windows 8 Family Safety, you can set limits of web browsing, game play and application usage, and receive reports via email or online of your child’s activity.  The picture password makes it easy for even small kids to log in, and I took a few minutes to arrange my daughter’s start screen with her stuff.

Acer touts an 8 hour battery life for the W3, and I routinely get that long from a full charge.  This is great for long trips.  Because of the small size, it’s very easy to carry around with you and use in a car, on an airplane.

The USB port allows you to connect printers, external DVD drives, thumb drives and other accessories directly to it (which is not something you can do with any other tablet).  You can also run iTunes on the W3 and manage an iPad/iPod/iPhone (take that Apple!).  Chances are all your cords are regular sized USB, so you’ll need a dongle for a regular USB connection.  You can connect a multi-USB thingy to your dongle, and then attach a bunch of devices.  For something really cool, look at the Plugable USB 2.0 Docking Station, which is great if you want to connect a monitor and several peripherals in a desktop scenario (great for students!) while still having a really portable tablet.

Having a daughter, we’ve purchased many DVDs, which I’ve ripped to video files (yes, I buy and keep the DVDs so it’s all legal as I understand it to be).  When we travel, I load up the videos onto the W3, and I pack an HDMI cable.  The video app is very easy for a child to use, so she can consume her media on the go, and in the hotel we can hook up to the TV via the HDMI cable.

Besides iTunes, you can also add music and videos from Amazon Prime or Microsoft’s store, plus Hulu and Netflix.  The Zune Music Pass is now the XBox Music Pass, so you can have unlimited streaming with a subscription ($99 if you buy the full year).  There are many media options for the W3.

You can control your Xbox from the W3 using XBox SmartGlass, including the DVD controls, so if you have an XBox as an entertainment device this is great.  Also, you can connect to your XBox Live account and play a lot of connected games.


  • Weak WiFi radio
  • bad camera – 2MP front, 2MP rear
  • low screen quality – not 1020 HD quality screen, not as sharp as a retina display
  • Several reports of fellow attendees of DOA devices, or failures later.
  • Not the most precise touch—with larger fingers, should look into a touch stylus.

Some of my fellow attendees reported devices which were DOA, and Acer replaced them at the conference.  The WiFi radio is weaker than my iPad, but when I’m at home or a coffee shop that isn’t an issue.  That has been an issue in a hotel where the signal was wimpy also, but all my devices suffered there.

The W3 sports two cameras—one front, one back—but both are a low 2MP resolution.  By contrast, most smartphones are 5-8MP, so this is rather sad.  Good enough for Skype, but I wouldn’t try and preserve any precious memories with it.  The screen is not as sharp as a Retina display, and won’t display 1020 HD video without downscaling, so you lose quality there (720 HD is fine).

They’ve jammed a lot of pixels into a small screen, so it can be tricky to touch exactly what you want.  Many apps support pinch-zoom, which helps, but I also have a touch stylus (the ones with the rubber tip, same as an iPad) which I use when the zoom isn’t supported.


Although you can use any Bluetooth keyboard with the Iconia, the Acer Bluetooth Keyboard is designed specifically for the Iconia W3.  It’s an almost full size keyboard which acts as a tablet stand.  When not in use, the tablet snaps into an indention in the bottom of the keyboard for easier transport.  It’s actually a really nice keyboard, and makes email and word processing much easier.  In fact, the bulk of this blog post was written on my W3.

Any Bluetooth mouse will work, and you can use the USB port for a wireless or wired mouse (again, dongle).  Bluetooth printers, speakers, etc  should all work.

We did receive a micro USB to USB dongle with the attendee kit, and you’ll definitely want to add one.  Like I mentioned above, I also pack an HDMI cable for use in a hotel room.

Can is really play Halo?

Yes, you can play certain expansions.  Here’s Halo: Spartan Assault in the Windows Store:

Are there good apps for kids?

Plenty.  Fresh Paint is an amazing drawing/painting app (it was in the commercial with the really big tablet and little girl), and it’s free.  My daughter really enjoys the Disney Fairies Hidden Treasures, but be careful if you connect the W3 to your XBox live account—all my friends playing Call of Duty see me level up in Disney Fairies.  Angry Birds Star Wars and Angry Birds Space are also available.  It’s worth following the link above and seeing if something you like is available, or find something you didn’t know about.


Even though the Iconia W3 is a full PC, given the form factor it’s probably best to think of this as a powerful media device which can run Office rather than as a full PC.  To me, the W3 is a very decent secondary device.  For the cost of a keyboard and monitor, you’re in the range of a capable laptop.  For someone who wants both extreme portability and a larger screen, but only one device, a W3 and an external monitor could be a good compromise.  Having said that, I’m a software engineer and my tech requirements are a little higher than average—someone who only does email, Facebook, some light Word or Excel and loves to read, this is a great device to consider.

Developer Productivity Tip: The Personal Standup

This is one of my favorite productivity practices, and one I’ve found to help me maintain a high level of productivity. Every morning, prior to my team’s standup, I had my own personal standup for 10-15 minutes. The time was blocked off in my calendar as a standing appointment so no one could schedule over my time.

I’d use this time to reflect on the previous day and plan the current day, and go into team standup with a complete update and plan. This is a technique I picked up from my dad, who used a DayTimer well into retirement. I kept a daily diary of ideas and what I worked on, usually using a pocket-sized Moleskine Classic. My personal preference is plain paper, but whatever fits your style is perfect. Later on I started using an Emergent Task Planner every day. Whatever you use, it shouldn’t be a clumsy burden–it should fit your workflow and style. You should actually want to plan and record (get a good pen, too). This is something I continue to do today.

2013-04-25T18-53-07_0 (Medium)

Every morning I looked back at the tasks which needed continued, what I had completed, any blocks, and set up a plan for the day. From then it was smooth sailing through the day. Most of the time.

Slides for “The Data Bath” at Pittsburgh Tech Fest

Thanks to everyone who attended! You can download the slides handout at The Data Bath Handout.

If you’re a SlideShare fan, you can find these same slides at

Additional references for the SimMetrics library are at the end, but the main reference for installing into SQL Server is Beyond SoundEx-Functions for Fuzzy Searching in MS SQL Server. All the algorithms have great entries in Wikipedia.

Connecting SQL Source Control to Git in Team Foundation Service

Team Foundation Service is Microsoft’s hosted TFS, and supports both Git and TFS source control.  TFS(ervice) is free for teams up to five, and all repos are private.  If you need a Team Foundation Service account, go to and log in with your Microsoft ID.  If you’re using Git, you’ll also need to create an alternate set of credentials to connect to the repo.

In SQL Source Control, Git is now a top-level provider, but full Git support hasn’t been implemented yet (Subversion and TFS have much better support in the current version, 3.4 at the time of this post).  For the current version of SQL Source Control, you’ll still need to switch to your favorite Git tool for add/commit/push.  Upcoming features in SQL Source Control for Git include better branching support and support for migrations.  Migrations allow you to alter schema objects without dropping them first—like changing the name of a table without dropping it first—as well as seeding initial data.

1. Create project in TFS



2. Navigate to Code tab, clone the repo in your favorite Git tool using the URL provided.  TFS only supports HTTPS right now, so you need a set of alternate credentials to use Git.




3. In SSMS, right-click the database you want to put under source control and select “Link database to source control”.



4. Then, browse to your working folder and select whether each developer will have their own copy of the database, or everyone will work from one central database.



5. Once the database has been linked, click on the “Commit Changes” tab and choose “Save Changes”.  For a Git repo, this just saves the script files—you still need to do an add, commit and push in your favorite tool.



6. Once you’ve done an add/commit/push, you can log into TFS again and use all the functionality of diffs, history tracking, etc.  Your other team members can pull from this repo and use SQL Source Control to easily keep their instances up to date.

TryParse() in one line–when to use it, when to avoid it

Note: The code samples shown below are meant to run in LinqPad as “C# Statements”. You can use the free version, but it’s well worth paying for.

Almost all types (every one I can think of, but I’m not going to commit and say “all”) have both a .Parse() and .TryParse() method, the differences between which are discussed at As a general rule, we try and use .TryParse() everywhere.

The one down side to .TryParse() is that it requires a little extra code–an output variable, and a result variable, and you’ll probably need to set a default value in case the parsing fails. You can accomplish this in one line of code with the right syntax that at first doesn’t look like it should work.

Here’s an example of how to do .TryParse() in one line, showing a syntax which works and one which doesn’t (.Dump() is a method specific to LinqPad).

string _int = "8675309";

int i1 = int.TryParse(_int, out i1)
	? i1
	: 0;

Output: 8675309

//This doesn't work
//var i2 = int.TryParse(_int, out i2)
//	? i2
//	: 0;

It’s interesting how the explicitly typed variable works, but the implicitly typed one doesn’t. The same thing happens with a GUId:

string _guid = "d09eccda-533a-4772-b589-dbc5676fb690";

//This works
Guid g1 = Guid.TryParse(_guid, out g1) 
	? g1 
	: Guid.Empty;

output: d09eccda-533a-4772-b589-dbc5676fb690

//This does not:
//var g2 = Guid.TryParse(_guid.ToString(), out g2)
// 	? g2
// 	: Guid.Empty;

So we know implicit typing isn’t going to work. Are there any other places we’ve found you need to be careful? Yes, one more so far–Booleans. Based on the patterns above, you’d expect this to work:

string _bool = "false";
bool b1 = bool.TryParse(_bool, out b1);

output: true

Go try that in LindPad and see what happens. Spoiler alert: b1 is true, not false. The result of .TryParse() is a Boolean, and instead of assigning the output value to b1, the result is being assigned to b1. Instead, you need to use the longer syntax to make Booleans work correctly:

string _bool = "false";
bool b2;
bool b3 = bool.TryParse(_bool, out b2);

output: true

That will end up with the correct values assigned.

So there you have it–how to handle a .TryParse() in one line, and a couple of pitfalls in doing so. Hope that helps!