# Friday, December 4, 2009

I was talking to a fellow MVP here in Hong Kong today about the PDC. He said that since I get to go to all of these events as a speaker it must be great to watch all of the sessions and learn about all of the new technology. The problem is that when you are speaking you almost never get to attend other sessions. If you have a few sessions, you are always either getting ready, speaking, or relaxing after your talk. (Believe it or not, it is tiring to speak at these events.)

I only had one talk at the PDC and it was a BOF, so I did get to attend a few sessions. The funny thing is that I circled 10 sessions. Three where when I was speaking, two had conflicts with others, one was at 8:30am, and one conflicted with a RD meeting. So I attended 3 sessions besides the keynotes. That actually is a lot for me at one of these events.

The good news is that the PDC puts all of its sessions online for free. Why free? Read the book “Free” by Chris Anderson, it will explain how putting the sessions online for free actually increases the prestige of the conference and allows them to make more money.

You can watch all of the videos online for free at the PDC website. If you want to watch them offline you can also download all of the videos to your hard drive. The directions are on the PDC page, however, I had to use the 32 bit version of the cURL tool to get it to work on x64 Windows 7 for some reason. You may want to download the X32 version and save yourself the trouble.

Now you can download all the videos and watch them at your own pace.  I have watched about 15 sessions in the past two weeks since I have been home. Enjoy!


posted on Friday, December 4, 2009 1:27:33 AM (Eastern Standard Time, UTC-05:00)  #    Comments [0] Trackback
# Wednesday, December 2, 2009

Yesterday I showed how to use Telerik OpenAccess, Telerik Reporting, and SQL Azure to create reports and view them in ASP.NET. Today i will show how to view that same report in Silverlight using the industry’s first native Silverlight report viewer. All of this is in the Telerik documentation, however, since we have our cool SQL Azure demo already up and running from yesterday, I figured it would be fun to show how to reuse the same report and view it in Silverlight.

Getting Started

Remember from yesterday that we have three projects in our solution:

  • Telerik.Reporting.DAL-the class library project containing our OpenAccess entities (mapped back to SQL Azure tables)
  • Telerik.Reporting.RptLib-the class library project containing our Telerik report using the DAL project as a data source
  • Telerik.Reporting.Web-the ASP.NET application containing our Report Viewer control, allowing the users to view the report

Now we will add a Silverlight project named Telerik.Reporting.SL that will use the Telerik.Reporting.Web application as its ASP.NET host.


The Telerik Reporting WCF Service

Since all data access in Silverlight has to be an asynchronous service, we have to send our report down to our Silverlight application as a WCF service. At the end of the day a Telerik Report is just a plain old .NET class, so we can easily send it down via WCF. The good news is that a lot of the WCF plumbing has been taken care of for you by the Telerik Reporting service. Let’s get started.

First we have to set a reference in our ASP.NET host application (Telerik.Reporting.Web) to Telerik.Reporting.Service. Next add a WCF service to your project, named ReportService.svc. This will also automatically add a reference to System.ServiceModel for you.

Now delete everything in the SVC file and replace it with this:

<%@ServiceHost Service="Telerik.Reporting.Service.ReportService, Telerik.Reporting.Service, 
Version=, Culture=neutral, PublicKeyToken=A9D7983DFCC261BE" %>

Note: you have to make sure that the version number you are using is the same as mine. You can get your version number by clicking on the Telerik.Reporting.Service reference in the solution explorer and looking at the version property.


Next you will have to add the WCF endpoint to the configuration section of the web.config of the same ASP.NET project that has the ReportService.svc WCF service. (You can copy this code to paste as is into your application from the Report Service support page.)

   <serviceHostingEnvironment aspNetCompatibilityEnabled="true" />
     <service name="Telerik.Reporting.Service.ReportService" 
      <endpoint address="" binding="basicHttpBinding"
           <dns value="localhost" />
       <endpoint address="resources" 
       <endpoint address="mex" binding="mexHttpBinding" 
          contract="IMetadataExchange" />
       <behavior name="ReportServiceBehavior">
         <serviceMetadata httpGetEnabled="true" />
         <serviceDebug includeExceptionDetailInFaults="false" />
       <behavior name="WebBehavior">
         <webHttp />


That is it for the Telerik WCF Reporting Service. Now let’s add a ReportViewer to our Silverlight application.

