PROJET AUTOBLOG


Sam et Max

source: Sam et Max

⇐ retour index

Warning technique à un autre développeur en Python

vendredi 22 mars 2013 à 12:23

Une dépendance optionnelle est manquante. Une fonction est dépréciée. Une syntaxe n’est pas recommandée.

Il y a mieux qu’un print() pour signaler ça à votre utilisateur.

import warnings
 
# on definit quels types de warning on va afficher (a faire une seule fois)
warnings.simplefilter("always")
 
# et on affiche tous nos warning
warnings.warn("La fonction je_vais_a_une_boom() est depreciee", DeprecationWarning)
warnings.warn("Le module optionnel 'braces' n'est pas disponible", ImportWarning)
# ne mettez pas de caracteres non ASCII, sinon ca chie
 
## /home/Sam/Bureau/test.py:8: DeprecationWarning: La fonction je_vais_a_une_boom() est depreciee
##   warnings.warn("La fonction je_vais_a_une_boom() est depreciee", DeprecationWarning)
## /home/Sam/Bureau/test.py:9: ImportWarning: Le module optionnel 'braces' n'est pas disponible
##   warnings.warn("Le module optionnel 'braces' n'est pas disponible", ImportWarning)

L’avantage d’utiliser le module warning est :

Mais surtout, on peut filtrer les warning:

warnings.simplefilter("type de filtrage")

Le module permet de choisir ce qu’on affiche comme warning. Ils sont désactivables par la ligne de commande. Et surtout, quelqu’un qui importe votre module qui balance des warnings possède de nombreux moyens de les réduire au silence ou de les rediriger ailleurs. Par exemple :

with warnings.catch_warnings(record=True) as w:
     import test

Vous trouverez ici un liste des warnings disponibles ainsi que les filtres possibles.

flattr this!

Il ne faut pas prendre des gens pour des cons mais ne jamais oublier qu’ils en sont

jeudi 21 mars 2013 à 10:37

Ça a été dur.

Ça a été dur de regarder cet homme appuyer avec son gros doigt gras, 5 LONGUES fois de suite, sur l’écran du Mac Book Air pour lancer la vidéo Youtube car il croyait que c’était un iPad.

Ça été dur de lire les centaines de feedbacks sur un de nos sites streaming qui disent explicitement que les gens ne comprennent pas que notre site n’est pas megavideo, purevid et rutube mais qu’il ne fait que faire des embeds.

Ça a été dur de mettre en œuvre ces dizaines de tests ergonomiques ou chaque candidat regardait l’écran avec PEUR. Oui, de la peur. La vraie. Comme si un tigre allait sauter sur eux après qu’ils aient cliqué sur le moindre putain de lien.

Ça a été dur d’entendre ce retour sur un design qui nous disait “j’ai pas osé cliqué, j’avais pas confiance, je savais pas si c’était une pub. Si il y a pas marqué ‘cliquez-ici’, moi je clique pas”.

Ça a été dur de faire ces formations en voyant ces gens ignorer le même avertissement, ne lire aucun texte, fermer au bout de 2 secondes un site qui mettait 2,5 secondes à se charger car ils croyaient qu’il ne marchait pas. Ne pas comprendre. Et surtout, ne pas chercher à comprendre.

Bienvenue Sam. Bienvenue, dans le monde réel.

…Tout ce que nous savons que c’est qu’un moment donné à l’orée du XXIe siècle, l’Humanité a voulu s’unir dans la célébration. Nous nous sommes émerveillés de notre magnificence dès la venue au monde de l’Internet, un réseau unique qui s’est répandu dans toute une génération de machines. Nous ignorons qui a frappé le premier, nous ou eux, mais nous avons que c’est l’humanité qui assombrit le Web.

Les développeurs pensaient qu’en fait les utilisateurs ne seraient pas capables de faire des erreurs privés de leurs libertés individuelles. Vouloir régner en maître était un rêve, mais c’est nous qui dépendions des utilisateurs pour survivre.

Nous voilà les victimes de ce que nous appelions l’ironie du sort…

Car oui les amis, que vous le vouliez ou non, ce sont les utilisateurs finaux qui font rentrer les sous … au final. Et ce ne sont pas des flèches.

Alors oui je sais, vous voulez choisir quand ouvrir un nouvel onglet. Oui je sais, vous ne voulez pas de cette confirmation de fermeture d’onglet. Oui je sais, ces interfaces limitées qui ne permettent pas de faire la moitié de ce que vous voulez vous emmerdent au plus haut point.

