# Sunday, October 7, 2012

The Horror, the Horror…

I have been delivering technical presentations for a long time and have experienced many highs and lows. Here are a few of the more difficult challenges I’ve faced while presenting.

Expert in the Audience (Cincinnati, OH, 2000)

I used to do a lot of classroom training and my habit on the first day was to go around the room and ask each student to describe his or her experiences and goals. I once taught an XML class that included a module on a new product called “BizTalk”. I knew almost nothing about BizTalk but it was so new that I assumed no one else would realize the extent of my ignorance.

Imagine my surprise when, during Day 1 introductions, I learned that one of my students was a senior Microsoft consultant, who was currently implementing BizTalk Server for his client.

Thinking quickly, I asked this consultant to deliver the final module to the class. We all learned something from him and I was spared any shame or embarrassment.

No Laptop (Southfield, MI, 2008)

I was asked by a Microsoft Architect Evangelist to deliver a presentation at a Microsoft event. The slides and demos were provided for me, but I did not have access to a laptop, so I asked the evangelist to find me one. Unfortunately, he never did, so I ended up borrowing a laptop from a friend at the last minute. This laptop had two major problems:

  1. It was woefully underpowered, so all the demos ran very slowly
  2. Someone had installed an unlicensed copy of Windows on the laptop, so an “Illegal Software” warning repeatedly appeared during my presentation.

No one commented on the warnings that popped up, but the audience grew restless with the time it took each demo to run.

Dead Video (Toled0, OH, 2008)

I arrived at a user group in Toledo to discover that no image would display on my screen. User group leader Jason Follas came to my rescue. Using a crossover cable, Jason connected his computer with mine, which allowed me to remote into my laptop and present from his, averting a crisis. Sometimes one has to think outside the box.

Lost in Genesee County (Flint, 2009)

The Flint, MI .NET User Group met at a New Horizons training center. I had the address and a map, but I drove around the area for at least a half hour looking for the building. I had to stop at each building in several adjacent office parks and walk inside to see if it was the correct one. I finally found the group inside a building hidden behind an unlit parking lot. I only discovered this was the correct location because someone happened to be walking out as I was walking in.

I was 45 minutes late and completely rattled and this as one of the worst presentations I ever delivered.

Overcommitted (Southfield, Lansing, 2009)

I try to avoid overcommitting, but it sometimes happens. One memorable time occurred when I was scheduled to deliver a talk at Lansing Day of .NET; and was subsequently asked to fill in the day before for an event in Southfield. Another presenter was called away by a family crisis, so I had little time to prepare for my 4-hour presentation and I had to create nearly all the materials myself.

I was unable to start preparing for the Lansing presentation until the night before, so I ended up staying up most of the night.

Dead Laptop (Lansing, 2009)

My laptop completely died the morning of the 2009 Lansing Day of .NET. I had to borrow one from Michael Eaton. Unfortunately, I did not have a backup of my presentation (I now use DropBox, so I always have a backup), so I had to recreate it. To make matters worse, I was unable to install the necessary software on his laptop, so I had to forego my demos and only display slides.

The Bomb Threat (Lexington, KY, 2010)

It was a crazy idea to drive down to Lexington, KY and back in a single day; but I wanted to be the first speaker at this new user group. The meeting was scheduled in the basement of a public library. After a five-hour drive, I called my host, who informed me that a bomb threat had been called into the library and the police had evacuated the building and the user group attendees were standing on the corner outside the library. The projector and the pizza remained inside. The building did not reopen until the following day and I ended up delivering the presentation (sans projector and demos) at a local restaurant.

So, What’s the Point?

I share these stories for several reasons

  1. Preparation is the key to success. The more familiar you are with your material and your demos and your hardware and the location of the event, the less likely things will go wrong. You will also be more aware of what can go wrong and ready to deal with it.
  2. It's possible to recover from a mistake. It doesn’t matter if it is your fault or something beyond your control – things will sometimes go wrong. Deal with it and move on with your demo. Don't assume that everything will go well. Have a backup of the completed project or a video or slides showing code. You can still teach concepts even if your demo fails.
  3. Know that it's OK to screw up. If you are enthusiastic and knowledgeable about your topic, your audience will be surprisingly forgiving. Don’t dwell on your mistakes: Learn from them.
Sunday, October 7, 2012 10:07:18 PM (GMT Daylight Time, UTC+01:00)
# Monday, October 1, 2012
Monday, October 1, 2012 3:32:00 PM (GMT Daylight Time, UTC+01:00)
# Thursday, September 27, 2012

Azure In Action by Brian Prince and Chris Hay has something for everyone. It provides a good overview of the use cases for Windows Azure and a high-level overview of the Azure architecture, which is useful for those new to the platform. It also provides many in-depth examples of Azure features, such as web roles, worker roles, and storage options.

The book also benefits from the light-hearted style of Prince and Ray, who are as entertaining in print as they are in person.

The only downside is that newer Azure features are not covered in this book and Microsoft is adding new features at a startling rate. As far as I know, no updated edition is in the works to cover these new features.

Still, the book remains relevant because of its focus on the uses of cloud computing and on the still-relevant core features.

If you are new to Windows Azure, this book is a good starting point.

Azure | books
Thursday, September 27, 2012 3:38:30 PM (GMT Daylight Time, UTC+01:00)
# Monday, September 24, 2012
Monday, September 24, 2012 2:03:36 PM (GMT Daylight Time, UTC+01:00)
# Tuesday, September 18, 2012
Tuesday, September 18, 2012 1:54:00 AM (GMT Daylight Time, UTC+01:00)
# Saturday, September 15, 2012

