Le code de porc, ça me fend le coeur

1

C’est pas tous les jours que l’actualité me permet un jeu de mot foireux, donc j’en profite.

Cette semaine, une énomre, monstrueuse, terrifiante faille a été découverte dans openSSL, une faille tellement énorme qu’on lui a donné un nom qui fait peur (ou pas) : Heartbleed.

Une faille à priori compliquée, mais que XSKCD explique fort bien :

 

 

Dit comme ça, ça paraît bien

Une faille tellement énorme que la liste des sites que j’utilise et qui sont impactés (livrée par Mashable), me fait frémir :*

  • Twitter (indirectement, apparement)
  • Dropbox
  • Google (j’ai ebncore mon vieux compte GMail, même s’il est voué à la destruction)
  • GitHub (et là c’est la totale : il faut changer de mot de passe et recréer les paires de clés permettant de connecter des machines à GitHub en SSH).
  • IFTTT
  • WordPress
  • Wargaming (c’est-à-dire Woprld of Tanks/Warplanes/Battleships)

Bref, c’est l’apocalypse du mot de passe … heureusement que j’utilise Keepass :-)

Mais ça n’est pas vraiment là où je voulais en venir.

Dans un de ces hasards facétieux qu’affectionne l’esprit humain, j’ai découvert également cette semaine un Tumblr assez marrant, Code de porc. Ce site, un peu à l’image du DailyWTF, recense des exemples de code pourri.

Et j’aime bien rire. Je suis donc allé y jeter un oeil, et effectivement, j’ai ri. Et puis, comme quand je découvre les IgNobels, j’ai réfléchi. Qu’est-ce qui peut rendre un code pourri (comme par exemple dans le cas d’OpenSSL permettre cette faille monstrueuse) ?

Bon, pour Heartbleed, c’est facile : pas de tests unitaires, un commit fait le 1er janvier très tôt le matin, et pas de peer review stricte avant de livrer.

Mais sur Code de Porc, il y a aussi un autre cas, plus sournois : le refactoring de trop.

Vous savez, celui où vous remplacez toutes les occurences d’un booléen (qui vaut true) par sa valeur, ce qui fait apparaître des bon viex

if(true) {
///
}

Ceux-là, comment les éviter ?

Est-ce que checkstyle a des règles pour détecter les if(boolean) ? J’en sais rien. j’en sais tellement rien que je vais poser la question à StackOverflow

Une liste de course pratique pour rss-bridge

J’aime bien rss-bridge. C’est pratique.

Et comme je veux pouvoir y contribuer un peu plus, j’avais vaguement noté dans les issues github une liste de sites qui pourraient nécessiter un peu de boulot (ah, tiens, non).

Mais c’était pas super pratique.

J’ai donc pris une décision radicale : j’ai créé dans mon kriss-feed un dossier @todo:rss-bridge dans lequel je mets tous les flux pour lesquels je dois écrire un bridge.

Et comme ça, dès qu’un nouvel élément y apparaît, je me rappelle que je dois vraiment bosser dessus.

Et ça se voit bien :

Kriss feed (1)_2014-03-20_17-03-14

Bon, je ne sais pas si ça suffira à me sortir de la procrastination, mais je ne crois pas que ça pourra faire le moindre mal … si ?

Pour l’anecdote, cette histoire de @todo me vient d’un vieil article de lifehacker (qui apparaîtra lui aussi dans cette catégorie). Je m’en sers pour mes différents projets personnels, et c’est bien pratique.

Allez salut Opera, et merci pour tout !

Depuis plus de dix ans, j’étais un utilisateur heureux d’Opera.

Et puis ils ont changé.

Ils ont décidé l’année dernière de ne plus utiliser leur moteur de rendu, mais celui de Chrome. Et du coup, les dernières versions d’Opera ne sont rien d’autres que des chrome-like avec juste un autre look.

Mais il n’y a plus de mouse gestures.

Il n’y a plus de remplissage automagique de formulaire.

Il n’y a plus de barre de rechercher séparée.

Il n’y a plus de possibilité de remplacer Google par un autre moteur de recherche.

