September 23, 2018

hackergotchi for Charles Plessy

Charles Plessy

J'ai déménagé à Okinawa !

J'ai déménagé avec ma famille à Okinawa depuis août, dans le quartier d'Akano, ville d'Uruma. Nous sommes arrivés à temps pour vois plusieurs eisaa, des danses traditionnelles faisant usage d'un grand nombre de tambours, ayant souvent lieu vers la fin de mois d'août. Chaque quartier a sa propre troupe et nous espérons pouvoir nous y joindre pour l'année prochaine.

Nous habitons dans un immeuble avec une connexion en fibre optique partagée. Bon ping vers la métropole, mais le débit pour les gros téléchargements est catastrophique le soir quand toutes les familles sont connectées en même temps. Impossible de réussir un simple sbuild-update -dragu unstable, alors je n'ai malheureusement pas réussi à contribuer qui que ce soit à Debian. C'est frustrant mais il y a peut-être des solutions à chercher du côté de notre forge GitLab.

Côté travail, j'ai rejoint l'université Okinawa Institute of Science and Technology OIST. C'est un endroit formidable, ouvert au public même le week-end (notez les horaires du café). Si vous venez le visiter, faites-moi signe !

23 September, 2018 12:33PM

August 22, 2018

Imprimer avec Brother sur Debian

J'ai tourné en rond pendant plus d'une heure, avant de finir par comprendre qu'il faut aussi installer le paquet lib32stdc++6 quand on utilise les pilotes Brother (imprimante HL-L2365DW) sur un système amd64, puisqu'ils sont fournis sous la forme de paquets i386. Pourtant il y a plus d'une piste dans les instructions en ligne. Le plus difficile était que sans lib32stdc++6, tout semble se passer parfaitement sauf que rien ne sort de l'imprimante.

22 August, 2018 12:41PM

July 09, 2018

Debconf cette année, c'est râpé.

Je me réjouissais de la tenue de la 18ème conférence Debian à Taiwan, pour la première fois en Asie, en espérant y participer pour la première fois aussi et profiter de l'absence de décalage horaire, mais voilà, je vais déménager au même moment, à Okinawa, le premier août.

Ce déménagement me donne de la joie pour ce que je vais rejoindre mais aussi de la mélancolie pour ce et ceux que nous allons quitter. Mais il y a des vols très bon marché pour Tôkyô et Yokohama...

Spéciale dédicace pour le cercle d'étude Debian de Tôkyô, où ma première clé GPG a été signée par des développeurs Debian il y a fort longtemps.

09 July, 2018 08:35PM

June 01, 2018

Stéphane Blondon

Installer Matomo sur Debian 9

Imaginons qu’Airgan, une plateforme communautaire payante de location et de réservation d’organes, veuille améliorer le suivi des visites sur son site web. Matomo est une réponse possible à ce besoin.

Matomo, anciennement Piwik, est un service web pour collecter des statistiques de visites. L’entreprise propose une version libre, auto-hébergeable et une version hébergée uniquement par Matomo qui inclut des fonctions non disponibles dans la version libre.

Matomo fournit un fichier .deb, permettant d’installer le service facilement sur une machine Debian. Cet article présente quelques éléments à prendre en compte.

Le changement de nom de Piwik à Matomo date de Janvier 2018. Tout n’a pas été transféré et la documentation ou les variables laissent parfois encore apparaître l’ancien nom.

Installation du paquet piwik

Le paquet n’est pas inclus dans la distribution mais est fourni dans un dépôt tiers géré par Matomo.
La documentation pour installer le paquet fourni par Matomo est disponible à http://debian.piwik.org/. Il suffit de la suivre.

Installation du paquet php-mbstring

Le fonctionnement du service nécessite que le paquet php-mbstring soit installé. Si ce n’est pas le cas, une erreur lors de la configuration de Matomo (dans quelques étapes, patientez !) sera affichée :

Capture d'écran de l'erreur

Une pull-request sur Github a été faite pour ajouter php-mbstring aux dépendances. Cette étape ne sera peut-être plus nécessaire dans la prochaine version ?

Configuration du service web

Le paquet ne dépend pas d’un serveur web en particulier. Le code d’example suivant suppose que c’est Apache2 qui est installé. N’importe quel autre serveur web fonctionnerait aussi.

<VirtualHost 19.84.19.84:80>
    ServerName matomo.airgan.tld

    # ce sera bien pratique quand on aura des problèmes
    ErrorLog /srv/airgan/logs/matomo-http-error.log
    CustomLog /srv/airgan/logs/matomo-http-access.log combined
    LogLevel info

    # les deux lignes importantes
    DocumentRoot /usr/share/piwik
    DirectoryIndex index.php
</VirtualHost>

Ensuite, il faut activer le virtualhost :
sudo a2ensite matomo.conf
sudo systemctl reload apache2

Ajouter un utilisateur pour la base de données

Un serveur de base de données MySQL ou MariaDB doit être installé. Ensuite, il faut se connecter sur ce serveur pour créer un utilisateur qui pourra créer la base de données et les tables nécessaires lors de la configuration de Matomo (c’est juste après cette étape, vous avez bien fait de patienter !).

#Créer un utilisateur nommé matomo :
CREATE USER matomo@'localhost';
SET PASSWORD FOR matomo@'localhost' = PASSWORD('secret');
#Lui donner les droits pour créer la base de données nécessaire au service :
GRANT CREATE, ALTER, SELECT, INSERT, UPDATE, DELETE, DROP, CREATE TEMPORARY TABLES on *.* to matomo@'localhost';

Configurer le service Matomo

Avec un navigateur web, allez sur le domaine paramétré dans la configuration du serveur web (matomo.airgan.tld dans notre exemple). Il suffit de suivre les étapes de l’interface pour finir l’installation. Elle correspond à l’étape « The 5-minute Matomo Installation » sur https://matomo.org/docs/installation/.

Une fois cette étape terminée, l’installtion est terminée et aller sur le domaine permet de voir l’interface de connexion pour accéder aux statistiques de visite.

Versions utilisées

L’installation ayant servie à écrire l’article a été faite sur
Debian GNU/Linux 9.3 (stretch) avec les versions suivantes des paquets :

apache2
2.4.25-3+deb9u4
mariadb-server
10.1.26-0+deb9u1
piwik
3.2.1-1

Dans le futur, il est possible que la livraison des organes se fasse à vélo. À étudier dans un prochain business plan.

01 June, 2018 03:51PM by ascendances

May 23, 2018

hackergotchi for Vincent Bernat

Vincent Bernat

Répartiteur de charge à multiples niveaux avec Linux

Une solution courante pour fournir un service hautement disponible et évolutif consiste à insérer une couche d’équilibrage de charge pour répartir les requêtes des utilisateurs vers les serveurs frontaux1. Nous avons habituellement plusieurs attentes à l’égard d’une telle couche :

évolutivité
Elle permet à un service de monter en charge en poussant le trafic vers des serveurs nouvellement provisionnés. Elle est également capable de s’étendre si elle devient le goulot d’étranglement.
disponibilité
Elle fournit la haute disponibilité au service. Si un serveur devient indisponible, le trafic est rapidement redirigé vers un autre serveur. Elle doit également être elle-même hautement disponible.
flexibilité
Elle gère aussi bien les connexions de courtes et de longues durées. Elle est suffisamment flexible pour offrir toutes les fonctionnalités généralement attendues d’un répartiteur de charge comme TLS ou le routage HTTP.
opérabilité
Avec un peu de coopération, tout changement prévu est transparent : mise à niveau des frontaux, ajout ou suppression de frontaux ou changement de topologie de la couche de répartition elle-même.

Le problème et ses solutions sont bien connus. Parmi les articles récemment parus sur le sujet, « Introduction to modern network load-balancing and proxying » donne un aperçu de l’état de l’art. Google a publié « Maglev: A Fast and Reliable Software Network Load Balancer » décrivant en détail leur solution interne2. Cependant, le logiciel associé n’est pas disponible. Fondamentalement, la construction d’une solution d’équilibrage de charge consiste à assembler trois composants :

  • routage ECMP
  • répartition L4 (sans état)
  • répartition L7 (avec état)

Dans cet article, je décris une solution à multiples niveaux utilisant Linux et des composants open-source. Cela offre une base pour construire une couche d’équilibrage de charge prête à la production.

Mise à jour (05.2018)

Facebook vient de publier Katran, un répartiteur de charge L4 utilisant XDP et eBPF ainsi que du hachage cohérent. Il pourrait s’insérer dans la configuration décrite ci-dessous.

Update (08.2018)

GitHub vient de publier GLB Director, un répartiteur de charge L4 avec un algorithme de hachage sélectionnant un couple de répartiteurs L7. À l’aide d’un module Netfilter, le premier membre redirige le flux vers le second lorsqu’il ne trouve pas d’entrée correspondante dans sa table de connexions.

Dernier niveau : répartition L7⚓︎

Commençons par le dernier niveau. Son rôle est de fournir la haute disponibilité, en transférant les requêtes vers les frontaux sains, ainsi que l’évolutivité, en répartissant équitablement les requêtes. Travaillant dans les couches supérieures du modèle OSI, il peut également offrir des services supplémentaires, comme la terminaison TLS, le routage HTTP, la réécriture des entêtes, la limitation du débit des utilisateurs non authentifiés, etc. Il peut tirer parti d’algorithmes complexes d’équilibrage de charge. En tant que premier point de contact avec les serveurs frontaux, il doit faciliter les maintenances et minimiser l’impact lors des changements quotidiens.

Répartiteurs de charge L7
Le dernier niveau de la solution de répartition de charge est un ensemble d'équilibreurs de charge L7 recevant les connexions des utilisateurs et les transférant vers les frontaux.

Il termine également les connexions TCP des clients. Cela découple l’étage de répartition des serveurs frontaux avec les avantages suivants :

  • les connexions vers les frontaux peuvent être maintenues ouvertes pour réduire l’utilisation des ressources et la latence ;
  • les requêtes peuvent être réessayées de manière transparente en cas de défaillance ;
  • les clients peuvent utiliser un protocole IP différent des serveurs ;
  • les frontaux n’ont pas à se soucier de la découverte de la MTU du chemin, des algorithmes de congestion TCP, de la gestion de l’état TIME-WAIT ou d’autres détails de bas niveau.

De nombreux logiciels conviennent pour cette couche et il existe une littérature abondante sur la façon de les configurer. Vous pouvez regarder HAProxy, Envoy ou Træfik. Voici un exemple de configuration pour HAProxy :

# Point d'entrée de la répartition de charge L7
frontend l7lb
  # Écoute à la fois en IPv4 et IPv6
  bind :80 v4v6
  # Redirige tout sur un ensemble de serveurs frontaux
  default_backend servers
  # Vérification de la bonne santé
  acl dead nbsrv(servers) lt 1
  acl disabled nbsrv(enabler) lt 1
  monitor-uri /healthcheck
  monitor fail if dead || disabled

# Serveurs frontaux en IPv6 avec tests HTTP et via un agent
backend servers
  balance roundrobin
  option httpchk
  server web1 [2001:db8:1:0:2::1]:80 send-proxy check agent-check agent-port 5555
  server web2 [2001:db8:1:0:2::2]:80 send-proxy check agent-check agent-port 5555
  server web3 [2001:db8:1:0:2::3]:80 send-proxy check agent-check agent-port 5555
  server web4 [2001:db8:1:0:2::4]:80 send-proxy check agent-check agent-port 5555

# Faux serveur gérant la disponibilitant du répartiteur de charge lui-même
backend enabler
  server enabler [::1]:0 agent-check agent-port 5555

Cette configuration est très sommaire mais permet d’illustrer deux notions clés pour l’opérabilité :

  1. Les frontaux sont testés à la fois au niveau HTTP (avec check et option httpchk) et via un agent auxiliaire (avec agent-check). Ce dernier permet de placer un serveur en maintenance pour effectuer une mise en production progressive. Sur chaque frontal, un processus écoute sur le port 5555 et répond avec le statut du service (UP, DOWN, MAINT). Un simple socat fait l’affaire3 :

    socat -ly \
      TCP6-LISTEN:5555,ipv6only=0,reuseaddr,fork \
      OPEN:/etc/lb/agent-check,rdonly
    

    Dans /etc/lb/agent-check, UP indique que le service est en mode nominal. Si le test HTTP est aussi positif, HAProxy enverra des requêtes vers ce nœud. Si vous devez le mettre en maintenance, écrivez MAINT et attendez que les connexions en cours se terminent. Utilisez READY pour annuler ce mode.

  2. Le répartiteur de charge lui-même fournit un point de diagnostic (/healthcheck) pour les niveaux supérieurs. Il retourne une erreur 503 si aucun frontal n’est disponible ou si le serveur enabler est indiqué comme indisponible via l’agent. Le même mécanisme que pour les serveurs frontaux classiques peut alors être utilisé pour signaler l’indisponibilité de cet équilibreur de charge.

De plus, la directive send-proxy permet d’utiliser le protocole proxy afin de transmettre les adresses IP réelles des clients. Ce protocole fonctionne également pour les connexions non-HTTP et est supporté par de nombreux serveurs, y compris nginx :

http {
  server {
    listen [::]:80 default ipv6only=off proxy_protocol;
    root /var/www;
    set_real_ip_from ::/0;
    real_ip_header proxy_protocol;
  }
}

En l’état, cette solution n’est pas complète. Nous avons déplacé le problème de disponibilité et d’évolutivité ailleurs. Comment répartir les demandes entre les équilibreurs de charge ?

Premier niveau : routage ECMP⚓︎

Sur la plupart des réseaux IP modernes, il existe des chemins redondants entre les clients et les serveurs. Pour chaque paquet, les routeurs doivent choisir une branche. Lorsque le coût associé à chaque trajet est égal, les flux entrants4 sont répartis entre les destinations disponibles. Cette caractéristique peut être utilisée pour répartir les connexions entre les équilibreurs de charge disponibles :

Routage ECMP
Le routage ECMP est utilisé comme premier étage. Les flux sont répartis entre les équilibreurs de charge L7 disponibles. Le routage est sans état et asymétrique. Les serveurs frontaux ne sont pas représentés.

Il y a peu de contrôle sur la répartition des flux, mais le routage ECMP apporte la possibilité de faire évoluer horizontalement les deux niveaux. Une mise en œuvre courante d’une telle solution est d’utiliser BGP, un protocole de routage pour échanger des routes entre les équipements du réseau. Chaque répartiteur de charge annonce aux routeurs auxquels il est connecté les adresses IP qu’il dessert.

En supposant que vous avez déjà des routeurs avec BGP, ExaBGP est une solution flexible pour permettre aux répartiteurs de charge d’annoncer leur disponibilité. Voici un exemple de configuration :

# Test de disponibilité en IPv6
process service-v6 {
  run python -m exabgp healthcheck -s --interval 10 --increase 0 --cmd "test -f /etc/lb/v6-ready -a ! -f /etc/lb/disable";
  encoder text;
}

template {
  # Patron pour un routeur IPv6
  neighbor v6 {
    router-id 192.0.2.132;
    local-address 2001:db8::192.0.2.132;
    local-as 65000;
    peer-as 65000;
    hold-time 6;
    family {
      ipv6 unicast;
    }
    api services-v6 {
      processes [ service-v6 ];
    }
  }
}

# Premier routeur
neighbor 2001:db8::192.0.2.254 {
  inherit v6;
}

# Second routeur
neighbor 2001:db8::192.0.2.253 {
  inherit v6;
}

Si /etc/lb/v6-ready est présent mais que /etc/lb/disable est absent, toutes les IP configurées sur l’interface lo sont annoncées aux deux routeurs. Si les autres répartiteurs de charge ont une configuration similaire, les routeurs leur distribuent équitablement les flux reçus. Un processus externe doit gérer l’existence du fichier /etc/lb/v6-ready en vérifiant la bonne santé du répartiteur de charge (à l’aide du point /healthcheck par exemple). Un opérateur peut retirer un répartiteur de charge de la rotation en créant le fichier /etc/lb/disable.

Pour plus de détails concernant cette partie, jetez un œil sur « Redondance avec ExaBGP ». Si vous êtes hébergés dans les nuages, ce tiers est généralement mis en place par votre fournisseur sous forme d’une IP « élastique » ou d’un service de répartition L4.

Malheureusement, cette solution n’est pas robuste lorsqu’un changement, prévu ou non, se produit. Notamment, lors de l’ajout ou de la suppression d’un équilibreur de charge, le nombre de routes disponibles pour une destination change. L’algorithme de hachage utilisé par les routeurs n’est pas cohérent et les flux sont redistribués entre les répartiteurs de charge disponibles, rompant les connexions existantes :

Stabilité du routage ECMP 1/2
Le routage ECMP est instable lorsqu'un changement se produit. Un équilibreur de charge supplémentaire est ajouté et chaque flux est acheminé vers un répartiteur différent qui n'a pas les entrées appropriées dans sa table de connexions.

De plus, chaque routeur peut choisir ses propres chemins. Quand un routeur devient indisponible, le second peut router les mêmes flux différemment :

Stabilité du routage ECMP 2/2
Un routeur devient indisponible et le routeur restant route différemment ses flux. L'un d'entre eux est acheminé vers un répartiteur de charge différent qui n'a pas l'entrée appropriée dans sa table des connexions.

Si vous pensez que ce n’est pas un résultat acceptable, notamment si vous devez gérer de longues connexions comme le téléchargement de fichiers, le streaming vidéo ou les connexions websocket, vous avez besoin d’un niveau supplémentaire. Continuez la lecture !

Second niveau : répartition L4⚓︎

Le deuxième niveau est la glue entre le monde sans état des routeurs IP et le pays avec état de l’équilibrage de charge L7. Il est mis en œuvre grâce à l’équilibrage de charge L4. La terminologie peut être un peu confuse ici : ce niveau route les datagrammes IP (pas de terminaison TCP) mais l’agorithme de répartition utilise à la fois l’IP de destination et le port pour choisir un serveur disponible dans le niveau suivant. Le but de cet étage est de s’assurer que tous les membres prennent la même décision d’ordonnancement pour un paquet entrant.

Il y a deux possibilités :

  • répartition de charge L4 avec synchronisation des états ;
  • répartition de charge L4 avec hachage cohérent.

La première option augmente la complexité et limite l’évolutivité. Nous ne l’explorons pas5. La seconde option est moins robuste aux changements mais cela peut être amélioré via une approche hybride avec un état local.

Nous utilisons IPVS, un répartiteur de charge L4 performant fonctionnant dans le noyau Linux. Il est piloté par Keepalived qui dispose d’un ensemble de tests de disponibilité pour détecter les problèmes. IPVS est configuré pour utiliser Maglev, un algorithme de hachage cohérent créé par Google. Dans sa famille, c’est un bon algorithme car il répartit les connexions de manière équitable, minimise les impacts consécutifs à un changement et est particulièrement rapide pour construire sa table de correspondance. Enfin, pour améliorer les performances, le dernier niveau (les répartiteurs de charge L7) répond aux clients directement sans impliquer le second niveau (les répartiteurs de charge L4). Ce mécanisme est connu sous le nom de direct server return (DSR) ou direct routing (DR).

Second niveau : répartition L4
Équilibrage de charge L4 avec IPVS et hachage cohérent liant le premier et le troisième niveau. Les serveurs frontaux ont été omis. Les lignes en pointillés représentent le chemin pris par les paquets retour.

Avec une telle configuration, on s’attend à ce que les paquets appartenant à un flux puissent se déplacer librement entre les composants des deux premiers niveaux tout en finissant sur le même équilibreur de charge L7.

Configuration⚓︎

Une fois ExaBGP configuré comme décrit dans la section précédente, nous pouvons passer à la configuration de Keepalived :

virtual_server_group VS_GROUP_MH_IPv6 {
  2001:db8::198.51.100.1 80
}
virtual_server group VS_GROUP_MH_IPv6 {
  lvs_method TUN  # Mode tunnel pour DSR
  lvs_sched mh    # Algorithme : Maglev
  sh-port         # Prend en compte les ports TCP
  protocol TCP
  delay_loop 5
  alpha           # Les serveurs sont considérés inaccessibles au démarrage
  omega           # Exécute quorum_down à l'arrêt
  quorum_up   "/bin/touch /etc/lb/v6-ready"
  quorum_down "/bin/rm -f /etc/lb/v6-ready"

  # Premier répartiteur de charge L7
  real_server 2001:db8::192.0.2.132 80 {
    weight 1
    HTTP_GET {
      url {
        path /healthcheck
        status_code 200
      }
      connect_timeout 2
    }
  }

  # Tous les autres...
}

Les directives quorum_up et quorum_down définissent les commandes à exécuter quand le service devient respectivement accessible et inaccessible. Le fichier /etc/lb/v6-ready est utilisé pour signaler à ExaBGP s’il doit ou non publier l’adresse IP du service aux routeurs.

De plus, IPVS doit être configuré pour router les paquets appartenant à un flux traité initialement par un autre nœud. Il doit également continuer de router les paquets quand une destination devient indisponible afin de s’assurer qu’on puisse mettre hors service proprement un répartiteur de charge L7.

# Prend aussi en charge les paquets non SYN
sysctl -qw net.ipv4.vs.sloppy_tcp=1
# Ne PAS rerouter une connexion quand une destination
# devient invalide.
sysctl -qw net.ipv4.vs.expire_nodest_conn=0
sysctl -qw net.ipv4.vs.expire_quiescent_template=0

L’algorithme Maglev sera disponible dans Linux 4.18, grâce au travail de Inju Song. Pour les noyaux plus anciens, j’ai préparé un rétroportage6. Le substituer par un autre algorithme, tel que sh, rend l’ensemble moins robuste.

Le DSR est mis en place avec le mode tunnel. Cette méthode est compatible avec les réseaux routés. Les requêtes sont encapsulées vers le nœud choisi à l’aide du protocole IPIP. Cela ajoute un léger surcoût et entraîne des problèmes de MTU. Si possible, utilisez une MTU plus grande entre le second et troisième niveau7. Dans le cas contraire, autorisez explicitement la fragmentation des paquets IP :

sysctl -qw net.ipv4.vs.pmtu_disc=0

Il faut aussi configurer les répartiteurs de charge L7 pour accepter ce trafic encapsulé8 :

# Configure le tunnel IPIP pour accepter des paquets de n'importe quelle source
ip tunnel add tunlv6 mode ip6ip6 local 2001:db8::192.0.2.132
ip link set up dev tunlv6
ip addr add 2001:db8::198.51.100.1/128 dev tunlv6

Évaluation de la robustesse⚓︎

Ainsi configuré, le second niveau améliore la robustesse de l’ensemble pour deux raisons :

  1. L’utilisation d’un algorithme de hachage cohérent pour choisir la destination réduit l’impact négatif d’un changement, prévu ou non, en minimisant le nombre de flux déplacés vers une nouvelle destination. « Consistent Hashing: Algorithmic Tradeoffs » offre plus de détails sur ce sujet.

  2. IPVS garde localement une table des connexions pour les flux connus. Quand un changement n’impacte que le dernier niveau, les flux existants continuent d’être routés correctement en utilisant cette table.

Si nous ajoutons ou retirons un répartiteur L4, les flux existants ne sont pas impactés car chaque répartiteur prend la même décision grâce au hachage cohérent :

