skip to main | skip to sidebar
Code 18
Manuel du savoir-faire à l'usage des geeks et des curieux
RSS
  • Accueil
  • Le web au Québec
  • Liens
  • Twitter
  • Facebook
  • À propos

dimanche 11 octobre 2009

Intégrer Google Maps sur un site web

Publié par Infinite Loop, à 10 h 07 0 commentaire

Tout le monde aime Google Maps et ceux qui possèdent un commerce avec pignon sur rue désirent souvent afficher la carte pour indiquer leur localisation. Je vais vous montrer à quel point c'est facile d'intégrer Google Maps et je vous présenterai quelques options intéressantes.

D'abord, il vous faut une clé d'API (gratuite) qui est reliée au domaine sur lequel on veut l'installer (fonctionne aussi sur les sous-domaines et les répertoires).

Une fois en possession de votre clé, vous devrez faire un peu de JavaScript. Incluez en entête la librairie externe de Google Maps en prenant soin d'y placer votre clé d'API.

<script src="http://maps.google.com/maps?file=api&amp;v=2&amp;sensor=true&amp;key=VOTRE_CLE" type="text/javascript"></script>
Dans le code HTML, déclarez un conteneur dans lequel la carte s'affichera. Prenez soin d'attacher les fonctions aux événements load et unload (libre à vous de le faire comme ci-dessous ou avec Prototype ou jQuery).
<body onload="initGM()" onunload="GUnload()">
<div id="mapHolder" style="width:800px;height:600px"></div>
</body>
Ouvrez un bloc JavaScript et déclarez les objets principaux :
var map;
var geocoder;
Je prendrai pour acquis qu'on utilisera la carte pour afficher qu'une seule coordonnée. Déclarez deux nouvelles variables qui contiendront les informations à afficher dans la bulle (lorsqu'on cliquera sur le marqueur) :
var title = "La Banquise";
var address = "994, Rue Rachel Est, Montreal, QC H2J 2J3";
Il faut définir la fonction qui initialise la carte au chargement de la page. Quelques lignes seraient suffisantes mais comme je présente quelques options, je commenterai au fur et à mesure dans le code.
function initGM() {
if (GBrowserIsCompatible()) {

// mapHolder est le conteneur HTML
map = new GMap2(document.getElementById("mapHolder"));

// on peut utiliser cette façon mais qui
// connait vraiment les coordonnées ?
// map.setCenter(new GLatLng(37.4419, -122.1419), 13);

// à la place, les trouver avec Geocoder!
geocoder = new GClientGeocoder();

// la variable address a été définie
// plus haut
geocoder.getLocations(address, addToMap);

// constantes du choix de carte
// G_NORMAL_MAP
// G_SATELLITE_MAP
// G_HYBRID_MAP
map.setMapType(G_NORMAL_MAP);

// affiche les contrôles par défaut
// (zoom et types de cartes)
// map.setUIToDefault();

// ou bien, personnaliser les contrôles
// on doit utiliser addControl

var mapTypeControl = new GMapTypeControl();

// positions possibles
// G_ANCHOR_TOP_RIGHT
// G_ANCHOR_TOP_LEFT
// G_ANCHOR_BOTTOM_RIGHT
// G_ANCHOR_BOTTOM_LEFT
var topRight = new GControlPosition(G_ANCHOR_TOP_RIGHT, new GSize(10,10));
map.addControl(mapTypeControl, topRight);

// pour le contrôle de zoom
// GSmallMapControl / GLargeMapControl
// GLargeMapControl = la barre verticale
// dégradée
map.addControl(new GSmallMapControl());
}
}
Il ne reste qu'à définir la fonction addToMap() qui contrôle aussi le contenu affiché dans la bulle.
function addToMap(response){
place = response.Placemark[0];

// obtenir la latitude et longitude
point = new GLatLng(place.Point.coordinates[1], place.Point.coordinates[0]);

// centrer la carte sur ce point
// 18 représente la profondeur du zoom
map.setCenter(point, 18);

// créer le marqueur
var numberedIcon = new GIcon(G_DEFAULT_ICON);

// permet de changer l'icône par défaut
// par exemple le logo de l'entreprise
// numberedIcon.image = 'http://www.domaine.com/marker.png';
markerOptions = { icon:numberedIcon, clickable:true };
marker = new GMarker(point, markerOptions);

// ajouter le marqueur à la carte
map.addOverlay(marker);

GEvent.addListener(marker, "click",
function() {
var streetAddress = place.AddressDetails.Country.AdministrativeArea.SubAdministrativeArea.Locality.Thoroughfare.ThoroughfareName;
var city = place.AddressDetails.Country.AdministrativeArea.SubAdministrativeArea.Locality.LocalityName;
var state = place.AddressDetails.Country.AdministrativeArea.AdministrativeAreaName;

marker.openInfoWindowHtml(
'<strong>' + title + '</strong>' + '<br>' + streetAddress + '<br>' + city + ', ' + state);
}
);
}
Ça peut ne pas sembler très clair ce que je fais avec var streetAddress = place.AddressDetails... mais si vous éclatez l'objet "place" avec Firebug (console.log(place)), vous aurez accès à toute la structure de l'objet JSON qui permet de récupérer toutes les informations de géolocalisation sur le point demandé.

Je n'ai pas encore pris le temps de régler l'affichage du code sur mon blogue alors je vous suggère de l'ouvrir en cliquant sur "view plain" dans le coin supérieur gauche des blocs de code pour le voir mieux indenté et sans retour de chariots automatiques.

Vous voilà maintenant avec une carte fonctionnelle.


Tags: Intégration, JavaScript

Citation no. 52 sur l'ignorance

Publié par Infinite Loop, à 08 h 15 0 commentaire

Pour masquer une ignorance lexicale, Perceval utilise l’expression suivante :

C’est pas faux.

- Perceval le Gallois, personnage de Kaamelott


Tags: Citations

samedi 10 octobre 2009

Problème avec le service Google Maps : non disponible

Publié par Infinite Loop, à 10 h 21 0 commentaire

Ce matin, j'étais en train de préparer un article expliquant comment intégrer Google Maps à son site web (avec certaines options) et alors que je testais différentes configurations, le service de Google s'est soudainement interrompu et la carte ne s'affichait plus.

J'ai ouvert Firebug et j'ai vu dans la console deux messages d'erreurs consécutifs : GUnload is not defined et GBrowserIsCompatible is not defined. C'était curieux car j'ai révisé le code source et tout semblait en ordre.

Ensuite, j'ai examiné les headers HTTP (sous l'onglet NET de Firebug), je me suis rendu compte que l'appel à "http://maps.google.com/maps" retournait l'erreur 503 : Service Unavailable.



