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

lundi 31 mai 2010

Buckethead et son chapeau PFK

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

Il y a des découvertes qu'on fait comme ça par hasard quand on explore l'encyclopédie Wikipedia. J'ai eu le privilège (car c'en est un) de tomber sur la fiche de Buckethead, un artiste assez excentrique qui porte un chapeau de PFK en guise de déguisement de scène. Son vrai nom : Brian Carroll. Il a un talent phénoménal et il a enregistré 29 albums solos jusqu'à maintenant et a collaboré à de nombreux autres.

C'est rien quand on pense que Normand L'Amour a enregistré 1500 chansons réparties sur 144 albums, dont certaines en plusieurs langues. En effet, Normand chante en plus de 75 langues, ses textes étant cependant traduits par un logiciel de traduction pas toujours fidèle. La cuillère dans la tasse de thé est d'ailleurs un exploit dans lequel il réussit à chanter en 29 langues en une seule chanson. Poulet Frit Kentucky ou le Restaurant Madrid, il y a toujours quelque chose de douteux qui en ressort. Est-ce pour ça que les Denis Drolet faisaient la campagne de PFK il y a quelques années ?

Voici les publicités tirées du site d'Infopresse : annonce 1, annonce 2, annonce 3. Et le site qui m'a permis de les retrouver (mais celui-là n'a rien de mauvait goût). Et tant qu'à rajouter de l'huile sur le feu, remémorons-nous des souvenirs du PFK kid, tiré du film Pea Soup de Falardeau...

Mais revenons à Buckethead un tout petit peu. Je suis allé écouter 2 albums au hasard dans un poste d'écoute web : Kaleidoscalp (produit par John Zorn) et Shadows Between the Sky. J'ai préféré ce dernier, un peu plus rock et moins avant-gardiste. Je dirai aussi que l'emballage n'a rien à voir avec la qualité qu'on y trouve à l'intérieur. Comme disait le slogan, c'est bon à s'en lécher les doigts!

Biographie fictive
Sur le site officiel de Buckethead figure une biographie fictive rédigée par un certain Ronald L. Witherspoon, présenté comme « historien », biographie selon laquelle Buckethead serait né dans une ferme, au milieu de poulets. Après avoir subi de mauvais traitements de la part de ses « éleveurs » il se serait réfugié auprès de ses « amis » les poulets qui, appréciant beaucoup la compagnie du jeune garçon, ces derniers lui auraient scarifié le visage, le condamnant ainsi à porter un masque. Le seau sur sa tête représenterait un récepteur d'âme de poulet pour qu'il puisse recevoir leurs idées musicales.

Buckethead, marqué par le triste sort réservé aux poulets de la ferme, tenterait depuis de reproduire leurs cris de souffrance à l'aide de sa guitare. Buckethead joua beaucoup pour ses amis les poulets et éleva rapidement son niveau de jeu.

Je vous invite maintenant à passer du côté du site GeekWeek qui a fait un bon reportage sur lui en janvier dernier : Unknown Guitar Hero.

Merci à Wikipedia, source infinie de savoir et à PFK pour une source indéniable de gras saturés. Ah puis juste avant de quitter, saviez-vous que GRAS était l'acronyme pour "Generally recognized as safe" ? Pas trop rassurant!


Tags: Marché des saveurs, Musique

dimanche 30 mai 2010

Site de vente de mp3 usagés

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

Pour se débarrasser de nos vieilles traineries, on peut se tourner vers les marchés aux puces (bazars), les ventes de garages, les sites LesPAC, Kijiji ou eBay. Plusieurs personnes seront heureuses de se procurer des items d'occasion pour une fraction du prix.

Pour se défaire de nos vieux CD et se faire un peu d'argent, plusieurs feront un détour obligé par les boutiques de l'avenue Mont-Royal, dont l'incontournable L'Échange. Si vous êtes acheteurs, d'innombrables opportunités de faire des trouvailles s'offrent à ceux qui sont prêts à venir fouiller pour découvrir la perle rare. Et c'est une façon de recycler nos disques et de leur donner une deuxième vie (tout comme les livres).

Dans le cas des marchands de disques usagés, si un disque est rapporté et revendu à quelques reprises, ce ne sont pas les producteurs qui empochent les profits mais bien les marchands. Et quand on sait que le CD est acheté au maximum 2$ pour être revendu 10$, la marge de profit est plus alléchante sur un disque usagé que sur un neuf "shrink-wrapped" acquis du distributeur. Le même disque usagé est vendu à maintes reprises et c'est loin d'être équitable pour l'artiste qui ne touche rien !

Avec les CD qui tendent à disparaître et une génération qui s'est tournée vers le format mp3, iTunes est devenu la boutique par excellence (11 millions de pistes) pour faire des acquisitions et des découvertes musicales, à un prix moindre que le CD traditionnel (à moins que vous les obteniez d'une façon moins légale ou socialement acceptée ?).

Somme toute, comme je disais cette semaine, chaque personne possède maintenant sa propre collection mp3. Et si vous êtes comme moi, vous avez probablement de la musique numérique que vous vous êtes procuré qui a fait son temps, que vous n'écoutez plus et qui ferait votre bonheur de revendre à ceux intéressés et ainsi libérer de l'espace pour vos coups de coeur musicaux du moment.

L'idée est farfelue mais quelqu'un y a déjà pensé. En décembre 2008, on apprenait que le site Bopaboo était en version beta pour tenter de mettre à la disposition des membres un système de vente de mp3 usagés au coût fixe de 0,25$ par piste (au lieu de 0,99$ à 1,29$ par piste sur iTunes pour un mp3 "neuf"). Il semblerait que le projet n'ait pas été viable puisque le site n'existe plus ou est à l'abandon. Au moins, on ne pourra pas dire qu'ils n'ont pas essayé.

Avec le piratage toujours croissant, l'industrie trouve des moyens pour arrêter l'hémoragie et récupérer son dû. Des services de musique sur demande comme Rhapsody proposent un catalogue de plus de 9 millions de pièces qu'on peut écouter à sa guise moyennant un abonnement mensuel variant entre 10$ et 15$ par mois. Pour que les artistes fassent partis du catalogue, ils doivent en arriver à un accord avant de pouvoir diffuser la musique. Donc il y aura toujours certains artistes qui seront absents du catalogue.

Avec un abonnement annuel sur Rhapsody, c'est un minimum de 120$ qui revient dans les poches de l'industrie, soit l'équivalent du téléchargement de 12 albums sur iTunes. Mais combien dépense le consommateur moyen pour faire le plein de musique ?

Pour moi, c'est ou ce serait intéressant :

  • parce que je dépense plus de 120$ annuellement
  • si le service était disponible au Canada (réservé aux États-Unis)
  • si la librairie était plus vaste (artistes plus obscurs ou underground, groupes québécois)
  • si des vieux groupes disparus s'y trouvaient
  • si je pouvais remplacer l'ensemble de ma collection par ce service, sans avoir à faire de compromis
  • on est dépendant de la disponibilité du service en cas de panne ou de fermeture définitive
  • pour des mélomanes comme moi qui écoutent de la musique constamment, la bande passante peut devenir un problème
Comme les livres électroniques, serait-il possible d'imaginer que certaines pistes musicales seraient libres de droit après un certain nombre d'années ?

Parce qu'on sait que les artistes font peu d'argent avec la vente des enregistrements, qu'il est possible d'enregistrer à moindre coût et que des subventions sont souvent à portée de main, serait-il possible de lancer des albums libres de droits pour l'écoute par le grand public (qui sait si on peut s'inspirer des license GPL ou Creative Commons) ? Évidemment, il faudrait des règles strictes pour l'utilisation des pistes à la radio commerciale, au cinéma, etc.

Est-ce réaliste de penser à un service d'emprunt numérique gratuit, inspiré par ce que fait la BAnQ avec les livres, CD et DVD ? Ça serait la culture libre au service de tous. Mais en contrepartie, quand on voit les visiteurs s'installer à la bibliothèque avec leur laptop pour venir encoder à la chaîne des disques en mp3, on se voit dans une impasse vis-a-vis la solution idéale.

Bref, avec ce qui est offert présentement comme service de diffusion de musique sur demande, ce n'est pas adapté à mes besoins. Là non plus, je ne serai pas un "early adopter" et je m'en tiendrai encore quelques temps au CD et au format mp3.

D'ailleurs, j'ai toujours vu le CD comme étant à l'origine une carte de visite qu'on acquérait à la sortie d'un spectacle, comme un souvenir. Assister à une performance musicale est une forme d'expérience unique dans le temps et le lieu, qui ne se répètera pas (du moins pas de la même façon). Comme toute chose, si on a apprécié l'expérience, on aura tendance à vouloir la répéter, d'où la possibilité d'acheter un enregistrement sonore aceptisé, qui ne laisse pas de place à la surprise. L'écoute est prévisible, rien qui n'aide à sortir de sa zone de confort.