Using the Telerik Silverlight Report Viewer Control

The Telerik Silverlight Report Viewer offers native report viewing support for Silverlight. It uses the same rendering engine and offers the same functionalities as the other Telerik viewers, so your report will render the same in Silverlight as in Windows Forms as ASP.NET. To get started, you need to add a reference to the Telerik Silverlight controls in your Telerik.Reporting.SL project:

  • Telerik.Windows.Controls.dll
  • Telerik.Windows.Controls.Input.dll
  • Telerik.Windows.Controls.Navigation.dll

These controls are located in the following folder:

Program Files\Telerik\RadControls for Silverlight Q3 2009\Binaries\Silverlight\

In addition, you need to add a reference to the ReportViewer:

  • Telerik.ReportViewer.Silverlight.dll

This library is located in Program Files\Telerik\Reporting Q3 2009\Bin\

Lastly, add a reference to our report project: Telerik. Report.RptLib.

Now you can add the report viewer namespace and control to your XAML:

   1:  <UserControl
   2:      xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" 
   3:      xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
   4:      xmlns:d="http://schemas.microsoft.com/expression/blend/2008" 
   5:      xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006" 
   6:      mc:Ignorable="d" 
   7:      xmlns:Telerik_ReportViewer_Silverlight=
   8:       "clr-namespace:Telerik.ReportViewer.Silverlight;
   9:        assembly=Telerik.ReportViewer.Silverlight" 
  10:      x:Class="Telerik.Reporting.SL.MainPage"
  11:      d:DesignWidth="640" 
  12:      d:DesignHeight="480">
  13:    <Grid x:Name="LayoutRoot">
  14:        <Telerik_ReportViewer_Silverlight:ReportViewer 
  15:          Margin="0,0,20,8" 
  16:          ReportServerUri="../ReportService.svc" 
  17:          Report="Telerik.Reporting.RptLib.CustomerRpt, 
  18:              Telerik.Reporting.RptLib, Version=, 
  19:              Culture=neutral, 
  20:              PublicKeyToken=null"/>                                                  
  21:    </Grid>
  22:  </UserControl>


Note: The Telerik support page for the Silverlight Report Viewer is a good reference for the code needed and you can copy and paste from there instead of from here. Alternatively, you can use Expression Blend to add the report to your XAML form and you don’t have to worry about the namespaces and XAML for the ReportViewer, Blend will take care of that for you, all you have to worry about are the ReportServiceUri and Report properties. If you are not using Blend, just make sure that the properties are in the correct order in the XAML (ReportServiceUri first, Report second) or you will get some nutty bugs. (Ask me how I know this!)

You are going to have to set two properties of the ReportViewer control (either manually in XAML or in Blend):

  • ReportServiceUri: or the absolute or relative path back to the WCF service in the ASP.NET solution
  • Report: or the assembly qualified name of your report class


How to find the assembly qualified name of your report? I was confused at first too. There are some PowerShell tools, etc, but I am PowerShell challenged. Instead, just add a label to an ASP.NET WebForm in the Telerik.Reporting.Web project and on the page load event add this code:

   1:  Type ty = typeof(Telerik.Reporting.RptLib.CustomerRpt);
   2:  Label1.Text = ty.AssemblyQualifiedName;

Then run the page in the browser and copy and paste the fully qualified assembly name into your XAML as I did. :)


That is it. Next step is to set your Slverlight test page as startup and F5. The ReportViewer supports native printing and export capabilities to PDF, XLS, Excel, etc. Pretty cool.



Technorati Tags:
posted on Wednesday, December 2, 2009 7:20:54 AM (Eastern Standard Time, UTC-05:00)  #    Comments [0] Trackback
# Tuesday, December 1, 2009

Telerik Reporting is a great reporting package. If you using it, you may be happy to know that you can use Telerik OpenAccess as a data source. Let’s take a look at how to use it with a SQL Azure Database as a back end.

Getting Started

First you need to map your SQL Azure tables to OpenAccess entities. I demonstrated this before on my blog, if you have not used OpenAccess and SQL Azure yet, read this post. (Don’t worry I’ll wait.) What I did for this demo is create a library project called Telerik.Reporting.DAL and mapped all of the Northwind tables in my SQL Azure database to OpenAccess entities in a class library.

