Building an app marketplace with MEF (MEF/Silverlight 4 tutorial)

by Gill Cleeren 4 September 2010 21:25

In April, I was in the UK for speaking at the VBUG conference and I was impressed by a demo given by Josh Twist. He built using MEF and WPF a “marketplace” application. The goal of the application was mainly showing the dynamic capabilities of adding new functionality to an application through MEF (or in full, the Managed Extensibility Framework for Silverlight 4).

For a presentation I’m giving shortly, I rebuilt something similar but in Silverlight: the MEF Marketplace in Silverlight. The setup is the following: a user gets an overview of apps he purchased in the market place and can run these on demand. The market place app will download the applications available to the user after the application has started, so this app mainly is a hosting shell for the other ‘purchased” applications to run in. Of course, the sample is a demo and can be extended quite a lot. For example, in the current implementation, I hard-coded the list of purchased apps and there’s no option to buy new ones. Also, it could be extended so that when new apps are purchased, a duplex service notifies the client of this and MEF downloads the new app in the background.

But, instead of talking of what could be added, let’s take a look at what I currently built already! Here’s a screenshot of the application showing the "purchased” applications.

SNAGHTMLaf6bd

And here’s one of the apps (the Flickr Image search) running inside the "market place shell”.

SNAGHTMLb8796

Time for some code. Let’s begin with the market place itself.

I defined a contract interface for all applications that can be loaded in the market place, IMarketPlaceApplication.

public interface IMarketPlaceApplication
{
    string ApplicationName
{ get; }
    FrameworkElement MarketPlaceIcon { get; }
    FrameworkElement MainView { get; }
}
This interface defines that all my apps will (of course) have a name, a default view which will load as the landing screen when the app is loaded (MainView.xaml) and an icon to show in the list (MarketPlaceIcon.xaml). As these 2 latest ones are XAML files, you can put in whatever you like.

A very easy application that will be possible to load from MEF is the HelloWorldApplication. The project structure of this app is as follows:

image

As you can see, there’s a class called HelloWorldApplication, which implements the IMarketPlaceApplication and 2 xaml files. The HelloWorldApplication code is shown below:

