Un typique dîner d'équipe entre programmeurs. Nous sommes tous embarqués dans la même voiture pour se rendre au restaurant. Après notre repas, nous nous sommes dirigés dans le stationnement vers la voiture de notre conducteur quand un des passagers remarqua garée à proximité une bagnole en tout points semblable à la sienne : mêmes marque, modèle, couleur et année de construction. Ce sont surtout les traces de rouille qui se trouvaient exactement aux mêmes endroits qui lui ont mis la puce à l'oreille. Voulant dissiper le doute, il se diriga vers l'arrière du véhicule pour jeter un oeil à la plaque d'immatriculation. Heureusement, ce n'était pas la sienne.
Sur le chemin du retour, on déconna sur le sujet. Quelles auraient été les probabilités pour qu'une crapule peu futée vole la voiture sur notre lieu de travail et, pendant sa fuite, décide d'arrêter casser la croûte au même restaurant que nous ? Si ça avait été le cas et que par pur hasard mon collègue avait eu ses clés sur lui, il aurait pu repartir avec.
Quand j'y pense, j'aurais aimé que ça soit vrai pour voir le bandit perdre la face et se faire prendre à son propre jeu. Nous aurions bien ri.
Dans la dernière année, j'ai pris 10 lbs et j'avoue que ça me complexe un peu d'embarquer sur la Wii Balance Board pour que Wii Fit me dise que j'ai été catapulté en dehors de mon poids santé. Ce n'est qu'un jeu mais ça pèse pour vrai cette patente là!
Il me fallait donc prendre une résolution : employer mon temps à lire ou à perdre cet excès de poids pour revenir à un niveau qui ne décevra pas le petit personnage du jeu vidéo. En réalité, ce n'est pas du poids que je souhaite perdre mais du gras. Pour un intellectuel, faire de l'exercice physique au détriment de sa matière grise n'a rien de motivant. Le compromis : faire du vélo stationnaire incliné, de façon à être assis confortablement, le dos appuyé sur le dossier et les mains libres pour tenir un livre. Après essai, ça ne sautille pas et ne gêne d'aucune façon la lecture.
Sachant qu'un gramme de gras équivaut à 7,7 calories (source), le tableau de bord de l'appareil indiquait une perte approximative de 400 calories en 35 minutes pour la séance de ce matin. Cela représente 52 grammes de gras.On est loin de l'objectif des 10 livres à perdre ! La bonne nouvelle, c'est que je vais rattraper le retard dans mes lectures en faisant une pierre deux coups (j'ai initialement fait un lapsus dans cette phrase en écrivant "une bière deux coups" pour me rendre compte que ça avait aussi du sens mais que c'était aussi à l'opposé d'avoir un six-pack...).
De plus, la libération d'endorphine dans le corps déclenche une sensation de bien-être instantané et me permettra d'attaquer mon travail avec une énergie renouvellée. Je vais tenter de relever le défi de me lever 30 minutes plus tôt, 3 fois par semaine et voir quels résultats je peux atteindre. On ne se le cachera pas, à travailler à temps plein en informatique, on finit tôt ou tard par gagner du poids, à moins de brûler ses calories à force de stress, ce qui n'a rien de sain.
Je vous tiens au courant des progrès que je ferai.
Acheter des livres avec l'intention de ne pas les lire
Vous allez sans doute trouver ça curieux mais j'ai commandé aujourd'hui sur Amazon.ca des livres que je sais que je ne lirai pas. Mais pourquoi donc ? Tout à fait, c'était complètement inutile mais volontaire. La raison est que je les ai déjà lus sur ma liseuse électronique.
Je confesse, j'en ai téléchargé illégalement sur des sites comme Filestube, Wowebook, Avaxhome, Team Alexandriz ou ebooksfreedownload. Et pourtant, ce n'est pas parce que j'encourage le piratage, loin de là. Chaque fois qu'on lit un livre, on enrichit sa culture et ça a son prix. Ce n'est pas par souçi d'économiser 15$ que j'agis ainsi. Si je suis prêt à débourser ce montant pour un plat de sushi pour engraisser mon bedon, je le suis autant à engraisser mon cerveau! C'est surtout une question de mieux cibler mes intérêts et d'avoir un contrôle à qui je remettrai mon argent, par mérite. J'étais tanné de gaspiller mon argent pour m'en procurer
et qu'après quelques pages lues, je me résignais à les abandonner. Sans compter que l'aperçu des livres sur Amazon n'est pas suffisant pour se faire une bonne idée de ce qu'on est sur le point acheter.
Après tout, quelle est la différence avec la possibilité d'aller à la boutique Chapters-Indigo, choisir
un livre, s'installer confortablement dans un fauteuil mis à notre
disposition à l'intérieur du commerce et d'entâmer la lecture avant de prendre la
décision de l'acheter ? Peut-être une question de commodité. Et non, contrairement à certains que j'ai vu, je ne suis pas assez cheap pour passer la journée là-bas pour avoir le temps de le lire en totalité et m'éviter de l'acheter... Et sur le marché d'occasion, les livres qui m'intéressent sont rarement disponibles.
Pire, je pourrais l'emprunter à la bibliothèque et ne pas injecter un sous dans l'économie. Sous cet angle, quelle est la différence entre l'emprunt et le piratage en ebook ? La différence est éthique et par principe, si j'ai apprécié ce que j'ai lu, j'achète une copie du livre. C'est une forme de marque d'appréciation envers l'auteur que de lui remettre son dû, comme un pourboire. Une fois lu, c'est plutôt rare qu'on le relit à nouveau. Au mieux on s'y réfère au besoin ou on le prête. Si on dit que le livre fait voyager, la copie papier servirait ici de babiole qu'on rapporte en souvenir d'un voyage ?
Les livres que je me suis procuré sont (neufs, format paperback) :
- Physics of the Future de Michio Kaku (480 pages)
- The World is Flat de Thomas Friedman (672 pages)
Fait intéressant, Amazon m'offrait le mode de livraison Priority pour 15$ supplémentaire, ce qui me garantissait la réception pour vendredi. Heureusement, j'ai conservé l'option de livraison gratuite et UPS prévoit me livrer le colis dans la journée de demain (jeudi) !
Les livres s'accumulent chez moi mais je ne m'en plains pas. Quand je suis déménagé, j'avais 14 boîtes pleines de livres. Je me croise les doigts d'être installé pour de bon pour ne pas à avoir à les redéménager de sitôt...Comme l'a vécu récemment un ami qui en avait encore plus que moi, c'est là qu'on constate l'avantage qu'une liseuse électronique peut en transporter des milliers dans le fond d'un sac.
Cela dit, ma liseuse électronique est de loin le gadget qui m'a été le plus utile jusqu'à maintenant. S'il brisait, j'en rachèterais un immédiatement (Kindle Touch ou Kobo Touch, qui se vendent la moitié du prix que j'avais payé pour mon Sony PRS-650 il y a moins d'un an et demi).
Mise à jour
Comme prévu, j'ai reçu les livres dès le lendemain!
Depuis quelques semaines, je remets en question la pertinence d'écrire un blogue. Toutefois, je n'ai pas l'intention d'abandonner, du moins pas encore. Seulement, j'ai l'impression que je pourrais mieux disposer de mon temps si j'éliminais ce passe-temps pour me consacrer à autre chose.
Il y a 4 ans lorsque j'ai amorcé ce projet, j'avais des raisons et des motivations que je n'ai plus aujourd'hui. C'est sans doute le signe qu'il est temps de prendre une pause et de regarder les options qui s'offrent à moi. Récemment, je disais vouloir consacrer plus de temps à la guitare, à la lecture et à l'apprentissage d'un nouveau langage de programmation. Ça se reflètera toujours dans le sujet de mes futurs billets mais le rythme de publication ralentira. Quand on ressent un fort besoin de changement, ce n'est jamais une bonne idée de prendre des décisions radicales.
Je me pose aussi des questions sur mon emploi que j'occupe depuis 10 ans. Plus ma carrière professionnelle avance, plus je me spécialise dans certaines technologies. Des technologies où je suis rentable pour l'employeur qui m'embauche mais qui ne reflètent pas nécessairement les défis que je souhaiterais relever. Depuis mon entrée sur le marché du travail, plusieurs nouvelles innovations ont fait leur apparition et pour plusieurs d'entre elles, j'ai l'impression d'avoir manqué le bateau. Heureusement en informatique, les opportunités se présentent rapidement.
Depuis les années 60, les technologies, langages de programmation et systèmes informatiques se sont succédés en voyant appararaître de plus en plus de lignes de code à maintenir. On peut certainement affirmer qu'elles se sont multipliées par un facteur difficile à imaginer mais élevé. Du coup, ça pourrait laisser croire qu'il y a de l'emploi pour tout le monde mais seuls certains langages et technologies ont survécus. Et le pire cauchemar serait de s'être investi à fond dans ceux-là sans prévoir de plan B. Comme à la bourse, il vaut mieux ne pas mettre tous ses oeufs dans le
même panier et il est prudent de diversifier son portefeuille.
Tôt ou tard, malgré les succès actuels, on finit par se demander : "est-ce que
mes compétences sont sur le point de devenir désuettes au point de ne plus
paraître attirantes pour les futurs employeurs ?". C'est aussi un constat de voir que les jeunes qui sortent de l'école
avec des connaissances toutes fraîches (quoique sans expérience) et qui demandent un salaire
moindre ont un atout face aux opportunités technologiques.
En tant que développeur, on souhaite demeurer à l'affût des plus récentes innovations et il est impossible de considérer comme valeurs sûres nos choix technologiques qui nous garantiront une carrière à long terme. Qui peut prédire si PHP ou jQuery seront encore largement utilisés dans 2, 5 ou 10 ans ? On peut en douter... D'où la nécessité de se réinventer pour être constamment à jour. Au boulot, la routine ne me permet pas de sortir de ma zone de confort. En tout cas, plus autant qu'avant. Si je veux du défi, je dois m'investir sur mon temps personnel le soir et les weekends. D'où mon questionnement : écrire un blogue ou apprendre ?
En regardant ma bibliothèque ce matin, je faisais remarquer à ma copine que je n'avais jamais fait de Python ni de Flash (sans regret). Jamais ? Non jamais ! Les langages de programmation, comme pour la publicité des fromages du Québec, il en existe plus que huit ! (dans les faits, il existe plus de 300 fromages et des milliers de langages de programmation). Les choix sont infinis, le temps à notre disposition lui ne l'est pas.
Marc Andreessen (de Mosaic et Netscape) disait :
Si vous croyez que les désirs et besoins de l'homme sont infinis, alors il y a un nombre infini d'industries à être créées, un nombre infini d'entreprises à être démarrées et un nombre infini de tâches à accomplir. Le seul facteur limitatif est l'imagination humaine.
Se conditionner à apprendre, peu importe le sujet, enrichit notre bagage personnel et nous prépare sans doute à être prêt lorsque les opportunités se présenteront. Sans toutefois négliger l'équilibre entre le travail, la famille, les amis, la musique, les rénovations, la lecture, organiser des BBQ, etc. La preuve qu'il est possible d'accomplir son travail avec succès sans devoir sacrifier tout le reste.
Compter le nombre d'enregistrements de chaque table en Postgres
En SQL, une des premières choses qu'on apprend est de compter le nombre d'enregistrements présents dans une table unique à l'aide d'un simple count(*). Quand j'ai eu à transférer la totalité des enregistrements des tables d'une base de données existante vers une nouvelle, je me suis aperçu que sur la centaine de tables, quelques enregistrements avaient été perdus en chemin. Par exemple, si une table source comptait 1000 inscriptions, la table de destination n'en recevait que 999.
Pour dépister rapidement les tables qui ne balançaient pas, mon réflexe fût de bâtir une requête qui listerait toutes les tables d'un utilisateur propriétaire et pour chacune, de lancer une sous-requête qui obtiendrait le compte. Le problème, c'est qu'on ne peut pas le faire par un seul énoncé SQL. Bien que pg_tables retourne le schéma et le nom de la table, il faut contourner la limitation en écrivant une fonction utilitaire qui les concaténerait sous forme de texte pour être exécutée comme équivalent à la sous-requête qui retournerait le compte.
Sous cette forme :
SELECT schemaname, tablename, count_table_rows(schemaname, tablename) as nb_rows FROM pg_tables WHERE tableowner='code18' ORDER BY schemaname, tablename
La définition de la fonction PL/pgSQL de ma solution :
CREATE OR REPLACE FUNCTION count_table_rows (
"schema_name" name,
"table_name" name
)
RETURNS integer AS
$body$
DECLARE nb_rows INTEGER;
BEGIN
EXECUTE 'SELECT COUNT(*) FROM ' || schema_name || '.' || table_name INTO nb_rows;
RETURN nb_rows;
END;
$body$
LANGUAGE 'plpgsql'
Vous remarquerez que j'ai déclaré les paramètres en utilisant le type "name" plutôt que "text" ou "varchar". C'est qu'en testant la fonction sur deux serveurs qui faisaient tourner des versions différentes de Postgres, l'un procédait à un cast implicite à partir d'un varchar, l'autre d'un text. Pour que la fonction soit compatible dans les deux cas sans nécessiter de conversion, j'ai vérifié quels étaient les types des valeurs retournées par pg_tables et j'ai ajusté la fonction avec des paramètres de type name : SELECT column_name, data_type FROM INFORMATION_SCHEMA.COLUMNS WHERE table_name = 'pg_tables'
Dites toujours la vérité, ainsi vous n'aurez pas à vous souvenir de ce que vous aviez dit.
En Allemagne, dans la ville d'Utting (à l'ouest de Munich), si vous jetez un oeil sur Google Maps ou Google Earth et que vous zoomez sur les coordonnées 48°01'56.80"N 11°05'43.67"E, vous devriez voir un champs de maïs en forme des personnages d'Astérix, Obélix (et son petit chien Idéfix).
Il semblerait qu'un nouveau dessin soit réalisé chaque année. Parmi les oeuvres d'Ex Ornamentis, notons :
- la Terre
- l'Europe
- Albert Einstein
- l'homme de Vitruve
- un bateau de pirates
- le château de Neuschwanstein
- la carte de l'Afrique avec des yeux de panthère
- la carte des États-Unis
- Astérix et Obélix

