Christophe Le Bot

  • Navigation rapide
Pratique de la conception numérique

Derniers commentaires

  • Quand Google Maps sait se rendre utile
    • Christophe | Thanks Carly! I have modified the broken link.
    • carly | Hi Christophe There is a broken link on this page, I can send you the replacement link, im unable to find an email address for you. Ive provided mine for you to contact me. Carly
  • Test d’interface : paiement d’amendes en ligne
    • Herbaux Jean-Marie | J’ai été coupé a 15h56. Je ne parviens pas confirmer mon payement par C B via le payement.en ligne par Internet. J’entre bien les quatre groupes de chiffres et les deux...
    • Rovellotti Olivier | Ce site est un véritable cauchemar UX Excellent article http://www.natural-solutions.e u/
  • Agence web ou SSII : que choisir ?
    • Rovellotti Olivier | La limite n’est plus aussi claire qu’avant effectivement et les différence de prix sont du l’ordre du *10. Généralement les équipes dans les agences sont plus...
 

Archives
mars 2006

La théorie des graphes vulgarisée

Théorie des graphes

La théorie des graphes est très puissante pour modéliser les relations qui existent entre des entités. Purement théorique, son application à la programmation permet de concevoir des architectures à la fois robustes et souples.

Le seul problème, c’est de la maîtriser. Je vous conseille donc l’excellent site « Théorie des graphes » du Laboratoire Gilco, au contenu clair, précis et illustré.

Un fois ce savant cours ingurgité, la modélisation d’architectures relationnelles complexes sera un jeu d’enfants !

Théorie des graphes (document PDF)

TypeTester, l’assistant typographique rêvé des webdesigners

Typetester

L’idée est toute simple mais magistralement mise en pratique par Marko Dugonjic : TypeTester permet de comparer sur trois colonnes des blocs de textes en sélectionnant tous leurs attributs de styles : police, taille, couleur, interlignage, alignement, etc.

Quand vous avez trouvé le style adéquat pour votre site, TypeTester vous en donne le code CSS ! Et en plus, l’interface est tellement belle…

Faites tester vos sites grâce à UsabilityExchange

Ce n’est pas Cédric, mon ergonome préféré, qui me contredira : mettre en place un test efficace pour mesurer l’ergonomie et l’usage d’un site web coûte cher, parce que chaque service à tester est unique et donc le protocole de test spécifique.

Pourtant, les points communs sont nombreux d’un site à l’autre et l’internet permet de réunir des compétences et des testeurs de tout profil. Pourquoi ne pas profiter de cette nouvelle donne pour réaliser des tests plus facilement pour un coût maîtrisé ? C’est le service que propose le site UsabilityExchange.

La mise en place d’un test se fait par un formulaire en ligne qui définie la portée du test et le profil des testeurs. Tout se fait à distance : protocole de test, déroulement, clôture, résultats… et même paiement des testeurs qui restent sagement chez eux pour réaliser les tests !

Et que donnent les résultats ? A part de jolis graphiques et tableaux, on pourra bien sûr discuter le concept et notamment s’interroger sur le suivi des comportements d’un testeur qui n’est pas physiquement présent. Tracer ce qui se passe sur une interface ne suffit pas : l’attitude, les mouvements, les traits du visage, les hésitations, les grognements, les pertes de concentration, tous ces signes sont décisifs dans les résultats d’un test ergonomique.

Ceci dit, pour une validation basique d’un site, UsabilityExchange a au moins l’avantage d’éliminer les erreurs grossières pour un prix raisonnable.

Récupérer le dernier auto-incrément MySQL avec PHP

Quand un script ajoute un enregistrement dans une table MySQL, il est parfois utile d’en mettre d’autres à jour. Et pour cela, on peut avoir besoin de récupérer le dernier identifiant d’auto-increment. La fonction PHP mysql_insert_id() le fera très bien… sous certaines conditions.

Petit rappel sur les connexions MySQL

Avant de faire l’opération, voici un petit rappel du comportement des connexions MySQL ouvertes par PHP.

La plupart du temps, la connexion avec MySQL est établie par la fonction PHP mysql_connect(). Si un deuxième appel est fait avec les mêmes arguments, la première connexion sera à nouveau utilisée. Le paramètre new_link modifie ce comportement et permet à mysql_connect() d’ouvrir à chaque fois une nouvelle connexion, même si mysql_connect() a été appelée avec les mêmes paramètres.