Instabilité de la répartition L4 1/3
La perte d'un équilibreur L4 n'a pas d'impact sur les flux existants. Chaque flèche est un exemple de flux. Les points sont des connexions liées à l'équilibreur de charge associé. S'ils s'étaient déplacés vers un autre équilibreur, la connexion aurait été perdue.

Lors de l’ajout d’un répartiteur L7, les flux existants ne sont pas impactés non plus car seules les nouvelles connexions sont routées vers le nouveau répartiteur. Pour les connexions existantes, IPVS utilise sa table de connexion locale et continue de router les paquets vers la destination originale. De manière similaire, le retrait d’un répartiteur L7 n’impacte que les connexions liées à celui-ci. Les autres connexions sont routées correctement :

Instabilité de la répartition L4 2/3
La parte d'un équilibreur L7 n'impacte que les flux qu'il hébergeait.

Seuls des changements simultanés sur les deux niveaux mènent à un impact notable. Par exemple, lors de l’ajout d’un équilibreur de charge L4 et d’un équilibreur de charge L7, seules les connexions déplacées vers un répartiteur L4 sans état et programmées vers le nouveau répartiteur seront rompues. Grâce à l’algorithme de hachage cohérent, les autres connexions resteront liées au répartiteur L7 adéquat. Lors d’un changement planifié, cette perturbation peut être minimisée en ajoutant d’abord les nouveaux équilibreurs L4, en attendant quelques minutes puis en ajoutant les nouveaux équilibreurs L7.

Instabilité de la répartition L4 3/3
Un équilibreur de charge L4 et un équilibreur de charge L7 reviennent à la vie. L'algorithme de hachage cohérent garantit que seul un cinquième des connexions existantes serait déplacé vers le nouvel équilibreur L7. Certains d'entre eux continuent d'être acheminés par le répartiteur L4 d'origine qui connait la destination correcte, ce qui atténue l'impact.

De plus, IPVS route correctement les messages ICMP vers les mêmes répartiteurs L7 que les flux associés. Cela permet à la découverte de la MTU du chemin de fonctionner correctement sans utiliser de techniques palliatives.

Niveau 0 : répartition de charge via le DNS⚓︎

Il est également possible d’ajouter un équilibrage de charge DNS à l’ensemble. Ceci est utile si votre installation est répartie sur plusieurs centres de données, plusieurs régions ou si vous voulez diviser une large ferme de répartition de charge en morceaux plus petits. Il n’est pas destiné à remplacer le premier niveau car il ne partage pas les mêmes caractéristiques : la répartition de charge est déséquilibrée (elle n’est pas basée sur les flux) et la guérison après une panne est lente.

Répartition de charge globale
Une solution complète de répartition de charge sur deux centres de données.

gdnsd est un serveur DNS autoritaire avec des tests de disponibilité intégrés. Il peut servir des zones au format RFC 1035 :

@ SOA ns1 ns1.example.org. 1 7200 1800 259200 900
@ NS ns1.example.com.
@ NS ns1.example.net.
@ MX 10 smtp

@     60 DYNA multifo!web
www   60 DYNA multifo!web
smtp     A    198.51.100.99

L’enregistrement spécial DYNA retourne des entrées A et AAAA après avoir consulté le greffon spécifié. Ici, le greffon multfifo implémente une surveillance en mode actif/actif des adresses IP de la ferme :

service_types => {
  web => {
    plugin => http_status
    url_path => /healthcheck
    down_thresh => 5
    interval => 5
  }
  ext => {
    plugin => extfile
    file => /etc/lb/ext
    def_down => false
  }
}

plugins => {
  multifo => {
    web => {
      service_types => [ ext, web ]
      addrs_v4 => [ 198.51.100.1, 198.51.100.2 ]
      addrs_v6 => [ 2001:db8::198.51.100.1, 2001:db8::198.51.100.2 ]
    }
  }
}

En mode nominal, une requête A recevra en réponse à la fois 198.51.100.1 et 198.51.100.2. Si un test de disponibilité échoue, l’ensemble retourné est mis à jour. Il est également possible de retirer une IP volontairement en modifiant le fichier /etc/lb/ext. Par exemple, en mettant le contenu suivant, 198.51.100.2 ne fera plus parti des réponses :

198.51.100.1 => UP
198.51.100.2 => DOWN
2001:db8::c633:6401 => UP
2001:db8::c633:6402 => UP

Tous les fichiers de configuration pour la mise en place de chaque niveau sont disponibles dans un dépôt GitHub. Si vous voulez reproduire cette configuration à une échelle plus petite, il est possible de fusionner le second et le troisième niveau, soit avec des espaces de nom, soit avec une configuration spécifique de type localnode. Même si vous n’avez pas besoin de ces services directs, vous devriez garder le dernier niveau : alors que les serveurs frontaux vont et viennent, les équilibreurs de charge L7 apportent de la stabilité, rendant l’ensemble plus robuste.


  1. Dans cet article, les « serveurs frontaux » sont les serveurs derrière la couche de répartition de charge. Dans la version anglaise, j’utilise le terme « backend » mais l’équivalent français n’est pas très agréable. ↩︎

  2. Un bon résumé de ce papier est fait par Adrian Colyer. Du même auteur, jetez aussi un œil sur le résumé de « Stateless datacenter load-balancing with Beamer ». ↩︎

  3. Si vous pensez que cette solution est fragile, n’hésitez pas à développer votre propre agent. Il pourrait se coordonner avec un registre clés/valeurs pour déterminer l’état souhaité du serveur. Il est possible de centraliser l’agent à un seul endroit, mais vous risquez d’avoir un problème de poule et d’œuf pour assurer sa disponibilité. ↩︎

  4. Un flux est généralement déterminé par l’IP source et destination et le protocole L4. Alternativement, le port source et le port de destination peuvent également être utilisés. Le routeur hache ces informations pour déterminer la destination. Concernant Linux, vous trouverez plus d’informations à ce sujet dans « Celebrating ECMP in Linux ». ↩︎

  5. Avec Linux, cela peut être mis en place en utilisant Netfilter pour la répartition de charge et conntrackd pour synchroniser les états. IPVS ne permet qu’une synchronisation actif/passif, limitant l’évolutivité. ↩︎

  6. Le rétroportage n’est pas fonctionnellement équivalent à la version originale. Consultez le fichier README pour comprendre les différences. Brièvement, dans la configuration de Keepalived, il faut :

    • ne pas utiliser inhibit_on_failure
    • utiliser sh-port
    • ne pas utiliser sh-fallback

    ↩︎

  7. Au moins 1520 pour IPv4 et 1540 pour IPv6. ↩︎

  8. En l’état, cette configuration n’est pas sûre. Vous devez vous assurer que seuls les répartiteurs de charge L4 seront en mesure d’envoyer du traffic IPIP↩︎

23 May, 2018 08:59AM by Vincent Bernat

May 22, 2018

Olivier Berger (pro)

Recrutement ingénieur·e DevOps pour conteneurs de Travaux Pratiques en informatique/réseaux

Nous recrutons un·e ingénieur·e en informatique pour travailler à l’application des concepts et technologies DevOps (conteneurs Docker, Git, Linux, libre, …) pour la mise au point et l’hébergement de dispositifs de Travaux Pratiques virtualisés, qui seront utilisés pour des enseignements d’informatique et de réseaux, sur un CDD de 1 an, à Télécom SudParis, à Évry (91).

Pour en savoir plus, voir le descriptif du poste que j’ai mis en ligne.

22 May, 2018 07:25AM by Olivier Berger

May 18, 2018

Prochaine conférence MiNET sur les systèmes d’exploitation 24/05 Évry (France)

La prochaine conférence MiNET, le 24/05/2018 après-midi, promet d’être très intéressante sur le sujet des systèmes d’exploitation, avec 4 intervenants pointus :

  • Julia Lawall : “Introduction to Coccinelle and its usage in the Linux Kernel
  • Sebastien Valat : “Memory management and OS paging for high performance computing
  • Pierre Pronchery : “DeforaOS: Un voyage dans le développement de système d’exploitation
  • Cyril Brulebois : “Maintenir et développer la distribution Debian

Plus de détails sur https://conference.minet.net/#conf2018

N’hésitez pas à nous rejoindre à Évry pour participer à cette conférence, ou à suivre la retransmission sur la chaîne Youtube de MiNET.

 

 

18 May, 2018 08:06AM by Olivier Berger

April 23, 2018

hackergotchi for Vincent Bernat

Vincent Bernat

Un blog plus respectueux de la vie privée

Quand j’ai commencé ce blog, j’ai adopté certains services gratuits, comme Disqus ou Google Analytics. Ces services sont assez envahissants pour la vie privée des utilisateurs. Au fil des années, j’ai essayé de corriger cela pour arriver à un point où je ne repose plus sur aucun service « hostile ».

Analyse d’audience⚓︎

Google Analytics est la solution universelle pour obtenir gratuitement une solution d’analyse d’audience. C’est aussi un excellent moyen de fournir gratuitement des données sur vos visiteurs à Google. Il existe des solutions auto-hébergées comme Matomo, anciennement Piwik.

J’ai opté pour une solution plus simple : pas d’analyse d’audience. Cela me permet aussi de penser que mon blog attire des milliers de visiteurs par jour.

Polices de caractères⚓︎

Google Fonts est une bibliothèque de polices et un service d’hébergement très populaire. Il repose sur les règles de confidentialité de Google. Le service google-webfonts-helper permet d’auto-héberger facilement n’importe quelle police issue de Google Fonts. De plus, à l’aide de pyftsubset, les polices n’incluent que les caractères utilisés dans ce blog. Les fichiers sont plus légers et plus complets : pas de problème pour écrire « Antonín Dvořák ».

Vidéos⚓︎

  • Avant : YouTube
  • Après : auto-hébergement

Certains articles sont accompagnés par une vidéo (comme « OPL2LPT: une carte son AdLib sur port parallèle »). Par le passé, j’utilisais YouTube, principalement parce que c’était la seule plateforme gratuite avec une option pour désactiver les publicités. La diffusion de vidéos à la demande est généralement jugée assez difficile. Notamment, si vous utilisez simplement la balise <video>, vous risquez de servir un fichier trop volumineux pour les personnes ayant une connexion lente. Cependant, la difficulté est exagérée : hls.js permet de livrer la vidéo coupée en segments disponibles dans différents débits. Les utilisateurs avec Java­Script désactivé se rabattent sur une version classique de qualité moyenne.

Dans « Auto-hébergement de vidéos avec HLS », j’explique cette approche plus en détail.

Commentaires⚓︎

  • Avant : Disqus
  • Après : auto-hébergement avec Isso

Disqus est une solution de commentaires populaire pour les pages statiques. Ils ont été récemment acquis par Zeta Global, une société de marketing dont le modèle économique repose entièrement sur le profilage. Côté technique, Disqus charge également plusieurs centaines de kilo-octets de ressources. Par conséquent, de nombreux sites n’activent Disqus qu’à la demande. C’est ce que je faisais. Cela ne résout pas le problème de respect de la vie privée. J’avais aussi le sentiment qu’on était moins désireux de laisser un commentaire si une action supplémentaire était requise.

Pendant un certain temps, j’ai pensé à mettre en place mon propre système de commentaires autour des flux Atom. Chaque page recevrait son propre flux de commentaires. Un morceau de Java­Script transformerait ces flux en HTML et les commentaires pourraient toujours être lus sans Java­Script grâce au rendu par défaut des navigateurs. Les lecteurs pourraient aussi s’abonner à ces flux : pas besoin de notifications par courrier ! Les flux seraient servis sous forme de fichiers statiques et mis à jour lors de nouveaux commentaires par un petit morceau de code côté serveur. Encore une fois, cela pourrait fonctionner sans Javascript.

Day Planner by Fowl Language Comics
Fowl Language Comics : Day Planner. De ma difficulté à démarrer un nouveau projet.

Je pense toujours que c’est une bonne idée, mais je n’avais pas envie de développer et de maintenir un nouveau système de commentaires. Il existe plusieurs alternatives auto-hébergés, notamment Isso et Commento. Isso est un peu plus complet avec notamment un import imparfait depuis Disqus. Les deux rencontrent des difficultés pour assurer la maintenance et essaient de devenir pérennes via une version hébergée payante1. Commento est plus orienté vers le respect de la vie privée avec sa non-utilisation des cookies. Cependant, les cookies ne sont pas indispensables au bon fonctionnement d’Isso et ils peuvent être filtrés avec nginx :

proxy_hide_header Set-Cookie;
proxy_hide_header X-Set-Cookie;
proxy_ignore_headers Set-Cookie;

Isso ne propose actuellement pas de notifications par courrier mais j’ai ajouté un flux Atom pour chaque fil de commentaires.

Une autre option aurait été de fermer les commentaires. Cependant, par le passé, j’ai eu d’excellentes contributions en commentaires et je pense aussi qu’ils peuvent faire office de comité de lecture pour articles de blog : c’est une petite garantie que le contenu n’est pas totalement faux.

Moteur de recherche⚓︎

Un moyen de fournir un moteur de recherche pour un blog personnel est de fournir un formulaire pointant sur un moteur de recherche public, comme Google. C’est ce que je faisais. J’ai aussi glissé un peu de Java­Script sur le dessus pour intégrer l’ensemble.

La solution consiste à passer à DuckDuckGo. Il permet de personnaliser un peu l’expérience de recherche :

<form id="lf-search" action="https://duckduckgo.com/">
  <input type="hidden" name="kf" value="-1">
  <input type="hidden" name="kaf" value="1">
  <input type="hidden" name="k1" value="-1">
  <input type="hidden" name="sites" value="vincent.bernat.ch/fr">
  <input type="submit" value="">
  <input type="text" name="q" value="" autocomplete="off" aria-label="Search">
</form>

La partie Java­Script est supprimée car DuckDuckGo ne fournit pas d’API. Comme il est peu probable que plus de trois personnes utilisent le moteur de recherche dans une année, cela semble une bonne idée de ne pas s’éterniser sur cette fonctionnalité annexe.

Bulletin d’information⚓︎

  • Avant : flux RSS
  • Après : flux RSS mais aussi une publication par courrier via MailChimp

De nos jours, les flux RSS sont moins populaires. Je ne comprends pas bien cette tendance concernant le public technophile, mais certains lecteurs préfèrent recevoir les mises à jour par courrier électronique.

MailChimp est une solution courante pour l’envoi de bulletins. Il fournit une intégration simple avec les flux RSS pour déclencher un courrier à chaque mise à jour. Du point de vue de la vie privée, MailChimp semble être un bon citoyen : la collecte de données est principalement limitée à ce qui est nécessaire au service. Les utilisateurs soucieux de leur vie privée peuvent toujours éviter ce service et utiliser le flux RSS.

Moins de Java­Script⚓︎

  • Avant : du code Java­Script hébergé chez des tiers
  • Après : du code Java­Script auto-hébergé

Beaucoup de personnes soucieuses de leur vie privée désactivent Java­Script via des extensions telles que uMatrix ou NoScript. À l’exception des commentaires, je n’utilisais Java­Script que pour des choses annexes :

Pour les formules mathématiques, je suis passé de MathJax à KaTeX. Ce dernier est plus rapide mais permet aussi le rendu côté serveur : il produit le même résultat quel que soit le navigateur. Par conséquent, Java­Script côté client n’est plus nécessaire.

Pour les notes en marge, j’ai converti le code Java­Script faisant la transformation en Python, avec pyquery. Plus de Java­Script côté client pour cet aspect non plus.

Le code restant est toujours là, mais il est auto-hébergé.

Mémento : CSP⚓︎

L’en-tête HTTP Content-Security-Policy contrôle les resources qu’un navigateur est autorisé à charger pour le rendu d’une page. Il s’agit d’un garde-fou et d’une documentation pour les ressources externes utilisées. Le mien est modérément complexe et montre à quoi s’attendre du point de vue de la protection de la vie privée3 :

Content-Security-Policy:
  default-src 'self' blob:;
  script-src  'self' blob: https://d1g3mdmxf8zbo9.cloudfront.net/js/;
  object-src  'self' https://d1g3mdmxf8zbo9.cloudfront.net/images/;
  img-src     'self' data: https://d1g3mdmxf8zbo9.cloudfront.net/images/;
  frame-src   https://d1g3mdmxf8zbo9.cloudfront.net/images/;
  style-src   'self' 'unsafe-inline' https://d1g3mdmxf8zbo9.cloudfront.net/css/;
  font-src    'self' about: data: https://d1g3mdmxf8zbo9.cloudfront.net/fonts/;
  worker-src  blob:;
  media-src   'self' blob: https://luffy-video.sos-ch-dk-2.exo.io;
  connect-src 'self' https://luffy-video.sos-ch-dk-2.exo.io https://comments.luffy.cx;
  frame-ancestors 'none';
  block-all-mixed-content;

Je suis plutôt satisfait d’avoir pu atteindre ce résultat ! 😊


  1. Pour Isso, jetez un œil à comment.sh. Pour Commento, regardez commento.io↩︎

  2. Vous avez peut-être remarqué mon affection excessive pour les notes de pied de page. ↩︎

  3. Je n’ai pas de problème avec l’utilisation d’un CDN comme CloudFront : c’est un service payant et Amazon AWS n’est pas une entreprise qui se spécialise dans l’espionnage des utilisateurs. ↩︎

23 April, 2018 08:01AM by Vincent Bernat

April 21, 2018

OPL2 Audio Board: une carte son AdLib pour Arduino

Dans un article précédent, j’ai présenté l’OPL2LPT, une carte son sur port parallèle dotée d’une puce Yamaha YM3812, aussi connue comme l’OPL2 et présente sur les cartes sons AdLib. L’OPL2 Audio Board pour Arduino est une autre carte son utilisant cette puce. Toutefois, plutôt que reposer sur le port parallèle, elle dispose d’une interface série qui peut être pilotée par un Arduino ou un Raspberry Pi. Alors que l’OPL2LPT cible essentiellement les joueurs disposant du matériel d’époque, l’OPL2 Audio Board ne peut pas être utilisée de la même façon. Toutefois, il est possible de l’exploiter depuis ScummVM et DOSBox!

OPL2 Audio Board for Arduino
L'OPL2 Audio Board sur une boîte « Grim Fandango ».

Découverte⚓︎

L’OPL2 Audio Board est disponible sur Tindie, soit sous forme de kit, soit déjà assemblée. Je l’ai associée avec une copie bon marché de l’Arduino Nano. Le code nécessaire pour piloter la carte est disponible sur GitHub avec plusieurs exemples.

L’un d’eux est DemoTune.ino. Il joue une courte mélodie sur trois canaux. Il peut être compilé et envoyé sur l’Arduino à l’aide de PlatformIO (installable avec pip install platformio) en utilisant la commande suivante1 :

$ platformio ci \
    --board nanoatmega328 \
    --lib ../../src \
    --project-option="targets=upload" \
    --project-option="upload_port=/dev/ttyUSB0" \
    DemoTune.ino
[...]
PLATFORM: Atmel AVR > Arduino Nano ATmega328
SYSTEM: ATMEGA328P 16MHz 2KB RAM (30KB Flash)
Converting DemoTune.ino
[...]
Configuring upload protocol...
AVAILABLE: arduino
CURRENT: upload_protocol = arduino
Looking for upload port...
Use manually specified: /dev/ttyUSB0
Uploading .pioenvs/nanoatmega328/firmware.hex
[...]
avrdude: 6618 bytes of flash written
[...]
===== [SUCCESS] Took 5.94 seconds =====

Une fois la programmation terminée, l’Arduino joue la mélodie. 🎶

L’autre exemple intéressant est SerialIface.ino. Il transforme l’ensemble en carte son sur port série. Une fois le code programmé dans l’Arduino, vous pouvez utiliser le programme play.py dans le même répertoire pour écouter des fichiers VGM. Il s’agit d’un format de fichiers contenant précisément les commandes envoyées à la puce audio. De nombreux fichiers à ce format sont disponibles sur VGMRips. Prenez garde à ne prendre que ceux pour YM3812/OPL2 ! Voici une courte sélection :

L'OPL2 Audio Board connectée à l'Arduino Nano et interprétant quelques fichiers VGM. Les diodes électroluminescentes clignotent au rythme de la réception des données depuis le port série.

Utilisation avec DOSBox & ScummVM⚓︎

Note

