Pythagore, c’est utile !

Comme tout le monde, vous avez eu, tôt ou tard, des cours de mathématiques. Et comme tout le monde, vous vous êtes un jour dit que les maths ne vous servirait à rien dans votre métier et votre vie future !

Parmi tous ces trucs qui semblaient inutiles, il y en a au moins un que vous n’avez pas oublié : le théorème de Pythagore. A quoi ça pouvait bien servir de savoir que le carré de l’hypothénuse de ce fichu triangle rectangle était égale à la somme des carrés des deux autres côtés ?

Figurez-vous qu’il y a quelques temps, je réalisais une petite application géographique avec l’aide de l’API Google Maps. Le but du jeu était de trouver, dans une base de données d’une centaine de points identifiés par des coordonnées en x et y, les trois points les plus proches d’un point donné.

Il a donc fallu calculer les distances entre le point donné et chaque point de la base de données et d’en extraire ensuite les trois plus petites.

Et devinez quelle est la meilleure méthode pour calculer la distance entre deux points dans le plan ? Pythagore bien entendu !

Voyons ce que ça peut donner algorithmiquement parlant (en JavaScript) dans un exemple simple.

Soit un tableau de plusieurs points identifiés par un label, la latitude et la longitude :

var cities = [
     {label:"Brussels", lat:"50.848385", long:"4.349685"},
     {label:"Paris", lat:"48.860001", long:"2.34"},
     {label:"London", lat:"51.52", long:"-0.1"},
     {label:"Amsterdam", lat:"52.373120", long:"4.893195"},
     {label:"Berlin", lat:"52.52", long:"13.38"}
]

Nous souhaitons trouver, parmi ces cinq villes, la ville la plus proche de la ville de Dunkerque dont les données sont enregistrées dans la variable suivante :

var my_city = {label:"Dunkirk", lat:"51.036995", long:"2.37693"}

Voici l’application du théorème de Pythagore :

var distance = Number.MAX_VALUE, label, current_distance;
for (var i=0; i<cities.length; i++) {
     current_distance = Math.sqrt(Math.pow(my_city.lat-cities[i].lat,2)+Math.pow(my_city.long-cities[i].long,2));
     if (current_distance<distance) {
          distance = current_distance;
          label = cities[i].label;
     }
}

Math.sqrt sert à réaliser une racine carrée et Math.pow une puissance.

Vous n’avez plus qu’à afficher le contenu de la variable label pour découvrir la ville la plus proche de Dunkerque.

alert('La ville la plus proche de Dunkerque est : ' + label);

Voilà une très belle application d’un bête théorème appris lors de nos bons vieux cours de mathématiques. Tout ça pour vous prouver que ce qu’on apprend à l’école, parfois, ça peut servir !

Transformer XML en JSON

Comme vous le savez, AJAX est l’acronyme de Asynchronous JavaScript and XML. Personnellement, je n’ai jamais jamais fait d’AJAX au sens précis du terme. Par contre, j’ai déjà fait un peu d’AJAPT (Asynchronous JavaScript and Plain Text) et beaucoup d’AJAJ (Asynchronous JavaScript and JSON).

En effet, le XML est une calamité à parser en JavaScript (même si certains outils tels jQuery permettent de faciliter le processus). Par contre, des formats comme le texte brut ou, mieux, le JSON sont beaucoup plus appropriés pour ce genre de tâches.

Mais c’est quoi JSON encore ?

C’est mon meilleur ami du moment !

JSON (JavaScript Object Notation) est un format de données générique qui utilise la notation des objets JavaScript pour transmettre de l’information structurée (source : Wikipédia).

En voici un exemple :

{"menu": {
  "id": "file",
  "value": "File",
  "popup": {
    "menuitem": [
      {"value": "New", "onclick": "CreateNewDoc()"},
      {"value": "Open", "onclick": "OpenDoc()"},
      {"value": "Close", "onclick": "CloseDoc()"}
    ]
  }
}}

L’énorme point fort de JSON est qu’il est lui-même du JavaScript, ce qui le rend très facile à manipuler avec ce langage.

Le framework Prototype l’a d’ailleurs bien compris et propose plusieurs méthodes permettant de travailler avec JSON (depuis la version 1.5.1)

Toutefois, si vous êtes quand même obligés de travailler avec du XML (provenant d’un Web Service, par exemple), sachez qu’il existe plusieurs techniques pour transformer XML en JSON (pas forcément côté serveur).

Pour ma part, j’en ai retenues deux…