Lorsque le script utilise une connexion persistante (par la fonction PHP mysql_pconnect()), le comportement est le même, à deux différences (importantes !) près :

  • Lors de la connexion, la fonction essaie de trouver une connexion persistante déjà ouverte, avec le même nom d’utilisateur et le même mot de passe. Dans ce cas, son identifiant est retourné sans ouvrir de nouvelle connexion.
  • La connexion au serveur MySQL n’est pas coupée à la fin du script. Le lien est conservé pour un prochain accès, même si on utilise la fonction mysql_close().

Au passage, notez que les connexions persitantes ne fonctionnent qu’avec PHP en version module.

Et l’auto-increment dans tout ça ?

L’auto-increment sera retourné par la fonction PHP mysql_insert_id(), mais il y a des risques de ne pas récupérer celui que vous attendez !

mysql_insert_id() retourne le dernier identifiant généré par un champ de type AUTO_INCREMENT, sur la connexion MySQL courante ou sur la connexion spécifiée par le paramètre link_identifier. Mais les surprises sont nombreuses :

  • Si votre colonne AUTO_INCREMENT est une colonne de type BIGINT, la valeur retournée par mysql_insert_id() sera incorrecte. À la place, il faut utiliser la fonction MySQL LAST_INSERT_ID() directement dans une requête SQL.
  • mysql_insert_id() ne fonctionne pas avec un REPLACE.
  • Si vous utilisez dans votre requête SQL un INSERT IGNORE en précisant un identifiant existant dans la table, l’enregistrement ne sera pas créé, ce qui est normal puisqu’il ne peut y avoir deux identifiants égaux. Par contre, mysql_insert_id() vous retournera l’auto-increment suivant, comme si l’enregistrement avait été ajouté !
  • Si vous faites des insertions multiples (par exemple, INSERT INTO table1 (champ1, champs2) SELECT champ1, champs2 FROM table2 WHERE champ1=2), mysql_insert_id() retournera l’identifiant du premier enregistrement ajouté !

J’arrête là le massacre car il y a bien d’autres cas. Pour s’en sortir, il faut privilégier la fonction MySQL LAST_INSERT_ID() (placée directement dans une requête SQL) et verrouiller la table :

mysql_query("LOCK TABLES table_exemple WRITE");
mysql_query("SET AUTOCOMMIT = 0");
mysql_query("INSERT INTO table_exemple (champ1, champ2) VALUES  ('toto1','toto2')");
$mysql_id = mysql_query("SELECT LAST_INSERT_ID()");
mysql_query("COMMIT");
mysql_query("UNLOCK TABLES");

Ajouter un disque à un serveur Linux Debian

Votre petit serveur Debian fonctionne toujours à merveille (comment pourrait-il en être autrement ?). Mais un matin, tout se bloque. Un rapide tour de la machine, un petit df -h en ligne de commande et le constat est sans appel : plus de place sur le disque ! Il faut en ajouter un second.

Voici brièvement comment monter un disque ATA :

  1. Installer le disque (alimentation, connexion IDE sur le bon port, en maître ou en esclave, avec une nappe de 80 fils)
  2. Partionner le disque (bien vérifier le nom du nouveau disque pour ne pas partitionner le premier !) :
    cfdisk /dev/hdb
  3. Formater chaque partition :
    mke2fs -j /dev/hdb1
  4. Tester chaque partition :
    cd /mnt
    mkdir disque2
    chmod 777 disque2
    mount -t ext3 /dev/hdb1 /mnt/disque2
    cd /mnt/disque2
  5. Monter le disque au démarrage du système :
    cd /etc
    vi fstab

    Ajouter la ligne :

    /dev/hdb1 /mnt/disque2 ext3 defaults 1 1

    (options selon l’utilisation que vous en ferez)

Finalement, c’est plus simple qu’on ne l’imagine !

Formatage d’une durée avec PHP

PHP regorge de fonctions et de variables pour gérer le temps. Pourtant, quand on souhaite afficher une durée entre deux dates, il n’y a aucune fonction spécifique ! Voici comment s’en sortir.

