Commentaire conditionnel

Aujourd'hui, juste un petit tricks amusant que j'ai découvert il y a pas mal de temps maintenant mais qui trouve régulièrement son utilité pendant le développement ou le débuggage de features.

Vous savez sûrement que dans certains langages de programmation, vous pouvez commenter soit via //, soit /* ... */. Mais saviez-vous qu'il vous est également possible de mixer les deux de la façon suivante ?

/*
    ... whatever A
    return 42;
/*/
    ... whatever B
    return 69;
//*/

L'intérêt de la chose n'est pas évident au premier abord, mais regardez ce qui se passe avec un simple slash en plus :

//*
    ... whatever A
    return 42;
/*/
    ... whatever B
    return 69;
//*/

La branche de code exécutée switche.

Notez que la technique est sympathique, mais est à éviter voire proscrire dans du code de production : avoir deux implémentations différentes d'un bout de code, c'est généralement chercher les ennuis : )

Adieu Backbone, bonjour Angular

Quand vous faites du développement Javascript depuis un certain temps, vous finissez forcément par vous apercevoir que le langage n'est pas forcément simple à utiliser proprement. Rappellez-vous : au début, document.write() était considéré comme le net plus ultra de la génération dynamique de code. Ca date.

Au fur et à mesure de la prise de conscience générale que le JS, c'est quand même vachement cool, un besoin s'est de plus en plus fait sentir : celui d'établir des process clairs en ce qui concerne le développement d'applications enrichies. Des initiatives ont été prises petit à petit, mais se sont pendant longtemps bornées au rôle de bibliothèque : Prototype, Scriptaculous, jQuery, Dojo, ... sont autant de bibliothèques relativement vieilles ayant facilité l'écriture de tâches spécialisées.

Cependant, c'est très récemment que le concept d'application enrichie s'est véritablement démocratisé. Cela a plus ou moins coincidé avec la création de la bibliothèque Backbone. Cette dernière fournissait non pas des fonctionnalités, mais plutôt des process de développement. Elle définissait ce qu'était un modèle, une collection et une vue, permettant aux développeurs sur des bases relativement solides. C'était une première, très peu de bibliothèques allaient dans ce sens à cette époque (on peut citer par exemple Ext.js, mais cette dernière était très spécialisée et n'était pas adaptée aux sites classiques).

Durant les derniers mois (les dernières années, en fait), j'ai pratiqué beaucoup de Backbone. D'abord par effet de mode, puis parce que j'aimais bien ce côté structuré de la bibliothèque : j'aime beaucoup tout ce qui se rapproche à de la conception. Cependant, j'ai toujours trouvé qu'il y avait plusieurs problèmes inhérents à la bibliothèque : la gestion de template était très erratique, le binding (et surtout unbinding) d'évènements était limité, et il n'y avait pas vraiment de consensus sur la façon de faire du bon backbone. En conséquence, il était souvent possible de faire du bon travail avec la bibliothèque, mais également souvent au prix d'efforts de réflexion dès lors que l'on voulait faire quelque chose de propre.

Il y a environ trois mois, j'ai entrepris la création d'un projet personnel dont je parlerais peut-être un jour. Conscient des limites de Backbone que j'ai évoqué ci-dessus, j'ai voulu me tourner vers une des autres bibliothèques qui ont vu le jour à la suite de Backbone. M'étant précédemment essayé à Ember.js, je suis tout d'abord retourné dessus. Autant dire que je n'y suis pas resté longtemps. Un framework qui me parle de machine à état lorsque l'on touche à du routing rate clairement quelque chose dans mon esprit. Bref, je n'ai pas du tout aimé Ember, et m'en suis donc rapidement détourné.

Mon second essai a été avec Angular. Et là, je dois le reconnaitre, je suis assez épaté.

Pour ceux qui ne la connaisse pas, Angular est une bibliothèque créée par les équipes de Google et censée apporter leur réponses à la question : "comment faire une application enrichie en utilisant les deux technologies natives : HTML et Javascript ?". Cette bibliothèque est particulière à plusieurs niveaux :

  • Elle s'intègre directement au sein du document lui-même. Vous n'avez (à ma connaissance) pas de template en Angular. Et s'il en existe, je pense que les use case sont particulièrement bien cachés
  • Elle étend l'HTML en rajoutant des balises logiques telles que if ou forEach
  • Elle gère en interne toute la magie de la mise à jour des éléments au fur et à mesure de la modification des collections
  • Chaque composant peut posséder son propre controlleur, en réalité une simple fonction Javascript

