Archive for the 'Programmation' Category

Page 2 of 3

blogit.vim

Cela faisait un moment que j'en avais marre de passer par mon navigateur pour écrire mes billets sur ce blog. Les raisons sont simples, tout d'abord j'utilise communément vim comme éditeur de texte, et il m'est assez insupportable d'écrire du texte dans les textarea Qt où je ne bénéficie pas des raccourcis et de ma configuration de vim. En outre, j'ai horreur du web, et je ne supporte pas de passer par l'interface d'administration de WordPress que je trouve lourde de javascript.

C'est pourquoi lorsque pankkake m'a appris l'existence d'un script vim pour publier des billets WordPress par XML-RPC, je fus enchanté.

Cependant, certaines choses de ce script ne me satisfaisaient pas. D'une part, je n'aimais pas la syntaxe des meta-data, je préférais afficher celles-ci dans le style mail, afin que cela me rapproche plus de l'écriture d'un e-mail avec mutt.
En outre, après édition du code source (qui, agréable surprise, est en Python), j'ai vu des horreurs du code, du style :

("".zfill(size-len(p["postid"])).replace("0", " ")+p["postid"])

Qui a en fait pour but de faire, en se compliquant la vie, ceci :

'%5d' % int(p["postid"])
# Ou pour être exact :
('%%%dd' % size) % int(p["postid"])

Il a également eu la bonne manie d'entourer chacune de ses fonctions par :

try:
    # ...
except:
    sys.stderr.write("An error occured")

Ce qui est très laid.

En bref, vu l'horreur que cela représente, j'ai décidé d'écrire un plugin de zéro afin de rendre ça un peu plus agréable à utiliser et le code un peu plus propre.

Ceci a abouti à ce super script blogit.vim, qui possède l'API suivante :

  • :Blogit ls — affiche la liste des articles (entrée sur un article l'édite)
  • :Blogit new — créer un nouvel article
  • :Blogit edit <id> — édite un article
  • :Blogit commit — enregistre l'article courant
  • :Blogit push — publie l'article courant
  • :Blogit unpush — retire la publication de l'article
  • :Blogit categories — liste les catégories
  • :Blogit rm <id> — supprime un article

blogit.vim est releasée en version 1.0.

Ce présent billet est d'ailleurs le premier écrit avec ce script, et j'espère que sa commodité d'utilisation m'incitera à écrire plus fréquemment :

screenshot
Billet écrit avec vim : coloration syntaxique, correction orthographique, fonction undo/redo, etc.

Où en est Peerfuse

Cela fait quelques temps que je n'ai pas donné de nouvelles de Peerfuse, je vais donc corriger ceci.

Un été actif

Ainsi que je l'avais raconté dans un billet précédent, il se trouve qu'une nouvelle version du protocole a été définie, plus sécurisée, utilisant moins de bande passante et ne nécessitant pas pour chaque pair à connaître tous ceux du réseau, ce qui permet d'avoir des réseaux de tailles non négligeables.

Le travail a débuté cet été avec l'aide de Eld et tito, le premier spécialiste des réseaux peer-to-peer, qui m'a aidé dans la réalisation du protocole, et le second contributeur plus connu pour avoir été président de l'association de jeux vidéos libres Nekeme Prod. (oui leur site est down), et qui a réalisé entre autres un serveur XML-RPC inclus dans Peerfuse, qui permettra à l'avenir de développer des frontends (graphiques ou non) avec une interaction plus user friendly avec Peerfuse.

Une charge de travail assez importante a été réalisée, et la DHT Chimera a été correctement importée. D'ailleurs, je pense que le mot « réécrite » corresponds davantage à ce qui a été effectué. En effet, tout d'abord la DHT était écrite en C, et j'ai adapté tout le code afin de correspondre au style C++ du projet.

En outre, j'ai séparé la partie réseau de la partie DHT, en réécrivant entièrement le moteur réseau de Peerfuse, beaucoup plus souple et extensible.
Ainsi, la DHT s'allège du code réseau de Chimera qui était, il faut bien l'avouer, complètement moisi (voir ici).

Peerfuse bénéficie d'ailleurs maintenant d'une meilleure architecture. Chaque partie de l'ancien common (la partie de code commune à peerfuse-net et peerfuse-lan) a été transformée en petites bibliothèques indépendantes. Ainsi nous trouvons maintenant :

  • util — Diverses classes génériques, pour gérer les threads, la config, les mutex, le logging, etc.
  • net — Contient la classe Network ainsi que diverses autres classes qui constituent la fondation du moteur réseau de Peerfuse.
  • dht — La fameuse DHT écrite à partir de Chimera, et qui est entièrement fonctionnelle.
  • ssl — Des classes faisant couche d'abstraction d'OpenSSL, afin d'assurer la sécurité des transmissions dans Peerfuse
  • scheduler — Un système de tâches planifiées qui a été amélioré afin de tourner sur plusieurs threads
  • files — Les classes qui gèrent les dossiers et les fichiers, ainsi que leurs contenus et diverses méthodes d'abstraction autour des transferts
  • fuse — Ce sont les handlers de la libfuse et qui appellent les fonctions Peerfuse

Un intérêt à la séparation des différentes petites libs, c'est que j'ai pu tester la DHT avec le moteur réseau et la libutil, de façon totalement indépendante dans un programme de test, et que ça marche.

Le desert

Malheureusement, à partir d'octobre, la dépression causée par divers évènements personnels ma conduit à m'intéresser moins au projet.

Le travail qui reste à faire est plus chiant qu'autre chose, c'est à dire réécrire une partie du code de Peerfuse pour supporter la nouvelle API réseau et protocolaire (DHT).

Le souci, c'est que Peerfuse en lui même ne compile pas du tout (contrairement aux mini libs), et que cela ne facilite pas le travail des quelques contributeurs intéressés par le projet, et qui du coup n'en foutent pas une.

Donc je pense qu'il me faudrait un bon coup de remotivation pour reprendre le travail que j'ai laissé inachevé en automne dernier. Ça va être dur, parce que j'avais trouvé un moyen pour me pousser à me remettre au travail, mais les quelques conquetes féminines n'ont pas suffit à me remotiver :)