Next I created another library project to contain the reports called Telerik.Reporting.RptLib. This solution will contain all of your reports. It is good to create all of the reports inside one isolated solution so you can reuse these reports in an ASP.NET solution as well as other projects like Silverlight. After we created this project, I ran the OpenAccess enable project wizard to get all of the proper references set up to use OpenAccess. In addition, I set a reference to our Telerik.Reporting.DAL project so we can see the entities we just mapped.

Creating a Report

Now it is time to create a report. Just right click on the project and select Add| New Item and choose the Telerik Report Q3 2009 template from the Reporting category.


The Telerik Reporting Wizard will come up. Select the option to build a new report and a new data source. For a data source type, select Business Object from the options available.


Next drill down into the Telerik.Reporting.DAL namespace and then select the Customer entity.


The next few pages of the wizard ask you how to lay out your report and what data fields to choose from. The wizard is self explanatory, so I will not go into detail here, but just choose any style that you like and show some customer fields on the report. I choose to show Customer ID and Company Name in standard report. My report looks pretty basic in design view:



Wiring up the data

We are almost there. Next step is to write a little LINQ code behind your report to wire up the OpenAcces data source with your report. Right click on the design canvas of the report and select “View Code.” That will take you to the code behind. Create a function like the one below that uses the OpenAccess LINQ implementation and return all of the customers (We could more complex LINQ queries here if we wanted to. )

   1:  public static List<Customer> GetCustomers()
   2:  {
   3:      //LINQ Query to fetch all of the Customers via OpenAccess            
   4:      //data context (IObjectScope)
   5:      IObjectScope dat = ObjectScopeProvider1.GetNewObjectScope();
   6:      //Get a ILIst of Customers
   7:      List<Customer> result = (from c in dat.Extent<Customer>() select c).ToList();
   8:      return result;
   9:  }

The function above returns a List of Customers. The IObjectScope in line 5 is the data context and the LINQ statement is in line 7.

But we have one problem. While we set all of the proper references, we are missing a bunch of using statements. You can manually add them here:

   1:  using System.Collections.Generic;
   2:  using System.Data;
   3:  using System.Linq;
   4:  using Telerik.OpenAccess;
   5:  using Telerik.Reporting.DAL;


Or you can use the new Telerik JustCode tool to organize and fix your using statements:


You need to add one more line of code to your report. Add the following to the report’s construtctor, it will wire up your function as the data source of the report:

   1:  DataSource = GetCustomers();

The ReportViewer Control

Now it is time to view the report. To do that create a new ASP.NET application called Telerik.Reporting.Web. Set a reference to the Telerik.Reporting.RptLib project where the report you just created is located. After that drag a Telerik ReportViewer control from your palate to the ASP.NET web form.


All you need to do now is add one line of code to the page load event (or a button click event, etc) to load the CustomerRpt we just built into the ReportViewer.

   1:  if (!IsPostBack) { ReportViewer1.Report = new CustomerRpt(); }

Next step is to run it and see your report in action!



Technorati Tags:
posted on Tuesday, December 1, 2009 9:24:03 AM (Eastern Standard Time, UTC-05:00)  #    Comments [0] Trackback
# Monday, November 30, 2009

I have been a fan of ADO.NET Data Services (Astoria) for a long time. Last week at the PDC, Microsoft unveiled the new name for ADO. NET Data Services: WCF Data Services. That makes sense since Astoria was built on top of WCF, not ADO .NET. I thought that Astoria was a cool code name and that ADO.NET Data Services sucked as a product name. At least WCF Data Services sucks less since at least it is more accurate and reflects the alignment of WCF, REST capabilities of WCF, and RIA Services (now WCF Data Services).

Astoria, I mean WCF Data Services :), is a way to build RESTful services very easily on the Microsoft platform. Astoria implements extensions to ATOMPub and uses either ATOM or JSON to publish its data. The protocol that Astoria used did not have a name. Since other technology was using this Astoria protocol inside (and even outside of) Microsoft, Microsoft decided to give it a name and place the specification under the Open Specification Promise. Astoria’s protocol is now called: the Open Data Protocol, or OData.

If you have been using Astoria and liked it, not much is different. What is cool is that other technology is now adopting OData including: SharePoint 2010, SQL Server 2008 R2, PowerPivot, Windows Azure Table Storage, and 3rd party products like IBM’s WebSphere eXtreme Scale.

