Code source du framework .NET

Publié par Fabrice Michellonet sous le(s) label(s) le 3 août 2009

Cela fait plus d'un an et demi que le site Microsoft Reference Source Code Center à vu le jour. Rappelons que ce dernier à pour but de mettre à disposition le code source des assembly suivantes :

  • Mscorlib.DLL
  • System.DLL
  • System.Data.DLL
  • System.Drawing.DLL
  • System.Web.DLL
  • System.Web.Extensions.DLL
  • System.Windows.Forms.DLL
  • System.XML.DLL
  • WPF (UIAutomation*.dll, System.Windows.DLL, System.Printing.DLL, System.Speech.DLL, WindowsBase.DLL, WindowsFormsIntegration.DLL, Presentation*.dll, et quelques autres...)
  • Microsoft.VisualBasic.DLL

Depuis lors Visual Studio 2008 à été mis à jour afin d'offrir la possibilité de debugger en direct les sources du framework .NET. Pour ceux qui aurait loupé l'info au moment de la sortie (peut-être que l'info n'a pas été assez bien relayée), voici un tutoriel de Shawn Burke qui vous permettra de configurer votre IDE préféré.

Pour les utilisateurs de VS2005 ou bien des version Express de Visual Studio, alors .NET Mass Downloader est l'outil qu'il vous faut car il vous permettra de remplir le cache de code source utilisé par l'IDE et en prime vous autorisera de travailler même lorsque vous n'êtes pas connecté à Internet.

Voila donc quelques cas ou vous pourrez vous permettre d'oublier Reflector :D.

Nouveau skin.

Publié par Fabrice Michellonet sous le(s) label(s) le 22 juillet 2009

Voila! après quelques nuits plutôt courtes je suis heureux de mettre en ligne ce nouveau thème pour mon blog.

Certains lecteurs m'ayant dit que sur l'ancienne version la fonte était trop petite et sombre, j'ai essayé de trouver un compromis entre la mode du flashy qui sévit de plus en plus sur la toile et mon penchant pour le gothisme... Finalement, je suis reparti sur un autre concept... Bref, vos yeux devraient moins saigner si vous lisez ces lignes sur le blog directement. Quand à ceux qui trouvent que le blog a basculé dans le mode Hacker (comprenez fonte blanche sur fond noir) et bien il vous reste toujours Google Reader :)

Il y a aussi quelques améliorations au menu :

  • Passage à la version 1.3.1 de dojo sur le CDN fournit par Google
  • Passage à la version 2.0.320 de SyntaxHighlighter
  • Mise en place d'un style pour les blockquote sans l'utilisation d'image; Cela ne fonctionne qu'avec les navigateurs de dernière génération.
J'espère que vous aimerez autant que j'ai pris de plaisir a le mettre en place.

SMDBehavior 0.22

Publié par Fabrice Michellonet sous le(s) label(s) le 12 juillet 2009

Un billet rapide pour annoncer la release 0.2.2 de SMDBehavior.

Cette version fixe un bug qui causait un disfonctionnement lors de l'appel de Web Services en utilisant le verbe GET. Merci à Andrew Cave qui m'a gentillement remonté ce bug.

J'ajouterais également cette semaine quelques exemples supplémentaires.

Bon téléchargement :)

Subsonic 3.0

Publié par Fabrice Michellonet sous le(s) label(s) , le 7 juillet 2009

Mon petit ORM chouchou monte de version, et on le retrouve désormais en version 3.0 avec tout un tas de nouveautés.

Depuis la sortie de la version 2.2 en avril dernier, certain pensaient que le projet Subsonic était mort; Rob Connerry ayant été embauché par Microsoft, et le manque de communication sur le site concernant l'avancement m'arrangeant rien.

Mais c'était sans compter sur Rob qui nous préparait dans sa cave une mouture qui n'a sans doute plus grand chose à voir avec la version 2.2.

