Scott Hanselman

MSDN Updates - and RFC for you

June 5, '09 Comments [61] Posted in Microsoft | MSDN
Sponsored By

There's a bunch of stuff going on over at MSDN. They're making some cool changes and aren't afraid to break a few eggs to make an omelet. I used to think that MSDN was this static, non-moving thing, but I've been meeting with a bunch of folks on the various sub-teams and I'm seeing a resurgence of agility. (MSDN, agile?! Madness! No, seriously.) Soma blogged recently about some of the changes.

Here's some of the stuff that's been going on lately at MSDN, as well as a Request for Comments (RFC) from me.

Alternate MSDN Views

I blogged while back about alternate views for MSDN, including a Low-Bandwith (loband) view. MSDN includes the Home Page (of course), the MSDN Library, Downloads, Community and Forums. The library experience (LEX) team has updated the loband view as well as the new  dev10ide view. They're aiming for sub-1-second load times, small page weight and they are reading all the feedback

MSDN Forums in ASP.NET MVC

image The MSDN Forums have been updated and are now written in ASP.NET MVC. This, along with other changes has made the forums markup much smaller and the site much snappier. This forum upgrade went out to all MSDN/TechNet forums, including the Windows 7 Forums and Windows Client Development Forums.

The Forums are also more answer-focused now, kind of like StackOverflow. You can see how many questions remain unanswered, mark questions answered, and browse by tag. There's also filters like "hascode" to show only Q&A with code, or you can show only "helpful" answers, or just proposed, but not accepted answers.

The Forum Reading view has been updated with AJAXy goodness, so you can expand threads without leaving the page.

Other tweaks to MSDN include, the MSDN Community Center that includes not just blogs, but also tweets, delicious links, Technorati results and Diggs.

What would a new MSDN look like?

Chris Sells told me once:

"If you're not getting in trouble at least twice a year, you're not doing your job."

This statement really changed the way I thought about my job. It's good to push the envelope.

I was in an MSDN redesign meeting and they were brainstorming on some potential designs. I said, hey, let's go crazy here and try some way-out-there-MSDN designs. A bunch of emails have been thrown around and since they never explicitly said "don't blog this," I figured, why not ask you guys, then take the feedback/comments you give directly to them.

This is just brainstorming, to be sure, VERY early on for a potential redesign. I picked a few comps that the designer was working on that were in the same vein, but different in purpose.

First, here's a concept design for a a would-be MSDN Home Page. There's two goals here, and a visual refresh is just one of them. The other is to change the user experience to make it easier to find things. To make it easy to find things you need, but also have enough active content to have "serendipity" moments when you see something you wouldn't ordinarily.

There's a community visualizer at the middle there. It'd be an active widget and clicking on the left site would get you real-time results with recent activity, most popular items, etc from all over the network.

The Developer Centers are called out on the left-side to get you to the top areas in one-click. I pushed them to get you from the MSDN Home page to mostly anywhere in one click, two tops. For example, downloads has the most likely download links. At the bottom, you can get to other sites within the network.

MSDN_LOCH_HOME

Perhaps a lighter frame?

lightframe

Darker? Notice the "channel bar" at the top in gray.

MSDN_SHOE_HOME_D

Perhaps a compromise?

MSDN_TRAM_HOME

 

This potential home page is as a result of me saying, do the opposite of what we'd ordinarily do. Is the MSDN Home page too visually busy? Make it simpler. How simple can it get, and if it gets simple, does it still provide value?

MSDN_NORD_HOME

Perhaps without the blue frame? Even simpler?

MSDN_HM_NORD_5

Please offer your opinions and comments here. MSDN is your site and if you have an opinion, make it heard and I'll pass them out to my bosses. How should the site look? How do you want to use it? What do you think of these designs? What works and what doesn't?

If me leaking designs like this is helpful, tell me here and I'll use them as character references at my Court Martial. All the better if you find it helpful, then I'll have good reason to share even more, even earlier in the process.

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

Building your own Arcade Cabinet for Geeks - Part 2 - The Monitor

