API Google Maps

J’ai eu l’occasion la semaine dernière, de jouer avec l’API Google Maps. Récupération de données en json auprès d’un serveur en lui demandant de filtrer les résultats sur la valeur d’un champ. Je présente ici, une version simplifiée, j’ai placé des données en dur dans mon fichier .js, quelques gares: Nom, Région, Latitude, Longitude, et je m’arrange pour afficher leur position avec l’API de Google.

On prépare d’abord la page Html qui va recevoir le tout. On ajoute le JS de l’API:

<script type="text/javascript" src="http://maps.googleapis.com/maps/api/js?key=VOTRE_CLE&sensor=false">
</script>

En remplaçant VOTRE_CLE par la cle d’API générée par Google.

On place une balise <div> pour accueillir la map une fois celle-ci générée.

Initialisation de la Google Maps

var mapOptions = {
  center: new google.maps.LatLng(47.2, 2),
  zoom: 5,
  mapTypeId: google.maps.MapTypeId.ROADMAP
};
map = new google.maps.Map(document.getElementById("map_canvas"),
  mapOptions);

Pour créer un marqueur:

var latlng = new google.maps.LatLng(latitude, longitude);
var marker = new google.maps.Marker({
  position: latlng,
  title: "Titre du marqueur"
});
marker.setMap(map);

Concernant la gestion des marqueurs, depuis la dernière version de Google Maps, il est nécessaire de les gérer soit même. Il faut donc garder une trace des marqueurs pour pouvoir les supprimer par la suite, si besoin. On stockera les marqueurs dans un tableau.

var markersArray = [];

On ajoute les marqueurs au tableau après le placement sur la carte.

markersArray.push(marker);

La fonction pour supprimer tous les marqueurs du tableau de la carte et nettoyer la carte est deleteOverlays().

Pour créer une OpenWindow:

var infowindow = new google.maps.InfoWindow({
  content: contentString
});

//Ajout d'un Listener sur le marqueur pour réagir en cas de clic
google.maps.event.addListener(marker, 'click', function() {
  infowindow.open(map,marker);
});

Obtenir votre clé d’API Google Maps
Aller sur https://code.google.com/apis/console et se connecter avec son compte Google.
Cliquer sur Services dans le menu à gauche.
Activer le service Google Maps API v3.
Cliquer sur API Access dans le menu à gauche.
La clé est visible dans la page API Access, section Simple API Access, celle-ci est indiqué sous le nom de Key for browser apps.

Le code:

<!DOCTYPE html>
<html>
    <head>
        <meta charset="utf-8" />
        <link rel="stylesheet" href="style.css" />
        <title>Gare de France</title> 

        <script src="jquery.js"></script>
    <script src="getdata.js"></script>
    <script type="text/javascript"
        src="http://maps.googleapis.com/maps/api/js?key=VOTRE_CLE&sensor=false">
        </script>
    </head> 

 <body>
    <div id="map_canvas"></div> 

    <div id="gareTab">
        <h1>Liste de Gares Françaises</h1> 

        <table><tr>  <th>Nom de la gare</th> <th>Région</th> <th>Latitude</th>   <th>Longitude</th>  </tr></table>
    </div>
 </body>
</html>

Côté CSS, on aura:

html {
      height: 100%
}
body {
    height: 100%;
    margin: 0;
    padding: 0;
    margin-left: 2em;
    margin-top: 2em;
}
table {
    border-collapse: collapse;
}
td, th {
    border: 1px solid black;
    padding-left: 5px;
    padding-right: 5px;
}
#map_canvas {
     display: inline-block;
     position: absolute;
     margin-top: 6em;
     width: 50%;
     height: 55%;
     left: 45%
 }
#gareTab {
     position: absolute;
     width: 60%;
     margin-top: 6em;
 }

Et enfin, passons au côté JavaScript proprement dit:

//Contient tous les marqueurs présents sur notre carte
var markersArray = [];
//On retient l'InfoWindow ouverte pour pouvoir la fermer au besoin
var openedInfoWindow;
//Nos données
var data = [
            {
                "Nom de la gare": "Amiens",
                "Région": "Picardie",
                "Latitude": "49.88993025",
                "Longitude": "2.30981909"},
            {
                "Nom de la gare": "Lyon-Part-Dieu",
                "Région": "Rhône-Alpes",
                "Latitude": "45.76032897",
                "Longitude": "4.86050906"},
            {
                "Nom de la gare": "Bas-Monistrol",
                "Région": "Auvergne",
                "Latitude": "45.29796638",
                "Longitude": "4.13958253"},
            {
                "Nom de la gare": "Strasbourg",
                "Région": "Alsace",
                "Latitude": "48.58496713",
                "Longitude": "7.734584"}, 

            {   "Nom de la gare": "Quiberon",
                "Région": "Bretagne",
                "Latitude": "47.48552763",
                "Longitude": "-3.11816733"},
            {
                "Nom de la gare": "Carcassonne",
                "Région": "Languedoc-Roussillon",
                "Latitude": "43.21816508",
                "Longitude": "2.35242959"}
            ]; 

//Suppression des marqueurs Google Maps
function deleteOverlays() {
  if (markersArray) {
    for (i in markersArray) {
      markersArray[i].setMap(null);
    }
    markersArray.length = 0;
  }
} 

//Suppression du contenu du tableau de gare
function deleteTab() {
    for(var i = 0; i < $('.ligne').length; ++i) {
        $('.ligne').remove();
    }
} 

//S'exécute lorsque le document est prêt
function readyFn() { 

    //Initialisation de la Google Maps
    var mapOptions = {
        center: new google.maps.LatLng(47, 2),
        zoom: 6,
        mapTypeId: google.maps.MapTypeId.ROADMAP
    }; 

    map = new google.maps.Map(document.getElementById("map_canvas"),
    mapOptions); 

    //Suppression de tout ce qui pourrait préexister
    deleteOverlays();
    deleteTab(); 

    var tab = [];//On construit le contenu du tableau HTML dans tab
    data.forEach(function(element, index, array) {
        //Construction d'une ligne du tableau
        tab.push('<tr><td> ' +
            element["Nom de la gare"] + ' </td><td>' +
            element["Région"] + ' </td><td>  ' +
            element["Latitude"] + '  </td><td>  ' +
            element["Longitude"] + '  </td></tr>'
        ); 

        //Construction du marqueur Google Maps
        var latlng = new google.maps.LatLng(element["Latitude"], element["Longitude"]);
        var marker = new google.maps.Marker({
            position: latlng,
            title: element["Nom de la gare"]
         });
        marker.setMap(map);//Ajout du marqueur à la carte
        markersArray.push(marker); 

        //Ajout d'une InfoWindow pour chaque marqueur
        //Ce qui s'affichera:
        var contentString = '<b>' + element["Nom de la gare"]
            + '</b><br />' + element["Région"]
            + '<br />Latitude: ' + element["Latitude"]
            + '<br />Longitude: ' + element["Longitude"]; 

        //Création des fenêtres d'info (ou InfoWindow)
        var infowindow = new google.maps.InfoWindow({
            content: contentString
        }); 

        //Ajout d'un Listener sur le marqueur pour réagir en cas de clic
        google.maps.event.addListener(marker, 'click', function() {
            if(openedInfoWindow != undefined) {//Au cas où il n'y a pas d'info window à fermer
                openedInfoWindow.close();
            }
            infowindow.open(map,marker);
            openedInfoWindow = infowindow;
        });
    }); 

    //concaténation du tableau en string et ajout dans la balise table
    $('table').append(tab.join(''));
} 

$(document).ready(readyFn);

 

Pour tout savoir sur l’API Google Maps, je vous conseille la doc de Google qui est très claire et détaillée:
https://developers.google.com/maps/documentation/javascript/tutorial

Pour le zip contenant les fichiers ci-dessus, c’est par ici:

GareOnGoogleMaps

Maj 25.03.2013: En fait, il n’est pas nécessaire de générer une clé d’API pour pouvoir utiliser la Google Maps. Il suffit simplement d’utiliser l’url suivante http://maps.googleapis.com/maps/api/js?&sensor=false correspondant à l’adresse utilisée dans cette exemple sans le paramètre key. Ajout du zip comprenant les sources.