L'avenir de la musique est dans les spectacles où la création prend tout son sens. Et c'est là qu'on peut réellement venir en aide aux artistes.


Tags: Musique

Citation no. 84 sur les programmeurs

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

Le plus alarmant, c'est qu'un programmeur est tout à fait capable de réaliser la même tâche de deux ou trois façons différentes, parfois inconsciemment, mais bien souvent tout simplement pour changer, ou pour fournir une variation élégante.

- A. R. Brown and W. A. Sampson


Tags: Citations

samedi 29 mai 2010

Microsoft compare IE6 à du lait périmé

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

Enfin, Microsoft lance une campagne pour tuer son fureteur Internet Explorer 6 et essayer de convaincre les utilisateurs qui continuent d'utiliser cette version désuette de passer à IE 8.

Sa campagne publicitaire, la division australienne s'inspire d'un berlingot de lait périmé dont la date d'expiration indique que le produit est meilleur avant août 2001. Curieux pour un browser lancé le même mois. Est-ce que ça ne sous-entend pas qu'il était passé date dès sa sortie ?



Elle suggère aussi que si vous connaissez des amis qui l'utilisent encore, vous pouvez leur envoyer une suggestion sous forme de "lait caillé". Do you know someone who would drink nine-year-old milk ? Surprenant de la part de Microsoft.


Tags: Le coin du geek

vendredi 28 mai 2010

Maison spéciale dans une colline en Suisse

Publié par Infinite Loop, à 16 h 44 0 commentaire

Ma copine m'a fait parvenir par courriel une série de photos d'une maison vraiment spéciale. Au lieu de faire suivre à mes contacts, je me suis dit que ça serait bien de les publier ici. C'est une vraie curiosité architecturale et j'avoue que j'aimerais bien avoir une résidence comme celle-là.

Le email contenait uniquement les photos alors j'ai dû faire quelques recherches pour savoir où ça se trouvait. Plusieurs sites en ont parlé et c'est là que j'ai pu constater que cette villa se trouve dans le village de Vals en Suisse et a été conçue par l'architecte Christian Müller en collaboration avec SeARCH Netherlands.

Vous pouvez cliquer sur les photos pour les agrandir. C'est phénoménal.




Finalement, c'est comme le projet de maison de Hobbit en plus luxueux.


Tags: Curiosités

jeudi 27 mai 2010

Extraire les tags ID3 des mp3

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

Je possède une collection mp3 que je conserve sur un disque dur portatif et que je traine au bureau tous les jours. Parfois, certains collègues de travail me demandent ce que j'écoute, s'informent de mes goûts car ils n'ont aucun moyen de le savoir puisque je n'utilise plus iTunes et que je ne partage pas le répertoire de musique sur le serveur comme le font certains.

Je peux nommer quelques groupes que j'écoute dans le moment mais sinon, comment répondre à cette question sans demeurer vague et pour être fidèle à tout ce qui me plait ? Pour faire simple, mieux vaut exporter la liste des artistes de ma collection.

Comment procéder ? Par programmation, avec un petit script Perl qui lira les tags ID3v2 de chaque fichier. D'abord, j'ai choisi d'utiliser le module MP3::Tag (disponible via CPAN - Comprehensive Perl Archive Network) que je devrai installer sur Ubuntu :

Ouvrez un terminal :

sudo perl -MCPAN -e shell

Ceci permet d'ouvrir un shell en mode interactif. Une fois dans le shell CPAN :

install MP3::Tag

Ensuite, ça se fait automatiquement. Référez-vous à la documentation pour plus de détails sur l'installation manuelle.

Mon but est d'obtenir l'ensemble des fichiers mp3 dans mon répertoire Music et d'extraire l'artiste du tag ID3 pour chacun d'eux. Je voudrai aussi que la liste comprenne les fichiers dans les sous-répertoires, donc récursivement (mes fichiers sont classés par artistes et chaque album possède aussi son propre dossier).

La commande suivante permettra de les lister tous :

find "/home/code18/Music/" -name \*.mp3 -print

Le script commenté (extract-artists.pl) :

#!/usr/bin/perl

use MP3::Tag;

my @list = ();

# exécution de la commande récursive, notez l'utilisation du backtick
my $output = `find "/home/code18/Music/" -name \*.mp3 -print`;

# chaque ligne de l'output correspond à un fichier
@files = split(/\n/,$output);

foreach $file (@files) {
$mp3 = MP3::Tag->new($file);
$mp3->get_tags();

if(exists $mp3->{ID3v2} ){
push(@list, $mp3->{ID3v2}->artist);

# autres
#print $mp3->{ID3v2}->artist . "\n";
#print $mp3->{ID3v2}->title . "\n";
#print $mp3->{ID3v2}->album . "\n";
#print $mp3->{ID3v2}->year . "\n";
#print $mp3->{ID3v2}->genre . "\n";
}
else{
print 'Oups, pas de tag ID3v2';
}

$mp3->close();
}

# noms uniques
my %artists = ();
foreach my $name (@list) {
$artists{$name} = 1;
}
my @unique = keys(%artists);

open(FILE, '>>/home/code18/Desktop/artistes.txt');
foreach $artist (sort(@unique)){
print FILE "$artist\n";
}
close(FILE);
On est maintenant prêt à l'exécuter. Dans un terminal :

perl extract-artists.pl

À la fin, un fichier artistes.txt sera créé contenant la liste des noms uniques des artistes, à raison d'un par ligne (celui pour ma collection pèse 12 kb).

Notez que plus la collection est volumineuse, plus le script prendra du temps à rouler (quelques minutes). Il y a aussi un hic dans le script : la fonction sort() trie les noms par ordre alphabétique en tenant comptes des minuscules, majuscules et accents. Les noms en minuscules seront à la fin, suivi des noms accentués.


Tags: Musique, Perl, Programmation

mercredi 26 mai 2010

Gaffe sous systèmes Unix / Linux

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

J'étais sur Stack Overflow en train de lire l'article What are five things you hate about your favorite language? quand j'ai remarqué la publicité pour Server Fault, le service équivalent de questions / réponses destiné aux administrateurs réseaux.



... so you don't make a rm -rf / mistake again.

En effet, ça laisse sous-entendre une belle gaffe, un peu dans le style format c: sous environnement Windows. Fidèle à mon habitude, je suis allé voir dans quel contexte ça devait être utilisé et j'ai décortiqué la commande.

  • rm : remove
  • -r : récursif, les répertoires et leur contenu
  • -f : force la suppression sans demander la confirmation