June 5, '09 Comments [6] Posted in Arcade
Sponsored By

This is the second part of a multi-part series I'm going to do about assembling an Arcade Cabinet for my house. This series has two disclaimers:

Software Disclaimer 1: There's all sorts of legal issues around emulating arcade games. This series of posts has nothing to do with that. I do own some original arcade boards, but if you want to emulate arcade games with MAME (Multiple Arcade Machine Emulator), you can search the 'tubes. What I'm doing here is putting a computer in a pretty box.

Hardware Disclaimer 2: Many folks that build arcade cabinets have a purist view of how these things should be done. They will prefer original Arcade CRT monitors and more expensive, higher quality parts. I am more of a pragmatist. I also have no idea what I'm doing, so I've also got ignorance on my side.

Picking a Monitor

image If you ask a purist, the ONLY monitor on to get for your home arcade is the Wells Gardener 27" Flat Screen Arcade CRT Monitor. There are others, and there are special video cards that run at the appropriate 15kHz that these monitors like. This particular monitor I've linked to has VGA support, however and will do 70Hz and 800x600. However, it's also about 80-95lbs.

Not only are these heavy, but they are a hassle to mount, they are heavy (did I mention that?) and depending on which one you get, they can be a little dangerous if you touch the wrong stuff.

True, you will get the "genuine" arcade look. Also, you can't argue with 27", size matters.

IMG_0070For me, however, I used a Dell 2003FP LCD Monitor. You may laugh, but it's clear, high-res, it's fantastically light, and I'm sure at some point, there will be some software to make my LCD as crappy and blurry and ghosty as a real arcade monitor.

Remember, I don't just want to play Donkey Kong, I also want to play Far Cry and Doom, so I am totally happy with a high-res LCD. The only trouble is finding a 4:3 LCD. I happened to have an extra, but you may need to look in the classifieds or on Craigslist.

Another option is to use a 24" 16:9 LCD and cover it with a bezel, or frame. You'll likely already need a bezel around your screen, so cropping the sides isn't a big deal for me. If my 4:3 LCD dies one day, I'll replace it with a 16:9 and crop it and I suspect no one will notice.

Cost: US$0 (I had one)
Cost So Far: US$131

Mounting

While my arcade cabinet came with a large broken (well, I broke it) monitor with burn-in, I needed to change the layout to make my LCD work. You can see there's a hole for dropping a CRT in and having the end of the CRT hang down into the middle of the box.

One of the benefits of using an LCD is the standard VESA mount on the back of the monitor. John and I pulled this old wood frame out, and took a piece of plywood and mounted the VESA bracket from the monitor's original pedestal (that we took apart), then put the whole thing back in. Now I can mount any VESA LCD in the system on this centered mount.

IMG_0072IMG_0087 IMG_0083

We then cut a semi-circle at the bottom to make room for both the video cables and the future control panel wires.

Notice also the angle of the monitor. Most older arcade cabinets didn't mount the monitor at a vertical angle or even close to vertical. Instead, since your head will be down while playing, they put the monitor nearer the horizontal.

We'll put a black framed bezel around the monitor in the "art" portion of the project.

IMG_0090 IMG_0091 IMG_0092

Then as seen in the third picture, we added a piece of frosted glass. At this point I'm playing solitaire as a test. I purchased an X-Arcade Dual Tankstick a while back (a year or more) and again, just for a test, I set it in the void.

IMG_0093

To be clear, to finish here would be the height of cheesy, so this is just a test. Unfortunately this point is where a lot of home arcade kits stop, but not us. However, confirming you are on the right track is a good motivator to continue.

Next Up: Control Panel

  1. Cabinet and Power
  2. Monitor and Mounting
  3. Control Panel
  4. Sound and Lights
  5. Paint and Art
  6. Computer Hardware and Software
  7. Success and Conclusion

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

Building your own Arcade Cabinet for Geeks - Part 1 - The Cabinet

June 5, '09 Comments [7] Posted in Arcade
Sponsored By