Amara – Universal Subtitles, Traduire et sous-titrer une vidéo

Je tenais à vous présenter ce site bien pratique, si vous envisagez de traduire et sous-titrer des vidéos, dans une ou plusieurs langues. D’abord nommé Universal Subtitles, le site porte désormais le nom d’Amara, même si l’url reste la suivante: https://www.universalsubtitles.org/fr/. L’édition des sous-titres se fait facilement, pour peu qu’on ait du temps et de la patience, selon la durée de votre vidéo.

Le site accepte les liens de vidéos Youtube, Vimeo, HTML 5 et d’autres encore. Après avoir ajouter une vidéo, on peut donc passer à la création des sous-titres dans la langue de notre choix. Si le site marche sans problème sur l’OS à la fenêtre, il m’est malheureusement impossible de m’en servir sous Debian, notamment à cause du lecteur flash de Youtube, réutilisé pour visualiser la vidéo. L’édition des sous-titres se décompose en 4 étapes.

 

1)Typing

Typing

Pour cette première étape, il suffit d’écrire tout ce que vous entendez. La vidéo s’arrête toutes les 4 secondes et vous pouvez continuer la lecture avec la touche Tab. La combinaison Maj+Tab vous permet quant à elle de rejouer les 4 dernières secondes de la vidéo. Une fois que vous avez fini, arrive la synchronisation.

2)Sycing

Sycing

Dans cette étape, vous lancez la vidéo et appuyez sur Flèche Bas pour signaler l’apparition du sous-titre. Chaque pression sur la touche indique le début d’un sous-titre. La vidéo peut être mis en pause avec Tab et la technique vient après quelques essais.

 

3)Edit Title & Description

Edit Title & Description

La troisième étape consiste à traduire ou renseigner le titre de la vidéo ainsi que sa description. Étape qui permet de souffler un peu avant la fin.

 

4)Check your work

Check your work

Cette dernière étape vous permet de vérifier votre travail et surtout, d’ajuster le moment d’apparition de vos sous-titres. Pour ce faire, vous avez la possibilité de redimensionner les barres de sous-titres présentes sous la vidéo pour faciliter la lecture et faire coïncider le son et le texte. Cette étape peut parfois s’avérer longue puisque qu’elle demande de visionner plusieurs fois des morceaux de quelques secondes de la vidéo, avant que vous soyez satisfait. Une fois ce travail effectué, votre vidéo est prête à recevoir ses sous-titres et vous pouvez valider votre travail via « Submit your work ».

 

Voici par exemple trois vidéos que j’ai traduites et sous-titrées:

The World Is Saved

Revenge

Fallen Kingdom

Et deux autres auxquelles j’ai participé:

Freedom in the Cloud

The Coming War on General Computation

 

 

 

Debian et le Wifi

Après avoir utilisé Ubuntu, je m’étais finalement tourné vers Debian, version mère d’Ubuntu. J’ai dernièrement réinstallé mon ordinateur et lors de la configuration de mon système GNU/Linux, s’est posé le problème du wifi. Voilà donc la façon de procéder que j’ai utilisée pour faire fonctionner ma carte réseau.

Tout d’abord, on ajoute les dépôts non libre ou non-free:                                                     nano /etc/apt/sources.list

On ajoute les lignes suivantes:                                                                                           deb http://ftp.lip6.fr/pub/linux/distributions/debian/ squeeze contrib non-free
deb-src http://ftp.lip6.fr/pub/linux/distributions/debian/ squeeze contrib non-free                                                                                                                               Ou via l’interface graphique: Système > Administration > Sources de mise à jour         puis cocher la case « Logiciel non libre »

On met à jour la liste des paquets:                                                                                       aptitude update

On recherche ensuite des informations sur la carte wifi installée avec:                               lspci | grep -i net                                                                                                                   Dans mon cas, je repère le modèle de la carte wifi:                                                          Network controller: Intel Corporation PRO/Wireless 4965 AG or AGN [Kedron] Network Connection (rev 61)