Parker & Badger

BadgerFish est une convention permettant de traduire un fichier XML en un objet JSON.

Parker est une feuille de style XSLT permettant de transformer XML en JSON. Je préfère cette dernière méthode car le résultat obtenu respecte mieux le format JSON que BadgerFish (qui donne un résultat en JSON mais présentant une structure à la sauce XML).

Ce n’est bien entendu que mon pauvre avis personnel ! Les deux méthodes sont excellentes et fonctionnent relativement bien. Au développeur à utiliser l’une ou l’autre en fonction de ses préférences, de ses habitudes et de ses contraintes !

Merci à JFH qui a inspiré cet article !

Reminder: Yulbiz-Namur #1

Je vous rappelle que le prochain Yulbiz belge aura lieu à Namur le 26 janvier 2008 à partir de 16h au Coup de Foudre (Place de l’Ange).

Pas de concours, pas de cadeaux, juste de la bière, des cocktails et des discussions geek & biz !

Inscrivez-vous de ce pas sur l’événement Facebook !

Google Maps multi-domaines

Si vous avez déjà utilisé l’API de Google Maps, vous savez que vous devez générer une clé pour que cela fonctionne. Malheureusement, une clé est attachée à un et un seul domaine alors que certains sites se trouvent sur plusieurs domaines en même temps (ce qui est une erreur mais ça arrive) ou que certains sites disposent d’un serveur de test et un serveur de production.

Il faut donc ruser pour arriver à ses fins. Voici ce que je propose :

var key = '';
var current_url = window.location.host;

var urls = [
	{url:"test-url.com",key:"xxxxx"},
	{url:"prod-url.com",key:"yyyyy"}
];

var found = false;
for (var i=0;i<urls.length && !found; i++) {
	if (current_url.indexOf(urls[i].url) > -1) {
		key = urls[i].key;
		found = true;
	}
}

document.write('http://maps.google.com/maps?file=api&v=2&key='+key+'');

Il suffit de faire l’inclusion de ce fichier dans l’entête de votre fichier HTML et vous pourrez utiliser Google Maps sur une nombre illimité de domaines, à condition bien sûr de générer une clé pour chacun d’entre eux.

Pour rappel, comme l’explique Mike, inutile d’enregistrer une clé pour des sous-domaines. Si une clé est enregistrée pour un domaine, elle sera valable pour ses sous-domaines. Cela justifie l’emploi de la fonction indexOf().

Toute remarque est la bienvenue. Ce code a été écrit rapidement et n’est sans doute pas parfait !

En vrak – 69

Comme prévu, une édition spéciale sexy pour ce n°69

D’abord, une petite rétrospective de ce qui a déjà été dit dans cette rubrique :

