Scott Hanselman

Google+ Plus offers a Sophie's Choice to early adopters of Google Apps via an incomplete Takeout Migration Tool

July 16, '12 Comments [11] Posted in Musings
Sponsored By

You can only move your circles but no content.I'm a long time Google Apps for Your Domain (GAFYD) user. That means that email, calendars, etc is all handled by Google Apps. I've got dozens of other Hanselpeople (relatives and others users) on this system and it works nicely.

When Google+ came out I signed up, but for the first several months the Google+ social network didn't allow Google Apps users to signed. Only users and folks with regular Google Profiles could sign up. So, most of us with Google Apps created temporary Google profiles or throwaway Gmail accounts in order to sign up. We were told that there'd be a migration tool "in a few weeks."

It's been almost exactly a YEAR from the first time this was announced. Last week they announced a migration tool via their "Google Takeout" system.

Fast forward several months and Google has announced the migration tool for Google+ users who want to migrate to another account. The tool is under the Google Takeout system which "Google Takeout allows you to download a copy of your data stored within Google products."

Unfortunately this new migration tool only supports downloading and migrating your Circles, but not your posts, comments or +1s. Compare this moving accounts or URLs under Facebook and Twitter, each of which allows you to change names without losing followers or posts/tweets/notes.

So, this means that while I can move my Google+ account and followers/encirclers over to a new account, all my posts will remain on a vestigial parallel-universe Scott Hanselman who will live forever. I've got a year of posts, great comments and thousands of +1s that are trapped in another social walled garden. I'm forever Scott Hanselman on Google+, except when I'm Scott Hanselman on Google+.

Even worse, my existing Google+/Google Profile account is already associated with all my blog's content on the Google Search Engine. This now makes one wonder if I move my existing authorship metadata to the new account will it work? Blog authors rely on rel="author" as a way to indicate their legitimate content is written by a human.

I've posted my dismay on my Google+ account. Google Developer Evangelist Chris Chabot kindly responded and said:

Posts and comments are not lost, they remain as they were - what is the case is that we don't rewrite history by changing the name above those comments. ie if you commented as "Scott Hanselman" then that name will remain above the comment / posts you did.

I imagine that otherwise it would get pretty confusing if we did try to rewrite history - for instance if someone responded to your comment and said "Hey Scott Hanselman thanks for the info!" but the comment now had "Bob" as a name on it, there's no correlation between your posts, comments and their replies anymore.

So - nothing is lost or removed, there's just the side note that we also don't go back and try to rewrite every post, every reply and +mention that was ever done.

However well-meaning, I think Chris is missing the point of the audience who needs this feature. No one is trying to "rewrite history." We're just trying to move an account from one login to another. Even better if we don't need to change ANY URLs. I don't want to change URLs, move my profile or anything. I just want to login with different credentials.

Here's my response to Chris and Google, reprinted here.

This is a permalink issue not a "rewriting history" issue. I'm Scott Hanselman on a throwaway gmail. That's me here. I want to move to my account where ALL my social media is (until g+). That is your primary use case and primary reason a GAFYD user would move. I want to simple change my login, from my perspective. For you, it appear this is a data migration issue as you're making week-long data moves. We just want to change a profile login.

Secondarily, I've got rel=author working nicely in google today. If I move, I'll need to change my authorship and hope Googlebot notices it in a few weeks. This is a perfect example were a 301 redirect from my old profile to my new one would go a long way.

Does this help clarify my position? I'm absolutely convinced this is the primary way folks would use this migration and I can say that all my peers and folks I've talked to expected a cleaner migration.

I want to move from my throwaway to a paid GAFYD account and it's [not really] acceptable to have hundreds of posts laying around NOT attached to my legit and primary account.

There are also a number of unanswered questions. What if someone finds some G+ posts from the last year and encircles my OLD account? Are they redirected? Likely not. I have hundreds of links pointing to my profile on the web. Why not 301 redirect those? Or, better yet, don't change the URL!

I believe that Google+ really needs a better system for their early adopters like myself. I've got a year worth of content and almost 40k followers on Google+ and I just want to login with my primary Google Apps account - the account I use for everything.

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 FIX: Toyota Entune 2.0.1 Update breaks Internet Tethering over Bluetooth

July 7, '12 Comments [28] Posted in Musings
Sponsored By

Toyota Entune 2.0.1 USB Stick UpdateIn April I blogged about my disappointment with the state of car dashboard technology in "My car ships with crapware." I recently bought a Toyota Prius with "Entune," an in-dash software system that includes things like Pandora and Bing.

