17 June 2013

Carl Chenet

Vrac de mini-messages n°5 : rhel7, PyPy, Prism, Debian Wheezy 7.1, docker, SSH, chromium

Suivez-moi aussi sur Identi.ca ou sur Twitter.

Comme chaque semaine, voici les dents/tweets intéressants de la semaine dernière que j’ai publiés sur Identi.ca ou sur Twitter, revus et augmentés d’éventuels observations et commentaires mûris au cours de la semaine passée. Au menu : contenu de RHEL7, la branche 3 de PyPy, question autour de Prism, sortie de Debian Wheezy 7.1, conteneurs Linux avec docker, sécurité autour des clés SSH et chromium 27

  • at #rhsummit , rhel7 will come without mysql as it will be replaced with mariaDB; which is mysql api compatible. it will include mongodb too => un tweet très intéressant qui nous apprend que MariaDB, le fork de MySQL lancé suite au rachat de MySQL par Oracle, va remplacer MySQL sur la nouvelle version de la distribution de Red Hat RHEL 7. MongoDB, la base de données non-sql orientée documents sera également incluse.

Red_hat_logo

  • #PyPy Py3k status #11 : très proche d’une première publication => PyPy est l’implémentation en pur Python d’un interpréteur Python. La branche 2.x du projet vise à être entièrement compatible avec cpython 2.7. Le développement de la branche 3.x suit un rythme soutenu et le blog de PyPy a publié une note très intéressante sur le travail en cours. A lire pour tous les fans de Python pour Python :)

Pypy_logo

  • Prism : pour les particuliers : bigbrother mais pour les entreprises, espionnage industriel ? #guerreéconomique => un dent assez inhabituel de ma part, mais c’est une question que je trouve pertinente dans le concert des protestations pro-liberté individuelle que nous avons entendu ces derniers jours. Quid de l’espionnage industriel que permet cette technologie ? Les Etats-Unis savent que leur avance technologique dans les nouvelles technologies est un atout de poids et un système comme Prism me paraît tout à fait approprié pour obtenir les informations nécessaires à sa conservation. Pour les entreprises, plus que jamais, méfiance quant à vos données personnelles et stratégiques.
  • Première mise à jour mineure #Debian #Wheezy 7.1 normalement ce week-end http://ur1.ca/eb1kf => je l’avais annoncé dans ce billet, elle est arrivée à l’heure. Dans le cadre de migrations complexes ou de parcs de serveurs importants, n’hésitez pas à recourir à un professionnel pour mettre à jour vos parcs de serveurs Debian.
Wheezy

Wheezy

docker_logo

  • améliorer la sécurité de vos clés SSH privées http://ur1.ca/e1de9  lu sur @GCUSquad => un petit plus simple à mettre en place et qui apporte un gain réel au niveau sécurité. J’aime :)

openssh_logo

  • Paquet #debian chromium-browser 27 maintenant dans #debian testing (#Jessie) http://b1t.it/doWB => Marre des sites à la noix qui vous indiquent que vous n’employez pas la dernière version de Chrome ? Elle est désormais disponible pour Debian Jessie.  A installer sans attendre !

chromium_logo

Et vous ? Que pensez-vous des technologies et articles abordés ci-dessus ? N’hésitez pas à réagir dans les commentaires. Et à la semaine prochaine pour la suite de cette série d’articles.


17 June, 2013 10:01PM par Carl Chenet

Raphaël Hertzog

Mes activités libres en mai 2013

Voici le récapitulatif mensuel de toutes mes activités gravitant autour du logiciel libre. Si vous faites partie des personnes ayant fait un don pour soutenir mon travail (70 €, merci à tous !), c’est l’occasion de constater ce que je fais de votre argent. Sinon, c’est toujours quelques nouvelles intéressantes sur l’avancement de mes différents projets.

Cahier de l’Admin Debian

Traduction espagnole complète. L’équipe espagnole a fini la traduction du livre. Le processus de compilation PDF n’était pas encore prêt pour les traductions, ce que j’ai du corriger. J’ai également amélioré en parallèle le script de compilation Mobipocket, afin de pouvoir utiliser KindleGen d’Amazon lorsque disponible (car Amazon requiert maintenant que cet outil soit utilisé pour générer les fichiers Mobipocket destinés à être distribués sur leur plateforme).

Une fois ces problèmes corrigés, j’ai fait la promotion de cette traduction, qui est la première à avoir été menée à terme. Les traducteurs méritent bien toutes nos félicitations !

Projets pour la traduction française. Vous savez que le livre Debian Administrator’s Handbook est venu au monde en tant que traduction anglaise du Cahier de l’Admin Debian (publié par Eyrolles). Ce qui signifie que nous avons actuellement une traduction libre d’un livre propriétaire. Ce qui est une situation plutôt étrange, à laquelle je souhaite remédier depuis le début.
J’ai donc discuté avec Eyrolles pour trouver un compromis permettant de publier le livre original sous les mêmes licences que celles utilisées pour le livre anglais…et le résultat n’est autre que le lancement d’une nouvelle campagne de financement communautaire, visant à libérer le livre original et le faire devenir une traduction du Debian Administrator’s Handbook à part entière.

[Mise à jour du 17 juin 2013: en moins d'une semaine, la campagne a été couronnée de succès, puisque l'objectif de 15 KEUR pour la libération a été atteint. De nouveaux objectifs ont été fixés et atteints entre temps (donnant droit à des livres électroniques supplémentaires). Il reste un dernier objectif à 25 KEUR pour que 15% des bénéfices soient reversés à Debian.]

Apprenez en plus et apportez-nous votre soutien sur la page Ulule du projet (Ulule étant l’équivalent de Kickstarter pour les personnes ne résidant pas aux États-Unis).

Liberate the Debian Handbook

Debian France

J’ai mis à jour notre application de gestion des adhésions de nos membres vers la version 0.7.4.1, qui comporte de nombreuses corrections de bogues. Mais le vrai événement ce mois-ci fut la tenue du salon “Solutions Libres et Opensource” à Paris où Tanguy Ortolo, moi-même et d’autres volontaires (Cédric Boutillier, Arnaud G., et d’autres dont j’ai oublié le nom, merci à eux !) avons tenu le stand Debian deux jours consécutifs (28-29 mai). Pour une fois nous avions un tas de goodies à vendre (buffs, tapis de souris, polos, stickers, etc.), et notre stand fut particulièrement fréquenté.

The Debian Booth (Tanguy on the left, Raphaël on the right)

Google’s Summer of Code

J’ai été submergé le mois dernier par des demandes d’étudiants intéressés par la « réécriture du système de suivi des paquets », pour laquelle je me suis proposé d’être le tuteur, dans le cadre du Google’s Summer of Code. J’ai retenu au final six candidatures intéressantes, que Stefano et moi avons étudiés. C’est Marko Lalic qui a été retenu.

La période de « tissage de liens » communautaires (« Community Bonding Period ») commence tout juste et nous sommes en train de détailler plus précisément la manière dont nous allons organiser le travail. Nous allons essayer le canal IRC #debian-qa sur OFTC pour les questions et réponses, ainsi que les revues hebdomadaires.

Travaux d’empaquetages divers

J’ai empaqueté zim 0.60 et, avec la publication de Wheezy, j’ai envoyé vers unstable tous les paquets que j’avais préparé dans experimental (cpputest, publican). J’ai également parrainé l’envoi de libmicrohttpd en version 0.9.27-1.

J’ai créé quelques rapports de bogues que j’ai rencontrés avec la prochaine version de dpkg 1.17.0 (n°709172 et n°709009). Dans les deux cas, le paquet utilisait un mauvais chemin d’accès (codé en dur) vers dpkg-divert (le binaire a été déplacé de /usr/sbin/ vers /usr/bin/ il y a un bout de temps, et le lien symbolique assurant la rétrocompatibilité n’est plus maintenu à présent). Je me suis également occupé du bogue n°709064, où l’utilisateur a rapporté des problèmes de montée de version liés à multiarch.

J’ai également créé un autre rapport de bogue directement en amont concernant publican, afin de demander qu’un moyen soit trouvé pour éviter la duplication d’autant de fichiers (je l’ai créé comme réponse au bogue Debian n°708705 que j’ai reçu).

Travail sur Kali

J’ai du mettre à jour OpenVAS pour Kali, mais la compilation a échoué dans un environnement Debian 7 pour certaines parties. J’ai diagnostiqué le problème et soumis un patch directement en amont.

J’ai également été en contact avec le mainteneur Debian d’OpenVAS car je souhaitais contribuer en retour au paquet Debian, mais des problèmes de temps ont renvoyé ça à un peu plus tard.

Merci

Rendez-vous au mois prochain pour un nouveau résumé de mes activités !

Ceci est une traduction de mon article My Free Software Activities in May 2013 contribuée par Weierstrass01.

Aucun commentaire pour le moment | Vous avez aimé ? Cliquez ici. | Ce blog utilise Flattr.

17 June, 2013 02:13PM par Raphaël Hertzog

12 June 2013

Carl Chenet

Première mise à jour mineure Debian Wheezy 7.1 normalement ce week-end

Suivez-moi aussi sur Identi.ca ou sur Twitter.

La première mise à jour mineure de Debian Wheezy, à savoir la version 7.1 est normalement prévue pour ce week-end.

Au menu des mises à jour pour (sauf modifications de dernière minute) :

Niveau noyaux :

  • Noyau Linux 3.2.46
  • Noyau kfreebsd-9 9.0-10

Niveau serveurs :

  • MySQL 5.5.31
  • modsecurity-apache 2.6.6.6

Niveau langages :

  • PHP 5.4.4

Niveau bureau utilisateur :

  • Xorg 1.7.7
  • Chromium-browser 27
  • Iceweasel 17 ESR
  • Libreoffice 3.5.4
  • nvidia-graphics-drivers
  • subversion 1.6.17

Outils Debian :

  • Apt 0.9.7.9
  • debootstrap 1.0.48

Et bien d’autres paquets encore ! Le contenu du dépôt stable-proposed-updates appelé à être poussé dans le dépôt wheezy-updates lors de la publication de la mise à jour est disponible sur la page des paquets dans proposed-updates.

Les mises à jour mineures jalonneront la vie de Debian Wheezy, mais la première est particulièrement importante pour corriger les changements advenus rapidement après la publication de Wheezy 7.0. C’est aussi pour moi un signal fort de mise à jour car, rappelons-le, la vieille stable Squeeze ne sera encore maintenue qu’un an à partir de la date de sortie de Debian Wheezy.

Et vous ? Qu’attendez-vous de cette mise à jour et que pensez-vous de ce fonctionnement ? N’hésitez pas à réagir dans les commentaires.


12 June, 2013 10:01PM par Carl Chenet

31 May 2013

Tanguy Ortolo

Linkeo menace LinuxFr par avocat interposé

Avis à toute la population : la société Linkeo vient de menacer et de tenter d'extorquer un dédommagement à LinuxFr pour un commentaire envoyé par un visiteur suite à une annonce d'offre d'emploi.

Linkeo, au cas où vous passeriez par ici :

  • Les menaces, c'est mal. Le chantage, c'est mal. L'extorsion, c'est mal.
  • Entre gens civilisés, on peut envisager de régler ses comptes directement et avec courtoisie.
  • LinuxFr est un site Web, pas un « site Internet », nom d'un yak !
  • man Streisand
  • Changez d'avocat. Le votre n'est pas capable de chercher les mentions légales sur un site Web et ne respecte visiblement pas les règles de déontologies de sa profession.

31 May, 2013 11:48AM par Tanguy

30 May 2013

Roland Mas

Le joli mois de mai

Comme d'habitude quand je n'ai rien de vraiment fracassant à annoncer au monde ébahi, ce billet mensuel sera sous forme de trucs-en-vrac.

Premièrement : Raphaël et moi avons obtenu l'accord des éditions Eyrolles pour une libération (conditionnelle) du Cahier de l'Admin Debian dans sa version française. La version anglaise a déjà été libérée l'an dernier, mais le texte original reste pour l'instant sous copyright d'Eyrolles. Mais suite à d'âpres négociations, nous avons obtenu une rétrocession des droits, sous condition de l'assurance d'un certain nombre de ventes du livre. Donc nous avons lancé une campagne de financement, qui nous permettra de fournir cette assurance à Eyrolles, qui pourra en toute confiance lancer une nouvelle édition. Le livre sera bien entendu en librairies, mais les « préventes » par Ulule proposent des contreparties supplémentaires, et surtout elles contribuent à la libération du livre, ce qui permettra son évolution et sa maintenance collaborative. Nous vous encourageons donc chaleureusement à participer à cette campagne.

Deuxièmement : je note une fois de plus que la fin du monde-tel-qu'on-le-connaît, qui était annoncée pour hier, n'a pas eu lieu : au moins dans mon village, ce matin, les rues n'étaient pas à feu et à sang, ni envahies d'ogres mangeurs d'enfants. Ça fait deux fins du monde annoncées puis ratées en moins de six mois. Nous sommes tous des survivors.

Troisièmement : ça n'a rien à voir, mais il y a quand même quelque chose qui s'est fini. C'était il y a quelques semaines et je n'ai pas eu l'occasion d'en parler, mais des divergences sur l'orientation du groupe ont fait que les chemins d'Eleven et de votre serviteur se séparent. Donc je me retrouve en recherche d'un groupe de rock, et Eleven se trouve en recherche d'un batteur. Comme on n'est pas des stars capricieuses, les « divergences » ne sont pas un euphémisme pour des portes qui claquent et des rancunes inextinguibles, désolé de vous décevoir, on s'est juste arrêtés de jouer ensemble. Je vous tiens au courant si (et quand) je trouve un nouveau groupe.

Je crois que c'est tout pour ce mois-ci. La suite… un autre jour.

30 May, 2013 08:00AM

28 May 2013

Raphaël Hertzog

Libérons le Cahier de l’Admin Debian

Rappelez-vous, il y a 18 mois je lançais le projet de traduction du Cahier de l’Admin Debian en anglais, et nous avions fait d’une pierre deux coups puisque, grâce à votre soutien, le livre traduit a été placé sous licence libre.

J’ai toujours été très fier de ce que nous avons déjà accompli mais je ne pouvais m’empêcher d’avoir un sentiment de projet inachevé… En effet, le cahier de l’admin Debian original — en Français — restait sous licence propriétaire selon les termes de mon contrat original avec les éditions Eyrolles.

Campagne de libération du livreJe savais aussi que pour convaincre mon éditeur de changer d’approche, il me fallait des éléments pour leur montrer qu’une licence libre pouvait être bénéfique à la diffusion du livre (et donc à ses ventes).

Il y quelques mois j’ai donc repris contact avec mon éditrice (coucou Muriel !), sachant parfaitement que l’éventuelle publication d’une nouvelle édition pour Debian 7.0 était l’occasion rêvée de changer les termes du contrat. Avec mon retour d’expérience sur le livre en anglais, et la morosité des ventes du livre actuel, j’ai donc pu convaincre Eyrolles de tenter l’expérience d’une publication sous licence libre.

J’ai donc travaillé avec Eyrolles pour mettre en place un projet permettant la libération du livre actuel, sa mise à jour pour Debian 7.0, et la mise en place d’une nouvelle édition en librairie (c’est important de continuer d’exister ailleurs que sur Internet !).

En fin de compte, ce projet prend désormais la forme d’une campagne de financement sur Ulule.com où vous pouvez obtenir diverses contreparties comme le livre actuel (électronique et papier) ainsi qu’un superbe autocollant Debian détouré, en fonction du montant de votre soutien.

Rendez-vous sur fr.ulule.com/liberation-cahier-admin-debian/ pour enregistrer votre soutien et découvrir les récompenses proposées !

Nous avons jusqu’au 24 juin pour atteindre l’objectif des 15 000 €, faute de quoi le projet entier tombe à l’eau. Ce montant peut paraître élevé mais une fois que vous avez retiré la TVA, les frais Ulule, le coût des récompenses et de leur expédition, il en reste bien moins. Et ce reste sera partagé également entre les auteurs et Eyrolles, pour financer la mise à jour du livre et la publication d’une nouvelle édition.

Si vous pensez comme moi qu’il est important d’aller au bout de cette démarche de libération, cliquez-ici pour aller soutenir ce projet et partagez cet article avec tous vos contacts susceptibles de soutenir ce projet. D’avance, merci !

