Scott Hanselman

Review: Microsoft Touch Mouse for Windows 7

August 3, '11 Comments [45] Posted in Reviews
Sponsored By

Microosft Touch Mouse for Windows 7First, a disclaimer. I work for Microsoft on the Web Platform team. That said, I don't know anyone in hardware. My opinions are my own. I don't have any vested interest in this mouse and I paid for it myself. In fact, I pre-ordered it in February.

I'm a hardware fanboy. I've tried dozens of keyboards and mice, and many webcams. Getting a new mouse or a new keyboard is a great inexpensive way to fundamentally change your computing experience. It's like a new pair of pants. Sometimes it just makes you happy to refresh the stuff you use every day.

I REALLY want to like the Microsoft Touch Mouse. The idea is a great one. Take a mouse that works like you'd think a mouse should, then add a number of multi-touch gestures so your mouse is everything a mouse is PLUS basic gestures you use with a touchpad or phone.

Packaging and Hardware

The packaging and OOBE (Out of Box Experience) is cherry. It's really nice to see Microsoft getting packaging right in a way that isn't a copy of Apple's packaging. The package opens up with a multi-fold lid like a treasure chest to expose the mouse beneath a clear cover. There's even a little magnet to hold the lid down. Inside the lid is directions on how to use the primary gestures.

You open the box by pulling the lid all the way off and releasing the mouse from it's stand. There's a nano receiver and batteries are included. While the nano receiver has a home inside the base of the mouse for storage, it's unfortunate that there isn't an option for using Bluetooth as I need another nano receiver like I need a hole in the head. All up, the packaging is primo.

The mouse itself is pleasingly heavy. I suspect if I opened it up I'd find a small lead weight inside to give it just a smidge of heft.

Tracking

The tracking uses the newer BlueTrack system rather than the Red-light system most of my mice use. It's also extremely responsive and tracks on darn near anything. I don't need to use a mousepad with this mouse, but I always use a WowPad because they make any mouse work better. It really tracks perfectly, as it should. I haven't have any issues with poor tracking mice in the last several years since the optical-super-laser-whatever technology came out and this mouse is no exception.

Gestures and Software

The software is a new tab called Touch within the Mouse control panel. It's got a nice side-car window with a lopping video showing you how to do each gesture. It's a little subtle, but you can play each video with the little blue play button on the left (they look like bullet points.)

Gestures supported are:

  • One finger scroll pan (vertically and horizontally)
  • One thumb swipe - A forward/back gesture, just like the thumb forward and back buttons on most mice (and many keyboards!) these days. Works in browsers, Outlook, OneNote and any other software that listens for forward/back.
  • Two finger swipe - This is really useful, in fact. Up is maximize, down is minimize, left and right are snap to the sides.
  • Three finger swipe - Gives you an "exposé" style super dashboard of all your applications. They call it "instant viewer." More on that in a second.

Here's a look at the software:

The Microsoft Touch Mouse Control Panel

Instant Viewer is what you get with a three finger swipe. It looks like this. The idea is, swipe, click to task switch, and it works great, it just is a little awkward to three finger swipe. Fortunately, 4 fingers or basically the whole hand works too, so a big swipe up is much more comfortable.

An arranged grid of all my open windows

Scrolling

Here's the part I'm having trouble getting past. Sometimes the scrolling just doesn't register. Often it registers on the second or third flick. I can't tell if this is hardware or software, but it's not cool. Maybe it's me. Things that you touch, whether they are phones, touchpads or mice should always work, every time, exactly. I think that one of the reasons that iPhones and capacitive screens are so successful is because of their responsiveness. Early PDAs suffered from that, tap, tap, tap, react cycle. Sometimes unresponsiveness is perceived unconsciously and other times it finds its way into your conscious brain. I was/am far too aware of scrolling gestures not registering far too often.

That said, the other gestures (two and three fingers) work EVERY time. I've really tested it with gentle touch, hard touch, etc and the two finger gestures ALWAYS work. I suspect there is some kind of scrolling driver bug going on here as the hardware seems very reliable. I'd love to hear from someone on the team if there is a known scrolling issue.

