Decaying Code

Where code comes to die

Community Update 2014-04-03 – #bldwin Day 2 Special– #roslyn going #oss, #windowsazure, #nodejs and #dotnet going native

As always, BUILD 2014 videos might not be there when you click on them today. They should be there as soon as possible.

As a sidenote, Roslyn is open source. My jaw is on the floor. Wow. Impressive.

Enjoy.

BUILD 2014

BUILD: Day 1 Keynote Summary (blogs.msdn.com) – If you still haven’t watched it, I would. However, if you’d rather have the summary, here it is.

Building Enterprise and SaaS Web Apps and Web APIs using Azure Active Directory for Sign In (channel9.msdn.com)

Visual Studio and .NET Overview (channel9.msdn.com)

The Present and Future of .NET in a World of Devices and Services (channel9.msdn.com)

Thinking for Programmers (channel9.msdn.com)

Building Web APIs for Mobile Apps Using ASP.NET Web API 2.1 (channel9.msdn.com)

Puppet and Azure: Bringing DevOps to the Enterprise (channel9.msdn.com)

Powerful Mobile Apps with Mobile Services and ASP.NET Web API (channel9.msdn.com)

.NET Community & Open Source (channel9.msdn.com)

Web Development

Querying An In-Memory Array Of JavaScript Objects In NodeJS (derickbailey.com)

.NET

Announcing new web features in Visual Studio 2013 Update 2 RC (blogs.msdn.com)

Announcing .NET Native Preview (blogs.msdn.com) – Compiling .NET to native? HERESY (dipped in chocolate)!

.NET Compiler Platform ("Roslyn") - Home (roslyn.codeplex.com) – Roslyn. C# compiler? Open-source? Get me a chicken with teeth!

Microsoft “Roslyn” CTP (msdn.microsoft.com)

Visual Studio 2013 Update 2 RC Downloads - Release Candidates (RC), Betas, and Previews (www.visualstudio.com)

Using AutoMapper to prevent SELECT N+1 problems | Jimmy Bogard's Blog (lostechies.com)

ASP.NET

Denis Huvelle: Tips for ASP.NET MVC 4: lowercase URLs (www.dhuvelle.com)

State of Microsoft Security: ASP.NET Identity 2.0 (devproconnections.com)

I’m throwing in the towel in FubuMVC | The Shade Tree Developer on WordPress.com (jeremydmiller.com)

Windows Azure

Available Now: Preview of Project “Orleans” – Cloud Services at Scale (blogs.msdn.com)

Adapting The Azure Queue API For Node.js (odetocode.com)

Packages, tools and more

Mexedge Stylesheet Extension (visualstudiogallery.msdn.microsoft.com) – Allows you to visualize your CSS files as a tree view

Voice Commands extension (visualstudiogallery.msdn.microsoft.com) – Voice commands for Visual Studio

Architecture and Methodology

The end of ORM - Gumtree Dev Team (www.gumtree.com)

Must have books

Designing Evolvable Web APIs with ASP.NET: Glenn Block, Pablo Cibraro, Pedro Felix, Howard Dierking, Darrel Miller: 9781449337711: Amazon.com: Books (www.amazon.com)

Roslyn End-User Preview – What is it and what is possible? – #build2014 #bldwin version

What is Roslyn?

Roslyn is a complete new compiler for .NET. However, it’s more than just a simple compiler. We called it earlier a “compiler as a service”. Now they call it the compiler platform.

What’s new?

Well it ain’t your run of the mill compiler. It doesn’t just take code and outputs machine code (or IL for .NET).

This compiler allows you to participate in the compilation of your software itself and tell the compiler what to do with it. Scenarios like Aspect Oriented Programming becomes relatively trivial and doesn’t require the use of plugins or post-build event.

You have a cool refactoring that you want to implement in a very specific way? Want to convert properties with certain attributes to code blocks? Just code it. Roslyn allows you to integrate your refactoring within Visual Studio directly and share it with everyone. One specific scenario would be to code company code guidelines directly within a VSIX that you deploy on every developer’s machine. This allow developers to all have the same rules as for what the company is concerned. This could definitely give an edge to a company that want to standardise code quality directly at the source.

APIs

Basically, it comes with three type of API. Features, workspaces (solution, projects, files) as well as the compiler APIs.

