Les statistiques, c'est comme le bikini : ça donne des idées mais ça cache l'essentiel !
Jusqu'à présent, j'ai lu trois livres sur Richard P. Feynman, Prix Nobel de physique en 1965.
Dans l'ordre : The Meaning of it All : Thoughts of a Citizen Scientist (1999), What Do You Care What Other People Think? (1988) et Surely You're Joking, Mr. Feynman! (1985).
Et je me rends compte que c'est dans l'ordre inverse que je les ai le plus appréciés. Dans ce dernier, Surely You're Joking, Mr. Feynman!, il raconte de nombreuses anecdotes amusantes dont une où il explique un tour sur la façon de laisser un pourboire à une serveuse d'un restaurant de Boston.
Il s'y rendait régulièrement et avait toujours la même serveuse. Elle semblait constamment pressée alors un jour, juste pour le plaisir, il a laissé son pouboire de façon assez originale. Il a remplit deux verres d'eau à pleine capacité et y a glissé dans chacun une pièce de monnaie. À l'aide d'un papier posé sur le dessus, il a retourné les verres sur la table. L'eau ne pouvait s'y échapper à cause de la pression de l'air environnante. Ensuite, il a retiré le papier de chaque verre en la glissant de façon à ce que le rebord du verre soit en contact direct avec la surface de la table. Comme l'air ne pouvait pas entrer, l'eau est restée dans les verres sans se répandre.
Pourquoi deux verres ? Parce que si la serveuse était pressée à désservir la table pour la préparer pour les prochain clients, elle aurait probablement fait un dégât avec le premier verre et aurait certainement hésité à répéter l'erreur avec le deuxième. Avant de quitter, il aurait dit à la serveuse que ses verres avaient quelque chose d'étrange : ils sont remplis à l'envers et il y a un trou dans le fond!
À sa visite suivante, une autre serveuse s'est occupé de lui. Elle lui a expliqué que sa serveuse régulière était fâchée à cause du dégât provoqué par le verre et qu'elle et le patron avaient tenté de comprendre comment procéder avec le deuxième verre mais qu'ils ne pouvaient pas y passer toute la journée. Ils ont finalement soulevé le second et l'eau s'est répandue sur le plancher.
Feynman a expliqué qu'ils auraient pu éviter le déversement en glissant doucement les verres sur la surface de la table jusqu'au bord et laisser tomber l'eau dans un bol plutôt que sur le plancher. Ce soir-là, suivant le même principe, il a laissé son pourboire sous une tasse à café retournée à l'envers.
La fois suivante, la même serveuse est venue lui demander pourquoi il avait laissé la tasse à l'envers. Même pressée, elle avait pris le temps de retourner à la cuisine chercher un bol, avait glissé lentement la tasse comme il lui avait expliqué et pourtant, la tasse ne contenait même pas d'eau !
De quoi semer la confusion et se faire détester encore plus par le personnel du restaurant. Un jour, je me promets d'essayer ça :-)
Ma bonne conscience et mon éducation me disent que ce n'est pas bien de rire des gens. Mais parfois, on peut faire une exception quand la nature humaine fait des bêtises.
Le site People of Wal-Mart répertorie des centaines de photographies prises à ces méga-centres où on peut y croiser d'étranges personnages...
Avouons-le, c'est de mauvais goût. La preuve que ça prend de tout pour faire un monde.
Par défaut, lorsqu'on crée un utilisateur dans PostgreSQL, le mot de passe est encrypté en MD5 et stocké dans la table pg_shadow. On peut obtenir la liste des mots de passe en exécutant la requête SQL suivante :
SELECT usename, passwd FROM pg_shadowusername: code18
passwd: md5233737410cfd8ab44458c03a88f139ab
Sous Postgres, on sait que le nom d'utilisateur est ajouté comme salt à la fin du mot de passe, avant de l'encrypter (cliquez ici pour en savoir davantage sur l'encryption de mot de passe). Le md5 en début de chaîne indique le type d'encryption.
En retirant "md5", il reste ce hash à décrypter : 233737410cfd8ab44458c03a88f139ab
Pour le cracker et récupérer le mot de passe initial (pas seulement de Postgres), on peut utiliser un petit utilitaire de brute force très puissant, MDCrack, créé par Gregory Duchemin (un québécois, si on se fie à son adresse courriel @videotron.ca).
À titre d'exemple, si on encrypte un mot sur md5encrypter.com, on obtiendra le hash md5 (ce service crée une base de données des mots de passe encryptés et s'en sert pour donner une réponse rapide à l'équivalent décrypté. Il ne le fait pas en temps réel ou en utilisant du brute force). Par exemple, la chaîne de caractères "allo" encryptée en md5 donne : ce92c299bb5d344bdac1f9c03396b34f. Pour faire l'opération inverse, une simple ligne de commande suffit :
MDCrack-sse.exe --algorithm=MD5 ce92c299bb5d344bdac1f9c03396b34f
System / Thread #0: Collision found: allo
Info / Thread #0: Candidate/Hash pairs tested: 1 869 314 in 187 ms
MDCrack l'a résolu en 187 millisecondes. Cependant, à compter de 6 caractères, l'entropie augmente avec le nombre de possibilités et ça commence à être plus long. J'ai dû patienter 11 minutes pour cracker le mot de passe de mon utilisateur pour ce test. Avec le hash récupéré de pg_shadow pour le user code18, on indique l'information qu'on connaît et on exécute le tout :
MDCrack-sse.exe --algorithm=MD5 --append=code18 233737410cfd8ab44458c03a88f139ab
Le résultat (indiqué sous Collision found), après 6,3 millions de tests : gibsoncode18
En retirant le nom d'utilisateur code18, on déduit le mot de passe : gibson.
Quand on programme une interface, les champs du formulaire possèdent généralement certaines valeurs par défaut qu'on remplit pour éviter à l'utilisateur d'avoir à les saisir. Toutefois, il peut écraser les valeurs pour les remplacer par ce qui lui convient le mieux.
Souvent, on indique une valeur par défaut au niveau du champ d'une table de la base de données. Si aucune valeur n'est fournie, la valeur indiquée dans la définition de la table sera utilisé pour compléter l'insertion.
J'ai remarqué une tendance en programmation à indiquer une valeur dans le champ de la table et la définir à nouveau dans le champ de saisie du formulaire. Ce qui fait que si la valeur par défaut change, on est obligé de repasser aux deux endroits pour faire l'ajustement, alors qu'on peut l'obtenir par programmation.
Pour connaître la valeur par défaut définie au niveau de la colonne d'une table PostgreSQL et la charger dans le formulaire, on peut utiliser la requête suivante :
SELECT adsrc as default_valueEn utilisant ce moyen pratique, on s'assure qu'il n'y aura pas d'oubli lors des modifications futures. Cependant, il faut avouer que c'est légèrement moins performant car on doit exécuter une requête SQL supplémentaire pour l'obtenir. Je ne recommanderais pas de le faire systématiquement pour tous les champs mais parfois, ç'en vaut le coût.
FROM pg_attribute att
INNER JOIN pg_attrdef def ON att.attrelid = def.adrelid AND att.attnum = def.adnum
INNER JOIN pg_class p ON p.oid = att.attrelid
WHERE p.relname = 'table_name'
AND att.attname = 'field_name'
Suite à la recommandation d'un vendeur de Renaud-Bray, je me suis procuré La Route, de Cormac McCarthy. Je ne savais pas trop à quoi m'attendre mais le contexte semblait intéressant. Voici ce qu'en dit le résumé :
L'apocalypse a eu lieu. Le monde est dévasté, couvert de cendres et de cadavres. Parmi les survivants, un père et son fils errent sur une route, poussant un caddie remplit d'objets hétéroclites. Dans la pluie, La neige et le froid, ils avancent vers les côtes du Sud, la peur au ventre: des hordes de sauvages cannibales terrorisent ce qui reste de l'humanité. Survivront-ils à leur voyage ?D'abord, ça pouvait laisser croire qu'il y aurait des zombies. Aucun zombie. À la place, on se retrouve dans un contexte réaliste de ce que serait l'apocalypse dans un avenir rapproché. Le soleil est quasi absent, il fait froid. Plus rien ne pousse dans les champs, le chaos règne, la vie même est sur le point de s'éteindre. La preuve (si je ne me trompe pas), c'est qu'ils croisent pour la première fois quelqu'un vers la 50ème page.
La nourriture se fait rare, généralement en boîte de conserve. Parmi le peu de survivants, certains se sont résignés à devenir cannibales et capturent les gens pour les manger : on comprend que ce sont les méchants dont parle le père à son fils. C'est d'eux qu'ils tentent d'éviter et de fuir. Ils ont un revolver avec deux balles, qu'ils sont d'accord à utiliser en dernier recours pour se suicider plutôt que de tomber aux mains des cannibales.
Dans ce monde sans espoir, ils ont choisit la méthode difficile : de passage en différents lieux, ils trouvent le nécessaire pour vivre et manger au jour le jour et doivent piler sur leur orgueil quand vient le temps d'avaler ce qui leur tombe sous la main.
Arrivés à une maison qu'ils fouillent de fond en comble, ils découvrent une trappe vérrouillée au plancher. Une fois enfoncée, ils s'aperçoivent que des gens y sont pris en esclavage dans ce "garde-manger" provisoire. Et les résidents arrivent...
Plus loin, cachés à l'écart dans la nature, ils remarquent au loin un groupe de 4 personnes dont une femme enceinte. Suite à leur passage, ils exploreront le périmètre et découvriront le bébé embroché au dessus du feu à cuire pour servir de repas.
Lorsqu'ils les croisent, certains rescapés tentent de les attaquer pour obtenir le contenu du caddie, pour leur propre survie. D'autres sont seulement impuissants et errent dans l'inconnu jusqu'à ce que la mort les rattrape.
Une fois, on a le sentiment qu'ils arrivent au paradis : ils repèrent ce qui me semble être un genre d'abris nucléaire avec tout le nécessaire à la survie : eau potable, abondance de nourriture en conserve, lits de fortune, etc. Ils en profiteront quelques jours pour faire le plein d'énergie, se laver et être temporairement à l'abris des intempéries mais se verront forcés de poursuivre leur chemin. Ils remplissent le caddie du plus de provisions qu'ils peuvent transporter et reprennent leur route.
Que vont-ils chercher vers le sud ? Le père explique qu'ils doivent trouver d'autres gentils, même s'ils se méfient du peu de gens encore en vie. Ce qu'ils cherchent n'est pas toujours clair. Peut-être un monde meilleur ? Mais on se comprend que le père est mourant et qu'il cherche à trouver quelqu'un qui s'occupera de son fils une fois qu'il aura rendu son dernier souffle.
Avec peu d'action et de rebondissements, on sent surtout la solitude, la désolation, la répétition d'une routine de survie et l'ambiance qui pèse lourd. Assez bon en général, quoique je suis souvent déçu par la fin de ce genre de récit. Notre imagination doit se mettre de la partie.
À la librairie, deux éditions en format de poche étaient disponibles, l'une originale, avec une simple jaquette blanche (comme l'image publiée), l'autre avec une image tirée du film (2009) avec Viggo Mortensen dans l'adaptation de The Road au cinéma. J'ai acheté la première. Je n'ai pas vu le film (sorti récemment) mais tout au long de la lecture du récit, j'avais l'image de l'homme, silencieux, peu bavard, comme Aragorn dans le Seigneur des Anneaux.
Un peu comme pour les livres de poche de la trilogie, on dirait que je n'aime pas avoir une photo tirée des films sur les oeuvres qui ont été portées au cinéma. J'ai l'impression de soit lire un scénario de film, soit de me dire que je pourrais simplement visionner le film pour avoir une bonne idée de l'histoire. Le livre étant toujours meilleur que le film, sauf rares exceptions, on en perd moins les subtilités.
Ça c'est le genre de projet que j'aime : une guitare digitale, conçue par l'entreprise australienne Misa Digital. Ingénieux non ? Plutôt que de pincer les cordes, la main se promène sur l'axe X et Y de l'écran tactile pour contrôler différents paramètres en même temps.
Voyez la vidéo pour une démonstration :
Quelques spécifications techniques :
- Fait en plastique dur ABS (Acrylonitrile butadiène styrène)
- Manche de 144 touches (6 "cordes" x 24 frettes) insensibles à la pression
- Écran tactile de 8.4", résolution de 800x600
- Processeur 500MHz x86 compatible AMD Geode
- Contrôlleur MIDI (Musical Instrument Digital Interface)
- Gentoo Linux avec kernel 2.6.31
- Logiciel open source pour favoriser les transformations et partager les nouveaux firmwares avec les autres
- Accélération graphique avec la librairie DirectFB
Soyez patient, ce sera en production bientôt.
Ma copine et moi, nous avons choisi de vivre à Montréal. Nous sommes présentement locataires et notre souhait pour 2010 est d'acheter une maison ou un bas de duplex quelque part près de la ligne orange du métro.
Vous êtes fous ou quoi ? Montréal, il y a du monde qui se font tuer là-bas! On ne s'y reconnaît plus, il y a juste ça des immigrants! Ou comme dirait l'humoriste Anthony Kavanagh : "Y pusent les races...". Certaines personnes de notre entourage semblent préférer jouer au grand frère et nous recommander de s'exiler à Boucherville ou Boisbriand, où c'est pas mal mieux. Et ils osent insister pour tenter de nous ramener dans le droit chemin. Ça nous pique au vif et on se sent constamment le besoin de se justifier et de répliquer.
Ben c'est ça, restez dans votre banlieue homogène! Quand vous voudrez aller manger au resto, vous pourrez choisir entre les 5 mêmes bannières qui se retrouvent dans chaque municipalité calquée l'une sur l'autre. Pendant ce temps, nous irons apprécier l'excellente cuisine Aux Derniers Humains, au Petit Alep, au Nil Bleu...
Nous, on les aime nos races. On aime la diversité. On aime l'ouverture d'esprit. Même qu'on a "osé" leur parler une fois et nous les avons trouvés bien gentils. Oui, même les turbans et les voilées. Maintenant, on se salue régulièrement et pour certains, nous sommes devenus bons amis. C'est un respect mutuel, un respect de la différence et l'acceptation de partager ce qu'on a en commun : la vie en société. D'ailleurs, si on en avait un dans chaque famille, les préjugés tomberaient rapidement parce qu'on serait confronté à cette différence. Et c'est cette attitude positive avec mes concitoyens de Montréal qui fait que c'est une ville où c'est agréable à vivre.
Montréal est aussi la capitale culturelle du Canada. Les spectacles, musées, expositions, festivals, bars, théâtres : tout simplement incomparable. Chaque jour, de multiples possibilités pour combler une soirée. C'est à Montréal que ça se passe.
Et le traffic. Quand je vois les files de voitures qui viennent sur l'île et qui avancent pouce par pouce, je me dis que ce n'est pas une vie. Combien de temps perdez-vous par semaine à voyager pour aller au bureau ? 10 heures ? 15 heures ? Ni écologique, ni économique. Le temps étant une ressource précieuse, je préfère ne pas la gaspiller inutilement. Quand j'ai à aller au dépanneur, j'en ai un à chaque coin de rue et je peux m'y rendre à pied. Pas besoin de prendre la voiture pour sortir du quartier résidentiel. Aussi, le métro et les autobus sont efficaces, ils ne passent pas une fois par heure...
Le rêve américain : avoir une grande baraque sur une rue dont les maisons se ressemblent toutes, un cinéma maison, deux autos, laver son drive-way, avoir son petit chien pour compléter la famille. Le bonheur idéal ? Non, ce n'est définitivement pas pour moi. Je revendique le droit de pouvoir vivre différemment. Comme disait une publicité récente : "Allez vivre en banlieue... au nord de Longueuil".
Montréal n'est pas parfaite, mais c'est là que je veux vivre. Et à part ça, pourquoi est-ce qu'on devrait se justifier sur NOTRE choix de vie ?
Lorsque tout le monde pense la même chose, c'est que personne ne pense beaucoup.
Un soir cette semaine, j'ai décidé de faire faux bond au match de hockey (défaite de 4 à 3 du Canadiens) pour visionner le film Slumdog Millionaire que je m'étais procuré sur eBay. Pour la modique somme de 2,99$, c'est certainement plus avantageux qu'une location au club vidéo.
Les critiques étaient bonnes (8.4/10 sur IMDB) et j'appréhendais un divertissement rafraîchissant à la sauce Bollywood (industrie cinématographique indienne). Surtout depuis notre engouement soudain pour les chorégraphies indiennes de Tunak Tunak Tun de Daler Mehndi et Kalluri Vaanil de Prabhu Deva. Kitsch à souhait mais ô combien hilarantes.
Dirigé par Danny Boyle, le directeur qui nous a donné les excellents Trainspotting et 28 Days Later, Le Pouilleux Millionnaire, de sa traduction québécoise, est l'histoire d'un jeune orphelin sans éducation issu des bidonvilles qui a réussi à participer à la version indienne du jeu télévisé "Who Wants To Be A Millionnaire" pour se rendre jusqu'à la question finale et avoir la chance de remporter la somme de 20 millions de roupies (la même devise que dans Zelda ?). Selon le convertisseur de devises xe.com, ce serait l'équivalent à 500000$ canadiens.
Jamal, le héros de l'histoire, connaît la réponse à chaque question (ou presque, puisqu'il peut utiliser ses jokers : appel à un ami, 50/50 et avis du public) et chacune est racontée sous forme de flashback sur des événements, souvent durs et atroces, qui ont marqué sa vie (ça me rappelle vaguement certains passages de Cidade de Deus).
Certains l'accusent de tricher (l'animateur de l'émission tente même de lui glisser une réponse pendant une pause) et il est amené au commisariat de police pour être interrogé. C'est entre autre dans ce contexte qu'il doit expliquer au chef de police comment il a su les réponses et prouver qu'il ne triche pas.
Il retourne ensuite en studio pour répondre à la question finale à 20 millions de roupies : "Quel est le nom du troisième mousquetaire dans le roman d'Alexandre Dumas ?". Et cette fois-ci, il ne connaît définitivement pas la réponse. Vous comprendrez pourquoi en regardant le film.
Je me relis et je trouve que j'en dis beaucoup et loin de moi l'idée de vous dévoiler tous les punchs. De toute façon, le film est très riche, divertissant et assure un dépaysement culturel (même s'il y a plusieurs références à la culture occidentale) qui constitue une initiation aux films de Bollywood (croyez-le ou non, j'ai même réussi à trouver une copie de Pennin Manathai Thottu qui contient la pièce Kalluri Vaanil). D'ailleurs, je ne vous cacherai pas qu'il y a un happy ending qui met en place le nécessaire pour entreprendre une chorégraphie de danse typique, juste pour nous donner satisfaction. On ne peut s'empêcher de sourire.
En conclusion, un excellent film qui, même s'il se dessine sur une trame d'histoire d'amour, plaira autant aux gars qu'aux filles, mais pour des raisons différentes. D'ailleurs messieurs, admirez la beauté de Freida Pinto, récemment classée 50ème beauté dans le palmarès Top 99 Women of 2010 de AskMen. J'ai piqué votre curiosité ?
Je tiens à dire que je ne suis pas vraiment amateur de danse, sauf quand il ne se prennent pas au sérieux. La preuve, appréciez la performance des célèbres prisonniers philippins du CPDRC (Cebu Provincial Detention and Rehabilitation Center), ceux-là même qui nous ont donné Thriller, qui exécutent la chorégraphie de Jai Ho.
Raccourci pour basculer entre les fenêtres et le bureau
J'utilise Windows depuis des années et à force de travailler avec ce système d'exploitation, on finit par connaître différents trucs et des raccourcis qui facilitent la navigation dans l'environnement de travail. Par exemple, un raccourci de base est celui pour basculer entre les fenêtres ouvertes et le bureau, c'est-à-dire pour réduire d'un seul coup toutes les fenêtres ouvertes afin de voir le bureau et les icônes qu'on y a placé.
Sur Windows, il s'agit de la combinaison des touches Windows+D (D pour Desktop).
Dans le but de mieux maîtriser l'environnement Linux que je tente de me familiariser peu à peu, je me demandais quel était l'équivalent. Sur GNOME et Ubuntu, c'est aussi simple que CTRL+ALT+D.
Effectuer la combinaison une seconde fois ramenera les fenêtres dans leur état initial.
La nuit dernière, j'avais le sommeil léger et j'ai commencé à lire pour me fatiguer un peu. C'est là que j'ai vu l'opportunité de réaliser un autre type de projet web : rédiger un blogue dont vous êtes le héros. Le concept n'est pas révolutionnaire mais l'idée de construire un récit fictif collectif, un paragraphe à la fois, en créant plusieurs branches de possibilités me plait beaucoup.
Je ne sais pas exactement quelle forme ça pourrait prendre ni quel sujet serait abordé mais j'avais pensé peut-être utiliser une thématique à la Dilbert, avec des situations en milieu de travail dans le domaine informatique (pour rester dans le cadre du contenu de Code 18. Cela dit, peut-être avez-vous d'autres idées à proposer ?). Enfin, je serais curieux de mettre ça à l'essai et de voir dans quelle direction elle évoluera.
En fait, j'ai eu l'idée en parcourant les livres de ma bibliothèque quand j'ai retrouvé un livre-jeu que j'avais lu étant enfant : Le Labyrinthe de la mort de Ian Livingstone (paru en 1984 !) :
Conçu par l'esprit diabolique du baron Sukumvit, le Labyrinthe de la Mort est truffé de pièges mortels et peuplé de monstres assoiffés de sang. D'innombrables aventuriers ont tenté avant vous de relever le défi de l'Epreuve des Champions. Ils ont franchi l'entrée du Labyrinthe et n'ont plus jamais reparu. Et VOUS, oserez-vous y entrer ? Vous serez l'un des six combattants sélectionnés cette année pour affronter les périls du Labyrinthe. Un seul d'entre vous gagnera peut-être, et les autres succomberont. Qui sera cet éventuel vainqueur ?
Deux dés, un crayon et une gomme sont les seuls accessoires dont vous aurez besoin pour vivre cette aventure. VOUS seul déciderez de la route à suivre, des risques à courir et des créatures à combattre. Bonne chance...
Folio Junior - Défis Fantastiques/6. ISBN : 2-07-033272-1
La fiche sur les livres-jeux de Wikipedia indique : "... des raretés ardemment recherchées par les collectionneurs, et atteignent souvent des prix très élevés sur les sites de vente en ligne comme eBay."
Pas de chance, le seul bouquin "dont vous êtes le héros" que je possède ne semble pas être en très grande demande, le prix de vente variant entre 2 et 3$. Probablement parce qu'il s'agit d'un best-seller.
Évidemment, dans une version web, j'exclurais l'utilisations du crayon et des dés pour conserver une approche simpliste :
- Un texte court décrivant la situation initiale
- Une intrigue
- Dialogue
- De l'action
- Un choix à faire
Finalement, j'ai aussi vérifié s'il y avait des initiatives connexes sur le web et j'ai trouvé le Blog dont vous êtes le héros point com qui utilise une approche différente de celle que je préconisais pour les décisions à prendre. L'utilisation des hyperliens devrait rendre possible l'éclatement de l'histoire en différentes alternatives pour pouvoir la construire sur mesure pour chaque lecteur.
Un ami, enseignant à l'EBSI1, grand fan de tout ce qui est Apple, m'a fait remarquer il y a quelques semaines ce billet intitulé Apple’s Pastry Kit | iPhone Javascript Toolkit qui permet de simuler le comportement du iPhone.
Pour explorer les possibilités de développement dans Safari, il faut préalablement cliquer sur le bouton de configuration (icône d'engrenage en haut à droite), choisir Preferences et se rendre à l'onglet Advanced. Cochez la case Show Develop Menu in menu bar.
Une fois que c'est fait, on peut cliquer sur le bouton à côté de l'engrenage, celui qui montre un menu pour la page courante. Le menu Develop apparaît et il permet de changer le User Agent pour Mobile Safari 1.3.2 iPhone.
Ensuite, rendez-vous à la page : http://help.apple.com/iphone/3/mobile/. On voit le menu typique du iPhone, avec les effets de glissement lorsqu'on sélectionne différents éléments et qu'on navigue dans les menus.
Est-ce que cette librairie est utilisable que sur Safari ou est-ce que si je "spoof" le user agent dans Firefox, je verrai le même résultat ?
Pour le tester, je me suis rendu sur whatsmyuseragent.com à partir de Safari (mobile) pour faire afficher le user agent exact que le fureteur transmet.
Mozilla/5.0 (Windows; U; Windows NT 5.1; en-US) AppleWebKit/531.21.8 (KHTML, like Gecko) Version/4.0.4 Safari/531.21.10
Et je tente de le reproduire dans Firefox avec l'extension User Agent Switcher. En simulant le user agent du iPhone 3.x avec Firefox, une alerte popup JavaScript indique : not supported. Il indique aussi qu'on doit accepter d'enregistrer des éléments offline pour que ça fonctionne. Donc probablement compatible qu'avec Safari.
À première vue, la librairie semble intéressante pour l'iPhone mais comme je n'ai pas l'intention de m'attaquer sérieusement au développement sur ce type d'appareil, je rangerai ce toolkit au rayon des curiosités.
1 Je m'abstiendrai de le nommer et je me contenterai de dire que j'ai fait le pari avec lui qu'il n'oserait pas relever le défi de citer ce blogue dans le cadre de son cours. S'il le fait, ce sera probablement en me mentionnant dans la catégorie "exemples à ne pas suivre". Si vous êtes un de ses étudiants et qu'il ose en parler, faites-moi signe !
Pourquoi mon site est-il lent à charger ? YSlow (à l'anglaise "Why Slow"), un petit composant proposé par Yahoo!, peut vous donner d'excellentes pistes de solutions. C'est d'ailleurs le but de cette extension Firefox : analyser votre code et proposer des suggestions d'optimisation.
Installé à même un onglet additionnel de Firebug, il scrute la page web courante et propose des recommandations sur différents volets :
- Contenu
- Cookie
- CSS
- Images
- JavaScript
- Serveur
Pour chaque test, un grade de A à F est attribué, A étant la meilleure note. Ensuite, un score global est décerné, dans mon cas : Grade E (et F en mode classique!). Honnêtement, ce n'est vraiment pas très bon. 75 requêtes HTTP et 218 Kb chargés en page d'accueil dont la moitié en JavaScript...
Mais c'est aussi dû au fait que j'utilise le service Blogspot et que je n'ai pas le contrôle total sur mon environnement, donc limité dans les optimisations que je peux appliquer. Je suis obligé de lier plusieurs JavaScript externes pour pouvoir faire apparaître les exemples de code source avec SyntaxHighlighter (hébergés sur GoogleCode.com). YSlow me suggère de compresser ("minify") les JavaScript et les CSS (par exemple avec YUI Compressor), d'utiliser la compression HTTP avec gzip et si possible de placer tout le code JavaScript au bas de la page. Enfin, les pires notes sont attribuées à la compression et au nombre de requêtes HTTP à minimiser.
Le pire, c'est que ce sont pour la plupart des sujets que j'ai déjà abordé ici mais que je ne peux même pas mettre en application sur mon propre blogue !
En guise de consolation, voyons quelques scores sur les pages d'accueil de sites que je visite souvent :
- Google : A
- Twitter : B
- Amazon.ca : B
- eBay : B
- Digg : D
- Failblog : D
- Cyberpresse : E
Ce que j'aime de YSlow, c'est qu'il intègre des explications sur les recommandations et on suggère des textes connexes pour apprendre à corriger le point. Des outils sont aussi suggérés comme Smush.it pour l'optimisation des images et JSLint pour vérifier la qualité du code JavaScript (écrit par Douglas Crockford, architecte JavaScript chez Yahoo! et auteur du livre JavaScript, The Good Parts).
Pour les professionnels du web, à installer sans plus attendre.
Hier soir, j'ai commencé à lire Un combat et autres récits de Patrick Süskind. Parmi les 4 histoires qui traitent de profondeur, la principale, Un combat, raconte une partie d'échecs où un vieil homme, un joueur invaincu, fait face à un jeune mystérieux qui multiplie les coups audacieux pour tenter de le vaincre, sous les regards d'une foule qui n'attend que ça...
Comme je ne suis pas un joueur d'échecs, je me suis posé la question : pourquoi dit-on "échec et mat" à la fin de la partie ? Ça me semblait évident que c'était pour annoncer l'issue du match, mais d'où vient cette expression ?
J'ai trouvé la réponse dans un extrait du livre Le pourquoi des choses, origine des mots, expressions et usages curieux d'Anne Pouget (pages 86-87) :
L'éthymologie du nom donné au jeu d'échecs nous conduit à schah renji, qui en persan signifie "détresse du roi". Par les arcanes de transcriptions schah est devenu scacco en italien, "échec" en français; mat (de l'arabe mata, "tuer") désigne la mort : ainsi, scacco mato ("le roi est tué") nous a laissé "échec et mat".
Curieusement, Google Translate traduit le terme "scacco mato" en "vérifiez le format". Le vrai terme italien serait plutôt "scacco matto" avec deux t (ce qui donne "checkmate" en anglais, une consonance plus proche de notre "échec et mat").
Depuis ma mésaventure de vendredi (virus + master boot record écrasé), j'ai eu le plaisir de devoir faire un nettoyage de mon PC et d'essayer différentes tentatives pour restaurer le MBR en dual boot Ubuntu / Windows XP.
Dans l'article d'hier, j'expliquais comment j'avais réussi à restaurer le MBR mais pour Windows seulement. Mon installation Linux n'était plus reconnue au démarrage de l'ordinateur car GRUB (multiboot) avait été effacé. Au moins, j'avais la certitude de pouvoir faire des backups avant que la situation s'aggrave.
Ce matin, je voulais clore le sujet et expliquer les démarches que j'ai suivi pour restaurer mon système proprement. Je voulais surtout éviter d'avoir à tout réinstaller à neuf.
Au départ, je me suis mis à chercher une solution pour tenter de réinitialiser GRUB. Je me disais qu'avec le CD d'installation d'Ubuntu, il y aurait sans doute une façon de le remettre en fonction. J'ai chargé le CD d'Ubuntu 9.10 et j'ai consulté l'aide (F1) dans les options de l'écran d'accueil. Il était mentionné que le disque ne contenait pas d'option de "rescue" et qu'il fallait s'en remettre à l'aide en ligne.
Sur certains forums de discussion, quelques personnes prétendaient qu'ils avaient restauré GRUB en utilisant la procédure d'installation normale et qu'à l'étape "Disk partition", ils pouvaient réinitialiser le multiboot sans avoir à formater les partitions. J'étais sceptique à m'aventurer là-dedans et je me suis pas certain que ça s'appliquait aux versions récentes d'Ubuntu.
Pourtant, c'est sur le site d'entraide de la communauté Ubuntu que j'ai trouvé la solution pour restaurer le MBR avec GRUB à partir du CD d'installation (anglais seulement). Pour moi, c'était ma première expérience avec ce type de manipulation et je dois dire que je ne me sentais pas très à l'aise, de peur d'envenimer la situation. Heureusement, ça s'est bien passé. J'ai pris le risque de le faire mais je vous recommanderais d'effectuer vos sauvegardes avant et de prendre bien soin de suivre les directives de l'article à la lettre. Je ne veux surtout pas être tenu pour responsable si vous faites une gaffe :-)
Voici un court résumé des étapes à suivre en français (l'article en anglais contient des explications plus poussées) :
- Mon système Linux est Ubuntu, installé à partir du CD 9.04 et j'ai appliqué la mise à jour pour 9.10. Même avec cette mise à jour, la version de Grub n'est pas Grub2. Il faut donc utiliser le CD d'installation d'Ubuntu 9.04 et pas celui de 9.10.
- Lancer Ubuntu live à partir du CD (le mode pour tester, sans installation).
- Ouvrir un terminal.
- Entrer sudo -i pour travailler en tant que root et éviter d'utiliser le préfixe sudo à chaque commande.
- Entrer fdisk -i pour lister les partitions sur le disque. Dans mon cas, j'ai deux partitions Windows, une Linux et une swap. Ma partition du OS Linux est /dev/sda6. Notez votre propre partition pour la suite des commandes.
- Créer un point de montage pour la partition : mkdir /media/root
- Monter la partition : mount /dev/sda6 /media/root
- Réinstaller GRUB (sur le disque sda) :
sudo grub-install --root-directory=/media/root /dev/sda - Redémarrer l'ordinateur.
Sous Prototype (JavaScript), j'aimais bien la fonctionnalité de créer des éléments du DOM par programmation. Pour le faire, on doit utiliser l'objet Element :
document.observe('dom:loaded', onLoad);La nouvelle version 1.4 de jQuery est sortie cette semaine et la librairie offre maintenant un moyen convivial de faire l'équivalent :
function onLoad(){
var link = new Element('a', {
id: 'c18_link',
href: 'http://code18.blogspot.com',
title: 'Code 18',
ref : 'external'
}).update('Blogue de Code 18');
// ajouter à l'intérieur d'un div défini
$('divMain').insert(link);
}
$(document).ready(function(){Dans les deux cas le résultat généré sera :
var link = $('<a>', {
id: 'c18_link',
href: 'http://code18.blogspot.com',
title: 'Code 18',
rel: 'external',
text: 'Blogue de Code 18'
});
$('#divMain').html(link);
});
<a id="c18_link" href="http://code18.blogspot.com/" title="Code 18" rel="external">Blogue de Code 18</a>Notez la différence sur la façon d'initialiser le libellé du lien (entre les balises <a></a>).
Et comme les appels aux fonctions de jQuery sont enchainables une après l'autre, on peut du même coup passer des attributs CSS :
$('#divMain').html(link).css(Bref, des améliorations très intéressantes du côté de jQuery.
{
'font-weight':'bold',
'font-size':'22px'
}
);
Très tard hier, après avoir retiré le trojan Internet Security 2010, j'ai dû me battre avec un autre problème. J'ai procédé à plusieurs manipulations pour analyser et fixer le système, dont scanner la totalité des partitions avec l'anti-virus AVG. Aussi, sur chaque profil utilisateur, Malwarebytes Anti-malware trouvait de nouvelles infections dont un exécutable qui n'était pas apparu au premier tour.
Après avoir retiré cet exécutable, mon système a commencé à devenir instable. À chaque redémarrage, Windows XP gelait quelques minutes après l'authentification et un long bip système se faisait entendre. Tellement que la seule solution pour sortir de ce merdier était d'éteindre manuellement la tour de l'ordinateur et le repartir à nouveau.
Jusqu'à ce qu'il ne reconnaisse plus le disque dur me donnant accès en dual boot à Windows et Ubuntu. Le Master Boot Record semblait endommagé. De mon portable, j'ai lu qu'on pouvait utiliser le programme fixmbr.exe à condition de booter avec le CD d'installation en mode Recovery. Après avoir choisit le répertoire de Windows (C:\Windows\) et entré le mot de passe Administrateur, un prompt apparaît. On se retrouve sur C: et on peut naviguer entre les partitions du disque dur. Maintenant que fixmbr est disponible, je tente l'exécution : un message me confirme que le MBR a été remplacé avec succès (sinon, si j'avais eu l'accès, j'aurais pu probablement essayer la commande fdisk /mbr).
Je redémarre le PC et une fois le BIOS chargé, plus rien ne se passe, l'écran reste noir. Je souhaite seulement être capable de récupérer mes données pour un backup, quitte à tout formatter et à prendre la décision d'installer définitivement Linux comme système d'exploitation exclusif sur mon poste de travail (avec Windows en VM). Ce qui risque d'arriver dans un avenir rapproché.
À ce stade-ci, tout ce que je peux faire est de booter à partir d'un CD. Pour fixer les partitions, j'avais déjà utilisé une vieille version du logiciel Partition Magic que je conservais sur deux disquettes. Mais voilà, ça fait des lunes que je n'ai plus de lecteur... Il m'est venu l'idée d'utiliser un CD d'Ubuntu et sans l'installer, démarrer l'OS à partir du CD. Juste pour voir s'il est capable de reconnaître mes partitions Windows. Si c'est le cas, je pourrais faire ma sauvegarde et faire un grand nettoyage ou repartir à neuf. À mon grand soulagement, il les reconnaît. Ce qui confirme que le MBR est altéré et que les partititons ne sont pas corrompues.
Il me vient ensuite l'idée qu'avec Ubuntu Live, j'ai accès à GParted, l'éditeur de partitions de Gnome. J'ouvre son interface graphique et je vois bien toutes mes partitions Linux et Windows. Dans la colonne Flags, j'aperçois l'inscription "boot" à côté de la mauvaise partition Windows. Je le déplace pour mettre le flag sur la partition primaire et je redémarre le tout.
Windows est ramené à la vie comme par magie, tout ça grâce à Linux. Mais pour l'instant, j'ai perdu le dual boot avec Ubuntu. Je jeterai un oeil à Grub pour voir comment le restaurer.
En revenant du boulot, j'avais l'intention de parler de jQuery 1.4 mais ça devra attendre à demain. Dès mon arrivée chez moi, ma blonde m'informe que l'ordinateur semble être aux prises d'un virus car Windows a un comportement étrange. Je lui réponds la blague classique que non, c'est tout à fait normal mais une fois devant l'écran, je vois bien que ça a dégénéré :
- un nouveau programme s'est installé et il affiche un interface qui analyse l'ordinateur pour trouver des menaces : Internet Security 2010
- le logiciel m'informe qu'il a trouvé 25 menaces dans l'ordinateur
- des popup d'avertissement s'affiche constamment m'informant que des virus sont détectés et que je dois payer le logiciel pour pouvoir faire du nettoyage
- le même logiciel m'indique qu'une adresse IP tente de pénétrer dans mon ordinateur. Une fois le câble réseau déconnecté, le popup persiste en m'affichant des adresses IP différentes
- impossible de faire CTRL+ALT+DEL pour accéder au Task Manager
- impossible de tuer le processus
- impossible de supprimer l'exécutable dans
C:\Program Files\InternetSecurity2010 car il est en cours d'utilisation - mon fond d'écran a été remplacé par une page HTML sur fond bleu avec un encadré noir indiquant :
CRITICAL WARNING!
YOUR SYSTEM IS INFECTED!
System has been stopped due to a serious malfunction. Spyware activity has been detected.
It is recommeded to use spyware removal tool to prevent data loss. Do not use the computer before all spyware removed.
J'ai donc pris mon ordinateur portable, je me suis connecté au web par wifi et je suis allé fouiller au sujet du programme Internet Security 2010. Mon intuition était bonne : il s'agit bien d'un virus caché sous une interface qui imite un logiciel anti-virus.
À partir du portable, j'ai téléchargé deux programmes :
- La version gratuite de Malwarebytes Anti-malware pour retirer toute trace du virus sur le poste
- CCleaner (gratuit), pour nettoyer les fichiers temporaires, la base de registres, cookies, etc)
Il ne restait que l'alerte en fond d'écran. J'ai cherché dans les répertoires systèmes le fichier wallpaper.html et je l'ai supprimé. Juste avant, je l'ai ouvert avec NotePad++ pour examiner son contenu : du code JavaScript obfusqué en hexadécimal imprimé avec des instructions document.write(). Il va falloir que je convertisse son contenu pour voir ce qui s'y cache (qui sait, peut-être une fonction eval() ?).
Syntaxe particulière des appels de fonctions JavaScript
Tout comme moi, vous avez peut-être déjà remarqué la syntaxe JavaScript suivante où la définition de la fonction est elle-même suivie de parenthèses :
var object = function(){}();Peut-être que vous ne vous êtes pas posé la question à savoir ce qu'elles faisaient là ? Peut-être êtes-vous curieux de le savoir ? En fait, je l'ignorais jusqu'à ce que je commence à faire la lecture du code de jQuery et Prototype pour comprendre le fonctionnement interne et apprendre quelques trucs sur le tas (ne m'en voulez pas, je suis surtout spécialisé dans le back-end (server-side) des applications web).
Ouvrez le code source et remarquez la syntaxe de ces librairies.
var object = function(){Pour constater ce qui se passe, on voit qu'il y a une variable obj et qu'on lui assigne le résultat d'une fonction. La variable ne contiendra pas le corps de la fonction anonyme mais bien ce que la fonction retourne. Les parenthèses à la fin indiquent à l'engin JavaScript qu'il doit exécuter immédiatement la fonction dès qu'elle est interprétée.
// code
}();
var result = function(){Qui est équivalent à la forme alternative :
return 'Hello World';
}();
// Hello World
alert(result);
var fct = function(){Remarquez dans l'exemple précédent que la fonction n'est pas suivie par (), ce qui veut dire qu'elle n'est pas exécutée. Le corps de la fonction se trouve dans la variable fct qu'on peut ensuite l'appeler avec fct().
return 'Hello World';
};
alert(fct());
L'autre particularité qu'il faut retenir est qu'en utilisant la première forme avec les parenthèses, il est possible de passer un argument, ce qui explique bien des choses dans le fonctionnement de jQuery (...(window);) et Prototype (...(Element.Methods);).
var result = function(text){En passant, la librairie jQuery 1.4 est officiellement sortie aujourd'hui.
return text;
}('Hello World');
alert(result);
Changement non permis dans SQL Server Management Studio
Suite à une migration récente sur SQL Server 2008, j'ai eu à me familiariser un peu avec mon nouvel environnement, Microsoft SQL Server Management Studio.
Un des comportements par défaut que je ne me souviens pas avoir vu sous le client de la version 2000 est relié à l'édition d'une table en mode Designer. Pour modifier la longueur d'un champ varchar(50) et le redimensionner à varchar(100), une boîte d'alerte s'affiche au moment de l'enregistrement :
Saving changes is not permitted. The changes you have made require the following tables to be dropped and re-created. You have either made changes to a table that can't be re-created or enabled the option Prevent saving changes that require the table to be recreated.D'abord, je ne vois pas pourquoi il voudrait recréer la table au complet alors qu'il s'agit d'un changement mineur et qu'un simple ALTER COLUMN aurait pu faire l'affaire. Mais c'est bien gentil de sa part de m'indiquer qu'il faut modifier l'option pour pouvoir exécuter cette opération.
Pour ne plus voir cet avertissement apparaître, il suffit d'aller dans le menu Tools / Options / Designers. Dans le panneau principal, décocher la case "Prevent saving changes that require table re-creation".
Sinon, pour faire simple, on peut toujours le faire par requête DDL (Data Definition Language) :
ALTER TABLE tablename ALTER COLUMN fieldname VARCHAR(100)
Juste pour valider si Enterprise Manager (le client de MSSQL 2000) avait une option semblable, je me suis connecté au travail par VPN. Et je confirme que je n'en ai pas trouvé.
Un de mes collègues de travail, sachant à quel point j'ai aimé le jeu de soccer Winning Eleven, est venu me voir à mon bureau avec son iPhone pour me montrer un jeu qui me captiverait : X2 Soccer 2009. Et mieux encore, il ne coûte que 0,99$.
À ce prix, on l'achète sans se poser de question. Et si on n'est pas tout à fait certain de vouloir y investir un dollar, on peut toujours se rabattre sur la version gratuite X2 Soccer 2009 Lite qui offre un entraînement et les tirs de pénalité.
Après quelques minutes seulement, j'ai été étonné de voir à quel point le gameplay est bon. Les contrôles (manette) sont discrètement placés sur l'écran touchscreen et le joystick peut se déplacer sur demande pour ne pas que nos doigts cachent l'action du jeu. Les boutons sont fixes et se trouvent dans le coin inférieur droit.
Quant aux graphiques, ils sont d'une bonne qualité pour un jeu de ce type.
Essayez-le, vous ne le regretterez pas.
Comme je n'avais plus iTunes d'installé, j'ai dû le télécharger à nouveau et récupérer mon compte iTunes Store. J'ai été déçu de voir que lorsque j'ai synchronisé le jeu sur mon appareil, il a supprimé mes applications installées depuis que j'ai hijacké mon iPod touch. Au moins, j'ai pu récupérer mes contacts qui étaient dans mon appareil. Il a fallu aussi que j'autorise à nouveau mon ordinateur pour accéder à mon iPod. iTunes m'a informé que j'avais autorisé jusqu'à maintenant 3 ordinateurs sur une possibilité de 5. Probablement celui à la maison, au travail et chez un ami.
Qu'est-ce qu'on fait quand on a atteint la limite ? Heureusement, j'ai trouvé cette solution qui permet de réinitialiser les autorisations sur un iPod (anglais).
À Noël, j'ai reçu une carte-cadeau pour magasiner à la librairie Renaud-Bray. Merci à mes beaux-parents. Avant de me rendre en magasin, j'ai exploré les différentes sections du site pour avoir un avant-goût de ce que je pourrais me procurer. Et c'est en copiant les titres qui m'intéressaient que j'ai eu l'idée du sujet d'aujourd'hui.
En effectuant quelques opérations copier/coller, je me suis aperçu que, contrairement à ce que je voyais à l'écran, le nom des auteurs semblaient tous stockés en minuscules dans la base de données. J'ai pu le confirmer en jetant un aperçu au code source.
Or, chaque mot apparaît pourtant avec une première lettre capitale. Côté serveur, par exemple en PHP, cette transformation aurait pu être effectuée à l'aide d'une fonction comme ucwords() ou ucfirst(). Mais côté client, cette transformation de texte est rendue possible grâce au CSS.
Par exemple, avec le HTML suivant :
<span class="author">louis gauthier</span>Et les classes CSS ci-dessous :
<span class="title">les aventures de sivis pacem et de para bellum</span>
<style type="text/css">Il suffit d'appliquer la propriété text-transform avec la valeur capitalize pour que le texte se change à l'écran pour passer de :
.author, .title{
text-transform: capitalize;
}
</style>
louis gauthier
les aventures de sivis pacem et de para bellum
À :
Louis Gauthier
Les Aventures De Sivis Pacem Et De Para Bellum
Côté pratique, notez qu'il existe aussi lowercase et uppercase. Reste que je privilégie quand même la méthode server-side à celle-ci mais ça peut être un bon réflexe de se rappeler de son existance lorsqu'on doit souvent mâcher les données (offre plus de flexibilité).
Il y a une chose que j'ai de la difficulté à me faire entrer dans la tête avec SQL Server et que je me fais prendre pratiquement à chaque fois, c'est la recompilation des vues (views).
Dès que j'ai commencé à travailler avec SQL Server 2000 et MSDE, j'avais tendance à construire des vues avec des SELECT *. Ça n'a pas pris de temps pour me rendre compte que c'était une mauvaise pratique.
Au début, tout semble aller pour le mieux. La paresse nous fait éviter d'avoir à nommer tous les champs et cette mince économie de temps nous rattrape tôt ou tard. Dès qu'on ajoute un champ dans une table utilisée par la vue, les problèmes appparaissent : le champ n'est pas pris en compte dans la vue, les champs peuvent être décalés dans la structure de la vue (le champ nommé possède la valeur du champ voisin), etc.
Jusqu'à ce qu'une lumière s'allume dans notre tête : il fallait recompiler la vue pour que le SELECT * s'ajuste et que tout se replace correctement. Et ceci doit se faire manuellement, donc il faut y penser à chaque fois.
Récemment, suite à une migration sur un serveur MSSQL 2008, j'ai rencontré le problème avec le code d'un vieux projet. Avec Enterprise Manager, l'éditeur laissait la flexibilité d'utiliser l'astérisque pour récupérer tous les champs. Une fois la base de données restaurée sous 2008, la définition de la vue semble conserver le *. Mais au moment de l'édition d'une vue par le mode design, Management Studio (2008) remplace automatiquement le * en nommant explicitement l'ensemble des champs trouvés dans la table référencée par SELECT *, ce qui permet d'éviter l'erreur.
Sur le même sujet, il y a un outil que j'utilise régulièrement pour synchroniser les changements entre deux bases de données (mises à jour) et qui est suffisamment évolué pour recompiler les vues automatiquement dans le script généré : RedGate SQL Compare. En quelques étapes simples, ce logiciel s'assure de générer le script correctement pour recompiler explicitement les vues touchées par les changements dans les tables. Pour le prix, je ne m'en passerais pas.
J'aime bien ce montage musical en stop-motion du norvégien Lasse Gjertsen.
Dire que ce curieux personnage ne sait ni jouer de la batterie ni du piano. L'effet est tout à fait remarquable.
Profitez-en pour découvrir ses autres vidéos artistiques sur son canal YouTube lassegg.
Parmi les questions d'entrevue de Google, il y en a une qui demande d'expliquer la signification du terme "deadbeef".
Il faut remonter creux dans la culture informatique pour être en mesure de fournir une réponse adéquate. Si le mode binaire utilise une base 2 (deux états : 0 et 1), que le système décimal compte 10 états (la base 10 comprend les chiffres de 0 à 9) et que le système hexadécimal est sur une base 16, les 16 états seront exprimés en utilisant les caractères 0123456789ABCDEF.
En utilisant ce jeu de caractères, on peut composer des mots à la mode du Hexspeak. Ceux-ci seront ensuite utilisés comme chiffre magique par les programmeurs pour identifier clairement la mémoire ou les données. Ici, deadbeef fait référence au code 0xDEADBEEF comme valeur de débogage sur les systèmes IBM RS/6000, les processeurs PowerPC / Mac OS 32-bits et le Commodore Amiga (Wikipedia).
Un autre exemple de hexspeak se trouve dans include/linux/reboot.h du code source Linux :
#ifndef _LINUX_REBOOT_H
#define _LINUX_REBOOT_H
/*
* Magic values required to use _reboot() system call.
*/
#define LINUX_REBOOT_MAGIC1 0xfee1dead
#define LINUX_REBOOT_MAGIC2 672274793
#define LINUX_REBOOT_MAGIC2A 85072278
#define LINUX_REBOOT_MAGIC2B 369367448
#define LINUX_REBOOT_MAGIC2C 537993216
...
Comme référence populaire, on pourrait simplement dire que ça ressemble à écrire des mots sur un écran de calculatrice en utilisant les chiffres. En la retournant à l'envers, on verra un mot apparaître. Par exemple, 713705 représente le mot SOLEIL une fois pivotée.
Disons que le hexspeak est une version geek réservée aux programmeurs.
J'ai commencé à lire le livre Coders at Work et dans l'entretien avec Brad Fitzpatrick (Google, LiveJournal), il énonce une question qui lui a été posée lors de son entrevue pour un poste chez Google. Elle va comme suit :
Imagine you have a bunch of computers on a switch and they turn on the whole rack; come up with an algorithm so every machine on the rack knows the status of all the other ones about whether they're on or off.C'est une bonne question à laquelle je n'aurai pas su quoi répondre (tout le côté réseautique m'intéresse mais c'est probablement ma plus grande faiblesse).
So basically a presence thing. That was pretty much the constraint. Basically, they described Ethernet [...].
Pour ma curiosité, j'ai cherché d'autres questions sur le web. J'ai trouvé celles-ci, inspirées des questions originales de Google mais suffisamment modifiées pour respecter l'entente de confidentialité.
J'ai aussi déniché un article sur Business Insider intitulé 15 Google Interview Questions That Will Make You Feel Stupid. Quelques exemples de questions curieuses posées aux candidats aux postes de directeur de produit et aux ingénieurs logiciel :
- Combien de balles de golf peut-on placer dans un autobus scolaire ?
- Combien est-ce que tu chargerais pour laver toutes les vitres de Seattle ?
- Pourquoi le couvercle d'un regard (manhole) est-il rond ?
- Expliquez la signification de "dead beef".
Voici un petit bout de code que j'ai écrit ce matin pour inspecter les fonctions internes de jQuery. La raison d'être de ce script était bien simple : un brin de paresse dû au retour des vacances du temps des fêtes.
En fait, je voulais enrichir jQuery d'une nouvelle fonctionnalité et comme le nom que je m'apprêtais à utiliser aurait pu potentiellement faire parti du noyau, je voulais m'assurer qu'il n'était pas utilisé.
J'aurais pu consulter la documentation et passer les fonctions une à une mais il était plus simple de le faire avec un script. Pour obtenir la liste de toutes les fonctions internes de jQuery 1.3.2 :
$j(document).ready(listFunctions);Ou pour faciliter la consultation, en créant une liste triée par ordre alphabétique :
function listFunctions(){
jQuery.fn.each(
function(i){
console.log(i);
}
);
}
var aList = Array();La dernière ligne imprimera le tableau trié dans Firebug :
$j(document).ready(listFunctions);
function listFunctions(){
jQuery.fn.each(
function(i){
aList.push(i);
}
);
console.log(aList.sort());
}
Finalement, pourquoi est-ce qu'on n'utiliserait pas une variante du script pour faire de l'introspection sur d'autres plugins jQuery ?
Très récemment, vous avez probablement découvert la console Père Noël portable qui s'adressait principalement aux enfants. Un montage vidéo permettait au Père Noël de diffuser un message personnalisé à l'enfant sage (et parfois à l'adulte qui l'est moins) en intégrant son nom, sa photo, le cadeau désiré, etc, dans le clip vidéo.
Ce moyen de communication a connu un succès considérable et a peut-être remplacé la fameuse lettre écrite envoyée au code postal H0H 0H0 (théoriquement, ça serait un code situé quelque part à Montréal).
Dans le même genre, mais s'adressant uniquement aux adultes (on comprendra pourquoi), il existe le site Je tue un ami, créé par la chaîne française 13ème rue (Universal Studios).
On choisit un ami, on inscrit son nom et on télécharge sa photo. Il est possible d'engager un des 5 tueurs à gages possédant chacun sa propre habileté.
Après quelques étapes simples à suivre, le vidéo est prêt. Notre "ami" (si on peut l'appeler ainsi) sera intégré dans la production et vous pourrez admirer le travail. Et surtout envoyer le lien à vos vrais amis.
Tel qu'indiqué sur le site, c'est un divertissement à prendre avec un grain de sel. Mais avec une idée aussi virale, soyons certains qu'ils vont faire parler d'eux.
Et vous, êtes-vous pour ou contre ce genre d'initiative ?
Lu sur une affiche dans le métro de Montréal :
Ne pas railler, ne pas déplorer, ne pas maudire, mais comprendre.
L'humoriste français Jean-Yves Lafesse n'est pas très connu au Québec et j'ai eu la chance d'avoir un ami qui me l'a fait découvrir il y a quelques années. Généralement, je ne suis pas très fan des insolences et des canulars téléphoniques mais disons que Lafesse a le don de les réussir particulièrement bien et de me faire rire à chaque fois.
J'ai fait le lien avec Lafesse en regardant une grande entrevue à ArTV avec Yvon Deschamps alors qu'il parlait de sa chanson Les Fesses (reprise par le duo Crampe en Masse et Les Frères Jacques).
Quand Lafesse fait un coup, c'est à se demander comment il trouve ses victimes pour tomber dans le piège aussi facilement. À côté de lui, on relègue aux oubliettes Tex Lecor (quoi que Les Suppositoires reste un classique) et Réal Béland fait piètre figure.
Par exemple, prenez ce sketch sur la maintenance informatique. J'ai peine à croire que la petite dame place tous les fichiers de son poste de travail dans la corbeille et qu'elle s'apprête à la vider à la demande du service de maintenance informatique...
J'adore surtout son sens de la réplique et le petit fou rire qu'il a de temps à autre. Trop absurde.
Dans mes temps libres, je regarde généralement Failblog mais depuis peu, j'ai découvert Epic Win FTW (For The Win).
À titre d'exemple, voyez ce que vous pouvez trouver :
La Mazda 3 devient la 3.141592653589793238462643383. Trop fort!
Et c'est bien parce qu'il n'y avait plus de place pour en placer davantage.
Comme promis, j'ai dit que j'allais expliquer aujourd'hui comment créer une connexion vers PostgreSQL alors que celui-ci roule sur une machine virtuelle VMware Linux.
Petit récapitulatif :
- Mon poste de travail est Windows XP et je simule un environnement de développement avec EasyPHP (Apache/PHP)
- J'ai désinstallé PostgreSQL de Windows et j'ai transféré le tout sur la VM Ubuntu
- Je veux pouvoir faire une connexion au serveur SQL virtualisé à partir de Windows
J'assumerai que les drivers pour PDO et Postgres sont installés. Vous pourrez vous référer à deux autres billets que j'ai écrit précédemment pour mieux comprendre le contexte et le but de ce changement :
- Utiliser une machine virtuelle comme serveur web
- Transférer une base de données PostgreSQL sur un autre serveur
try{L'adresse IP est celle de la machine virtuelle sur mon réseau local. Je l'ai récupérée en exécutant ifconfig dans un terminal sur la machine virtuelle (voir eth0 / inet addr).
# syntaxe : driver/host/port/dbname, username, password
$dbh = new PDO("pgsql:host=192.168.136.134;port=5432;dbname=code18", "infinite", "loop");
echo "Connexion = OK";
}
catch(PDOException $e){
echo $e;
}
Sans n'avoir rien configuré, j'exécute une première fois le script sur mon poste Windows. Il tente de créer une connexion vers la machine virtuelle (évidemment, elle est démarrée). Un premier message d'erreur apparaît :
PDOException' with message 'SQLSTATE[08006] [7] could not connect to server: Connection refused (0x0000274D/10061) Is the server running on host "192.168.136.134" and accepting TCP/IP connections on port 5432?'
J'ai lancé la commande netstat pour voir quels ports étaient sur écoute et le port 5432 l'était (j'ai installé Postgres de façon standard sur la VM, en utilisant apt-get).
netstat -an | greo "LISTEN "
Pour régler ce problème, il faut se rendre dans les fichiers de configuration de Postgres qui se trouvent dans /etc/postgresql/8.3/main/ sous Ubuntu.
Il faut modifier le fichier postgresql.conf.
sudo nano postgresql.conf
Sous l'entête CONNECTIONS AND AUTHENTICATION, trouvez la ligne suivante :
# listen_addresses = 'localhost'
Retirez le dièse (#) et remplacez 'localhost' par '*' :
listen_addresses = '*'
Redémarrer PostgreSQL pour que le changement prenne effet :
sudo /etc/init.d/postgresql-8.3 restart
En réessayant le script à nouveau, un autre message apparaît :
FATAL: no pg_hba.conf entry for host "192.168.136.1", user "infiniteloop", database "code18"
Ah ? Pourquoi l'adresse IP est 192.168.136.1 ? En fait, c'est parce que cette adresse correspond à l'adresse IP du VMware Network Adapter, la connexion réseau créée automatiquement par VMware lorsque la machine virtuelle a été initialisée la première fois. Trouvez la à partir du menu Start / Settings / Network Connections, choisissez le VMware Network Adapter correspondant. L'adresse IP se trouve sous l'onglet Support.
Il faut autoriser cette adresse IP pour que Postgres accepte la connexion. Ceci se fait par le fichier pg_hba.conf qui se trouve dans le même répertoire que postgresql.conf. Pour des raisons de sécurité, il faut indiquer explicitement quel utilisateur peut accéder à quelle base de données, par quelle adresse IP.
sudo nano pg_hba.conf
À la fin du fichier, ajoutez la ligne ci-dessous, suivant votre configuration (vous devriez voir des exemples de configuration du même type ainsi que la configuration par défaut) :
# Dans l'ordre : Type, Database, User, Cidr-Address, Method
# Séparés par des espaces ou une tabulation
host code18 infinite 192.168.136.1 255.255.255.0 md5
Vous devriez normalement remplacer code18 par le nom de votre base de données et l'adresse IP par la vôtre. Il faut aussi inclure le subnet mask (255.255.255.0) après l'adresse IP.
Redémarrez le serveur Postgres (tel que décrit plus haut).
En testant le script à nouveau, on voit que la connection SQL entre la machine physique et la machine virtuelle se fait correctement.
P.s. je viens de me rendre compte que la date et l'heure de publication de ce billet est binaire ! 10-01-01 11:01. Quand je l'ai vu, ça m'a fait sourire :-)
La page d'accueil de Google.com avait la particularité d'afficher un compte à rebours du nombre de secondes avant l'arrivée de l'an 2010 lorsqu'on cliquait sur le bouton "I'm Feeling Lucky" sans inscrire de mot clé. Quelle était pour être la surprise lorsqu'il atteindrait zéro ?
Maintenant qu'on y est, le décompte a été remplacé par un feu d'artifice avec des mentions "Happy New Year" qui apparaîssent à l'écran.
J'avoue que je m'attendais à plus de leur part, quelque chose de plus éclatant, mais bon, ça fait la job. Maintenant que je l'ai souhaité à toute ma famille, j'en profite pour prendre quelques minutes pour souhaiter à tous mes lecteurs une bonne année 2010. Je lève mon verre à votre santé. Cheers!