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

mercredi 30 juin 2010

L'art de l'ordinateur analogique

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

Ce vidéo m'a beaucoup amusé quand je l'ai vu ce matin, faisant un clin d'oeil aux outils et interfaces qu'on utilise au quotidien dans mon domaine (tous ceux qui oeuvrent dans le milieu informatique s'y reconnaîtront).

Originalement intitulé "The Art of Analog Computing", les concepteurs ont su transposer dans un monde analogique : le curseur, le Mac, le bureau de travail, les courriels entrants, la corbeille, les popup de confirmation, la loupe (Spotify) de Mac OS, les rappels de réunions, les écrans de veille, Photoshop avec le cadenas pour les layers, le Blue Screen of Death de Windows, Facebook (et le fait de cacher les applications soit disant interdites sur le lieu de travail), Twitter, la baleine "Fail Whale", le classique jeu de solitaire, le choix des fureteurs, les publicités trompeuses, les popup publicitaires, le spam (en conserve!), le "serveur" qui plante, le code binaire, etc.



Chapeau à l'équipe de Meltmedia, c'est très réussi.


Tags: Humour, Le coin du geek

mardi 29 juin 2010

L'effet du deuxième système de Brooks

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

Note à moi-même parce que c'est important de s'en souvenir avant de faire des conneries... Selon Fred Brooks (auteur de Mythical Man-Month), l'effet du 2ème système stipule que :

Tout informaticien ayant réalisé un premier système aura tendance à créer un deuxième système incorporant toutes les fonctionnalités qu'il n'a pas pu ajouter au premier système par faute de temps. Un programmeur développant un deuxième système devrait donc être conscient du risque de dépassement des spécifications exigées.

J'aime encore mieux la définition en anglais :
The second-system effect or sometimes the second-system syndrome refers to the tendency, when following on from a relatively small, elegant, and successful system, to design the successor as an elephantine, feature-laden monstrosity. It is somewhat akin to the idea of fighting the last [previous] battle.

Tellement trop vrai que j'en ai eu un bel exemple aujourd'hui alors qu'un programmeur a tenté de réinventer la roue pour qu'elle soit carrée.


Tags: Lois et principes

lundi 28 juin 2010

La vérité sur la gestion de projets

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

Tout est une question de perception :

  1. Comment le client l'a souhaité
  2. Comment le chef de projet l'a compris
  3. Comment l'analyste l'a schématisé
  4. Comment le programmeur l'a écrit
  5. Comment le Business Consultant l'a décrit
  6. Comment le projet a été documenté
  7. Ce qui a été installé chez le client
  8. Comment le client a été facturé
  9. Comment le support technique est effectué
  10. Ce dont le client avait réellement besoin

Cliquez pour agrandir

Drôle et tellement vrai.


Tags: Humour, Programmation

dimanche 27 juin 2010

Simulation de combat - Étape 6

Publié par Infinite Loop, à 10 h 48 2 commentaires

Mais une minute ! Cette simulation de combat entre l'Alliance rebelle et l'armée Impériale ne peut pas être crédible si Luke Skywalker et Darth Vader n'en font pas partis !

Nous ajouterons un combattant de chaque côté avec des super statistiques, comme des héros, qui seront au moins 10 fois plus forts que les autres et avec une défense renforcée. Ces instances seront créées à partir de la classe Fighter mais nous ajusterons les caractéristiques manuellement. En étant plus forts, ils résisteront plus longtemps à la guerre.

Mais d'abord, on modifiera légèrement la classe Fighter pour s'assurer que les méthodes qui permettent de personnaliser les caractéristiques soient présentes plutôt que de conserver celles attribuées par le hasard au moment de la création.

public function setDefense($defense){
$this->_defense = $defense;
}

public function setForce($force){
$this->_force = $force;
}

public function setHP($hp){
$this->_hp = $hp;
}
Dans le fichier champ-de-bataille.php, on ajoutera la création des héros suite à la boucle qui crée les rebels et les stormtroopers.
# juste pour rire
$showDeclaration = false;

# héros
$luke = new Fighter('Luke Skywalker');
$luke->setDefense(10);
$luke->setForce(10);
$luke->setHP(1000);

$armyRebelAlliance[] = $luke;

$dv = new Fighter('Darth Vader');
$dv->setDefense(10);
$dv->setForce(10);
$dv->setHP(1000);

$armyImperial[] = $dv;
Dans la boucle while, ajouter le bloc de code suivant immédiatement après ces deux lignes :
$attacker = array_rand($armies[$armyAttacker]);
$defender = array_rand($armies[$armyDefender]);

# ajouter ici

if( !$showDeclaration && ($fightersLeft[0] == 1 && $fightersLeft[1] == 1) ){
$names = array();
$names[] = $armies[$armyAttacker][$attacker]->getName();
$names[] = $armies[$armyDefender][$defender]->getName();

$heroes = array('Luke Skywalker', 'Darth Vader');
$diff = array_diff($names, $heroes);

if( count($diff) == 0 ){
echo '<h1>LUKE, JE SUIS TON PÈRE !!!</h1>';
$showDeclaration = true;
}
}
Ceci permettra de déterminer si le dernier combattant de chaque camp est Luke et Darth Vader. Dès qu'on s'aperçoit qu'ils sont les seuls survivants, on affiche la déclaration de Darth Vader à son fils : Luke, je suis ton père !

Décommentez le bloc if($damage ...) pour voir apparaître la trace du combat (chaque coup porté). Vous verrez qu'il y a des fortes chances pour que Luke et Darth Vader s'affrontent lors du combat final. Un seul survivra.


Tags: Jeu de combat, PHP, Programmation

Citation no. 88 sur la politique

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

Le langage politique est conçu pour que les mensonges sonnent vrais, pour que le meurtre semble respectable et pour donner l’apparence de solidité à ce qui n’est que du vent.

- George Orwell


Tags: Citations

Faire de la musique avec un bonzaï

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

Tu arrives chez Steve's Music ou Italmélodie dans le but d'acheter un instrument pour former ton band de garage. Tu te diriges vers la section des instuments et tu hésites entre une Gibson Les Paul, une batterie ou un ukulele. Le choix s'avère difficile.

Et tu finis par tout laisser tomber. Tu te diriges vers la section de sonorisation et décides de faire appel à ta créativité. Si l'inspiration est au rendez-vous, peut-être arriveras-tu à faire sortir la musique d'un bonzaï ?

C'est exactement le type d'expérimentation atypique que Diego Stocco aime mettre sur pied.


Tags: Musique

samedi 26 juin 2010

Simulation de combat - Étape 5

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

Ça fait déjà un mois que je n'ai pas retouché mon script de générateur de combat aléatoire. La dernière fois, j'avais lancé l'idée de modifier le programme de façon à faire s'affronter deux armées plutôt que deux combattants. Autrement dit, il faudra maintenir deux listes de combattants, déterminer au hasard quelle armée et quel combattant sera l'attaquant et l'attaqué, dans un combat à mort qui n'aura pas de lendemain.

Pour ce faire, nous allons tenter de recréer les forces qui opposeront l'Alliance rebelle et l'armée Impériale de Star Wars et laisser le hasard déterminer le vainqueur (pour le meilleur et pour le pire).


Source de la photo

Pour poursuivre mon exemple, j'ai récupéré là où j'étais rendu à l'étape précédente. Aucun changement ne sera nécessaire pour le moment dans la classe Fighter; tout ce qu'il y aura à modifier sera dans le fichier d'arène que j'ai renommé pour l'occasion champ-de-bataille.php.

Le contenu du script PHP :

require_once('classes/fighter.php');

# constante pour indiquer le nombre de combattants de chaque côté (forces égales)
DEFINE('NB_FIGHTERS', 250);

# noms des armées (pour affichage)
$armyNames = array('Alliance rebelle', 'Armée impériale');

# listes qui accueilleront les combattants
$armyRebelAlliance = array();
$armyImperial = array();

# générer les combattants de chaque armée (à forces égales)
for($i=1 ; $i<=NB_FIGHTERS ; $i++){
$armyRebelAlliance[] = new Fighter('Rebel # ' . $i);
$armyImperial[] = new Fighter('Stormtrooper # ' . $i);
}
Si vous souhaitez voir les caractéristiques des combattants créés par le programme, vous pouvez décommenter cette section :
/*
echo '<h3>Alliance rebelle</h3>';
foreach($armyRebelAlliance as $fighter){
echo $fighter->getName() . ' : ' . $fighter->getHP() . ' HP, Force ' . $fighter->getForce() . ', Defense ' . $fighter->getDefense() . "\n";
}

echo '<h3>Armée impériale</h3>';
foreach($armyImperial as $fighter){
echo $fighter->getName() . ' : ' . $fighter->getHP() . ' HP, Force ' . $fighter->getForce() . ', Defense ' . $fighter->getDefense() . "\n";
}
*/
Le combat peut commencer...
echo '<h3>Fight!</h3>';

$armies = array();
$armies[] = $armyRebelAlliance;
$armies[] = $armyImperial;

$fightersLeft = array();
$fightersLeft[] = count($armyRebelAlliance);
$fightersLeft[] = count($armyImperial);

while( $fightersLeft[0] > 0 && $fightersLeft[1] > 0 ){
# déterminer quelle armée attaquera et se défendra
list($armyAttacker, $armyDefender) = array_rand($armies, 2);

shuffle($armies[$armyAttacker]);
shuffle($armies[$armyDefender]);

$attacker = array_rand($armies[$armyAttacker]);
$defender = array_rand($armies[$armyDefender]);

$damage = $armies[$armyAttacker][$attacker]->hit($armies[$armyDefender][$defender]);

/*
if($damage > 0){
echo $armies[$armyAttacker][$attacker]->getName() . ' hits ' . $damage . ' HP on ' . $armies[$armyDefender][$defender]->getName() . "\n";
}
else{
echo $armies[$armyAttacker][$attacker]->getName() . ' miss ' . $armies[$armyDefender][$defender]->getName() . "\n";
}
*/

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

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

if($fightersLeft[$armyDefender] == 0){
$armyWinner = $armyAttacker;
}
}
Ensuite on affiche le gagnant et la liste des survivants :
echo '<h3>Gagnant</h3>';
echo $armyNames[$armyWinner];

echo '<h3>Survivants</h3>';
echo 'Alliance rebelle : ' . $fightersLeft[0] . "\n";
echo 'Armée impériale : ' . $fightersLeft[1] . "\n";

echo '<h3>Liste des survivants</h3>';

foreach($armies[$armyWinner] as $survivor){
echo $survivor->getName() . ' with ' . $survivor->getHP() . ' HP left' . "\n";
}
Maintenant vous êtes prêts à simuler le combat entre les deux armées rivales. Est-ce que ce sera un massacre ? Pesez sur le bouton et constatez le par vous-même (et si le résultat ne fait pas votre affaire, rafraîchissez la page).


Tags: Jeu de combat, PHP, Programmation

vendredi 25 juin 2010

Musique métal : CTRL+C, CTRL+V

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

Je fais appel aux fans de musique métal pour voir si j'ai l'oreille dérangée ou si mon impression est bonne. J'avais remarqué, il y a de nombreuses années, que deux riffs provenant de groupes différents avait une étrange ressemblance.

Pas tout à fait comme l'histoire de Malajube contre Katie Costello qui a créé un mini-scandale via Perez Hilton où la musique de Costello de même que le vidéoclip laissent croire à un plagiat artistique.

Dans le cas qui me préoccupe, ça me semble un peu plus subil et complexe. Il y a de nombreuses années, j'avais fait la remarque que le groupe métal français Misanthrope semblait avoir repris le riff très "catchy" d'une pièce d'un autre groupe métal, In Flames, en provenance de Suède.

J'ai sorti les pochettes (parce que oui, j'ai ces deux albums, témoins d'un passé où j'étais complètement fou de ce style musical) et j'ai essayé de comprendre ce qu'il en était.