Un peu de mathématiques

Le principe est d’utiliser un nombre entier, par exemple une durée exprimée en secondes. A vous de convertir la durée avec vos scripts PHP (la fonction mktime() est toute désignée).

Ensuite, quelques formules mathématiques simples donnent un tableau contenant toutes les valeurs de la durée dans les unités de temps que vous souhaitez utiliser :

$duration = 3695;

// Initialisation
$duration = abs($duration);
$converted_duration = array();

// Conversion en semaines
$converted_duration['weeks']['abs'] = floor($duration / (60*60*24*7));
$modulus = $duration % (60*60*24*7);

// Conversion en jours
$converted_duration['days']['abs'] = floor($duration / (60*60*24));
$converted_duration['days']['rel'] = floor($modulus / (60*60*24));
$modulus = $modulus % (60*60*24);

// Conversion en heures
$converted_duration['hours']['abs'] = floor($duration / (60*60));
$converted_duration['hours']['rel'] = floor($modulus / (60*60));
$modulus = $modulus % (60*60);

// Conversion en minutes
$converted_duration['minutes']['abs'] = floor($duration / 60);
$converted_duration['minutes']['rel'] = floor($modulus / 60);
$modulus = $modulus % 60;

// Conversion en secondes
$converted_duration['seconds']['abs'] = $duration;
$converted_duration['seconds']['rel'] = $modulus;

// Affichage
print_r( $converted_duration);

Ce code affichera le résultat suivant :

Array
   (
      [weeks] => Array
         (
            [abs] => 0
         )

      [days] => Array
         (
            [abs] => 0
            [rel] => 0
         )

      [hours] => Array
        (
            [abs] => 1
            [rel] => 1
         )

      [minutes] => Array
         (
            [abs] => 61
            [rel] => 1
         )

      [seconds] => Array
         (
            [abs] => 3695
            [rel] => 35
         )
   )

Vous obtenez un tableau avec le nombre de semaines, de jours, d’heures, de minutes et de secondes que vous pouvez ensuite utiliser pour l’affichage. Pour chaque unité de temps, la cellule [abs] du tableau stocke la durée totale, alors que la cellule [rel] stocke la durée restante (définie par le modulo).

Prendre la valeur absolue de la durée est capitale ! En effet, sans abs(), la fonction floor() donnera des résultats faux avec un durée négative. C’est logique puisqu’elle retourne toujours l’entier inférieur d’un nombre réel. Si la durée vaut +4.4, vous obtenez +4. Si la durée vaut -4.4, vous obtenez -5 !

Et si j’utilise une base de données ?

Si vos dates à comparer viennent d’une base de données, la conversion en timestamp peut se faire directement dans la requête SQL. Avec MySQL, les champs de type DATE, DATETIME ou TIME sont convertis par la fonction UNIX_TIMESTAMP(). Au passage, attention à la limite des champs TIME (de ‘-838:59:59’ à ‘838:59:59’) !

Si vous utilisez MySQL 5, la fonction TIMESTAMPDIFF() fera tout à votre place… sauf le formatage en PHP que je vous propose !

En guise de conclusion, consultez les pages PHP et MySQL concernant les fonctions de dates et d’heures qui vous épargneront des calculs inutiles :

Site web : les bonnes pratiques

Même si vous avez dans l’idée de créer LE site web qui va révolutionner les usages d’internet, il n’est pas inutile de rappeler (ou de découvrir…) les bonnes pratiques qui viennent de l’expérience et de l’expérimentation. C’est ce que vous propose la société Temesis avec son projet Opquast.

Quand vous maîtriserez les 153 fiches Opquast, vous aurez sûrement plus de chances de valoriser votre projet web !

Avec Retrievr, dessinez ce que vous cherchez !

Retrievr

La société autrichienne System One vous propose de tester Retrievr, un système de recherche d’images original et intuitif : pour trouver des photos, il suffit de les dessiner !

Autour d’un noyau codé en Python, Retrievr utilise Flash et le framework Javascript Helma pour l’interface utilisateur. Il est principalement basé sur les recherches conduites par Chuck Jacobs, Adam Finkelstein et David Salesin, de l’Université de Washington.

L’interface est simple et intuitive, les résultats sont étonnants !