Projets – Quelques nouvelles

Quelques nouvelles à propos de deux projets, dont un nouveau ;-)

pyAggr3g470r

pyAggr3g470r évolue toujours avec une nouvelle page dédiée spécifiquement aux flux. Le but de cette page est d’afficher quelques informations relatives à un flux en particulier (nombre d’articles, favoris, nuage de tags des mots les plus fréquents, etc.). Cette page va également bientôt permettre de changer l’adresse du flux d’un site en mettant à jour toute la base de données. En effet certains sites (comme DLFP récemment) ont la fâcheuse tendance de changer d’URL de flux de temps en temps.

Pour récapituler voici les pages disponibles:

  • http://127.0.0.1:12556/, la page d’accueil;
  • http://127.0.0.1:12556/feed/id-feed, la nouvelle page d’informations pour les flux;
  • http://127.0.0.1:12556/articles/id-feed, liste de tous les articles d’un flux;
  • http://127.0.0.1:12556/article/id-feed:id-article, un article;
  • http://127.0.0.1:12556/favorites, la page des favoris;
  • http://127.0.0.1:12556/unread[/id-feed], la page des non lus;
  • http://127.0.0.1:12556/history, la page de l’historique;
  • http://127.0.0.1:12556/notifications, la page listant les abonnements par e-mail aux flux;
  • http://127.0.0.1:12556/management, la page de gestion (ajout/suppression de flux, etc.);

Démo de la nouvelle fonctionalité

Je trouve intéressant de voir le nuage de tags de chaque flux ainsi que la proportion d’articles favoris par flux. Voyons avec deux blogs.

Weblogue de bnj

demo-feed-2

Le terme “photo” revient le plus fréquement (19 fois).

Armed and Dangerous

demo-feed-1

Le terme “android” revient le plus fréquement (243 fois).

bPlog

Le nouveau projet bPlog pour Backpacker’s Log, inspiré de mes dernières aventures avec les GPS. Le but est d’avoir quelque chose de ce genre, un petit Google Latitude. Vous pouvez voir que la page a déjà un peu changé (http://where-is.cedricbonhomme.org/). Le module pygeocoder me permet de trouver un lieu avec pleins d’informations à partir des coordonnées géographiques. Il va falloir sécuriser les transactions et l’authentification. Pour le fun je vais peut être utiliser pyEnigma. Il faudra écrire d’autres clients (pour le moment seulement Android) et aussi un trigger XMPP pour identi.ca.

H.S.

  1. Pour la frime je tenais aussi à vous dire que j’ai été contacté par Google. Ce qui est moins classe, c’est qu’il s’agit juste d’une technique de Sourcing;
  2. admirez la nouvelle page de profil de Bitbucket.

Une petite alternative à Google Latitude

Où est Charlie?

Mon idée d’hier va certainement se concrétiser: http://where-is.cedricbonhomme.org/ (les données ne sont pas à jour, c’est pour tester).

Je pense que je vais encore exploiter quelques idées (statistiques, etc.) et écrire quelques CGI (Python, Perl et C). Les données GPS sont envoyés par Android et son stockées sur le serveur distant dans une base SQLite. Cela fonctionne très bien. Malgré le fait que dans mon patelin avec la qualité du réseau dès que Android se synchronise des time out surviennent.

Ça peut faire un petit projet libre sympa. Facilement ré-utilisable et améliorable. Plus qu’à lui trouver un nom (Où est Charlie?, Where is Brian? ou Longitude?), sécuriser les transactions et à améliorer un peu le code.

GPS, Android & Python

Au lieu de récupérer les données GPS d’Android en temps réel via bluetooth en utilisant un freeware du market pourquoi ne pas directement demander au téléphone? Et cela avec Python.

import android, time
droid = android.Android()

droid.startLocating()
time.sleep(10)

while True:
    l = droid.readLocation().result

    # provider = network or GPS
    latitude = l['network']['latitude']
    longitude = l['network']['longitude']

    print latitude, longitude

    time.sleep(10)

Ce script est totalement fonctionnel. On pourrait afficher encore pleins d’autres informations, comme l’altitude ou la vitesse. On voit qu’il faut d’abord vérifier le provider, c’est-à-dire si les informations proviennent du GPS ou du réseau. Pour certaines applications demandant moins de précision, pour aller plus vite on peut utiliser la méthode android.getlastknownlocation(), par exemple pour récupérer la météo à partir des coordonnées avec le module weather.

Cela me donne une idée de mini projet. J’écrirai bien quelques mini serveurs (en C, Perl et Python) ainsi qu’un petit client comme celui-ci en Python. Le serveur avec une clé publique, le client une clé privée. Et vous me voyez venir. En plus ça fonctionnerai très bien avec mon hébergement actuel ;-). Et plus besoin de Google Latitude.

Récupérer les données GPS d’Android en temps réel

Un moyen sympa d’exploiter le GPS de votre smartphone Android (Garmin ou autre d’ailleurs) est d’enregistrer une session de votre parcours au format GPX, de l’exporter au format NMEA, puis d’utiliser gpsfake afin de simuler un GPS connecté sur votre ordinateur. gpsfake va alors ouvrir un pty et envoyer les trames NMEA à une instance du serveur gpsd (lancé par gpsfake) qui “pensera” qu’un véritable GPS est connecté en série. À partir de là il est très facile de récupérer les trames NMEA. Cool, on a l’impression que c’est en direct mais ce n’est que de la “rediffusion”.

