skip to main | skip to sidebar
Code 18
Manuel du savoir-faire à l'usage des geeks et des curieux
RSS
  • Accueil
  • Le web au Québec
  • Liens
  • Twitter
  • Facebook
  • À propos

dimanche 28 février 2010

Comment dépenser 100$ de vins en 3 minutes

Publié par Infinite Loop, à 12 h 00 2 commentaires

Je lisais l'entrevue de Joe Armstrong (créateur du langage de programmation Erlang) dans le livre Coders at Work et fait inusité, il explique qu'au moment de déboguer les programmes de ses camarades, il exigeait en retour une, deux ou trois bières selon la complexité du problème.

La journée même, j'ai aperçu dans ma boîte de courriel un message provenant de la liste de diffusion de la SAQ (Société des alcools du Québec) pour annoncer une promotion valide uniquement les 26 et 27 février qui donnait droit à 10% de rabais sur tout achat de 100$ et plus. Ça n'en prenait pas plus pour décider que c'était le bon moment de refaire le plein de mon petit cellier et dépenser la carte-cadeau qui traine dans mon porte-feuille depuis des mois (je sais, vous auriez été plus vite que moi).

Comme je suis encore néophyte en matière de vins et que mes papilles prennent plaisir à découvrir des nouvelles saveurs, j'ai donné carte blanche à un conseiller pour me suggérer différents cépages à explorer, pas trop chers pour pouvoir en avoir une variété intéressante à comparer. Une pastille de goût en particulier ? Non merci, surprenez-moi !

Voici ses recommandations :

  • Pinot Noir, Vigneti delle Dolomiti 2008 de Mezzacorona, Italie, 15,70$
  • Shiraz, Spier Stellenbosch 2008, Afrique du sud, 14,95$
  • Cahors, Château de Gaudou 2007, France, 15,15$
  • Merlot-Pinotage, Kumala 2009, Afrique du Sud, 10,95$
  • Tannat, Don Adelio Ariano 2005, Uruguay, 15,45$
  • Malbec, Finca Flichman Mendoza 2009, Argentine, 8,25$
  • Carmenère, PKNT Terraustral 2009, Chili, 11,60$
  • Valpolicella, Classico Superiore 2007 de Zenato, Italie, 16,60$
Montant final après rabais : 97,78$
Et un solde de 2,22$ sur la carte-cadeau.

Que pensez-vous de cette sélection ? Vous auriez proposé autre chose ? Personnellement, j'avais déjà fait l'essai du Cahors et du Valpolicella Zenato et j'en avais gardé un bon souvenir.


Tags: Marché des saveurs

Citation no. 71 sur l'emploi

Publié par Infinite Loop, à 07 h 20 0 commentaire

Un emploi sans description de poste est un très bon emploi. Parce que vous pouvez le définir comme vous le voulez.

- Joe Armstrong, créateur de Erlang


Tags: Citations

samedi 27 février 2010

Comment expliquer REST à sa femme

Publié par Infinite Loop, à 08 h 51 0 commentaire

Ne me demandez pas comment je suis tombé là-dessus1 mais je viens de lire un vieil article vraiment intéressant paru en décembre 2004 sur le site de Ryan Tomayko intitulé : How I Explained REST to My Wife.

Même si le texte a été traduit en une version française, je vous recommande quand même la lecture de la version originale, ne serait-ce que pour les nombreux commentaires au bas de la page.

REST est un acronyme pour Representational State Transfer, défini en 2000 par Roy Fielding dans sa dissertation de doctorat en informatique. Pour le remettre en contexte, M.Fielding a été l'architecte principal du protocole HTTP 1.0 et 1.1 (Hypertext Transfer Protocol), co-auteur des standards Internet pour HTTP et URI (Uniform Resource Identifiers) en plus d'être le fondateur du projet Apache. Un héros obscur du web.

D'ailleurs, son blogue, Untangled, vaut le détour.

1 Un vieux, très vieux bookmark que j'avais conservé pour une lecture ultérieure, retrouvé cette semaine dans mes backups...


Tags: Liens, Programmation

vendredi 26 février 2010

L'informatique, comme la mécanique

Publié par Infinite Loop, à 23 h 30 1 commentaire

Je fais souvent la comparaison que la mécanique automobile possède plusieurs points similaires à l'informatique. Les deux sont techniques, possèdent leur propre langage spécialisé, que si on est peu initié et qu'on fait affaire avec le commerce du coin, il y a de fortes chances pour qu'on se fasse avoir. D'où la nécessité d'avoir des professionnels de confiance dans son entourage pour avoir de bons conseils.

Payeriez-vous quelqu'un pour ajouter du liquide lave-glace dans votre voiture ? Alors pourquoi est-ce qu'il y a des gens qui déboursent 29,99$ pour faire installer un logiciel chez Future Shop avec leur service ConnectPro ? Click, click, suivant, suivant. Terminé. Je me souviens qu'un temps ils chargeaient 25 ou 35$ pour installer de la mémoire vive. C'est tellement ridicule à faire que j'offrais gratuitement le service à mes proches !

Ça me fait penser que chez mon mécanicien, il y a une affiche au mur qui s'appliquerait aussi bien au monde de la programmation. Je crois que ça dit quelque chose qui ressemble à ça :

Ce qui était nécessaire, on l'a fait.
L'impossible, on est en train de le faire.
Pour des miracles, on demande 24 heures.

C'est exactement ce que j'aimerais dire à certains clients et chargés de projet qui font passer toutes les demandes comme urgentes. Voilà, c'est dit.


Tags: Programmation

mercredi 24 février 2010

Propriétaire d'une fonction Postgres

Publié par Infinite Loop, à 17 h 41 0 commentaire

Voilà, la rumeur est confirmée : on change mon vieux disque dur pour un minuscule SSD plus performant. Mon ancien n'était pas encore mort, mais disons que sa vie active tirait à sa fin. Ce qui veut dire que je dois tout réinstaller, sauvegarder mes configurations et préférences : favoris Firefox, comptes FTP de Filezilla, sites de Dreamweaver, etc...

Quand tout a été fait, j'ai reconfiguré mon client PostgreSQL pour poursuivre mon travail sur une application web en cours de développement. Ça n'a pris que quelques minutes pour rencontrer un premier pépin en tentant de modifier une procédure (fonction). J'avais effectué toutes les modifications au corps de la fonction et quand j'ai voulu la sauvegarder, un message est apparu :

ERROR: must be owner of function [ma fonction]

Ce qui veut dire que je ne serais pas en mesure de modifier la fonction car je n'aurais pas les droits ? Hum... Doc de Postgres à la rescousse. Ce que ça dit : lorsqu'on utilise CREATE OR REPLACE FUNCTION, le propriétaire et les permissions ne changent pas. On doit être le propriétaire de la fonction pour pouvoir la remplacer (être membre du rôle propriétaire).

Voyons avec quel utilisateur je suis connecté par le client SQL :

SELECT CURRENT_USER
Aucune surprise ici, c'est ce que j'avais dans ma configuration. Maintenant, voyons voir qui est le propriétaire de la fonction en question :
SELECT p.proname, u.usename
FROM pg_proc as p
INNER JOIN pg_user as u ON p.proowner = u.usesysid
WHERE p.proname = 'nom_de_la_fonction'
Oups, ça me retourne l'utilisateur postgres. J'en conclus que j'avais initialement créé cette fonction avec le mauvais utilisateur et comme je suis présentement connecté avec le compte spécifique au client, je n'ai pas le droit d'appliquer les changements.

Dans l'éditeur, je me suis reconnecté avec l'utilisateur postgres et j'ai pu modifier le owner de la fonction :
ALTER FUNCTION [nom de la fonction] OWNER TO [username]
Ici, c'est important d'inclure la signature exacte car sous Postgres, deux fonctions peuvent coexister avec le même nom mais avec un nombre différents de paramètres.
ALTER FUNCTION ma_fonction(integer) OWNER TO code18;
Ensuite, j'ai pu sans problème modifier la procédure avec le bon usager. Je ne m'étais jamais rendu compte de mon erreur car mes logins étaient conservés depuis des années à même le client SQL.


Tags: PostgreSQL

mardi 23 février 2010

Le Parfum de Süskind - Fin alternative

Publié par Infinite Loop, à 18 h 50 1 commentaire

Ce livre est l'histoire d'un meurtrier fictif du nom de Jean-Baptiste Grenouille, né en France le 17 juillet 1738, dans la puanteur de Paris. Dès sa naissance, il est doté d'un sens de l'odorat très développé, ce qui compense pour tout le reste qu'il ne possède pas.

Grenouille se plait à découvrir les odeurs. Il sait les distinguer de loin et parcourt la ville pour s'enquérir de nouvelles variétés. Jusqu'à ce qu'une commission de son emploi de tanneur le mène dans une parfumerie réputée. C'est l'opportunité pour lui d'en faire sa vocation : apprendre le métier pour mettre son talent à profit.