This is the first part of a multi-part series I'm going to do about assembling an Arcade Cabinet for my house. This series has two disclaimers:

Software Disclaimer 1: There's all sorts of legal issues around emulating arcade games. This series of posts has nothing to do with that. I do own some original arcade boards, but if you want to emulate arcade games with MAME (Multiple Arcade Machine Emulator), you can search the 'tubes. What I'm doing here is putting a computer in a pretty box.

Hardware Disclaimer 2: Many folks that build arcade cabinets have a purist view of how these things should be done. They will prefer original Arcade CRT monitors and more expensive, higher quality parts. I am more of a pragmatist. I also have no idea what I'm doing, so I've also got ignorance on my side.

The Point

I have always wanted an Arcade at home. I spent hours wasting nickels, then quarters, then nickels again, at the local arcade. Who wouldn't want one in their house? Well, our spouses, but that's another post.

First step, build or buy? How to start the "Hanselcade?"

The Goal

I decided a few things early on from talking to folks (and you should decide for yourself, also):

  • I wasn't going to build my own cabinet from scratch. I have no wood-working skills, and I was concerned it wouldn't feel "stock" - like a real cabinet. It would look like a wood box with joysticks taped to it, like some that I've seen.
  • I am cheap. One can spend thousands and purchase a complete super-custom cabinet, but that's a little over the top for me. 
  • I wasn't going to build the greatest/largest/most versatile cabinet. I like the look of a single-purpose normal size cabinet, so I decided against any controls other than joysticks. No trackball, spinners, etc.
  • I may want to put an XBox, PS2/3, or other things in the cabinet also. Again, my goal was "a computer in an arcade box" that can play not just arcade games, but also Doom, or whatever. You can buy boards that have some large number of games already installed as well.

The Cabinet

You can build your own Arcade Cabinet using Cabinet Plans and your own wood. There's a lot of free plans and pay plan on the web. Personally, I find most of these plans to be to large and too tall. You have to ask yourself if you want a 2-player or 4 player system. Most of the 4-player ones are VERY large. Additionally, the control panels for those can be extremely wide, especially if you are making a panel that includes not just joysticks, but also trackballs and spinners. You can also buy the kit and assemble it later.

Instead, I decided, along with my friend/helper on this project John Batdorf to start with a REAL antique (wow, I'm old) arcade cabinet, and strip it down. I would compare this decision to refurbishing an antique car, rather than building a kit car.

I spent a few weeks searching Craigslist for terms like "MAME" and "Arcade" and found a local guy who had a very old "Video Trivia" game I'd never heard of. Most importantly it didn't work. Always buy ones that don't work and you'll get them cheaper.

IMG_0034 IMG_0035

Cost: US$100
Cost So Far: US$100

It wasn't much to look at, but it was physically solid. It came with an old CRT, but I accidentally broke it (it hissed air at me) and recycled it. I wasn't planning on using a CRT anyway, as they are not only high-voltage, but also unspeakably heavy.

Aside: This is where I differ from many. While some like the CRT look and authentic feel, I think a high-res LCD is more versatile and soon there will be real-time filters that, if you like, will make your crisp LCD look like an old CRT.

IMG_0038Notice the control panel sitting diagonally in that picture .This is one of the reasons I picked this cabinet. The Video Trivia game had only 5 buttons. No joysticks. As such, the control panel was almost all hole-free steel. In fact, this control panel is as solid as any piece of metal I've ever seen. I planned on using this panel to host my joysticks.

The cabinet also had lot of wires inside that I could piggy back other things on like getting the coin doors working, lights, etc. It was structurally sound, had no bugs living it it, and I could visualize it painted and finished.

Sounds silly, but being able to take an antique and visualize it completed is a big part of picking the right one.

The image at right is of the Oregon State "Music and Amusement Device Tax Receipt." Basically a license to have these. It's from 1985. I don't need a license now, but I like the nostalgic feel of this, so I'm going to keep it.

The Power

IMG_0104I have seen lots of cabinets online created by people who actually know and understand electricity. They come up with a lot of cool and clever ways to mount switches in new places in the cabinet. Since we're putting a computer in there, there will be a power need for a few things.

My electrical skills are limited to amps, volts, ohms, positive and negative. Using these superpowers and a dude from Home Depot, I found this little gem.

It's a "Belkin Conserve" Energy Strip. In English, it's a power strip with a remote. Bam!

Cost: US$30
Cost So Far: US$130

This was perfect. I drilled a 3/8" hole in the cabinet and snipped the cable in two (while unplugged, ahem.) I put the cable through the hole and spliced the cable back together with some wire connector/splicer dealies I got at Radio Shack for a buck.

Cost: US$1
Cost So Far: US$131

Then using the wall mount on the Belkin, I mounted the power strip on the inside of the cabinet.

 IMG_0105 IMG_0106

The remote control uses a single battery and comes with a holster with sticky tape. That'll go on the top of the cabinet. This was the cheapest and most creative (and clever, I thought) way to make this a "single power button" cabinet.

IMG_0107IMG_0108

Then I temporarily shoved everything in there to see if it would fit. Probably should have done that first. ;)