En effet, ciao le langage à base d'expressions pointées pour requêter la base de données, qui par ailleurs faisait sans doute toute la force de Subsonic face aux autres ORM, et bienvenu à Linq to SQL.

De plus le système de templating à complètement été réécrit lui aussi; Subsonic utilise désormais T4.

Alors que peut-on en penser?

Historiquement je ne suis pas fan de Linq to SQL, surement car je n'ai pas pris assez le temps de faire joujou avec, cela sera surement la bonne occasion. Ceci dit faudrait penser à dire à l'équipe de Linq que l'instruction Select c'est en début de requête que ca se place ;)

Qu'en a T4, ca c'est une vrai bonne grosse nouvelle c'est tout simplement la killer feature à mes yeux; Le système est assez simple a prendre en main, ouvert, et donne accès a l'ensemble des possibilités de la plateforme .NET

Au niveau des Templates fournis en standard, on retrouve le très bon, mais controversé pattern ActiveRecord, et le tout nouveau SimpleRepository pour les amateurs de POCO.

Finalement, on sent bien l'influence corporate de Microsoft tout de même dans les choix de techno, mais c'est surement le meilleur choix qui s'offrait à l'équipe en terme de pérennité.

Je tacherais de vous faire une présentation un peu plus technique de cette version 3 dans un prochain article.

[François Jehl] : Montée en charge, quelques conseils.

Publié par Fabrice Michellonet sous le(s) label(s) le 27 mai 2009

Dans son billet [SSIS] Montée en charge, quelques conseils. François, nous propose quelques très bon conseils d'optimisation des packages SSIS.

Pour une fois qu'il ne parle pas de Data Mining (quelqu'un comprend ce qu'il raconte au moins sur le DMX), je vais me permettre d'intervenir/compléter sur un point. J'espère que ca ne te dérange pas François.

François à dit :

... SSIS est optimisé en mémoire donc à vous de l'économiser! Déjà, sélectionnez uniquement les colonnes utiles...

Dans les Data Flow Sources, il est effectivement conseillé de ne sélectionner que les colonnes qui seront effectivement utilisées par la suite. Cependant, dans la suite de votre flux de données, certaines transformations (ex : Derived Column, Data Conversion etc...) vont dupliquer les colonnes les premières ne servant vraisemblablement plus.

Une solution souvent mise en place afin d'enlever les colonnes inutiles, est d'utiliser la tache Union All. En supprimant les Output Column inutiles, on pense réduire à juste titre la mémoire utilisée. La pire solution, serait d'utiliser des taches synchrones aggregate ou sort pour supprimer ces mêmes colonnes.

Mais alors si je conviens que cela réduit bel et bien l'utilisation de la mémoire, pourquoi n'est tout de même pas une bonne idée? Tout simplement de par le fait que supprimer une colonne induit la copie des buffers du pipeline vers de nouveaux buffers. Et malheureusement l'expérience prouve que cette action de copie est bien trop couteuse en terme de cycle CPU pour contrebalancer la réduction de la mémoire utilisée.

Darren Green - 10 Mai 2007 à dit :

Something that people, including me get a bit worried about, is the fact that you end up with these big wide buffers. The classic scenario is when you need to convert between string and Unicode string or visa versa. You end up duplicating all your columns, which seems really horrid. Well it may not be great, but the alternative is even worse. Data Conversion and Derived Column transforms can do the conversion, but are synchronous, so we have duplicate columns in effect. Would it be better to have a custom component that worked asynchronously, so you didn't end up with two columns for all your strings? The short answer is no. I wrote a test component, cunningly named DeUnicodeAsynchTestComponent, and simply put it was 2 - 2.5 times slower than a data conversion transform. The cost of copying data between buffers for the asynchronous nature is far more expensive than the extra baggage of the "duplicate" columns.