* Melissa Theuriau, miss YouTube (#8)
* Pamela Anderson et Google (#14)
* L’annuaire Web 2.0 pour adultes (#38)
* Bom Chicka Wah Wah (#38)
* Tania Derveaux (#40)
* Nothing to hide (#41)
* Photos de cheerleaders (#45)
* Le string sans ficelle (#45)
* Les filles sur les stands de salons automobiles (#51)
* FHM Posters (#52)
* La culotte de Lisa Simpson (#55)
* Adriana Karembeu (#57)
* VULVA (#58)
* Parfum pour hommes de Tom Ford (#59)
* JDS Wallpapers (#59)
* Record du monde du plus grand nombre de bikinis sur une photo (#61)
* Concours Show Me Your Sloggi et la gagnante (#64)
* Moan My IP (#65)

Et pour bien commencer 2008, une petite sélection de calendriers pour cette nouvelle année :

* Ryan AIR
* Clara Morgane
* Pirelli
* Agricultrices allemandes
* Aubade
* Les Dieux du Web
* Keeley Hazell

Et encore meilleurs voeux pour cette année 2008 !

La détection des navigateurs de Prototype

Un petit billet ultra technique, ça faisait longtemps…

J’utilise beaucoup Prototype en ce moment, aussi bien dans mon travail de tous les jours que pour des petites applications que je réalise à titre personnel.

Comme je suis curieux, j’ai ouvert ce fameux fichier prototype.js et j’ai essayé de voir comment ça fonctionnait (en gros).

Dans les premières lignes du fichier, j’ai particulièrement apprécié la détection de navigateurs, simple mais efficace pour distinguer les quatre principales familles de navigateurs Web actuels :

Browser: {
    IE:     !!(window.attachEvent && !window.opera),
    Opera:  !!window.opera,
    WebKit: navigator.userAgent.indexOf('AppleWebKit/') > -1,
    Gecko:  navigator.userAgent.indexOf('Gecko') > -1 && navigator.userAgent.indexOf('KHTML') == -1
  },

Les labels des deux premières lignes sont évidents, on comprend qu’on essaye de détecter Internet Explorer (IE) et Opera. Concernant les deux suivants, il est utile de connaître un peu les moteurs de rendus des navigateurs (voir cette étude que j’avais réalisée l’an passé, jour pour jour) pour comprendre. WebKit/WebCore est le moteur de rendu de Safari et Gecko est le moteur de rendu de Firefox, mais aussi de Flock, Camino et SeaMonkey, pour ne citer qu’eux.

Ces quatres familles représentent actuellement et sans trop exagérer 99,9% des parts de marché des navigateurs. Inutile d’aller plus loin… Passons désormais au code proprement dit !

On remarque tout de suite un truc qui peut vous paraître bizarre : le double point d’exclamation. Comme vous le savez tous, un point d’exclamation en JavaScript (et dans de nombreux autres langages de programmation) sert à faire une négation, par exemple !true vaut false et !false vaut true. On pourrait donc penser qu’une double négation de quelque chose redonne forcément la valeur originale de ce quelque chose. C’est sans compter sur le fait que :

* !!false vaut false (évidemment)
* !!undefined vaut false
* !!null vaut false
* !!0 vaut false
* !!'' vaut false (chaîne vide)

Mais attention :

* !!'0' vaut true !

La double négation donnera toujours un booléen (true ou false) comme résultat et c’est ce que les développeurs de Prototype ont cherché ici.

La détection d’IE est assez subtile. On sait que window.attachEvent est une méthode propriétaire uniquement comprise par Internet Explorer (les navigateurs modernes ont eu la bonne idée d’implémenter la méthode addEventListener standardisée par le W3C). Enfin… presque… En effet, Opera l’interprète aussi ! Il fallait donc trouver une parade. Cette parade, c’est window.opera, un mystérieux objet qui n’existe que sur Opera et qui a pour vocation de faciliter le debugging sur ce navigateur ! Il est donc logique d’utiliser cet objet pour détecter si le navigateur est Opera ou pas.

Pour WebKit et Gecko, les développeurs de Prototype ont chipoté avec les User-Agent, faute d’avoir trouvé des méthodes ou objets ultra spécifiques à ces navigateurs. Pour WebKit, c’est simple, cette famille de navigateurs est la seule à contenir la chaîne de caractère AppleWebKit dans son User-Agent. Pour Gecko, on essaye d’extraire la chaîne de caractère Gecko et on aimerait que ce soit suffisant. Malheureusement, les navigateurs basé sur KHTML (qui est à la base de WebKit) possèdent aussi la chaîne de caractère Gecko dans leur User-Agent. On retire donc ce sous-ensemble pour parfaire la sélection !

Désormais, grâce à cette détection infaillible que réalise Prototype, vous pouvez utiliser sans crainte ce genre de code dans vos scripts :

if (Prototype.Browser.IE) {
// code pour Internet Explorer
}
else {
// code pour les autres navigateurs
}

C’est pas beau, mais croyez moi, c’est toujours bien d’avoir ça sous la main !

Voilà, c’était le grand retour des articles techniques sur ce blog. Alors, heureux ?

5 * 3 * 2007

La chaîne du moment… Je me suis fait contaminer par Eric !

3 artistes que j’ai appris à connaitre cette année :

* Queens Of The Stone Age
* Ojos de Brujo
* The Von Durden Party Project

3 choses à ne pas oublier :

* Toutes les personnes rencontrées cette année essentiellement via mon blog et mon nouveau job !
* Toutes les soirées sympas avec les personnes citées ci-dessus
* Son baiser, son sourire, son parfum…

3 foirages de ma part :

* Mon accrochage avec une Mini sur l’Avenue de Tervuren
* Se rendre à Paris au moment des grêves des transports en commun
* Ne pas encore connaître ce fichu ActionScript 3

3 choses dont je suis fier :

* Yulbiz-Bruxelles
* Toutes les choses apprises cette année dans mon métier
* Avoir donné envie à d’autres de commencer un blog

3 choses que j’ai achetées :

* Un GPS
* Un MacBook
* Plein de fringues

3 personnes à qui je refile le virus :

* Céd’
* Greg
* Jérôme

Je pense que ceci est mon dernier post de 2007, je vous souhaite donc une excellente soirée de réveillon et une bonne année 2008 !

J’avais vu juste…

Vous vous en souvenez peut-être, au début de cette année, j’avais fait mes prévisions pour le Web en 2007. Voyons si tout cela s’est vérifié…

* Une grosse boîte (peut être Google mais peut être une autre) va racheter une plus petite boîte.

En effet, Google a racheté DoubleClick en 2007 !

* Une start-up que personne ne connait va faire faillite.

Comme personne ne connait cette start-up, on n’en a pas parlé dans les médias, mais je peux vous assurer qu’elle a bien fait faillite !

* Une start-up qu’on connait un peu (ou beaucoup) va lever des fonds.

Dailymotion a levé 25 millions d’euros en août de cette année !

* Quelques logiciels connus vont sortir une toute nouvelle version.

WordPress est sorti en version 2.3, Mac OS en version 10.5 (Mac OS X Leopard si vous préférez), Safari en version 3 (même qu’il y a eu une version pour Windows) et je peux encore en citer plein comme ça !

* Beaucoup de nouveaux sites vont utiliser AJAX et les flux RSS.

Le meilleur redesign de l’année à mes yeux : www.cnn.com

* Il y aura beaucoup de vidéos sur les sites en 2007.

Y en a même eu un peu trop, non ?

* Un site, qui n’existait qu’en version anglaise, va être traduit en français.

YouTube a vu naître une version française en juin 2007 !

* Les tendances des designs Web en 2007 seront comme en 2006 mais en mieux.

Ouais, c’était franchement mieux en 2007 !

* Beaucoup de blogs vont naître, mais beaucoup d’autres vont être abandonnés.

Quelques nouveaux blogs : Pepper & Koffee, Ère Zéro, Monsieur M, C’est dit exprès, etc.

* Beaucoup plus de sites qu’avant vont utiliser les technologies de Web sémantique (enfin, ça dépend).

J’avais vu juste en disant « ça dépend », le Web sémantique ne s’est pas encore réellement imposé en 2007, ce sera certainement le cas en 2008 (enfin, ça dépend).

Je ne ferai pas de prévisions pour 2008, histoire de ne pas dégouter les autres qui se sont plantés lamentablement !

Bongo Winebar

Tout d’abord, je souhaite m’excuser auprès de Weekendesk et Duval Guillaume, j’avais promis de parler du Bongo Winebar que vous m’avez offert avant le 15 décembre mais je n’ai pas eu l’occasion de le faire avant ce soir. Le boulot, Yulbiz, tout ça prend énormément de temps ! Je suis également très heureux d’avoir bénéficié du Bongo Winebar, vous avez vu juste, c’est la preuve que vous avez tout à fait cerné mon profil et que vous n’avez pas envoyé ces chèques cadeaux au hasard à n’importe qui.

Un mercredi soir de ce mois, nous nous sommes donc rendus au comocomo (après avoir hésité avec Winery à Uccle) situé non loin de la Bourse, où nous avons pu goûter quatre vins espagnols en accompagnement des tapas sur tapis roulant (à la japonaise) qui font la particularité du lieu.

Le premier fut un Soler-Jové Cava Mont Michel Brut Reserva. Pour ceux qui ne connaissent pas, le Cava est un vin mousseux provenant de la région de Catalogne et considéré par certains comme l’équivalent espagnol du Champagne, en beaucoup moins cher. Parfait pour l’apéro !

Ensuite, nous avons eu droit à un Txakoli, le vin à la mode du moment ! Ce vin blanc jeune, frais, fruité et légèrement pétillant accompagne à merveille les fruits de mer. Il est élaboré dans trois provinces basques : Guipúzcoa, Vizcaya et Alava.

Nous avons enchaîné sur un Blès Crianza, un vin rouge de la région de Valence et un Viriato, un vin rouge de la région de Castilla y León. Nous avons oublié les particularités de ces derniers, nous nous rappelons seulement qu’ils étaient loin d’être mauvais…

Tout ça pour vous dire que je vous recommande sincèrement d’aller au comocomo (où on mange très bien, en plus de boire du bon vin ibérique) et, bien entendu, d’essayer de vous faire offrir un Bongo, un produit très sympa dont je suis déjà devenu client (ça m’a bien aidé lorsque j’étais à court d’idées pour les cadeaux de Noël) !

Retour des articles techniques (fortement réclamés) en 2008 (j’en ai plein en réserve).