On recherche ensuite le paquet qu’il nous faut:                                                                apt-cache search firmware | grep -i intel | grep -i firmware                                          Ou pour rester cohérent:                                                                                               aptitude search firmware | grep -i intel |grep -i firmware

On obtient le résultat suivant:                                                                                      firmware-intelwimax – Binary firmware for Intel WiMAX Connection
firmware-ipw2x00 – Binary firmware for Intel Pro Wireless 2100, 2200 and 2915
firmware-iwlwifi – Binary firmware for Intel Wireless 3945, 4965 and 5000-series cards
firmware-netxen – Binary firmware for QLogic Intelligent Ethernet (3000 and 3100 Series)

Dans mon cas, c’est iwlwifi qui m’intéresse.                                        Installation:                                                                                                                         aptitude install firmware-iwlwifi

Ces différents étapes m’ont donc permis d’avoir une carte wifi fonctionnelle sur mon système Debian, ce qui est particulièrement utile dans le cas d’un ordinateur portable ;). On retient également la page consacrée au wifi sur le wiki Debian: http://wiki.debian.org/WiFi

Installation d’un serveur Murmur (Mumble)

Aujourd’hui, je teste l’installation d’un serveur Murmur pour mettre en place un espace d’échange VoIP. Murmur représente la partie serveur, le côté client étant assuré par Mumble. Tout cela étant bien sûr libre!

On commence par ajouter les dépôts qui vont bien:                                                         nano /etc/apt/sources.list                                                                   deb http://ftp.de.debian.org/debian sid main

On installe les paquets:                                                                                                 apt-get install mumble-server mumble-server-web

On configure:                                                                                                 dpkg-reconfigure mumble-server

On modifie les paramètres:                                                                                              nano /etc/mumble-server.ini                                                                                        Notamment le message d’accueil:                                                                                          # Welcome message sent to clients when they connect                            welcometext= « <br />Welcome to this server running <b>Murmur</b>.<br />Enjoy!<br /> »                                                                                                                     Le mot de passe de connexion:                                                                                              # Password to join server                                                                           serverpassword=

On redémarre le serveur pour appliquer les nouveaux paramètres:                                 /etc/init.d/mumble-server restart

 

A ce stade, le serveur fonctionne sans problème. Il est possible de s’y connecter via un client Mumble. Pour ensuite personnaliser votre serveur en lui ajoutant des salons par exemple, il suffit de vous connecter au serveur en spécifiant son IP et en utilisant Superuser comme identifiant. Le mot de passe demandé pour valider la connexion est celui que vous avez choisi lors de la configuration.

Il ne reste donc plus qu’à tester la montée en charge avec la connexion simultanée de plusieurs personnes et espérer que tout fonctionne sans latence ni perte de signal.

RMLL 2012 5V

Article tardif clôturant la série RMLL 2012. Dès le retour, pas mal de choses à faire qui m’ont fait retarder la publication. Entre autres, fabrication de ma cotte de mailles et chantier de restauration.

RMLL 2012 Jeudi 12 Juillet

Journée commençant avec le pliage de la tente et le rangement des affaires.

9h20 Le logiciel libre: entre choix politique, juridique et économique

Trois approches différentes du logiciel libre. Politique, avec des exemples propres à la situation helvétique. Juridique, obligations découlant du logiciel libre. Les juristes doivent essayer de comprendre et reformuler les idées du libre. Économique, intérêt du libre de ce point de vue.

11h Description de la licence Open Hardware du CERN

La licence du CERN. Quoi, comment, dans quels buts, pour quelles utilisations.

14h Obstacles devant l’enseignement des technologies libres dans le supérieur en France

Table ronde pour essayer de dégager les obstacles au libre dans ce domaine. On constate une perte de la culture informatique chez les nouveaux étudiants. Peu de sensibilisation.

 

Départ de Genève peu après la fin de la table ronde. Nous faisons l’expérience des tronçons de tunnel d’autoroute en travaux, qui nous oblige à passer par les villages suisses.