Il a le don de pouvoir sentir un parfum une fois pour ensuite le reconstituer dans sa tête en assemblant les doses exactes d'ingrédients. Après une démonstration épatante au propriétaire du commerce, on le prend comme apprenti et il réussit à sortir de la faillite le vieux Baldini et à l'enrichir considérablement à force de créer des nouvelles fragrances dont les gens raffolent. Qui maîtrisait les odeurs, maîtrisait le coeur des hommes...

Il connaît beaucoup de succès mais n'en reste pas moins humble et ne demande pas grand chose en retour. Son objectif ultime est de maîtriser les outils et la technique pour savoir comment recréer l'odeur exquise d'une jeune fille rousse à la beauté pure qu'il avait assassiné. Pour lui, sans la possession de ce parfum, la vie n'avait plus de sens. Jusqu'où ira-t-il ?

Je n'élaborerai pas plus au risque de dévoiler le punch et de décevoir le lecteur qui compte en lire le récit. Tout ce que je me contenterai de dire, c'est que l'auteur semble avoir une fixation sur les rousses... Autrement, je vous propose des possibilités de fins alternatives :

  • Le parfum des 25 jeunes vierges devient sinistrement le produit le plus populaire d'Europe.
  • Jean-Baptiste Grenouille ne se fait pas prendre. Le riche père de la jeune Laure Richis achète à fort prix le parfum créé avec comme ingrédient l'indescriptible odeur envoutante de sa fille.
  • Avant son exécution, Grenouille ne crée pas un parfum mais une odeur empoisonnée qui flotte dans l'air pour massacrer l'assistance et s'évader en toute quiétude.
  • En appliquant la technique de l'enfleurage, Grenouille réussit à capter sa propre odeur et devient lui-même un parfum.
  • À force de sentir trop d'odeurs, il finit par avoir le nez bouché.
Quoi qu'il en soit, la véritable finale demeure assez surprenante.

Sinon, une mention spéciale à la page 126, à la fin de la première partie : avec l'intérêt pour le nouveau monde, il veut créer un parfum nommé Prestige du Québec. Ah qu'on aime lire une référence sur nous dans un livre allemand!


Tags: Livres

lundi 22 février 2010

JSONP pour récupérer des données distantes

Publié par Infinite Loop, à 18 h 55 0 commentaire

Avec l'ère du web 2.0 (au nom absurde), vous utilisez certainement déjà le JSON dans votre programmation. Mais avez-vous déjà entendu parler de JSONP ? Il s'agit d'un moyen de communiquer de l'information entre deux domaines à l'aide d'un tour de passe-passe.

Tout ça pour contourner la restriction au niveau des fureteurs où un script peut uniquement faire un appel Ajax sur une page du même serveur... Sauf à partir d'une balise script qui elle peut inclure un script externe (un peu comme quand vous incluez des scripts hébergés directement sur les serveurs de Google ou Yahoo! YUI).

JSONP est un genre de mécanisme qui permet de prendre sa source de données JSON sur un site externe et de faire directement appel à la fonction callback que vous avez spécifié en paramètre. En fait, JSONP signifie "JSON with padding" dans le sens que le serveur appellé s'occupera d'ajouter comme préfixe le nom de votre fonction JavaScript et qu'il lui passera en paramètre les données qu'il souhaite vous retourner.

Imaginez l'inclusion du script externe sur votre site :

<script src="http://www.site.com/json-source.php?callback=initWebsite"></script>
Le serveur distant, disposé à prendre en charge le retour de l'information avec JSONP, traite la requête :
<?php
// très simplifié pour l'exemple
$data = array(
'title' => 'code 18',
'url' => 'http://code18.blogspot.com'
);

echo $_GET['callback'] . '(' . json_encode($data) . ');';
En sortie, le résultat de ce script sera :
initWebsite({"title":"code 18","url":"http:\/\/code18.blogspot.com"});
En revanche, votre page web devra posséder une fonction du nom de initWebsite qui pourra mâcher l'information et en faire ce que vous désirez.
function initWebsite(info){
console.log(info.title);
console.log(info.url);
}
Voici quelques exemples de services qui permettent la récupération de données avec JSONP.
  • Twitter (récupérer les statuts)
  • Digg
  • GeoNames (cliquez sur le lien pour voir la requête. Je demande de l'information sur le code postal H1V3N7 situé au Canada)

    Exemple de réponse :

    callbackFunction(
    {"postalcodes":[{"postalcode":"H1V","adminCode1":"QC","countryCode":"CA","lng":-73.55103,
    "placeName":"Maisonneuve","lat":45.570163,"adminName1":"Quebec"}]}
    );
Quelques points à noter :
  • jQuery possède le nécessaire pour travailler avec JSONP
  • Ne pas utiliser avec des données sensibles
  • Faire attention à la sécurité car ça peut être vulnérable aux attaques CSRF ou XSRF


Tags: JavaScript

dimanche 21 février 2010

Cacher les erreurs PHP en production

Publié par Infinite Loop, à 10 h 17 0 commentaire

En regardant la liste de mes derniers billets, je me rends compte que ça faisait longtemps que je n'avais pas abordé un sujet relié au langage PHP. Ce dont je vais parler concerne un point que tout développeur PHP devrait être informé au moment de mettre un site en production.

Pendant la période de quelques semaines ou mois que nécessite le développement d'un site web, il est clair que c'est pratique de configurer PHP de façon à montrer les erreurs explicitement pour pouvoir effectuer le débogage qui s'impose. Or, quand vient le temps de placer le site web en production, si une erreur se produit et que la configuration n'a pas été modifiée, les visiteurs verront le détail technique de l'erreur, y compris les hackers qui pourraient être tentés de tirer profit de cette faille.

C'est pourquoi il est primordial de cacher les erreurs sur les serveurs de production. Voici quelques exemples d'erreurs rencontrées fréquemment :

E_WARNING

echo 10/0;
Warning: Division by zero in...

E_NOTICE
echo 10/$undefinedVariable;
Notice: Undefined variable: undefinedVariable in...

E_FATAL
echo $obj->undefFunction();
Fatal error: Call to a member function test() on a non-object in...

Par défaut, PHP 4 et 5 sont configurés pour rapporter tous les types d'erreurs sauf les notices (E_ALL & ~E_NOTICE). Ces erreurs peuvent être prises en charge en étant écrites dans un fichier de log (on en retrouve dans error.log d'Apache) ou encore les manipuler d'une façon particulière en utilisant la fonction set_error_handler() (pour les enregistrer dans une base de données ou envoyer une note par courriel à l'administrateur système).

On peut spécifier les différents types d'erreurs à rapporter en utilisant une combinaison de constantes prédéfinies avec des opérateurs bitwise. Par exemple : error_reporting(E_ERROR | E_WARNING | E_PARSE);

Pour le moment, je vais m'en tenir à E_ALL.

Dans le code PHP :
error_reporting(E_ALL);
// ou
ini_set('error_reporting', E_ALL);
Par php.ini :
error_reporting = E_ALL
Par .htaccess (non recommandé) :
php_value error_reporting 6143
Ici, les constantes ne sont pas reconnues à ce niveau. On doit utiliser la valeur entière équivalente à E_ALL. Habituez-vous à utiliser les constantes plutôt que les valeurs. D'abord parce que c'est plus lisible et selon la version de PHP, elles ne possèdent pas la même valeur :

Valeur de E_ALL dans différentes versions de PHP :
PHP < 5.2 = 2047
PHP 5.2.x = 6143
PHP 5.3.x = 30719
PHP 6 = 32767

Maintenant qu'on a défini les types d'erreurs à dévoiler au moment du runtime, il faut savoir que ceci n'a rien à voir avec l'affichage des messages qu'on voit à l'écran. Qu'on les affiche ou non, les erreurs seront rapportées à l'interne. En fait, on pourrait probablement ne rapporter aucune erreur mais ça ne nous serait d'aucune utilité. Ce qu'on veut pour la production, c'est de ne pas les afficher aux utilisateurs. La configuration est toute simple et peut aussi se faire à différents niveaux. Dans le code PHP :
ini_set('display_errors', 0);
Par php.ini :
display_errors = off
Par .htaccess :
php_value display_errors off
Notez qu'une autre option possible est de faire afficher une page d'erreur 500 avec un message amical expliquant au visiteur qu'une erreur s'est produite et que vous rectifierez la situation le plus rapidement possible (mieux que d'afficher l'erreur elle-même).

Dans .htaccess :
ErrorDocument 500 /oups.php


Tags: PHP

Citation no. 70 sur les vertus d'un programmeur

Publié par Infinite Loop, à 08 h 03 0 commentaire