2 commentaires | Vous avez aimé ? Cliquez ici. | Ce blog utilise Flattr.

28 May, 2013 02:48PM par Raphaël Hertzog

27 May 2013

Florent Gallaire

[MàJ] Lua et Erlang

Je viens de légèrement mettre à jour deux articles :

Ceci est symptomatique de mon intérêt pour ces deux langages. Et si celui pour Lua est assez récent, celui pour Erlang est plus ancien et plus profond.

J’espère donc écrire bientôt sur ce blog quelques articles sur Erlang, et sur sa formidable machine virtuelle BEAM, et aussi contribuer à des logiciels libres en Erlang. Même si, aujourd’hui, Python reste encore de loin le langage que je maîtrise le mieux et avec lequel je suis le plus productif.

flattr this!

27 May, 2013 06:26PM par fgallaire

02 May 2013

Stéphane Blondon

Évolution du nombre de messages sur debian-l10n-fr et debian-users-fr avec pychart

Pychart est une bibliothèque Python permettant des graphiques directement en python. Un paquet Debian est disponible (nommé python-pychart) avec la dernière version 1.39 (qui date de 2006).

Debian utilise massivement des listes de diffusion pour la collaboration de ses membres. Parmi les nombreuses listes existantes, trois sont francophones :

  • debian-users-fr, dédiée aux questions des utilisateurs ;
  • debian-l10n-fr, dédiée aux traductions en français ;
  • debian-news-french, dédiée aux communiqués officiels. Elle est exclue du graphique car elle ne représente pas vraiment l’activité des listes de diffusion.

Pychart est utilisé pour créer un graphique montrant l’évolution du volume de messages postés sur ces deux listes pendant une année glissante (soit d’avril 2012 à avril 2013).

Le graphique

Le graphique représente le nombre de messages électroniques envoyés sur les deux listes par jour.

Volume des messages sur les listes de diffusion Debian francophones

On constate que les pics et les creux se font sur les mêmes mois. Par contre, les tendances générales sont inversées : en hausse pour la liste utilisateur, en baisse pour la liste dédiée aux traductions.

Réalisation

Le code Python est fourni à la fin de l’article. Pychart s’appuie sur de nombreuses inventions anciennes mais solidement éprouvées :

Invention de la poubelle (1884)

Toute la documentation fait des imports globaux (from pychart import *), comme beaucoup d’exemples disponibles sur le web. Pour éviter de polluer l’espace de nom, il suffit d’importer les différents sous-modules de manière classique (import pychart.sousmodule). Je n’ai pas eu besoin d’importer certains sous-modules bien qu’ils soient utilisés dans le script.

Création de postscript (1982)

Plusieurs formats de sortie sont disponibles (ps, pdf, png et svg). Par défaut, le fichier sera en PostScript.
Pour le changer vers le format png :

pychart.theme.output_format = "png"

Pour avoir une sortie en png, ghostscript doit être installé sur le système. PIL n’est pas nécessaire.

Invention de la télévision couleur (1938)

Par défaut, les graphiques seront uniquement en nuances de gris. Si on souhaite avoir plein de couleurs, il faut le déclarer de la manière suivante :

pychart.theme.use_color = True

Invention de l’écriture de travers (-3400)

Il est possible d’orienter le texte affiché (que ce soit pour les axes ou des boîtes de texte ad-hoc). Pour cela, il faut définir l’angle d’orientation (« /a » pour définir que l’on modifie l’angle, « -20 » pour baisser de 20 degrés par rapport à l’horizontale dans l’exemple ci-dessous) :

pychart.axis.X(label="Date", format="/a-20/hL%s")

La définition du formatage de la chaîne à afficher utilise le caractère « / » pour introduire un contrôle. Il est nécessaire de le doubler lorsque l’on souhaite l’afficher (pour une date par exemple).

Invention du dessin (Paléolithique)

pychart.line_plot.T(label=u"debian-user-french", #sert pour la légende
                    data=stats, #la structure des données à afficher
                    ycol=2, #la troisième colonne dans les données
                    line_style=_blue_line #le rendu des données
                    )

Invention du papier (IIième siècle avant JC)

La méthode draw() permet d’afficher les données sur la sortie standard. Il suffit simplement de la rediriger vers un fichier grâce au shell :

$ python volume.py  > volume.png

Code source et références

Le code qui a permis de créer le graphique :

# -*- coding: utf-8 -*-

import pychart.area
import pychart.line_plot
import pychart.theme


pychart.theme.output_format = "png"
pychart.theme.use_color = True
pychart.theme.default_font_size = 14
pychart.theme.title = "14"


stats = (("04//2012", 12.27, 14.43),
        ("05//2012", 10.71, 14.42),
        ("06//2012", 11.77, 13.10),
        ("07//2012", 10.19, 8.55),
        ("08//2012", 11.65, 14.68),
        ("09//2012", 13.00, 18.33),
        ("10//2012", 10.32, 15.06),
        ("11//2012", 6.87, 14.90),
        ("12//2012", 5.48, 10.48),
        ("01//2013", 5.29, 20.58),
        ("02//2013", 10.25, 22.39),
        ("03//2013", 9.74, 24.00),
        ("04//2013", 8.3, 19.80))


_area = pychart.area.T(size = (700, 450),
            y_grid_interval=5,
            x_coord=pychart.category_coord.T(stats, 0),
            x_axis=pychart.axis.X(label="Date", format="/a-20/hL%s"),
            y_axis=pychart.axis.Y(label="Nombre de messages par jour"),
            legend=pychart.legend.T(),
            y_range=(0, None))

_red_line = pychart.line_style.T()
_red_line.width = 2
_red_line.dash = (5, 5)
_red_line.cap_style = 2
_red_line.join_style = 2
_red_line.color = pychart.color.red
_blue_line = pychart.line_style.T()
_blue_line.width = 2
_blue_line.color = pychart.color.royalblue
_l10n_plot = pychart.line_plot.T(label=u"debian-l10n-french", data=stats, line_style=_red_line)
_user_plot = pychart.line_plot.T(label=u"debian-user-french", data=stats, ycol=2, line_style=_blue_line)
_area.add_plot(_l10n_plot, _user_plot)

_area.draw()

Les moyennes journalières ont été calculées préalablement. Elles sont exclues du code source pour ne pas l’alourdir inutilement. Voici les données brutes qui ont servi aux calculs des moyennes :
date debian-l10n-french debian-user-french nbre_jours
2012/04 368 433 30
2012/05 332 447 31
2012/06 353 393 30
2012/07 316 265 31
2012/08 361 455 31
2012/09 390 550 30
2012/10 320 467 31
2012/11 206 447 30
2012/12 170 325 31
2013/01 164 638 31
2013/02 287 627 28
2013/03 302 744 31
2013/04 190 594 30

Les données ont été récupérées à partir des versions publiques des archives des listes de traductions.

La documentation de pychart est disponible à http://home.gna.org/pychart/doc/pychart.html ou dans le paquet python-pychart-doc.

Enfin, Matplotlib répond au même besoin et semble être un projet plus vivant.


02 May, 2013 08:34AM par ascendances

21 April 2013

Charles Plessy

A-t-on vraiment besoin de « contrib » ?

Le projet Debian distribue des paquets de logiciels via son archive, propagée à travers un réseau de miroirs. Cette archive est organisée en trois zones, main, qui contient le système Debian, et contrib et non-free qui contiennent des paquets accessoires qui ne sont pas libres. Les paquets dans non-free contiennent des fichiers dont la licence est privatrice. Les paquets source dans contrib ne contiennent que des fichiers libres, mais les paquets binaires produits sont soit inutilisables sans service extérieur, soit contiennent des fichiers non libres ou demandent l'installation de paquets non libres.

La zone contrib est l'objet de sempiternelles questions car il n'est pas toujours facile de tracer une ligne entre utilisable et inutilisable. Je me demande s'il ne vaudrait pas mieux remplacer la zone contrib par un nouveau niveau de priorité, « remote », plus bas qu'extra. Les paquets entièrement libres (source et binaire) et ne causant pas l'installation de logiciels privateurs y auraient leur place. Pour les paquets qui ne peuvent pas fonctionner sans code privateur, étant donné que l'effort sera le même pour les libérer que ce code privateur soit inclut dans le même paquet source (cas de non-free) ou non (cas de contrib), je pense qu'on devrait les placer dans non-free dans tous les cas : ils ne sont pas libres en pratique.

Cela permettrait de trancher avec un critère simple : la sélection d'un paquet binaire entraînera-t-elle l'installation de logiciels privateurs ? Si oui, le paquet et sa source appartiennent à non-free. Si non, ils appartiennent à main. Ensuite, s'ils demandent l'accès à un service extérieur impossible à mettre en place sur un réseau où seule Debian serait disponible, leur priorité sera remote.

21 April, 2013 05:18AM

15 April 2013

Florent Gallaire

Lucas Nussbaum élu DPL pour 2013

C’est Lucas Nussbaum qui vient d’être élu Debian Project Leader (DPL) pour l’année 2013, succédant ainsi au triple mandat de Stefano Zacchiroli.

Lucas Nussbaum devance Allan Moray et Gergely Nagy (déjà candidat malheureux en 2004 et 2012). Voici une représentation du résultat du scrutin qui utilise la méthode Condorcet.

Bravo à toi Lucas, et bonne chance dans la mise en œuvre de ton programme à partir du 17 avril !

flattr this!

15 April, 2013 01:41AM par fgallaire

13 April 2013

Charles Plessy

Umegaya hébergé chez Branchable

Grâce au cadeau de Joey, umegaya est maintenant hébergé chez Branchable. Merci !

13 April, 2013 10:50AM

11 April 2013

Roland Mas

36

Trente-six chandelles. Trente-six vues du mont Fuji (ou de la Tour Eiffel). Y'a pas trente-six manières de faire. Mais y'a trente-six pouces dans un yard. Numéro atomique du krypton (rien à voir avec Superman).

Trente-six ans !

11 April, 2013 04:30PM

06 April 2013

Vincent Bernat

Comptabilité d'une EURL avec GnuCash

Afin de mener une activité de conseils, j’ai monté une EURL. Une comptabilité à jour est une des obligations majeures pour une entreprise.

Dans le monde libre, il existe plusieurs solutions pour faire de la comptabilité d’entreprise. Cela va de systèmes plutôt simples comme GnuCash à des systèmes très compliqués comme OpenERP. Jonathan Corbet, l’éditeur de LWN a écrit un article assez intéressant sur l’état des logiciels de comptabilité libres pour petites entreprises. Sa conclusion était qu’il n’existait rien qui remplisse ses besoins. Il a toutefois apprécié Ledger, un système qui se manipule en ligne de commande et à travers un éditeur de texte classique. Il y a consacré un article.

J’ai pour ma part opté pour GnuCash. Il existe un peu de littérature sur le sujet, avec notamment le livre assez complet Gnucash 2.4 Small Business Accounting. Le très grande majorité des ressources est orientée vers la comptabilité dans les pays anglo-saxons. La comptabilité en France utilise des codes très différents.

Je propose donc de livrer mon expérience sur GnuCash dans le cadre suivant :

  • Gestion d’une EURL.
  • Pas de salariés. Étant gérant majoritaire, je me verse une indemnité et non un salaire.
  • Activité de conseil en informatique. Ni stock, ni marchandise.
  • Impôt sur les sociétés au réel simplifié. TVA au réel simplifié également.

Dans ce cadre, GnuCash est une solution tout à fait valable pour les opérations courantes. Il a quelques lacunes mais effectue globalement bien son boulot. Il dispose de plus d’une gestion des clients et des fournisseurs plutôt correcte. Il peut sortir tout un tas de rapports plus laids les uns que les autres.

Les opérations de fin d’année sont par contre une autre paire de manches. Il y a non seulement la complexité comptable mais également toutes les démarches administratives. Il me semble préférable de confier celles-ci à comptable1 et donc de vérifier que celui-ci acceptera les données issues de GnuCash.

À noter que je ne suis pas comptable et donc certains conseils peuvent être erronés.

Introduction à la comptabilité

La comptabilité est un outil permettant de recenser et d’évaluer tous les événements qui influent sur la valeur de l’entreprise. Un événement, cela peut être l’émission d’une créance vers un client, l’achat d’une agrafeuse, le recouvrement de la TVA collectée ou le don d’un tracteur agricole.

Comptabilité en partie double

En entreprise, la comptabilité s’effectue en partie double:

La comptabilité en partie double est la base du système comptable utilisé par toutes les entreprises et organisations. Elle est fondée sur l’idée selon laquelle les opérations et la situation financière d’une organisation peuvent être représentées par des comptes. Chaque compte contient l’historique des modifications de la valeur monétaire d’un aspect particulier de l’organisation. On parle de partie double quand l’enregistrement d’écriture est inscrit dans deux comptes (au moins) : un compte débité, et un compte crédité.

Pour chaque événement, il faut créditer un certain nombre de comptes et en débiter d’autres. De plus, le total des crédits doit être égal au total des débits.

La notion de débit et de crédit est assez compliquée à appréhender et peu intuitive. Ainsi, pour acheter une agrafeuse, on va créditer le compte bancaire et débiter le compte recensant les petits achats. Un événement implique toujours une ressource et un emploi. La ressource permet de financer l’emploi. Elle est toujours marquée au crédit d’un compte alors que l’emploi est toujours marqué au débit. Dans notre exemple d’agrafeuse, l’achat se fait avec l’argent du compte en banque qui est une ressource et il faut donc créditer le compte. Inversement, quand on vend une prestation à un client, la ressource est la prestation et l’emploi est le client. Il faut donc débiter le compte du client et créditer le compte des prestations.

Si vous êtes déjà perdus ici, pas de panique. L’important est d’être attentif aux exemples. De plus, GnuCash utilise par défaut des termes plus compréhensibles selon le type de compte (mais parfois mal francisés), à moins de choisir dans les préférences d’utiliser la terminologie comptable.

Chaque opération donne lieu à une écriture comptable qui va concerner un ou plusieurs comptes. Sur papier, il fallait écrire la même opération dans chaque compte. Profitant des progrés en informatique de ces dernières années, GnuCash gère cela tout seul. Si, si. Voici à quoi ressemble notre achat d’agrafeuse2 :

Compte Débit Crédit
512 Banque 35,88 €
6063 Petit matériel 30,00 €
4456 TVA déductible 5,88 €

Cette transaction a mis en jeu trois comptes. L’écriture va donc se trouver sur les trois comptes à la fois.

  • Le compte bancaire de l’entreprise qui a été crédité de 35,88 € qui est le prix toutes taxes comprises de notre agrafeuse. Le crédit de ce compte provoque un retrait de l’argent qui s’y trouvait et donc un appauvrissement de l’entreprise.
  • Le compte recensant les achats de petit matériel. Il a été débité de 30,00 € qui correspond au prix hors taxes de l’agrafeuse. Il s’agit d’une charge pour l’entreprise. L’agrafeuse ne rentre pas dans le patrimoine de l’entreprise.
  • Le compte recensant la TVA que l’on peut déduire de notre prochaine déclaration. L’État devient alors débiteur de la somme de 5,88 € qu’il devra nous rembourser lors de la prochaine déclaration.

On remarque que la somme des débits est égal à la somme des crédits. C’est obligatoire. Pour toute écriture, la balance doit être équilibrée.

Plan comptable général

Maintenant que vous avez vaguement compris comment marchait une écriture comptable, vous vous demandez peut-être quels sont les comptes qu’il faut utiliser. Le système comptable français définit très précisément les comptes à utiliser dans le plan comptable général.

Il existe en fait trois plans comptables :

  1. le système de base,
  2. le système abrégé comprenant moins de comptes,
  3. le système développé comprenant plus de comptes.

Le système à choisir dépend de la taille de l’entreprise. On choisit généralement le système correspondant au bilan et au compte de résultat demandé par les impôts en fin d’exercice. Pour une société au réel simplifié, il est possible d’opter pour le système abrégé. Le plan comptable général est disponible sur le site de l’autorité des normes comptables. Il fait plus de 400 pages. L’article correspondant de Wikipedia fournit la liste des comptes.