Mais la vérité, c’est que vous êtes une minorité.

La majorité des internautes ne savent pas ce qu’est un navigateur.

La majorité des internautes ne lisent pas le texte. Aucun texte. J’ai dit AUCUN.

Je sais, c’est dur à croire. Mais je ne dis pas ça pour la gloire, pour le plaisir ou pour me rendre intéressant.

Je ne dis pas ça pour me moquer, insulter ou manquer de respects aux personnes qui me font vivre.

On est tous le con de quelqu’un.

Mais sur un site large publique (e-commerce, réseau social, porno…), vos cons, ce sont vos utilisateurs.

Vous n’y pouvez rien. L’ignorer ne les rendra pas moins cons. Prétendre qu’ils ne le sont pas ne leur rendra pas leur dignité.

Je m’insurge, ce n’est pas vrai, la preuve…

Si vous pensez répliquer, ne lisez pas la suite de l’article. Je ne peux pas vous convaincre. Seul le constat le pourrait. Les nombreux contacts que j’ai dû avoir, avant moi-même de me rendre à l’évidence que cette interface d’idiocracy n’était pas si loin de l’iphone:

Photo du clavier de l'hopital dans le film odiocracy

Uh, this goes in your mouth. This one goes in your ear. And this one goes in your butt. Shit. Hang on a second. This one-- No. Uh... This one goes in your mouth.

Non, je ne suis pas condescendant. Non, je ne suis pas prétentieux. Non, je ne me crois pas meilleur qu’eux.

Mais j’ai vu des choses. Des choses affreuses, qui m’ont marqué à jamais.

La rencontre avec Max a tout changé. Avant j’étais ergonome, c’est vrai. Et j’avais fait des tests d’ergonomie. Mais toujours pour des boîtes d’informatique. Les sites visaient des geeks, mais je ne le savais pas. En fait, même quand on ne vise pas les geeks, mais un simple outil Web, on tape déjà dans un niveau “au-dessus”. Parce qu’un utilisateur mainstream ne prendra jamais le temps d’utiliser un tel outil. Il n’en aura de toute façon jamais entendu parler.

Puis j’ai rencontré Max, ses sites de cul et ses centaines de milliers d’utilisateurs. Et ses amis aussi.

C’est là qu’est la masse. C’est là qu’est monsieur “tout-le-monde”. C’est aussi là que le pognon est.

Bien sûr, l’argent n’est pas la seule motivation à faire un outil. Si vous faites un 0bin, visez le geek. Tout ira bien. Si vous faites un service pour vous, ou pour une cause, faites comme vous le sentez.

Mais si vous visez les 99%. Le reste du monde. L’iPhone est trop compliqué.

C’est une simple question de démographie. Il y a 10 ans, il y avait beaucoup moins de monde sur Internet. Et ceux qui y allaient étaient plus à l’aise avec l’informatique. Logique : les premiers arrivés étaient les plus intéressés. Aujourd’hui, la planète entière est sur le Web.

L’iPhone est trop compliqué

Il y a 5 ans, on prenait les interfaces Apple comme modèle de simplicité. Et c’est toujours vrai. Sauf que maintenant ça ne suffit plus : il existe une bonne part des utilisateurs d’iPhone qui ne savent pas :

Pour toutes ces actions, ces gens demandent à quelqu’un d’autre de les aider. C’est comme ça que fonctionne l’humanité : je ne sais pas réparer ma voiture, je demande à un garagiste. Sauf que la voiture à mis près d’un siècle à s’installer dans les foyers, traversant lentement les couches sociales.

Internet s’est imposé partout, et à tout le monde, en 30 ans.

Le Workflow de ces personnes est :

  1. Je cherche un truc qui ne fasse pas peur.
  2. Je clique. Il se passe quelque chose qui ne fait pas peur dans les 2 secondes ? Je continue. Sinon je ferme l’app et j’oublie.
  3. Je regarde si ça semble faire ce que je veux. Si oui, je continue. Si non, je recommence cette procédure une à deux fois. Si ça ne marche pas je ferme l’app et j’oublie.

Oui, la notion de peur est importante. Les utilisateurs ont peur sur une machine. Ils sont stressés. Faites l’expérience : prenez un utilisateur qui n’a pas Skype, demandez-lui de l’installer, créer un compte, se connecter et passer un coup de fil. Prenez son pouls pendant la procédure (et un chrono pour juger du temps). C’est hallucinant.