Features are based around refactoring and fixing code. Those are high level functionality that are tightly link to Visual Studio. Workspace API relate to code formatting, finding references, etc. They are also linked to Visual Studio. Compiler API relates to Syntax trees, emitting code, analysing flows of code… they are the most low-level API related to the compiler and are also the most interesting.

 

What’s coming?

Well… technically you now have access to the C# compiler with an Apache 2 licence.

Here’s what is now possible…

Simple scenario #1 – Creating a new refactoring

Using the Roslyn SDK, I create a new Visual C# > Roslyn > Code Refactoring.

The default template reverse the string of a type. So I press F5, create a new project, create a class and do ALT + . on that class.

I now have an additional refactoring option which brings my class “ThisTest” to “tseTsihT” with live preview. This is nothing but it’s a refactoring that you are 100% in control with which doesn’t require external tools.

I know. This refactoring is useless. If something is valuable for you, you can simply implement it or wait for someone in the community to develop it.

Simple Scenario #2 – Flagging improperly named fields

So let’s say we want to flag any field that uses the old “m_something” convention. Doing this is as simple as the following code:

/// <summary>
/// This is used to identify where problems are.
/// </summary>
[DiagnosticAnalyzer]
[ExportDiagnosticAnalyzer("NoMUnderscore", LanguageNames.CSharp)]
internal class FieldsDoNotStartWithMUnderscore : ISyntaxNodeAnalyzer<SyntaxKind>
{
    public const string RemoveMDiagnosticId = "NoMUnderscore";
    public static readonly DiagnosticDescriptor RemoveMUnderscoreRule = new DiagnosticDescriptor(RemoveMDiagnosticId,
                                                                                         "Remove m_",
                                                                                         "Invalid name. Field name must not start with m_",
                                                                                         "Usage",
                                                                                         DiagnosticSeverity.Error);

    public ImmutableArray<SyntaxKind> SyntaxKindsOfInterest { get { return ImmutableArray.Create(SyntaxKind.FieldDeclaration); } }

    public ImmutableArray<DiagnosticDescriptor> SupportedDiagnostics { get { return ImmutableArray.Create(RemoveMUnderscoreRule); } }

    private static bool CanHaveTheMRemoved(FieldDeclarationSyntax fieldDeclaration, SemanticModel semanticModel)
    {
        if (!fieldDeclaration.Modifiers.Any(SyntaxKind.PrivateKeyword))
        {
            return false;
        }

        var token = fieldDeclaration.Declaration.GetLastToken();
        return token.Text.StartsWith("m_");
    }

    public void AnalyzeNode(SyntaxNode node, SemanticModel semanticModel, Action<Diagnostic> addDiagnostic, CancellationToken cancellationToken)
    {
        if (CanHaveTheMRemoved((FieldDeclarationSyntax)node, semanticModel))
        {
            addDiagnostic(Diagnostic.Create(RemoveMUnderscoreRule, node.GetLocation()));
        }
    }
}

/// <summary>
/// this is used to integrate within Visual Studio refactor capabilities
/// </summary>
[ExportCodeFixProvider("NoMUnderscore", LanguageNames.CSharp)]
internal class CodeFixProvider : ICodeFixProvider
{
    public IEnumerable<string> GetFixableDiagnosticIds()
    {
        return new[] { FieldsDoNotStartWithMUnderscore.RemoveMDiagnosticId };
    }

    public async Task<IEnumerable<CodeAction>> GetFixesAsync(Document document, TextSpan span, IEnumerable<Diagnostic> diagnostics, CancellationToken cancellationToken)
    {
        var root = await document.GetSyntaxRootAsync(cancellationToken);
        var diagnosticSpan = diagnostics.First().Location.SourceSpan;
        var declaration = root.FindToken(diagnosticSpan.Start).Parent.AncestorsAndSelf().OfType<FieldDeclarationSyntax>().First();
        return new[] { CodeAction.Create(FieldsDoNotStartWithMUnderscore.RemoveMUnderscoreRule.Description, c => RemoveMAsync(document, declaration, c)) };
    }

