Revue du web du 15 mars

Les tweets de la semaine

 http://twitter.com/gpoune/statuses/10182612504 ah le monde déconnecté :) la consultation de ce document sur la gestion viewstate en ASP.NET est en soit un rappel des difficultés du monde web

 http://twitter.com/marcjohnson/statuses/10190244953 QCon a toujours eu une bonne réputation, on en reparle dans un instant

 http://twitter.com/TigerHasse/statuses/10361767261 les nouveaux jouets pour architectes dans Visual Studio 2010

La question Stackoverflow

 http://stackoverflow.com/questions/2432281/get-sum-of-two-columns-in-one-linq-query On est toujours étonné par la puissance de Linq pour ces petites requêtes de la vie de tous les jours, on en serait où si on avait pas l’opérateur FirstOrDefault() ? La réponse la plus adaptée utilise un opérateur peu utilisé : le groupby.

Actualités Microsoft 

Après avoir lancé son offre commerciale autour des technologies “cloud” sous le nom Azure au mois de janvier dernier, Microsoft la complète maintenant avec une offre “serveur d’application”: Azure App Fabric. Cette dernière vient rejoindre Windows Azure (offre “computing” simple avec des rôles web et/ou services et un stockage non relationnel) et SQL Azure (base de données relationelle).

AppFabric se décompose en deux grandes fonctionnalités :

Un Bus de services pour permettre à des applications d’entreprises (souvent derrière des pare-feux) de communiquer via Azure :

diagramme ServiceBus
diagramme ServiceBus

et un composant de gestion d’identité ou fédération et y associer des règles d’accès :

AccessControl
AccessControl

On trouvera aussi les prix associés dans ce billet. Un SDK est publié.

Actualités “Alt.NET”

QCon est une conférence (une édition à Londres et l’autre en Novembre aux USA) sur le développement informatique organisée par InfoQ, un site d’ínformations sur le monde de l’informatique de l’entreprise (un theserverside.com des années 2000 pour les plus anciens d’entre nous). Ce qui distingue QCon des autres conférences ce sont  la qualité des présentateurs et les sujets sur des technologies, méthodes innovante et/ou sur des questions d’architectures peu discutées autre part. On y trouve des classiques Robert C. Martin mais aussi des sessions sur des architecture atypiques comme Skype ou Facebook,  ou des technologies en particulier (comme .NET). La liste des tracks en elle-même est assez alléchante.

De l’autre côté

http://highscalability.com/blog/2010/2/8/how-farmville-scales-to-harvest-75-million-players-a-month.html

Vous avez tous vu dans votre flux de nouvelles sur Facebook ces messages d’amis qui ont eu telle ou telle récompense dans le jeu FarmVille. Luke Rajlich réponds ici à quelques questions sur la façon dont on rend disponible une application web utilisée par 75 millions d’utilisateurs. Le jeu a un ratio de lecture/écriture très différents d’une application web classique où les utilisateurs passent plus de temps à lire (site de journal par exemple) qu’à écrire (laisser un commentaire). On y apprend que l’utilisation de cache est primordiale (classique dans ce genre d’architecture mais ici ils doivent aussi mettre en cache les données de Facebook), de considére chaque composant (Facebook, les SGBD, le serveur de cache) comme un point de latence et de pouvoir les isoler en cas d’incident.

Un projet

Les bases de données relationelles ont la vie dure en ce moment (voir le mouvement NoSQL) mais est-ce dire que c’est au bénéfice des bases de données orientées objets ? Un de systèmes OODBMS qui connaît un certain succès est db4o de Versant. La version .NET fournie un plugin d’administration pour Visual Studio 2005 et 2008 :

la manager db4o dans visual studio
la manager db4o dans visual studio

Le moteur peut s’utiliser en local (fichier) ou pour une connection à un serveur :

IObjectContainer db =

Db4oEmbedded.OpenFile(Db4oEmbedded.NewConfiguration(), YapFileName);

IObjectContainer sera notre UnitOfWork pour dialoguer avec la base de données (il fournit ainsi les méthodes pour le Commit ou le RollBback) pour  :

- Insérer des données :

Pilot pilot1 = new Pilot(“Michael Schumacher”, 100);

db.Store(pilot1);

- Retrouver des données :

IList result =

    db.Query<Pilot>(p => p.Name == "Michael Schumacher");

- Mettre à jour :

IObjectSet result = db.QueryByExample(new Pilot(“Michael Schumacher”, 0));

var found = (Pilot)result.Next();

found.AddPoints(11);

db.Store(found);

Les classes sont des POCOS.

Un founisseur Linq existe (bien qu’il souffre de certaines limitations du fait qu’il traduit les requêtes en un langage interne, SODA) :

IEnumerable result = from Pilot p in db

                        where p.Name.StartsWith("Michael")

                        select p;

Pour gérer la profondeur en mise à jour et en lecture (opérations en cascade et lazy-loading) on doit modifier la configuration par défaut qui ne cascade pas les mises à jour sur les types référence :

IEmbeddedConfiguration config = Db4oEmbedded.NewConfiguration();

config.Common.ObjectClass(typeof(Car)).CascadeOnUpdate(true);

En plus des propriétés de types primitifs (string, int etc.), les références sur Car seront mises à jours (Pilot par exemple). Pour la lecture la profondeur par défaut est de 5 niveau, on peut modifier ce paramétrage : c’est le concept d’Activation dans db4o. Pour rendre systématique ce processus vos classes doivent implémenter une interface (IActivatable) ou vous devez activer faire cette décoration au moment de la compilation via une tâche MSBuild ou en utilisant l’outil fourni par db4o.

Les concepts objet comme l’héritage sont bien sûr supportés. Il existe un langage bas niveau pour requêter (SODA) mais il est assez verbeux et repose beaucoup sur les chaînes de caractères. On utilisera plutôt Linq ou le langage natif de requête (en plus du requêtage par exemple déjà vu ) :

var result = db.Query(pilot => pilot.Points > 99

                      && pilot.Points < 199

                      || pilot.Name == "Rubens Barrichello");

Une version silverlight existe en beta. On pourra consulter le compte github de James Hicks pour avoir des exemples d’applications utilisant db40 : une abstraction de db4o à travers le concept de Session, une application avec une implémentation du pattern CQRS-Event Sourcing et l’utilisation de db4o avec NServiceBus.

billet publié dans les rubriques coding le