Ce billet ne rentrera pas en détail dans son fonctionnement, pour cela vous devrez le découvrir par vous-même (ou me recruter :). Cependant, sachez que j'ai été véritablement impressionné par la simplicité du fonctionnement d'Angular. La courbe d'apprentissage est très rapide (une seule notion nécessaire : le scope), l'écriture tout aussi rapide (quelques balises nécessaires pour les forEach, quelques lignes pour remplir un tableau JS, Angular se charge du reste), et l'ensemble est partiulièrement scalable. Si vous supprimez un élement d'une collection, vous supprimerez aussi les handlers qui y sont attaché, ne changeant ainsi rien à la fluidité de l'application.

En bref, utilisez Angular. Ne serait-ce que dans un projet personnel. Faites une todo, puis comparez avec le code Backbone qu'il vous aurait fallu. Vous constaterez une nette différence dans la clareté du code, ce qui le rendra plus facilement modifiable lorsque vous voudrez plus tard l'adapter à de nouveaux besoins.

Mon dernier travail en freelance concerne du Backbone. Je ne peux m'empêcher de remarquer qu'utiliser Angular aurait permis de résoudre un très grand nombre de problématiques en un claquement de doigts, et d'éviter un énorme travail 'inutile' pour 'chauffer' l'environnement avant de commencer le code de l'application proprement dit.

Back to business

Me voilà de retour au Canada ! Et en attendant mon premier cours du second semestre (à 20h30 ... je sens déjà que je vais aimer ce créneau), voici un nouveau blog post sur mes chroniques montréalaises. Remarquez que nous sommes sur mon nouveau blog, et donc que je transfèrerais les anciens posts ici dès que j'aurais un peu de temps pour également gérer un véritable classement par tag, et un affichage sur plusieures pages.

Dooooonc. Du temps s'est écoulé depuis le précédent blogpost ! Voici donc quelques nouvelles. Pour rappel, ma compagne a passé près de trois semaines avec moi, donc toute la durée couverte par ce post, ou presque.

Premières neiges

Il a enfin commencé à neiger. Au début c'était des petits flocons qui fondaient en une nuit, mais maintenant on a enfin quelque chose qui tiens et qui fait plusieurs centimètres d'épaisseur. C'est assez rigolo ! A noter que malgré tout, on sentirais presque moins le froid ici qu'à Paris.

Bref, c'est l'occasion de s'amuser :D

Visite de la ville

Mon agent touristique m'ayant presque tiré par le bras pour que nous visitions Montréal, on est sorti quelques soirs de suite pour voir ce que la ville avait dans le ventre. Il faisait pas mal froid, d'ailleurs, mais bon. On a ainsi eu l'occasion de voir des bâtiments assez jolis, tel que l'île de l'horloge, nommée d'après son Little-Ben.

Mais comme manger c'est important, on en a également profité pour avoir un véritable brunch canadien. C'était assez complet ! On avait des fêves au lard avec du sirop d'érable (sucré mais j'ai bien aimé, Camille moins), des pommes de terres grillées, des oeufs brouillés, de la confiture ... Bref, on a bien mangé à cette occasion :3

Films

Evidemment, une visite n'est rien sans un moment de répit, et donc on est allé à deux reprises au cinéma, pour voir les Mondes de Ralph et The Hobbit. J'ai aimé les deux films ! Contrairement à ce que j'aurais cru, les VF québecoises n'ont quasiment pas d'accent, ce qui est plutôt cool. Pour tout vous dire, ce n'est qu'à la dernière minute que j'ai remarqué un léger accent dans les Mondes de Ralph.

En revanche, le Québec produit ses films tout comme la France et, heu ... c'est très canadien, m'voyez. Vous pouvez par exemple regarder le trailer de Pee-Wee 3D, ça envoie du lourd, du très très lourd (merci Michel). J'irais presque le voir pour savoir ce que ça donne pendant une heure :D

Pour finir, je saluerais la rapidité d'esprit de Camille, qui a sû demander du maïs éclaté du tac-au-tac au lieu de pop-corns. Par contre on a calé deux secondes quand on nous a proposé des breuvages. :D

Mont Royal