Le protocole série utilisé dans cette section n’a pas encore été intégré en amont (PR#20). En attendant, récupérez le fichier SerialIface.ino issu de ma proposition : git checkout 50e1717.

Quand l’Arduino est configuré avec SerialIface.ino, la carte peut être pilotée via le port série avec un protocole simple. Après avoir modifié DOSBox et ScummVM, ils peuvent utiliser cette carte son inhabituelle. Voici quelques exemples de jeux l’utilisant :

  • 0:00, avec DOSBox, le premier niveau de Doom 🎮 (1993)
  • 1:06, avec DOSBox, l’introduction de Loom 🎼 (1990)
  • 2:38, avec DOSBox, le premier niveau de Lemmings 🐹 (1991)
  • 3:32, avec DOSBox, l’introduction de Legend of Kyrandia 🃏 (1992)
  • 6:47, avec ScummVM, l’introduction de Day of the Tentacle ☢️ (1993)
  • 11:10, avec DOSBox, l’introduction de Another World 🐅 (1991)

Another World, réalisé par Éric Chahi, utilise des sons échantillonnés à 5 kHz ou 10 kHz. Avec un port série opérant à 115,200 bits/s, l’option des 5 kHz est juste à notre portée. Toutefois, je ne sais pas si le rendu est fidèle.

Mise à jour (05.2018)

Après discussion avec Walter van Niftrik, nous sommes arrivés à la conclusion que, au-dessus de 1 kHz, DOSBox n’exécute pas les commandes OPL avec la précision temporelle adéquate. Il utilise une tranche de temps d’une milliseconde au cours de laquelle il exécute soit un nombre fixe de cycles CPU, soit autant que possible (avec cycles=max). Dans les deux cas, les instructions CPU émulées sont exécutées aussi rapidement que possible et les retards d’E/S sont simulés en supprimant un nombre fixe de cycles de l’allocation pour la tranche de temps en cours.

DOSBox⚓︎

Le protocole série est décrit dans le fichier SerialIface.ino :

/*
 * A very simple serial protocol is used.
 *
 * - Initial 3-way handshake to overcome reset delay / serial noise issues.
 * - 5-byte binary commands to write registers.
 *   - (uint8)  OPL2 register address
 *   - (uint8)  OPL2 register data
 *   - (int16)  delay (milliseconds); negative -> pre-delay; positive -> post-delay
 *   - (uint8)  delay (microseconds / 4)
 *
 * Example session:
 *
 * Arduino: HLO!
 * PC:      BUF?
 * Arduino: 256 (switches to binary mode)
 * PC:      0xb80a014f02 (write OPL register and delay)
 * Arduino: k
 *
 * A variant of this protocol is available without the delays. In this
 * case, the BUF? command should be sent as B0F? The binary protocol
 * is now using 2-byte binary commands:
 *   - (uint8)  OPL2 register address
 *   - (uint8)  OPL2 register data
 */

Ajouter la prise en charge de celui-ci dans DOSBox est relativement simple (patch). Pour obtenir de bonnes performances, nous utilisons la version du protocole à 2 octets (5000 opérations par seconde). Les commandes sont canalisées et un fil d’exécution dédié collecte les acquittements. Un sémaphore représente le nombre de places libres dans le tampon de réception. Comme il n’est pas possible de lire les registres, nous nous reposons sur DOSBox pour l’émulation des minuteurs qui sont essentiellement utilisés pour permettre la détection de l’OPL2.

La modification est testée uniquement sous Linux mais devrait fonctionner sur la plupart des systèmes POSIX, mais pas sous Windows. Pour tester, vous devez compiler DOSBox depuis les sources :

$ sudo apt build-dep dosbox
$ git clone https://github.com/vincentbernat/dosbox.git -b feature/opl2audioboard
$ cd dosbox
$ ./autogen.sh
$ ./configure && make

Remplacez la section sblaster du fichier ~/.dosbox/dosbox-SVN.conf :

[sblaster]
sbtype=none
oplmode=opl2
oplrate=49716
oplemu=opl2arduino
opl2arduino=/dev/ttyUSB0

Ensuite, exécutez DOSBox avec ./src/dosbox. C’est tout !

Il est probable que vous obteniez le message “OPL2Arduino: too slow, consider increasing buffer” de manière répétée. Pour corriger ceci, il vous faut recompiler SerialIface.ino avec un tampon de réception plus important :

$ platformio ci \
    --board nanoatmega328 \
    --lib ../../src \
    --project-option="targets=upload" \
    --project-option="upload_port=/dev/ttyUSB0" \
    --project-option="build_flags=-DSERIAL_RX_BUFFER_SIZE=512" \
    SerialIface.ino

ScummVM⚓︎

Le code utilisé dans DOSBox peut être adapté à ScummVM (patch). Pour tester, vous devez compiler ScummVM depuis les sources :

$ sudo apt build-dep scummvm
$ git clone https://github.com/vincentbernat/scummvm.git -b feature/opl2audioboard
$ cd scummvm
$ ./configure --disable-all-engines --enable-engine=scumm && make

Démarrez ensuite ScummVM avec ./scummvm. Sélectionnez « AdLib Emulator » comme périphérique musical et « OPL2 Arduino » comme émulateur AdLib2. Comme pour DOSBox, surveillez la console pour vérifier que le tampon de réception est bien dimensionné.

Amusez-vous bien ! 😍


  1. Cette commande n’est valide que pour l’Arduino Nano. Pour une autre variation, jetez un œil à la sortie de platformio boards arduino↩︎

  2. Pour spécifier un port série autre que /dev/ttyUSB0, ajoutez une ligne opl2arduino_device= dans le fichier ~/.scummvmrc↩︎

21 April, 2018 09:19AM by Vincent Bernat

April 18, 2018

Auto-hébergement de vidéos avec HLS

Note

Ce billet a été publié pour la première fois sur le blog d’Exoscale avec quelques modifications mineures.

Héberger des vidéos sur YouTube est pratique pour plusieurs raisons: bon lecteur, bande passante gratuite, fonctionnement sur mobile, effet réseau et, à la discrétion de l’auteur, pas de publicité1. Par contre, c’est l’une des solutions les moins respectueuses de la vie privée. La plupart des autres fournisseurs partagent les mêmes caractéristiques, à l’exception de la possibilité de désactiver gratuitement les annonces.

Avec la balise <video>, la publication d’une vidéo est simple2 :

<video controls>
  <source src="../videos/big_buck_bunny.webm" type="video/webm">
  <source src="../videos/big_buck_bunny.mp4" type="video/mp4">
</video>

Cependant, bien qu’il soit possible de fournir des vidéos différentes selon la taille de l’écran, adapter la vidéo à la bande passante disponible est plus délicat. Il y a deux solutions :

Il s’agit de deux protocoles de diffusion à débit adaptatif : la vidéo est découpée en petits segments et mise à disposition dans une variété de débits différents. Selon les conditions actuelles du réseau, le lecteur sélectionne automatiquement le débit le plus approprié pour télécharger le segment suivant.

HLS a d’abord été implémenté par Apple mais est maintenant aussi pris en charge nativement par Microsoft Edge et Chrome sur Android. hls.js est une librairie JavaScript apportant le support HLS à d’autres navigateurs. MPEG-DASH est techniquement supérieur (indépendant du codec) mais ne fonctionne qu’ à travers une bibliothèque JavaScript, comme dash.js. Dans les deux cas, le support des Media Source Extensions est nécessaire lorsque le support natif est absent. Safari sur iOS n’a pas cette fonctionnalité et ne peut donc pas utiliser MPEG-DASH. Par conséquent, la solution la plus compatible est actuellement HLS.

Encodage⚓︎

Trois types de fichiers sont nécessaires pour diffuser des vidéos HLS :

  • les segments (encodés avec différents débits et résolutions),
  • une liste de lecture des segments pour chacune des variantes,
  • une liste de lecture principale énumérant les listes de lecture pour chaque variante.

Deux formats sont possibles pour les segments :

  • MPEG-2 Transport Streams (TS) ou
  • MP4 fragmenté.

Les segments au format MP4 fragmenté sont supportés depuis iOS 10. Ils sont un peu plus efficaces et peuvent être réutilisés pour servir le même contenu avec MPEG-DASH (seuls les listes de lecture sont différentes). Enfin, les fragments peuvent être servis depuis un même fichier. Cependant, si vous voulez cibler les anciennes versions d’iOS, vous devez vous en tenir au MPEG-2 TS3.

FFmpeg est capable de convertir une vidéo en segments et de générer les listes de lecture associées. La documentation de Peer5 explique les commandes appropriées. J’ai écrit un script (Python 3.6), video2hls, réalisant toutes les étapes. Après l’avoir exécuté sur votre vidéo cible, vous obtenez un répertoire contenant :

  • les segments pour chaque résolution (1080p_1_001.ts, 720p_2_001.ts, …)
  • les listes de lecture pour chaque résolution (1080p_1.m3u8, 720p_2.m3u8, …)
  • la liste de lecture principale (index.m3u8)
  • une version MP4 (progressive.mp4)
  • un poster (poster.jpg)

Le script accepte beaucoup d’options pour modifier son comportement. Le drapeau --help permet de les lister. En le lançant avec --debug, les commandes ffmpeg exécutées sont annotées d’explications. Par exemple, la construction du poster provient de la commande suivante :

ffmpeg \
  `# seek to the given position (5%)` \
   -ss 4 \
  `# load input file` \
   -i ../2018-self-hosted-videos.mp4 \
  `# take only one frame` \
   -frames:v 1 \
  `# filter to select an I-frame and scale` \
   -vf 'select=eq(pict_type\,I),scale=1280:720' \
  `# request a JPEG quality ~ 10` \
   -qscale:v 28 \
  `# output file` \
   poster.jpg

Service⚓︎

Nous avons obtenu un tas de fichiers statiques qui peuvent être hébergés n’importe où. Toutefois, deux détails restent importants :

  • Lorsque les fichiers sont servis depuis un autre domaine, il faut configurer CORS pour autoriser les requêtes GET. Ajouter Access-Control-Allow-Origin: * dans les entêtes de réponse est généralement suffisant4.
  • Certains clients peuvent être difficiles sur les types MIME. Assurez-vous que chaque fichier est associé comme indiqué dans le tableau ci-dessous.
Type Extension Type MIME
Liste de lecture .m3u8 application/vnd.apple.mpegurl
Segments MPEG2-TS .ts video/mp2t
Segments fMP4 .mp4 video/mp4
MP4 classique .mp4 video/mp4
Poster .jpg image/jpeg

Hébergons nos fichiers sur le stockage objet d’Exoscale qui est compatible avec S3 et situé en Suisse. À titre d’exemple, la vidéo Caminandes 3: Llamigos pèse environ 213 MiB (cinq tailles pour HLS et un MP4 classique). Cela nous coûterait moins de 0,01 € par mois pour le stockage et 1,42 € pour la bande passante si 1000 personnes regardaient la version 1080p du début à la fin5.

Nous utilisons s3cmd pour envoyer les fichiers. Récupérez d’abord vos identifiants depuis le portail et placez les dans ~/.s3cfg :

[default]
host_base = sos-ch-dk-2.exo.io
host_bucket = %(bucket)s.sos-ch-dk-2.exo.io
access_key = EXO.....
secret_key = ....
use_https = True
bucket_location = ch-dk-2

La seconde étape consiste à créer un bucket :

$ s3cmd mb s3://hls-videos
Bucket 's3://hls-videos/' created

Pour configurer la politique CORS, placez la définition suivante dans un fichier cors.xml (il peut être souhaitable de restreindre les origines autorisées) :

<CORSConfiguration>
 <CORSRule>
   <AllowedOrigin>*</AllowedOrigin>
   <AllowedMethod>GET</AllowedMethod>
 </CORSRule>
</CORSConfiguration>

La commande suivante permet de l’appliquer :

$ s3cmd setcors cors.xml s3://hls-videos

La dernière étape consiste à copier les fichiers statiques. Les listes de lecture sont servies compressées pour économiser un peu de bande passante. Pour chaque vidéo, à l’intérieur du répertoire contenant tous les fichiers générés, utilisez cette commande :

while read extension mime gz; do
  [ -z "$gz" ] || {
    # gzip compression (if not already done)
    for f in *.${extension}; do
      ! gunzip -t $f 2> /dev/null || continue
      gzip $f
      mv $f.gz $f
    done
  }
  s3cmd --no-preserve -F -P \
        ${gz:+--add-header=Content-Encoding:gzip} \
        --mime-type=${mime} \
        --encoding=UTF-8 \
        --exclude=* --include=*.${extension} \
        --delete-removed \
    sync . s3://hls-videos/video1/
done <<EOF
m3u8  application/vnd.apple.mpegurl true
jpg   image/jpeg
mp4   video/mp4
ts    video/mp2t
EOF

Les fichiers sont maintenant disponibles à l’adresse https://hls-videos.sos-ch-dk-2.exo.io/video1/.

HTML⚓︎

Le code suivant permet d’insérer la vidéo dans un document HTML :

<video poster="https://hls-videos.sos-ch-dk-2.exo.io/video1/poster.jpg"
       controls preload="none">
  <source src="https://hls-videos.sos-ch-dk-2.exo.io/video1/index.m3u8"
          type="application/vnd.apple.mpegurl">
  <source src="https://hls-videos.sos-ch-dk-2.exo.io/video1/progressive.mp4"
          type='video/mp4; codecs="avc1.4d401f, mp4a.40.2"'>
</video>

Les navigateurs avec support natif utilisent la version HLS alors que les autres utiliseront la version MP4 progressive. Cependant, avec l’aide de hls.js, nous pouvons faire bénéficier la version HLS à la plupart des navigateurs :

<script src="https://cdn.jsdelivr.net/npm/hls.js@latest"></script>
<script>
    if(Hls.isSupported()) {
        var selector = "video source[type='application/vnd.apple.mpegurl']",
            videoSources = document.querySelectorAll(selector);
        videoSources.forEach(function(videoSource) {
            var m3u8 = videoSource.src,
                once = false;

            // Copier la balise video pour retirer toutes les sources
            var oldVideo = videoSource.parentNode,
                newVideo = oldVideo.cloneNode(false);

            // Remplacer la balise video avec la copie
            oldVideo.parentNode.replaceChild(newVideo, oldVideo);

            // Attendre le dernier moment pour initialiser hls.js,
            // une seule fois
            newVideo.addEventListener('play',function() {
                if (once) return;
                once = true;

                var hls = new Hls({ capLevelToPlayerSize: true });
                hls.loadSource(m3u8);
                hls.attachMedia(newVideo);
                hls.on(Hls.Events.MANIFEST_PARSED, function() {
                    newVideo.play();
                });
            }, false);
        });
    }
</script>

Voici le résultat avec Caminandes 3: Llamigos, une vidéo créée par Pablo Vasquez, produite par la fondation Blender et publiée sous licence Creative Commons Attribution 3.0 :

La plupart des attributs, méthodes et événements JavaScript fonctionnent de la même façon qu’avec un simple élément <video>. Par exemple, vous pouvez atteindre une position arbitraire, comme 1:00 ou 2:00 (mais vous avez besoin d’activer JavaScript à cet effet).

Le lecteur est différent d’un navigateur à l’autre mais fournit généralement les fonctions basiques. Vous pouvez évoluer vers un lecteur plus avancé, comme video.js out MediaElements.js. Ils gèrent également HLS via hls.js.

Héberger ses vidéos sur YouTube n’est pas une fatalité : les servir soi-même tout en proposant une livraison de qualité est techniquement accessible. Si les besoins en bande passante sont modestes et l’effet réseau peu important, l’auto-hébergement permet de reprendre le contrôle des contenus publiés et de ne pas livrer ses lecteurs à Google. Dans le même esprit, PeerTube offre une plateforme de partage des vidéos. Décentralisée et fédérée, elle repose sur BitTorrent pour réduire les besoins en bande passante.

Annexe⚓︎

Préchargement⚓︎

Dans l’exemple ci-dessus, preload="none" est utilisé pour deux raisons :

  • La plupart des lecteurs ne vont pas visionner la vidéo qui ne sert que d’illustration au contenu principal. Par conséquent, la bande passante n’est pas gaspillée en téléchargeant quelques segments de vidéo, au détriment d’une latence légèrement accrue en début de lecture.
  • Nous ne voulons pas que les clients ne comprenant pas HLS nativement commencent à télécharger la version non-HLS alors que hls.js s’initialise. Cela pourrait aussi être fait en ajoutant le MP4 progressif à partir de JavaScript, mais cela rendrait la vidéo impossible à lire pour les utilisateurs sans JavaScript. Si le préchargement est important, vous pouvez supprimer l’attribut preload via JavaScript (et ne pas attendre une demande de lecture pour initialiser hls.js).

CSP⚓︎

Configurer correctement CSP est plutôt pénible. Pour les navigateurs avec support HLS natif, il suffit d’ajouter la politique suivante en plus de la politique existante :

  • image-src https://hls-videos.sos-ch-dk-2.exo.io pour les posters,
  • media-src https://hls-videos.sos-ch-dk-2.exo.io pour les listes de lecture et les segments.

Avec hls.js, les choses se compliquent. Idéalement, il faut ajouter les éléments suivants :

  • worker-src blob: pour la conversion du format vidéo en tâche de fond,
  • media-src blob: pour la lecture des segments convertis,
  • connect-src https://hls-videos.sos-ch-dk-2.exo.io pour récupérer les listes de lecture et les segments depuis JavaScript.

Toutefois, worker-src est un ajout récent. Les navigateurs doivent se replier sur child-src (obsolète), script-src (mais pas partout) puis default-src. Ainsi, pour une meilleure compatibilité, il faut ajouter blob: à default-src ainsi qu’à script-src et child-src s’ils sont déjà présents. Voici un exemple pour lequel la politique initiale est default-src 'self' :

HTTP/1.0 200 OK
Content-Security-Policy: 
  default-src 'self' blob:;
  image-src 'self' https://hls-videos.sos-ch-dk-2.exo.io;
  media-src blob: https://hls-videos.sos-ch-dk-2.exo.io;
  connect-src https://hls-videos.sos-ch-dk-2.exo.io;
  worker-src blob:;

  1. YouTube vous donne le choix de ne pas insérer d’annonces publicitaires dans vos vidéos. vidéos. Dans les paramètres avancés, vous pouvez désélectionner « Autoriser des publicités à s’afficher en même temps que mes vidéos ». Sinon, vous pouvez également monétiser vos vidéos. ↩︎

  2. De nos jours, tous les navigateurs supportent MP4/H.264. De plus, cela permet généralement de profiter de l’accélération matérielle, ce qui améliore la durée de vie de la batterie sur les téléphones portables. WebM/VP9 permet d’obtenir une meilleure qualité à débit identique. ↩︎

  3. Vous pouvez générer les deux formats et les utiliser comme variantes dans la liste de lecture principale. Cependant, un bug dans hls.js interdit cette option. ↩︎

  4. L’astérisque peut être remplacée par https://example.org pour restreindre l’accès à son propre domaine. ↩︎

  5. Nul besoin de placer les fichiers derrière un CDN. La latence importe peu à condition d’avoir un débit suffisant. ↩︎

18 April, 2018 07:19PM by Vincent Bernat

April 17, 2018

Florent Gallaire

Lamby 2.0 : Chris Lamb réélu DPL pour 2018

Chris Lamb (Lamby) vient d’être réélu Debian Project Leader (DPL). Il va donc pouvoir continuer le travail commencé l’année dernière, et vous pouvez lire sa réaction sur son blog.

Ce n’est bien sûr pas une surprise puisque Chris é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 :

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

17 April, 2018 08:51AM by fgallaire

April 11, 2018

hackergotchi for Debian France

Debian France

Meetup du 11 avril à Paris

Meetup du 11 avril à Paris

Informations pratiques

Un meetup Debian France aura lieu à Paris le mercredi 11 avril 2018 à partir de 19h15.

Le meetup est accueilli par l’Institut des Systèmes Complexes de Paris Île de France (CNRS), 113 rue Nationale, Paris 13ème (métro Nationale, Place d’Italie ou Olympiades).

Plus d’informations pour s’y rendre. Lien géo Lien OpenStreetMap

Les codes à l’entrée seront indiqués 24H avant le meetup (ou par mail pour ceux qui seront inscrits):

  • code de la porte d’entrée : XXXX
  • code de la seconde porte : XXXX
  • Salle de conférence 1.1 au premier étage (escalier ou ascenseur).

Merci de vous inscrire pour que nous puissions prévoir votre accueil dans les meilleures conditions.

Pour toute question concernant l’organisation, vous pouvez contacter Alexandre Delanoë (anoe AT debian DOT org).

Programme

19H15 - Accueil des participants

19H30 - Tour de table, présentations

19H45 - Conférence

Titre: Comment sécuriser l’envoi de courriels avec Debian

Conférencier: Loïc Billet, Consulting IT

Résumé: Pour envoyer des notifications email depuis l’application mobile qu’il a développée Loïc a monté un un serveur de mails sécurisé grâce aux packages Debian. Il nous présentera donc comment sécuriser ses envois d’emails avec Debian. Il évoquera Postfix, SpamAssassin, Dovecot, Roundcube, Apache, Mysql, Mutt, Swaks, SPF, Dkim, Dmarc…

20H15 - Atelier

Titre: Test d’utilisabilité de l’installation par défaut de Debian Buster

Auteur: Aurélien COUDERC, candidat DD

Résumé: Nous allons tester l’installation en l’état de buster pour vérifier ce qui manque ou "cloche" dans l’installation par défaut pour différents environnements de bureau : logiciel absents ou en trop, fonctionnalités habituelles non couvertes, défauts d’utilisabilité…

21H - Échange de clefs GPG

Article sur l’évènement sur le wiki Debian.

11 April, 2018 05:38AM

March 19, 2018

hackergotchi for Vincent Bernat

Vincent Bernat

Intégration d'un service en Go avec systemd: activation par socket

Dans un article précédent, j’ai souligné certaines fonctionnalités utiles de systemd pour écrire un service en Go, notamment pour indiquer la disponibilité et prouver la vivacité. Un autre point intéressant est l’activation par socket1 : systemd écoute pour le compte de l’application et, lors de la première requête, démarre le service avec une copie de la socket en écoute. Lennart Poettering détaille dans un article :

Si un service meurt, sa socket d’écoute reste en place, sans perdre un seul message. Après un redémarrage du service suite à une panne, il peut continuer là où il s’est arrêté. Si un service est mis à niveau, nous pouvons redémarrer le service tout en conservant ses sockets, assurant ainsi que le service est continuellement disponible. Aucune connexion n’est perdue pendant la mise à niveau.

Il s’agit d’une solution pour obtenir un déploiement sans impact d’une application. Un autre avantage est la possibilité d’exécuter un démon avec moins de privilèges : perdre des droits est une tâche ardue avec Go2.

La base⚓︎

Reprenons notre sympathique serveur de pages 404 :

package main

import (
    "log"
    "net"
    "net/http"
)

func main() {
    listener, err := net.Listen("tcp", ":8081")
    if err != nil {
        log.Panicf("cannot listen: %s", err)
    }
    http.Serve(listener, nil)
}

Voici la version utilisant l’activation par socket, à l’aide de go-systemd :

package main

import (
    "log"
    "net/http"

    "github.com/coreos/go-systemd/activation"
)

func main() {
    listeners, err := activation.Listeners(true) // ❶
    if err != nil {
        log.Panicf("cannot retrieve listeners: %s", err)
    }
    if len(listeners) != 1 {
        log.Panicf("unexpected number of socket activation (%d != 1)",
            len(listeners))
    }
    http.Serve(listeners[0], nil) // ❷
}

En ❶, nous récupérons les sockets en écoute fournies par systemd. En ❷, nous utilisons la première d’entre elles pour servir les requêtes HTTP. Testons le résultat avec systemd-socket-activate3 :

$ go build 404.go
$ systemd-socket-activate -l 8000 ./404
Listening on [::]:8000 as 3.

Dans un autre terminal, effectuons quelques requêtes :

$ curl '[::1]':8000
404 page not found
$ curl '[::1]':8000
404 page not found

Deux fichiers sont nécessaires pour compléter l’intégration avec systemd :

  • un fichier .socket décrivant la socket,
  • un fichier .service décrivant le service associé.

Voici le contenu du fichier 404.socket :

[Socket]
ListenStream = 8000
BindIPv6Only = both

[Install]
WantedBy = sockets.target

La page de manuel systemd.socket(5) décrit les options disponibles. BindIPv6Only = both est explicitement utilisé car sa valeur par défaut dépend de la distribution. Voici ensuite le contenu du fichier 404.service :

[Unit]
Description = 404 micro-service

[Service]
ExecStart = /usr/bin/404

systemd sait que les deux fichiers sont liés car ils partagent un même préfixe. Placez les dans /etc/systemd/system et exécutez systemctl daemon-reload et systemctl start 404.​socket. Votre service est désormais prêt à accepter des connexions !

Gestion des connexions existantes⚓︎

Notre serveur de pages 404 a un défaut majeur : les connexions existantes sont sauvagement tuées lorsque le démon est arrêté ou redémarré. Corrigeons cela !

Attendre quelques secondes les connexions existantes⚓︎

Nous pouvons inclure une courte période de tolérance pour terminer les connexions en cours. À l’issue de celles-ci, les connexions restantes sont tuées :

// À la réception du signal, ferme en douceur le serveur et
// attend 5 secondes la fin des connexions en cours.
done := make(chan struct{})
quit := make(chan os.Signal, 1)
server := &http.Server{}
signal.Notify(quit, syscall.SIGINT, syscall.SIGTERM)

go func() {
    <-quit
    log.Println("server is shutting down")
    ctx, cancel := context.WithTimeout(context.Background(),
        5*time.Second)
    defer cancel()
    server.SetKeepAlivesEnabled(false)
    if err := server.Shutdown(ctx); err != nil {
        log.Panicf("cannot gracefully shut down the server: %s", err)
    }
    close(done)
}()

// Accepte de nouvelles connexions.
server.Serve(listeners[0])

// Attend la fin des connexions en cours avant de sortir.
<-done

À la réception du signal de terminaison, la goroutine reprend et planifie l’arrêt du service :

Shutdown() ferme en douceur le serveur sans interrompre les connexions actives. Shutdown() fonctionne en fermant d’abord les sockets en écoute puis en fermant toutes les connexions inactives et enfin en attendant indéfiniment que les connexions retombent au repos et s’arrêtent.

Durant le redémarrage, les nouvelles connexions ne sont pas acceptées : elles restent dans la file d’attente associée à la socket. La taille de celle-ci est limitée et peut être configurée avec la directive Backlog. Sa valeur par défaut est 128. Vous pouvez conserver cette valeur même si votre service s’attend à recevoir de nombreuses connexions par seconde. Lorsque cette valeur est dépassée, les connexions entrantes sont ignorées. Le client réessaye automatiquement de se connecter. Sous Linux, par défaut, un client tente 5 fois (tcp_syn_retries) en 3 minutes environ. C’est un bon moyen d’éviter l’effet de troupeau qui se manifesterait au redémarrage si la taille de la file d’attente était augmentée à une valeur plus élevée.

Attendre plus longtemps les connexions existantes⚓︎

Si vous voulez attendre la fin des connexions existantes pendant une longue période, vous avez besoin d’une approche alternative pour éviter d’ignorer les nouvelles connexions pendant plusieurs minutes. Il y a une astuce très simple : demander à systemd de ne tuer aucun processus. Avec KillMode = none, seule la commande d’arrêt est exécutée et tous les processus existants ne sont pas perturbés :

[Unit]
Description = slow 404 micro-service

[Service]
ExecStart = /usr/bin/404
ExecStop  = /bin/kill $MAINPID
KillMode  = none

Si vous redémarrez le service, le processus en cours prend le temps nécessaire pour s’arrêter et systemd lance immédiatement une nouvelle instance, prête à répondre aux requêtes avec sa propre copie de la socket d’écoute. Toutefois, nous perdons la capacité d’attendre que le service s’arrête complètement, soit par lui-même, soit de force après un temps limite avec SIGKILL.

Attendre plus longtemps les connexions existantes (alternative)⚓︎

Une alternative à la solution précédente consiste à faire croire à systemd que le service est mort️ pendant le redémarrage.

done := make(chan struct{})
quit := make(chan os.Signal, 1)
server := &http.Server{}
signal.Notify(quit,
    // redémarrage:
    syscall.SIGHUP,
    // arrêt:
    syscall.SIGINT, syscall.SIGTERM)
go func() {
    sig := <-quit
    switch sig {
    case syscall.SIGINT, syscall.SIGTERM:
        // Arrêt avec limite de temps.
        log.Println("server is shutting down")
        ctx, cancel := context.WithTimeout(context.Background(),
            15*time.Second)
        defer cancel()
        server.SetKeepAlivesEnabled(false)
        if err := server.Shutdown(ctx); err != nil {
            log.Panicf("cannot gracefully shut down the server: %s", err)
        }
    case syscall.SIGHUP: // ❶
        // Exécute un processus éphémère et demande à systemd de
        // le suivre au lieu de nous.
        log.Println("server is reloading")
        pid := detachedSleep()
        daemon.SdNotify(false, fmt.Sprintf("MAINPID=%d", pid))
        time.Sleep(time.Second)

        // Attend sans limite de temps la fin des connexions en cours.
        server.SetKeepAlivesEnabled(false)
        if err := server.Shutdown(context.Background()); err != nil {
            log.Panicf("cannot gracefully shut down the server: %s", err)
        }
    }
    close(done)
}()

// Sert lentement les requêtes.
server.Handler = http.HandlerFunc(
    func(w http.ResponseWriter, r *http.Request) {
        time.Sleep(10 * time.Second)
        http.Error(w, "404 not found", http.StatusNotFound)
    })
server.Serve(listeners[0])

// Attend que toutes les connexions se terminent.
<-done
log.Println("server terminated")

La principale différence est le traitement du signal SIGHUP en ❶ : un processus leurre de courte durée est exécuté et systemd est invité à le suivre. Quand il meurt, systemd lancera une nouvelle instance du service. Cette méthode nécessite quelques bricolages : systemd a besoin que le leurre soit son fils mais Go ne peut pas facilement se mettre en arrière plan seul. Par conséquent, nous utilisons un court script Python inclu dans la fonction detachedSleep()4 :

// detachedSleep exécute un processus dormant une seconde
// en arrière plan et retourne son PID.
func detachedSleep() uint64 {
    py := `
import os
import time

pid = os.fork()
if pid == 0:
    for fd in {0, 1, 2}:
        os.close(fd)
    time.sleep(1)
else:
    print(pid)
`
    cmd := exec.Command("/usr/bin/python3", "-c", py)
    out, err := cmd.Output()
    if err != nil {
        log.Panicf("cannot execute sleep command: %s", err)
    }
    pid, err := strconv.ParseUint(strings.TrimSpace(string(out)), 10, 64)
    if err != nil {
        log.Panicf("cannot parse PID of sleep command: %s", err)
    }
    return pid
}

Pendant le rechargement, il peut y avoir une courte période pendant laquelle le nouveau et l’ancien processus acceptent les requêtes entrantes. Si vous ne le souhaitez pas, vous pouvez déplacer la création du processus leurre en dehors de la goroutine, après server.Serve() ou implémenter un mécanisme de synchronisation. Il y a aussi un éventuel problème de concurrence lorsque nous disons à systemd de suivre un autre PID (voir PR #7816).

Le fichier 404.service doit être mis à jour :

[Unit]
Description = slow 404 micro-service

[Service]
ExecStart    = /usr/bin/404
ExecReload   = /bin/kill -HUP $MAINPID
Restart      = always
NotifyAccess = main
KillMode     = process

Chacune des directives supplémentaires a son importance :

  • ExecReload indique comment recharger le processus (avec SIGHUP).
  • Restart indique de redémarrer le processus s’il s’arrête de manière « inattendue », notamment lors du rechargement5.
  • NotifyAccess précise quels sont les processus autorisés à envoyer des notifications comme le changement de PID.
  • KillMode indique de ne tuer que le processus identifié comme principal. Les autres sont laissés tranquilles.

Déploiement sans impact ?⚓︎

Le déploiement sans impact est une entreprise difficile sur Linux. Par exemple, HAProxy a eu une longue liste de tentatives jusqu’à ce qu’une solution appropriée, mais complexe, soit implémentée dans HAproxy 1.8. Comment se débrouille-t-on avec notre simple mise en œuvre ?

Du point de vue du noyau, il y a une seule socket avec une file d’attente unique. Cette socket est associée à plusieurs descripteurs de fichiers : un dans systemd et un dans le processus en cours. La chaussette reste en vie tant qu’il y a au moins un descripteur de fichier. Une connexion entrante est placée par le noyau dans la file d’attente et peut être traitée à partir de n’importe quel descripteur avec l’appel système accept(). Par conséquent, cette approche permet de réaliser un déploiement sans impact : aucune connexion entrante n’est rejetée.

En revanche, HAProxy utilisait plusieurs sockets différentes pour écouter sur les mêmes adresses, grâce à l’option SO_REUSEPORT6. Chaque socket a sa propre file d’attente et le noyau répartit les connexions entrantes entre chacune d’elles. Lorsqu’une socket se ferme, le contenu de sa file d’attente est perdu. Si une connexion entrante se trouvait ici, elle reçoit une réinitialisation. Une modification élégante pour Linux afin de signaler qu’une socket ne devrait plus recevoir de nouvelles connexions a été rejetée. HAProxy 1.8 recycle désormais les sockets existantes vers les nouveaux processus par le biais d’une socket Unix.

J’espère que ce billet et le précédent montrent combien systemd est un compagnon appréciable pour un service en Go : disponibilité, vivacité et activation par socket sont quelques unes des fonctionnalités utiles pour construire une application plus fiable.

Annexe: leurre écrit en Go⚓︎

Mise à jour (03.2018)

Sur /r/golang, on m’a fait remarquer que, dans la version où systemd suit un leurre, le script Python peut être remplacé par une invocation de l’exécutable principal qui se base sur un changement d’environnement pour prendre le rôle du leurre. Voici le code remplaçant la fonction detachedSleep() function :

func init() {
    // Au plus tôt, vérifie si on doit jouer le rôle
    // du leurre.
    state := os.Getenv("__SLEEPY")
    os.Unsetenv("__SLEEPY")
    switch state {
    case "1":
        // Première étape, se réexécuter
        execPath := self()
        child, err := os.StartProcess(
            execPath,
            []string{execPath},
            &os.ProcAttr{
                Env: append(os.Environ(), "__SLEEPY=2"),
            })
        if err != nil {
            log.Panicf("cannot execute sleep command: %s", err)
        }

        // Publie le PID du fils et sort.
        fmt.Printf("%d", child.Pid)
        os.Exit(0)
    case "2":
        // Dort et sort.
        time.Sleep(time.Second)
        os.Exit(0)
    }
}

// self retourne le chemin absolu vers nous-même. Cela repose sur
// /proc/self/exe qui peut être un lien symbolique vers un fichier
// supprimé (durant une mise à jour par exemple).
func self() string {
    execPath, err := os.Readlink("/proc/self/exe")
    if err != nil {
        log.Panicf("cannot get self path: %s", err)
    }
    execPath = strings.TrimSuffix(execPath, " (deleted)")
    return execpath
}

// detachedSleep détache un processus qui dort une seconde et retourne
// son PID.
func detachedSleep() uint64 {
    cmd := exec.Command(self())
    cmd.Env = append(os.Environ(), "__SLEEPY=1")
    out, err := cmd.Output()
    if err != nil {
        log.Panicf("cannot execute sleep command: %s", err)
    }
    pid, err := strconv.ParseUint(strings.TrimSpace(string(out)), 10, 64)
    if err != nil {
        log.Panicf("cannot parse PID of sleep command: %s", err)
    }
    return pid
}

Annexe : nommage des sockets⚓︎

Pour un service donné, systemd peut fournir plusieurs sockets. Pour les différencier, il est possible de les nommer. Par exemple, supposons que nous voulions aussi retourner des codes d’erreur 403 depuis le même service mais sur un port différent. Nous ajoutons une définition de socket supplémentaire, 403.socket, liée à la tâche 404.service :

[Socket]
ListenStream = 8001
BindIPv6Only = both
Service      = 404.service

[Install]
WantedBy=sockets.target

À moins de le spécifier explicitement avec la directive FileDescriptorName, le nom de la socket est le nom de l’unité : 403.socket. go-systemd fournit la fonction ListenersWithName() pour récupérer une correspondance entre les noms et les sockets :

package main

import (
    "log"
    "net/http"
    "sync"

    "github.com/coreos/go-systemd/activation"
)

func main() {
    var wg sync.WaitGroup

    // Associe un nom de socket à une fonction de gestion.
    handlers := map[string]http.HandlerFunc{
        "404.socket": http.NotFound,
        "403.socket": func(w http.ResponseWriter, r *http.Request) {
            http.Error(w, "403 forbidden",
                http.StatusForbidden)
        },
    }

    // Récupère les sockets en écoute.
    listeners, err := activation.ListenersWithNames(true)
    if err != nil {
        log.Panicf("cannot retrieve listeners: %s", err)
    }

    // Pour chaque socket, invoque une goroutine en utilisant
    // la fonction de gestion adéquate.
    for name := range listeners {
        for idx := range listeners[name] {
            wg.Add(1)
            go func(name string, idx int) {
                defer wg.Done()
                http.Serve(
                    listeners[name][idx],
                    handlers[name])
            }(name, idx)
        }
    }

    // Attend que toutes les goroutines terminent.
    wg.Wait()
}

Compilons le service et lançons le via systemd-socket-activate:

$ go build 404.go
$ systemd-socket-activate -l 8000 -l 8001 \
                          --fdname=404.socket:403.socket \
                          ./404
Listening on [::]:8000 as 3.
Listening on [::]:8001 as 4.

Dans une autre console, nous pouvons tester une requête sur chacune des deux adresses :

$ curl '[::1]':8000
404 page not found
$ curl '[::1]':8001
403 forbidden

  1. La traduction de socket en français n’est pas évidente. Quand le contexte est suffisamment clair, je m’amuse parfois à dire « chaussette » 🧦 car “socket” est parfois écrit sock dans les programmes. On pourrait le traduire par « prise réseau », idéal pour rendre perplexe la plupart des lecteurs. ↩︎

  2. De nombreuses caractéristiques d’un processus sous Linux sont attachées aux fils d’exécution. L’environnement d’exécution de Go les gère de manière transparente pour l’utilisateur. Jusqu’à récemment, cela rendait certaines fonctionnalités, comme setuid() ou setns(), inutilisables. ↩︎

  3. Avec d’anciennes versions de systemd (avant 230), la commande peut s’appeler /lib/systemd/systemd-activate↩︎

  4. Python est un bon candidat : il est sans doute disponible sur le système, il est d’assez bas niveau pour implémenter facilement la fonctionnalité et, en tant que langage interprété, il ne nécessite pas d’étape de compilation.

    Il n’y a pas besoin d’appeler fork() deux fois car il faut uniquement détacher le leurre du processus courant. Cela simplifie sensiblement le code Python. ↩︎

  5. Cette directive n’est pas essentielle car le processus serait aussi redémarré via l’activation de la socket. ↩︎

  6. Cette approche est plus pratique lors d’un rechargement car il n’y a pas à déterminer quelles sockets réutiliser et lesquelles créer à partir de zéro. De plus, lorsque plusieurs processus ont besoin d’accepter des connexions, l’utilisation de plusieurs sockets est plus performante car les différents processus ne se disputeront pas sur un verrou partagé pour accepter des connexions. ↩︎

19 March, 2018 08:28AM by Vincent Bernat

March 15, 2018

Florent Gallaire

Quel DPL pour 2018 ?

Le temps passe vite, et cela fait déjà presque un an que Chris Lamb a été élu Debian Project Leader (DPL). Chaque développeur Debian pouvait se porter candidat entre le 4 et le 10 mars à la suite du traditionnel appel à candidatures.

La question de la légitimité d’un scrutin avec un seul candidat, posée en 2016 par Paul Wise lorsque Mehdi Dogguy fut seul à se présenter, est malheureusement à nouveau d’actualité. En effet, seul le DPL sortant s’est porté candidat cette année :

Et force est de constater que les candidats ne se bousculent encore et toujours pas au portillon pour devenir DPL. Peu de développeurs semblent motivés par cette charge comme l’exprimait déjà Lars Wirzenius il y a deux ans :

After some serious thinking, I’ve decided not to nominate myself in the Debian project leader elections for 2016. […] Why not run? I don’t think I want to deal with the stress. I already have more than enough stress in my life, from work.

En plus de son rôle de développeur Debian et de DPL 2017, Chris Lamb est un important contributeur du projet Reproducible builds ainsi que du framework web Python Django et de son écosystème.

Les presque mille développeurs Debian seront libres de voter du 1er au 14 avril lors d’un vote utilisant la méthode Condorcet car, même en l’absence d’autres candidats, Chris Lamb reste en concurrence avec le choix None Of The Above.

Vous pouvez retrouver tous les débats de la campagne sur la mailing list debian-vote.

15 March, 2018 06:18PM by fgallaire

December 01, 2017

Olivier Berger (pro)

Conférence sur SoftwareHeritage par Roberto Di Cosmo

Nous avons eu le plaisir d’accueillir le 7/11/2017 Roberto Di Cosmo pour présenter le projet Software Heritage à Télécom SudParis, dans le cadre d’un séminaire du laboratoire Samovar.

La conférence de Roberto a été enregistrée. Les transparents sont disponibles en PDF. Voici la vidéo ci-dessous (ou en MP4 depuis l’archive de Software heritage):

Merci encore à Roberto et à toute l’équipe du projet.

01 December, 2017 12:05PM by Olivier Berger

November 26, 2017

hackergotchi for Debian France

Debian France

Retour sur la mini-DebConf 2017 à Toulouse

Bonjour à tous,

Une mini-DebConf [1] organisée par l'association Debian France a eu lieu le week end dernier (18 et 19 novembre 2017) à Toulouse. C'était une grande première à Toulouse. L'évènement a été organisé conjointement avec le capitole du libre [2] et ce fût une réussite. En plus des inscrits à la mini-DebConf nous avons eu de nombreux autres visiteurs. Une salle pleine sur l'ensemble du week end et beaucoup de mines réjouies ont été la preuve d'un succès pour cette édition 2017. Beaucoup de personnes ont traversé la France pour venir et une partie de l'europe pour certains. En plus du partage de savoir, cette mini-DebConf a rempli son second rôle : nous réunir et passer de bons moments entre développeurs, contributeurs et utilisateurs de Debian.

Le stand Debian France qui se tenait au village associatif du capitole du libre a été lui aussi un franc succès. Je remercie tout particulièrement Thierry Beigbeder et Sacha Massot-Pellet pour avoir tenu ce stand tout le week-end. De nombreux contacts enrichissants ont eu lieu sur le stand et cela nous a permis de démystifier beaucoup de choses sur la communauté Debian et de pouvoir donner des éléments à certaines personnes leur permettant de commencer à contribuer au projet.

Merci à tous pour votre présence et votre implication dans cet événement. Merci à l'association Toulibre [3] pour nous avoir accueilli au sein du capitole du libre. Merci également à notre sponsor Evolix. [4]

On m'a murmuré qu'il pourrait y avoir une mini-DebConf l'année prochaine à Marseille ou encore à Rennes. Alors vivement 2018 !

Denis Briand

26 November, 2017 05:18PM

November 11, 2017

Mini-DebConf à Toulouse les 18 et 19 novembre 2017

Bonjour à tous,

L'association Debian France [1] organise une mini-DebConf à Toulouse le week end prochain 18 et 19 novembre. Cet évènement accueillera toutes les personnes intéressées par le projet Debian avec une série de conférences autour de ce thème. Cette mini-DebConf aura lieu en même temps et au même endroit que le Capitole du Libre [2] à l'ENSEEIHT : 26 rue Pierre-Paul Riquet à Toulouse.

Au programme :

  • Premiers pas dans l'univers de Debian -- Nicolas Dandrimont
  • Trusting your computer and system -- Jonas Smedegaard
  • Automatiser la gestion de configuration de Debian avec Ansible -- Grégory Colpart & Jérémy Lecour
  • Making Debian for everybody -- Samuel Thibault
  • Retour d'expérience : mise à jour de milliers de terminaux Debian -- Cyril Brulebois
  • Retour d'expérience: Utilisation de Debian chez Evolix -- Evolix
  • Key signing party
  • Cocktail avec buffet le samedi soir

Le planning détaillé est disponible ici

Vous pouvez proposer un lightning talk de 10 minutes, il n'est pas trop tard (4 talks possibles sur ce segment)

Bonne semaine et à très bientôt!

Denis Briand

11 November, 2017 09:51PM

November 08, 2017

Stéphane Blondon

Ignorer des fichiers, de ack à ag

Ag (the silver searcher), comme ack permettent de chercher des motifs de texte dans du code source. Une sorte de grep spécialisé pour du code source.

Les deux outils sont très probablement disponibles dans votre distribution préférée.
Sous Debian et dérivées :

apt install ack-grep # pour ack
apt install silversearcher-ag # pour ag

ag est plus rapide qu’ack pour trouver des motifs. Un comparatif de performance écrit par le développeur d’ag, qui est donc juge et partie, le montre. Quelques tests rapides m’ont aussi montré un gain de temps.

ack utilise un fichier .ackrc pour ignorer des chemins ou fichiers. ag aussi, mais le format est un peu différent (équivalent à .hgignore et .gitignore qu’il utilise aussi) car il ne fait que de l’exclusion. La modification est triviale pour un castor junior :

$ cat .ackrc
--ignore-dir=riri
--ignore-dir=fifi/
--ignore-dir=loulou

devient
$ cat .ignore
riri
fifi/
loulou

À partir de la version 0.33.0, ag utilise le fichier .ignore et .agignore devient déprécié. Dans la dernière version testée, le fichier .agignore est toujours lu s’il est la racine de ${HOME}, mais non pris en compte s’il est dans le répertoire dans lequel la recherche est faite.

Testé avec les versions suivantes :

ack version 2.12 et 2.18
ag version 0.19.2 et 2.1.0

08 November, 2017 01:44PM by ascendances

September 13, 2017

hackergotchi for Debian France

Debian France

Mini-debconf 2017 à Toulouse au Capitole du Libre

L'association Debian France [1] organise une mini-debconf à Toulouse. Cet évènement accueillera toutes les personnes intéressées par le projet Debian avec une série de conférences et d'ateliers autour de ce thème. Cette mini-debconf aura lieu en même temps et au même endroit que le Capitole du Libre [2] les 18 et 19 novembre 2017 à ENSEEIHT : 26 rue Pierre-Paul Riquet à Toulouse.

Nous aimerions avoir la moitié des conférences en anglais, les anglophones sont donc les bienvenus !

Les conférences et ateliers seront programmés sur la même grille que les conférences du Capitole du Libre. Il sera, ainsi, aisé de basculer de la mini-debconf au capitole du libre et inversement bien sur ;)

Les propositions de conférences sont ouvertes, vous pouvez vous inscrire par mail à minidebconf[at]france[dot]debian[dot]net et sur la page wiki [3]. Date limite pour soumettre une conférence : le 30 septembre 2017

13 September, 2017 07:29AM

September 10, 2017

hackergotchi for Charles Plessy

Charles Plessy

Résumé de la discussion sur les clés hors ligne.

Le mois dernier il y a eu une discussion intéressante au sujet des clés GnuPG hors ligne et de leurs supports de stockage, sur la liste debian-project@l.d.o. J'ai tenté de résumer la discussion dans le wiki Debian, un particulier en créant deux nouvelles pages.

10 September, 2017 12:06PM

April 21, 2017

hackergotchi for Rapha&#235;l Hertzog

Raphaël Hertzog

Le logiciel libre a t’il une couleur politique ?

En pleine campagne présidentielle, après avoir échoué à obtenir les parrainages pour Charlotte Marchandise, j’ai décidé de soutenir Jean-Luc Mélenchon.

Il se trouve que le volet numérique du programme de la France Insoumise est très bien ficelé et fait la part belle aux logiciels libres.

Mais face aux enjeux, ce n’est évidemment pas mon seul critère de choix. L’élément décisif pour ma part est la mise en place d’une assemblée constituante avec des citoyens tirés au sort pour changer nos institutions et notre système électoral à bout de souffle. Il nous faut le jugement majoritaire (cliquez le lien pour tester la méthode sur cette élection présidentielle) pour en finir avec le vote utile. Il faut dépasser la monarchie présidentielle et apprendre à travailler ensemble pour le bien de tous.

Mais même en allant au delà de ces deux aspects, je me retrouve en accord avec le programme de la France Insoumise sur la quasi totalité des thématiques sauf l’Europe et sur le revenu universel (qui est absent!).

Pour autant, je n’aime pas le personnage de Jean-Luc Mélenchon (ce n’est pas pour rien que je soutenais Charlotte Marchandise) et son historique politique (cumul dans le temps…) n’est pas en phase avec mes convictions, mais il n’y a pas de candidat parfait et il a promis de démissionner une fois la nouvelle constitution en place alors je m’en accommode.

Bref, pour en revenir avec le sujet de mon article, très peu de candidats[1] à la présidence ont pris des positions aussi claires en faveur des logiciels libres alors je m’interroge. Est-ce un hasard que le seul projet qui défend le logiciel libre soit aussi celui qui me correspond le mieux par ailleurs ? Ou bien est-ce que le fait que je fasse partie de la communauté du logiciel libre peut avoir une relation avec le côté humaniste/progressiste/écologiste qui m’attire en politique ?

J’ai l’habitude de présenter le logiciel libre comme apolitique, car les gens de gauche y voient un modèle de coopération et de partage des communs, et les gens de droite y voient la liberté totale et un marché ouvert avec une concurrence parfaite. Et parfois j’ai l’impression que cette distinction se retrouve aussi dans la différence de terminologie « logiciel libre » vs « open-source »…

L’existence même de ces deux tendances discréditerait alors la corrélation que je semble observer. Mais tout de même, lorsqu’on parle de « communauté du logiciel libre » j’ai remarqué que ceux qui se reconnaissent derrière ce label sont plutôt des contributeurs qui sont portés par des motivations (au moins partiellement) altruistes et lorsque je discute avec d’autres contributeurs bénévoles aussi impliqués que moi, il est assez rare que je tombe sur des personnes avec des valeurs en forte opposition aux miennes.

Ceux pour qui le logiciel libre se résume à l’open-source ne semblent pas s’identifier à la notion de communauté du logiciel libre et sont moins impliqués/présents/visibles dans les événements qui fédèrent les communautés (conférences, sprints, etc.).

Qu’en dites-vous ? Faites-vous le même constat que moi ? Ou bien avez-vous une expérience diamétralement opposée à la mienne ?

Il est possible (voire probable) que la communauté Debian (dont je fais partie) ne soit pas forcément représentative de l’ensemble de la communauté du libre. L’existence même du contrat social comme texte fondateur explique peut-être un biais vers le côté humaniste/progressiste.

En tout cas, avec le nombre de chercheurs qui ont déjà étudié les développeurs de logiciels libres, je m’étonne que cette problématique n’ait pas encore été étudiée. Si vous connaissez une étude à ce sujet, partagez la dans les commentaires, cela m’intéresse et je rajouterai volontiers un lien dans l’article.

[1] François Asselineau soutient aussi le logiciel libre. Mais j’ai l’impression que c’est plus par anti-impérialisme américain — car les logiciels propriétaires dominants viennent de là — que par conviction.

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

21 April, 2017 12:36PM by Raphaël Hertzog

April 16, 2017

Florent Gallaire

Chris Lamb élu DPL pour 2017

C’est Chris Lamb qui vient d’être élu Debian Project Leader (DPL) pour l’année 2017, succédant ainsi au mandat de Mehdi Dogguy qui avait été élu sans opposition en 2016.

Si le mandat de Mehdi s’est bien déroulé, il donnait peut-être trop l’impression d’un Zack 4.0, et il semblerait donc que Chris puisse apporter une nouvelle dynamique au projet Debian. Voici une représentation du résultat du scrutin qui utilise la méthode Condorcet.

Vote DPL 2017

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

16 April, 2017 12:39AM by fgallaire

March 12, 2017

Quel DPL pour 2017 ?

Le temps passe vite, et cela fait déjà presque un an que Mehdi Dogguy a été élu Debian Project Leader (DPL). Chaque développeur Debian pouvait se porter candidat entre le 5 et le 11 mars à la suite du traditionnel appel à candidatures.

La question de la légitimité d’un scrutin avec un seul candidat, posée l’année dernière par Paul Wise, n’est heureusement plus d’actualité, mais force est de constater que les candidats ne se bousculent toujours pas au portillon pour devenir DPL. Il y en aura donc deux cette année :

En plus de son rôle de développeur Debian, Chris Lamb est un important contributeur du projet Reproducible builds ainsi que du framework web Python Django et de son écosystème.

Les presque mille développeurs Debian seront libres de voter du 2 au 15 avril lors d’un vote utilisant la méthode Condorcet.

Vous pouvez retrouver tous les débats de la campagne sur la mailing list debian-vote.

12 March, 2017 05:53AM by fgallaire

February 23, 2017

Stéphane Blondon

Frise chronologique des distributions Debian

De manière assez inattendue, on m’a suggéré de mettre à jour la frise chronologique montrant des différentes distributions de Debian au fil du temps. L’image de l’article précédent s’arrêtait à la sortie future de Wheezy. Cette fois-ci, elle va jusqu’à la future sortie de Stretch :
Frise chronologique Debian 1993-2016

Il s’agit simplement d’une version modifiée du fichier Gimp précédent. Le nouveau fichier .xcf est téléchargeable à http://stephane.yaal.fr/frise-chronologique/frisechrono_debian_1993_2016.xcf.

23 February, 2017 04:47PM by ascendances

February 13, 2017

hackergotchi for Rapha&#235;l Hertzog

Raphaël Hertzog

Mes activités libres en janvier 2017

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

Ce mois-ci ce sont 10 heures de travail sur les mises à jour de sécurité pour Debian 7 Wheezy qui ont été subventionnées. Elles ont été consacrées aux tâches suivantes :

  • J’ai passé en revue de multiples CVE affectant ntp, et décidé de les marquer comme « no-dsa » (de manière identique à ce qui a été réalisé pour Jessie);
  • J’ai relancé les auteurs amont de jbig2dec (ici) et XML::Twig (par message privé) concernant les rapports de bogue n’ayant pas encore eu de retour de leur part;
  • J’ai demandé plus de détails sur la liste oss-security au sujet de la CVE-2016-9584, car le fait qu’elle ait déjà été remontée à l’amont n’était pas évident. Il s’est avéré que c’était bien le cas, j’ai donc mis à jour le suiveur de sécurité en conséquence;
  • Après avoir obtenu une réponse sur jbig2dec, j’ai commencé à rétroporter le patch désigné par l’amont, ce qui ne fut pas chose facile. Lorsque cela a été fait, j’ai également reçu le fichier permettant de reproduire le problème qui est à l’origine du rapport… et qui ne provoquait malheureusement plus le même problème avec la vieille version de jbig2dec présente dans Wheezy. Cela étant, Valgrind a tout de même identifié des lectures en-dehors de l’espace mémoire alloué. C’est à partir de cet instant que j’ai examiné avec plus d’attention l’historique Git, et découvert que les trois dernières années n’avaient vu principalement que des correctifs de sécurité pour des cas similaires n’ayant jamais été remontés en tant que CVE. En conséquence, j’ai ouvert une discussion sur comment régler cette situation;
  • Matthias Geerdsen a remonté dans le n°852610 une régression concernant libtiff4. J’ai confirmé le problème et passé de nombreuses heures à élaborer un correctif. Le patch ayant entraîné la régression était spécifique à Debian, car l’amont n’avait pas encore corrigé le problème. J’ai publié un paquet mis à jour dans la DLA-610-2.

Empaquetage Debian

La période de gel « fort » approchant, j’ai procédé à quelques mises à jour de dernière minute :

  • schroot 1.6.10-3 : correction de quelques problèmes anciens avec la manière dont les montages bind sont partagés, et autres corrections importantes;
  • live-boot 1:20170112 : correction d’un échec au démarrage sur système de fichier FAT, et autres corrections mineures;
  • live-config 5.20170112 : regroupement de plusieurs patchs utiles en provenance du BTS;
  • J’ai fini la mise à jour de hashcat 3.30 avec sa nouvelle bibliothèque privée, et corrigé en même temps le bogue critique pour la publication n°851497. Le travail avait été initié par des collègues de l’équipe pkg-security team.

Travaux divers

Parrainages J’ai parrainé un nouvel envoi de asciidoc abaissant une dépendance en recommandation (cf. le n°850301). J’ai parrainé une nouvelle version amont de dolibarr.

Discussions J’ai appuyé plusieurs modifications préparées par Russ Allbery sur debian-policy. J’ai aidé Scott Kitterman au sujet d’une incompréhension sur la manière dont les fichiers de service Postfix sont supposés fonctionner, en lien avec le rapport n°849584. J’ai discuté dans le rapport n°849913 d’une régression dans la compilation des compilateurs croisés, et fourni un patch afin d’éviter le problème. Guillem est finalement parvenu à une meilleure solution.

Bogues J’ai analysé le n°850236 concernant l’échec d’un test Django durant la première semaine suivant chaque année bisextile. J’ai créé le n°853224 afin de remonter plusieurs petits problèmes en lien avec les scripts mainteneur de desktop-base.

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

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

13 February, 2017 10:37AM by Raphaël Hertzog

February 09, 2017

hackergotchi for Charles Plessy

Charles Plessy

[résolu] Attention à libinput 1.6.0-1

Depuis que j'ai mis à jour ce soir, je ne peux quasiment plus cliquer en tapotant mon pavé tactile. Heureusement, une correction est en route.

m-à-j : Réinstaller les paquets version 1.5.5-4 résout le problème en attendant.

m-à-j : Les paquets version 1.6.2-1, encore dans Sid pour le moment, fonctionnent parfaitement. Merci !

09 February, 2017 01:22PM

February 07, 2017

hackergotchi for Debian France

Debian France

Meetup du 28 Mars à Paris

Meetup du 28 Mars à Paris

Informations pratiques

Un meetup Debian France aura lieu à Paris le mardi 28 mars 2017 à partir de 19h30.

Le meetup est accueilli par l'Institut des Systèmes Complexes de Paris Île de France (CNRS) , 113 rue Nationale, Paris 13ème (métro Nationale, Place d'Italie ou Olympiades).