With all of this technology supporting OData, Microsoft created the Open Data Protocol Data Visualizer for Visual Studio 2010 Beta 2. The tool gives you the ability to connect to a service and graphically browse the shape of the data. You can download it from here or search the extensions gallery for Open Data. Once you have it installed you can view OData data very easily. Here is how.

To get started you first have to create a WCF Web Data Service. I just mapped Northwind to an Entity Data Model using the Entity Framework and then created the WCF Data Service. Then I added a console application and set a service reference back to that Astoria Service. My projects looks like this:


To start the OData Protocol Data Visualizer, just right click on the Service Reference and click “View in Diagram.” This “View in Diagram” menu option will show up when you have a Service Reference that is OData compatible, whether you created it or not. (Meaning if you have a Sharepoint list as your service reference, it will work as well.)


This brings up the diagram canvas and corresponding OData Protocol Model Browser.


From here you can select an entity from the Model Browser and drag it onto the canvas. I dragged over the Customer entity and right clicked and was able to add all related entities.


From here you can interrogate your model and start to learn about it, all in Visual Studio. This is a great little add-in!


Technorati Tags:
posted on Monday, November 30, 2009 7:43:07 AM (Eastern Standard Time, UTC-05:00)  #    Comments [0] Trackback
# Wednesday, November 25, 2009

Microsoft has released a new .NET Stories site that features real developers and their stories about building .NET applications. Sure the site is a marketing site, however, it is pretty cool since the stories are true and very varied. There are stories that integrate SharePoint, SQL Server R2 and Win7. 

I spent some time reading over the case studies and watching the videos and some of the apps blew me away. What is cool is that Microsoft is looking for more. You can submit your .NET app to a contest and get a chance to win a 12-day Galapagos Islands trip or a Smart Car! You can also get featured on their wall of fame.

Having been to the Galapagos, I can tell you, this is an amazing offer. If you are selected, Microsoft may even take your photos and dress you up as Dr. Efficiency, or something like that.

Good luck!

posted on Wednesday, November 25, 2009 9:21:09 PM (Eastern Standard Time, UTC-05:00)  #    Comments [0] Trackback
# Tuesday, November 24, 2009


Another Firestarter event is coming to the NY/NJ area!  If you’ve been to any of the previous Firestarter events, then you’ll know this one will be sure not to disappoint!  Firestarter’s are a full day event where we focus on a single technology and take attendees from intro to guru in hours.  The goal is for attendees to come away fired up and ready to start using the technologies or methodologies right away.

The Agile Firestarter in NYC that I helped plan and spoke at and back in June 2009 was super popular and a huge success and now it is time to have one in NJ! Are you just starting out with Agile, XP or Scrum and need to get up to speed? Or do you know a thing or two about Agile but want to learn the basics so you can implement it in your organization?  Then this Firestarter is for you!


Registration just opened this morning (Nov 25th).  There are a limited number of seats available for this event, so register quickly if you want in.  Previous Firestarter events have all sold out!  So do it before you head off for a turkey stuffed extended weekend! :)


Saturday, December 12, 2009 from 8:30 AM - 5:00 PM (ET)

Microsoft Office - Iselin, NJ
Microsoft Office - Iselin, NJ


Microsoft Office (Iselin)
194 Wood Avenue South (Prudential Building)
Sixth Floor
Iselin, NJ 08830

The Agenda:

  • Introduction to Agile
    A high-level introduction to Agile concepts and values from the software developer's perspective.
  • SOLID:  OO Principles
    This presentation will examine the five key design principals used on agile project and how to use them to build out an adaptive system over several cycles.
  • Test-Driven Design & Development
    An introduction to Unit Testing and Test-Driven Development, showing how this approach helps keep your code adaptable to change
  • Agile Estimation & SCRUM
    An overview of the concept of agile estimation and the notion of re-estimation
  • Domain Driven Design
    An introduction to the core principles for applying a Domain Driven Design approach and how it fits into the agile development life cycle.
  • Continuous Integration
    This session shows how to centralize your quality assurance efforts and help keep developer productivity high (and defect count low!)

