Fantomas’side

Weblog open-source

Copier / Paster

De manière professionnelle, j'ai découvert l'utilisation de sites comme pastebin.com ou encore gist.github.com. L'idée dernière ces sites nommés communément Paster, est de copier/coller un bout de texte ou de code, afin de pouvoir partager cette note de texte facilement en fournissant seulement l'URL de la note aux personnes concernées, c'est surtout pratique dans le cas des messageries instantanées. Les notes étant généralement supprimées au bout d'un certain temps, la question de confidentialité est plus ou moins assurée.

Voyant la facilité avec laquelle je pouvais sauvegarder et disposer de mes notes, j'ai donc commencé de manière personnelle à utiliser ces sites, mais cette fois-ci en omettant la suppression automatique. À titre d'exemple, j'y enregistre mon carnet d'adresses postales, comme ça j'ai toujours moyen de retrouver une adresse peu importe où je suis du moment que j'ai Internet.

Jusqu'au moment où je me suis posé trois questions :

  • où sont physiquement stockées mes données ?
  • sous quel politique légale sont mes données ?
  • sont elles vraiment supprimées en cas de demande ?

Au final cela revient à se demander si je suis le vrai propriétaire de mes données. Je vous laisse imaginer que la réponse à ces questions ne m'a pas toujours satisfait. Globalement dès que le site est hébergé aux USA ou une entreprise américaine fournissant le service, je passe sous leur juridiction donc : DMCA et autres joyeusetés s'appliquent. Je renonce quasiment à tous mes droits ...

Continuer la lecture

Des certifs et des bots

Je ne sais pas si c'est le passage à Firefox 51, qui met désormais bien en avant le manque de connexion sécurisée sur les sites consultés ou le contexte ambiant qui donne envie de chiffrer ses communications, mais j'ai donc décidé d'utiliser HTTPS pour servir ce blog et mes autres sites.

Enfin surtout ceux contenant des données personnelles ou nécessitant de se s'authentifier, car mon problème est surtout là. Le vol d'identifiants devient de ce fait moins facile.

N'étant pas très familier avec ce genre de procédures, je me suis naturellement tourné vers Let's Encrypt et le script certbot fourni par l'EFF, pour obtenir et mettre en place les certificats sur le serveur.

Après quelques minutes de lectures et de tests, facilement j'ai pu générer et installer les certificats de sécurité nécessaire, adapter les configurations Apache, et le tour était joué. Je me rapelle d'une époque où cela prenait bien plus de temps.

Un des points fort de certbot est l'automatisation du processus de validation nécessaire pour obtenir un certificat. Le renouvellement automatique des certificats est donc pris en charge, en lançant le tout périodiquement en cronjob par exemple.

Franchement il est difficile de faire plus simple, surtout à ce prix là (gratuit), c'est une belle initiative qui mérite d'être saluée.

Si je devais trouver un défaut à certbot, cela serait le plug-in Apache, qui à l'heure actuelle ou j'écris ces lignes, fait quelque peu ...

Continuer la lecture

Action, réaction !

Récemment, j'ai eu envie de faire une Application web monopage, servant à organiser les tâches que j'ai à faire et à noter mes différentes idées pour les réaliser le moment venu. Pourquoi monopage ? Car habituellement, j'utilise juste différents fichiers textes, ce qui permet d'aller très vite dans la saisie et l'organisation des lignes, donc je voulais absolument retrouver ce côté "réactif".

Todos

Forcément, ceci nécessite pas mal de JavaScript, qui est le langage pour dynamiser les pages HTML. Or, même si je connais pas mal l'ECMAScript, j'ai de profonds a priori sur ce langage, parfois sans fondement, je l’avoue. J'en fais à minimum, me contenant bien souvent d'utiliser JQuery pour un show/hide, un call Ajax, profiter d'un plugin et c'est tout.

J'ai testé il y a plusieurs mois AngularJS, et même si j'ai constaté que l'industrie du JS s'est énormément développée et professionnalisée, surtout depuis l'arrivée de Node.js, je n'ai pas réussi à adhérer aux concepts, ni même à finir le tutoriel. Bref, je partais de loin pour mon petit projet...

