Fantomas’side

Weblog open-source

Archives pour le tag : python

Flux RSS de python

Veliberator is alive

Il y a quelques jours, j'ai décidé de mettre à jour le code de veliberator, l'API qui me sert à récupérer en direct les informations du réseau Vélib'. Je vous en avais déjà parlé lors d'un article précèdent en 2009.

Donc après avoir fini la mise à jour de 2015, je me suis demandé à quel point il était compliqué d'en faire un robot pour IRC, une vieille idée qui me trottait en tête depuis longtemps.

Or après quelques recherches il est assez simple de faire un bot IRC, grâce à la librairie irc pour Python. Un module étant même fourni spécifiquement pour écrire ce genre de robot.

Malgré une documentation éparse, j'ai pu en quelques heures mettre sur pied une version IRC de veliberator me permettant de trouver les stations libres les plus proches.

Pour rencontrer veliberator le robot, connectez-vous sur irc.freenode.net/#velib et écrivez une des choses suivantes:

veliberator, status 42001
veliberator, address tour eiffel
veliberator, help

Quand c'est facile et utile, le développement devient plus qu'un plaisir.

La face cachée du Sudoku

Introduction

Tout commence un soir entre amis, où une envie démente de coder un petit projet nous surprend entre 2 bières. :D

Lui vient du monde Java, moi du Python, mais ayant subi la même formation, le moment fût propice pour comparer nos progrès et évolutions et aussi lancer un troll ou deux.

Ensuite nous vient l'idée de programmer un résolveur universel de Sudoku, ayant quelques connaissances de base à propos de ce jeu, j'imagine dans les grandes lignes un algorithme pour résoudre ce genre de puzzles...

L'idée générale du programme est d'appliquer de manière séquentielle les 2 ou 3 stratégies de résolutions que j'utilise moi même quand je fais un Sudoku tiré d'un magazine...

Passage à l'acte

Rapidement j'obtiens un résultat, mais se pose le problème de la difficulté. En effet, les grilles disponibles dans les magazines sont classées par difficulté croissante, or cette difficulté est toute relative.

En effet seul le nombre de techniques de résolutions nécessaires (en général 3 ou 4) à un puzzle conditionne le niveau de difficulté. A savoir qu'il existe de techniques très complexes pour résoudre certaines grilles de Sudoku, mais il ne sera jamais nécessaire même à un niveau dit "Diabolique" de les maîtriser. Seules les techniques élémentaires seront nécessaire pour 95% des grilles publiées.

Mais concernant les 5% restant, là cela devient beaucoup plus complexe, car après plusieurs heures de recherches et de compréhension de ces techniques, je décide d'en implémenter certaines ...

Continuer la lecture

Le temps des releases : easy_extract

Imaginons que j'ai sur un serveur de donnée une grosse quantité d'archives sous différents formats, tel que RAR, ZIP, XTM...