Chaque compte est identifié par un nombre. Le premier chiffre indique la classe du compte :

  1. Les comptes de capitaux (capitaux propres, emprunts).
  2. Les comptes d’immobilisation (peu utilisés dans notre cas).
  3. Les comptes de stocks et d’en-cours (peu utilisés également).
  4. Les comptes de tiers (les fournisseurs, les clients, l’État, vous).
  5. Les comptes financiers (le compte en banque).
  6. Les comptes de charges (ce qui appauvrit votre entreprise).
  7. Les comptes de produits (ce qui enrichit votre entreprise).

Les cinq premières classes de comptes sont les comptes de bilan. Ils permettent de savoir ce que votre entreprise possède (l’actif et le passif) à tout moment. Les deux dernières classes sont les comptes de résultat. Ils sont remis à zéro après chaque exercice. Ils permettent notamment de connaître le résultat d’une entreprise sur un exercice.

Parmi les comptes les plus importants, on notera :

Compte Description
101 Le capital de la société.
401 Les comptes des fournisseurs.
411 Les comptes des clients.
445 Les comptes pour la TVA.
455 Le compte de l’associé (pour se faire rembourser les frais).
512 Le compte bancaire de l’entreprise.
6063 Le compte pour l’achat de fournitures dont la valeur ne dépasse pas 500 €.
625 Le compte pour les frais liés aux déplacements et aux missions. On y colle notamment les frais de restauration.
6410 Le compte permettant de verser une indemnité au gérant.
706 Le compte où sont crédités les revenus liés à des prestations de service.

Il en existe bien d’autres. Si un compte dispose d’un sous-compte, il faut utiliser uniquement l’un des sous-comptes.

GnuCash n’a pas le plan comptable général parmi les plans comptables proposés par défaut. Vous pouvez soit télécharger le plan comptable mis à disposition par Vincent Laure, soit télécharger le plan comptable que j’utilise qui correspond au système abrégé avec quelques comptes supplémentaires et certains comptes retirés. Il comprend également un compte fournisseur et deux comptes clients dont l’un en devises américaines.

Écritures comptables

Pour chaque écriture comptable, il faut connaître les comptes à débiter et les comptes à créditer. Généralement, cela n’a pas grand chose à voir avec GnuCash. Il est donc possible de se référer à l’abondante littérature sur le sujet ainsi qu’aux nombreux forums spécialisés dans la comptabilité.

Généralement, je fais une recherche préfixée par « écriture comptable » pour trouver mon bonheur. Je regarde les deux ou trois premières réponses pour me faire une idée. Les numéros de comptes indiqués sont généralement à cinq chiffres. Il n’est pas nécessaire de créer le compte exact : il suffit d’utiliser le compte du système abrégé ayant le même préfixe.

Il est crucial de ne pas s’emmêler avec les débits et les crédits. Dans une représentation en colonnes, les débits sont toujours dans la colonne de gauche. Les crédits sont dans la colonne de droite.

Enfin, GnuCash propose d’associer un numéro à chaque requête. Je scanne chaque pièce justificative et indique son numéro et une description dans le nom de fichier.

Opérations de création

La création de l’entreprise entraîne un certain nombre d’écritures. Il est important de noter que les écritures ne peuvent pas être antérieures à la création de l’entreprise.

Capital initial

L’apport du capital initial se fait en deux fois. Chaque associé fait d’abord une promesse d’apport en capital. Il devient alors débiteur du capital promis sur un compte dédié à cet effet. Ensuite, lorsque l’argent arrive sur le compte de l’entreprise, l’associé est crédité de cet apport.

Compte Débit Crédit
456 Promesse d’apport 5000 €
101 5000 €
Compte Débit Crédit
456 Versement apport 5000 €
512 5000 €

Publication de l’annonce légale

Une des étapes de la création d’entreprise est la publication d’une annonce légale. Généralement, un associé avance l’argent et est remboursé après la création.

Compte Débit Crédit
623 Annonce légale 97,71 €
445 TVA déductible 19,16 €
455 116,87 €

Dépôt des statuts au greffe

Le dépôt des statuts au greffe suit la même logique.

Compte Débit Crédit
622 Greffe du tribunal 72,08 €
445 TVA déductible 14,13 €
455 86,21 €

Opérations courantes

Les opérations courantes impliquant un flux financier créditent soit le compte bancaire de l’entreprise (512) ou celui de l’associé (455). Dans ce sens, c’est généralement interchangeable. L’associé peut être crédité de l’argent que l’entreprise lui doit par une écriture débitant le compte de l’entreprise :

Compte Débit Crédit
455 Remboursement frais 100 €
512 100 €

Repas du midi

Une écriture courante est le remboursement du repas du midi. Il y a beaucoup de théories à ce sujet. Il peut y avoir un plafond (environ 17 €), une somme forfaitaire à déduire (environ 4 €) et la déductibilité ou non de la TVA. À noter que le paiement d’une somme forfaitaire pour le repas de midi ne semble pas admise. Tout repas doit venir avec un justificatif.

Pour ma part, je n’applique aucun plafond, je ne déduis aucune somme forfaitaire mais je ne déduis pas la TVA, à moins qu’il s’agisse d’une invitation. Je paie toujours avec ma carte de crédit personnelle.

Compte Débit Crédit
6256 Repas du midi 13,20 €
455 13,20 €

Indemnités kilométriques

Si vous vous déplacez avec votre véhicule personnel, vous pouvez vous verser des indemnités kilométriques. Si le trajet est régulier, il semble qu’il n’est pas nécessaire de tenir un journal des déplacements. À noter que le barème évolue chaque année et dépend de la distance parcourue dans l’année. Dans le cas de trajets réguliers, je ne fais qu’une seule écriture par mois.

Compte Débit Crédit
6251 IK pour trajet de X à Y, 20 jours 141,50 €
455 141,50 €

Le train, l’avion, le taxi, les voitures de location se notent de la même façon. À noter dans ce cas qu’il n’est jamais possible de récupérer la TVA sur un transport de personnes.

Abonnements téléphoniques & ADSL

S’il y a usage professionnel, il est possible de se faire rembourser tout ou partie d’un abonnement téléphonique ou ADSL. Il faudra pouvoir justifier de l’usage professionnel. Certains indiquant que la TVA n’est normalement déductible que si la facture est au nom de l’entreprise. Personnellement, je la déduis tout de même.

Compte Débit Crédit
626 Abonnement ADSL 10,89 €
445 TVA déductible 2,14 €
455 13,03 €

Je fais passer de la même façon les abonnements à des services Web comme Amazon ou l’achat de noms de domaine.

Autres frais déductibles

Si le siège de votre entreprise est votre domicile, il est également possible de déduire au prorata de la surface utilisée :

  • une partie du loyer (je ne fais pas),
  • une partie des factures EDF, d’eau, des charges locatives (compte 6061),
  • une partie de l’assurance locative (compte 616)
  • une partie de la taxe d’habitation (compte 635)

Achats divers

Pour l’achat d’un bouquin, il faut utiliser le compte 6181. Pour l’achat d’une fourniture ou d’un matériel dont la valeur n’excède pas 500 €, il faut utiliser le compte 6063. Je vous renvoie à l’exemple de l’agrafeuse en introduction.

Voici un autre exemple avec des frais de ports :

Compte Débit Crédit
512 35,88 €
6063 Petit matériel 27,00 €
624 Frais de ports 3,00 €
4456 TVA déductible 5,88 €

Pour les montants supérieurs à 500 €, l’achat devient une immobilisation et non une charge. Il faut de plus en gérer l’amortissement.

Facturation et paiement d’un client

La principale source de revenus provient normalement des paiements des clients. Il y a deux étapes :

  1. Il faut d’abord adresser une facture au client. Celui-ci est alors débiteur du montant demandé.
  2. Quelques jours, mois, années plus tard, le client paie. On crédite alors son compte et s’il a payé exactement la somme facturée, son solde devient nul.

Les deux opérations n’ont généralement pas lieu à la même date. Chaque client dispose de son propre compte sous le compte 411 : il ne faut pas utiliser directement le compte 411.

On effectue de plus la collecte de la TVA pour l’État. Si le client est un professionnel, il récupérera la TVA de son côté. Si le client se trouve dans l’Union Européenne et qu’il fournit un numéro de TVA intracommunautaire, il n’est pas nécessaire de lui faire payer la TVA. Sinon, la TVA française s’applique. Il semble être d’usage d’utiliser un compte spécial (7062 au lieu de 706) dans ce cas. S’il est hors Union Européenne, les prestations de service sont exonérées de TVA.

GnuCash dispose d’un module d’édition des factures qui fait assez bien son boulot. Je n’utilise toutefois pas la possibilité d’imprimer la facture. Le rendu est assez désolant et je préfère donc faire mes factures manuellement avec LaTeX.

GnuCash gère aussi la TVA, mais de manière partielle. L’entreprise n’est redevable de la TVA qu’au moment du paiement. Au moment de la facturation, la TVA est placée dans un compte de régularisation (4458). GnuCash va calculer automatiquement la TVA et placer l’écriture suivante au moment de valider la facture :

Compte Débit Crédit
411× Client Durant 1196 €
4458 TVA à régulariser 196 €
706 Prestation conseil 1000 €

Par contre, au moment du paiement, il va simplement créditer le compte du client et débiter le compte en banque. Il faut alors penser à ajouter manuellement le transfert de la TVA au crédit du compte de la TVA collectée (4457). L’écriture du paiement ressemble à ceci :

Compte Débit Crédit
411× Client Durant 1196 €
4457 TVA collectée 196 €
4458 TVA à régulariser 196 €
512 1196 €

Facturation avec des devises étrangères

Si votre client vous paie en devises étrangères, les choses se compliquent énormément. En effet, votre client va disposer dans votre système d’un compte en dollars (par exemple). Mais tous vos autres comptes sont en euros. GnuCash gère cette situation en permettant d’indiquer un taux de change. Voici l’écriture qui apparaîtra dans le compte du client :

Compte Débit Crédit
411× Client Scott 1000 $
706 Prestation conseil 1000 $

GnuCash va vous demander le taux de change actuel. Du coup, dans le compte 706, vous verrez :

Compte Débit Crédit
411× Client Scott 767 €
706 Prestation conseil 767 €

Au moment du paiement, les choses se compliquent. Votre client vous paie 1000 $. Toutefois, ce ne sont pas 767 € qui arrivent sur votre compte, mais seulement 738 €. En effet, au moment du paiement, le taux de change a évolué. Vous avez alors une perte de change. Cette parte va s’inscrire au compte 666. S’il y avait eu gain, ce serait le compte 766.

Une façon simple de gérer le problème est de passer l’écriture en euros de cette façon :

Compte Débit Crédit
512 738 €
666 Perte de change 29 €
411× Client Scott 767 €

Il faut alors réutiliser le taux de change initial. De cette façon, on obtient dans le compte du client :

Compte Débit Crédit
512 960,00 $
666 Perte de change 40,00 $
411× Client Scott 1000 $

Le problème de devises peut aussi se poser pour l’achat de services. Toutefois, si la valeur est assez faible, il me semble plus simple de passer ces services sous forme d’une charge en euros.

Facturation d’un fournisseur

Si vous achetez des prestations à un fournisseur et que les montants sont suffisamment élevés (sinon, vous pouvez les passer directement en charges), vous pouvez créer un compte pour le fournisseur. Le schéma est similaire à la facturation d’un client. Le fournisseur vous envoie une facture, vous l’enregistrez et créditez le compte du fournisseur et débitez le compte de charge correspondant. Au paiement, vous débitez le fournisseur et créditez le compte en banque. Par exemple, pour un serveur dédié en Allemagne (pas de TVA) :

Compte Débit Crédit
626 41 €
401x Fournisseur Albert 41 €

Au paiement de la facture :

Compte Débit Crédit
401x 41 €
512 Paiement facture 41 €

Frais bancaires

Tous les mois, la banque va vous adresser une facture pour ses services. C’est généralement plus salé que lorsqu’on est un particulier. Personne ne sait trop bien pourquoi.

Compte Débit Crédit
512 23,92 €
627 Frais mensuels XX 20,00 €
4456 TVA déductible 3,92 €

Paiement de la TVA

Une fois par trimestre, il va falloir verser un accompte sur la TVA collectée pour l’État. On en profite aussi pour se faire rembourser la TVA déductible. Il semble d’usage de passer par deux écritures comptables qui ont généralement lieu en même temps :

Compte Débit Crédit
4457 TVA collectée 2500 €
4456 TVA déductible 100 €
4455 TVA à décaisser 2400 €
Compte Débit Crédit
4455 TVA à décaisser 2400 €
512 Paiement TVA 2400 €

Le réglement se fait en ligne sur le site des impôts. Il y a deux cases à remplir :

  • la base hors taxe des opérations imposables pour la TVA à 19,6 % (12 755 € dans notre cas pour arriver à une TVA de 2500 €),
  • la TVA déductible sur les factures de 100 €.

En fin d’année, il y a un formulaire supplémentaire pour régulariser la situation. Il me semble plus simple de toujours payer exactement ce qu’il faut sur les accomptes. Cela ne vous dispense pas de remplir le formulaire adéquat.

Rémunération du gérant

De temps en temps, il est possible de vous verser une rémunération. Le versement est net. Il faudra payer des cotisations URSSAF et RSI par la suite. Il ne s’agit pas d’un salaire.

Compte Débit Crédit
6410 Rémunération Juin 3000 €
512 3000 €

Cotisations URSSAF & RSI

Lorsque vous payez vos cotisations URSSAF et RSI, vous devez obtenir un reçu indiquant la répartition des montants. Voici par exemple comme régler la première cotisation forfaitaire de 448 € pour l’URSSAF :

Compte Débit Crédit
645 Allocations familiales 144 €
63 CSG déductible 136 €
455 CSG non déductible 64 €
455 CRDS 13 €
63 Formation professionnelle 91 €
512 448 €

On notera qu’une partie de la CSG est imputée en charges pour l’entreprise tandis qu’une partie est payée par l’associé.

Opérations de fin d’exercice

Les opérations courantes sont relativement simples à appréhender après les premiers mois. Les opérations de fin d’exercice sont par contre beaucoup plus complexes. Je vous conseillerais plutôt de prendre un comptable pour cette partie. Ce qui suit est à prendre avec des pincettes : personne n’est venu vérifier la validité de ma comptabilité.

Toutes les écritures sont à passer à la date du dernier jour de l’exercice. Elles doivent normalement régulariser les écritures concernant l’exercice passé. On y trouve :

  • régularisation du compte bancaire avec le relevé bancaire,
  • régularisation des charges et des produits

Les charges (ou les produits) qui sont à cheval sur deux exercices (comme le réglement d’une prime d’assurance, un abonnement de trois mois, …) doivent faire l’objet d’une écriture pour charges constatées d’avance. Dans le cas d’une petite entreprise, il semble que l’exercice soit optionnel si les sommes mises en jeu sont faibles.

Il existe d’autres écritures mais qui ne nous concernent pas s’il n’y a pas eu d’écritures correspondantes dans l’année passée :

  • régularisation des stocks
  • régularisation des immobilisations
  • régularisation des placements
  • régularisation des amortissements
  • régularisation des dépréciations
  • régularisation des provisions

Provisions pour rémunération

C’est aussi le bon moment pour décider de compléter votre rémunération. En effet, le bénéfice de l’entreprise peut être distribuée en rémunérations (soumises à l’IR) ou en dividendes. Dans le second cas, la somme destinée à cet effet sera d’abord soumise à l’impôt sur les sociétés. Le calcul peut être effectué via un simulateur. Les dividendes étant taxés comme des revenus à partir de 2013 pour la part dépassant les 10 % du capital de la société, il n’est pas très intéressant de se verser des dividendes.

Si vous voulez compléter votre rémunération de 10 000 €, il suffirait de passer l’écriture suivante au dernier jour de l’exercice :

Compte Débit Crédit
6410 Provision pour rémunération 10 000 €
455 10 000 €

Il faudra alors ensuite provisionner les charges correspondantes.

Provisions pour charges sociales

Il est possible de provisionner les sommes qui seront demandées par les différents organismes sociaux (URSSAF, CIPAV, RSI) et de les déduire du résultat. Il faut donc déterminer une approximation des cotisations qui seront réclamées à l’aide d’un des nombreux simulateurs que l’on trouve sur le web. Ensuite, l’écriture semble être la suivante3 :

Compte Débit Crédit
645 Maladie/Vieillesse/AF 4000 €
63 CSG déductible 1000 €
43 Provisions pour charges 5000 €