Mais j'ai découvert React (développé par Facebook pour la petite histoire), et tout a changé.

Rapidement, j'ai pu voir comment construire mon projet, tout en respectant les concepts liés à React et avoir quelque chose de fonctionnel en 2 jours. Plutôt pas mal, pour un réfractaire.

Je pense que si j'ai pu réussir à faire ce que ...

Continuer la lecture

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.

♪ Je lui dirais des mots vides ♫

Depuis des temps reculés, j'essaye en composant avec mon temps et mon inspiration de toujours développer et maintenir Zinnia. Or un des points que j'essaye d'améliorer ces derniers temps, tant au niveau des résultats, que des performances, c'est la comparaison du contenu des articles, afin de retrouver les articles les plus similaires entre eux.

Une des étapes pour comparer le contenu entre les articles, va être de soustraire dans le texte l'ensemble des mots vides de sens (ou stop words en anglais), tel que "le, la, les", afin de limiter le nombre de mots à comparer, tout en travaillant sur des mots dirons-nous "qualifiés". 

Prenons un exemple concret en français :

Maître Corbeau sur un arbre perché,
Tenait en son bec un fromage.
Maître Renard par l’odeur alléché
Lui tint à peu près ce langage :
Et bonjour, Monsieur du Corbeau.

Une fois soustrait de ses mots vides, cet extrait de fable donnera :

Maître Corbeau XXX XX arbre perché,
Tenait XX XXX bec XX fromage.
Maître Renard XXX X’odeur alléché
XXX tint X XXX XXXX XX langage :
XX bonjour, Monsieur XX Corbeau.

On voit donc que l'on conserve les mots essentiels du texte, même si l'on perd le sens des phrases. Et on comprend aussi l'intérêt d'améliorer ce processus, qui peut fortement jouer sur la qualité des résultats et des performances.

Revenons à Zinnia, j'essaye donc d'améliorer cette étape du filtrage, car actuellement seuls les mots vides ...

Continuer la lecture

Migration des blogs de Libération.fr sur Zinnia

Depuis maintenant 1 an et demi, en tant que développeur, je travaille pour le site internet Libération.fr, du journal du même nom.

Les problématiques sont variées et l'exigence technique au rendez-vous. Grâce à une équipe sympathique et compétente, on a le temps et les moyens de faire de la qualité dans notre travail, le tout dans un environnement particulier, celui d'un quotidien national.

Il y a quelques semaines, suite à de nombreux échanges et écueils techniques, nous avons décidé de migrer les quelques 350 blogs de Libération hébergés chez Typepad, vers une nouvelle plate-forme qui devra être plus adaptée à nos besoins.

Étant spécialistes Django nous avons donc décidé d'utiliser Zinnia, la solution de blogs développée par mes soins, afin de bénéficier ainsi de mon expertise dans le domaine et du retour d'expérience des centaines de blogs déjà déployés sur cette solution.

Une des exigences technique, fut de n'avoir qu'une seule instance Django pour faire tourner toutes les instances de blogs. Car il est inenvisageable pour des raisons de maintenance et de ressources, de devoir installer une nouvelle instance Django à chaque ouverture de blog.

Zinnia étant modulaire et extensible, l'application a donc servi de socle au projet, puis fût paramétrée et enrichie afin de satisfaire aux besoins d'une plate-forme multi-blogs.

Donc autour de Zinnia, j'ai développé plusieurs applications aux fonctionnalités spécifiques, dont on peut citer :

  • le mécanisme pour rendre Zinnia multi-blogs.
  • l'éditeur de contenu, basé sur redactor.  ...

Continuer la lecture

Le temps des releases : django-livereload

Lors de la refonte du site, j'ai découvert l'utilisation de Gulp et de LiveReload, qui permettent de se passer de rafraîchir constamment son navigateur lorsqu'on intègre du HTML, CSS ou JavaScript. En effet lorsque une modification est enregistrée sur ces types de fichiers, le navigateur reçoit un signal lui indiquant de recharger soit la ressource, soit l'intégralité de la page.