Imagine my surprise today when Toyota shipped all its Entune users an update on a USB Stick. This update promises new applications like IHeartRadio, OpenTable and Updates can't be a bad thing, right?

I put the USB key in while the car was parked and running. It prompts me to update and starts a straightforward process. You're told not to be driving around so I just waited a bit and it worked.

Entune: Update software from 1.7.4 to 2.1.0?

Entune: Overall Progress bar

When it was done, I ran the new app and was immediately given the warning: "Unable to connect to the Internet. Ensure the Entune Application is running."

For the last few months I'm used to not having to connect my iPhone physically to my car with a USB Cable. I don't have to run an application to "tether" and give the Toyota internet access. You CAN do this if you want. You plug the phone into the car and run the Entune application and you're all set with internet.

However, in this case my first reaction was "CRAP. Toyota went and BROKE the thing with this new update and now they expect me to run the Entune iOS application when I want to tether. Oh, HELL no." This has been the response and belief of a bunch of folks in the Prius Chat and Toyota Forums as these updates are rolling out.

I thought about this for a while and realize that what's actually happened is that the software has reset to defaults during the upgrade. You can still connect to a wireless hotspot like the Personal Hotspot that many of us have on our iPhones, Androids or Windows Phones. It's just that the language used by the Entune dashboard software isn't intuitive.

From the Setup Menu, go to Bluetooth. You'll see that your phone is likely connected for Phone and Music but not Internet.

Entune Pairing Options 

Don't click Connect for Internet. That will get the error message and frustrate you. Instead, click the small Gear Icon to the far right of the same line.

Entune DUN/PAN Connections

From here, click "DUN/PAN Connections" (intuitive, eh? That means Dial Up Network or Personal Area Network. It should just say "Wireless" but that would make far too much sense.)

Entune Connect to Internet screen

Here, under Provider Username, that's your Wireless Hotspot SSID. For iPhones it will be something like "Name's iPhone." Use a standard ' from the symbols menu on the on-screen keyboard. Spaces matter also. Enter your Personal Hotspot password in the password field.

Confirm, then enter your Entune web account name and password if it's not there.

Enter your Entune account details

At this point you can go back and click Connect for Internet

Entune Establishing Connection Entune My Phone is connected for internet

After you're connected (and this should happen automatically from now on) you should have your new Movies, OpenTable and other applications on the other screens. If you keep your Personal Hotspot running all the time then the Entune system should connect to your phone automatically for things like Pandora or iHeartRadio just because your phone is in the car.

Entune update 2.0.1 includes OpenTable, MovieTickets, IHeartRadio and more Entune showing movies near me

I hope this helps alleviate some potential frustration to Toyota Entune users.

If you liked this post, read my screed essay on my the state of in-dash stock Car Software in 2012 and follow me on Twitter.

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

FormsAuthentication on ASP.NET sites with the Google Chrome Browser on iOS

July 5, '12 Comments [19] Posted in ASP.NET | ASP.NET MVC | Bugs
Sponsored By

A few people have said that they have noticed problems the new iPhone/iPad Google Chrome apps as well as trouble with applications that use hosted Safari inside of UIWebView (which is what Chrome is) or apps that host a website in PhoneGap. If you're using FormsAuthentication (in WebForms or MVC, doesn't matter) then Google Chrome for iOS might switch FormsAuth to Cookieless mode, which sucks for everyone.

This has been fixed in .NET 4.5 and you won't see this problem if you have .NET 4.5 installed, even if you're running a .NET 4 application. For example, is running .NET 4 applications under .NET 4.5 RC and wouldn't see this. If you install 4.5 (now or later) ASP.NET will always assume clients support cookies.

If you want to tell ASP.NET 4.0 or earlier that EVERY browser supports cookies for FormsAuth you can do ONE of these things:

1. Change Generic.Browser for your app (or machine)

Make a file called generic.browser in a folder called App_Browsers and put this in it:


<browser refID="GenericDownlevel">
<capability name="cookies" value="true" />

2. Force Cookieless=UseCookies in your web.config

Add cookieless="UseCookies" for your forms element in web.config.

<authentication mode="Forms" >
<forms loginUrl="~/Account/LogOn" timeout="2880" cookieless="UseCookies" />

Hope this helps.

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

Introducing Lync 2010 Super Simple Auto Answer Video Kiosk with Full Screen