In Flames
Album : The Jester Race
Pièce : #7 - Artifacts of the Black Rain

Note : enregistré au studio Fredman, à Göteborg en Suède, par Fredrik Nordström en novembre 1995



Misanthrope
Album : Libertines Humiliations
Pièce : #4 - L'écume des Chouans (repris aussi sous le nom "L'écume des solos")

Note : Enregistré au studio Fredman, à Göteborg en Suède, par Fredrik Nordström en août 1998


Curieuse coïncidence. Je me suis posé la question si, durant une période d'enregistrement en studio, le groupe n'aurait pas été influencé par l'autre. Je suis aller déterrer le passé et j'ai lu que le guitariste d'In Flames, Jesper Strömblad, ainsi que Anders Friden avaient déjà collaboré en studio avec Misanthrope lors de l'enregistrement de Visionnaire, un an auparavant.

Si ce n'est pas un "rip-off", doit-on en conclure à un clin d'oeil de la part du musicien ? Quelqu'un d'autre avait noté cette similitude entre le début des deux pièces ? Quelle est la portion de hasard pour que deux groupes différents puissent en venir à la même idée de riff ?


Tags: Musique

Bande-annonce de Java 4-ever

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

Je viens à l'instant de voir passer cette bande-annonce sur Twitter. Un film qui intéressera les programmeurs Java :

  • Du même réalisateur que Javatar et .Not
  • Avec Eddie Larrison, Scala Johansson, William Windows, Mona Lisa Harddrive et Lenny Linux


RIP John Johnsen
1951-2011
Where do you want to go today ?


Tags: Humour

jeudi 24 juin 2010

Histoire de Saint-Jean-Baptiste

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

J'en ai une bonne à vous raconter qui s'est passée hier soir à Montréal alors qu'on a décidé d'aller manger une crème glacée en fin de soirée.

Alors qu'on discutait tranquillement assis sur un banc, un homme circulait sur le trottoir avec son drapeau du Québec enroulé autour du corps (comme une cape) et nous a amicalement souhaité "Bonne Saint-Jean-Baptiste" (fête natonale des Québécois). Nous lui avons remis la pareille, sans penser que ça irait plus loin. Il avait l'air sur le party, sur un gros high, mais sans paraître menaçant. Probablement qu'il avait consommé plus que juste de la bière mais c'était un type assez comique pour qu'on le laisse parler.

Il ne demandait pas d'argent mais voulait du feu, question d'allumer sa cigarette. Un fumeur sans feu s'était-il plaint. Après un tour de magie raté impliquant deux allumettes qu'il alluma bout à bout entre ses doigts, il tenta de deviner nos noms. Je lis dans le subjonctif de l'impératif qualificatif du présent (encore pire). Ou quelque chose comme ça. Pour l'occasion, le hasard fait qu'il est tombé du premier coup sur les noms fictifs des deux filles qui m'accompagnaient : Catherine. Et moi, je semblais moins important dans l'histoire car il m'a rebaptisé Pierre Jean Jacques.

Il raconte qu'il doit aller se coucher mais que sa femme est à la maison et risque de le chicaner. Tu sais, elle n'était pas d'accord qu'il aille se promener avec son drapeau dans la rue. Il va rentrer à la maison et augmenter le niveau de l'air climatisé pour que le bruit enterre les questions de sa tendre moitié. Et il fera semblant de dormir. Dans son lit, il a un oreiller de corps : il en parle et en reparle. Ça lui fait du bien car ses genoux lui font mal. Il en parle en les comparant à une prolongation de ses os qui veulent sortir de son corps.

Il n'a plus le goût de faire l'amour à sa femme. Elle est grosse, elle qui pèse 225 livres alors qu'il n'en fait que 160. Pas des livres sterling, précise-t-il, en tentant de faire une tentative de joke. Si c'était des Euros, il serait riche! Être riche, tu peux faire plaisir à ceux que tu aimes et faire chier les autres avec ton argent. Sa femme a eu un cancer de l'utérus et un autre du sein. C'est moins intéressant pour lui. Sans compter que son engin est trop long, il ne peut pas la rentrer qu'à moitié (trop de détails...).

Il travaille le lendemain. 30$ de l'heure comme travailleur autonome, il ne peut pas passer à côté de ça. La prochaine femme qui va l'avoir, elle va être chanceuse. Il lui donnera des baisers en abondance. Une fois, il en a connu une... Elle n'était pas clitorienne ou vaginale. Elle était nichonnienne! Tu en rencontres juste une dans ta vie. S'il était une femme, il serait certainement lesbienne. Tu comprends, c'est un homme à femme. Il aime tellement les femmes, mais ce sont elles qui ont le pouvoir. Elles ont le privilège de décider si elles te veulent, ce sont elles qui ont la décision finale. Un gars ne peut pas faire ça.

Il m'a serré la main et est reparti à la recherche d'une autre personne à qui raconter son histoire. Il l'a trouvée de l'autre côté de la rue. C'est à ce moment-là qu'on s'est poussé en éclatant de rire.

Une autre rencontre étrange à ajouter à mon répertoire. La dernière était celle où un gars nous avait sollicité de l'argent en sortant du Dieu-du-Ciel! en échange d'un morceau de Marie-Claire Séguin interprété à la flûte à bec. Nous lui avons donné une pièce de 2$ et il s'est mis à jouer. Après 45 secondes ou 1 minute, il s'est arrêté soudainement. Selon le musicien, c'était tout ce que ça valait vu le montant qu'on lui avait remis. Priceless!

Bonne Saint-Jean à tous!

P.s. Au moment de la rédaction, je cherchais une photo pour accompagner l'article que j'ai trouvé sur un billet du blogue de Milie et Gex qui dépeint la société québécoise vu par nos cousins français. À lire.


Tags: Montréal

mercredi 23 juin 2010

Zone réservée aux chaises roulantes

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

