Scott Hanselman

Skyping the Wife: Foolproof Video Conferencing with Your Family While on the Road

September 05, 2008 Comment on this post [9] Posted in Musings | Remote Work | Speaking | Tools
Sponsored By

I really like presenting and traveling around and meeting people, but I just hate being away from my kids. It's visceral. It's physically painful. I bring them whenever I can, but during this last trip to New Zealand and Australia it wasn't possible and I was away for 8 days. Almost killed me.

Since I work from home, when I need to talk to folks in Redmond I use Office Communicator, sometimes ooVoo if we need to talk to multiple people, or sometimes a Roundtable. Roundtables are cool because you get a full 360 degree view of the room.

panaroma

Using Video Conferencing has become totally fundamental to my work life, and when I travel (a few days a month) it's utterly indispensable.

I've traveled a few times and tried to call the wife via Video Conferencing and had an utter failure. We've had trouble with her figuring out how to answer the call, how to run the app, login, deal with odd dialogs, updates, and all the general gremlins that can potentially take what is supposed to be a great experience and turn it into long-distance tech-support. Nothing lowers the WAF (Wife Acceptance Factor) like telling your wife to crawl under the computer desk and check the microphone cables.

I watched literally three different technical speakers try to get video conferencing work while in the speaker room on this last trip. One succeeded. All the others got themselves into situations where the spouse could IM, but not hear, or hear but not see, or whatever. "Can you hear me now?"

Foolproof Familial Video Conferencing

After a half-dozen failures I finally got smart. Here's what I ended up doing to make it easy. This has worked for my wife and I nine out of ten times (once there were connectivity problems at the hotel) and it's worked from Europe to the South Pacific.

Step 1 - Hardware

Get a good camera. I recommend the LifeCam VX- or NX- series. The VX-7000 is nice and simple for home. It has a good microphone built-in and the camera will do 640x480 at 20+fps easily.I use the NX-6000 for my laptop.

Step 2 - Software

Download Skype (or ooVoo or Live Messenger). You'll need two accounts, one for you (the techie) and one for your spouse. Personally I recommend a dedicated account for trips for your spouse. Something with a username like "ScottIsTraveling."

Step 3 - Preparation before you travel

Before you travel, declare one machine in the house that video conferencing machine. Log the spouse into the special travel account. Add your account as a Contact to the special travel account. That means that the special account will have only one friend - you. This is important.

Next, go into Options (I use Skype as an example, but hopefully other apps have similar options) and into Privacy. Set the options such that these are true:

"Only allow people who are in my contact list to contact me"

and

"Automatically answer calls from people who are in my Contact List"

and finally, and most importantly:

"Automatically Send Video"

These are the magic three options. With this setup, your spouse will have one contact, you, and when you call it will be auto-answered and the video will start.

Then I leave the account logged in and I check the video camera and microphone before I go.

img016

This allows me to call the house and have video start without the wife even touching the machine. Daddy can show up on the computer and say "Hi! It's me, is anyone there!?" My son can run it and start talking to me, even without Mommy's help.

One last tip, try to use whatever the highest resolution your camera, bandwidth, and software supports. I was able to get near-DVD quality (640x480) this last trip and was thrilled with the quality. Video conferencing has come a long way since my first black-and-white Logitech QuickCam.

Next time you're traveling I encourage you to try this out and see how it goes. This trip I was able to have chats with the family every night with no glitches or troubles. It almost made the time away tolerable.

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 bluesky subscribe
About   Newsletter
Hosting By
Hosted on Linux using .NET in an Azure App Service

Windows Live Mesh, Silverlight and the CoreCLR

September 05, 2008 Comment on this post [8] Posted in Silverlight | Windows Client | WPF
Sponsored By

Picture the files in the Live Mesh folder Disclaimer: Everything in this post is pure conjecture by me, done by simply poking around my system and talking to myself. I don't work for the Live Mesh team, nor do I know anyone on the team. Anyone could have written this.