Voila François, j'espère que cette petite précision intervention ne te dérangera pas trop... promis je te laisse tranquille tant que tu parle de Data Mining.... Quand à moi, je retourne à mon code C#.

Mono.Cecil : la reflexion sous stéroïdes.

Publié par Fabrice Michellonet sous le(s) label(s) le 12:04

Dernièrement en étudiant les possibilités offertes par T4 (un prochain billet y sera consacré), j'ai été confronté une fois de plus a un problème bien connu de la Refection : L'impossibilité de décharger un assembly de l'AppDomain l'ayant chargé; La seule solution étant de décharger tout l'AppDomain.

Dans mon cas, l'AppDomain chargeant l'assembly était hosté par Visual Studio, ma seule solution était donc de fermer Visual Studio 2008... sniff sniff un peu violent!

En fouillant mes bookmarks non traités, je retombe sur Mono.Cecil, un Framework d'introspection écrit par Jean-Baptiste Evain.

Qu'est ce que Mono.Cecil? Je dirais que c'est de la reflexion sous stéroïde car non soumis aux mêmes limitations que la reflexion, et qu'en prime on peut aussi créer/modifier du code CIL avec.

Alors comment choisir entre les deux ? Je vous laisse découvrir l'excellent article Mono.Cecil vs. System.Reflection de Patrick Smacchia un des auteurs de NDepend

Pour ne pas déroger à la règle un petit bout de code afin de mettre le pied a l'étrier.


AssemblyDefinition myLibrary = AssemblyFactory.GetAssembly("MyLibrary.dll");

foreach (TypeDefinition typeDef in myLibrary.MainModule.Types){
if (!typeDef.IsClass)
continue;

Console.WriteLine(typeDef.FullName);
}

Bonne introspection.

SMDBehavior

Publié par Fabrice Michellonet sous le(s) label(s) , le 8 mai 2009

Lors des deux derniers billets, je vous ai présenté les possibilités offertes par le format SMD (simple method description) qui n'est autre qu'un JSON permettant de décrire un service web tout comme wsdl le fait en xml.

Pour rappel, certain Framework Ajax comme Dojo et Yahoo UI, savent interpréter ce JSON et généré automatiquement la classe proxy qui permettra de travailler facilement en Javascript avec les WebService.

Bref, tout ca pour vous annoncer que j'ai dernièrement travaillé sur une extension WCF qui génére automatiquement le SMD de vos services; et que le fruit de ce travail est disponible sur Codeplex à l'adresse suivante : SMDBehavior.

Evidemment, pas besoin de modifier vos services, il suffit d'ajouter quelques lignes de configuration dans le fichier web.config ou app.config pour que cela fonctionne.

Sur le site du projet SMDBehavior vous pourrez télécharger le binaire, une solution de démo et si vous avez un identifiant Codeplex, vous pourrez aussi obtenir les sources. Je ne m'étendrais pas ce soir sur la mise en oeuvre de cette extension WCF, car tout est explique sur la page SMDBehavior.

Happy SMD.

Dojo + WCF [2eme Partie]

Publié par Fabrice Michellonet sous le(s) label(s) , le 20 avril 2009

Dans le précèdent billet, je vous avais proposé d’invoquer un service WCF en utilisant les XmlHttpRequest à la sauce dojo (xhrGet et xhrPost).

Bien que cette façon de faire soit bien plus rapide et « élégante » que lorsqu’on doit écrire soit même ce type de code js (avec support des navigateurs browser etc…), il existe une méthode encore plus simple.

Bien, revenons quelques instants sur les services web publiés aussi bien sous forme d’ASMX qu'en WCF, ils ont la bonne idée d’être accompagnés d’une nomenclature les décrivants ; Vous l’aurez compris je parle bien ici du wsdl.

L’intérêt majeur que je vois dans le wsdl est que cela permet de générer automatiquement un proxy qui saura communiquer avec le service web ciblé. D’ailleurs, c’est grâce à cette description que visual studio génère la classe proxy lorsque vous ajoutez une référence web dans votre solution.