Next Up: Mounting the Monitor

  1. Cabinet and Power
  2. Monitor and Mounting
  3. Control Panel
  4. Sound and Lights
  5. Paint and Art
  6. Computer Hardware and Software
  7. Success and Conclusion

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 Remove the .NET ClickOnce Firefox Extension

June 5, '09 Comments [10] Posted in Microsoft | Open Source
Sponsored By

.NET 3.5 SP1 enables a Firefox Extension that allows .NET applications on Firefox, but its Uninstall button is grayed out.  Since .NET 3.5 SP1 is on Windows Update and is rolling out to more users than ever before, a number of people have noticed this and are frustrated.

Why is the Uninstall button grayed out? What does this add-in do?

Short Version: Remove the .NET Firefox Extension

First: To uninstall completely, if you're running XP or Vista, here's an update that will make the .NET ClickOnce Extension/Addin easily uninstallable by adding on a per-user, rather than per-machine basis. This update will also go out on Windows Update if you prefer to wait. Alternatively, you can click Disable and it won't be loaded.

Longer Version: Some Background and Details

This addin allows users to launch .NET applications from Firefox. The primary issue is that the plugin is enabled at the machine level, rather than the user level. This has the benefit of enabling the Addin for all users, but it as the unfortunate side effect of making the "Uninstall" button grayed out which makes people feel that something sinister has happened or they've lost control.

There are other plugins that use this technique to enable themselves machine-wide, including Google Gears and Java, but I totally understand that some folks don't want certain Firefox Addins enabled.

image

image

This is a tricky situation, because you'll notice that many applications enable browser plugins in similar ways, including, but not limited to:

  • Java
  • VLC Player
  • Adobe Acrobat
  • QuickTime
  • Google Talk
  • iTunes
  • Hulu
  • Picasa

There are lots of other applications that include their own browser addins, many install this same way. Most of these addins are in the "Plugins" tab, rather than the Extensions tab, which might explain why fewer people freak out. 

My point here is that the "Extensions" tab is something that Firefox users, myself included, feel strongly about, while they think less about plugins. Extensions often affect UI and make Firefox personalizable, while Plugins usually enable system-level functionality. It's a subtle difference, but it's significant and important to remember. Extensions are personalization points for Firefox at the User level, and are thought of as such. Some addins (not ours) mark themselves as Hidden, which could be perceived as even more sinister.

Ultimately since many people requested .NET support for Firefox, and we wanted to give it to them, we made this feature. When .NET was updated, this feature was included.

The Future

Here's some more detail and some insight into what we're doing about it.

  • First, this is already fixed in Windows 7 RC. You can uninstall this addin, no problem.
  • Second, for XP and Vista, the update above makes this add-in per-user so it can be easily uninstalled like any other Firefox addin.
    • This update will go out on Windows Update automatically soon. That means. if you already have this add-in, the only visual difference for you will be that the uninstall button will be enabled and you can remove it if you like.
  • Going forward, for .NET 4, the team wants to host this plugin at https://addons.mozilla.org. If you want it you can go get it. If not, no worries. We're still checking on this.

