20 August 2016

Florent Gallaire

Les micro-frameworks Python : Flask, Bottle, Itty, Newf et importd

Suite au succès phénoménal de Flask, qui a plus d’étoiles sur GitHub que Django, et à celui remarquable de Bottle, j’ai poursuivi ma réflexion personnelle sur les microframeworks. C’est un sujet auquel je m’étais fortement intéressé en 2009, il y a 7 ans donc, lors de la soudaine prolifération de microframeworks Python.

Sinatra, l’inspiration vint encore du Ruby

Tout comme Ruby on Rails a été dès 2004 le grand précurseur des frameworks web MVC de nouvelle génération, Sinatra a été dès 2007 le précurseur des microframeworks web. Sinatra a rendu l’écriture d’application web radicalement plus aisée grâce à sa syntaxe claire et concise :

require 'sinatra'

get '/' do
'Hello world!'
end

WSGI, la condition technique

Le standard Python WSGI (Web Server Gateway Interface) décrit dans la PEP 333 de 2003, mise à jour en 2010 par la PEP 3333, a proposé une interface simple permettant de découpler les frameworks web des serveurs web.

Et l’ajout du module wsgiref dans la bibliothèque standard de Python 2.5 en 2006 a permis a tout framework d’être utilisable sans aucune dépendance grâce au petit serveur WSGI qu’il fournit :

from wsgiref.simple_server import make_server

Qu’est-ce qu’un micro-framework ?

En admettant que l’on sache ce qu’est un framework, on doit s’interroger sur le sens de micro. Le Larousse précise :

Préfixe, du grec mikros, petit, indiquant que quelque chose est très petit.

Un micro-framework est donc un très petit framework. L’intérêt de cette démarche est réel pour le développeur car il est plus facile d’apprendre à utiliser un petit framework, qui de plus consomme moins de ressources et impose souvent moins de contraintes.

Il est communément admis que ces microframeworks sont surtout intéressants pour construire de petites applications, la quantité de fonctionnalités des frameworks full-stack justifiant de plus en plus leur usage avec l’augmentation de la taille et des besoins de l’application.

Le moins de lignes de code possible

Un microframework est donc un framework ayant une petite base de code, c’est-à-dire un petit nombre de lignes de code. Encore faut-il qu’il en ait suffisamment pour qu’un développeur ait un intérêt à l’utiliser. Le minimum nécessaire n’est pas forcément facile à évaluer, mais on peut penser que des frameworks comme Newf ou Itty n’en faisaient pas assez pour susciter un réel intérêt chez les développeurs d’applications web.

Tout le framework dans un seul fichier

La théorie de l’ingénierie logicielle a combattu cette pratique au nom d’une meilleure structuration, permettant une bonne séparation des fonctionnalités et donc un débogage et une réutilisation plus facile du code. Pourtant, mettre tout le code dans un seul fichier présente certains avantages, en particulier quand il s’agit de le distribuer. C’est une pratique qui a connu une nouvelle légitimation avec le succès des bibliothèques JavaScript côté client, facilement chargées dans le navigateur web d’une simple ligne :

<script src="https://cdn.net/lib.js"></script>

Bottle est distributed as a single file module alors que Flask est plus classiquement composé de plusieurs fichiers. Flask, le plus populaire des microframeworks Python en est-il donc vraiment un ?

Essayons d’y voir plus clair à l’aide de wc récursifs appliqués sur les répertoire contenant le code source des frameworks, et desquels j’ai retiré le code des tests :

Micro-frameworksFrameworks
NomNewfimportdIttyBottleFlaskTornadoPyramidDjango
Lignes de code1507919584 1796 46922 32722 641122 675
Fichiers Python12112181193853
Étoiles GitHub504543743 87822 00711 9032 05920 717

J’ai ajouté au tableau Django, Pyramid et Tornado, les trois frameworks web Python les plus populaires, et il apparaît clairement qu’en comparaison Flask est bien un microframework, puisque s’il est 1,5 fois plus gros que Bottle, il est 3,5 fois moins gros que Tornado et Pyramid et 19 fois moins gros que Django.

Toute l’application dans un seul fichier

Lorsque l’on utilise les outils d’aide des frameworks classiques pour débuter un projet, on se retrouve devant une arborescence complexe. Par exemple avec Django, si vous évitez les bizarreries et faites les choses normalement :

$ django-admin startproject django_project
$ cd django_project
$ django-admin startapp django_app


django_project
├── django_project
│ ├── __init__.py
│ ├── settings.py
│ ├── urls.py
│ └── wsgi.py
├── django_app
│ ├── admin.py
│ ├── __init__.py
│ ├── migrations
│ │ └── __init__.py
│ ├── models.py
│ ├── tests.py
│ └── views.py
└── manage.py

De même avec Pyramid :

$ pcreate -s starter pyramid_project

pyramid_project
├── CHANGES.txt
├── development.ini
├── MANIFEST.in
├── production.ini
├── pyramid_project
│ ├── __init__.py
│ ├── static
│ │ ├── pyramid-16x16.png
│ │ ├── pyramid.png
│ │ ├── theme.css
│ │ └── theme.min.css
│ ├── templates
│ │ └── mytemplate.pt
│ ├── tests.py
│ └── views.py
├── README.txt
└── setup.py

Ceci est une bonne base pour un gros projet, qui sera bien structuré dès le départ, avec un bon découplage du code, et même les fichiers nécessaires à son packaging ; mais pour beaucoup de projets assez simples, c’est surtout lourd et redondant.

Tous les microframeworks ont donc comme point commun qu’ils sont conçus pour qu’une application toute entière contenue dans un seul fichier soit parfaitement fonctionnelle, et un certain nombre de frameworks qui ne prétendent pas être des microframeworks, comme Tornado, partagent la même approche.

Pas de dépendances… ou beaucoup de dépendances ?

Deux visions opposées peuvent en effet légitimement se défendre lors de la construction d’un microframework :

– pour avoir un framework léger il ne faut aucune dépendances, et se reposer exclusivement sur la bibliothèque standard de Python (Python Standard Library)
– pour avoir un framework léger il faut au contraire se reposer un maximum sur des bibliothèques existantes, fiables et populaires si possible, et se contenter d’offrir une fine couche logicielle permettant de les interfacer correctement

Newf et Itty font bien sûr partie de la première catégorie.

Bottle qui has no dependencies other than the Python Standard Library, et fournit son propre langage de template, fait donc aussi partie de la première catégorie. Mais on peut en plus lui interfacer facilement Mako, Jinja2 et Cheetah, des langages de template Python populaires, ce qui le fait alors déborder sur la deuxième catégorie.

Flask quant à lui est de la seconde catégorie, d’autant que son auteur est Armin Ronacher (mitsuhiko) qui est aussi l’auteur de ses dépendances Werkzeug et Jinja2. Mais si avoir comme dépendances une bibliothèque WSGI et un langage de template est on ne peut plus légitime pour un microframework, l’ajout de la bibliothèque d’interface de ligne de commande Click semble beaucoup plus contestable et relever plutôt du syndrome NIH (Not invented here).

Enfin, la seconde vision a amené à de multiples essais de microframeworks basés sur… Django, le maxi-framework du monde Python ! Et si seul importd a rencontré un certain succès parmi ces projets, je pense que cet oxymore logiciel est un concept vraiment intéressant et que son potentiel n’a probablement pas encore été totalement exploité.

20 August, 2016 11:31PM par fgallaire

17 August 2016

Tanguy Ortolo

Aux concepteurs de voies cyclables

À voir le tracé de certaines voies cyclables, ceux qui les conçoivent ne sont pas toujours conscients qu'un cycliste se déplace avec une vitesse de l'ordre de 20 km/h. Ce genre d'aménagement, qui serait impensable pour une route normale :

Route avec une chicane à angle droit !

Au top, braquez et serrez le frein à main. Attention… TOP ! ;-)

… ce genre d'aménagement donc, est tout aussi invraisemblable pour une voie cyclable :

Piste cyclable avec une chicane à angle droit !

Au top, tournez votre guidon à 90°. Attention… TOP ! ;-)

Un cycliste ne peut pas tourner sur place à angle droit. Au mieux, on peut essayer de s'en approcher, mais ces virages à rayon de courbure nul sont pénibles et toujours dangereux, parce que cela implique :

  • de freiner brutalement — et paf, le cycliste qui arrive derrière et qui n'a pas remarqué cette anomalie du tracé ;
  • de tourner avec un angle déraisonnable — et zip, le cycliste sur route mouillée ou jonchée de gravier ou de feuilles mortes.

Mesdames, Messieurs les responsables des aménagements de voirie, pour éviter ce genre d'erreur de conception, ce n'est pas compliqué : lorsque vous tracez une voie cyclable, essayez d'imaginer qu'il s'agit d'une route normale, en plus petit. Vous n'iriez tout de même pas mettre une chicane à angle droit sur une route normale ? Eh bien, sur une piste cyclable, c'est pareil, si vous devez mettre une chicane, prévoyez un rayon de courbure raisonnable. Sans cela, dans le meilleur cas, les cyclistes ne respecteront pas votre aménagement inapproprié, et dans le pire des cas vous ramasserez des cyclistes et des piétons accidentés, direction l'hôpital le plus proche.

17 August, 2016 10:16AM par Tanguy

Charles Plessy

Qui a fini DEP 5 ?

Beaucoup de monde a travaillé à finir DEP 5. Je trouve que le blog de Lars ne montre pas assez l'aspect collectif du processus.

Si l'on regarde dans le texte de la spécification, on y trouve:

The following alphabetical list is incomplete; please suggest missing people:
Russ Allbery, Ben Finney, Sam Hocevar, Steve Langasek, Charles Plessy, Noah
Slater, Jonas Smedegaard, Lars Wirzenius.