I was talking to Harry recently and we went poking around in the folder that the Windows Live Mesh client is in. On my machine it's in "C:\Users\scottha\AppData\Local\Microsoft\Live Mesh\"

There's a lot of interesting stuff in there. There's a version of System.Core (LINQ) as well as System.ServiceModel (WCF), but most interestingly there's coreclr.dll. Where have I seen that before? I've seen it in C:\Program Files (x86)\Microsoft Silverlight, of course. It's the Silverlight CLR that you might have on your own system. Remember this isn't the complete CLR, but rather a pared-down more portable version. This makes sense since Mesh plans to do a Mac client and Silverlight runs on Intel Macs.

It's a different version, though. On my machine I've got Silverlight 2 Beta 2 and its digital signature for coreclr.dll is recent while the Mesh coreclr.dll is version 1.1 and from February. That was back before the Mix '08 conference Silverlight 1.1 was re-christened "2.0."

You can see more of the MOE (Mesh Operating Environment) external dependences in the "Moe.exe.managed_manifest" XML file. It appears they've got their own private build of the a tiny CLR and just the libraries they need to make it work.

Even though Silverlight is a Rich Internet Application (RIA) technology and meant for use as a browser plugin, this is the third time I've found Silverlight living outside the browser (although still doing "connected" work).

The first time was when Jamie Cansdale, the author of TestDriven.NET prototyped running Unit Tests with the CoreCLR/Silverlight.

The second time, was the Mac Times Reader. You might have seen the NYTimes Reader, and the News Reader SDK. The Times Reader is a XAML-based WPF application. However, there is a scaled-down version of the Times Reader that was released on the Mac and it uses Silverlight to render XAML. In that application Silverlight is being hosted inside of a Cocoa "chrome" shell application using some MacGyver magic. It appears a lot of custom work was done to render the Reader-specific news feed (it's more than just RSS) in a flow layout.

All of this stuff Mesh is doing struck Harry and I as very interesting. It'd be cool if ISVs could target the CoreCLR (Silverlight) for some scenarios and have their own xcopy deployed private-version of .NET like Mesh. It appears Mesh used this custom version of the CLR so it would have portability between platforms.

It's always interesting to see how other groups at Microsoft do stuff. Just like us (the community), other divisions that use things the Developer Division produces, although since they are on the inside they get to do some magical things since they can just walk down the hall. (I work in my home office, so I'm pretty much limited to Office Communicator or I have to ask Phil to walk down the hall for me.)

I'm going to ask around and find out the full story behind how the Mesh (Beta) Windows Client uses .NET, and maybe I can get one of the more technical folks to do a podcast.

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 bluesky subscribe
About   Newsletter
Hosting By
Hosted on Linux using .NET in an Azure App Service

The Case of the Failing Disk Drive or Windows Home Server Saved My Marriage

August 27, 2008 Comment on this post [37] Posted in Home Server | Musings | Tools
Sponsored By

Photo of my Home Server on a shelf in my office I bought an HP MediaSmart Windows Home Server last Christmas, and haven't thought much about it since. It sits on the shelf and is pretty.

Actually, that's not totally true, I did upgrade it to Power Pack 1 recently, but that was a 10 minute thing. For the most part, it's a conversation piece on a shelf in my new(ish) home office.

Now, the story. I sold my wife's laptop to Shawn recently as she wasn't laptop-ing much and wanted the speed of a desktop. I gave her my old Developer Rig with 32-bit Vista SP1 and she's cool with her browsing and her wifely blog and what-not.

A few weeks later she comes to me and we have a conversation that went (something like):

"This computer sucks. It's freaking out and now it says something about being smart. Let me tell you, mister, it's not smart."

What do you mean smart? Oh, wait, do you mean S.M.A.R.T.?

Smart, dumb, whatever, it's not booting. Let's get a Dell! Are my files backed-up?

Photo of the front of my computer case with the Floppy Drive pushed in oddly.Ok, wait a second. I go upstairs and I see this. I'm like, that's weird. The floppy drive is pushed in. That's odd. Whatever. I blow it off.