July 3, '12 Comments [25] Posted in Lync | Open Source | Remote Work | WPF
Sponsored By

Logitech BCC950 Conference CamIf you check out my blog archives or check out the Remote Work category you'll see that I'm always tinkering with my remote work situation. I'm the most interested in high quality and pervasive video. I'm so interested in this that for a while I was running a 10 hour a day persistent "Portal" between Portland and Seattle. I still highly recommend this for co-located teams that have the bandwidth to burn. It's great to be able to turn one's head and see their teammate right there by their side - even though they are 200 miles away.

I recently picked up a pair of Logitech BCC950 Conference Cams as a possible replacement for the very expensive "RoundTables" that some rooms at Microsoft have. The RoundTables are lovely but they are becoming scarce at the office and the Logitech is literally one-tenth the price. I'll blog a full and detailed review of the BCC950 later on this week but for now my biggest issue was that the Video Kiosk software I was using was starting to show its age. It's flaky and unreliable and build on the Office Communicator 2007 interfaces while I've been on Lync 2010 for a while.

Additionally, the researchers that wrote the software are always adding features I don't need for hardware I don't have. My remote buddy Damian Edwards and I decided we needed to make a software break.


We want these simple features to start:

  • Auto-answer of video calls - possibly with some whitelist for security
  • Auto-fullscreen of video calls on the remote machine - the single purpose kiosk in my Seattle office
  • Presence information and a simple UI for making calls - by simple I mean "my boss's boss" simple
  • Remote control of Pan Tilt Zoom (PTZ) features on the same - ideally using the standard "inbox UVC" drivers and no 3rd party software

Tonight I sat down and did the first three of these and put it on GitHub. I call it - wait for it - the Lync 2012 Super Simple Auto Answer Video Kiosk with Full Screen since the name "SmartGlass" was already taken. ;)

I searched ALL over to find out if there was SOME sample code out there that would just auto-answer a call from Lync and start video. I could find dozens of samples that made calls, that started chats, but none that would answer and auto-start video. You'd think this would be the FIRST thing that folks would want to do. I can only assume it's not a setting for security reasons.

Auto-Answering Lync Calls with Video

Now, it's late and there's likely problems so pull requests are welcome if I have done something stupid. Lync is complex and while you'd think there'd be an "AutoAnswer = true" it's actually a more complex API than that. I started from this MSDN article on "Responding to a Lync Conversation Invitation."

var lync = LyncClient.GetClient();
var conversationmgr = lync.ConversationManager;
conversationmgr.ConversationAdded += (_, cmea) =>
bool IncomingAV = false;
StringBuilder sb = new StringBuilder();

//Is this an audio/video invitation?
if (cmea.Conversation.Modalities[ModalityTypes.AudioVideo].State == ModalityState.Notified)
if (lync.DeviceManager.ActiveAudioDevice != null)
sb.Append("Incoming call from ");
IncomingAV = true;
if (cmea.Conversation.Modalities[ModalityTypes.InstantMessage].State == ModalityState.Connected)
sb.Append("Incoming IM from ");
sb.Append(String.Join(", ", cmea.Conversation.Participants.Select(i => i.Contact.Uri)));

if (IncomingAV == true && Properties.Settings.Default.autoAnswer == true) //I added that setting later on

You watch for a Conversation to start and see if it's an Audio/Video on. If it is, then we call our InitiateAVStream method. You can't do all this stuff synchronously as Lync is full of async native COM APIs and events that you need to respond to. Here we accept the video which lets us see who called us but doesn't yet start OUR video. Remember "we" are the dumb Kiosk who is receiving a call from me.

private static void InitiateAVStream(Conversation pConversation)
if (pConversation.State == ConversationState.Terminated) { return; }

if (pConversation.Modalities[ModalityTypes.AudioVideo].CanInvoke(ModalityAction.Connect))
var video = (AVModality)pConversation.Modalities[ModalityTypes.AudioVideo];

//Get ready to be connected, then WE can start OUR video
video.ModalityStateChanged += _AVModality_ModalityStateChanged;

See how they are chaining handlers? I think this code could be made cleaner with a series of nested closures like above in the ConversationAdded example, but then again, maybe not. It'll get four deep before we're done.

Now the call is being connected but perhaps not yet. When its state changes the VideoChannel has opened up and we watch for the video to be received.