Les six derniers mois

Ça fait longtemps que j'ai pas raconté ma vie ici, donc je vais en profiter, histoire de.

Tout d'abord, j'ai commencé un nouveau projet que je garde secret pour le moment, mais que certaines personnes connaissent sous le nom d'AuM. Ce projet est écrit en Python, utilise les libs mechanize et html5lib, je vous laisse imaginer quel genre d'utilité cela peut avoir.
Mais je reviendrai dessus dans un billet futur, quand sera venu le moment adéquat pour en parler. Je ferai peut-être une conférence dessus fin mai aux PyCon 2009.

En outre, j'ai remis en place Men Are Ants, à sa version 0.4, qui était plus abouti, et abandonne la réalisation de la version 3D isométrique, l'intérêt étant réduit, et n'ayant plus vraiment envie de m'investir dans ce projet. Je corrigerai sans doute néanmoins les quelques bugs que j'ai remarqué lors d'une partie récente avec pankkake.

J'ai finalement envoyé mes patches pour ncmpc upstream, le projet ayant été depuis repris par un des principaux développeurs de MPD. Il se trouve que la personne, Max Kellermann, a été très intéressé par mes patches, m'a demandé d'en faire d'autres, et m'a très gentilment proposé de devenir contributeur, chose que j'ai accepté avec enthousiasme. En effet, je prends plaisir à participer, pour une fois, à un projet d'envergure et que j'utilise tous les jours.

Je n'ai pas encore eu pour le moment l'occasion de faire grand chose, mais je suis intéressé par la réalisation d'un système de plugins chargés dynamiquement, qui permettrait d'étendre les possibilités offertes par MPD, et de rendre plus propre la gestion des modules de sortie audio.