The other issue with scrolling is that you have to move your finger about a 1/2 cm before a scroll registers. I think this is to make the mouse not be too jittery. If it scrolled every time you moved at all, I suspect that would be irritating. That said, this should absolutely be a setting I can control.

This might very well be "be design." But when you make something called a "Touch Mouse" in a world where iPads and Windows Phones have pixel-perfect scrolling, the comparisons will be drawn. I want to casually touch and scroll without thinking. Perhaps even a few pixels. The illusion is broken when a touch has to be a half-flick.

The scrolling also has built in inertia. If you flick it fast, it'll scroll fast and then slow down. This is nice because it feels like a tablet device where you can "throw" a browser page and it'll accelerate and decelerate in a natural way. This "inertial scroll" could really be the killer feature if the actual first touch that starts the scroll was more reliable.

Limitations

I assumed that the middle area of the mouse would register as a Middle Click. It doesn't, so this is a 2 button mouse. This is almost a deal breaker for me because I use the middle click all the time when browsing  to open new tabs in the background or to close a tab without switching to it. If you rely on the middle mouse button (not everyone does) then be aware. You may not miss it until it's gone.

Conclusion

This is a multitasker's mouse. If you have a great mouse that you like, should you switch? No. But if you are in the market for a mouse AND you are a person with MANY windows open or a person with multiple monitors I can see how the window management features would be really useful.

However, for me, I'm on the fence if this scrolling issue is a deal breaker or not. If there's an upcoming driver update that really nails the scrolling sensitivity down then I'll recommend this mouse wholeheartedly.  Until then, I think I'll alternate between this one and my trusty and wonderful Microsoft Arc Mouse, which rocks completely.

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

Making awesome Wedding documents using OpenType Ligatures and Stylistic Sets in Microsoft Word 2010 and Gabriola

August 2, '11 Comments [20] Posted in Tools
Sponsored By

ligaturesmallMy brother-in-law is getting married in a few weeks and  since I'm the default IT guy for the family, I'm making CDs with CD-TEXT for the guests amongst other things. One of those other things is doing the Agenda for the day as well as the Menus that appear on the guests' tables. Anyone can bang out a simple document in word and/or pick a wacky font, but I wanted to try something a little different.

Microsoft Word 2010 includes advanced support for OpenType Fonts, not just TrueType fonts. One of the cool things in OpenType and Word is the support for ligatures. From Wikipedia:

"In writing and typography, a ligature occurs where two or more graphemes are joined as a single glyph."

For example, here's lowercase "fi" and lowercase "fl" first without ligatures, and then with:

The characters fi and fl without ligatures, then with

See how the two letters flow together with ligatures? Here's more examples with words like "office," "afflict," and "fine flavor."

More fi and fl words with ligatures applied

