Fantomas’side

Weblog open-source

Archives 2008

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.

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

Continuer la lecture

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

Continuer la lecture

Ogame Statistics

Lors de mon dernier article, je vous ai parlé de Open Flash Chart, en vous spécifiant que cela avait un rapport avec un prochain article, cet article le voilà.

Ogame Statisitics est un nouveau site que je viens d'ouvrir permettant de consulter les statistiques de tous les joueurs et alliances présents sur un univers de jeu de Ogame.

Le site réalisé grâce au framework Django, permet de créer une interface visuel des statistiques collectées par un module de mon robot pour Ogame, Obot dont j'ai déjà parler précèdement sur le blog.

En effet j'ai développé un nouveau module pour mon robot permettant de récolter toute les statistiques à un moment donné sur un serveur de jeu.

Des initiatives ont déjà été prises pour effectuer des visualisations de statistiques, utiles pour les alliances, mais le gros inconvénient de ces systèmes est qu'il est nécessaire de rentrer les données manuellement et assez fréquemment pour obtenir un suivi, ce qui est une tache longue et répétitive donc idiote :)

Là où se démarque Ogame Statistics, est que la mise à jours des données est automatique et régulière, car elle est prise en charge par Obot :)

Au menu du site, on trouvera un moteur de recherche, pour permettre de retrouver son profil ou son alliance, ses dernières statistiques, ainsi que celle de son alliance, et des graphiques d'évolutions réalisés avec Open Flash Chart. Une petite touche d'Ajax avec jQuery pour le trie des données et le résultat n'en ...

Continuer la lecture