Donc la commande indiquée supprime tous les fichiers depuis la racine (en autant qu'on est superuser).

Je me suis dit que j'allais l'essayer, juste pour voir. J'ai donc pris un snapshop d'une machine virtuelle Ubuntu sous VMWare et j'ai lancé la commande sudo rm -rf /. Ubuntu m'indique :

rm: cannot remove root directory '/'

Mais je peux supprimer mon répertoire utilisateur courant si je fais sudo rm -rf ~/ et celui du root avec sudo rm -rt /root. Ne l'essayez pas, faites moi confiance. J'ai ensuite restauré le snapshop. Vous pourrez lire d'autre histoires désastreuses dans un autre article : My 10 UNIX Command Line Mistakes.

La publicité de Server Fault a attiré mon attention à cause du jargon technique. Et j'ai vu qu'il y en avait d'autres. En insistant un peu sur la touche F5, j'ai pu extraire une dizaine de messages comiques tirés de la campagne publicitaire :
  • so you don't make a rm -rf / mistake again.
  • because Hulk smash server when it BSOD. (Blue Screen of Death)
  • and you thought Man pages were informatives.
  • because there's no code fix for a BSOD.
  • it's live opening a can of IT whoopass.
  • or you could try rebooting yet again.
  • it's like the sysadmin you wish you had.
  • because you always wanted to be a sysop.
  • because sysadmins have never been sexier.
  • because servers need some love too.
  • mmm, mmm, mmm, tastes like sysadmin.


Tags: Linux

Marchés boursiers galactiques

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

Crise économique, récession, des banques ont fait faillite, l'Euro et d'autres devises sont en chute libre et les bourses agissent en montagnes russes. Votre portefeuille financier fond à vue d'oeil et vous broyez du noir à force d'être impuissant face à vos actifs qui disparaissent ?

Il est temps de joindre le côté obscur de la force et d'investir dans une valeur refuge. A New Hope.

Source : deviantart / diablo2003

Autrement, l'empire risque la déchéance.


Tags: Humour, Le coin du geek

mardi 25 mai 2010

Raccourcir les chaînes d'objets en JavaScript

Publié par Infinite Loop, à 10 h 27 3 commentaires

Voici un petit truc que j'avais entendu parler et que j'ai testé pour constater qu'il est possible d'optimiser la performance du JavaScript si vous faites des chaînes d'objets du type :

window.document.forms.myForm.field
Chaque point dans la référence à l'objet nécessite une recherche pour accéder à sa partie. Si la chaîne est référencée plus d'une fois, on peut l'assigner à une variable qui pointera directement sur l'objet et qui permettra de réduire le nombre de recherches nécessaires.

Voici un petit test qui démontre le gain de performance :
var foo, start, end, executionTime;

/* Test 1 */
start = new Date().getTime();
for(var i=0 ; i<10000 ; i++){
foo = window.document.forms.myForm.field;
}

executionTime = new Date().getTime() - start;
console.log('Test 1 : %i', executionTime);

/* Test 2 */
var refForm = window.document.myForm;

start = new Date().getTime();
for(var i=0 ; i<10000 ; i++){
foo = refForm.field;
}

executionTime = new Date().getTime() - start;
console.log('Test 2 : %i', executionTime);

/* Test 3 */
var refElem = window.document.myForm.field;
start = new Date().getTime();

for(var i=0 ; i<10000 ; i++){
foo = refElem;
}

executionTime = new Date().getTime() - start;
console.log('Test 3 : %i', executionTime);
  • Le premier test utilise la notation longue à l'intérieur de la boucle de 10 000 itérations. Sans surprise, c'est le plus lent (44).
  • Le deuxième test retient la référence au formulaire et un seul test doit être effectué pour accéder à field. On note que la performance est grandement améliorée (8).
  • Le troisième test conserve la référence directe à field donc plus aucune recherche n'est nécessaire. C'est quasi instantané (1).
Les résultats affichés dans Firebug :


Tags: JavaScript

lundi 24 mai 2010

Simulation de combat - Étape 4

Publié par Infinite Loop, à 12 h 43 0 commentaire

Une fois les bases du jeu établies, c'est là que ça devient intéressant. Nous sommes en mesure de générer un combat entre deux adversaires, en tenant compte d'une force arbitraire et d'un facteur de défense. Maintenant, il est temps de voir comment faire s'affronter plus d'un adversaire, dans une bagarre du type "royal rumble" où les combattants sont éliminés un par un et où seul le dernier combattant sera désigné comme vainqueur. J'avais trouvé cette analogie avec la lutte mais comme je suis loin d'être amateur de cette discipline sportive, je crois que je pourrais dire que c'est aussi comme dans les films Highlander : ils s'éliminent entre eux jusqu'à ce qu'il n'en reste qu'un.

Allons-y pour un combat à plusieurs joueurs où chacun tente de sauver sa peau. À cette étape-ci, nous n'aurons pas à modifier la classe Fighter. Tout se passera dans l'arène.

On commencera par générer un nombre de combattants à l'aide d'une boucle for sur le constructeur. Pour les fins de l'exercice, je générerai un nom générique pour chaque combattant en utilisant l'itérateur $i et je les empilerai dans la liste $fightersList. Au fur et à mesure que les combattants tomberont au combat, on les retirera de cette liste.

// modifiez cette constante pour plus de combattants
DEFINE('NB_FIGHTERS', 10);

for($i=1 ; $i<=NB_FIGHTERS ; $i++){
$fightersList[] = new Fighter('Fighter # ' . $i);
}
Avec plus de deux combattants, on voudra éviter d'ajouter une vérification de la fonction isKnockOut() sur chaque objet. Il sera préférable de trouver un autre moyen qui prendra en charge un nombre variable de combattants.
// ne plus faire cela
while( !( $player1->isKnockOut() || $player2->isKnockOut() ) ){
Avant la boucle while, assignez le compte initial de la liste à une variable qui nous servira à connaître le nombre de combattants encore en état de se battre.
$fightersLeft = count($fightersList);
La boucle while pourra être remplacée ainsi :
// tant qu'il reste plus d'un combattant, il peut y avoir face à face
while( $fightersLeft > 1 ){
shuffle($fightersList);
list($attacker, $defender) = array_rand($fightersList, 2);

$damage = $fightersList[$attacker]->hit($fightersList[$defender]);

if($damage > 0){
echo $fightersList[$attacker]->getName() . ' hits ' . $damage . ' HP on ' . $fightersList[$defender]->getName() . "\n";
}
else{
echo $fightersList[$attacker]->getName() . ' misses ' . $fightersList[$defender]->getName() . "\n";
}

if( $fightersList[$defender]->isKnockOut() ){
echo '<strong>' . $fightersList[$defender]->getName() . ' is KNOCK OUT</strong>' + "\n";

// retirer le perdant de la liste des combattants
unset($fightersList[$defender]);
$fightersLeft--;
}

// lorsqu'il en reste 1, l'attaquant est automatiquement le gagnant
if($fightersLeft == 1){
$winner = $fightersList[$attacker];
}
}
Pour une raison que j'ignore, si je n'utilise pas la fonction shuffle() sur la liste avant d'appeler array_rand(), ce sera Fighter #1 qui remportera les combats à 99% du temps. L'environnement PHP sur lequel je développe présentement est PHP 5.2.8. La documentation d'array_rand() indique à partir de PHP 5.2.10, le tableau résultant des clés ne sera plus mélangé. Pourtant, il semble y avoir un défaut. Peut-être est-ce dû à PHP version Windows ?

Pour déterminer le gagnant, j'aurais pu aussi vérifier chaque objet pour voir s'il était KO et conserver une référence au seul qui ne l'est pas :
$winner = null;
foreach($fightersList as $fighter){
if(!$fighter->isKnockOut()){
$winner = $fighter;
}
}
Mais en conservant le compte de $fightersLeft et en retirant les perdants de la liste, on sait que si sa valeur est 1, il ne restera qu'un objet dans la liste de combattants actifs, donc le gagnant (ça éviter aussi d'appeler count() à chaque fois).

Pour la prochaine étape, pourquoi ne pas tenter de diviser les combattants en deux clans ennemis pour générer une vraie guerre ?


Tags: Jeu de combat, PHP, Programmation

Citation no. 83 sur la conception de logiciels

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

Il existe deux façons de faire la conception d'un logiciel : l'une est de faire si simple qu'il n'y a visiblement aucune lacune, et l'autre est de le rendre si compliqué qu'il n'y a pas de lacunes évidentes.

- Charles Antony Richard Hoare


Tags: Citations

dimanche 23 mai 2010

Journée presque parfaite, sans compromis

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

Lundi le 24 mai sera la fête de la Reine, la fête de Dollard ou la journée nationale des Patriotes. À votre choix. D'une façon ou d'une autre, ça se traduit par une fin de semaine de trois jours, ce qui est toujours apprécié.

C'est pourquoi il vaut mieux profiter du temps qui nous est imparti, surtout avec la température estivale qui était au rendez-vous. Samedi, nous n'avions rien de prévu au programme. Sauf qu'on savait qu'on regarderait le match de hockey avec un ami à 15h. En début d'après-midi, nous sommes allés le rejoindre sur une terrasse du Marché Jean-Talon. Direction Marché des saveurs pour dénicher une nouvelle sorte de bière à déguster entre amis.

On a accroché sur les grosses bouteilles de la microbrasserie À La Fût de St-Tite, des cruchons de 1,9 litres (environ 17$) qui donnent le sentiment d'abondance. Parfait pour étancher la soif de partisans qui croient encore à un rebond de l'équipe montréalaise. Notre choix s'est arrêté sur La Crique, une blanche aux cerises à 6,7% qu'on s'est partagé avec plaisir. J'avais déjà goûté la Mékinoise du même producteur et quand il fait chaud, une blanche est le choix idéal pour se rafraîchir.

Pour suivre le match, il nous fallait les traditionnels chips d'accompagnement. Quand nous sommes passés devant Tortilleria Maya sur Jean-Talon, on s'est dit que des nachos avec de la salsa maison seraient délicieux (ils sont fait au Québec, à Longueuil plus précisément). Pour 3$ le sac de 280g, mieux vaut acheter local plutôt que de choisir des Tostitos. Saveur recommandée : légumes (plus goûteux que les jalapenos et chipotle).

Comme on était à côté, un détour obligé par Italmelodie s'imposait. Le but : magasiner un module multi-effets pour la guitare. Je me suis finalement laissé tenter par un Digitech RP155 à 109$ (bloc d'alimentation inclut). Comme je suis en appartement, c'est difficile d'utiliser mon amplificateur lorsque j'ai envie de jouer. Je dois positionner le bouton de volume au maximum à 1 pour ne pas déranger les voisins. Alors qu'avec un module qui possède une prise pour écouteurs, je vais pouvoir pratiquer sans souci pour le voisinage (et surtout à l'heure que je veux).

La partie de hockey était sur le point de commencer. Dès la première période complétée, le score affichait toujours 0 à 0. Nous n'avions plus de salsa alors nous avons fait un aller-retour rapide au Provigo pour faire le plein. Et vous savez quand je vois des nouvelles saveurs de chips, je suis le public cible par excellence pour en faire l'essai... On est aussi reparti avec des croustilles au nom aussi évocateur que "Hot dog du stade". Et oui, ça goûte vraiment le hot dog relish moutarde. Dire qu'il y a des mauvaises langues qui disent que je vire émotif quand je parle de bouffe... OK, c'est un peu vrai.

À notre retour, le pointage était déjà 1 à 0 pour l'adversaire. Et ce fût la débandade. Une défaite qui met le CH au pied du mur puisqu'ils feront face à l'élimination lundi. Après le match, nous avions encore toute la soirée devant nous. C'est rare un match en après-midi. L'idée d'aller au cinéma fût lancée, mais il fallait se dépêcher pour choisir un film et s'y rendre en métro.

Sur un coup de tête, même si nous savions que nous serions en retard, nous nous sommes dirigés vers le cinéma Quartier Latin pour voir la représentation de 19h de The Trotsky (version française), un film montréalais suggéré par ma blonde. 19h13... Achat des billets au guichet pour éviter la file et hop, nous voilà assis dans la salle juste à temps pour ne rien manquer (à part les bandes-annonces).

En direction de la salle, j'avais le goût de boire une boisson gazeuse mais j'hésitais à aller commander au comptoir. J'ai aperçu une machine distributrice qui n'affichait aucun prix sur les produits. J'ai inséré quelques pièces pour finalement appuyer sur le bouton de retour de la monnaie quand l'écran m'a indiqué qu'il en manquait pour atteindre les 4$ demandés. C'est fou comme c'est cher dans les cinémas.

The Trotsky raconte l'histoire d'un adolescent aux idées révolutionnaires, Leon Bronstein, qui croit être la réincarnation de Leon Trotsky et qui fout la merde dans son école secondaire de l'ouest de Montréal. Avec Jacob Tierney, Colm Feore et la musique de Malajube. Assez réussit même si ça fait bizarre de voir un film montréalais tourné en anglais et doublé en français quand il y a quelques acteurs francophones (comme Anne-Marie Cadieux).

Sur le chemin du retour, on s'est arrêté pour une fringale au Côte St-Luc Bar-B-Q. Des grosses portions, les frites maison sont bonnes et j'ai très bien mangé même si ce n'était pas aussi fameux qu'on me l'avait laissé entendre (ou que j'avais voulu le comprendre).