[Export(typeof(IMarketPlaceApplication))]
public class HelloWorldApplication:
IMarketPlaceApplication
{
 
    #region IMarketPlaceApplication
Members
 
    public string ApplicationName
    {
        get { return "Hello
MEF world"; }
    }
 
    [Import(typeof(Icon))]
    public FrameworkElement
MarketPlaceIcon
    {
        get;
        set;
    }
 
    [Import(typeof(HelloWorldView))]
    public FrameworkElement
MainView
    {
        get;
        set;
    }
 
    #endregion
}

This is our first encounter with MEF. The first line uses the Export attribute. This class is saying that it is available for someone to use, when someone requests an instance of IMarketPlaceApplication. A bit further, we are using the Import attribute on both the MarketPlaceIcon and the MainView. Here we are saying: MEF, search us a class that’s exporting itself as type Icon and HelloWorldView respectively.

These 2 latter instances will be inserted by MEF upon executing the application, that is, if MEF finds the corresponding export. These exports can be found in the 2 XAML files (in the code-behind). The HelloWorldView.xaml.cs code is shown next. Note the Export attribute: we’re telling to MEF that this type can be used where an Import is requested of the HelloWorldView type.

[Export]
public partial class HelloWorldView
: UserControl
{
    
    public HelloWorldView()
    {
        InitializeComponent();
    }
}

The Icon.xaml.cs is pretty similar code-behind-wise (I think I invented that term here): here alse we are adding an Export attribute.

[Export]
public partial class Icon
: UserControl
{
    public Icon()
    {
        InitializeComponent();
    }
}

The HelloWorldApplication is at this point a stand-alone application (it compiles to its own XAP file), but we’ll now build the Market Place shell that will host this app. The code download at the end of the article contains several sample applications (a Flickr app and a Facebook app).

Similar to a real market place application, our implementation will get a list of apps you purchased previously. Only these are available to you and will be shown. To get this list, I wrote a basic Silverlight-enabled WCF service that fetches this list of available applications. This service is hosted in this case in the hosting website. The code below shows this service, which in this case returns a hard-coded list of apps (note that I have some more apps already added here).

[ServiceContract(Namespace = "")]
[AspNetCompatibilityRequirements(RequirementsMode = 
    AspNetCompatibilityRequirementsMode.Allowed)]
public class MarketPlaceService
{
    [OperationContract]
    public List<MefApplication>
GetAvailableApplicationsForUser()
    {
        return new List<MefApplication>()
        {
            new MefApplication(){ApplicationName="Flickr
Image Search", 
                XapFileName="FlickImageSearch.xap"}, 
            new MefApplication(){ApplicationName="Hello
World", 
                XapFileName="HelloWorldApplication.xap"},
            new MefApplication(){ApplicationName="MEFacebook", 
                XapFileName="FacebookApplication.xap"}
        };
    }
 
    //
Add more operations here and mark them with [OperationContract]
}
 
[DataContract]
public class MefApplication
{
    [DataMember]
    public string ApplicationName
{ get; set; }
 
    [DataMember]
    public string XapFileName
{ get; set; }
}

The service uses the MefApplication class as a helper class: it contains the name of the application and more importantly, the name of the XAP file (this could easily be replaced with a Uri to the XAP file).

In the MefMarketPlace, the Silverlight Market Place application, we can create a web reference to this service. In the App.xaml.cs, I add a call to a new method, DownloadMyApplicationList():

private void Application_Startup(object sender,
StartupEventArgs e)
{
    DownloadMyApplicationsList();
    this.RootVisual
= new MainPage();
}

This new method makes the service call to get a list of available XAPs that I can use (apps that I purchased).

void DownloadMyApplicationsList()
{
    AggregateCatalog = new AggregateCatalog();
 
    container = new CompositionContainer(this.AggregateCatalog);
    CompositionHost.Initialize(container);
 
    MarketPlaceService.MarketPlaceServiceClient client = 
        new MarketPlaceService.MarketPlaceServiceClient();
    client.GetAvailableApplicationsForUserCompleted += 
        new EventHandler<MarketPlaceService.GetAvailableApplicationsForUserCompletedEventArgs>
            (client_GetAvailableApplicationsForUserCompleted);
    client.GetAvailableApplicationsForUserAsync();
}
 
void client_GetAvailableApplicationsForUserCompleted(object sender, 
    MarketPlaceService.GetAvailableApplicationsForUserCompletedEventArgs e)
{
    if (e.Error
== null)
    {
        AvailableApplicationsForUser = e.Result;
        InitializeCatalog();
    }
}

In the callback method of the service, I call InitializeCatalog(). MEF has the concept of Catalogs: a Catalog can be used to tell MEF where it has to look for Parts. Several types of catalogs exist in MEF for Silverlight: the TypeCatalog, the AssemblyCatalog, the DeploymentCatalog and the AggregateCatalog. A TypeCatalog basically allows us to register a specific type with MEF: if I want MEF to know about a certain Export, I can register it in a TypeCatalog. An AssemblyCatalog tells MEF to look for parts in a specific assembly. The DeploymentCatalog allows us to specify a XAP file and MEF will look in the assemblies therein for parts. It also allows us to asynchronously download a XAP file. An AggregateCatalog can contain any number of other catalogs and more catalogs can be added at any time.

By default, if we don’t specify a Catalog for our application, MEF looks at the current XAP file and for each assembly it finds, it creates an AssemblyCatalog. It then combines these with an AggregateCatalog. That means that we can omit creating a catalog in our application: in this case, MEF will create a default one for us, with something similar to this code:

void InitializeCatalog()
{
    AggregateCatalog catalog = new AggregateCatalog();
 
    foreach (var
deployedPart in Deployment.Current.Parts)
    {
        StreamResourceInfo resourceInfo = 
            Application.GetResourceStream(new Uri(deployedPart.Source,
UriKind.Relative));
 
        Assembly assembly = deployedPart.Load(resourceInfo.Stream);
        catalog.Catalogs.Add(new AssemblyCatalog(assembly));
    }
 
    CompositionHost.Initialize(catalog);
}

Back to our application. If we look at the available catalogs in MEF, we can see that the DeploymentCatalog is a good candidate for what we need: we can use it to download a XAP file (the application that we want to load). After that, we can add each DeploymentCatalog to an AggregateCatalog. MEF will then make these available in our application and we can run the downloaded applications.

In code, this gives the following:

private CompositionContainer
container;
void InitializeCatalog()
{
 
    foreach (var
item in AvailableApplicationsForUser)
    {
        DeploymentCatalog deploymentCatalog = 
            new DeploymentCatalog(item.XapFileName);
        this.AggregateCatalog.Catalogs.Add(deploymentCatalog);
 
        deploymentCatalog.DownloadCompleted += (s, e) =>
        {
            //extend
to give meaningful error handling
            if (e.Error
!= null)
                MessageBox.Show(e.Error.Message);
        };
 
        deploymentCatalog.DownloadAsync();
    }
 
    container.ComposeParts(this);
}

You can see that I use a CompositionContainer here. The container is well, like the word says it, a container where MEF puts all the parts, shakes it up and creates/composes parts.

We now have the code that runs when we start the application: it gets a list of all the applications we can use over the service and then it downloads the XAP files of these apps asynchronously. Each XAP file is downloaded using a DeploymentCatalog and these are added to an AggregateCatalog. This now makes our downloaded applications available to run.

Let’s now take a look at the UI where we’ll run the apps from. The following screenshot shows the UI:

image

The “Load my apps'” button on the top right will execute a command on the viewmodel that will load all available applications in the ListBox on the left.

image

When clicking on the “Load app” button, the selected application (here the Flickr app) is loaded:

image

Clicking the “Home” button unloads the app and returns us to the list screen.

The complete XAML listing can be found in the code download. The most important part is shown below. Note that there’s a ContentPresenter used here and it’s bound to the MainView property of the SelectedApplication. The latter is a property exposed on the viewmodel (see further). If no view/app is selected, this ContentPresenter won’t be visible and we’ll see the default UI again.

<Grid x:Name="LayoutRoot" Background="Black">
    <Grid.RowDefinitions>
        <RowDefinition Height="*"></RowDefinition>
        <RowDefinition Height="60"></RowDefinition>
    </Grid.RowDefinitions>
    <Grid>
        ...
    </Grid>
 
    <ContentPresenter Content="{Binding
SelectedApplication.MainView}">
    </ContentPresenter>
    <Button Grid.Row="1" Content="Home" Margin="10" Background="#FFABE3FF" 
            Command="{Binding