L’idée derrière les classes du namespace dojox.rpc est d’avoir ce même comportement en JavaScript, c'est-à-dire, la possibilité d’interroger un service pour connaitre ses caractéristiques et de générer automatiquement un proxy JavaScript simplifiant son utilisation.

Excellent me direz-vous, nous avons déjà le wsdl... arf c’est la que le bas blesse, le xml (et plus spéciale une définition wsdl) n’a jamais été le format le plus simple et le plus rapide à traiter en JavaScript. Par contre, comme vous le savez déjà le json est le format fétiche du web.

C’est donc à partir d’une définition en json respectant le formalisme nommé smd (pour Simple Method Description) que le Framework dojo va vous permettre de générer le proxy JavaScript qui correspondra à votre service web.

Bien trêve de discussion adaptons notre précédent exemple pour l’adapter a cette technique de génération de proxy. Créons la définition du service :


{
"transport": "POST",
"envelope": "URL",
"target": "http://localhost/WCFDojoRpc/ClockService.svc/",
"services": {
"GetTime": {
"transport": "GET",
"target": "GetTime",
"parameters": []
}
}
}

On y retrouve facilement les informations relatives a l’adresse du service et la méthode disponible. Pour plus de détail, je vous laisse vous reporter au groupe de travail qui s’intéresse au format smd.

Modifions quelque peu notre script :


<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
<title>Dojo & WCF</title>

<script src="http://ajax.googleapis.com/ajax/libs/dojo/1.3.0/dojo/dojo.xd.js" type="text/javascript"></script>

<script type="text/javascript">
dojo.require('dojo.parser');
dojo.require("dojox.rpc.Service");

var clockProxy;

dojo.addOnLoad(
function() {
clockProxy = new dojox.rpc.Service("definition.json");
GetTime();
}
);

function GetTime() {
clockProxy.GetTime()
.addCallback(
function(data) {
dojo.byId('ServerTime').innerHTML = data.d;
}
)
.addErrback(
function(data) {
alert(data);
}
);
}

</script>
</head>
<body>
<input type="button" value="Time?" onclick="GetTime();" />
<div id="ServerTime"></div>
</body>
</html>

Comme vous le voyez nous avons principalement retiré l’utilisation des xhrPost, que nous avons remplacés par une simple ligne new dojox.rpc.Service("definition.json"); qui génère le proxy JavaScript automatiquement a partir de la définition en json.

Bien évidement le service WCF reste identique a celui présenté dans la première partie de cet article.

Je retire deux conclusions partielles de l’utilisation des smd :

  • Il est certain que la possibilité de décrire un service facilite ensuite la vie du développeur coté js.
  • Il est dommage de devoir utiliser autre chose que le wsdl qui est généré pour nous, surtout lorsqu’on est un développeur .NET.

Le top serait d’avoir une description smd générée automatiquement à chaque modification de notre service WCF et que ce soit intégré dans le pipeline WCF. C’est ce que je me propose de vous montrer lors de la troisième partie de cet article.

Dojo + WCF [1ere Partie]

Publié par Fabrice Michellonet sous le(s) label(s) , le 8 avril 2009

Voila déjà plusieurs mois, j’avais une discussion sur les architectures SOA avec Christophe et surtout comment les mettre en œuvre avec les Framework (Ajax) Javascript. A l’époque il démarrait une refonte de sa galerie de photos perso LCCFamilly et souhaitait qu’elle soit Full Ajax.

Sur ce même principe, je me propose aujourd’hui de vous montrer comment interroger un WebService WCF à partir du Framework Dojo ; Faisons un service qui nous donne l’heure et la date courante formatée selon la locale du serveur. On commence par déclarer l’interface de notre service.


[ServiceContract(Namespace="http://www.devolis.com/2009/04/WCFDOJO")]
public interface IClockService
{
[OperationContract]
[WebInvoke(Method = "POST")]
string GetTime();
}