    private async Task<Document> RemoveMAsync(Document document, FieldDeclarationSyntax fieldDeclaration, CancellationToken cancellationToken)
    {
        var nameToken = fieldDeclaration.Declaration.GetLastToken();
        var newNameToken = SyntaxFactory.Identifier(nameToken.Text.Replace("m_", ""));

        var variableDeclarationSyntax = fieldDeclaration.Declaration.ReplaceToken(nameToken, newNameToken);

        var newLocal = fieldDeclaration.WithDeclaration(variableDeclarationSyntax);

        var formattedLocal = newLocal.WithAdditionalAnnotations(Formatter.Annotation);

        var originalRoot = await document.GetSyntaxRootAsync(cancellationToken);
        var newSyntaxRoot = originalRoot.ReplaceNode(fieldDeclaration, formattedLocal);

        return document.WithSyntaxRoot(newSyntaxRoot);
    }
}

This require quite a bit of code. However, it is possible to regroup and refactor common operation on certain elements (fields, constructors, etc.) to reduce the amount of code.

Of course, this code is not production ready and not unit tested. Do not take it as is. It is full of bug and is not ready for any type of environment. This is only to show what is possible.

Conclusion

This of course is just the beginning. I’ve just showed you what is possible. It took me less than an hour to prepare those two examples. With more time, it could be possible to create some very complex scenarios of very high quality.

We’re living in a crazy world right now. We’re getting more and more control over the code that we write. The possibilities that are opening up when we can interact to something as low-level as the compiler are just breathtaking.

For me, it’s tools that are built for the developers, for our needs and of course… fun to use.

Links

Get Roslyn Now

Roslyn Roadmap

Language Features implementation status

Roslyn Sample and Walkthrough

Community Update 2014-04-02 – #bldwin special including my picks for Day 1 with some #winjs, #ef6, #typescript and more

Okay so… if you haven’t heard yet… the BUILD is on. I mean… really. Tons of sessions and more time to waste than you would admit.

So to simplify your life, I’ve built a playlist that is oriented toward the web. If you think I missed something, you should tell me.

Don’t forget to watch for tomorrow where I’ll post my picks for Day 2.

Enjoy!

My picks for BUILD 2014 – Day 1

This is happening today… if you don’t see the video, check back later.

Building a Single Page Application with ASP.NET and AngularJS (channel9.msdn.com)

Internet of Things with Azure Service Bus (channel9.msdn.com)

What's New for ASP.NET and Web in Visual Studio 2013 Update 2 and Beyond (channel9.msdn.com)

3D Printing with Windows (channel9.msdn.com)

TypeScript (channel9.msdn.com)

Web Development

Gulp and Browserify with ASP.NET (www.myeyeson.net)

.NET

Fetch Gmail Contact List using CSharp.NET Code | CodeTonics (www.codetonics.com) – Okay… it binds to a DataSource but… the code is quite easy to modify

winjs/winjs · GitHub (github.com) – WinJS now on GitHub with Apache 2.0 licence

Reactive-Extensions/RxJS-WinJS · GitHub (github.com) – RxJS integration with WinJS

Reactive-Extensions/RxJS · GitHub (github.com) – RxJS in standalone without WinJS dependencies

Visual Studio 2013 Update 2 RC (www.microsoft.com)

Entity Framework - Entity Framework 6: The Ninja Edition (msdn.microsoft.com) – if you haven’t read that yet, you should

Data Points - Code First Goodies in Entity Framework 6 (msdn.microsoft.com)

Inside .NET Native (channel9.msdn.com) – Compiling .NET to native? Interested?

ASP.NET

Change log - Web Essentials 2013 for Update 2 RC (vswebessentials.com) – You can download it here.

Architecture and Methodology

On that Microservices thing (www.udidahan.com)

Scarcity In Software Development (odetocode.com)

Open-source projects

tobie/ua-parser · GitHub (github.com) – User Agent parser. If you are parsing logs, you need that project. Also available on NuGet.

Source Control (TFS, Git, SVN)

Microsoft Visual Studio Team Foundation Server 2013 with Update 2 (www.microsoft.com)

Community Update 2014-04-01 – April Fool’s special, getting ready for #durandaljs and some #elasticsearch

April Fools Entry

Clippy for ReSharper | JetBrains .NET Tools Blog (blog.jetbrains.com)

security - Permanently uninstalling the user - Super User (superuser.com)

Web Development

Preparing for Durandal NextGen (eisenbergeffect.bluespire.com)

BUILD 2014 – Must watch

Deep Dive: Improving Performance in Your ASP.NET App (channel9.msdn.com) – Available April 4th-5th.