Pour chaque paiement, il faudra débiter le compte 43 au lieu des comptes 645 et 63. Par exemple, pour les cotisations URSSAF, on ferait :

Compte Débit Crédit
43 Allocations familiales 144 €
43 CSG déductible 136 €
455 CSG non déductible 64 €
455 CRDS 13 €
43 Formation professionnelle 91 €
512 448 €

Si la provision s’avère trop importante en fin d’année suivante, il faudra affecter le surplus au compte 787.

Clôture des comptes

Une fois les régularisations effectuées, on passe aux travaux de clôture et de réouverture des comptes. Il s’agit de solder tous les comptes de charges (dont le numéro commence par 6) et de produits (dont le numéro commence par 7). Solder signifie mettre la balance du compte à zéro.

Si le compte 709 est débiteur, il faut le solder manuellement dans un autre compte (le 706 par exemple). Si les comptes 609, 619 ou 629 sont créditeurs, il faut les solder avec l’un des voisins (par exemple, 6063, 6181 et 6251). Ces comptes sont particuliers car ils fonctionnent dans le sens inverse des comptes de la même catégorie.

Vient ensuite la clôture proprement dite. GnuCash dispose d’une fonction pour vous aider à la réaliser. Dans le menu « Outils », choisir la fonction « Clôturer le livre ». Indiquer la date de clôture (dernier jour de l’exercice) et les comptes à utiliser pour les revenus et les dépenses. Dans le cadre du système abrégé, il s’agit du compte 12. On obtient l’écriture suivante :

Compte Débit Crédit
706 Prestations conseil 50 000 €
627 Services bancaires 100 €
63 Impôts et taxes 200 €
6251 Voyages et déplacements 1000 €
6256 Frais de missions 1000 €
6410 Rémunération du gérant 20 000 €
645 Charges sociales 8000 €
6063 Petit matériel 1000 €
12 Transfert des charges 31 300 €
12 Transfert des produits 50000 €

On se retrouve avec un résultat bénéficiaire de 18 700 €.

Pour la réouverture des comptes, il était d’usage d’utiliser des livres papiers différents pour chaque exercice. Certains préconisent de faire de même en repartant de zéro pour le nouvel exercice. J’ai personnellement choisi de garder tous les exercices dans un seul fichier GnuCash. Cela dispense de fastidieuses écritures de bilan.

Calcul de l’impôt sur les sociétés

Le bénéfice permet de calculer l’impôt dû pour l’exercice précédent. Sur le bénéfice calculé précédemment, l’impôt dû est de 15 % pour la partie inférieure à 38 120 € et de 33,3 % pour le reste. Dans notre exemple, l’impôt dû est donc de 2 805 €.

Avec cette information, vous pouvez revenir quelques étapes en arrière en annulant la clôture des comptes (il suffit d’effacer les deux écritures) et en ajustant la provision pour rémunération. Dans le cas contraire, vous pourrez toujours récupérer le résultat en dividendes mais l’imposition est plutôt prohibitive.

Une fois que votre calcul est définitif, il faut passer l’écriture suivante :

Compte Débit Crédit
695 Paiement de l’IS 2 805 €
444 2 805 €

Puis clôturer de nouveau le compte 6954 :

Compte Débit Crédit
12 Transfert des charges 2 805 €
695 2 805 €

Établissement du compte de résultat et du bilan

Le compte de résultat s’intéresse à ce qui s’est passé durant l’exercice au niveau des comptes de charges et de produits. Le bilan donne une image des autres comptes au dernier jour de l’exercice.

Le plan comptable général comprend les modèles adéquats pour le compte de résultat et le bilan. Il existe un notamment modèle adapté au système abrégé. On peut aussi le trouver sous un format exploitable par un tableur. Malheureusement, il n’y a pas la correspondance entre les diverses cases à remplir et les numéros de comptes.

Le compte de résultat est assez simple à remplir. Toutes les informations nécessaires sont dans les écritures de clôture (celles vers le compte 12). Il suffit donc de les inspecter et de les ventiler dans les cases appropriées.

J’ai reporté la ventilation que j’ai adoptée dans un modèle de compte de résultat (sources). Une fois le total effectué, on en calcule la différence et on a le reporte soit sur la ligne « solde créditeur » (en cas de bénéfices), soit sur la ligne « solde débiteur » (en cas de pertes). Cette différence doit être le solde du compte 12. Les totaux généraux sont alors équilibrés.

Le bilan est un peu plus délicat pour deux raisons :

  • les comptes de tiers (4xx) mélangent à la fois l’actif et le passif
  • les amortissements et les provisions doivent être déduits de l’actif

Le second point est pour moi tout théorique car je n’ai ni amortissement, ni provision. Le premier point est plus problématique et il faudra donc faire attention à bien comptabiliser les créances des tiers au niveau de l’actif et vos dettes au niveau du passif. J’ai indiqué la difficulté dans mon modèle de bilan par une étoile.

Pour établir le bilan, GnuCash peut nous aider en demandant dans le menu « Rapports » l’établissement du bilan. Il convient ensuite de ventiler attentivement. Si tout se passe bien, les totaux généraux s’équilibrent.

Affectation du résultat

Une fois le bénéfice correctement calculé, le bilan dressé et le compte de résultat établi, il est possible d’affecter le résultat si celui-ci est créditeur5 :

  • le résultat est diminué du report à nouveau de l’exercice précédent s’il est débiteur,
  • si la réserve légale n’est pas égale à au moins 10 % du capital social total, 5 % du résultat restant sont affectés à celle-ci,
  • le résultat est augmenté du report à nouveau de l’exercice précédent s’il est créditeur,
  • le résultat peut alors être distribué sous forme de dividendes s’il reste créditeur,
  • le reste du résultat est crédité au compte du report à nouveau (11).

Sachant qu’il est désormais prohibitif de se distribuer le résultat en dividendes en France (au-delà de la limite de 10 % du capital social), il est donc peu intéressant d’avoir un résultat important. Voici un exemple de distribution dans le cas où la réserve légale n’existe pas encore :

Compte Débit Crédit
120 Résultat 2012 15 895 €
1061 Réserve légale 794 €
457 Dividendes à payer 1000 €
11 Report à nouveau 14 101 €

Ces transactions sont datées au 31 décembre 2012. Lors du paiement effectif des dividendes, il faudra penser à retirer les prélevements sociaux (15,5 % pour 2013) et les créditer sur le compte 442 ou 447.

Déclaration de l’IS

L’épreuve finale est désormais la déclaration de résultats auprès des impôts. Dans l’optique de faire supporter les coûts de déclaration au contribuable, l’administration impose désormais une télétransmission au format EDI via un partenaire tierce6 qu’il vous faudra rétribuer. Comptez environ 200 €.

L’intermédiaire peut demander les balances sous un certain format. Dans mon cas, il est possible de fournir les balances au format CSV. Malheureusement, GnuCash n’est pas particulièrement brillant dans ce domaine. Il existe une entrée dans la FAQ à ce sujet, mais cela consiste généralement à effectuer des manipulations complexes.

J’ai simplement formaté manuellement la balance dans un fichier CSV. Il s’agit plus ou moins de refaire une nouvelle fois son bilan car il faut donner les détails :

  1. Recopier le détail du compte de résultat en s’aidant simplement des écritures des comptes de charges et de produits vers le compte 12.
  2. Recopier l’état des autres comptes tels qu’ils étaient avant l’écriture comptable de l’affectation du résultat. Ne pas recopier le compte 12 (sinon, il n’y a pas équilibre).
  3. Inclure l’écriture comptable du compte 695 vers le compte 444.

La balance est normalement équilibrée et le logiciel de saisie retrouve le même résultat comptable.

Il reste ensuite à compléter correctement les 11 formulaires de déclaration. Chaque case peut faire l’objet d’une recherche approfondie sur le sujet. Par exemple, sur le formulaire 2033—B, faut-il reporter les charges sociales dans la case 380 ? Il semble que dans le cas d’une EURL à l’IS, il n’y a pas d’exploitant et il faut donc laisser cette case vide, malgré la remarque attachée à la case 252.

Bref, un comptable sera d’une grande aide.


  1. Outre la vérification, le comptable pourra aussi prendre en charge la télétransmission qui est actuellement obligatoire pour l’IS et qui pourrait le devenir pour d’autres déclarations. Voir la section dédiée à cet effet. 

  2. Une écriture comptable doit également comporter la date et une description. Je les omets ici pour ne pas surcharger la présentation. 

  3. À noter qu’il existe un compte de provisions pour les charges (681). Il peut sembler idéal pour ce type d’opération. Toutefois, ce compte ne doit être utilisé que pour une charge probable. Si la charge est certaine (comme c’est le cas ici), il n’y a pas lieu d’utiliser ce compte. 

  4. Il semble que cette façon de faire soit contestable. Toutefois, je ne vois pas comment s’assurer que ce compte ne perturbe pas l’exercice suivant s’il n’est pas soldé. 

  5. Si le résultat est débiteur, il est simplement enregistré au débit du report à nouveau. 

  6. Il est possible de devenir soi-même partenaire EDI. Il suffit de passer une convention avec la direction des impôts qui peut accepter ou refuser. Il faudra ensuite vous palucher les specs du protocole basé sur le standard EDIFACT, respecter le cahier des charges annuel et obtenir le label nécessaire pour pouvoir télétransmettre. Nul doute que l’ensemble est fait dans la plus totale obscurité. Nous vous attendez pas à trouver un dépôt GitHub. 

06 April, 2013 07:52PM par Vincent Bernat

29 March 2013

Tanguy Ortolo

Pré-compresser des fichiers statiques avec le Serveur HTTP Apache

Quand on publie un site Web constitué de fichiers statiques avec le Serveur HTTP Apache, on peut réduire le débit utilisé pour servir ces fichiers en activant la compression à la volée, avec le mod_deflate. Ainsi, si le client annonce qu'il prend cela en charge, Apache compressera les fichiers avant de les lui envoyer, et le client les décompressera à la réception.

Plume

Pré-compression

L'inconvénient de cette approche, c'est que le serveur doit effectuer la compression pour chaque requête ; il est plus efficace de pré-compresser les fichiers une fois pour toute, en conservant le fichier original pour les clients qui ne prennent pas en charge la décompression :

$ ls
index.html
$ gzip < index.html > index.html.gz
$ ls
index.html index.html.gz

On peut ensuite servir ces fichiers directement en indiquant qu'ils sont compressés. Cela se fait avec le mod_mime, en déclarant un nouvel « encodage » gzip — terme désignant une encapsulation dans le langage de la norme HTTP :

LoadModule mime_module /usr/lib/apache2/modules/mod_mime.so
AddEncoding x-gzip .gz .tgz

Négociation de contenu

Cela suffit à servir des fichiers pré-compressés, mais seulement pour les clients qui les demandent explicitement, par exemple index.html.gz. Ce n'est pas très utile, on peut donc utiliser le mod_negociation pour servir automatiquement le fichier compressé en réponse à une requête normale, index.html dans ce cas. Pour activer cette fonctionnalité :

LoadModule negotiation_module /usr/lib/apache2/modules/mod_negotiation.so
Options +MultiViews

Le problème, c'est que la « négociation de contenu », qui permet à Apache de servir un fichier parmi plusieurs candidats selon la langue, le codage et la compression pris en charge par le client, ne se déclenche que si aucun fichier ne correspond exactement à la requête. Or, même si index.html.gz serait un bon candidat pour une requête sur index.html, il y a justement un fichier index.html qui correspond à cette requête, et la négociation de contenu n'entre donc pas en jeu. Il faut donc renommer le fichier original :

$ mv index.html index.html.raw
$ ls
index.html.gz index.html.raw

… et déclarer un nouveau type de (non-)compression :

AddEncoding identity .raw

Avec cela, et en redémarrant le Serveur HTTP Apache, le fichier index.html.raw sera servi aux clients qui ne prennent pas en charge la compression, et le fichier index.html.gz à ceux qui la prennent en charge.

29 March, 2013 11:21AM par Tanguy

Olivier Berger (pro)

Managing Python code with UTF-8 (french chars) in org-mode + babel + minted for LaTeX export

The goal of this article is to illustrate how to manage Python code which includes comments in UTF-8 characters inside a latin-1 source org-mode for LaTeX export.

Note that I’ve pasted in wordpress the HTML generated by org-mode, so I hope it isn’t broken too much.

My typical use case is a french lecture on Python where the text is written in french, as well as some of the code comments and examples

We’ll use org-mode’s babel module to include and manage the Python
examples. The goal is to write the source of the Python programs
directly in the same org source as the class book’s text, and to extract them into a subdir (with the “tangle” feature), so that they can be shipped to the students to experiment with.

The minted LaTeX environment is used, for babel, to make the Python syntax highlighting.

1.1 Issues

  • The source org-mode is in latin-1 so that it compiles with pdflatex
  • The examples source-code will be in UTF-8 so that Python 2.7 executes them well on a modern Linux desktop
  • Minted relies on pygmentize wich doesn’t seem to handle UTF-8 so well

1.2 Solution

We’ll show how to “patch” minted’s use of pygmentize to take advantage
of its conversion capacity to convert the Python sources from UTF-8 to
latin-1 at document rendering time (LaTeX compilation).

It’s a hack, but works.

The current document’s source shows how this works

1.2.1 Customization

The org document should contain the following headers :

#+LANGUAGE:  fr
#+LaTeX_HEADER: \usepackage[latin1]{inputenc}
#+LaTeX_HEADER: \usepackage[french]{babel}
#+LaTeX_HEADER: \usepackage{color}\usepackage{minted}

and the footers :

# Local Variables:
# coding: latin-1
# org-src-preserve-indentation: true
# tab-width: 4
# End:

Also note that pdflatex should use the -shell-escape option necessary for minted

Now, the document should also include the following “patch” for minted :

#+LATEX_HEADER: \makeatletter
#+LATEX_HEADER: \renewcommand\minted@pygmentize[2][\jobname.pyg]{
#+LATEX_HEADER:   \def\minted@cmd{pygmentize -l #2 -f latex -F tokenmerge
#+LATEX_HEADER:     \minted@opt{gobble} \minted@opt{texcl} \minted@opt{mathescape}
#+LATEX_HEADER:     \minted@opt{startinline} \minted@opt{funcnamehighlighting}
#+LATEX_HEADER:     \minted@opt{linenos} -P "verboptions=\minted@opt{extra}"
#+LATEX_HEADER:     -O encoding=UTF-8,outencoding=iso-8859-1 -o \jobname.out.pyg #1}
#+LATEX_HEADER:   \immediate\write18{\minted@cmd}
#+LATEX_HEADER:   % For debugging, uncomment:
#+LATEX_HEADER:   %\immediate\typeout{\minted@cmd}
#+LATEX_HEADER:   \ifthenelse{\equal{\minted@opt@bgcolor}{}}
#+LATEX_HEADER:    {}
#+LATEX_HEADER:    {\begin{minted@colorbg}{\minted@opt@bgcolor}}
#+LATEX_HEADER:   \input{\jobname.out.pyg}
#+LATEX_HEADER:   \ifthenelse{\equal{\minted@opt@bgcolor}{}}
#+LATEX_HEADER:    {}
#+LATEX_HEADER:    {\end{minted@colorbg}}
#+LATEX_HEADER:   \DeleteFile{\jobname.out.pyg}}
#+LATEX_HEADER: \makeatother

The important change is the addition of the -O encoding=UTF-8,outencoding=iso-8859-1 option of pygmentize, that will convert the UTF-8 source code to latin-1.

Hopefully most of the characters will convert fine, for a document written in french.

2 Examples

2.1 Basic Python

This is a generic verbatim example, which doesn’t use babel / minted.

$ python
Python 2.7.3 (default, Jan  2 2013, 16:53:07) 
[GCC 4.7.2] on linux2
Type "help", "copyright", "credits" or "license" for more information.
>>> print "Hello, world!"
Hello, world!
>>>

2.2 Python source code for french speakers

Here, we first include the source code, so that it can be exported to
an examples/ subdir, with the following (note that the #+ BEGIN_src / #+ END_src should be changed to get rid of the space
character between + and BEGIN / END, and that the :shebang and following text should be on the BEGIN_SRC line… I seem to have not quoted
these properly in this document):

#+name: helloworld
#+ BEGIN_src python :tangle examples/helloworld.py :noweb yes \\
:shebang #!/usr/bin/python :padline no :exports none
# -*- coding: utf-8 -*-