Notez l’utilisation du verbe POST ; Il convient d’éviter le verbe GET comme la peste si vous utilisez Internet Explorer comme client de votre WebService. En effet, sa gestion du cache, fait qu’il n’effectue que le premier appel, puis se contente de renvoyer ce qu’il a en cache.

Puis passons à l’implémentation à proprement dit du service


/// AspNetCompatibilityRequirements n'est utile que si le webservice est hosté dans IIS
[AspNetCompatibilityRequirements(RequirementsMode = AspNetCompatibilityRequirementsMode.Allowed)]
public class ClockService : IClockService
{
public string GetTime()
{
return DateTime.Now.ToString();
}
}

Ok, a ce moment précis, il vous est déjà possible de tester le WebService en créant rapidement un projet console et en ajoutant une WebReference sur ce dernier... Je vous laisse le faire de votre coté :)

Passons à notre page web :


<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml" >
<head>
<title>Dojo & WCF</title>
<script src="http://ajax.googleapis.com/ajax/libs/dojo/1.3.0/dojo/dojo.xd.js" type="text/javascript"></script>


<script type="text/javascript">
dojo.require('dojo.parser');
</script>

<script type="text/javascript">

function GetTime() {
dojo.xhrPost({
url: "ClockService.svc/GetTime",
handleAs: "text",
contentType: "application/json; charset=utf-8",
load: function(response, ioArgs) {
dojo.byId('ServerTime').innerHTML = dojo.fromJson(response).d;
return response;
},
error: function(response, ioArgs) {
alert("Error :" + ioArgs.xhr.status);
return response;
}
});
}

</script>
</head>
<body onload="GetTime();">
<input type="button" value="Time?" onclick="GetTime();" ///>
<div id="ServerTime"></div>
</body>
</html>

Comme vous pouvez le constater, le code est assez concis. Apres avoir déclaré l’utilisation de Dojo 1.3 à partir du CDN de Google, j’ai déclaré une fonction GetTime() qui par le biais d’un XmlHttpRequest (xhr) va demander au WebService de lui retourner le DateTime actuel ; les données sont attendues sous forme de JSon.

Vous remarquerez aussi la construction de l’url d’appel, il s’agit du nom du Service suivit par le nom de la méthode.

Si vous exécutez maintenant la page web, vous recevrez une erreur http 405. En effet pour l’instant Dojo et WCF ne parlent pas encore la même langue. Dojo parle en JSon et WCF en Soap... il va nous falloir configurer le service.

Voici la globalité du ServiceModel que vous trouverez dans votre web.config ou app.config en fonction du type de projet choisit.


<system.serviceModel>

<behaviors>
<serviceBehaviors>
<behavior name="MetaDataBehavior" >
<serviceMetadata httpGetEnabled="true" />
</behavior>
</serviceBehaviors>

<endpointBehaviors>
<behavior name="ClockServiceBehavior">
<enableWebScript/>
</behavior>
</endpointBehaviors>
</behaviors>

<services>
<service name="WCF_TEST.ClockService" behaviorConfiguration="MetaDataBehavior">
<endpoint address=""
behaviorConfiguration="ClockServiceBehavior"
binding="webHttpBinding"
name="ClockService"
contract="WCF_TEST.IClockService"/>
</service>
</services>

</system.serviceModel>

La principale différence avec la configuration standard est au niveau du binding du endpoint. Par défaut le binding est définit en tant que wsHttpBinding (messages soap) ; Pour parler Json il nous faut choisir le binding webHttpBinding (JSon).

Voila, relancez la page web… tadam… c’est magique.

Dans la prochaine partie de cet article je tacherais de vous montrer comment éviter d’avoir à écrire les blocs de javascript xhrPost en passant par dojo.rpc

Christophe, t’as plus qu’a réécrire LCCFamily :)