.NET

Visual Studio Online Update – Mar 18th (blogs.msdn.com)

At BUILD 2014? Join Miguel de Icaza for his C#+F# Mobile Session on Android and iOS (blogs.msdn.com)

ASP.NET

Get the Twitter Profile Image using ASP.NET Identity (blog.beabigrockstar.com)

Updated ASP.NET Database Resource Provider - Rick Strahl's Web Log (weblog.west-wind.com)

Web API: Mixing Traditional & Verb-Based Routing | Applied Information Sciences Blog (blog.appliedis.com)

Simple OAuth Server: Implementing a Simple OAuth Server with Katana OAuth Authorization Server Components (Part 1) - Tugberk Ugurlu's Blog (www.tugberkugurlu.com)

Tom DuPont .NET: TypeScript Definition Files on NuGet: Always have the latest and greatest IntelliSense! (www.tomdupont.net)

CypressNorth/.NET-WebApi-HttpStringDecodeFilter · GitHub (github.com)

Architecture and Methodology

Estimate This! (or not) | xProgramming.com (xprogramming.com)

The True Corruption of Agile | 8th Light (blog.8thlight.com)

Search Engines (Solr, ElasticSearch)

Nest - Quick Start (nest.azurewebsites.net) – .NET Connector for ElasticSearch

Log Analysis is Fun Again | CDS Global (www.cds-global.com)

Community Update 2014-03-31 – #Build2014, #dotnet, #css, #responsive tables, #aspnet, #owin, new #octokit .NET version

So like every Monday, as always, we have an avalanche of links.

The one I would really not miss is the Build 2014 session list. The Build will start April 2nd and go up to April 4th. I will list my recommended session once we reach those date since I’m still picking what I, and maybe you, should watch.

With this, good reading!

Enjoy!

Must Read

Analysis Paralysis: Over-thinking and Knowing Too Much to Just CODE - Scott Hanselman (www.hanselman.com)

Build 2014

Build 2014 (channel9.msdn.com) – The event will be from April 2nd to April 4th.

Web Development

CSS Diner - Where we feast on CSS Selectors! (flukeout.github.io) – Excellent learning tool to learn CSS selectors

Responsive tables (gergeo.se)

.NET

StructureMap 3.0 is Live | The Shade Tree Developer on WordPress.com (jeremydmiller.com)

How I made EF work more like an object database | brockallen on WordPress.com (brockallen.com)

12 reasons to use the Jolt award winning Visual Studio Premium 2013 (blogs.msdn.com)

ASP.NET

Validation of hidden fields at the client in ASP.NET MVC (www.campusmvp.net)

OWIN security components for ASP.NET: OpenID Connect preview and Cloud Cover video! | CloudIdentity (www.cloudidentity.com)

Optimize your WebApp like a PRO – ASP.NET MVC Boilerplate | Emit Knowledge (www.emitknowledge.com)

Exploring ASP.NET FriendlyURLs | TechNet Blogs (blogs.technet.com)

CQRS / Event Sourcing

Event sourcing in practice (ookami86.github.io) – Slides in HTML. Use the arrows/space on your keyboard to page through.

Windows Azure

Using SLAB's Azure Table Sink With a WebApi Service Hosted In Azure Beyond the Duck (beyondtheduck.com)

Source Control (Git, SVN, TFS, etc.)

octokit.net/ReleaseNotes.md at master · octokit/octokit.net · GitHub (github.com) – New version of the .NET GitHub API.

Search Engines (ElasticSearch, Solr, etc.)

elasticsearch – how many shards? « Trifork Blog / Trifork: Enterprise Java, Open Source, software solutions (blog.trifork.com)

Elasticsearch Monitoring and Management Plugins | codecentric Blogcodecentric Blog (blog.codecentric.de)

Community Update 2014-03-28 – Learning #javascript frameworks, page #performance, #REST, #Kanban and more

So the weekend is already there.

If you missed it, don’t forget my post on SideWaffle. It’s a Visual Studio Extension that ships with lots of Open Source templates including templates to building templates (INCEPTION!).

Otherwise, have a good weekend and enjoy!

Must Read

Scott Hanselman's Complete List of Productivity Tips - Scott Hanselman (www.hanselman.com)