The Presenters:

  • Stephen Bohlen
    Currently a Senior Software Engineer for FirstPaper, LLC, a start-up in the world of digital media, Stephen brings his varied 15-year-plus experience as a former practicing Architect, CAD Manager, IT Technologist, Software Engineer, CTO, and consultant to the design and delivery of Software Engineering Solutions.Stephen is an active contributor to several Open-Source Software projects including NHibernate, NDbUnit, and others as well having developed a number of Visual Studio productivity add-ins. Active in the local NYC software development community, Stephen speaks publicly, blogs regularly, and is the author of several popular screencast series focused on Agile and ALT.NET concepts and technologies including the widely-praised 15-part Summer of NHibernate video series introducing viewers to the popular open-source O/RM tool and the Autumn of Agile series that takes viewers through the design, planning, and construction of an entire .NET project in an Agile context. He is also a contributor of a number of shorter screencasts available on Dimecasts.NET and elsewhere. Stephen is also a founding/organizing member of the NYC ALT.NET user group which meets monthly to discuss Agile-focused techniques and technologies in the world of Microsoft software development and beyond.
  • Jess Chadwick
    Jess is an independent software consultant specializing in web technologies. He has over 9 years of development experience ranging from embedded devices in start-ups to enterprise-scale web farms at Fortune 500s. He is an ASPInsider, Microsoft MVP in ASP.NET, technical editor of the recently-released Silverlight 3 Programmers Reference (WROX) and leader of the NJDOTNET Central New Jersey .NET user group.
  • Sara Chipps
    Sara is a developer specializing in web applications, an irreverent blogger at GirlDeveloper.com, and a writer for Datamation.com. She enjoys participating in and organizing community events such as Code Camps and most recently NJ Tech Drinks and Concept Camp, an opportunity for nerds to go camping together.
  • Peter Laudati
    Peter Laudati, the "JrzyShr Dev Guy," is a Developer Evangelist with Microsoft, based in the New York/New Jersey area. One of his roles is supporting and educating Microsoft customers working with the .NET development platform. Peter supports the community of .NET developers in the NY Metro area by speaking at user group events and Code Camps. Peter is also the co-host of the “Connected Show”, a new podcast covering Microsoft technology with a focus on interoperability.  His blog can be found at http://www.peterlaudati.com.
  • Todd Snyder
    Todd is a MCSD in .Net and a MCTS in SharePoint & Biztalk. He works in the Infragistics Experience Guidance Group (XDG) as the developer team lead. In his role as the XDG developer team lead Todd is responsible for making sure the samples include with Net Advantage showcase the capabilities of the product and help educate developers on how to tap into those capabilities. Prior to joining Infragistics Todd spent several years working as consultant helping customers build enterprise .Net applications.
Technorati Tags:

  Technorati Code: YJQU3Z2SWF46

posted on Tuesday, November 24, 2009 5:39:35 PM (Eastern Standard Time, UTC-05:00)  #    Comments [0] Trackback
# Monday, November 23, 2009

Last week at PDC, Telerik launched a new product named JustCode. It was a stunning success since we had a lot of people show up for the launch and we gave away 1,000 free licenses at the event. Back in March at a planning meeting at Telerik HQ, we decided that we would embark on an Apple style “secret” strategy and go for the most buzz at launch.

Back at that meeting in March we decided that secrecy, which goes against a lot of our values at Telerik, would be required for the most buzz at the launch. But keeping a secret is not easy in the world of Twitter, blogs, and Facebook. Back in March only the development team, their closest buddies, and the senior management knew about JustCode. But that had to change soon as we started to dogfood JustCode a month or so later at Telerik. We were certain if we communicated the goal of being secret that there would not be any leaks. At the same time we decided to extend JustCode outside Telerik to a handful of vendors (super thanks to Imaginets for not only building the Work Item Manager and Dashboard, but doing it with clunky pre-alphas of JustCode.) A little later on, we also gave a super early look to the Telerik MVPs and DevReach speakers. Nobody let the news out.

Nobody that is, except me- one of the architects of the “secret” plan.

The fist boo-boo I made was mention it to a fellow Telerik employee back in March just after that meeting. Oops, but no big deal, it was at least in the family.

