Catégorie : Développement informatique

  • Un peu de courage sur les formu­laires

    La fainéan­tise est une superbe qualité pour un infor­ma­ti­cien. C’est ce qui fait que l’in­for­ma­ti­cien est capable de coder 20 minutes un script pour lui auto­ma­ti­ser une tâche qui prend 5 minutes de boulot tous les mois.

    Main­te­nant parfois c’est abusé, et c’est trop souvent le cas sur les formu­laires.

    [saisir le ] nom utilisé lors de votre commande en majuscule et sans accent [et] le téléphone fixe actuel

    Sans rire, préci­ser « en majus­cules et sans accents » en gras c’est que le problème a été repéré lors de la concep­tion du formu­laire, ou que les retours clients en assis­tance télé­pho­nique ont été assez impor­tants pour justi­fier la modi­fi­ca­tion du texte.

    Dans ce cas, vous ne croyez pas que la saisie devrait être libre ? À votre appli­ca­tion de mettre en majus­cules et de reti­rer les accents si ça lui chante, mais ne faites pas faire votre boulot à l’uti­li­sa­teur.

    Le pire c’est pour le numéro de télé­phone parce que je l’ai vu dans *tous* les formu­laires d’opé­ra­teurs télé­pho­nie et inter­net. Le champ est bloqué à dix carac­tères, donc un numéro de télé­phone sans espaces.

    Bon, c’est juste agaçant à la saisie, mais c’est surtout inuti­li­sable au copier-coller car quasi­ment tout le reste de la France utilise des espaces comme sépa­ra­teur. C’est donc à l’uti­li­sa­teur d’al­ler copier-coller le numéro dans un éditeur de texte pour reti­rer les espace et le copier-coller à nouveau dans le formu­laire.

    Fran­che­ment, le déve­lop­peur n’avait pas la capa­cité de reti­rer lui même espaces et ponc­tua­tion côté serveur ? Ça coutait vrai­ment trop cher ?

    Déve­lop­peurs : Soyez fainéants, mais ne faites pas faire votre boulot par vos utili­sa­teurs !

  • D’une façon d’abor­der la tech­nique

    Aujourd’­hui j’ai demandé un peu d’ex­per­tise exté­rieure pour savoir quelles étaient les diffé­rences de trai­te­ments entre un SELECT DISTINCT et un GROUP BY dans Mysql. La ques­tion a trouvé sa réponse et pour ceux que ça inté­resse, le serveur fait les mêmes opti­mi­sa­tions, au moins dans le cas le plus simple.

    Ce qui m’a surpris c’est le nombre de gens qui ont fait une réponse basée sur leur simple intui­tion, souvent très mal conseillère, et parfois présen­tée comme une expli­ca­tion sûre.

    Que les déve­lop­peurs émettent des hypo­thèses ou puissent se trom­per n’est pas choquant. Par contre se baser sur ses préju­gés, ne pas cher­cher, véri­fier, se docu­men­ter, ça c’est une vraie faute profes­sion­nelle (et ce encore plus quand les préju­gés sont drama­tique­ment faux et injus­ti­fiés).

    Dans nos métiers il doit y avoir curio­sité et envie de cher­cher la solu­tion, mais surtout cette solu­tion doit être basée sur une compré­hen­sion des méca­nismes sous-jacents, ou au moins de la docu­men­ta­tion fiable, et le tout idéa­le­ment recoupé par des tests sérieux.

    Peut-être tire-je trop vite aux conclu­sions mais j’ai l’im­pres­sion que de plus en plus de déve­lop­peurs se satis­font de cette façon de faire et oublient que leur travail ne devrait pas se baser sur des infor­ma­tions incom­plètes et des pré-jugés. Collègues : Il est temps de vous réveiller.

  • Sites à page unique

    J’ai beau­coup aimé le site de Bayrou, et j’ai décou­vert il y a quelques temps celui de Troll d’idées. Je vous encou­rage à explo­rer au moins le second.

    Il y a un petit mouve­ment vers les sites à page unique avec des ancres et des sépa­ra­teurs visuels pour navi­guer. Je dois avouer que c’est génia­lis­sime quand c’est bien pensé et bien travaillé, mais ça demande à priori un inves­tis­se­ment en concep­tion large­ment supé­rieur au site habi­tuel. Sans cet inves­tis­se­ment, le résul­tat est rare­ment au niveau.

    Mon problème c’est que sur ces deux sites, il manque une version mobile. Est-ce une bonne pratique sur mobile ? Ce genre de design résis­tera-t-il au temps ou restera-t-il un effet de mode comme furent en leur temps les effets de para­laxe (dont Troll d’idées abuse d’ailleurs un peu) ?

    Connais­sez-vous un site qui fait de même avec en plus du respon­sive design ?

  • Web Perfor­mance Daybook Volume 2

    J’ai le plai­sir de vous annon­cer la publi­ca­tion de Web Perfor­mance Daybook Volume 2 (aussi dispo­nible en France). Il s’agit d’un recueil d’ar­ticles de plus de 30 auteurs autour de la perfor­mance web, collec­tés par Stoyan Stefa­nov en fin d’an­née dernière et auquel j’ai eu le plai­sir de parti­ci­per.

    Certes, tout le contenu peut être trouvé par Inter­net mais les béné­fices sont inté­gra­le­ment rever­sés à la fonda­tion WPO, dont l’objec­tif est d’ai­der et finan­cer les projets open source et la recherche autour de la perfor­mance web.

    Bref, proba­ble­ment un geste utile autant qu’in­té­res­sant.

    Si ça fonc­tionne, nous verrons proba­ble­ment un volume 1 prendre la suite (avec des articles de l’an­née précé­dente, mais toujours inté­res­sants).

  • Docu­ment store à recom­man­der

    J’ai un modèle rela­tio­nel très complexe avec des règles métier des plus biscor­nues quand on souhaite relire quelque chose. Par exemple, pour récu­pé­rer le libellé d’un item il faut que je conca­tène plusieurs champs et que je fasse une ou deux condi­tions pour gérer des cas spéci­fiques.

    J’ai peur que ça devienne diffi­cile à gérer et que ça faci­lite énor­mé­ment les erreurs de trai­te­ment à l’ave­nir.

    J’ai envi­sagé les trois solu­tions clas­siques :

    • dénor­ma­li­ser le modèle en stockant à plat certaines données préca­lu­lées dans le SGBDR, mais il y a pas mal de choses où c’est vrai­ment déli­cat, par exemple quand un item contient une collec­tion de données
    • coder des vues complexes et des procé­dures stockées pour auto­ma­ti­ser certaines actions, mais j’ai l’im­pres­sion de dépor­ter mon métier là où ça sera le plus diffi­cile à main­te­nir et à déve­lop­per
    • ou utili­ser un bête stockage orienté docu­ment et lais­ser tomber le rela­tion­nel, qui de toutes façons me sert assez peu sur ces données

    À priori je suis plutôt parti sur la troi­sième solu­tion et j’ai besoin de vos lumières pour choi­sir le datas­tore le plus adapté.

    Voici mes contraintes :

    • Perfor­mant (c’est pour utili­ser en perma­nence au cœur de l’in­fra)
    • Acces­sible faci­le­ment en PHP
    • Stocke des données struc­tu­rées (type json) avec de la hiérar­chie (un docu­ment peut conte­nir une collec­tion par exemple)
    • Le modèle de chaque docu­ment doit être libre ou en tout cas très souple
    • Sait mani­pu­ler une collec­tion de plusieurs millions de docu­ments (d’où la néces­sité des index au point précé­dent)
    • Sur ces millions de doc je peux faire des requêtes de type « par date de mise à jour inverse, unique­ment ceux qui ont un attri­but ‘toto’ à 145 et un attri­but ‘tata’ à 567 » sans avoir à faire un scan de tous les docu­ments à la requête (ce qui implique proba­ble­ment des index)
    • Sait gérer de la haute dispo­ni­bi­lité (par exemple deux serveurs synchro­ni­sés en master-master)
    • Simple à utili­ser et admi­nis­trer
    • Stockage disque (donnée pérenne en cas de plan­tage)
    • Accès réseau (la base et l’ap­pli­ca­tif sont sur des serveurs diffé­rents)

    J’ai aussi des non contraintes :

    • Les écri­tures sont faites en batch, je n’ai pas besoin de tran­sac­tion ou de lock d’écri­ture
    • Je n’ai pas besoin de vali­da­tion, typage, ou contrainte d’in­té­grité
    • Je n’ai pas besoin de tran­sac­tions
    • En cas de plan­tage, j’ac­cepte de perdre quelques minutes de données non écrites (mais pas de plan­ter les anciennes données)
    • J’ac­cepte des latences jusqu’à quelques minutes entre les diffé­rents serveurs synchro­ni­sés
    • Je peux prévoir à l’avance les requêtes que je vais faire (et donc construire des index dédiés)

    Les bonus :

    • Consom­ma­tion mémoire pas trop déli­rante
    • Outil pour faire des dump/restore

    Cassan­dra, Volde­mort, MongoDB et autres joyeu­se­tés, je suis preneur de vos recom­man­da­tions avec expli­ca­tions, ou simple­ment des liens vers des billets qui peuvent m’éclai­rer.

    Merci à vous cher public (j’ai toujours rêvé de dire ça ;)

  • Livre sur les perfor­mances cherche famille d’ac­cueil

    J’ai commencé un long projet il y a plus de trois ans de cela : un livre sur le temps de réponse des sites web. Le projet a rapi­de­ment avancé, avec 150 pages A4 rédi­gées et relu. C’est la moitié de l’objec­tif du sommaire, ou à peine plus, mais c’est déjà le volume d’un bon petit livre tech­nique. C’est certai­ne­ment de l’égo mal placé, mais je pense encore que le contenu est riche, de qualité, et n’a pas vrai­ment d’équi­valent, même en anglais.

    Le projet stagne toute­fois depuis deux ans avec un avan­ce­ment entre la moitié et les deux tiers. Écrire un livre tech­nique c’est un projet à plein temps sur plusieurs mois, surtout que j’ai tendance à vouloir être exhaus­tif. J’ai toujours eu un métier à plein temps à côté et des événe­ments profes­sion­nels et person­nels régu­liers ont fait que je n’ai pas pu y consa­crer le temps néces­saire. Ces derniers temps mon métier s’est de plus tota­le­ment éloi­gné de la perfor­mance des sites web, ce qui rend diffi­cile l’in­ves­tis­se­ment person­nel et la moti­va­tion néces­saires.

    J’ai tenté de trou­ver des co-auteurs pour relan­cer le projet mais chacun a aussi ses propres projets et un manque de temps. Je n’ai pas su trou­ver les bonnes personnes, ou elles n’ont pas pu déga­ger le temps pour s’y mettre.

    Au final j’ai un contenu qui me semble de bonne qualité mais incom­plet qui dépé­rit avec le temps. Il finira pas ne plus être suffi­sam­ment à jour, et ne servir à personne. Voir mourir ce bébé m’at­triste, j’ai­me­rai l’évi­ter.

    Voilà où j’ai besoin de vous : trou­ver une famille d’ac­cueil à cet ouvrage, une personne un groupe ou une société qui complète les chapitres non écrits, remette à jour ceux qui le sont déjà, et qui en fasse quelque chose. Je suis ouvert à toutes les propo­si­tions sérieuses. Mes critères sont les suivants, par prio­rité :

    • Je tiens à la qualité du contenu. S’il est repris et qu’il évolue, je tiens à ce que ce soit par ou sous la surveillance de gens sérieux et compé­tents sur le sujet
    • Ceux qui reprennent le projet souhaitent y inves­tir un temps suffi­sant, sinon une éven­tuelle reprise n’aura aucun inté­rêt
    • Je souhaite que mon nom reste crédité sur le contenu, et tant que le contenu initial reste signi­fi­ca­tif dans l’ou­vrage final, que ce crédit soit à titre de (co-) auteur prin­ci­pal
    • Pour mon égoïste satis­fac­tion person­nelle, j’ai­me­rai beau­coup que l’ou­vrage finisse publié sur papier (un éditeur est inté­ressé à priori, « il suffit de »)
    • S’il y a une utili­sa­tion commer­ciale, direc­te­ment ou indi­rec­te­ment, sauf excep­tion je souhaite une rému­né­ra­tion raison­nable à hauteur de ma contri­bu­tion au résul­tat final

    Là dessus vous pouvez envi­sa­ger à peu près ce que vous voulez. N’hé­si­tez pas à faire suivre à ceux que ça peut inté­res­ser.

  • Which program­ming language should I learn first?

    Histoire de rire un peu (jaune) :

    • To get a guaran­teed, mediocre, but well paying job writing finan­cial appli­ca­tions in a cubicle under fluo­res­cent lights: Java.
    • To do the same thing with certi­fi­ca­tions and letters after your name: C#

    Which program­ming language should I learn first? Et vous, quel langage appre­nez-vous ?

  • Pour une éduca­tion numé­rique

    L’ar­ticle de Slate ne va pas loin (oui, je sais, cette phrase est un lieu commun) mais le fond me semble des plus impor­tants. Apprendre à program­mer, sera aussi essen­tiel pour l’au­to­no­mie et pour progres­ser demain que ça ne l’écri­ture, la lecture et les mathé­ma­tiques de base pour nos parents ou grands parents.

    Ceux qui savent program­mer seront indé­pen­dants pour réali­ser toutes leurs tâches quoti­diennes. Tout ce qu’ils feront, person­nel­le­ment et profes­sion­nel­le­ment sera numé­rique. Les feuilles de calcul, les tableaux de données et les fichiers texte seront leur lot quoti­dien. Pouvoir faire quelques lignes de code pour extraire leurs infor­ma­tions, auto­ma­ti­ser des trai­te­ments, ou simple­ment manier comme ils souhaitent la profu­sion de données auxquelles ils doivent faire fasse, c’est essen­tiel.

    Nous n’en sommes qu’aux prémisses et pour­tant, comme beau­coup d’in­for­ma­ti­ciens, je me demande régu­liè­re­ment comment font les gens « normaux » pour être auto­nomes sur leurs petites tâches quoti­diennes. Certaines choses sont simple­ment faites en plus de temps, d’autres sont lais­sées pour compte. Aujourd’­hui ces échecs quoti­diens ne provoque pas encore de frus­tra­tion car l’usage de la program­ma­tion n’est même pas envi­sagé ; l’aide d’un infor­ma­ti­cien est vue comme une baguette magique. Demain, avec le tout numé­rique, personne ne sera dupe.

    Mieux, la program­ma­tion leur permet­tra aussi de créer, de ne pas se satis­faire de ce qui existe déjà, de parti­ci­per à l’in­no­va­tion, et de simple­ment n’être limi­tés que par eux-même. N’est-ce pas ce qu’on souhaite pour nos géné­ra­tions futures ?

    Apprendre les rudi­ments de la program­ma­tion aux enfants peut paraitre exagéré mais l’objec­tif n’est pas d’en faire des déve­lop­peurs de métier, pas plus que mes parents n’ont souhai­tés me faire écri­vain ou mathé­ma­ti­cien.

    POURTANT ÇA EXISTait DÉJÀ

    À quel âge faut-il commen­cer ? dans quel cadre ? ce qui est certain c’est que l’ap­proche d’aujourd’­hui, apprendre à se servir de l’ou­til via des logi­ciels tout faits, ne peut que mener à une impasse.

    Je me rappelle que j’étais un privi­lé­gié à avoir gouté aux MO5 ou TO7, avec l’uti­li­sa­tion de Logo pour faire bouger une petite tortue à l’écran, en primaire, à l’école publique. J’ai l’im­pres­sion que ces initia­tives n’existent plus. On préfère faire des mises en gardes concer­nant Face­book, la propriété intel­lec­tuelle ou montrer comment se servir de MS Word à des élèves qui en maitrisent bien plus l’usage d’une façon que réprou­ve­rait n’im­porte quel infor­ma­ti­cien.

    À côté de ça le projet OLPC pour l’Afrique promeut l’usage de Python. Ça n’a l’air de rien, mais si cette tendance se confirme, nous vivrons au crochet de l’Afrique dans quelques géné­ra­tions, à moins qu’on ne conti­nue à les assujet­tir à l’aide des dettes et autres produits finan­ciers (et qu’on reste donc dans du perdant-perdant)

    Un plan numé­rique

    Le pire c’est que les lycéens voire collé­giens qui apprennent d’eux même à faire du PHP ce n’est pas rare. L’école les freine au lieu de les y inci­ter.

    C’est d’un vrai plan numé­rique dont nous avons besoin, un plan qui ne soit pas basé sur de l’équi­pe­ment en tablettes, sur l’usage de logi­ciels en tant qu’ou­tils bloqués, et à partir de profes­seurs qui ne gèrent aucu­ne­ment ces outils.

    Voilà quelques pistes :

    • Éveil à la program­ma­tion en primaire, appren­tis­sage sérieux au collège
    • Inté­gra­tion de la program­ma­tion comme outil au lycée pour toutes les disci­plines (trai­ter des données en histoire-géogra­phie, faire des analyses statis­tiques en français, mathé­ma­tiques, physique, etc.)
    • Utili­sa­tion de logi­ciels, langages et outils sous licence libre (c’est indis­pen­sable pour l’au­to­no­mie)
    • Encou­ra­ger la copie et le travail sur docu­ments, parce que dans un monde d’abon­dance d’in­for­ma­tion et de connais­sance, le tri, la réflexion et le trai­te­ment de l’in­for­ma­tion sont les réels enjeux
    • Dans le même esprit, favo­ri­ser et répandre les travaux et examens où l’ac­cès aux docu­ments est auto­risé voire encou­ragé, parce que ce qui est jugé ne doit pas être la capa­cité à apprendre par coeur et à rete­nir
  • 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.

  • 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.