HomeCommand}" BorderBrush="#FF00AAFF" 
            Style="{StaticResource
ButtonStyle1}" 
            Width="130" Height="40" HorizontalAlignment="Center" 
            VerticalAlignment="Center"></Button>
</Grid>

Time to look at the viewmodel now. Probably the most important part here is the ObservableCollection<IMarketPlaceApplication>:

[ImportMany(AllowRecomposition=true)]
public ObservableCollection<IMarketPlaceApplication>
Applications
{
    get
    {
        return _applications;
    }
}

The ListBox in the UI is bound to this collection and since it’s an ObservableCollection, the UI will reflect changes to this collection. That’s important here, since the list of available apps won’t be known after the shell contacted the service. Note that the collection property is attributed with the ImportMany attribute. This is a sign for MEF that more than one part that is exposing itself with the same Export attribute (same type) is allowed. By default, this isn’t allowed since MEF wouldn’t know which one to use. Here, we want the ImportMany since we know that more than one app will be available and they all need to be exported as an IMarketPlaceApplication. Another important thing to note here is the AllowRecomposition option we used here. AllowRecomposition tells MEF that if during the run of the app more Exports become available for this Import, it’s OK to add them, in other words, to rebuild the composition.

The ContentPresenter in the UI bound to SelectedApplication.MainView. The SelectedApplication property is shown next.

private IMarketPlaceApplication
_selectedApplication;
 
public IMarketPlaceApplication
SelectedApplication 
{
    get
    {
        return _selectedApplication;
    }
    set
    {
        _selectedApplication = value;
        NotifyPropertyChanged("SelectedApplication");
    }
}

NotifyPropertyChanged is a simple method that raises the PropertyChanged event of the INotifyPropertyChanged interface.

private void NotifyPropertyChanged(string p)
{
    if (PropertyChanged
!= null)
    {
        PropertyChanged(this, new PropertyChangedEventArgs(p));
    }
}

The “Load apps” button in the UI is bound to the LoadAppsCommand. I use the MVVM Light RelayCommand here. In the execute code of the ICommand, I ask MEF to satisfy the Imports of the current class (the viewmodel). This basically tells MEF to look at the catalogs and bring all the Export(typeof(IMarketPlaceApplication)) into the ImportMany.