Pas mal, mais pas encore assez satisfaisant pour moi, car j'édite aussi principalement des fichiers Python lorsque je développe sous Django, et j'aurais aimé aussi profiter du rechargement automatique du navigateur lorsque que j'édite du code. Malheureusement ce n'était pas aussi simple que cela...

Sous Django avec le serveur développement, les fichiers Python du projet sont déjà surveillés, et dès qu'une modification est détectée sur ces fichiers, le serveur redémarre pour prendre en compte la modification.

Initiative louable, mais qui complique grandement la tâche, car si je surveille aussi ces fichiers avec Gulp, le signal de rechargement sera émit et reçu par le navigateur avant que le serveur de développement Django ne soit totalement rechargé et prêt. Résultat, le navigateur n'arrive pas à recharger, je me retrouve avec une page vide et cela devient contre-productif.

Ce problème à priori peut être résolu au niveau du serveur de développement Django en utilisant des sockets persistantes et à l'heure où j'écris ces lignes un patch est dans l'attente d'intégration : https://code.djangoproject.com/ticket/18855

C'est pour ...

Continuer la lecture

Mise à jour 2014 du blog

On dit souvent que les cordonniers sont les plus mal chaussés, et en tant que développeur web je confirme l'adage. Ce blog est à l'abandon, depuis pas mal de temps déjà...

J'ai donc décidé pour remettre le pied à l'étrier, dans un premier temps de le rafraîchir visuellement et de mettre à jours ses composants, afin pourquoi pas le ressusciter dans un second temps.

Concernant la partie visuelle, j'ai cédé à la mode du design épuré, et ce pour plusieurs raisons.

L'idée originale étant de mettre en avant le contenu et sa lisibilité, ce genre de thème est adapté en utilisant de bonnes typographies. De plus en me limitant esthétiquement j'ai pu faire quelque chose de maintenable et maîtrisable à mon échelle et intégrer facilement un coté responsive au site qui lui faisait défaut en 2014.

Lors de cette refonte, je me suis aussi imposé des objectifs chiffrés en terme de temps, histoire de ne pas m'égarer sur des détails et d'avancer rapidement, d'où aussi la simplification esthétique. Cela permet de ne se concentrer que sur le cœur du site, c'est à dire les articles et leur contenu.

Pour réaliser et intégrer le design j'ai procédé en deux étapes, en réalisant d'abord une charte graphique qui me convenait, puis une fois le rendu satisfaisant à mon goût, j'ai commencé à l'intégrer dans mon système de templates.

En évitant de mélanger le fond et la forme ...

Continuer la lecture

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

Ô middleware, mon beau middleware : Request Template Loader

Dans le monde du web, là où tout est anarchie (ou presque), je me retrouve confronté assez souvent à cette problématique :

Comment afficher le contenu d'un site réalisé avec Django sur un autre site déjà existant ?

Là où je bosse, on aime bien les iframes HTML (no comments please :)), mais le contenu ou le style de la frame incluse ne correspondent pas forcément au site recevant la frame. L'idée, vu qu'on se trouve à la base dans un environnement Django, serait de déployer un nouveau site, avec son propre jeu de templates prévues pour le site incluant les frames.

Mais ce genre de technique nécessite de mettre en place un nouveau domaine, de déployer et de maintenir 2 sites. Bon vous me direz que ce n'est pas forcément ce qu'il y a de plus dur, mais il y a moyen de faire mieux. Et surtout que ce passe-t-il si vous devez faire ce genre d'opération non pas sur 1 site, mais sur plusieurs. Tout de suite cela devient plus ennuyeux. :(

C'est là où intervient la solution du middleware. L'idée est de pouvoir passer en GET un paramètre qui conditionnera le chargement des templates dans le site source. Comme cela peu importe combien de frames au look différent on devra gérer, la mise en forme et la personnalisation du contenu se fera très facilement.

Maintenant place au code, les explications sur le fonctionnement viennent directement après.

import os
from urllib import urlencode
from ...

Continuer la lecture