Informatique

J'ai contribué à Linux

Tuesday, 07 October 2014
|
Écrit par
Grégory Soutadé

Tux

Ça y est, je viens de contribuer à Linux ! Je ne parle pas du système d'exploitation GNU/Linux, que l'on raccourci souvent en "Linux" chez le grand public (la confusion est volontaire), mais bel et bien du noyau Linux, à savoir la partie qui gère directement le matériel (pour l'exporter aux logiciels sus-jacent). Comme vous le savez, il n'y a pas que les barbus intégristes vivant dans une cave qui ont un noyau Linux, mais bel et bien 95% des utilisateurs de smartphones (grâce à Android). On peut aussi rajouter plus de 90% des supercalculateurs, une bonne 20% des serveurs et quelques pourcent chez les utilisateurs finaux.

Le bug

Le bug corrigé (car oui, c'était un bug), fait partie du sous-système mmc (MultiMediaCard). Il s'agit d'une mémoire de stockage contenue dans les cartes SD, mais aussi intégrée dans la plupart des systèmes embarqués tels que les téléphones. Bref, il est possible de partitionner une mmc physiquement (sans possibilité de retour arrière). Cette opération se fait en deux temps : écriture des paramètres et finalisation (bit EXT _ CSD _ PARTITION _ SETTING _ COMPLETED). Le noyau précédent ne vérifiait pas la finalisation et utilisait les données de partitionnement si elles étaient présentes (ce qui engendre des erreurs par la suite).

Pourquoi ce problème est-il passé à la trappe ? Parce que la plupart des mémoires sortent d'usine déjà partitionnées. Pour le reproduire, il faut avoir une mmc vierge et faire l'opération manuellement.

Développement Linux

Les choses commencent à devenir drôle à partir de maintenant. La communauté qui développe le noyau est composée de développeurs, de mainteneurs et d'UN intégrateur. Vu le travail monstre qui est réalisé, l'intégrateur à savoir Linus Torvald en personne (l'initiateur du projet) doit faire confiance à des mainteneurs pour chaque sous-système du noyau. Ces mainteneurs sont chargés de récolter les modifications (patchs) des développeurs et participent éventuellement eux-mêmes à ces modifications. La plupart travaillent pour une entreprise ou sont rémunérés par une fondation.

Autant le dire tout de suite : le niveau technique de toutes ces personnes est très important. En plus de cela, il faut respecter scrupuleusement les normes de codage du dictateur sous peine de se faire jeter lamentablement. Pour ma part, j'ai eu affaire à Ulf Hansson (un des mainteneurs du sous-système mmc) qui travaille pour la fondation Linaro. Ce qui est drôle c'est que, suite aux échanges, je suis passé d'une simple modification (~ 17 lignes) à une série de trois patchs (~ 176 lignes) + une lettre de couverture (cover letter) expliquant en détail la nature du patch. Il m'a fallu pas moins de 6 versions sur deux mois (principalement des questions de forme) pour arriver à un résultat parfait, ce qui peut être vraiment décourageant.

Déroulement des opérations :

  • Mardi 17 juillet 2014 : Permière version envoyée sur la liste
  • Mercredi 13 août 2014 : Réponse d'Ulf
  • Lundi 18 août 2014 : Après quelques discussions, soumission de la deuxième version (améliorée)
  • Lundi 18 août 2014 : Réponse d'Ulf, Les patchs ont le même entête et il manque l'historique.
  • Lundi 18 août 2014 : Soumission de la troisième version
  • Lundi 8 septembre 2014 : Réponse d'Ulf : c'est cool, mais le patch bouge du code ET fixe un bug en même temps
  • Jeudi 11 septembre 2014 : Soumission de la quatrième version, trois patchs
  • Jeudi 11 septembre 2014 : Réponse d'Ulf, le second patch ne compile pas. Il faudrait être plus clair dans les explications et il y a des accolades inutiles
  • Vendredi 12 septembre 2014 : Soumission de la cinquième version avec une lettre de couverture contenant tous les détails du patchset
  • Lundi 15 septembre 2014 : Réponse de Jaehoon Chung : j'ai oublié de supprimer les accolades
  • Lundi 15 septembre 2014 : Soumission de la sixième version
  • Jeudi 18 septembre 2014 : Acception du patch par Ulf

Que ce fut long ! Deux mois pour pousser un patch. Pour autant, ce n'est pas fini. Le patch a été intégré dans la branche 'next' d'Ulf. Celle-ci sera intégrée le lendemain dans la branche next du noyau qui servira de base pour la prochaine version (3.18).

Outils

Il y a plusieurs façons de générer un patch. Au début, je n'avais pas envie de récupérer les gigas octets que représentent le git du noyau, donc c'était à la main à partir d'un tar. On se rend vite compte que pour un patch un peu plus évolué sur un noyau qui bouge tout le temps, il faut absolument passer par git et ses commandes magiques : git-format-patch/git-apply/git-am. En plus d'être efficaces, elles ont été conçues pour ça (et ne parlons pas de la possibilité de créer des branches de développement pour tester/valider ses patchs). Il faut juste avoir le courage de faire le clone initial...

Conclusion

Envoyer un patch pour la première fois relève du parcours du combattant ! La modification est maintenant intégrée dans le noyau 3.18 (sortie définitive décembre 2014). Mes quelques lignes de code seront donc exécutées au démarrage des prochains smartphones équipés d'un noyau d'une version égale ou supérieure à 3.18. Donc, si ça plante, ce sera peut-être un peu de ma faute :)

gPass v0.5.1

Thursday, 28 August 2014
|
Écrit par
Grégory Soutadé

Logo gPass

Mise à jour mineure de gPass, mon gestionnaire de mot de passe en ligne, libre et auto hébergé (un concurrent de lastpass donc) pour Firefox.

Rien d'extraordinaire cette fois. La mise à jour affiche message quand le mot de passe est remplacé, mais que le formulaire n'est pas soumit. Elle fait suite à la commande "@_" introduite dans la version 0.5.

PS : J'ai même eu droit à une validation expresse des développeurs de Firefox : moins de 30 minutes entre la soumission et l'acceptation !

gget

Friday, 22 August 2014
|
Écrit par
Grégory Soutadé

Encore un de mes petits outils. Les Windowsiens ne savent pas combien la ligne de commande peut être rapide et puissante comparé aux cliquodrômes graphiques ! Depuis que j'ai découvert "wget" (téléchargement en ligne de commande) il y a quelques années, je ne peux plus m'en passer. Principalement pour une bonne raison : la reprise après arrêt. Comme Firefox en son temps, il permet de stopper le téléchargement et de le reprendre après (surtout en cas d'échec ou de coupure réseau). wget (comme curl) supporte plein de protocoles et d'options (http, https, ftp, login...), mais il y a une fonctionnalité manquante : le téléchargement en parallèle.

Certains sites limitent la bande passante par connexion, mais pas par IP, donc si on utilise plusieurs connexions, on augmente la bande passante totale !

J'aurais aimé implémenter cette fonctionnalité directement dans wget et/ou curl, mais ils sont vraiment gros et c'est une modification assez intrusive. Donc, j'ai créé gget. gget est assez petit (~500 C loc), il est basé sur libcurl et supporte seulement HTTP sans authentification. Les principales fonctionnalités sont :

  • Téléchargement en parallèle (3 connexions par défaut)
  • Reprise après arrêt (par défaut)
  • Limitation de la bande passante (optionnelle)
  • Possibilité de définir son "user agent" (identification du navigateur)

Le code source est disponible sur ma forge sous licence GPLv3. Il y a une version compilée pour Linux.

J'ai ajouté le support pour Windows, il compile parfaitement avec mingw64, mais plante à l'exécution... J'ai abandonné après m'être battu plusieurs jours sous Windows avec CodeBlocks et DevCPP. C'est un système détestable pour faire du développement hors Visual C++ !! Si quelqu'un souhaite proposer un correctif, il est le bienvenu !

Memstats

Tuesday, 29 July 2014
|
Écrit par
Grégory Soutadé

BSD systems are known to have the highest uptime, but our favorite GNU/Linux system can do the same if we want. At work my computer runs since 260 days without any reboot thanks to Ubuntu (LTS 10.04).

This is cool, nevertheless having software launched for a long time consume a lot of memory (I like to keep terminals and emacs open to save history), especially Firefox uses one to three giga bytes of memory (even in version 30.0). Software not used everyday goes to swap and come back when needed. This process can slow my computer for minutes (when I unlock my session).

The only solution is to kill these applications and restart them properly. I used to track memory eaters with "top" command, but it's hard to see in one time which software is using most of memory.

I wanted to do it for long time, and now it's out ! I wrote a PERL script called memstats that list processes by memory usage (and not by CPU usage like top).

It reads information from /proc/PID/stat and /proc/PID/status, so it's very Linux dependant (sorry BSDs...).

memstats output looks like "top" (because it's a good one).

soutade@cybelle> memstats
  PID    OWNER  VIRT   RES S       TIME         COMMAND
20098  soutade 3.10g 1.80g S   09:00:59         firefox
 1285     root  526m  259m S 6214:00:04            Xorg
 2555  soutade  862m  200m S 6214:00:10  gnome-terminal
 2113  soutade  827m  181m S 6214:00:20     gnome-panel
20081  soutade  866m  153m S   10:00:12     thunderbird
 2122  soutade 1.97g   98m S 6214:00:20        nautilus
 2192  soutade  591m   86m S 6214:00:13 indicator-apple
20104  soutade 1.07g   42m S   09:00:58          pidgin
26536  soutade  627m   40m S   06:00:22           gedit
 6517  soutade  529m   30m S 2816:00:40           emacs
 2845  soutade  442m   27m S   00:00:50           emacs
22935  soutade  449m   23m S  103:00:06           emacs
 2094  soutade  899m   23m S 6214:00:21        metacity
 2207  soutade  393m   11m S 6214:00:13 indicator-messa
 2762  soutade  114m   10m S   00:00:48          python
 9752  soutade  401m    8m S   96:00:18 gnome-screensav
 2070  soutade  766m    7m S 6214:00:22 gnome-settings-
 2914  soutade   94m    6m R   00:00:00        memstats
 2121  soutade  477m    6m S 6214:00:20 notification-da
 2489  soutade  414m    6m S 6214:00:20 update-notifier
23305  soutade  391m    5m S 5641:00:44 ubuntuone-syncd
 2280  soutade  418m    4m S 6214:00:10 gdu-notificatio
 2061  soutade   22m    4m S 6214:00:22     dbus-daemon
 1973     root  192m    4m S 6214:00:32         lightdm
 6886  soutade  581m    4m S 3797:00:46 gnome-keyring-d
 2134  soutade  539m    4m S 6214:00:19 gnome-fallback-
28423  soutade   85m    4m S   05:00:43            bash
 2389  soutade  335m    4m S 6214:00:00 zeitgeist-daemo
 6080  soutade  332m    4m S 3624:00:44      pulseaudio
 2382  soutade  400m    3m S 6214:00:00 zeitgeist-datah

memstats is licenced under GNU GPL v3 and available in my inDefero forge. Have fun !

Embedded Map

Tuesday, 22 July 2014
|
Écrit par
Grégory Soutadé

Rendu OpenStreetMap

Yoann Sculo a commencé il y a quelque temps déjà le recensement des entreprises travaillant dans le logiciel embarqué, l'électronique et l'industrie. C'est une initiative intéressante autant pour celui qui est en recherche d'emploi que pour connaître les différents acteurs du marché. Les entreprises recensées sont des "noSSII" comme il le dit, c'est à dire, non pas des sociétés de services soit disant expertes, mais de vraies entreprises qui font de vrais produits.

De mon point de vue, le monde de l'embarqué étant assez technique et requiert des compétences moins génériques que les autres branches de l'informatique, les entreprises préfèrent capitaliser le savoir en recrutant directement (ou en pré embauche via SSII) leurs ingénieurs. Mais, n'ayant pas encore été confronté à ce problème, je me trompe probablement.

Je vous encourage donc si vous travaillez ou connaissez une telle entreprise à la rajouter dans la liste. Soit pour les plus téméraires en faisant un fork du projet et modifiant le JSON à la main (rien de très compliqué), soit en envoyant directement un mail à Yoann avec les coordonnées, et il se chargera du reste !