Pourquoi le service ne serait pas disponible ? Serait-ce une panne ? J'ai ouvert le node (+) GET sorry?continue... pour connaître le détail et les sous-onglets Response et HTML ont pu m'éclairer sur ce qui se passait.

Il semblerait que vu le nombre répété de requêtes vers son service, il ait considéré mes demandes comme étant douteuses. Sous HTML, on peut voir le message suivant :

We're sorry... but your computer or network may be sending automated queries. To protect our users, we can't process your request right now. To continue searching, please type the characters you see below : [captcha].



J'ai fait le test de cliquer avec le bouton droit de la souris sur le lien "GET sorry?continue...", j'ai fait "Open in new tab" pour accéder à la page. J'ai entré le captcha et lorsque je suis retourné sur ma page qui incluait l'appel à Google Maps, le service était à nouveau disponible.

J'ai refait tout le processus pour faire afficher la trace de la création des cookies et il semblerait que dans certains circonstances, Google refuse de créer le cookie GDSESS qui est nécessaire à l'authentification du service de cartographie. Dès que le captcha est correctement remplit, ce cookie est créé et il le service fonctionnera tant et aussi longtemps qu'il existera.


Tags: Intégration, JavaScript

vendredi 9 octobre 2009

2% du code du noyau Linux

Publié par Infinite Loop, à 17 h 27 0 commentaire

Bien qu'il y ait eu bon nombre de contributeurs (des milliers), on attribue souvent le mérite de Linux à son créateur original, Linus Torvalds (la preuve : nommez moi en un autre!).

Selon le document Linus Torvalds, A Very Brief and Completely Unauthorized Biography (source: LIFO - Linux Information Project) en date de 2006, M. Torvalds aurait écrit environ l'équivalent de 2% du noyau actuel (ce qui est quand même beaucoup).

[Traduction libre]
Aujourd'hui, le code source complet de la version 2.6 du kernel pèse environ 80 Mo. Linus possède la marque de commerce "Linux" et prend toutes les décisions finales concernant les ajouts et modifications proposés.

Ses critères d'évaluation sont :

  1. la haute qualité et la clareté du code
  2. la facilité de la maintenance
  3. doit être bénéfique à un large éventail d'utilisateurs, plutôt qu'un seul ou une entreprise
Si vous voulez approfondir vos recherches sur ses origines, vous trouverez une archive des noyaux Linux sur www.kernel.org dont les release notes de la version 0.01 (septembre 1991) ainsi que du code source.

Un extrait des notes qui fera peut-être un jour parti de l'histoire, paragraphe 7. Apologies :-) :

This isn't yet the "mother of all operating systems"...

Mais qui sait si ça le deviendra ?

En guise de conclusion :

Happy hacking.
- Linus Torvalds


