Fantomas' side - Articles pour le tag releasehttps://blog.fantomas.site/blog/tags/release/Les derniers articles taggés sous releasefrCopyright (c) 2005-2018, Julien FacheSat, 07 Feb 2015 19:42:23 +0000♪ Je lui dirais des mots vides ♫ https://blog.fantomas.site/blog/2015/02/05/je-lui-dirais-des-mots-vides/ <img src="/media/cache/02/af/02afe4f9bbf2c06821b20cb9cda6809b.jpg" alt="♪ Je lui dirais des mots vides ♫" /> <p>Depuis des temps reculés, j'essaye en composant avec mon temps et mon inspiration de toujours développer et maintenir <a href="/blog/tags/zinnia/">Zinnia</a>. 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.</p><p>Une des étapes pour comparer le contenu entre les articles, va être de soustraire dans le texte l'ensemble des <a href="http://fr.wikipedia.org/wiki/Mot_vide">mots vides</a> de sens (<em>ou stop words en anglais</em>), tel que "<em>le, la, les</em>", afin de limiter le nombre de mots à comparer, tout en travaillant sur des mots dirons-nous "<em>qualifié</em>s".&#160;</p><p>Prenons un exemple concret en français :</p><blockquote><p>Maître Corbeau sur un arbre perché,<br /> Tenait en son bec un fromage.<br /> Maître Renard par l’odeur alléché<br /> Lui tint à peu près ce langage :<br /> Et bonjour, Monsieur du Corbeau.</p></blockquote><p>Une fois soustrait de ses mots vides, cet extrait de fable donnera :</p><blockquote><p>Maître Corbeau XXX XX arbre perché,<br />Tenait XX XXX bec XX fromage.<br />Maître Renard XXX X’odeur alléché<br />XXX tint X XXX XXXX XX langage :<br />XX bonjour, Monsieur XX Corbeau.</p></blockquote><p>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.</p><p>Revenons à Zinnia, j'essaye donc d'améliorer cette étape du filtrage, car actuellement seuls les mots vides anglais sont pris en compte par défaut, chose peu pratique pour un blog écrit autrement qu'en langue de Shakespear.&#160; </p><p>En faisant un petit tour du Web, je constate qu'il existe bien des collections de mots vides dans différentes langues, le tout parfois même accessible en Python !</p><p>Mais les API fournies sont un peu trop optimiste, simpliste et/ou ne supportent pas Python3... De plus les collections de mots vides fournis sont parfois légères et disparates.&#160;</p><p>C'est pourquoi je me suis lancé dans <a href="https://github.com/Fantomas42/mots-vides">mots-vides</a>, une librairie Python dont les objectifs sont triples :</p><ol><li>Faciliter la maintenance des collections de mots vides.</li><li>Fournir des collections de mots clefs les plus extensives possible.</li><li>Fournir 2 APIs pour les développeurs, une bas niveau et une beaucoup plus élevée.</li></ol><p>Petit exemple de l'API haut niveau, pour récupérer et soustraire des mots vides dans un texte en français, comme dans notre précèdent exemple :</p><pre>from mots_vides import stop_words french_stop_words = stop_words('fr') print french_stop_words.rebase('Le lion est mort ce soir.') 'XX lion XXX mort XX soir.'<br />print french_stop_words.rebase('Le lion est mort ce soir.', '').split()<br />['lion', 'mort', 'soir.']</pre><p>L'API de plus bas niveau peut permettre de gérer des collections de mots vides personnalisées. Prenons par exemple que nous voulons créer une collection de langages exotiques tirés de la science-fiction, en commençant par le <a href="http://fr.wikipedia.org/wiki/Klingon_%28langue%29">Klingon</a> :</p><pre>from mots_vides import StopWord from mots_vides import StopWordFactory klingon_stop_words = StopWord('klingon') klingon_stop_words += ["HIja'", "ghobe'", 'naDev', 'nuq'] factory = StopWordFactory('mes/collections/de/mots/vides') filename = factory.get_collection_filename(klingon_stop_words.language) factory.write_collection(filename, klingon_stop_words) <br /># La collection est enregistrée # Plus tard je peux récupérer mes mots vides klingon factory = StopWordFactory('mes/collections/de/mots/vides') klingon_stop_words = factory.get_stop_words('klingon')</pre><p>L'API de bas niveau m'a surtout permis de construire les outils nécessaires à la compilation des différentes collections glanées çà et là sur le net. Grâce à ces outils, la librairie supporte <a href="https://github.com/Fantomas42/mots-vides/tree/develop/mots_vides/datas">39 langues</a> différentes, et la mise à jour ou l'ajout de langues peut se faire rapidement.</p><p>Le support de toutes ces langues est un bon début, et va donc me permettre d'améliorer ce <em>léger</em> détail qu'est le filtrage des mots vides dans Zinnia. Bien sûr d'autres utilisations sont envisageables. :)</p><p>Pour contribuer : <a href="https://github.com/Fantomas42/mots-vides">https://github.com/Fantomas42/mots-vides</a></p> fantomas42@gmail.com (fantomas)Thu, 05 Feb 2015 21:33:29 +0000https://blog.fantomas.site/blog/2015/02/05/je-lui-dirais-des-mots-vides/DéveloppementLe temps des releases : django-livereload https://blog.fantomas.site/blog/2014/06/16/le-temps-des-releases-django-livereload/ <img src="/media/cache/0a/47/0a47ce85df248b42aa4ed6d8646b361d.jpg" alt="Le temps des releases : django-livereload" /> <p>Lors de la refonte du site, j'ai découvert l'utilisation de <a title="Gulp" href="http://gulpjs.com/">Gulp</a> et de <a href="http://livereload.com/">LiveReload</a>, 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.</p><p>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...</p><p>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.</p><p>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.</p><p>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 : <a href="https://code.djangoproject.com/ticket/18855">https://code.djangoproject.com/ticket/18855</a></p><p>C'est pour toutes ces raisons que j'ai créé et publié <a href="https://pypi.python.org/pypi/django-livereload">django-livereload</a>. Grâce à cette application qui modifie le serveur de développement, vous pouvez désormais profiter du rechargement automatique de la page en cours quand vos fichiers Python sont modifiés.</p><p>Comment ca marche ? Rappelez-vous, le serveur de développement se recharge déjà quand un fichier Python est modifié, et bien quand le serveur est totalement rechargé, une requête de rechargement est émis vers le serveur LiveReload qui lui se chargera de dispatcher la requête vers le navigateur. </p><p>En effet après quelques recherches, j'ai compris que les logiciels comme <a href="http://gulpjs.com/">Gulp</a> ou <a href="http://gruntjs.com/">Grunt</a>, se basaient sur le projet <a href="https://github.com/mklabs/tiny-lr">tiny-lr</a> lorsqu'il fallait utiliser un serveur LiveReload, hors tiny-lr fournis une API en HTTP pour pouvoir contrôler le rechargement des fichiers. Ce qui dans notre cas est l'idéal.</p><p>Pour contribuer, voici l'adresse du projet : <a href="https://github.com/Fantomas42/django-livereload">https://github.com/Fantomas42/django-livereload</a></p> fantomas42@gmail.com (fantomas)Mon, 16 Jun 2014 12:47:53 +0000https://blog.fantomas.site/blog/2014/06/16/le-temps-des-releases-django-livereload/DéveloppementExpériencesLe temps des releases : easy_extract https://blog.fantomas.site/blog/2010/01/19/le-temps-des-releases-easy-extract/ <img src="/media/cache/9a/c2/9ac2da5d13ce19a88cda6c86704d1127.jpg" alt="Le temps des releases : easy_extract" /> <p>Imaginons que j'ai sur un serveur de donnée une grosse quantité d'archives sous différents formats, tel que RAR, ZIP, XTM... </p><p>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 ? :(</p><p>Sur ce constat m'est venu l'idée de <strong>easy_extract</strong>, 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.</p><p>Pour cela, il suffit de lancer le script de la manière suivante par exemple :</p><pre>$ easy_extract -r mes_archives/</pre><p>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</p><p>Pour l'installation, il est nécessaire d'installer les paquets suivant avant :</p><ul><li>par2</li><li>unrar-free</li><li>7zip-full</li></ul><p>Ensuite l'installation du script se fait grâce à easy_install :</p><pre>$ easy_install easy_extract</pre><p>Bien sûr le code est open-source, donc si vous voulez contribuer, forker ou juste critiquer, le code se trouve à l'adresse suivante : <a title="Source de easy_extract" href="http://github.com/Fantomas42/easy-extract">http://github.com/Fantomas42/easy-extract</a></p><p>Bonne décompression et bon leech.</p> fantomas42@gmail.com (fantomas)Tue, 19 Jan 2010 10:47:56 +0000https://blog.fantomas.site/blog/2010/01/19/le-temps-des-releases-easy-extract/DéveloppementLe temps des releases : Django-sekh https://blog.fantomas.site/blog/2009/08/31/le-temps-des-releases-django-sekh/ <img src="/media/cache/5a/0b/5a0b1dfc28bb1fa4d28b98d0d50d2208.jpg" alt="Le temps des releases : Django-sekh" /> <p>Vous avez certainement déjà vu dans <strong>Google</strong> quand vous consultez une page depuis son <strong>cache</strong>, les <strong>termes de la recherche sont coloriés</strong> dans le contenu de la page pour permettre de les discerner rapidement.</p><p>De ce principe certains sites ont adapté <strong>la même technique</strong> en coloriant certains mots de la page correspondant à la recherche de l'utilisateur si il provient d'un moteur de recherche.&#160;</p><p>C'est ce que <strong>django-S</strong>earch<strong> E</strong>ngine <strong>K</strong>eywords <strong>H</strong>ighlighter fait ! </p><p>Une fois installé avec <a title="BeautifulSoup" href="http://www.crummy.com/software/BeautifulSoup/">BeautifulSoup</a>, il suffit juste d'ajouter ce middleware à la fin de la liste dans votre fichier <strong>settings</strong>.</p><pre>MIDDLEWARE_CLASSES = ( ... 'sekh.middleware.KeywordsHighlightingMiddleware', )</pre><p>Moi quand c'est facile à installer, j'aime ! :D</p><p>Ce middleware va rajouter une balise <strong>span</strong> autour des mots de la recherche, le tout avec des classes qui vont bien permettant la décoration en CSS.</p><p>L'inconvénient est que si votre HTML est mal formatté, le middleware risque de faire planter la page.</p><p>Pour voir <a title="Exemple de django-sekh" href="http://fantomas.willbreak.it/blog/2009/jul/19/release-django-smileys/?hl=django%20middleware">un exemple cliquez ici</a>.</p><p>Pour plus d'informations et pour télécharger le code : </p><p><a title="django-sekh" href="http://github.com/Fantomas42/django-sekh/tree/master">http://github.com/Fantomas42/django-sekh/tree/master</a></p> fantomas42@gmail.com (fantomas)Mon, 31 Aug 2009 18:17:51 +0000https://blog.fantomas.site/blog/2009/08/31/le-temps-des-releases-django-sekh/DéveloppementLe temps des releases : Django-smileys https://blog.fantomas.site/blog/2009/07/19/release-django-smileys/ <p>Parfois il est temps de se sortir les doigts du code, et d'en parler !<br />Mais pour en parler, il faut documenter, ce qui prend un peu de temps, mais j'y travaille.</p><p>Pour commencer je vais vous présenter une de mes applications favorites, par sa simplicité et son utilité incroyable. :D</p><p><strong>Django-smileys</strong> est une application <strong>Django</strong> comme son nom l'indique, permettant d'inclure facilement dans ses templates des smileys, de ce genre :) :p.</p><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.</p><pre>{% load smiley_tags %} {{ object.content|smileys }}</pre><p>Plutôt facile non ? Surtout que l'on peut maintenant convertir tout type de contenu texte.</p><p>La liste des smileys est configurable, ainsi que l'url de dépot et la classe d'habillage CSS.</p><p>Pour télécharger ce projet hallucinant : <a title="Dépot de Django-smileys" href="http://github.com/Fantomas42/django-smileys/tree/master">http://github.com/Fantomas42/django-smileys/tree/master</a></p><p>Bientôt d'autres releases.</p> fantomas42@gmail.com (fantomas)Sun, 19 Jul 2009 13:25:48 +0000https://blog.fantomas.site/blog/2009/07/19/release-django-smileys/Développement