Il n’y a plus de preview des onglets.

Je pourrais continuer longtemps comme ça, mais autant le dire en une fois : l’esprit d’Opera semble avoir disparu.

Et puisque c’est comme ça, il est temps de revenir aux fondamentaux. Et en l’occurence, plutôt que Firefox (qui est fort bien), je vais préférer Seamonkey, parce que j’aime bien avoir mes mails et mon web dans le même écran. Ah non, en fait, non non non non non non non.

Parce que SeaMonkey, ça n’est rien d’autre que l’ancestral Netscape Navigator utilisant un moteur "moderne". Et si je n’ai rien contre le moteur, j’ai tout contre le design de cette applpication, qui est un peu une honte de l’ergonomie des années 90. Bon, ben du coup, je crois que ce sera Firefox, à moins bien sûr que je ne trouve quelque chose de mieux sur AlternativesTo ….

Solange te parle, et ça te fait plaisir

Et quand elle t’écrit, c’est encore mieux.

Je trouve cette … indesriptible … fascinante : elle m’ouvre un monde d’hésitation et d’introspection qui m’est inconnu, aussi bien dans ses vidéos, dans ses tweets (genre même ses tweets sont de l’art), que dans ses fascinantes séries audio, l’une des meilleures étant à mon avis Solange pénètre la vie intime des femmes (au sujet assez évident) dont le traitement est incroyable de finesse.

Et je découvre donc aujourd’hui qu’elle a un blog (nommé de façon très imaginative Solange te parle) rencensant toutes ces interventions. Chouette !

Vous allez me dire que c’est à la limite du loupé ? Alors vous n’avez pas compris, je crois.

Par ses hésitations, par ses loupés, par ses silences, par ses cadrages, et même par ses mouvements, elle m’ouvre à un monde que je n’arrive pas à pénétrer, un monde que je suis d’ailleurs bien en peine de nommer ou de décrire directement. C’est le genre d’expérience qui me fait comprendre la fameuse citation, enfin, le truisme qui dit que l’art n’offre pas des réponses, seulement des questions. Je n’hésiterai pas à écrire ici que j’aime les questions qu’elle me pose.

Pour l’anecdote, je l’ai découverte grâce à ce tweet de Monsieur Poulpe

(ah bravo internet : grâce à leur passage dans Arrêt sur Images, j’ai bien du mal à le retrouver). Bon c’était pas précisément celui-là, mais vous voyez l’idée. Et oui, Monsieur Poulpe est chouette … dans un style différent (son meilleur rôle doit être DarkAngel64)

rss-bridge, c’est bien (et le php aussi)

Je vous parlais il y a peu de ma lassitude ce ces flux mal fichus.

J’avais donc installé rss-bridge, et je ne vous avais pas parlé de mes développements à ce sujet.

Et bien maintenant, je peux. Parce que j’ai écrit deux bridges, un facile et un autre un peu moins.

Le facile, c’est évidement Sexactu, pour lequel les articles complets sont toujours disponibles sur la page gqmagazine.com/sexactu, qui réduit donc la transformation à un peu de scrapping HTML, chose pour laquelle mon lifestream m’a poussé à développer quelques compétences. Et donc, c’est assez facile.

Le moins facile, c’est – curieusement – Les 400 Culs pour lequel j’ai dû développer une solution de cache de pages HTML. Tout ça parce que

  1. Il y a des articles tronqués pour lesquels il faut aller sur une autre page pour avoir la version complète
  2. Le FileCache existant dans rss-bridge ne permet pas la mise en cache d’objets quelconques, du moins d’après ce que j’ai compris …

Au-dela de ça, il y a deux ou trois trucs curieux que j’ai constaté, qui me changent du développement Java.

La première est une surprise : comment peut-on livrer une application où on enlève sciement les rapports d’erreur ? Ca n’est pas une critique personnelle, juste une surprise. L’une des toutes premières lignes de rss-bridge est

Du coup, quand on développe un bridge, au début, on ne comprend pas (moi au moins) pourquoi aucun message d’erreur ne s’affiche, et puis on décommente la bonne ligne et là, on peut enfin travailler :-)