Microsoft Web Platform Installer

Publié par Fabrice Michellonet sous le(s) label(s) le 6 avril 2009

Il y a quelques jours, je suis tombé un peu par hazard sur la page Microsoft Web Platform Installer.

De quoi s'agit-t-il? Sans avoir testé mais d'après les infos qui sont distillées sur ce mini site, cela prend la forme d'un installeur qui vous aidera à mettre en place :

  • Le framework .NET evidemment
  • Le serveur web IIS 7
  • La base relationnelle SQL Serveur
  • Les outils de dev : Visual Studio et Expression Web
  • Et tout un tas d'applications web opensource comme DNN, BlogEngine.NET etc...
  • Et tenez vous bien vous trouverez même des applications qui fonctionnent sous PHP (Acquia Drupal, WordPress etc...)

Personnellement tout cela me fait penser aux initiatives qui furent lancées il y a une petite dizaine d'années en arrière avec des installateurs comme EasyPhp et compagnie... encore une fois, l'histoire se répète!! mais pour le coup, il me semble que c'est plutôt une bonne chose.

Une petite question me traverse l'esprit tout d'un coup; on ne parle pas une seule seconde de WSS dans tout ça... pourtant ça risque bien de faire un peu d'ombre... non?

Quel Framework Ajax choisir ?

Publié par Fabrice Michellonet sous le(s) label(s) le 2 avril 2009

Dojo est désormais passé en version 1.3 avec son lot de nouveautés que je vous laisse découvrir ici.

Mais ce qui est plus excitant encore (et qui est presque passé inaperçu) c’est la mise à disposition de TaskSpeed, un outil de benchmark des principaux Framework Ajax actuellement disponible [JQuery, Dojo, Prototype, MooTools].

Mais comment benchmarker des Framework qui n’offrent pas tous les mêmes fonctionnalités ? (JQuery n’offre pas de composants graphique par exemple). TaskSpeed propose de les noter sur leur plus petit dénominateur commun, c'est-à-dire la manipulation du DOM HTML.

Sur le site, il est possible à tout un chacun de visualiser les résultats d’une bonne quinzaine de métrique par Framework. J’ai moi-même réalisé le test avec mon navigateur préféré Firefox... (Jérôme, y’a des gens qui ont fait le test avec Opéra... je te jure y’a pas que toi qui l’utilise :) ).

Et le vainqueur est... Dojo bien sur.

Moyenne par rapport au navigateur Résultats FF Résultats IE

Le dernier est JQuery… Au fait, qui peut me rappeler pourquoi Microsoft à choisit ce Framework pour l’intégrer dans son offre Ajax ?

Afin d’assurer la plus grande transparence, il est possible de voir le code exécuté pour chaque test en cliquant simplement sur la cellule au croisement d’un Framework et d’un browser.

PS : Pour ceux qui se demandent comment sont faits les graphs… il s’agit de dojox.gfx.

PS2 : Je vous laisse aussi découvrir par la même occasion quel est le pire navigateur lorsqu’il s’agit de manipuler le DOM.

Webkit... ou comment reproduire les erreurs du passé.

Publié par Fabrice Michellonet sous le(s) label(s) , le 31 mars 2009

A croire que l'histoire se répète indéfiniment, et qu’on ne tire pas de leçons du passé.

Pourquoi ce coup de gueule ? Tout simplement parce que je viens de tomber sur une news qui présente les EXTRAORDINAIRES nouvelles propriétés CSS du moteur Webkit (utilisé principalement par Safari et Google Chrome)…

Attention mesdames et messieurs, jusqu’à maintenant on utilisait les CSS pour styler un élément, maintenant avec Webkit vous pouvez lui donner un comportement.

La preuve en image : une horloge uniquement en CSS.

Horloge CSS

Et le fabuleux bout de CSS proprietaire qui va bien...

   
/* -webkit-transition: property duration timing-function */
#clock img[src*='hour'] {
-webkit-transform: rotate(90deg);
}