Etant donné que la ville tire de lui son nom (Montréal ... Mont Royal ... m'voyez ?), c'était un peu un passage obligé du séjour, et nous avons donc consacré quelques heures à aller y faire un tour (et à aller faire les soldes dans un H&M du coin parce qu'on ne refait pas les demoiselles).

Premier constat ? C'est blanc.

En fait, on ne voit pas sur la photo, mais on a une vue plongeante sur tout Montréal de cette hauteur. Simplement, vu qu'on est en hiver, il y a une sorte de brume blanche qui bouffe tout le décor, et du coup on n'y voit que dalle. Sinon c'est assez joli, avec ces arbres qui portent plusieurs centimètres de neige sur leurs branches.

Toronto

Dans le cadre d'un voyage dont je vais parler dans la prochaine section (et que je ne nomme pas ici pour ne pas spoiler), nous sommes allé faire un tour à Toronto, qui se trouve à environ sept heures de bus de Montréal. Pour information, nous avons pris les bus Mégabus (unrelated to Kim Dotcom, YOU DON'T SAY). Ces derniers sont censés disposer du wifi, mais en réalité que dalle. Ceci dit, les halls d'attente ont effectivement le wifi, eux, et ça c'est plutôt pas mal.

BREF, nous avons passé quelques heures à visiter la ville, qui est assez différente de Montréal. Autant cette dernière est calme et très portée sur les maisons, autant Toronto est active et centrée sur des buildings. Partout où nous avons tourné les yeux nous avons vu de nouveaux buildings !

Nous n'avons malheureusement pas pu monter dans le principal, celui qui fait la fierté de Toronto et ancienne plus grande tour du monde (aujourd'hui troisième) : la tour CN. Elle était en rénovation, semble-t-il, et donc fermée au public.

En lot de consolation, nous avons tout de même trouvé un magasin "Everything for a dollar", où j'ai pû me trouver à bas prix des cartes pokémon (mauvaise, mais des cartes quand même :3), et des deck box. Parait que j'avais les yeux brillants, mais no pic no proof (merci Camille ne m'avoir transmis une proofpic après la publication de l'article. Quand à vous, vous pouvez rêver pour que je la publie è_é.).

Ceci fait, nous nous sommes dirigé vers ...

Les Chutes du Niagara

Etant donné que oui, même si on est des étudiants, on peut faire les choses en grand quand on fait un peu d'efforts, nous avons réservé une suite dans un hôtel bien sympa avec un joli nom (le Radisson Fallsview), avec vue sur les chutes et jacuzzi dans la chambre. Donc déjà c'était super classe, et en plus c'était beau et romantique, le super plan :D

Le soir, on est allé dans le restaurant Milestones de l'hôtel Marriott et pris ce qui est probablement le plus awesome dessert du monde : The Cookie.

Cookie mis à part, les chutes sont très belles autant de jour que de nuit. En fait, cela vaut vraiment le coup de faire deux visites : une la nuit pour voir toutes les illuminations, très bien faites, et une le jour pour contempler les chutes dans toute leur immensité. Notez qu'il y a parfois des spectacles qui sont organisés, mais nous n'avons pour notre part pas pu y assister par manque de temps.

Oh, et petit détail : le côté canadien des chutes (par opposition au côté américain) a une super vue, étant donné que nous sommes juste en face d'elles. Donc si vous passez au Canada avec votre compagne, profitez-en pour faire le voyage :)

Douce France, cher pays de mon enfance

A l'occasion des fêtes, j'ai pris un billet pour aller réveillonner dans mon pays d'origine :)

Pas grand-chose à dire à ce sujet, sinon que je ne regrette pas : ça fait du bien de faire un break et de revenir dans un environnement familier (même si je commence à me faire au Québec).

Etudes

Et là c'est la grosse surprise, j'ai tout validé comme un badass \o/

Avec des grades plus ou moins bons, mais toutes mes matières du premier semestre sont bel et bien validées. Cela va me permettre de passer un second semestre plus tranquille, en sachant que je n'aurais que deux crédits à valider ... en comptant les épices que je devrais aussi recevoir ainsi que peut-être ceux du part-time, cela devrait se faire sans soucis.

Le tort du marteau

Dans le cadre d'un projet que j'ai démarré, et dont je parlerais peut-être plus tard, je dois effectuer de l'ETL : Extract / Transform / Load, afin de transformer une shitload de données XML en un montant bien plus raisonnable de données CSV.

Le fichier XML faisant 13Go, j'ai exclu d'emblée DOM pour partir sur un parseur Sax, beaucoup plus efficace sur les gros sets de données de ce genre (pour information, Sax consiste à parser le flux XML tel qu'il arrive, tandis que DOM reconstruit l'arbre en mémoire).

Je suis parti sur du Node, d'abord parce que j'aime bien le Javascript, ensuite parce que j'ai l'habitude de bosser avec, et enfin parce qu'un langage de script me permettait d'abstraire beaucoup de problématiques.

