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

mardi 24 avril 2012

Diagramme d'accords de guitare en canvas HTML5

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

Mon dernier billet sur la programmation avec le canvas HTML5 datait d'un bout de temps déjà. Je me demandais quel genre de petit projet pratique je pourrais développer en l'espace d'une soirée et comme j'ai amorcé un cours de guitare, je me suis dit que ça pourrait être intéressant d'apprendre à dessiner un diagramme d'accord de guitare.

Qu'est-ce que le diagramme doit afficher ?

  • le nom de la note
  • le sillet de tête (communément appelé nut - la barre horizonale foncée)
  • pour faire simple, les 4 premières frettes (pour illustrer des open chords)
  • les 6 cordes (de gauche à droite EADGBE)
  • la position des doigts (cercles noirs)
  • les cordes ouvertes à jouer (cercles blancs)
  • les cordes à ne pas jouer (avec un X au bout du sillet)
Voici le résultat affiché par ce tutoriel pour un accord de DO (ainsi que quelques contrôles permettant de rafraîchir la note sur le diagramme) :

Code HTML :
<canvas id="myCanvas" width="250" height="300">
    Le canvas HTML5 ne fonctionne pas avec ton browser déficient :-(
</canvas>

<p>
    <button type="button" id="btnA">A</button>
    <button type="button" id="btnB">B</button>
    <button type="button" id="btnC">C</button>
    <button type="button" id="btnD">D</button>
    <button type="button" id="btnE">E</button>
    <button type="button" id="btnF">F</button>
    <button type="button" id="btnG">G</button>
</p>

<p>
    <button type="button" id="btnC7">C7</button>
    <button type="button" id="btnAsus4">Asus4</button>
</p>
Définition de quelques formules d'accords sous forme de tableau :
// chaque array contient dans l'ordre la position des doigts de la corde 6 à 1 (mi grave à mi aigu)
var a = { "name" : "A", "notes" : [null,0,2,2,2,0] };
var b = { "name" : "B", "notes" : [null,2,4,4,4,2] };
var c = { "name" : "C", "notes" : [null,3,2,0,1,0] };
var d = { "name" : "D", "notes" : [null,null,0,2,3,2] };
var e = { "name" : "E", "notes" : [0,2,2,1,0,0] };
var f = { "name" : "F", "notes" : [1,3,3,2,1,1] };
var g = { "name" : "G", "notes" : [3,2,0,0,0,3] };

var c7 = { "name" : "C7", "notes" : [null,3,2,3,1,0] };
var asus4 = { "name" : "Asus4", "notes" : [null,0,2,2,3,0] };
Initialisation JavaScript des boutons :
// inclure jQuery
$(document).ready(
    function(){
        $('#btnA').click( function(){ drawChordDiagram(a); } );
        $('#btnB').click( function(){ drawChordDiagram(b); } );
        $('#btnC').click( function(){ drawChordDiagram(c); } );
        $('#btnD').click( function(){ drawChordDiagram(d); } );
        $('#btnE').click( function(){ drawChordDiagram(e); } );
        $('#btnF').click( function(){ drawChordDiagram(f); } );
        $('#btnG').click( function(){ drawChordDiagram(g); } );

        $('#btnC7').click( function(){ drawChordDiagram(c7); } );
        $('#btnAsus4').click( function(){ drawChordDiagram(asus4); } );
    }
);
La fonction qui dessine le diagramme ainsi que la note :
function drawChordDiagram(chord){

    var canvas = $('#myCanvas');

    if(canvas && canvas.get(0).getContext){

        var context = canvas.get(0).getContext('2d');

        // initialiser la surface de dessin
        context.setTransform(1, 0, 0, 1, 0, 0);
        context.clearRect(0, 0, canvas.width(), canvas.height());

        context.translate(50, 0);

        var nbFrets = 4;
        var nutWidth = 120;
        var stringLength = 140;
        var nbStrings = 6;
        var fretWidth = stringLength/nbFrets;

        // nom de l'accord
        context.font = "30px arial";
        context.fillText(chord.name, 0, 70);

        // décalage sous le nom de la note
        context.translate(0, 100);

        // "nut"
        context.strokeRect(0,0,nutWidth,5);
        context.fillRect(0,0,nutWidth,5);

        // déplacement vers le bas avant de dessiner les frettes
        context.translate(0, 3);

        // frettes
        context.lineWidth = 2;

        for(var fret=1 ; fret<=nbFrets; fret++){
            context.beginPath();
            context.moveTo(0, fret*fretWidth);
            context.lineTo(nutWidth, fret*fretWidth);
            context.closePath()
            context.stroke();
        }

        // cordes
        for(var string=0; string<nbStrings ; string++){
            context.beginPath();
            context.moveTo(string*(nutWidth/(nbStrings-1)), 0);
            context.lineTo(string*(nutWidth/(nbStrings-1)), stringLength);
            context.closePath()
            context.stroke();
        }

        // taille pour le X
        context.font = "24px arial";

        // l'accord
        $.each(chord.notes,
            function(string, fret){
                var x = nutWidth/(nbStrings-1) * string
                var y = (stringLength/nbFrets) * fret - (stringLength/nbFrets)/2;

                if(fret == null){
                    // position approximative du X
                    context.fillText('x', string*(nutWidth/(nbStrings-1))-7, -10);
                }
                else{
                    context.beginPath();
                    context.arc(x, y, 8, 0, Math.PI*2, false);
                    context.closePath()

                    if(fret > 0){
                        // cercle plein (noir)
                        context.fill();
                    }
                    else{
                        // cercle vide (blanc)
                        context.stroke();
                    }
                }
            }
        );
    }
}
Avec ces quelques lignes de code, nous voilà avec un gabarit de diagramme capable d'illustrer un bon nombre d'accords en position ouverte. Dans ce prototype, plusieurs validations sont manquantes (entre autre lorsqu'on sort des limites du manche) et il reste à implémenter le décalage de la position sur le manche (généralement indiqué par le numéro de la frette à gauche). Je reparlerai sans doute des améliorations apportées lors de mes prochaines expérimentations.


Tags: HTML, JavaScript, Musique

lundi 23 avril 2012

Progresser, c'est ralentir pour mieux avancer

Publié par Infinite Loop, à 21 h 16 1 commentaire

Vous l'avez sans doute constaté, j'ai énormément ralenti mon rythme d'écriture. Tant mieux. Entre le boulot, les rénovations, l'inscription à un cours de guitare, ça me laisse moins de temps pour écrire. Et pour lire.

Il y a quelques jours, un billet sur VentureBeat.com dressait une liste des 25 meilleurs livres de tous les temps sur la technologie. Pour ma part, j'ai lu uniquement les 4 titres suivants :

  • The Soul of a New Machine
  • Hackers, heroes of the computer revolution
  • The Long Tail
  • The Age of Spiritual Machines
En parcourant leur palmarès, deux titres ont attiré mon attention :
  • The World is Flat
  • The Physics of the Future
C'est certain que je veux me les procurer. Mais quand aurais-je le temps d'y porter attention ? La liste ne fait que s'allonger et ma bibliothèque est déjà bien garnie, certains volumes accumulant la poussière depuis déjà trop longtemps.

J'ai passé mon weekend dans les boutiques. Retourner deux jours de suite dans exactement les mêmes magasins! Pouvez-vous croire que ma copine a acheté pour 150$ de fleurs séchées en guise de décoration ? On aurait pu se contenter d'aller au Dollorama mais ça aurait été 150 fois moins classe. Dans le parterre, les tulipes ont commencé à pousser en raison des chaleurs anormales cette saison, jusqu'à ce que le gel au sol de cette semaine vienne gâcher le tout. Je dois acheter un nouveau BBQ. Le fait qu'il ait pris en feu l'été dernier et que la température ait grimpé à plus de 500 degrés a eu raison de lui. Et la boîte du nouveau que je veux ne rentre pas dans la voiture. Volontaire avec gros véhicule utilitaire recherché. Compensation : un repas par le meilleur burger flipper en ville. Non Patrick, le Bixi est très cool mais n'est pas une option. Par contre, tu peux venir m'aider à l'assembler et on l'inaugurera avec des côtes levées. On verra si ta recette est si fameuse.

Ça sent l'été mais la température est maussade. Je suis allé essayer le nouveau restaurant Grill N Go sur Fleury (Montréal) pour me contenter. Vraiment bon. Dès que vous croisez l'épicerie Metro, laissez-vous guider par l'odeur du poulet mariné cuit sur charbon de bois. Un demi-poulet que le cuisinier tranche en fracassant les os avec un couteau qui rendrait Dexter jaloux. Je viens justement de terminer le visionnement de la 5ème saison. L'aubaine du siècle sur eBay où j'ai déniché les 5 coffrets pour seulement 50$. 1 mois de divertissement plus tard, combien de temps devrais-je patienter pour que la 6ème saison sorte en DVD ?

J'étais trop paresseux pour faire quelque chose ce soir. Alors j'ai amorcé la rédaction d'un billet que les fans de musique et de programmation apprécieront. Je le publierai demain, le temps de lui apporter quelques améliorations. Entre temps, je compte organiser une chasse au trésor à Montréal à l'aide d'une clé USB. Je vous en reparle prochainement.


Tags: Club Vidéo, Le coin du geek, Livres, Marché des saveurs

dimanche 22 avril 2012

Citation no. 150 sur les erreurs

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

La créativité, c'est se permettre des erreurs. L'art, c'est savoir lesquelles garder.

- Scott Adams


Tags: Citations

samedi 21 avril 2012

Initiation à la cacopédie et l'anti-savoir

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

Quelques professeurs d'université dans une pizzeria à Bologne en Italie. Discutent-ils de la pluie et du beau temps ? Certainement pas! Initiés par le célèbre Umberto Eco (qui possède plus d'une vingtaine de doctorat honoris causa, dont un de l'Université du Québec à Montréal), ces cerveaux surchauffés se sont affairés à l'élaboration d'une nouvelle science négative du savoir, la cacopédie. Décrite comme la science des solutions qui, dans le cas où elles ne sont pas imaginées par malice ou méchanceté, seront bien vite imaginées par quelqu'un de sérieux et sans malice, le remue-méninges de ces intellectuels a donné naissance à des idées tordues et déjantées comme la zérologie, un système de calcul logique complet fondé uniquement sur le zéro ou encore sur la réflexion à propos de l'impossibilité de construire la carte à l'échelle 1:1 de l'empire. Absurde et difficile à réaliser : tout à fait. Impossible ? C'est à voir.

À travers les époques, les cartes se sont toujours améliorées en terme de fidélité de ce qui était à représenter. Pour atteindre la perfection, la carte devrait hypothétiquement reproduire non seulement les reliefs naturels mais aussi les bâtiments et les sujets du territoire. Ainsi, on en déduit que la carte grandeur réelle étalée ne peut pas être opaque car elle priverait la terre où elle est déployée des rayons solaires et des précipitations. Sans compter qu'il serait difficile de percevoir les altérations du territoire pour corriger continuellement la carte pour qu'elle demeure fidèle à la réalité. Et pourquoi pas une carte suspendue au-dessus du territoire à l'aide de poteaux d'une hauteur égale à ses plus hauts reliefs ? Si on observe une portion de la carte à partir d'en dessous, elle est fidèle uniquement au moment où elle est achevée. Sans compter la difficulté possible s'amuser avec un cerf-volant... Au contraire, si l'observateur décidait de survoler la carte par le dessus, elle deviendrait automatiquement infidèle puisqu'elle représenterait un territoire ayant un nombre d'habitants supérieur d'au moins un par rapport à celui des résidents effectifs au moment de l'observation.

Il y a aussi la problématique de pouvoir ranger la carte, qu'elle soit pliable et dépliable. À supposer que la carte soit étalée sur le sol et que les habitants vivraient dessus, lorsque viendrait le temps de la rangeer, chacun prendrait un bord et la replierait progressivement en reculant vers le centre et en soutenant les bords repliés au-dessus de leur tête. Si les habitants ne sautent pas à l'extérieur au fur et à mesure du repliage, la population serait enfermée dans une poche et on qualifierait alors cette situation catastrophique de "scrotum". Inconfort et détresse psychologique assurés. Et n'allez pas croire que la réflexion s'arrête là. Une énorme carte repliée au centre du territoire n'est-elle pas censée être représentée sur la carte si on souhaite conserver son exactitude ?

Si ce que vous venez de lire vous a plu, vous trouverez quelques extraits choisis à la fin du livre Comment voyager avec un saumon d'Umberto Eco (qui vaut son pesant d'or en matière d'humour intello). Sorti originalement il y a 20 ans, je l'ai lu pour la 1ère fois au début des années 2000 et je n'ai jamais retrouvé d'équivalent par un autre auteur. Vos suggestions de lectures similaires seront grandement appréciées.


Tags: Curiosités, Livres

mercredi 18 avril 2012

Itérateur infini en PHP

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

Quand j'ai jeté un coup d'oeil dans la documentation de PHP au sujet du InfiniteIterator de la SPL, je trouvais que ça manquait cruellement d'exemples concrets. Boucler sur des chats et des chiens, hum ? Dans quel cas réel est-ce qu'on voudrait poursuivre au début d'une liste lorsqu'on atteint la fin ? Tiens, en musique la gamme chromatique est cyclique, c'est à dire que si on énumère les douze notes possibles et qu'on ajoute un demi-ton à la dernière, la note qui suit est celle qu'on a utilisé au départ, à la différence qu'on sera un octave plus élevé.

Voyons comment on pourrait traduire cet exemple en code, d'abord par une classe simple qui contiendra l'ensemble des notes. Pour ceux moins familiers avec la notation internationale : Do = C, Ré = D, Mi = E, Fa = F, Sol = G, La = A et Si = B. Remarquez, en aucun cas je demande à revenir explicitement au début de la liste, je ne fais que lire l'élément courant ainsi que me déplacer à l'élément suivant.

class ChromaticScale{
    private $_notes = array('C', 'C#/Db', 'D', 'D#/Eb', 'E', 'F', 'F#/Gb', 'G', 'G#/Ab', 'A', 'A#/Bb', 'B');
    private $_infiniteIterator;

    public function __construct($key){
        if(array_search($key, $this->_notes) === false){
            throw new Exception("Key $key does not exists");
        }
 
        $this->_infiniteIterator = new InfiniteIterator( new ArrayIterator($this->_notes) );

        while( $key != $this->_infiniteIterator->current() ){
            $this->_infiniteIterator->next();
        }
    }

    public function currentNote(){
        return $this->_infiniteIterator->current();
    }

    public function add($halfSteps){
        for($hs = 0; $hs  < $halfSteps ; $hs++){
            $this->_infiniteIterator->next();
        }
        return $this->_infiniteIterator->current();
    }
}
Maintenant qu'on peut faire une boucle infinie à l'intérieur de la liste de notes, ce serait intéressant de pouvoir générer les gammes majeures et mineures. Pour cela, on aura besoin de connaître les formules d'intervalles.
  • Pour la gamme majeure, on choisit une note de départ à laquelle on applique la formule : ton, ton, demi-ton, ton, ton, ton, demi-ton.
  • Pour la gamme mineure : ton, demi-ton, ton, ton, demi-ton, ton, ton.
Dans les livres de théorie musicale, vous verrez souvent la formule inscrite sous la forme WWHWWWH ou WHWWHWW où la lettre indique le ton (Whole step) ou le demi-ton (Half step). Voici un exemple simple qui calcule les notes de la gamme selon la clé ($key) et le mode ($mode) définis.
DEFINE('W', 2); // whole step = 2 half steps
DEFINE('H', 1); // half step

// initialisation
$key = 'C#/Db';
$mode = 'major';

$notes = new ChromaticScale($key);

$modes = array(
    'major' => array(W,W,H,W,W,W,H),
    'minor' => array(W,H,W,W,H,W,W)
);

$formula = $modes[$mode];

$nbNotes = count($formula);

$scale = array();
foreach($formula as $halfSteps){
    $scale[] = $notes->currentNote();
    $notes->add($halfSteps);
}

echo '<h1>' . $key . ' ' . $mode . ' scale</h1>';
echo implode(' - ', $scale);
Affichage:

C#/Db major scale
C#/Db - D#/Eb - F - F#/Gb - G#/Ab - A#/Bb - C


Tags: Musique, PHP, Programmation

samedi 14 avril 2012

En veux-tu une froide ?

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

Il y a quelques semaines, j'affirmais que mon frigo était plus cool que le vôtre. J'avais tort. Parce qu'on n'arrête pas le progrès et que vous le savez, les appareils Apple deviennent rapidement désuets. On a déjà inventé mieux en matière de réfrigération : le frigo en amplificateur Marshall.



Facteur cool : 11 sur 10 (si vous regardez jusqu'à combien vont les contrôles, vous y verrez un clin d'oeil bien placé au film Spinal Tap). These go to eleven!



Prix de détail suggéré : 299$ USD. Un peu moins abordable que des aimants de frigo mais la rock star ne doit pas regarder à la dépense lorsque vient le temps de garder au frais, disons ses sandwiches pas de croutes (lire entre les lignes "bière").

Jim Marshall, un grand pionnier d'équipement de musique rock s'est éteint le 5 avril dernier. Les vrais fans de la marque ont sans doute essuyé leurs larmes avec des mouchoirs en papier provenant d'une boîte au look assorti : recherchez Marshall Guitar Amp Sneeze Box Skinz sur eBay... Question de se moucher à un volume de 11 ?

D'ailleurs, saviez-vous que le mot bière, comme dans l'expression "mettre en bière" ne fait pas seulement référence à une boisson alcoolisée mais est aussi un synonyme au mot cercueil (grande boite dans laquelle on place le corps d’un défunt) ?

La légende survit et le bon vieux rock ne meurt jamais. Sortez votre guitare et crinquez votre ampli à 11 en l'honneur de Jim. Ensuite, trinquez à sa mémoire. Ignited we stand.


Tags: Curiosités, Musique, Saviez-vous que

mardi 10 avril 2012

À Montréal, il vaut mieux louer un appartement que d’acheter une maison. Vraiment ?

Publié par Infinite Loop, à 20 h 46 9 commentaires

Ayoye. C'est vraiment ce que je viens de lire dans le billet de Major Blog. Est-ce que je devrais m'inquiéter (si vous me lisez régulièrement, vous savez que je suis l'un de ceux qui a perdu la tête et qui a acheté une maison sur l'île de Montréal) ? Bof, pas vraiment. J'ai tellement entendu dire de choses que je constate que tout le monde a raison et tout le monde a tord. Il y a trop de facteurs en cause et on ne peut pas énoncer une règle qui s'applique à tous. C'est comme de se faire dire par un expert : ce n'est pas un bon temps pour investir, tu vas faire seulement 1% d'intérêt à court terme. Ok, mais pour l'investissement à long terme ? Personne ne peut prédire. Et on peut faire parler les chiffres comme on veut.
 
D'ailleurs, en 10 ans d'investissements en REER, vous savez combien j'ai récolté en profit ? ZÉRO. Avec la crise financière de 2008 que personne n'avait vu venir, les intérêts ont fondu. Même que ça s'est traduit en perte de capital. La situation peut changer du jour au lendemain. Alors pour l'éclatement possible de la future bulle immobilière, on verra.

Quand j'ai écrit sur les jeunes et la location perpétuelle, je m'indignais déjà contre le pessimisme de certains et l'exagération des arguments présentés. Jusqu'à maintenant, rien ne m'a prouvé que j'avais tord. Louer au lieu d'acheter ? C'est clairement un argument qu'on entend de la part de ceux qui possèdent des immeubles à logements et qui préfèrent nous les louer plutôt que nous voir voguer vers l'indépendance.

Justement, je parlais avec un ami de Québec en fin de semaine et il me disait que les appartements à louer étaient rendus vraiment dispendieux dans la région de la capitale, que c'était du jamais vu. Il n'y a pas si longtemps dans une banlieue de Montréal, un ami louait un 4 et demi à plus de 800$ par mois. Lorsqu'il a acheté sa maison pas très loin de là, le montant de son hypothèque était inférieur à la mensualité de son bail. C'est rendu ça la réalité. Qui nous dit que ce ne sont pas les prix des logements en location qui augmentent trop rapidement ?

Faire le choix de devenir propriétaire d'une maison, peu importe où elle se trouve, c'est aussi se libérer un jour des paiements. C'est un investissement à long terme, à condition de pouvoir se le permettre bien sûr. Ça me rappelle lorsque j'ai acheté ma première voiture neuve. Au concessionnaire, une fois que le vendeur a terminé de vous servir et que vous êtes décidé à prendre possession de l'auto, on vous envoie dans un autre bureau où un commis de services tente de vous ajouter sur la facture des options, garanties supplémentaires, antirouille, etc. Et on essaie aussi de vous convaincre de prendre la voiture en location plutôt que de l'acheter. En pleine face, le bonhomme m'a pratiquement traité d'imbécile de préférer l'achat à la location. Normal, puisqu'après le terme de location, on est obligé de louer à nouveau ou d'acheter, ce qui est beaucoup plus payant pour le concessionnaire et du même coup, contre nos intérêts.

À moins d'une de collection, une voiture, même si on l'entretient comme il faut, finira seulement par voir sa valeur diminuer. Au contraire, une maison prendra de la valeur à long terme. Quand mes parents ont acheté leur maison de banlieue dans les années 80, le montant d'achat de 85000$ était considéré élevé. On disait qu'il fallait être fou pour payer ça, que les prix finiraient par descendre. 25 ans plus tard, elle est payée et pourrait être revendue environ 250000$. Certainement, au fil des ans, sa valeur a fluctuée mais au final, le prix a grimpé pour atteindre 3 fois sa valeur initiale.

Par mon expérience personnelle, ça fait moins d'un an et demi que j'ai acheté ma maison à Montréal. J'ai toujours dit que c'était un coup de chance mais je ne savais pas à quel point. Les papiers du notaire indiquent qu'à sa construction, le prix de vente était de 11000$. Multipliez au moins par 25 pour connaître sa valeur 50 ans plus tard. Je suis passé à la banque récemment et j'ai eu à faire évaluer la propriété. Sa valeur a grimpé de 21000$. J'ai mentionné que ça ne fait que 16 mois que je suis propriétaire ? Sans doute le meilleur placement que j'ai fait dans ma vie. Soudainement, l'histoire des REER me fait moins mal au coeur. Oui, la valeur risque de baisser légèrement si les taux montent mais au final, le prix grimpera chaque année en raison de la rareté. Dans le même quartier, une amie louait un logement à quelques coins de rue de là et elle se faisait appeler directement par des acheteurs potentiels qui souhaitaient entrer en contact avec le propriétaire. La demande est forte, l'offre est rare. D'ailleurs, je reçois 2 à 3 fois par semaine de la sollicitation imprimée d'agents immobiliers qui cherchent des maisons à vendre. Le visage de l'un d'eux (que je salue au passage!) est imprimé chaque semaine sur mon Public-Sac. Je me fais appeler pour savoir si j'ai l'intention de vendre dans les prochains mois. Quand tu as trouvé un bon filon, tu ne t'en débarasses pas.

Que ce soit pour une maison ou un iPad, tant que la demande est forte, inutile de l'afficher à prix réduit. Au contraire, les prix demeurent élevés. Dans l'immobilier, parce que c'est devenu trop cher à Montréal, plusieurs familles se sont déplacées en banlieue. Et devinez quoi, il y a beaucoup de demande là-bas aussi! Donc pour ma part, sans nier qu'il y a peut-être une bulle, elle est présente partout.

Qu'est-ce qu'une bulle immobilière ? Selon la définition dans le billet Une bulle menace le Canada (Radio-Canada), une bulle se crée lorsque les taux d'intérêt sont bas et l'accès au crédit est facilité, ce qui entraîne une hausse de la demande immobilière. Toutefois, lorsque les taux d'intérêt repartent à la hausse et l'accès au crédit est restreint, ceci fait chuter la demande immobilière et éclater la bulle.

Les prévisions économiques vont tellement mal que le courtier Multi-Prêts est confortable d'offrir un taux de 3,89% pour 10 ans (donc les banques aussi puisqu'il fait affaire avec elles). Ce qui veut dire que les prix vont continuer à grimper dans les prochaines années. J'espère pour eux qu'ils ont mieux analysé la situation que certains experts car ils risquent de s'en mordre les doigts. Je dis ça comme ça.

Oui les banlieues débordent. Mais quand t'es rendu prêt à dépenser 225000$ pour une maison dans un secteur plus abordable comme St-Colomban ou St-Lin, on est en droit de se demander combien peut valoir une maison à Montréal. Le billet deMajor Blog indique qu'un condo de 239000$ à Montréal est trop cher ? Hum... Je suis allé voir les inscriptions sur Realtor.ca (MLS) et j'ai zoomé sur Terrebonne, la 10ème plus grande ville du Québec, située à environ 30 km au nord de Montréal. Amusons-nous un peu avec les filtres :

Nombre de maisons unifamiliales à Terrebonne (en vente en date du 10 avril 2012)

  • Moins de 200000$ : 17
  • 200000$-225000$ : 32
  • 225000-250000$ : 65
  • 250000$-300000$ : 94 
  • Plus de 300000$ :153
Donc si je souhaite acheter une maison dans cette banlieue, il y a de fortes chances que je la paye au-delà de 250000$. Est-ce sur-évalué pour une maison dans une ville dortoir ? Ce n'est pas que c'est trop cher à Montréal, c'est trop cher partout. Quand il y aura augmentation des taux, c'est la banlieue qui la ressentira la première. Mais à long terme, même si les prix chutent un peu, la tendance s'assurera de faire suivre la progression des prix vers de nouveaux sommets.


Tags: Montréal

lundi 9 avril 2012

La logique du programmeur mise à l'épreuve

Publié par Infinite Loop, à 17 h 44 17 commentaires

J'ai vu cette énigme circuler ce matin et ça m'a occupé pendant quelques minutes.

Ce problème peut être résolu en 5 à 10 minutes par des enfants d'âge préscolaire, en 1 heure par des programmeurs et ceux qui ont une meilleure éducation le font en... à vous de voir!

8809 = 6        5555 = 0        7111 = 0
8193 = 3        2172 = 0        8096 = 5
6666 = 4        1012 = 1        1111 = 0
7777 = 0        3213 = 0        9999 = 4
7662 = 2        7756 = 1        9313 = 1
6855 = 3        0000 = 4        9881 = 5
2222 = 0        5531 = 0        3333 = 0

2581 = ??? 

Soyez honnêtes et dites-moi combien de temps ça vous a pris pour trouver la solution. Pour ma part, je suis fier d'être aussi intelligent qu'un enfant qui a encore de la misère à attacher ses souliers seul.

La réponse est 2. Savez-vous pourquoi ?


Tags: Mathématique, Programmation

dimanche 8 avril 2012

L'approche Zen de la guitare

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

C'est en cherchant pour les vieux livres The Tao of Programming et  The Zen of Programming de Geoffrey James que j'ai découvert Zen Guitar de Philip Toshio Sudo. Après avoir lu plusieurs critiques élogieuses et quelques-unes corrosives, certains allant même jusqu'à qualifier d'inutile la lecture de ce livre, je me suis risqué à me procurer une copie.

Sur le plan technique, ce livre n'a pas la prétention de vous faire devenir un bon guitariste mais de vous aider à trouver l'harmonie entre vous, votre instrument et le sens que vous donnez à votre musique. Il est largement question d'adopter la bonne attitude. Et croyez-moi, des musiciens avec un trop plein d'attitude, il en pousse comme du mauvais herbe. Wanna be rock stars et ego démesurés, ce livre pourra vous faire revenir sur terre (on l'espère). Pour les autres, peut-être découvrirez-vous un équilibre qui vous permettra de jouer de la musique pour les bonnes raisons, c'est à dire en se l'appropriant comme moyen d'expression personnel plutôt que pour la recherche de la gloire. Déjà ici, vous savez que vous y trouverez votre compte ou pas selon quelles sont vos attentes.

Sachant que le zen est une méditation ou réflexion personnelle qui peut s'appliquer à n'importe quoi dans le but de découvrir la vraie nature (la preuve, Sudo a même renchérit par la suite en écrivant Zen Computer et Zen Sexe), l'auteur présente une série de petits chapitres débutants chaque fois par une citation suivie d'un exemple tiré des enseignements des arts martiaux, des valeurs japonaises, la philosophie asiatique et son expérience musicale pour couvrir de nombreux aspects qui s'appliquent à l'approche que devrait avoir un guitariste. J'étais curieux et sceptique au départ et pourtant, j'ai déjà l'intention de le relire.


Je me suis souvent fait demander par des amis pourquoi je ne voulais pas fonder un groupe ou joindre le leur. Ma réponse a toujours été que j'apprenais la guitare comme activité d'enrichissement, à mon rythme et par discipline personnelle. Comme pour ceux qui s'inscrivent à des cours d'arts martiaux, sans ressentir le besoin de chercher la bagarre. Avec Zen Guitar, l'analogie du dojo prend tout son sens.

Vous aurez beau avoir tout le talent du monde et une dextérité sans pareille, si vous n'adoptez pas la bonne attitude, quel sens pouvez-vous donner à la musique que vous jouez ? Si je fais un parallèle philosophique avec mon travail, je réalise que lors d'une entrevue d'embauche, on a toujours évalué deux facteurs critiques chez un candidat : sa compétence et son attitude. L'un de va pas sans l'autre, c'est la formule gagnante. Et c'est vrai dans tous les domaines, que ce soit lorsqu'on joue de la musique, sur le marché du travail ou dans le sexe (demandez à votre partenaire!).


Tags: Livres, Musique

Citation no. 149 sur l'alcool

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

L'alcool tue lentement. On s'en fout, on n'est pas pressés.

- Georges Courteline


Tags: Citations

samedi 7 avril 2012

Les limites du département des miracles

Publié par Infinite Loop, à 09 h 57 1 commentaire

Ces temps-ci au boulot, j'ai l'impression de passer du temps interminable à optimiser une application web victime de son succès. Conçue au départ comme un prototype, elle a rapidement trouvé son chemin vers la production avec environ 10 fois plus d'utilisateurs actifs qu'on avait prévu initialement. Et ça augmente constamment. Sans surprise, le scaling était affreux mais par chance on y a remédié dans les derniers mois, ce qui, aux dires du patron, a sauvé le projet. Il ne reste que quelques ajustements à paufiner ici et là.

En parallèle, l'ajout de fonctionnalités demandées par les clients est devenu monnaie courante car tous ont des besoins spécifiques. Le problème, c'est quand le chargé de projet dit oui à tout sous prétexte que le client a toujours raison. Pire, il les envoie en production sans même demander l'avis technique de l'équipe et les promet pour hier. Ai-je déjà dit qu'il ne faut pas laisser le chaos l'emporter ?

Si j'envoie à Google une suggestion d'amélioration par rapport à Gmail, il est fort à parier que leur équipe de développement y réfléchisse avant même de penser à implémenter en panique la fonctionnalité manquante de peur de perdre un client. Non, elle attend sagement de voir si la tendance justifie son ajout, pour le bien de la majorité. Nous ne sommes pas Google, n'avons ni ses ressources ni sa base d'utilisateurs. En affaires, chaque client compte. C'est vrai, mais ce n'est pas une raison pour travailler en cabochon. Ce n'est pas un luxe de vérifier la faisabilité et l'utilité de la demande.

La vérité, c'est que lorsque ce chargé de projet ouvre la boîte à suggestions, il a le réflexe de dire oui à tout, avant même de lire ce qui est inscrit sur le papier pour voir si ça a du sens. Tentez l'expérience et allez au concessionnaire automobile puis demandez au vendeur si vous pouvez ajouter au modèle de base l'option sous-marin, lance-missiles et invisibilité. Les changements dans la physionomie de son visage devraient suffire comme réponse.

Voilà, lui il dit oui à ces demandes farfelues. Et il insiste pour facturer le prix de base sans considérer les coûts de recherche et développement nécessaires à l'invention de ces technologies. Il a le beau rôle de pouvoir satisfaire le client mais quand il agit de la sorte, il travaille systématiquement contre les intérêts de notre entreprise et chaque fois se met à dos des membres de l'équipe. Pour lui, ça doit être fait, le client le veut, arrangez-vous pour qu'il l'ait. Ah oui j'oubliais : c'est urgent, allez, au travail.

Le hic, c'est qu'on a un historique passé qui prouve qu'on peut faire des miracles dans certaines situations pour sauver le cul d'un supérieur qui s'est mis les pieds dans les plats. En faire régulièrement, ça devient la norme donc dans la tête de certains, rien n'est impossible. Il suffit de mettre la pression nécessaire et tous les désirs se réaliseront.

C'est un pari risqué car comme le magicien devant un spectateur, on donne la perception d'une chose en sachant très bien qu'on cache une astuce que le spectateur n'a pas besoin de comprendre. Faire disparaître un objet pour vrai, scientifiquement parlant, est différent de préparer un trucage qui en donne l'illusion. En programmation, les miracles sont atteints à l'aide de tweaks, patches, tours de passe-passes qui font disparaître un problème à l'aide d'une pratique occulte dans le code sans nécessairement respecter les règles de l'art. Et il faut être bon joueur pour accepter que l'illusion n'est qu'un truc pour arriver à nos fins.

En informatique, le miracle est l'exception : on ne peut pas s'attendre à le croiser à chaque coin de rue. C'est une question de bonne fortune lorsqu'il est sur notre chemin. Comme la lampe contenant le génie d'Aladin, le nombre de souhaits donnant droit à des miracles est disponible en quantités limitées. Il y a de ces moments où le miracle est tout simplement impossible à atteindre. Impossible dans la mesure où on n'a ni temps, ni ressources pour réaliser la demande adéquatement et qu'on ne veut pas nous les accorder. Parce que pratiquement tout est faisable mais il faut être prêt à en accepter le coût.

La semaine dernière, j'ai pris la peine de le mettre en garde face à une demande qui s'avérerait catastrophique pour l'application et qui du coup, ruinerait toutes les améliorations de performance qu'on a réalisé ces derniers mois. On a atteint une limite technique, il n'y a rien de plus qu'on puisse faire à moins de passer des mois de développement à changer la technologie et à investir une somme d'argent considérable, ce qui n'est pas une option. Je croyais m'être fait comprendre mais quelques jours plus tard, il ignora mon avis et lança le tout en production. C'est moi qui a hérité du mandat. Je suis aller argumenter dans son bureau et je me suis fait répondre ce que je ne voulais pas entendre : les désirs des clients, c'est des ordres. Et moi de répondre : moi aussi je rêve de posséder une maison qui vole, ça ne veut pas dire que la technologie existe ou que j'ai les moyens de me l'offrir.


Un jour, il ne pourra plus pousser sa chance et se heurtera contre un mur. À quoi ça sert de donner un avis technique et d'énumérer les conséquences s'ils sont ignorés à la fin ? Il suffit d'accepter qu'il y a des limites, qu'on peut les repousser par défi mais qu'il y en existera toujours, que ce soit sur le plan technologique ou humain. On ne peut pas travailler 25 heures par jour. Un sprinteur ne peut courir le 100 mètres en 3 secondes. L'haltérophile ne pourra jamais soulever sur ses épaules une charge de 3 tonnes sans craquer ses os. L'informatique aussi a ses limites, elles sont seulement moins concrètes.


Tags: Lois et principes, Programmation

mardi 3 avril 2012

Design pattern Strategy expliqué par Dexter

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

Le jour, je fais de la programmation. Le soir (ces temps-ci), je me tappe un marathon de visionnement de la série Dexter en DVD. Dans mes temps libres, j'essaie de faire le pont entre les deux. Alors voyons voir comment le design pattern Strategy peut être implémenté si on est un tueur en série.

Définir une famille d'algorithmes, les encapsuler individuellement et de les rendre interchangeables. Strategy permet à l'algorithme de varier indépendamment des clients qui l'utilisent.

Le choix me semble tout à fait approprié, n'est-ce pas ?

D'abord, il doit faire les choses proprement en respectant le code de son père Harry. C'est pourquoi on définira une interface que toutes les stratégies devront suivre.

interface KillInterface{
    public function kill($person);
}
Ensuite, parce que le protagoniste a plus d'un tour dans son sac, il a paufiné plusieurs stratégies pour arriver à ses fins.
class StabThroughHeart implements KillInterface{
    public function kill($person){
        echo $person->getName() . ' has been killed by a stab through heart';
    }
}

class SliceThroat implements KillInterface{
    public function kill($person){
        echo $person->getName() . ' has been killed by a sliced throat';
    }
}

class Strangulation implements KillInterface{
    public function kill($person){
        echo $person->getName() . ' has been killed by strangulation';
    }
}
Dexter laisse un peu de place à l'improvisation lorsque vient le temps d'agir. Mais il sait qu'il devra réfléchir vite et choisir une stratégie selon le contexte.
class KillStrategy{
    private $strategy = null;

    public function __construct($type){
        switch($type){
            case 'stabThroughHeart' :
                $this->strategy = new StabThroughHeart();
                break;
            case 'sliceThroat' :
                $this->strategy = new SliceThroat();
                break;
            case 'strangulation' :
                $this->strategy = new Strangulation();
                break;
        }
    }

    public function kill($person){
        return $this->strategy->kill($person);
    }
}
J'allais oublier les victimes! Ici, on n'a pas besoin d'en savoir plus que leur nom.
class Victim{
    private $_name;

    public function __construct($name){
        $this->_name = $name;
    }

    public function getName(){
        return $this->_name;
    }
}
Enfin, le justicier passe à l'action en sélectionnant minutieusement des méchants antagonistes.
$strategy = new KillStrategy('sliceThroat');
$strategy->kill( new Victim('Ice Truck Killer') );

$strategy = new KillStrategy('stabThroughHeart');
$strategy->kill( new Victim('Lila West') );

$strategy = new KillStrategy('strangulation');
$strategy->kill( new Victim('Miguel Prado') );
C'est tout pour ce soir. J'ai encore deux saisons à regarder. Bonne soirée!

À lire aussi : design pattern Observer appliqué au hockey.


Tags: Design Pattern, PHP, Programmation

dimanche 1 avril 2012

Compilation 2012 de 20+ poisson d'avril

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

Comme chaque année, j'essaie de compiler les attrapes du April Fool's Day sur le web. Pour la cuvée 2012, voici celles que j'ai répertorié.

  • Conan O'Brien achète le site Mashable.com et remplace Pete Cashmore comme CEO
  • Google Tap : remplacer 26 touches par 2 en écrivant vos emails en morse
  • Voiture de course autonome en Nascar de Google
  • Google Maps en 8 bits (avec une excellente vidéo de présentation)
  • Google China et sa recherche sous l'eau
  • En Australie, les kangourou seront équipés de caméras pour saisir la nature pour l'intégrer à StreetView
  • Manger des barres nutritives Google Fiber
  • Le plus petit ordinateur au monde, le VAIO Q
  • Un ordinateur portable Toshiba pour votre chien
  • Google Nigeria (à partir de Chrome) : entrez votre numéro de compte de banque
  • Exécutez Chrome en mode multitâches en ayant plusieurs curseurs en même temps
  • Flickr qui transforme les photos en noir et blanc à la sauce Atkinson Dither
  • DeviantART envahi par des chats
  • Virgin Volcanic, pour aller au centre de la Terre
  • Du côté de ThinkGeek, plein de nouveaux gadgets impossibles
  • The Pirate Bay qui lance ses propres sous-marins pour héberger ses serveurs
  • Apple + Blackberry = smartphone hybride ?
  • Google Click-to-teleport
  • 100% des gens qui utilisent un téléphone à cadran ont de la difficulté à visiter votre site
  • Reddit lance sa timeline avec la technologie de voyage dans le temps
  • UltimateGuitar.com qui annonce la séparation de Metallica
  • Google Analytics : rapports interplanétaires
  • Recherche très avancée de Google
  • TechCrunch annonce que Sergey Brin prend sa retraite pour se consacrer à la guitare blues
  • Hex-Hit : des battements binauraux à votre mesure (réservé aux vrais geeks)
La liste se bonifiera au cours de la journée mais si vous en avez à suggérer, n'hésitez pas à m'écrire ou à les ajouter en commentaire.


Tags: Curiosités, Humour

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)
        • Diagramme d'accords de guitare en canvas HTML5
        • Progresser, c'est ralentir pour mieux avancer
        • Citation no. 150 sur les erreurs
        • Initiation à la cacopédie et l'anti-savoir
        • Itérateur infini en PHP
        • En veux-tu une froide ?
        • À Montréal, il vaut mieux louer un appartement que...
        • La logique du programmeur mise à l'épreuve
        • L'approche Zen de la guitare
        • Citation no. 149 sur l'alcool
        • Les limites du département des miracles
        • Design pattern Strategy expliqué par Dexter
        • Compilation 2012 de 20+ poisson d'avril
      • ►  mars 2012 (15)
      • ►  février 2012 (15)
      • ►  janvier 2012 (12)
    • ►  2011 (146)
      • ►  décembre 2011 (14)
      • ►  novembre 2011 (11)
      • ►  octobre 2011 (12)
      • ►  septembre 2011 (13)
      • ►  août 2011 (15)
      • ►  juillet 2011 (17)
      • ►  juin 2011 (18)
      • ►  mai 2011 (15)
      • ►  avril 2011 (9)
      • ►  mars 2011 (7)
      • ►  février 2011 (3)
      • ►  janvier 2011 (12)
    • ►  2010 (398)
      • ►  décembre 2010 (29)
      • ►  novembre 2010 (28)
      • ►  octobre 2010 (32)
      • ►  septembre 2010 (34)
      • ►  août 2010 (22)
      • ►  juillet 2010 (35)
      • ►  juin 2010 (42)
      • ►  mai 2010 (36)
      • ►  avril 2010 (37)
      • ►  mars 2010 (34)
      • ►  février 2010 (32)
      • ►  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