Web development, NuGet, Microsoft Azure, PHP, ...

How about ending the year 2009 with a blog post on something annoying I see on the Internet, as well as some others? I’m talking about automatic localization… Please, go ahead and read some tweets by @KvdM and @patrickv. And then, there’s my own annoyance on Windows Mobile Marketplace. The base for al this frustrated year-end whining has to do with the fact that there are assumptions being made about the location of a user, rather than about a user itself…

On every request my browser makes, my preferred language is being sent out. Where I am, that would be “nl-BE” (Dutch, in Belgium). At my customer’s location, that would be “nl-NL” (Dutch, in the Netherlands). If everything works according to plan, both of these should be telling the website that I want to display it in Dutch. However, some websites out there like Twitter, Facebook, … look at the second part, serving me a “Belgian” version of the site in the first case and a “Netherlands” version in the second case. According to Wikipedia, a site that actually does the above trick in the correct fashion, Belgium has three official languages: Dutch, French and German. Since history however linked the French language to Belgium, most websites think that the default language for Belgium should be French. While I actually do send out my preferences on every request my browser makes.

No problem, I do speak (a little) French, so I am able to find the language switch on most websites in no time. It would be a bit nicer though if my preference was respected or switched to English if no Dutch version is available. The Internet is mostly English, I’m fine with that. Don’t get me wrong, I’m not one of those Flemish nationalists saying French is bad and the Walloon part of Belgium is bad. No, all I’m saying is that some websites are making wrong assumptions, forcing me to add an extra click (switching the language) to some of the sites I’m visiting. Not the ideal situation in an era where usability is something being focused on more and more.

Things do get worse sometimes. In the above situation, there was still a language switch. And then, there’s Windows Mobile Marketplace… The website does recognize I’m “nl-BE” and displays in Dutch. After installing the software on my cell phone and linking my Windows Live ID, it seems that the only market I can download software in is… Belgium – French! No problem, the software listed is the same as the one in the “Belgium – Dutch” market so I can download what I want, and I do speak enough French to find my way around. However: no language switch… Marketplace is something great, but there’s a small usability catch…

Someone pointed out that there’s something available which can switch the language for Marketplace, but it’s an extra tool I have to download and install. Usability? And for the other situation: I have “en-US” (English, USA) registered as the default language my browser sends out:

This does fix a lot of usability frustration, but I think it’s not the way all of this was meant to be. So, when planning a new web application in 2010, do make use of all the information clients provide you. Don’t make assumptions, default to English if you don’t have the requested language available. And while you are thinking: also make use of OpenID or something like that for doing account registration. Small things can make a website much more usable!

That being said: enjoy the last days of 2009, enjoy the time-warp to 2010!

It was a fun session yesterday at KU Leuven university! I did a session on cloud computing and Windows Azure there for the IEEE Student Branch Leuven.

Abstract: "This session covers the basics of the Windows Azure Services Platform and drills into some architectural challenges. Learn what components the Windows Azure Services Platform is built of and how they can be leveraged in building a scalable and reliable application."

Being in the US for 2 times in a month (PDC09 and Web Development Summit) is fun, tiring and rewarding. The WDS09 was an invite-only event organized by Microsoft, focusing on interaction between Microsoft and the PHP community. I must say: the event has been helpful and interesting for both parties!

Met a lot of people I knew from Twitter and e-mail, and met a lot of new people, both Microsoft and PHP community. Nice to meet you all!

Event focus was on feedback between Microsoft and PHP community, overall I think the dialogue was respectful and open and helpful to both parties.

This was actually my first time at the WDS which has been around for 5 years already. The Interop team invited me there, and I want to thank them for doing that: it was a great trip, a great event and I got the chance to meet lots of new people.

Attendees were mostly people from the PHP community, like Cal Evans, Rafael Doms, Chris Cornutt, Romain Bourdon (WAMP server anyone?), Alison “snipe” Gianotto, … Next to that, lots of Microsoft people came by during various sessions. Some of them even reserved the whole week and were attending all sessions to make sure they were in the feedback loop all the time.

We’ve seen Microsoft sessions on IIS, Web Platform Installer, Silverlight, SQL Server, Bing, Powershell (sorry, Scott Hanselman, for disturbing your presentation with a tweet :-)). Interesting sessions with some info I did not know. PHP community sessions were also available: Wordpress, Joomla, Drupal, the PHP community perspective, feedback sessions, PHPLinq, PHPExcel, interoperability bridges, … A good mix of content with knowledgeable speakers and good communication between speakers, product groups and audience. Well done!

While flying sitting in the airplane to the Microsoft Web Developer Summit in Seattle, I was watching some PDC09 sessions on my laptop. During the MEF session, an idea popped up: there is no MEF for PHP! 3500 kilometers after that moment, PHP got its own MEF…

What is MEF about?

MEF is a .NET library, targeting extensibility of projects. It allows you to declaratively extend your application instead of requiring you to do a lot of plumbing. All this is done with three concepts in mind: export, import and compose. (Glenn, I stole the previous sentence from your blog). “PHPMEF” uses the same concepts in order to provide this extensibility features.

Let’s start with a story… Imagine you are building a Calculator. Yes, shoot me, this is not a sexy sample. Remember I wrote this one a plane with snoring people next to me…The Calculator is built of zero or more ICalculationFunction instances. Think command pattern. Here’s how such an interface can look like:

Now how would you go about using this in the following Calculator class:

[code:c#]

class Calculator { public $CalculationFunctions; }

[/code]

Yes, you would do plumbing. Either instantiating the Sum object and adding it into the Calculator constructor, or something similar. Imagine you also have a Division object. And other calculation functions. How would you go about building this in a maintainable and extensible way? Easy: use exports…

Export

Exports are one of the three fundaments of PHPMEF. Basically, you can specify that you want class X to be “ exported” for extensibility. Let’s export Sum:

In this case, PHPMEF will simply instantiate the first ICalculationFunction instance it can find and assign it to the Calculator::SomeFunction variable. Now think of our first example: we want different calculation functions in our calculator! Here’s how:

Easy, no? PHPMEF will ensure that all possible ICalculationFunction instances are added to the Calculator::CalculationFunctions array. Now how is all this being plumbed together? It’s not plumbed! It’s composed!

Compose

Composing matches all exports and imports in a specific application path. How? Easy! Use the PartInitializer!

Easy, no? Ask the PartInitializer to satisfy all imports and you are done!

Advanced usage scenarios

The above sample was used to demonstrate what PHPMEF is all about. I’m sure you can imagine more complex scenarios. Here are some other possibilities…

Single instance exports

By default, PHPMEF instantiates a new object every time an import has to be satisfied. However, imagine you want our Sum class to be re-used. You want PHPMEF to assign the same instance over and over again, no matter where and how much it is being imported. Again, no plumbing. Just add a declarative comment:

Can I get the source?

No, not yet. For a number of reasons. I first want to make this thing a bit more stable, as well as deciding if all MEF features should be ported. Also, I’m looking for an appropriate name/library to put this in. You may have noticed the Microsoft_* naming, a small hint to the Interop team in incorporating this as another Microsoft library in the PHP world. Yes Vijay, talking to you :-)

Maarten Balliauw works at Microsoft. His interests are mainly web applications developed in ASP.NET (C#) or PHP and the Microsoft Azure cloud platform. Maarten also co-founded MyGet, hosting private NuGet feeds for teams.