public RelayCommand
LoadAppsCommand
{
    get
    {
        if (_loadAppsCommand
== null)
        {
            _loadAppsCommand = new RelayCommand(
                    () =>
                    {
                        CompositionInitializer.SatisfyImports(this);
                        loaded = true;
                    },
                    () =>
                    {
                        if (loaded)
                            return false;
                        return true;
                    }
                );
        }
        return _loadAppsCommand;
    }
}

The LoadSelectedApplicationCommand and the HomeCommand respectively set the SelectedApplication property to the selected application in the list or null.

public RelayCommand<IMarketPlaceApplication>
LoadSelectedAppCommand
{
    get
    {
        if (_loadSelectedAppCommand
== null)
        {
            _loadSelectedAppCommand = new RelayCommand<IMarketPlaceApplication>(
                    (a) => 
                    { 
                        SelectedApplication = a; 
                    }
                );
        }
        return _loadSelectedAppCommand;
    }
}
 
 
public RelayCommand
HomeCommand
{
    get
    {
        if (_homeCommand
== null)
        {
            _homeCommand = new RelayCommand(
                    () =>
                    {
                        SelectedApplication = null;
                    }
                );
        }
        return _homeCommand;
    }
}

With that, we have successfully implemented the MEF Marketplace. As said in the very beginning, this can be extended quite a lot. Add a duplex service and a buying system that pushes a message to the client and trigger the client to download the linked XAP file is a nice way to start. The complete file can be downloaded below.

Enjoy!

Code download: MefMarketPlace.zip (868.99 KB)



Snowball.be - The blog of Gill Cleeren
Click here to see the original post

Be the first to rate this post

  • Currently 0/5 Stars.
  • 1
  • 2
  • 3
  • 4
  • 5

Tags: , , , , ,

Snowball.be

SQL Server Day 2009 videos now available on Chopsticks

by Davy Knuysen 16 December 2009 10:10
Microsoft has made the sessions presented on SQL Server Day 2009 available on Chopsticks Opening Keynote by Wesley Backelant and Ritchie Houtmeyers Best Practices for SQL Server Consolidation by Tom Van Mulders Breaking the ETL world record with Integration Services by Henk van der Valk Designing Effective Aggregations in Analysyis Services 2008 by Chris Webb [...]
Click here to see the original post

Techdays 2009 Belgium slides and demos

by Gill Cleeren 12 March 2009 14:24

From March 10 - 12, TechDays 2009 Belgium took place, for the first time in Metropolis Antwerp.

I've delivered quite some sessions, including part of the keynote. A lot of people asked me to share the slides as well as the demos, so here are all the items you need to complete your knowledge on both databinding in WPF as well as skinning controls in Silverlight.

WPF Databinding Deep Dive
Databinding always sounds a bit intimidating. It’s the concept of attaching objects to a user interface and letting the technology take care of what to display where. WPF has a lot of capabilities in store to make databinding really easy and to help you build data-driven applications a lot faster. In this session, we’ll tackle everything that databinding offers us, from the fundamentals concepts to the advanced topics. With a lot of demos woven into the session, you’ll walk away with the knowledge you need to more efficiently use WPF.
Slide deck - Demos

Under the hood in Silverlight's controls skinning framework
While Silverlight offers us a lot of controls to build business applications, you might feel the urge to change them even more to suffice the needs of your application. A round button perhaps? Or a non-rectangular textbox? It’s all possible with the Silverlight skinning framework. In this session, you’ll see how to overhaul the look of your controls as well as create your own from scratch.
Slide deck - Demos

I hope you enjoyed the sessions, any feedback is welcome.



Snowball.be - The blog of Gill Cleeren
Click here to see the original post

Be the first to rate this post

  • Currently 0/5 Stars.
  • 1
  • 2
  • 3
  • 4
  • 5

Tags: , , ,

Snowball.be

Calling a web service from SQL Server 2005

by Valentino Vranken 11 November 2008 13:09
This may not be your daily routine but in today’s world of interoperability and loosely-coupled systems you sometimes don’t have another option.  Imagine a situation where a scheduled task (using SQL Agent) needs to get data from a web service or trigger some code through a web service. In the following explanation I will show how [...]
Click here to see the original post

Currently rated 5.0 by 1 people

  • Currently 5/5 Stars.
  • 1
  • 2
  • 3
  • 4
  • 5

Tags: , ,

A Developer's Blog

DIY: Alternative Reporting Services client

by Valentino Vranken 3 August 2008 13:50
The other day I was looking for an alternative Reporting Services client, as an extra client besides the web-based Report Manager. As I couldn’t really find one I thought “how difficult could it be to write one myself?”. And indeed, with the ReportViewer control in Visual Studio 2005 it’s really no big deal. All you need [...]
Click here to see the original post