Open Ligatures are really visible (and mind-blowing if you've expected fonts to work a certain way for 20 years like me) in complex scripts like Gabriola, one of the many new fonts that comes with Windows 7. The Gabriola font is filled with advanced Open Type features.

The letterforms will change based on the context of the other letters around them. For example, notice how the second m in the word murmur gets out of the way of the r that would otherwise encroach on its space? It's different from the first m.

The word "murmur" in Gabriola

This is just the default behavior, but with Word 2010 you can control it from the Advanced Tab in the Font Menu. For example, I wanted to create a wedding menu so here's the first few lines with the defaults for Gabriola:

image

Now, I'll right click on Menu and select Font, then Advanced. There are a number of Stylistic Sets, depending on which font you're using. I liked the look of Set 6.

The Advanced Font Menu in Word 2010

Next,  for the second and third lines I changed to Stylistic Set 5 with Contextual Alternates to give me more options. Compare the two side by side! So much has changed, some subtle, some not. Notice the captial S's, the lowered C, the additions to the L and the tail on the small n and p?

The menu with the default sets The same menu lines with a nicer stylistic set

 

There's a lot of choices that you can make to get the look you want, and of course, this is just the Gabriola font we've see so far!

Magic Unicorns

The font will even change based on where it appears on a line, for example, the word amazon at the start, middle and end (taken from this article by John Hudson, the font designer):

 

Amazon in three styles

Additionally, this all happens as you type. You have to see it to believe it. I made an animated GIF at the top for you to get the idea. This might seem very weird to English/Latin speakers, but if you have ever typed in Hindi or Arabic you're already used to dynamic ligatures as you type.

Word 2010 also support different modes for numbering, like Old-Style Number Forms. Notice how the numbers' baselines are different on the second line and their sizes have been adjusted?

1234567 first aligned to the top, then along a baseline. Note the smaller "2"

All very cool stuff just sitting there in Word 2010 for you to use. Enjoy!

All very cool stuff just sitting there in Word 2010 for you to use. Enjoy!

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

Unix Fight! - Sed, Grep, Awk, Cut and Pulling Groups out of a PowerShell Regular Expression Capture

August 1, '11 Comments [15] Posted in PowerShell
Sponsored By

There's a wonderful old programmers joke I've told for years:

"You've got a problem, and you've decided to use regular expressions to solve it.

Ok, now you've got two problems..."

A friend of mine was talking on a social network and said something like:

"That decade I spent in the Windows world stunted my growth. one teeny-tiny unix command grabbed certain values from an XML doc for me."

Now, of course, I took this immediately as a personal challenge and rose up in a rit of fealous jage and defended my employer. Nah, not really as I worked at Nike on Unix for a number of years and I get the power of sed and awk and what not. However, he said XML, and well, PowerShell rocks XML.

Because it's a dynamic language, you can refer to XML nodes just like this:

$a = ([xml](new-object net.webclient).downloadstring("http://feeds.feedburner.com/Hanselminutes"))
$a.rss.channel.item

The first line gets the feed and the second line gets all the items.

However, turns out my friend was actually trying to retrieve values within poorly-formed XML fragments within a larger SQL dump file. There's three kinds of XML. Well-formed, valid, and crap. He was sifting through crap for some values. Basically he had this crazy text file with some fragments of XML within it and wanted the values in-between elements: "<FancyPants>He wants this value</FancyPants>."

Something like this:

grep "<FancyPants>.*<.FancyPants>" test.txt | sed -e "s/^.*<FancyPants/<FancyPants/" | cut -f2 -d">"| cut -f1 -d"<" > fancyresults.txt

I'm old, but I'm not an expert in grep and sed so I'm sure there are ways he could have done it more tersely. There always is, right? With regular expressions, sometimes someone just types $@($*@)$(*@)(@*)@*(%@%# and Shakespeare pops out. You never know.

There's also a lot of different ways to do this in PowerShell, but since he used RegExes, who am I to disagree?

First, here's the one line answer.

cat test.txt | foreach-object {$null = $_ -match '<FancyPants>(?<x>.*)<.FancyPants>'; $matches.x}

But I thought I'd also sort them, remove duplicates...

cat test.txt | foreach-object {$null = $_ -match '<FancyPants>(?<x>.*)<.FancyPants>'; $matches.x} | sort | get-unique

But foreach-object can be aliased as % and get-unique can be just "gu" so the final answer is:

cat test.txt | % {$null = $_ -match '<FancyPants>(?<x>.*)<.FancyPants>';$matches.x} | sort | gu

I think we can agree at they are both hard to read. I still love PowerShell.

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

Entity Framework Code First Migrations: Alpha - NuGet Package of the Week #10

July 28, '11 Comments [47] Posted in Data | NuGet | NuGetPOW
Sponsored By

Hot on the heels of my RFC blog post on product versioning, the Entity Framework team has released Entity Framework 4.1 Code First Migrations: August 2011 CTP. Cool. And it's July, too!

Or my preferred product name, "Migrating Magic Unicorns 0.5." It's probably best to think of this as 0.5 Alpha Migrations for EF but that's my guess at a name and not nearly as descriptive.

I showed early daily builds of EF Migrations at a few conferences recently, and encouraged folks to comment on the ADO.NET team blog. Now they've released bits for us to play with. This initial CTP is available via NuGet as the EntityFramework.SqlMigrations package.

EntityFramework.SqlMigrations - 0.5.10727.0

Here's the general idea. Be aware that this is NOT specific to the Web. You can do this in a Console App or whatever. I just like Hello World Web applications.

Short Walkthrough

Make a new ASP.NET MVC app. Go to Manage NuGet Packages from References and search for EntityFramework.SqlMigrations. Note the dependency it has. It'll upgrade your project's EntityFramework package as well.

Entity Framework SQL Migrations In NuGet

Now, make a new class with a simple model:

namespace MvcApplication15.Models
{
public class Person
{
public int PersonId { get; set; }
public string Name { get; set; }
}

public class DemoContext : DbContext
{
public DbSet<Person> People { get; set; }
}
}

Scaffold out a quick Person Controller...

Add Controller

Visit it at /Person and make a few People.

 Index - Windows Internet Explorer (58)

The database that was created looks like this. There's a People table and the First column that is an nvarchar.

image

Now, let's add an Email field. I'll update the Person class to include Email:

public class Person
{
public int ID { get; set; }
public string Name { get; set; }
public string Email { get; set; }
}

Then, I'll compile and from the console inside Visual Studio, I'll do this:

PM> update-database
No pending custom scripts found.
Ensuring database matches current model.
- Performing automatic upgrade of database.
- Starting rebuilding table [dbo].[EdmMetadata]...
- Caution: Changing any part of an object name could break scripts and stored procedures.
- Starting rebuilding table [dbo].[People]...
- Caution: Changing any part of an object name could break scripts and stored procedures.
- Update complete.

I typed update-database, that's all. This is an automatic migration. See how the system compare the .NET type and the database and did what needed to be done:

image

Now, let's rename Email to EmailAddress. If I change the Person...

public class Person
{
public int ID { get; set; }
public string Name { get; set; }
public string EmailAddress { get; set; }
}

And type update-database...

PM> update-database
No pending custom scripts found.
Ensuring database matches current model.
- Performing automatic upgrade of database.
Update-Database : - .Net SqlClient Data Provider: Msg 50000, Level 16, State 127, Line 6 Rows were detected. The schema update is terminating because data loss might occur.
At line:1 char:16
+ Update-Database <<<<
+ CategoryInfo : NotSpecified: (:) [Update-Database], Exception
+ FullyQualifiedErrorId : UnhandledException,System.Data.Entity.Migrations.Commands.MigrateCommand

I'm told that data loss may occur. It can't tell that I want to rename that column or not. It doesn't know what it was before and what it wants to be. Maybe I want to drop Email and add EmailAddress? Who knows. Let me be explicit and give Migrations more context.

PM> Update-Database -Renames:"Person.Email=>Person.EmailAddress"
No pending custom scripts found.
Ensuring database matches current model.
- Performing automatic upgrade of database.
- The following operation was generated from a refactoring log file d5598498-a656-4ccd-1e93-bea562ab6e31
- Rename [dbo].[People].[Email] to EmailAddress
- Caution: Changing any part of an object name could break scripts and stored procedures.
- Update complete.

I'm not sure if I like that Renames: syntax. I'm sure the team would be interested in your opinion. But that works, as I can see in the database.

image

What Changes Can Migrations Detect Automatically?

From the ADO.NET blog:

Here is the full list of changes that migrations can take care of automatically:

  • Adding a property or class
    • Nullable columns will be assigned a value of null for any existing rows of data
    • Non-Nullable columns will be assigned the CLR default for the given data type for any existing rows of data
  • Renaming a property or class
    • See ‘Renaming Properties & Classes’ for the additional steps required here
  • Renaming an underlying column/table without renaming the property/class
    (Using data annotations or the fluent API)
    • Migrations can automatically detect these renames without additional input
  • Removing a property
    • See ‘Automatic Migrations with Data Loss’ section for more information

Moving to Staging/Production/etc

Once dev is correct, when you want to move to production, you would generate a script for your other database by doing a diff between what that DB looks like and what the code looks like.

For example, -script generates a script I can run myself with osql.exe or whatever.

update-database -Script -ConnectionString "SERVER=.\SQLEXPRESS;Database=PersonProd;Trusted_Connection=true;"

Which spits out something like (but more complex than) this:

CREATE TABLE [dbo].[People] (
[ID] INT IDENTITY (1, 1) NOT NULL,
[Name] NVARCHAR (MAX) NULL,
[EmailAddress] NVARCHAR (MAX) NULL,
PRIMARY KEY CLUSTERED ([ID] ASC)
);

Call for Feedback

The EF Team has also this specific call for feedback when it comes to Custom Scripts:

Call for Feedback: From what we are seeing in our own internal use we don’t anticipate that custom scripts will be required very often. However, our efforts are somewhat sheltered from the ‘real world’ so we would love feedback on situations where you need to use custom scripts. In particular we are interested if there are significant scenarios where a code based alternative to writing raw SQL would be beneficial.

Leave your thoughts in my comments, or theirs and I'll make sure the right people get it.

Enjoy!

P.S. Note the EntityFramework.SqlMigrations NuGet package's exposed version number. It's 0.5.10727.0. ;)