Si je souhaite extraire toutes ces archives, je devrais aller trouver chaque archives dans son répertoire, taper la bonne commande pour pouvoir les extraire, les réparer au besoin et ainsi de suite... Plutôt fastidieux non ? :(

Sur ce constat m'est venu l'idée de easy_extract, un script écrit en Python qui va analyser récursivement les répertoires à la recherche d'archives ou de collections d'archives pour les extraire et les réparer automatiquement si elles sont corrompues.

Pour cela, il suffit de lancer le script de la manière suivante par exemple :

$ easy_extract -r mes_archives/

Pratique et le gain de temps est évident, car une fois le script lancé, vous n'avez plus à vérifier que l'extraction s'est bien déroulée pour ensuite passer à la suivante, donc a scotcher devant votre terminal. Victoire une tâche fastidieuse de plus automatisée. :D

Pour l'installation, il est nécessaire d'installer les paquets suivant avant :

  • par2
  • unrar-free
  • 7zip-full

Ensuite l'installation du script se fait grâce à easy_install :

$ easy_install easy_extract

Bien sûr le code est open-source, donc si vous voulez contribuer, forker ou juste critiquer, le code se trouve à l'adresse suivante : http://github.com/Fantomas42/easy-extract

Bonne décompression et bon leech.

Le temps des releases : Vélib'erator

Suite à mon abonnement à Vélib', habitant près d'une station récemment construite, j'ai vite remarqué que de trouver un vélo en bon état ou une place de parking à proximité avant les 30 minutes fatidiques et payantes pouvait vite devenir un calvaire.

Sur ce, après quelques recherches,  j'ai pu constater que les informations sur l'état des stations du réseau Vélib' étaient librement accessibles. D'où l'idée de créer un paquet python nommé Veliberator, me permettant depuis mon shell de consulter l'état de mes stations favorites.

Pour les fans de la ligne de commande, essayez ceci :

$ sudo easy_install veliberator
$ sudo synchronize.py
$ find_place.py 42008

Partant de là, je me dis qu'il serait dommage de m'arrêter à ce stade du développement, d'autant plus que mon problème pour trouver une place libre rapidement ne se résous que depuis mon ordinateur, il faudrait donc que ce service soit accessible partout et pour tout le monde.

Un site web semble être la solution idéale, d'autant plus si on est capable d'optimiser l'affichage des pages au type de support, par exemple un mobile.

Equipé de mon module python et de Django, j'ai donc réalisé le site http://veliberator.com.

Au programme du site :

Continuer la lecture

Paye ta Fabric !

Le déploiement d'applications, c'est pas toujours facile et rébarbatif surtout quand on travaille sur un parc de machines.

Imaginons que j'utilise un serveur de version, du genre Subversion ou Mercurial et que j'utilise un ou deux serveurs (test, production 1, production 2, ...) pour héberger mon ou mes applications.

Le déroulement est le suivant :

  • Développement en local.
  • Propagation des modifications.
  • Connection SSH sur les serveurs.
  • Rapatriement les dernières modifications
  • On redémarre le soft.

Vous me direz que cela n'est pas forcément très long, mais quand vous devez le faire souvent et plusieurs fois par jour, on en a vite pleins le dos et cela est source d'erreur.

Heureusement l'informatique étant un sport où celui qui est le plus fainéant gagne, il existe un solution pour se simplifier ces tâches de déploiements à distance.

Son nom ? Fabric

En quelques lignes de Python, définissant des règles, un peu à la manière d'un Makefile, il est possible d'automatiser ce genre d'opération.

Voici un exemple basique pour le déployement d'un projet Django avec Mercurial :

"""Fabric Rules for MyProject"""

config.production = ['server.domain.com']
config.app_dir = '/home/dev/djangos/myproject'

def publish():
    """Publish the content by pushing it"""
    local('hg push')

def apache_reload():
    """Reload the apache process"""
    sudo('/etc/init.d/apache2 reload')

@roles('production')
def update():
    """Update the code source"""
    run('cd $(app_dir); hg pull; hg update')
    run('cd $(app_dir); python manage.py syncdb')
    run('cd ...

Continuer la lecture

Intégrer Twitter dans Django

Twitter, c'est le nouveau média à la mode pour lancer le buzz.
Créer en 2006, son but est simple, pouvoir résumer à tout instant, ce que l'on fait, ce que l'on pense, par des messages courts, que l'on envois par SMS. En effet les messages ne doivent pas dépasser 140 caractères.

De plus votre réseau peut suivre instantanément vos status, enfin bref voilà le Micro-Blogging d'inventé.

Twitter fournis une API pour pouvoir communiquer avec son service. Je me suis alors demandé ce que je pouvais en faire, et ait décidé d'interfacer celle ci avec Django.

A travers un exemple nous allons voir comment récupérer des informations de Twitter avec les Templatetags Django.

Première étape, installer l'excellente API python pour Twitter disponible sur GoogleCode.

Ensuite nous allons créer un module python disponible dans le PYTHON_PATH, que nous appellerons django-twitter, et y créer un templatetag qui récupèrera nos derniers status postés.

$ mkdir -p django-twitter/templatetags
$ cd django-twitter
$ touch __init__.py
$ cd templatetags
$ touch __init__.py
$ touch get_tweets.py

Ceci va nous créer la structure pour y intégrer notre code. Nous allons maintenant éditer le fichier get_tweets.py et y insérer le code suivant :

"""Templates tags for accessing to Twitter"""
from django.conf import settings
from django.core.cache import cache
from django.template import Library, Node
from twitter import Api

register = Library()

class TweetStatusNode(Node):
    def __init__(self, num, varname):
        self.num = int(num)
        self.varname = varname
        self.key = '%s-%s' % (self.num, self.varname ...

Continuer la lecture

Distribuer une application Django en moins de 5 minutes

Vous venez de finir votre dernière application en Django, qui se veut réutilisable et distribuable. Félicitations :).

Désormais vous voulez automatiser l'installation et la distribution du paquet, et pourquoi pas le rendre installable facilement en 1 ligne de commande, sous la forme d'eggs.

Le plus simple est de réaliser un script d'installation basé sur distutils qui permettra de télécharger et d'installer le code en quelques secondes. L'idée est de paqueter le module à distribuer avec un script nommé setup.py se chargeant de l'installation.

Mais réaliser ce script est parfois assez contraignant et long, surtout ex nihilo...

Pour cela nous allons utiliser PasteScript et un jeu de templates pour Django pour nous créer automatiquement la structure du script.

Prérequis

Désormais on va créer la structure du package avec cette commande :

$ paster create -t django_app mon_application

Plusieurs questions importantes vous seront posées pour créer la structure de votre distribution, répondez soigneusement.

Désormais dans ce dossier nous avons un fichier setup.py et un dossier mon_application. Le template utilisé crée automatiquement des fichiers pour réaliser une application Django. C'est là où il vous faut mettre votre code.

Maintenant éditez votre fichier setup.py pour le personnaliser un peu.

Grâce aux commandes intégrées vous pouvez distribuer votre application facilement.

Pour l'enregistrer sur Pypi et le rendre disponible via easy_install :

$ python setup.py sdist bdist_egg register upload

Pour installer votre application il suffit désormais de faire :

$ easy_install mon_application

Ou ...

Continuer la lecture

Django unique et timed sessions

Comment rendre unique les comptes utilisateurs connectés sur un site en Django ?

Ce genre de problématique se retrouve souvent sur les sites internet proposant des abonnements à un service en ligne, voulant empêcher le partage d'abonnement.

Pour les besoins d'un projet spécifique en Django au sein de la société Emencia là où je travaille, j'ai du développer un moyen d'empêcher 2 utilisateurs de se connecter sur un compte utilisateur en même temps.

Mais le problème ne s'arrête pas là, comment empêcher la connection et la déconnection successive entre 2 utilisateurs ? L'idée est de donner un temps minimum de connection à chaque session ouverte pour empêcher la déconnection, par exemple 5 minutes.

Pour cela j'ai écrit un Middleware pour Django qui va se charger de rendre unique chaque sessions utilisateurs sur le site. Utiliser un middleware donne l'avantage d'être réutilisable et facile à installer.

MIDDLEWARE_CLASSES = (
    'django.middleware.common.CommonMiddleware',
    'django.contrib.sessions.middleware.SessionMiddleware',
    'django.contrib.auth.middleware.AuthenticationMiddleware',
    'utsessions.middleware.UTSessionMiddleware',
    )

Après plusieurs refactorings et tests, permettant de configurer le comportement du middleware, comme la déconnection automatique, j'ai publier le code source sur GoogleCode pour que tout le monde puisse en profiter.

Pour plus d'informations, ou pour télécharger le code, consulter le site web du projet : Django UT Sessions.

Pour installer le module depuis Pypi :

$ easy_install utsessions

Clustered Models

Je vous parlais récemment de l'application Django Clustered Sitemap, servant à établir la correspondance entre 2 objets sur des projets Django.

Après une review globale du code et l'ajout de certaines fonctionnalités, j'ai changé le nom du projet en Clustered models car il ne correspondait plus vraiment à la philosophie du projet.

La première modification à été d'ajouter une nouvelle version du sitemap, mais cette fois ci en nuage 2D.

Le code et les vues ont été rendu génériques pour en faciliter l'intégration et l'extensibilité.
Une feature intéressante est qu'il est possible de réutiliser la configuration des vues générique pour effectuer des groupements.

Ensuite un templatetag à été ajouté pour pouvoir voir les models associés à un autre model. Le résultat est qu'il est désormais possible de voir les articles associés sur le blog. :)

Le tout étant très facile à installer, voici un exemple du code pour réaliser mes sitemaps mélant les flatpages et les articles, dans le fichier urls.py du projet.

from clustered_models import VectorBuilder
from clustered_models.clusterers import DimensionalClusterer
from clustered_models.clusterers import HierarchicalClusterer from django.contrib.flatpages.models import FlatPage

entry_conf = {'queryset': Entry.published.all(), 'fields': ['content', 'title', 'excerpt']}
flatpage_conf = {'queryset': FlatPage.objects.all(),
'fields': ['title', 'content']}

vector = VectorBuilder(entry_conf, flatpage_conf)

urlpatterns += patterns(
'',
url(r'^sitemap/$', 'clustered_models.views.clustered_view',
{'vector': vector, 'clusterer': HierarchicalClusterer}),
url(r'^cloud-sitemap/$', 'clustered_models.views.clustered_view',
{'vector': vector, 'clusterer': DimensionalClusterer})
)

Je ne releaserais le module que si il y a un minimum d'intérêt pour ...

Continuer la lecture

Clustered Sitemap

Comme je vous en parlais dans mon précèdent article, je comptais faire quelque chose d'utile tiré de l'intelligence collective.
J'ai donc intégré une partie du code de mon projet Feed Clusterer pour en faire un module Django.

L'idée est de reprendre la configuration des vues génériques, et de spécifier les champs à inspecter pour effectuer une correspondance. Cette correspondance servira à l'établissement d'une cartographie des différentes vues d'un site en Django.

En modélisant ces données sous la forme d'un dendogramme on peut avoir un sitemap assez surprenant, que l'on peut retrouver sur la rubrique Carte en haut du site. Les regroupements se font à la fois sur les thèmes abordés, comme la programmation, ou les restaurants, tout en mélangeant les styles d'écritures et les catégories utilisées.

Cela permet de pouvoir orienter le visiteur vers les articles connexes du site, sans avoir à établir de relations aux préalables :). Regardez la section ou je parle d'Ogame cela suit ma logique de développement et regroupe à chaque fois l'article le plus proche.
Saisissant non ?

Concernant l'effet d'arbre dépliables, je tiens à en remercier l'auteur du site bassistance.de, qui a fait un travail excellent en se basant sur JQuery, un must !

Si le projet vous intéresse, je peux le releaser, il me reste que peu de travail pour le rendre générique.