Finalement, après avoir réfléchi un peu comment lire correctement du Sax avec une machine a état et tout le bordel, j'ai désespéré, et me suis tourné vers une solution dont on m'avait précédemment parlé : Kettle. Je n'aborderais pas le sujet en détail, mais considérez qu'il s'agit d'un software spécialement conçu pour effectuer des ETL. Malheureusement, il a les deux défauts d'être à la fois GUI et Java-based, donc je l'ai finalement laissé tomber pour retourner sur mon Node.

Plutôt que de partir sur une machine a état comme je le pensais originellement, j'ai réfléchi un peu à la raison pour laquelle j'utilisais Sax : j'avais beaucoup de données. Beaucoup de lignes dans ma table. Et là, ça a été l'évidence : mon arbre XML n'était pas gros en largeur, uniquement en hauteur.

Et je suis donc parti sur l'idée d'utiliser Sax pour construire un arbre XML en mémoire (en utilisant de simples objets Javascript très basiques) puis, une fois qu'un certain 'path' était construit, le transformer en sous-document XML DOM, et utiliser une poignées d'expressions XPath dessus afin de récupérer les informations qui m'intéressaient.

Cette approche a donc été implémentée (en utilisant les deux plugins node sax et jsdom), mais j'ai été confronté à un problème que je n'avais pas anticipé à ce point : la vitesse d'exécution était atroce.

Pour donner un ordre d'idée, j'ai laissé tourner le script de conversion depuis hier soir 19h. Cela fait maintenant 24h, nous en sommes à la 727500eme ligne. Le document en possède plus detrois millions, et j'ai un autre document beaucoup, beaucoup plus gros à traiter derrière.

Autant dire que si je voulais avoir fini avant la fin du monde mois, il allait falloir trouver mieux. J'ai donc essayé quelques optimisations, telles que supprimer la récursion de la fonction vérifiant si l'on avait rencontré un noeud XML 'intéressant', réutiliser le même objet XML à chaque noeud, etc, mais rien n'y faisait, le script restait toujours désespérement lent.

Et puis vint l'idée que j'aurais dû avoir avant : commenter les expressions XPath. Et là, le changement fût vraiment significatif, passant de 5s pour 1000 lignes à moins d'une seconde.

Bien évidemment, j'avais vraiment besoin de ces expressions, pour éviter de devoir écrire beaucoup de code et risquer de tout voir s'effondrer à une possible mise à jour du format d'entrée (toujours être générique ;). Cependant, je n'avais pas vraiment besoin du moteur XPath en lui-même ... il était conçu pour supporter énormément de features, et je n'en utilisait presque aucune. Bref, long story short (ce post commence à s'éterniser, pardon :), j'ai supprimé la conversion Object -> DOM, et ait rajouté une fonction au prototype de mes objets permettant de trouver un sous-noeud. Une autre fonction pour trouver leur contenu textuel, et j'étais paré. Le résultat final est beaucoup plus acceptable : 21 minutes pour traiter les trois millions de lignes ! J'aime node.

En ce qui concerne le titre de ce post, ne cherchez pas, c'est simplement un jeu de mot avec le marteau de Thor. Oui. Pardon.

[note] Pour référence, le fichier de 32 millions de lignes s'est processé en 308 minutes. Je ne sais pas si c'est très respectable, mais étant donné qu'il tourne dans une VM, et que je peux tout de même lancer plusieurs dumps par jour si nécessaire, je suis plutôt satisfait.

Cutes Like A Couple

Ma chérie vient d'arriver ! Elle puisqu'elle a décidé de jouer les photographes reporteuse, en super chérie qu'elle est, j'ai le loisir de publier quelques photos prises pour l'instant avec son appareil photo (et donc de bien meilleure qualité que celles de l'iPad).

On va commencer par une photo prise à quelques pas de la station de métro ! C'est une oeuvre d'art-citation assez mignonne. Je ne pense pas qu'elle soit là par hasard, il y a vraiment beaucoup de magasins liés au sexe (et au moins à moitié visant la communauté gay) dans le coin. C'est amusant, parce que c'est une artère commerciale de la ville !

Bref, photo également de la pause goûter bien méritée, pour une sympathique soirée cocooning en amoureux. On a décidé de prendre un truc typique du québec ... mais si, on vous jure !

Bon, effectivement, comme ça on ne dirait pas que c’est très-très local. Mais on a d’autres exemples plus du terroir, comme ce gateau à la carotte. Ca avait un goût de frangipanne, c’était trop rigolo :D Et vraiment pas mauvais.