Troy Hunt: The prophesied Windows XP and IE 8 crisis is nigh! (unless you’re in China) (www.troyhunt.com)

Web Development

JavaScript Frameworks | How to Learn Them Quickly | Funny Ant (www.funnyant.com)

By Value Versus by Reference (JavaScript: The Definitive Guide, 4th Edition) (docstore.mik.ua)

Critical render path and pagespeed: An in-depth look (www.feedthebot.com)

Using Bower and NancyFx together | Krzysztof Koźmic on software (kozmic.net)

ASP.NET

IIS and ASP.Net Authentication and Authorization - CodeProject (www.codeproject.com)

OWIN security components in ASP.NET: OpenID Connect! (blogs.msdn.com)

.NET

Task.Run vs Task.Factory.StartNew (blogs.msdn.com)

Get rid of deep null checks (geekswithblogs.net)

Nico's digital footprint | Building a REST API and consuming it in WP8 (www.spikie.be)

Architecture and Methodology

So Long Scrum, Hello Kanban - Stormpath User Management API (www.stormpath.com)

Deployment

Octopus Deploy vs. Puppet/Chef - Octopus Deploy (octopusdeploy.com)

Search Engines (Solr, ElasticSearch, etc.)

How To Install Elasticsearch on an Ubuntu VPS | DigitalOcean (www.digitalocean.com)

Think Big | Solr vs ElasticSearch (thinkbiganalytics.com)

Community Update 2014-03-27 – #SPAHelper by Chris Love, #webdev, #aspnet, #swagger with #webapi and #git pull is bad

First, I’m bringing you the SPAHelper by Chris Love. This is worth looking at.

Patrick Desjardins is bringing us a quick fix for Bootstrap with smaller than 768px screen width. We also have a nice explanation on why a CDN is “slow” for mobile devices (hint: it isn’t).

Today, Project Helios hits another milestone with the 1.0.0-alpha1 hitting nuget today by Levi Broderick. Scott Hanselman show us on how you can block a folder from executing ASPX pages.

We have much more so I’ll let you guys read those before going on a long explanation of every links.

Enjoy!

Single Page Application Helpers by Chris Love

docluv/SPAHelper · GitHub (github.com) – The code

docluv/movies · GitHub (github.com) – The demo app code

http://movies.spawebbook.com/ – The actual demo app.

Web Development

AngularJS in Visual Studio: Data Binding - Deborah's Developer MindScape (msmvps.com)

Modifying BootStrap Tab Control for Extra Small Device | Patrick Desjardins' Blog (patrickdesjardins.com)

Why is my CDN 'slow' for mobile clients? - igvita.com (www.igvita.com)

ASP.NET

NuGet Gallery | Microsoft.Owin.Host.IIS 1.0.0-alpha1 (www.nuget.org) – That my friend is Project Helios. New alpha!

ASP.NET "Project Helios" Changelog (gist.github.com)

Back to Basics: When allowing user uploads, don't allow uploads to execute code - Scott Hanselman (www.hanselman.com)

Introduction to Web API Versioning - CodeProject (www.codeproject.com)

Some Useful IIS Rewrite Rules (odetocode.com)

Reading Settings from App Config // Chris Poulter - Web Developer (www.chrispoulter.com)

WebAPI, PascalCase and camelCase - The Problem Solver (msmvps.com)

Writing Asynchronous Web Pages with ASP.NET- Part 3 | Brij's arena of .NET on WordPress.com (brijbhushan.net)

domaindrivendev/Swashbuckle · GitHub (github.com) – REST Documentation for WebAPI (see “Swagger” demo on a non-WebAPI REST service)

Architecture and Methodology

Chill out on the Singleton Fetish | Jeremy D. Miller (codebetter.com)

Self Shunt Pattern (c2.com)

Source Control (TFS, Git, SVN, etc.)

In what cases could `git pull` be harmful? - Stack Overflow (stackoverflow.com)

#SideWaffle – Or why people are cheering every time it’s mentioned

So I discovered SideWaffle at the MVP Summit this year. Every time someone mentioned “SideWaffle” there was a lot of cheering at the simple mention of the name.

I was curious. Or rather, intrigued. Why would someone cheer for a product that much? I haven’t seen anyone cheering for jQuery or StructureMap or Ninject or whatever. It might have been guys working on the tool but I was too curious to just drop the ball. So… Googled it (sorry Microsoft) and ended up on their website.

