Catégorie : Technique

  • Logi­ciel de mot de passe

    Ça faisait long­temps que je voulais passer à un gestion­naire de mot de passe un peu évolué.

    J’ai tenté par deux fois de me mettre à Last­pass. Je ne saurais dire pourquoi mais les deux fois j’ai fini par peu l’uti­li­ser, le lais­ser dans un coin et reve­nir à mes habi­tudes.

    Depuis peu de temps j’ai tenté avec Dash­lane. Il n’y a pas de client Linux, l’in­ter­face web et en lecture seule mais son gros avan­tage est de pouvoir fonc­tion­ner tota­le­ment offline. Mieux : C’est une entre­prise française. Même si le chif­fre­ment fait que mes données sont théo­rique­ment illi­sibles par le pres­ta­taire, j’ai un peu plus confiance que dans une société US.

    Peut-être est-ce l’er­go­no­mie mais cette fois la sauce a pris. J’ap­pré­cie le login auto­ma­tique sur le navi­ga­teur. J’aime le fonc­tion­ne­ment de l’app mobile qui se contente de l’em­preinte digi­tale si l’app a déjà été déver­rouillée récem­ment par le mot de passe maître.

    Pour le même prix il m’a signalé les sites où mon mot de passe était trop faible ou obso­lète (genre le mot de passe Yahoo qui n’a pas changé depuis les failles) et a su le chan­ger d’un simple bouton sans me deman­der d’al­ler faire les mani­pu­la­tions moi-même sur les diffé­rents sites.

    Il me reste la fonc­tion­na­lité de partage que je n’ai pas testée mais j’ai bon espoir que ça résolve nos diffi­cul­tés de comptes commun avec ma femme.

    Enfin la bonne surprise c’est le mode urgence : Permettre à un tiers iden­ti­fié de récu­pé­rer ma base de mots de passe si je ne décline pas sa requête après un certain nombre de jours. Quelque part ça peut faire office de testa­ment numé­rique, même si ça n’est pas parfait.

    Depuis on m’a pointé vers le récent Enpass, qui ne demande que 10 € pour l’achat à vie de l’app mobile (contre 40 € par an pour le premium Dash­lane). Il a le support Linux, le offline, sa synchro­ni­sa­tion se fait par des pres­ta­taires de cloud habi­tuels, mais il n’y a pour l’ins­tant pas de partage possible. Ça vaut peut-être le coup de commen­cer par Enpass si vous n’avez pas besoin de cette dernière fonc­tion­na­lité.

  • Empreinte digi­tale et sécu­rité

    Nouveau télé­phone avec un capteur d’em­preinte digi­tale. Il n’y a pas à dire, c’est super pratique et le compro­mis de sécu­rité est plutôt bien adapté au cas d’usage.

    Compro­mis ? C’est évident pour les geeks sécu­rité alors je m’adresse aux autres. Tout est histoire de compro­mis entre la faci­lité d’uti­li­sa­tion et le niveau de sécu­rité recher­ché.

    L’em­preinte digi­tale est facile à utili­ser mais assure un assez mauvais niveau de sécu­rité.

    Security - xkcd 358
    Secu­rity – xkcd 538

    Donc, qu’est prêt à faire celui qui veut accé­der à vos données ?

    Si vous ne vous cachez pas sérieu­se­ment à chaque fois que vous déver­rouillez votre télé­phone, le code PIN ou le schéma à la Android ne sécu­risent que contre le vol à l’ar­ra­chée, quand le voleur ne vous connait pas et ne peut rien obte­nir de vous.

    Si votre voleur est prêt à fouiller votre télé­phone sans votre accord, il est certai­ne­ment prêt à loucher par dessus votre épaule pour voir votre PIN ou votre schéma quand vous le tracez. Pour un schéma il peut même parfois se conten­ter des traces de doigts sur l’écran pour peu que vous ayez oublié de les effa­cer.

    C’est *là* que l’em­preinte digi­tale est inté­res­sante. Elle est est simple à utili­ser mais ne peut pas être repro­duite sans un mini­mum d’ef­forts.

    * * *

    Si par contre votre attaquant est prêt à être… méchant, alors l’em­preinte digi­tale est la pire des solu­tions.

    Le plus simple : Même un grin­ga­let peut vous prendre par surprise et retour­ner votre poignet dans votre dos pour vous faire déver­rouiller le télé­phone par la contrainte.

    Le plus discret : Récu­pé­rer une de vos empreintes quelque part où vous la lais­sez – c’est à dire partout, tout au long de la jour­née – et créer une fausse empreinte propre à leur­rer le capteur permis­sif du télé­phone. N’im­porte qui en est capable avec assez de volonté.

    Contre quelqu’un prêt à faire un mini­mum d’ef­forts il ne reste qu’un mot de passe ou un schéma suffi­sam­ment complexe que vous gardez confi­den­tiel. Rien ne battra même un bête code PIN si l’ap­pa­reil limite le nombre de tenta­tives.

    Le problème c’est que tour­ner le dos à vos proches à chaque déver­rouillage de télé­phone puis s’as­su­rer de ne pas lais­ser de traces sur l’écran, ce n’est pas neutre au jour le jour. Bien entendu, si vous allez dans cette direc­tion, il faut que le disque du télé­phone soit chif­fré, que le télé­phone se verrouille immé­dia­te­ment quand vous le lais­sez sur une table, et que l’éven­tuel schéma à tracer soit très complexe. Sinon autant reve­nir à l’em­preinte digi­tale.

     

  • Les meilleurs commen­taires ne s’écrivent pas

    Les meilleurs commen­taires sont ceux que l’on n’a pas besoin d’écrire.

    Lorsque l’on a besoin d’écrire un commen­taire, le plus souvent, c’est que notre code n’est pas aussi clair et propre qu’il devrait l’être.

    Je suis bien d’ac­cord avec la cita­tion du dessus, mais elle n’im­plique aucu­ne­ment ce qui suit.

    Damned, un déve­lop­peur faisant une telle faute logique ? On devrait savoir que les rela­tions de cause et consé­quence ne s’in­versent pas. Si les meilleurs commen­taires sont ceux qu’on n’a pas besoin d’écrire, personne n’a dit qu’on ne devrait pas écrire les commen­taires !

    function main() {  
      let imageName = 'test.png'
    
      // Get the extension off the image filename  
      let pieces = imageName.split('.')
      let extension = pieces.pop()
    }
    

    […] ça ressemble beau­coup trop à une excuse : « Mon code est moche / compliqué mais c’est pas grave je vais l’ex­pliquer dans un commen­taire » au lieu de le nettoyer.

    Donc oui, ce commen­taire est à peu près inutile. S’il le devient c’est que le code est proba­ble­ment inuti­le­ment complexe et pour­rait être amélio­rer avec l’uti­li­sa­tion de fonc­tions tierces bien nommées.

    Si effec­ti­ve­ment vous commen­tez ainsi (pas de honte, ça arrive à tous), ça ne sert à rien.

    Par contre, un commen­taire qui dit pourquoi vous avez besoin de l’ex­ten­sion ça ne serait pas forcé­ment du luxe. Peut-être que ce commen­taire manquant me permet­trait de savoir si le compor­te­ment face à un fichier « .test.png » est une anoma­lie ou est volon­taire. Là je suis bien à mal de savoir sans lire tout le code source en détail pour cher­cher l’in­ten­tion du déve­lop­peur.

    Bref, si vous croyez qu’un code source clair remplace les commen­taires, c’est que vous n’avez pas encore compris ce qu’il faut écrire dans les commen­taires.

    /**
     * Get the extension of the file
     * 
     * @param {string} filename - The filename
     * @return {string} the extension of the file  
     */
    function getFileExtension(filename) {  
      let pieces = imageName.split('.')
      return pieces.pop()
    }

    Dites moi qu’il y a une infor­ma­tion dans ce commen­taire que vous n’aviez pas en lisant le code !

    Non. Par contre dans un IDE évolué, ce type de code me permet d’avoir confir­ma­tion du rôle de la fonc­tion quand je la tape ou quand je la lis plutôt que de devoir m’in­ter­rompre pour aller ouvrir le fichier corres­pon­dant et lire tout le code source. D’au­tant que là ce sont deux lignes mais parfois, même si c’est clair, c’est quand même plus long à lire.

    C’est aussi avec les commen­taires de @ que l’IDE me donnera le rôle des diffé­rents para­mètres. Oui, le plus souvent ils devraient être évident mais est-ce toujours le cas ? Grâce à ce jsdoc je saurais sans ouvrir la fonc­tion que je dois y rensei­gner un nom de fichier et pas un chemin complet. Bien m’en a pris parce que « ./test.png » aurait provoqué de jolies erreurs à l’exé­cu­tion de mon programme. Je saurai aussi si j’ai ou pas un argu­ment option­nel et pourquoi.

    Toujours avec un outillage évolué, la mention du string permet­tra d’iden­ti­fier des erreurs de typage malen­con­treuses. Ça pour­rait être dans le proto­type de la fonc­tion avec flow ou ici dans le commen­taire, peu importe, seule la syntaxe diffère.

    Main­te­nant même ici, le problème n’est pas avec le commen­taire mais avec ce qu’il dit. Ça n’au­rait pas été du luxe que la fonc­tion décrive que ce qu’elle consi­dère être une exten­sion dans le cas d’un « test.tar.gz ».

    Là où le code est propre le commen­taires ne sera qu’une redon­dance sans grand inté­rêt que le cerveau appren­dra vite à igno­rer.

    Et si c’était le contenu des commen­taires qu’il fallait remettre en cause et pas leur présence ?

    Sinon oui, je règle mes outils pour que les commen­taires s’af­fichent en gris clair. Pas qu’ils soient sans inté­rêt mais parce que j’ai deux niveaux de lecture suivant que je travaille le corps de la fonc­tion (et là je veux igno­rer les commen­taires) ou que je l’étu­die la première fois.

    Le seul problème que je rencontre aujourd’­hui se produit dans le cadre de project avec une docu­men­ta­tion publique auto-géné­rée. Comment éviter la redon­dance tout en faisant en sorte que la docu­men­ta­tion géné­rée à partir de mes commen­taires soit complète.

    Si la docu­men­ta­tion géné­rée pour les déve­lop­peurs a besoin des commen­taires, c’est que peut-être l’as­ser­tion comme quoi le code est aussi simple et effi­cace à lire que les commen­tai­res… est peut-être fausse. Je dis ça je dis rien.

  • [Lecture] The Real Name Fallacy

    Not only would remo­ving anony­mity fail to consis­tently improve online commu­nity beha­vior – forcing real names in online commu­ni­ties could also increase discri­mi­na­tion and worsen harass­ment.

    The Coral Project (Mozilla)

  • Attri­buer une cita­tion en HTML

    On parle de HTML 5, le web n’est qu’une multi­tude de liens, et on ne sait toujours pas attri­buer une cita­tion. Comment est-ce que je source le Au-revoir de Valéry Giscard d’Es­taing ?

    <blockquote>Au revoir.</blockquote>

    Il y a bien un attri­but cite dans <blockquote>. Je peux y mettre un lien mais ce lien ne sera ni affi­ché ni action­nable dans les navi­ga­teurs.

    Je peux aussi mettre un texte dans un attri­but data-source et l’af­fi­cher avec le lien via quelques geeke­ries CSS. C’est un peu mieux mais le lien n’est ni cliquable ni sélec­tion­nable pour un copier-coller : Plus frus­trant du meurs.

    Je ne parle même pas d’al­ler indiquer la date dans la cita­tion avec la balise <time>, là on entre­rait dans la science fiction.

    <style>
    blockquote::after { content: "-- " attr(data-source) ", " attr(cite);
    </style>

    La solu­tion du pauvre – celle que j’uti­lise sur ce blog – c’est de mettre la source direc­te­ment dans le <blockquote>. Il s’agit toute­fois d’un détour­ne­ment du sens des balises, parce que l’at­tri­bu­tion ne fait pas partie du bloc cité.

    D’autres proposent de mettre ça dans un <footer> du <blockquote>, éven­tuel­le­ment avec un <cite>. C’est un peu mieux – le <footer> est offi­ciel­le­ment fait pour être de la méta­don­née à propos du bloc parent – mais ça reste bancal : Le code ne permet pas de sépa­rer ce qu’on cite de l’at­tri­bu­tion elle-même.

    <blockquote>
      Au revoir.
      <footer>
        -- Valéry Giscard d'Estaing, 
        <cite>
          <a href="http://www.ina.fr/video/I08358793">
            dans son discours du 
            <time datetime="1981-05-19">le 19 mai 1981</time> 
            avant la passation de pouvoir à François Mitterrand
          </a>
        </cite>
      </footer>
    </blockquote>

    La balise <figure> peut venir à notre rescousse. On englobe le <blockquote> dans la <figure> et on ajoute un <figcaption> pour l’at­tri­bu­tion, avec éven­tuel­le­ment un <cite> correc­te­ment placé.

    <figure>
      <blockquote>Au revoir.</blockquote>
      <figcaption>
        -- Valéry Giscard d'Estaing, 
        <cite>
          <a href="http://www.ina.fr/video/I08358793">
            dans son discours du 
            <time datetime="1981-05-19">le 19 mai 1981</time> 
            avant la passation de pouvoir à François Mitterrand
          </a>
        </cite>
      </figcaption>
    </figure>

    Quelque part j’ai encore mal parce qu’un robot ne reliera pas l’at­tri­bu­tion et la cita­tion.

    Reste aussi que la défi­ni­tion de <figure> indique que l’em­pla­ce­ment de son contenu dans le texte envi­ron­nant n’a pas d’im­por­tance, ce qui ne me parait pas forcé­ment vrai pour une cita­tion.

    On sait expri­mer tout ça à desti­na­tion des moteurs de recherche en rdfa, en micro data ou en json-ld, le tout avec un voca­bu­laire normé, mais on n’a toujours rien pour les données visibles de l’uti­li­sa­teur. Que la spéci­fi­ca­tion HTML 5 ait été diri­gée par un éditeur de Google ne peut être qu’une coïn­ci­dence.

  • Je cherche des équipes construi­sant une progres­sive web app

    Idéa­le­ment en France ou avec un télé­tra­vailleur en France, mais n’hé­si­tez pas à en propo­ser des étran­gères qui font des choses bien

    Idéa­le­ment une équipe chez un éditeur produit et pas des pres­ta­taires de service, mais ça peut aussi être une équipe de presta dédiée et consti­tuée qui en fait sa spécia­lité (donc pas juste une SSII qui a travaillé sur un projet)

    Idéa­le­ment une équipe, mais si vous n’avez que de très bon exemples de sites, je suis preneur aussi

    Vous avez des noms ?

  • Un nouveau langage

    De temps en temps j’aime bien explo­rer quelque chose de nouveau côté program­ma­tion.

    J’ai tenté de faire une petite remise à zéro en Javas­cript il y a peu. J’y trouve plein de points posi­tifs objec­tifs mais je ne vois pas la moti­va­tion pour mes projets perso. Je n’ai pas d’atomes crochus avec la syntaxe, le langage lui-même ne m’ap­porte pas suffi­sam­ment de nouveau pour que la décou­verte me motive, et il y a plein de trucs qui me fatiguent dans l’en­vi­ron­ne­ment.

    J’ai vu Elm et j’aime bien plusieurs idées mais je cherche quelque chose qui tourne aussi en ligne de commande.

    J’ai tenté Crys­tal. Le langage est sympa : inspiré de ruby, infé­rence de types, compilé et perfor­mant, liai­sons simples avec toutes les libs en C. J’ai quelques reproches (genre l’ab­sence d’un type « Nume­ric » qui m’abs­trait des types bas niveau) mais je me suis surtout dit « à quoi bon » quand j’ai eu une excep­tion à l’exé­cu­tion lors de ma première jour­née. À quoi bon s’im­po­ser un typage statique si c’est pour que les problèmes les plus courants soient encore gérés à l’exé­cu­tion sans même un aver­tis­se­ment à la compi­la­tion ?

    Dans l’idéal j’ai­me­rais tester un envi­ron­ne­ment où quasi­ment tout est détecté en statique et qui ne soit pas aussi verbeux qu’un Java ou aussi bas niveau qu’un C. Vous avez quelque chose à me conseiller ?

  • Dis tonton, c’est quoi un déve­lop­peur ?

    C’est quelqu’un qui rédige les spéci­fi­ca­tions détaillées en langage machine d’une solu­tion à un problème. (*)

    * * *

    Coro­laires :

    • Prétendre faire coder un déve­lop­peur sans lui permettre de comprendre ce qu’il fait n’a aucun sens
    • Un cycle de travail ou un chef de projet prétend conce­voir les spéci­fi­ca­tions détaillées en amont du déve­lop­peur est au mieux drama­tique­ment inef­fi­cace
    • Quand on étudie tous les détails de tous les cas, on rencontre de nouveaux problèmes et de nouvelles solu­tions, ne pas s’au­to­ri­ser à chan­ger les déci­sions pendant la phase de déve­lop­pe­ment c’est être perdant à tous les coups

    (*) Merci à celui qui m’a distillé cette défi­ni­tion, je ne sais plus d’où elle vient mais elle rempla­cera agréa­ble­ment ma précé­dente.

  • Encore un projet perso

    Oui, comme si je n’en avais pas assez…

    Il reste que j’ai envie de présen­ter ce que je fais en photo autre­ment que par Flickr. La cible n’est pas précise. Comme les photos elles-mêmes, je le fais d’abord pour moi. Peut-être est-ce simple­ment donner corps à quelque chose qui commence à prendre de l’im­por­tance.

    Bref, je pose là pour moi-même – et un peu pour les curieux – ce que j’ai en tête.

    Un menu prin­ci­pal à trois entrées : des textes, des photos et des albums. J’ai commencé à écrire un peu autour des photos quand je les publie ici, et c’est fina­le­ment inté­res­sant de m’obli­ger à cette intros­pec­tion. Les deux autres permettent de sépa­rer le flux de photo chro­no­lo­gique en vrac de la sépa­ra­tion par albums bien pensée.

    J’ai tenté un premier jet de la page d’ac­cueil. On y met deux textes et deux albums en avant, à chaque fois un récent et un plus coup de cœur. Plus bas vient un mur d’images, avec les plus récentes et celles que j’aime le mieux (comme je suis un geek fini, j’ai déjà en tête une simili formule pour savoir ce que j’af­fiche en fonc­tion de la date de publi­ca­tion et de mes favo­ris).

    Travail en cours, le code CSS est certai­ne­ment bien moche.

  • Rempla­cer du texte par une image en CSS

    Dans les années 2007 à 2009 on avait une collec­tion d’hor­ribles bidouilles CSS pour insé­rer des images à la place de certains textes via CSS. L’idée c’est que certaines images ne sont pas du contenu mais bien de la présen­ta­tion, poten­tiel­le­ment dépen­dantes du contexte.

    Le besoin était tel que c’était un des sujets les plus en vue en CSS pendant des années avec « comment centrer un contenu verti­ca­le­ment ».

    h3.nir {
       height: 75px;
       width: 300px;
       overflow: hidden;
       margin: 0;
       padding: 0;
     }
     h3.nir:before {
       content: url(http://…/test.png);
       display: inline-block;
       font-size: 0;
       line-height: 0;
     }

    Fran­che­ment c’était de la bidouille de haut vol, avec plein de défauts. On rêvait d’un truc plus simple, qui fonc­tionne correc­te­ment quand l’image ne se charge pas et sur les lecteurs d’écran, sans flash de contenu non stylé. Je me demande même ce qui suit n’a fonc­tionné sur certains navi­ga­teurs, mais on n’y est visi­ble­ment pas encore :

    h3 { content: url(http://…/test.png); }

    CSS a beau­coup évolué, les navi­ga­teurs aussi. J’es­pé­rais qu’on avait enfin résolu ce problème ultra bateau. Visi­ble­ment non. La seule solu­tion passe par des polices de carac­tères d’icônes et des recon­nais­sances de liga­ture. Le reste n’a que peu changé en 10 ans, on a juste enlevé les besoins de compa­ti­bi­lité sur les vieux navi­ga­teurs.

    J’avoue que je ne comprends pas. On ajoute des fonc­tion­na­li­tés de folie et on ne gère toujours pas la base qui a généré des milliers de pages en bidouilles de contour­ne­ment. Qu’on m’ex­plique…