Quand je suis arrivé chez moi, j'ai essayé le module de guitare pendant une heure. Vraiment impressionnant.


Tags: Club Vidéo, Marché des saveurs, Montréal, Musique

samedi 22 mai 2010

Partitions de guitare sous Linux

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

Toujours dans le but de trouver des équivalents logiciels Linux pour des logiciels que j'utilise généralement sur Windows (sans utiliser Wine), j'ai mis de coté le classique outil Guitar Pro (lecture et édition de partitions de guitare) pour faire l'essai de TuxGuitar, un outil plus simple avec moins d'options mais qui est compatible avec les fichiers Guitar Pro (.gp2, .gp3, .gp4 et .gp5).

Oui je sais, vous avez toujours la possibilité de pirater Guitar Pro mais par principe, je préfère encourager la légalité et favoriser la communauté open source. Même si n'êtes pas adepte de Linux, vous devez savoir que TuxGuitar offre aussi une version gratuite pour Windows et MacOS (by the way, il n'existe toujours pas d'équivalent à GarageBand ?).

Pour ma part, mon besoin n'est pas d'avoir un logiciel de composition studio. Je ne l'utilise même pas à son plein potentiel : juste lire les partitions, les jouer et les imprimer me suffit. Pour un produit gratuit, TuxGuitar fait le travail à merveille. Vous pourrez aussi apprendre les pièces en affichant le manche de guitare ou même les touches d'un piano pour savoir où placer vos doigts.



Pour obtenir des tablatures gratuites, ma suggestion est d'aller sur Ultimate Guitar qui en offre de plusieurs types (texte, power tab, accords et Guitar Pro). Faites votre recherche et utilisez le filtre à gauche "Guitar Pro tabs". Vous verrez, il y a beaucoup de publicité sur ce site et vous retrouverez le bouton de téléchargement en bas à droite de la page. Parfois, les partitions d'albums complets sont disponibles.

Ouvrez-les dans TuxGuitar et explorez les nombreuses options. Vous pourrez ensuite les imprimer en notation standard ou en tablatures, comme si vous aviez acheté un livre de qualité professionnelle (voir image à gauche pour un exemple).

Si vous êtes à la recherche de partitions d'artistes québécois, vous devrez vous tourner vers Partitions101.net qui en publie en format texte seulement.

Si Tux Guitar ne vous a pas convaincu et que vous recherchez un outil plus professionnel, Guitar Pro 6 offre de superbes fonctionnalités avancées et vaudra votre investissement de 60$.

Peu importe votre choix, votre band de garage appréciera.


Tags: Linux, Musique

vendredi 21 mai 2010

Maison en champignon à Toronto

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

Dans le domaine des curiosités, on peut remercier la gang de l'émission Les Pieds dans la Marge pour nous en faire découvrir des belles (à visionner en web diffusion sur Tou.tv). J'avoue que c'est un plaisir coupable de suivre leurs épisodes. C'est drôle, bien fait, on ne prend pas les jeunes pour des cons et il n'y a rien de comparable qui se fait à la télévision.

Mais ça s'adresse à un public jeunesse, catégorie d'âge que je ne crois plus faire parti depuis quelques années. Et en même temps, je ne suis pas assez vieux pour commencer mes phrases par "dans mon temps". Donc ça doit être OK.

Dans leur chronique "Comme vous n'avez pas le temps de tout voir, Les Pieds dans la Marge ont vu pour vous...", le trio d'animateurs composé de Mathieu, Jean-Sébastien et Félix se rendent à Toronto pour nous faire découvrir une maison en champignon.

Malheureusement, on ne la voit pas à partir de Google Maps ou Bing Maps puisque cette maison semble avoir été construite temporairement dans Sculpture Garden (115 King Steet East) à des fins de studio de création pour l'artiste Katie Bethune-Leamen (autres photos disponibles). Si vous étiez de passage dans le coin, vous pouviez vous y arrêter et la regarder travailler ou encore, selon ce témoin, grimper par l'échelle dans le chapeau du champignon pour vous y réfugier quelques instants.

Comme ils le disent, maintenant qu'ils l'ont vu pour vous, vous n'avez plus besoin d'y aller.


Tags: Curiosités

jeudi 20 mai 2010

Ce que devra faire Halak ce soir

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

Ce symbole a été très populaire dans les dernières semaines. Halak arrête tout. Ou arrêtait tout. Car le Canadien de Montréal est en léthargie. L'équipe tire de l'arrière 0-2 dans la présente série qui l'oppose aux Flyers de Philadelphie. Le gardien Jaroslav Halak, le héros que les partisans acclament à coup de jeux de mots douteux (j'ai aussi ma part de blâme à recevoir), s'est fait ramené sur Terre par la puissante attaque de ses adversaires. Par deux fois, les Flyers ont empêché les Canadiens de trouver le fond du filet, subissant deux blanchissages de suite.

Les glorieux devront retrouver confiance en eux et jouer comme ils l'ont fait lorsqu'ils ont éliminé les Capitals (meilleure équipe de la ligne cette année) et les Penguins (gagnants de la coupe Stanley l'an dernier). L'attaque devra se réveiller s'ils espèrent encore soulever la fameuse coupe Stanley.

Le match no. 3 s'amorce à l'instant. Halak devra faire des miracles :



Mais les joueurs devront surtout marquer des buts.

J'ai pris cette photo à Vancouver lors d'une promenade autour de False Creek (si ma mémoire est bonne, près de Island Walk Park ou Charleson Park). Parlant de Vancouver, il y a un parc incroyable qu'il faut absolument visiter, comparable au Parc du Mont-Royal à Montréal ou Central Park à New York, c'est le Stanley Park. Oui oui, comme la coupe Stanley. D'ailleurs, saviez-vous que le nom du trophée provient de son donateur, Lord Stanley qui fût gouverneur du Canada de 1888 à 1893 ?

Et le but !!! Peut-être LE but que Loco Locass annonçait ?

History will be made ?

Mise à jour d'après match
Victoire des Canadiens 5 à 1 ! Mention plus qu'honorable à PK Subban : 3 passes.


Tags: Histoire

mercredi 19 mai 2010

Accordéon simple avec jQuery

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

Dans un de nos projets client, le site web utilisait le composant accordéon de jQueryUI, version 1.5. Suite à une demande du client, il souhaitait que l'état de chaque élément du menu soit fermé par défaut, qu'il y ait une animation en glissement à l'ouverture et la fermeture et que plusieurs éléments puissent être ouverts en même temps.

En lisant la documentation, il valait mieux passer à la version la plus récente (1.8) pour pouvoir paramétrer le composant correctement et obtenir tout ce qu'il voulait. En regardant ce dont il était question, on s'est vite rendu compte que ça ne devait pas être complexe à programmer et qu'à l'origine, la personne qui avait intégré le plugin d'accordéon s'était peut-être compliquée la vie pour rien.

On s'est dit tant pis et on a débarqué jQueryUI. Mais on a conservé le framework jQuery pour servir de point de départ à notre propre contrôle.

En partant avec un markup HTML semblable à celui-ci :

<ul id="menu">
<li>
<a href="javascript:;">Titre 1</a>
<div>
Lorem ipsum 1
</div>
</li>
<li>
<a href="javascript:;">Titre 2</a>
<div>
Lorem ipsum 2
</div>
</li>
<li>
<a href="javascript:;">Titre 3</a>
<div>
Lorem ipsum 3
</div>
</li>
</ul>
Chaque élément de la liste contient un titre contenu à l'intérieur d'un lien. Le contenu du div est initialement caché par CSS (display:none).

Le CSS :
#menu li{
list-style: none;
padding: 0;
margin: 0;
}