I go into my stash and pull out a hard drive. It's a 160gig that will replace the 80gig in her machine.

I open it up (it's a tool-less case) and swap out the drive. I can't find my Windows Home Server Restore CD so on my other machine I go to \\server\software\Home PC Restore CD and there's a readme.txt file that says:

"If there is a CD image file (RestoreCD.iso) in this folder, it is outdated.

To create a Home Computer Restore CD, download the ISO image file (RestoreCD.iso) from the Microsoft Web site at http://go.microsoft.com/fwlink/?LinkID=104683."

Cool, looks like the Power Pack 1 needs a new Restore CD. I download it and use the best image burning software out there, ImgBurn and I'm on my way.

I boot off the CD and get a nice Windows-looking interface and a wizard. It finds my Home Server, prompts me for a password and somehow automatically (probably via IP or Mac Address or some magic computer hash?) figures out which computer I'm trying to Restore. It automatically selects WifelyPC out of the list of a half-dozen machines in the house. I hit Finish and it takes like 11 minutes (creepy fast) to restore.

Boom. It's back. Total time elapsed, with drive swap, ISO download and burn was like 35 minutes. If I'd downloaded the ISO back when I got PP1 like I should have, it would have been a 15 minute operation. It was like using Norton Ghost in the old days, except without the DOS driver disk, the network goo, and general hassle. Couldn't have been easier except if there were no buttons to push at all.

Problem solved, and I'm the hero. The next two days involve me fitting this into casual conversation:

"Did I mention I brought your computer back from the abyss? Seriously. It's like Tivo. I just put it back the way it was at 2am on Tues. Isn't that cool? Love me!"

Something like that. I think the Love Me part was implied.

Fast forward to today.

"I'm sick of this freaking computer. It's clanking."

Uh oh. Clanking is rarely good. Actually, never good.

"I want a Dell. Uncle Ronnie got a Dell, where's my Dell?"

I return to my wife's office and see this after opening the side of the case:

Photo of the open side of my Computer Case with the Floppy casing falling on my hard drive

Not clear? Let me add some John Madden commentary:

Photo of the open side of my Computer Case with the Floppy casing falling on my hard drive with arrows and the word SMASH in red.

Picture of the 2 yr oldSame thing as before, except this time my brain is working. It seems that the 2 yr old, pictured here, the face of pure evil, pushed on the front of the floppy drive. (Yes, I have a floppy. No, I don't know why. It's vestigial, OK?)

The floppy drive is set in a larger "shell casing" that should have been screwed and secured into the larger case. Was it? Of course not. I'm a putz.

Of course I totally blamed the child. He can take it.*

Shoot, so that's two dead hard drives. But! The Home Server had taken it's nightly snapshot, again, after I'd restored it the first time. This included any changes The Wife had made the the machine in the last two days.

In fact, since I've upgraded my original 1TB Home Server with two extra drives, I've got backups going back into July. 

Home Server dialog showing a list of backups for my wife's computer

The backup management is set by default to keep 3 months of monthly backups, 3 weeks of weekly and 3 days of daily. That's pretty good coverage.

If you look at the very first picture, you'll see an external Western Digital MyBook that backs up the Home Server itself. I'm also a Mozy user, but it doesn't support Home Server, so I'm considering using KeepVault's specialized Home Server Product for Cloud Backup.

It's good to have a Backup Strategy. What's yours?

 Network Diagram of the Hanselman Backup Strategy

I'm happy with the Home Server and definitely recommend it.

Related Posts

* Don't worry, my wife saw right through it and now I'm in trouble for trying to pin this rap on the cherub. Look at that face!

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 bluesky subscribe
About   Newsletter
Hosting By
Hosted on Linux using .NET in an Azure App Service

SmallestDotNet: On the Size of the .NET Framework

August 24, 2008 Comment on this post [34] Posted in ASP.NET | Learning .NET | Musings | Windows Client | WPF
Sponsored By

Badge that says There's been some confusion about the size of the .NET Framework. The .NET Framework is not really a 200+ meg download. 

Which installer do I use?

Here's the whole thing in a nutshell for Developers, ISVs, and Administrators.

  • Offline Installer - One single file that can be run offline and can install the .NET Framework any system it's run on. It's complete, all platforms, installable offline.
  • Online Installer - A 2.7 meg setup program that will detect what just the files you need, then go download between 10 and 60 megs.
    • NOTE: If you're IT and inside an office, you'll want to decide if you want everyone in the office downloading .NET separately, or if you just want download it once, and have them to run it off a network share. Check out the Deployment Guide for Administrators for ways to push it out via AD or SMS.

So how big is it the .NET Framework download, really?

It depends on what you've already got installed. Here's some examples of my results using an XP SP2 machine. 

Version of
Framework installed
Download size
to get to 3.5SP1
Time to Download
(512 kbps)
None ~56 MB 15 min
2.0 ~50 MB 15 min
2.0SP1 ~33 MB 9 min
3.0SP1 ~10 MB 3 min

From a download perspective, those numbers aren't too bad. It's not nearly as bad as its been made out to be. I'm not saying this as a Microsoft apologist or paid Microsoft shill, I'm showing the numbers that I have seen in my testing. This is my opinion based on my testing.

However, as a free-micro-ISV myself, and the distributor of a .NET Client Application, namely BabySmash!, I'd like the download size to me as SMALL as possible. I've personally received the same emails many of you have - "I'd love to download your software but I don't want to download a 200 meg .NET Framework." I'd like to help change that perception to get more people to run BabySmash! and the best way to change negative perceptions is to improve reality. ;)

Online/Download Experience

The best way to get a user with reasonable Internet connectivity up on the 3.5 SP1 .NET Framework is with the 2.7 Meg "bootstrapper."  This will detect what they need and only download what they need. The worst-case scenario for a x86 machine is around 60 megs, as seen in the table above.

What's the "Client Profile?"

The Client Profile is an even smaller install option for .NET 3.5 SP1 on XP. It's small 277k bootstrapper. When it's run on a Windows XP SP2 machines with no .NET Framework installed, it will download a 28 meg payload and give you a client-specific subset of .NET 3.5.  If the Client Profile bootstrapper is run on a machine with any version of .NET on it, it'll act the same as the 3.5 SP1 web installer and detect what it needs to download, then go get it.  There's more details in the Client Profile Deployment Guide.

Ultimately, this will be the best and fastest possible way to get the .NET Framework, as it's smart on each platform. I'm going to move BabySmash to the Client Profile to get new XP customers up on .NET more than twice as fast with less than half the total download size.

The Client Profile Offline Installer (Preview) that Chris noticed was big was such because it is another example of an offline installer. It is the Client Profile Setup + the Full Installer mentioned before. Again, this particular download is totally for offline only scenarios. Unless you need a completely offline scenario, neither you nor your users need download it. The Client Profile Bootstrapper and its associated customization tools will be released soon.

Offline Experience

Now, from an offline perspective, if you're on a CD/DVD if you want to make sure that any machine you come upon will be able to get up to .NET Framework 3.5, you'll want the super offline installer. However, you can and should modify that offline installer to make it as smaller as you need. If you only support x86, then only ship those bits. Aaron Stebner points out that you can :

Extract the contents of the full install package and selectively remove payload that is not needed or supported by the scenarios that the setup that requires it supports.  I describe this option in a bit more detail in this blog post.  At a high level, this option involves identifying supported OS's and processor architectures and then selectively removing prerequisite payload from the .NET Framework 3.5 install location for platforms that the setup carrying the .NET Framework 3.5 does not plan to support.

He's basically saying for administrators and IT folks should customize the .NET Framework installer to yank stuff you don't need. This kind of customization and more is going to be easier later in September when the .NET Client Profile Configurator is released, so watch for that.

Why is that one installer so big?

That giant .NET download is for one thing - It's meant for developers or administrators who might want to redistribute a a setup that contains not just the whole of the .NET Framework, but for all possible platforms.  It has installers for x86, x64 and ia64. As mentioned above, you can customize it and make it smaller, shipping just what you need, based on your product's needs.

I've brought the total size up to bosses who care, as have many other smarter people and it's and making the installers even smaller, via separation, compression and other ideas are being actively looked at.

Windows Update

Over the next several months, machines with .NET 2.0 and up will start updating to the latest .NET 3.5SP1 using Windows Update. For ISVS (like me) this'll start to level versioning out so I'll know more about what's on the average user's machine. For example: If a machine already has .NET 3.5 on it, BabySmash is a small 1 meg download, which makes BabySmash, and me, look good.

Introducing SmallestDotNet.Com

imageLast night I made this website, SmallestDotNet.com to help out. It'll sniff your browser's UserAgent and tell you want version of .NET you have, how big the download would be to get you to .NET 3.5 and what .NET redistributable is best for you in order to minimize your download. As some newer online deployment options are released I'll update the site's sniffing to make sure that sizes and choices are is optimal.

SmallestDotNet.com also has some Javascript that you can add to your product's sites as an include, that can help let users know how big the download for .NET will be ahead of time, an lead users to the right downloads, like this:

<script src="http://www.smallestdotnet.com/smallestdotnet/javascript.ashx" type="text/javascript"></script>

It's not perfect, as it has only the UserAgent to base it's guess on. However, I've found it useful on BabySmash! and I hope you find it useful too.

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 bluesky subscribe
About   Newsletter
Hosting By
Hosted on Linux using .NET in an Azure App Service

ASP.NET Futures - Generating Dynamic Images with HttpHandlers gets Easier

August 22, 2008 Comment on this post [24] Posted in ASP.NET | ASP.NET Dynamic Data | ASP.NET MVC
Sponsored By

There's a treasure trove of interesting stuff over at http://www.codeplex.com/aspnet. It's a bunch of potential future stuff that the ASP.NET team is working on. That's where you can get builds of ASP.NET MVC, Dynamic Data Futures, and new AJAX stuff.

Two days ago a new CodePlex release snuck up on the site. It's a potential new feature, so it could go nowhere, or we could make T-shirts and sing its praises. Could go either way. No promises.

Justin Beck, an ASP.NET intern, prototyped and design it, then Marcin Dobosz, an ASP.NET Developer tidied it up nicely. Right now it's called ASP.NET Generated Image and you can get a release today.

Why should you care?

I've done a lot of HttpHandlers that generate images. It's usually pretty tedious. When I was working banking, I wrote an example HttpHandler that would take two Check Images (back and front) and composite them into a single image on the server side, then serving up the composite. Usually you're messing around in with MemoryStreams and Images, and then you serialize the result out to the Response.OutputStream, making sure the MIME Types are set appropriately. If you're really clever, you'll remember to do some client-side and appropriate caching, but I rarely see that in the wild.

So what have Justin and Marcin done here?

First, they've created a control with a little design mode "chrome" that makes getting started easier. The control is actually an extension of <asp:image/> that creates an HttpHandler and wires up the the src= attribute to the handler. If that were all, it'd be cute. However, second, and most importantly, they've created a base class that can do caching, transformations and parameter passing for you. It's really nicely factored, IMHO.

Here's a simple example. Put one of these GeneratedImage Controls on the page, and click on it...

Screenshot of the Context Menu of the GeneratedImage Control 

Next, click "Create Image Handler." You'll get this in the markup, and a new file in the Project:

public class ImageHandler1 : ImageHandler {

public ImageHandler1() {
// Set caching settings and add image transformations here
// EnableServerCache = true;
}

public override ImageInfo GenerateImage(NameValueCollection parameters) {
// Add image generation logic here and return an instance of ImageInfo
throw new NotImplementedException();
}
}

All I need to do now is override GenerateImage. Any parameters to the control will be in the NameValueCollection. I just need to return a new ImageInfo, and the constructor for ImageInfo can take either an Image, a byte[] or an HttpStatusCode. Clever.

Here, I'll add some text:

<cc1:GeneratedImage ID="GeneratedImage1"
runat="server" ImageHandlerUrl="~/TextImageHandler.ashx" >
<Parameters>
<cc1:ImageParameter Name="Hello" Value="text in an image" />
</Parameters>
</cc1:GeneratedImage>

As I said, that parameter is passed in, and it come from <% %> code or DataBinding or whatever. It doesn't care. Now, I'll draw on an image:

public class TextImageHandler : ImageHandler {

public TextImageHandler() {
this.ContentType = System.Drawing.Imaging.ImageFormat.Png;
}

public override ImageInfo GenerateImage(NameValueCollection parameters) {
// Add image generation logic here and return an instance of ImageInfo
Bitmap bit = new Bitmap(300, 60);
Graphics gra = Graphics.FromImage(bit);
gra.Clear(Color.AliceBlue);
gra.DrawString(parameters["Hello"], new Font(FontFamily.GenericSansSerif, 16), Brushes.Black, 0, 0);
return new ImageInfo(bit);
}
}

Which results in...

Picture of a dynamic generated image with text inside it 

Slick. What else can I do easily? Let's right-click on the ImageHandler base class and see what it looks like:

namespace Microsoft.Web
{
public abstract class ImageHandler : IHttpHandler
{
protected ImageHandler();

public TimeSpan ClientCacheExpiration { get; set; }
public ImageFormat ContentType { get; set; }
public bool EnableClientCache { get; set; }
public bool EnableServerCache { get; set; }
protected List<ImageTransform> ImageTransforms { get; }
public virtual bool IsReusable { get; }

public abstract ImageInfo GenerateImage(NameValueCollection parameters);
public void ProcessRequest(HttpContext context);
}
}

ImageTransforms? Hm...you can also setup a collection of ImageTransform objects into a little mini-image processing pipeline to do whatever you like.

Here we add a copyright watermark dynamically. The Transform is added in the constructor in this example.

public class TestCustomImages : ImageHandler {

public TestCustomImages()
{
this.ImageTransforms.Add(new CustomImageTransforms.ImageCopyrightTransform { Text = "Copyright Me! 2008" });
this.ContentType = System.Drawing.Imaging.ImageFormat.Png;
}

public override ImageInfo GenerateImage(NameValueCollection parameters) {
Bitmap pic = new Bitmap(200, 50);
Graphics gra = Graphics.FromImage(pic);
gra.Clear(Color.SkyBlue);
return new ImageInfo(pic);
}
}

The source for the CustomTransform, and for all the samples and the preview assembly that makes it all work is up on CodePlex now. If you've got ideas, find bugs, or think it's cool, leave a comment here and I'll make sure they get them. You can also leave bugs in the Issue Tracker on CodePlex.

Here's what the roadmap document says they've got planned...

  • Add Item Templates for an Image Handler
  • Providing parameter type inference for the handler instead of a Name Value Collection.
  • Giving you control of transforms, caching inside of your Generate Image Method.

Does it work with ASP.NET MVC?

Gee, I dunno. Let's see. Remember that if you're using ASP.NET MVC with the WebFormsViewEngine, as long as there's no Postback, some Server Controls can still work. This just might, as it renders on the first load.

I added the ASHX handler file to my MVC project, referenced the DLL, made sure to register the tag prefix and it mostly worked. The design service isn't working, saying something about "could not be set on property ImageHandlerUrl," but I'm encourage I got this far. Let's encourage them to keep MVC in mind!

image

Cool. Have at it at CodePlex. No warranty express or implied.

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 bluesky subscribe
About   Newsletter
Hosting By
Hosted on Linux using .NET in an Azure App Service

Disclaimer: The opinions expressed herein are my own personal opinions and do not represent my employer's view in any way.