Enfin, je me suis mis en tête de réaliser un agrégateur de flux RSS deux-tiers (comme disent les décideurs), avec un backend qui récupère les données, et un frontend en ncurses (il pourrait y en avoir d'autres) qui se synchronise et (très important) peut récupérer les articles en local, permettant de les lire même en étant offline.

Ceci résoudrait le problème que j'ai à ne pas pouvoir lire mes flux RSS au boulot, puisque j'utilise Akregator, qui est une application graphique KDE qui ne me permet pas de gérer la synchronisation avec mon PC du boulot.

Je n'ai pas encore commencé, mais avec un peu de motivation ça peut le faire.

Conclusion

J'ai donc pas mal de projets en attente, qui sont tous aussi intéressants les uns que les autres, et j'espère ne pas tomber dans le schéma lodesi, qui a beaucoup d'idées mais jamais le courage de les réaliser jusqu'au bout.

Peerfuse aux RMLL

Le futur de Peerfuse s'annonce radieux. Après plus d'un mois de discussions, une nouvelle version du protocole permettant de meilleurs performances est définie, et va se baser sur Pastry, une DHT qui corresponds à ce que l'on souhaite implémenter.

Le nouveau protocole a été décrit (grossièrement) dans la présentation de Peerfuse aux RMLL08, dont vous pouvez retrouver les slides ici.

Malheureusement, ceci implique une importation de Pastry, qui est écrit en Java, vers le langage utilisé pour Peerfuse qui est le C++.

C'est un travail monstrueux, et malgré la propagande faite par hydromiel et moi aux RMLL, personne ne s'est senti de m'aider à cette tâche. D'ailleurs, dans les discussions que j'ai pu avoir, il semblerait que l'utilisation du langage C++ soit un vrai frein pour les contributeurs (à moins que ça ne soit qu'un prétexte).
Je n'ose imaginer comment ça serait si on avait écrit Peerfuse, comme j'avais soulevé l'idée au départ, en langage D.

Notez que le projet utilise maintenant Git, que le site peerfuse.org est temporairement mort, et que vous êtes donc bien invité de venir sur le canal IRC #peerfuse@freenode si vous souhaitez suivre l'évolution.

De subversion à git

Il a été décidé il y a peu que le projet Peerfuse utiliserait dorénavant le système de gestion de version Git.

Je ne reviendrai pas sur l'intérêt qu'apporte un système de révision distribué (indépendance vis à vis d'un serveur central, l'avantage des branches, facilité pour un contributeur irrégulier de contribuer, etc.).

Je me permets juste de donner quelques opérations à suivre pour importer un dépôt subversion (note: installer préalablement git et git-svn) :

$ mkdir project
$ cd project
$ git svn init -t tags -b branches -T trunk https://svn.example.org/prjt
Initialized empty Git repository in .git/
$ git svn fetch

Et.. c'est tout.

Nous disposons maintenant d'un dépôt git indépendant, contenant l'intégralité de l'historique des commits du subversion. On peut ainsi le mettre à disposition pour que d'autres en profitent, et se mettre à travailler immédiatement.

Pour plus d'informations sur comment utiliser git, je préfère vous laisser vous référer à la très bonne documentation de Git.

Je profite de ce bref billet pour rappeler que Peerfuse a besoin de contributeurs.
À ce propos, une conférence se déroulera aux RMLL08 sur Peerfuse, ainsi n'hésitez pas à la regarder si vous êtes intéressé par le projet.

Deux patches pour ncmpc

Hier je me suis dis que je pourrais enfin passer à MPD, chose que je voulais faire depuis un moment, afin de remplacer ma solution à la base temporaire mais que je traîne depuis près de deux ans, qui est d'utiliser mplayer et de simuler les playlists avec des dossiers et des liens symboliques.

Après installation de mpd (qui était vraiment triviale), j'ai décidé d'utiliser le client ncmpc. Prise en main triviale, pratique, cependant il me manquait deux fonctionnalités : la sélection visuelle (multi-ligne), et le tri aléatoire au sein d'une même sélection.

J'ai donc fais deux petits patches que j'aurais volontiers remonté upstream, sauf que j'ai appris la chose suivante :

Nobody has been able to contact the ncmpc maintainer, Kaw, since about a year.

N'ayant pas envie de forker pour cet ajout mineur de fonctionnalités, voici les deux patches :

ncmpc

MAJ: Mes patches ont été intégrés upstream, maintenant que le projet a été repris par Max Kellermann.

Dix pratiques pour être un mauvais programmeur

Il est malheureusement fréquent de rencontrer du code vraiment mauvais, principalement dans des petits projets, des projets "vites faits bien faits", mais également dans de plus grosses usines à gaz, ou souvent dans les entreprises qui éditent des logiciels propriétaires.

Mais est-il facile pour autant de devenir un mauvais programmeur ?

Voici 10 astuces qui permettront à tout un chacun de s'en approcher.

Continue reading 'Dix pratiques pour être un mauvais programmeur'

[C++] Des défauts du C++ (Part 1) : std::string

Le C++ est un langage très sympa qui permet de faire de l'objet tout en gardant une compatibilité avec le C. Il est de fait le langage le plus approprié lorsqu'on veut allier objet et "bas niveau". Cependant, il possède des défauts assez décevants car pouvant être (je pense) évités.
Je vais débuter une série d'articles concernant les quelques inconvénients que je rencontre au quotidien. Si bien évidemment pour vous c'est une "feature not a bug", n'hésitez pas à exprimer votre pensée dans les commentaires.

Continue reading '[C++] Des défauts du C++ (Part 1) : std::string'

Peerfuse

Il y a maintenant plus d'un mois j'ai débuté avec lodesi un projet intitulé Peerfuse, qui est un système de fichiers distribué peer-to-peer.

Le projet est découpé en deux sous projets distincts (possédant une base de code commune) :

  • peerfuse-net pour un réseau sur Internet avec des inconnus. La principale utilisation à laquelle on pense, est un but similaire à Emule, à part qu'au lieu d'avoir un espace par utilisateur, ici tout le monde partage le même espace. Ceci permet l'échange de vidéos, photos, musiques, programmes, images CD de distributions Linux, etc.
  • peerfuse-lan pour un réseau avec ses propres machines. Il permet par exemple de partager une partition /usr/local entre divers machines. Ainsi chacunes de ces machines possède virtuellement un grand nombre d'applications, et elles ne sont récupérées que lorsqu'on les utilise effectivement.

Le principe en surface est simple :

  • C'est un système de fichier, c'est à dire qu'il n'y a pas de GUI (bon en fait on en fera probablement une pour aider à effectuer certaines tâches).
    Il suffit donc de lancer peerfuse avec la commande mount sur un point de montage qui sera l'espace partagé.
  • Il n'y a pas de serveur central, lorsque l'on rejoint le réseau, il suffit de se connecter sur l'un des peers, qui va nous mettre en relation avec tous les autres.
  • La partition montée est commune à tout le monde. C'est à dire que l'arborescence présente dans le point de montage sera le même pour tout le monde.
    Lorsque l'on souhaite partager un fichier avec le reste du monde, il suffit donc de le copier vers le point de montage, et ainsi chaque utilisateur y verra le fichier et pourra le lire ou le copier à son tour (ce qui effectue un téléchargement).
  • Il y a tout de même un système de permissions, comme sur tout système de fichier unix.
    Sur peerfuse-net, chaque peer possède un UID, et chaque fichier qu'il crée aura pour propriétaire cet uid. Après les permissions unix s'appliquent comme d'habitude. Les groupes seront également supportés, avec le principe qu'un utilisateur est propriétaire du groupe au GID = UID. C'est donc lui qui ajoute des personnes à son groupe.
    Sur peerfuse-lan, les permissions du système unix sont concervées. Ainsi root sur une machine pourra voir root sur les autres machines.
  • Une autre puissance de peerfuse est de permettre un travail collaboratif. En effet, les fichiers sont modifiables par ceux qui en ont la permission. Il est ainsi facile d'imaginer qu'un projet soit créé sur un réseau peerfuse, dans un dossier où seul le groupe G a droit d'écriture dessus. Tous les membres de ce groupe pourront modifier et faire évoluer ce projet.
    Attention toute fois, pour des projets d'ampleur tels que des logiciels, il est préférable d'utiliser un système de gestion de version tel que Subversion. En effet, peerfuse ne gère pas l'historique des versions, ni les accès concurrents à un même fichier (la dernière écriture gagne).
  • Peerfuse fonctionne en mode déconnecté, c'est à dire que même lorsque l'on est déconnecté du réseau, on peut lancer peerfuse et ajouter des fichiers, en supprimer, en modifier, etc. Lors de la prochaine reconnexion au réseau, les changements seront appliqués.
  • Tous les échanges sont sécurisés, utilisant SSL pour les connexions.
    peerfuse-net renforce encore les systèmes de sécurité, avec signatures de tous les messages et fichiers, encryptage des fichiers accessible que par une partie des utilisateurs (propriétaire ou groupe), certificat délivré par une autorité afin d'assurer l'authenticité de tel utilisateur, etc.
  • Les transferts seront effectués probablement en UDP pour peerfuse-lan, afin de gagner un débit optimal.
  • Ces transferts seront effectués dans la limite du possible en streaming. Le but est de pouvoir lire une vidéo de façon totalement transparente même lorsqu'elle n'est pas encore sur la machine locale. Si le débit du transfert est plus rapide que celui de la vidéo, aucune différence ne sera faite.

C'est un projet assez novateur et dont les tentatives similaires (mais n'ayant pas le tiers des fonctionnalités que nous proposons) sont toutes tombées à l'eau. Je pense que Laurent et moi avons la volonté suffisante pour que ça ne soit pas le cas avec ce projet.

Cependant, comme on peut l'imaginer, il y a énormément de problèmes de sécurité dans peerfuse-net qui peuvent se poser, en raison de la présence éventuelle de malfaiteurs. Nous en avons déjà résolu une grande partie, mais il reste encore quelques sujets mineurs sur lesquels plancher.

Développement

Nous recherchons tout de même des développeurs afin de nous aider sur le projet, car il y a du boulot. Cela dit, je pense qu'on atteindra une première version stable et incomplète de peerfure-lan rapidement, étant donné qu'il ne pose plus de problèmes de sécurité, et qu'il manque uniquement les transferts des fichiers.

Vous pouvez récupérer les sources grâce à :

$ svn co https://piggledy.org/svn/peerfuse/trunk peerfuse

Login: anonymous
Password: <Enter>

Vous trouverez la base commune dans common/, la partie concernant peerfuse-net dans peerfuse-net/ et je vous laisse deviner où se trouve le code de peerfuse-lan.
La documentation se trouve dans doc/, cependant ne lisez pas proto.html qui est complètement dépassé maintenant.

Lisez plutôt peerfuse-net/PROTOCOL et doc/pfnet.proto.

N'hesitez pas à nous rejoindre sur le salon IRC #peerfuse@freenode. Une mailing list sera bientôt mise en place.

Plus d'informations sur http://peerfuse.org.

TODO

todo.png

Commentaires

L'intérêt du logiciel libre est non seulement de pouvoir lire le code source des logiciels ilbres qu'on utilise, mais en plus de lire les commentaires laissés à l'intérieur.

On assiste parfois à des discussions du style :

 
/* Remap low number numerics, not that I understand WHY.. --Nemesi  */
/* numerics below 100 talk about the current 'connection', you're not
 * connected to a remote server so it doesn't make sense to send them
 * remotely - but the information they contain may be useful, so we
 * remap them up.  Weird, but true.  -- Isomer */
if (numeric < 100)
  numeric += 100;
 

Je prends cet exemple car c'est le dernier que j'ai eu l'occasion de rencontrer, mais je peux assurer que le nombre de commentaires de ce style est proportionnel à l'ancienneté du logiciel (nombre de hacks) au nombre de contributeurs (incompréhension de ce qu'a pu faire d'autres personnes).




Bear