Fantomas’side

Weblog open-source

Archives pour le tag : développement

Flux RSS de développement

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

♪ 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

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

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

Le temps des releases : Django-sekh

Vous avez certainement déjà vu dans Google quand vous consultez une page depuis son cache, les termes de la recherche sont coloriés dans le contenu de la page pour permettre de les discerner rapidement.

De ce principe certains sites ont adapté la même technique en coloriant certains mots de la page correspondant à la recherche de l'utilisateur si il provient d'un moteur de recherche. 

C'est ce que django-Search Engine Keywords Highlighter fait !

Une fois installé avec BeautifulSoup, il suffit juste d'ajouter ce middleware à la fin de la liste dans votre fichier settings.

MIDDLEWARE_CLASSES = (
  ...
  'sekh.middleware.KeywordsHighlightingMiddleware',
)

Moi quand c'est facile à installer, j'aime ! :D

Ce middleware va rajouter une balise span autour des mots de la recherche, le tout avec des classes qui vont bien permettant la décoration en CSS.

L'inconvénient est que si votre HTML est mal formatté, le middleware risque de faire planter la page.

Pour voir un exemple cliquez ici.

Pour plus d'informations et pour télécharger le code :

http://github.com/Fantomas42/django-sekh/tree/master

Le temps des releases : Django-smileys

Parfois il est temps de se sortir les doigts du code, et d'en parler !
Mais pour en parler, il faut documenter, ce qui prend un peu de temps, mais j'y travaille.

Pour commencer je vais vous présenter une de mes applications favorites, par sa simplicité et son utilité incroyable. :D

Django-smileys est une application Django comme son nom l'indique, permettant d'inclure facilement dans ses templates des smileys, de ce genre :):p.

Pour cela, une fois l'application téléchargée et installée dans votre projet django, il vous suffit dans vos templates d'utiliser le filtre qui va convertir tout les code smileys définis dans SMILEYS_LIST.

{% load smiley_tags %}

{{ object.content|smileys }}

Plutôt facile non ? Surtout que l'on peut maintenant convertir tout type de contenu texte.

La liste des smileys est configurable, ainsi que l'url de dépot et la classe d'habillage CSS.

Pour télécharger ce projet hallucinant : http://github.com/Fantomas42/django-smileys/tree/master

Bientôt d'autres releases.