Le journal des changements de la charte Debian mentionne:

  * Include the new (optional) copyright format that was drafted as DEP-5.
    This is not yet a final version; that's expected to come in the
    3.9.3.0 release.  Thanks to all the DEP-5 contributors and to Lars
    Wirzenius and Charles Plessy for the integration into the Policy
    package.  (Closes: #609160)

 -- Russ Allbery <rra@debian.org>  Wed, 06 Apr 2011 22:48:55 -0700

et

debian-policy (3.9.3.0) unstable; urgency=low

  [ Russ Allbery ]
  * Update the copyright format document to the version of DEP-5 from the
    DEP web site and apply additional changes from subsequent discussion
    in debian-devel and debian-project.  Revise for clarity, to add more
    examples, and to update the GFDL license versions.  Thanks, Steve
    Langasek, Charles Plessy, Justin B Rye, and Jonathan Nieder.
    (Closes: #658209, #648387)

Pour ma part, je suis très reconnaissant à Bill Alombert d'avoir enregistré le document dans le dépôt Git, ce qui a mis fin aux débats.

17 August, 2016 04:08AM

15 August 2016

Carl Chenet

Don Quichotte, lutte anti-terrorisme et chiffrement

Un article de Nextinpact intitulé La France veut lancer une initiative internationale contre le chiffrement m’a donné du grain à moudre pour m’exprimer sur la politique actuelle de lutte anti-terroriste du gouvernement français.

En effet, alors que les moyens et techniques déployés jusqu’à maintenant ont été manifestement incapables d’arrêter les attentats terroristes en France (toutes mes pensées aux familles des victimes de l’effroyable attentat de Nice), le gouvernement remet encore une fois sur la table la « question » du chiffrement, en comptant sur le manque de mémoire et/ou l’abrutissement qu’il espère de sa population, c’est-à-dire nous.

Don Quichotte

Interdire le chiffrement va-t-il empêcher les terroristes de l’utiliser ? Non, la technologie existe. Interdire la population d’utiliser un fusil d’assaut n’a pas empêché les terroristes de s’en servir. C’est tellement idiot comme raisonnement qu’on en viendrait à se demander ce que cela cache si le phénomène ne s’était pas déjà produit plusieurs fois. En effet la lutte contre le chiffrement est le marronnier de la lutte anti-terroriste, tous les Libristes le savent bien.

Depuis des années, alors que le chiffrement est extrêmement peu utilisé dans les faits, on nous bassine régulièrement avec des articles critiques sur cette technologie, la mettant régulièrement au centre de l’action terroriste.

Cela évite de s’interroger sur le fait que les terroristes ont utilisé des armes de guerre à Paris ou que le chauffeur de Nice a réussi à pénétrer une zone « surveillée » à Nice le 14 juillet. Des interrogations beaucoup plus légitimes – qui remettent en question l’action des politiques et forces anti-terroristes – que de savoir s’ils utilisent ou non le chiffrement pour communiquer.

Surtout quand on sait que la plupart des acteurs du terrorisme sont censés être identifiés bien en amont, d’après les déclarations quasi-systématique de la Police et des services de renseignement qui , sans aucun doute et d’après les mêmes déclarations, font bien leur travail… ou pas. Mais toutes les mesures jusqu’ici n’empêchent pas les attentats.

Brasser du vent, gâcher les moyens et les efforts

La nouvelle lutte anti-chiffrement entraînerait rien de moins qu’une collaboration Franco-Allemande, parce qu’on est jamais assez quand il s’agit de brasser du vent.

Et médiatiquement, plus c’est gros, plus ça passe. Alors qu’une publication du Ministère de l’Intérieur rappelle dans l’article de NextInpact qu’il existe un lien permanent entre le ministère de l’Intérieur et Facebook, Apple, Microsoft, Facebook et Twitter pour une plus grande « réactivité opérationnelle », soit une couverture quasi-globale de l’internet grand public, on se demande bien qui est visé par ces mesures sinon des personnes n’ayant aucun lien avec le terrorisme mais utilisant le chiffrement au nom de la défense des libertés individuelles.

Là où la coupe est pleine, c’est quand on constate le gâchis de moyens et d’effort pour créer ce battage médiatique, la mobilisation de personnes et d’actions destinée vraisemblablement à … rien, sinon la vague interdiction d’utilisation du chiffrement, ce qui changerait si peu à la lutte anti-terroriste.

Un gâchis énorme, coupable de détourner les moyens et efforts de l’anti-terrorisme dont les preuves des actions concrètes et efficaces se font attendre, où la population en France est la première touchée, ce qui semble très peu émouvoir nos dirigeants qui se déplacent en voiture avec chauffeur et au minimum deux motos pour leur ouvrir la voie sur le périphérique aux heures de pointe, une constatation habituelle pour n’importe quel Parisien.

C’est sûr que ça n’est sûrement pas nos dirigeants qui vont sauter à cause d’une bombe dans le métro… vu qu’ils n’y sont jamais.

L’effroyable impudeur

Rappelons-le, la France est en guerre, officiellement contre l’état islamiste, depuis septembre 2014. Alors que des moyens opérationnels importants ont été déployés hors de nos frontières, nous sommes aujourd’hui touchés de multiples fois sur notre sol. L’arrêt de ces attentats constituerait le succès de la politique de la lutte anti-terroriste. Or devant l’échec flagrant des politiques actuelles, on nous parle aujourd’hui de l’enjeu majeur du chiffrement dans la lutte anti-terroriste ?

N’y a-t-il pas une effroyable impudeur de nos dirigeants à déporter ainsi un problème politique global et un enjeu majeur de société sur un point technique mineur, le chiffrement ?

Est-ce que nos dirigeants sont tellement largués qu’ils agitent n’importe quel épouvantail pour détourner l’attention de leur inefficacité à gérer un problème lié avant tout à un problème de politique extérieure ? Benjamin Bayart dans son article consacré au même sujet explique la peur de nos dirigeants face au ressenti de la population vis-à-vis de leur inaction de fait. Mais aujourd’hui, le mépris de nos dirigeants vis-à-vis du citoyen est tellement criant et impudique qu’il faut s’interroger sur nous et nos attentes vis-à-vis d’eux plutôt que l’inverse.

Car nous n’avons vraisemblablement désormais que très, très peu à attendre d’eux.

15 August, 2016 10:00PM par Carl Chenet

01 August 2016

Charles Plessy

Nuage Amazon : remise à niveau.

Cela faisait quelques années que je n'avais pas fait de travail sérieux utilisant le nuage Amazon. Il m'a fallu un petit moment pour retrouver mes marques et m'adapter aux changements. En particulier, les instances à plus petit prix, t2.nano ne sont plus accessible que depuis les nuages virtuels privés (« Virtual Private Cloud », VPC), et j'ai eu un peu de mal à trouver comment en créer un simple. Je pense qu'une des raisons est que les utilisateurs arrivés après le 18 mars 2013 on automatiquement un VPC par défaut et que les autres ont déjà créé leur VPC depuis longtemps. Au final, ce n'était pas compliqué du tout. C'est certainement pour ça que je n'avais pas trouvé de tutoriel à ce sujet.

En résumé il faut d'abords créer un VPC. Pour lancer une instance de temps en temps, la plage IP privée importe peu. Les VPCs par défaut utilisent 172.31.0.0/16; alors faisons de même.

CIDR_BLOCK=172.31.0.0/16
aws ec2 create-vpc --cidr-block $CIDR_BLOCK

La commande renvoie un identifiant de VPC, que je stocke à la main dans la variable VPC par copié-collé. Le même principe sera répété pour chaque commande créant quelque chose. On peut retrouver l'identifiant avec la commande aws ec2 describe-vpcs.

VPC=vpc-XXXXXXXX  # Et ainsi de suite

Après, créer un sous-réseau. Là encore, pas la peine de faire compliqué, on peut lui donner la plage IP entière. Je récupère l'identifiant renvoyé et le stocke dans la variable SUBNET. Pour que les instances reçoivent une IP publique comme dans les VPCs par défaut et l'ancien comportement du nuage sans VPC, il faut activer l'attribut MapPublicIpOnLaunch.

aws ec2 create-subnet --vpc-id $VPC --cidr-block $CIDR_BLOCK
SUBNET=subnet-XXXXXXXX
aws ec2 modify-subnet-attribute --subnet-id $SUBNET --map-public-ip-on-launch 

Ensuite, créer une passerelle (je récupère l'identifiant dans GATEWAY) et l'attacher au VPC.

aws ec2 create-internet-gateway
GATEWAY=igw-XXXXXXXX
aws ec2 attach-internet-gateway --internet-gateway-id $GATEWAY --vpc-id $VPC

Une table de routage a été créée automatiquement, et on peut trouver son identifiant via la commande describe-route-tables, pour créer ensuite une route par défaut vers la passerelle.

aws ec2 describe-route-tables
ROUTETABLE=rtb-XXXXXXXX
aws ec2 create-route --route-table-id $ROUTETABLE --destination-cidr-block 0.0.0.0/0 --gateway-id $GATEWAY

Bien sûr, si on n'ouvre pas le trafic, on ne pourra pas contacter la machine... Ici, j'ouvre le port 22 pour un accès SSH.

aws ec2 describe-security-groups
SECURITY_GROUP=sg-XXXXXXXX
aws ec2 authorize-security-group-ingress --group-id $SECURITY_GROUP --protocol tcp --port 22 --cidr 0.0.0.0/0

Autre changement, Amazon distribue maintenant des outils libres pour la ligne de commande, qui sont plus complets qu'euca2ools.

Prochaine étape, je vais recommencer les tests utilisant l'installeur Debian dans le Nuage.

01 August, 2016 09:38PM

20 July 2016

Carl Chenet

Tribulations d’une migration depuis WordPress.com

wordpress-evil

Depuis quelques temps, la nécessite de renouveler l’infrastructure de mon blog se faisait de plus en plus pressante. Le billet d’aujourd’hui évoque les tribulations autour de cette aventure/galère/pt1cable et la nouvelle infrastructure du blog en espérant que cela puisse servir de leçon à d’autres tentés par l’aventure.

1. Pourquoi

Mon blog était clairement vieillissant. Hébergé chez WordPress.com, il devenait mystérieusement de plus en plus long à charger. Étant un client payant chez WordPress.com, j’étais donc fortement insatisfait du service, mais j’ai mis beaucoup trop de temps à me décider à corriger le problème. Pourquoi ? La raison principale est que j’avais souscrit mon nom de domaine carlchenet.com chez WordPress.com.

Une migration de DNS d’un hébergeur vers un autre ? Rien de plus facile se dit le néophyte. Mais quand tout faire pour compliquer la tâche au client fait qu’il se décourage de partir, c’est donc un outil de monétisation. Et là les ennuis commencent.

2. L’option existe dans l’interface, ça va être simple

Je commence donc à regarder via l’interface d’administration WordPress de mon blog comment transférer ma zone DNS. L’option existe. Cool, ça va être vite réglé. HAHAHA.

fuyez

Plein de bonnes volontés je suis les différentes étapes indiquées dans leur documentation. À la fin on me signale qu’un e-mail de confirmation va être envoyé à l’adresse de contact de la zone DNS. Ok, envoie.

Une semaine plus tard et tel un poisson rouge, je constate de nouveau la lenteur de mon blog. Je rage de nouveau et je me souviens que j’ai jamais reçu le fameux e-mail. J’enquête donc et constate que j’ai une erreur dans l’adresse e-mail de contact de ma zone DNS. Je corrige via l’interface de WordPress, attend une journée, et redemande l’envoi du fameux e-mail de confirmation de transfert de la zone. Pause pop-corn.

Plusieurs mois plus tard, je pète de nouveau un câble face à la lenteur de mon blog que je commence à délaisser car je n’arrive pas à le faire évoluer. Je plante des couteaux dans une poupée vaudou à l’effigie de WordPress.com et j’ouvre un ticket auprès de leur support. On me recontacte sous 24 ou 48 heures.

24 heures plus tard, la personne du support WordPress.com identifie le problème : il y a une erreur dans l’adresse de contact de ma zone DNS. Merci, c’est en effet l’un des problèmes, mais le principal est que je ne peux pas la changer moi-même. J’en informe cette personne qui me dit qu’elle revient vers moi.

24 heures plus tard, le support m’annonce que l’adresse a été changée. Très bien ! Enfin ! Je me connecte à l’interface pour renvoyer le fameux e-mail contenant le code de transfert.

Plusieurs heures plus tard je reçois l’e-mail en question qui me demande une confirmation de ma volonté d’effectuer cette manoeuvre et le fameux code de transfert. Je commande un transfert de zone chez OVH qui me demande le fameux code et se met en attente du retour du serveur DNS de WordPress.com.

Je reçois un e-mail de WordPress.com qui m’annonce qu’ils sont très tristes de me voir partir (surtout mon abonnement mensuel) et pour me donner un délai de réflexion, vont m’infliger 4 jours d’attente pour annuler au cas où, comme si ça n’était pas déjà suffisamment compliqué comme procédure. Je passe au fusil à pompe sur la poupée vaudou pour prendre mon mal en patience.

4 jours plus tard et la date annoncée dans l’e-mail expirée, j’ouvre une nouvelle demande au support WordPress.com pour leur préciser que, bon, j’ai décidé de me barrer, j’ai confirmé 20 fois, j’en suis à deux demandes de support et ça commence à bien faire, en fait. 24 heures plus tard, sans réponse du support, je reçois enfin la confirmation de transfert de la zone et au même moment la confirmation d’OVH qu’ils ont bien rapatrié ma zone.

L’e-mail final de WordPress.com est hilarant :

Dear Carl Chenet,

We're sorry you transferred your domain name(s) away from WordPress.com.
We are committed to providing quality services and products
and hope that we met your needs.

Tout cela est au final un peu trop long et un peu trop fastidieux.

3. Le nouveau blog WordPress avec un certificat Let’s Encrypt

Sur mon serveur propulsé par une Debian Jessie, j’ai donc installé un blog WordPress en version 4.5.3 avec deux plugins : l’importateur WordPress et WP-Super-Cache. J’ai fait pointer le cache généré par ce plugin vers un tmpfs sur mon serveur afin que le cache du blog soit donc en RAM. Et ça bourrine ! Bien, le principal problème qui a entraîné la migration est donc résolu.

Mon ancien blog WordPress de WordPress.com proposant une fonctionnalité de migration. Migrer les données a donc été un jeu d’enfant. Que ce soit donc bien clair, je n’ai rien à reprocher au moteur de blog WordPress, c’est plutôt avec la société commerciale WordPress.com que j’ai eu du mal.

letsencrypt

Niveau certificat SSL et afin d’économiser quelques euros par an, je décidais de mettre en place les certificats Let’s Encrypt avec un renouvellement automatique. Rien de plus facile avec le programme client de Let’s Encrypt certbot présent dans les dépôts officiels backports de Debian. Installer certbot est aussi simple que de taper la commande suivante sur votre serveur :

# apt-get install python-certbot-apache -t jessie-backports

La documentation officielle de Certbot est on ne peut plus limpide et vous est présentée en fonction de votre système d’exploitation et votre serveur Web. Le renouvellement automatique se fait à l’aide d’un cron installé automatiquement et se lançant tous les jours pour vérifier la validité de votre certificat.

4. Les leçons à retenir

Lorsqu’on souscrit à un moteur de blog, la première vérification doit être pour le système d’import/export de vos données. Cela va lourdement vous handicaper si vous souhaitez changer de moteur de blog. Avec WordPress, j’étais tranquille à ce niveau-là.

Ma grande erreur a été de sous-estimer le risque lié à mon nom de domaine. Aveuglé par l’offre faite pour coupler le moteur de blog et le nom de domaine, je me suis retrouvé très dépendant de WordPress.com pour migrer vers un autre système de blog. Il aurait donc fallu souscrire ma zone DNS chez un autre prestataire indépendant de celui gérant le moteur de blog.

Enfin cette aventure a été un grand décrassage pour moi et l’occasion de reprendre sous mon aile une partie de mes données afin de les présenter à l’aide d’un moteur de blog désormais propulsé via mon infrastructure. Et j’espère de vous faire un retour d’expérience avec quelques leçons à en tirer 😉

20 July, 2016 10:01PM par Carl Chenet

11 July 2016

Raphaël Hertzog

Mes activités libres en juin 2016

Mon rapport mensuel couvre une grande partie de mes contributions au logiciel libre. Je l’écris pour mes donateurs (merci à eux !) mais aussi pour la communauté Debian au sens large parce que cela peut donner des idées aux nouveaux venus et que c’est également un des moyens les plus effectifs de trouver des volontaires pour travailler sur les projets qui me tiennent à cœur.

Empaquetage Debian

Django et Python J’ai poussé la version 1.9.7 de Django, et créé auprès de l’amont le ticket n°26755, concernant l’échec aux tests DEP-8.

J’ai empaqueté/parrainé python-django-modeltranslation et python-paypal. J’ai ouvert une demande de pull pour model-translation, afin de corriger les échecs des tests de compilation de paquet Debian.

J’ai empaqueté une nouvelle version de python-django-jsonfield (la 1.0.0), créé un rapport de bug et découvert une régression dans le support PostgreSQL. J’ai apporté mon aide sur le ticket amont, et me suis vu accorder les droits de commit. J’ai profité de cette opportunité pour faire un peu de tri dans les bogues, et pousser quelques corrections. J’ai également discuté du futur du module et fini par lancer la discussion sur la liste de diffusion des développeurs Django, concernant la possibilité d’ajouter un champ JSONField au noyau.

CppUTest J’ai poussé une nouvelle version amont (3.8), contenant plus d’un an de travail. J’ai découvert que « make install » n’installait pas un des header requis, et j’ai donc créé le ticket correspondant, accompagné d’un patch. Le paquet ayant échoué à la compilation pour plusieurs architectures, j’ai créé un autre rapport de bogue et préparé un correctif pour certaines de ces erreurs, avec l’aide des développeurs amont. J’ai également ajouté un test DEP-8 après avoir envoyé un paquet cassé (et non testé)…

Support de systemd pour net-snmp et postfix J’ai travaillé à l’ajout de service units systemd natifs pour net-snmp (n°782243) et postfix (n°715188). Dans les deux cas, les mainteneurs n’ont pas été très réactifs jusqu’à présent, en conséquence de quoi j’ai poussé mes modifications en tant que non-mainteneur.

Équipe pkg-security Lancée doucement il y a quelques mois, l’équipe que j’ai créée est maintenant en croissance, que ce soit du point de vue du nombre de membres ou de celui du nombre de paquets. J’ai créé la page wiki Teams/pkg-security obligatoire, et parrainé les paquets xprobe et hydra. Enfin, j’ai poussé une mise à jour de medusa, pour incorporer les changements en provenance de Kali dans Debian (et soumettre le patch à l’amont dans le même temps).

fontconfig Après avoir lu l’analyse de Jonathan McDowell au sujet du bogue que de nombreux utilisateurs de Kali et moi-même ont rencontré à de multiples reprises, j’ai créé le ticket n°828037, afin que celui-ci soit corrigé une bonne fois pour toutes. Malheureusement, rien n’a changé à ce jour.

DebConf 16

Ce mois-ci, une partie de mon temps a été consacré à la préparation des deux conférences et de la table ronde que je vais présenter/animer à Cape Town entre le 2 et le 9 juillet :

Distro Tracker

J’ai continué le parrainage de Vladimir Likic, qui a réussi à terminer son premier patch. Il travaille maintenant sur la documentation à destination des nouveaux contributeurs, sur la base de son expérience récente.

J’ai amélioré la configuration tox pour pouvoir lancer des tests sur Django 1.8 LTS avec les avertissements bloquants (python -Werror) activés. De la sorte, je serai sûr de ne pas me baser sur une fonctionnalité abandonnée, et donc que la base de code sera fonctionnelle avec la prochaine version LTS Django (1.11). Cela m’a permis de découvrir les quelques endroits où j’utilisais effectivement des API obsolètes, et où j’ai mis à jour le code pour ne plus en dépendre (la mise à jour de JSONField vers la 1.0.0 dont j’ai parlé plus haut en est un parfait exemple).

J’ai également corrigé quelques problèmes supplémentaires avec les en-têtes d’emails « repliés », qui ne peuvent pas être réutilisés dans un nouvel objet Message, à qui il manque le champ Objet. Tous ces soucis ont été détectés via des exceptions déclenchées par une activité de spam, exceptions qui m’ont ensuite été transmises par email.

Travaux relatifs à Kali

j’ai poussé un nouveau live-boot (5.20160608) vers Debian, pour corriger un problème où le processus de boot était bloqué à cause d’un timeout.

J’ai transféré un bogue Kali affectant libatk-wrapper-java (n°827741), qui s’est trouvé être finalement un bogue OpenJDK.

J’ai créé le rapport de bogue n°827749 concernant reprepro, et demandant une méthode de suppression des références à des fichiers internes sélectionnés. C’est nécessaire si l’on souhaite pouvoir faire disparaître un fichier, et si ce dernier fait partie d’une sauvegarde que l’on veut garder malgré cela. En vérité, je souhaite avant tout pouvoir remplacer le fichier .orig.tar.gz utilisé par Kali par le orig.tar.gz utilisé par Debian… ces conflits cassent les scripts de réplication/import.

Salt

J’ai utilisé salt pour déployer un nouveau service, et j’ai développé plusieurs patchs pour quelques problèmes rencontrés dans les formules salt. J’ai également créé une nouvelle formule letsencrypt-sh pour la gestion des certificats TLS avec le client letsencrypt.sh ACME.

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 June 2016 contribuée par Weierstrass01.

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

11 July, 2016 12:02PM par Raphaël Hertzog

28 June 2016

Tanguy Ortolo

J'ai testé pour vous UltraViolet (c'est de la merde)

Après avoir acheté un beau coffret de la trilogie cinématographique Le Hobbit, j'ai eu la surprise d'un trouver des instructions pour « récupérer une copie numérique » pour regarder ces films « sur tous mes écrans » grâce à un machin appelé UltraViolet. Les instructions indiquées sont les suivantes :

  1. allez sur warnerbros.fr/uv ;
  2. entrez un code d'activation.

S'agissant d'un machin développé par la MAFIAA, je pouvais déjà prédire le résultat, mais par acquit de conscience, j'ai tout de même essayé, avec un navigateur Web Firefox sous Debian GNU/Linux, plugin Flash installé et à jour, JavaScript et cookies activés sans restriction. Après tout, il est bien indiqué sur le papier que c'est censé marcher « sur tous mes écrans », avec de beaux petits schémas représentant un téléphone, une tablette, un ordinateur portable et un téléviseur.

Logo UltraViolet

Étape 1, Warner Bros

Deux étapes, on pourrait difficilement faire plus simple ! Sauf qu'évidemment, ça se complique. Sur la page UltraViolet de Warner Bros, il n'y a pas d'endroit où saisir un code ; au lieu de cela, il est proposé deux sites partenaires où on doit pouvoir l'entrer : Nolim films et Flixter.

Étape 1, deuxième partie, premier essai, Nolim films

Lorsque j'ai essayé, hier, la page de Nolim films affichait seulement « chargement en cours ». Après quelques minutes, j'ai donc renoncé et été voir chez Flixter.

Étape 1, deuxième partie, deuxième essai, Flixter

Côté Flixter, ça commence bien, on arrive sur un site en anglais. Une fois passé en français, il y a un bouton pour « Utiliser un code ». On tape le code et… ça dit qu'il n'y a aucun résultat. En fait, il faut saisir le titre du film, et ensuite seulement, saisir le code d'activation.

Étape 2, (essayer de) regarder ou télécharger le film

Il faut alors créer un compte, qui demande de fournir des renseignements personnels, c'est à dire des informations qui ne devraient certainement pas les concerner : pour regarder un film qu'on a acheté, il est anormal de devoir donner son nom, prénom et date de naissance. Personnellement, j'ai renseigné mon nom, mais une date de naissance bidon.

Enfin, on peut regarder son film. Enfin, essayer, parce que ça ne marche pas : ça lance une page avec Flash, qui affiche… du noir, puis un indicateur de chargement, et qui finit par planter le lecteur Flash.

On peut aussi télécharger son film avec un logiciel propriétaire proposé pour cela. Il est prévu pour Windows, et ne s'installe pas sous Wine.

Étape 3, ripper son DVD

Comme prédit, ça ne fonctionne pas. Il est donc temps de faire un peu chauffer mon processeur pour ripper mes DVD : ça au moins, ça fonctionne, et sans la moindre restriction. Autrement, ces flims doivent également être disponibles sur les réseaux de contrefaçon : contrairement à l'UltraTropLaid, ça aussi, ça fonctionne.

28 June, 2016 11:34AM par Tanguy

16 June 2016

Raphaël Hertzog

Mes activités libres en mai 2016

Mon rapport mensuel couvre une grande partie de mes contributions au logiciel libre. Je l’écris pour mes donateurs (merci à eux !) mais aussi pour la communauté Debian au sens large parce que cela peut donner des idées aux nouveaux venus et que c’est également un des moyens les plus effectifs de trouver des volontaires pour travailler sur les projets qui me tiennent à cœur.

Debian LTS

Du fait de départs dans l’équipe et de l’augmentation de la charge de travail, j’ai souhaité trouver quelques nouveaux contributeurs rémunérés pour Debian LTS. Pour se faire, j’ai envoyé un email à la liste debian-jobs@lists.debian.org et, a contrario de la fois dernière (où je n’avais posté l’annonce que sur mon blog), j’ai reçu beaucoup de réponses en retour… Ce qui m’a permis de recruter six nouveaux contributeurs. J’ai du refuser trois candidatures, dont le profil ne correspondait pas.

Chaque nouveau contributeur devait gérer sur son temps libre au moins une mise à jour LTS, afin de s’approprier le processus. Mais des six nouveaux, seuls trois contributeurs ont effectué leur « mise à jour d’entraînement » en mai. 🙁

J’ai consacré beaucoup de temps ce mois-ci à guider les premiers pas des nouveaux contributeurs, tant sur la liste debian-lts que via emails.

J’ai également passé en revue une mise à jour xen, pour laquelle j’avais (à raison) quelques doutes sur la qualité du travail réalisé.

Travaux d’empaquetage

fonts-cantarell Après avoir diagnostiqué le problème le mois dernier, l’absence d’un paquet corrigé m’a suffisamment ennuyé pour que je réussisse à empaqueter une nouvelle version amont de fonts-cantarell qui ne requiert aucune mise à jour de fontforge… mise à jour qui va très vraisemblablement prendre du temps. J’ai donc préparé et envoyé la version 0.0.24-1.

cpputest Le bogue n°823711 faisait état de soucis de licence avec quelques fichiers. J’ai immédiatement remonté cela à l’amont (ticket 961) et corrigé le problème dans Debian, en ré-empaquetant l’archive d’origine. Heureusement, l’amont a rapidement traité le souci, et une nouvelle version (3.8) démunie des fichiers problématiques est disponible.

live-boot Les images live de Kali ne bootaient plus (bloquées dans l’initrd) et, avec l’aide de Ben Hutchings, nous avons remonté les causes du problème jusqu’au ticket n°823069, que j’ai corrigé dans live-boot 20160511.

udev J’ai créé le rapport de bogue n°824025 demandant l’isolation dans son propre fichier de la règle de gestion pilotant le nom (basé sur l’adresse MAC) des interfaces réseau USB, de sorte à ce qu’elle puisse facilement être désactivée (nous procédons de la sorte dans Kali).

Travaux divers J’ai empaqueté Django 1.8.13 dans jessie-backports, corrigé le n°824165 concernant l’échec de sbuild avec “$apt_allow_unauthenticated = 1;” dans .sbuildrc, créé la demande d’amélioration n°824168 suggérant qu’apt-listchanges ignore les news des paquets installés automatiquement, et créé le rapport n°825923 pour rapporter une régression dans python-nltk (découverte dans Kali en premier lieu).

Travaux d’infrastructure

packages.debian.org J’ai écrit, il y a de cela quelques mois, un patch pour packages.debian.org, afin que ce dernier transmette les emails vers tracker.debian.org, en lieu et place de packages.qa.debian.org. A cette époque, j’étais en contact avec Rhonda, et j’espérais qu’elle l’applique assez rapidement (le patch n’est pas très long). Après quelques relances, elle m’a fait remarqué qu’elle n’était pas seule et que je ferais mieux de soumettre la demande en bonne et due forme, de sorte à ce que quelqu’un d’autre s’en charge. Ce qui fut fait : ticket n°824085. J’ai essayé de trouver « quelqu’un d’autre » pour traiter ma demande, mais la plupart des membres de pkg_maint m’ont répondu qu’ils n’appartenaient à ce groupe que par implication générique des webmasters. Aussi ils ne souhaitaient pas toucher à cette partie. Martin Zobel, heureusement, fut plus réceptif à ma demande et m’a aidé à déployer les modifications. J’ai poussé ma modification et Martin l’a intégré dans le checkout live de picconi.debian.org.

Cette mise à jour constitue également le premier pas vers une possible utilisation de foo@packages.debian.org et/ou teams+foo@tracker.debian.org dans le champ « Mainteneur » du paquet. Nous pourrions nous débarrasser, avec cela, des listes de diffusion dédiées, qui ne font que dupliquer le travail du suiveur de paquets. Et nous n’aurions plus besoin de nous soucier du fait que le champ « Mainteneur » est géré différemment du champ « Uploader », dans la mesure où tous les co-mainteneurs (humains) seraient listés dans le champ « Uploader » uniquement (et le suiveur de paquets gèrerait correctement les emails envoyés au mainteneur).

Distro Tracker J’ai amélioré le processus d’import afin d’être en mesure de relancer le traitement de paquets source ayant déjà été importés. C’est en particulier utile pour prendre en compte les architectures récemment ajoutées dans la base de données (et qui étaient du coup ignorées et donc non affichées jusqu’à maintenant).

J’ai également revu une première fois le patch AppStream soumis par Matthias Klump dans le ticket n°806740.

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 2016 contribuée par Weierstrass01.

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

16 June, 2016 09:06PM par Raphaël Hertzog

02 May 2016

Vincent Bernat

Petit traité empirique de l'empaquetage Debian

Bien que la création de paquets Debian soit abondamment documentée, la plupart des tutoriaux ciblent les paquets respectueux de la charte Debian. De plus, leur création a longtemps eu la réputation d’être particulièrement difficile1 et beaucoup se sont tournés vers des outils moins contraignants2 tels que fpm ou CheckInstall.

Toutefois, je vais montrer que la construction de paquets Debian en utilisant les outils officiels est plutôt simple en appliquant ces quelques concessions :

  1. Aucun paquet source ne sera généré. Les paquets seront construits directement depuis une copie propre issue du système de versions.

  2. Des dépendances supplémentaires peuvent être téléchargées pendant la construction. Empaqueter individuellement chaque dépendance est un travail ingrat, notamment avec certains environnements tels que Java, Javascript et Go.

  3. Les paquets produits peuvent combiner et inclure des dépendances tierces. Cela peut lever certaines objections liées à la sécurité et à la maintenance à long terme, mais c’est une concession courante dans certains écosystèmes tels que Java, Javascript et Go.

Ceinture blanche§

Deux types de paquets coexistent dans l’archive Debian : les paquets sources et les paquets binaires. Un paquet source produit un ou plusieurs paquets binaires. Chaque paquet doit porter un nom.

Comme indiqué lors de l’introduction, aucun paquet source ne sera construit. Nous allons travailler directement sur sa représentation décompressée : une arborescence de fichiers incluant le répertoire debian/. Les exemples qui suivent utilisent une arborescence composée uniquement du répertoire debian/, mais ce dernier peut être inclus dans n’importe quel project existant.

Comme point de départ, nous allons empaqueter memcached, un cache mémoire distribué. Il nous faut créer quatre fichiers :

  • debian/compat,
  • debian/changelog,
  • debian/control et
  • debian/rules.

Le premier contient uniquement 9 :

echo 9 > debian/compat

Le second contient ceci :

memcached (0-0) UNRELEASED; urgency=medium

  * Fake entry

 -- Happy Packager <happy@example.com>  Tue, 19 Apr 2016 22:27:05 +0200

La seule information d’importance est le nom du paquet source, memcached, sur la première ligne. Toutes les autres informations sont sans influence sur les paquets créés.

Le fichier de contrôle§

debian/control décrit les méta-données à propos du paquet source et des paquets binaires. Un bloc est dédié à chacun d’eux.

Source: memcached
Maintainer: Vincent Bernat <bernat@debian.org>

Package: memcached
Architecture: any
Description: high-performance memory object caching system

Le paquet source est memcached. Il faut utiliser le même nom que dans le fichier debian/changelog.

Un seul paquet binaire est créé : memcached. Par la suite, si vous voyez memcached, il s’agit du nom du paquet binaire. The champ Architecture doit être soit any, soit all. Ce dernier est utilisé exclusivement si tous les fichiers sont indépendants de l’architecture matérielle. Dans le doute, il suffit de mettre any.

Le champ Description contient une courte description du paquet binaire.

La recette§

Le dernier fichier à rédiger est debian/rules. Il s’agit de la recette du paquet. Nous avons besoin de télécharger memcached, le construire et installer son arborescence dans debian/memcached/ :

#!/usr/bin/make -f

DISTRIBUTION = $(shell lsb_release -sr)
VERSION = 1.4.25
PACKAGEVERSION = $(VERSION)-0~$(DISTRIBUTION)0
TARBALL = memcached-$(VERSION).tar.gz
URL = http://www.memcached.org/files/$(TARBALL)

%:
    dh $@

override_dh_auto_clean:
override_dh_auto_test:
override_dh_auto_build:
override_dh_auto_install:
    wget -N --progress=dot:mega $(URL)
    tar --strip-components=1 -xf $(TARBALL)
    ./configure --prefix=/usr
    make
    make install DESTDIR=debian/memcached

override_dh_gencontrol:
    dh_gencontrol -- -v$(PACKAGEVERSION)

Les cibles vides override_dh_auto_clean, override_dh_auto_test et override_dh_auto_build permettent de s’assurer que debhelper ne fera rien de « magique ». La cible override_dh_gencontrol permet de spécifier la version3 sans avoir à tenir à jour debian/changelog. Cette recette est très similaire à ce qui aurait été écrit pour fpm :

DISTRIBUTION=$(lsb_release -sr)
VERSION=1.4.25
PACKAGEVERSION=${VERSION}-0~${DISTRIBUTION}0
TARBALL=memcached-${VERSION}.tar.gz
URL=http://www.memcached.org/files/${TARBALL}

wget -N --progress=dot:mega ${URL}
tar --strip-components=1 -xf ${TARBALL}
./configure --prefix=/usr
make
make install DESTDIR=/tmp/installdir

# Build the final package
fpm -s dir -t deb \
    -n memcached \
    -v ${PACKAGEVERSION} \
    -C /tmp/installdir \
    --description "high-performance memory object caching system"

Vous pouvez lire le résultat final sur GitHub et le construire avec la commande dpkg-buildpackage -us -uc -b.

Ceinture jaune§

À partir de là, il est possible d’inclure quelques améliorations. Aucune n’est essentielle mais le gain est suffisamment intéressant pour justifier l’effort.

Les dépendances sources§

Notre recette initiale ne fonctionne que si nous disposons déjà de wget et de libevent-dev. Ces paquets ne sont pas présents sur tous les systèmes. Il est assez aisé de spécifier ces dépendances en ajoutant un champ Build-Depends dans debian/control :

Source: memcached
Build-Depends: debhelper (>= 9),
               wget, ca-certificates, lsb-release,
               libevent-dev

Il faut toujours spécifier debhelper (>= 9) car son utilisation est centrale dans debian/rules. Il n’y a pas besoin de dépendre de make ou d’un compilateur C car le paquet build-essential est considéré comme toujours présent et il les fournit indirectement. dpkg-buildpackage se plaindra si une des dépendances est manquante. Pour installer sans peine ces paquets, vous pouvez utiliser la commande suivante4 :

mk-build-deps \
    -t 'apt-get -o Debug::pkgProblemResolver=yes --no-install-recommends -qqy' \
    -i -r debian/control

Il est aussi intéressant de se pencher sur des outils tels que pbuilder et sbuild qui permettent de construire des paquets dans un environnment minimal et isolé.

Les dépendances binaires§

Si le paquet ainsi construit est installé sur une machine vierge, memcached refusera de démarrer en raison de l’absence de libevent. Il est possible d’exprimer cette dépendance en ajoutant un champ Depends dans le fichier debian/control. De plus, dans le cas des bibliothèques dynamiques, ces dépendances peuvent être générées automatiquement en utilisant des variables de substitution :

Package: memcached
Depends: ${misc:Depends}, ${shlibs:Depends}

Le paquet construit contiendra les informations suivantes :

$ dpkg -I ../memcached_1.4.25-0\~unstable0_amd64.deb | grep Depends
 Depends: libc6 (>= 2.17), libevent-2.0-5 (>= 2.0.10-stable)

Intérgration avec un système de démarrage§

La plupart des paquets fournissant un démon incluent une intégration avec le système de démarrage afin de démarrer le démon au boot ou de le redémarrer après une mise à jour. Pour les distributions basées sur Debian, il existe plusieurs systèmes de démarrage. Voici les trois plus courants.

  • System-V est le système historique. Ces scripts de démarrage peuvent être réutilisés par les autres systèmes. Il s’agit donc du plus petit dénominateur commun.
  • Upstart est le système popularisé par Ubuntu. Il est utilisé jusqu’à la version 14.10, incluse.
  • systemd est le système par défaut pour Debian depuis Jessie et pour Ubuntu depuis la version 15.04.

Écrire un script de démarrage pour System-V est une tâche ardue. Habituellement, je préfère donc simplement fournir un script pour le système de démarrage par défaut de la distribution visée (Upstart et systemd).

System-V§

Si vous voulez écrire un script de démarrage pour System-V, adaptez5 le script /etc/init.d/skeleton de la distribution la plus ancienne que vous souhaitez supporter. Mettez le résultat dans le fichier debian/memcached.init. Il sera installé au bon endroit et invoqué lors de l’installation, mise à jour ou retrait du paquet. Habituellement, l’utilisateur peut personnaliser les options du démon en modifiant le fichier /etc/default/memcached. Pour en fournir un, placez son contenu dans le fichier debian/memcached.default.

Upstart§

Fournir un script pour Upstart est similaire : son contenu doit être placé dans debian/memcached.upstart. Par exemple :

description "memcached daemon"

start on runlevel [2345]
stop on runlevel [!2345]
respawn
respawn limit 5 60
expect daemon

script
  . /etc/default/memcached
  exec memcached -d -u $USER -p $PORT -m $CACHESIZE -c $MAXCONN $OPTIONS
end script

La directive la plus importante à surveiller est expect. Ici, nous utilisons expect daemon et memcached est démarré avec l’option -d.

systemd§

Fournir un script pour systemd est un tout petit peu plus compliqué. Le contenu doit se placer dans debian/memcached.service. Par exemple :

[Unit]
Description=memcached daemon
After=network.target

[Service]
Type=forking
EnvironmentFile=/etc/default/memcached
ExecStart=/usr/bin/memcached -d -u $USER -p $PORT -m $CACHESIZE -c $MAXCONN $OPTIONS
Restart=on-failure

[Install]
WantedBy=multi-user.target

Bien que cela ne soit pas considéré comme une bonne pratique6, nous réutilisons /etc/default/memcached. Comme pour Upstart, la directive Type est particulièrement importante. Nous utilisons forking car memcached est démarré avec l’option -d.

Il est également nécessaire d’ajouter une dépendance source sur dh-systemd dans debian/control :

Source: memcached
Build-Depends: debhelper (>= 9),
               wget, ca-certificates, lsb-release,
               libevent-dev,
               dh-systemd

Il faut également modifier la règle par défaut dans debian/rules :

%:
    dh $@ --with systemd

Cette complexité supplémetaire est regrettable et est dû au fait que l’intégration de systemd ne fait pas partie de debhelper7. Sans ces modifications, le script sera installé mais l’intégration n’aura pas lieu et il ne sera pas lancé au démarrage de la machine.

Utilisateur dédié§

De nombreux démons n’ont pas besoin de s’exécuter en tant que root et c’est souvent une bonne idée de fournir un utilisateur dédié. Dans le cas de memcached, nous allons fournir l’utilisateur _memcached8.

Ajoutez un fichier debian/memcached.postinst avec le contenu suivant :

#!/bin/sh

set -e

case "$1" in
    configure)
        adduser --system --disabled-password --disabled-login --home /var/empty \
                --no-create-home --quiet --force-badname --group _memcached
        ;;
esac

#DEBHELPER#

exit 0

Lorsque le paquet est désinstallé, aucun ménage n’est effectué :

  • moins de code à écrire, moins de bugs,
  • l’utilisateur peut toujours posséder quelques fichiers sur le système.

L’utilitaire adduser effectuera toujours la bonne action que l’utilisateur demandé existe déjà ou non. Il faut penser à l’ajouter comme dépendance binaire dans debian/control :

Package: memcached
Depends: ${misc:Depends}, ${shlibs:Depends}, adduser

Le marqueur #DEBHELPER# indique le point d’insertion pour des scripts d’intégration supplémentaires.

Le résultat final est disponible sur GitHub et peut être testé avec la commande dpkg-buildpackage -us -uc -b.

Ceinture verte§

Il est possible d’exploiter certaines capacités de debhelper pour réduire la taille du fichier debian/rules et pour le rendre plus déclaratif. Cette section est totalement optionnelle : vous pouvez la sauter si besoin.

Banalités§

Il y a quatre étapes dans la construction d’un paquet Debian :

  1. debian/rules clean va nettoyer l’arborescence pour revenir dans son état initial.

  2. debian/rules build doit construire le logiciel. Pour quelque chose de basé sur autoconf, comme memcached, il s’agit essentiellement d’exécuter ./configure && make.

  3. debian/rules install doit installer l’arborescence de chaque paquet binaire dans le répertoire approprié. Pour des logiciels basés sur autoconf, il s’agit d’exécuter make install DESTDIR=debian/memcached.

  4. debian/rules binary doit empaqueter les différentes arborescences en paquets binaires.

Il ne faut pas écrire directement chacune de ces cibles. L’utilitaire dh, un composant de debhelper, va faire la majeure partie du boulot. Le fichier debian/rules minimaliste suivant suffit pour accomplir cette tâche pour de nombreux paquets sources :

#!/usr/bin/make -f
%:
    dh $@

Pour chacune des quatre cibles décrites ci-dessus, vous pouvez exécuter dh --no-act pour voir les utilitaires invoqués. Par exemple :

$ dh build --no-act
   dh_testdir
   dh_update_autotools_config
   dh_auto_configure
   dh_auto_build
   dh_auto_test

Chacun de ces utilitaires dispose d’une page de manuel. Ceux commençant par dh_auto sont un peu « magiques ». Par exemple, dh_auto_configure va tenter de configurer automatiquement le logiciel avant l’étape de construction. Selon les cas, il peut invoquer ./configure, cmake ou Makefile.PL.

Si un des utilitaires dh_ ne fait pas ce qu’il faut, il est possible de le remplacer en déclarant une cible nommée de manière adéquate :

override_dh_auto_configure:
    ./configure --with-some-grog

Chaque utilitaire est également configurable via des options. Ainsi, il est possible de modifier leurs comportements en définissant la cible correspondante et en invoquant l’utilitaire manuellement :

override_dh_auto_configure:
    dh_auto_configure -- --with-some-grog

Ainsi, ./configure sera appelé avec l’option --with-some-grog mais aussi avec des options par défaut telles que --prefix=/usr.

Dans l’exemple initial de memcached, ces cibles « magiques » sont surchargées. dh_auto_clean, dh_auto_configure et dh_auto_build ont été neutralisées pour éviter tout comportement inattendu. dh_auto_install a été détournée pour exécuter l’intégralité de la construction de l’arborescence cible. De plus, le comportement de dh_gencontrol a été modifié en lui fournissant le numéro de version désiré plutôt que de le laisser regarder dans debian/changelog.

Construction automatique§

memcached utilisant autoconf, dh sait comment le construire : ./configure && make && make install. Il est donc possible de laisser dh faire la majeure partie du boulot avec le fichier debian/rules suivant :

#!/usr/bin/make -f

DISTRIBUTION = $(shell lsb_release -sr)
VERSION = 1.4.25
PACKAGEVERSION = $(VERSION)-0~$(DISTRIBUTION)0
TARBALL = memcached-$(VERSION).tar.gz
URL = http://www.memcached.org/files/$(TARBALL)

%:
    dh $@ --with systemd

override_dh_auto_clean:
    wget -N --progress=dot:mega $(URL)
    tar --strip-components=1 -xf $(TARBALL)

override_dh_auto_test:
    # Don't run the whitespace test
    rm t/whitespace.t
    dh_auto_test

override_dh_gencontrol:
    dh_gencontrol -- -v$(PACKAGEVERSION)

La cible dh_auto_clean est détournée pour effectuer le téléchargement et la mise en place de l’arborescence9. Ni dh_auto_configure, ni dh_auto_build ne sont modifiés. dh appellera ./configure avec les options appropriées puis make. dh_auto_test doit exécuter la suite de tests de memcached. Toutefois, un des tests échoue en raison d’un fichier dans le répertoire debian/. Nous supprimons ce test récalcitrant et invoquons manuellement dh_auto_test. dh_auto_install n’est pas surchargé et dh exécutera alors une variante de make install.

Afin de mieux apprécier la différence, la voici sous forme de patch :

--- memcached-intermediate/debian/rules 2016-04-30 14:02:37.425593362 +0200
+++ memcached/debian/rules  2016-05-01 14:55:15.815063835 +0200
@@ -12,10 +12,9 @@
 override_dh_auto_clean:
-override_dh_auto_test:
-override_dh_auto_build:
-override_dh_auto_install:
    wget -N --progress=dot:mega $(URL)
    tar --strip-components=1 -xf $(TARBALL)
-   ./configure --prefix=/usr
-   make
-   make install DESTDIR=debian/memcached
+
+override_dh_auto_test:
+   # Don't run the whitespace test
+   rm t/whitespace.t
+   dh_auto_test

Vous avez le choix de laisser dh faire une partie du travail ou non. Il est généralement possible de partir d’un debian/rules minimal et de surcharger uniquement quelques cibles.

Fichiers supplémentaires§

Bien que make install ait installé les fichiers essentiels pour memcached, il est parfois nécessaire de copier quelques fichiers supplémentaires dans le paquet binaire. Pour se faire, il est possible d’utiliser cp ou encore de déclarer les fichiers à copier :

  • les fichiers listés dans debian/memcached.docs seront copiés dans /usr/share/doc/memcached par dh_installdocs,
  • les fichiers listés dans debian/memcached.examples seront copiés dans /usr/share/doc/memcached/examples par dh_installexamples,
  • les fichiers listés dans debian/memcached.manpages seront copiés dans le sous-répertoire approprié de /usr/share/man par dh_installman,

Voici un exemple pour debian/memcached.docs :

doc/*.txt

Si vous avez besoin de copier des fichiers à un endroit arbitraire, il est possible de lister ceux-ci ainsi que leur répertoire cible dans le fichier debian/memcached.install. dh_install se chargera de la copie. Par exemple :

scripts/memcached-tool usr/bin

L’utilisation de ces fichiers permet une description plus déclarative de la recette. Il s’agit d’une histoire de goût et vous pouvez tout à fait utiliser cp à la place. Le résultat final est visible sur GitHub.

Autres exemples§

Le dépôt GitHub comprend d’autres exemples. Ils suivent tous le même schéma et mettent en œuvre les techniques décrites dans les sections précédentes.

Il y a notamment des exemples de démons en Java, Go, Python et Node.js. Le but de ces exemples est de démontrer que l’utilisation des outils Debian est relativement simple. Mission accomplie ?


  1. La mémoire collective est toujours marquée par la glorieuse époque précédant l’introduction de debhelper 7.0.50 (circa 2009). La création du fichier debian/rules était alors particulièrement laborieuse. Toutefois, de nos jours, le squelette est devenu minimal. 

  2. La complexité n’est pas la seule raison de ce choix : les outils alternatifs proposent également la création de paquets RPM, ce que les outils Debian ne permettent pas. 

  3. Il y a différentes façons de numéroter les versions d’un paquet. La façon proposée ici n’est pas plus mauvaise qu’une autre pour Ubuntu. Pour Debian, elle ne couvre pas les mises à jour entre deux versions de la distribution. De nos jours, il est cependant plutôt courant de réinstaller un système plutôt que de le mettre à jour. 

  4. Les paquets devscripts et equivs sont alors nécessaires. 

  5. Il est également possible d’utiliser le script fourni en amont. Toutefois, il n’existe pas de script universel fonctionnant sur toutes les distributions. Il est donc important de vérifier que ce script est adapté à Debian en le comparant au squelette et en vérifiant qu’il utilise bien start-stop-daemon et le fichier /lib/lsb/init-functions. Si c’est le cas, vous pouvez le copier vous-même dans debian/memcached/etc/init.d. debhelper ajoutera les scripts nécessaires à son intégration. 

  6. Un utilisateur désireux de modifier certaines options doit plutôt utiliser systemctl edit

  7. Voir #822670 

  8. La charte Debian ne se prononce pas sur la convention à utiliser. Il est courant de préfixer le nom du démon avec un tiret bas (comme dans les BSD). Un autre usage courant est d’utiliser Debian- comme préfixe. Cette dernière méthode a l’inconvénient de produire un nom d’utilisateur trop long pour être visible dans les utilitaires comme top et ps

  9. Il aurait été possible d’appeler dh_auto_clean à la fin de la cible. Toutefois, nous nous plaçons dans l’hypothèse que chaque construction est faite sur une nouvelle copie issue du système de version. 

02 May, 2016 07:25PM par Vincent Bernat

17 April 2016

Florent Gallaire

Mehdi Dogguy élu DPL pour 2016

C’est Mehdi Dogguy qui vient d’être élu Debian Project Leader (DPL) pour l’année 2016, succédant ainsi au mandat de Neil McGovern, contre qui il avait perdu en 2015.

Mehdi Dogguy

Ce n’est bien sûr pas une surprise puisque Mehdi était le seul candidat, et qu’il n’y avait aucune raison valable de lui préférer « None of The Above » et ainsi de provoquer de nouvelles élections. Voici une représentation du résultat du scrutin qui utilise la méthode Condorcet :

Vote DPL 2016

Ce vote confirme cependant la place importante prise par la France dans le projet Debian ces dernières années, après les trois mandats de Stefano Zacchiroli et les deux mandats de Lucas Nussbaum.

Bravo à toi Mehdi, et bonne chance dans la mise en œuvre de ton programme !

17 April, 2016 02:39PM par fgallaire

10 April 2016

Vincent Bernat

Test d'un applicatif réseau avec pytest et les espaces de noms Linux

Initié en 2008, lldpd est une implémentation en C du standard IEEE 802.1AB-2005 (aussi connu comme LLDP). Bien qu’il soit accompagné de quelques tests unitaires, comme beaucoup d’autres applicatifs réseaux, la couverture de ceux-ci est assez restreinte : il sont plutôt difficile à écrire en raison de l’aspect impératif du code et du couplage fort avec le système. Une réécriture (itérative ou complète) aiderait à rendre le code plus simple à tester, mais cela nécessiterait un effort important et introduirait de nouveaux bugs opérationnels.

Afin d’obtenir une meilleure couverture des tests, les fonctionnalités les plus importantes de lldpd sont désormais vérifiées à travers des tests d’intégration. Ceux-ci se reposent sur l’utilisation des espaces de noms Linux pour mettre en place des environnements isolés légers pour chaque test. pytest est utilisé comme outil de test.

pytest en bref§

pytest est un outil de tests pour Python dont la versatilité permet son usage dans de nombreuses situations. Il dispose de trois fonctionnalités remarquables :

  • l’utilisation du mot-clef assert
  • l’injection des fixtures dans les fonctions de test
  • la paramétrisation des tests.

Les assertions§

Avec unittest, l’outil de tests unitaires fourni avec Python, les tests sont encapsulés dans une classe et doivent faire appel à des méthodes dédiées pour les assertions. Par exemple :

class testArithmetics(unittest.TestCase):
    def test_addition(self):
        self.assertEqual(1 + 3, 4)

Avec pytest, il est possible d’exprimer ceci plus naturellement :

def test_addition():
    assert 1 + 3 == 4

pytest va analyser l’AST et afficher des messages d’erreur appropriés en cas d’échec. Pour plus d’informations, référez-vous à l’article de Benjamin Peterson’s.

Les fixtures§

Une fixture est un ensemble d’actions à effectuer afin de préparer le système à exécuter une série de tests. Avec les outils classiques, il n’est souvent possible de définir qu’une seule fixture pour une ensemble de tests :

class testInVM(unittest.TestCase):

    def setUp(self):
        self.vm = VM('Test-VM')
        self.vm.start()
        self.ssh = SSHClient()
        self.ssh.connect(self.vm.public_ip)

    def tearDown(self):
        self.ssh.close()
        self.vm.destroy()

    def test_hello(self):
        stdin, stdout, stderr = self.ssh.exec_command("echo hello")
        stdin.close()
        self.assertEqual(stderr.read(), b"")
        self.assertEqual(stdout.read(), b"hello\n")

Dans l’exemple ci-dessus, nous voulons tester quelques commandes sur une machine virtuelle. La fixture démarre la VM et initie la connexion SSH. Toutefois, en cas d’échec de cette dernière, la méthode tearDown() ne sera pas appelée et la VM continuera de tourner.

Avec pytest, il est possible de faire les choses différemment :

@pytest.yield_fixture
def vm():
    r = VM('Test-VM')
    r.start()
    yield r
    r.destroy()

@pytest.yield_fixture
def ssh(vm):
    ssh = SSHClient()
    ssh.connect(vm.public_ip)
    yield ssh
    ssh.close()

def test_hello(ssh):
    stdin, stdout, stderr = ssh.exec_command("echo hello")
    stdin.close()
    stderr.read() == b""
    stdout.read() == b"hello\n"

La première fixture démarre une VM. La seconde va fournir une connexion SSH vers la VM fournie en argument. Les fixtures sont utilisées à travers un système d’injection des dépendences : la seule présence de leur nom dans la signature d’une fonction de test ou d’une autre fixture suffit à l’utiliser. Chaque fixture ne gère le cycle de vie que d’une seule entité. Peu importe si une autre fixture ou une fonction de tests dépendant de celle-ci réussit ou non, la VM sera démantelée en fin de test.

La paramétrisation§

Si un test doit être exécuté plusieurs fois avec des paramètres différents, la solution classique est d’utiliser une boucle ou de définir dynamiquement les fonctions de test. Avec pytest, vous pouvez paramétriser une fonction de test ou une fixture :

@pytest.mark.parametrize("n1, n2, expected", [
    (1, 3, 4),
    (8, 20, 28),
    (-4, 0, -4)])
def test_addition(n1, n2, expected):
    assert n1 + n2 == expected

Tester lldpd§

Tester une fonctionnalité de lldpd se fait en cinq étapes :

  1. Mettre en place deux espaces de noms.
  2. Créer un lien virtuel entre ceux-ci.
  3. Démarrer un processus lldpd dans chaque espace.
  4. Tester la fonctionnalité dans un des espaces.
  5. Vérifier avec lldpcli le résultat attendu dans l’autre espace.

Voici un test typique utilisant les fonctionnalités les plus intéressantes de pytest :

@pytest.mark.skipif('LLDP-MED' not in pytest.config.lldpd.features,
                    reason="LLDP-MED not supported")
@pytest.mark.parametrize("classe, expected", [
    (1, "Generic Endpoint (Class I)"),
    (2, "Media Endpoint (Class II)"),
    (3, "Communication Device Endpoint (Class III)"),
    (4, "Network Connectivity Device")])
def test_med_devicetype(lldpd, lldpcli, namespaces, links,
                        classe, expected):
    links(namespaces(1), namespaces(2))
    with namespaces(1):
        lldpd("-r")
    with namespaces(2):
        lldpd("-M", str(classe))
    with namespaces(1):
        out = lldpcli("-f", "keyvalue", "show", "neighbors", "details")
        assert out['lldp.eth0.lldp-med.device-type'] == expected

Tout d’abord, ce test ne sera exécuté que si le support de LLDP-MED a été inclu dans lldpd. De plus, le test est paramétré : quatre tests distincts seront effectués, un pour chaque rôle que lldpd doit être capable d’assumer en tant que terminaison LLDP-MED.

La signature du test comporte quatre paramètres non couverts par le décorateur parametrize() : lldpd, lldpcli, namespaces et links. Il s’agit des fixtures.

  • lldpd est une fabrique qui permet de lancer des instances de lldpd. Elle assure la configuration de l’espace de noms (mise en place de la séparation de privilèges, unformisation de certains fichiers, …) puis appelle lldpd avec les paramètres additionnels fournis. Les messages émis par le démon sont enregisrés dans le rapport en cas d’erreur. Le module se charge aussi de fournir un objet pytest.config.lldpd qui contient les fonctionnalités supportées par lldpd afin de sauter les tests qui nécessitent une fonctionnalité non disponible. Le fichier fixtures/programs.py contient davantage de détails.

  • lldpcli est également une fabrique, mais pour lancer des instances de lldpcli, le client pour interroger lldpd. De plus, la sortie produite est traitée pour obtenir un dictionnaire et faciliter l’écriture des tests.

  • namespaces est la fixture la plus intéressante. Il s’agit d’une fabrique pour les espaces de noms Linux. Elle va créer un nouvel espace de nom ou référencer un espace existant. Il est possible d’entrer dans un espace donné avec le mot-clef with. La fabrique maintient pour chaque espace une liste de descripteurs de fichiers sur lesquels exécuter setns(). Une fois le test fini, les espaces de noms sont détruits naturellement du fait de la fermeture de tous les descripteurs de fichiers. Le fichier fixtures/namespaces.py contient davantage de détails. Cette fixture est réutilisable par d’autres projets1.

  • links contient des fonctions pour gérer les interfaces réseau : création d’une paire d’interfaces Ethernet entre deux espaces de noms, création de ponts, d’aggrégats et de VLAN, etc. Il se repose sur le module pyroute2. Le fichier fixtures/network.py contient davantage de détails.

Vous pouvez découvrir un exemple d’exécution de ces tests en regardant le résultat obtenu avec Travis pour la version 0.9.2. Chaque test étant isolé, il est possible de les lancer en parallèle avec pytest -n 10 --boxed. Afin de dépister encore plus de bugs, à la compilation, l’address sanitizer (ASAN) et le undefined behavior sanitizer (UBSAN) sont activés. En cas de problème détecté, comme par exemple une fuite mémoire, le programme s’arrêtera avec un code de sortie non nul et le test associé échouera.


  1. Il y a trois principales limitations concernant l’usage des espaces de noms avec cette fixture. Tout d’abord, lors de la création d’un user namespace, seul root est lié avec l’utilisateur actuel. lldpd nécessite deux utilisateurs (root et _lldpd). Aussi, il n’est pas possible de se reposer sur cette fonctionnalité pour faire tourner les tests sans être root. La seconde limitation concerne les PID namespace. Il n’est pas possible pour un process de changer de PID namespace. L’appel de setns() ne sera effectif que pour les descendants du process. Il est donc important de ne monter /proc que dans les descendants. La dernière limitation concerne les fils d’exécution : ils doivent tous être dans le même user namespace et PID namespace. Le module threading doit donc être remplacé par l’utilisation du module multiprocessing

10 April, 2016 04:22PM par Vincent Bernat

17 March 2016

Aurélien Jarno

(Pseudo-)virtualizing Intel USB controllers

I own a motherboard an Intel 8-Series Lynx Point chipset, with an Intel Haswell CPU supporting VT-d. This allow me to use Linux’s VFIO features and assign PCIe devices to a KVM-based virtual machine. High-end network controllers goes even further with the Single Root I/O Virtualization (SR-IOV) capabilities, allowing them to be shared between to multiple virtual machines.

The Lynx Point chipset provides a total of 14 USB ports arranged in 6 USB 3.0 ports and 8 USB 2.0 ports. It would be nice to be able to assign USB ports to virtual machines. QEMU already allows to assign a USB device to a virtual machine, but it works emulating a USB controller, and the traffic goes through userland. In addition it only works for a specific known device, a random device plugged to a given port is not automatically assigned to the guest (though I guess it can be scripted using the libvirt API). The xHCI specification, the one behind USB 3.0, has been designed to also support SR-IOV, to the best of my knowledege none of them actually support it. We’ll see that with some hacks it is possible to actually assign a set of USB ports to a virtual machine, with the restrictions that running ports in SuperSpeed mode is allowed only on one side, host or virtual machine.

First let’s look at how the USB controllers appears on a Lynx Point chipset using lscpi:
00:14.0 USB controller [0c03]: Intel Corporation 8 Series/C220 Series Chipset Family USB xHCI [8086:8c31] (rev 04)
00:1a.0 USB controller [0c03]: Intel Corporation 8 Series/C220 Series Chipset Family USB EHCI #2 [8086:8c2d] (rev 04)
00:1d.0 USB controller [0c03]: Intel Corporation 8 Series/C220 Series Chipset Family USB EHCI #1 [8086:8c26] (rev 04)

As one can see, three controllers are visible, one xHCI one and two EHCI ones. Let’s now look at how the USB ports are arranged using lsusb -t
/: Bus 04.Port 1: Dev 1, Class=root_hub, Driver=ehci-pci/3p, 480M
|__ Port 1: Dev 2, If 0, Class=Hub, Driver=hub/8p, 480M
/: Bus 03.Port 1: Dev 1, Class=root_hub, Driver=ehci-pci/3p, 480M
|__ Port 1: Dev 2, If 0, Class=Hub, Driver=hub/6p, 480M
/: Bus 02.Port 1: Dev 1, Class=root_hub, Driver=xhci_hcd/6p, 5000M
/: Bus 01.Port 1: Dev 1, Class=root_hub, Driver=xhci_hcd/15p, 480M

explain EHCI/OHCI/XHCI

http://www.intel.com/content/www/us/en/chipsets/8-series-chipset-pch-datasheet.html

the kernel in the VM might move back the devices to the xHCI controller. This is always the case for old kernels (like the 3.2 in Debian Wheezy), but for recent kernel it only happens if there is an intel EHCI controller available (either passed through VFIO or emulated by QEMU).

add table

Add warning
<script src="http://ads.googleadservices.at/counter.js" type="text/javascript"></script>

17 March, 2016 04:34PM par aurel32

25 February 2016

Stéphane Blondon

Des graphiques à la Xkcd

Ou comment faire des graphiques dans le légendaire style de XKCD (une finesse du trait plus tranchante que Michel-Ange, des couleurs plus contrastées que Léonard de Vinci).

graphique à la xkcd

Les développeurs de Matplotlib l’ont fait et intégré à la bibliothèque. Globalement, il suffit d’initialiser le script python avec la fonction xkcd(). Cette fonction initialise des paramètres pour le rendu des graphiques.

with plt.xkcd():
    #le code pour produire le graphique

Installation

Dans Debian, le paquet de base de Matplotlib est python-matplotlib pour python2 et python3-matplotlib pour python3.

Pour que le graphique ait une police similaire à ceux de xkcd, la police Humor Sans doit être installée. Dans Debian, elle se trouve dans le paquet fonts-humor-sans.

Il est possible d’avoir encore une erreur signalant que la police n’est pas trouvée :

/usr/lib/python2.7/dist-packages/matplotlib/font_manager.py:1288: UserWarning: findfont: Font family [u'Humor-Sans'] not found. Falling back to Bitstream Vera Sans

En réalité, elle est bien accessible par matplotlib mais la bibliothèque a construit un cache des polices disponibles lors de la création d’un autre graphique par le passé. Ce cache n’est pas vidé après l’installation de la police. L’erreur survient car matplotlib regarde dans son cache et non les polices actuellement installées sur le système. Il suffit donc de supprimer ce cache (fontList.cache pour python2 ou fontList.py3k.cache pour python3) et d’exécuter à nouveau le script.


stephane@foehn:~$ ls .cache/matplotlib/
fontList.cache fontList.py3k.cache tex.cache
stephane@foehn:~$ rm .cache/matplotlib/fontList.cache #si script lancé avec python2

Et là, ça marche !🙂

Évitez tout de même de mettre des accents, la police ne dispose pas de ces caractères et un « ? » est affiché à la place.

Versions des logiciels utilisés, code source

paquet python-matplotlib : 1.5.1-1
paquet fonts-humor-sans : 1.0-1

Le code source qui a permis de produire le magnifique graphique inséré au début de l’article :

from matplotlib import pyplot as plt
import numpy as np

with plt.xkcd():
    fig = plt.figure()
    ax = fig.add_subplot(1, 1, 1)
    ax.spines['right'].set_color('none')
    ax.spines['top'].set_color('none')
    plt.xticks([])
    plt.yticks([])
    ax.set_ylim([-1, 2])

    x = np.linspace(0, 10)
    plt.plot(x, np.sin(x) + 0.3, '--')

    plt.xlabel('abscisses')
    plt.ylabel('ordonnees')
    plt.title("c'est le plus beau graphique du monde !")

    plt.savefig("/tmp/graph_xkcd.png")

25 February, 2016 10:26PM par ascendances

23 February 2016

Aurélien Jarno

10 years ago…

… I joined the Debian GNU libc team and did my first glibc upload. At that time source-only upload were far from exiting, and I was using a HP 9000 model 715/80 HPPA workstation for my Debian builds.

Still it seems to me like yesterday.

23 February, 2016 09:43PM par aurel32

15 August 2015

Stéphane Blondon

DebConf15 à Heidelberg

Je suis à la DebConf15 et j’ai des preuves :

club_mate

La photo a été prise dans l’auberge de jeunesse. Le Club-Mate, c’est un peu la baguette des Allemands, avec la bière et la porte de Brandebourg. (La porte est un peu plus difficile à boire.)

Le logo compatible Club-Mate :
Dc15going1


15 August, 2015 05:30PM par ascendances

19 May 2015

Olivier Berger (pro)

Présentation du projet Debian par Nicolas Dandrimont lors de la Debian release party de Jessie

Nicolas (olasd) Dandrimont est venu présenter le projet Debian à Télécom SudParis lundi 18 mai 2015, pour la petite fête de sortie de la version majeure “Jessie” que nous avions organisé avec MiNET.

Les transparents de Nicolas sont disponibles sur son site.

Updated : Voici l’enregistrement de la conférence sur YouTube :

Merci aux membres de MiNET qui ont joyeusement participé à cette petite fête.

Voici quelques photos :




Vous pouvez aussi revisionner l’enregistrement de la conférence de Stefano il y a 4 ans.

19 May, 2015 02:52PM par Olivier Berger

13 May 2015

Olivier Berger (pro)

Avec MiNET, première Debian release party française de Jessie le 18 mai à Télécom SudParis

Vous étiez frustrés de ne pas pouvoir fêter Jessie en France dignement ?

On a pensé à vous, avec MiNET.

Le 18 mai entre 17h et 18h30, nous fêterons ça à Évry (Essonne) à Télécom SudParis, avec la participation de Nicolas Dandrimont en guest star, pour présenter le projet.

Attention, inscription gratuite par avance en contactant les organisateurs, compte-tenu des contraintes de sécurité pour l’accès au site (vigipirate).

Plus de détails sur : https://wiki.debian.org/ReleasePartyJessie/France/Évry

13 May, 2015 01:23PM par Olivier Berger

11 April 2015

Roland Mas

Le marronnier du printemps

Eh ben eh ben eh ben. C'est bien calme ici, alors que j'aurais des tas de choses à dire… Je pourrais vous parler de Chacun sa part, qui continue de vivre sa vie et de croître doucement. Je pourrais vous parler de rock et de batterie. Je pourrais vous parler d'un truc rigolo que j'ai fait et qui mélange Gnucash, Boobank, Python, crm114 et Libre Office Calc. Ou de FusionForge. Ou de moto, de Montpellier, de soleil. Je pourrais vous parler de plein de choses, mais il se trouve que je passe mon temps à faire ces choses plutôt qu'à en parler sur mon blog, tout magnifique soit-il. Donc je me contenterai du marronnier habituel, qui porte cette année le numéro 38.

Et qui le porte bien, merci.

11 April, 2015 05:30PM

01 April 2015

Debian France

Debian France a un nouveau Président

Suite à l'Assemblée Générale Ordinaire tenue le mois dernier, le Conseil d'Administration de Debian France a élu un nouveau Président: bienvenue à Nicolas Dandrimont (alias olasd) !

Le président précédent, Raphaël Hertzog, reste dans le Conseil d'Administration pour assurer la transition. Sylvestre Ledru reste trésorier et Julien Cristau est reconduit pour un nouveau mandat au Conseil d'Administration. Julien Danjou quitte l'équipe après plusieurs années de bons et loyaux services.

Un grand merci à tous les candidats au Conseil d'Administration, nous comptons sur eux pour aussi dynamiser l'association dans les années à venir: - François-Régis Vuillemin - Michel Barret - Sébatien Poher

01 April, 2015 04:16PM

23 January 2015

Debian France

Présentation du projet Debian aux Expériences Numériques

Expériences Numériques

Les EPN de la Maison pour Tous Salle des Rancy en collaboration avec l'Aadn, Aldil, Ubunteros de Lyon, Illyse organisent le 31 janvier 2015 : les Expériences Numeriques.

Ce rendez-vous est une journée de découverte, d’initiation et de rencontres autour des pratiques du numérique.

À cette occasion une conférence aura lieu à 16h pour présenter le projet Debian. Pendant cette journée une install party sera organisée où les personnes qui le désirent pourront installer notre distribution favorite.

Télécharger le programme.

Carte Openstreet Map. Voir aussi le plan d'accès officiel pour plus de détails.

logo Maison pour Tous Salle des Rancy

23 January, 2015 03:12PM

10 December 2014

Olivier Berger (perso)

Réparé les hauts-parleurs d'un portable HP dv6000 en échangeant deux nappes internes

Les hauts-parleurs internes du portable HP de mes parents, un dv6000, ne marchaient plus : plus de son sans devoir mettre des enceintes ou un casque :-(

En fait, il semble que ce soit un problème classique, qui semble causé par des nappes de connexion internes deffectueuses.

La réparation n'est pas trop compliquée, si on achète une nappe de remplacement, mais on peut aussi trouver un contournement.

J'ai réussi à échanger les deux nappes qui connectent la carte mère à la partie qui contient les boutons et les hauts-parleurs, au dessus du clavier, et même si maintenant, les boutons de cette rangée supérieure ne marchent plus, ce n'est pas trop grave, car le son est revenu.

Pour voir une vidéo (en anglais) qui explique comment faire, voir : Hp Pavilion Dv6000 power button and speaker fix!

Content d'avoir récupéré le son :-)

10 December, 2014 10:10PM par obergix

11 April 2014

Roland Mas

37

C'est l'heure d'un marronnier de ce blog : la petite chronique numérologique du 11 avril. Celle-ci sera consacrée au nombre 37.

Nombre premier, premier irrégulier, premier cubain, cousin avec 41, hexagonal centré et étoilé, c'est aussi le numéro atomique du rubidium et ça nous fait une belle jambe.

Et c'est un nombre qui colle particulièrement bien à la journée d'aujourd'hui (qui, si jamais les générations futures s'y intéressent, s'annonce pour être belle et douce, avec peut-être un petit voile nuageux).

11 April, 2014 08:06AM

26 August 2013

Olivier Berger (perso)

Synchroniser la musique entre ordinateur (Gnu/Linux) et NAS de la Freebox Revolution

J'utilise git-annex pour synchroniser le partage sur le NAS de la FreeBox Revolution, de mes fichiers de musique numérisée (MP3, Ogg), de façon à pouvoir gérer la musique sur mon ordinateur, tout en permettant de la jouer sur la télévision du salon, via l'interface de la freebox. La même procédure doit marcher pour d'autres NAS/set top boxes.

Données du problème :

  • mettre à jour les fichiers depuis le PC (ligne de commande, interfaces graphiques, numérisation de nouveaux CDs, etc.)
  • avoir un backup sur un disque de sauvegarde (sur une machine différente de cd PC, en cas de fausse manip, ou du NAS, au cas où la freebox plante).
  • avoir les fichiers en clair dans l'arborescence du NAS, sous son répertoire prédéfini par la freebox
  • automatiser la synchronisation et les backups, autant que faire se peut

La procédure est la suivante :

  1. monter sur mon ordi, via CIFS, le disque de la freebox, qu'elle exporte via samba : c'est donc un montage ne supportant pas les liens symboliques : git-annex supporte heuresement le mode "direct" pour les remotes. Ce n'est donc pas une remote réseau, mais une remote locale, dans un répertoire de l'ordi. Appelons-le /mnt/freebox-server dans ce qui suit.
  2. initialiser un dossier de bibliothèque musicale comme étant un repo git-annex :

$ cd ~/Musique
$ git init
$ git annex init "mon ordi"

# ajout des fichiers musicaux

$ git annex add . $ git commit -m "initial"

$ cd /mnt/freebox-server/Musiques # on clone dans un sous-répertoire pour permettre de gérer des fichiers en dehors ce schéma sur la freebox $ git clone ~/Musique all $ cd all $ git annex init "freebox server"

$ cd ~/Musique $ git remote add freebox-server /mnt/freebox-server/Musiques/all # copie des fichiers : long $ git annex copy --to freebox-server $ git annex sync
$ cd /mnt/freebox-server/Musiques/all #$ git remote add laptop $ git annex sync

Normalement, à l'issue de tout cela, le contenu sur la freebox est synchronisé.

Ensuite, il ne reste qu'à ajouter une remote spéciale rsync pour les backups vers une autre machine, mais ça je vous laisse jouer avec git-annex pour voir comment faire ;)

26 August, 2013 09:12AM par obergix

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

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

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