Le but ici est de récupérer sur l’ordinateur votre position géographique en utilisant le GPS d’Android, en temps réel. Pour cela il vous faudra une application sur votre smartphone pour envoyer les trames NMEA via bluetooth. Il en existe plusieurs gratuites. Celle-ci fera l’affaire. Activez le bluetooth sur le téléphone et lancez l’application.

Ensuite, il suffit d’exécuter le script ci-dessous. Nous gardons uniquement les trames GPRMC (exemple: $GPRMC,123519,A,4807.038,N,01131.000,E,022.4,084.4,230394,003.1,W*6A) qui contiennent les informations sur la position actuelle, la vitesse en noeud, etc.

import bluetooth
def get_nmea_data():
    # bluetooth address of the GPS device.
    addr = "00:22:A5:90:11:19"

    # create a socket and connect to it.
    for i in range(1,50):
        # HACK
        try:
            socket = bluetooth.BluetoothSocket(bluetooth.RFCOMM)
            socket.connect((addr, i))
            break
        except:
            pass

    data, olddata = "", ""
    latitude, longitude = "", ""

    while True:
        data = socket.recv(1024)
        if len(data) > 0:
            # append the old data to the front of data.
            data = olddata + data

            # split the data into a list of lines, but make
            # sure we preserve the end of line information.
            lines = data.splitlines(1)

            # iterate over each line
            for line in lines:
                # if the line has a carriage return and a
                # linefeed, we know we have a complete line so
                # we can remove those characters and print it.
                if line.find("\r\n") != -1 :
                    line = line.strip()
                    # empty the olddata variable now we have
                    # used the data.
                    olddata = ""

                # else we need to keep the line to add to data
                else :
                    olddata = line

            gpsstring = line.split(',')
            if gpsstring[0] == '$GPRMC' :
                latitude =  gpsstring[3] + gpsstring[4]
                longitude = gpsstring[5] + gpsstring[5]

        yield latitude + ":" + longitude

if __name__ == "__main__":
    for i in get_nmea_data():
        print i

Ce billet ma beaucoup aidé pour la connexion bluetooth, bien que j’ai toujours quelques problèmes (d’où le “brute force” de la connexion pour le port). Comme on le voit la fonction utilise yield. Ce qui fait que l’on peut itérer indéfiniment (boucle for dans le main) sur les données qui arrivent en flux continue.

Je trouve ça plutôt marrant et bien pratique. Le prochain billet expliquera comment fixer correctement son PC portable sur le tableau de bord de la voiture avec votre GPS (Garmin, Android, etc.) pour épater les gendarmes.

L’envolée de Python

history_Python

Voila un graphique que j’aime beaucoup. Je viens de le recevoir par e-mail via la mailing list de l’AFPY.

Je pense que cette courbe va continuer à monter. On voit que Python monte continuellement avec quelques augmentations plus accentuées (dont 2004, 2007 et 2010). Merci, Oracle. En effet je pense que pour la brusque augmentation de Python courant 2010 il faut en partie féliciter Oracle. Java, Python va t’enterrer.

history_Javahistory_PHP

Ces deux graphiques sont également de bonnes nouvelles. On pourrait croire que la forte diminution de Java en 2004 correspond à l’envolée de Python. PHP a du atteindre son sommet avec la version 5. Dorénavant Python est de plus en plus présent sur le Web et je crois que PHP 6 est mort. Si vous voulez tester un framework Python Web (Django ou autre), AlwaysData propose des plans gratuits.

Source: http://www.tiobe.com/content/paperinfo/tpci/index.html

KDE Wallet et Google Chrome

Chrome - KDE Wallet

Ce que j’attends depuis un moment est arrivé [1, 2, 3]. Avec la version 10.0.648.18.dev de Google Chrome sur Squeeze et KDE 4.4.5. Ce navigateur utilise enfin KDE Wallet pour stocker les mots de passe. Et ce, par défaut, sans aucune configuration. C’est génial. Plus qu’à utiliser l’historique, les marque-pages et les favoris de KDE ;-)

D’un autre côté c’est un peu embêtant parce que j’utilise de plus en plus Firefox (Minefield en fait, qui est rapide et stable sans parler de l’interface) ne permetant pas cela. Je sais, il y a cette extension. Mais elle est toujours en beta et ne fonctionne pas avec ma version de Firefox. Maintenant si vous avec testé avec succès une autre solution, je suis preneur.

HadoPy-Data #3 – Google API, heat map, pie chart

La page consacrée aux statistiques sur HADOPI est maintenant un peu plus complète. Les graphes sont mis à jour automatiquement et une heat map est utilisée avec les codes postaux (un peu lente à s’afficher, je vais peut-être plutôt utiliser les régions). En fait c’est maps.googleapi.com qui prend du temps à répondre.

Les graphiques sont donc générés avec l’API de Google. Initialement j’utilisais la librairie matplotlib mais elle n’est pas disponible sur le serveur. pyChart également n’est pas disponible. Finalement ce n’est pas plus mal comme ça. Les graphiques générés avec l’API Google sont très corrects et l’API est simple à utiliser. Pour un simple exemple d’utilisation, aller à cette URL.