Tags: Linux, Saviez-vous que

Fête de fin de semaine chez Future Shop ?

Publié par Infinite Loop, à 07 h 03 0 commentaire

Faut croire que c'est tous les jours fête chez Future Shop! Ce matin, j'ai reçu par courriel (liste de diffusion) cette publicité qui annonce un Solde de la Fête de fin de semaine. Dans mon calendrier à moi, c'était plutôt écrit "longue fin de semaine de l'action de grâce" mais bon, ça évolue tellement vite ces affaires là...


Tags: Curiosités, Humour

jeudi 8 octobre 2009

BogoMIPS sur mon netbook Linux

Publié par Infinite Loop, à 17 h 28 0 commentaire

J'explorais différentes commandes dans un terminal Linux sur mon netbook Acer Aspire One et j'ai commencé à faire afficher différentes informations système :

Obtenir la version du noyau

cat /proc/version

2.6.28-11

Décrire l'utilisation de la mémoire vive

cat /proc/meminfo

1 016 888 bytes (1 Gb)
488 700 bytes de disponible (et j'ai activé plusieurs effets visuels "eyecandy")

Obtenir de l'information sur le microprocesseur

cat /proc/cpuinfo

Intel Atom N270 800 1.6 GHz

Dans la multitude de lignes de résultats de cette dernière commande, j'en ai vu une qui mesurait le BogoMIPS.

BogoMIPS : 3192.23

Comme dirait l'autre : kossé ça ? Le BogoMIPS (million instructions per second) est une mesure non-scientifique qui sert à calibrer une boucle d'activité interne et qui pourrait être décrite comme étant "le nombre de millions de fois par secondes que le processeur peut faire absolument rien". En gros, ça mesure de la vitesse de calcul d'un programme. Cette mesure est calculée au démarage selon une échelle de comparaison avec le processeur Intel 386DX.

Faits :

  • Le plus faible score (0.02 BogoMips) a été enregistré sur un Intel 8088, 4.77 MHz, ELKS.
  • Le meilleur score (3776.00 BogoMips) a été fait par un Sequent NUMA-Q, 32 CPUs P6, à 180 MHz (système d'exploitation Dynix - Dynamic Unix).
Demain, c'est vendredi. S'il n'y a pas de surcharge de travail, je vais tenter l'expérience de calculer mon BogoMIPS personnel. Je vous en redonne des nouvelles.


Tags: Linux

mercredi 7 octobre 2009

Dreamweaver mange mes variables !

Publié par Infinite Loop, à 17 h 32 1 commentaire

Ces dernières années, j'ai utilisé Dreamweaver que pour les quelques rares fois où j'ai eu besoin de l'éditeur WYSIWYG (mode Design). Récemment, j'ai ouvert une page PHP dans Dreamweaver et j'ai vraiment regretté...

Dans un cas très particulier, Dreamweaver modifie les variables écrites en "camel case" pour les transformer entièrement en minuscule. Et comme c'était une page PHP et que dans ce langage, les variables sont sensibles à la casse, ça a fait un beau gâchis dans de nombreuses pages de mon projet. Ce qui veut dire que $maVariable n'équivaut pas à $mavariable.

Le pire dans tout ça, c'est qu'à l'ouverture d'un fichier, Dreamweaver applique les modifications et ne montre pas que le fichier a été modifié ! Il transforme certaines variables à notre insu en suivant les directives inscrites dans les préférences.

Le contexte est particulier. Lorsque du code dynamique est placé à l'intérieur d'une balise HTML, par exemple pour ajouter un attribut de style, que ce code est écrit sur une seule ligne, sans qu'il y ait d'espace entre la fermeture du code dynamique et l'attribut HTML, il transforme ce qui se trouve entre en minuscule.

Par exemple, le code suivant :

<div
<?php if($iCamelCaseVariable >= $myObject->method()) { ?>
style="display:none;"
<?php } ?>
>
$iCamelCaseVariable et $myObject seront transformés si DW trouve ceci :
method()) { ?>style="display:none;"<?php } ?>

Et ne le seront pas lorsqu'il détecte l'espace avant l'attribut style :
method()) { ?> style="display:none;"<?php } ?>

Ceci se produit en raison d'une configuration de l'application qui force l'édition du code à être uniforme, mais Dreamweaver ne semble pas considérer ou détecter correctement qu'il y a du code PHP et applique la règle à l'ensemble du code, pas seulement aux marqueurs HTML.

Heureusement, j'ai remarqué que l'option était inactive par défaut sous CS4. Sinon, on peut la désactiver par ici :
  • Menu Edit / Preferences / Code Format
  • Décocher l'option Override case of : Attributes
  • Dans le cas contraire, Dreamweaver appliquera la règle spécifiée sous "Default attribute case"