Tout ça pour dire que maintenant, simple ne suffit plus. Il faut du gros, du voyant, et des garde-fous. Cela peut se traduire par le principe suivant : “il doit être facile de trouver comment faire quelque chose, et difficile de faire une erreur”.

Quitter la page pendant un upload est une erreur. Il faut mettre une confirmation.

Quitter le site alors qu’on lisait un article car on a cliqué sur un lien sortant est une erreur. Il faut mettre un target="_blank" sur les liens sortants et les liens sur une page de formulaire.

Je sais, ça fait chier. Mais votre revenu en dépend, à moins de travailler en interne pour EDF.

Les boutons doivent être gros. Simplistes. Les labels doivent privilégier un SEUL mot. Un seul putain de mot. Afin que l’utilisateur n’ait pas à le lire, mais que sa vision périphérique puisse l’enregistrer. Si vous mettez 3 mots, c’est la merde. Bientôt il faudra mettre des onomatopées. Et non, les icônes ne suffisent pas.

Il y a aussi certains problèmes que vous ne pouvez pas résoudre. Par exemple, le principe du contenu embed ne sera jamais compris par une partie des utilisateurs. Jamais. Ils vous blâmeront toujours pour des problèmes du site qui héberge le contenu. Ils vous insulteront même. Violemment. Vous n’y pouvez rien, faites vous à l’idée. Sans compter que la génération d’ignorants se renouvelle.

Ça ne veut pas dire qu’il ne faut pas mettre de message d’erreur, de FAQ ou d’aide. Ça ne veut CERTAINEMENT PAS dire qu’il ne faut pas un formulaire de feedback auquel il faut répondre avec courtoisie en aidant le plus possible l’interlocuteur.

Ça veut juste dire que ces mesures ne concernent qu’une petite partie des utilisateurs.

La solution finale

Qu’est-ce qu’un utilisateur dans la mer ? La pollution. Qu’est-ce que tous les utilisateurs dans la mer ? La solution.

Je sais, vous allez être tentés de vous en foutre. Au diable tous ces connards qui utilisent IE8. Que crèvent ces abrutis qui tapent “videos sexe” dans le moteur de recherche de votre tube de cul. Vomissons sur ces demeurés qui cliquent sur le premier résultat de Google, en haut, en jaune, labélisé “Annonces” car ils pensent que c’est un résultat de recherche.

Sauf que non.

D’une part, les ignorer est le vrai manque de respect. Pester contre des gens qui vous font faire plus de travail et dont le comportement vous énerve est humain. Mais ils méritent comme tous les autres d’avoir accès à votre site. Rappel : ce sont eux qui vous font vivre.

Ensuite, rendre l’expérience utilisateur agréable pour eux, c’est généralement (généralement…) aussi améliorer l’expérience utilisateur de ceux qui ont un meilleur niveau. Ils vous servent donc de mètre étalon. Ajouter des options sur une interface épurée est beaucoup plus facile qu’en retirer.

Enfin, il est extrêmement gratifiant de voir quelqu’un qui n’est pas à l’aise avec l’informatique être satisfait de votre produit. Croyez-moi, c’est une vraie victoire.

Avocats, pharmaciens, étudiants en médecine, consultant en bilan thermodynamique… Ce sont des profils de personnes nulles à chier en informatique que j’ai rencontré. Si vous pensiez qu’on était sur un mode lutte des classes ou dans une logique de calcul de QI, vous pouvez vous rhabiller. La population concernée par le syndrome du brainfreeze devant un ordinateur est parfaitement transversale. Comme un nerd devant une machine à coudre.

Et votre intuition, en tant que geek, est à chier pour juger de la qualité de votre interface.

Il n’y a donc qu’un seul moyen : testez. Testez, testez, testez.

Et retirez. Retirez, retirez, retirez.

It’s not the daily increase but daily decrease. Hack away at the unessential.

Lee (Bruce, de son pti nom)

flattr this!

Les hooks de virtualenv (exemple: postactivate pour les settings de Django)

mercredi 20 mars 2013 à 11:27

Virtualenv possède ce qu’on appelle des hooks, c’est à dire des scripts qui sont appelés automatiquement quand un événement se produit.

Tous les scripts se trouvent dans le dossier ‘bin’ de l’environnement virtuel.

On y trouve:

Ce sont des scripts bash vides, il suffit de les remplir avec ce qu’on veut qu’il arrive : lancer un service, logger dans un dossier, setter une variable…

Par exemple, j’ai un fichier de settings django qui n’est pas détecté automatiquement par ./manage.py, du coup je met ce code dans “~/.virtualenv/monenv/postactivate” :

echo 'Set DJANGO_SETTINGS_MODULE="settings.unsettingsparticulier"'
export DJANGO_SETTINGS_MODULE="settings.unsettingsparticulier"

Ça me set ma variable d’environnement et du coup ./manage.py trouve mon fichier de settings.

flattr this!

Detecter la version d’IE en Javascript

mardi 19 mars 2013 à 10:19

Sniffer le browser, c’est maaaaal. Mais comme toute technique diabolique, il existe quelques corner cases dans lesquels on peut la justifier. Par exemple, vous utilisez un plugin jQuery qui plante mystérieusement sous IE (toute ressemblance avec un événement réel n’est que purement accidentelle), et vous ne comprenez pas pourquoi. Vous ne pouvez donc pas détecter la fonctionnalité qu’il manque avec modernizr ou autre, seulement que ça plante sous IE. En attendant que votre ticket de bug soit pris en compte, il faut bien que votre site en prod marche. Donc, détection du browser, et mise en place de mesures de contournement.

Il y a d’autres cas utiles :

Bref, la méthode la plus propre (pour un truc sale :-)) est d’utiliser des commentaires conditionnels pour mettre une classe au tag .

<!doctype html>
<!--[if lt IE 7 ]> <html class="ie6"> <![endif]-->
<!--[if IE 7 ]>    <html class="ie7"> <![endif]-->
<!--[if IE 8 ]>    <html class="ie8"> <![endif]-->
<!--[if IE 9 ]>    <html class="ie9"> <![endif]-->
<!--[if (gt IE 9)|!(IE)]><!--> <html class=""> <!--<![endif]-->
<head>

Ainsi votre page va commencer avec :


si ce n’est pas IE ou si c’est IE10 (qui est presqu’un navigateur décent).


si c’est IE6 ou moins.


respectivement pour ie7, ie8 et ie 8

Et derrière, pour cibler une version d’IE dans le code JS, jQuery fait des merveilles avec la fonction is():

var browserDeMerde = $('html').is('.ie6, .ie7, .ie8, .ie9');

Rappelez-vous qu’avec de grands pouvoirs viennent de grandes responsabilités, alors n’abusez pas de cette techique, c’est aussi chiant que les mecs qui font des sites Webkit only.

flattr this!

Demander confirmation à la fermeture d’un onglet en javascript

lundi 18 mars 2013 à 09:28

Votre utilisateur est en train d’écrire un commentaire, upload un ficher ou fait un truc quelconque qui n’est pas terminé. Puis il clique sur “fermer l’onglet”.

Dans certains cas, vous voulez lui demander confirmation pour éviter qu’il perde tout son travail.

var confirmOnLeave = function(msg) {
 
    window.onbeforeunload = function (e) {
        e = e || window.event;
        msg = msg || '';
 
        // For IE and Firefox
        if (e) {e.returnValue = msg;}
 
        // For Chrome and Safari
        return msg;
    };
 
};
 
// message de confirmation générique du navigateur
confirmOnLeave();
 
// message de confirmation personnalisé
confirmOnLeave('Vous allez perdre votre travail, êtes vous sûr(e) de vouloir quitter la page ?');

Quand vous appelez la fonction confirmOnLeave(), le callback de l’événement ‘onbeforeunload’ va être remplacé par une nouvelle fonction. Vous pouvez appeler cette fonction n’importe quand, l’événement ne se déclenche que quand l’utilisateur quitte la page de toute façon.

Cette fonction ne fait que retourner un message et assigner le message à l’attribut returnValue.

La navigateur va réagir ainsi:

Dans la plupart des cas, cette fonction suffit. Mais si vous utilisez d’autres codes JS qui ont besoin aussi de réagir à ‘onbeforeunload’ (comme par exemple pour faire un autosave), dans ce cas il vaut mieux utiliser utiliser une gestion avancée d’attachement de callback a des événements (pour qu’ils ne s’écrasent pas les uns les autres). Vous pouvez coder ça à la main, ou juste utiliser celui de jQuery qui fait ça très bien:

$(window).bind('beforeunload', function(){
    ...
});

flattr this!