All the Technical Details

In case you want to know the technical details, and in the interest of transparency, it's called "MicrosoftDotNetFrameworkAssistant.xpi." You can rename it to .zip and unzip it. It's got XUL and JavaScript inside - it's just a zip file. If you have made a Firefox add-on, this will look familiar. There's an options dialog, standard stuff, keeping track of two booleans as preferences:

var dotNetAssistantOptions = 
{
onAccept: function()
{
var prefs = this.getPrefs();

var autoLaunchChk = document.getElementById("autolaunch");
prefs.setBoolPref("clickonce.autolaunch", !autoLaunchChk.checked);

var allVersionsChk = document.getElementById("allversions");
prefs.setBoolPref("all_clr_versions_in_useragent", allVersionsChk.checked);

// Update the user-agent if preferences changed
checkCLRVersionString();
return true;
},

onLoad: function()
{
var prefs = this.getPrefs();

var autoLaunchChk = document.getElementById("autolaunch");
autoLaunchChk.checked = !prefs.getBoolPref("clickonce.autolaunch");

var allVersionsChk = document.getElementById("allversions");
allVersionsChk.checked = prefs.getBoolPref("all_clr_versions_in_useragent");
},

getPrefs: function()
{
return Components.classes["@mozilla.org/preferences-service;1"]
.getService(Components.interfaces.nsIPrefService)
.getBranch("microsoft.CLR.");
}
}

There's a contentType handler. This is the meat of it. We see if the mime/type being requested is "application/x-ms-application," indicating the user is trying to launch a .NET ClickOnce application. We then do some path stuff and launch our "sandbox" application that hosts these apps.

var clickOnce = {

dialog_onload: function()
{
// This is the function that would have been called had our overlay not stepped in.
dialog.initDialog();

if (this.isClickOnce())
{
this.prefs = Components.classes["@mozilla.org/preferences-service;1"]
.getService(Components.interfaces.nsIPrefService)
.getBranch("microsoft.CLR.clickonce.");

if (this.prefs.getBoolPref("autolaunch"))
{
this.launch_application();
}
else
{
var button = dialog.dialogElement("launchApplicationButton");
button.collapsed = false;
// If the user has both this addon and FFClickOnce installed show only our button
var ffClickOnceButton = dialog.dialogElement("FFClickOnce-runbutton");
if (ffClickOnceButton)
{
ffClickOnceButton.collapsed = true;
}

// Let the dialog know it must resize to accommodate the new button
dialog.mDialog.sizeToContent();
}
}
},


isClickOnce: function()
{
var mimeInfo = dialog.mLauncher.MIMEInfo;

// Checking the file extension may be second guessing the webserver
// but when 'prompt' is set the user will still have a save button.
if (mimeInfo.MIMEType == "application/x-ms-application" ||
mimeInfo.primaryExtension == "application")
{
return true;
}

return false;
},


launch_application: function()
{
this.execute(this.getPresentationHostLocation(), "-LaunchApplication " + dialog.mLauncher.source.spec);

dialog.mDialog.close();
},

getPresentationHostLocation: function()
{
var nsIProperties = Components.classes["@mozilla.org/file/directory_service;1"]
.getService(Components.interfaces.nsIProperties)

// Attempting to forward-proof this extension by testing for where PresentationHost
// will probably be for CLR 4
var phNewLoc64 = nsIProperties.get("WinD", Components.interfaces.nsILocalFile);
phNewLoc64.appendRelativePath("Microsoft.NET\\Framework64\\wpf\PresentationHost.exe");
if (phNewLoc64.exists())
{
return phNewLoc64;
}

var phNewLoc32 = nsIProperties.get("WinD", Components.interfaces.nsILocalFile);
phNewLoc32.appendRelativePath("Microsoft.NET\\Framework\\wpf\PresentationHost.exe");
if (phNewLoc32.exists())
{
return phNewLoc32;
}

// Fallback to the default location
var phOldLoc = nsIProperties.get("SysD", Components.interfaces.nsILocalFile);
phOldLoc.appendRelativePath("PresentationHost.exe");
return phOldLoc;
},

execute: function(exe, strArgs)
{
// exe should already be an nsILocalFile

// create an nsIProcess
var process = Components.classes["@mozilla.org/process/util;1"]
.createInstance(Components.interfaces.nsIProcess);
process.init(exe);

// Run the process.
// If first param is true, calling thread will be blocked until
// called process terminates.
// Second and third params are used to pass command-line arguments
// to the process.
var args = strArgs.split(" ");
process.run(false, args, args.length);

}

}

