Fantomas’side

Weblog open-source

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 ...

Continue reading

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 ...

Continue reading

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 ...

Continue reading

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.

Analyse hiérarchique par le contenu

Je suis actuellement en train de lire un livre sur les différents types d'intelligences dîtes collectives. C'est à dire l'analyse de données représentant les choix, ou les comportement de plusieurs personnes, et comment en extraire des vérités globales.

Une des première applications à laquelle je me suis attaqué à été de construire un Feed Clusterer en Python, servant à effectuer des regroupements par pertinences entre différents sites web.

Comment ca marche ?

Tout site web qui se respect propose un service de Flux RSS ou Atom, résumant les dernières actualités publiées sur le site. L'idée est d'en récupérer le contenu et d'en extraire une liste de mot pertinents.

En calculant le coefficient de Pearson en me basant sur les fréquences de mots comme vecteur, je peux en constituer des groupes et les classer de façon hiérarchique.

Pour visualiser cela, il suffit ensuite de tracer un dendogramme. Un dendogramme va représenter les groupes et la distance entre chaque groupes sur un ensemble de branches. Comme le montre l'image de l'article.

Ceci reste une expérience à petite échelle, mais imaginons maintenant toutes les données que récoltent les gros site web, en particulier ceux à vocations sociales, comme FaceBook, Twitter, MySpace, et n'oublions pas certains moteurs de recherches qui avec leurs dizaines de services sont capables de tracer toutes nos habitudes.

Je ne rentrerais pas dans le détails de toutes les applications inimaginables avec ces données pour tracer les gens, mais de plus avec l ...

Continue reading

Python 3.0 : compatibilités et évolutions

C'est le 3 décembre dernier que la version 3.0 de Python est sortie. Une version attendue par une grande partie de la communauté Python.

Au programme, un bon coup de nettoyage de la librairie standard, des nouveautés comme le passage en tout Unicode, et une nouvelle syntaxe. Même si cette dernière reste proche des moutures 2.x, elle est clairement incompatibles avec les versions précédentes. Un fait assumé par les créateurs.

Pour effectuer la transition en douceur, les versions 2.6 et 2.7 ont amorcées le travail en intégrant une partie des nouveaux concepts présent dans Python 3.0, comme la Curryfication, ou l'implémentation de pseudo opérateurs ternaires.

De plus le script 2to3 est là pour finaliser cette transition en convertissant le code écrit en 2.x vers la version 3. Il serait dommage que les anciens projets basé sur la version 2.x meurent du fait d'une trop grande difficulté de migration.

Craignant une fuite de la communauté Python, c'est sur ces sujets que nous avons été consultés par le site LeMagIT.fr, mon collègue et moi, pour expliquer notre point de vue sur cette nouvelle version dîtes mature.

L'article se situe à l'adresse suivante : Harmonisation au sein de Python 3.0.

Mise à jour : Toonux.com relaye l'info.

Changement d'adresse et migration sur Django

Cela va faire 3 ans que j'ai souscrit à mon hébergement gratuit chez 1and1, 3 ans de bons et loyaux services, mais cette période est terminée.... C'est aussi pour cela que j'ai perdu mon nom de domaine en .info.... 

Donc le site change d'adresse, et deviens http://fantomas.willbreak.it, mettez à jours vos bookmarks :)

Je décide donc de migrer chez un autre hébergeur, celui même qui me permet d'héberger mes projets en Python, Upasika et je me dis que dans la foulée pourquoi ne pas changer de solution de blogging, étant donné que Wordpress demande pas mal d'entretiens, de customisation, et deviens peu à peu une machine à gaz, alors que j'utilise que certaines fonctionnalités la majorité du temps....

J'ai donc décidé de changer le design en passant et d'utiliser mon moteur de publication appelé Zinnia pour assurer la transition.

Pour conservé les anciennes données, j'ai écrit une moulinette Django me servant à migrer de Wordpress vers Zinnia, et écrit en parallèle un tutorial (qu'il me reste à publier) expliquant la manipulation.

En espérant que cela vous plaira !

On s'en Brawl

Jeudi 26 Juin au soir, bavant d'impatience après 2 ans d'attente pour le nouveau Super Smash Bros. Brawl sur Wii, j'arrive à acquérir le jeu chez mon revendeur préféré. :) 

Que du bonheur me dis-je. J'espère que je vais retrouver Ganondorf, Captain Falcon pour pouvoir fritter violemment Mario et toute sa clique.

J'insère le DVD double couche qui contient le jeu dans ma console, et la malheur un message m'indique qu'il est : Impossible de lire le disque....

Je parcours le net à la recherche d'informations, et surtout pour savoir si je suis touché par le même symptôme que sur le continent Nord Américain, un problème de lentille contaminée, qui empêche la lecture des DVD double couche. Heureusement Nintendo veille, et propose la réparation gratuitement.

Pensant être atteint par le même problème je me dis qu'un bon 'Wait and See' durant le week end, devrais faire décanter la situation, et que lundi, j'en saurais plus en regardant sur le net.

Alors je me décide d'emprunter la Wii d'un collègue pour quand même jouer durant le week end. Résultat : le jeu ne passe toujours pas... :(

Etant donné que les 2 consoles ont été achetée le même jour, le jour de la sortie française, je me dis que cette console est aussi atteinte du symptôme de la lentille.

J'arrive à me procurer une 3ème Wii pour tester, qui elle date de quelques mois après la sortie française, et malgré tout ...

Continue reading