A cette surprise près, travailler avec PHP est en un sens assez agréable parce que la doc est d’une qualité formidable, et qu’en plus il n’y a pas ces phases de compilation/packaging typique du code Java. ca laisse songeur, quand même, de voir que, malgré tous les défauts inhérents au langage (et ils sont nombreux), il est à ce point facile d’écrire un truc qui, en Java (et malgré toutes ses qualités), me prendrait du temps et nécessiterait quelques dépendances (d’un autre côté, c’est ausssi le cas ici puisque rss-bridge dépende  de Simple HTML DOM Parser - qui est du reste un joli bout de code).

Erf, la date

Vous avez sans doute lu mon dernier article avec une espèce de curiosité un peu malsaine ….

Bon, je vous explique. J’utilise au bureau Jenkins, très bon outil d’intégration continue. Ce outil, je lui fait faire des trucs pas forcément catholiques (comme par exemple émuler les releases maven).

Bien, dans la release maven, il ya une étape où on crée un tag, et ensuite on change la version maven dans ce tag. Donc pour ça, on crée le tag (ça je crois que je l’ai déja dit), et on fait un checkout du tag.

Et c’est ce checkout qui ne marche pas, ce qui m’a fait m’arracher les cheveux (bon, je n’en ai plus depuis un moment, mais c’est tout comme) depuis une semaine. Pourquoi ?

Vous allez rire, j’en suis sûr.

Parce que, comme toute bonne histoire de DevOps, c’est la couche en laquelle j’avais confiance qui a foiré.

En l’occurence, le serveur Subversion, l’esclave Jenkins et Jenkins ne sont pas à la même heure … il y a même un décalage de 10 minutes entre eux. Jenkins est dans le passé des deux autres. Donc, comme je fais la création de tag dans un job, et le switch dans un autre, eh bien ce deuxième job démarre avec un timestamp fourni par Jenkins (donc 10 minutes dans son propre passé). A cet instant, évidement, le tag n’existe pas, et le switch ne peut que mal se passer.

J’ai donc enfilé mon meilleur costume de Linuxien fou et cherché comment configurer un serveur de temps, sur la machine Subversion (une Ubuntu), sur l’esclave (un XServe sous MacOS), et Jenkins. Hélas, la machine virtuelle hébergeant ce dernier n’a pas d’accès réseau. Je n’ai donc pas pu configurer NTP et j’ai dû, à la main, changer la date de Linux. La honte, non ?