Tant qu'à être dans les curiosités, voici une photo dont j'essaie encore de trouver l'explication et le lien qui unit les trois avertissements :

  • No Bicycles Permitted
  • Environmentally Sensitive Area
  • Caution : Watch For Wheelchair Traffic


Tirez-en vos conclusions et n'hésitez pas à poster un commentaire pour les partager avec nous !


Tags: Pancartes et écriteaux

Mais qu'est-ce qu'Adobe veut dire ?

Publié par Infinite Loop, à 15 h 50 2 commentaires

Je viens de faire une mise à jour pour Adobe Flash Player sur mon PC et j'ai remarqué que la barre de progression du programme d'installation indiquait le pourcentage avec un nombre de D K.



Quelqu'un sait ce que ça veut dire ?

  • Download Kit ?
  • Dizaines de Kilobytes ?
  • Donkey Kong ?
En tout cas, mon Windows XP était gelé et j'ai dû le redémarrer de force. Mon Outlook ne répondait plus car il tentait de démarrer une instance de l'éditeur Word pour composer le message et trois mises à jour se sont lancées en même temps, soit Adobe Flash Player, Firefox et Java, ce que mon PC n'a pas semblé apprécier. Donc D K n'est pas la chose la plus bizarre que j'ai vu aujourd'hui. Autrement dit, plus rien ne m'étonne.


Tags: Curiosités

mardi 22 juin 2010

SOAP en PHP : retourner un objet ou array ?

Publié par Infinite Loop, à 19 h 20 3 commentaires

Un lecteur (Emmanuel) m'a écrit pour me demander si je pouvais l'aider à faire fonctionner son service web PHP SOAP réalisé avec les composants du Zend Framework. En effectuant des recherches pour sa solution, il a trouvé mon article qui explique comment créer un WSDL facilement. Il a tenté de transposer mon exemple sur son projet mais mis à part faire apparaître le WSDL (serveur.php?wsdl), il n'arrivait pas à se connecter au service avec un client.

J'ai accepté de lui donner un coup de pouce mais au risque de me répéter, je lui ai d'abord demandé s'il avait lu la suite de mon article qui donnait quelques précisions sur l'article original : commentaire sur la création de WSDL en PHP.

En effet, il l'avait consulté et m'a expliqué, à l'aide d'un exemple concret, la nature du problème. Essentiellement, sa fonction appelée depuis le service web retourne un objet nommé Response et qu'il n'arrive pas à le récupérer côté client. La classe peut être définie sommairement comme suit :

class Response{
/** @var bool */
private $returnValue;

/** @var string */
private $errCode;

/** @var string */
private $errMessage;

/* plusieurs fonctions */
}
En retournant l'objet, impossible de le récupérer côté client. Pourtant, tout est 100% fonctionnel s'il retourne un simple int, string, float, etc. Son intuition : définir dans le WSDL un type complexe qui correspondrait à l'objet retourné. J'avoue ne pas y avoir pensé et ne pas avoir expérimenté. Mais j'avais un doute que ce soit possible car l'objet possède des fonctions qui ne seraient pas prises en charge au moment du retour. Peut-être que je me trompe et que c'est possible ? À ma connaissance, le but d'un service web est d'offrir une interface standard pour être appelée à partir de n'importe quel langage de programmation. Ce qui sous-entend qu'on recevra des valeurs et non pas des objets.

Ma recommandation a été de lui suggérer de contourner le problème en utilisant une valeur de retour de type "array" associatif. Ainsi, sa classe Response offrirait une fonction pour récupérer les valeurs :
class Response{
/** @var bool */
private $returnValue;

/** @var string */
private $errCode;

/** @var string */
private $errMessage;

public function __construct(){
// à titre d'exemple...
$this->returnValue = true;
$this->errCode = 404;
$this->errMessage = 'Page not found';
}

public function getValues(){
$arrToReturn =
array(
'returnValue' => $this->returnValue,
'errCode' => $this->errCode,
'errMessage' => $this->errMessage
);

return $arrToReturn;
}
}
Dans la classe qui sera inspectée par AutoDiscover, j'ajoute une fonction :
/**
* Return array structure
* @return array
*/
public function getResponseStructure(){
$obj = new Response();
return $obj->getValues();
}
Alors que du côté client, je peux récupérer les valeurs selon les clés :
$client = new Zend_Soap_Client('http://wsdl.localhost/service.php?wsdl');
$response = $client->getResponseStructure();

print_r($response);

/*
echo $response['returnValue'] . "\n";
echo $response['errCode'] . "\n";
echo $response['errMessage'] . "\n";
*/
En sortie de print_r() :
(
[returnValue] => 1
[errCode] => 404
[errMessage] => Page not found
)
Ceci devrait suffire pour obtenir les valeurs correctement. Si quelqu'un sait s'il est possible de retourner réellement un objet, je serais preneur pour la solution.


Tags: PHP, Zend Framework

lundi 21 juin 2010

1er Tweet de Google en binaire

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

Je suis un utilisateur de Twitter depuis le 6 février 2009 si je me fie au service When Did you Join Twitter. Pourtant, je ne fais pas parti des 2 300 000 suiveux du compte officiel de Google qui a rejoint le réseau de micro-blogging 3 jours après moi.

Pour ma part, je ne me souviens plus du tout quel était mon premier tweet. Mais ce n'était rien d'important et certainement pas un "hello world" (à moins que ?). Du côté de Google, leur premier "gazouilli" (quel mot affreux !) fût le suivant :



Une séquence binaire !

I'm 01100110 01100101 01100101 01101100 01101001 01101110 01100111 00100000 01101100 01110101 01100011 01101011 01111001 00001010

Tout ça juste pour dire une fois décodée : I'm feeling lucky. Ben coudonc.


Tags: Le coin du geek

dimanche 20 juin 2010

Utilisation CSS de @font-face avec OpenType

Publié par Infinite Loop, à 09 h 52 2 commentaires

Mise en situation : le designer d'une maquette de site web est celui qui possède généralement le plus de fonts installées sur son poste de travail. L'intégrateur reproduit le visuel en tentant de respecter au maximim la vision artistique du designer, en prenant soin de spécifier la font utilisée pour l'affichage du texte. Une fois le tout en ligne, le client se plaint qu'il ne voit pas les caractères correctement suivant ce qui avait été présenté. C'est qu'il n'a pas cette police spéciale installée sur son ordinateur.

Si vous rêvez d'intégrer n'importe quelle font à votre site web tout en étant certain que tous la verront, vous devez exploiter le truc @font-face en CSS avec les fonts TrueType (.TTF), OpenType (.OTF) et Web Open Font Format (WOFF).

Choisissez une font à votre goût sur un site tel que OpenFontLibrary ou Font Squirrel, téléchargez le fichier compressé qui contient le ou les différents formats. Certaines fonts sont payantes alors que d'autres sont gratuites pour usage commercial. Pour mon exemple, j'ai choisi Days en OTF.

Dans votre projet web, il est conseillé de conserver les différentes fonts en les organisant sous une arborescence logique comme : /css/fonts/Days/Days.otf.

Dans votre feuille de style CSS :

@font-face {
font-family: "Days";
src:
local("Days"),
local("Days alternatif"),
url(fonts/Days/Days.otf);
}
Le fureteur cherchera d'abord localement sur l'ordinateur à un ou plusieurs endroits spécifiés (on peut ajouter plusieurs références de noms alternatifs avec local) et s'il ne le trouve pas, il utilisera l'URL pour la récupérer.

Pour y faire référence, on utilisera le nom indiqué dans font-family de @font-face indiqué plus haut. Ensuite, on l'appliquera à nos éléments par CSS :
h1{
font-family: Days, Verdana, Arial;
font-size: 18px;
}

h2{
font-family: Days, Verdana, Arial;
font-size: 16px;
}
Voici un aperçu du résultat :



Le problème, c'est que les fonts avec les accents pour du texte français sont plus rares. Comme dans l'exemple ci-dessus, "à l'usage" est transformé en "a l'usage" en retirant l'accent. C'est à considérer lors du choix de la font.

Fait étonnant, OpenType a été développé par Microsoft et est supporté depuis IE 4 alors que les autres fureteurs n'ont été compatibles que très récemment.

Enfin, quelques ressources pour poursuivre votre exploration :
  • @font-face sur Mozilla developer center
  • un générateur de kit font-face
  • un bon tutoriel sur l'utilisation de font-face


Tags: CSS, Intégration

Citation no. 87 sur la dépression

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

Si parfois tu te sens petit, inutile, démoralisé ou dépressif, n'oublie jamais que tu as été un jour le spermatozoïde le plus rapide de la bande.

- Anonyme


Tags: Citations

samedi 19 juin 2010

Japadog : hot dog à la japonaise

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

Comme le temps est pluvieux, je passais le temps en regardant mes photos pour me remémorer des souvenirs. Lors de mon dernier voyage à Vancouver, j'avais remarqué ce restaurant qui servait des hot dogs inspirés de la culture culinaire japonaise. Si on lit bien, on voit le lien du site web. Il n'est jamais trop tard pour aller voir ce qu'ils offraient.