Be the first to rate this post

  • Currently 0/5 Stars.
  • 1
  • 2
  • 3
  • 4
  • 5

Tags: , ,

A Developer's Blog

Become a hands-on SOA expert in 5 days

by N-Technologies 14 July 2008 15:51

We all know a good training will get you 50% of the way! http://www.ordina.be/soa

 


Click here to see the original post

Be the first to rate this post

  • Currently 0/5 Stars.
  • 1
  • 2
  • 3
  • 4
  • 5

Tags: , ,

N-Technologies

Excel Automation: the CultureInfo bug

by N-Technologies 7 June 2008 13:54

If you're doing some Excel automation like creating a sheet with some graphs from .NET, you may run into the "Old format or invalid type library" error which is quite nicely described in this Microsoft Support article.  At this moment there's no fix available, but the article describes not one, not two, but three workarounds.  I chose the third one where you switch the Culture for your thread to "en-US".

When giving this a try, it solved the error mentioned above but then I started getting "Exception from HRESULT: 0x800A03EC" errors.  After searching for a while I finally found the reason: you should not switch the Culture back to the original one after you've added your new Excel workbook as shown in the workaround.  First finish whatever you want to automate in Excel and switch the Culture back at the end.

In C# this looks like the following:

 1: //
code below assumes the following using statement
 2: //
using Excel = Microsoft.Office.Interop.Excel;
 3:  
 4: //
capture current Culture settings
 5: System.Globalization.CultureInfo
systemCultureInfo = System.Threading.Thread.CurrentThread.CurrentCulture;
 6: try
 7: {
 8: //
temporarily change CultureInfo to en-US
 9: System.Threading.Thread.CurrentThread.CurrentCulture
= new System.Globalization.CultureInfo("en-US");
 10: 
 11: Excel.Application
excelApplication = new Excel.Application();
 12: //
create new workbook
 13: Excel._Workbook
workbook = (Excel._Workbook)(excelApplication.Workbooks.Add(Missing.Value));
 14: //
get active sheet
 15: Excel._Worksheet
worksheet = (Excel._Worksheet)workbook.ActiveSheet;
 16: 
 17: //
create your graphs or whatever you were planning to automate in Excel
 18: 
 19: //
give the user control over Excel
 20: excelApplication.Visible
= true;
 21: excelApplication.UserControl
= true;
 22: }
 23: catch (Exception
ex)
 24: {
 25: //
handle exception
 26: }
 27: finally
 28: {
 29: //
put CultureInfo back to original
 30: System.Threading.Thread.CurrentThread.CurrentCulture
= systemCultureInfo;
 31: }

Click here to see the original post

Be the first to rate this post

  • Currently 0/5 Stars.
  • 1
  • 2
  • 3
  • 4
  • 5

Tags: ,

N-Technologies

Debugging a form hosted in the Visual Studio Designer

by N-Technologies 28 May 2008 21:03

Once in a while Visual Studio fails to open a form in the designer. Instead of displaying my form, it shows me an error message and a stack trace (White Screen Of Dead/WSOD). Chances are big that this stack trace does not point you to the root cause.

When this occurs, I will try to fix it by performing these steps:

  • Do a "Clean up" and "Rebuild" on the solution and reload the form
  • Close Visual Studio, reopen the solution and do a "Rebuild".

When these steps won't fix it, the error might be in your code and not in Visual Studio. This site explains how you can debug your own code when it gets executed within the Visual Studio Designer. The article can be summarized in 6 easy steps:

  1. Open a second instance of Visual Studio
  2. Go to "Tools"->"Attach to process..."
  3. Select devenv.exe (original Visual Studio) in the list and press the "Attach" button
  4. Go to "Debug"->"Exceptions..."
  5. Check "Thrown" on  all Common Language Runtime Exceptions
  6. Open the form in the original Visual Studio

When you reopen the form the second Visual Studio will break on the line that throws the exception. You can use the normal debugging tools (quick watch, breakpoints, call stack...) to locate the problem.


Click here to see the original post

Be the first to rate this post

  • Currently 0/5 Stars.
  • 1
  • 2
  • 3
  • 4
  • 5

Tags: , ,

N-Technologies

Ordina goes Redmond

by N-Technologies 21 April 2008 20:58

