09/30/2007AfpySprint à DijonL'A.G. de l'Afpy organisée ce week-end à Dijon, s'est transformée en AfpySprint par manque de monde pour atteindre le quorum. Le nouveau bureau de l'association sera donc voté plus tard :)
Entre deux restos et une dégustation de vins, nous avont bossé sur trois ateliers:
Pour info, l'association a maintenant son propre serveur dedibox, et vous pouvez suivre les devs sur le repository : http://trac.afpy.org/misc 09/13/2007Dijon capitale du V.. Libre !08/20/2007Recherche des similitudes par inférence BayesienneLe site fr.luvdit.com permet de proposer aux visiteurs une sélection de livres grâce au k-NN, mais il part du principe que ces derniers utilisent avec pertinence les étiquettes, ce qui est loin d'être systèmatique: seuls les geeks et les personnes habituées aux sites comme flickr ou delicious le font correctement.
Pour pallier à ce problème, une autre méthode de sélection peut venir renforcer celle du k-NN: l'inférence bayesienne. Cette technique permet d'associer à des catégories une liste de mots (==un texte). Lorsqu'une nouvelle liste de mots est rencontrée, le système calcul la probabilité d'appartenance à chacune des catégories existantes, en fonction des listes de mots déjà croisées. Pour augmenter la pertinence, les mots communs ou courts sont supprimés, pour tenter de conserver l'essence du texte. Elle est appliquée ainsi au site:
Lorsque des nouveaux livres sont ajoutés, le système va calculer pour chaque:
Les propositions obtenues par le k-NN peuvent dès lors être renforcées par ce résultat:
Pour affiner les calculs, l'utilisateur pourra réfuter un livre en indiquant que ce dernier ne l'intéresse pas. Cette action aura pour effet de recalculer les probabilités des catégories. Le code-maquette est ici: http://hg.programmation-python.org/browser/classifier. Mais est encore affreusement lent à cause d'une mauvaise conception au niveau du stockage SQL. Il est en cours de refactorisation, mais fonctionne déjà. A terme le paquet classifier pourra servir à n'importe quel besoin d'inférence bayésienne (et il y en a partout). Le doctest montre le fonctionnement. 08/13/2007Ressources PythonCette page regroupe une liste de ressources web pour le langage Python, organisées en catégories. Elle démarre à peine et sera mise à jour régulièrement.
Catégories:
Référence du langagehttp://docs.python.org/ est le point de départ pour rechercher de la documentation en ligne sur la syntaxe de Python. Les sections les plus importantes sont:
Aide-mémoireLaurent Pointal maintient une Quick Reference Card qui regroupe sur une feuille A4 une cheatsheet. Bibliothèques tierces
Frameworks web
Comparatifs en français : Django vs Turbogears Blogs
-> si vous avez un blog, n'hésitez pas à le signaler en commentant Sites web
Présentations, tutoriels
N'hésitez pas à commenter ce billet pour le compléter 08/10/2007Un widget flash pour luvdit!Julien m'a fait un petit widget flash pour ludvit!. Le code récupère un flux xml sur le site, qui permet de lister les 5 derniers items commentés ou ajoutés par un utilisateur donné. Il apparaît sur mon blog à gauche.
Voici le code à inclure: <object classid="clsid:d27cdb6e-ae6d-11cf-96b8-444553540000"Si vous avez un compte sur le site, il suffit de remplacer 'tarek' par votre login dans les paramètres du widget. 07/30/2007Au coeur de Python Volume 1J'ai reçu la traduction de l'ouvrage de Wesley Chun, "Core Python Programming". La version française se présente en deux tomes, dont voici le premier:
Au coeur de Python, Tome 1, Notions fondamentales Si vous l'avez lu, n'hésitez pas à commenter la fiche 07/22/2007Un site de critiques de livreJ'ai commencé à regrouper sur un site toutes mes lectures. L'application qui fait fonctionner ce site reprend tous les principes énoncés dans les billets suivants:
Un widget en flash permet aussi d'afficher sur un blog (regardez à gauche) ses 5 dernières critiques (merci Julien). Et c'est Django Powered. Si vous aimez bien lire et partager, rejoignez moi sur fr.luvdit.com, même s'il n'est pas tout à fait terminé, il est déjà utilisable.
Categories:
coding,
django,
documentation,
litterature,
livre
2 comments
- commenter
|
Trackbacks (1163)
|
07/06/2007Un joli trac pour mes projetsJ'ai insallé un trac pour mes projets, avec le plugin Mercurial.
http://hg.programmation-python.org/ L'interface est beaucoup pus agréable que le browser web par défaut de Mercurial. Joie. 07/05/2007Service de mailing asynchrone pour Django, Plone, etc..Django ne déroge pas à la règle, et fourni dans comme pour la plupart des frameworks web Python, un module pour l'envoi de mail totalement... inutilisable dans des conditions de production. En effet, send_mail et send_mass_mail, les deux API de django.core.mail, envoient tous les deux les mails de manière synchrone.
L'effet est relativement désastreux sur les performances du site puisque chaque envoi de mail provoque un blocage du thread en cours, le temps de l'échange avec le serveur SMTP via telnet. Sur un site chargé, ou qui utilise de façon massive les envois de mails, l'emploi de django.core.mail est donc fortement déconseillé. Plus globalement, tout code qui n'entre pas en ligne de compte pour calculer la page à afficher, ne doit pas s'exécuter de manière synchrone (autres exemples de calculs asynchrones: calculs des voisins, indexation, etc). Zope 3, un peu plus mature et sophistiqué que les autres frameworks sur ce point précis, propose un module d'envoi de mails asynchrone, qui recopie les mails dans un répertoire au format Maildir, et lance un thread en charge de dépiler les mails du répertoire. L'interêt, outre l'aspect asynchrone qui permet d'accélerer les envois et de libérer le thread qui sert la page immédiatement, est la robustesse: si le serveur tombe, le thread peut reprendre son travail d'envoi lorsqu'il est relancé. Mais cette solution reste liée au serveur d'application car le thread est lié au processus. L'autre défaut est qu'il est nécessaire, si l'on veut ajouter des informations supplémentaires aux mails à traiter, d'ajouter des en-têtes pour respecter le format RFC-2822 des mails qui sont recopiés dans la maildir (et de les retirer avant l'envoi réel des mails). Enfin, le code devient dépendant du système de fichiers, ce qui peut poser des problèmes d'infrastructure si l'on déploie ce service d'envoi de mails sur une machine tierce au serveur d'application. Une autre solution, beaucoup plus robuste, consiste à déposer ces mails dans une table de base de donnée relationnelle (celle employée par le site dans Django, ou une dédiée pour Zope) qui est lue régulièrement par un service d'envois de mails, totalement indépendant du serveur web. Deux tables pour le prix d'unePour mettre en place ce service, deux tables sont créées dans la base de données, grâce à SQLAlchemy: mail_data = Table('mailer_mail_data', metadata,
La table mail_data sert à stocker les informations sur les mails à envoyer, et la table mailed_data permet de stocker les mails envoyés, avec pour chaque un statut, si jamais l'envoi a échoué. Cette deuxième table permet aux applications de mettre en place du feedback en cas de problème d'envoi.Travailleuse, travailleurLe programme en charge d'envoyer les mails est un thread qui ouvre régulièrement la base pour:
Il est lancé comme programme indépendant vi un script run.py, qui peut être dameonisé sur le serveur grâce aux dameontools par exemple (il y a surement plus simple de nos jours avis aux experts Linux...) class MailWorker(Thread): API d'envoi de mailEnfin, les applications peuvent se servir du module sender pour envoyer des mails. Ce dernier injecte dans la table mail_data le mail et rend la main immédiatement def send_mail(sender, recipients, subject, msg): J'utilise cette API dans mes applications pour tous les envois de mail. Dans Django, elle remplace avantageusement django.core.mail. Exemple completVoici la docstring du paquet que j'ai conçu mailer Et, Ô joie, le code est disponible, comme d'habitude, sur http://hg.programmation-python.org, dans le paquet mailer. 06/22/2007Qui est mon voisin ?Dans un site de contenu, pour rechercher les similitudes entre deux documents basée sur les tags qui leur ont été associés, on recherche l'intersection commune. En d'autres termes, on recherche dans le corpus des documents les documents avec le plus grand nombre de tags communs.
Les algorithmes de voisinage, qui sont les plus simples à mettre en oeuvre, permettent de trouver rapidement ces similitudes en disposant dans un espace multidimensionnel les documents. Chaque dimension est un tag et le document se trouve dans cette dimension à la coordonée 0 ou 1 (le document possède ce tag ou non). Une fois cette carte dressée, il est possible de retrouver les "voisins" d'un document, c'est-à-dire les documents les plus proche dans l'espace. Cet algorithme s'appel le k-Nearest Neighbor, ou k-NN. Le livre de référence en matière de IA ("Artificial Intelligence: A Modern Approach"), propose une implémentation de cet algorthime en Python, disponible sur son site. Qui sont mes copains ?Les cas d'utilisations ne manquent pas pour le k-NN. Il peut par exemple être employé pour rechercher des similitudes entres utilisateurs de la même application. C'est le cas par exemple sur Last.Fm, qui propose une fonctionnalité de "Voisinage" où la liste des utilisateurs les plus proches de vos choix en matière de Tags, est affichée. Cette liste de personne est susceptible d'avoir des goûts très similaires aux vôtres. Le paquet neighborsPour une de mes applications, j'ai développé un paquet au dessus du code du livre, qui propose une api simplifié qui permet de retrouver les voisins d'un utilisateur, en fonction des tags utilisés. Il corrige aussi des erreurs (signalées) dans l'implémentation proposée par le livre et fourni un système de persistence en base, qui permet de découpler le travail de calcul des requêtes: une application peut requêter la base pour connaître les voisins d'un utilisateur, pendant qu'un processus se charge de les calculer et les mettre à jour régulièrement. Voici le docstring du paquet: =======Le paquet neighbors est disponible sur mon repository Mercurial: http://hg.programmation-python.org/repositories/public/ (il faut vraiment que je fasse une autre interface web que celle par défaut de Mercurial...) Merci à Olivier pour ses précieux conseils en IA !
|
A propos
|