# Ceci est un exemple d'affichage d'une chaîne accentuée

name = raw_input("Quel est vôtre nom ? ")

print "J'espère que ça va bien aujourd'hui", name
#+ END_src

Editing it with “C-c ‘” will open an UTF-8 buffer, so hopefully, this will be consistent with the utf-8 coding system declared on the second line.

The regeneration of the examples/helloworld.py file is made with C-c C-v t (babel “tangling”).

Note that we don’t add the #!/usr/bin/python first line in the source, as we want it to be added by the tangling process (which will also make the script executable).

Once this is done, the script may be run :

$ python examples/helloworld.py 
Quel est vôtre nom ? François
J'espère que ça va bien aujourd'hui, cher François

Now, to add the colorized rendering in the lecture book, we do (here again, remove the spaces):

# +BEGIN_latex
\inputminted{python}{examples/helloworld.py}
# +END_latex

And here it is, rendered by minted:

# -*- coding: utf-8 -*-

# Ceci est un exemple d'affichage d'une chaîne accentuée

name = raw_input("Quel est vôtre nom ? ")

print "J'espère que ça va bien aujourd'hui, cher", name

Here are links to : the source, the PDF result, and the generated Python program.

29 March, 2013 10:44AM par Olivier Berger

18 March 2013

Olivier Berger (pro)

Conférence “L’économie du logiciel libre et la percée d’OpenStack dans le cloud” le 27/03 à Évry

L’association Minet organise une conférence le 27/03 dans les locaux de Télécom SudParis et Télécom École de Management à Évry, qui promet d’être intéressante.

Elle portera à la fois sur l’économie du logiciel libre et sur l’essort d’OpenStack dans le cloud.

N’hésitez pas à venir nombreux sur le campus pour écouter les interventions de Jonathan Le Lous, Julien Brichard et Raphaël Ferreira, et rencontrer votre serviteur ;-)

Plus de détails sur le site de Minet.

18 March, 2013 12:49PM par Olivier Berger

16 March 2013

Debian France

Debian France aux Solutions Linux/Open Source 2013

Stand Debian France aux Solutions Linux/Open Source 2013

Le salon Solutions Linux/Open Source aura lieu les 28 et 29 mai 2013, au CNIT à La Défense.

Ce salon, essentiellement destiné aux professionnels, comporte comme chaque année un « village associatif » qui regroupe différentes associations du monde du logiciel libre. Debian France y tiendra un stand, où vous pourrez :

  • vous informer sur le système d'exploitation et la communauté Debian ;
  • acheter des accessoires pour afficher votre attachement à Debian : polos, autocollants…

Stand Debian France aux SL 2011

Si vous souhaitez aider, nous cherchons quelques volontaires pour tenir le stand.

Pour plus d'informations :

16 March, 2013 06:41PM

20 February 2013

Vincent Bernat

lldpd 0.7.1

Il y a quelques semaines, une nouvelle version de lldpd, une implémentation de 802.1AB (norme aussi connue sous le nom LLDP), a été publiée.

LLDP est un protocole destiné à remplacer d’autres protocoles de niveau 2 tels que EDP et CDP. Son but est de fournir un mécanisme standard pour envoyer des informations aux périphériques réseau voisins.

De manière plus pragmatique, LLDP permet de savoir exactement sur quel port est branché un serveur (et réciproquement). Pour illustrer son usage, j’ai réalisé quelques images à la xkcd:

Exemple d'utilisation de LLDP

Pour plus d’informations sur lldpd, rendez-vous sur le nouveau site web qui lui est dédié. Ce journal est destiné à présenter les grands changements techniques qui ont affectés lldpd depuis la précédente version majeure sortie il y a un an.

Version & journal des modifications

MISE À JOUR : Guillem Jover m’a indiqué comment il avait fait pour libbsd :

  1. Sauvegarder la version issue de git dans .dist-version et la réutiliser si elle existe. Cela permet de pouvoir reconstruire le ./configure à partir de l’archive publiée sans perdre la version, ce qui permet de répondre à la critique de Thorsten Glaser sans perdre en souplesse.
  2. Inclure le fichier CHANGELOG dans DISTCLEANFILES.

C’est une meilleure façon de faire que j’ai donc adoptée. Les deux sections suivantes sont donc en partie obsolètes dans leur réalisation technique.

Version automatique

Le numéro de version était précédemment en dur dans le fichier configure.ac. Il fallait donc penser à modifier la ligne correspondante avant chaque publication :

AC_INIT([lldpd], [0.5.7], [bernat@luffy.cx])

Cette information est déjà présente dans l’arbre git et il est donc possible de l’en extraire automatiquement de manière assez simple :

AC_INIT([lldpd],
        [m4_esyscmd_s([git describe --tags --always --match [0-9]* 2> /dev/null || date +%F])],
        [bernat@luffy.cx])

Si HEAD est étiqueté 0.7.1, ce sera exactement ce numéro de version qui sera utilisé. Sinon, l’étiquette la plus proche est utilisée suivie du nombre de commits depuis celle-ci ainsi que du hash courant. Par exemple : 0.7.1-29-g2909519.

Pour que cela fonctionne, il est donc nécessaire de générer le ./configure depuis l’arbre git et non depuis l’archive finale qui ne contient plus cette information.

Construction du journal des modifications

La construction automatique du journal des modifications à partir de l’arbre git est une pratique assez répandue. Il y a toutefois quelques subtilités pour l’intégrer correctement dans le processus de publication. Voici ma tentative avec l’aide de automake :

dist_doc_DATA = README.md NEWS ChangeLog

.PHONY: $(distdir)/ChangeLog
dist-hook: $(distdir)/ChangeLog
$(distdir)/ChangeLog:
        $(AM_V_GEN)if test -d $(top_srcdir)/.git; then \
          prev=$$(git describe --tags --always --match [0-9]* 2> /dev/null) ; \
          for tag in $$(git tag | grep -E '^[0-9]+(\.[0-9]+){1,}$$' | sort -rn); do \
            if [ x"$$prev" = x ]; then prev=$$tag ; fi ; \
            if [ x"$$prev" = x"$$tag" ]; then continue; fi ; \
            echo "$$prev [$$(git log $$prev -1 --pretty=format:'%ai')]:" ; \
            echo "" ; \
            git log --pretty=' - [%h] %s (%an)' $$tag..$$prev ; \
            echo "" ; \
            prev=$$tag ; \
          done > $@ ; \
        else \
          touch $@ ; \
        fi
ChangeLog:
        touch $@

Les entrées sont groupées par version. Je maintiens manuellement un résumé des modifications les plus importantes dans un fichier NEWS.

Cœur

C99

J’ai récemment lu le livre 21st Century C qui est globalement très positif. J’ai depuis adopté l’initialisation des membres d’une structure lors de la déclaration. Étant donné qu’il s’agit également d’une extension de GCC depuis longtemps, cela ne représente pas un problème de compatibilité majeur.

Sans cette fonctionnalité :

struct netlink_req req;
struct iovec iov;
struct sockaddr_nl peer;
struct msghdr rtnl_msg;

memset(&req, 0, sizeof(req));
memset(&iov, 0, sizeof(iov));
memset(&peer, 0, sizeof(peer));
memset(&rtnl_msg, 0, sizeof(rtnl_msg));

req.hdr.nlmsg_len = NLMSG_LENGTH(sizeof(struct rtgenmsg));
req.hdr.nlmsg_type = RTM_GETLINK;
req.hdr.nlmsg_flags = NLM_F_REQUEST | NLM_F_DUMP;
req.hdr.nlmsg_seq = 1;
req.hdr.nlmsg_pid = getpid();
req.gen.rtgen_family = AF_PACKET;
iov.iov_base = &req;
iov.iov_len = req.hdr.nlmsg_len;
peer.nl_family = AF_NETLINK;
rtnl_msg.msg_iov = &iov;
rtnl_msg.msg_iovlen = 1;
rtnl_msg.msg_name = &peer;
rtnl_msg.msg_namelen = sizeof(struct sockaddr_nl);

Et avec cette fonctionnalité :

struct netlink_req req = {
    .hdr = {
        .nlmsg_len = NLMSG_LENGTH(sizeof(struct rtgenmsg)),
        .nlmsg_type = RTM_GETLINK,
        .nlmsg_flags = NLM_F_REQUEST | NLM_F_DUMP,
        .nlmsg_seq = 1,
        .nlmsg_pid = getpid() },
    .gen = { .rtgen_family = AF_PACKET }
};
struct iovec iov = {
    .iov_base = &req,
    .iov_len = req.hdr.nlmsg_len
};
struct sockaddr_nl peer = { .nl_family = AF_NETLINK };
struct msghdr rtnl_msg = {
    .msg_iov = &iov,
    .msg_iovlen = 1,
    .msg_name = &peer,
    .msg_namelen = sizeof(struct sockaddr_nl)
};

Journaux

La journalisation de lldpd était assez pauvre. Généralement, pour répondre à un rapport de bug, je demandais à l’ateur d’ajouter quelques printf() par-ci, par-là. J’ai ajouté des appels à log_debug() à de nombreux endroits ainsi qu’une possibilité de filtre. Par exemple, pour obtenir des informations détaillés sur la découverte des interfaces, il est possible de lancer lldpd avec les arguments -ddd -D interface.

De plus, la sortie sur un terminal est faite en couleurs. Cela peut paraître futile, mais il est beaucoup plus aisé de repérer rapidement les erreurs et les avertissements de cette façon.

Sortie en couleurs de lldpd

libevent

lldpd 0.5.7 utilisait sa propre boucle d’événements à base de select(). Cela ne posait pas de problèmes particuliers mais je ne voulais pas étendre cette boucle pour aboutir à une boucle d’événements complète alors qu’il existe des bibliothèques solides dédiées à cet usage. J’ai donc remplacé celle-ci par libevent.

La version minimale de libevent requise est la 2.0.5. Le site Upstream Tracker permet de consulter les changements d’API et d’ABI d’une bibliothèque et donc de vérifier la version nécessaire. Cette version de libevent n’est pas disponible dans de nombreuses distributions. Par exemple, Debian Squeeze et Ubuntu Lucid n’ont que la version 1.4.13. Je tente également de maintenir la compatibilité avec des distributions beaucoup plus anciennes, telles que RHEL 2, qui peuvent ne pas avoir libevent du tout.

Pour certains utilisateurs, compiler une bibliothèque tierce préalablement à la compilation d’un logiciel est pénible. Aussi, j’ai inclus le code source de libevent dans lldpd (en tant que sous-module git). Il n’est utilisé que si la version présente sur le système n’est pas suffisamment récente.

Jetez un œil à m4/libevent.m4 et src/daemon/Makefile.am pour comprendre comment est réalisée cette inclusion conditionnelle.

Client

Sérialisation

Afin d’afficher les voisins découverts par lldpd, lldpctl communique avec ce dernier via une socket Unix. Chaque structure devant être sérialisée était décrite avec une chaîne de caractères. Par exemple :

#define STRUCT_LLDPD_DOT3_MACPHY "(bbww)"
struct lldpd_dot3_macphy {
        u_int8_t                 autoneg_support;
        u_int8_t                 autoneg_enabled;
        u_int16_t                autoneg_advertised;
        u_int16_t                mau_type;
};

Je ne voulais pas utiliser de bibliothèques telles que Protocol Buffers car elles nécessitent l’utilisation d’une structure intermédiaire dans laquelle il aurait fallu copier les données.

Toutefois, le processus de sérialisation de lldpd ne permettait pas de gérer les pointeurs vers d’autres structures, les listes ou les références circulaires. J’ai donc écrit une version plus avancée utilisant des annotations à l’aide de macros :

struct lldpd_chassis {
    TAILQ_ENTRY(lldpd_chassis) c_entries;
    u_int16_t        c_index;
    u_int8_t         c_protocol;
    u_int8_t         c_id_subtype;
    char            *c_id;
    int              c_id_len;
    char            *c_name;
    char            *c_descr;

    u_int16_t        c_cap_available;
    u_int16_t        c_cap_enabled;

    u_int16_t        c_ttl;

    TAILQ_HEAD(, lldpd_mgmt) c_mgmt;
};
MARSHAL_BEGIN(lldpd_chassis)
MARSHAL_TQE  (lldpd_chassis, c_entries)
MARSHAL_FSTR (lldpd_chassis, c_id, c_id_len)
MARSHAL_STR  (lldpd_chassis, c_name)
MARSHAL_STR  (lldpd_chassis, c_descr)
MARSHAL_SUBTQ(lldpd_chassis, lldpd_mgmt, c_mgmt)
MARSHAL_END;

Seuls les pointeurs doivent être annotés. Le reste de la structure est simplement copiée avec memcpy()1. Je suis encore assez partagé sur le résultat et il est sans doute possible d’améliorer les choses. En vrac : mettre les annotations directement dans la structure, utiliser un parseur de code C ou utiliser la sortie AST de LLVM

Bibliothèque

lldpd 0.5.7 disposait de deux points d’entrée pour interagir avec lldpd :

  1. À travers le support SNMP. Seules les informations contenues dans la LLDP-MIB sont alors exportées. Les aspects spécifiques à l’implémentation ne sont donc pas disponibles. De plus, le support est actuellement en lecture seulement.
  2. À travers lldpctl. Grâce à une contribution de Andreas Hofmeister, la sortie peut être produite sous forme d’un document XML.

L’intégration de lldpd dans une pile réseau était donc limitée à l’un de ces deux canaux. À titre d’exemple, il est possible de regarder comment Vyatta a effectué cette intégration à l’aide de la seconde solution.

Afin de fournir une solution plus robuste, une bibliothèque partagée, liblldpctl, existe désormais. J’ai suivi les grandes directions suivantes dans sa conception2 :

  • Une convention de nommage uniforme. Tous les symboles exportés sont préfixés par lldpctl_. Pas de pollution de l’espace de nommage.
  • Une convention des valeurs de retour uniforme. En cas d’erreurs, les fonctions retournant des pointeurs retournent NULL, celles retournant des entiers retournent -1.
  • Pas de variables globales. Réentrant et possibilité d’utiliser des threads.
  • Un seul fichier d’entête bien documenté.
  • Une API asynchrone pour les entrées/sorties. La bibliothèque délègue ces dernières à l’utilisateur en lui demandant de fournir les fonctions nécessaires. Ces dernières peuvent retarder leurs effets. Dans ce cas, l’utilisateur doit appeler des fonctions particulières de la bibliothèque quand les données deviennent disponibles. L’intégration dans une boucle d’évènement existente est alors triviale. Une fine couche synchrone est également fournie.
  • Des types opaques avec des fonctions d’accès.

L’accès aux informations est fait à travers un « atome » qui est un conteneur opaque de type lldpctl_atom_t. D’un atome, il est possible d’extraire des entiers, des chaînes de caractères, des tampons ou d’autres atomes. La liste des ports est un atome, chaque port de cette liste est également un atome, la liste des VLAN présents sur ce port est un atome ainsi que chaque VLAN de cette liste. Le nom d’un VLAN est par contre une chaîne de caractères dont la validité est limitée par la validité de l’atome englobant. Accéder à une propriété d’un atome se fait via des fonctions génériques telles que lldpctl_atom_get_str() en spécifiant la clef correspondant à la propriété voulue. Par exemple, voici comment afficher le nom et l’identifiant de tous les VLAN attachés à un port :

vlans = lldpctl_atom_get(port, lldpctl_k_port_vlans);
lldpctl_atom_foreach(vlans, vlan) {
    vid = lldpctl_atom_get_int(vlan,
                               lldpctl_k_vlan_id));
    name = lldpctl_atom_get_str(vlan,
                                lldpctl_k_vlan_name));
    if (vid && name)
        printf("VLAN %d: %s\n", vid, name);
}
lldpctl_atom_dec_ref(vlans);

En interne, un atome est typé et maintient un compteur des références. La taille de l’API est limitée grâce à ce concept. Actuellement, il est possible d’extraire plus d’une centaine de propriétés de lldpd.

À terme, la bibliothèque doit également permettre la configuration complète de lldpd plutôt que d’utiliser des paramètres en ligne de commande. Cette bibliothèque ne remplace pas lldpctl qui est toujours le client à utiliser dans la majeure partie des cas.

CLI