#menu a{
font-family: sans-serif;
font-size: 16px;
color: black;
font-weight: bold;
text-decoration: none;
text-transform: uppercase;
}

#menu div{
height: 100px;
width: 200px;
border: 1px solid gray;
display: none;
}
Notez que list-style est à "none" pour retirer les points (bullets) de la liste.

La fonction JavaScript (avec jQuery 1.4) :
$j = jQuery.noConflict();

$j(document).ready( initAccordion );

function initAccordion(){
$j.each($j('#menu li'),
function(){
var a = $j(this).find('a');
var div = $j(this).find('div');

$j(a).click(
function(){
$j(div).slideToggle();
}
);
}
);
}
Assez simple non ? Seulement quelques lignes de code à l'intérieur de la fonction initAccordion() pour remplacer jQueryUI et faire tout ce qu'on veut. C'est vrai que notre version est plus limitée en termes d'options et de skin mais elle fait ce qu'on s'attend d'elle. Comme quoi rechercher un plugin à tout prix n'est pas toujours la meilleure solution quand on peut le coder soi-même.


Tags: CSS, Intégration, JavaScript

mardi 18 mai 2010

Composer une chanson au téléphone

Publié par Infinite Loop, à 20 h 31 1 commentaire

Si vous avez déjà tenté de composer l'air d'une chanson en utilisant les fréquences sonores des touches du clavier téléphonique, vous êtes définitivement un geek. Si vous n'avez jamais expérimenté ce loisir, c'est le moment ou jamais.