Du coup, je vais devoir ajouter un job dans Jenkins pour vérifier qu’il n’y a pas un décalage trop important (voire, et j’en ai honte, pour  synchroniser la date de la machine Jenkins avec celle de la machine Subversion (comme ça, plus de décalage possible) !

Erf, Subversion …

Tout part de ce message d’erreur renvoyé par Jenkins (pour bien le comprendre, il faut imaginer que le job Jenkins a créé le tag juste avant, ou presque).

Cleaning up /Jenkins/workspace/ReleaserStep2free/.
Switching to http://subversion/repository/projet/projet-java/tags/1.3/1.3.13 at revision '2014-02-11T15:01:03.996 +0100'
ERROR: Failed to update http://subversion/repository/projet/projet-java/tags/1.3/1.3.13
org.tmatesoft.svn.core.SVNException: svn: E160005: Target path '/projet-java/tags/1.3/1.3.13' does not exist
svn: E175002: REPORT of '/repository/projet/!svn/vcc/default': 500 Internal Server Error (http://subversion)
 at org.tmatesoft.svn.core.internal.wc.SVNErrorManager.error(SVNErrorManager.java:64)
 at org.tmatesoft.svn.core.internal.wc.SVNErrorManager.error(SVNErrorManager.java:51)
 at org.tmatesoft.svn.core.internal.io.dav.DAVRepository.runReport(DAVRepository.java:1293)
 at org.tmatesoft.svn.core.internal.io.dav.DAVRepository.update(DAVRepository.java:833)
 at org.tmatesoft.svn.core.internal.wc16.SVNUpdateClient16.doSwitchImpl(SVNUpdateClient16.java:433)
 at org.tmatesoft.svn.core.internal.wc16.SVNUpdateClient16.doSwitch(SVNUpdateClient16.java:726)
Caused by: svn: E160005: Target path '/projet-java/tags/1.3/1.3.13' does not exist
 at org.tmatesoft.svn.core.SVNErrorMessage.create(SVNErrorMessage.java:208)
 at org.tmatesoft.svn.core.SVNErrorMessage.create(SVNErrorMessage.java:154)
 at org.tmatesoft.svn.core.SVNErrorMessage.create(SVNErrorMessage.java:97)
 at org.tmatesoft.svn.core.internal.io.dav.handlers.DAVErrorHandler.endElement(DAVErrorHandler.java:72)
 at org.tmatesoft.svn.core.internal.io.dav.handlers.BasicDAVHandler.endElement(BasicDAVHandler.java:103)
 at org.apache.xerces.parsers.AbstractSAXParser.endElement(Unknown Source)
 ... 24 more
Caused by: svn: E175002: REPORT of '/repository/projet/!svn/vcc/default': 500 Internal Server Error (http://subversion)
 at org.tmatesoft.svn.core.SVNErrorMessage.create(SVNErrorMessage.java:208)
 ... 32 more
ERROR: Subversion update failed

(et encore, j’ai viré des tonnes de lignes).

Donc, je vais voir sur le serveur, et je tombe sur des lignes comme ça à la pelle

[Tue Feb 11 15:12:01 2014] [error] [client 172.27.63.62] A failure occurred while driving the update report editor [500, #160005]
[Tue Feb 11 15:12:01 2014] [error] [client 172.27.63.62] Target path '/projet-java/tags/1.3/1.3.13' does not exist [500, #160005]

Et là, Google ne m’aide pas trop.

Donc je fouille, je fouille, et je tombe sur cette présentation faite lors d’une quelconque conférence Subversion

Subversion error messages demystified

Qui contient en particulier ce slide, que je n’hésite pas à copier-coller ici

www.elegosoft.com_files_Downloads_Subversion_Day_2011_svn-day-berlin-2011_sperli_2014-02-11_17-07-57

Je cite la partie intéressante

Generic server-side error message during updates (could be anything)

Autrement dit, ça sert à rien, mais on l’affiche quand même.

Du coup, je continue à chercher après mon erreur 160005. Au moins, maintenant, je sais que c’est un code d’erreur important.

Bon, ne reculant devant rien, je jette vite fait un coup d’oeil aux codes d’erreurs de Subversion (dans svn_error_codes.h) qui m’envoie tout droit aux codes d’erreurs Apache (à cause de #include <apr_errno.h>)

Et là, un peu d’arithmétique : les codes d’erreur Subversion sont construits à partir de APR_OS_START_USERERR  (qui vaut d’après Apache et d’après mes calculs… 120000 ?)

Comme SVN_ERR_CATEGORY_SIZE vaut 5000, je dois être dans la … (160000-120000)/5000=8 ème catégorie d’erreur qui est donc SVN_ERR_FS_CATEGORY_START. Et mon erreur y est la 5ème, c’est-à-dire

00483   SVN_ERRDEF(SVN_ERR_FS_PATH_SYNTAX,
00484              SVN_ERR_FS_CATEGORY_START + 5,
00485              "Invalid filesystem path syntax")

Pardon ?

Mmh … Là, il est vraiment temps de demander aux développeurs de Subversion quelques détails pratiques.

Le jour de la riposte ?

C’est aujourd’hui, et ça n’est pas une raison de se réjouir.

Il y a  à peine plus d’un an, Aaron Schwartz se donnait la mort, pourchassé par une espèce de justice débile tenue par les ayants-droits et leurs séides (c’est comme ça que je vois les choses et, étant chez moi sur ce blog, je me permets de l’affirmer). Son crime ? Vouloir partager des articles scientifiques, simplement.

Il y a moins d’un an, Edward Snowden devenait l’égal des pires terroristes pour avoir simplement documenté les méthodes de surveillances des états-unis publiquement. Et pour ça, il est toujours poursuivi – et est réfugié politique dans l’un des rares pays osant l’accueillir : la Russie de Poutine (le même qui pourchasse les homosexuels et autres contestataires, bref, un parangon de démocratie).

Est-ce que leurs actions ont fait changer le monde ? Je pense. Est-ce qu’il faut se reposer sur ses lauriers et laisser la NSA, la DGSE et d’autres grandes oreilles siphonner votre ordinateur et votre téléphone d’une façon qui fait rêver les polices du monde entier (même si c’est reconnu illégale dans bien des pays) ? NON.

Alors, agissant à ma mesure, j’affiche (si WordPress me laisse faire – bon, en fait, ça n’a pas marché, vous aurez donc juste cette image en tête de l’article), la banière de The Day We Fight back et je vous invite à signer leur pétition en ligne, et à diffuser cette information. Oui, c’est clairement de la propagande. Je le reconnais. mais c’est une propagande pour changer notre vie à tous, et tout de suite. Parce que, vous ne le savez peut-être pas, mais les services de renseignement divers peuvent même savoir si vous avez consulté mon site (et donc lu ce texte). Pareil pour les sites sur vos partis politiques préférés, et l’ensemble de votre vie numérique. Flippant ? oui.

Vous trouverez un peu plus d’infos sur LinuxFr.

Mais quel fichu manque d’imagination je peux avoir !

Quand j’ai commencé à fréquenter les recoins sombres d’internet, je n’y connaissais rien en sécurité. J’avais donc, comme tout le monde, un unique mot de passe d’à peine huit caractères (dont un chiffre, heureusement).

Et puis j’ai peu à peu compris qu’un seul mot de passe pour tous les sites, c’était à peu près utile qu’aucun mot de passe. Hélas, si j’utilisais plusieurs mots de passe, comment me souvenir de quel mot de passe était utilisé pour quel site ? Et c’est là que j’ai découvert l’excellent Keepass. C’est donc tout naturellement que j’y ai stocké tous mes mots de passe, protégés par un mot de passe maître d’une longueur … insolente.

Hélas, cette phrase pouvait facilement être retrouvée sur le web, puisqu’il s’agissait de l’une de mes signatures mail/usenet (d’ailleurs, c’est à nouveau, après des errances diverses, ma signature mail/usenet).

Or j’ai découvert récemment les progrès dans les tables d’attaque utilisées par les pirates divers et variés, et donc par les gouvernements qui les emploient. Ce qui m’a poussé, naturellement, à changer ce mot de passe.

Et je dois dire que c’est un changement franchement flippant. Ce mot de passe, c’est, grâce à Keepass, le seul que je connaisse. Il est certes long, mais il est unique et bien ancré dans ma mémoire. Du coup, le changer, ça me fait flipper. Parce que si je le perds, je perds absolument tout : plus d’accès à mes mails, ni à tous les sites web auxquels j’ai pu me connecter.

Je crois qu’il est enfin temps pour moi de passer, pour certains services critiques, à l’authentification à deux facteurs … Ou plutôt à une forme spécifique de celle-ci pour Keepass.

N’empêche, j’ai tellement peur de perdre ce mot de passe que je me demande si je ne vais pas le noter dans un coin secret …

Elle, Juliette F, 26 ans …

Elle a un blog, assez récent. Elle a arrêté la coke, et c’était pas facile. Et elle écrit très bien.

Et comme quand je lisais de bric et de broc (il a dû disparaître de mon lecteur RSS à la faveur d’un quelconque déménagement), comme quand je lis d’autres blogs qui n’ont rien à voir avec ma vie, elle arrive à m’inviter dans sa vie. Et si il y a bien une forme de voyeurisme que je chéris, c’est celle-là. Celle de gens qui choisissent de décrire leur vie, leurs angoisses, leurs projets.

Donc, pour Juliette, bravo.

Pour Veuve Tarquine, trois fois bravo.

Et pour tous ces autres auteurs inconnus, bravo.

Et je ne dis pas ça parce que, d’un certain point de vue, mon blog pourrait éventuellement entrer dans une catégorie proche : je n’ai absolument pas la prétention d’écrire ici aussi bien que ces gens.