La possibilité de configurer lldpd via un fichier de configuration était demandé depuis bien longtemps. Je ne voulais toutefois pas inclure un analyseur syntaxique pour limiter l’inflation du nombre de lignes de code. De plus, il était déjà possible de configurer divers aspects liés à LLDP-MED via lldpctl. Il m’a donc semblé naturel de continuer dans cette voie : permettre à lldpctl de lire un fichier de configuration et d’en transmettre les effets à lldpd. En bonus, les instructions de configuration pourraient être entrées de manière interactive à la façon d’un équipement réseau.

Analyse syntaxique & complétion

Un analyseur syntaxique généré par YACC limite les possibilités telles que la complétion. Aussi, les commandes sont définies par un arbre dont chaque nœud accepte un mot. Un nœud est défini ainsi :

struct cmd_node *commands_new(
    struct cmd_node *,
    const char *,
    const char *,
    int(*validate)(struct cmd_env*, void *),
    int(*execute)(struct lldpctl_conn_t*, struct writer*,
        struct cmd_env*, void *),
    void *);

On y trouve :

  • le nœud parent,
  • optionnellement, le mot accepté,
  • une description pour l’aide,
  • optionnellement, une fonction de validation,
  • optionnellement, une fonction qui sera exécutée si le mot est validé.

Le parcours de l’arbre est effectué en maintenant un environnement contenant à la fois des associations clef-valeur arbitraires ainsi qu’une pile des positions rencontrées dans l’arbre. La fonction de validation peut s’aider de l’environnement pour juger de la validité d’un mot (le mot clef foo ne sera accepté que s’il n’a pas déjà été rencontré, par exemple). La fonction d’exécution peut enregistrer la valeur courante dans une association mais également remonter dans l’arbre avant de continuer l’exécution.

À titre d’exemple, voici comment les nœuds permettant de configurer la localisation par coordonnées géographiques sont définis :

/* Le nœud principal */
struct cmd_node *configure_medloc_coord = commands_new(
    configure_medlocation,
    "coordinate", "MED location coordinate configuration",
    NULL, NULL, NULL);

/* Le nœud de sortie
   La fonction de validation vérifie si l'utilisateur
   a fourni latitude et longitude. */
commands_new(configure_medloc_coord,
    NEWLINE, "Configure MED location coordinates",
    cmd_check_env, cmd_medlocation_coordinate,
    "latitude,longitude");

/* Stockage de la valeur de la latitude. On remonte ensuite
   de deux positions en arrière. La latitude ne peut être
   entrée qu'une fois. */
commands_new(
    commands_new(
        configure_medloc_coord,
        "latitude", "Specify latitude",
        cmd_check_no_env, NULL, "latitude"),
    NULL, "Latitude as xx.yyyyN or xx.yyyyS",
    NULL, cmd_store_env_value_and_pop2, "latitude");

/* De même pour la longitude */
commands_new(
    commands_new(
        configure_medloc_coord,
        "longitude", "Specify longitude",
        cmd_check_no_env, NULL, "longitude"),
    NULL, "Longitude as xx.yyyyE or xx.yyyyW",
    NULL, cmd_store_env_value_and_pop2, "longitude");

Les définitions sont encore un peu verbeuses mais ce système semble être un bon équilibre entre puissance et simplicité. Il couvre tous les cas nécessaires.

Readline

Face à une interface en ligne de commande, l’utilisateur s’attend généralement à disposer d’un historique, d’une aide en ligne et de la complétion. La bibliothèque la plus souvent utilisée pour cet usage est la bibliothèque GNU Readline. Toutefois, en raison de sa licence (GPL), j’ai d’abord cherché une alternative. Il en existe de nombreuses :

Les trois premières bibliothèques supportent la même API que GNU Readline. Elles disposent en sus d’une API commune native. Cette dernière gère également l’analyse lexicale. J’ai donc en premier lieu adopté cette API3.

Malheureusement, j’ai remarqué par la suite que ces bibliothèques ne sont pas beaucoup répandues dans le monde Linux. En utilisant l’API native, il n’est pas possible de se rabattre sur la GNU Readline. J’ai donc changé mon fusil d’épaule et opté pour l’API de la GNU Readline. Une macro issue de l’archive Autoconf (légèrement modifiée) règle les disparités en ce qui concerne la compilation et la liaison.

L’absence d’analyseur lexical intégré m’a obligé à écrire le mien. L’API est également assez mal documentée et il est difficile de savoir quels symboles sont disponibles dans quelle version. Je me suis limité aux symboles suivants :

  • readline(), addhistory(),
  • rl_insert_text(),
  • rl_forced_update_display(),
  • rl_bind_key()
  • rl_line_buffer et rl_point.

Malheureusement, les implémentations de libedit ne gèrent pas correctement rl_bind_key(). Aussi, la complétion et l’aide en ligne ne sont pas disponibles avec celle-ci. La plupart des BSD viennent avec la GNU Readline préinstallée (elle bénéficie alors de l’exception liée aux bibliothèques systèmes). Pour le reste, il est toujours possible de se lier avec libedit et éviter ainsi les problèmes de licence. Dans ce cas, l’aide peut être obtenue avec la commande help.

Changements spécifiques à un OS

Précédemment, la liste des interfaces était récupérée via getifaddrs(). lldpd utilise désormais directement Netlink sur Linux. Ce n’est pas un changement majeur car la bibliothèque C utilisait déjà Netlink à cet effet. Les informations supplémentaires que l’on peut obtenir par ce biais ne sont pour le moment pas exploitées : elles sont toujours récupérées via sysfs ou ioctl(). Toutefois, lldpd est notifié lors du moindre changement.

Comme beacoup d’autres projets, j’ai réécrit ma propre implémentation de Netlink au lieu d’utiliser des bibliothèques telles que libnl qui incluent tout le nécessaire et bien plus encore. Pourquoi ?

  1. La dernière version de libnl est très jeune et n’est pas disponible dans de nombreuses distributions, dont par exemple Debian Squeeze. Comme pour libevent, il aurait été possible de contourner la difficulté en incluant cette bibliothèque dans lldpd et en l’utilisant lorsqu’il n’y a pas d’alternative dans le système. Mais…

  2. La licence de libnl est la LGPL 2.1. La liaison statique est alors un exercice périlleux. Il n’est pas clair si le résultat est une œuvre dérivée ou non. L’interprétation la plus courante est que la liaison statique est autorisée suivant les mêmes termes que dans la LGPL 3. C’est un problème pour de nombreux projets. Par exemple, OGRE a ajouté une exception pour autoriser la liaison statique dans sa version 1.6 puis s’est tourné vers la licence MIT dans sa version 1.7.

J’ai eu une courte discussion avec Thomas Graf à propos de ce problème et il semble disposé à ajouter une telle exception. Cela risque de prendre un peu de temps mais une fois le changement réalisé, j’utiliserai alors la libnl et en profiterai pour mieux exploiter Netlink.

Support des BSD

La version 0.5.7 de lldpd ne supportait que Linux. La réécriture utilisant Netlink a été l’occasion d’abstraire correctement le traitement des interfaces et de porter le tout sous les différents BSD. Le premier port a eu lieu pour Debian GNU/kFreeBSD, puis pour FreeBSD, OpenBSD et NetBSD. La structure est la même pour les trois BSD :

  • getifaddrs() pour obtenir la liste des interfaces,
  • bpf(4) pour s’attacher à une interface et envoyer et recevoir des paquets,
  • PF_ROUTE pour être notifié lors d’un changement.

Chaque BSD utilise ses propres ioctl() pour récupérer les informations liées aux VLAN, aux ponts et aux aggrégats mais ils sont souvent assez similaires. Le code est généralement repris de ifconfig.c.

Les ports pour les BSD ont les mêmes fonctionnalités que le port pour Linux, à l’exception de NetBSD qui ne dispose pas du support pour l’inventaire LLDP-MED car je n’ai pas su comment récupérer ces informations.

Le port d’OpenBSD offre de plus une plus grande sécurité en filtrant les paquets envoyés et en interdisant le processus non privilégié de retirer le filtre mis en place :

/* Install write filter (optional) */
if (ioctl(fd, BIOCSETWF, (caddr_t)&fprog) < 0) {
    rc = errno;
    log_info("privsep", "unable to setup write BPF filter for %s",
        name);
    goto end;
}

/* Lock interface */
if (ioctl(fd, BIOCLOCK, (caddr_t)&enable) < 0) {
    rc = errno;
    log_info("privsep", "unable to lock BPF interface %s",
        name);
    goto end;
}

C’est une fonctionnalité très appréciable. lldpd est découpé en deux processus. Un processus privilégié s’attache au port et transmet celui-ci à un processus non privilégié. Sans cette fonctionnalité, le second processus peut simplement retirer le filtre BPF. J’ai porté la possibilité d’interdire le retrait d’un filtre sous Linux. Toutefois, il me reste toujours à écrire le nécessaire pour le filtre des paquets sortants.

Support d’OS X

Une fois le support pour FreeBSD fonctionnel, celui d’OS X fut assez simple. J’ai obtenu de xcloud.me une machine virtuelle sous OS X pour m’aider dans cette tâche. Le port n’a ensuite pris que deux jours dont une partie du temps à chercher comment ne pas fournir un numéro de carte de crédit à Apple pour pouvoir télécharger Xcode !

Afin de faciliter l’installation de lldpd, j’ai également écrit une formule pour Homebrew qui semble le gestionnaire de paquets le plus populaire actuellement pour OS X.

Support de upstart et systemd

De nombreuses distributions proposent désormais upstart ou systemd en remplacement ou en alternative au système d’init historique. Comme de nombreux démons, lldpd se détache du terminal et tourne en tâche de fond en forkant deux fois lorsqu’il est prêt (pour lldpd, cela signifie simplement que la socket Unix a été mise en place). Bien qu’il soit possible de garder ce comportement avec upstart et systemd, il est préférable de ne plus forker. Comment indiquer alors que le démon est prêt à remplir sa tâche ?

Avec upstart, lldpd s’envoie le signal SIGSTOP. upstart va détecter son état et lui envoyer le signal SIGCONT. De plus, il va considérer que le démon est prêt. Voici comment faire :

const char *upstartjob = getenv("UPSTART_JOB");
if (!(upstartjob && !strcmp(upstartjob, "lldpd")))
    return 0;
log_debug("main", "running with upstart, don't fork but stop");
raise(SIGSTOP);

La configuration de upstart ressemble à ceci :

# lldpd - LLDP daemon

description "LLDP daemon"

start on net-device-up IFACE=lo
stop on runlevel [06]

expect stop
respawn

script
  . /etc/default/lldpd
  exec lldpd $DAEMON_ARGS
end script

systemd emploie une socket sur laquelle le démon envoie la chaîne READY=1 quand il est prêt. En utilisant la bibliothèque destinée à cet effet, il suffit d’appeler sd_notify("READY=1\n"). La fonction sd_notify() pouvant être réécrite en moins de 30 lignes, il m’a semblé plus simple de le faire plutôt que d’ajouter une dépendance externe. Voici la configuration de systemd :

[Unit]
Description=LLDP daemon
Documentation=man:lldpd(8)

[Service]
Type=notify
NotifyAccess=main
EnvironmentFile=-/etc/default/lldpd
ExecStart=/usr/sbin/lldpd $DAEMON_ARGS
Restart=on-failure

[Install]
WantedBy=multi-user.target

Fichiers d’entête spécifique à Linux

Les fichiers d’entête issus du noyau ont toujours été très problématiques. Ils peuvent contenir des erreurs les rendant difficile à utiliser en espace utilisateur ou être simplement manquants. Il y a longtemps, ils faisaient partie de la bibliothèque C et étaient synchronisés très rarement. Ils ont ensuite été extraits du noyau sans aucun changement et ne correspondaient pas forcément au noyau par défaut de la distribution4.

Il s’agit d’un problème qui tend à disparaître aujourd’hui. D’un côté, les distributions empaquettent désormais les entêtes correspondant au noyau par défaut. De l’autre, les développeurs noyau séparent les entêtes propres au noyau des entêtes destinés à être utilisés par l’espace utilisateur. Toutefois, il faut toujours gérer l’historique.

Un bon exemple est linux/ethtool.h:

  • Il peut simplement être absent alors que les fonctionnalités associées sont supportées depuis très longtemps.
  • Il peut utiliser les types u8, u16 qui sont spécifiques au noyau. Pour contourner ce problème, il faut altérer les types.
  • Certaines définitions telles que SPEED_10000 peuvent manquer. Dans ce cas, on peut soit compléter les définitions dans un autre fichier et se retrouver avec une copie du fichier d’entête dans laquelle les définitions sont entralacées avec des #ifdef, soit n’utiliser les symboles que s’ils sont présents. La dernière solution n’est pas plus pratique et elle interdit d’utiliser des fonctionnalités qui sont pourtant présentes dans le noyau.

Une solution très simple pour résoudre ce problème est simplement d’inclure les fichiers d’entête dans l’arbre de source du projet. Grâce à Google qui a recopié maladroitement ceux-ci pour sa bibliothèque C Bionic, nous savons désormais que la copie des entêtes du noyau dans un programme ne constitue pas une œuvre dérivée.


  1. L’utilisation des types u_int16_t et u_int8_t est un reste du système précédent où le sérialiseur devait connaître la taille de chaque membre. 

  2. Pour des conseils plus élaborés, jetez un œil sur Writing a C library

  3. L’analyse lexicale n’est pas le seul avantage de cette API native. Elle est également beaucoup mieux conçue, ne repose pas sur des variables globales et est bien documentée. Ses implémentations sont de plus sous licence BSD

  4. Par exemple, dans Debian Sarge, le noyau était un 2.6.8 (2004) tandis que les entêtes du noyau provenaient d’un noyau antérieur au 2.6. 

20 February, 2013 08:28AM par Vincent Bernat

17 January 2013

Debian France

Bilan de la deuxième Mini-Debconf Paris

Bilan de la deuxième Mini-Debconf Paris

La deuxième édition de la Mini-Debconf Paris s'est tenue les 24 et 25 novembres 2012 dans les locaux de l'Epitech au Kremlin-Bicètre.

Plus de 150 personnes se sont retrouvées pour deux jours de conférence assurées par des intervenants venus de toute l'Europe. Plusieurs équipes Debian ont été présentées, notamment l'équipe noyau et l'importante release team. L'installateur Debian a été décortiqué. GNOME a été à l'honneur avec une présentation des relations entre GNOME et les distributions (dont Debian) mais aussi des explications sur l'administration à grande échelle de postes bureautiques GNOME. Retrouvez les diapositives de toutes les autres présentations sur le site dédié.

photo-groupe.jpg

L'association tenait un stand de merchandising où les visiteurs ont pu se procurer polos, stickers, parapluie et autres t-shirts. Les futurs contributeurs ont eu l'occasion de faire signer leurs clés GPG par les développeurs Debian présents.

ksp.jpg

Merci aux nombreux sponsors qui ont soutenu l'événement: Logilab, SmartJog, Bearstech, IRILL et Evolix.

Quelques photos supplémentaires sont disponibes sur la page wiki de cette mini-debconf.

17 January, 2013 11:22AM

12 January 2013

Stéphane Blondon

Déterminer quelle est la meilleure distribution grâce à Python et PIL

N’avez-vous jamais discuté des mérites de telle ou telle distribution Linux (ou BSD) avec d’autres personnes (chacun essayant de démontrer que celle qu’il utilise au quotidien est la meilleure) ? Grâce à cet article, vous n’aurez toujours pas La réponse mais vous aurez une réponse indiscutable : il s’agit de la jouer aux cartes. Les cartes sont créées avec Python Imaging Library, une bibliothèque Python de manipulation d’image. L’article explique la façon de les réaliser.

Carte de jeu pour Debian

Chaque carte possède un ensemble de caractéristiques, la plus forte remporte le pli. Ce principe de jeu existe depuis les années 70 (Ace_Trumps, Super Top Ass). L’ensemble des 26 cartes créées est visible ici.

L’objectif de l’article est de montrer comment on peut concevoir la création de la carte, pas le détail des paramètres de chaque fonction. Pour cela, la documentation et de nombreuses explications foisonnent déjà sur le web. C’est pourquoi, par exemple, les calculs de dimensionnement ne seront pas expliqués.

Prérequis : installer PIL (ou Pillow)

Deux possibilités :

  • utiliser le système de paquet de votre distribution (python-imaging pour Debian) ;
  • utiliser Pypi : PIL n’est pas disponible, il faut installer Pillow. Cela ne change pas la façon d’utiliser la bibliothèque :
    from PIL import Image, ImageDraw, ImageFont
    

