J'anticipais découvrir de vraies petites perles dans ce mince volume qui traite des bonnes parties du langage de programmation PHP. Chez O'Reilly, c'est à croire que le département marketing s'est caché derrière le succès de son équivalent JavaScript : The Good Parts (par l'excellent auteur Douglas Crockford) pour lancer une série et nommer cet ouvrage qui ne mérite pas son titre : PHP: The Good Parts. Sérieusement, ce résumé des bonnes parties semble être le minimum pour faire quelque chose d'à peine fonctionnel et d'inutile! Au moins s'il avait été nommé Apprendre PHP en 7 jours, j'aurais abaissé mes attentes pour être moins déçu. Tout ça pour dire que j'ai fini par survoler le reste du bouquin sans grand intérêt.
C'est un peu ma faute aussi : la mention au dos du livre indiquant "No previous experience with PHP is necessary" aurait dû me mettre la puce à l'oreille mais je l'ai remarquée seulement au moment d'écrire ces lignes. Ça m'apprendra de me procurer un livre sans même l'avoir feuilleté!
Bien sûr, j'ai surligné quelques rares passages, surtout par souci de révision ou pour expérimenter une approche différente dans le vaste éventail des fonctions offertes.
Comme tous les livres de références PHP sortis depuis les 3 dernières années, vous y trouverez là-aussi le classique survol de certains nouveaux concepts propres à la version 5.3 (fonctions anonymes - closures, goto * beurk *, NOWDOC, namespacing, classes DateTime et DateTimeZone).
Même s'il se détaille à moins de 20$, de grâce, gardez votre argent. La presque totalité du contenu se retrouve dans la documentation officielle de PHP (en plus d'y avoir noté quelques mauvaises pratiques agaçantes). Si le développeur novice ou amateur souhaite faire le saut à PHP et veut avoir des repères rapides, il y trouvera peut-être son compte mais j'ai vite considéré que ça représentait une perte de temps pour le développeur intermédiaire ou expérimenté. À mon avis, l'auteur est passé à côté de l'objectif car il y présente qu'une simple introduction et non les meilleures parties que le titre nous promettait.
Si l'auteur a réussi à compresser les "bonnes parties" dans 176 pages, il aura aussi su résumer les mauvaises parties dans une annexe de 4 pages. Selon l'auteur, il n'y en a pas vraiment (LOL), seulement des zones plus particulières (tricky areas).
Un incontournable de la littérature PHP ? Loin de là.
Dans la catégorie Arithmétique appliquée et impertinente, calculez en kilogrammes, le poids du cerveau d'un imbécile
Nous savons qu'il est composé de :
- 520 grammes de certitude
- 200 grammes de vulgarité
- 430 grammes d'autosatisfaction
- et 250 grammes de substances organiques diverses (excipient)
Réponse : le cerveau d'un imbécile pèse 1,4 kilogramme (soit environ 3 lbs).
Sachant que le poids moyen d'un cerveau normal est de 1,4 kilogramme et que l'intelligence ne se mesure pas au poids de l'encéphale, la majorité des hommes en tireront la même conclusion que notre ami Woody Allen :
Mon cerveau ? C’est mon second organe préféré.
Les vrais programmeurs ninjas codent avec un verre dans le nez
En lisant l'article Pourquoi les développeurs travaillent-ils la nuit (une traduction du billet original de Swizec Teller intitulé Why programmers work at night), j'ai bien rigolé quand j'ai vu l'image humoristique du livre Coding Drunk, Make Programming Fun Again, inspiré des couvertures de la série O'Reilly.
Pourquoi cette approche serait-elle farfelue ? C'est pourtant tout ce dont j'ai retenu la première fois que j'ai regardé le film Drunken Master de Jackie Chan (celui de 1978) alors qu'il excelle dans ses combats à l'aide des techniques du "karaté soûl" (vous pouvez visionner le film en entier sur YouTube : Drunken Master (1978) - Full Movie). Le savoir-faire, c'est d'abord et avant tout de savoir créer les conditions optimales pour performer. Au final, c'est le résultat qui compte.
Coding Drunk est un livre fictif dont la couverture a été générée à l'aide d'un outil comme O'Reilly Maker. À mon tour, je me suis amusé à configurer ce que serait la couverture de mon livre si je me décidais à faire imprimer mon blogue (aviez-vous remarqué que si on retire le L de livre, ça fait ivre ?).
Toutes les raisons sont bonnes pour procrastiner ce matin... Vraiment.
* Pour éviter de m'attirer les foudres des critiques, je me dois m'inclure une note moralisatrice : consommez de façon responsable et conduisez prudemment. À moins que ce soit buvez de façon responsable et codez prudemment...
Ça fait plusieurs jours que je n'écris plus. C'est que je profite des vacances de Noël pour reprendre là où j'avais laissé mes signets dans quelques livres entamés et laissés-pour-compte. C'est ça le problème, trop de livres et d'intérêts, je passe d'un à l'autre pour finalement les achever quelques mois plus tard. Présentement, c'est la brique In the Plex sur l'histoire de Google qui occupe mon temps.
Dans un autre billet, j'avais mentionné que mon plus grand regret était qu'une vie est beaucoup trop courte pour lire tout ce qui m'intéresse. Malgré tout, je viens de recevoir aujourd'hui même un autre livre commandé sur Amazon (heureusement il fait à peine 125 pages) et je comptais bientôt aller regarnir ma bibliothèque pour raccourcir ma wishlist de lecture.
À quel point peut-il y avoir trop de livres ? Quand Larry Page de Google a eu l'idée qu'il serait utile de pouvoir chercher dans la totalité des livres publiés, son entourage déclara que ce serait impossible. Page considérait que ça pouvait être faisable et dispendieux, mais pas impossible. Il essaya de figurer ce que nécessiterait ce type d'opération et calcula que les coûts étaient raisonnables. Si Google achetait une copie de chaque livre publié à 10$ et qu'il existait 30 millions de bouquins, les coûts n'étaient que de 300 millions de dollars. Pour lui, ça représentait peu d'argent pour être en possession de la base de connaissance la plus précieuse au monde (en 2010, Google se ravisa et estima plutôt à 130 millions le nombre total de livres sur le globe).
Rendons nous à l'évidence :
- contrairement à Page, mon portefeuille représente une fraction de sa petite monnaie
- je suis un humain normalement constitué et je ne lis pas à la même vitesse que Johnny 5 dans Coeur Circuit
C'est pour ces raisons que je dois être très sélectif dans ce que je veux donner comme nourriture à mes yeux et mon cerveau. Et avec les Interwebs, c'est impossible de lire tout ce qui est publié (à l'avenir, je devrai songer de me contenter à regarder que les images, comme un vrai homme!).
Les dernières pages que j'ai lues aujourd'hui racontaient la naissance de Google Books (nom de code Ocean pour réfléter la vaste mer d'information à explorer). Saviez-vous que le premier livre qu'ils ont numérisé était The Google Book, un livre illustré pour enfant par Vincent Cartwright Vickers (1879-1939) ? Dans le titre, le terme Google fait référence à une créature étrange qui avait des aspects empruntés à un mammifère, un reptile et un poisson.
Ensuite, ils ont fait des tests avec un livre de photos, Ancient Forests par David Middleton, Algorithms in C par Robert Sedgewick et le livre Startup par Jerry Kaplan. Lors de leurs tests, un livre de 300 pages comme Startup prenait 42 minutes à numériser, soit plus rapide que ce qu'ils s'attendaient (ils ont accéléré le processus par la suite).
Ce qu'ils ignoraient et que Steven Levy fait remarquer, c'est l'ironie à la fin du premier livre numérisé qu'ils ont choisi, The Google Book :
The sun is setting
Can't you hear
A something in the distance
Howl!!?
I wonder if it's
Yes!! it is
That horrid Google
On the prowl!!!
Traduction :
Le soleil se couche
N'entends-tu pas
Quelque chose au loin
Hurlement!?
Je me demande si ce n'est
Oui!
Cet horrible Google
À l'affût!
Au moins s'ils avaient choisi de numériser l'annuaire téléphonique, ça se serait terminé sur une note plus positive avec Monsieur Zzopardi.
Quand j'ai acheté cette jolie petite clé USB de 32 Go sur eBay, ça semblait une véritable aubaine (un prix ridicule, à peine 15$, livraison incluse). Dans la même page, le marchand chinois offrait 3 modèles, soit une canette de Coca-Cola, de Pepsi ou de Heineken, chacun décliné en version 4, 8, 16 ou 32 Go avec un prix proportionnel.
Une fois reçue, j'ai glissé la clé dans l'ordinateur. Elle indiquait bien une capacité de stockage de 32 Go. Superbe! Pourtant, quelque chose semblait anormal. J'ai alors utilisé le petit outil H2testw pour m'assurer qu'elle était conforme et fiable à l'utilisation. Le test écrit et vérifie les données sur la totalité de la mémoire flash et présente un rapport indiquant les erreurs rencontrées. Ainsi, une série de 32 fichiers de 1 Go (.h2w) est généré à même le lecteur et est ensuite vérifié, d'où l'importance de le faire lorsqu'elle est vierge ou nouvellement formatée.
Attendez-vous aussi à ce que ça soit très, très long comme en témoigne les captures d'écrans ci-dessous.
Après plus de 1h30 d'attente, ça s'annonçait mal... Les premiers 3,6 Go sont testés fonctionnels et les suivants sont déjà corrompus.
Au final, 27,4 Go sont inutilisables sur une possibilité de 32 Go. Le verdict tombe : "The media is likely to be defective". Évitons donc d'y stocker des documents importants...
Heureusement que j'ai testé le média avant de laisser le feedback au vendeur (qui n'a jamais retourné mes emails pour obtenir réparation). Est-ce qu'il le savait au moment de la vente ? Je l'ignore. Mais c'est dommage pour lui car à voir dégringoler son pourcentage de feedback positif (de 99% au moment de l'achat à 93%), je ne suis pas le seul insatisfait.
Si vous allez faire un tour du côté du marché Jean-Talon ces temps-ci (maintenant que l'hiver est commencé), vous y trouverez une abondance de fruits et légumes sur les étalages. Sans surprise, ils n'ont pas poussé chez nous et la courte saison d'agriculture au Québec nous oblige à nous approvisionner dans de multiples pays qui ont la chance d'avoir un peu plus de chaleur. Qui dit importation rime aussi avec transport, pollution, manque de fraicheur et prix à la hausse.
J'avais vu un reportage à la télé sur les fermes Lufa, une entreprise québécoise d'agriculture urbaine qui a eu l'ingéniosité d'installer des serres sur le toit d'un entrepôt du Marché Central de Montréal, à quelques minutes de chez moi. Si vous circulez sur le boulevard de l'Acadie, c'est du côté du Canadian Tire que vous pourrez les apercevoir. Croyez-le ou non, c'est 6000 lbs de légumes qui sont récoltés chaque semaine.
Frais, local, responsable. Trois mots qui définissent bien ce que je recherchais. Un ami déjà inscrit m'a assuré que le petit panier serait suffisant pour ma copine et moi. Du moins, pour commencer. La semaine dernière, j'ai finalement décidé d'en faire l'essai durant les mois d'hiver. L'inscription est sur une base de 12 semaines, ce qui me garantit des légumes frais, cultivés à Montréal durant la grosse période de froid. Et je l'avoue, ça sera bon de manger santé après s'être empiffré durant le temps des fêtes.
Quelques jours plus tard, voilà arrivé le moment de la cueillette. Je viens à l'instant d'aller récupérer mon panier au point de chute le plus près de chez moi (situé à moins de 2 km de ma maison).
Voici ce que j'ai reçu dans mon 1er panier :
- Laitue Boston et le trio de laitues
- 4 sortes de tomates
- 2 concombres libanais
- 3 piments forts
- 2 gousses d'ail
- 4 pommes
- 1 courge butternut
- 1 pot de confiture biologiques aux bleuets
- Échalottes
- Fines herbes mini-fenouil
Et comme il y aura des légumes surprises à chaque semaine, c'est parfait pour la diversité dans l'assiette et pour être créatif en cuisine.
Entre des légumes qui ont poussé à plusieurs milliers de kilomètres, qui ont passé plusieurs jours en transport et sans doute un certain temps en entreposage versus des légumes locaux frais cueillis le matin même (rien de moins!), le choix est évident. Chapeau pour l'initiative.
Un chat noir qui traverse votre chemin signifie que l'animal va quelque part.
Bon matin chers lecteurs. J'écris ces lignes en prenant un petit déjeuner à peine nocif pour ma santé, à savoir une tranche de pain grillé tartiné avec du beurre d'arachides accompagné d'un grand verre de lait au chocolat. C'est quand même mieux que d'avaler un Reese's d'une livre et ça goûte à peu près la même chose (la portion complète est de 2280 calories et 132 grammes de gras).
Il faut l'avouer, parfois nous nous alimentons si mal que c'en est presque honteux. Non ça l'est. Quand j'ai écrit le billet sur Le plaisir insoupçonné de manger du Velveeta, c'est dire à quel point l'alimentation américaine a pu déteindre sur la culture culinaire canadienne. Heureusement, ça ne représente pas notre quotidien, on s'alimente généralement mieux mais on se laisse parfois tenter par le comfort et le junk food.
Attendez-moi un instant, je vais me faire une autre toast.
Oui, en étendant la pâte brune et crémeuse sur le pain, je comprends le dédain que pouvait ressentir le petit Grégory (le petit Basque que nous avions hébergé pendant son séjour au Québec) lorsque nous lui avions présenté ce condiment pour son premier petit déjeuner en Amérique. Intrigué, il avait ouvert le pot, regardé dedans, essaya de se familiariser avec l'odeur et le referma aussitôt, jugeant que ça ne répondait pas à ses attentes. C'est comprenable, ce produit brillait par son absence sur les tablettes des supermarchés français et donc, pratiquement méconnu.
Comment peut-on ressentir la même sensation face à un produit alimentaire ? Quel produit équivalent pourrait susciter le dégoût de ce côté de l'océan ? Contre toute attente, c'est ma copine qui m'a apporté la réponse lorsqu'elle a entendu la pièce Vegemite (The Black Death) de l'artiste américaine Amanda Palmer (album Goes Down Under).
Qu'est-ce que le Vegemite ? Selon What's Cooking America, c'est un produit australien typique et apprécié des enfants du pays de Crocodile Dundee au même titre qu'un sandwich au beurre de peanuts l'est pour un jeune américain. Fabriqué à partir des restes d'extraits de levure de bière, de différents légumes et d'épices, la pâte résultante possède une couleur rouge-brune, presque noire, et elle est reconnue pour être riche en vitamine B.
Mis à part un goût très salé, laissons Mme Palmer résumer la saveur :
Vegemite? It tastes like sadness.
It tastes like batteries. It tastes like acid.
I cannot hold a man so close who spreads this cancer on his toast.
It is the Vegemite, my darling, or it's me.
Élogieux.
Et à voir la réaction des étudiants canadiens confrontés à un test de goût par leur enseignant, c'est loin de faire l'unanimité...
Je n'ai pas encore eu la chance d'en trouver au supermarché. Mais si vous connaissez un commerçant montréalais qui en vend, j'oserai relever le défi d'y goûter et mettre ainsi ma vie en péril.
Pour les nostalgiques de l'époque où Musique Plus était déjanté et se permettait d'excellentes parodies avec Cinéma-Twit et Parodies sur Terre (vers le milieu des années 90), en voici une de Star Wars mettant en vedette Hand Solo et Chabada.
Avec La fin du monde est à 7 heures, c'est le genre de truc que j'aimerais bien retrouver sur DVD. En attendant, quelqu'un a eu l'excellente idée de le rendre disponible sur Google Videos, pour le bon plaisir de tous.
Quelques extraits mémorables :
- Michael Douglas qui saute les plombs sur le creton versus le Paris Pâté ou encore pour le poulet : viande blanche que je voulais, viande blanche! Pas d'la putain de viande brune avec de la tiraille dedans.
- je vais te dire quelque chose qui va te refroidir pour de bon : je suis un mec!
- tous les extraits avec Business (un personnage assez rural) dont le fameux "on a un spécial de 50% si vous prenez une escalope avec une salade. Non merci mais une escapade avec une salope, j'hairais pas ça".
- les extraits de l'émission d'Ed Sullivan (vers 1h18) avec les chansons Dans l'garage et Fait le fucké, avec une chorégraphie dont même Rihanna ne peut égaler.
Voici la preuve qu'il est possible de construire et de jouer sur une guitare à 8 manches. Bien sûr, il faudra 16 mains et un peu de pratique mais ça donne un résultat vraiment bien.
Liste des manches :
- mandoline
- ukulele
- guitare 6 cordes
- basse fretless
- basse
- guitare 12 cordes
- guitare bariton
- guitare 7 cordes
Comme quoi ce n'est pas la longueur du manche qui compte, mais bien le nombre que vous avez entre les mains!
Si vous voulez passer une commande, DNG Custom Guitars se fera un plaisir de répondre à vos besoins.
En reconfigurant mon nouveau PC Windows 7, j'ai installé la plus récente version de NotePad++ (5.9.6.2) et juste avant de terminer le processus, j'ai remarqué cette option d'installation :
Use the old, obsolete and monstrous icon.
I won't blame you if you want to get the old icon back :)
Haha!
Quand la merde vaudra de l'or, le cul des pauvres ne leur appartiendra plus.
Retour vers le passé et voyage dans le temps avec Zend_Date
Un client se plaignait d'avoir entré une date et que malgré tout, ça affichait la mauvaise année à l'écran. On croyait avoir affaire à un code 18 de sa part mais comme c'était reproductible, nous avons dû nous creuser les méninges pour trouver la source du problème.
En examinant le code, tout semblait conforme : la valeur de la date, la valeur stockée, la localisation (qui aurait pu jouer des tours) et le format d'affichage spécifié. Pour trouver d'où provenait l'erreur, j'ai utilisé la même méthode décrite à mon dernier billet en faisant des appels en boucle. Avec un peu de chance, peut-être que quelque chose en resortirait.
$locale = new Zend_Locale('fr_CA');Remarquez ce qui se passe dans le calcul lorsqu'on change d'année :
$date = new Zend_Date('2011-12-04', false, $locale);
$i = 0;
do{
echo $date->get('dd MMMM YYYY');
$date->add(1, Zend_Date::DAY);
echo BR; // constante
$i++;
} while($i < 60);
Nom de Zeus! Où est passé le 1er janvier 2012 ? On croirait à une déchirure du continuum espace-temps puisqu'on se retrouve soudainement au 1er jour de 2011 pour ensuite revenir en 2012 à l'itération suivante.
Pourquoi ? Ça m'enrageait un peu car ce n'était pas la première fois que j'avais des mauvaises surprises avec les dates de PHP (@pparadis avait raison). Pour les besoins du projet, le composant Zend_Date avait été retenu pour manipuler et calculer des dates et du temps, configuré avec un type de format autre que celui natif de PHP (plus intuitif que "j F Y"). Et nous ne nous attendions pas à ce type de comportement. À vrai dire, le programmeur aurait eu intérêt à mieux lire la documentation car de ce que j'ai trouvé, il existe une différence minime mais fondamentale entre les formats yyyy écrits en minuscules et majuscules :
- YYYY pour l'année ISO
- yyyy pour l'année réelle
Sinon, voici un autre exemple qui illustre mieux la représentation calendrier. Utilisez le même snippet de code ci-haut et modifiez la date initiale pour "2010-01-01". On s'attendrait que le 1er affichage indique 1er janvier 2010. Pourtant, la même logique s'applique.
Encore une fois, si on se réfère au calendrier, les trois premiers jours de 2010 sont dans la dernière semaine de 2009. Pour faire simple, YYYY retourne l'année du 1er jour de la semaine où se trouve la date demandée. Le format yyyy retourne l'année réelle.
En conclusion, trois choses :
- Lisez toujours la documentation au lieu de prendre pour acquis certaines notions. Les différences entre yyyy et YYYY sont subtiles mais importantes en même temps.
- Évitez-le format ISO pour l'affichage, à moins que vous sachiez exactement ce que vous êtes en train de faire.
- Cette démonstration utilise Zend Framework pour PHP mais comme ISO 8601 est un standard, vous risquez de rencontrer le même problème dans d'autres frameworks et langages de programmation.
Ce matin, je vais vous entretenir à propos d'un bogue que j'ai trouvé cette semaine dans un système qui calcule du temps. Pour faire court, le temps saisi au formulaire était correct, il était ensuite stocké dans une base de données sous forme de nombre à virgule flotante et lorsqu'il était récupéré puis affiché à l'écran, une minute était parfois perdue par rapport à l'heure initiale. Concrètement, 8h25 devenait soudain 8h24! Chaque enregistrement modifiant l'heure décrémentait les minutes. Multiplié par des centaines de manipulations, ça cumulait du temps perdu.
Je soupçonnais la fonction de formatage de l'heure à l'écran.
// simplifiée pour la démonstrationJe l'ai donc isolée et j'ai lancé un jeu de tests couvrant toutes les minutes d'une heure donnée (BR est une constante définie pour imprimer une balise de saut de ligne) :
function format($decimalTime){
$hour = (int)$decimalTime;
$minute = (int)(($decimalTime - $hour) * 60);
return $hour . 'h' . str_pad($minute, 2, '0', STR_PAD_LEFT);
}
echo "Heure\tMinutes\tFormaté\tReprésentation interne" . BR;Selon les résultats retournés, pratiquement 1 affichage sur 2 étaient erronés!
$hour = 8;
foreach( range(0,59) as $minute ){
$time = $hour + ($minute/60);
echo $hour . "\t" . $minute . "\t" . format($time) . "\t" . $time . BR;
}
Comme la partie des minutes est stockée en décimales, l'hypothèse d'une mauvaise conversion se confirmait. Dans certains cas, ça fonctionnait bien pour les fractions simples (8h15 = 8.25, 8h30 = 8.50, etc), alors que pour d'autres valeurs comme 8h12 (8.2 en décimal, 12 min = 1/5 d'une heure, donc 0.2), la fonction retourne la valeur formatée de 8h11 avec une minute en moins. Ce n'est pas le genre d'erreur qu'on peut tolérer (surtout quand le temps, c'est de l'argent).
J'ai ensuite fait quelques tests supplémentaires :
//Pour la portion minutes, si :À cause de la conversion (cast) float à int, la représentation interne de 4.9999999999999 ne conserve que le 4 plutôt que de l'arrondir à 5. Ce qu'il aurait fallu faire :
var_dump(5/1); // int(5)
var_dump(5/60); // float(0.083333333333333)
// remettre les minutes décimales sur une base 60
var_dump((5/60)*60); // devient un float(5)
// exemple
$time = 8.083333333333333; // représentation interne de 8h05
$hour = (int)$time;
$minute = ($time - $hour) * 60;
var_dump( $minute ); // float(4.9999999999999)
var_dump( (int)$minute ); // int(4) et non 5 !
var_dump( (int)round($minute, 0) ); // 5Pour corriger le bogue, je n'ai eu qu'à modifier la fonction en remplaçant une ligne comme ceci :
function format($decimalTime){Ce fût ni long, ni difficile à régler. Mais la cause était incompréhensible pour le client et les conséquences étaient fâcheuses puisqu'il fallait ensuite faire rebalancer les données.
$hour = (int)$decimalTime;
//$minute = (int)(($decimalTime - $hour) * 60);
$minute = (int)round(($decimalTime - $hour) * 60, 0);
return $hour . 'h' . str_pad($minute, 2, '0', STR_PAD_LEFT);
}
Après réflexion, je me demande ce que ça aurait donné si, au lieu d'avoir choisit initialement de stocker les heures en float, on avait plutôt opté pour les conserver en un seul nombre entier représentant le total des minutes plutôt que des fractions d'heures (8h05 = 8h*60 minutes + 5 minutes = 485 minutes) ? Nous n'aurions probablement pas eu de problème de conversion, mais ça aurait certainement occasionné d'autres genres de problèmes.
En arrivant du boulot, j'avais une petite fringale : hop au frigo et qu'est-ce qu'il y a de facile à se mettre sous la dent ? Une tranche de fromage tranché Velveeta! Dès maintenant, veuillez mettre vos jugements de côté et ne considérez même pas à me regarder de haut en prétendant qu'ingurgiter cet aliment conçu avec du lait caillé fait "petit peuple". On a chacun nos défauts et ça permet de briser le mythe que je suis un snob grano du plateau Mont-Royal (d'ailleurs, je n'habite même pas là. Quoique j'en connais qui croient que son territoire s'étend sur à peu près toute la superficie de l'île de Montréal...).
Eh oui, figurez vous que nous étions ma copine et moi au supermarché dans le rayon des produits laitiers. Nous nous attardions devant l'étalage des fromages afin de choisir le type idéal à faire fondre dans nos burgers à l'américaine. La concurrence est féroce et on doit déterminer un gagnant par élimination entre les Singles de Kraft et le Velveeta (avis aux passionnés, suivez les liens pour faire parti des 49000+ personnes qui ont déclaré publiquement entretenir une relation d'amour avec ce type de fromage (à ce sujet, Urban Dictionary propose une définition amusante à propos de Kraft Singles si vous êtes célibataire et que vous portez le nom de famille Kraft : reference to my constant status of relationship, and the lack of ability with people with the same name as cheese to get dates. Fin de la parenthèse dans la parenthèse)).
C'est ma copine qui a eu le dernier mot : le Velveeta dans le panier. Son argument : ça fait vraiment longtemps qu'elle en avait pas mangé. Ma constatation de ce soir : ça goûte carrément la même chose! À vrai dire, je ne dois pas avoir les papilles gustatives bien entraînées puisque ça me semble tout droit sorti du même mélange que :
- les tranches Singles de Kraft
- le Cheeze Whiz
- la poudre de fromage dans le Kraft Dinner
- les tranches Velveeta (ouais, pour ça on s'en doutait)
Et n'allez pas me parler de la légende urbaine comme quoi le mélange initial est d'un appétissant gris avant d'ajouter une tonne de colorant! Ce serait faux. Je tiens ça d'une personne ayant travaillé toute sa vie chez Kraft et qui m'a juré que c'était un mythe. Par contre, il confirme que le beurre d'arachides est brun mais que la recette a changé avec le temps (je crois qu'ils n'enlèvent plus la petite peau, ou bien les écailles... en tout cas quelque chose comme ça). Selon mon expérience avec un petit français qu'on avait hébergé dans les années 80, il n'avait jamais vu ça de sa vie et le regardait avec dédain. Pourtant les enfants sont supposés aimer ça les petits oursons ?
Est-ce qu'un résident de la France peut me confirmer que le beurre d'arachide se fait rare dans votre contrée ? Si vous y avez déjà goûté, avez-vous aimé ? (ça ressemble à de la Vache qui rit, mais orange) Culturellement parlant, c'est une expérience à vivre si vous venez de ce côté de l'océan. Ça et le restaurant de l'ITHQ (pour imiter le prince William et sa femme Kate, bien sûr!).
Bon, assez parlé de bouffe. Je meurs de faim, je pense que je vais aller me faire un grilled cheese.
Quel symbole mathématique placé entre 5 et 9 permet d'obtenir un nombre plus grand que 5 et plus petit que 9 ?
Essayez d'abord les plus communs : addition (+), soustraction (-), multiplication (×), division (÷). Ensuite, référez-vous à la table des symboles mathématiques pour vous donner un coup de pouce.
Si vous n'avez pas trouvé, vous pourrez consulter la solution. C'est tellement simple que c'en est presque ridicule.
Le point décimal, évidemment! 5.9 est plus grand que 5 et plus petit que 9.
On ne va jamais aussi loin que lorsque l'on ne sait pas où l'on va.
Cette histoire m'a été rapportée il y a quelques jours alors qu'un nouvel employé, étudiant en génie, aurait cogné son doigt à quelques reprises contre la table lors d'une réunion et aurait alors posé la question à ses interlocuteurs pour leur demander s'ils savaient ce que ça signifiait. Un peu surpris et ne sachant pas trop où il voulait en venir, ils l'ont laissé parler.
- Quand un ingénieur cogne la bague à son doigt comme ça sur la table, le monde doit se taire et l'écouter.
Silence. Malaise.
Je ne faisais pas parti de la réunion mais ouch! Jamais je ne me serais permis de dire ça. Je vous le dit, j'ai sauté ça de haut quand on me l'a raconté (je sais, vous ne le voyez pas mais prenez la peine d'imaginer).
Comment une personne peut-elle se surestimer à ce point pour oser dire une absurdité pareille ? Soit il est prétentieux et imbu de lui-même, soit ses professeurs lui ont fait tout un lavage de cerveau pour qu'il croit ce qu'il a dit. Si c'était une farce, il aurait mieux fait de se taire. Mais non, il tenait à informer les autres.
Il ne faut pas être un grand observateur pour se rendre compte que la situation n'est pas à son avantage :
- il est encore aux études, donc aucun diplôme et aucune bague de l'Ordre des ingénieurs
- il est en poste depuis quelques semaines seulement
- après cet épisode, son emploi est probablement plus précaire qu'assuré
Ce qui m'amène à un principe essentiel tiré de la citation no. 36 sur le silence :
Avant d'ouvrir la bouche, assure-toi que ce que tu vas dire est plus beau que le silence.
Parce qu'il deviendra ingénieur et ce, même s'il l'était, je juge que c'est un problème d'attitude majeur. Tout porte à croire qu'il regarde de haut des gens plus expérimentés alors qu'il se trouve au bas de l'échelle. C'est pourquoi je classe ce type de personne dans la catégorie péjorative et peu flatteuse des "ingnégnieurs". Prouve tes compétences par tes actions et ton éthique de travail, pas en te cachant derrière ton titre (voir mon autre billet à ce sujet : L'importance du titre : un mythe).
Dans une nouvelle réunion cette semaine, la qualité de son travail lui a éclaté au visage (par professionnalisme, nous n'avons nommé personne) : trop de bogues, des vulnérabilités de sécurité, des problèmes de performance, il a fait à sa tête alors qu'on lui avait recommandé certaines solutions. Cette fois, il n'a pas osé dire un mot de la réunion. J'espère que c'est le signe qu'il s'est senti visé et qu'il a eu une petite leçon d'humilité.
On va passer l'éponge et lui laisser une chance. Il est maladroit, certes, mais il n'est pas mal intentionné et ne cherche que des façons de s'intégrer dans l'équipe, même si c'est parfois avec des propos douteux. Mais vous serez averti, le prochain qui me dit ça, je lui arrache le doigt et je le lui enfonce à un endroit peu glorieux.
Soyons franc, on n'apprécie pas beaucoup le désordre même s'il faut vivre avec. Dans un monde idéal, on combat férocement le chaos que peuvent créer les Kim Jong-il, Darth Vader ou Sauron. Seulement parce que l'équilibre de la paix est fragile et que les conséquences peuvent s'avérer désastreuses.
Tout comme en programmation. Elle se doit d'être structurée, hiérarchisée, reglementée pour que tout tourne rondement. En cours de développement, l'utopie est de construire le tout dans les règles de l'art. La réalité ressemble davantage à de la rénovation ou à une réparation de voiture : on droit tricher d'un peu partout, forcer les pièces du puzzle ensemble pour qu'elles finissement à s'emboîter adéquatement.
Lorsqu'un client soumet une demande de changement, il voudra l'obtenir au meilleur prix, même s'il faut le corriger avec du mastic et du ruban adhésif. Aux yeux de la majorité, ce genre de dépense ne procure aucun plaisir en retour alors pourquoi payer plus ? Et c'est généralement là que ça se met à déraper. Comment justifier le prix d'une réparation faite correctement si une patch à moindre coût peut suffire ? En tant que développeur, on peut tolérer quelques patches mais il vient un temps où il faut cesser de remettre du ruban adhésif par-dessus l'ancien qui déchire sans cesse.
Dans le meilleur des mondes, un logiciel serait construit comme un gratte-ciel. La fondation doit être suffisamment inébranlable pour y empiler de multiples étages de dimensions égales qui pourront à leur tour accueillir des étages supplémentaires au sommet afin de répondre aux demandes futures du client. Les contraites du monde réel font que les logiciels sont plus souvent bâtis comme une pyramide. Un nouvel étage trop large juché au sommet risque tôt ou tard de devoir tenir en équilibre sur la pointe, jusqu'à ce qu'il bascule dans le vide au moindre coup de vent. D'autres fois, la demande sera de venir glisser un nouvel étage entre le 7ème et le 8ème plancher d'un building existant (essayez un instant de vous représenter une image mentale de ce que ça implique). Retirer le 13ème étage malchanceux ? Aussi simple que de tirer une briquette d'un jeu de Jenga! Dans tous les cas, effectuer le travail proprement, tout en minimisant les risques pour les travailleurs, fera grimper les coûts liés de rénovation et de logistique de construction. Et dans certains cas, le danger est tellement grand qu'il serait peut-être plus sage de refuser le mandat plutôt que d'accepter les pires conditions et la responsabilité en cas de désastre.
Quand on parle de chaos, il faut aussi savoir reconnaître les signes précoces avant que ça commence à dégénérer. Prenez par exemple une usine. Pendant tout le temps qu'elle est en fonction, ses occupants en prennent soin (du moins, ils sont supposés). Le jour où le propriétaire met la clé sous la porte et que le bâtiment est abandonné, s'il n'est pas surveillé, ce ne sera qu'une question de temps avant qu'il commence à être vandalisé. Une fenêtre pourrait être brisée. Si elle n'est pas réparée rapidement, elle deviendra une cible facile : d'autres vitres seront fracassées, des graffitis feront leur apparition, des itinérants et des squateurs s'y établiront, ils commenceront à salir leur environnement emprunté, des dommages structureux gravent apparaîtront. Dans un espace de temps relativement court, le bâtiment sera endommagé au-delà de la volonté du propriétaire de la réparer, et le sentiment d'abandon deviendra réalité.
Lorsque le désordre augmente dans un logiciel, les programmeurs parlent alors de pourriture. Dans le livre The Pragmatic Programmer, From Journeyman to Master, les auteurs citent ce genre d'histoire pour nous rappeler une règle importante à retenir : ne laissez jamais une fenêtre brisée (mauvais design, mauvaises décisions, mauvais code) non réparée. Fixer le tout correctement dès que le problème est découvert. Prenez des mesures pour prévenir d'autres dommages. La négligence ne fera que détériorer le système rapidement.
C'est une question de gros bon sens. Maintenant, le défi est d'essayer de le faire comprendre au client...
La plupart des logiciels d'aujourd'hui ressemblent énormément à une pyramide égyptienne avec des millions de briques empilées les unes sur les autres, sans aucune intégrité structurelle, mais réalisée brutalement par la force à l'aide de milliers d'esclaves.
J'ai reçu ceci d'un ami et c'est tellement du bonbon que j'ai jugé bon de le partager avec vous.
Règle 1
La vie est injuste: habituez vous!
Règle 2
Le monde se fout de votre amour-propre. Le monde s'attendra à ce que vous accomplissiez quelque chose AVANT que vous ne vous félicitiez vous-même.
Règle 3
Vous ne gagnerez pas 60000$ par an en sortant de l'école.
Vous ne serez pas vice-président en commençant, avec smartphone et voiture de fonction fournis, avant d'avoir mérité, gagné ces privilèges.
Règle 4
Si vous croyez que votre professeur est dur avec vous, attendez d'avoir un patron.
Règle 5
Travailler dans une friterie n'est pas s'abaisser. Vos grands-parents avaient un mot différent pour ça: ils l'appelaient une opportunité.
Règle 6
Si vous gaffez, CE N'EST PAS LA FAUTE DE VOS PARENTS, arrêtez de chialer et apprenez de vos erreurs.
Règle 7
Avant que vous naissiez, vos parents n'étaient pas aussi ennuyants qu'ils le sont maintenant !
Ils sont devenus comme ça :
- En payant vos factures
- En nettoyant vos vêtements
- Et en vous entendant répéter sans arrêt combien vous êtes bons et cools
Règle 8
Votre école s'est peut-être débarrassé du système « gagnant-perdant », PAS LA VIE !
Dans certaines écoles, on a aboli les notes de passage et on vous donne autant de chances que vous voulez pour obtenir la bonne réponse. Ceci n'existe pas dans la vraie vie !
Règle 9
La vie n'est pas divisée en semestres. L'été n'est pas une période de congé. Et très peu d'employeurs sont disposés à vous aider à VOUS ASSUMER, c'est votre responsabilité.
Règle 10
La télévision n'est pas la «vraie vie». Dans la vraie vie, les gens quittent le café et vont travailler.
Si vous êtes d'accord, faites circuler, sinon, mettez-vous la tête dans le sable et prenez une grande respiration.
Un programmeur junior en interrompt un autre dans son travail pour lui demander s'il sait quelle est la version de SQL Server qui roule sur un serveur particulier sur lequel il est en train de développer. De mémoire, il ne s'en rappelle pas et il répond simplement qu'il l'ignore mais qu'il pourra le vérifier directement regardant une propriété système accessible par une requête SQL.
Plutôt que de googler les termes pour obtenir rapidement la réponse, son réflexe est de se lever et d'aller voir l'administrateur réseau pour lui demander. Soupir... Est-ce normal de m'inquiéter de l'efficacité du système D (débrouillardise) de ce programmeur ?
La programmation est avant tout un travail de résolution de problème, qu'il soit technique ou non. Avant de déranger quelqu'un inutilement et de lui faire perdre sa concentration, assurez-vous d'abord :
- d'avoir fouillé dans la documentation
- d'avoir posé au moins une fois la question à Google
Voici la réponse trouvée sur Google en 0,21 secondes que je lui ai transmis.
-- juste le numéro de version10.0.1600.22
SELECT SERVERPROPERTY('ProductVersion')
-- la version en format longMicrosoft SQL Server 2008 (RTM) - 10.0.1600.22 (X64) Jul 9 2008 14:17:44 Copyright (c) 1988-2008 Microsoft Corporation Standard Edition (64-bit) on Windows NT 5.2
SELECT @@version
SELECT SERVERPROPERTY('ProductVersion')8.00.2039
SELECT @@versionMicrosoft SQL Server 2000 - 8.00.2039 (Intel X86) May 3 2005 23:18:38 Copyright (c) 1988-2003 Microsoft Corporation Standard Edition on Windows NT 5.2 (Build 3790: Service Pack 2)
La morale de cette histoire, c'est que si vous êtes arrivé sur ce billet, c'est que vous êtes soit un programmeur junior qui n'a pas pris de mauvais pli ou encore un programmeur plus expérimenté qui vient de vivre la même situation que moi. Dans ce cas, n'hésitez pas à transmettre subtilement le lien de ce billet en guise de réponse.
Voici un cas réel où j'ai eu à résoudre un problème en classant des individus par groupe d'âge à l'aide d'une base de données Postgres. D'abord, imaginons deux tables : la première "human" contient la liste des personnes avec une propriété "birth" où est stockée la date de naissance qu'on utilisera pour connaître son âge en temps réel. L'autre table, nommée "age_group" contient la définition des groupes d'âges en incluant comme propriétés l'âge minimum et maximum pour faire parti du groupe. Une valeur nulle dans l'âge maximum indique l'infini (pour inclure les immortels comme le Highlander par exemple).
Voici le nécessaire si vous souhaitez reproduire l'exercice :
CREATE TABLE humanNB. Évidemment, les dates de naissance des personnages des Simpsons sont 100% arbitraires puisqu'ils ne vieillissent pas depuis plus de 20 ans!
(
human_id serial NOT NULL,
firstname character varying(50) NOT NULL,
lastname character varying(50) NOT NULL,
birth date
);
CREATE TABLE age_group
(
group_id serial NOT NULL,
age_min integer NOT NULL,
age_max integer,
group_name character varying(50) NOT NULL
);
INSERT INTO age_group(age_min, age_max, group_name)
VALUES (0, 12, 'Enfant (Fan de Justin Bieber)'),
(13, 17, 'Adolescent boutonneux'),
(18, 25, 'Jeune adulte fringant'),
(26, 54, 'Adulte'),
(55, 65, 'Retraité Liberté 55'),
(65, null, 'Bel âge (Les résidences Soleil!)');
INSERT INTO human (firstname, lastname, birth)
VALUES ('Marge', 'Simpson', '1963-06-08'),
('Homer', 'Simpson', '1962-01-31'),
('Bart', 'Simpson', '1997-09-04'),
('Lisa', 'Simpson', '1999-06-06'),
('Maggie', 'Simpson', '2002-07-27'),
('Milhouse', 'Van Houten', '1997-08-08'),
('Montgomery', 'Burns', '1912-03-13'),
('Abraham', 'Simpson', '1914-07-27');
À partir de ces données, comment peut-on connaître le nombre de personnes dans chaque groupe d'âge (incluant les groupes vides) ? L'objectif est d'obtenir comme résultat des statistiques comme celles-ci :
À l'aide d'une sous-requête lancée sur chacun des enregistrements, on peut obtenir au mieux une seule information relative au groupe d'âge :
SELECT h.*, (SELECT group_name FROM age_group as tag WHERE extract('year' from age(h.birth)) BETWEEN tag.age_min AND COALESCE(tag.age_max, 200)) as group_nameEn se basant sur le calcul de l'âge pour déterminer le groupe relié, voici 3 façons d'écrire un énoncé SQL pour arriver exactement au même résultat.
FROM human as h
ORDER BY group_name
Méthode 1
SELECT ag.group_id, ag.group_name, ag.age_min, ag.age_max, COUNT(t.human_id) as nbMéthode 2
FROM human as h
INNER JOIN (
SELECT human_id, (SELECT group_id FROM age_group as tag WHERE extract('year' from age(birth)) BETWEEN tag.age_min AND COALESCE(tag.age_max, 1000)) as group_id
FROM human
) as t ON t.human_id = h.human_id
RIGHT JOIN age_group as ag ON ag.group_id = t.group_id
GROUP BY ag.group_id, ag.group_name, ag.age_min, ag.age_max
ORDER BY ag.age_min
Il sera possible de simplifier l'énoncé un peu :
-- requête simplifiéeMéthode 3
SELECT ag.group_id, ag.group_name, ag.age_min, ag.age_max, COUNT(h.human_id) as nb
FROM human as h
RIGHT JOIN age_group as ag ON ag.group_id = (SELECT group_id FROM age_group as tag WHERE extract('year' from age(h.birth)) BETWEEN tag.age_min AND COALESCE(tag.age_max, 1000))
GROUP BY ag.group_id, ag.group_name, ag.age_min, ag.age_max
ORDER BY ag.age_min
Ou encore, une méthode alternative en réécrivant la requête SQL complètement différemment :
-- façon alternativeJe serais curieux de savoir laquelle vous préférez et pourquoi. Avec un gros volume de données, il serait possible d'ajouter une colonne à la table "human" pour stocker le groupe d'âge pour éviter le calcul à chaque appel mais il serait nécessaire de maintenir la donnée avec un trigger sur la date de naissance et sur la table des groupes d'âges en cas de changement (où il serait nécessaire de mettre à jour toutes les fiches des personnes). Vous avez d'autres suggestions ?
SELECT ag.group_id, ag.group_name, ag.age_min, ag.age_max, COUNT(tmp.human_id) as nb
FROM age_group as ag
LEFT JOIN (
SELECT tag.group_id, h.human_id
FROM human as h
CROSS JOIN age_group as tag
WHERE extract('year' from age(h.birth)) BETWEEN tag.age_min AND COALESCE(tag.age_max, 1000)
) as tmp ON ag.group_id = tmp.group_id
GROUP BY ag.group_id, ag.group_name, ag.age_min, ag.age_max
ORDER BY ag.age_min
20 choses supplémentaires à savoir sur Google (partie 2)
À la fin de mon billet 20 choses à savoir sur Google, je vous promettais de transcrire la deuxième partie de mes notes de lecture de In The Plex. Voici donc une autre liste comptant 20 autres anecdotes sur Google :
- Larry Page était un adepte enthousiaste et supporteur de l'Université de la Singularité de Ray Kurzweil (inventeur de l'OCR, text-2-speech, instruments de musique et auteur de l'excellent livre The Age of Spiritual Machines)
- Larry et Sergey étaient des habitués de l'événement Burning Man (un festival post-hippie dans le désert de Death Valley en Californie)
- En louant une voiture chez Hertz à Atlanta, celle-ci était équipée d'un système de navigation GPS dont Page trouvait qu'il fonctionnait mal et était convaincu qu'il pourrait faire mieux. On connaît la suite avec la venue de Google Maps.
- Le tout premier contrat de license pour intégrer une boîte de recherche "Google Quick Search Box" fût avec Red Hat (distributeur d'une version de Linux) et rapporta 20000$ à Google. Par la suite vint un partenariat avec Netscape. C'était une décision ambitieuse puisque Google n'avait pas assez d'équipement pour prendre en charge cette hausse soudaine de traffic.
- Page et Brin ne voulait pas avoir de chef de la direction (CEO - chief executive officer). Après avoir rencontré Steve Jobs d'Apple, Andy Grove d'Intel, Scott Cook d'Intuit, Jeff Bezos d'Amazon et quelques autres, ils furent convaincus qu'ils étaient prêts à en avoir un. Mais le seul qu'ils voulaient et qui rencontraient leurs standards était Steve Jobs.
- Amit Patel (un des premiers employés de Google) nota que le CEO Eric Schmidt ne partageait pas son espace de travail (pourtant restreint). Un jour, Patel alla le voir et lui demanda s'il était prêt à partager son bureau. Contrairement aux patrons des autres compagnies qui se seraient contentés de répondre "non", il accepta, preuve qu'il avait bien compris l'attitude à avoir chez Google. Patel, croyait qu'il blaguait et qu'il s'en plaindrait à son supérieur immédiat. Le personnel en charge des installations n'osaient pas procéder au déménagement, de peur de représailles. Une des règles chez Google est que si on veut quelque chose, il faut le faire soi-même. Patel prit un bureau et le déménagea lui-même dans le local de Schmidt. Il y resta 6 mois.
- Le créateur du système de publicité extrêmement fructueux de Google, Eric Veach (un canadien originaire de Sarnia en Ontario), a déjà déclaré qu'il détestait les publicités. La force du système réside dans le fait qu'il exploite le concept de "Long Tail" auprès des annonceurs.
- Durant une réunion où il était question decertains pays qui n'utilisent pas vraiment la carte de crédit, Page proposa d'accepter les paiements par troc selon la spécificité de l'endroit. Par exemple, il suggéra que pour les transactions en Uzberkistan, Google pourrait accepter les paiements en chèvres. Ce à quoi Veach répondit : pour l'instant, essayons d'abord d'accepter Visa et MasterCard.
- À la conférence TED de 2001, Bill Gross, le fondateur de l'engin de recherche et de publicité GoTo (renommé par la suite Overture et acquis par Yahoo! en 2003) proposa à Page et Brin de fusionner Google avec son entreprise. Il créa même un démo qu'il nomma GOTOOGLE.
- Le modèle d'achat pour les publicités AdWords était basé (sans le savoir) sur les enchères de Vickrey, un système utilisé par les obligations de la réserve fédérale, et dont les économistes qui l'ont conçu ont remporté un prix Nobel.
- Le système d'apprentissage de Google pour prédire les mots associés à une recherche se nomme PHIL pour Probabilistic Hierarchical Inferential Learner. Mais il fût nommé ainsi surtout parce que ce nom sonnait bien.
- En 2003, une compagnie nommée Applied Semantics utilisait sa technologie dans un produit nommé AdSense. Google acheta la compagnie 42 millions de dollars en comptant et 1% en actions. Google changea le nom de son propre système pour adopter le nom plus attirant de "AdSense" (bien que la technologie interne soit encore basée sur PHIL). Le nom de code d'AdSense était "Puppy".
- Au début, l'association des mots aux annonces affichées a causé des problèmes non-intentionnels,. Par exemple sur un article dans le New York Post décrivant un assassinat où le tueur avait découpé un corps pour le mettre dans un sac à déchets, l'espace publicitaire de Google affichait des publicités pour des sacs à ordures. En 2008, une histoire de terrorisme à Mumbai était accompagnée d'un annonce où on pouvait lire : "Obtenez un certificat en terrorisme 100% en ligne. Inscrivez-vous dès maintenant". À propos d'un empoisonnement alimentaire massif dans un restaurant Olive Garden de Los Angeles, la publicité en marge offrait un "diner gratuit pour deux" à ce restaurant.
- En mai 2010, Google révéla pour la première fois que 68% des revenus des publicités AdSense sur le contenu était retourné à ceux qui hébergeaient les annonces et que Google gardait 32%.
- Google avait pour objectif de rentabiliser l'achat d'Applied Semantics en récoltant 1 million par jour, puis 2 millions, jusqu'à 2 milliards par année. Ils n'avaient jamais prédit que ce serait plutôt 10 milliards par année.
- Si Sergey Brin juge vos résultats et les qualifie "d'assez bons", il faudra le considérer comme un compliment équivalent à recevoir un prix Nobel.
- Comment acheter une compagnie selon Google : analyser le marcher jusqu'à ce qu'on trouve ce que l'on cherche. Proposer un partenariat (car toute bonne compagnie qui vaut la peine d'être achetée ne voudra jamais vendre). Inversez les règles et proposez aux fondateurs de joindre Google. C'est ainsi qu'après plusieurs mois de négociation, Google acheta Urchin pour 20 millions en 2004. Urchin deviendra ensuite Google Analytics.
- Larry et Sergey sont des enfants de l'école Montessori, une école basée sur la philosophie de Maria Montessori, une physicienne italienne née en 1870 et qui croyait que les enfants devaient avoir la liberté de poursuivre ce qui les intéressent sans détruire la créativité innocente de l'enfant.
- À un souper avec le Prince Philip, les serveurs ont apporté des soufflés avec un petit verre de jus de fruit de la passion en guise de sirop. Ce qu'il fallait faire, c'était d'écraser le soufflé et de verser le jus dessus pour éviter qu'il soit trop sec. Larry Page, qui était invité, pris le petit verre et avala le contenu d'un coup, comme s'il s'agissait d'un shooter de tequila. Sergey fit la même chose, devant l'étonnement du prince.
- Pour le poisson d'avril de l'an 2000, Brin envoya un email aux employés pour annoncer que la valeur de l'action passait de 0,25$ à 4,01$ (une référence obscure au 1er avril). Le April Fool's Day est depuis un incontournable chez Google.
Dans un CMS, un des champs d'un formulaire permet à l'utilisateur de faire un choix à l'intérieur d'un selectbox. Comme c'est parfois le cas, l'élément recherché n'est pas disponible dans la liste et l'utilisateur doit changer de page pour aller dans un autre module ajouter un élément dans la liste de référence utilisé pour populer la liste de sélection du formulaire initial. Si le système est mieux pensé, il sera possible d'ajouter une entrée à la liste de référence sans même quitter le formulaire en cours d'édition. Parfois, ce sera sous forme d'un popup qui affichera un formulaire simplifié, qui soumettra le contenu à la base de données à l'aide d'un appel Ajax, qui lui-même retournera comme réponse l'identificateur unique et le libellé à venir glisser par JavaScript dans le selectbox du formulaire parent.
Voilà ce qui décrit le système sur lequel je travaillais cet après-midi. Tout fonctionnait à merveille. Le seul défaut, c'est que la nouvelle entrée s'insérait à la toute fin de la liste de référence au lieu de se positionner correctement par ordre alphabétique. Je me disais qu'une simple fonction de tri JavaScript de type "bubblesort" appliqué sur les options du selectbox serait suffisant pour rafraîchir l'ordre de la liste.
Un exemple de liste :
<select id="mySelectBox">J'ai codé cette fonction bubblesort en JavaScript qui fait le travail minimum pour répondre au besoin :
<option value="5">E</option>
<option value="1">A</option>
<option value="2">B</option>
<option value="4">D</option>
<option value="26">Z</option>
<option value="3">C</option>
<option value="10">J</option>
</select>
function bubbleSortOptionsByText(optionsList){Appel avec jQuery :
var length = optionsList.length;
var swap1, swap2;
while(length > 0){
for(var i=1 ; i<length ; i++){
if(optionsList[i-1].text > optionsList[i].text){
swap1 = optionsList[i-1];
swap2 = optionsList[i];
optionsList[i-1] = swap2;
optionsList[i] = swap1;
}
}
length = length-1;
}
return optionsList;
}
$j = jQuery.noConflict();Ça fonctionne. Malgré tout, la fonction comporte quelques défauts :
$j(document).ready(function(){
var elems = $j('#mySelectBox option');
elems = bubbleSortOptionsByText(elems);
$j('#mySelectBox').html(elems);
});
- elle ne peut trier que par le texte affiché et non par la valeur (dans ce cas, on pourrait remplacer optionsList[i].text par optionsList[i].value)
- il s'agit d'un tri alphanumérique donc sur une liste comportant des libellés ou des valeurs de 1 à 99, l'ordre logique positionnerait 10 immédiatement après 1 (plutôt qu'à la suite de 9)
- l'opérateur de comparaison force le tri ascendant (dans ce cas, de A à Z)
- ce n'est peut-être pas le meilleur algorithme de tri pour la performance
J'ai relu mon propre billet, je l'ai mis à l'essai et presque par magie, TinySort contourne avec brio les défauts mentionnés plus haut. De plus, une seule ligne de code facile à lire suffit :
$j('#mySelectBox option').tsort({'attr':'text', 'order': 'asc'});J'ai fait disparaître ma fonction pour la remplacer par ce petit plugin dont j'apprécie maintenant encore plus l'utilité.
Après avoir lu l'excellent livre Hackers de Steven Levy (magazine Wired), le plus récent ouvrage de l'auteur semblait tout à fait prometteur puisqu'il offrait une incursion privilégiée dans le monde de Google avec In The Plex: How Google Thinks, Works, and Shapes Our Lives (2011). N'ayant fait qu'une bouchée des anecdotes de la 1ère section, je surlignais tellement de passages intéressants que j'ai jugé bon vous faire un premier compte rendu ici.
Voici donc 20 anecdotes que vous ne connaissiez peut-être pas sur Google :
- À l'université, Larry Page avait décidé de travailler dans le département Human-Computer Interaction Group. Il a lu le livre "The Psychology of Everyday Things" du gourou des interfaces d'Apple, Donald Norman dont l'argument principal est "l'utilisateur a toujours raison".
- Larry Page rencontra Sergey Brin alors que ce dernier travaillait comme guide dans des tours guidés de la ville San Francisco. Sa première impression : il le trouvait insupportable.
- Sergey se promenait constamment à l'université Stanford avec des Rollerblades et avait un intérêt pour le trapèze.
- Curieusement, Google a pris naissance dans le Gates Computer Science Building de Stanford (nommé en l'honneur de Bill Gates de Microsoft, qui n'a jamais fréquenté l'institution).
- Le programme initial de Page comptait beaucoup de bugs, en partie parce qu'il a utilisé le tout nouveau langage Java pour construire son ambitieux projet et que Java plantait continuellement.
- Le programme (spider) fût ensuite traduit en Python.
- Une seule machine exécutait 1000 threads (processus indépendants qui ne se pilent pas sur les orteils un de l'autre)
- En 1995, DEC, qui avait conçu Altavista, croyait le contraire de Google et qu'il était impossible de faire de l'argent avec un engin de recherche. Les travaux d'un réfugié de l'Allemagne Nazie, Gerard Salton, qui a créé des algorithmes sur la recherche d'information, ont grandement influencé les moteurs de recherche modernes.
- À Stanford, BackRub avait accès uniquement à la bande passante du Gates Building (10 megabits de trafic par seconde, alors que l'université entière était sur une ligne T3 à 45 megabits). L'équipe trouva comment modifier la switch pour avoir accès à la totalité de la bande passante du réseau. À l'époque, une seule machine s'occupait d'analyser la totalité du web et elle était hébergée directement dans le dortoir.
- Avant d'être rebaptisé Google, le nom original était BackRub. Lorsqu'ils ont voulu le renommer, le nom The Whatbox avait été considéré mais ils trouvaient que ça sonnait trop comme Wetbox. Le colocataire de Page suggéra alors Googol, un terme mathématique faisant référence au chiffre 1, suivi de 100 zéros et qui était à la hauteur des objectifs qui s'étaient donnés (parfois le terme googolplex était utilisé génériquement pour parler d'un nombre incroyablement grand). Page changea l'orthographe pour Google car le nom de domaine épelé correctement était déjà utilisé.
- Brin et Page ont rencontré les fondateurs du portail Yahoo!, Jerry Yang et David Filo (anciennement de Stanford aussi) et ils ne voyaient pas l'utilité d'acheter une technologie d'engin de recherche. Par contre, Altavista semblait plus intéressé à BackRub.
- Comme la technologie PageRank (importance du contenu selon le nombre de liens qui y réfèrent) avait été développée durant les années d'études du duo à Stanford, l'université détenait le brevet et la propriété intellectuelle. Un arrangement s'est conclut alors que Google donna 1,8 millions de parts pour avoir la propriété exclusive.
- Les utilisateurs vantaient le design Zen de la page de recherche de Google où prédominait la couleur blanche. Dans les faits, Page déclara que c'était simplement parce qu'ils n'avaient pas de webmestre pour designer le tout et qu'ils avaient du le faire eux-même.
- Le logo de Google a été créé par Sergey en utilisant le logiciel d'édition graphique open-source GIMP. Initialement, un point d'exclamation avait été ajouté pour faire comme Yahoo!. Le logo voulait utiliser des couleurs qui rappelaient les blocs pour enfants afin de donner une impression jeune et enjouée.
- Pour stocker des millions de pages analysées, ils avaient besoin de beaucoup d'espace disque. Pour que ça soit économique, Page achetait des disques réusinés à une fraction du prix original (10%). Sachant qu'ils avaient une défectuosité, il découvrit qu'il pouvait les fixer à condition de remplacer le système d'exploitation du disque. Il acheta alors 120 disques de 9 Go pour avoir une capacité d'un tera de données.
- Pour démarrer l'entreprise, le duo avait besoin de capitaux. C'est Andy Bechtolsheim (co-fondateur de Sun Microsystems) qui le premier remetta un chèque de 100 000$ pour financer leurs activités. Pour célébrer leur réussite, Brin et Page allèrent déjeuner au Burger King. Ne pouvant encaisser le chèque faute de compte de banque, il demeura dans la chambre de Page pendant 1 mois.
- Parmi les investisseurs initiaux de Google, on pouvait compter Jeff Bezos d'Amazon.
- Un des premiers employés de Google fut Amit Patel, un étudiant au doctorat en théorie du langage de programmation. Sur sa carte d'affaires, on pouvait y lire : "fauteur de troubles".
- Le moteur de recherche de Google cherche des mots mais est assez intelligent pour trouver des synonymes et faire des associations de mots. Ainsi, le mot "dog" était similaire à "puppy" et "boiling water" était associé à "hot". Un des problèmes initiaux était que le système considérait que "hot dog" équivalait à "boiling puppy".
- L'ingénieur engagé pour combattre le spam était Matt Cutts. Suite à une entente commerciale où Google devait fournir des résultats de recherche "sécuritaires pour la famille", il devait regarder les sites pour adultes afin de savoir quoi considérer comme était indésirable. Étonnamment, aucun de ses collègues ne voulait l'aider! Un soir, une fois retourné à la maison, il s'en plaigna à sa femme et elle se porta volontaire pour faire cuire des biscuits aux brisures de chocolat pour récompenser les Googlers qui allaient aider Matt à dénicher des sites à insérer dans son système de blocage. Il organisa une journée "Look for Porn Day" qui connu du succès puisque depuis, sa femme s'est fait surnommer la "porn cookie lady at Google".
Lire la suite : 20 choses supplémentaires à savoir sur Google (partie 2)
Eh oui, déjà 3 années se sont écoulées depuis le lancement de mon blogue. Mon tout premier billet publié le 24 octobre 2008 résumait bien mes objectifs :
Le but exact de ce blogue est encore incertain. Il traitera certainement de technologies, de programmation, de musique et un brin d'humour. Le reste est à vos risques.
Étonnamment, l'objectif demeure toujours incertain. Un défi lancé à moi-même ? Sans doute. Mais surtout une épreuve d'endurance à rédiger 1 billet par jour dès la 1ère année sur un sujet qui m'intéressait. Même lorsque j'étais malade ou en vacances à l'extérieur. J'avais amorcé une liste de thèmes que je voulais aborder ou explorer : plus de 300 au total. Et elle n'a fait que s'allonger.
C'était aussi le défi d'éviter de tomber dans le même piège que de nombreux autres blogueurs : mettre en place un blogue pour finalement l'abandonner tout aussi rapidement. D'un autre côté, comment répartir les efforts entre plusieurs intérêts et concilier le tout avec les responsabilités du travail, les rénovations à entreprendre sur ma "nouvelle" vieille maison, ma guitare de rêve que je vois constamment du coin de l'oeil et qui ne demande qu'à se faire gratter ? De toute évidence, je dois ralentir la cadence et équilibrer le temps que je peux allouer à chacun. Mais ne pas abandonner. Publier moins, publier mieux.
D'ailleurs, la rigueur que je me suis donné à rédiger régulièrement ne doit pas devenir une obligation. Sur ce point, un ami m'a gentiment rappellé que c'est mon blogue et non un magazine. Par conséquent, je pouvais bien y publier ce que je voulais.
En partageant mes intérêts avec vous et parce que vous me lisez, je sais qu'on a des intérêts communs. Et je sais aussi qu'en discuter autour d'une bière serait bien sympathique. Je crois que ce sera mon nouvel objectif pour l'année à venir. Justement, j'ai déjà promis une bière à deux lecteurs (à ce rythme, ça va me coûter cher!).
Bien humblement, merci de me lire et à très bientôt.
La probabilité qu'un jeune homme rencontre une jeune femme désirable et réceptive augmente d'une progression pyramidale s'il est déjà accompagné : 1. d'une autre femme; 2. de son épouse; 3. d'un ami masculin riche qui paraît mieux.
Durant mes années de collège, suite à un cours d'anthropologie, j'ai eu envie d'explorer les grands mythes, croyances et légendes de l'humanité, allant de l'Atlantide jusqu'à la naissance de toute forme de religion. J'ai alors eu le courage de passer au travers la brique de 700 pages La sorcière et l'occident (1997) de l'historien Guy Bechtel et j'en ai retenu ceci (entre autre) :
- Que l'Église catholique soutenait fortement l'Inquisition
- Qu'on mettait au bucher à peu près n'importe qui soupçonné de dévier de la norme
- Qu'il était facile d'accuser d'hérésie ceux qui n'avaient pas adhéré au culte du Dieu unique (dont les païens)
- Qu'on diabolisait avec excès le sexe féminin
- Que la médecine naturelle des "sorcières" entrait en concurrence avec la profession en devenir du médecin qui s'appuyait sur une approche plus scientifique et que c'était un bon prétexte pour les éliminer
- Que ça valide une fois de plus que l'histoire est écrite par les vainqueurs
Il y a plusieurs siècles au moment de l'Inquisition, l'Église catholique considérait les hérétiques (ceux croyant en une doctrine différente que celle officielle) ainsi que les peuples athées (qui nie l'existence de toute divinité) comme des ennemis qu'il fallait combattre, conquérir et convertir de force à la religion chrétienne, au risque de payer de leur vie en cas de désobéissance. C'est aussi ce qui a mené à marginaliser d'autres minorités : malades, hérétiques, excentriques sexuels, porteurs de vérités nouvelles, immigrants, etc. Comme seule explication, le mal faisait son oeuvre.
Comprenez-le bien, pour simplifier au maximum un concept et entrer dans la généralisation, il faut que les éléments qui s'opposent soient clairs : le jour/la nuit, oui/non, le bien/le mal, le blanc/le noir. Jamais de juste milieu entre les deux. C'est ce qu'on appelle le dualisme. Et le christianisme n'en échappe pas. Si Dieu est le bien, Satan est le mal. Avec le temps, le mal a été directement associé au contrôle tentateur de Satan sur les gens. En fait, tout ce qui était hors de l'Église était impur, donc satanique. Mais qui était Satan ?
Satan, le diable, n'est pas une divinité. Il a été créé par Dieu en tant qu'ange bon mais comme il a été chassé du Ciel quand il a choisi de devenir mauvais, Dieu l'a condamné aux enfers (une autre création de Dieu tout puissant). Ici, l'enfer est symbolique et n'existe pas. Il n'a rien à voir avec l'enfer populaire remplit de flammes qu'avait imaginé l'Église pour terroriser le peuple et le tenir loin du Mal. Encore aujourd'hui, l'Église confirme que l'enfer est davantage un symbole qu'une réalité.
L'Église chrétienne fonde son pouvoir sur le monothéiste, c'est-à-dire qu'elle ne croit qu'en un seul dieu unique. Ceux se trouvant à l'extérieur de l'Empire chrétien romain (selon des limites politiques, non territoriales) étaient perçus comme non-civilisés et une conversion à la "bonne" religion était souhaitable. Les celtes par exemple avaient un système religieux polythéiste, possédaient une hiérarchie impressionnante de divinités et croyaient aussi en la magie et aux pouvoirs des éléments naturels. On conviendra que cela ne plaisait pas particulièrement à l'Église!
Pour les peuples celtes païens (dont l'apogée de l’expansion se situe entre le VIIIème siècle av. J.‑C. jusqu'au IIIème siècle), le druide est à la fois ministre du culte, philosophe, gardien du Savoir et de la Sagesse, historien, juriste et aussi conseiller militaire du roi et de la classe guerrière. Il est en premier lieu l’intermédiaire entre les dieux et les hommes (source: Wikipedia). Il connaissait aussi le secret des runes, un alphabet ancien servant entre autre à des desseins magiques. Un des symboles provenant des croyances celtiques est le triskel, une sorte d'étoile à trois branches recourbées sur elles-mêmes où chacune représente une virtue du peuple celtique (ou un des dieux principaux, selon l'interprétation). Autrement dit, un symbole religieux important au même titre que la croix représentant la crucifixion de Jésus-Christ.
La numérologie chrétienne pratiquée par les membres ecclésiastiques prenait sa source dans la Trinité : Dieu le père, le Fils et le Saint-Esprit, un dogme instauré au Concile de Nicée (en 325 Après J.-C.). Ils se disaient que Dieu était un être parfait et que c'était la Trinité (le chiffre 3) était la représentation parfaite. Or, comme le 6 était lié à l'imperfection dans la Bible, 666 symbolisait l'imperfection suprême .
Si on regarde bien le triskel, les trois branches forment le chiffre 666 si on le retourne sur lui-même. Est-il possible que ce symbole ait inspiré et soutenu d'une quelconque façon le nombre de la bête tel que mentionné dans l'Apocalypse de Jean (un des disciples de Jésus) ? Curieusement, on estime la rédaction du texte vers 66-67 après J.-C et que la bête du 666 ferait référence à l'empereur Néron, le 6ème empereur romain, qui persécuta les premiers chrétiens. Plus tard, au 16ème siècle, Jean Wier dénombra pas moins de 44 millions de démons, divisés en 666 légions commandées par 66 princes... Chose certaine, ce chiffre a alimenté l'imaginaire de ses détracteurs! Qui sait si ce n'était pas une interprétation volontaire pour servir les intérêts d'expansion des puissances politiques et religieuses concernées.
À votre avis, cette théorie se tient ? Dans le pire des cas, ce ne serait qu'une bêtise de plus dans l'histoire. Au mieux, un bon album pour le groupe Iron Maiden...
Hier soir était la grande première de la deuxième saison de la série The Walking Dead sur les ondes de la chaine AMC. Évidemment, Vidéotron n'offre pas cette chaîne à ses abonnés alors je n'ai pas pu le regarder (à ma grande joie, je viens de découvrir qu'on peut regarder le 1er épisode en ligne sur le site d'AMC!). Entre temps, je viens à l'instant de terminer de lire un livre sur le même thème : The Zombie Survival Guide de Max Brooks.
Que voulez-vous, le buzz sur tout ce qui entoure l'excellente série télé m'a poussé à un intérêt soudain pour les morts-vivants. Et croyez-moi, ça m'arrive rarement de me laisser emporter par une vague de la sorte. Moi qui n'est pas trop amateur d'histoires fantastiques, je dois confesser que je me suis découvert un faible pour les histoires de zombies. Entre les loups-garous, les vampires et les histoires à l'eau de rose à la Twilight, seules ces ghoules paraissent les plus crédibles dans un monde où une épidémie de source mystérieuse transforme par une simple morsure les humains en cannibales à décapiter avec plaisir. Vous serez d'accord avec moi que c'est un scénario plus plauside et alléchant qu'un vampire qui scintille au soleil...
Publié la même année que le 1er numéro du comic original de The Walking Dead (2003), je reconnais que l'auteur de la série s'est peut-être servit de certaines idées pour élaborer son scénario. Ce guide de survie à l'attention des plus paranoïaques d'entre nous deviendra un outil pratique pour se préparer à un scénario apocalyptique imminent. Après avoir remplit votre bunker d'un an de conserves achetées chez Costco (pouvant nourrir 4 personnes pour seulement 3500$!), apprenez comment vous préparer au pire : une invasion de zombies. Vous saurez discerner les mythes de la réalité, la science vous éclairera sur le (faux) virus du Solanum qui est responsable de la maladie, vous apprendrez à choisir les meilleures armes pour attaquer et vous défendre en plus des techniques de combat les plus efficaces. Tout ça pour apprendre à vivre dans un monde peuplé de morts-vivants.
À la fin, un chapitre complet recensant des attaques "historiques" de zombies à travers le globe. C'est sans doute la moins bonne partie et c'est là qu'on décroche. À vrai dire, ça m'a rappellé l'engouement soudain pour les extra-terrestres grâce aux X-Files dans les années 90. Et comme dans tous les exemples cités, il n'y aucune source crédible vérifiable, ce qui rend impossible de prouver leur existence (mais on veut y croire!). En quelque sorte, les zombies représentent la version moderne au goût du jour. Du coup, plusieurs des témoins des attaques "recensées" sont morts subitement, disparus ou tués, les journaux ayant publié les articles témoignant des événements ont fait faillite, ont été détruits ou les preuves indéniables se trouvent uniquement dans des documents secrets jalousement conservés par les familles des témoins.
Poussant l'exagération plus loin, il est question d'une histoire d'après-guerre où la Russie tenta de maîtriser les morts-vivants dans le but de les utiliser comme force de combat dans une éventuelle Troisième Guerre Mondiale. Sans surprise, le gouvernement a caché les événements pendant la période communiste... Comme s'il s'agissait d'une conspiration pour que le commun des mortels reste dans l'ignorance face à cette menace si proche. Évidemment, tout ça est de la pure fiction et ce n'est pas tout à fait le meilleur complément pour vous mettre du zombie sous la dent.
Honnêtement, même si c'est un bestseller du NY Times, je n'ai pas trouvé que c'était une lecture si divertissante. Est-ce que je vous le recommandrais ? Bof... Procurez-vous plutôt The Walking Dead Compendium, une bible de 1000 pages désormais incontournable dans ma bibliothèque.
Lors du dernier Pecha Kucha, un des présentateurs a glissé un mot sur le Yi King et sa référence qui lui est faite dans le livre Le maître du haut chateau de Philip K. Dick (écrit en 1962). Ayant su attirer ma curiosité, je me suis empressé de le lire.
Dans ce roman, il imagine un monde où l'Axe, composé des allemands, des japonais et des italiens, aurait gagné la Seconde Guerre Mondiale. Le président Roosevelt a été assassiné, les alliés ont capitulé en 1947, le Japon et l'Allemagne occupent désormais une partie du territoire américain où une des zones est reconnue comme abritant des camps de concentration.
Dans cette nouvelle réalité dominée par le totalitarisme nazi (Hitler est mort et d'autres lui ont succédé au pouvoir), un écrivain de science-fiction, connu sous le nom du Maître du haut château, publie à son tour un livre qui explique ce que serait le monde si les alliés avaient gagné la guerre. Rédigé à l'aide de l'ancien texte chinois du Yi King, c'est devenu d'usage dans cette société de s'en servir pour consulter l'oracle avant de prendre une décision sur une question difficile. Celui-ci proposera des explications (nébuleuses et libres d'interprétations) et des prédictions sur l'évolution possible de la situation, ce qui influence les actions des gens.
Ce livre, intitulé La sauterelle pèse lourd, sera interdit en territoire allemand et sera au coeur de l'intrigue qui se joue autour d'un antiquaire d'art américain qui vend des objets rares dont l'historicité est douteuse (et pourtant très prisée de ses clients japonais qui l'ignorent), d'un juif ayant changé d'identité pour échaper à la mort, de haut placés japonais et allemands, et d'un faux officier italien venu en secret assassiner l'auteur de l'ouvrage controversé.
Sont-ils certains de vivre dans la réalité où ils se trouvent ? Et si le Yi King affirmait le contraire ?