Plus d'informations pour s'y rendre.

Les codes à l'entrée seront indiqués 24H avant le meetup (ou par mail pour ceux qui seront inscrits):

  • code de la porte d'entrée : XXXX
  • code de la seconde porte : XXXX
  • Salle de conférence 1.1 au premier étage (escalier ou ascenseur).

Merci de s'inscrire pour que nous puissions prévoir votre accueil dans les meilleures conditions.

Pour toute question concernant l'organisation, vous pouvez contacter Alexandre Delanoë (anoe AT debian DOT org).

Programme

Accueil 19H30-20H00

  • Accueil et présentation des objectifs des meetups (Alexandre Delanoë, secrétaire Debian France, 5mn)
  • Présentation de Debian France par son Président (Nicolas Dandrimont, Développeur Debian, 5mn)

Présentation (rapide) de soi, si la salle n'est pas trop pleine

Talk 20H- 20H15

Titre: Debian aujourd'hui et demain

Auteur: Mehdi Doguy, actuel Debian Project Leader

Résumé: L'actuel Leader du projet Debian présentera les moments forts durant l'année écoulée. Il nous parlera du futur de Debian, la tendance actuelle qui se dessine et ses projets pour l'année à venir.

Discussions 20H15-20H30

Talk 20H30-20H45