Avec un clavier Touch-Tone, chaque touche (0 à 9, # et *) est associée à une fréquence en hertz qu'on entend au moment de signaler. Ce qui veut dire qu'on peut approximativement reproduire les notes d'un air connu si notre oreille sait reconnaître celle qui s'y rapproche le plus.

Avant de décrocher le combiné et de commencer à faire vos essais, laissez-moi vous rediriger vers ce petit applet Java qui permet de reproduire les sons d'un téléphone standard (vieux mais fonctionnel. Mettez le focus sur un bouton et utilisez le clavier numérique pour composer).

Avec un peu de pratique, vous trouverez les mélodies et le rythme. Pour vous inspirer, je vous recommande de visiter ce répertoire de chansons pour téléphone touchtone créé par Michael Vincent et d'essayer la chanson Happy Birthday.

Pour ceux qui s'intéressent au côté programmation, le code source de l'applet Java est disponible en téléchargement. L'archive compte un fichier source d'environ 550 lignes de code plus les fichiers audio. Ne soyez pas surpris s'il est question de Netscape Navigator et Java 1.1, le programme date de 1998 !

L'auteur du programme indique que si on place le téléphone suffisamment près du haut-parleur pendant qu'on compose sur l'ordinateur, le téléphone devrait enregistrer les fréquences comme si on les avait entrées directement sur le clavier du téléphone.

J'avais des doutes alors je l'ai mis à l'essai. J'ai essayé avec deux téléphones récents (un sans-fil Panasonic et un standard RCA) et ça n'a pas fonctionné. Je suppose que si j'essayais avec un téléphone plus vieux, peut-être que ça aurait plus de chances de marcher. Quelqu'un peut me confirmer ? Peut-être un lecteur du magazine 2600, The Hacker Quarterly ?

Je suis aussi à la recherche du truc que j'utilisais quand j'étais plus jeune pour faire sonner son propre numéro de téléphone. Si quelqu'un s'en souvient, faites-moi signe.

Pour plus de détails techniques :

  • Telephone keypad
  • Dual-tone multi-frequency signaling


Tags: Musique

lundi 17 mai 2010

Investir dans ses connaissances

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

Je viens de terminer la lecture d'une entrevue avec Joe Armstrong1 (créateur du langage de programmation Erlang) et il expose une analogie intéressante avec l'investissement dans ses connaissances personnelles :

Je passe toujours une journée par semaine à apprendre des nouveaux trucs. Ça signifie que je passe 20% plus de temps que mes collègues à étudier des nouvelles choses. 20% à intérêts composés veut dire qu'après 4 ans et demi, je saurai 2 fois plus de choses qu'eux. Et en raison des intérêts composés, j'en saurai 3 fois plus après 5 ans.

Sa comparaison est inspirée d'un article de 1986 du docteur Richard Hamming à l'attention des jeunes chercheurs intitulé "You and Your Research", maintenant largement disponible sur le web. En règle générale : Knowledge and productivity are like compound interest.

Pour citer Hamming :

Prenons l'exemple de deux personnes avec approximativement les mêmes habiletés. Si l'une d'elles travaille 10% plus que l'autre, il finira par produire deux fois plus. Étalé sur une vie, il sera considérablement plus productif. Plus vous en saurez, plus vous apprendrez; plus vous apprendrez, plus vous saurez faire; plus vous pourrez faire, plus il y aura de possibilités.

Toujours selon Hamming, il donne un exemple de ce que pourrait être la connaissance infinie. Depuis l'époque de Newton (1643-1727) jusqu'à aujourd'hui, nous sommes venus près de doubler à tous les 17 ans la somme des connaissances. Et nous faisons face à cela essentiellement par la spécialisation.

À imprimer et à lire à tête reposée. Ou si vous êtes plus écolo comme moi, sur votre portable ou votre ebook reader.

1 Coders at Work, Reflections on the craft of programming, p.234.


Tags: Saviez-vous que

dimanche 16 mai 2010

Simulation de combat - Étape 3

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

Déjà le troisième volet de ce petit jeu de combat aléatoire. Jusqu'à maintenant, nous avons vu :

  • comment créer des combattants par programmation
  • comment les faire s'affronter entre eux
  • ajouter un facteur de force aux coups portés
Vous retrouverez articles précédents dans la section "Jeu de combat" dans le menu. À présent, voyons comment on pourrait modifier le système pour que le hasard détermine si un coup porté touche ou non son adversaire.

Comme à l'étape 2, dans la classe Fighter, on ajoutera une nouvelle propriété :
private $_defense;
Nous l'initialiserons dans le constructeur :
$this->_defense = rand(1,10);
Nous écrirons deux fonctions pour obtenir la valeur de la défense et écraser la valeur déterminée aléatoirement au moment de la création.
public function getDefense(){ return $this->_defense; }

public function setDefense($defense){
$this->_defense = $defense;
}
Après l'appel au constructeur, libre à vous de forcer les joueurs à avoir une défense particulière :
$player1->setDefense(1);
$player2->setDefense(10);
Ici, le joueur 2 aurait probablement plus de chances de remporter le combat. Je laisse de côté toutes les validations nécessaires mais c'est juste pour dire que dans cet exemple, avec une défense de 16, un joueur serait invincible.

On modifiera la fonction hit() pour tenir compte de la défense du joueur plutôt que de toucher l'adversaire à tout coup.
public function hit(Fighter $fighter){
$damage = 0;
// comme le maximum généré est 10,
// on touche la cible si on obtient entre 10 et 15
$chance = rand(1,15);
if( $chance >= $fighter->getDefense() ){
$damage = rand(1,$this->_force);
$fighter->setDamage($damage);
}

return $damage;
}
Le dernier changement se fera dans l'arène (arene.php). Il suffit de remplacer la vérification dans la boucle while pour savoir si le coup porté a touché l'adversaire ou s'il l'a raté (ajoutez les <br/> là où c'est nécessaire pour l'affichage).
if($damage > 0){
echo $fightersList[$attacker]->getName() . ' hits ' . $damage . ' HP on ' . $fightersList[$defender]->getName();
}
else{
echo $fightersList[$attacker]->getName() . ' miss ' . $fightersList[$defender]->getName();
}
Enfin, une amélioration possible serait de remplacer les appels directs à rand() en définissant une fonction qui simule le jet de dés. On pourrait générer les propriétés comme dans AD&D où lancer 3 dés à 6 faces qui permet d'avoir un score entre 3 et 18.
public function rollDice($roll = 1, $faces = 6){
return rand($roll, $roll * $faces);
}

echo $this->rollDice(3, 6);
Ceci conclut cette 3ème étape. Vous pouvez maintenant tester le tout. N'oubliez pas que si vous désirez obtenir le code source de ces exercices, vous pouvez m'en faire la demande par courriel.


Tags: Jeu de combat, PHP, Programmation

Citation no. 82 sur l'explication

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

Si vous ne pouvez pas expliquer quelque chose à un enfant de six ans, vous ne le comprenez pas vraiment vous-même.

- Albert Einstein


Tags: Citations

samedi 15 mai 2010

Easter egg dans EA NHL 09

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

Comme vous le savez, je ne suis pas un gamer. Mais de temps en temps, j'aime bien disputer un match de hockey sur ma vielle PS2. Le dernier jeu que j'ai acheté était NHL 09 d'Electronic Arts et je poursuis à temps perdu la dynastie que j'ai amorcé l'an dernier.

En commençant avec NHLPA Hockey 93 sur la Super Nintendo (je ne compte pas son prédécesseur Ice Hockey sur la NES), j'ai pris de l'expérience et j'ai appris à devenir un adversaire redoutable sur les jeux de la PS2 (lorsque la console rendra l'âme, j'annoncerai peut-être ma retraite plutôt que de passer à une console de nouvelle génération).

Actuellement, je dois dire que ma saison est plutôt exceptionnelle et que tout va pour le mieux. Il faut dire que sur cette édition 2009, EA a décidé qu'il ne serait plus possible d'effectuer la mise à jour des rosters par le web. J'étais donc pris avec Koivu, Kovalev, Kostopoulos, Latendresse, Laraque, Bégin, etc, et j'ai dû reconstruire mon équipe en procédant à des échanges. Je suis allé chercher Cammalleri et quelques nouveaux venus pour mieux représenter la composition actuelle et j'ai débuté la saison sans trop me soucier des statistiques.

Vers la fin de la saison, juste avant les séries, j'ai jeté un oeil au classement des gardiens et j'ai été surpris de voir que Carey Price se retrouvait dans le haut du classement avec une faible moyenne de buts alloués (malheureusement, contrairement aux performences réelles, Halak est assez ordinaire dans le jeu).

Dans la liste, un nom curieux figurait au sommet du palmarès : Sabrina Ladha. Qu'est-ce que ce prénom féminin fait là ? Un joueur d'une autre ligue du jeu repêché dans une équipe de la ligue nationale ? En regardant la fiche du joueur, on voit apparaître une photo et ses caractéristiques :

  • agent libre repêchée par les Islanders de New Yok
  • Grandeur : 6 pieds 6 pouces
  • Salaire : 8,1 millions
  • Score global : 91
C'est une farce ou quoi ? C'est comme le meilleur cerbère de la ligue! Aux dernières nouvelles, la québécoise Manon Rhéaume était la seule femme à avoir disputé un match dans la NHL. D'où sort mademoiselle Ladha ?

En fouillant un peu, l'explication est simple : dans le cadre d'une levée de fonds pour la fondation Make-A-Wish, son père a remporté la vente aux enchères en misant 7000$ pour que sa fille fasse partie du jeu. Très honorable mais un peu frustrant en même temps quand tu vois que si ça n'avait pas été de sa présence, c'est peut-être ton gardien qui se serait mérité un trophée.

Peu importe, ce n'est qu'un jeu et c'est à prendre à la légère. La preuve, comme chaque année, EA a fait sa prédiction sur le déroulement des séries éliminatoires en effectuant une simulation par son sytème de jeu. Voyez comme ils se sont trompés :
  • Les Capitals de Washington remportent la série 4 de 7 en écrasant les Canadiens 4-0 (les Canadiens ont remporté la série 4 à 3)
  • Finale de la coupe Stanley 2010 : Blackhawks de Chicago contre les Penguins de Pittsburgh (les Canadiens viennent d'éliminer les Penguins)
Ne manquez pas dimanche le début de la finale de la conférence de l'est opposant le Canadien de Montréal contre les Flyers de Philadelphie. Comme dirait la publicité : history will be made. Et voyez celui-ci juste pour rire.


Tags: Easter Eggs

vendredi 14 mai 2010

Mais qui a volé le pénis de Napoléon ?

Publié par Infinite Loop, à 12 h 58 1 commentaire

Si vous êtes Québécois ou Montréalais, vous avez probablement entendu parler qu'en mars 1973, le coeur du Frère André fût volé à l'Oratoire Saint-Joseph de Montréal et qu'il fût retrouvé presqu'un an plus tard.

Un peu morbide, surtout que ça n'a strictement aucune utilité. Si vous avez regardé la première saison de la série Six Feet Under, il y a aussi un pied qui s'est fait soustraire pour être déposé dans un casier à l'école. Comme on dit : shit happens.

Dans le même ordre d'idée, le magazine Time a publié il y a 2 jours un article vraiment intéressant, quoi qu'un peu curieux, compilant le top 10 des parties du corps volées dans l'histoire.

La liste va comme suit :

  1. 16 têtes de Maori remises récemment par la France à la Nouvelle-Zélande
  2. Les os du Père Noël (Saint-Nicholas)
  3. Le crâne de Geronimo (leader amérindien)
  4. Le coeur de Anne Boleyn (Reine d'Angleterre, exécutée en 1536)
  5. Le cerveau de Mussolini (les Américains voulaient savoir ce qu'il y avait dans la tête d'un dictateur)
  6. Le pénis de Napoléon (coupé par son docteur lors de son autopsie en 1821. À retenir : ressemble à du jerky de boeuf)
  7. Les restes de Thomas Paine (héros des révolutions Américaine et Française, le premier qui aurait écrit les mots the "United States of America")
  8. Le gros orteil de Saint François Xavier
  9. La tête du roi Badu Bonsu II (traduction libre : le Ministère des "Affaires Étrangères" a rapatrié la tête au Ghana)
  10. Le corps d'un Africain découvert dans le désert Kalahari
Vous pouvez lire l'article original "Top 10 Famous Stolen Body Parts" sur le site du Time et même composer votre top 10 selon vos préférences personnelles. Si vous voulez en savoir plus sur la fabuleuse histoire du pénis de Napoléon qui aurait été vendu 38000$ lors d'un encan en 1969, vous pouvez consulter ce dossier.

Nota bene
Le Frère André était reconnu pour réaliser des guérisons miraculeuses et sera bientôt proclamé "Saint" le 17 octobre 2010.


Tags: Curiosités, Histoire

jeudi 13 mai 2010

Internationalisation i18n en programmation

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

Quand il est question d'internationalisation dans une application web (ou un logiciel exécutable), on fait référence à la traduction du contenu en différentes langues. En web, l'avantage est d'avoir une même page (un gabarit) qui peut charger dynamiquement le contenu en d'autres langues.

Par exemple, on peut se servir de la librairie gettext ou d'un package PHP qui comprend des classes Language et Translator. Zend Framework possède aussi la capacité de gérer les traductions avec le composant Zend_Translate. Quand on regarde la documentation du Zend Framework, ils font référence aux termes i18n pour l'internationalisation et l10n pour la localisation.

D'où sortent ces acronymes inhabituels ? Si on en croit l'histoire, l'origine viendrait d'une pratique interne chez Digital Equipment Corporation (DEC) où un administrateur système aurait attribué à un employé, Jan Scherpenhuizen, un compte email nommé "S12n".

En utilisant la première et la dernière lettre d'un mot et en comptant le nombre de lettres qui les séparaient, il suffit d'insérer ce nombre entre les lettres pour former un terme à 4 caractères.

Du même coup, l'usage du mot "internationalization", qui compte 20 lettres, peut être réduit si on conserve celles aux extrémités (I et N). Comme 18 lettres les séparent, on obtient i18n. Suivant le même principe, on a vu apparaître l10n pour désigner "localization".

Et voilà la naissance d'une autre acronyme à retenir. En fait, ce n'est pas tout à fait exact. Selon i18nguy, le fait d'écrire un mot basé sur un nombre s'appellerait plus exactement un numéronyme.


Tags: Programmation, Saviez-vous que, Zend Framework

mercredi 12 mai 2010

Simulation de combat - Étape 2

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

Au menu ce soir, poursuivons le petit jeu de combat que j'ai débuté hier. Comme on crée un jeu de combat complètement aléatoire, quoi de mieux que d'ajouter encore plus de hasard. On a vu que chaque combattant possédait un nombre de points de vie déterminé arbitairement, de même que chaque coup porté à son adversaire comptait entre 1 et 10 points de dommage.

Et si on ajoutait une caractéristique de force à chaque adversaire ? Chaque coup pourrait avoir comme effet une blessure maximale à la force de l'adversaire. Par exemple, avec une force de 5, l'attaquant pourrait faire perdre entre 1 et 5 points à son adversaire. Vous verrez, c'est très facile à réaliser.

Ajoutez une propriété à la classe Fighter. Je tiens à préciser que j'ai pris l'habitude d'utiliser la convention pour nommer les variables privées en les préfixant par $_ devant le nom. Ceux qui ne sont pas familiers avec la programmation orientée objet doivent savoir que ce n'est pas obligatoire mais simplement un indice pour reconnaître la portée de la variable.

private $_force;
Initialisez-la dans le constructeur :
$this->_force = rand(1,10);
Créez un accesseur pour obtenir la valeur de la propriété. Vous pourrez l'afficher suite à la création de l'instance pour faire vos paris sur le gagnant.
public function getForce(){ return $this->_force; }
La fonction hit() sera légèrement modifiée de façon à générer une valeur maximale en utilisant la force du joueur plutôt que la constante 10. Si vous êtes amateurs de jeux de rôles comme Donjons & Dragons, libre à vous de créer des caractéristiques sur un total de 18 (je ne sais pas si c'est encore comme ça avec les éditions plus récentes mais c'était le maximum qu'on pouvait avoir lorsque je jouais durant mon adolescence). Évidemment, ça risque d'avantager un des deux joueurs, ce qui prouve que dans le monde fictif, tous les humains ne sont pas égaux.
public function hit(Fighter $fighter){
// on pourrait aussi faire varier la valeur minimum
$damage = rand(1,$this->_force); // cette ligne a changé
$fighter->setDamage($damage);
return $damage;
}
Affichez les caractéristiques de votre création avant de monter dans l'arène :
echo $player1->getName() . ' : ' . $player1->getHP() . ' HP. ';
echo 'Force ' . $player1->getForce();
Il serait possible de faire évoluer les combattants en gérant un niveau d'expérience. Au début, plus la force est faible, plus le combat risque de durer longtemps. C'est un peu comme se tapocher à coup de cuillère, ça risque d'être long... Avec l'expérience, la force de l'impact pourrait augmenter puisqu'en prenant de l'expérience, il saurait comment porter les coups pour que ça soit plus dommageable.


Tags: Jeu de combat, PHP, Programmation

mardi 11 mai 2010

Simulation de combat - Étape 1

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

À temps perdu, j'ai le goût d'essayer de programmer un petit jeu de simulation de combat. Juste pour faire différent du type de programmation que je fais dans mon quotidien (systèmes de gestion web-based). Mon idée est de présenter étape par étape la réalisation du projet et d'essayer de le faire évoluer pour y ajouter des caractéristiques supplémentaires. Vous devrez donc vous attendre à voir ici le début d'une série de billets sur le sujet (regroupés sous la catégorie Jeu de combat).

Comme j'utilise PHP, vous comprendrez que je suis loin de l'étape du visuel. Ce qui m'intéresse est la logique, le backend. Donc ce sera 100% en mode texte.

La toute première chose à faire, c'est de démarrer une classe qui permettra d'instancier des combattants.

Les pré-requis :

  • Elle contiendra au minimum deux propriétés : le nom du joueur et le nombre de points de vie. Il n'en faut pas plus pour initier un combat entre deux personnes.
  • Le constructeur de la classe décidera aléatoirement du nombre de points de vie. Disons entre 50 et 100.
  • Il faudra une méthode pour assener un coup (hit), dont la force sera déterminée aléatoirement (la blessure soutirera entre 1 et 10 points à l'adversaire)
  • Une méthode pour encaisser une blessure qui réduira le nombre de points de vie du joueur
  • Une dernière méthode pour savoir si ça vaut vraiment la peine de continuer à s'acharner sur quelqu'un d'inconscient (isKnockOut)
Voici mon premier jet :

fighter.php
class Fighter{
private $_name;
private $_hp; // hit points

public function __construct($name){
$this->_name = $name;
$this->_hp = rand(50,100);
}

public function getName(){ return $this->_name; }
public function getHP(){ return $this->_hp; }

public function hit(Fighter $fighter){
$damage = rand(1,10);
$fighter->setDamage($damage);
return $damage;
}

public function setDamage($hp){
$this->_hp -= $hp;
}

public function isKnockOut(){
return $this->_hp <= 0 ? true : false;
}
}
Remarquez que la méthode hit() reçoit en paramètre un objet Fighter.

Ensuite, on peut créer deux instances qui s'affronteront :

arene.php
// note: ajoutez les sauts de lignes aux endroits requis
// l'éditeur de Blogger semble ne pas les aimer dans mon code source!
require_once('fighter.php');

$player1 = new Fighter('Code 18');
$player2 = new Fighter('Infinite Loop');

// on affiche leurs caractéristiques
echo $player1->getName() . ' has ' . $player1->getHP() . ' HP';
echo $player2->getName() . ' has ' . $player2->getHP() . ' HP';

echo '<h3>--- Fight! ---</h3>';

// créer la liste des combattants
$fightersList = array($player1, $player2);

// tant que les deux sont en vie, on poursuit le combat
while( !( $player1-&gt;isKnockOut() || $player2-&gt;isKnockOut() ) ){

// le hasard fait que un ou l'autre porte un coup
list($attacker, $defender) = array_rand($fightersList, 2);

// celui qui a été désigné comme l'attaquant donne un coup
$damage = $fightersList[$attacker]->hit($fightersList[$defender]);

// quel dommage a-t-il fait ?
echo $fightersList[$attacker]->getName() . ' hits ' . $damage . ' HP';

// si le combattant attaqué est KO, le combat est terminé
if( $fightersList[$defender]->isKnockOut() ){
echo '<strong>' . $fightersList[$defender]->getName() . ' is KNOCK OUT</strong>';
}
}

echo '<strong>THE WINNER IS : ' . $winner->getName() . '</strong>'
Avec ce petit script, vous pouvez simuler un combat aléatoire simpliste entre deux adversaires et suivre le déroulement étape par étape. Dans les articles à venir prochainement, je vous montrerai :
  • comment un combattant peut esquiver ou bloquer un coup
  • comment chaque joueur peut appliquer un facteur de force personnalisé
  • comment effectuer un combat avec plus de deux joueurs (du type royal rumble)
Aussi, je tiens à préciser que vous êtes libre de récupérer le code source et de faire vos propres expérimentations. Je vous encourage à partager vos implémentations ici pour voir dans quelles directions vous ferez évoluer le projet.


Tags: Jeu de combat, PHP, Programmation

lundi 10 mai 2010

C'est comme ça que ça doit être fait

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

Voici une analogie que j'ai lu aujourd'hui que j'ai trouvé très bonne. Ça remet en question la façon que les choses doivent être faites, surtout quand on ne sait pas pourquoi on le fait ainsi.

D'ailleurs, ça m'a rappelé une histoire qui m'était arrivée à la fin de mes études alors que j'occupais un emploi dans un bureau et où ma patrone insistait pour que j'effectue le travail en suivant les mêmes étapes qu'elle. Elle me disait le comment alors que je voulais savoir le pourquoi. Surtout que si je faisais à ma tête, ma méthode me permettait d'arriver exactement au même résultat, plus rapidement. Sa justification : on l'a toujours fait comme ça.

Voici la petite histoire :

Une femme voulait préparer un rôti en suivant une recette qui avait connu du succès dans la famille de son mari. Celui-ci expliqua que sa mère lui avait appris à le préparer en le saupoudrant de sel et de poivre, en coupant les deux extrémités, déposer le rôti dans la poêle, couvrir et faire cuire.

Sa femme lui demanda pourquoi elle devait retirer les deux extrémités. Son mari lui répondit qu'il ne savait pas et que sa mère avait toujours fait de cette façon. Il proposa d'appeler sa mère pour le lui demander.

- Maman, pourquoi as-tu toujours coupé les deux extrémités du rôti dans la recette ?
- Je ne sais pas, répondit sa mère, ta grand-mère a toujours fait de cette façon. Je vais lui téléphoner pour lui demander.

Elle appelle donc sa mère pour lui poser la question.

- Je ne sais pas pourquoi tu veux procéder ainsi. Moi je le faisais comme ça parce que le rôti était trop gros pour rentrer dans ma poêle.


Tags: Lois et principes

dimanche 9 mai 2010

Parc du Mont-Royal, dimanche PM

Publié par Infinite Loop, à 08 h 25 1 commentaire

Par un beau dimanche après-midi, si vous allez prendre une marche dans le parc du Mont-Royal à Montréal, vous risquez de remarquez deux choses :

  • le son des tam tams
  • une bataille médiévale
Libre à vous de participer à l'activité de votre choix ou de passer votre chemin. Mais si l'envie vous prend de simuler un combat avec des épées en mousse en plein coeur de Montréal ou que vous êtes un adepte de Bicolline, vous risquez de trouver comique mon prochain vidéo.

Magic missile ! x6 I'm out of mana...



Aussi, ne manquez pas le "knight who say NI" qui se fait brutaliser à coup de lightning bolt (ref. Monty Python and the Holy Grail ?). J'imagine que ça peut paraître étrange si on a jamais participé à un grandeur nature ou si on a en horreur les jeux à la Donjons et Dragons. Les avis sont partagés : soit on est dans le "mood" et qu'on s'amuse, soit on est spectateur et qu'on en rit.


Tags: Humour, Montréal

Citation no. 81 sur la noix de coco

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

Qui mange une noix de coco fait confiance à son anus.

- Anonyme


Tags: Citations

samedi 8 mai 2010

Biographie de Mike Patton

Publié par Infinite Loop, à 08 h 53 2 commentaires

Dans mon billet d'hier, j'ai transcrit une phrase qui m'avait bien fait rire. Ce matin, j'en ai retrouvé une autre étrange que je voulais partager avec vous. C'est tiré du livre Arcana : Musicians on music, un livre qui offre un regard particulier sur le processus de création radical de la musique, du point de vue de 30 artisans.

On y retrouvera des textes de John Zorn, Mark Dresser, Stephen Drury, Bill Frisell, Fred Frith, Ikue Mori, Mike Patton, Marc Ribot, et plus. Bref, tous des musiciens qui gravitent dans l'entourage de John Zorn (compositeur, producteur et saxophoniste - ou saxomophone comme dirait Homer J. Simpson).

Il s'agit du premier livre d'une série (tomes I à IV jusqu'à maintenant) paru en 2000 qui pour moi a été une sorte une révélation qui a su changer ma perception de la musique. Tout le meilleur est concentré dans ce volume.

À la fin, dans la section About the musicians, l'éditeur présente la biographie de ceux qui ont contribué à la réalisation de cet ouvrage. Celui de Mike Patton (Faith No More, Fantômas, Mr.Bungle, Tomahawk, contributions live à Naked City) est probablement la plus bizarre que j'ai lu (page 373) :

MIKE PATTON has never written a fucking essay. He has little experience writing bios. He has never scored a film. He has recorded numerous albums with "rock" groups Faith No More and Mr.Bungle, as well as several albums of his own compositions on the Tzadik Composer Series. He never listens to those albums. He improvises regularly with John Zorn, Ikue Mori, Han Bennink, Otomo Yoshihide, and others. He has toured the world off and on for the last ten years. He hopes to stay home and write music for the next ten years.
Prenez quelques minutes pour aller découvrir sa musique. Le site mikepatton.de est maintenu par un fan mais reflète assez bien l'ensemble de son oeuvre. Enfin,voilà un univers musical qui n'a aucune chance de tourner sur les ondes de Rock Détente.


Tags: Curiosités, Livres, Musique

vendredi 7 mai 2010

Design Patterns, vous y comprenez quelque chose ?

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

Faites-vous parti de ceux qui ont lu le livre Design Patterns, Elements of Reusable Object-Oriented Software (Addison-Wesley, 1995) ?

Je vous avoue que j'ai lu des extraits que je jugeais pertinents et qu'il s'agit d'un bon livre, sinon LE livre de référence par excellence pour comprendre les modèles de design classiques. Même si vous ne comptez pas les adopter intégralement, comprendre les concepts constitue un bon exercice mental qui sera bénéfique à tout programmeur. Au moins pour aborder et solutionner le problème avec une approche différente.

Mais je dois admettre que je n'ai pas la prétention d'avoir tout compris. J'étais même parfois un peu découragé. C'est pourquoi j'en suis venu à la conclusion qu'il valait mieux repartir la lecture du début et laisser les morceaux du casse-tête se placer lentement mais sûrement.

Et c'est là que j'ai eu la révélation qui expliquait tout. À la page xi de la préface, les auteurs indiquent quelque chose d'assez drôle :

A word of warning and encouragement: Don't worry if you don't understand this book completely on the first reading. We didn't understand it all on the first writing!

Et bien voilà, je suis rassuré.


Tags: Livres

jeudi 6 mai 2010

Un mot pour les nerds

Publié par Infinite Loop, à 16 h 58 0 commentaire

Tout d'abord, je tiens à préciser que je n'ai rien contre les nerds. Primo, je suis moi-même un geek/nerd en puissance. Secondo, si vous me lisez, il y a de très fortes chances pour que vous le soyez aussi.

Mais surtout, je suis un curieux de nature et j'aime faire partager mes découvertes. Pour faire le lien avec le sujet de ce billet, le titre fait référence à la troisième pièce, Words for Nerds, tirée de l'album Ink Compatible du groupe rock expérimental Spastic Ink.

Ce groupe américain composé du guitariste virtuose freak Ron Jarzombek (Blotted Science, Gordian Knot, WatchTower et projets solo) vous séduira par des pochettes d'album de bon goût, des coupes de cheveux des années 80 et ses excentricités musicales. Pourtant, même si cet album est sorti en 2004, il mérite largement notre attention (vous apprécierez si vous êtes guitariste).

Si vous avez la chance d'écouter la pièce Words for Nerds, vous pourrez entendre une création inspirée du sujet des ordinateurs. Avouons-le, c'est une drôle d'interprétation...

Je vous ai transcrit quelques passages ici :

  • Intro
  • Hum... what's this ? A AD gigawatts hard driver. A LSD monitor ? 512 mb. Oh! It's a computer!
  • Solo technique de fou
  • La musique continue
  • Panne d'inspiration ou pause ?
  • Excuse me sir. I'm looking for a word processor. I want to be able to control page breaks and cut, copy and paste, change the preset tab stops. Oh yeah and create bookmarks. Do you have anything like that sir ?
  • Encore de la guitare
  • Il veut nous communiquer son site web : My web page address is http://www.inc.spastik.phhhhhhp/.net.com. hum org ?
  • Bad trip de guitare
  • OK, you want me to backup all fixed all drives ? We configured your dot matrix...
  • No wait!
  • Finale
Disons que c'est tout un numéro mais que son album est tellement impressionnant dans sa technique que j'ai fini par l'acheter. Remarquez que j'avais aussi été impressionné par le vidéo de The Cereal Mouse sur laquelle le groupe a créé une trame sonore qui suit les mouvements de la souris (cette pièce est la dernière de l'album) :



Selon Wikipedia, un nerd est une personne solitaire et intelligente, à la fois socialement handicapée (mais pas toujours isolée car un nerd peut conserver une vie sociale) et passionnée par des sujets liés à la science et aux techniques. Jarzombek fait clairement parti de cette catégorie.


Tags: Le coin du geek, Musique

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 (55)
    • 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)
        • Buckethead et son chapeau PFK
        • Site de vente de mp3 usagés
        • Citation no. 84 sur les programmeurs
        • Microsoft compare IE6 à du lait périmé
        • Maison spéciale dans une colline en Suisse
        • Extraire les tags ID3 des mp3
        • Gaffe sous systèmes Unix / Linux
        • Marchés boursiers galactiques
        • Raccourcir les chaînes d'objets en JavaScript
        • Simulation de combat - Étape 4
        • Citation no. 83 sur la conception de logiciels
        • Journée presque parfaite, sans compromis
        • Partitions de guitare sous Linux
        • Maison en champignon à Toronto
        • Ce que devra faire Halak ce soir
        • Accordéon simple avec jQuery
        • Composer une chanson au téléphone
        • Investir dans ses connaissances
        • Simulation de combat - Étape 3
        • Citation no. 82 sur l'explication
        • Easter egg dans EA NHL 09
        • Mais qui a volé le pénis de Napoléon ?
        • Internationalisation i18n en programmation
        • Simulation de combat - Étape 2
        • Simulation de combat - Étape 1
        • C'est comme ça que ça doit être fait
        • Parc du Mont-Royal, dimanche PM
        • Citation no. 81 sur la noix de coco
        • Biographie de Mike Patton
        • Design Patterns, vous y comprenez quelque chose ?
        • Un mot pour les nerds
        • Hang, un instrument de musique atypique
        • Plugin autocomplete simple pour jQuery
        • Savoir reconnaître un manipulateur
        • Citation no. 80 sur le café
        • Empêcher un objet PHP d'être cloné
      • ►  avril 2010 (37)
      • ►  mars 2010 (34)
      • ►  février 2010 (32)
      • ►  janvier 2010 (37)
    • ►  2009 (429)
      • ►  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 (36)
      • ►  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