Il y a quelques mois, Google s'était doté d'un raccourcisseur d'URL qu'il avait intégré à ses services internes. Aujourd'hui, la compagnie a rendu disponible son service au grand public en lançant le site http://goo.gl/. Comme il existe déjà plusieurs services du genre (TinyUrl, Bit.ly), quel avantage peut-il y avoir à utiliser celui de Google ?
Pourtant très semblable à ses concurrents, Google conserve encore une fois la réputation d'en offrir plus pour se démarquer des autres. Le secret réside dans une petite fonctionnalité cachée qui permet de générer un code QR (QR pour Quick Response car il peut être décodé rapidement). Prenez n'importe quel URL généré avec goo.gl, par exemple celui de mon blogue que j'ai généré tout à l'heure, http://goo.gl/gWSd, et ajoutez à la fin du lien les caractères .qr : http://goo.gl/gWSd.qr. Lorsque vous y accéderez, vous obtiendrez la matrice en 2 dimensions qui représente l'URL en question.
Le code QR de http://code18.blogspot.com :
Destiné à être photographié à l'aide de la caméra d'un smartphone, le graphique est décodé par une application qui lit le code pour retourner l'information, dans ce cas-ci un URL. Contrairement à un code barre ordinaire qui ne peut contenir que 10 à 13 caractères, un code QR peut contenir jusqu'à 7089 caractères numériques ou 4296 caractères alphanumériques.
La fonctionnalité du code QR sur goo.gl a été qualifiée d'easter egg par Matt Cutts lui-même parce que ce n'est pas encore documenté officiellement.
L'extension de domaine .gl appartient au Groenland.
Mise en garde
Ce billet pourrait contenir des propos qui seraient offençants pour certaines personnes. Nous préférons vous en avertir.
Même si je me considère athée, le sujet dont traite ce livre m'a allumé dans le sens où si j'avais à croire à un dieu, ce serait probablement sous cette forme. Scott Adams, créateur de Dilbert, a écrit une histoire qui n'est pourtant pas reliée à son personnage populaire et qui réussit à concilier l'impossible : la science et Dieu. Ce livre est God's Debris, A Thought Experiment.
Je ne veux pas provoquer des discours enflammés de nature religieuse, l'auteur nous mettant lui-même en garde en introduction comme quoi l'explication la plus simple est souvent incorrecte mais qu'elle peut sonner crédible. Dans ce livre, la description de la réalité n'est pas vraie mais est étonnamment convainquante.
Ça me rappelle un peu l'approche de Bernard Werber dans son livre Paradis sur mesure, où il s'amuse à évoquer différentes possibilités de ce que pourrait être la vie si elle n'était pas telle qu'on la connaît.
Dans God's Debris, c'est un peu la même chose. Adams ne fait qu'imaginer une possibilité : Dieu étant tout puissant, il peut tout créer, a tout inventé, il est omniprésent en tant que force qui peut devenir ce qu'il veut selon sa volonté. Dès le moment où il décide quelque chose, ça devient la réalité. Il n'y a plus de défi à relever au point qu'il s'ennuie d'être Dieu. Son seul challenge : se détruire lui-même, juste pour voir ce qui arrivera. De toute façon, il ne peut pas craindre de mourir puisqu'il est immortel.
Il décide donc de se faire exploser en morceaux. Le Big Bang ? Et les choses étant ce qu'elles sont, nous sommes ce qui reste de lui : des débris de Dieu. Le temps n'est pas un problème pour lui, c'est un concept humain. Lentement, les miettes se réassembleront, même si ça prendra des millions d'années. L'évolution n'est que le désir de Dieu de reprendre sa forme initiale. Notre existence a été programmée dans l'univers depuis le début, garanti par la puissance de la probabilité. Ce n'est pas par hasard que nous avons inventé l'écriture, le téléphone ou Internet. L'instinct de l'être humain est de bâtir des systèmes de communications, de centraliser l'intelligence humaine en un seul grand projet global.
La rationalité ne peut expliquer notre obsession de l'Internet. La nécessité de construire l'Internet vient de quelque chose en nous, quelque chose de programmé, quelque chose que nous ne pouvons pas résister.
En quelque sorte, nous sommes en train de relier les particules de Dieu entre elles, comme pour recréer son ADN. Collectivement, nos activités contribuent à la réalisation de la conscience de Dieu. Nous évoluons pour devenir Dieu, ou plus précisément les premiers blocs de construction de son réassemblage.
Je me suis régalé de ce petit livre de 132 pages qui se lit en une soirée. Certains l'ont accusé de provocation, moi je préfère être ouvert aux nouvelles idées et les juger dans un contexte de fiction. Depuis la nuit des temps, l'homme s'invente des histoires pour comprendre le monde qui l'entoure. God's Debris en est une du 21ème siècle, avec sa vision originale et ses failles.
Suite à la partution de ce livre, Scott Adams a publié une suite, The Religion War, que je n'ai pas encore lu.
C'est une réflexion que je me souviens avoir déjà entendu dans mes cours de programmation au Cegep (au tournant du siècle) où des étudiants cherchaient à savoir si on pouvait ou non programmer en français. Comme le nom et son origine étaient français, certains croyaient à tord que le langage de programmation Eiffel possédait des mots clés français reconnus par les compilateurs. Une instruction SI ... ALORS ne me semblait pas très sexy. Un enseignant nous avait raconté qu'il y avait déjà eu des tentatives de francisation mais que rien n'avait été concluant. Je me souviens aussi que sa réponse à la question avait été stricte : on code en anglais, par convention.
En fait, sachant que les mots clés réservés de tous les langages sont en anglais, même le choix de noms de variables en français paraît douteux. En milieu professionnel, la lecture du code doit être fluide pour faciliter la compréhension alors c'est une bien mauvaise idée d'alterner entre deux langues. J'entends déjà les critiques de cordonnier mal chaussé arriver : certains exemples de code source sur ton blogue sont en français! Oui, mais dans un contexte d'apprentissage, c'est excusable. Parce que je m'adresse aux initiés, aux curieux, à des gens qui n'ont peut-être pas une grande expérience en programmation mais qui ont un intérêt d'en savoir plus, je me le permets à l'occasion. Au travail, c'est en anglais que ça se passe. Et si je vois un programmeur coder en français, je sors la strap pour le rappeler à l'ordre.
Pourtant, avec la situation du français en déclin qu'on connaît au Québec, on se sent encore plus comme le petit village d'Astérix qui doit défendre sa langue dans une Amérique du Nord anglophone. Personnellement, je suis un fervent défenseur de ma langue et j'essaie de m'appliquer à y faire honneur le plus possible mais professionnellement, je n'ai pas d'autres choix que de choisir l'anglais comme langue de travail. Pas pour la communication avec les autres mais pour mon environnement de développement. Si on voulait que ça sonne bien à l'oreille, on ferait pas de la poésie, pas de la business.
Au Québec, la loi 101 (charte de la langue française) stipule qu'en milieu de travail, les logiciels devraient être disponibles en français :
CHAPITRE VII
LA LANGUE DU COMMERCE ET DES AFFAIRES
52.1 Tout logiciel, y compris tout ludiciel ou système d'exploitation, qu'il soit installé ou non, doit être disponible en français, à moins qu'il n'en existe aucune version française. Les logiciels peuvent être disponibles également dans d'autres langues que le français, pourvu que la version française soit accessible dans des conditions, sous réserve du prix lorsque celui-ci résulte d'un coût de production ou de distribution supérieur, au moins aussi favorables et possède des caractéristiques techniques au moins équivalentes.
Primo, c'est la première fois que j'entends le mot ludiciel. Wikipedia m'éclaire en expliquant qu'il s'agit d'un terme pour dire "jeu vidéo". Qu'on le retrouve dans la section Langue du commerce et des affaires, je suppose qu'ils font référence à Farmville et Mafia Wars en milieu de travail ? Boss, une p'tite game de Ferme Agricole ou Guerres de la Mafia ?
Pour ce qui est installé sur mon PC, suis-je le seul à trouver intolérable d'avoir un système d'exploitation francophone ? Un exemple de frustration vécu récemment : avec Excel, si on veut créer un fichier CSV (comma separated values = valeurs séparées par des virgules) alors qu'on se trouve sur un OS dont les paramètres régionaux sont Canada/Français, le tableur décide de créer un CSV avec des point-virgules! Allo ?!?
Côté logiciels, Dreamweaver en français, c'est une plaie. D'ailleurs, je l'utilise de moins en moins, préférant Netbeans et NotePad++. Et je n'ai pas versé de larmes à perdre le WYSIWYG. Certaines de mes applications que j'utilise au quotidien ont été installés en français par le département réseau, d'autres en anglais. Mon voisin de bureau possède les mêmes logiciels, mais pas nécessairement avec l'interface dans la même langue que les miens. Quelle partie de plaisir lorsqu'on doit comparer nos configurations ou expliquer la procédure pour effectuer une action. Uniformité en anglais s'il-vous-plait.
Oui, ça aurait pu être standardisé en français pour toute l'entreprise mais :
- les logiciels en français sont plus rares
- ils sont parfois plus chers
- les traductions sont quelques fois approximatives (voire même comiques)
- les références et la documentation sont défaillantes ou absentes
Toujours convaincu de la pertinence du français en programmation ? Peut-être que vous appréciez la coquetterie de coder et de rédiger vos commentaires en français mais votre patron lui, qui cherche constamment des nouvelles opportunités d'affaires, risque de vous faire les gros yeux lorsque vous lui annoncerez que vos librairies de code seront difficilement utilisables par vos nouveaux partenaires biélorusses. Gardez toujours en tête que le code doit être réutilisable et redistribuable pour la communauté de programmeurs et force est d'admettre que la planète compte plus de gens qui se débrouillent en anglais qu'en jargon québécois. Notre langue commune pour comprendre un langage de programmation passe par l'anglais.
Parfois, je me dis qu'utiliser le français en informatique est aussi improbable que pour un mécanicien automobile : tu as l'air d'un amateur si tu n'utilises pas les termes acceptés par les gens de l'industrie parce que tu n'arrives pas à communiquer efficacement. Sur les bancs d'école, ça peut faire plaisir au ministère de l'éducation et à l'Office de la langue française de nous apprendre les traductions approuvées, mais c'est généralement vite oublié dès qu'on intègre le marché du travail.
Si tu es unilingue francophone ou que ta langue maternelle n'est pas l'anglais et que tu comptes faire carrière comme programmeur, l'utilisation de la langue de Shakespeare est une condition vitale à ta survie.
Le rêve de tout être humain est de faire un boulot qu'il aime. Faux. Arriver à la retraite au plus vite ? Même pas. Être riche pour ne plus avoir à travailler ? Oui et non. Le rêve ultime est de ne pas travailler du tout, ou tout simplement d'être payé pour faire quelque chose qui ne ressemble en rien à du travail.
L'artiste New Yorkais Nathan Sawaya se consacre depuis plusieurs années à créer des constructions originales en 3 dimensions à l'aide de briques Lego. Voici quelques unes de ses créations (on dirait que les photos sont pixelisées alors qu'en fait, c'est le relief des briquettes) :
Yellow (2006)
Cello (2009)
Blackberry (2010)
Boîte de Monopoly (2004)
Demain quand vous rentrerez travailler, si vous vous sentez un peu déprimé par votre choix de carrière, c'est normal. Ça va passer...
Autre nouveauté dans le monde HTML 5, c'est la balise METER. Fini le temps où des mesures traînaient un peu partout dans les pages sans qu'on puisse deviner par le markup la signification de chacun. La nouvelle balise Meter a été introduite pour corriger la sémantique de l'information de la page lorsqu'on veut indiquer une mesure dans une plage connue. De plus, ça s'affiche joliment.
Essentiellement, vous pourrez indiquer que l'espace disque est utilisé à 35% ou que vous avez obtenu un pointage de 7/10 dans votre code HTML (exemple minimaliste) :
<meter>35%</meter>Visuellement, ça ne sert pas à grand chose si on n'établit pas les bornes dans laquelle se fait la mesure. Affiché à la manière d'un thermomètre horizontal (à ce jour, seul Chrome a su l'afficher correctement), on peut d'un coup d'oeil avoir un aperçu graphique de la donnée :
<meter>7/10</meter>
<meter min="0" max="10" value="2">2/10</meter>
<meter min="0" max="10" value="5">5/10</meter>
<meter min="0" max="10" value="8">8/10</meter>
Comment ça fonctionne ?
À la base, aucun JavaScript n'est nécessaire. Il suffit de configurer les bonnes valeurs dans les attributs :
Value
Représente la valeur réelle à afficher sur l'échelle. Si elle n'est pas spécifiée, la valeur par défaut sera zéro.
Min
La borne minimum autorisée sur cette échelle de mesure. Zéro par défaut.
Max
La borne maximum. Si elle n'est pas spécifiée, la valeur maximale sera de 1 par défaut, ce qui veut dire que si on veut représenter 50% en omettant les attributs min et max, la valeur entrée devra être 0.5 (qui se situe entre 0 et 1).
<meter value="0.5">50%</meter>Low
Si la valeur se trouve sous la barre de l'attribut low, la mesure sera considérée comme faible et le code de couleur s'ajustera en conséquence suivant ce qui sera défini dans l'attribut Optimum.
High
Si la valeur se trouve au dessus de la valeur high, la mesure sera considérée comme élevée.
Optimum
La valeur sera considérée comme optimale si elle dépasse cette limite. En étant initialisée supérieure à la valeur high, ça indique que plus la valeur est élevée, mieux c'est, donc l'ordre des couleurs changera dans l'affichage. Dans l'exemple ci-dessous, une valeur élevée sera colorée en vert pour montrer que le résultat est positif. Sinon, si la valeur optimum n'était pas spécifiée dans le même exemple, une valeur élevée serait indiquée en rouge.
Qu'est-ce que ça veut dire concrètement ?
Si on mesure une performance académique, on détermine dans l'ensemble que sur une échelle de 0 à 100, une note au dessus de la note de passage de 60% indique un succès, qu'entre 50% et 60%, ce n'est pas suffisant mais qu'on est près de la réussite (affiché en jaune), et que sous la barre des 50%, c'est désastreux (affiché en rouge).
<meter value="39" min="0" max="100" low="50" high="60" optimum="80">39%</meter>
<meter value="56" min="0" max="100" low="50" high="60" optimum="80">56%</meter>
<meter value="64" min="0" max="100" low="50" high="60" optimum="80">64%</meter>
<meter value="86" min="0" max="100" low="50" high="60" optimum="80">86%</meter>
<meter value="92" min="0" max="100" low="50" high="60" optimum="80">92%</meter>
Jusqu'à maintenant, certaines personnes se sont amusées à transformer le rendu par CSS. Il y a un peu de triche mais ça démontre bien les possibilités. Curieusement, l'auteur dit que les exemples fonctionnent bien sous Firefox et Chrome 5 mais chez moi ça ne marche pas du tout avec Chrome 6.
La langue, c'est l'ADN de toute culture. Quand on perd sa langue, il se perd partout dans le monde des bibliothèques de savoir, de connaissance et de compassion.
Top 4 des chansons pour envoyer promener quelqu'un
Après mûre réflexion, voici le top 4 de mes chansons favorites qui ont été écrites dans le seul but d'envoyer balader quelqu'un (plus ou moins poliment). Pourquoi pas un top 3 ou top 5 ? Au diable les conventions, ce sera 4 pour aujourd'hui. Principalement parce que je n'en ai pas trouvé plus dans ma librairie musicale. Vos suggestions sont donc les bienvenues.
Lorsque vous aurez une petite frustration, qui sait si une de ces pièces saura vous aider à faire sortir le méchant et ainsi, retrouver le sourire pour passer une bonne fin de journée.
Sans plus attendre :
Groovy Aardvark
Album: Vaccum (1996)
Pièce: Dérangeant
Pour la décrire en leurs propres mots : dédiée à un espèce de crosseur qui a essayé de leur subtiliser de l'argent dans leur dos. Au lieu d'avoir une revenche physique sur la personne, ils lui ont écrit une chanson. À écouter idéalement sur la version live de Exit Stage Dive.
Extrait (paroles) : Ta mère te renie, ton pauvre père t'aimerait mieux disparu. Tes quelques rares amis, t'abandonnent comme une guenille sale, c'est bin plate mais c'est normal... Te voir souffrir est un plaisir dont j'ai le grand honneur d'offrir...
Crampe en Masse
Album: Éponyme (1998)
Pièce: Berceuse pour les pas fin
Le défunt duo d'humosites a réussi à rassembler autant d'insultes gratuites dans une même chanson.
Extrait (paroles) : Crève mon sale, t'es un mangeux de marde, un maudit crotté, un malade mental, m'as te faire poignarder, tu mériterais de te faire passer dessus par un char ou un camion à ciment...
Crampe en Masse
Album: Roule-toi par terre! (1999)
Pièce: J'aime pas ta face
Parce qu'elle me fait immanquablement penser à un ancien patron tellement qu'on pourrait croire que la pièce a été écrite en pensant à lui (je suis sûr que vous aussi en connaissez un).
Extrait (paroles) : J'aime pas ta face mais j'peux pas t'en parler t'es mon boss oui oui... Quand tu r'fuses de m'donner une augmentation, j'ai l'goût de t'abonner au Reader's Digest...
Nightwish
Album: Dark Passion Play (2007)
Pièce: Bye Bye Beautiful
Au moment de quitter son groupe métal pour se lancer dans une carrière pop, l'ancienne chanteuse, Tarja Turunen, a pratiquement renié sa musique. Ils lui ont écrit cette chanson en guise de cadeau de départ... À écouter dans l'auto, le son au max!
Extrait (paroles) : Did you ever hear what I told you? Did you ever read what I wrote you? Did you ever listen to what we played? Did you ever let in what the world said? Did we get this far just to feel your hate? Did we play to become only pawns in the game?
How blind can you be, don't you see? You chose the long road, but we'll be waiting. Bye, bye, beautiful!
C'est vendredi, je serai bref car j'ai ma semaine dans le corps et les événements des derniers jours au boulot m'ont incité à trouver une pancarte qui traduit bien mon état d'esprit actuel (trop de tâches à accomplir et pas assez de programmeurs).
Warning : Due to a shortage of robots, workers here are human beings and may react unpredictably if abused.
Traduction
Avertissement : En raison d'une pénurie de robots, les travailleurs ici sont des êtres humains et peuvent réagir de façon imprévisible en cas d'abus.
Merci bonsoir.
Dans La Presse ce matin, un article mentionnait que la compagnie Netflix s'excusait d'avoir embauché des figurants à Toronto pour faire semblant d'être emballés et excités à l'idée que le service de location de vidéos en ligne arrive au Canada. Tout ça était faux, dans le seul but de bien paraître devant les journalistes.
Ça m'a fait pensé à un livre que j'ai lu il y a quelques années qui traite exactement de ce sujet, soit La Guerre du Faux d'Umberto Eco. En particulier le chapitre où il parle de Disney et des personnages mécaniques animés qui répétaient leurs chorégraphies à l'infini pendant le passage des visiteurs. Force est de constater à quel point on est entouré de stratégies d'illusions.
Au cinéma, on sait que les artisans sont capables de transformer une ville en une autre par toutes sortes d'artifices et d'effets spéciaux. Au Québec, les coûts de production étant plus faibles et en ayant une main d'oeuvre qualifiée, les compagnies américaines ont vite saisi l'opportunité de venir produire ici.
C'est ainsi qu'en 2002, dans le film Catch Me If You Can, ils ont utilisé la place Royale dans la Basse-Ville de Québec pour prétendre que c'était Montrichard en France.
On reconnaît clairement en arrière-plan l'Église Notre-Dame-des-Victoires.
Toujours est-il que c'est basé sur un lieu réel qui n'a pas été trop altéré par des décors et des effets spéciaux. Je ne connais pas beaucoup de lieux de tournage au Québec, mais on m'a déjà dit que le film médiéval Timeline aurait été réalisé en partie à Terrebonne. Suite à une brève recherche, le seul château qu'il y aurait dans les parages est le buffet chinois Le Château de la Lune. Dommage que les lieux de tournage de films au Québec soit si mal documenté.
Sinon, du côté américain, j'ai récemment regardé la série Six Feet Under. Le salon funéraire Fisher où a lieu la majorité des scènes : décor ou lieu réel ? Une maison bien réelle située au 2302 West 25th street à Los Angeles. Toute une maison à part de ça! Ma blonde, elle, a adoré suivre la série Desperate Housewives mais toutes les maisons font parties du décor de Colonial Street dans Universal City de Universal Studios, Hollywood. Vu de haut, Wisteria Lane serait ici sur Google Maps. Les gars, vous voulez une bonne raison pour regarder cette émission ? Le même décor aurait servi au tournage du film Gremlins... Ouvrez l'oeil et ne regardez pas juste les belles femmes! Vous pourrez trouver plein d'autres détails croustillants sur le site Movie Location Guide.
Par exemple :
- le quartier général dans Ghostbusters
- le centre d'achats Twin Pines Mall dans Back to the Future
- le dépanneur Quick Stop dans Clerks
Je ne connaissais pas beaucoup le service Bit.ly pour raccourcir les URL, surtout parce que je ne lui avais pas donné sa chance et que j'utilisais TinyUrl depuis belle lurette. Quand j'ai vu qu'ils offraient un service de statistiques sur les clicks des liens publiés et que le tout pouvait se compiler et garder une trace dans son profil (enregistrement gratuit), j'ai songé à faire le saut à ce service. Côté statistiques, remarquez que vous pouvez les consulter pour n'importe quel lien Bit.ly en ajoutant un + à la fin de l'URL, et ce, sans même être connecté. Par exemple, pour l'adresse http://bit.ly/c6aFUo, on y accédera par http://bit.ly/c6aFUo+.
L'autre avantage, moins important, est que l'URL simplifié est plus court que celui de TinyUrl (11 lettres pour le domaine versus 6 caractères pour Bit.ly), ce qui donne un léger avantage d'espace pour les messages sur Twitter.
Pour raccourcir un URL, on peut le faire manuellement à partir de la page d'accueil. Pour le faire par programmation, il vous faudra obtenir une clé d'utilisation. Créez votre compte, connectez-vous et rendez-vous à cet URL pour obtenir votre clé personnalisée.
Tout comme pour l'API de TinyURL, vous devrez composer un URL en passant les paramètres et options par GET. Comme un exemple vaut 1000 mots, voici du code PHP détaillé qui permet de faire appel à l'API de Bit.ly à l'aide de CURL.
$longUrl = 'http://code18.blogspot.com';Si vous préférez la simplicité de file_get_contents() pour remplacer CURL (advenant que l'extension ne soit pas installée), ça fonctionne tout aussi bien :
$apiUrl = 'http://api.bit.ly';
$version = 'v3';
$action = 'shorten';
$login = 'code18';
$apiKey = 'votre_cle_ici';
$format = 'txt'; // objet json aussi disponible
$callback = ''; // a utiliser avec jsonp
$parameters = "login=$login&apiKey=$apiKey&longUrl=$longUrl&format=$format&callback=$callback";
$ch = curl_init("$apiUrl/$version/$action?$parameters");
curl_setopt($ch, CURLOPT_NOBODY, False);
curl_setopt($ch, CURLOPT_HEADER, False);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, True);
$shortUrl = curl_exec($ch);
echo $shortUrl;
$shortUrl = file_get_contents("$apiUrl/$version/$action?$parameters");Pour plus de détails, consultez la documentation de l'API de Bit.ly. En passant, l'extension de domaine .ly est pour la Libye, un pays d'Afrique du Nord.
PostgreSQL 9.0 est sorti officiellement hier et je n'ai pas encore eu le temps d'en faire l'essai pour voir s'il y avait un outil plus avancé pour suivre l'activité du serveur. À part l'ajout de application_name qui est documenté dans les releases notes, il ne semble pas y avoir quelque chose qui remplace la consultation à partir d'une requête SQL.
Je vous laisse l'énoncé SQL que j'utilise lorsque j'ai besoin de surveiller ce qui se passe sur le serveur :
SELECT *,En plus de retourner les valeurs par défaut fournies par pg_stat_activity, j'ajoute aux résultats l'adresse IP et le temps d'exécution de la requête. Dans la clause WHERE, le filtre datname permet de sélectionner une seule base de données.
(regexp_replace(text("client_addr"), '/.*', '')||':'||text("client_port")) AS ip_addr,
now() - query_start AS runtime
FROM pg_stat_activity
WHERE datname='code18'
C'est le kickoff meeting d'un projet ambitieux fait sur mesure. On rencontre le client, il nous expose sa vision et ses besoins. On travaille ensemble sur l'analyse en détaillant les moindres particularités.
Nous : Cher client, je recommanderais l'ajout de cette fonctionnalité en priorité. C'est important d'avoir une bonne fondation et de le faire immédiatement car une partie de la modélisation de la base de données en dépend.
Client : Non, merci, ça n'arrivera jamais. Gardons les choses au plus simple pour que ça coûte le moins cher.
Nous : Vous en êtes certains ? Selon notre compréhension, on croit déceller que ça serait nécessaire pour couvrir tous les cas de figure. Notez que c'est une décision critique qui risque de complexifier les choses si on doit revenir en arrière pour adapter le système.
Client : N'essayez pas de me vendre des extras que je n'ai pas besoin. C'est impossible que les exceptions que vous mentionnez surviennent.
Nous : OK, mais on vous aura averti.
Quelques mois plus tard... Coup de téléphone.
Client : Oui bonjour, nos clients se plaignent de l'absence de la fonctionnalité et il faudrait la rajouter finalement. C'est urgent!
Nous : Hum... il est un peu tard pour le dire non ?
Client : Écoutez, c'est juste une petite fonctionnalité toute simple, je suis sûr que vous allez programmer ça rapidement, vous êtes des pros!
*** Réflexion ***
Si le besoin est facile à exprimer, ça ne veut pas dire que c'est facile à faire. Imaginez si on était à construire un gratte-ciel et qu'à la toute fin, le client décidait qu'il aimerait qu'on ajoute un demi-étage entre le 7 et le 8ème (référence: Being John Malkovich). C'est excessivement compliqué, pourquoi ne pas le faire au sommet ? Nous n'aurions pas à toucher à la structure existante. Il est catégorique : il désire que cet étage soit à cet emplacement et pas ailleurs.
Pour lui, il s'en fout, c'est nous qui allons devoir relever le défi. Comme dit le vieil adage, le client a toujours raison. Il est roi et maître parce que c'est lui qui paie.
Chargé de projet : on va vous arranger ça.
Programmeur : département des miracles, bonjour ?
Heureusement, c'est de la routine dans la vie d'un programmeur. Il sait par expérience que le code doit être assez flexible pour permettre de se retourner sur un 10 cennes (faire face au changement très rapidement). En secret, il avait prévu le coup et préparé le terrain. Il n'existe pas de problème qui n'ait pas de solution. Dans ce cas-ci, impossible voulait dire 25 heures.
Durant la fin de semaine, j'ai participé pour la première fois à une activité de géocaching, une chasse aux trésors où on utilise un GPS (Global Positioning System) pour localiser une cache qui contient un objet surprise. Lorsqu'on découvre le contenant, on récupère l'objet laissé à l'intérieur par la personne qui est passée avant nous et on le remplace par un autre à l'attention du prochain participant. Une feuille de papier permet d'y laisser notre trace en inscrivant notre nom et la date.
Ce n'était pas très facile car le modèle de GPS qu'on avait nous indiquait un rayon de recherche de 5 mètres. En plein milieu du bois, disons qu'on pouvait chercher longtemps mais on y est arrivé avant de perdre patience.
Comme le récipient était un tube de plastique (du type pour médicaments), je ne pouvais pas laisser quelque chose de très gros. Au départ, je voulais laisser un macaron 10ème anniversaire de Yulblog mais il était légèrement trop large. À la place, j'ai laissé un "pick" de guitare Fender en plastique rouge (aussi connu sous le nom de plectre ou médiator). Voici une photo et les coordonnées (LesPat19, en plein coeur de la région de la Mauricie) :
Comme c'est une activité assez geek (étant donné que ça implique la technologie), je vous mets au défi d'aller le récupérer et de me tenir informé si vous réussissez à mettre la main dessus.
Pour plus de détails sur le géocaching et savoir où se trouvent les caches (entrez tout simplement votre code postal), visitez le site officiel du géocaching. Justement, une cache se trouve au parc juste à côté de chez moi...
On appelle voiture d'occasion une voiture dont toutes les pièces font du bruit sauf le klaxon.
Je poursuis mon expérimentation du HTML 5 malgré une discussion à mon travail où il était question de savoir si on devait commencer à exploiter ou non les fonctionnalités offertes par la nouvelle mouture du markup. Avec les chiffres indiquant que les fureteurs ne sont définitivement pas prêts et que l'utilisateur traîne toujours à mettre son navigateur à jour, la conclusion qu'on en a tiré est qu'il est encore trop tôt et que ce serait inconcevable d'imposer un navigateur à la masse à moins de développer dans un environnement fermé comme pour le iPad.
En attendant, il ne faut pas se laisser freiner par ces contraintes et on se doit comme développeur d'aller de l'avant pour se préparer à ce qui s'en vient. Wired annonçait récemment que le web était mort parce que la portion web des Internets perdait du terrain face à la vidéo, aux P2P et surtout aux applications spécialisées (iPhone) tirant profit du réseau sans passer par un fureteur. Qui sait si le HTML5 ne sera pas l'élément déclencheur qui repropulsera à nouveau le web au somment avec son expérience enrichie ? Pour un développeur comme moi, j'apprécie les arguments techniques mais pour Monsieur Madame Tout-le-monde, il en a rien à foutre du langage ou de la technologie qui se cache derrière, il veut quelque chose qui fonctionne.
Je vais m'arrêter pour ne pas transformer ce billet en réflexion sur l'avenir du web et je vais me concentrer sur ce dont je voulais réellement parler, une fonctionnalité toute simple, une légère amélioration introduite dans les formulaires HTML5 : l'attribut autofocus.
Du côté ergonomique, la page d'accueil de Wikipedia ou Google place automatiquement le curseur dans la boîte de recherche pour permettre à l'utilisateur de saisir immédiatement les mots clés sans avoir à cliquer sur la boîte pour lui donner le focus. Historiquement, on devait le faire par JavaScript à l'initialisation de la page :
$(document).ready(function(){Ou comme Google, sur le onload de la balise Body :
$('#search').focus();
});
body onload="try{!google.j.b&&document.f.q.focus()}catch(e){};...En HTML 5, il suffit de remplacer le JavaScript par l'attribut HTML autofocus sur le champ de saisie :
<input type="text" name="q" autofocus>C'est tout ce qu'il y a à faire. À noter que contrairement au XHTML, il n'est pas nécessaire ici d'inscrire l'attribut avec une valeur comme autofocus="autofocus".
Conclusion du billet : 80% de réflexion, 20% de code.
Est-ce qu'un client vous a déjà demandé de générer un PDF par PHP alors que vous n'aviez pas sous la main la librairie FPDF ou PDFlib (lite ou la licence commerciale à 1000$ pour serveur) ? Parfois, les moyens sont limités mais on doit quand même livrer quelque chose de fonctionnel, que ce soit pour générer un reçu ou une facture autrement que par HTML.
À quelques reprises, je me suis servi d'un petit script gratuit nommé DOMpdf qui s'est avéré suffisant pour mes besoins. Ce package est constitué d'un ensemble de script PHP pour générer des PDF de base à partir d'une simple structure de document HTML (d'où son nom DOM). Il supporte l'inclusion d'images et tente du mieux possible de suivre les règles CSS.
Il ne faut pas s'attendre à la perfection alors je recommande de construire son gabarit HTML le plus simplement possible pour éviter les mauvaises surprises. Pour ma part, j'ai pu mettre sans effort une image d'entête (logo), des tableaux et un peu de CSS pour la mise en page (beaucoup de règles ne sont pas supportées). Le résultat est assez fidèle aux attentes du client.
Comme il ne nécessite aucune installation d'extension sur le serveur, il suffit de télécharger le fichier compressé et de le dézipper dans le répertoire de son projet. J'ai utilisé la version stable 0.5.1 disponible sur Google Code, la version 0.6 étant encore en beta (depuis mai 2010).
Ce que je voulais arriver à faire, c'était de personnaliser un gabarit HTML en utilisant des substitutions (identifiées par des balises de commentaires), générer un PDF automatiquement sans même à avoir à le stocker sur disque et l'envoyer en attachement par courriel.
Pour ce faire, DomPDF m'a permis de convertir le document HTML en format PDF et le composant Zend_Mail de Zend Framework a été pratique car il possède la capacité de créer un attachement de fichier à partir de son contenu binaire et de l'envoyer par email.
Quelques lignes de code PHP ont suffi pour arriver à mes fins et c'est étonnamment assez performant (1 page générée à la volée - temps d'exécution pratiquement instantané) :
# Étape 1Explications par étapes :
require_once('Zend/Mail.php');
require_once('dompdf-0.5.1/dompdf_config.inc.php');
# Étape 2
$html = file_get_contents($_SERVER['DOCUMENT_ROOT'] . '/template.htm');
$html = str_replace('<!-- name -->', 'Code 18', $html);
// autres substitutions...
# Étape 3
$dompdf = new DOMPDF();
$dompdf->load_html($html);
# Étape 4
$dompdf->render();
# Étape 5
// si on veut le faire afficher en attachement "save as"
// $dompdf->stream('nom-du-document.pdf');
$pdfBinary = $dompdf->output();
# Étape 6
$mail = new Zend_Mail('UTF-8');
// propriétés
$mail->setFrom('code18.blogspot@gmail.com');
$mail->addTo('code18.blogspot@gmail.com');
$mail->setSubject('Document PDF');
$mail->setBodyText('Voici votre document PDF personnalisé');
# Étape 7 : créer l'attachement
$file = $mail->createAttachment($pdfBinary);
$file->type = 'application/pdf';
$file->disposition = Zend_Mime::DISPOSITION_ATTACHMENT;
$file->filename = 'nom-du-document.pdf';
// envoyer le message
$mail->send();
- J'inclus d'abord les deux librairies. C'est bel et bien le fichier dompdf_config.inc.php qu'on doit inclure et non dompdf.php. Curieux mais c'est comme ça.
- Je lis la source HTML du gabarit et j'effectue les remplacements.
- Je crée un objet DOMPDF et je lui passe la variable qui contient le contenu HTML en utilisant la fonction load_html(). D'autres configurations peuvent être faites ici, comme par exemple indiquer le chemin de base des images ou d'une feuille de style externe (avec set_base_path).
- Appeler la méthode render() est obligatoire. À ce stade-ci, le PDF est généré en mémoire seulement.
- Pour récupérer le fichier PDF, on peut utiliser stream() pour l'envoyer à l'utilisateur (sous forme de fenêtre "Enregistrer sous") ou encore, comme c'est le cas pour moi, récupérer le contenu binaire du fichier en appelant la fonction output().
- J'instancie un objet Zend_Mail pour construire le email à envoyer.
- Je crée un fichier en attachement en passant en paramètre la variable contenant le binaire du PDF, qui sera automatiquement lié à l'objet $mail par l'appel à createAttachment().
Les capacités de DOMpdf sont assez rudimentaires. On pourrait compléter le traitement et la manipulation à l'aide d'autres outils. Par exemple, une fois le PDF généré, s'il était enregistré sur le disque du serveur, on pourrait appeler des fonctions de PDFtk (toolkit), un outil gratuit et polyvalent, accessible à partir du shell (shell_exec en PHP) qui permettra de fusionner le PDF nouvellement créé à un autre document PDF, l'encrypter contre l'édition (avec un mot de passe), appliquer un filigrane ou un arrière-plan, etc.
Une autre nouvelle fonctionnalité qu'apporte le HTML 5, c'est le support pour la géolocalisation. Ce n'est pas aussi précis qu'un GPS, mais ça détecte généralement assez bien la ville où on se trouve.
Pour vérifier si le navigateur supporte la géolocalisation, on peut effectuer un test à l'aide du bout de code JavaScript ci-dessous :
if(navigator.geolocation){Au moment d'appeler getCurrentPosition, le browser demandera une autorisation pour partager cette information (Firefox, Chrome et Opera).
alert('Activé');
navigator.geolocation.getCurrentPosition(
function(position){
alert(position.coords.latitude);
alert(position.coords.longitude);
}
);
}
Du côté de Safari pour Windows, il me demande bien l'autorisation mais n'a pas été en mesure de me retourner les coordonnées dans le popup.
Sinon, j'obtiens une latitude de 45.514516 et une longitude de -73.611056.
Saisies dans Google (45.514516, -73.611056), les coordonnées pointent à Outremont, ce qui n'est pas tout à fait exact. En fait, ça devrait possiblement correspondre à un endroit où mon fournisseur d'accès Internet possède des serveurs.
En obtenant les coordonnées aussi simplement, ça devient facile d'intégrer une carte Google Maps ou Bing Maps à l'emplacement approximatif où se trouve le visiteur.
Pour plus de détails : Geolocation API Specification sur W3C.
Si les enfants ont droit à leur Kinder Surprise, les adultes peuvent se récompenser d'une bonne journée de labeur en buvant une bière et en dévorant croustilles et grignotines. Ben oui, les vrais hommes font ça. Idéalement, devant un match de hockey (la nouvelle saison commence bientôt!).
Pour rassasier son homme, ma copine a déniché tout droit de Roumanie les grignotines les plus extraordinaires qui soient : les Pufuleti cu Mega Surprize de Gusto (gusto = enthousiasme en roumain).
Je n'ai pas encore osé ouvrir le sac, préférant attendre une grande occasion pour les partager entre amis. Mais le désir me brûle les droits de le déballer pour découvrir ce mets qui, ma foi, m'a l'air fort bon. OK, disons que je ne sais pas du tout à quoi m'attendre car l'emballage met beaucoup plus l'accent sur la surprise que sur le produit lui-même, ce qui, en général, n'est pas bon signe.
La description qu'en fait la compagnie est éloquente :
Pufuleti cu mega surprize. 60g de pufuleti cu sare + jucarie mare. Pentru ca cei mici se plictisesc repede, pufuletii cu SURPRIZE iti aduc in fiecare punga o noua jucarie traznita. Masinute, papusi, jocuri, robotei, radiouri portabile, mp4 playere si tot felil de mutunache fantastoizi numai buni de pufulit!
Traduit approximativement par Google (si c'était inscrit en français sur le sac, ce serait probablement aussi fidèle) :
Surprises méga collations. 60g de snacks avec le jouet de sel + élevé. Parce que les enfants s'ennuient vite, surprises pufuletii chaque sac vous apporter un nouveau jouet fou. Voiture, poupées, jeux, robots, les radios portables, lecteurs MP4 et tous mutunache fantastoizi felil seulement bon pour Willow!
En raison de la présence d'un jouet pouvant présenter des petites pièces, ce produit n'est pas recommandé pour les enfants de trois ans et moins. C'est pour cette raison que si la bonne fortune me permettait de découvrir un lecteur mp4, je le garderais pour moi.
Je vous tiens au courant du contenu prochainement. Je sais que ça fera jaser, ou que ça créera beaucoup de déception (imaginez moi en train de me recroqueviller sur moi-même dans un coin si par malheur je découvrais une poupée...). Enfin, j'ai toujours un excès de confiance quand je vois que l'adresse email de la compagnie est chez Hotmail.
Mise à jour, 1er octobre 2010
J'avais promis de vous tenir au courant lorsque j'aurais ouvert le sac et comme hier était soir de hockey, c'était un bon prétexte pour goûter à ces curieuses grignotines. Justement, celles-ci étaient de petits cylindres uniformes jaunâtres et pâles avec une texture semblable au maïs soufflé (comme des bâtonnets de crottes au fromage). Le goût : correct, manque de croquant, plutôt gras.
Après avoir mangé une portion du sac, un jouet emballé dans un sac transparent commençait à se montrer le bout du nez. Déception, ce n'était pas un lecteur MP4. Seulement un petit chien en plastique de 5 pouces de long qui peut s'animer en courant sur votre plancher si vous tirez la petite cordelette située directement dans son arrière-train.
Dog-Toy Backguy No. 988.
Si vous me lisez régulièrement, vous connaissez sûrement ma passion pour la musique. J'ai constamment mes écouteurs sur les oreilles, j'ai été impliqué dans la scène musicale québécoise pendant quelques années et j'ai exploré mon talent à travers quelques instruments (en tant que musicien amateur qui ne deviendra jamais une rock star).
Donc c'est tout naturel pour moi de m'intéresser à la nouvelle façon d'intégrer de la musique dans une page web, à l'aide de la balise audio du markup HTML 5.
Ce qui est bien, c'est qu'il n'est plus nécessaire d'avoir un lecteur Flash pour charger les audios et les vidéos puisque les fureteurs les supporteront nativement. Voyez le rendu des lecteurs audios par défaut sous les versions les plus récentes des fureteurs compatibles :
Pour intégrer du contenu musical, le markup HTML sera composé d'un conteneur audio et d'une source de données.
<audio id="music" controls autoplay>À part Safari, tous supportent le format libre OGG. C'est pourquoi on peut aussi spécifier un format alternatif comme le mp3. Le fichier doit être physiquement sur le disque, ce qui implique qu'on doit doubler l'espace disque nécessaire. J'ai aussi essayé de fournir une source audio dont le téléchargement était contrôlé par PHP mais aucun des lecteurs n'a bien réagit.
<source src="/files/mp3/Arcade Fire/The Suburbs/09-Suburban War.ogg" />
<source src="/files/mp3/Arcade Fire/The Suburbs/09-Suburban War.mp3" />
</audio>
Dans la balise audio, l'attribut "controls" est recommandé car il permet de faire afficher le lecteur à l'écran. Sinon, la musique jouera en arrière-plan. On peut le combiner avec l'attribut "autoplay" pour faire jouer automatiquement le clip audio dès le chargement de la page. Si on omet d'écrire "controls" et qu'on combine les attributs "autoplay" et "loop" (lecture en boucle), ça risque de rappeler à certains l'époque du MIDI intégré qu'on ne pouvait pas interrompre et qui achalait tout le monde (genre, tellement 1995).
Enfin, la dernière chose que je voulais parler dans ce survol de la balise audio est qu'on peut contrôler certaines actions par JavaScript, comme pour les boutons Play et Pause :
<a id="playButton" href="#">Lecture</a>JavaScript (avec jQuery) :
<a id="pauseButton" href="#">Pause</a>
$(document).ready(function(){
$('#playButton').click(
function(){
// vérifier l'état de la lecture
if( $('#music').get(0).paused ){
$('#music').get(0).play();
}
}
);
$('#pauseButton').click(
function(){
if( !$('#music').get(0).paused ){
$('#music').get(0).pause();
}
}
);
});
C'est arrivé souvent dans nos projets qu'on ait à mettre des champs de formulaire sans étiquette (balise label), par exemple pour la recherche, où on inscrivait comme valeur par défaut le mot clé "Recherche" pour indiquer la nature de la fonctionnalité. Au moment du focus, la valeur temporaire disparaissait pour laisser place à un champ libre pour saisir le mot clé. Si le curseur quittait la zone (blur) en laissant le champ vide, la valeur par défaut s'affichait de nouveau pour restaurer l'état initial.
Pour y arriver, un bout de code JavaScript était nécessaire, comme celui-ci avec jQuery :
var placeholder = 'Recherche';En HTML 5, ce snippet de code ne sera plus nécessaire puisqu'on a introduit un nouvel attribut "placeholder" qui sert exactement à imiter ce comportement de façon native.
$('#search').focus(
function(e){
if($(this).val() == placeholder){
$(this).val('')
}
}
).blur(
function(e){
if($(this).val() == ''){
$(this).val(placeholder)
}
}
);
<div>
<input type="text" name="q" placeholder="Recherche">
<button type="submit">OK</button>
</div>
<div>
<input type="text" name="username" placeholder="Courriel">
<input type="password" name="password" placeholder="Mot de passe">
<button type="submit">Se connecter</button>
</div>
Ce qui est bien, c'est que le placeholder fonctionne aussi sur un champ de mot de passe, contrairement à par le passé où toute valeur dans un champ input="password" s'affichait avec des caractères masqués. Ce n'est plus le cas en HTML 5 puisqu'on peut basculer automatiquement entre les deux états (attribut valeur et placeholder).
Au moment d'écrire ces lignes, l'attribut placeholder fonctionnait seulement avec les versions les plus récentes de Safari et Chrome. Je vous suggère de poursuivre votre lecture sur un billet écrit la semaine dernière sur les nouveaux contrôles de formulaire en HTML 5 et leur compatibilité avec les fureteurs.
Avez-vous remarqué que tout ce qui se passe dans le monde en une journée rentre parfaitement dans le journal ?
Mieux vaut tard que jamais, mais j'ai enfin retrouvé la facture du premier ordinateur que j'avais acheté avec mes économies en 1996 (celui mentionné dans le billet d'hier sur le prix des ordinateurs dans 3 décennies différentes). C'est vrai que je me suis initié tard à l'informatique (j'avais à peine 15 ans), mes parents n'en possédaient pas à la maison et ils n'avaient pas les moyens de m'en acheter un. Alors je me suis trouvé un petit boulot et j'ai eu la satisfaction de le mériter après tant de mois d'attente, surtout si je considère le taux horaire que j'étais payé...
Ça valait la peine que je la numérise, d'abord pour la partager avec vous, ensuite parce que c'est un petit souvenir et que l'encre commençait à disparaître (j'ai dû l'ajuster par GIMP pour voir quelque chose). Je me suis aussi permis de cacher les coordonnées de la boutique où je l'avais acheté, question de ne pas faire de publicité gratuite.
Sans plus tarder, cliquez dessus pour l'agrandir :
Observations :
- Comme première constatation, remarquez que l'indicatif régional du numéro de téléphone était encore 514 pour Laval (maintenant 450, introduit en juin 1998)
- Le système informatique utilisé pour imprimer la facture n'était possiblement pas compatible à l'an 2000 puisque l'année s'affiche sur 2 caractères
- Pentium 150 MHz
- Mémoire vive de 16 mo (2 x 8 Mo). À titre de comparaison, à la même époque, le Nintendo 64 contenait 4 Mo de ram.
- Carte vidéo Cirrus Logic de 2 Mo
- Disque dur de 1,28 Go
- Carte de son 16 bits
- Lecteur CD de 12x (n'était pas un graveur)
- Modem téléphonique de 33,6 kbit/s
- CD d'installation de Windows 95 (avec le vidéoclip Buddy Holly de Weezer et le jeu 3D Pinball Space Cadet)
- Avec cet ensemble "spécial", un moniteur CRT de 14 pouces était inclus mais j'avais opté de payer un supplément de 105$ pour avoir droit à celui de 15 pouces
- Paquet de 25 disquettes (elles ont quand même été utiles pour la remise des travaux de Cegep)
Dire que quelques années plus tard, j'ai quand même réussi à le revendre 150$ pour les pièces...
Si vous êtes amateurs de la boisson gazeuse Dr Pepper, vous apprécierez la recette de boisson alcoolisée suivante qu'une sympathique barmaid m'a concocté.
Vous aurez besoin des ingrédients suivants :
- Bière blonde
- Cola (Coke, Pepsi ou Kik cola!)
- Amaretto
Mais faites attention, ça se boît tellement facilement que c'est traître. Le volet éducatif et responsable de ce billet m'oblige à vous recommander d'avoir un chauffeur désigné.
Tout nouveau pour l'année 1989, Tandy lançait leur plus puissant ordinateur jamais sorti :
- un microprocesseur Intel 80386 de 20 MHz (notez la mention "lightning fast")
- une carte graphique VGA (le SVGA est aussi apparu plus tard en 89)
- 2 Mo de RAM mais avec une capacité de 16
- un petit détail à noter : le moniteur et la souris n'étaient pas inclus
De mon côté, si ma mémoire est bonne, je me souviens avoir acheté en 1996 (soit 7 ans après la publication de cette annonce) un PC de la première génération de Pentium, 150 MHz avec 16 Mo de ram et moniteur pour 2400$ (je vous promets que je vais essayer de retrouver la facture quelque part).
10 ans plus tard, mon PC actuel est un AMD Athlon 64 X2 Dual Core 4200+, cadencé à 2.20 GHz et 3 Go de Ram, payé environ 700$ en 2007 (sans moniteur). Non, définitivement pas une machine de gamer!
En terminant, je tenais à conclure en vous informant qu'avant de se lancer dans la conception d'ordinateurs, l'entreprise Tandy fabriquait des souliers de cuir.
Tristan Perich est un artiste contemporain New Yorkais qui crée de la musique à 1 bit en assemblant un circuit électronique à l'intérieur d'un boîtier de CD, d'où ressort une entrée pour brancher des écouteurs. Une pile au lithium de 3 volts (CR-2032) permet d'alimenter le tout pour faire jouer la symphonie en 5 mouvements d'une durée de 40 minutes.
Programmé en langage assembleur sur une puce de 8 MHz / 8 Kb, il a lancé deux oeuvres suivant ce concept : 1-Bit music (2006) et 1-Bit symphony (2010). Dans le premier cas, n'essayez pas de le trouver, c'est déjà une rareté. Pour son oeuvre la plus récente lancée le 24 août dernier, c'est présentement en rupture de stock.
Pour la modique somme de 29$, il y a des bonnes chances que je commande une copie, même si je devrai patienter quelques semaines pour la recevoir. Pour 150$, vous pouvez aussi obtenir une édition limitée signée et numérotée (50 exemplaires seulement). À ce prix, vous obtiendrez aussi un imprimé du code source et les schémas de réalisation.
Il y a presqu'un an, ma copine et moi avions acheté le coffret de la série complète Les Invincibles. Le coffret gris de 10 DVD contient aussi la bande dessinée d'où proviennent les extraits insérés dans les épisodes (très cool).
Avec nos projets personnels et nos occupations respectives, nous avons pris du retard dans les séries incontournables à regarder. Nous sommes présentement à compléter le visionnement de la dernière saison et nous avons noté un détail que probablement peu de téléspectateurs avaient remarqué lors de la diffusion, mis à part ceux qui travaillent en infographie ou dans le web.
Dans le 3ème épisode de la troisième saison (20:16), Rémi entre dans Yahoo! les mots clés "esprits manifestations" et on l'entend lire :
Au moment de la mort, l'homme libéré continue son existence... peut survenir des bruits et des déplacements d'objets... la croyance en une malédiction alimente la vengence post-mortem d'un proche dérangé dans son repos éternel... il peut y avoir une forte odeur... les esprits se manifestent en silhouette noire... les apparitions sont pour livrer un dernier message et reposer enfin... ce sont les effets d'un esprit malfaisant dans votre vie... en d'autres mots, votre mode de vie ou les activités dans lesquelles vous êtes impliqué peuvent les attirer à vous...
Et qu'est-ce qu'on voit en arrière-plan ?
Eh oui, la présence du faux-texte latin Lorem Ipsum. Autrement dit, ça ne veut à peu près rien dire parce que ça provient d'un texte altéré de Cicéron (consul de Rome en 63 av. J.-C.) qui pourrait avoir comme sens : "Il n'existe personne qui aime la souffrance pour elle-même, ni qui la recherche ni qui la veuille pour ce qu'elle est...". Mais bon, le subterfuge graphique fonctionne. De toute façon, qui connaît le latin de nos jours ? Gageons qu'il y en a plus qui parlent l'Espéranto.
En conclusion, les esprits parlent le latin, mais très mal. Je vous laisse, je vais regarder un autre épisode.
Voici un concept de publicité intégrée très réussie de la compagnie du produit correcteur Tipp-Ex. Faites jouer la vidéo, vous verrez un chasseur en camping qui est soudainement surpris par un ours. À la fin, vous aurez le choix sur l'issue de la situation, à savoir : allez-vous oui ou non tirer sur l'ours ? Qui sait, peut-être que c'est une mauvaise idée et que vous avez quelque chose de mieux à proposer ?
Un second extrait démarrera. Suivez les instructions en écrivant un verbe d'action pour réécrire l'histoire : A hunter _______ a bear.
Amusez-vous bien !
Voici un problème mathématique datant de 1882 qui offrait un prix de 1000$ à celui qui suggérerait la meilleure réponse sur la façon d'arranger les 7 figures et les 8 points pour obtenir la somme de 82.
. 4 . 5 . 6 . 7 . 8 . 9 . 0 .
Sachant que 1000$ dans les années 1880 correspondait à plus de 100000$ en valeur d'aujourd'hui, prendriez vous une chance de vous prêter au jeu ? Mesdames et messieurs, vos réponses s'il-vous-plaît.
J'ai observé quelque chose d'intrigant en manipulant un timestamp PHP qui tenait compte de l'heure d'été. C'est un peu une exception car les chances sont minces que vous la rencontriez mais ça vaut la peine de la connaître et d'en comprendre le fonctionnement.
Le 14 mars 2010, l'heure d'été entrait en fonction à 2h du matin. Nous devions tous avancer l'horloge d'une heure. En théorie, personne ne peut prétendre qu'il s'est levé pour aller aux toilettes à 2h30 am et ça peut écourter votre party si vous comptiez sur la fermeture des bars à 3h du matin (en revanche, vous en ressortirez gagnant lorsqu'il faudra reculer l'heure au mois de novembre car vous aurez droit à 2 last calls!).
Disons qu'on crée par programmation un timestamp en date du 13 mars 2010 et qu'on le fait progresser en boucle d'une heure à chaque fois, on pourra remarquer qu'à 2h du matin, le saut se fait automatiquement à 3h (ce qui n'est pas le cas avec une montre analogique).
$timestamp = mktime(22,0,0,3,13,2010); // 22h, le 13 mars 2010Mais qu'est-ce qui arrive si on change le timestamp initial pour 23h30 et qu'on procède avec des sauts d'une journée ?
$hour = 60*60; // 1 heure
foreach( range(1,24) as $h ){
echo strftime("%A, %d %B %Y %H:%m", $timestamp) . "\n";
echo "Heure d'été: " . date('I', $timestamp) . "\n";
$timestamp += $hour;
}
$timestamp = mktime(23,30,0,3,1,2010); // 23h30, le 1er mars 2010Exécutez le script pour constater que le 14 mars 2010 n'existe plus. Pourquoi ? Tout simplement parce qu'en ajoutant une journée à la date du 13 mars, 23h30, on obtient le 14 mars 23h30. L'heure d'été devant être en fonction à 2h du matin, le système ajoute une heure au résultat, ce qui nous mène au 15 mars, minuit et 30. Mais ça ne se serait jamais produit si l'heure de base utilisée dans le calcul avait été minuit plutôt que 23h30.
$day = 60*60*24; // 1 jour
foreach(range(1,31) as $i) {
echo strftime("%A, %d %B %Y", $timestamp) . "\n";
echo "Heure d'été: " . date('I', $timestamp) . "\n";
$timestamp += $day;
}
L'an prochain, si t'es condamné à 1 an de prison, t'as le droit de faire observer au juge que c'est une année bissextile.
J'ai acheté un produit de camping de marque Coleman et j'ai trouvé dans l'emballage ce feuillet explicatif portant en entête la mention : For Japanese Consumers Only. Évidemment, tout le reste est écrit en japonais.
Ce qui m'amène à penser : est-ce que c'est moi ou c'était un peu inutile de préciser ? En tant que consommateur, ça ne m'aide pas du tout, même que je reste curieux de savoir ce que les japonais ont le droit de savoir qui m'est interdit de découvrir...
Si vous jugez que c'est futile, évitez de l'écrire !
Un peu comme sur la bouteille de shampooing, le mode d'emploi qui indique : appliquer, mousser et rincer. Est-ce qu'il y avait vraiment une autre option possible au point que ça puisse porter à confusion ?
En programmation, on suggère de toujours commenter les extraits de code complexes pour faciliter la compréhension. Il ne faut pas pour autant tomber dans l'évidence :
# incrémente de 1Pendant un déplacement en avion, ma copine a même déjà vu un sac de noix portant l'inscription : ouvrir le sac, manger les noix.
$i = $i + 1;
# boucler sur chaque élément
foreach($list as $item){
// code
}
Volontairement ou non, on est en train de s'abrutir comme société, vous ne trouvez pas ?
À temps perdu, je commence à explorer un peu ce qui se fait du côté du HTML 5 pour me préparer au jour où les fureteurs seront en majorité compatibles et supporteront les nouvelles capacités offertes.
De ce que j'ai vu, les formulaires présenteront des nouveaux types d'inputs : date, email, url, range et number, pour ne nommer que ceux-là. Voici un aperçu de 5 contrôles fonctionnels dans Opera 10 :
Qu'est-ce qu'on remarque ? Fini les "date pickers", un contrôle natif sera disponible (reste à voir si on pourra le styliser par CSS et forcer la langue/locale par programmation). Des inputs spécifiques pour le courriel et un url seront aussi disponibles, de même qu'un slider horizontal et un input pour un nombre avec les boutons pour incrémenter ou décrémenter la valeur selon un saut prédéfini.
Le code source utilisé pour générer cet exemple est le suivant :
<!DOCTYPE HTML>À ce stade-ci, pour vous assurer que cette démonstration marche bien, assurez-vous de la visualiser dans Opera 10. Même Chrome, qui est supposé être avancé au niveau de l'interprétation HTML 5, n'a pas pu l'afficher correctement.
<html lang="fr_CA">
<head>
<title>title</title>
<meta charset="UTF-8">
<style type="text/css" media="screen">
label{ posititon: relative; float:left; width: 150px; }
div{ height: 35px; }
</style>
</head>
<body>
<form>
<div style="height:200px;">
<label>Date de naissance :</label>
<input name="birthdate" type="date">
</div>
<div>
<label>Courriel :</label>
<input name="email" type="email">
</div>
<div>
<label>Site Web :</label>
<input name="website" type="url">
</div>
<div>
<label>Note :</label>
<input name="score"
type="range"
min="0"
max="100"
step="1"
value="60">
<span>60</span>
</div>
<div>
<label>Quantité :</label>
<input type="quantity"
min="0"
max="100"
step="1"
value="1">
</div>
</form>
</body>
</html>
Testé avec les dernières versions fraîchement téléchargées et installées d'aujourd'hui, j'obtiens les résultats suivants :
- Internet Explorer 8 : on n'en parle même pas
- Firefox 3.6.8 : aucun n'est pas rendu correctement
- Chrome 5 : seul le slider de range fonctionne. J'effectue la mise à jour la plus récente pour tester à nouveau.
- Chrome 6.0.472 : les contrôles testés s'affichent correctement mais celui de date est présenté comme un input number. Dès que j'essaie de changer la date avec les flèches, il m'affiche la date 1582-10-15!
- Safari 5.01 : comme Chrome 5, seul le slider est rendu correctement.
- Opera 10.61 : 100% fonctionnel. C'est le seul fureteur qui a rendu parfaitement les 5 contrôles testés.
Firefox 3.6
Avril 2010 : 101/160 (63,13%)
Firefox 3.6.8
Septembre 2010 : 139/300 (46,33%)
Chrome 4.1
Avril 2010 : 118/160 (73,75%)
Chrome 6.0.472
Septembre 2010 : 217/300 (72,33%)
Internet Explorer 8
Avril 2010 : 19/160 (11,88%)
Septembre 2010 : 27/300 (9%)
Safari 5.01
Septembre 2010 : 207/300 (69%)
Opera
Septembre 2010 : 159/300 (53%)
En date d'aujourd'hui, Chrome de Google est toujours en pôle position dans la course, suivi de près par Safari d'Apple. Les résultats pour Internet Explorer de Microsoft sont biaisés par le fait que je n'ai pas testé avec le beta de la version 9 encore. Quelqu'un peut me fournir le résultat ?
Avec la chaleur accablante qu'il fait présentement à Montréal (température ressentie : 35 degrés à 21h30, imaginez plus tôt...), je ne trouve pas la motivation pour rédiger un billet sérieux.
Je vais en profiter pour vous raconter une petite farce, tout en saluant mon patron au passage. Boss, je t'avertis, c'est juste une joke, ok ? Par chance, tu as le sens de l'humour. On se voit demain.
La hiérarchie d'une entreprise, c'est comme un arbre plein de singes. Ils sont tous sur des branches différentes à des niveaux différents. Certains des singes montent, d'autres descendent. Les singes d'en haut regardent les singes d'en bas et voient un arbre avec plein de visages souriants. Les singes d'en bas regardent en haut et ne voient rien d'autre que des trous du cul.
Ce soir, j'ai reçu en cadeau une bière dont l'étiquette est probablement la plus comique que j'ai vu jusqu'à maintenant. Il s'agit de la Melon Head, brassée par Picaroons à Fredericton au Nouveau-Brunswick (impossible à trouver au Québec).
Fraiche et savoureuse, cette bière est fabriquée à partir d'un mariage d'orge et de blé grillé. Avec une note d'agrume à laquelle on a ajouté un extrait naturel de pastèque, vous en garderez le souvenir du melon.
Ça ne vous rappelle pas cette image du petit chat avec son casque largement diffusée sur les internets ?