Auteur/autrice : Éric

  • Le scan­dale finan­cier du siècle

    On entend parler de prési­den­tielle, et de pas mal d’af­faires, mais quelqu’un a-t-il entendu parler d’un scan­dale finan­cier où des grandes banques inter­na­tio­nales se sont enten­dues pour des mani­pu­la­tions de cours et camou­fler leurs diffi­cul­tés ?

    Le scan­dale finan­cier du siècle, à lire en atten­dant une enquête ou des confir­ma­tions.

  • Extraire la couver­ture d’un fichier ePub

    Les ePubs ont déjà pas mal d’his­to­rique et d’im­plé­men­ta­tions diver­gentes. Je fouillais ces jours ci les diffé­rentes méthodes pour trou­ver l’image de couver­ture. J’ai proba­ble­ment du louper des choses, mais ça servira proba­ble­ment à d’autres.

    Avant toute chose, il faut ouvrir l’ePub à l’aide de unzip

    unzip exemple.epub

    Puis repé­rer l’adresse de l’OPF dans le fichier META-INF/container.xml. Atten­tion à ne pas recher­cher manuel­le­ment un fichier content.opf à la racine de l’ePub. Si c’est souvent là qu’il se trouve, ce n’est pas toujours le cas.

    L’adresse de l’OPF est dans l’at­tri­but @full-path de la balise <rootfile> avec le media-type « appli­ca­tion/oebps-packa­ge+xml ». S’il existe plusieurs corres­pon­dances, c’est la première qui doit être utili­sée.

    <?xml version="1.0"?>
    <container version="1.0"
    xmlns="urn:oasis:names:tc:opendocument:xmlns:container">
    <rootfiles>
    <rootfile full-path="Ops/content.opf"
    media-type="application/oebps-package+xml"/>
    </rootfiles>
    </container>

    C’est dans ce fichier OPF que tout va se passer. Voici mes quatre méthodes pour trou­ver les couver­tures, à essayer par ordre de prio­rité :

    1– Recher­cher une balise <meta> avec pour nom « cover ». Si elle existe, son contenu réfé­rence la balise <item> qui contient la couver­ture.

    En XPath, le chemin de la couver­ture donne­rait quelque chose comme //item[id=//meta[name='cover']/@content]/@href

    <?xml version="1.0" encoding="UTF-8"?>
    <package xmlns="http://www.idpf.org/2007/opf" version="2.0" unique-identifier="BookId">
    <metadata xmlns:opf="http://www.idpf.org/2007/opf">
      <meta name="cover" content="img1"/>
    </metadata>
    <manifest>
    <item id="ncx" href="toc.ncx" media-type="application/x-dtbncx+xml"/>
    <item id="style" href="style.css" media-type="text/css"/>
    <item id="id1" href="1.html" media-type="application/xhtml+xml"/>
    <item id="id2" href="2.html" media-type="application/xhtml+xml"/>
    <!-- ... -->
    <item id="id13" href="13.html" media-type="application/xhtml+xml"/>
    <item id="img1" href="images/img1.jpg" media-type="image/jpeg"/>
    <item id="img2" href="images/img2.jpg" media-type="image/jpeg"/>
    </manifest>
    </package>

    2– Recher­cher, dans la liste des <item> celui qui a « cover-image » dans son attri­but @properties. Il faut regar­der l’en­semble de l’at­tri­but. Ce dernier peut conte­nir plusieurs valeurs sépa­rées par des espaces.

    En XPath ce serait quelque chose de proche de //item[@properties and contains(@properties,'cover-image')]/@href

    <?xml version="1.0" encoding="UTF-8"?>
    <package xmlns="http://www.idpf.org/2007/opf" version="2.0" unique-identifier="BookId">
    <metadata xmlns:opf="http://www.idpf.org/2007/opf"></metadata>
    <manifest>
    <item id="ncx" href="toc.ncx" media-type="application/x-dtbncx+xml"/>
    <item id="style" href="style.css" media-type="text/css"/>
    <item id="id1" href="1.html" media-type="application/xhtml+xml"/>
    <item id="id2" href="2.html" media-type="application/xhtml+xml"/>
    <!-- ... -->
    <item id="id13" href="13.html" media-type="application/xhtml+xml"/>
    <item properties="cover-image" id="img1" href="images/img1.jpg" media-type="image/jpeg"/>
    </manifest>
    </package>

    3– Recher­cher, dans la liste des <reference> du <guide>, la première avec « cover » comme attri­but @type. Le fichier réfé­rencé pourra être un fichier XHTML. Dans ce cas je consi­dère comme couver­ture la première <img> de taille égale ou supé­rieure à 200×200 pixels (oui, c’est moche, mais je n’ai pas trouvé mieux).

    En XPath ce serait quelque chose de proche de //reference[@type='cover']/@href en n’ou­bliant pas ensuite qu’on obtient un fichier XHTML et non une image.

    <?xml version="1.0" encoding="UTF-8"?>
    <package xmlns="http://www.idpf.org/2007/opf" version="2.0" unique-identifier="BookId">
    <metadata xmlns:opf="http://www.idpf.org/2007/opf"></metadata>
    <manifest>
    <item id="ncx" href="toc.ncx" media-type="application/x-dtbncx+xml"/>
    <item id="style" href="style.css" media-type="text/css"/>
    <item id="id1" href="1.html" media-type="application/xhtml+xml"/>
    <!-- ... -->
    <item id="id13" href="13.html" media-type="application/xhtml+xml"/>
    </manifest>
    <guide>
    <reference type="cover" title="Cover image" href="1.html"/>
    </guide>
    </package>

    4– Enfin, à défaut de mieux, je descend les trois premiers <item> du <manifest> jusqu’à trou­ver une <img> de taille égale ou supé­rieure à 200×200 pixels (oui, c’est encore plus moche que précé­dem­ment, je sais)

    <?xml version="1.0" encoding="UTF-8"?>
    <package xmlns="http://www.idpf.org/2007/opf" version="2.0" unique-identifier="BookId">
    <metadata xmlns:opf="http://www.idpf.org/2007/opf"></metadata>
    <manifest>
    <item media-type="application/x-dtbncx+xml"id="ncx" href="toc.ncx" />
    <item media-type="text/css" id="style" href="style.css" />
    <item media-type="application/xhtml+xml" id="id1" href="1.html" />
    <item media-type="application/xhtml+xml" id="id2" href="2.html" />
    <item media-type="application/xhtml+xml" id="id3" href="3.html" />
    <item media-type="application/xhtml+xml" id="id4" href="4.html" />
    <!-- ... -->
    <item id="id13" href="13.html" media-type="application/xhtml+xml"/>
    </manifest>
    </package>

    Malgré cela, certains livres n’ont pas de couver­ture, et d’autres auront une couver­ture SVG qui ne sera pas récu­pé­rable, même si c’est rare. Si vous voulez complé­ter ou préci­ser, n’hé­si­tez pas.

  • Fuku­shima: Le début de la catas­trophe, c’est main­te­nant

    Personne n’a envie de parler de ça. Il y a eu indi­ges­tion, du n’im­porte quoi de tous les côtés, mais il est impor­tant de rappe­ler que l’ac­ci­dent de Fuku­shima n’est pas encore derrière nous.

    Ça s’ap­pelle Fuku­shima: Le début de la catas­trophe, c’est main­te­nant. C’est comme toujours à lire avec un sens critique et en véri­fiant les chiffres donnés sur plusieurs sources, mais c’est proba­ble­ment une lecture néces­saire.

    Pensez bien : Si tout était résolu, on en enten­drait parler régu­liè­re­ment à chaque fois qu’on aborde la ques­tion du nucléaire. Il est facile de jeter la pierre au gouver­ne­ment japo­nais mais il y a des compro­mis à faire et un équi­libre à trou­ver entre les risques sani­taires et les mesures à prendre. Dépla­cer la moitié de l’île n’est pas une solu­tion utile ou propor­tion­née. Ça ne veut pas dire pour autant que la situa­tion est bonne ou même accep­table.

  • What’s Your Geek Number? My Points System To Rate Soft­ware Engi­neers (without a full tech­ni­cal inter­view)

    Recru­ter est diffi­cile. Les candi­dats que je reçois sont parfois surpris du fait que je fais passer peu de tests tech­niques. J’ai appris à m’en méfier et que la réponse à des ques­tions simples est beau­coup plus signi­fi­ca­tive. La curio­sité, la connais­sance de l’état de l’art, l’état d’es­prit, sont fina­le­ment beau­coup plus impor­tantes.

    Et derniè­re­ment je tombe sur « What’s Your Geek Number? My Points System To Rate Soft­ware Engi­neers (without a full tech­ni­cal inter­view) ». La première impres­sion est de dire que c’est quand même irréa­liste comme façon de faire, puis en regar­dant de plus près et en tentant de forma­li­ser mes critères subjec­tifs, je me rends compte qu’ils n’en sont pas si éloi­gnés que ça.

    J’ajoute d’autres choses sur l’état d’es­prit et l’in­té­gra­tion à l’équipe, mais fina­le­ment c’est peut être sur ce types de critères que je fais le premier filtre.

  • Speed Index

    Mesu­rer la perfor­mance a toujours été une gageure. On parle de temps de char­ge­ment total de la page, de char­ge­ment de la page au dessus du pli, de temps de premier rendu, de char­ge­ment asyn­chrone, etc. Bref, nous avons déjà une demi douzaine de mesures, mais toutes qui reflètent un état diffé­rent et peu signi­fi­ca­tif.

    Webpa­ge­test semble être enfin arrivé à défi­nir une mesure qui a du sens et qui prend en compte le char­ge­ment progres­sif des pages. Une page qui se charge à 90% immé­dia­te­ment mais qui a un petit bout qui n’ar­rive que bien après reste plus inté­res­sante que celle qui se charge globa­le­ment plus vite mais où tout arrive d’un coup.

    Je reste un peu dubi­ta­tif sur comment ça gère les carrou­sels et autres anima­tions, mais ça m’a l’air assez repré­sen­ta­tif du ressenti utili­sa­teur : à tester.

  • Sarkozy à la Concorde: Y’a quelqu’un?

    Vive la commu­ni­ca­tion ! Sarkozy à la Concorde : Y’a quelqu’un ?

    La commu­ni­ca­tion démon­tée : On nous annonce 150 000 personnes à la Concorde. Photos à l’ap­pui, c’est entre 25 et 30 000 au maxi­mum, soit 5 fois moins.

    Oh, l’exa­gé­ra­tion il en va dans toutes les mani­fes­ta­tions et parfois le ratio entre la police et les orga­ni­sa­teurs est de plus de 5, mais il est toujours appré­ciable de pouvoir faire une petite compa­rai­son avec la réalité et démon­ter les montages photos.

     

  • Coup de filet anti-isla­miste : la colère d’une famille humi­liée

    La vie des gens, leurs droits, leur liberté, sont utili­sés dans de simples visées élec­to­ra­listes.  La commu­ni­ca­tion du gouver­ne­ment passe au dessus des liber­tés civiles. Et comme on ne casse pas d’ome­lette sans casser d’oeuf, tant pis pour les musul­mans en ques­tions. C’est leur faute aussi, ils n’avaient qu’à être chré­tiens ou juifs comme les français de chez nous. non ?

    Coup de filet anti-isla­miste : la colère d’une famille humi­liée. Si ça peut sembler n’être rien, c’est de la trahi­son pure et simple du rôle des auto­ri­tés et de l’État.

  • Réfé­ren­dum en Islande : seconde torgnole à la finance mondiale

    On peut le juger irres­pon­sable, même si le cas est loin d’être celui de la Grèce (il s’agit de la dette d’un établis­se­ment bancaire privé et pas celle de l’État), je ne peux m’em­pê­cher de repen­ser à chaque fois à la maxime « ils ne savaient pas que c’était impos­sible, ils l’ont fait ».

    Les pays pauvres sont complè­te­ment assujet­tis aux pays riches par la dette. Ces derniers sont complè­te­ment assujet­tis aux banques et orga­nismes de crédit, qui eux même sont finan­cés par de la monnaie virtuelle ou des aides des États.

    Au final tout le monde est écrasé par des inté­rêts et dettes à rembour­ser, sur une part fran­che­ment impor­tante du budget. Sans ces dettes nous aurions bien moins de problèmes. Au point où nous en sommes nous savons que nous n’en sorti­rons pas avant la prochaine révo­lu­tion : Il faudra plus de temps pour rembour­ser tota­le­ment les dettes que n’a d’an­cien­neté aucun de nos systèmes poli­tiques.

    Au final ils ne sont que quelques uns à en profi­ter. On peut les appe­ler les banquiers, mais le terme est impropre. Disons qu’ils sont les déten­teurs du capi­tal, souvent rentiers par héri­tage.

    Et si nous envi­sa­gions les solu­tions impos­sibles ? Elles sont proba­ble­ment une mauvaise idée, mais elles valent le coup d’être mises sur la table. Le risque n’est peu être pas si grand : Réfé­ren­dum en Islande : seconde torgnole à la finance mondiale

  • Fraude, para­dis fiscaux… guerre des mondes au Sénat

    Parler fraude, para­dis fiscaux… guerre des mondes au Sénat, c’est sur Media­part (donc payant, mais encore une fois je vous incite à vous abon­ner, ce média vaut 10 fois TF1, Le Monde, Le Figaro, Libé­ra­tion et France Tele­vi­sion réunis).

    Pour un petit avant-gout, Bloom­berg a une superbe anima­tion sur la circu­la­tion finan­cière des multi­na­tio­nales améri­caines. L’exemple est avec Google mais Yahoo! utilise un système assez proche.

  • Properly Salting Pass­words, The Case Against Pepper

    Bon, tout le monde devrait le savoir, même si mon expé­rience récente me montre qu’un rappel n’est pas inutile :

    • On ne stocke pas les mots de passe en clair, on les crypte
    • On n’uti­lise pas un chif­fre­ment réver­sible mais une fonc­tion de hachage
    • Un simple hachage ne suffit pas, il faut y ajou­ter un salage
    • Le salage doit être diffé­rent pour chaque mot de passe
    • L’al­go­rithme utilisé doit être lent, comme blow­fish par exemple

    Croyez moi, j’ai encore décou­vert il y a peu que non seule­ment ce n’était pas évident pour tout le monde mais que certains refusent de consi­dé­rer un simple stockage sous forme md5 sans salage comme une erreur et un problème poten­tiel de sécu­rité.

    Mais plus que tout ça, pour moi la règle de base c’est « ne jouez pas avec la sécu­rité ». Si vous n’êtes pas un expert dans la ques­tion : ne créez rien et n’im­plé­men­tez rien vous-même, utili­sez des biblio­thèques de codes toutes faites.

    Et par pitié, ne tentez pas d’amé­lio­rer les choses

    En jouant sur l’in­tui­tion, vous avez toutes les chances d’ar­ri­ver à un résul­tat opposé à celui que vous espé­rez.

    Dans le texte du jour à lire, Properly Salting Pass­words, The Case Against Pepper, nous avons un superbe exemple que je tente d’ex­pliquer en vain à chaque fois qu’on lève le sujet :

    Pour « amélio­rer » la sécu­rité, en plus du salage géré par l’al­go­rithme, propre à chaque mot de passe, certains cherchent à ajou­ter un second salage, global à l’ap­pli­ca­tion. L’idée est que le salage présent à côté du mot de passe dans la base de données ne suffit pas, il faudrait en plus connaitre le salage global utilisé par l’ap­pli­ca­tif, et donc profi­ter d’une faille de sécu­rité plus impor­tante afin d’ex­ploi­ter quoi que ce soit.

    L’idée semble bonne, intui­ti­ve­ment. Malheu­reu­se­ment vous n’êtes proba­ble­ment pas un expert sur l’al­go­rithme blow­fish. Vous ne *savez* pas si ajou­ter le même salage en début ou en fin du mot de passe avant de l’en­voyer à blow­fish ne risque pas de réduire la sécu­rité du résul­tat. Oh, vous avez proba­ble­ment l’in­tui­tion que ce n’est pas le cas, voire vous en êtes certains, mais aucune docu­men­ta­tion de sécu­rité recon­nue comme étant d’au­to­rité ne le précise expli­ci­te­ment.

    Vous en êtes à l’in­tui­tion et vous avez une chance sur deux de vous plan­ter. Au final, est-ce vrai­ment un bon pari ? Ça pour­rait l’être si l’état de l’art du stockage des mots de passe était fran­che­ment insuf­fi­sant et s’il n’y avait aucune méthode stan­dard pour l’amé­lio­rer. Ici il est probable que vous ne soyez pas encore à l’état de l’art (n’uti­li­se­riez-vous pas sha1 ou md5 ?) et cet état de l’art est proba­ble­ment suffi­sant si vous utili­sez suffi­sam­ment d’ité­ra­tions.

    Mais plus que cette ques­tion du double salage, qui est une mauvaise idée pour ce que vous et moi en savons, c’est toute l’im­plé­men­ta­tion que vous ne devriez pas toucher. Utili­sez une biblio­thèque de code éprou­vée, ou mieux : une fonc­tion prévue pour. En PHP nous avons « crypt », qui avec avec l’al­go­rithme blow­fish et suffi­sam­ment d’ité­ra­tions, rendra votre stockage des mots de passe bien plus solide que tout le reste de votre appli­ca­tion.