Dans le menu de Japadog : Teriyamo, Teriyaki, Okonomiyaki, porc Kurobuta, boeuf Kobe, aux fêtes edamame, sauce aux prunes...

Mais le plus drôle, c'est que celui inscrit comme étant le plus populaire est en cours d'amélioration !



Dommage que je ne sois pas allé lors de mon passage. Quelqu'un a déjà goûté à ce mets exotique ? Ça me semble plus raffiné qu'un bon vieux hot dog chou.


Tags: Marché des saveurs

Exclure un domaine d'une campagne AdWords

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

Quand j'ai reçu un bon de 100$ pour tester les campagnes AdWords de Google, j'ai sauté sur l'occasion pour essayer de faire un peu de publicité pour le présent blogue en ciblant le public geek. Pourtant, je n'ai rien à vendre alors pourquoi de la publicité ? Je suis ni une entreprise ni un magazine, juste un gars assoiffé de découvrir comment les choses fonctionnent. Et là où je travaille, les campagnes de positionnement ne sont pas sous ma responsabilité. C'est pourquoi je me suis lancé avec quelques tests sur mon projet personnel.

À ma surprise, j'ai vu récemment que ma publicité s'affichait dans la colonne de droite de Code 18. C'est un peu moche d'annoncer son site sur son propre site ! Pourquoi AdWords n'exclut-il pas automatiquement les annonces dont le lien pointe à l'URL où les annonces AdSense sont affichées ?



Je suis allé voir les outils de gestion de campagne AdWords (accès direct si vous êtes connecté) pour voir s'il y avait une possibilité d'ajouter une exception. Je me suis rendu dans la section Site and Category Exclusion et j'ai pu ajouter le domaine à exclure :



Une fois les changements enregistrés, je suis retourné voir si elle apparaissait encore et elle y était toujours. J'en ai conclus que ce n'était pas immédiat et que ça disparaîtrait une fois les index des serveurs mis à jour. Je suis allé dormir et à mon réveil ce matin, elle n'y figurait plus.


Tags: SEO

Plus aucune raison de croire à ça en 2010 !

Publié par Infinite Loop, à 07 h 59 1 commentaire

Voici un email de scam que j'ai reçu cette semaine, une genre de tentative de fraude visant à soutirer des informations personnelles et/ou de l'argent en me faisant croire que j'ai gagné une loterie. Lisez, vous verrez que c'est rigolo et surtout incohérent.

Madame, Mademoiselle, Monsieur,

Dans le cadre de la soutenance du libre accès à l'ordinateur et d'Internet, la fondation américaine " BILL & MELINDA GATES Foundation" a organisé une loterie concernant toutes les personnes ayant une adresse électronique.

Le tirage a été effectué par " BILL & MELINDA GATES foundation " et a concerné plus de 20.000.000 de compagnies et plus de 30.000.000 adresses d'Email privées de partout dans le monde. Ce programme promotionnel de l'Internet a lieu chaque année.

Cette loterie est une initiative de Monsieur et Madame GATES, Ceci dans le but de soutenir le libre accès à l'ordinateur et d'Internet partout dans le monde entier (INTERNET POUR TOUS) tel est le but de cette initiative.

Voici le tableau des lots
  • 1er prix Deux villas jumelées d'une valeur de 350 000 Euros située à la Riviera GOLF (Abidjan)
  • 2ème prix La somme d'un montant de 150 000 Euros
  • 3ème prix La somme d'un montant de 80 000 Euros
  • 4ème prix
  • 5ème prix La somme d'un montant de 30 000 Euros
  • La somme d'un montant de 15 000 Euros
  • Le Tirage des adresses Emails gagnants a été effectué par la présidente de succursale en présence d’un huissier de justice sous l'agrégation d'un avocat.
Dès réception du présent message, sachez madame / mademoiselle / monsieur que vous êtes la personne correspondante à l'adresse électronique tirée au sort à la seconde place, ce qui fait de vous l'heureux (se) bénéficiaire d'un montant d'une valeur de 150 000 Euros.

NB : Nous vous prions de bien vouloir nous adresser un message de confirmation à notre adresse email suivante: bm.gatef@yahoo.fr en mentionnant votre numéro d'identification qui est Le N° #xxxxxxxxxx sans oublier de remplir les informations demandées ci-dessous :

CIVILITE:................................................
NOM:…………………………………………………..
PRENOM:……………………………………………
PAYS:........................................................
VILLE:…………………………………………………
CODE POSTAL:……………………………………
TEL. FIXE:……………………………………………
PORTABLE:…………………………………………
ADRESSE COMPLETE :…………………………
PROFESSION:………………………………………

Encore une fois, la direction de vous félicite car vous devenez l'heureux (se) gagnant(e) du deuxième lot. Vous souhaitant bonne réception, nous vous prions de croire à l'assurance de notre considération distinguée.

P/S: REMERCIEMENT A LA POSTE.NET AINSI QU'AU GROUPE YAHOO

Comme le jeu des 7 erreurs qui rendent le message peu crédible :
  1. L'organisateur du concours possède mon adresse email mais n'a aucune idée de qui je suis. Déjà douteux.
  2. Depuis le temps, tout le monde sait qu'on doit se méfier de toute forme de message ou publicité qui nous informe qu'on a gagné quelque chose sans avoir participé. Ça l'était avant l'ère Internet, c'est d'autant plus vrai aujourd'hui.
  3. Juste 30 millions d'adresses email sélectionnées ? On est 1,7 milliards d'utilisateurs sur Internet! Pas très fair-play pour un concours "Internet pour tous"...
  4. Les arnaques soit disant impliquant la générosité de Microsoft ou Bill Gates, c'est démodé. Cher arnaqueur, essayez au moins de vous mettre à jour en inventant quelque chose comme quoi Sergey Brin et Larry Page seraient personnellement passés devant chez moi avec la caméra Street View, qu'ils ont capté mon adresse par inadvertance et qu'ils souhaitent me dédommager.
  5. Pourquoi la fondation de Bill préférerait utiliser l'Euro plutôt que la devise américaine, elle qui est basé aux États-Unis ?
  6. Je crois que je vais m'étouffer. Je dois répondre à une adresse Yahoo! en France. Haha!
  7. En collaboration avec Poste.net : Server not found.
Celui qui a rédigé ce courriel est un imbécile.


Tags: Curiosités

vendredi 18 juin 2010

Décharger les idées de ma tête

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

En bref, la revue d'une semaine chargée :

  • En magasinant une pile de rechange Ni-MH HHR-P105 pour mon téléphone sans fil Panasonic, j'ai préféré en commander une générique à un marchand chinois sur eBay pour 3,50$ (livraison incluse) au lieu d'encourager les grandes bannières qui en vendent des équivalentes entre 25$ et 35$.
  • J'ai résolu mon problème de performance sur une lourde requête SQL qui utilisait des sous-requêtes dans le select en utilisant une table dérivée combinée avec la clause limit. Passé de 14 secondes d'éxécution à une fraction de seconde.
  • J'ai acheté le tout premier numéro du magazine québécois Baron qui traite de culture, politique, design et voyage. Ça semble prometteur. En espérant que cette première parution prendra de la valeur un jour.
  • J'ai reçu une vedette internationale dans mon salon! Malheureusement, je n'avais que de la bière Boréale à lui offrir, lui qui est un grand amateur de bières de micro-brasseries obscures.
  • J'ai découvert Misteur Valaire et j'ai acheté leur deuxième album en remettant une généreuse contribution volontaire de 11,23$ (ce qui correspond au début de la suite de Fibonacci). Je respecte trop la musique pour faire parti des 61% qui n'ont rien donné. Coup de coeur : Gumshoe, Lillehammer et Ave Mucho.
  • Ce vidéo en HTML5 qui se détruit lorsqu'on clique dessus est vraiment impressionnant.
  • S'est rendu compte que c'est vraiment cool de réfléchir à une tactique loufoque pour qu'un ami annonce à son entourage qu'il est officiellement en couple avec la demoiselle qu'il voit en cachette depuis un certain temps.
  • Les Francofolies sous la pluie, ce sont des spectacles qui tombent à l'eau.
  • Tant pis pour ceux qui détestent FailQC en prétextant que ce n'est qu'une pâle copie de Failblog. Les trucs en français ne seraient jamais publiés sur ce dernier, ce qui justifie largement son existence.
  • Ne pas oublier la fête des pères.
  • Ceux qui ont acheté un t-shirt ou des autocollants à l'effigie du gardien Halak pour mettre sur leur voiture doivent se sentir un peu nono. Le jongleur des mots Guy Mongrain dirait surement que c'est le "Prix" à payer...
  • Quelles sont les conséquences si la caissière de la pharmacie oublie de me faire composer mon NIP de carte de crédit ET que je ne signe pas le reçu ?
  • Entre le Rigolfeur et le Mini-Putt authentique, lequel choisir ? Est-ce que "aucun" fait parti du choix de réponses ?