An Ordina-fellow went all the way to Redmond to visit Microsoft and attend the MVP Summit 2008. Here's the full report of my trip!

So you've been to Seattle?

Yes! I received the MVP award last January and I also became Regional Director. Every MVP or RD is invited once a year to go to Seattle and Redmond, just to say thank you. Of course, they do a lot more than just saying "thank you": as MVP, you get insight in upcoming (big) things from Microsoft, you get to know the product teams of your expertise and you get to say your opinion to fellow MVPs and the Microsoft teams. While you learn a lot of new stuff, the event also has a very social aspect.

Therefore, I decided at the end of January to go to Seattle and Redmond from April 13th until April 18th (sponsored by my company Ordina). Seattle Tacoma (SeaTac), the airport of Seattle, is about 10 hours of flight from here.

Day 0: baaaad start!

It couldn't all start any worse. We were to leave from Schiphol (we = Ilse Van Criekinge, Kris van der Mast, Joris Poelmans and myself). Upon arrival, only Ilse could check in. Kris and myself were directed to a counter were some employee had the news that the plane seemed overbooked. "This happens... but there's a 99% chance you'll still get on that plane. Check at the gate at 11.15am", she said. (The plane was to leave at 13.00). At 12.40, we still hadn't heard a thing from the KLM employees. Until all of a sudden, Kris's and my name were called, we got the 2 last seats. Joris however, couldn't get on, he had to wait 'till the next day before he could depart.

The flight itself was nice and quiet. We arrived in Seattle on time, around 14.00 local time. After we went to drop our luggage at the Sheraton hotel, we went for a walk through Seattle. Though it's quite a nice city, it's really rather small, smaller than I'd expected it to be.

 

We did pay a visit to "The Cheesecake Factory", where I had an enormous hamburger. In fact, it was so big, I couldn't eat any cheesecake anymore :-(. The burger was called a "Ton of fun burger". They got the "ton" part right...

   

After that, it was time to go to sleep. Day 1 was coming up, the opening of the event was almost there!

Day 1: Opening keynotes and Open Space principle

Monday afternoon, the event was opened. The keynote had a special touch to it, since it was the last event for Sean O'Driscoll, who lead the MVP program for many years. Although I don't know him personally, he really seemed like a nice guy.

 

After the opening, there was this new concept called Open Space, in which MVPs and RDs got the chance to debate over all kinds of different topics. The sessions I attended were very useful, in fact I picked up some really cool ideas that I certainly will be able to use very shortly. (Do note that most of the content of the summit is subject to an NDA (non-disclosure agreement), so I'm not allowed to talk in detail about topics :) ).

In the evening, I got to know my MVP lead, Gerard Verbrugge (finally ;-) ).

Day 2: Going to ... REDMOND!

OK, it might just seem a little bit overreacting, but it has always been a dream of mine to be able to visit the Microsoft Campus in Redmond. Below are some pictures of they way over there: the Washington Lake on a floating bridge.

Finally, we arrived at the Campus. Something that struck me immediately, was that it was not only Microsoft that was there: there were other companies there too. I had always thought it was like one big area, where there was nothing but Microsoft. Apparently, I was wrong on that one.

The campus consists of many small buildings, not higher than 4 stories (higher buildings are not allowed by building regulations). We were dropped at the Microsoft Convention Center, where most of the talks would take place. All over the campus, small and large buses are driving around, to get people from one place to another.

The first talk was given by Scott Guthrie, Microsoft VP. He gave a very interesting talk with some very good insight.

On day 2 also, I visited the Microsoft Company store. Again, I thought I arrived in heaven ;-) . I bought 5 interesting books there, that with the low currency rate of the dollar cost less than half there.

Day 2 was concluded with a dinner with the product team. I met Scott Guthrie again, Nikhil Khotari and Scott Hanselman, along with a lot of other people. Without knowing it, I was sharing the table with 2 other RDs!

   

Day 3: Redmond #2

Day 3 was filled again with a lot of interesting content. I took a shuttle and drove around the campus a bit. It's striking how very friendly and helpful everybody is over here. Whenever you think you're lost, someone will get you where you need to be!

At the end of Day 3, I met about 50 RDs and the RD lead. I also received a very nice gift from him and the pizza that we got... Now, that's what I call pizza!

The day was rounded up at the bottom of the Space Needle, in the "Experience Music Project" with a fine party with Japanese food, Guitar Hero and some performances. I had a nice long discussion with colleague-RD Grégory Renard.