There's also a UserAgent module that will optionally append the .NET CLR version to the UserAgent so that websites can detect and show content based on

// Check for updated .NET Framework install on browser startup
checkCLRVersionString();

function checkCLRVersionString()
{
var useragentExtrasPref = Components.classes["@mozilla.org/preferences-service;1"]
.getService(Components.interfaces.nsIPrefService)
.getBranch("general.useragent.extra.");

useragentExtrasPref.QueryInterface(Components.interfaces.nsIPrefBranch2);

// startup check the registry for the latest version of the CLR added to the IE user agent
var versions = getInstalledCLRVersions();

var addonPref = Components.classes["@mozilla.org/preferences-service;1"]
.getService(Components.interfaces.nsIPrefService)
.getBranch("microsoft.CLR.");
addonPref.QueryInterface(Components.interfaces.nsIPrefBranch2);
var allAddonsInAgent = addonPref.getBoolPref("all_clr_versions_in_useragent");
// Allow the user to configure whether they want all version of the CLR in their user agent
// or just the highest.
if (allAddonsInAgent)
{
var appendString = "(";
for (var i=0; i < versions.length; i++)
{
if (i != 0)
{
appendString += "; ";
}
var localVersion = versions[i];
appendString += ".NET " + localVersion[0] + " " + localVersion[1];
}
appendString += ")";

useragentExtrasPref.setCharPref("microsoftdotnet", appendString);
}
else
{
var latestVersion = versions[versions.length-1];
var appendString = "(.NET " + latestVersion[0] + " " + latestVersion[1] + ")";
useragentExtrasPref.setCharPref("microsoftdotnet", appendString);
}
}

function getInstalledCLRVersions()
{
var wrk = Components.classes["@mozilla.org/windows-registry-key;1"]
.createInstance(Components.interfaces.nsIWindowsRegKey);

// Enumerate though the CLR version strings that will be appended to the Internet Explorer user agent
wrk.open(wrk.ROOT_KEY_LOCAL_MACHINE,
"SOFTWARE\\Microsoft\\Windows\\CurrentVersion\\Internet Settings\\5.0\\User Agent\\Post Platform",
wrk.ACCESS_READ);

var clrVersions = new Array();
for (var i=0; i < wrk.valueCount; i++)
{
var name = wrk.getValueName(i);
var matches = name.match("\.NET (CLR|Client) \(.*\)");
if (matches && matches.length > 1)
{
clrVersions.push([matches[1], matches[2]]);
}
}
wrk.close();

clrVersions.sort(function(left, right)
{
if (left[1] < right[1]) return -1;
if (left[1] > right[1]) return 1;
// if version numbers are equal, prefer full CLR over Client sku
if (left[0] == "Client" && right[0] == "CLR") return -1;
if (left[0] == "CLR" && right[0] == "Client") return 1;
return 0;
});
return clrVersions;
}

That's it. Hope this helps. I'll keep my ear to the ground if anything else comes up, so stay tuned.

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

Running a Subversion Server off your Windows Home Server

June 4, '09 Comments [22] Posted in Home Server | Subversion | Tools
Sponsored By