Image sert à instancier une image, ImageDraw à la modifier, ImageFont à choisir une police de caractère.

Créer une carte

La base consiste à instancier un objet image sur lequel les modifications vont être apportées. Une fois les modifications réalisées, on enregistre le résultat sur le disque :

def draw_card(distrib):
    img = Image.open(BACKGROUND_PATH)
    #ajout des textes, images, etc.
    img.save(distrib["img_name"] + ".png")

La carte est une superposition de couches, qui sont toutes fusionnées en une seule image. On a donc un fond sur lequel les autres éléments sont superposés.
Parmi les éléments remarquables :

Textes dans un cartouche

Le titre et les caractéristiques des distributions sont faits de la même manière. Il n’existe pas d’effet avec PIL pour dessiner automatiquement une bordure. Elle est réalisée en plaçant deux rectangles l’un sur l’autre, celui de dessous étant plus large et haut.

Montage du titre

def draw_title(img, title):
    """
    pour dessiner le titre avec le fond et la bordure autour

    img est l'image PIL
    title est la chaine de caracteres a afficher ("Distribution")
    """
    draw = ImageDraw.Draw(img)
    draw_cartouche(draw, 25, 55)
    font = ImageFont.truetype(FONT_PATH, TITLE_FONT_SIZE)
    width, height = draw.textsize(title, font=font)
    x = center(width)
    draw.text((x, 29), title, font=font, fill=TEXT_COLOR)

def draw_cartouche(draw, upper_height, lower_height):
    """pour dessiner les deux rectangles"""
    draw.rectangle(((MARGIN_LEFT, upper_height), (CARD_WIDTH - MARGIN_RIGHT, lower_height)),
                   fill="#8e6f32")
    BORDER = 5
    draw.rectangle(((MARGIN_LEFT + BORDER, upper_height + BORDER), (CARD_WIDTH - MARGIN_RIGHT - BORDER, lower_height - BORDER)),
                   fill="#e9b654")

draw.textsize() permet de connaître les dimensions que prendrait la chaîne passée en paramètre. Cela permet de faire un calcul (dans la fonction center(), omise dans l’extrait ci-dessus) pour centrer le texte.

Le logo de la distribution

Montage du logo

L’affichage du logo suit la même logique en intercalant une image (nommée supernova.png) entre le fond et le logo de la distribution. Pour avoir un joli rendu , on décale simplement en hauteur l’image (y) car les deux images n’ont pas la même taille.

def draw_logo(img, filename):
    """on colle supernova
       puis le fichier correspondant au parametre filename"""
    image_path = SRC_IMGS_DIR + "supernova.png"
    nova = Image.open(image_path)
    nova_width, nova_height = nova.size
    x = center(nova_width)
    y = 60
    img.paste(nova.convert("RGBA"),
              (x, y, x + nova_width, y + nova_height),
              mask=nova.convert('RGBA'))
    image_path = SRC_IMGS_DIR + filename + ".png"
    distro = Image.open(image_path)
    distro_width, distro_height = distro.size
    x = center(distro_width)
    y = 90
    img.paste(distro.convert("RGBA"),
              (x, y, x + distro_width, y + distro_height),
              mask=distro.convert('RGBA'))

L’exercice de factorisation de cette fonction est laissé aux lecteurs qui s’ennuient et qui ne sont pas partis faire autre chose (ce que je ne comprend pas d’ailleurs).

Le numéro de la carte

Le numéro de la carte en bas à gauche est affiché de biais. Si les images peuvent subir une rotation, les textes ne sont affichés qu’horizontalement. La solution est donc de coller le texte dans une image intermédiaire. Cette image subira une rotation puis sera collée sur l’image finale de la même manière que précédemment :

def draw_card_index(img, number):
    """pour dessiner 'number' de biais"""
    HEIGHT = WIDTH = 19
    num_img = Image.new("RGBA",
                        (WIDTH, HEIGHT),
                        (0, 0, 0, 0))
    num_draw = ImageDraw.Draw(num_img)
    font = ImageFont.truetype(SANS_PATH, TEXT_FONT_SIZE)
    num_draw.text((0, 0), number, font=font, fill="brown")
    n = num_img.rotate(-45)
    X, Y = 7, 378
    img.paste(n, (X, Y, X + WIDTH, Y + HEIGHT), mask=n)

À noter que la rotation faite ici prend peu de précaution et les nombres à deux chiffres sont légèrement tronqués. Le paramètre expand peut être ajouté à rotate() pour éviter la perte, mais l’image est automatiquement agrandie.

Code source et ressources

La documentation de PIL est précieuse.
Un tutoriel dont certains effets ont été réutilisés pour les cartes.

Les données sur les cartes proviennent principalement de Distrowatch. Les logos des distributions sont aussi ceux affichés sur Distrowatch. « first stable » représente la première version stable avec le nom actuel de la distribution ou ce qui pourrait être considéré comme équivalent. « based on » indique le nom de la distribution parente. La valeur « Indep. » signifie qu’elle n’est basée sur aucune autre distribution. Si elle est suivie d’une étoile, cela signifie qu’elle est maintenant indépendante mais a été basée sur une autre distribution par le passé.

Le fond de carte et l’effet supernova ont été réalisés avec The Gimp.

L’archive contenant le code source du script au cas où quelqu’un voudrait le réutiliser, ainsi que les logos et les cartes générées est fournie au format .tar.xz. Le code a été écrit dans un but de démo. Il est bien perfectible…


12 January, 2013 09:39AM par ascendances

01 August 2012

Grégory Colpart

Astuces pour gérer un répertoire ext3 bien rempli

Disclaimer : Valable pour de l’ext3 sous Linux (utilisable sur d’autres filesystems ou Unix à vos disques et péril)

Vous avez un répertoire rempli à rabord de nombreux fichiers, et il est impossible de connaître sa taille, le lister ou l’effacer sans impact sur la production ?

Voici quelques astuces :

- Avec un “ls -ld” sur le répertoire, vous pouvez estimer grossièrement le nombre de fichiers présents dans un répertoire. En effet, un répertoire vide fait 4 Ko (je simplifie). Et plus il contient de fichiers, plus sa taille va augmenter. Par exemple, un répertoire contenant 2 millions de fichiers pourra faire une taille de 100 Mo (je parle bien de la taille du répertoire et non pas de la taille du contenu). Attention, c’est variable selon la longueur des noms des fichiers. Et prendre garde aussi que ce n’est pas dynamique : si vous videz complètement un répertoire bien rempli, il gardera sa taille volumineuse (d’où l’intérêt de recréer un répertoire qui s’est rempli “par erreur”).

- Pour lister les fichiers du répertoire, utiliser la commande “ls” n’est pas une bonne idée car elle accède à toute la liste avant de l’afficher. Voici comment lister 10 fichiers sans attendre :

perl -le 'opendir DIR, "." or die; $i=0; while ($i<10) { my $f = readdir DIR; print $f; $i++; }; closedir DIR'

Grâce à leurs noms, vous pouvez désormais examiner (ouvrir, connaître sa taille) un échantillon de fichiers contenus dans votre fameux répertoire.

Pour lister l’ensemble des fichiers sans attendre comme “ls” :

perl -le 'opendir DIR, "." or die; print while $_ = readdir DIR; closedir DIR'

- Pour effacer le contenu du répertoire en limitant l’impact sur la production, oubliez “rm -rf” qui va saturer vos I/O disque mais préférez le faire par blocs de N fichiers avec des pauses de quelques secondes ! Voici une commande “conviviale” qui va faire cela par blocs de 300 fichiers avec des pauses de 5 secondes :

perl -le 'use POSIX qw/strftime/; opendir DIR, "." or die; $i=0; printf "DELETING IN PROGRESS...";
 while (my $f = readdir DIR) {unlink $f;  $i++;
 if ($i % 300 == 0) {printf "...$i files deleted\n".strftime("%Y-%m-%d %H:%M:%S",localtime)." : PAUSE...";
 $| = 1; sleep 5 ; printf "...DONE. "; printf "DELETING IN PROGRESS..."}}; printf "...DONE"; closedir DIR'

EDIT : en complément, on n’oubliera pas que l’on peut aussi gérer la priorité d’ordonnancement des I/O avec la commande ionice
(merci à Sylvain B. de l’avoir souligné)

01 August, 2012 02:24AM par Gregory Colpart

03 June 2012

Aurélien Jarno

How multiarch adds new RC bugs…


# dpkg --add-architecture kfreebsd-amd64
# dpkg -i libc0.1-dev_2.13-32_kfreebsd-amd64.deb
Selecting previously unselected package libc0.1-dev.
(Reading database ... 446113 files and directories currently installed.)
Unpacking libc0.1-dev (from libc0.1-dev_2.13-32_kfreebsd-amd64.deb) ...
dpkg: error processing libc0.1-dev_2.13-32_kfreebsd-amd64.deb (--install):
trying to overwrite '/usr/include/_G_config.h', which is also in package libc6-dev 2.13-32
dpkg-deb: error: subprocess paste was killed by signal (Broken pipe)
Errors were encountered while processing:
libc0.1-dev_2.13-32_kfreebsd-amd64.deb

Before multiarch the bug was not existing, and of course none of libc6-dev and libc0.1-dev are marked as Multi-Arch: something. People wanting to delay the release of Wheezy, I am sure you can find much more RC bugs like that.

03 June, 2012 11:13AM par aurel32

18 March 2012

Aurélien Jarno

10 years ago…

Date: Mon, 18 Mar 2002 18:22:10 +0000
From: James Troup <troup@samosa.debian.org>
To: “Aurelien Jarno” <aurelien@aurel32.net>
Cc: da-manager@debian.org
Subject: New Debian maintainer Aurelien Jarno

[ This is a long (automatically-generated) mail, but it contains
important information, please read it all carefully. ]

Dear Aurelien Jarno!

An account has been created for you on developer-accessible machines with username ‘aurel32′. The password for this account can be found encrypted with your PGP or GPG key and appended to this message. A list of machines available to Debian developers can be found at <URL:http://db.debian.org/machines.cgi>. Please take a minute now to familiarize yourself with the Debian Machine Usage Policy, available at <URL:http://www.debian.org/devel/dmup>

You have been subscribed to the debian-private mailing list as <aurel32@debian.org>. Please respect the privacy of that list and don’t forward mail from it elsewhere. E-mail to <aurel32@debian.org> will be forwarded to <aurelien@aurel32.net>. To change this, please see <URL:http://db.debian.org/forward.html> Also, please subscribe to debian-devel-announce, if you haven’t done so already.