Et après ce gateau ... c’était l’heure de ... Distant Worlds \o/

Pour les éventuels incultes (mais je vous aime bien tout de même :3), il s'agit d'un concert en tournée chaque année dans le monde, et jouant avec un véritable orchestre les musiques ayant été utilisées dans les bandes originales des jeux Final Fantasy. C'est vraiment un évènement formidable. On y avait été l'an passé avec Camille quand ils étaient passés à Londres, au Royal Albert Hall, et c'était époustouflant. Là, la salle était un peu moins awesome (c'était un bâtiment très neuf, un peu dans le genre de nos cinéma à nous, mais beaucoup plus stylé, avec de véritables salles de théatres), mais le spectacle en lui-même était très, très bien : )

Pour référence (et parce l'oiseau nous a paru chelou et nous a fait penser à Twitter quand on est passé devant), nous sommes allé à la Place des Arts qui, comme c'est la coutûme dans le coin, possède son propre métro souterrain. C'est vraiment marrant ça !

Pour conclure ce billet sur une autre image-texte (ou pas ?), celle qui suit m’a fait tout de suite penser à l’expression #YOLO, c’était fun (on s’amuse d’un rien, je sais. Mais moi ça ne me dérange pas o/).

Don à Wikipedia

Je suis allé sur Wikipedia pour avoir plus de renseignements sur le One-Time Pad, et je suis tombé sur leur bannière d'appel aux dons.

J'ai toujours profondément respecté et admiré le projet Wikipedia. L'ensemble de la communauté a accompli une tâche colossale en quelques années : rendre obsolète les encyclopédies papiers, dans presque tout les domaines possibles, en offrant des informations généralement claires et souvent exactes.

Et pourtant, quand on y réfléchi, Wikipedia a fait beaucoup plus que cela. Supposons que vous souhaitiez avoir des informations exhaustives sur les droïdes restés loyaux à l'Empire durant la guerre des clones, vers où vous seriez vous tourné il y a dix ans ? Probablement un forum en ligne, et quinze personnes vous auraient soumis des réponses sans que vous ne puissiez vraiment être certain de leur véracité. Maintenant, il vous suffit d'aller sur l'article Clone Trooper de Wookieepedia, et vous trouverez vos réponses. Pareil pour le Seigneur des Anneaux (One Wiki to Rule Them All) ou un nombre colossal d'autres univers parallèles (cf la page d'index de wikia).

Wikipedia a initié un mouvement, celui du partage ordonné de la connaissance. Alors franchement, 10$ par an pour permettre à la fondation de continuer son travail, ça vaut bien le coup, non ?

Dear Maël,

Thank you for donating to the Wikimedia Foundation. You are wonderful!

It's easy to ignore our fundraising banners, and I'm really glad you didn't. This is how Wikipedia pays its bills --- people like you giving us money, so we can keep the site freely available for everyone around the world.

People tell me they donate to Wikipedia because they find it useful, and they trust it because even though it's not perfect, they know it's written for them. Wikipedia isn’t meant to advance somebody's PR agenda or push a particular ideology, or to persuade you to believe something that's not true. We aim to tell the truth, and we can do that because of you. The fact that you fund the site keeps us independent and able to deliver what you need and want from Wikipedia. Exactly as it should be.

You should know: your donation isn’t just covering your own costs. The average donor is paying for his or her own use of Wikipedia, plus the costs of hundreds of other people. Your donation keeps Wikipedia available for an ambitious kid in Bangalore who’s teaching herself computer programming. A middle-aged homemaker in Vienna who’s just been diagnosed with Parkinson’s disease. A novelist researching 1850s Britain. A 10-year-old in San Salvador who’s just discovered Carl Sagan.

On behalf of those people, and the half-billion other readers of Wikipedia and its sister sites and projects, I thank you for joining us in our effort to make the sum of all human knowledge available for everyone. Your donation makes the world a better place. Thank you.

Most people don't know Wikipedia's run by a non-profit. Please consider sharing this e-mail with a few of your friends to encourage them to donate too. And if you're interested, you should try adding some new information to Wikipedia. If you see a typo or other small mistake, please fix it, and if you find something missing, please add it. There are resources here that can help you get started. Don't worry about making a mistake: that's normal when people first start editing and if it happens, other Wikipedians will be happy to fix it for you.

I appreciate your trust in us, and I promise you we'll use your money well.

Thanks, Sue