image Disclaimer - People have been injured and emotionally scarred listening to my technical tips. This may violate your terms of service. If your ISP calls your house and is mean to you, or if you lose all your personal data because of my tips, know that we never spoke. I don't know you. Seriously, who is this?! Stop calling!

I put most of my docs in Live Mesh, and I host must of my Open Source projects at CodePlex, but I have a bunch of code and presentations that usually just float around. Tweet Sandwich is a good example.

I decided I'd try to host a Subversion Server. I don't want to use the machine I host my blog on, as I want the data in my house. Since I already have this lovely Windows Home Server that's saved my marriage, I figured why not host it there?

1. Logging into your Home Server

If you want to install software on your Home Server (and they are headless usually - no monitor) you have to use Remote Desktop. From inside my house, I run "mstsc /console" or "mstsc /admin" from the Start | Run dialog, the connect to my machine called "Server."

2. Install Visual SVN Server

I usually download software to the desktop, ignore the "holy crap don't do this" warning (although be aware) then open an administrator command prompt and run the MSI from there. I downloaded and installed VisualSVN Server, which is the absolute easiest way that I know of to get Subversion (SVN) on Windows. I installed it on the machine on port 8443. That's not 443, but rather 8443. It's kind of like the secondary SSL port. I could put it anywhere, of course, but 8080 is to 80 as 8443 is to 443. It's easy to remember and less likely that your ISP would block it outgoing from your house. You can test if you have open ports with this online tool.

3. Chose Storage and Back It Up

Windows Home Server is a different beast as it supports a RAID-like storage system. You are NEVER supposed to put anything on the D: (Data) drive directly. Always access data through shares like \\server\svnwhatever.

Here's the only/most wonky part of this whole thing. If you have a better idea or you work for the Home Server team, let me know if this is dangerous and I'll update this part of the post.

I made a folder on the D: drive (against recommendations) called D:\repos and I told Subversion that was the place to put stuff. Then I made a new Share called \\SERVER\SVNBackup and set duplicate to true. Then, I installed the Windows 2003 Resource Kit in order to get the RoboCopy tool, and I copied RoboCopy to C:\windows so it's in the path.

Finally, I made a batch file that looked like this:

robocopy /mir d:\repos \\server\svnbackup

This "mirrors" the D:\repos folder to the \\server\svnbackup. I then used the "Add Schedule Task" wizard and made this run every night at 2am. This way I get backup and duplication in a nightly snapshot.

Alternatively, I probably could have mapped a permanent local Z:\ drive on the Home Server to \\server\svn or some share, and told VisualSVN Server to use that. However, that itself seemed wonky? My way seems to work. Thoughts?

image

4. Forward Port

I then logged into my local router and set up a port-forwarding rule to make sure that 8443 was accessible from the outside. Check your router or visit http://192.168.1.1 (usually) to figure it out.

5. Get an External DNS name (Optional)

You can certainly just visit http://www.whatismyipaddress.com and remember your address if you like. You can also hard-code it in your hosts file on the machine that will be your client.

You might consider using a service like DynDNS and get a custom domain like yourname.dyndns.org. There are applets that will run in the tray on your Windows Home Server and keep that IP address in sync if it changes.

Windows Home Server also includes options to get your own Home Server-provided domain under the "Settings" dialog in the Home Server Console. You can be http://foofoo.homeserver.com or a number of choices. This domain name is associated with your Windows Live ID and the IP is automatically updated by the Home Server.

imageNote, you can also log into your Home Server remotely, if you've enabled it. Here's me logging into my Home Server from elsewhere. Notice you can see what machines are online at home in the background there. I can RDP (Remote Desktop Protocol) into those machines if I like, and I can also remote into my Home Server itself.

Incidentally you can also view and download files from your shares, so choose strong passwords.

When you connect to your new Visual SVN Server instance over another port, your browser will likely complain that the certificate isn't trusted and it'll turn your Address Bar red and scary. Bummer, but be aware.

Now I can SVN Checkout https://mymagicdomain.homeserver.com:8443/svn/presentations/trunk as I please.

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.