Day 4: That's all, folks

The final day of the conference. I do admit, I expected not that much of this final day, since 3 closing keynotes were planned. Boy, was I wrong... Toby Richards opened the day with some interesting talk on the "almost-over" event, followed by a Q&A sessions with Ray Ozzie.

But the star of the day was surely Steve Ballmer! He gave a very inspiring talk that got the crowd laughing and cheering at the same time. I took some text from this article, because it really describes the feeling that was in the room that day:

"In the online area we've got a lot of users. We've got some big competitors. We've got some big whatevers — competitors or acquisition targets, whatever you want to call them. We've got a little bit of everything out there," Ballmer said.

Ballmer said Microsoft is the global leader in e-mail and instant messaging, but in Internet search — the biggest source of online revenue — "we are the clear No. 3 in the market."

In March, 59.8 percent of U.S. Internet searches were done with Google. Yahoo's search engine ranked No. 2, with 21.3 percent. Microsoft had 9.4 percent, according to online measurement company comScore.

Ballmer sought his own anecdotal measure of search share from the audience of IT pros, many of whom have dedicated their careers to becoming expert in Microsoft's products.

"How many of you use Live Search as your default?" Ballmer asked.

A smattering of hands went up. Tepid applause.

"How many of you use Yahoo search as your default?"

Far fewer hands went up and the room was relatively quiet, until it filled with laughter. He asked again and got the same response.

advertising

"Wow, we offered 31 bucks a share," he said, to more laughter.

"How many of you use Google as your default?" Ballmer asked.

The vast majority in the audience raised their hands, cheering and hooting.

Ballmer looked around. Smiled. Scratched his cheek. Rubbed his face with his hand.

He talked about the company's efforts to improve Internet search and asked the MVPs to set their default search engines to Live Search for a week later this year, and send him e-mail describing their experience.

Ballmer gave a muted report on Windows Vista — the company's flagship operating-system product — which, according to some analysts, faces a make-or-break year in 2008.

"Windows Vista," he said, pausing for a moment, "a work in progress.

By the end of his talk, Ballmer was wearing a Canadian hockey shirt and a Simpsons tie...

  

After that inspiring talk, I went for a final tour of Seattle with Joris, Kris and Hans Le Roy. We went to the Space Needle, all the way to the top, where we got a terrific view of the area. Luckily, the weather was on our side, and it didn't rain while we were up there, 560 feet above the ground.

We ended the event in "El Gaucho", one of, if not the finest steakhouse in the Seattle area. And where there's steak, there's me... ;-) . This dinner brought together all the Benelux and North-Western Europeans with our MVP lead.

Day 5: We want to get on that plane, all of us!

Friday, leaving Seattle for home. And we all wanted to get on the same plane this time. Apart from again some troubles with Joris' ticket, we managed to get on the same flight. We did have a lot of turbulence, in fact, it got so bad over the Rocky Mountains in Canada, that everybody was asked to remain seated because of possible rolling in-flight dinner carts in the middle isle... After about 30 minutes, it was over and the rest of the flight was very calm :-) .

Conclusion

The MVP Summit 2008 was a great experience. I'm really happy that I was part of it. Sessions were great, content was great, meeting all these interesting people was great, dinner was great... in conclusion: YES, IT WAS GREAT! I'm sure I'll profit from the content and the great ideas I managed to pick up on this event for quite some time.

More pictures?

Yes, many many more... They're all on my Flickr account!


Click here to see the original post

Be the first to rate this post

  • Currently 0/5 Stars.
  • 1
  • 2
  • 3
  • 4
  • 5

Tags:

N-Technologies

Silverlight Event @ Ordina!

by N-Technologies 23 September 2007 11:01

Last week, I gave the first delivery of my Silverlight presentation at Ordina Schelle. The event was organised by Ordina and Visug (Visual Studio User Group Belgium). It was a success: not one demo went wrong, and we had over 60 guests. I'll be doing a next session this week at the Ordina offices at Haasrode. A third redelivery will be done later.

For those interested in my slides and demo's, I have just finished uploading them.

If you have visited my presentation, thanks for being there.
Feel free to re-use this presentation or the demo's. If you like them, or if you have any questions, please drop me a mail.


Click here to see the original post

Be the first to rate this post

  • Currently 0/5 Stars.
  • 1
  • 2
  • 3
  • 4
  • 5

Tags: ,

N-Technologies