Tags: Le coin du geek

jeudi 17 juin 2010

Ajouter un ancre hash tag dynamiquement

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

Dans un projet web où il y avait un certain nombre de listes d'entrées suffisamment longues qu'on devait utiliser la barre défilante verticale, un des requis ajouté tardivement était de rediriger l'utilisateur au bon endroit dans la liste suite à l'ajout ou la modification d'un enregistrement. Une fois modifié, une redirection s'effectuait vers la liste de gestion en incluant comme paramètre GET de l'URL l'identificateur unique (clé primaire) de l'entrée.

D'ordinaire, le positionnement à un emplacement spécifique de la page se fait par un ancre HTML. Un peu démodé mais ça fonctionne bien quand on en a besoin. Puisque chaque élément de la liste possèdait un attribut ID, j'aurais pu modifier chaque lien de redirection vers les listes pour y ajouter un hash tag (#element-id).

Mais bon, le problème c'est qu'il y a tellement de liens qui redirigent vers ces listes et j'en ai perdu la trace et que je voulais être certain de ne pas en oublier. La meilleure solution qui s'offrait à moi était de le déléguer aux pages des listings.

Si la liste est chargée et qu'elle possède un paramètre GET avec le numéro de l'entrée ajoutée ou modifiée, une instruction JavaScript ajouterait l'ancre automatiquement pour se positionner au bon endroit dans la page.

Et c'était incroyablement simple à faire. Il suffit d'appeler la ligne suivante en indiquant le nom de l'ancre (composé d'un terme générique et du numéro d'enregistrement, par exemple elem-999) :

window.location.hash = 'id-unique-de-l-ancre';
Tellement simple que je n'avais aucun souvenir que ça existait. C'était la première fois que je l'utilisais celle-là. Et c'est là que je me dis que ça serait une bonne idée de réviser mes notions de base de JavaScript...

Soyez certain d'attendre que la page est complètement chargée avant d'appeler location.hash (par exemple, à l'intérieur de $(document).ready() de jQuery).


Tags: JavaScript

Retour sur l'anti-conférence pour un Web musical Québécois

Publié par Infinite Loop, à 09 h 03 5 commentaires

Hier se tenait l'anti-conférence musiQCnumeriQC (dont j'avais entendu parler par l'entremise de l'Alliance Numérique) qui se tenait à la salle les Katacombes à Montréal (bâtiment curieux de l'extérieur mais très intéressante une fois à l'intérieur).

Je suis allé fouiner un peu pour voir ce qui s'y passait et par rapport à ce que j'ai eu l'occasion de voir, j'ai noté quelques liens intéressants à visiter.

  • Alliance Numérique
  • Viinyl.com - Your Song. Your Site.
  • Ecoutez.ca (c'était le lancement de la plateforme)
  • Dacapo - éditions musicales
  • Misteur Valaire - un modèle différent (téléchargez l'album au prix désiré)
  • FanTactik - Branchez-vous sur vos fans
  • Backfed - Plateforme intéressante en développement (à suivre)
  • Stage Yourself - Your show, your audience. (avec votre avatar qui assiste au spectacle virtuel)
  • Frédéric Leduc (un guitariste qui a offert une performance web avec Stage Yourself)
Est-ce qu'il y a autre chose que j'aurais dû voir et que j'ai manqué ?


Tags: Musique

mercredi 16 juin 2010

Deux erreurs d'inattention à l'intégration

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

Voici deux erreurs d'inattention que j'ai noté cette semaine en visitant ces sites web.

Malajube

En effectuant une recherche du mot clé Malajube sur Google, le premier résultat s'affiche comme l'image ci-contre. Damn! Le splash page est en Flash et le seul texte détecté est le choix de langue avec en prime le alt name de l'image "separateur".

Ce qui veut dire que si on cherche la séquence exacte des mots "français separateur english" (en utilisant les guillemets), les premiers résultats font aussi référence au site de Malajube.

Tours Kaleidoscope

Je vous avais glissé un mot sur la visite du Red Light de Montréal. En regardant la liste des visites offertes, j'ai remarqué que 5 rubriques possédaient encore du texte de maquette Lorem Ipsum. Oups!


Tags: Intégration, SEO

mardi 15 juin 2010

Chocolat pour les geeks

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

Juste après mon souper, j'ai eu envie de manger un bon chocolat. J'ai sauté dans mon rapidotron et j'ai attéri à Matane dans le Bas-Saint-Laurent. En consultant les principales activités qu'on peut faire au centre-ville de Matane, j'ai vu dans la liste que le numéro 12 est de se bourrer de chocolat chez Matad'Or. Surtout à ne pas confondre avec les chocolats Matador du Liban!

Non, celui-ci est unique, un peu à l'image du dépanneurs/club vidéo de la campagne. Ici on a affaire à une chocolaterie/crèmerie authentique.

J'y ai déniché un ordinateur old-school en chocolat (avec amandes grillées). Un cadeau que votre geek préféré appréciera à sa juste valeur (dire informaticien, c'est un peu nul, non ?).



Si on regarde de plus près, on s'apercevra que l'écran date des années 80 mais que la technologie était suffisamment avancée pour qu'il soit plat. Quant au clavier, il ne compte que 59 touches et le pad numérique n'a pas de zéro.



Et si vous observez d'encore plus près, vous verrez qu'on s'en fout complètement et que j'ai fini de le manger avant même que vous finissiez de lire ces lignes.

À ajouter sur votre itinéraire dans les bonnes adresses à visiter lors de votre futur périple vers le village de Grosses-Roches.

Les Chocolats Matad'Or
496, avenue Saint-Jérôme
Matane, Québec

Tél. : 418-562-5672

Autrement, si vous préférez vous sucrer le bec avec des chocolats à l'image de technologies plus récentes, vous aurez tout un choix ici.


Tags: Le coin du geek, Marché des saveurs

lundi 14 juin 2010

PHP : preg_replace() et le symbole $ comme valeur

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

Voici un petit problème de programmation que j'ai rencontré en tentant de créer un énoncé SQL qui remplaçait des placeholders par les bonnes valeurs. Et c'est vraiment un pur hasard d'avoir trouvé ce bogue dans l'application car je faisais des tests sur un enregistrement spécifique qui m'a permis de déceler le problème.

J'ai simplifié l'exemple pour démontrer plus facilement ce qui se passe et j'ai assumé que j'avais vérifié et "escapé" les valeurs selon leur type pour m'en tenir uniquement à ce dont je voulais voir.

Selon vous, qu'est ce qui ne va pas dans le code PHP suivant :

$search = '/:param1/';
$value = "'The price is $1.50 USD'";
$sql = 'INSERT INTO table (field) VALUES (:param1)';

echo preg_replace($search, $value, $sql);
À l'impression, l'énoncé SQL devient soudainement :
INSERT INTO table (field) VALUES ('The price is .50 USD')
Le symbole $ est perdu de même que l'unité 1 sur le prix.

Et celle-ci fonctionne correctement :
$value = "'The price is 1.50$ CAD'";
Pourquoi ? Je suppose que parce que j'utilise une expression régulière, la fonction preg_replace() peut s'attendre à avoir des back references sous la forme $1, $2, $3, etc., et il confond le symbole dans la valeur avec une référence arrière utilisée pour effectuer son remplacement (par une valeur vide).

Si j'appelle preg_quote() sur la variable $replace (avant d'appeler preg_replace()), j'obtiens cet énoncé :
INSERT INTO table (field) VALUES ('The price is $1\.50 USD')
Une fois exécuté, le backslash devant le point n'est pas inséré dans la table. Mais Postgres me retourne un petit warning : Nonstandard use of escape in a string literal. Hint: Use the escape string syntax for escapes, e.g., E'\r\n.

Donc il est heureux si je l'exécute ainsi :
INSERT INTO table (field) VALUES ('The price is $1\.50 USD')
Sinon mettre un double backslash (\\) devant les symboles $ fait aussi bien l'affaire et me permet de conserver le prix en entier dans le texte sans avoir à utiliser E' :
$value = str_replace('$', '\\$', $value);
C'est ça qui arrive quand on joue dans le vieux code d'un autre, on trouve des belles petites perles qui nous font creuser nos méninges (et parfois sacrer un peu!).


Tags: PHP

dimanche 13 juin 2010

Un montréalais en tourisme à Montréal

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

Quand on fait du tourisme à l'étranger, beaucoup font appel aux guides pour en savoir un peu plus sur l'historique de l'endroit. À Montréal, dans ma propre ville où j'habite, je suis loin de tout connaître et comme j'ai un intérêt pour l'histoire, pourquoi ne pas faire le touriste et me rendre à une visite guidée ?

C'est exactement ce qu'on a fait quand ma copine m'a parlé d'un tour guidé de 2 heures (à pied) intitulé Derniers soupirs du Red Light "La Main" (St-Laurent), organisé par Tours Kaleidoscope. Elle s'est fait convaincre suite à la lecture d'un reportage paru dans le journal Metro du 11 juin dernier (voir pages 10 et 11). Un article est aussi disponible sur le site web, profitez-en pour regarder l'extrait vidéo de 6 minutes du guide Michel Jutras (vraiment intéressant et qui fait remarquer des détails auquels on ne porte généralement pas attention). Pour 15$ par personne, on en a eu pour notre argent.

Source de la photo

Par la force des choses, le boulevard St-Laurent est devenu la rue principale de Montréal car à l'époque, la petite ville était entourée de remparts et le seul accès par le nord débouchait sur cette route principale. Les voyageurs qui se rendaient à Montréal l'empruntaient et c'est pour servir cette clientèle que des auberges et les débits d'alcools sont apparus tout au long de la Main.

Pour ceux qui s'intéressent à l'architecture, remarquez sur les trottoirs de St-Laurent, du centre-ville jusqu'à Mont-Royal, les années de construction des bâtiments sont inscrites devant chacun d'eux. Les plus vieux immeubles de la Main se trouvent du côté est.

À l'époque, la Main était un endroit respectable. C'est vers les années 1960 que ça s'est mis à devenir plus malfamé (contrôlé par la mafia). Dans le quartier du Red Light, la prostitution se faisait de trois façons :
  • la sollicitation sur la rue
  • dans les maisons closes
  • les services de luxe pour la clientèle fortunée (les grandes dames)
La rue Clark en est un exemple : comme il y en avait beaucoup, ils ont pratiquement tout démoli et reconstruit à nouveau. Même le bureau chef du service de police se trouve en plein coeur du quartier.

Juste à côté, le Monument National. Vers l'extrémité gauche se trouvait le Musée Eden qui a réellement existé et dont s'est inspiré la série diffusée à Radio-Canada. Plus d'information se trouvera sur le panneau situé de l'autre côté de la rue, sur le mur de la SAT.

À la SAT (Société des Arts Technologies), on remarque la construction d'un dôme sur le toit pour faire des projections sur le plafond. Derrière, un autre dôme plus subtil indique une petite mosquée pour servir les musulmans du quartier. Un genre d'énergumène qui n'avait pas toutes ses facultés est venu se mêler à la visite. Il a rapidement perdu l'intérêt.

Plus loin sur Sainte-Catherine, devant les Foufounes Électriques (le bar s'est déjà nommé le Cabaret La Ceinture fléchée - voir l'histoire des cabarets montréalais sur Wikipedia) se trouve un bâtiment étroit avec une crèmerie qui se plante au milieu d'un stationnement. À l'époque, l'espace du stationnement était occupé par un bar de la mafia (c'était l'ancien quartier italien de Montréal, avant la Petite Italie) auquel était annexé un petit hôtel. Le bar a pris feu et les pompiers l'auraient laissé brûler pour s'en débarasser. Seul l'hôtel y aura survécu. Selon la rumeur, le propriétaire ne veut pas le démolir car il est convaincu qu'Al Capone y aurait déjà séjourné et qu'il pourra le prouver un jour. La compagnie de vêtements Parasuco a démarré ses bureaux dans ce bâtiment et ce sont eux qui ont fait la gigantesque fresque colorée sur les murs.

Notre guide nous a fait remarquer que les entrées des théâtres et salles de spectacles étaient souvent étroites. Ceci était dû au fait qu'on devait payer selon la façade qui avait pignon sur rue. Pour que ça coûte moins cher, on construisait les salles en pleine largeur à l'arrière de la façade étroite.

Dans les cabarets montréalais, des stars ont fait leur réputation. On pense à Charles Aznavour qui serait débarqué à Montréal pour faire quelques spectacles Au Faisan Doré (maintenant le bar de danseuses Kingdom, en face du Screaming Eagle), à Dominique Michel, Olivier Guimond et Lili St-Cyr.

Celle-ci était une éffeuilleuse californienne qui pris un nom français pour attirer la clientèle, par exemple à la salle maintenant connue comme le TNM. À l'époque, une loi interdisait que les danseuses quittent la scène moins vêtue qu'à leur arrivée. Pour contourner cette loi, elle a mis sur pied un numéro où elle se trouvait dans une baignoire et elle se rhabillait progressivement jusqu'à sa sortie. Elle reçut le titre de la stripteaseuse la plus populaire de Montréal.

Quelques autres points d'intérêts de la visite :
  • le Montréal Pool Room déménagé l'autre côté de la rue
  • Café Cléopatre, le dernier résistant (Hydro-Québec voudrait construire une deuxième tour à cet emplacement)
  • shops de juifs (ateliers de couture)
  • habitations Jeanne-Mance (habitations à loyer modique) en plein centre-ville
  • la musique et les musiciens jazz jamaïcains
  • le quartier multi-ethnique
Aujourd'hui, avec le quartier des spectacles, chaque salle est identifiée le soir par des projecteurs qui éclairent le trottoir avec des spots rouges regroupés par 4. Question de recréer l'ambiance de l'époque.


Tags: Histoire, Montréal

Citation no. 86 sur Linux et Windows

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

Linux est à Windows ce qu'une jolie fille est à une prostituée : la jolie fille, il faut la séduire pour obtenir ce que l'on désire alors que la prostituée , il suffit de la payer, et surtout bien se protéger.

- Anonyme


Tags: Citations

samedi 12 juin 2010

Trois lois de la robotique d'Asimov

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

Qui dit robotique dit aussi programmation. Car ce sont nous les programmeurs qui réaliseront le code nécessaire au bon fonctionnement des robots dans un avenir plus ou moins lointain (à vrai dire, je suis sceptique de le voir de mon vivant !).

D'ailleurs, le prolifique auteur Isaac Asimov a exposé les lois de la robotique qui pourront nous servir de ligne directrice dans l'élaboration de notre travail :

  1. Un robot ne peut porter atteinte à un être humain, ni, restant passif, permettre qu'un être humain soit exposé au danger.
  2. Un robot doit obéir aux ordres que lui donne un être humain, sauf si de tels ordres entrent en conflit avec la première loi.
  3. Un robot doit protéger son existence tant que cette protection n'entre pas en conflit avec la première ou la seconde loi.
Jusqu'à maintenant, voyons si la conception et la technologie leur a réussi.

Robocop

Du côté du policier Robocop, il suit 4 directives prioritaires, inspirées de celles d'Asimov :

1. Être au service des citoyens
2. Protéger les innocents
3. Faire respecter la loi
4. Interdiction de s'attaquer à un membre de l'OCP

Malgré tout, il doit se nourrir avec de la purée pour bébés.

ED-209

Le rival de Robocop, ED-209 (Enforcement Droid Series 209) possède des armes destructrices et plusieurs défauts de fabrication. Lorsqu'il demande à son adversaire de poser son arme, il ne sait le détecter et tue sans pitié.

De par sa taille, il est maladroit dans les escaliers. Lorsqu'il tombe, son orteil métallique vibre intensément.


No.5 dans Coeur Circuit

Un prototype de robot doté d'intelligence artificielle de l'armée américaine qui est atteint par la foudre, ce qui cause un dérèglement dans son programme informatique, ce qui le rend pacifique et fasciné par la vie.

Non, sérieux non! Ce n'est pas ça du tout, on veut que les robots tuent!

Un peu innocent mais lit très vite. Se sent vivant et veut s'appeler Johnny. Devient plaqué or à la fin de Short Circuit 2.

Un projet de film (remake ?) serait sur la table pour 2011.

R2-D2 et C-3PO

Nul besoin de présentation ici.

R2-D2 est un modèle multi-fonctions possédant un pistolet paralysant, un outil pour agripper les objets, une interface d'ordinateur, un projecteur holographique (qui a déjà diffusé le Star Wars Kid) et un périscope. Peut aussi servir de baril de bière.

C-3PO est un droïde grande gueule qui connaît 6 millions de formes de communications. Autrement dit, il est capable de traduire les langues comme Google Translate ou Bing Translator.

Asimo

La compagnie Honda prétend que son robot Asimo (Advanced Step in Innovative MObility) ne serait pas une référence. Faudra demander au porte-parole de Honda au Québec, Martin Matte. On est toujours pas certain de son utilité.

C'est ben faite pareil cette p'tite bête là!


Terminator

Un cyborg assassin programmable devenu gouverneur de l'état de la Californie. A converti son hummer à l'hydrogène pour qu'il soit écologique.

Son mandat est bientôt terminé est sera peut-être remplacée par l'ancienne présidente d'eBay, Meg Whitman.

Hasta la Vista Baby!


Mention spéciale à HAL 9000, Goldorak, Astro, les Transformers, Marvin (Guide du voyageur galactique), Wall-E... Quelque uns font déjà partie du Hall of Fame des robots.


Tags: Programmation

vendredi 11 juin 2010

Expérimentations Canvas HTML 5 et JavaScript

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

La balise <canvas> est nouvelle à la spécification HTML 5. Le développeur Daniel Puhe a fait quelques expérimentations intéressantes sur son site spielzeugz.de.

Commencez par regarder la démonstration vidéo de particules liquides sur YouTube. Ensuite, expérimentez vous-même le comportement des éléments sur le canvas avec votre souris et à l'aide d'un fureteurs récent compatible avec HTML 5 (Firefox, Chrome, Opera ou Safari). Vous pourrez aussi jeter un oeil au JavaScript dans le code source (il n'est pas minifié).

Particules liquides



Une version avec des lettres



Particules 2.0



Et ce n'est même pas du Flash ! Mais voyez l'usage du CPU de ma machine :



Pour en savoir plus sur le tag canvas, ce tutoriel présenté par Mozilla Developer Center saura vous guider convenablement.


Tags: HTML, JavaScript

jeudi 10 juin 2010

Joke informatique dans un livre

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

Dans le glossaire d'un livre informatique, la définition du terme "infinite loop" :


Mais qu'est-ce qu'une boucle infinie ? Allons voir la définition :



Et c'est quoi la récursivité ?



Si vous ne la comprenez pas, ne comptez pas sur moi pour vous l'expliquer...


Tags: Humour, Programmation

Démystifier le dollar américain

Publié par Infinite Loop, à 18 h 55 2 commentaires

En cette période d'incertitude économique, amusons-nous a décortiquer l'endos du dollar américain (pour ceux qui y voient toujours les signes d'une conspiration).


  • Le haut de la pyramide montre la partie non-complétée des États-Unis;
  • L'ombre à gauche représente les terres à découvrir à l'ouest du pays;
  • Le soleil levant représente la nouvelle nation;
  • L'oeil pourrait ou non représenter la société secrète des Illuminati; C'est aussi probable que ça soit l'oeil de Sauron;
  • Le bouclier représente l'habileté du pays à se prendre en charge et à voler de ses propres ailes;
  • L'aigle regarde vers une branche d'olivier mais tient aussi des flèches. Il regarde pour la paix mais est aussi prêt à se défendre;
  • Le numéro 13 est omniprésent. On compte aussi 13 étoiles au-dessus de l'aigle pour symboliser les 13 colonies originales. La pyramide possède 13 niveaux de briques, les citations latines (Annuit Coeptis et E Pluribus Unum) comptent chacunes 13 lettres, il y a 13 barres sur le bouclier, 13 feuilles sur la branche et 13 flèches;
  • MDCCLXXVI est le chiffre romain pour 1776 (indépendance des États-Unis)
  • La phrase latine "Novus ordo seclorum" veut dire "New Order of the Ages" pour indiquer la nouvelle ère où la nation américaine est devenue indépendante
  • Annuit Coeptis veut dire "He (God) favors our undertaking"
  • E Pluribus Unum veut dire "Out of many, one" dans le sens de "Out of many states, one nation"
Avec ça, le dollar canadien est définitivement moins le fun à regarder.


Tags: Histoire, Saviez-vous que

mercredi 9 juin 2010

HTML 5 et CSS - Astuce pour coder plus vite

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

Je vais partager avec vous un truc que je viens de voir dans un tutoriel vidéo et que je vais installer dès demain sur mon éditeur Netbeans au travail. Le projet Zen Coding sur Google Code propose une nouvelle façon d'écrire rapidement du code HTML et CSS selon les spécifications HTML 5.

Selon leur démonstration, après avoir installé leur package, si on inscrit cette ligne et qu'on appuie sur la touche TAB :

div#page>div.logo+ul#navigation>li*5>a

Ce sera automatiquement transformé en ce code HTML :

<div id="page">
<div class="logo"></div>
<ul id="navigation">
<li><a href=""></a></li>
<li><a href=""></a></li>
<li><a href=""></a></li>
<li><a href=""></a></li>
<li><a href=""></a></li>
</ul>
</div>
Vraiment cool hein ! Donc si votre éditeur est Aptana/Eclipse, Komodo, Notepad++, ils sont officiellement supportés. Du côté de Netbeans 6.8, la compatibilité est actuellement de base pour le HTML (vérifiez la liste des autres éditeurs compatibles sur le site, il y en a beaucoup d'autres dont Dreamweaver). Donc l'exemple ci-dessus ne fonctionne pas encore mais ça viendra et ce sera certainement un plugin prometteur pour les développeurs,

À la base, on pourra quand même utiliser certains raccourcis comme ceux-ci :

script TAB
<script type="text/javascript"></script>
input TAB
<input type="type" id="name" name="name" value="value" />
form TAB
<form action="action" method="method"></form>
html:5 TAB (essayez aussi html:4s pour le HTML 5 strict)
<!DOCTYPE HTML>
<html lang="ru-RU">
<head>
<title>title</title>
<meta charset="UTF-8">
</head>
<body>

</body>
</html>
Et de nombreux autres. Référez-vous à la cheat sheet pour voir tous les raccourcis.

Installation sur Netbeans 6.8
  • Rendez-vous sur la page du projet
  • Téléchargez la version la plus récente pour votre éditeur (par exemple NetBeans.Zen.HTML.1.2.zip)
  • Vous allez obtenir un petit fichier de 8 Kb
  • Dans Netbeans, allez dans Tools / Options
  • Sous l'onglet General, cliquez sur le bouton Import (en bas à gauche de la fenêtre)
  • Sélectionnez le fichier zip sur votre poste
  • Vous verrez une fenêtre avec les options disponibles. Cochez All pour installer les macros et les gabarits de code
  • Faites OK et redémarrez l'IDE
Vous pourrez voir toutes les options installées dans le menu Tools / Options, sous l'onglet Editor / Code Templates / HTML (de la liste déroulante). D'autres se trouveront sous l'onglet Macros. C'est ici que vous pourrez changer les templates, par exemple pour remplacer l'attribut lang ru-RU pour fr-FR (à moins que ça soit dans vos habitudes de coder pour des biolérussiens).

Vous pouvez aussi voir la vidéo où j'ai trouvé cette astuce.


Tags: Coffre à outils, HTML, Programmation

mardi 8 juin 2010

Sac de chips extrêmes format géant

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

Vous vous rappelez que je vous avais parlé des chips les plus piquantes au monde (Blair's Death Rain Habanero Chips) ? J'étais convaincu qu'à la saveur décapante de ces croustilles, elles étaient en vente uniquement en petit format individuel.

Et bien voilà une bonne nouvelle pour les amateurs d'épices qui font bobo à la langue, elles sont maintenant disponibles en grand format de 142 grammes chez Coconut (au coût de 4,79$). Je m'en suis procuré un mais je n'ai pas encore osé l'ouvrir, ne sachant pas quelle occasion serait la plus appropriée pour mettre au défi mes amis.



Je crois que le prochain qui m'invite à un barbecue pourra profiter de ces succulentes chips en ma compagnie.


Tags: Marché des saveurs

lundi 7 juin 2010

Fin du 17ème Mondial de la bière de Montréal

Publié par Infinite Loop, à 19 h 11 2 commentaires

Hier était la dernière journée du Festival mondial de la bière 2010 qui se tenait à la Gare Windsor à Montréal. Certaines personnes se sont plaintes qu'il y avait trop de monde, qu'on se pilait sur les pieds et qu'il y avait une file d'attente soit pour entrer ou pour acheter des coupons pour les dégustations. Et en plus le mauvais temps était de la partie.

Quand nous sommes arrivés en début d'après-midi, c'était encore supportable. Nous n'avons pratiquement pas attendu en file et nous avons rapidement acheté nos coupons. Dès ma première consommation, j'ai remarqué que les exposants offraient une plus grande quantité si on avait acheté le verre de l'événement (on pouvait aussi en apporter un de chez soi). Je suis donc retourné m'en procurer un au kiosque à l'accueil (8$) et soudainement, il y avait deux files d'attentes qui se rendaient jusqu'à la porte extérieure. Tout ça, en 15 minutes.

Chaque dégustation de bière et autres breuvages alcoolisés coûtait entre 1 et 5 coupons (1$ par coupon, en moyenne 3-4 coupons par consommation). Aussi, il y avait différents mets (fromages, viandes, frites, etc) qu'on pouvait se mettre sous la dent moyennant un frais supplémentaire.

Je vous fais un petit résumé de ce que j'ai goûté (et que ceux qui m'accompagnaient ont bien voulu partager avec moi).

Bières

  • Cherry Wheat de Brutopia de Montréal (1er coup de coeur, comme une Kilkenny du type crème aux cerises. J'en veux encore!)
  • La Sauvage de Boquébière de Sherbrooke (type rouge de Belgique si je me souviens bien. Intéressant)
  • Double de Bonsecours du Broue Pub Bouhaha de Montréal (très bonne, à essayer)
  • Sein d'Esprit du Broadway Pub de Shawinigan (personnel sympathique et belle sélection de bières. J'ai maintenant une raison de trainer du côté de Shawinigan)
  • Ochamena Bi-Ru au sarrasin et thé japonais du Dieu du Ciel ! de Montréal (j'ai été légèrement déçu, je m'attendais à quelque chose de surprenant)
  • Pale Ale lime et framboise de La Barberie de Québec (la finale de lime cachait le goût de la framboise)
  • Félix 11,9% du Bilboquet de St-Hyacinthe (bière de glace dont on m'a expliqué le procédé de fabrication avec beaucoup de passion. Juste wow! 2ème coup de coeur)
Bouffe
  • Viande de kangourou (la saucisse était délicieuse, la longe devait être mastiquée, moins tendre que je pensais mais plus goûteux)
  • Cornet de frites de Frites Alors (sous la pluie!)
Autres alcool
  • Cassis Monna & Filles de l'Ile d'Orléans (tout simplement délicieux! Produits de grande qualité et personnel sympathique)
  • Mistelle de fraise Frasil de Nordvie en Abitibi (celui de type porto est super). Ils font aussi un granité / sloche aux vraies fraises et à la rhubarbe (aussi bon qu'à la crèmerie Meu Meu). À essayer, meilleur et moins concentré et sirupeux que la liqueur Fragoli.
Maintenant, essayez de deviner combien mon après-midi m'a coûté ! Mais on s'en fout, ça en valait le coût.

Chronique Saviez-vous que...
J'ai remarqué récemment dans les romans d'une autre époque qu'on parle souvent de "mise en bière" quand on traite de la mort. En effet, une bière était aussi le mot utilisé pour désigner un cercueil.

Alors profitons du premier avant de subir l'autre ! Je lève mon verre à votre santé !


Tags: Marché des saveurs, Montréal

dimanche 6 juin 2010

Laptop Toshiba - Réinitialisation "out of the box"

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

En fin de journée hier, j'ai joué au technicien informatique pour dépanner ma belle-mère avec l'installation de Windows 7 (que je n'ai toujours pas adopté) sur son nouveau laptop. La mère et la fille sont allées magasiner ensemble chez Future Shop et elle a décidé de se gâter en achetant un portable Toshiba Satellite L550D avec écran de 17 pouces (ça semble être un bon rapport qualité/prix). Avec cet achat, elle avait droit à une promotion qui lui permettait de choisir une imprimante qui lui revenait à 20$ seulement (Epson Stylus NX215).

Le vendeur a bien entendu proposé la garantie prolongée mais j'avais préalablement pris soin d'informer ma belle-mère de la garantie supplémentaire qu'offre gratuitement Visa si on paye avec la carte de crédit (je vous conseille fortement de vérifier avec votre banque pour voir si cette protection est offerte).

Par exemple, chez ING :

D’une assurance extension garantie constructeur étendant de 2 années supplémentaires la garantie initiale de 2 ans du constructeur en cas d’achat avec votre carte VISA d’un bien neuf à usage ménager (réfrigérateur…), électronique vidéo (écran Plasma…) ou audio (lecteur MP3…) réservé à un usage privé;

À la Banque Laurentienne :
La carte VISA Noire Ma Récompense vous permet aussi de protéger vos biens acquis avec les assurances achats et garantie prolongée. En effet, la carte double la garantie du manufacturier jusqu’à concurrence d’une année et vous offre une protection contre la perte, le vol ou le bris pour 90 jours suivant l’achat.

Aux Caisses Desjardins :
Double la durée des garanties de moins de cinq ans fournies par le fabricant, jusqu'à concurrence d'un an, à l'égard de presque tous les biens achetés comportant une garantie écrite honorée au Canada.

Ensuite le vendeur a suggéré d'acheter un câble USB pour brancher l'imprimante. Prix: 29,99$. Il justifiait le prix en disant que ce n'était pas un câble USB standard (pas de type A mais de type B). Si ma belle-mère avait été seule, elle l'aurait probablement acheté car elle ne connaît pas ça. Mais ma copine savait que je pourrais lui en dénicher un à meilleur prix chez Addison-Electronique (3,99$ pour 6 pieds) ou sur le site DealExtreme (4,13$ pour 3 mètres, livraison incluse).

Enfin, voyant qu'elle n'est pas une experte, il présente le service ConnectPro qui peut lui configurer l'ordinateur pour 79,99$. C'est là que ma copine m'a téléphoné. Je lui ai dit que sur les laptops récents, le système d'exploitaton est pré-installé sur une partition cachée du disque dur et que ça se configure à peu près tout seul. Pas besoin d'acheter Windows à part ni d'un expert pour attendre à notre place que le système se mette en place de lui-même.

Elles sont donc reparties pour installer tout ça. Durant l'installation, quelque chose s'est interrompu et le processus semblait recommencer continuellement en redémarrant l'ordinateur plusieurs dizaines de fois. Définitivement, il y avait quelque chose qui ne tournait pas rond.

J'ai suggéré qu'on reprenne l'installation à partir du début. Après avoir essayé les classiques F2 et F8 au démarrage, je ne voyais pas de moyen de reprendre en mode "recovery" ou en mode réparation. Je me suis branché sur mon ordinateur et j'ai fait une recherche dans la documentation web pour savoir comment reprendre à la toute première étape et annuler ce qui avait été fait jusqu'à maintenant.

La solution
Pour réinitialiser l'ordinateur à la configuration de sortie d'usine (factory settings), comme si on venait de le sortir de la boîte la première fois ("out of the box") :
  1. Maintenez le bouton "power" enfoncé jusqu'à ce que l'ordinateur soit éteint
  2. Appuyez sur la touche 0 (zéro), maintenez-là enfoncée et appuyez sur le bouton "power" en même temps pour le mettre en marche
  3. Lorsque l'écran de démarrage apparaîtra, vous aurez l'impression que l'image à l'écran sera figée car il n'avancera pas plus loin dans les étapes
  4. C'est à ce moment-là que vous devrez relâcher la touche 0
  5. Vous devriez voir apparaître les options de recovery
  6. Tout sera réinitialisé (et vous perdrez toutes vos données)
Après avoir sélectionné cette option, nous avons pu choisir à nouveau la langue de Windows et faire un choix entre l'architecture 32 bits et 64 bits (supportée par le laptop). Ensuite, tout s'est déroulé à merveille. Windows redémarre bien un certain nombre de fois mais pas si souvent (pour certains drivers et après quelques logiciels). Comme l'écran d'installation n'est pas très explicite, vous pourrez suivre les étapes en appuyant sur la touche logo Windows (entre CTRL et ALT) qui vous affichera la barre des tâches et le menu Démarrer. Un processus différent sera affiché dans cette barre, le nom indique ce qui est en train d'être installé.


Tags: Coffre à outils

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)
        • L'art de l'ordinateur analogique
        • L'effet du deuxième système de Brooks
        • La vérité sur la gestion de projets
        • Simulation de combat - Étape 6
        • Citation no. 88 sur la politique
        • Faire de la musique avec un bonzaï
        • Simulation de combat - Étape 5
        • Musique métal : CTRL+C, CTRL+V
        • Bande-annonce de Java 4-ever
        • Histoire de Saint-Jean-Baptiste
        • Zone réservée aux chaises roulantes
        • Mais qu'est-ce qu'Adobe veut dire ?
        • SOAP en PHP : retourner un objet ou array ?
        • 1er Tweet de Google en binaire
        • Utilisation CSS de @font-face avec OpenType
        • Citation no. 87 sur la dépression
        • Japadog : hot dog à la japonaise
        • Exclure un domaine d'une campagne AdWords
        • Plus aucune raison de croire à ça en 2010 !
        • Décharger les idées de ma tête
        • Ajouter un ancre hash tag dynamiquement
        • Retour sur l'anti-conférence pour un Web musical Q...
        • Deux erreurs d'inattention à l'intégration
        • Chocolat pour les geeks
        • PHP : preg_replace() et le symbole $ comme valeur
        • Un montréalais en tourisme à Montréal
        • Citation no. 86 sur Linux et Windows
        • Trois lois de la robotique d'Asimov
        • Expérimentations Canvas HTML 5 et JavaScript
        • Joke informatique dans un livre
        • Démystifier le dollar américain
        • HTML 5 et CSS - Astuce pour coder plus vite
        • Sac de chips extrêmes format géant
        • Fin du 17ème Mondial de la bière de Montréal
        • Laptop Toshiba - Réinitialisation "out of the box"
        • Citation no. 85 sur l'alcool
        • Branchement Digitech RP155 sur l'ordinateur
        • Réflexion sur la suite de Fibonacci (PHP)
        • Fonction strip_tags pour PostgreSQL
        • C'est là que la chicane a pognée...
        • Illusion d'optique impossible
        • Convertir du Flash à HTML 5 et JavaScript
      • ►  mai 2010 (36)
      • ►  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