Tag Archives: Silverlight

Updating the Simple Silverlight Countdown Blog badge

image When I was preparing for RIAPalooza, I created and blogged about Creating a Simple Silverlight Countdown Blog badge.

It was great but I wanted to updated it for the next event and realized that recompiling it was not really a user friendly option. The answer is that I updated the widget to have a level of parameterization so that I could easily update it without having to recode everything.

*Update – Source Code

The good news is that there’s a mechanism called InitParams that allows you to pass in initialization parameters on startup. I’m not wild about the mechanism itself as it’s just a key-value pair string and not individual parameters but it works. The alternative is to do something where you write some javascript that will call into the Silverlight object and set parameters. While that works, it wasn’t my first choice because you have to worry about the order of events, exposing objects as scriptable and so on.

<object data="data:application/x-silverlight-2," 
type="application/x-silverlight-2" width="100%" height="100%"> . . . <param name="initParams"
registerText=Check it out!,startImageUrl=logo_codemash_2010.jpg,
endImageUrl=logo_codemash_2009.jpg" /> . . .

Notice that there are multiple parameters here separated by commas. The first one is a date and the second one is a URL and so on.

To access that init parameter in the startup you need to open the App class found in App.xaml.cs and in any method use the Host object’s InitParams list.

string fieldValue = this.Host.InitParams[key];

For a lot of reasons, I wrap that up in a method as follows:

private string GetInitParam(string key)
    string fieldValue = "";
    if (this.Host.InitParams.ContainsKey(key))
        fieldValue = this.Host.InitParams[key];
    return fieldValue;

This allows me to quickly add a lot of new parameters and write the OnStartup method as follows:

private void OnStartup(object sender, StartupEventArgs e)
    string DateTimeString = GetInitParam("eventDate");
    DateTime eventDate = DateTime.MinValue;
    if (DateTimeString.Length > 0)
            eventDate = DateTime.Parse(DateTimeString);
        catch { }

    string backGroundUrl = GetInitParam("background");
    string startImageUrl = GetInitParam("startImageUrl");
    string endImageUrl = GetInitParam("endImageUrl");
    string registrationUrl = GetInitParam("registrationUrl");
    string registerText = GetInitParam("registerText");

    // Load the main control here
    this.RootVisual = new Page(

Notice that I’m calling a custom constructor on the Page class. That looks as follows:

Timer _timer = null;
public Page()
    : this(DateTime.Now, "", "", "", "", "")
public Page(DateTime eventDate, string backGroundImageUrl, 
string imageStartUrl, string imageEndUrl,
string registrationUrl, string registrationText) { EventDateTime = eventDate; // Required to initialize variables InitializeComponent(); if (backGroundImageUrl.Length > 0) { backGroundImage.Source = new BitmapImage(new Uri(backGroundImageUrl, UriKind.Relative)); } if (imageStartUrl.Length > 0) { image.Source = new BitmapImage(new Uri(imageStartUrl, UriKind.Relative)); } if (imageEndUrl.Length > 0) { image1.Source = new BitmapImage(new Uri(imageEndUrl, UriKind.Relative)); } if (registrationUrl.Length > 0) { linkRegistrationButton.NavigateUri = new Uri("http://" + registrationUrl); } if (registrationText.Length > 0) { linkRegistrationButton.Content = registrationText; } _timer = new Timer(new TimerCallback(Timer_Tick), null, 0, 1000); AnimateLogos.AutoReverse = true; AnimateLogos.RepeatBehavior = new RepeatBehavior(1000); AnimateLogos.Begin(); }

That’s all that was required for making it parameterized so that I can update it quickly.

Creating a Simple Silverlight Countdown Blog badge

image I’m going to be speaking at RIAPalooza in about two weeks, well more specifically at the time of this writing it’s 10 days, 12 hours, 48 minutes and 45 seconds. 🙂

I’m going to be tag teaming with Mike Labriola again talking about “10 questions about RIA you haven’t had the courage to ask”. We’ve got a short list of questions but are hoping to get some questions from the crowd as well. If you happen to have any questions, feel free to shoot them to me in the comments section on this post.

Anyways, we were discussing different ways to get the word out about RIAPalooza and someone mentioned that we didn’t have have a blog badge so I decided to create one.

I started by grabbing some art from the RIAPalooza web site. I started out in Expression Blend with a simple Silverlight project. Here are the steps that I took.

  1. Resize the Page.xaml user control to 100×200 to fit the blog badge size.
  2. Add the wood background that I grabbed from the RIAPalooza web site trimmed down to the blog badge size.
  3. Paste in the two other images, one for the logo (referred to as i and one for a a free t-shirt offer.
  4. Animate the two images to wiggle, spin, wiggle, wait, wiggle, spin, wiggle, wait, reverse.
    •  image
      To do this, I opened a timeline and started by rotating the first image -6 degrees and then a frame later rotating it to 6 degrees and then a frame later back to 0. This gives the images a nice little wiggle and catches the viewer’s eye without being too annoying. Well, I don’t think it’s too annoying but you can tell me…
    • image
      Then I kicked forward 2 seconds and did the wiggle again in preparation of swapping to two images. The wiggle makes a nice little transition before the action starts.
    • image
      At the end of the wiggle, I spun the image on it’s X axis over the span of half a second. That’s accomplished by setting the X Skew to zero.
    • On the same frame that the first logo hits an X Skew of zero, I make the other image visible with it’s X Skew to zero an proceed to transform it’s skew to 1 (normal) over the course of a half second.
    • Then I wiggled the t-shirt offer image in the same manner that I did the first logo.
    • Now, back in the code, I set a few properties and started the animation.
      AnimateLogos.AutoReverse = true;
      AnimateLogos.RepeatBehavior = new RepeatBehavior(1000);
  5. Now that the logos are moving, I needed a link to the site. Simple enough using a HyperLinkButton.
  6. Last thing I needed was to provide some type of count down. At first I just used a couple of labels and set the text.
    • First, I used a timer set to go every second and set the time
      _timer = newTimer(newTimerCallback(Timer_Tick), null, 0, 1000);
    • Next I used the dispatch object to work on the UI thread as follows:
      public void Timer_Tick(object state)
          Dispatcher.BeginInvoke(() =>
                    DateTime launchDate = new DateTime(2009, 5, 8, 8, 0, 0).ToUniversalTime();
                    TimeSpan span = launchDate.Subtract(DateTime.Now.ToUniversalTime());
                    txtDays.Text = string.Format("{0} Days", span.Days);
                    //Eat all errors. We'll get another chance in a second...

There are a couple of things to notice about the code above. First, I just used everything as UniversalTime. I thought about trying to do the whole timezone thing but realized that it didn’t matter for a countdown because as long as everything was in the same timezone the math would be right.

Second, notice that I’m eating all of the errors in the timer. The basic error that I can get from this code is a threading issue and since this is low priority code, I didn’t care about the threading issue. It’s not like there’s a real recovery path other than trying again in a second.

Now that I had the simple countdown and badge done, I decided that I didn’t like the flat labels and wanted a real clock style count down. To accomplish this I started a Silverlight FlipClock project to build a reusable clock face.

Since I was creating a flipping clock with a separate top and bottom, it made sense to create a control to encapsulate those bits in user controls that I could reuse. There were two interesting parts here. First, how to get the text to cut off at the top and second, how to get the text to scale correctly with the number if we resized it.

image The first issue was solved by using a brush that cut off to an opacity of zero just under halfway. I did that on both the background and the textbox. The whole gradient is actually made up of three stop points. Two set to be the same color and opacity of 100% and a third that is set to the same color but opacity of zero. This third stop is just a hair further down than the second. The purpose of the second stop is to keep it from fading from top to bottom rather than having the hard like that I desired.

<LinearGradientBrush EndPoint="0.5,1" StartPoint="0.5,0">
    <GradientStop Color="#FFFFFFFF" Offset="0"/>
    <GradientStop Color="#FFFFFFFF" Offset="0.48"/>
    <GradientStop Color="#00FFFFFF" Offset="0.49"/>

The second issue was solved thanks to Laurent Bugnion. He pointed out that although Silverlight doesn’t have a scalable font, there is a VIewbox in the Silverlight Control Toolkit on Codeplex that will scale anything inside itself correctly.

<controls:Viewbox Height="Auto" HorizontalAlignment="Stretch" Margin="0,0,0,0"
VerticalAlignment="Stretch" Width="Auto" Content="Viewbox" Stretch="Fill">
<Grid x:Name="LayoutRoot" Background="{x:Null}">
. . .

I added a simple property to set the value in the textbox.

public int Value
        return int.Parse(txtNumber.Text);
        txtNumber.Text = value.ToString();

Then I just played with the styling a little with a slight highlight on the top and the like.

Next, I created a FlippingNumber control that would be the base for the various numbers on the clock. To make it look right,  I actually needed 4 sections to the control. Two to show the current number and two to show the next number and we flip between them. I simply put two of the top and two of the bottom number controls one the page. The flip was just an animation similar to the flipping of the two images in the top of the badge. The only difference is that I skewed the controls a little to give it a slight 3d effect.

Once that was done, the rest of the number was built in code.

public FlippingNumber()

    FlipDown.Completed += new EventHandler(FlipDown_Completed);

void FlipDown_Completed(object sender, EventArgs e)
    numBottomBack.Value = _val;
    numTopFlip.Value = _val;

int _val = -9999;
public int Value
        return _val;
        if (value != _val)
            _val = value;
            numBottomFlip.Value = _val;
            numTopBack.Value = _val;


The other property that I added was so that the clock could adjust the speed at which the number flipped.

public double SpeedRatio
        return FlipDown.SpeedRatio;
        FlipDown.SpeedRatio = value;

Finally, I was ready to piece together the clock. That was a simple matter of placing 6 of the flipping number controls on the clock face. All that was left was set the time on the clock based on a value in the passed in TimeSpan.

TimeSpan _timeSpan;
public TimeSpan TimeSpan
        return _timeSpan;
        _timeSpan = value;

        numSecondOne.Value = FirstCharacter(_timeSpan.Seconds);
        numSecondTwo.Value = SecondCharacter(_timeSpan.Seconds);

        numMinuteOne.Value = FirstCharacter(_timeSpan.Minutes);
        numMinuteTwo.Value = SecondCharacter(_timeSpan.Minutes);

        numHourOne.Value = FirstCharacter(_timeSpan.Hours);
        numHourTwo.Value = SecondCharacter(_timeSpan.Hours);

private int FirstCharacter(int num)
    string s = string.Format("{0:00}", num);
    return int.Parse(s.Substring(1, 1));

private int SecondCharacter(int num)
    string s = string.Format("{0:00}", num);
    return int.Parse(s.Substring(0, 1));

The last thing on the badge that I did was change the timer control code on the overall blog badge to pass the time span into the clock face rather than parsing it into textboxes.

Now I wanted people to be able to use it from their own blog. To allow that to happen, I needed a put together a cross domain policy via the clientaccesspolicy.xml file.

<?xml version="1.0" encoding="utf-8"?>
            <allow-from http-request-headers="*">
                <domain uri="*"/>
                <resource path="/resources/SilverCountDown.xap" include-subpaths="true"/>

Notice that I’m allowing access from any domain but restricting access to only load the specific xap file.

Anyone who wants to put it on their blog can do so simply by leveraging the following object tag.

<div id="silverlightControlHost">
    <object data="data:application/x-silverlight," 
type="application/x-silverlight-2" width="100px" height="200px"> <param name="source" value="http://www.joshholmes.com/resources/SilverCountDown.xap"/> <param name="background" value="white" /> <param name="minRuntimeVersion" value="2.0.31005.0" /> <param name="autoUpgrade" value="true" /> <a href="http://go.microsoft.com/fwlink/?LinkID=124807" style="text-decoration: none;"> <img src=http://go.microsoft.com/fwlink/?LinkId=108181
alt="Get Microsoft Silverlight" style="border-style: none"/> </a> </object> <iframe style='visibility:hidden;height:0;width:0;border:0px'></iframe> </div>

Feel free to place the badge on your own blog to help promote RIAPalooza – When this year finishes, I’ll update the counter with next years dates as soon as we know it… 🙂

Also – I put the code up at http://www.joshholmes.com/resources/silvercountdown.zip. Feel free to take it and play with it.

.NET Coffee Break Show on IronRuby and Silverlight

I was just on a cool webcast called the .NET Coffee Break Show. I did a short show on getting started with IronRuby and Silverlight.

Because the show is supposed to be just 30 minutes or so, I didn’t get into my usual preaching about the Ruby programming language or why people should use a dynamic language. Instead I just stated the fact that I really like Ruby and I really like Silverlight and I especially like the combination of the two.

To get started with IronRuby, check out the getting started guide with IronRuby by Justin Etheredge.

Now, it’s not absolutely necessary to go through all of those steps to get started with IronRuby in Silverlight. Instead, just download the Silverlight Dynamic Languages SDK. Under the Releases tab, there are a handful of downloads. The one that you want is the one that has “Everything”. This includes the languages, samples, quick start templates and more.

Steps to get started:

1. Unzip the SDLSDK into a directory. I put mine in my public downloads directory for ease of access.

2. Open a command prompt, cd to the sdlsdk directory and run the script:

script\sl ruby demo

This will run the template to generate a starter Silverlight application with IronRuby as it’s language. You could substitute in python or jscript as well.

3. cd to the directory demo and run the script

..\script\server /b

This will run Chiron and then launch a new browser window pointing to the directory. Chiron will first package up the dynamic language files into the XAP and then host a simple web server.

4. Browse to the index.html file. You should see a simple page with “Welcome to Ruby and Silverlight!” displayed in the Silverlight instance.


5. Under demo/ruby, open the file app.xaml. Alter it as follows:

<UserControl x:Class=”System.Windows.Controls.UserControl”

  <Grid x:Name=”layout_root” Background=”White”>
    <TextBlock x:Name=”message” FontSize=”30″ />
    <Button x:Name=”button_main”
        Height=”30″ Width=”100″


6. open the file app.rb. Alter it as follows:

require “silverlight”

class App < SilverlightApplication

  def initialize
    message.text = “Welcome to Ruby and Silverlight!”
    button_main.click do |sender, args|
  def button_main_click
      message.text = “Hello from the click handler”

$app = App.new

The “do” in this case is wiring up a .NET delegate as the event handler for click event.

7. refresh the browser (or relaunch via Chiron per step 3 if you closed the browser).


There are a lot of other samples that are out there as well. Check out the ones under the sdlsdk/samples directory. Right now there’s a simple clock and a Flickr photoviewer that shows a lot of DOM and JavaScript integration.

You can also find samples at:


If you want to play with IronRuby or IronPython you can get started playing in the DLRConsole found at http://silverlight.net/samples/sl2/dlrconsole/index.html. All the source for that is under the SDLSDK samples as well.

I’ll update the post once they put up the recording – .NET Coffee Break Show

European Silverlight Tour

Beat SchweglerIt’s been an amazing month. I had the opportunity to take a tour around Europe speaking about Silverlight. I got to see a lot of different countries, speak to a lot of different people, hear a lot of different visions and opinions and really experience how global of a company Microsoft truly is.

First, let me just say thanks to Beat Schwegler who set up the whole trip. He has an interesting role. He is the technical leader for DPE in Western Europe. He’s a great mentor and I’ve learned a lot from him.

So what was I talking about? I was really talking about building Rich Internet Applications with Silverlight from an architect’s perspective. The first part of the talk is really more about usability and user centric design than it is Silverlight in specific. The second part of the talk is an expanded version of a talk that I first did with Mike Labriola and later with James Ward. I added a ton of specific material about Silverlight to it. The whole deck is up on slide share and embedded below.


European Silverlight Tour 2008I started off my trip in Spain. Madrid to be exact. I had a few days to adjust to the jet lag before I had to speak. This was cool because I got to see a little of Madrid and get to know the people. This included, among others, Cesar De la Torre Llorente, Isabel Gomez Miragaya, David Salgado Bermejo and their manager Enrique Fernández.

I started off the “work” portion of the trip by doing a couple of interviews. The first of these was with a CIO magazine called Computing Magazine. I probably went a little too poindexter on the poor reporter on top of the slight language problem. Overall though, Cesar was pleased with the interview. The second interview was, thankfully for me, with a technical guy who runs a technical magazine out of Spain called .NET Mania.

For my public session, it was packed with close to a hundred people. They had very slightly overbooked the room anticipating some drop-off but there was a lot less drop-off than they usually get so it was jammed. The session went well, despite the language barrier. Beat had warned me that of all the countries, Spain would be the biggest issue as people speak less English there than anywhere else on my trip. France would be a close second but that wasn’t a scheduled stop. I just spoke as clearly and slowly as I could (and got thanked for it on the break). Even so, Cesar ran though a quick high level version of my session in Spanish as soon as I was done.

Many more pictures from Spain found in the sets Random Pictures from Spain and Speaking in Spain.


Very cool motorcycle shop in SwitzerlandAfter my session, I flew to Switzerland where I spoke at the partner council meeting organized by Ronnie Saurenmann and Stefano Malle from the Swiss DPE team. There were about 15 consultants from around Zurich that were there including Atif Aziz who I know from way back when I was doing a lot of training and Laurent Bunion who had just finished writing a new book called Silverlight 2 Unleashed for Sams. They obviously were prepared for the session and asked a ton of really tough question. It was cool though to see the excitement around the technologies. I want to send a big thanks out to Christian Gross who set me up with a user group meeting at Credit Suisse. I love talking about dynamic languages. Here I got to talk to the group about IronRuby and IronPython following a short session that Christian did on F# and the functional programming concepts in C#. It was a smart crowd with good questions.

Afterwards, I got to spend the weekend at my friend Christian’s house. We went hiking through the mountains and even saw this slick looking motorcycle outside of a Swiss custom bike shop…

More Pictures from Switzerland found in Random Pictures from Switzerland.


Next up was JAOO in Denmark. We started out the week with a dinner organized by the Microsoft guys from Denmark including Daniel Mellgaard Frost and Martin Esmann.

JAOO was an awesome conference and I was honored to be part of it. They had an amazing number of industry greats:

Speaker Dinner at JAOO

  • Anders Hejlsberg, Technical Fellow, Microsoft
  • Martin Fowler, Chief Scientist at ThoughtWorks
  • Neal Ford, Ruby Shepherd at ThoughtWorks
  • Lars Bak, Google Inc. – one of the authors of the V8 JavaScript engine for Chrome
  • Michael T. Nygard, Author of “Release It! Design and Deploy Production-Ready Software”
  • Joe Duffy, Microsoft – author of the Parallel Extensions for .NET
  • Erik Meijer, Microsoft – Architect of Volta, parts of LINQ and much more
  • Glenn Vanderburg, Relevance Consulting
  • and the list goes on – check the rest of th
    em at http://jaoo.dk/aarhus-2008/speakers/

Josh Holmes and James WardOne of the things that I did was a joint session with James Ward from Adobe on the best and worst practices of building RIAs. We had about 175 people in this talk. The great thing about this talk is that when we are talking about applications, there are many practices that we can talk about. I’m prepping a much longer post with that deck that will go up later today or tomorrow.

Following that, I talked about Silverlight specifically with about about 150 people and had a full day tutorial on Friday with about 15 people. The tutorial was interesting as my video adapter on my laptop got damaged and I had to borrow one of the student’s computer. The interesting part there was me struggling through on a Danish keyboard… Definitely a different layout for all of the special characters.

Klassic 65 - Aarhus DenmarkI loved Denmark. The people were over the top friendly. After a dinner at Klassic 65, James Ward and I wanted to go grab a scotch before heading to bed. Sorin, the owner who had already dipped into his private wine collection for us, was trying to give us directions to a great scotch place. When we failed the test with all of his usual landmarks, he said – “Ok, then I’ll take you” and piled us all into his station wagon and drove us across town to the scotch place. That was cool! I really dug Klassic as they cook in the old ways. According to what I understood from Sorin, the cooks and much of the wait staff have to pass a certification test. Part of the testing is this antiquated set of methods that include doing the Flambé at the table with the crepes and so on. However, after doing it for the test, none of the restaurants actually use this knowledge. Sorin decided to go for it. His little shop has limited room and a very short set of dishes. They typically offer 4 starters, 4 entrees and 4 desserts and they do those few items amazingly well. The wine choices are far more plentiful. Sorin is a master as picking the wine for the meal.

I have to go back to JAOO every year just so that I get to go back to Denmark.

More pictures from Denmark found in the sets Klassic 65 in Aarhus, Speaking at JAOO with James Ward and Denmark.


Speaking in SwedenI love Sweden. One of the conditions that I had for taking on the trip in the first place was that I get to spend a weekend in Sweden. It turned out that Richard Hale Shaw was wrapping up a class in Stockholm the day I arrived. We hung out that evening and had dinner at very cool local Jazz club.

Unfortunately, it rained all day Sunday. That aside, it was a great day. I had dinner in the old town (Gamla Stan) and hung out people watching all day. It’s one of my favorite pastimes.

Monday I met up with the local evangelism team, including Jonas Torstendahl and Robert Folkesson.

I did a public session at the Sheraton with about 50 people. It was a great audience – mostly consultants that came with solid questions. One of the attendees had actually already been doing quite a bit of Silverlight including a Greeting Card application that they are working on getting ready for release on Codeplex.

*update* – the Greeting Creator is on CodePlex at http://www.codeplex.com/greetingcreator.

More pictures from Sweden found in the set Views from the Nordic Light in Sweden and Speaking in Sweden.

BelgiumSpeaking in Belgium

I really wish that I had more time in Belgium and in Holland but I only had a day each. I got in on Monday night and was on the train Tuesday night. In the mean time, I got to meet several of the Belgian evangelists, including Philippe Destoop, and do a public session. I really liked the facility that we were in. It’s called Living Tomorrow and it’s all about the future of sustainable technologies. They had a set of solar panels out front that had an LED display that showed how much energy it had generated and how much of that energy had been used. The whole venue was the latest and greatest technologies from a number of different companies. They had touch panels on all of the refrigerators to show the ingredients. They had automated lights and lighting control in the auditorium. They had automated lawn mowers. They had an amazing amount of cool tech.

More pictures from Belgium found in Random Pictures from Belgium and Speaking in Belgium.

HollandSpeaking in Barneveld, Holland

Next up was Holland. I took the train into Amsterdam and then caught a cab out to near Barneveld where the session happened the next day. I stayed in a cool little spa type of an hotel that was nice and old school. Right down to the old fashioned iron key for my hotel.

The next day I caught a lift to the venue with Mark Voermans. It was an interesting session because part of the crowd was brand new to the technologies and was really interested in the first part of the session but lost in the second part. The other part of the crowd is already actively doing Silverlight development and was bored to tears in the first part and rapt in the second half. 

Following the public session, we had a two more meetings. One was an interview with Web Designer Magazine. Here I was joined by Martin Tirion, Holland’s User Experience Evangelist. The second one was with one of the TV stations to discuss their systems.

More pictures from Holland found in the set Speaking in Holland.


From Holland I flew to Ireland. This was the final stop on the work tour. I started off with a long meeting with Sean Foley, the evangelism manager for Ireland. He had a tremendous amount of great insight into the the tech industry, Microsoft, politics and a ton more. It was great to meet him and learn from him.

I had a number of side meetings during the day and an evening event. The meetings were with two different training companies that are ramping up for Silverlight and a company that’s been doing Silverlight application development since Silverlight Alpha 1.1 called Zignals. They have a pretty cool set of chart controls specifically tailored for the financial industry. They had some really deep and technical questions. I’m hoping that I was able to help them out…

Dynamic Languages Crew in Dublin, IrelandThe next meeting was also really cool – Martha Rotter, the local DE, had set up an interview with a lot of the local dynamic languages folk from around Dublin. That included Ana Nelson from Ruby Ireland, Jaime Hemmett from PHP Ireland, and Sean O’Donnell and Vishal Vatsa from Python Ireland.

That was a ton of fun. I’ll be posting that on WiresideChat soon.

Speaking in Dublin, IrelandLast stop was the public session that I did in Ireland with about 75 people in attendance. It was a varied group ranging from consultants to people that work on the Live platform for Microsoft out of the Dublin office. It was impressive how many people came with good and solid questions ready to ask. There was even a couple of people with written lists of questions that they wanted to make sure that they wanted to get answered. Martha told me afterwards that the crowd is usually very reserved and doesn’t ask a lot of questions – but they were really enthusiastically engaged during my session.

More pictures from Ireland found in the sets Dynamic Languages in Ireland and Speaking in Dublin.


I learned a ton from my trip and hopefully was able to help people out. I’d love to hear from those that were in the various sessions about how they are applying anything that I talked about.

Miguel de Icaza on Mono and Moonlight

Very, very close (It was #1 Explore)         132 times Fav.!Moonlight is still continuing to progress. Moonlight is the open source implementation of Silverlight for Linux. It’s being run by Miguel de Icaza of Novell.

There are a couple of things that are interesting to me about this project.

First, as I talked about in Dancing in the Moonlight!, it’s unprecedented interop and openness on the part of Microsoft. Microsoft gave the project the specs and a ton of support. The Moonlight devs even have access to the Silverlight engineers as they are developing the open source compatible solution to help clarifying specs and ensuring compatibility. One of the things that’s tough from a legal perspective is all of the codecs and other video components. What’s going to happen is that there’s a “Media Pack” that users will download from Microsoft to play videos. This circumvents the legal issues and allows Moonlight users access to all the great VC1 video out there.

Second thing I find interesting is that they are finding interesting ways to innovate even in the constraints of being 100% compatible. For example, They built a Silverlight designer called Lunar Eclipse completely in Silverlight. That’s a really cool idea. They are looking at offline ideas around Moonlight and making their implementation a WPF light enabling them to revamp the GNOME’s desktop development paradigm. They’ve started with desklets, which are small Silverlight components that run in a desktop framwork. Again, really innovative idea.

Miguel did an interview with derStandard.at about the projects and how they are going at Miguel de Icaza on Mono