Limitations

This is Alpha, so read the Limitations section. They are putting out rough things like this because they know we want to see bits earlier, but the trade off is limitations. Here's a few. Read the list for the rest.

  • There is no provider model, this release only targets SQL Server, including SQL Azure. SQL Compact and other providers are not supported. We are currently working through what the provider model should look like for migrations.
    • Question: What do you think? How important is this?
  • Migrations currently needs to run in full trust. This isn’t an issue when working inside of Visual Studio but if consuming the migrations assembly from custom code you may want to run in medium trust. We are looking at ways to support this in a later release.
  • This release is only available via NuGet. As we support more scenarios such as team build and an ‘outside of Visual Studio’ command line experience we will also support more installation options.
    • Scott: Limitation? That's lovely! ;)
  • Downgrade is currently not supported. When generating custom scripts you will notice that the script is named ‘Up.sql’ but there is no corresponding ‘Down.sql’. We are planning to add downgrade functionality prior to RTM but it is not available in this release.

I'm glad we're getting migrations. It's been a missing LEGO piece for a while.

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

How to connect to a Wireless WIFI Network from the Command line in Windows 7

July 27, '11 Comments [13] Posted in Tools
Sponsored By

For the humorless amongst you who didn't find these Updated for 2011 - McDonald's WiFi Guide with updates for Mac OS X Lion and Windows 7 to be HIGH-LARIOUS, the question was asked, "well, sir, how do you connect to a Wireless WIFI Network from the Command line in Windows 7?"