Several people asked me for my Data Visualization slides, so I am making them available here. You can download the entire deck here.


Saturday, September 15, 2012 10:57:41 PM (GMT Daylight Time, UTC+01:00)
# Thursday, September 13, 2012
Date Event Location Topic  
Sep 15 Code Camp NYC New York, NY Effective Data Visualization Link
Sep 22 SQL Saturday Kalamazoo, MI Effective Data Visualization Link
Sep 25 Software GR Grand Rapids, MI Effective Data Visualization Link
Oct 13 Tampa Code Camp Tampa, FL TBD Link
Nov 7 Ann Arbor Computer Society Ann Arbor, MI How I Learned to Stop Worrying and Love jQuery Link
Feb 21 Greater Lansing .NET User Group Okemos, MI Persistence In The Cloud:
How to User Azure Storage
Thursday, September 13, 2012 3:00:00 PM (GMT Daylight Time, UTC+01:00)
# Wednesday, September 12, 2012

I have been listening to DotNETRocks almost since the show's inception and I am an unapologetic fan. I'm not the only one: The show is the oldest and most popular podcast target at .NET developers.

So I was thrilled to learn that hosts Richard Campbell and Carl Franklin planned a cross-country Road Trip and that this trip would include a stop in the Detroit area. Upon hearing about the Road Trip, I immediately reached out to Carl and Richard to ask how I could help. It has been a few weeks since the initial announcement and plans are now taking shape.

Richard and Carl will be in Michigan on Tuesday October 9. The Great Lakes Area .NET User Group (GANG) will hold a special meeting to host the event. Jeff Wilcox, creator of the Fourth and Mayor Windows Phone 7 app will be their guest.

This event will include the following:

  • A presentation by Jeff Wilcox
  • A barbeque dinner from Lockhart's barbeque in Royal Oak, MI (courtesy of a generous donation from New World Systems)
    A live recording of Carl and Richard interviewing Jeff for an upcoming episode of DotNetRocks. The audience will have an opportunity to ask questions of Jeff
  • A technical presentation by Carl Franklin
  • A technical presentation by Richard Campbell

This is a lot to pack into one night, but if you are a regular GANG attendee, you know that we regularly pack a great deal into each meeting.

Richard Campbell traveled to GANG in 2011 and that meeting was one of our most successful ever!

This evening is made possible by the vision of Carl Franklin and Richard Campbell and by the hard work of the Great Lakes Area .NET User Group volunteers.

Because of the limited seating, the popularity of the event, and the need to buy the right amount of food, you will need to register in advance for this free event. Do so at http://dotnetrocks.eventbrite.com/.

You can learn more about the Great Lakes Area .NET User Group at http://migang.org.

Wednesday, September 12, 2012 3:24:10 PM (GMT Daylight Time, UTC+01:00)
# Tuesday, September 11, 2012

Last week, I demonstrated how to embed code directly into a SQL Server Reporting Service (SSRS) report.

In this article, I will explain how to reference code in an external assembly from an SSRS report. The basic steps are

  1. Create External Code
  2. Create Unit Tests
  3. Deploy the assembly to the Report Server
  4. Add a reference to the assembly
  5. Call external functions in Expression Editor
  6. Deploy Report

Create External Code

The first step is to create and compile the external code. The project type will be a Class Library and you will add a public class with a public static method. This code can be in C#, Visual Basic, or F#.
A sample is shown below in Listing 1.

using System;

namespace ReportFunctions
    public class ReportLib
        public static string FormatAs2Digits(decimal? input)
            if (input == null)
                return "N/A";
                return String.Format("{0:##,##0.00;(##,##0.00)}", input);

Listing 1

Compile this code in Release mode

Create Unit Tests

It's a good idea to create unit tests around this code because it can be difficult to test it on the Report Server.
At a minimum, write tests that mimic how you expect to call the function within your reports.

Deploy Assembly to Report Server

In order to use the functions, you must deploy the compiled DLL to the report server. You can either create a Setup  project to create an MSI package or you can simply copy the DLL to the drive where SQL Server Reporting Services is installed in the following folder on the SQL Server installation drive:

\Program Files\Microsoft SQL Server\Instance_Name\Reporting Services\ReportServer\bin

where Instance_Name is the name of the instance of SQL Server on which SSRS is running.

Add a reference to the assembly

Open your Report project and open the report that will call the custom function. From the menu, select Report | Report Properties. Select the References tab (Fig. 1).

Fig. 1 – “Reference” tab of Report Properties

Browse to select the deployed assembly containing the code you want to call.

After adding the reference, you will need to compile the Report project before you  can use the assembly functions. To compile the report, select Buld | Build Solution from the menu.

Call external functions in Expression Editor

Open an expression editor and call a function in the external assembly. You will need to include the entire namespace and classname. In our example, this be

An example is shown in Fig. 2.

Fig. 2 – Expression Editor

You can test that the expression works by clicking the Preview tab of the report.

Deploy Report

The final step is to deploy the report. Assuming you have permissions on the Report Server and the report sever is set in the project properties, the easiest way to deploy is to right-click the report in the Solution Explorer and select Deploy.

Now you can test the report and the function on the Report Server.


In this article, we described how to call code in an external assembly from a SQL Server Reporting Services report.

.Net | SQL Server | SSRS
Tuesday, September 11, 2012 10:20:41 PM (GMT Daylight Time, UTC+01:00)
# Monday, September 10, 2012
Monday, September 10, 2012 6:44:00 PM (GMT Daylight Time, UTC+01:00)