So what is SideWaffle?

It’s a Visual Studio Extension that contains templates for technology that you might use.

So you want to make an AngularJS project but you don’t know where to start? It’s there. Nancy? It’s there too. Google Chrome Extension? Yep. Knockout Binding? Also.

It’s insane. You absolutely need to download this thing. It will save you time.

Here’s an example.

New NancyFX project.

So I do File –> New Project and I click on C# and look for Nancy:

new_nancy_project

Then, I click OK, press F5, hit the page with Chrome (Sorry Microsoft) and I get this:

nancy_running

That’s it. Now Nancy is up and running and self-hosted on my machine.

List of supported tech (as of March 27th 2014)

AngularJS, Durandal, Robots.txt, Human.txt, RequireJS, Nancy, Offline Application Cache Manifest (HTML5), KnockoutJS, Jasmine, jQuery Plugin, GruntJS configuration file, and a whole lot more.

Hit SideWaffle.com for the complete list.

Conclusion

Download. Contribute. And don’t forget to cheer every time you hear SideWaffle.

Community Update 2014-03-26 – Google #oauth #openid endpoints, #sublime, #tdd with Google Spreadsheet, and more

So first of all, Google is retiring some of its OAuth/OpenID endpoints. You NEED to read the first article. It will let you know what is going obsolete and when.

Then we have a video worth watching. Doing TDD with Google Spreadsheet. It’s crazy, it’s insane and obviously… I love it!

Beside that, enjoy the read!

Web Development

Migrating to Google+ Sign-In - Google+ Platform — Google Developers (developers.google.com) – Google is shutting down some OAuth/OpenID endpoints. You should update your apps. Some as soon s April 30th.

Sublime is Sublime 10 | Greg Young's Blog on WordPress.com (goodenoughsoftware.net)

Minified.js – A Tiny Alternative To jQuery (www.webresourcesdepot.com)

WebAIM: Accessibility Lipstick on a Usability Pig (webaim.org)

5 Truly Effective CSS Boilerplates and Frameworks (blog.smartbear.com)

ASP.NET

Avoiding problems with relative and absolute URLs in ASP.NET - Fabrice's weblog (weblogs.asp.net)

ASP.NET Web Optimization Framework - CodeProject (www.codeproject.com)

Architecture and Methodology

Using Google Spreadsheet as a simple TDD/BDD environment on Vimeo (vimeo.com) – this is a must watch.

2 Lessons Learned, And 3 Resources For For Learning RabbitMQ On NodeJS (derickbailey.com)

Windows Azure

Caching on Windows Azure - Azure AppFabric Cache, Azure Cache Service, Managed Cache, Dedicated Cache, In-Role Cache, Co-located Cache, Shared Cache, Azure Role-based Cache - Clarifying the naming confusion (blogs.msdn.com)

Storage (SQL, NoSQL, etc.)

Differences in Map/Reduce between RavenDB & MongoDB - Ayende @ Rahien (ayende.com)

Search Engine (Solr, ElasticSearch, etc.)

How we use Elasticsearch to enhance our web products | Browser (www.browserlondon.com)

Elasticsearch.org This Week In Elasticsearch | Blog | Elasticsearch (www.elasticsearch.org)

Community Update 2014-03-25 – #webdev, #aspnet, #windowsazure, #nuget packages of the week

Here are the links for now.

I couldn’t get everything today since I had a medical emergency.

I’ll keep you all posted tomorrow.

Cheers,

Web Development

New Breeze Angular Service | John Papa (www.johnpapa.net)

ASP.NET

Five Reasons ASP.NET Developers Shouldn’t Worry About Node | Wintellect (www.wintellect.com)

Page Instrumentation in ASP.NET 4.5 - Imran Baloch's Blog (weblogs.asp.net)

Using Google Authenticator with ASP.NET Identity - Be A Big Rockstar (blog.beabigrockstar.com)

Introducing ASP.NET Web API Throttling handler - Stefan's Tech Notes - Blog (www.stefanprodan.eu)

Windows Azure

Getting Started with Azure Storage (channel9.msdn.com)

Windows Azure Multi-Factor Authentication Overview (channel9.msdn.com)

Miscellaneous

NuGet Package of the Week: Canopy Web Testing Framework with F# - Scott Hanselman (www.hanselman.com)