We strongly suggest that you use your aurel32@debian.org address for the maintainer field in your packages, because that one will be valid as long as you are a Debian developer, even if you change jobs, leave university or change Internet Service providers. If you do so, please add that address to your PGP/GPG key(s) (using `gpg –edit-key “YOUR USER ID”‘) and send it to the keyring server at keyring.debian.org with `gpg –keyserver keyring.debian.org –send-keys “YOUR USER ID”‘.

You can find more information useful to developers at <URL:http://www.debian.org/devel/> (in particular, see the subsection titled “Debian Developer’s reference”).

We suggest that you subscribe to debian-mentors@lists.debian.org. This list is for new maintainers who seek help with initial packaging and other developer-related issues. Those who prefer one-on-one help can also post to the list, and an experienced developer may volunteer to help you. You can get online help on IRC, too, if you join the channel #debian-devel on irc.debian.org. Take a look at the support section on www.debian.org in order to find out more information.

You should have read these documents before working on your packages.

o The Debian Social Contract
<URL:http://www.debian.org/social_contract.html>

o The Debian Policy Manual
<URL:http://www.debian.org/doc/debian-policy/>

If you have some spare time and want to contribute it to Debian you may wish to take a look at the “Work-Needing and Prospective Packages for Debian GNU/Linux” also known as WNPP that can be found at <URL:http://www.debian.org/devel/wnpp/>

If you plan to make a Debian package from a not yet packaged piece of software you *must* announce your intention on the debian-devel mailing list to make sure nobody else is working on them.

The machine ftp-master.debian.org is our main archive server. Every uploaded package finds it’s way there (except for Packages covered by US crypto laws which go to non-us.debian.org) eventually. master.debian.org is the home of our bug tracking system. Project web pages and CVS archives are hosted on klecker.debian.org (aka cvs/www.debian.org), klecker is also our general shell server. Web pages should be placed in public_html on klecker and refered to by http://people.debian.org/~aurel32

You should use ssh to log into the machines instead of regular telnet or rlogin. Our LDAP directory is able to share ssh RSA keys among machines, please see <URL:http://db.debian.org/doc-mail.html> Otherwise when you first login a ~/.ssh directory will be created with the appropriate permissions. Please be aware of the security implications of using RSA authentication and ssh agents.

Finally, please take a minute to visit <URL:http://db.debian.org/>.
Login using the password information appended to this email, and update your personal information. The information is used to maintain your accounts on various Debian machines, and also to allow other developers and general users to find out more about you. Many of the fields are only visible to other registered Debian developers. This is also the only way to change your password. The passwd program does not yet work.

Welcome to the project!


The Debian New Maintainer Team

18 March, 2012 07:52PM par aurel32

05 October 2010

Vincent Carmona

Adapter une bibliothèque C pour ruby (4)

Ce quatrième billet présente comment obtenir une documentation grâce à rdoc : il suffit de commenter les fichiers sources.

Documentation

Commenter

Pour documenter les méthodes de la classe TagLib::File, il suffit de commenter les différentes fonctions les implémentant.

La méthode title permet d'obtenir le titre d'une piste. On l'indique en commentaire juste avant la fonction file_get_title.
 
/*Get track title*/ 
VALUE 
file_get_title(VALUE self) 

Par défaut, les paramètres d'une méthode sont nommés p1, p2, .... Pour la méthode title=, on utilise l'instruction call-seq: pour afficher le texte title=title (au lieu de title=(p1)).
 
/* 
call-seq: title=title 
 
Set track title to title 
 
title: a string 
*/ 
VALUE 
file_set_title(VALUE self, VALUE title) 

La méthode initialize ne devrait jamais être appelée directement depuis un code ruby. On utilise l'instruction :nodoc: pour indiquer que la méthode ne doit pas apparaitre dans la documentation.
 
/*:nodoc:*/ 
VALUE 
file_init(VALUE self, VALUE path) 

J'indique que je ne désire pas commenter le module TagLib en plaçant un commentaire vide afin d'éviter que rdoc utilise un commentaire non-désiré.
 
/* */ 
  mTagLib=rb_define_module("TagLib"); 

Dans le fichier lib/raglib2.rb, j'ajoute la directive :main: afin que la page initiale de la documentation pointe sur la classe TagLib::File.
 
#:main: TagLib::File 
module TagLib 

Bizarrement, cette directive ne semble pas fonctionner si elle est placée dans le fichier taglib2.c.

Produire la documentation

 
rdoc --exclude extconf.rb 

Le fichier doc/index.html est créé.
aperçu de la documentation

Conclusion

Rendez-vous pour le dernier billet où j'introduirai quelques concepts que je n'ai pas utilisé dans le module TagLib.

Billet original publié sur les blogs de developpez.com...

05 October, 2010 10:43PM par vinc-mai

04 October 2010

Vincent Carmona

Adapter une bibliothèque C pour ruby (3)

Cet article fait suite au premier et deuxième billets dans lesquels nous avons vu comment créer un objet de la classe TagLib::File. Cet objet utilise les fonctions de la bibliothèque taglib, écrite en C, afin d'accéder aux tags de fichiers audio. Dans ce billet, nous verrons comment obtenir les valeurs des tags et comment modifier un tag.

» Lire la suite!

Billet original publié sur les blogs de developpez.com...

04 October, 2010 02:47PM par vinc-mai

18 August 2010

Grégory Colpart

Mon compte-rendu de DebConf 10 à New York

DebConf est la conférence annuelle des développeurs du projet Debian. Cela permet aux développeurs et contributeurs de Debian d’assister à des présentations techniques, sociales et politiques, mais aussi de se rencontrer et travailler ensemble. Cette année, la 11e DebConf s’est tenue à New York du 1er au 7 août. Evolix a sponsorisé cette conférence et j’étais donc sur place, voici mon résumé de cette semaine.

Premiers pas plutôt festifs le vendredi soir avec le SysAdmin Day dans un bar à Manhattan puis direction Brooklyn pour une Debian Party organisée par NYC Resistor, un collectif local de hackers en électronique à l’origine de MakerBot, une imprimante 3D Open Source. Samedi c’est l’arrivée à Columbia University, l’université américaine qui accueille la DebConf 10. Une bonne partie des participants est hébergée sur le campus universitaire, dans des chambres avec accès haut-débit et une cafétéria à volonté.

C’est donc le dimanche 1er août que commence la DebConf avec des présentations orientées grand public pour cette première journée appelée le “Debian Day”. Un grand message de bienvenue pour un public plus large en ce premier jour, puis enchaînement des présentations. J’ai tout d’abord assisté à une présentation sur le sysadmin par François Marier qui a livré toutes ses astuces et une série de packages intéressants (unattended-upgrades, safe-rm, etckeeper, fcheck, fwknop, etc.). J’ai d’ailleurs pu échanger par la suite avec lui d’autres informations, sachant qu’il travaille dans une boîte similaire à Evolix : Catalyst située en Nouvelle-Zélande ! J’ai ensuite assisté à la présentation de Stefano Zacchiroli, l’actuel leader Debian, qui encourage fortement les développeurs à réaliser des NMU (Non Maintainer Upload), c’est-à-dire la publication d’un package par un autre développeur que celui responsable officiellement. J’ai ensuite poursuivi avec la présentation du Google Summer of Code 2010 de Debian : une présentation générale puis plusieurs “étudiants” expliquent leur projet en cours : Debian-Installer pour OpenMoko, GUI pour aptitude en QT, etc. D’autres présentations ont ensuite suivies, mais j’ai plutôt été découvrir le “hacklab” : une pièce pourvue de multiprises, switches et points d’accès afin de permettre à plusieurs dizaines de personnes de travailler/hacker. Le “Debian Day” a été un franc succès avec plusieurs centaines de participants. En soirée, c’est l’heure du coup d’envoi “officiel” de la DebConf par Gabriella Coleman, l’une des organisatrices de la DebConf 10, qui présente avec humour la semaine à venir, avec un petit retour en images sur les éditions précédentes.

Deuxième jour, on a le droit à un Bits from DPL en direct de la part de Stefano Zacchiroli (au lieu du traditionnel mail). Ensuite, il y a de nombreuses présentations. Durant DebConf, il y en aura plus de 100 au total, réparties dans 3 salles : Davis (avec vidéo), 414 Schapiro et Interschool (avec vidéo). Le choix est parfois difficile ! Pour ma part, j’ai assisté en fin de matinée à la présentation de la structure américaine à but non lucractif SPI : c’est elle qui gère les droits de la marque Debian, mais pas seulement : OpenOffice.org, Drupal, PostgreSQL, Alfresco, etc. de nombreux projets de logiciels libres utilisent cette structure légale ! Dans l’après-midi, c’est Mark Shuttleworth, fondateur d’Ubuntu et CEO de Canonical, qui nous présente le travail réalisé pour améliorer l’interface graphique des netbooks, notamment par l’intermédiaire du projet Ayatana. Puis, Jorge Castro, responsable chez Canonical des relations avec les développeurs extérieurs, parle de la collaboration entre Ubuntu et Debian. On notera que toute une équipe de Canonical est venue à DebConf et que les relations avec Debian semblent devenir plus sereines. Le soir venu, c’est l’heure de Wine&Cheese, un évènement devenu incontournable pour une DebConf : imaginez des centaines de fromages et alcools venus du monde entier (Italie, Allemagne, France, Mexique, Brésil, USA, Taïwan, Pologne, Kazhastan, Espagne, Nouvelle-Zélande, Corse, Vénézuela, Hollande, Marseille, Irlande, Angleterre, Japon, etc. etc.) et plus d’une centaine de développeurs Debian lâchés dessus pendant des heures… le résultat est… indescriptible ! Pour ma part, j’avais apporté un rosé Bandol, des bières La Cagole, du Banon et de la Tapenade… qui n’ont pas fait long feu.

Troisième jour et l’on débute par un talk d’Eben Moglen, avocat de la FSF, qui rappelle les dangers du Cloud Computing comme la gestion des données privées. Sa réponse : “Chacun devrait avoir un serveur chez soi” et il évoque la FreedomBox, une boi-boîte que tout le monde aurait chez soi pour faire office de petit serveur avec les fonctionnalités classiques (web, messagerie, VoIP). Cette idée rencontre un certain enthousiasme et plusieurs réfléchissent déjà à la réalisation de cette idée ! J’ai ensuite suivi une succession de présentations sur le thème de l’entreprise. On a parlé du déploiement de machines avec le logiciel Puppet, de l’installation automatisée de Debian avec FAI et Gosa, notamment présentée par Mickaël Bank, un développeur allemand très actif dans Debian. On a également des témoignages très intéressants : Russ Allbery, administrateur système et réseau à l’université de Standford en Californie, explique quels sont les arguments en faveur de Debian en entreprise et en profite pour présenter la gestion de Debian à Standford ; Faidon Liambotis, sysadmin chez GRNET (un opérateur public grec), présente leur utilisation de Debian mais aussi leurs choix en terme de déploiement (Puppet/FAI) ou de virtualisation (KVM/Ganeti). Pour terminer la journée, Guido Trotter de chez Google, nous parle des fonctionnalités réseau intéressantes sous Linux (VLAN, tunnels, routing, etc.). Une journée riche en idées et en informations ! En soirée, nous avons visualisé le film Open Source Sita Sings the Blues et Nina Paley nous a expliqué son choix d’une licence libre pour son film.

Le quatrième jour, c’est le Day Trip. Il s’agit classiquement d’une journée consacrée à des activités touristiques extérieures. Nous avons été visiter l’église Trinity Church à Manhattan où le drame du 11 septembre 2001 a mis un superbe orgue hors d’usage, remplacé temporairement par un orgue électronique “Powered by Linux”… qui a finalement été conservé en raison de sa qualité. Keith Packard, l’un des gourous de X.org employé chez Intel, a joué quelques minutes sur cet orgue. Ensuite, direction la plage de Coney Island. Puis un match de baseball où Stefano Zacchiroli lancera la première balle du match.

Cinquième jour, on reprend avec un BoF (un BoF=Birds of a Feather est une discussion informelle de groupe) sur la virtualisation où plusieurs personnes témoignent de leurs expériences et connaissances sur le sujet. Pas mal d’informations intéressantes, notamment sur le couple Ganeti/KVM pas mal mis en avant par Iustin Pop, l’un des développeurs de Ganeti employé chez Google. J’y apprends notamment que KVM gère une notion de mémoire partagée et ainsi démarrer une 2e machine virtuelle avec un même OS ne consommerait pas de mémoire supplémentaire sur le système hôte ! Suite des présentations, notamment une portant sur DebConf 12 qui pourrait peut-être se dérouler au Brésil. Et fin de la matinée avec François Marier qui présente le projet Libravatar permettant d’offrir une alternative à Gravatar, l’outil centralisé de gestion des avatars. Ses idées sont de se baser sur les DNS pour répartir les avatars pour chaque noms de domaine. Il a déjà commencé à développer une application en Django pour gérer cela. Suite de la journée avec un BoF sur Lintian (outil de vérification de la conformité des packages Debian) géré par Russ Allbery. Puis j’ai assisté à une présentation de Guido Günther qui a expliqué comment gérer son packaging avec Git et notamment git-buildpackage (très intéressant pour moi car je gère déjà mes packages Debian comme ça). Ensuite, petite pause sportive, car une dizaine de développeurs Debian a été participé à un cross de 5 kms dans le Bronx, avec des résultats honorables !

Sixième jour, on débute par Bits from Release Team qui déclare en direct que Squeeze, la prochaine version stable, est désormais freezée ! Un scoop à DebConf ! C’est ensuite Stefano Zacchiroli qui nous présente son travail en cours sur une amélioration de la gestion des dépendances, non seulement pour Debian mais aussi pour les autres distributions : plus de détails sur le site du projet Mancoosi. C’est ensuite la traditionnelle photo de groupe. En début d’après-midi, Margarita Manterola dresse un constat très lucide de l’état de Debian avec son talk Making Debian Rule, again. Puis en fin d’après-midi, c’est un BoF très apprécié mené par Joey Hess sur CUT (Constantly Usable Testing) qui explore les possibilités d’avoir une distribution Testing utilisable en permanence ! Le soir venu, c’est un BoF sur l’utilisation d’OpenPGP et la classique Keysigning Party qui a regroupé plusieurs dizaines de participants.

Septième et dernier jour, encore de nombreuses présentations. J’ai notamment assisté à celle de Philippe Kern, membre de la Release Team, qui a parlé du management de la version stable et de volatile. On notera par exemple qu’on peut désormais corriger des bugs en priorité “Important” dans les points de Release. La suite ce sont des fameux Lightnings Talks, une dizaine de présentations très courtes : une qui suggère d’arrêter complètement d’utiliser les mots de passe, une autre sur le logiciel runit, une autre sur les éclairs (lightnings !) ou encore l’historique en photos des Wine&Cheese Party ! Fun et instructif. Puis c’est l’heure de la conférence de clôture, où l’on remet des prix à ceux qui ont corrigé le plus de bugs mais surtout tous les volontaires sont vivement remerciés et j’en profite pour adresser une nouvelle fois mes remerciements à :
- L’équipe qui a organisé cette DebConf 10 : un travail impressionnant pour un résultat professionnel et communautaire à la fois : on frôle la perfection !
- L’équipe vidéo qui a fait un travail génial et vous pouvez ainsi retrouver l’ensemble des talks en vidéo,
- Les centaines de personnes sympas et passionnées qui contribuent à faire de Debian une distribution de grande qualité… et qui sait évoluer, la preuve avec les sujets abordés lors de cette DebConf !

Petite conclusion de cette semaine intensive, comme vous avez pu le lire : j’ai pu acquérir de nombreuses informations et faire le plein de nouvelles idées, mais aussi avoir des contacts réels avec d’autres développeurs et comprendre encore mieux le fonctionnement “social” de Debian. C’est donc très positif et cela va me permettre d’améliorer mon travail quotidien au sein d’Evolix, mais aussi réfléchir à d’autres projets et me motiver pour contribuer davantage à Debian. Debian rules !

18 August, 2010 11:52AM par Gregory Colpart

18 May 2008

Olivier Berger (perso)

Déclaration d'impôts sous Debian testing : difficultés mais contournement trouvé

J'ai essayé de télédéclarer mes impôts sur le revenu depuis ma Debian (testing) avec iceweazel (plugin Java Sun du paquet sun-java5-plugin).

Tou allait bien jusqu'à la phase finale de signature, où j'obtenais des erreurs de ce genre (dans la console Java) :

java.lang.UnsatisfiedLinkError: Expecting an absolute path of the library: local/.TaoUSign/libjsec.so
        at java.lang.Runtime.load0(Runtime.java:767)
        at java.lang.System.load(System.java:1005)
        at com.dictao.plfm.a.b(Unknown Source)
        at signview.b(Unknown Source)
        at signview.start(Unknown Source)
        at sun.applet.AppletPanel.run(AppletPanel.java:465)
        at java.lang.Thread.run(Thread.java:619)

Le problème apparemment, c'est que :

$ ldd ~/local/.TaoUSign/libjsec.so 
	linux-gate.so.1 =>  (0xffffe000)
	libnspr4.so => /usr/lib/libnspr4.so (0xb7f14000)
	libpthread.so.0 => /lib/i686/cmov/libpthread.so.0 (0xb7efc000)
	libnss3.so => not found
	libdl.so.2 => /lib/i686/cmov/libdl.so.2 (0xb7ef7000)
	libm.so.6 => /lib/i686/cmov/libm.so.6 (0xb7ed2000)
	libc.so.6 => /lib/i686/cmov/libc.so.6 (0xb7d84000)
	/lib/ld-linux.so.2 (0x80000000)

Mais j'ai trouvé le contournement suivant pour que ça passe (après avoir complètement quitté iceweasel) : lancer iceweasel depuis le répertoire contenant libnss3.so, avec LD_LIBRARY_PATH positionnée à "." :

$ cd /usr/lib/iceweasel/
$ LD_LIBRARY_PATH=. iceweasel

Et voilà, ça marche mieux.

18 May, 2008 07:55PM par olberger

15 October 2007

Olivier Berger (perso)

Encore un logo debian détourné ?

Mais d'où vient ce logo

REMOVED

Plus d'infos ou (en noir et blanc).

Update 20071016 : bon, ben, les camarades de la CGT ont réagi promptement et retiré le logo "contrefait". Reste les camarades de coca-cola ;)

15 October, 2007 05:01PM par olberger

19 April 2006

Pierre Machard

Et si les écologistes s’étaient trompés au sujet du nucléaire?

Hier en lisant slashdot je suis tombé sur un billet qui mentionnait que Patrick Moore (un des fondateurs de Greenpeace), dans un éditorial du Washington Post, expliquait que l’énergie nucléaire était la seule source d’énergie qui pouvait couvrir nos besoins.

« Thirty years on, my views have changed, and the rest of the environmental movement needs to update its views, too, because nuclear energy may just be the energy source that can save our planet from another possible disaster: catastrophic climate change. »

Ce qui dans la langue de Molière pourrait donner quelque chose comme :
« En 30 ans, mes idées ont évolué, et le mouvement écologiste doit également évoluer dans ses considérations, car l’énergie nucléraire est peut être la source d’énergie qui peut préserver notre planète d’un autre risque probable : un boulversement climatique. »

La catastrophe de Tchernobyl a eu lieue il y a 20 ans, néanmoins, il convient de réfléchir sur nos besoins en énergie, développer les énergies non-fossiles, mais aussi de se rendre compte que nous n’avons pas d’alternative au nucléaire, sans quoi nous serions obligé d’éteindre tous nos ordinateurs.

19 April, 2006 09:01AM par migus

15 March 2006

Pierre Machard

Une belle explication des DRM

Hier soir dans l’hémicycle de l’Assemblée Nationale j’ai eu la chance d’entendre une magnifique définition de ce qu’est un DRM. M. Suguenot (UMP) a très didcatiquement détaillé comment fonctionne un DRM. Je vous copie/colle ici le verbatim du propos de M. Suguenot. La seule erreur à noter est l’utilisation du verbe crypter là où nous aurions dû trouver chiffrer :

« Lorsque vous achetez de la musique sur internet, les DRM sont déjà systématiquement utilisés. Dans le système de Microsoft adopté par la Fnac et Virgin, le serveur de votre fournisseur crypte le morceau de musique à l’aide d’une clef secrète, que vous ne recevrez naturellement pas. Vous devez alors utiliser un lecteur compatible, Windows Media Player par exemple. Ce lecteur, détectant que le fichier est crypté, protégé par un DRM, prend contact avec le serveur pour lui demander la clé secrète nécessaire à la lecture. Avant de la lui envoyer, le serveur lui demande le numéro de série de votre ordinateur puis met à jour votre fiche client en y inscrivant le numéro de série du morceau concerné suivi de celui de l’ordinateur sur lequel vous désirez l’écouter, avant de fabriquer un fichier qu’on appelle licence. Cette licence contient la clé secrète de décryptage, mais aussi une liste de règles précisant ce que vous êtes autorisé à faire avec le morceau en question. Le serveur envoie cette licence à votre lecteur qui la « cache » sur votre disque dur. Disposant alors du morceau de musique et de sa licence, il vérifie dans celle-ci que vous avez bien le droit de lire celui-là. Si tout est en règle, vous pouvez, enfin, écouter votre musique !

Comprenant mieux le fonctionnement des DRM, on imagine les règles qu’ils permettent d’imposer. Si vous transférez le morceau sur une autre machine, le lecteur, ne trouvant plus de licence, va à nouveau contacter le serveur pour en obtenir une. Votre fiche client sera mise à jour et le serveur « saura » que vous avez installé ce morceau une deuxième fois. Si vous dépassez le nombre maximal d’ordinateurs autorisés, cinq avec iTunes par exemple, le serveur refusera de vous accorder une nouvelle licence, vous devrez lui demander d’en retirer une à un ordinateur pour la transférer à un autre. La licence peut également imposer une limitation dans le temps de l’utilisation d’un fichier, un délai au-delà duquel le lecteur le détruira.  »

15 March, 2006 10:36AM par migus