Titre: Debian, forces et limites pour l'accessibilité du logiciel libre

Auteur: Alexandre Arnaud, chef de projet à Hypra.fr

Résumé: Comment utiliser un ordinateur lorsque l'on est mal-voyant? Quel système prévoir ? Alexandre Arnaud, chef de projet à Hypra.fr montrera comment il travaille et présentera l'équipe Debian accessibilité, son cycle de développement favorable aux tests et sa politique de mises à jour. Cependant, les logiciels d'aide technique ne sont pas forcément à jour et certaines évolutions obligent Hypra à maintenir ses propres dépôts logiciels (notamment pour certains paquets de Mate ou Orca) afin de concilier cette stabilité avec le progrès nécessaire et rapide dans l'accessibilité du libre.

Discussions 20H45-21H

Talk 21H-21H15

Titre: Thèmes de bureau pour Debian

Auteur: Aurélien Couderc, Contributeur Debian

Résumé: Organisation du concours de thèmes, sélection du thème par défaut et mise en ¿uvre. Challenges et travail à réaliser à chaque version de Debian. Avec une mise en perspective sur les nouveautés pour la prochaine version de Debian : Stretch.

Discussions 21H15-21H30

Échanges et signatures de clefs GPG 21H30-22H

RDV pour le prochain Meetup.

07 February, 2017 02:41PM

February 02, 2017

hackergotchi for Rapha&#235;l Hertzog

Raphaël Hertzog

Élections présidentielles, logiciel libre et Charlotte Marchandise

L’élection présidentielle approche et commence à prendre une grande place médiatique. À cette occasion, les associations comme l’April essaient d’interpeller les candidats pour les sensibiliser sur le sujet…

En temps qu’association, il faut garder ses distances et ne pas prendre position. Mais en tant qu’individu, je peux aller plus loin et soutenir explicitement un candidat qui partage les valeurs du logiciel libre.

Charlotte MarchandiseC’est ce que je veux faire aujourd’hui. Je vous invite à découvrir Charlotte Marchandise. C’est la gagnante des primaires citoyennes organisées par laprimaire.org et son programme politique est en parfaite adéquation avec mes valeurs (revenu de base inconditionnel, 6ème république, transition écologique, etc.) y compris sur le logiciel libre (voir ici l’article dédié de son programme).

C’est une candidature citoyenne non-partisane qui ne peut donc s’appuyer sur aucun financement pré-existant. Elle a donc besoin de nos dons. J’ai déjà fait un don conséquent et je vous invite à en faire de même. Cliquez ici pour accéder au formulaire permettant de soutenir la campagne de Charlotte Marchandise.

Si vous ne pouvez pas donner, je vous invite simplement à parler de Charlotte et de son programme dans votre entourage et à partager cet article. Si vous avez un peu de temps à investir, vous pouvez participer à la recherche de parrainages.

Je fais partie de ceux qui ne veulent plus de la classe politique en place et qui souhaite une réforme des institutions et du système électoral en premier lieu. Avec cette candidature citoyenne, « hackons le système » !

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

02 February, 2017 01:57PM by Raphaël Hertzog

February 01, 2017

Stéphane Blondon

Il voyait des spirales partout…

♪ …et pour lui ça voulait dire des trucs : ♫ ♪

Spirales sur essuie-tout

Je suis tombé sur cet essuie-tout par hasard et ça m’a rappelé de suite un logo, voire un thème. 🙂

Écran de connexion à debian9

01 February, 2017 03:17PM by ascendances

January 14, 2017

hackergotchi for Rapha&#235;l Hertzog

Raphaël Hertzog

Mes activités libres en décembre 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

Ce mois-ci ce sont 10 heures de travail sur les mises à jour de sécurité pour Debian 7 Wheezy qui ont été subventionnées. Elles ont été consacrées aux tâches suivantes :

  • J’ai publié la DLA-741-1 concernant unzip. Ce fut une mise à jour facile;
  • J’ai passé en revue le patch de Roberto Sanchez pour la CVE-2014-9911 concernant ICU;
  • J’ai publié la DLA-759-1 concernant nss, en collaboration avec Antoine Beaupré. J’ai fusionné et mis à jour le travail de Guido pour activer la suite de tests au cours de la compilation, et pour ajouter les tests DEP-8;
  • J’ai créé le dépôt Git qui sera utilisé pour la maintenance de php5 dans Debian LTS, et j’ai commencé à travailler sur une mise à jour. J’ai ajouté les patchs pour 2 CVE (CVE-2016-3141 et CVE-2016-2554), ainsi que quelques fichiers binaires requis par certains tests (qui échouent, à l’heure actuelle).

Empaquetages divers

Avec l’approche du gel définitif de Stretch, certains clients m’ont demandé de pousser des paquets dans Debian et/ou de corriger des paquets sur le point d’être retirés de cette distribution.

Alors que j’essayais de ramener uwsgi dans testing, j’ai créé les rapport de bogue n°847095 (libmongoclient-dev: Ne devrait pas rentrer en conflit avec le paquet de transition mongodb-dev) et n°847207 (uwsgi: FTBFS sur de multiples architectures avec des références indéfinies à des symboles uwsgi_*), de même que j’ai travaillé sur quelques-uns des bogues critiques pour la publication qui maintenaient le paquet hors de testing.

J’ai également travaillé sur quelques nouveaux paquets (lua-trink-cjson, lua-inotify, lua-sandbox-extensions) qui améliorent le paquet « hindsight » dans certains cas d’usage, et j’ai parrainé une mise à jour de rozofs dans experimental, afin de corriger un conflit de fichiers avec inn2 (cf. le n°846571).

Travaux Debian divers

Debian Live J’ai publié deux mises à jour de live-build. Avec la seconde ont été ajoutées plusieurs options de personnalisation de la configuration GRUB (que nous utilisons dans Kali pour surcharger le thème, et ajouter de nouvelles entrées au menu), à la fois pour le boot EFI et pour le boot normal.

Rapports de bogue divers Rapport de bogue n°846569 concernant libsnmp-dev, afin de tenir compte de la transition libssl (j’avais remarqué que le paquet n’était pas maintenu, j’ai en conséquence fait appel aux nouveaux mainteneurs potentiels sur la liste debian-devel). Le n°847168 sur devscripts pour debuild qui a commencé à échouer lorsque lintian échouait (régression inattendue). Le n°847318 concernant lintian, afin d’éviter les faux-positifs sur les paquets Kali (ce qui était ennuyeux du fait de la régression debuild précédemment mentionnée). Le n°847436 concernant un problème de mise à jour avec tryton-server. Le n°847223 concernant firefoxdriver, dans la mesure où il dépendait toujours d’iceweasel au lieu de firefox.

Parrainage J’ai parrainé une nouvelle version d’asciidoc (rapport de bogue n°831965), ainsi que de ssldump (version 0.9b3-6), pour la transition libssl. J’ai également poussé une nouvelle version de mutter, afin de corriger le n°846898 (elle était déjà prête dans SVN).

Distro Tracker

Pas grand chose de nouveau, j’ai corrigé le n°814315 en basculant quelques URLs restantes vers https. J’ai fusionné les patchs d’efkin pour corriger la suite de tests fonctionnels (cf. le n°814315), ce qui constitue une contribution vraiment très utile ! Ce même contributeur s’est attaqué à un autre ticket (le n°824912) concernant l’ajout d’une API pour récupérer les objets d’action. Cela représente une tâche plus importante et demande quelques réflexions. Je dois encore lui faire mes retours sur ses derniers patchs (après déjà deux itérations).

Travaux divers

J’ai mis à jour la formule salt letsencrypt-sh pour la version 0.3.0, et ajouté la possibilité de personnaliser le script hook pour recharger le serveur Web.

Le compte Twitter @planetdebian n’est plus actif depuis que twitterfeed.com a fermé ses portes, et que son remplaçant (dlvr.it) n’apprécie pas le fil RSS de planet.debian.org. J’ai créé le n°848123 concernant planet-venus, ce dernier ne préservant pas l’attribut isPermalink dans le tag guid.

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

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

14 January, 2017 01:55PM by Raphaël Hertzog

December 24, 2016

Florent Gallaire

Les fonctions anonymes lambda en Python : print, expressions conditionnelles et récursivité

Si Python n’est pas un langage de programmation fonctionnelle, il possède cependant des fonctions anonymes lambda qui sont typiques de cette famille de langages. Ces fonctions sont réputées peu puissantes en Python car elle ont été volontairement limitées syntaxiquement à une expression, sans possibilité d’utiliser des instructions. Pourtant, nous allons voir qu’elles ont dans ce langage quelques particularités intéressantes.

Print

L’instruction print est devenue une fonction print() – et donc une expression – dans Python 3 suite à la PEP 3105. Ainsi, si vous utilisez print dans une fonction lambda, Python 2 lèvera une exception SyntaxError: invalid syntax alors que Python 3 l’acceptera :

>>> pr = lambda x : print(x)
>>> pr('OK en Python 3')
OK en Python 3

Expressions conditionnelles

Introduites (tardivement) dans Python 2.5 suite à la PEP 308, les expressions conditionnelles sont une manière simplifiée de réaliser grâce à l’opérateur ternaire true_value if condition else false_value la suite d’instructions suivante :

if condition:
    x = true_value
else:
    x = false_value

Comme leur nom l’indique, les expressions conditionnelles sont bien des expressions et elles permettent donc de mettre de la logique dans les fonctions lambda. Cela était déjà possible précédemment, en abusant un peu les opérateurs logiques classiques avec condition and true_value or false_value, mais c’est une méthode que je déconseille car elle n’est pas totalement fiable pour certaines valeurs de condition.

Dans l’exemple suivant, j’utilise une expression conditionnelle avec la fonction print() et donc Python 3, ce dernier me permettant d’utiliser un nom de variable avec le caractère non-ASCII é (PEP 3131) :

>>> majorité = lambda x : print("mineur") if x < 18 else print("majeur")
>>> majorité(15)
mineur
>>> majorité(25)
majeur

Récursivité

Le principe des fonctions anonymes étant de ne pas être nommées, il est donc logiquement difficile de les appeler. Ainsi, les fonctions anonymes de certains langages fonctionnels ne peuvent pas s’appeler, et donc ne peuvent pas être récursives. En Python, les lambda sont un sucre syntaxique limité des fonctions normales mais elles leur sont sémantiquement équivalentes, et elles peuvent donc parfaitement s’appeler récursivement.

En utilisant une expression conditionnelle et la récursivité on peut ainsi facilement implémenter l’algorithme récursif naïf de la très classique suite de Fibonacci :

>>> fib = lambda x : x if x < 2 else fib(x - 1) + fib(x - 2)
>>> fib(1)
1
>>> fib(10)
55
>>> fib(25)
75025

N’essayez pas d’aller beaucoup plus haut pour tester cet algorithme de complexité exponentielle, mais il démontre bien la puissance quelque peu surprenante des fonctions lambda en Python.

Compréhension de liste

On peut enfin ajouter que l’usage de compréhension de liste permet aisément de faire une boucle dans une fonction lambda :

>>> incr = lambda liste : [i + 1 for i in liste]
>>> incr([1, 45, 340])
[2, 46, 341]

24 December, 2016 07:56AM by fgallaire

December 11, 2016

hackergotchi for Rapha&#235;l Hertzog

Raphaël Hertzog

Mes activités libres en novembre 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

Dans les 11 heures de travail (rémunérées) qui m’incombaient, je suis parvenu à publier la DLA-716-1, aussi connue sous le nom de tiff 4.0.2-6+deb7u8, corrigeant les CVE-2016-9273, CVE-2016-9297 et CVE-2016-9532. On dirait bien que ce paquet est concerné par de nouvelles CVE tous les mois.

J’ai ensuite consacré pas mal de temps à passer en revue toutes les entrées dans dla-needed.txt. Je souhaitais me débarrasser des commentaires erronés ou qui ne sont plus pertinents, et en même temps aider Olaf, qui s’occupait du « frontdesk LTS » pour la première fois. Cela a abouti au marquage de pas mal d’entrées comme « no-dsa » (c’est à dire que rien ne sera fait pour elles, leur gravité ne le justifiant pas), telles que celles affectant dwarfutils, dokuwiki, irssi. J’ai supprimé libass, car la CVE ouverte était sujette à débat et marquée comme « pas importante ». Tandis que je faisais cela, j’ai corrigé un bogue dans le script bin/review-update-needed que nous utilisons pour identifier les entrées n’ayant fait aucun progrès dernièrement.

Je me suis ensuite attaqué à libgc, et publié la DLA-721-1, ou libgc 1:7.1-9.1+deb7u1. Elle corrige la CVE-2016-9427. Le patch était important et a du être rétroporté manuellement, car il ne s’appliquait pas correctement.

Enfin, la dernière tâche réalisée fut le test d’une nouvelle version d’imagemagick et la revue d’une mise à jour préparée par Roberto.

Travaux concernant pkg-security

L’équipe pkg-security continue sur sa bonne lancée : j’ai parrainé le travail de patator concernant le nettoyage d’une dépendance inutile de pycryptopp, qui allait être retiré de Testing du fait du ticket n°841581. Après m’être penché sur ce bogue, il s’est avéré que celui-ci était résolu dans libcrypto++ 5.6.4-3. Je l’ai donc clôturé.

J’ai parrainé plusieurs envois : polenum, acccheck, sucrack (mises à jour mineures), bbqsql (nouveau paquet importé de Kali). Quelques temps plus tard, j’ai corrigé quelques soucis dans le paquet bbsql, qui avait été rejeté de NEW.