J'ai observé ce comportement dans Dreamweaver, depuis au moins la version 8 jusqu'à la plus récente CS4.


Tags: PHP, Programmation

Messages plus récents Messages plus anciens Accueil
S'abonner à : Messages (Atom)
    Suivre @code18 sur Twitter

    Catégories

    • Apache (21)
    • Citations (167)
    • Club Vidéo (24)
    • Coffre à outils (55)
    • CSS (8)
    • Curiosités (117)
    • Design Pattern (2)
    • Drupal (8)
    • Easter Eggs (22)
    • Extensions Firefox (20)
    • GIMP (7)
    • Histoire (21)
    • HTML (32)
    • Humour (57)
    • Intégration (34)
    • iPod (12)
    • JavaScript (110)
    • Jeu de combat (6)
    • Le coin du geek (128)
    • Liens (12)
    • Linux (56)
    • Livres (78)
    • Lois et principes (46)
    • Marché des saveurs (26)
    • Mathématique (18)
    • Mobile (5)
    • Montréal (32)
    • Musique (112)
    • Pancartes et écriteaux (16)
    • Perl (8)
    • Pérou (1)
    • PHP (130)
    • PostgreSQL (44)
    • Programmation (105)
    • Saviez-vous que (55)
    • Sécurité (22)
    • SEO (5)
    • SQL Server (22)
    • Vieilles publicités (6)
    • Virtualisation (8)
    • Voyages (1)
    • Zend Framework (26)

    Divers

    Archives

    • ▼  2015 (6)
      • ▼  août 2015 (1)
        • Citation no.164 sur la tromperie
      • ►  juillet 2015 (1)
      • ►  février 2015 (3)
      • ►  janvier 2015 (1)
    • ►  2014 (8)
      • ►  décembre 2014 (1)
      • ►  novembre 2014 (1)
      • ►  octobre 2014 (1)
      • ►  août 2014 (2)
      • ►  juillet 2014 (2)
      • ►  janvier 2014 (1)
    • ►  2013 (53)
      • ►  décembre 2013 (2)
      • ►  novembre 2013 (1)
      • ►  octobre 2013 (3)
      • ►  septembre 2013 (2)
      • ►  août 2013 (5)
      • ►  juillet 2013 (3)
      • ►  juin 2013 (5)
      • ►  mai 2013 (3)
      • ►  avril 2013 (7)
      • ►  mars 2013 (7)
      • ►  février 2013 (11)
      • ►  janvier 2013 (4)
    • ►  2012 (105)
      • ►  décembre 2012 (8)
      • ►  novembre 2012 (5)
      • ►  octobre 2012 (4)
      • ►  septembre 2012 (1)
      • ►  août 2012 (8)
      • ►  juillet 2012 (7)
      • ►  juin 2012 (7)
      • ►  mai 2012 (10)
      • ►  avril 2012 (13)
      • ►  mars 2012 (15)
      • ►  février 2012 (15)
      • ►  janvier 2012 (12)
    • ►  2011 (146)
      • ►  décembre 2011 (14)
      • ►  novembre 2011 (11)
      • ►  octobre 2011 (12)
      • ►  septembre 2011 (13)
      • ►  août 2011 (15)
      • ►  juillet 2011 (17)
      • ►  juin 2011 (18)
      • ►  mai 2011 (15)
      • ►  avril 2011 (9)
      • ►  mars 2011 (7)
      • ►  février 2011 (3)
      • ►  janvier 2011 (12)
    • ►  2010 (398)
      • ►  décembre 2010 (29)
      • ►  novembre 2010 (28)
      • ►  octobre 2010 (32)
      • ►  septembre 2010 (34)
      • ►  août 2010 (22)
      • ►  juillet 2010 (35)
      • ►  juin 2010 (42)
      • ►  mai 2010 (36)
      • ►  avril 2010 (37)
      • ►  mars 2010 (34)
      • ►  février 2010 (32)
      • ►  janvier 2010 (37)
    • ►  2009 (429)
      • ►  décembre 2009 (32)
      • ►  novembre 2009 (34)
      • ►  octobre 2009 (33)
      • ►  septembre 2009 (37)
      • ►  août 2009 (37)
      • ►  juillet 2009 (39)
      • ►  juin 2009 (38)
      • ►  mai 2009 (37)
      • ►  avril 2009 (35)
      • ►  mars 2009 (36)
      • ►  février 2009 (32)
      • ►  janvier 2009 (39)
    • ►  2008 (84)
      • ►  décembre 2008 (34)
      • ►  novembre 2008 (39)
      • ►  octobre 2008 (11)

    Abonnés

Copyright © All Rights Reserved. Code 18 | Converted into Blogger Templates by Theme Craft