static void _AVModality_ModalityStateChanged(object sender, ModalityStateChangedEventArgs e)
VideoChannel vc = null;
switch (e.NewState)
//we can't start video until it's connected
case ModalityState.Connected:
if (vc == null)
vc = ((AVModality)sender).VideoChannel;
vc.StateChanged += new EventHandler<ChannelStateChangedEventArgs>(_VideoChannel_StateChanged);

As the video starts up, I can see if the system is ready for the Kiosk to start its video. If so, we call BeginStart (and the SDK says we HAVE to call EndStart, so watch out!).

static void _VideoChannel_StateChanged(object sender, ChannelStateChangedEventArgs e)
VideoChannel vc = (VideoChannel)sender;

//Are we receiving? Let's try to send!
if (e.NewState == ChannelState.Receive)
if (vc.CanInvoke(ChannelAction.Start))
vc.BeginStart(videoCallBack, vc);
else { Debug.WriteLine("CanInvoke said NO!"); }

//Go looking around for the IM Window (there had better just be the one we just started)
// and force it to the foreground
IntPtr childHandle = UnsafeNativeMethods.FindWindowEx(IntPtr.Zero, IntPtr.Zero, "IMWindowClass", null);

//Try to get the video to go full screen by pressing F5

private static void videoCallBack(IAsyncResult ar)

I'm pretty frustrated as while this is SUPER powerful, it's also SUPER complex for basic scenarios in my opinion. I think there's an opportunity here for a small layer on top of Lync that handles the 80% cases like the small Lync Abstraction  layer introduced in this "ScreenPop" example application.

The Goodness - The WPF Controls

At this point in the code I had everything working in a Console Application. You can go cherry-pick that commit if you want just a Console app that Auto-Answers video calls from Lync.

Even though I NEED to stop as I've got it working in a Console and I should be sleeping I noticed this in Visual Studio and it was too epic to not try.

File | New Lync WPF Application

You know how it is. It's 2am, you're done with your goals. OF COURSE you're going to try to convert your Console App to a GUI before bed. Of course.

Turns out there's a MESS of visual controls that you can put into existing applications to make them Lync-ified in literally minutes.

All the Lync Controls like SendEmailButton and StartVideoCallButton

Ok, awesome. I took the basic UI and added a checkbox for "Auto Answer."

Perhaps the lamest UI ever. It's a head, a button and a checkbox