Je me suis également occupé de quelques bogues critiques pour la publication, et liés à la transition vers openssl 1.1 : j’ai adopté dans l’équipe sslsniff et corrigé le n°828557, par une compilation dépendante de libssl1.0-dev. Ceci après avoir ouvert le ticket amont correspondant. J’ai fait la même chose pour ncrack et le n°844303 (le ticket amont est ici). Quelqu’un d’autre s’est occupé de samdump2, mais j’ai tout de même adopté le paquet dans l’équipe pkg-security, dans la mesure où il s’agit d’un paquet concernant le thème de la sécurité. J’ai aussi effectué un envoi en tant que non-mainteneur d’axel et du n°829452 (cela ne concerne pas pkg-security, mais nous l’utilisons dans Kali).

Travaux Debian divers

Django J’ai participé à la discussion débattant de l’opportunité de laisser Django compter le nombre de développeurs qui l’utilisent. L’impact quant à la diffusion de données personnelles que ce changement entraînerait a suscité l’intérêt des listes de diffusion Debian, et jusqu’à celui de LWN.

Sur un plan plus technique, j’ai poussé la version 1.8.16-1~bpo8+1 vers jessie-backports, et corrigé le bogue critique pour la publication n°844139. Pour se faire, j’ai rétroporté deux commits amont, ce qui a mené à l’envoi 1.10.3-2. Je me suis ensuite assuré que cela était également corrigé dans la branche amont 1.10.x.

dpkg et /usr fusionné. En parcourant debian-devel, j’ai découvert que le bogue n°843073 menaçait la fonctionnalité d’un /usr fusionné. Dans la mesure où le bogue était présent dans du code que j’avais écrit il y a plusieurs années, et du fait que Guillem n’était pas intéressé par sa correction, j’ai passé une heure à mettre au point un patch relativement propre que ce dernier pourrait appliquer. Guillem n’a malheureusement pas encore réussi à sortir une nouvelle version de dpkg embarquant ces patchs. Espérons que cela ne tardera plus trop.

Debian Live J’ai fermé le n°844332 , qui demandait le retrait de live-build de Debian. Étant marqué comme orphelin, j’avais toujours gardé un œil sur ce paquet, et avait poussé quelques petites corrections vers Git. J’ai décidé cette fois d’adopter officiellement le paquet au sein de l’équipe debian-live, et de travailler un peu plus dessus. J’ai passé en revue tous les patchs en attente dans le suiveur de bogues, et poussé de nombreuses modifications vers Git. Quelques changements restent à faire pour finaliser un meilleur rendu du menu GRUB, et j’ai prévu de pousser une nouvelle version très prochainement.

Diverses créations de tickets J’ai créé deux tickets amont concernant uwsgi, afin d’aider à la correction de bogues ouverts et critiques pour la publication affectant ce paquet. J’ai créé le n°844583 concernant sbuild, afin de supporter les suffixes arbitraires de version pour les recompilations binaires (binNMU). Et j’ai créé le n°845741 concernant xserver-xorg-video-qxl, afin qu’il soit corrigé pour la transition vers xorg 1.19.

Zim. Alors que j’essayais de corriger le n°834405 et de mettre à jour les dépendances requises, j’ai découvert que je devais mettre à jour pygtkspellcheck en premier lieu. Le mainteneur de ce paquet étant malheureusement aux abonnés absents (MIA – missing in action), je l’ai adopté en tant que membre de l’équipe python-modules.

Distro Tracker. J’ai corrigé un petit bogue, qui entraînait l’affichage d’une affreuse trace à l’occasion de requêtes avec un HTTP_REFERER non-ASCII.

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

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

11 December, 2016 07:37PM by Raphaël Hertzog

November 23, 2016

hackergotchi for Tanguy Ortolo

Tanguy Ortolo

Interdit ou autorisé ?

Vu près de l'entrée d'un jardin public, celui de Brimborion, de mémoire :

Panneau rond avec une large bordure verte et un vélo noir au milieu

Alors, dans ce parc, le vélo est-il autorisé, interdit, recommandé, obligatoire ? (Rayez les mentions inutiles.)

C'est interdit, évidemment, mais modifier ainsi la couleur d'un panneau standard est une très mauvaise idée. Et la raison pour laquelle cette erreur a été commise, à savoir mieux s'assortir avec la couleur de l'environnement, est parfaitement stupide. Service des parcs de Sèvres, changez-moi ça tout de suite !

23 November, 2016 04:56PM by Tanguy

November 19, 2016

hackergotchi for J. Fernando Lagrange

J. Fernando Lagrange

Debian Stretch et Dell Latitude E6520: installation

J’ai un nouveau travail, pour lequel on m’a fourni un Dell Latitude E6520. Voici comment j’ai installé Debian 9 Stretch testing dessus.

Debian testing est la version actuellement en développement de la prochaine version stable de Debian. Elle est aussi disponible sous le nom de la future version, c’est-à-dire Stretch (depuis le 25 avril 2015).
(Extrait du wiki officiel)

Ma démarche pour installer Stretch

Pour installer la future Debian stable, j’ai suivi les étapes suivantes (indiquées comme la manière la plus fiable dans le wiki officiel (il est aussi possible d’utiliser l’installateur encore en version alpha pour Stretch):

  1. Installer Debian 8 Jessie stable à partir d’une clé USB
  2. Changer les sources de paquets
  3. Mettre à jour vers Debian 9 Stretch testing

Installer Debian 8 Jessie stable à partir d’une clé USB

Préparation de et démarrage sur la clé USB

En trois étapes:

  1. Télécharger la dernière version stable (la 8.6.0 en cemoment)
    À partir du lien en haut à droite de la page d’accueil du projet Debian
  2. Copier le contenu de ce téléchargement sur une clé USB
    Avec la commande # cp /chemin/dossier/téléchargement/debian-8.6.0-amd64-i386-netinst.iso /dev/sd<ma_cle_usb>
  3. Démarrer l’ordinateur sur la clé USB
    Pour cela, sur ce Dell (Latitude E6520), appuyer sur F12 pendant le démarrage de l’ordinateur et sélectionner la clé USB

« Options » choisies pendant l’installation

Mes « options » préférées pendant une installation de poste de travail:

  • Ne pas mettre de mot de passe au compte de l’administrateur (root): cela installe sudo et ajoute l’utilisateur créé pendant l’installation dans le groupe sudo
  • Utiliser le disque en entier avec LVM et une partition chiffrée, qui contient tous les dossiers
  • Choisir l’environnement de bureau XFCE

Changer les sources de paquets

Dans /etc/apt/sources.list, changer jessie par stretch, le fichier final que j’ai utilisé est le suivant:

# 

deb http://httpredir.debian.org/debian/ stretch main
deb-src http://httpredir.debian.org/debian/ stretch main

deb http://security.debian.org/ stretch/updates main
deb-src http://security.debian.org/ stretch/updates main

deb http://httpredir.debian.org/debian/ stretch-updates main
deb-src http://httpredir.debian.org/debian/ stretch-updates main

Puis mettre à jour la liste des paquets disponibles: # apt update

Mettre à jour vers Debian 9 Stretch testing

En trois étapes:

  1. Mettre à jour l’outil de gestion des paquets:
    # apt install apt
  2. Mettre à jour les paquets installés:
    # apt upgrade
  3. Redémarrer (je ne sais pas si c’est nécessaire, mais cela permet d’utiliser le noyau qui vient d’être installé):
    # reboot
  4. Finir la mise à jour:
    # apt full-upgrade

Note:

  • Pendant la mise à jour, j’ai rencontré un problème, temporaire et dont la cause première a déjà été corrigée), en indiquant que le paquet rdnssd est en conflit avec network-manager. Comme j’utilise network-manager, j’ai résolu ce problème en supprimant le paquet rdnssd, qui ne me semble pas nécessaire dans mon cas.

Et voilà !

Comme ce modèle n’était pas dans la partie « Installing Debian On » du wiki, je l’ai ajouté ! 🙂

19 November, 2016 11:44AM by Low Memory

October 29, 2016

Certificats Let’s Encrypt ! avec certbot

Qu’est-ce que c’est donc ? (bis)

Le mois dernier, j’avais partagé comment je faisais pour renouveler des certificats Let’s Encrypt ! Je me suis alors rendu compte qu’il y a des outils dédiés dans le projet Debian, et qu’ils ont étés rétroportés pour Jessie: le paquet Debian certbot. Voici comment j’utilise ce paquet.

Pour rappel:
« Let’s Encrypt (abrégé LE) est une autorité de certification lancée le 3 décembre 2015 (Bêta Version Publique). Cette autorité fournit des certificats gratuits X.509 pour le protocole cryptographique TLS au moyen d’un processus automatisé destiné à se passer du processus complexe actuel impliquant la création manuelle, la validation, la signature, l’installation et le renouvellement des certificats pour la sécurisation des sites internet. »
Contenu soumis à la licence CC-BY-SA 3.0. Source : Article Let’s Encrypt de Wikipédia en français (auteurs ).

Voici donc comment j’utilise ce paquet Debian certbot pour:

  • Créer de nouveaux certificats (pour nginx)
  • Mettre à jour ces certificats

Préambule: installation

Pour installer le paquet certbot, il faut d’abord ajouter la source des paquets rétroportés. C’est indiqué dans les instructions (en anglais) et sur la page wiki (en français). Personnellement, voici comment j’ai fait:

J’ai créé un fichier /etc/apt/sources.list.d/backports.list contenant la ligne suivante:

deb http://ftp.debian.org/debian jessie-backports main

Puis lancé les commandes suivantes:

root@server ~# apt update
[…]
root@server ~# apt install certbot
[…]

Créer de nouveaux certificats (pour nginx)

J’utilise nginx comme serveur web. J’ai mis en place le certificat Let’s Encrypt ! en 3 étapes:

  1. Créer le certificat
  2. Configurer nginx pour utiliser le nouveau certificat
  3. Relancer nginx

Créer le certificat

Voici comment j’ai créé les certificats pour le site web www.fosforito.fr:

root@server ~# systemctl stop nginx.service
root@server ~# certbot certonly -d www.fosforito.fr
[…]

Puis, j’ai suivi les instructions (en anglais) pour utiliser l’authentification avec un serveur web autonome (standalone). Cela autorise certbot à lancer son propre serveur web, le temps de créer le certificat. nginx ne doit donc pas fonctionner le temps de créer le certificat (quelques secondes dans mon cas), c’est le but de la première commande. Pour le relancer, j’ai utilisé la commande suivante:

root@server ~# systemctl start nginx.service

Configuration de nginx

Pour utiliser la configuration ci-dessous, j’ai d’abord créé une clé Diffie-Hellman comme indiqué par SSL Labs:

root@server ~# openssl dhparam -out /etc/nginx/dhparams.pem 2048
[…]

Voici le fichier /etc/nginx/sites-available/www.fosforito.fr.conf que j’utilise avec la commande root@server ~# ln -s /etc/nginx/sites-available/www.fosforito.fr.conf /etc/nginx/sites-enabled/www.fosforito.fr.conf:

server {
    listen 443;
    server_name www.fosforito.fr;

    ssl on;
    ssl_certificate /etc/letsencrypt/live/www.fosforito.fr/fullchain.pem;
    ssl_certificate_key /etc/letsencrypt/live/www.fosforito.fr/privkey.pem;

    ssl_ciphers 'ECDHE-RSA-AES128-GCM-SHA256:ECDHE-ECDSA-AES128-GCM-SHA256:ECDHE-RSA-AES256-GCM-SHA384:ECDHE-ECDSA-AES256-GCM-SHA384:DHE-RSA-AES128-GCM-SHA256:DHE-DSS-AES128-GCM-SHA256:kEDH+AESGCM:ECDHE-RSA-AES128-SHA256:ECDHE-ECDSA-AES128-SHA256:ECDHE-RSA-AES128-SHA:ECDHE-ECDSA-AES128-SHA:ECDHE-RSA-AES256-SHA384:ECDHE-ECDSA-AES256-SHA384:ECDHE-RSA-AES256-SHA:ECDHE-ECDSA-AES256-SHA:DHE-RSA-AES128-SHA256:DHE-RSA-AES128-SHA:DHE-DSS-AES128-SHA256:DHE-RSA-AES256-SHA256:DHE-DSS-AES256-SHA:DHE-RSA-AES256-SHA:AES128-GCM-SHA256:AES256-GCM-SHA384:AES128-SHA256:AES256-SHA256:AES128-SHA:AES256-SHA:AES:CAMELLIA:DES-CBC3-SHA:!aNULL:!eNULL:!EXPORT:!DES:!RC4:!MD5:!PSK:!aECDH:!EDH-DSS-DES-CBC3-SHA:!EDH-RSA-DES-CBC3-SHA:!KRB5-DES-CBC3-SHA';

    ssl_prefer_server_ciphers on;

    ssl_dhparam /etc/nginx/dhparams.pem;

    root /srv/www.fosforito.fr/;
    index index.html;

    access_log      /var/log/nginx/www.ssl.access.log;
    error_log       /var/log/nginx/www.ssl.error.log;


}

Une fois tout cela mis en place, je teste avec SSL Labs et je vois que ce site obtient un A, ce qui me va bien. 🙂

Mise à jour du certificat

Le paquet certbot met en place une tâche planifiée pour mettre à jour automatiquement le(s) certificat(s) Let’s Encrypt ! présent(s) sur le serveur. Malheureusement, pour l’instant, cela ne fonctionne que pour le serveur web apache (paquet apache2 dans Debian).
Pour nginx, j’ai simplement modifié la tâche planifiée, dans le fichier /etc/cron.d/certbot, pour arrêter le serveur web avant le renouvellement de certificat et le relancer après. Voici le fichier au complet (notez les options pre-hook et post-hook):

# /etc/cron.d/certbot: crontab entries for the certbot package
#
# Upstream recommends attempting renewal twice a day
#
# Eventually, this will be an opportunity to validate certificates
# haven't been revoked, etc.  Renewal will only occur if expiration
# is within 30 days.
SHELL=/bin/sh
PATH=/usr/local/sbin:/usr/local/bin:/sbin:/bin:/usr/sbin:/usr/bin

0 */12 * * * root test -x /usr/bin/certbot && perl -e 'sleep int(rand(3600))' && certbot -q renew --pre-hook "service nginx stop" --post-hook "service ngnix start"

Récapitulatifs

Mise en place du certificat pour nginx

  1. Arrêter nginx
  2. Créer le certificat Let’s Encrypt !
  3. Créer le groupe Diffie-Hellman
  4. Mettre en place la configuration du site web
  5. Relancer nginx

Renouvellement du(des) certificat(s)

Ajouter les options pre-hook et post-hook à la tâche plannifiée.

29 October, 2016 06:36PM by Low Memory

August 17, 2016

hackergotchi for Tanguy Ortolo

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 by Tanguy

August 10, 2016

hackergotchi for J. Fernando Lagrange

J. Fernando Lagrange

Renouvellement de certificats LetsEncrypt avec systemd

Qu’est-ce que c’est donc ?

« Let’s Encrypt (abrégé LE) est une autorité de certification lancée le 3 décembre 2015 (Bêta Version Publique). Cette autorité fournit des certificats gratuits X.509 pour le protocole cryptographique TLS au moyen d’un processus automatisé destiné à se passer du processus complexe actuel impliquant la création manuelle, la validation, la signature, l’installation et le renouvellement des certificats pour la sécurisation des sites internet1. » (Contenu soumis à la licence CC-BY-SA 3.0. Source : Article Let’s Encrypt de Wikipédia en français (auteurs) )

Bref, c’est bien pratique pour faire du HTTPS (entre autres) et on peut automatiser le renouvellement des certificats. Il y a plusieurs années, j’aurais fait un cron, mais comme j’ai appris que systemd pouvait gérer des tâches répétitives, je me suis dit que c’était l’occasion de m’y mettre ! 😉

Comment on fait ?

Voici les étapes suivies, détaillées ci-dessous puis quelques documents qui m’ont permis de le faire, sans compter le conseil d’un ami: « T’as qu’à faire un timer ! » :

  • Copier certbot sur le serveur, logiciel (libre, non-copyleft) de gestion des certificats de Let’s Encrypt
  • Créer un script pour renouveler les certificats avec certbot
  • Créer un service systemd pour lancer le script
  • Créer une minuterie (timer) systemd pour lancer le service à intervalles réguliers

Enfin, activer et lancer la minuterie puis vérifier que ça fonctionne.

1. Copier certbot sur le serveur

Je le copie dans le dossier /opt du serveur:

root@serveur:~# cd /opt/ && git clone https://github.com/certbot/certbot
[…]

2. Créer le script pour utiliser certbot

Le script se nomme certbot-renew, il est créé dans /opt/certbot/, au même endroit que certbot. Créez aussi le dossier pour les journaux avec la commande mkdir /var/log/letsencrypt/.

Si vous utilisez le serveur web apache, changez le service que systemd doit arrêter et redémarrer, en gras dans le code ci-dessous:

root@serveur:~# cat > /opt/certbot/certbot-renew << EOF
#!/bin/sh
# Inspired by <https://letsencrypt.org/getting-started/>
systemctl stop nginx.service
/opt/certbot/certbot-auto renew -nvv --standalone > /var/log/letsencrypt/renew.log 2>&1
LE_STATUS=$?
systemctl start nginx.service
if [ "$LE_STATUS" != 0 ]; then
echo Automated renewal failed:
tail -n 200 /var/log/letsencrypt/renew.log
exit 1
fi
EOF

3. Créer le service systemd

C’est ce service qui va lancer le script /opt/certbot/certbot-renew créé à l’étape précédente:

root@serveur:~# cat > /etc/systemd/system/certbot-renew.service << EOF
# Voir <https://mjanja.ch/2015/06/replacing-cron-jobs-with-systemd-timers/>
[Unit]
Description=Renouvellement des certificats letsencrypt

[Service]
Type=simple
nice=19
IOSchedulingClass=2
IOSchedulingPriority=7
ExecStart=/opt/certbot/certbot-renew
EOF

4. Créer la minuterie systemd

C’est cette minuterie qui va lancer le service créé à l’étape précédente. Notez que la valeur daily pour OnCalendar lance le service à minuit. Comme le serveur était programmé pour faire d’autres choses à minuit, j’ai utilisé un autre moment. ^^

root@serveur:~# cat > /etc/systemd/system/certbot-renew.timer << EOF
# Voir <https://mjanja.ch/2015/06/replacing-cron-jobs-with-systemd-timers/>
[Unit]
Description=Renouvellement des certificats letsencrypt

[Timer]
#OnCalendar=daily
OnCalendar=*-*-* 04:20:42

[Install]
WantedBy=timers.target
EOF

 

Il ne reste plus qu’à activer cette minuterie pour qu’elle soit lancée à chaque démarrage du serveur:  systemctl enable certbot-renew.timer

Pour éviter un redémarrage, la minuterie peut être lancée manuellement: systemctl start certbot-renew.timer

Pour vérifier que tout fonctionne bien le service peut aussi être lancé manuellement: systemctl start certbot-renew.service. Vérifiez alors les journaux pour voir si tout s’est bien déroulé.

 

Voici donc comment j’ai procédé, il doit exister bien d’autres façons de faire, n’hésitez-pas à m’en faire part et/ou à améliorer ce que je présente ici.

Documentation, ressources:

Manuels de systemd: systemd.exec, systemd.service et systemd.timer.
Manuel de ioprio_set.
Remplacer les cron jobs par des minuteries systemd (en anglais).
Pour débuter avec Let’s Encrypt (en anglais).

Un brin de persévérance, un tonneau de tests et quelques couplets de corrections. 😉

 

10 August, 2016 09:02PM by Low Memory

June 28, 2016

hackergotchi for Tanguy Ortolo

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 by Tanguy

June 17, 2016

hackergotchi for J. Fernando Lagrange

J. Fernando Lagrange

La brique en voyage

La situation

Il se trouve que j’ai déménagé récemment. J’en ai profité pour demander un abonnement Internet à l’association de la Fédération FDN de mon coin: Rézine. J’ai donc mis ma brique Internet chez quelqu’un, le temps que l’accès Internet soit en place.

Le problème

Quand j’ai connecté la brique depuis un autre accès Internet, plus rien n’a fonctionné : pas de nouvelles de la brique sur Internet, ni sur le réseau local ! 🙁

La solution

Note pour les avocats: cette solution a fonctionné chez moi, mais il y a un risque de perdre des données. Rien ne garanti qu’elle fonctionnera chez vous ! Je ne peux pas être tenu pour responsable des actions que vous faites. En cas de doute, demandez de l’aide au membre FFDN le plus proche de chez vous !

 

« Malheureusement », j’ai un modèle de brique datant de juillet 2015 (avec la migration du blog sur la brique fin 2015). Et une fois fonctionnelle, je ne me suis pas occupé de son entretien: ne pas toucher à quelque chose qui fonctionne me semble un bon conseil à suivre en informatique.

Mais là, je n’avais pas vu qu’il y avait des erreurs sur le disque. Ces erreurs n’ont été gênantes qu’une fois la brique éteinte et rallumée. J’ai donc pris le disque dur de la brique (la carte microSD) et je l’ai mis dans mon PC.

Puis, avec la commande lsblk j’ai vu que la partition de ce disque était /dev/sdc1; j’ai alors pu lancer une vérification du disque avec la commande suivante:

# fsck /dev/sdc1
[…là, ça défile et des fois ça pose des questions…]

Quand la question était posée de corriger les erreurs, j’ai répondu oui. Une fois toutes les erreurs corrigées, j’ai relancé la commande pour vérifier qu’il n’y avait plus d’erreur:

# fsck /dev/sdc1
fsck de util-linux 2.25.2
e2fsck 1.42.12 (29-Aug-2014)
/dev/sdc1 : propre, 93335/917568 fichiers, 848399/3859968 blocs

C’est alors, plein d’espoir que j’ai remis le disque dur dans la brique pour la brancher et l’allumer: ça marchait à nouveau ! 🙂

Deuxième problème