#clock img[src*='second'] {
-webkit-transition: -webkit-transform 60s linear;
}

#clock:target img[src*='second'] {
-webkit-transform: rotate(360deg);
}

Comportements vous avez dit ? Mais, normalement ce n’est pas le rôle de Javascript de donner un comportement, dit l’architecte Web ?

Et dire que dans le passé, lorsqu’ Internet Explorer 6 était le seul browser potable du marché (non Jérome Links n’est pas à proprement parlé un browser :)) des milliers de voix s’élevait contre toutes les fonctions propriétaires que Microsoft avait introduites en marge de la norme.

Tient, la c’est marrant, j’en entends beaucoup moins s’insurger….


#fabrice {
-webkit-shutup: 5sec;
}

[Source Ajaxian]

Quand Google et Microsoft fonctionnent main dans la main.

Publié par Fabrice Michellonet sous le(s) label(s) , le 27 mars 2009

Dernièrement, j'ai l'impression que dans le giron de Microsoft on s'émeut de plus en plus, parfois outre mesures, de ce qui se fait chez Google. Pourtant, je me suis laissé dire qu'il existe surement des terrains ou les deux offres se complètent.

En ce moment par exemple, je travaille chez mon client avec le composant Javascript de Virtual Earth qui permet, comme tout le monde doit déjà le savoir, d’afficher de belles cartes géographique avec zoom, navigation interactive et toutes les petites choses sexy que les aficionados de Google Maps apprécient.

Imaginez maintenant que vous ne souhaitiez pas uniquement

  • explorer les environs de votre lieu d’habitation,
  • ou bien encore prévoir le trajet en faire en auto pour vous rendre dans votre prochain lieu de villégiature
mais que vous souhaitiez pour votre projet BI actuel afficher vos indicateurs quels qu’ils soient sur une jolie carte le tout sur une simple page web…

Bien, je suis sur que vous me voyez venir avec mes gros sabots…

Alors prenons une petite dose de Virtual Earth et un soupçon de Google Charts et l’on obtient alors quelque chose dans ce goût la :

Carte + Graph

Et pour ceux qui se demande comment on peut faire ce genre de chose voici le code, somme toute très très simple :



<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">

<html xmlns="http://www.w3.org/1999/xhtml" >
<head><title>
Virtual Earth
</title><meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
<script type="text/javascript" src="http://dev.virtualearth.net/mapcontrol/mapcontrol.ashx?v=6.2&mkt=fr-FR"></script>

<script type="text/javascript">
function initialize() {
map = new VEMap('myMap');
var ParisLatLong = new VELatLong(48.8667, 2.3333);
map.LoadMap(ParisLatLong);
map.Resize(800, 600);
map.SetZoomLevel(7);
map.SetCenter(ParisLatLong);

var newShape = new VEShape(VEShapeType.Pushpin, ParisLatLong);

newShape.SetTitle("Répartition des moyens de transport à Paris");
newShape.SetDescription('<img src="http://chart.apis.google.com/chart?chtt=un+beau+spacer&chts=ffffff&chs=200x100&chf=bg,s,ffffff&cht=p3&chd=t:56.00,40.00,4.00&chl=Autos|Motos|Autres" alt="My google chart" />');
map.AddShape(newShape);
}
</script>

<style type="text/css">
HTML, BODY, FORM {margin:0; padding:0; height:100%; width:100%;}
</style>

</head>
<body onload="initialize();">
<form name="form1" method="post" action="Default.aspx" id="form1">
<div id="myMap" style="position:relative; width:100%; height:100%"/>
</form>
</body>
</html>

Evidement je laisse libre cours à votre imagination pour rendre vos cartes BI encore plus interactive et bien entendu attractives pour les utilisateurs.

J’en profite pour vous donner deux liens qui m’ont semblé fort intéressants :