Nous vous encouragerons à développer les trois grandes vertus d'un programmeur : la paresse, l'impatience et l'orgueil.

- Larry Wall, Programming Perl, 1ère édition


Tags: Citations

samedi 20 février 2010

Nouveau look de Code 18

Publié par Infinite Loop, à 11 h 47 7 commentaires

Bienvenue sur la nouvelle mouture de Code 18 ! Enfin, un nouveau visuel plus intéressant que celui proposé dans les choix par défaut du service Blogger. J'ai choisi un gabarit que je trouvais intéressant visuellement sur Blogger Templates et je l'ai intégré sans trop de difficultés.

En fait, c'est presque vrai. J'ai eu à réinitialiser les widgets et les repositionner (j'en ai profité pour retirer le gadget de clavardage de Google qui servait plus ou moins) et la boîte de recherche pointe toujours sur WordPress (à corriger)... Ensuite, j'ai ajusté quelques petits trucs CSS, procédé à quelques traductions de libellés en français (toujours pas terminé d'ailleurs) et je dois encore trouver comment faire afficher les dates des billets.

J'aime l'effet général (c'est quand même rafraîchissant) mais je ne suis pas certain de l'image de fond. Ce qui fait que le look est encore en probation et pas tout à fait définif. Ce qu'il faut retenir, c'est que la nouvelle facture graphique sera plus agréable à l'oeil que l'ancienne et qu'on s'en va dans la bonne direction.

Voyez l'effet avant / après pour constater la différence :


Tags: Intégration

Des visiteurs d'un peu partout

Publié par Infinite Loop, à 08 h 56 0 commentaire

Je regarde les statistiques de visites ce matin et je vois que mon blogue gagne en popularité dans des coins reculés de la planète. J'aimerais en profiter pour saluer tous les visiteurs en provenance de Petite Forêt en France et LE visiteur de Grosses-Roches dans le Bas-Saint-Laurent au Québec (420 habitants; gentilé : Rochelois).

Parlant du village de Grosses-Roches, j'ai entendu une histoire assez drôle l'été dernier. Paraît-il que les touristes s'arrêtaient devant l'écriteau de bienvenue à l'entrée du village pour prendre des photos souvenir. Des jeunes auraient barbouillé la patte oblique du R de Roche pour rebaptiser la place Grosses-Poches. Une attraction touristique est née. Quelqu'un peut me confirmer ou mieux, m'envoyer une photo ?

Dans la même région, les rumeurs courent à l'effet que le village Les Boules (juste avant Saint-Ulric) cherche à ouvrir un bar de danseuses pour faire parler d'eux (à moins que ce soit un club de bowling ou de pétanque ?).

À croire que les légendes de Fred Pellerin du village de Saint-Élie-de-Caxton commencent à inspirer le développement touristique en régions!


Tags: Curiosités

vendredi 19 février 2010

Vider un select box en JavaScript

Publié par Infinite Loop, à 17 h 33 2 commentaires

En JavaScript, on sait qu'on peut retirer tous les éléments d'une liste déroulante en effectuant une boucle sur chaque élément pour effacer dynamiquement les options du DOM.

Lorsqu'on veut les vider toutes d'un seul coup, on peut utiliser le raccourci suivant (JavaScript pur) :

document.getElementById("element_id").length = 0;
Dans plusieurs cas, le premier élément du select box est une étiquette indiquant une instruction du type "Veuillez faire un choix", avec une valeur nulle. Si on veut conserver cette étiquette (la première option du select), il suffit de spécifier le nombre d'éléments à garder :
document.getElementById("element_id").length = 1;
Avec la librairie jQuery, on pourrait avoir tendance à écrire le bout de code suivant :
$j("element_id").length = 1;
Alors qu'en réalité, comme le sélecteur CSS de jQuery retourne une collection, il faudra lui spécifier qu'on veut utiliser le premier élément retourné dans la liste avec get() (si on l'appelle avec un ID, ce sera l'unique item, à l'indice 0) :
$j("element_id").get(0).length = 1;
Notez que j'utilise la variable $j dans mes exemples car je me sers généralement de la librairie jQuery en mode noConflict() que j'affecte à une variable pour éviter les mauvaises surprises.


Tags: JavaScript

jeudi 18 février 2010

Pourquoi les programmeurs ont des rages de sucre?

Publié par Infinite Loop, à 13 h 06 0 commentaire

Avez-vous remarqué que les programmeurs ont une tendance à consommer beaucoup d'aliments sucrés (boissons gazeuses, chocolat, etc) ? En fait, ça devrait toucher tout le monde qui travaille dans un bureau mais surtout ceux qui se font aller les neurones à fond.

Quand quelqu'un fait un effort physique intense, on doit donner à son corps un apport suffisant en protéines pour nourrir ses muscles. Quand on est assis devant un ordinateur, notre muscle le plus sollicité est le cerveau. Cet article sur le carburant du cerveau donne une explication plus concrète :

Notre cerveau est un grand consommateur d'énergie. Des milliards de neurones en effervescence, cela se nourrit ! Alors que le cerveau ne représente que 2 % de notre poids, il entre pour 20 % dans notre métabolisme de base. Au repos, il utilise 60 % du glucose de l'organisme.

Des réserves de 10 minutes maximum
Pourquoi le glucose ? C'est le seul glucide qui passe la barrière hémato-encéphalique (c'est-à-dire qui passe du sang à notre cerveau). Nos neurones en ont besoin continuellement, exactement comme l'oxygène. Car les réserves en glucose du cerveau ne dépassent pas 10 minutes. Quand on lui demande un effort particulier, les zones qui sont alors sollicitées sont capables de demander un “ supplément ” de glucose et d'oxygène pour faire face à l'accroissement de leur activité.

Le fournisseur officiel de glucose ? Les glucides, et parmi eux, le sucre ! Et ce n'est pas tout. On sait aujourd'hui qu'il existe un lien étroit entre glucose, insuline et sérotonine, un neurotransmetteur impliqué dans le contrôle de l'appétit, du sommeil, de l'attention et de l'humeur...
Ce qui justifierait nos rages de sucre spontanées...


Tags: Saviez-vous que

mercredi 17 février 2010

Intégrer une carte Bing Maps

Publié par Infinite Loop, à 22 h 02 1 commentaire

J'ai découvert récemment comment intégrer sur un site web une carte du service Bing de Microsoft. Pas nécessairement pour un besoin particulier mais surtout dans le but de comparer l'approche avec celle de Google Maps. Et le résultat n'est pas si désastreux. D'ailleurs, j'aime bien la qualité des images en mode "bird's eye".

Pour vous démontrer comment faire, rien de mieux qu'un snippet de code.

1. Attachez la librairie JavaScript

<script type="text/javascript" src="http://ecn.dev.virtualearth.net/mapcontrol/mapcontrol.ashx?v=6.2"></script>
2. Créez un conteneur où afficher la carte
<div id="bingMap" style="position:relative; width:600px; height:500px;"></div>
3. Attachez la fonction d'initialisation au chargement de la page

Par JavaScript inline ou par Prototype, jQuery, etc.
<body onload="GetMap();">
4. La fonction JavaScript d'initialisation et la configuration
var map = null;

function GetMap(){
map = new VEMap('bingMap');

// Normal, Small, etc.
map.SetDashboardSize(VEDashboardSize.Normal);

map.LoadMap();

map.SetCenterAndZoom(new VELatLong(45.534852,-73.628998), 10);

// Road, Hybrid, etc.
map.SetMapStyle(VEMapStyle.Road);
}
Voilà, vous avez une carte de base centrée sur la ville de Montréal (et plus particulièrement le parc Jarry).

Pour connaître la latitude et la longitude exactes, j'ai utilisé le service iTouchMap (hehe, ça utilise Google Maps!) qui permet de positionner le curseur rouge à l'endroit exact où on veut centrer le point (drag & drop). En cliquant sur le marqueur, la bulle indique les coordonnées.

Vous pourrez trouver de la documentation supplémentaire sur les sites suivants :
  • Bing Maps Developer Resources
  • Bing Maps Portal
  • Bing Maps Platform
  • SDK Bing Maps (avec exemples et code source)


Tags: JavaScript

mardi 16 février 2010

IBM Glass Engine

Publié par Infinite Loop, à 19 h 54 0 commentaire

Tout à l'heure au travail, je cherchais à faire l'essai de mes nouveaux écouteurs Shure avec une musique qui favorise la création d'une bulle de concentration ("in the zone" comme disent les anglais). Mon choix s'est arrêté sur Philip Glass et l'album Songs and Poems for Solo Cello (Wendy Sutter).

Je me suis rendu sur son site web pour lire un peu d'information par rapport à son contexte d'écriture et c'est là que j'ai découvert une section concernant le IBM Glass Engine, un outil intuitif développé en 2001 par IBM pour explorer une sélection de plus de 60 oeuvres de Philip Glass à travers un applet Java.

Comment ça fonctionne ?

  • Chaque barre verticale représente une pièce de Glass
  • Vous pouvez sélectionner n'importe quelle pièce sur n'importe quelle barre
  • Chaque barre coulissante permet de charger la musique différemment
  • Cliquez sur une barre et maintenez enfoncé le bouton de la souris en déplaçant le pointeur vers la gauche ou la droite


Veuillez noter que sous Internet Explorer, vous devrez accepter le popup pour que l'outil soit lancé.

L'interface permet de filtrer les pièces par album (A à Z), par titre (A à Z), par année (1968 à 1999) et par durée. On peut aussi ajuster nos critères de recherche en spécifiant la teneur en joie, tristesse, intensité, densité et vélocité.

Je trouve ça génial que Glass se soit prêté à cette expérience et qu'il ait rendu disponible son travail en ligne. Peut-être est-ce que ça en inspirera d'autres ?

Profitez-en pour découvrir son univers minimaliste. Personnellement, je vous recommande la trilogie des "qatsi" (autant CD que DVD), ses études pour piano, Einstein on the Beach et l'excellente trame sonore de Dracula (celui de 1931 avec Bela Lugosi) enregistrée avec le Kronos Quartet.


Tags: Musique

lundi 15 février 2010

Voir Back to the Future d'une autre façon

Publié par Infinite Loop, à 19 h 05 0 commentaire

J'en ai parlé récemment sur Twitter mais comme sa mémoire est limitée, je me dois de le répéter ici pour la postérité. Vous aussi, vous ne verrez plus Back To The Future 3 de la même façon.

Pourtant, je me souviens avoir regardé la trilogie des dizaines de fois depuis mon enfance et jamais je n'avais remarqué ce détail au moment de la finale.



Le petit Verne semble vouloir prendre la route de... La route ? Quelle route ? Là où il veut aller, il n'a pas besoin de route!


Tags: Curiosités, Humour

dimanche 14 février 2010

Faits saillants d'une soirée atypique

Publié par Infinite Loop, à 10 h 34 1 commentaire

Voici le déroulement d'une partie de ma journée du samedi 13 février 2010. Comme disaient les Black Eyed Peas : I got a feeling that tonight’s gonna be a good night.

15h30
Détour obligé au magasin de noix en vrac Coconut pour acheter des chips incroyablement piquantes Blair's Death Rain Habanero pour faire découvrir aux amis d'un ami.

16h00
Aller à l'animalerie pour acheter de la nourriture. Avec l'aide des employés du magasin, un client tente de peine et de misère de faire passer par la porte une boîte gigantesque. Un peu plus et il tentait de l'embarquer dans l'autobus...

18h30
Vivre l'expérience d'un buffet chinois cantonais dont le décor kitsch n'a pas changé depuis probablement 40 ans : le restaurant Nouveau King Wah sur St-Denis à Montréal. À part le terminal de paiement pour cartes à puces, je ne sais pas ce qu'il y avait de réellement nouveau. Mise à jour : effectivement, ma blonde m'a rappelé que l'antique horloge Molson a été remplacée par une thermopompe.

  • Bouffe honnête et à petit prix
  • Jell-O et pâtisseries pour dessert
  • Ne figure malheureusement pas au palmarès du livre Montréal Kitsch.
20h
Direction Broue Pub Brouhaha. Ça fait plusieurs fois que j'y vais depuis l'ouverture et je dois dire que je trouve l'endroit et le personnel assez sympa. La première fois que j'y suis allé, nous étions probablement trois incluant le gars derrière le comptoir. Un an plus tard, la place semble avoir gagné en popularité. Tant que ça ne devienne pas jam pack comme au Dieu-du-Ciel...
  • quelques bières maison
  • belle sélection de bières de micro-brasseries locales
  • Snacks alléchants à se mettre sous la dent
  • projecteur pour regarder le hockey (ou plus récemment le Super Bowl)
  • fenêtre non-givrée donnant la vue sur les urinoirs de la toilette des hommes
  • c'est une mauvaise idée de pousser la table de baby-foot contre la porte de la toilette des femmes
À notre arrivée, Canadiens perdait déjà 3 à 0 contre les Flyers. Juste pour en rajouter de la veille. Le désastre s'est terminé 6 à 2. À croire que les valises des joueurs étaient prêtes dans le vestiaire pour décoller immédiatement après la partie en direction d'une destination du sud pendant la pause olympique. Au moins une chose de positive : 2 points en 2 matches pour le défenseur recrue Pernell Karl "PK" Subban. Si ma mémoire est bonne, c'est lui qui avait dit à Bob lors du repêchage : vous ne le regretterez pas!

L'endroit possède aussi une salle séparée pour tenir des événements. Nous étions intrigués à savoir ce qu'il y avait derrière le rideau. J'ai interrogé le maire Foursquare de la place (qui m'a d'ailleurs initié à un jeu de zombies sur le iPhone) et selon les rumeurs, ce serait un club échangiste et une section pour nudiste. Un petit clin d'oeil à Chez Lydia ? (que nous venions tout juste de découvrir en scannant les lieux du voisinage). D'ailleurs, avis aux intéressés, personne n'a osé devenir maire de ce bar de danseuses.

En inspectant le décor du Brouhaha, nous avons remarqué près d'une fenêtre un genre de sculpture de chien qui a piqué notre curiosité. Marco, un des employés (son nom, si on se fie à la facture) nous a expliqué qu'un groupe de personnes se réunissait périodiquement dans la deuxième salle pour faire des projections de films douteux. La clientèle du pub peut soumettre des suggestions en les écrivant sur papier, les rouler serrés et les insérer dans l'arrière-train du chien. Pour en savoir plus, visitez douteux.org.

23h30
Nous avons terminé la soirée dans un Tim Horton où j'ai tenté de deviner le mot de passe du Wi-Fi que mon iPod Touch détectait. Je confirme que ce n'est ni "Timbits", ni "Munchkins".


Tags:

Citation no. 69 sur la culture

Publié par Infinite Loop, à 09 h 17 0 commentaire

La culture c'est comme la confiture, moins on en a plus on l'étale.

- Pierre Desproges


Tags: Citations

samedi 13 février 2010

Konami Code sur PHP.net

Publié par Infinite Loop, à 11 h 35 0 commentaire

Je ne sais pas depuis combien de temps le site de référence du langage de programmation php.net a fait le changement mais je viens de me rendre compte à l'instant qu'ils ont eux aussi installé un Konami Code. En entrant la combinaison de touches :

HAUT HAUT BAS BAS
GAUCHE DROITE GAUCHE DROITE
B A ENTER

Le logo de PHP dans le coin supérieur gauche :



Sera changé pour les personnages du jeu Contra :



Tant qu'à y être, profitez-en pour jouer une partie du jeu Contrat en ligne (Nintendo) :


Tags: Easter Eggs

Résultat au test de geek

Publié par Infinite Loop, à 11 h 06 0 commentaire

Ce matin, je me suis soumis au Test de Geek en répondant avec honnêteté pour connaître mon niveau de geek. Mon score : 23.48 %.



Un peu plus et j'entrais fièrement dans la catégorie Total Geek. Pourtant, c'est tout comme car le test m'a semblé un peu dépassé. J'aurais inclus plusieurs critères plus actuels, comme si le test ne couvrait pas l'apport de la communauté geek des dernières années (on est plus geek que ça quand même). De plus, la version française et anglaise ne présentent pas les mêmes questions (j'écoute Weird Al Yankovic et l'option est retirée dans la version française). Mais bon, ça n'a rien de scientifique et c'est à prendre avec un grain de sel. Ça m'a quand même fait sourire de me rappeler des thèmes oubliés de mon adolescence de geek, comme le THAC0...

Et vous, quel score avez-vous eu ?

Si vous avez le goût d'approfondir sur le sujet ou l'intention de faire une incursion dans le fascinant monde des geeks et geekettes, vous pourrez assister à la première édition du Festival Geek de Montréal qui se tiendra le 6 et 7 mars 2010.


Tags: Le coin du geek

jeudi 11 février 2010

Processeur ultra-performant !

Publié par Infinite Loop, à 15 h 42 0 commentaire

Force est d'avouer que l'entreprise taïwanaise VIA Technologies n'a pas choisi le nom de modèle le plus approprié pour son processeur : VIAgra. Semble-t-il que sur le turbo, sa performance est à couper le souffle !



Vu sur Failblog.


Tags: Humour

mercredi 10 février 2010

Écouteurs de contrefaçon

Publié par Infinite Loop, à 18 h 34 1 commentaire

Combien seriez-vous prêt à payer pour une bonne paire d'écouteurs ? Quel prix peut avoir un produit de qualité supérieure avec un son exceptionnel ?

Pour ma part, j'ai récemment acheté un modèle d'écouteur de base Shure SCL2 à isolation sonore qui se détaille normalement environ 85$ en magasin (Steve's Music à Montréal ou Amazon.com). Sur eBay, je l'ai obtenu pour 73$ canadiens, livraison incluse. OK, ce n'est pas le deal du siècle mais j'économise environ 23$, incluant les taxes. Imaginez, à ce prix, c'est seulement le modèle de base. Certains modèles plus haut de gamme, comme le SCL5, se détaillent au-delà de 300$!

Sur eBay, on peut brasser de bonnes affaires mais on peut aussi se faire avoir. La preuve est que lorsque j'ai magasiné mes écouteurs, j'ai remarqué que certains vendeurs affichent des produits similaires à des prix dérisoires. C'est de ces arnaqueurs qu'il faut se méfier. Stock volé ou contrefaçon ? Surtout dans l'électronique, des entreprises chinoises excellent dans l'art de fabriquer du faux à partir des modèles de produits les plus populaires.

Prenez par exemple les écouteurs du iPod. Sur le Apple Store : 29$. Sur le site DealExtreme (un détaillant chinois de gadgets dont j'ai déjà parlé), on en retrouve un bon nombre de copies dont le prix oscille entre 1,41$ et 12,79$. Sans doute que la qualité varie aussi si on se fie aux critiques.

Voyez par vous-même une liste non-exaustive de ce que j'ai trouvé :

  • 1,41 $ Designer white stereo earphones
  • 1,90 $ iPod noise isolation earbuds
  • 1,98 $ Premium stereo Hi-Fi replacement earphones for iPod
  • 2,93 $ Replacement stereo earphones for iPhone
  • 7,43 $ Designer's earphones for all iPod Shuffle
  • 12,79 $ Genuine Apple earphones with volume control
Ils sont vraiment très semblables vous ne trouvez pas ? Ce type d'écouteurs se retrouve sur eBay annoncés comme des originaux et se vendent comme des petits pains chauds. La plupart du temps vendus sans emballage. Mais en même temps, comment savoir si un de ces fabriquant n'est pas un sous-traitant officiel d'Apple ? Quoique je ne suis pas certain que j'oserais mettre ça dans mes oreilles...

Je savais que les modèles pour iPod existaient, je les avais remarqués lors d'une de mes visites. Mais je suis resté bouche bée lorsque j'ai découvert qu'ils vendaient aussi une imitation du modèle SCL2 de Shure !

L'imitation à 2,80 $ :




Le modèle original à 85 $ :



Tout ce qui manque, c'est le logo de Shure (peut être rajouté sur la photo par ordinateur ou physiquement par un décalque quelconque). Pour ma part, je suis un peu rassuré car j'ai fait affaire avec un vendeur avec une excellente réputation. Les autres utilisent une image générique (stock photo) pour afficher le produit, osent dire que c'est "authentique", livrent les écouteurs sans l'emballage original ni les accessoires généralement compris dans la boîte. Un "Buy It Now" à 20$ ou 40$ ? Je n'y crois pas tellement.

Il reste que j'ai hâte de recevoir mon colis pour en avoir le coeur net. Je vous tiendrai au courant de ma satisfaction dans les prochains jours.


Tags: Musique

mardi 9 février 2010

Transférer un profil utilisateur à PayPal

Publié par Infinite Loop, à 19 h 46 0 commentaire

Depuis quelques semaines, je développe un site web de commerce électronique et le client a retenu PayPal comme solution de paiement en ligne. En cours de développement, il est conseillé d'utiliser le sandbox pour simuler les paiements et la réception de l'IPN (Instant Payment Notification) pour s'assurer que tout se comporte bien.

Lorsque le client possède déjà un compte utilisateur, on conserve généralement son profil dans la base de données locale. Si on veut déléguer la responsabilité du paiement à PayPal, l'acheteur aura deux choix pour effectuer le paiement :

  1. se connecter à son compte PayPal pour compléter la transaction avec les informations déjà recueillies (carte de crédit, compte bancaire, etc)
  2. compléter son profil avec le formulaire indépendant sans avoir besoin de posséder un compte PayPal
Ici, comme il est trop tôt pour savoir quelle option le visiteur choisira, il est recommandé de passer les valeurs qu'on connait déjà sur son profil utilisateur à PayPal. Ainsi, la deuxième option permettra de pré-remplir le formulaire et accélérer la finalisation de la transaction. De plus, ça peut paraître comme un irritant aux yeux de certains clients de devoir compléter une deuxième fois son profil sur le site d'un tiers parti. Au contraire, s'il veut nous donner de l'argent, on ne souhaite surtout pas le décourager!

Par exemple, on pourra utiliser des champs hidden et les garnir des valeurs connues. PayPal peut recevoir en POST les clés (name) suivantes :
  • first_name
  • last_name
  • address1
  • address2
  • city
  • state
  • zip
  • address_country_code
Pour le code de pays et la province / état / région (Amérique du Nord), assurez-vous de faire référence aux codes fournis dans leur documentation :
  • Codes de pays
  • Codes de régions
Autrement, vous risquez de faire comme plusieurs sites qui passent la valeur textuelle de la région parce qu'ils ont laissé le champ de saisie ouvert lors de la création du profil. Peu importe le texte entré, il sera transféré à PayPal et il sera affiché tel quel dans le libellé texte de l'adresse (lorsque celle-ci est complète). Cependant, si on tente de le modifier, l'étiquette texte sera remplacée par un formulaire pré-remplit avec les valeurs qu'on lui aura envoyé. Dans le formulaire, le champ pour la province ou l'état est une liste déroulante. Si la valeur transférée ne se retrouve pas dans les choix, elle ne sera pas sélectionnée. Pour que ça fonctionne, la valeur envoyée doit être soit le nom anglais avec l'orthographe exacte (insensible à la casse), soit le code à deux lettres. Par exemple, "Quebec", "quebec", "QC" et "qc" passent bien mais "Québec" ne donnera pas le résultat attendu (même si l'interface est français).

Conservez dans votre base de données la liste des codes standards et évitez de laisser ces champs ouverts à la saisie lorsque l'acheteur est au Canada ou aux États-Unis. Évidemment, j'ai vu bon nombre de fois des gens inscrire "Québec" dans la case "Pays". Même si certaines personnes idéalisent ce rêve, PayPal n'est pas de cet avis :-)

En passant, saviez-vous que www.x.com appartient à PayPal ? Visitez le PayPal X Developer Network.


Tags: Intégration, Programmation

lundi 8 février 2010

Noms de familles qui se terminent par LX

Publié par Infinite Loop, à 17 h 25 0 commentaire

Hier soir, au lieu d'assister au Super Bowl en mangeant de la pizza et des ailes de poulet comme plusieurs personnes, j'ai lorgné du côté du canal Vox pour regarder l'émission culturelle Mémoire de Proulx en mangeant quelque chose de plus santé. Cette émission de 30 minutes porte sur l'histoire du Québec et compte bon nombre d'anecdotes. Gilles Proulx est dans son élément (l'histoire), sait rendre le sujet intéressant et est passionnant à écouter.

Durant sa présentation, un point a piqué ma curiosité. Je me suis souvent demandé pourquoi certains noms de familles se terminent par LX sans qu'on ne le prononce (aucune utilité). Par exemple Gilles Proulx et Patrick Groulx.

Au Québec, il y a une raison historique que j'ignorais. En fait, à l'époque où la population était illétrée et analphabète, quand les gens devaient signer des documents chez le notaire, celui-ci avait l'habitude d'inscrire le nom et de tirer une ligne verticale pour séparer le nom de la signature. La personne qui ne savait pas écrire devait y apposer un X pour indiquer son accord. D'ou la transcription du nom de famille Grou|x en Groulx.


Tags: Histoire

dimanche 7 février 2010

Erreur sur la personne

Publié par Infinite Loop, à 08 h 48 0 commentaire

Depuis quelques mois, je reçois régulièrement des courriels à l'attention d'une personne qui porte le même nom que moi et qui possède probablement une adresse email très similaire à la mienne. Vraisemblablement, il aurait distribué son adresse à plusieurs contacts sans même avoir pris le temps d'en vérifier l'exactitude. Désormais un classique sur le web.

Ce qui fait que je reçois des bribes de correspondance provenant de son réseau de contacts. Je sais qu'il vit en France et qu'il a entamé un doctorat quelque part à Paris. Au début, je répondais poliment aux expéditeurs en expliquant que je ne suis pas la bonne personne, que l'adresse est erronée, que je suis québécois, etc. Quand même, ce sont des communications importantes pour son diplôme qui doivent lui être acheminées... Maintenant, je les ignore. Tant pis pour lui s'il n'a pas été capable de rectifier son erreur malgré les notes que j'ai pu laisser à son entourage.

Dans les messages reçus, j'ai eu le loisir de découvrir des petites perles :

  • on a rencontré le nouveau copain de *****, un certain Bernard qui, malgré son prénom, est très sympa...
  • La coloc va toujours bien, on n'a toujours pas de porte, mais bon on s'y habitue...
  • ***** vient carrement 6 jours (!), il va falloir que je la refile à ***** et *****, ils causeront broderie...
  • Tu sais, c'est un traumatisme pour moi de faire la chose. Chez moi, la chasse d'eau est de mauvaise qualité et une fois sur 2, ça n'élimine pas tout, et même en attendant 5 minutes et en remettant un coup, ça ne part pas. À l'école, c'est style préfabriqué, et tu le fais en communauté.
Non mais vraiment, c'est passionnant! À leur place, je serais quasiment gêné.

À force de recevoir des courriels à la mauvaise adresse, j'en suis venu à la conclusion que l'orthographe n'était pas correcte. Mon adresse personnelle (celle contenant mon nom et prénom) comprend un point (par exemple comme code18.blogspot@gmail.com) et il est possible que les expéditeurs aient placé un point par erreur là où il n'y aurait pas dû y en avoir (son adresse véritable aurait été code18blogspot@gmail.com). J'ai fait le test pour m'en assurer.

Or, il semble que Gmail ne fasse pas la distrinction des points dans les adresses, un peu comme un mécanisme de gestion des erreurs. Quand on fait afficher les détails du message, on voit l'adresse du destinataire et une note inscrite entre parenthèses à sa droite : "Oui, il s'agit bien de votre adresse". Un lien "En savoir plus" donne l'explication :
Votre adresse est similaire mais comporte plus ou moins de points (.) ou des majuscules à des endroits différents.

Il peut arriver que vous receviez un message destiné à une personne dont l'adresse ressemble à la vôtre avec juste une différence au niveau des points, que soit dans le nombre ou l'emplacement. Par exemple, votre adresse peut être homerjsimpson@gmail.com, mais le message a été envoyé à Homer.J.Simpson@gmail.com. Nous sommes conscients que ceci peut vous dérouter de penser qu'un message destiné à une autre personne est acheminé sur votre compte, ceci est en fait provoqué par un malentendu.

Voici pourquoi :

Gmail n'autorise qu'un seul enregistrement avec un même nom d'utilisateur. Lorsque vous vous inscrivez avec un nom d'utilisateur, personne d'autre ne peut l'utiliser, même à l'aide de variantes au niveau des points ou des majuscules. Ce nom d'utilisateur vous appartient. Si vous avez créé votrenomutilisateur@gmail.com, personne ne peut s'enregistrer avec l'adresse votre.nomutilisateur@gmail.com, ni Votre.nom.utilisateur@gmail.com. Comme Gmail ne considère pas les points comme des caractères dans les noms d'utilisateur, vous pouvez ajouter ou supprimer des points dans votre adresse Gmail sans que l'adresse de destination soit modifiée. Tous les messages seront envoyés dans votre boîte de réception et uniquement la vôtre.

Si votre adresse est homerjsimpson@gmail.com, personne ne possède d'adresse Homer.J.Simpson@gmail.com, sauf vous. Si vous recevez un message adressé à Homer.J.Simpson@gmail.com, il est probable que l'expéditeur a voulu envoyer un message à Homer.J.Sampson@gmail.com ou Homer.J.Simpson1@gmail.com, et a mal indiqué l'adresse. De même, il se peut que vous receviez des messages provenant de listes de diffusion ou d'inscriptions à des sites Web si la personne qui s'est enregistrée a fourni votre adresse par erreur. Dans ces cas-là, nous vous conseillons si possible de contacter l'expéditeur du message ou le site Web pour leur signaler l'erreur. Lorsque vous vous connectez à votre compte, vous pouvez utiliser n'importe quelle configuration de points dans le champ 'Nom d'utilisateur'. Par conséquent, si vous vous êtes inscrit avec l'adresse votrenomutilisateur@gmail.com, vous pouvez vous connecter avec l'adresse 'votre.nom.utilisateur@gmail.com'.

Veuillez noter que Google Apps distingue les points. Si vous souhaitez ajouter un point dans votre nom d'utilisateur, demandez à l'administrateur de votre domaine d'ajouter votre nom d'utilisateur favori comme pseudonyme.

Alors tant pis, je ne peux pas me tenir pour responsable de son erreur. Je souhaite à mon homonyme bon succès dans ses études.


Tags: Le coin du geek

Citation no. 68 sur l'optimisation du code

Publié par Infinite Loop, à 07 h 21 0 commentaire

It's easier to optimize correct code than to correct optimized code.

- Joshua Bloch, Architecte en chef Java chez Google


Tags: Citations

samedi 6 février 2010

Aliss de Patrick Senécal

Publié par Infinite Loop, à 08 h 45 6 commentaires

Le roman Aliss m'a été conseillé par mes amis qui l'ont pratiquement tous lus et sont unanimes : c'est le livre le plus troublant de Patrick Senécal. Pour ma part, c'était la première fois que je lisais un de ses livres. J'avais vu l'adaptation au cinéma de Sur le seuil (son 3ème titre) et j'avais trouvé ça correct. Aliss est donc son 4ème livre paru en 2000.

À la librairie, un auto-collant démontre l'approbation du marchand : Coup de coeur Renaud-Bray. Et les critiques laissent présager que le meilleur est à venir : une version hardcore d'Alice aux pays des merveilles de Lewis Carroll.

À 18 ans, Alice décide de laisser tomber le Cegep et de quitter sa banlieue prévisible de Brossard pour s'installer à Montréal et vivre de nouvelles expériences. En se promenant, elle aperçoit un homme perdre son portefeuille et elle tente de le rejoindre à toute vitesse pour le lui remettre. De nature curieuse et doublement intriguée par le personnage, elle décide donc de le suivre et débarque à la même station de métro que lui. Elle se retrouve dans un quartier de Montréal dont elle n'avait jamais entendu parler. Ici, la station se nomme W D R D (on en déduit Wonderland). Un quartier isolé ressemblant davantage à un Red Light où le vice reigne et où tout est permis. Un univers anti-logique, où bizarreries, paradoxes et absurdité sont la règle.

Elle a un peu d'argent de côté et se loue un appartement pour une durée de trois mois. Juste en face du Palais de la Reine Rouge, un bâtiment mystérieux aux vitres barricadées. Ses nouvelles fréquentations l'amènera à expérimenter différents types de drogues (joints, Micro, Macro, Royale) et sa dépendance l'obligera à devoir se trouver un emploi pour soutenir son nouveau mode de vie.

Jeune fille intelligente, elle tentera de trouver des réponses à ses questions existentielles en lisant Ainsi parlait Zarathoustra. À l'image du concept de Nietzsche, elle se donnera pour défi de devenir la surfemme à l'intérieur de cette micro-société et elle est prête à tout pour y arriver. Elle devra dépasser ses limites personnelles et laisser tomber ses principes. D'ailleurs, elle est convaincue que la Reine Rouge dont tout le monde parle est aussi une surfemme et se se donne pour objectif ultime de faire sa rencontre...

On prend plaisir à faire la relation entre les personnages originaux et ceux réinventés par Senécal :

  • Alice devient Aliss (sa nouvelle identité)
  • la Reine de Cœur se transforme en Reine Rouge (à la tête du plus luxueux bordel en ville)
  • le duo Chair et Bone (mon cher Chair - Lièvre de mars, mon bon Bone - le Chapelier fou)
  • Andromaque, la Duchesse déchue
  • Verrue, la Chenille qui aspire à éclore et devenir un papillon
  • Charles représente le Lapin blanc (qui a un penchant pour les jeunes filles)
  • Chess, le Chat du Cheshire qui possède les réponses et sa drogue bien personnelle (que vous découvrirez à la fin)
En toute honnêteté, j'ai dévoré le livre du début à la fin. Même si l'écriture des dialogues en "québécois" m'agaçait un peu, l'histoire est trop riche et captivante pour que ça pèse dans la balance. Aussi, pourrait-on qualifier le livre pour adulte ? En tout cas, ce n'est définitivement pas pour les enfants!

Comme ils disent à la télévision :

Avertissement
La violence, le langage cru et les scènes de sexe explicites pourraient être choquante pour certaines personnes. Nous préférons vous en avertir.

Le hasard a fait que j'ai lu ce livre au même moment que la sortie du film Les 7 jours du talion (5ème livre de Senécal, présentement à l'affiche et dont on parle beaucoup ces temps-ci). Quand à une possible adaptation d'Aliss au cinéma, un projet est en cours de scénarisation et je n'ose pas imaginer comment ça sera porté à l'écran. Certainement avec beaucoup de censure.

En attendant, une nouvelle version d'Alice in Wonderland par Tim Burton (une fois de plus avec Johnny Depp) sortira en mars prochain au cinéma.


Tags: Livres

vendredi 5 février 2010

Spécial du vendredi : Chewbacca

Publié par Infinite Loop, à 20 h 21 0 commentaire

Enfin vendredi. La semaine est terminée et honnêtement, je n'ai vraiment aucune envie de parler de quelque chose de sérieux. Le temps est venu de mettre le cerveau à "off" jusqu'à demain. C'est pourquoi j'ai décidé de présenter un spécial Chewbacca. Juste pour être impertinent.

1. Instant Chewbacca

On s'est pris d'affection pour ce gros wookiee. Quand on s'en ennuie, on appuie sur le gros bouton rouge. À voir et surtout à entendre sur instantchewbacca.com. Inutile, je l'admets.

2. La clé USB Chewbacca

La clé USB Chewbacca contient autant de données que sa capacité intellectuelle.

3. Commercial japonais de 1978 vraiment étrange


Là, c'est le clou de la soirée. OK, c'est inspiré de Star Wars mais Chewie y est. Les concepteurs de la publicité y ont mis le paquet...


Tags: Humour

jeudi 4 février 2010

Wine : exécuter un logiciel Windows sous Linux

Publié par Infinite Loop, à 18 h 49 4 commentaires

Jusqu'à présent, j'ai conservé le dual boot sur mon PC pour pouvoir expérimenter sur Linux (Ubuntu) et me servir de certaines applications spécifiques à Windows. Ce dernier représente pour moi une contrainte dont j'aimerais éventuellement me débarasser pour que mon poste roule à 100% sous Linux.

Or, chaque année, j'achète un logiciel d'impôt (ImpôtExpert ou Impôt Rapide) et sans surprise, ils sont développés exclusivement pour Windows (à ma connaissance, je ne crois pas qu'ils se font pour Mac). Pour conserver ma liberté de choix de mon système d'exploitation principal, le plus simple est certainement de le faire rouler à l'intérieur d'une machine virtuelle (VMWare ou VirtualBox).

Mais cette option nécessite une license, pour être légal, bien entendu. Sinon, l'alternative est de se tourner vers une version web-based d'Impôt Rapide (soit dit en passant, ils offrent une version gratuite pour ceux qui ont une situation fiscale très simple et pour les étudiants du collégial et universitaire dont le revenu est inférieur à 20000$).

Mais cette année, j'ai encore choisit ImpôtExpert. Surtout parce que l'an dernier, j'avais apprécié le produit (aucune mauvaise surprise) et que pour la moitié du prix (20$), il offre les mêmes possibilités que la version Deluxe de son compétiteur (40$). Comme je fais les impôts pour ma copine et moi, disons qu'à 10$ chacun, ça revient meilleur marché que de le faire faire par un comptable (expérience passée : 45$ par personne).

Maintenant, la question est de savoir si je peux l'émuler facilement avec Wine (Linux ou Mac OS X) ? Wine (WINdows Emulator Wine Is Not an Emulator) permet d'installer des programmes Windows sur Linux et de les émuler. Mais pas tout à fait. Ils roulent de la même façon que sous Windows mais les composants natifs sont remplacés par des équivalents Linux. C'est surprenant de voir combien de programmes ont été exécutés avec succès à l'extérieur de leur environnement d'origine. Malheureusement, je n'ai pas réussit à faire fonctionner iTunes mais mon logiciel d'impôt s'exécute sans problème.

Voici comme j'ai procédé. D'abord, il faut installer Wine.
La façon la plus simple sous Ubuntu :

sudo apt-get install wine

Avant la première exécution, on peut appeler le programme de configuration :

winecfg

Une structure sera créée (.wine) dans le répertoire de l'utilisateur et une arborescence de fichiers simulera l'environnement Windows, comme par exemple : /home/code18/.wine/drive_c/Program Files/

Pour installer le logiciel (celui dont il est question ici ou n'importe quel autre de votre choix), insérez le CD-Rom dans le lecteur. Mon installation d'Ubuntu monte automatiquement le CD et je peux appeler le programme d'installation comme ceci :

wine /media/ImpotExpertUFile/installer.exe

L'écran d'accueil du programme d'installation apparaît. Procédez de la même façon que vous le feriez sous Windows en suivant les étapes. L'installateur indique qu'il installera le programme dans l'emplacement par défaut, soit C:\Program Files\ImpotExpert 2009\. Le programme le traduit automatiquement par le chemin /home/code18/.wine/drive_c/Program Files/ImpotExpert 2009/. Ne changez pas le chemin inscrit, toute l'installation se fait de façon transparente.

Lorsqu'elle est terminée, avant d'entreprendre le premier rapport d'impôt, il faut activer le logiciel en entrant la clé d'activation.



Une fois que c'est fait, on peut l'utiliser sans problème (quoi que pour ma part, j'attends encore plusieurs papiers donc il est encore trop tôt pour le soumettre par ImpôtNet). Voici de quoi a l'air le logiciel en action dans mon environnement Ubuntu :



Enfin, que vous l'utilisiez sous Windows ou Linux, n'oubliez surtout pas de faire les mises à jour par Internet pour obtenir les corrections aux calculs et les différents ajustements sur les formulaires les plus récents.


Tags: Linux, Virtualisation

mercredi 3 février 2010

Supprimer les doublons dans SQL Server

Publié par Infinite Loop, à 21 h 00 2 commentaires

Un client nous a envoyé une liste de ses contacts dans le but de les importer dans un de nos systèmes. En recevant le fichier, mon chargé de projet a jeté un coup d'oeil et a remarqué qu'il comportait de nombreux doublons. Il m'a suggéré d'utiliser un tableur comme Excel pour faire le ménage de la liste et éliminer les duplicatas pour que chaque adresse courriel demeure unique.

À vrai dire, je ne maîtrise pas tout à fait les formules Excel alors mon réflexe de programmeur a été d'importer la liste dans une table temporaire de la base de données et d'évaluer combien d'enregistrements s'y retrouvent plus d'une fois :

SELECT email, count(*)
FROM contacts
GROUP BY email
HAVING count(*) > 1
En créant la table temporaire, j'ai pris soin d'ajouter une clé primaire IDENTITY(1,1) pour pouvoir en tirer profit au moment de la suppression.
DELETE c1
FROM contacts c1, contacts c2
WHERE c1.email = c2.email
AND c1.id > c2.id
Comme la séquence de la clé primaire id s'incrémente pour chaque enregistrement au moment de l'importation, je peux m'en servir pour supprimer les enregistrements identiques trouvés avec le produit croisé effectué sur la table elle-même.

Ainsi, deux enregistrements possédant la même clé email auront deux identificateurs différents :
id   name      email
100 code 18 code18.blogspot@gmail.com
200 code 18 code18.blogspot@gmail.com
Pour chaque combinaison, seul celui dont l'ID est le plus petit sera conservé et les autres seront retirés. Sur une table déjà existante, j'aurais plutôt eu tendance à comparer le champ de date de création ou de modification afin de ne conserver que le plus récent.


Tags: SQL Server

mardi 2 février 2010

Conclusion Vidéotron

Publié par Infinite Loop, à 19 h 46 4 commentaires

Si vous avez suivi la saga sur mes problèmes avec Vidéotron, que ce soit sur mon blogue ou sur Twitter, vous serez peut-être surpris d'apprendre que les défaillances techniques sont désormais du passé.

Après près d'un an d'attente et des appels à répétition, la qualité des services (forfait trio) semble désormais stable une fois pour toutes. Vous ne pouvez même pas imaginer les réponses insignifiantes que les préposés au service à la clientèle ont pu évoquer. Tout ça pour me faire patienter pendant la mise à jour des infrastructures dans mon secteur. Du moins, c'est ce qu'un commis plus honnête que les autres m'a avoué. Je leur laisse le bénéfice du doute.

De plus, je courrais depuis longtemps après le service de facturation pour obtenir un crédit qu'ils m'avaient accordé et que je n'avais jamais reçu (montant forfaitaire pour dédommager 4 jours entiers de service interrompu). Selon les gens à qui j'ai parlé, je devais moi-même prouver qu'ils me l'avaient promis pour que j'y ai droit!

Pendant des démarches d'environ 3 heures où j'ai discuté avec plusieurs employés à différents niveaux, je suis tombé sur un superviseur qui m'a gardé en attente de nombreuses reprises soi-disant pour vérifier dans les archives des bandes sonores que ça avait bien été dit. Quel imbécile ! Comme si j'allais gober ça... Mais par principe, j'ai patiemment attendu dans l'espoir que ça débloque. En vérité, je crois qu'il espérait que je me tanne et que je raccroche, ce que je n'ai pas fait pour les affronter. Lorsqu'il a finalement repris la ligne, c'était pour me dire qu'il était prêt à me créditer approximativement 2$ sur ma prochaine facture de téléphone. Si je voulais demander un crédit supplémentaire pour les autres services, je devais patienter à nouveau. C'est là que j'ai abandonné.

Entre temps, un ami a voulu s'abonner à un service de Vidéotron et m'a demandé de le recommander par leur site web (programme de parrainage) pour que je puisse recevoir un crédit de 50$. Comme un prix de consolation. Ici aussi j'ai dû insister pour l'obtenir. Non pas ce mois-ci, peut-être le prochain... ou le suivant...

Récemment, j'ai téléphoné au service de facturation pour savoir ce qu'il advenait du crédit. J'ai donné le numéro de confirmation que mon ami m'avait fait parvenir et ils m'ont promis que ça paraîtrait sur la prochaine facture. J'en ai profité pour ramener sur le tapis le crédit initial et j'ai expliqué brièvement mon histoire. En quelques minutes, la personne avait obtenu l'autorisation de son supérieur et j'avais soudainement droit au crédit, pour obtenir réparation et ma satisfaction.

Normal, ma période de renouvellement (contrat d'un an) approche et je suis certain que Vidéotron ne voudra pas me perdre comme client. Et devinez quoi, tous les crédits sont appliqués sur ma plus récente facture ! Suis-je satisfait pour autant ? Non, pas vraiment. Mais le dénouement et la victoire font du bien.

Maintenant, la prochaine étape :

  • donner une ultime chance à Vidéotron
  • abandonner le câble et choisir un nouveau fournisseur d'accès à Internet et de téléphonie
  • aller voir ce qu'offre des concurrents comme Bell et Distributel
  • examiner les services alternatifs comme Vonage
Selon vos expériences, quelle serait vos recommandations ?


Tags: Le coin du geek

lundi 1 février 2010

Valeur par défaut d'un champ SQL Server

Publié par Infinite Loop, à 18 h 42 1 commentaire

Il y a quelques jours, j'ai expliqué comment on pouvait lire la valeur par défaut d'un champ d'une table PostgreSQL.

Pour faire l'équivalent sous SQL Server, on peut utiliser une vue système nommée information_schema.columns :

SELECT column_default
FROM INFORMATION_SCHEMA.COLUMNS
WHERE table_name = 'nom_de_la_table'
AND column_name = 'nom_de_la_colonne'
Quand on définit une valeur par défaut par une interface graphique, on ne le remarque pas mais on crée en réalité une contrainte. Comme si on la créait comme ceci :
CONSTRAINT nom-de-contrainte DEFAULT valeur
À ce stade, la contrainte existe de façon indépendante et elle peut ensuite être appliquée à une colonne :
ALTER TABLE nom-de-la-table
ADD CONSTRAINT nom-de-contrainte DEFAULT valeur FOR nom-de-colonne


Tags: SQL Server

Messages plus récents Messages plus anciens Accueil
S'abonner à : Messages (Atom)
    Suivre @code18 sur Twitter

    Catégories

    • Apache (21)
    • Citations (167)
    • Club Vidéo (24)
    • Coffre à outils (56)
    • CSS (8)
    • Curiosités (117)
    • Design Pattern (2)
    • Drupal (8)
    • Easter Eggs (22)
    • Extensions Firefox (20)
    • GIMP (7)
    • Histoire (21)
    • HTML (32)
    • Humour (57)
    • Intégration (34)
    • iPod (12)
    • JavaScript (110)
    • Jeu de combat (6)
    • Le coin du geek (128)
    • Liens (12)
    • Linux (56)
    • Livres (78)
    • Lois et principes (46)
    • Marché des saveurs (26)
    • Mathématique (18)
    • Mobile (5)
    • Montréal (32)
    • Musique (112)
    • Pancartes et écriteaux (16)
    • Perl (8)
    • Pérou (1)
    • PHP (130)
    • PostgreSQL (44)
    • Programmation (105)
    • Saviez-vous que (55)
    • Sécurité (22)
    • SEO (5)
    • SQL Server (22)
    • Vieilles publicités (6)
    • Virtualisation (8)
    • Voyages (1)
    • Zend Framework (26)

    Divers

    Archives

    • ►  2015 (6)
      • ►  août 2015 (1)
      • ►  juillet 2015 (1)
      • ►  février 2015 (3)
      • ►  janvier 2015 (1)
    • ►  2014 (8)
      • ►  décembre 2014 (1)
      • ►  novembre 2014 (1)
      • ►  octobre 2014 (1)
      • ►  août 2014 (2)
      • ►  juillet 2014 (2)
      • ►  janvier 2014 (1)
    • ►  2013 (53)
      • ►  décembre 2013 (2)
      • ►  novembre 2013 (1)
      • ►  octobre 2013 (3)
      • ►  septembre 2013 (2)
      • ►  août 2013 (5)
      • ►  juillet 2013 (3)
      • ►  juin 2013 (5)
      • ►  mai 2013 (3)
      • ►  avril 2013 (7)
      • ►  mars 2013 (7)
      • ►  février 2013 (11)
      • ►  janvier 2013 (4)
    • ►  2012 (105)
      • ►  décembre 2012 (8)
      • ►  novembre 2012 (5)
      • ►  octobre 2012 (4)
      • ►  septembre 2012 (1)
      • ►  août 2012 (8)
      • ►  juillet 2012 (7)
      • ►  juin 2012 (7)
      • ►  mai 2012 (10)
      • ►  avril 2012 (13)
      • ►  mars 2012 (15)
      • ►  février 2012 (15)
      • ►  janvier 2012 (12)
    • ►  2011 (146)
      • ►  décembre 2011 (14)
      • ►  novembre 2011 (11)
      • ►  octobre 2011 (12)
      • ►  septembre 2011 (13)
      • ►  août 2011 (15)
      • ►  juillet 2011 (17)
      • ►  juin 2011 (18)
      • ►  mai 2011 (15)
      • ►  avril 2011 (9)
      • ►  mars 2011 (7)
      • ►  février 2011 (3)
      • ►  janvier 2011 (12)
    • ▼  2010 (398)
      • ►  décembre 2010 (29)
      • ►  novembre 2010 (28)
      • ►  octobre 2010 (32)
      • ►  septembre 2010 (34)
      • ►  août 2010 (22)
      • ►  juillet 2010 (35)
      • ►  juin 2010 (42)
      • ►  mai 2010 (36)
      • ►  avril 2010 (37)
      • ►  mars 2010 (34)
      • ▼  février 2010 (32)
        • Comment dépenser 100$ de vins en 3 minutes
        • Citation no. 71 sur l'emploi
        • Comment expliquer REST à sa femme
        • L'informatique, comme la mécanique
        • Propriétaire d'une fonction Postgres
        • Le Parfum de Süskind - Fin alternative
        • JSONP pour récupérer des données distantes
        • Cacher les erreurs PHP en production
        • Citation no. 70 sur les vertus d'un programmeur
        • Nouveau look de Code 18
        • Des visiteurs d'un peu partout
        • Vider un select box en JavaScript
        • Pourquoi les programmeurs ont des rages de sucre?
        • Intégrer une carte Bing Maps
        • IBM Glass Engine
        • Voir Back to the Future d'une autre façon
        • Faits saillants d'une soirée atypique
        • Citation no. 69 sur la culture
        • Konami Code sur PHP.net
        • Résultat au test de geek
        • Processeur ultra-performant !
        • Écouteurs de contrefaçon
        • Transférer un profil utilisateur à PayPal
        • Noms de familles qui se terminent par LX
        • Erreur sur la personne
        • Citation no. 68 sur l'optimisation du code
        • Aliss de Patrick Senécal
        • Spécial du vendredi : Chewbacca
        • Wine : exécuter un logiciel Windows sous Linux
        • Supprimer les doublons dans SQL Server
        • Conclusion Vidéotron
        • Valeur par défaut d'un champ SQL Server
      • ►  janvier 2010 (37)
    • ►  2009 (430)
      • ►  décembre 2009 (32)
      • ►  novembre 2009 (34)
      • ►  octobre 2009 (33)
      • ►  septembre 2009 (37)
      • ►  août 2009 (37)
      • ►  juillet 2009 (39)
      • ►  juin 2009 (38)
      • ►  mai 2009 (37)
      • ►  avril 2009 (35)
      • ►  mars 2009 (37)
      • ►  février 2009 (32)
      • ►  janvier 2009 (39)
    • ►  2008 (84)
      • ►  décembre 2008 (34)
      • ►  novembre 2008 (39)
      • ►  octobre 2008 (11)

    Abonnés

Copyright © All Rights Reserved. Code 18 | Converted into Blogger Templates by Theme Craft