The next snafu was in Durban, South Africa, back in August. I was speaking at TechEd South Africa and I used my non-presenter VPC to do one of my demos since that had the particular Silverlight 3.0 bits on it and my presentation VPC had only Silverlight 2.0 (long story but a different demo needed SL 2.0 at the time. Remember SL 3.0 only shipped the week before..) My non demo VPC of course had JustCode early alpha on it since we were dogfooding it at Telerik. Most of you know me and know that I love to write a lot of code in my sessions. Well I had to do some refactoring in one of my talks and boom, without thinking, used JustCode on stage. Big oops! Luckily the handful of folks who came up to me after to ask “do you have a super fast beta of Resharper on your machine?” were sworn to secrecy and kept their word of the secrecy of JustCode. (The free license I promised them also didn’t hurt.)

Next came the awesome video product teaser that generated a lot of buzz. If you didn’t see it, watch it here.

Next came Basta in Germany in September. Our marketing team printed up flyers with all of our products on it. Somehow JustCode made it to the flyer! After a few frantic calls back and forth, the team at Basta decided that we would test the waters and give the flyers out. The first person who noticed it asked if we support F#. Everyone who came to the booth was sworn to secrecy.  After Basta the flyers were destroyed. (Look for a few of them on eBay, they are now a collector’s item.)

Lastly was the day of the launch. I was wearing a JustCode tee shirt well before the launch. I was filming an MSDN video and also speaking at my BOF talk, so Stefan decided to put tape over the “Code” on my tee shirt to generate some buzz. It worked but I took the tape off and put it back on about an hour before the launch to reposition the tape for the unveiling, and the C and E were now showing, so people were able to guess.

Despite my attempts to sabotage our well laid plans, the launch went great. Note to Telerik: next time don’t tell me the secret product launch!

Technorati Tags: ,
posted on Monday, November 23, 2009 3:22:34 AM (Eastern Standard Time, UTC-05:00)  #    Comments [0] Trackback
# Friday, November 20, 2009

As I sit in my hotel room recovering from my PDC Hangover and reflecting on the past week, the Day 2 keynote by Steven Sinofsky was the highlight for me.

You may be thinking, yea yea, lucky bastard, you got a free laptop. Sure that was awesome, but that is not what stuck out most in my head. The most important thing that Sinofsky did was to be brutally honest with the audience. This represents a new attitude from Microsoft.

Sinofsky admitted Vista’s flaws. To prove that he got it, he even showed some of the annoying dialogs and videos of customers doing useability testing with those annoying dialogs. (He did follow up with some of the changes Windows 7 made and some of customer useability tests.)

Then he moved to IE 9 development. I remember the Microsoft of the browser wars era. The one where Bill Gates would get on stage in front of 20,000 people at COMDEX and never say the words “Netscape” but rather “down level browser.” At the PDC keynote, Sinofsky  said the words “Firefox” and “Google Chrome”. Not only did he say those words, he showed charts at how slow IE 8 is compared to Chrome, Safari, and Firefox. Of course he was also showing how IE9 will be just as fast, but he is openly admitting in front of 5,000 people and live on streaming video that IE 8 sucks.


He also talked about how IE 8 fails the ACID 3 Standards Test. I ran it here and IE 8 gets a pathetic 20 out of 100:


Then Sinofsky talked about IE9 and the Acid 3 test. IE 9 gets a pretty sad 32, but he showed it anyway and promised to get better.


I also like Sinofsky because he is accessible. When Win7 went RTM to MSDN last summer, I sent a message complaining about what I thought was a bug to an internal Microsoft email alias. Sinofsky replied to me personally with a solution (on a weekend), and it was soon clear to me that the problem was caused by something that I did, not Win 7. I followed up with some thanks for the solution and told him that the real problem was somewhere “between the chair and the keyboard.” He even replied back again saying no problem and we had a few more mails in the thread and a good laugh. This is a very busy VP in charge of one of the most widely used products in the world taking time out to talk and troubleshoot with a customer.

You may be thinking, sure Steve but you are an MVP and RD. Well at the PDC in the afternoon after they gave us the laptops, Sinofsky spend about an hour or two walking around looking for people in the cafe playing with their new laptops. He stopped and chatted with each person asking how they liked it, did the touch live up to their expectations, etc. Then he went to the expo hall and did a book signing (with free copies of his book) and even posed for photos with anyone who wanted as he signed the book.

This level of accessible and honesty is simply amazing. Keep it up Microsoft.

Technorati Tags:
posted on Friday, November 20, 2009 4:31:29 PM (Eastern Standard Time, UTC-05:00)  #    Comments [0] Trackback