The answer, is, ahem, thusly:

C:\>netsh wlan connect name=HANSELMAN-N
Connection request was completed successfully.

Cool.

More Details

What happened there? Well, the command line is netsh wlan and the full one is

netsh wlan connect ssid=YOURSSID name=PROFILENAME

What's a profile? It's the only thing required. You can see them with:

C:\>netsh wlan show profile

Profiles on interface Wireless Network Connection:
.
..snip..
User profiles
-------------
    All User Profile     : Clear Spot b0e
    All User Profile     : HANSELMAN-N
    All User Profile     : Quiznos

These are the same ones that you see in the wireless networks dialog...

Manage Wireless Networks

You can set these up and refer to them by name from the command line, or a batch file, etc. Nice to do for the places you are regularly.

If you have multiple wireless cards (What's wrong with you!?) then you have to be more specific:

netsh wlan connect ssid=YOURSSID name=PROFILENAME interface="WIRELESS NETWORK CONNECTION"

And of course, you can

netsh wlan disconnect

And include the interface optionally, for multiple interfaces. Additionally, interesting things can be seen with

netsh wlan dump

This is nice because you can

netsh wlan dump > myconfig.txt

on one machine and then later on another machine

netsh exec myconfig.txt

All this command line love will work in most versions of Windows, actually, not just 7 AFAIK. There's lots of more detail and docs on managing Wireless Profiles on the Web.

Enjoy!

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.