Tout content que la brique refonctionne, j’ai payé un coup à boire à la personne qui l’héberge et je suis rentré chez moi. C’est avec un peu de déception que j’ai réalisé le lendemain que la brique ne fonctionnait plus ! :’-(

Ce deuxième problème est aussi lié au fait que j’ai mis en place ma brique en juillet 2015: à partir du moment où l’application vpnclient mettait en place le tunnel chiffré, la brique n’avait plus accès aux DNS (dont on parle dans cette superbe conférence) !

Après demande d’information à mon fournisseur de tunnels, c’est normal pour pleins de raisons diffèrentes, bref je dois utiliser leur DNS.

Deuxième solution

Une fois le problème identifié, la solution n’est pas loin ! Ici, j’ai mis à jour l’application vpnclient et le tour était joué: la dernière version de cette application prends en compte les DNS ! \o/

Je peux donc maintenant bloguer à nouveau, par exemple pour indiquer comment j’ai déplacé ma brique ! 🙂

Prochaines étapes: mise en place de sauvegardes… Stay tuned for more info

 

17 June, 2016 09:13AM by Low Memory

April 28, 2016

hackergotchi for Tanguy Ortolo

Tanguy Ortolo

Pour des cartes restaurant anonymes

Contexte

Dans les années 2000, la RATP et la SNCF on progressivement imposé le remplacement des tickets de papier anonymes par des cartes à puce nommées Navigo, pour les utilisateurs d'abonnements. Le problème, c'est que ces cartes à puces étaient nominatives, et que dans un pays libre, « aller et venir librement, anonymement, est l’une des libertés fondamentales. » La CNIL a donc imposé la création d'une carte Navigo anonyme.

L'histoire bégaie un peu. Dans les années qui viennent, sous la pression de l'État, les opérateurs de titres restaurant vont progressivement imposer le remplacement des titres de papier anonymes par des cartes à puce, qui permettent un plus grand contrôle des usages, afin d'en limiter les utilisations détournées. Le problème, c'est que ces cartes à puce sont nominatives, et que dans un pays libre, se nourrir, et plus généralement consommer librement, anonymement, est l'une des libertés fondamentales. La CNIL devrait donc imposer la création de cartes restaurant anonymes.

C'est possible

Les opérateurs de titres restaurant objecteront peut-être que c'est techniquement impossible. Pour les aider ainsi que la CNIL, voici une description d'un système qui rendrait possible l'utilisation de cartes restaurant anonymes. Comme pour les cartes de transport, choisir l'anonymat peut impliquer de renoncer à certains avantages.

L'entreprise distribuant des titres restaurant à ses salariés dispose d'un stock de quelques cartes anonymes, seulement identifiées par leur numéro. Comme toute carte restaurant, chacune est associée à un compte initialement vide.

Lorsqu'un salarié demandé à disposer d'une carte anonyme, l'entreprise lui fournit une de ces cartes. Elle peut noter et transmettre à l'opérateur le fait que cette carte est maintenant attribuée, mais a interdiction de relever le nom du salarié qui l'utilise. Si le salarié disposait déjà d'une carte nominative, son numéro doit être relevé afin de cesser d'alimenter le compte correspondant, ce qui peut être traité de la même façon qu'un retrait de l'offre de titres restaurant. Évidemment, l'entreprise a interdiction de tenter de dissuader les salariés de choisir l'anonymat, et de pénaliser ceux qui feraient ce choix.

Chaque mois, lors de la distribution des titres restaurant, le salarié utilisateur d'une carte anonyme se présente en personne, comme cela se fait pour des titres en papier. Le responsable approvisionne le compte correspondant au numéro indiqué sur la carte, et note sur un registre séparé que ce salarié a bien bénéficié de la distribution. L'entreprise a interdiction de noter sur ce registre le numéro de la carte créditée, et, d'une façon générale, de noter ou de transmettre tout ce qui pourrait permettre d'associer les noms des salariés avec les numéros des cartes anonymes. Encore une fois, l'entreprise a interdiction de pénaliser les salariés qui se présentent pour une distribution anonyme.

Le salarié utilise sa carte restaurant de façon normale pour régler ses consommations et achats éligibles dans les conditions prévues. Les restaurateurs de enseignes acceptant les paiements par carte restaurant ont interdiction de pénaliser les utilisateurs de cartes anonymes. Seules les fonctionnalités annexes de gestion peuvent être affectées par le caractère anonyme de la carte : ainsi, en cas de perte, l'opposition sur cette carte ne pourra pas être effectuée avec le seul nom du bénéficiaire, mais nécessitera la connaissance de son numéro, faute de quoi elle ne pourra être réalisé, et le crédit restant devra être considéré comme non récupérable. De telles restrictions doivent être justifiées par une raison technique : ainsi, il ne serait pas admissible de restreindre une opération de promotion chez un restaurateur partenaire aux seuls titulaires de cartes nominatives.

28 April, 2016 05:47PM by Tanguy

April 25, 2016

Parking Méditerranée - Gare de Lyon : attention, hostile aux vélos

Parking Méditerranée

La Gare de Lyon est une grande gare parisienne, qui est desservie à la fois par le réseau régional et par plusieurs grandes lignes nationales. On y trouve donc :

  • des riverains, qui habitent ou travaillent près de la gare ;
  • des usagers quotidiens ;
  • des voyageurs occasionnels, qui partent ou reviennent par exemple de week-end ou de vacances en province.

Le parking Méditerranée, opéré par la SAEMES, est situé sous la gare de Lyon, et accueille le même type de clients :

  • des usagers quotidiens, qui y parquent leur véhicule tous les jours ou toutes les nuits ;
  • des voyageurs occasionnels, qui parquent ponctuellement leur véhicule pour quelques jours, voire quelques semaines.

Cet usage est indépendant du type de véhicule, qu'il s'agisse d'une voiture, d'une moto ou d'une bicyclette.

Théoriquement, un accès vélo

Sur sa page Web, le parking Méditerranée - Gare de Lyon affiche un joli logo vélo, qui suggère la possibilité d'y garer sa bicyclette (qu'est-ce que ça pourrait bien vouloir dire d'autre ?).

De surprise en surprise

La réalité est toute autre. Le voyageur qui arrive à vélo au parking Méditerranée va de surprise en surprise (et de pire en pire) :

  1. L'espace vélo n'est pas indiqué, les panneaux donnant seulement le choix entre l'espace voiture et l'espace moto. Faute de mieux, autant choisir l'espace moto, c'est ce qui se fait de plus approchant.
  2. On est censé prendre un ticket, mais la machine n'en distribue pas aux vélos : on a beau appuyer sur le bouton prévu pour cela, rien ne sort et la barrière reste fermée. Qu'à cela ne tienne, un vélo est suffisamment maniable pour contourner la barrière, mais ça commence mal (et ça va mal finir, mais pour le moment, on a un train à prendre)…
  3. Une fois arrivé dans l'espace moto, comme on peut s'y attendre, rien n'est prévu pour fixer des vélos. Peu importe, un cycliste urbain est de toute façon habitué à stationner comme il le peut, une barrière fera donc l'affaire, en vérifiant bien qu'on ne gêne pas le passage ou le stationnement des autres usagers.
  4. Une fois rentré de voyage, et de retour à la gare de Lyon, on constate que l'exploitant du parking a enchaîné la bicyclette, sans un mot d'explication, sans doute parce qu'elle était mal garée, mais comment pourrait-elle être bien garée puisque l'espace vélos n'est pas indiqué ?
  5. À l'accueil, l'exploitant exige un paiement pour libérer le vélo. Pourquoi pas, mais 15 €, c'est un peu cher pour trois jours de stationnement en occupant zéro emplacement.

Un parking hostile aux vélos

Le parking Méditerranée - Gare de Lyon, qui s'affiche sur le Web avec un espace vélo, est en réalité hostile à ce type de véhicule. Le fait d'afficher un espace vélo, qui s'avère en réalité indisponible, pourrait d'ailleurs relèver de la publicité mensongère.

Suite à cette désagréable expérience, j'ai commencé une enquête sur le stationnement vélo dans les parkings publics des grandes gares parisiennes, dont certains indiquent ainsi disposer d'un espace vélo, qui peut s'avérer inexistant. Affaire à suivre.

25 April, 2016 05:01PM by Tanguy

April 11, 2016

Carl Chenet

Richard Stallman ce samedi à Choisy-le-roi

Pour information j’ai découvert ce week-end que Richard Stallman sera présent à la médiathèque de Choisy-le-roi ce samedi 16 avril 2016 à 17h. Pour information des Parisiens indécrottables, c’est en très proche banlieue parisienne :p Comptez par exemple entre 20 et 30 mn depuis le centre de Paris en passant par le RER C pour y arriver.

saint-stallman

Bref si vous n’avez jamais vu le monsieur et ses célèbres conférences ou que vous aimeriez une mise-à-jour sur ses positions, c’est l’occasion de le voir. Pour ma part j’y serai.

Peut-être à samedi donc 😉

11 April, 2016 06:53AM by Carl Chenet

April 07, 2016

« La » communauté du Logiciel Libre, ça n’existe pas

Suivez-moi aussi sur Diaspora*diaspora-banner ou Twitter 

J’avais depuis quelques temps envie d’écrire un billet de blog au sujet de la soi-disant communauté du Logiciel Libre et le dernier article de Frédéric Bezies , où il regrette le manque de coordination et d’unité de cette communauté, m’a donné la motivation pour finalement expliquer pourquoi tant de gens se désillusionnent quant à « cette » communauté.

« La » communauté du Logiciel Libre, ça n’existe pas

Il est en effet vain dans la plupart des cas de parler de « la » communauté du Logiciel Libre. On peut – et je le fais souvent moi-même – parler de la communauté du Logiciel Libre pour regrouper dans un même sac tous les acteurs touchant de près ou de loin au Logiciel Libre, mais c’est une dénomination vague, peu précise et que l’on ne doit pas employer à tort et à travers.

Et pour cause, car aussi bien d’un point de vue technique que d’un point de vue idéologique, nous, les acteurs de cette soi-disant communauté, sommes profondément et sûrement irrémédiablement divisés.

Les communautés techniques

Rappelons-le car beaucoup de personnes même proches du Logiciel Libre ont tendance à l’oublier. 99% du temps, un projet du Logiciel Libre, c’est au départ un individu isolé non rémunéré qui se motive et prend son courage à deux mains pour écrire du code et porter seul – au moins au début – un projet pour répondre à un besoin existant qui le dérange lui.

Ce faisant, il s’insère dans une communauté technique, celle des outils qu’il utilise pour régler son problème, puis le jour où son projet est prêt, s’il fait le choix de le rendre public, dans une communauté idéologique répondant aux critères que l’on verra au chapitre suivant.

python-logo-master-v3-TMLa communauté Python, avec sa propre licence : la PSF, sa propre vision, ses propres objectifs

Au premier niveau, le développeur du Logiciel Libre, c’est donc un utilisateur des outils qui sont mis à disposition par une communauté technique. Il adhère souvent aux idées derrière les outils qu’ils utilisent au quotidien parce qu’il y voit un avantage direct et ressent la cohérence des choix techniques et idéologiques faits par la communauté l’ayant précédé.

Maintenant si on parle de « la » communauté du Logiciel Libre, ça sous-entend que le premier niveau dont je parlais à l’instant se fond  dans un deuxième niveau, un niveau plus vaste, plus abstrait, plus global. Donc plus éloigné du développeur au quotidien, touchant des problématiques qu’il ne ressent peut-être pas tous les jours.

Alors qu’au quotidien pour lui, « sa » communauté, c’est par exemple le langage Python et ses membres, pas Perl. Ou la distribution Debian et les buts du projet Debian, pas les systèmes BSD. On se construit donc aussi en opposition à d’autre communautés techniques et idéologiques.

freebsdFreeBSD, système d’exploitation et suite d’outils qui privilégient la licence BSD

Les développeurs contribuent donc – le plus souvent dans le cadre de leur temps libre, le plus souvent de façon non-rémunérée, et dans ce domaine seule la motivation permet d’avancer – aux sujets qui nous intéressent et nous motivent au sein d’une communauté technique et idéologique et pas sur les sujets dont « la communauté du Logiciel Libre » aurait besoin.

La diversité des acteurs et de leurs idées, de leurs approches techniques et des solutions qu’ils trouvent au quotidien  sont les éléments qui rendent aussi attractif pour beaucoup d’entre nous ce milieu technique et idéologique.

GPL contre BSD/MIT

J’ai évoqué et développé ce point dans l’un de mes précédents articles le danger Github : d’un point de vue idéologique, principalement deux idées du Logiciel Libre coexistent.

La vision incarnée par la licence GPL peut être résumée à une notion fondamentale intégrée par ses défenseurs et ses détracteurs : contaminante.  La GPL va nourrir d’elle-même la communauté en réinjectant automatiquement dans le parc logiciel sous GPL tous les dérivés des logiciels eux-mêmes sous GPL. La communauté sert la communauté. Les utilisateurs de la GPL trouvent cohérents de n’utiliser que du Logiciel Libre pour ne pas nourrir l’ennemi , c’est-à-dire le logiciel privateur.

Les licences BSD/MIT sont pour leur part plus permissives, permissives à l’extrême. Rappelons qu’un logiciel dérivé d’un logiciel sous licence  BSD/MIT peut être déposé sous une licence propriétaire. Les licences BSD/MIT sont donc non-contaminantes. On a donc la liberté de rendre un logiciel – libre à la base – privateur. Ce qui se fait beaucoup et l’on retrouve les systèmes d’exploitation BSD dans nombre de système d’exploitation propriétaires. voir à ce sujet la liste à couper le souffle des produits commerciaux reposant sur FreeBSD.

Les défenseurs des licences BSD/MIT parlent de liberté réelle face à la GPL, ses détracteurs de la liberté de se tirer une balle dans le pied. Étant donné que les défenseurs de ces licences permissives type BSD/MIT trouvent normal la coexistence du Logiciel Libre et du logiciel privateur, ils utilisent eux-mêmes les deux sans problème, ce qui est cohérent idéologiquement.

bsdvsgpl

Donc au final deux visions très différentes du Logiciel Libre – la GPL plus conquérante, les BSD/MIT plus flexibles – coexistent.

Des communautés constituent le Logiciel Libre

On l’a vu, il serait donc plus précis de parler des communautés qui constituent le Logiciel Libre. Elles sont à la fois techniques et idéologiques et apportent des outils concrets à leurs membres. Elles se définissent par rapport à ce qu’elles construisent, à leurs contributions, mais aussi par opposition aux autres communautés techniques et idéologiques. Il est donc impossible de parler d’une communauté du Logiciel Libre, à moins de la réduire au peu d’idées transverses aux différentes communautés techniques et idéologique la constituant.

J’ai pu remarquer que de nombreux intervenants parlent souvent de la communauté du Logiciel Libre pour parler en fait d’un sous-ensemble de celle-ci, en fait de leur communauté.Par exemple un défenseur de la GPL va parler de la communauté du Logiciel Libre en omettant l’idée de liberté complète derrière les licences BSD/MIT. Ou un idéologue auto-proclamé du Logiciel Libre va déclarer de grandes directions que « le Logiciel Libre » devrait prendre dans une approche top-down alors que, comme nous l’avons vu, tous les contributeurs techniques du Logiciel libre intègrent avant tout une communauté technique et idéologique précise, un sous-ensemble de « la » communauté du Logiciel libre.

trollLes trolls, une activité prisée des Libristes

Au final il est peut-être rageant de voir au quotidien des projets s’affronter, se troller, de voir des projets réinventer ce qui existent déjà au lieu de l’améliorer. Il semble même incompréhensible de voir des projets entièrement recoder pour des questions de licences ou parfois juste d’ego entre membres de ce qu’on croit être une même communauté. Mais cela tient à une incompréhension de l’organisation et des interactions des projets du Logiciel Libre entre eux.

L’explication tient au fait que le Logiciel Libre est constitué de nombreuses communautés, qui partagent quelques grandes idées communes certes, mais qui portent chacune des solutions techniques, une vision et une identité propres. Elles arrivent à se rejoindre très ponctuellement autour d’un effort commun sur un point extrêmement consensuel, mais il sera tout simplement impossible de les faire toutes et en permanence converger vers des grands objectifs qui bénéficieraient (ou pas) à  une vague communauté globale dans laquelle se reconnaîtraient tous les acteurs du Logiciel Libre.

La diversité des communautés qui le compose fait la force du Logiciel Libre, nous partageons quelques grandes idées et nous inventons au quotidien nos propres solutions. Et c’est de cette façon que nous avons avancé jusqu’à aujourd’hui.

07 April, 2016 10:00PM by Carl Chenet

April 03, 2016

Nouveau forum pour l’emploi dans la communauté du Logiciel Libre et opensource

Suivez-moi aussi sur Diaspora*diaspora-banner ou Twitter 

Un rapide message pour annoncer le lancement d’un forum dédié à l’emploi dans la communauté du Logiciel Libre et opensource :

Le forum de LinuxJobs.fr : https://forum.linuxjobs.fr

forum-small

Devant le succès de LinuxJobs.fr , le site d’emploi de la communauté du Logiciel Libre et opensource, et la communauté d’utilisateurs qui s’est constitué autour, il était dommage de s’arrêter à l’échange d’offres d’emplois. C’est pourquoi LinuxJobs.fr créé un lieu d’échange et de discussions pour sa communauté, avec des catégories comme les rémunérations, le droit du travail, les questions des jeunes diplômés, des les étudiants ou l’entrepreunariat.

banieres linux vert

Ce nouveau forum est fièrement propulsé par le nouveau moteur de forums Flarum, un logiciel libre sous licence MIT.

Au plaisir de discuter bientôt avec vous sur le forum de LinuxJobs.fr.

Quelques liens pour finir :

03 April, 2016 10:00PM by Carl Chenet

March 31, 2016

Le danger Github (revu et augmenté)

Suivez-moi aussi sur Diaspora*diaspora-banner ou Twitter 

Alors que le projet CPython (implémentation historique du projet Python) a annoncé son passage chez Github (avec quelques restrictions, nous reviendrons là-dessus), il est plus que jamais important de s’interroger sur les risques encourus d’utiliser un logiciel propriétaire dans notre chaîne de création du Logiciel Libre.

Des voix critiques s’élèvent régulièrement contre les risques encourus par l’utilisation de Github par les projets du Logiciel Libre. Et pourtant l’engouement autour de la forge collaborative de la startup Californienne à l’octocat continue de grandir.

codercatL’octocat, mascotte de Github

Ressentis à tort ou à raison comme simples à utiliser, efficaces à l’utilisation quotidienne, proposant des fonctionnalités pertinentes pour le travail collaboratif en entreprise ou dans le cadre d’un projet de Logiciel Libre, s’interconnectant aujourd’hui à de très nombreux services d’intégration continue, les services offerts par Github ont pris une place considérable dans l’ingénierie logicielle ces dernières années.

Quelles sont ces critiques et sont-elles justifiées ? Nous proposons de les exposer dans un premier temps dans la suite de cet article avant de peser le pour ou contre de leur validité.

1. Points critiques

1.1 La centralisation

L’application Github appartient et est gérée par une entité unique, à savoir Github, inc, société américaine. On comprend donc rapidement qu’une seule société commerciale de droit américain gère l’accessibilité à la majorité des codes sources des applications du Logiciel Libre, ce qui représente un problème pour les groupes utilisant un code source qui devient indisponible, pour une raison politique ou technique.

github-logo

De plus cette centralisation pose un problème supplémentaire : de par sa taille, ayant atteint une masse critique, elle s’auto-alimente. Les personnes n’utilisant pas Github, volontairement ou non, s’isolent de celles qui l’utilisent, repoussées peu à peu dans une minorité silencieuse. Avec l’effet de mode, on est pas « dans le coup » quand on n’utilise pas Github, phénomène que l’on rencontre également et même devenu typique des réseaux sociaux propriétaires (Facebook, Twitter, Instagram).

1.2 Un logiciel privateur

Lorsque vous interagissez avec Github, vous utilisez un logiciel privateur, dont le code source n’est pas accessible et qui ne fonctionne peut-être pas comme vous le pensez. Cela peut apparaître gênant à plusieurs points de vue. Idéologique tout d’abord, mais peut-être et avant tout pratique. Dans le cas de Github on y pousse du code que nous contrôlons hors de leur interface. On y communique également des informations personnelles (profil, interactions avec Github). Et surtout un outil crucial propriétaire fourni par Github qui s’impose aux projets qui décident de passer chez la société américaine : le gestionnaire de suivi de bugs.

windowsWindows, qui reste le logiciel privateur par excellence, même si d’autres l’ont depuis rejoint

1.3 L’uniformisation

Travailler via l’interface Github est considéré par beaucoup comme simple et intuitif. De très nombreuses sociétés utilisent maintenant Github comme dépôt de sources et il est courant qu’un développeur quittant une société retrouve le cadre de travail des outils Github en travaillant pour une autre société. Cette fréquence de l’utilisation de Github dans l’activité de développeur du Libre aujourd’hui participe à l’uniformisation du cadre de travail dudit développeur.

L'uniforme évoque l'armée, ici l'armée des clonesL’uniforme évoque l’armée, ici l’armée des clones

2. Validité des points critiques

2.1 Les critiques de la centralisation

2.1.1 Taux de disponibilité du service

Comme dit précédemment, Github est aujourd’hui la plus grande concentration de code source du Logiciel Libre. Cela fait de lui une cible privilégiée.  Des attaques massives par dénis de service ont eu lieu en mars et août 2015. De même, une panne le 15 décembre 2015 a entraîné l’indisponibilité de 5% des dépôts. Idem le 15 novembre. Et il s’agit des incidents récents déclarés par les équipes de Github elles-mêmes. On peut imaginer un taux d’indisponibilité moyen des services bien supérieur.

githubdown

2.1.2 Blocage de la construction du Logiciel Libre par réaction en chaîne

Aujourd’hui plusieurs outils de gestion des dépendances comme npm dans le monde javascript, Bundler dans le monde Ruby ou même pip pour le monde Python sont capables d’aller chercher le code source d’une application directement depuis Github. Les projets du Logiciel Libre étant de plus en plus intriqués, dépendants les uns des autres, si l’un des composants de la chaîne de construction vient à manquer, c’est toute la chaîne qui s’arrête.

Un excellent exemple de cet état de fait est la récente affaire du npmgate (voir l’article Du danger d’un acteur non-communautaire dans votre chaîne de production du Logiciel Libre). Github peut très bien demain être mis en demeure par une entreprise de retirer du code source de son dépôt, ce qui pourrait entraîner une réaction en chaîne menant à l’impossibilité de construire de nombreux projets du Logiciel Libre, comme cela vient d’arriver à la communauté Node.js à cause de la société Npm, inc. gérant l’infrastructure de l’installeur automatisé npm.

2.2 Un peu de recul historique : SourceForge

Même si l’ampleur du phénomène n’a pas été la même, il est bon de rappeler que Github n’est pas apparu ex-nihilo et avait un prédécesseur ayant joui en son temps d’un engouement important : SourceForge.

Fortement centralisé, reposant également sur de fortes interactions avec la communauté, SourceForge est un SAAS fortement vieillissant  ces dernières années et subit une véritable hémorragie de ses utilisateurs au profit de Github. Ce qui signifie beaucoup d’ennuis pour ceux qui y sont restés. Pour le projet Gimp, il s’agit tout d’abord d’abus publicitaires trompeurs indignes, qui entraînent également le départ du projet VLC , puis l’apparition d’installeurs comprenant des adwares se faisant passer pour l’installeur officiel Windows de Gimp. Et enfin purement et simplement le piratage du compte SourceForge du projet Gimp par… les équipes de SourceForge elle-même.

Nous voyons ici des exemples récents et très concrets des pratiques dont sont capables les sociétés commerciales lorsqu’elles sont sous la pression de leurs actionnaires. D’où la nécessité de bien comprendre l’enjeu représenté par le fait de leur confier une centralisation des données et des échanges ayant de fortes conséquences sur le fonctionnement et les usages de la communauté du Logiciel Libre et opensource.

 

2.3 Les critiques relatives à utiliser un logiciel privateur

2.3.1 Une communauté, différents rapports au logiciel propriétaire

Cette critique, avant tout idéologique, se heurte à la conception même que chacun des membres de la communauté se fait du Logiciel Libre et opensource, et en particulier d’un critère : contaminant ou non, qu’on résume en général par GPL versus MIT/BSD.

 

bsdvsgpl

Les défenseurs du Logiciel Libre contaminant vont être gênés d’utiliser un logiciel propriétaire car ce dernier ne devrait pas exister. Il doit être assimilé, pour citer Star Trek,  car il est une boîte noire communicante, qui met en danger la vie privée, détourne nos usages à des fins commerciales, gêne ou contraint la liberté de jouir entièrement de ce qu’on a acquis, etc.

gplv3

Les pendants d’une totale liberté sont moins complexés dans leur utilisation des logiciels privateurs puisqu’ils acceptent l’existence desdits logiciels privateurs au nom d’une liberté sans restriction. Ils acceptent même que le code qu’ils développent aboutissent dans ces logiciels, ce qui arrive bien plus souvent qu’on ne le croit, voir à ce sujet la liste à couper le souffle des produits commerciaux reposant sur FreeBSD. On peut donc voir dans cette aile de la communauté du Logiciel Libre une totale sérénité à utiliser Github. Et ce qui est cohérent vis-à-vis de l’idéologie soutenue. Si vous êtes déjà allé au Fosdem, un coup d’œil dans l’amphithéâtre Janson permet de se rendre compte de la présence massive de portables Apple tournant sous MacOSX.

FreeBSD, principal projet des BSD sous licence MITFreeBSD, principal projet des BSD sous licence BSD

2.3.2 Les pertes de données et obstructions liées à l’usage d’un logiciel privateur

Mais au-delà de cet aspect idéologique pur et pour recentrer sur l’infrastructure de Github elle-même, l’utilisation du gestionnaire de suivi de bugs de Github pose un problème incontournable. Les rapports de bugs sont la mémoire des projets du Logiciel Libre. Il constitue le point d’entrée des nouveaux contributeurs, des demandes de fonctionnalités, des rapports de bugs et donc la mémoire, l’histoire du projet qui ne peut se limiter au code seul. Il est courant de tomber sur des rapports de bugs lorsque vous copiez/collez votre message d’erreur dans un moteur de recherche. Mémoire précieuse non seulement pour le projet lui-même, mais aussi pour ses utilisateurs actuels et à venir.

Github propose d’extraire les rapports de bugs via son API, certes, mais combien de projets anticiperont une éventuelle défaillance de Github  ou un retournement de situation arrêtant brusquement le service ? Très peu à mon avis. Et comment migrer vers un nouveau système de suivi de bugs les données fournies par Github ?

L’exemple de l’utilitaire de gestion de listes de choses à faire (TODO list) Astrid, racheté par Yahoo! il y a quelques années reste un très bon exemple de service ayant grandi rapidement, largement utilisé et qui a fermé du jour au lendemain, proposant pendant quelques semaines seulement d’extraire ses données. Et il s’agissait là d’un simple gestionnaire de tâches à faire. Le même problème chez Github serait dramatiquement plus difficile à gérer pour de très nombreux projets, si on leur laisse la possibilité de le gérer. Certes le code reste disponible et pourra continuer de vivre ailleurs, mais la mémoire du projet sera perdue, alors qu’un projet comme Debian approche aujourd’hui les 800000 rapports de bugs. Une vraie mine d’or d’informations sur les problèmes rencontrés, les demandes de fonctionnalités et le suivi de ces demandes. Les développeurs du projet CPython passant chez Github ont anticipé ce problème et ne vont pas utiliser le système de suivi de bugs de Github.

mastering-issuesIssues, le suivi de bug propriétaire de Github

Autre perte si Github disparaît ou devient inaccessible : le travail de revue des « push requests » (abrégées par PRs) en cours. Pour les lecteurs qui ne connaîtraient pas cette fonctionnalité de Github, il s’agit d’adresser de cloner le dépôt Github d’un projet, de modifier ce clone pour l’adapter à vos besoins, puis ensuite de proposer vos modifications au dépôt d’origine. Le propriétaire du dépôt d’origine va alors étudier les modifications qui lui ont été proposées et si elles lui conviennent les fusionner à son propre dépôt. Il s’agit donc d’une fonctionnalité très importante offerte de Github, qui propose de réaliser les différentes opérations graphiquement via son interface.

Toutefois le travail de revue des modifications proposées peut être long et il est courant d’avoir, pour un projet qui marche bien, plusieurs PRs en cours. Et il est également courant d’échanger des commentaires via ces PRs et/ou via le système de suivi de bugs propriétaires de Github dont nous avons parlé plus haut.

Le code en lui-même n’est donc pas perdu si Github devient inaccessible (quoique, voire plus bas un cas spécifique), mais le travail de revue matérialisée par les éventuels demandes et commentaires présents dans les PRs et les suivis de bugs associés l’est bien, lui. Rappelons également que Github permet de cloner des projets via son interface web propriétaire, puis d’y apporter toujours via la même interface des modifications et ensuite de générer des PRs sans télécharger aucunement le code sur son poste. Dans ce cas de figure, si Github devient indisponible, la perte du code et du travail en cours est totale.

Enfin certains utilisateurs se servent de Github entre autre comme d’une application de favoris, afin de suivre l’activité de leurs projets préférés en s’abonnant à ces projets par la fonctionnalité « Watch ».  Ce travail de réunion de données pour la veille technologique est perdu  en cas d’indisponibilité du service Github.

Proposed Debian LogoDebian, l’un des principaux projets du Logiciel Libre avec autour de 1000 contributeurs officiels

 

2.4 L’uniformisation

La communauté du Logiciel Libre oscille sans cesse entre un besoin de normes afin de réduire le travail nécessaire pour l’interopérabilité et l’attrait de la nouveauté, caractérisée par l’intrinsèque besoin de différence vis-à-vis de l’existant.

Github a popularisé l’utilisation de Git, magnifique outil qui aujourd’hui touche des métiers bien différents des programmeurs auxquels il était initialement lié. Peu à peu, tel un rouleau compresseur, Git a pris une place si centrale que considérer l’usage d’un autre gestionnaire de sources est quasiment impossible aujourd’hui, particulièrement en entreprise, malgré l’existence de belles alternatives qui n’ont malheureusement pas le vent en poupe, comme Mercurial.

git-logo

Un projet de Logiciel Libre qui naît aujourd’hui, c’est un dépôt Git sur Github avec un README.md pour sommairement le décrire. Les autres voies sont totalement ostracisées. Et quelle est la punition pour celui qui désobéit ? Peu ou pas de contributeurs potentiels. Il semble très difficile de pousser aujourd’hui le contributeur potentiel à se lancer dans l’apprentissage d’un nouveau gestionnaire de sources ET une nouvelle forge pour chaque projet auquel on veut contribuer. Un effort que fournissait pourtant tout un chacun il y a quelques années.

Et c’est bien dommage car Github, en proposant une expérience unique et originale à ses utilisateurs, taille  à grands coups de machette dans les champs des possibles. Alors oui, sûrement que Git est aujourd’hui le meilleur des système de gestion de versions. Mais ça n’est pas grâce à cette domination sans partage qu’un autre pourra émerger. Et cela permet à Github d’initier à Git les nouveaux arrivants dans le développement  à un ensemble de fonctionnalités très restreint, sans commune mesure avec la puissance de l’outil Git lui-même.

3. Centralisation, uniformisation, logiciels privateurs et bientôt… fainéantise ?

Le combat contre la centralisation est une part importante de l’idéologie du Logiciel Libre car elle accroît le pouvoir de ceux qui sont chargés de cette centralisation et qui la contrôlent sur ceux qui la subissent. L’aversion à l’uniformisation née du combat contre les grandes firmes du logiciel souhaitant imposer leur vision fermée et commerciale du monde du logiciel a longtemps nourri la recherche réelle d’innovation et le développement d’alternatives brillantes. Comme nous l’avons décrit, une partie de la communauté du Libre s’est construit en opposition aux logiciels privateurs, les considérant comme dangereux. L’autre partie, sans vouloir leur disparition, a quand même choisi un modèle de développement à l’opposé de celui des logiciels privateurs, en tout cas à l’époque car les deux mondes sont devenus de plus en plus poreux au cours des dernières années.

 

L’effet Github est donc délétère au point de vue des effets qu’il entraîne : la centralisation,  l’uniformisation, l’utilisation de logiciels privateurs comme leur système de gestion de version, au minimum. Mais la récente affaire de la lettre « Cher Github… » met en avant un dernier effet, totalement inattendu de mon point de vue : la fainéantise. Pour les personnes passées à côté de cette affaire, il s’agit d’une lettre de réclamations d’un nombre très important de représentants de différents projets du Logiciel Libre qui réclament à l’équipe de Github d’entendre leurs doléances, apparemment ignorées depuis des années, et d’implémenter de nouvelles fonctionnalités demandées.

Mais depuis quand des projets du Logiciel Libre qui se heurtent depuis des années à un mur tentent-ils de faire pleurer le mur et n’implémentent pas la solution qui leur manquent ? Lorsque Torvald a subi l’affaire Bitkeeper et que l’équipe de développement du noyau Linux n’a plus eu l’autorisation d’utiliser leur gestionnaire de versions, Linus a mis au point Git. Doit-on rappeler que l’impossibilité d’utiliser un outil ou le manque de fonctionnalités d’un programme est le moteur principal de la recherche d’alternative et donc du Logiciel Libre ? Tous les membres de la communauté du Logiciel Libre capable de programmer devrait avoir ce réflexe. Vous n’aimez pas ce qu’offre Github ? Optez pour Gitlab. Vous n’aimez pas Gitlab ? Améliorez-le ou recodez-le.

gitlabLogo de Gitlab, une alternative possible à Github

Que l’on soit bien d’accord, je ne dis pas que tout programmeur du Libre qui fait face à un mur doit coder une alternative. En restant réaliste, nous avons tous nos priorités et certains de nous aiment dormir la nuit (moi le premier). Mais lorsqu’on voit 1340 signataires de cette lettre à Github et parmi lesquels des représentants de très grands projets du Logiciel Libre, il me paraît évident que les volontés et l’énergie pour coder une alternative existe. Peut-être d’ailleurs apparaîtra-t-elle suite à cette lettre, ce serait le meilleur dénouement possible à cette affaire.

Finalement, l’utilisation de Github suit cette tendance de massification de l’utilisation d’Internet. Comme aujourd’hui les utilisateurs d’Internet sont aspirés dans des réseaux sociaux massivement centralisés comme Facebook et Twitter, le monde des développeurs suit logiquement cette tendance avec Github. Même si une frange importante des développeurs a été sensibilisée aux dangers de ce type d’organisation privée et centralisée, la communauté entière a été absorbée dans un mouvement de centralisation et d’uniformisation. Le service offert est utile, gratuit ou à un coût correct selon les fonctionnalités désirées, confortable à utiliser et fonctionne la plupart du temps. Pourquoi chercherions-nous plus loin ? Peut-être parce que d’autres en profitent et profitent de nous pendant que nous sommes distraits et installés dans notre confort ? La communauté du Logiciel Libre semble pour le moment bien assoupie.

cat-sleeping-fireplaceLe « lion » devant la cheminée

Texte sous licence Creative Commons CC BY-ND 3.0 FR

31 March, 2016 09:00PM by Carl Chenet

March 28, 2016

Du danger d’un acteur non-communautaire dans votre chaîne de production du Logiciel Libre

Suivez-moi aussi sur Diaspora*diaspora-banner ou Twitter 

La récente affaire désormais connue sous le nom de npmgate (voir plus bas si cet événement ne vous dit rien) est encore une illustration à mon sens du danger intrinsèque d’utiliser le produit possédé et/ou contrôlé par un acteur non-communautaire dans sa chaîne de production du Logiciel Libre. J’ai déjà tenté à plusieurs reprises d’avertir mes consœurs et confrères du Logiciel Libre sur ce danger, en particulier au sujet de Github dans mon billet de blog Le danger Github.

L’affaire npmgate

Pour rappel sur cette affaire précise du npmgate, l’entreprise américaine Kik.com a demandé à l’entreprise npm Inc., également société américaine, qui gère le site npmjs.com et l’infrastructure derrière l’installeur automatisé de modules Node.js npm, de renommer un module nommé kik écrit par Azer Koçulu, auteur prolifique de cette communauté. Il se trouve qu’il est également l’auteur d’une fonction left-pad de 11 lignes massivement utilisée comme dépendance dans de très très nombreux logiciels enNode.js. Ce monsieur avait exprimé un refus à la demande de kik.com.

Npm-logo

Cette entreprise, qui pour des raisons obscures de droits d’auteur semblait prête à tout pour faire respecter sa stupide demande (elle utilise d’ailleurs elle-même du Logiciel Libre, à savoir au moins jquery, Python, Packer et Jenkins d’après leur blog et en profite au passage pour montrer ainsi sa profonde gratitude à l’égarde de la communauté), s’est donc adressé à npm, inc, qui, effrayée par une éventuelle violation du droit d’auteur, a obtempéré, sûrement pour éviter tout conflit juridique.

Azer Koçulu, profondément énervé d’avoir vu son propre droit d’auteur et sa volonté bafoués, a alors décidé de retirer de la publication sur npmjs.com l’ensemble de ses modules, dont le très utilisé left-pad. Bien que npmjs.com ait apparemment tenté de publier un module avec le même nom, le jeu des dépendances et des différentes versions a provoqué une réaction en chaîne provoquant l’échec de la construction de très nombreux projets.

Sourceforge, Github, npmjs.com et … bientôt ?

Sourceforge, devant un besoin accru de rentabilité et face à la desaffection de ses utilisateurs au profit, on l’imagine, de Github, a commencé à ne plus respecter les prérequis essentiels d’une forge logicielle respectueuse de ses utilisateurs.

sourceforge-logo

J’ai présenté assez exhaustivement les dangers liés à l’utilisation de Github dans une chaîne de production du Logiciel dans mon article de blog le danger Github, à savoir en résumé la centralisation, qui avec de nombreux installeurs automatisés qui vont maintenant directement chercher les différents composants sur Github, si Github vient à retirer une dépendance, il se produira une réaction en chaîne équivalente au npmgate. Et cela n’est qu’une question de temps avant que cela n’arrive.

Autres risques, l’emploi de logiciel propriétaire comme l’outil de suit de bugs de Github issues, la fermeture et la portabilité limitées des données hébergées par eux et l’effet plus insidieux mais de plus en plus réel d’une sorte de fainéantise communautaire, inédite dans  notre communauté dans la recherche de solutions libres à des produits propriétaires existants et hégémoniques, sentiment également ressenti par d’autres.

github-logo

Le danger de l’acteur non-communautaire

Devant la massification des interdépendances entre les différents projets et le développement important du Logiciel Libre, aujourd’hui rejoint par les principaux acteurs hier du logiciel privateur comme Microsoft ou Apple qui aujourd’hui adoptent et tentent de récupérer à leur profit nos usages, il est plus que jamais dangereux de se reposer sur un acteur non-communautaires, à savoir en général une entreprise, dans la chaîne de création de nos logiciels.

microsoft-free.png

C’est un modèle séduisant à bien des égards. Facile, séduisant, en général peu participatif (on cherche à ce que vous soyez un utilisateur content), souvent avec un niveau de service élevé par rapport à ce que peut fournir un projet communautaire naissant, une entreprise investissant dans un nouveau projet, souvent à grand renfort de communication, va tout d’abord apparaître comme une bonne solution.

Il en va malheureusement bien différemment sur le moyen ou long terme comme nous le prouve les exemples suscités. Investir dans la communauté du Logiciel Libre en tant qu’utilisateur et créateur de code assure une solution satisfaisant tous les acteurs et surtout pérenne sur le long terme. Ce que chacun de nous recherche car bien malin qui peut prévoir le succès et la durée de vie qu’aura un nouveau projet logiciel.

28 March, 2016 09:00PM by Carl Chenet

March 17, 2016

hackergotchi for Aur&#233;lien Jarno

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

17 March, 2016 04:34PM by aurel32

February 25, 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 by ascendances

February 23, 2016

hackergotchi for Aur&#233;lien Jarno

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 by aurel32

May 19, 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 by Olivier Berger

May 13, 2015

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 by Olivier Berger

April 11, 2015

hackergotchi for Roland Mas

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

December 10, 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 by obergix

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 by Olivier Berger

August 20, 2014

hackergotchi for Aur&#233;lien Jarno

Aurélien Jarno

MIPS Creator CI20

I have received two MIPS Creator CI20 boards, thanks to Imagination Technologies. It’s a small MIPS32 development board:

mips-ci20

As you can see it comes in a nice packaging with a world-compatible power adapter. It uses a Ingenic JZ4780 SoC with a dual core MIPS32 CPU running at 1.2GHz with a PowerVR SGX540 GPU. The board is fitted with 1GB of RAM, 8GB of NOR flash, HDMI output, USB 2.0 ports, Ethernet + Wi-Fi + BlueTooth, SD card slot, IR receiver, expansion headers and more. The schematics are available. The Linux kernel and the U-Boot bootloader sources are also available.

Powering this board with a USB keyboard, a USB mouse and a HDMI display, it boots off the internal flash on a Debian Wheezy up to the XFCE environment. Besides the kernel, the Wi-Fi + Bluetooth firmware, and very few configuration changes, it runs a vanilla Debian. Unfortunately I haven’t found time to play more with it yet, but it looks already quite promising.

The board has not been formally announced yet, so I do not know when it will become available, nor the price, but if you are interested I’ll bring it to DebConf14. Don’t hesitate to ask me if you want to look at it or play with it.

20 August, 2014 08:52PM by aurel32

August 15, 2014

Intel about to disable TSX instructions?

Last time I changed my desktop computer I bought a CPU from the Intel Haswell family, the one available on the market at that time. I carefully selected the CPU to make sure it supports as many instructions extensions as possible in this family (Intel likes segmentation, even high-end CPUs like the Core i7-4770k do not support all possible instructions). I ended-up choosing the Core i7-4771 as it supports the “Transactional Synchronization Extensions” (Intel TSX) instructions, which provide transactional memory support. Support for it has been recently added in the GNU libc, and has been activated in Debian. By choosing this CPU, I wanted to be sure that I can debug this support in case of bug report, like for example in bug#751147.

Recently some computing websites started to mention that the TSX instructions have bugs on Xeon E3 v3 family (and likely on Core i7-4771 as they share the same silicon and stepping), quoting this Intel document. Indeed one can read on page 49:

HSW136. Software Using Intel TSX May Result in Unpredictable System Behavior

Problem: Under a complex set of internal timing conditions and system events, software using the Intel TSX (Transactional Synchronization Extensions) instructions may result in unpredictable system behavior.
Implication: This erratum may result in unpredictable system behavior.
Workaround: It is possible for the BIOS to contain a workaround for this erratum.

And later on page 51:

Due to Erratum HSw136, TSX instructions are disabled and are only supported for software development. See your Intel representative for details.

The same websites tell that Intel is going to disable the TSX instructions via a microcode update. I hope it won’t be the case and that they are going to be able to find a microcode fix. Otherwise it would mean I will have to upgrade my desktop computer earlier than expected. It’s a bit expensive to upgrade it every year and that’s a the reason why I skipped the Ivy Bridge generation which didn’t bring a lot from the instructions point of view. Alternatively I can also skip microcode and BIOS updates, in the hope I won’t need another fix from them at some point.

15 August, 2014 04:02PM by aurel32

June 18, 2014

Debian is switching (back) to GLIBC

Five years ago Debian and most derivatives switched from the standard GNU C Library (GLIBC) to the Embedded GLIBC (EGLIBC). Debian is now about to take the reverse way switching back to GLIBC, as EGLIBC is now a dead project, the last release being the 2.19 one. At the time of writing the glibc package has been uploaded to experimental and sits in the NEW queue.

EGLIBC is dead for a good reason: the GLIBC development has changed a lot in the recent years, due to two major events: Ulrich Drepper leaving Red Hat and the GLIBC development, and the GLIBC steering committe self-dissolving. This has resulted in a much more friendly development based on team work with good cooperation. The development is now based on peer review, which results in less buggy code (humans do make mistakes). It has also resulted in things that were clearly impossible before, like using the same repository for all architectures, and even getting rid of the ports/ directory. Before we used to have two sets of architectures, the main ones in the glibc repository with architectures like x86, SuperH or SPARC, and the secondary ones in the glibc-ports repository with architectures like ARM or MIPS. As you can see the separation was quite arbitrary, and often leaded to missing changes on the secondary architectures. We also got real stable branches, with regular fixes.

The most important EGLIBC features have been merged to GLIBC, including for example the use of non-bash but POSIX shell, or the renaming of reserved keywords. The notable exception is the support for configurable components, which we originally planned to use for Debian-Installer, by building a smaller flavor using -Os and without NIS and RPC support. At the end we never worked on that, and it seems that the hardware targeted by Debian has grown faster than the GLIBC size, so that is not really a big loss. At the end, we ended up with only 5 missing patches from the EGLIBC tree:

The package names are unchanged (except the source package and the binary package containing the sources) so the transition is fully transparent for the users.

I would like to thank all the CodeSourcery employees who worked on EGLIBC, with a special thank to Joseph Myers who spent countless hours to merge the most important EGLIBC changes back to GLIBC, and sent regular emails about the merge status. I would also like to thanks all the people on the GLIBC side that made the change to happen, and all persons participating in the GLIBC development.

18 June, 2014 08:04PM by aurel32

April 11, 2014

hackergotchi for Roland Mas

Roland Mas

Une page de publicité

Allez, c'est vendredi, c'est permis, je vais m'autoriser deux petites annonces.

Premièrement : rappelez-vous Minami Taiko, ce groupe de tambours japonais du sud de la France. Bon, nous on est des amateurs, mais il se trouve qu'on fait venir, pour le festival Escale à Sète, un vrai groupe de taikos du Japon et tout. Ils s'appellent SEN, et ils vont faire quelques animations musicales dans Sète du 18 au 21 avril. Et avant de repartir dans leur lointain Cipango, ils feront un vrai concert à Montpellier, le mardi 22 avril au soir, sur le campus de l'INRA/Supagro. Et devinez qui fait la première partie ? Minami Taiko, voilà qui ! Donc si vous voulez découvrir le taiko ou voir quelques amateurs suivis d'un vrai groupe, faites donc un tour sur le site de Minami Taiko. À noter qu'il y a aussi un atelier d'initiation le même jour si ça vous intéresse.

Deuxièmement : je suis fier de vous présenter un petit site web que c'est moi qui l'ai fait avec mes petits doigts délicats. Ça s'appelle Chacun sa part, et ça sert à faire des comptes entre amis, genre quand on part en vacances ensemble, ou qu'on fait régulièrement des dépenses partagées dans un groupe de gens. Pour éviter des comptes d'apothicaire à chaque restau, chaque tournée au bar, chaque passage en caisse, on saisit la dépense sur le site, on dit qui a payé et qui a participé, et le site calcule automatiquement les soldes de chacun et propose des suggestions de remboursements pour rééquilibrer les comptes. Y'a un système d'invitations pour que chacun puisse consulter l'état du groupe et saisir des dépenses, des QR-codes pour faciliter la vie aux utilisateurs de smartphone, et même si ça n'a pas encore été testé à grande échelle ça a été validé par une poignée de testeurs dans différentes configurations. Allez-y, c'est cadeau. Chacun sa part. Point com.

11 April, 2014 08:06AM

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

November 15, 2013

10 ans !

Eh ben dites-donc mes aïeux, le temps passe. Le 15 novembre 2003, j'émettais ma première facture en tant que consultant indépendant.

Eh ben dix ans plus tard, y'a eu des hauts et des bas, mais globalement tout va bien, et je continue à faire des factures de temps en temps, et ça me plaît toujours autant.

Touchons du bois pour que ça continue, et on en reparle dans dix ans !

15 November, 2013 02:45PM