(ASIDE: You DO realize that the outline of the "unknown face" in Lync there looks an AWFUL lot like Bill Gates' legendary 1977 mug shot, right? I just noticed that.)

Lync 2010's default Person matches the outline of Bill Gates' 1977 Mug Shot

Anyway, then I made two settings, one for my "sip" address (that's in my app.config file as "sipEmailAddress" and one boolean for AutoAnswer. The complete XAML is just:

<Window x:Class="SuperSimpleLyncKiosk.Main"
Title="The World's Simplest Lync Kiosk (with Auto Answer, too!)" Height="Auto" Width="Auto">
<Grid RenderTransformOrigin="0.5,0.5">
<ScaleTransform ScaleX="3" ScaleY="3"/>

<StackPanel Orientation="Vertical" HorizontalAlignment="Center" VerticalAlignment="Center">
<StackPanel Orientation="Horizontal" HorizontalAlignment="Center" VerticalAlignment="Center">
<!-- Show the presence indicator. Hover over the icon to see the contact card.
Set Source to a valid SIP URI in your organization. -->
Source="{Binding Source={x:Static properties:Settings.Default}, Path=sipEmailAddress, Mode=OneWay}"
<!-- Use the DisplayName property from PresenceIndicator to show the user's name -->
Text="{Binding DisplayName, ElementName=Presence}"
<controls:StartVideoCallButton Source="{Binding Source={x:Static properties:Settings.Default}, Path=sipEmailAddress, Mode=OneWay}" x:Name="startVideoCall" />
<controls:ShareDesktopButton Source="{Binding Source={x:Static properties:Settings.Default}, Path=sipEmailAddress, Mode=OneWay}"/>
<CheckBox IsChecked="{Binding Source={x:Static properties:Settings.Default}, Path=autoAnswer, Mode=TwoWay}" Content="Auto Answer Video Calls"/>


I also added a 3x transform to scale ALL these default controls so they'd look good on the 42" TV that is sitting in my office. Because they are native WPF vector controls they just scale perfectly to high resolutions without raster jaggies.

Then I added a call to make the app Maximized by default:

this.WindowState = System.Windows.WindowState.Maximized;

And it looks like this when running:

The World's Simplest Lync Kiosk (with Auto Answer, too!)

And when I call it automatically answers. Looks like everyone's asleep and they've turned the lights out!

My Remote office in Seattle

Ah, I but I wish it was full screen so the people in Redmond don't need to do anything or touch anything...

The Badness

I can auto-answer calls but sometimes the window isn't in front and once it gets in front there's no programmatic way to tell Lync to go Fullscreen with video.

Two bad problems there. Both solved by breaking all the rules. I get the Window Class with a big assumption that the Kiosk only as one chat window open and then I "push" F5 which is the Lync hotkey for fullscreen video.

//Go looking around for the IM Window (there had better just be the one we just started)
// and force it to the foreground
IntPtr childHandle = UnsafeNativeMethods.FindWindowEx(IntPtr.Zero, IntPtr.Zero, "IMWindowClass", null);
//Try to get the video to go full screen by pressing F5

Those last two, of course, are calls directly into Win32 from .NET:

public static class UnsafeNativeMethods
public static extern IntPtr FindWindowEx(IntPtr parentHandle, IntPtr childAfter, string className, string windowTitle);

public static extern bool SetForegroundWindow(IntPtr hWnd);

But, it works! It's scandalous that this isn't built into the Lync SDK. Developers who are fans of Lync or who work on it all the time will say that my attempt at a "poor man's Kiosk" is silly and that I really want to use "UI Suppression in Lync" and just make an app that hosts Lync rather than automates Lync. They are likely right. However, frankly, it looked super-hard and I was tired. So, ya. If anyone wants to work on the Kiosk with me to make it simple answer and start video and do it all without showing Lync, that'd be awesome.


I also want to make a special nod to the InputSimulator library. It's amazing and it just works. It's WAY WAY better than SendKeys which you should stop using NOW.

The Windows Input Simulator provides a simple .NET (C#) interface to simulate Keyboard or Mouse input using the Win32 SendInput method. All of the Interop is done for you and there's a simple programming model for sending multiple keystrokes.


Lync Developer Resources

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

If malware authors ever learn how to spell we're all screwed - the coming HTML5 malware apocalypse

June 29, '12 Comments [84] Posted in HTML5 | Musings
Sponsored By

Forgive the lousy screenshot and transparency in the title bar, but I just got this fake virus popup while searching for an image. I admit for a single moment my heart jumped.

A very scary fake virus popup

Then I thought after a few seconds as a techie (and note that all these observations just happened all at once in my head in no order):

  • The dialog is perfectly centered in the browser. I'm not sure why this was my #1 tipoff, but for me, it was the first thing I noticed.
  • This "popup" was as a result of a browser navigation. If it were legit I'd expect it to happen a little more asynchronously.
  • The word "migth" misspelling in the popup.
  • The fonts in the column headers are anti-aliased with one technique and the rest of the text doesn't  use ClearType while my machine does.
  • Poorly phrased English: "You need to clean your computer immediately to prevent the system crash."
  • There's no option other than "Clean computer." No ignore, repair, quarantine.
  • The word "computer" at the end of the first line goes too far to the right of the grid's right margin. It should have wrapped to the next line. Yes, I'm a UI nerd.
  • Their Aero theme color is GRAY and mine is BLUE.
  • Ctrl-Scroll ZOOMs the image. ;)
  • The URL is obvious nonsense.
  • Adware.Win32.Fraud? Seriously?

It's scary just to look at floating in your webpage there isn't it?

A scary fake virus popup

How is my Mom supposed to defend against this? Windows OR Mac (or tablets) the bad guys are out there, and one day they will finally learn English and put a little work and attention to detail into these things.

One day these things won't be "selectable" to prove to us that they are HTML:

I selected the virus to make it invert its colors to prove it's fake

As we enable HTML5 with local storage, geolocation, possibly native code and  and other features the bad guys will start doing the same with their malware. If you can write Doom in HTML5 there's nothing (except the skill and the will) to keep you from writing adware/scareware/malware in JavaScript. Not just the standard CSRF/XSS type JS - which is bad, I know, I used to be in banking - but sophisticated duplicates of trusted software accurately recreated entirely in HTML5/CSS3 and today's modern JS.

Google Offline Mail and extensions run in the background in my browser now, what's to say some future malware won't? Should we digitally sign HTML5 apps? Do more Extended Validation SSL Certificates? How do you defend against this?

What do you think, Dear Reader?

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.