Je travaille dans un petit studio de développement où tous les programmeurs sont regroupés ensemble dans la même pièce et où les postes de travail sont seulement séparés par des murets. Donc on entend tout le monde taper au clavier, ce qui donne parfois une bonne idée de l'occupation de chacun et de la nature du travail effectué.
Mais les programmeurs n'écrivent pas toujours du code. De temps à autre, ils reçoivent un fichier de données de la part du client dans le but de l'importer dans un système. Et plus souvent qu'autrement, le fichier est mal formaté et on doit le préparer pour lui donner une forme standard.
Par exemple, prenons l'échantillon suivant qui comprend un champ par ligne :
##champ1##
##champ2##
##champ3##
...
##champ50##
Si je souhaite en faire une entrée CSV, je connais plusieurs programmeurs qui positionneront le curseur à la fin de la première ligne et qui s'acharneront sur la suite de touches DEL, ",", ESPACE, END pour obtenir comme résultat quelque chose qui ressemble à ceci (sur une même ligne) :
##champ1##, ##champ2##, ##champ3##, ..., ##champ50##
On s'en rend compte si on porte attention au son car ça produit un beau vacarme rythmé qui s'étire selon le nombre d'enregistrements que comprend le fichier. Et une fois de temps en temps, on peut noter un arrêt (pour corriger une erreur dans la séquence) et le pattern reprend de plus belle.
Pourtant, si on se fie à la loi universelle disant qu'un programmeur se doit d'être paresseux et d'automatiser les tâches les plus ennuyantes, il devrait normalement avoir recours aux expressions régulières (regexp).
D'abord, vous devez vous assurer que votre éditeur supporte les remplacements par regex (Dreamweaver, Netbeans, NotePad++ et Eclipse, pour ne nommer que ceux-là, en ont un). Sinon, il est toujours temps de changer.
Dans NetBeans, ouvrez le fichier de données. Ensuite faites CTRL+H et cochez Regular Expressions.
Find what : (##.*##)\n
Replace with : $1,
Cliquez sur le bouton Replace All. Il suffira ensuite de retirer manuellement la dernière virgule de la liste. C'est simple, efficace, silencieux et ça m'évite de monter le son de ma musique dans mon casque d'écoute lorsque j'en entends un qui s'énerve avec son clavier. Ça m'a fait du bien d'en parler, bonne soirée :-)
P.s. c'est probablement la première neige de la saison qui tombe sur Montréal qui joue sur mon humeur...
J'ai été chanceux de mettre la main sur la deuxième édition de In Search of Stupidity: Over Twenty Years of High Tech Marketing Disasters (sur Amazon Marketplace pour environ 4$).
J'appréhendais que ça allait être bon et finalement, c'était au-delà de mes attentes même si au final c'était très différent de ce que j'avais imaginé.
Merrill Rick Chapman a écrit le livre en partie en réponse à In Search of Excellence (un bestseller des années 80 qui fût aussi le livre qui se retrouvait dans le plus grand nombre de bibliothèques de 1989 à 2006) qui fût critiqué par la suite pour différentes raisons.
In Search of Stupidity renferme des pages d'histoire richement détaillées et bon nombre d'anecdotes intéressantes (tirées aussi du parcours professionnel de Chapman). Par exemple, en note de bas de page, l'auteur raconte qu'il a rencontré Isaac Asimov alors qu'il travaillait pour Macy's à New York. Asimov se serait pointé en magasin pour tester un nouveau produit et aurait tenté d'écrire du BASIC sur un Apple II. Il a causé une boucle infinie qu'il ne savait plus comment arrêter.
Un élément central qui m'a marqué est comment Microsoft s'est positionné, au fil du temps, comme leader de l'industrie. Oui, personne ne semble apprécier le géant de Redmond, mais je dois admettre qu'ils ont été très intelligents dans leurs décisions (même s'ils ont eu une part de chance en étant au bon endroit au bon moment) et que c'est surtout en évitant de commettre des erreurs aussi fatales que ses concurrents qu'ils ont atteint le sommet.
Microsoft avait l'engouement du public et de l'industrie pour les décénnies 80-90, ce dont Google semble s'être approprié depuis les 10 dernières années. Et pourtant, quelle que soit votre allégeance envers Microsoft, Apple ou Google, ils sont tous loin d'être blanc comme neige, seulement que ça a été moins publicisé par les médias pour certains (on frappe sur le plus gros, celui qui dicte les règles de l'industrie). À l'époque, Apple avait la fâcheuse tendance à intenter des poursuites judiciaires à quiconque plaçait une icône de corbeille sur son bureau. Et Google ne respecte pas toujours sa philosophie "do no evil", entre autre en Chine. Mais bon...
Le livre contient beaucoup de sujets à faire jaser dont la débandade d'IBM et l'OS/2, les excentricités de Philippe Kahn de Borland, la guerre des microprocesseurs gagnée par Intel et son imposant programme de marketing Intel Inside, le déclin de Novell, la saga des logiciels de traitement de texte (WordStar, WordStar 2000, WordMaster, NewWord, WordPerfect, Word), un portrait peu reluisant de Ed Esber de Ashton-Tate (probablement la personne la plus détestée à l'époque).
Mais aussi des sujets plus récents comme Netscape qui a entreprit de réécrire tout le code de son fureteur (en Java je crois) pour sa version suivante et qui a perdu le marché au mains de Microsoft Internet Explorer en étant incapable de suivre le rythme de développement. On connaît la suite. Netscape a légué le tout à la fondation Mozilla (qui est en train de reprendre tranquillement le dessus sur IE avec un certain Firefox). On y parle aussi de la bulle spéculative du dot-com qui a éclaté en mars 2000.
Un autre excellent chapitre est celui intitulé "The Strange Case of Dr.Open and Mr.Proprietary", qui présente l'idéologie du code source libre, Richard Stallman, Linux, GNU, la GPL et qui s'étend jusqu'au problème de la commercialisation de la musique depuis l'arrivée d'Internet, les lecteurs mp3 et les P2P, et l'industrie du disque qui a perdu le contrôle (un problème que j'ai exploré pendant plusieurs années).
À classer dans la catégorie des incontournables pour quiconque travaille dans le milieu informatique. Mais sachez que même si vous le lisez, ça ne vous évitera pas de faire des erreurs vous aussi. Cela dit, si vous avez des histoires d'horreur à raconter, envoyez-les moi! Le fait est qu'apprendre le passé évite parfois de refaire les mêmes erreurs dans le futur.
Vous ne pouvez pas faire confiance en du code que vous n'avez pas totalement créé vous-même.
Je vais partager avec vous un petit truc qui m'a été utile aujourd'hui car j'ai passé une partie de la journée à faire du débogage à distance et comme je n'avais pas accès à psql, j'ai dû me débrouiller avec ce que j'avais sous la main.
Le client avait un problème de droits d'accès sur certains objects de sa base de données PostgreSQL. J'ai suspecté qu'il avait dû créer des nouveaux objets avec le user postgres plutôt qu'avec l'utilisateur de son projet (l'utilisateur connecté qui crée les objets possède automatiquement les droits sur ceux-ci, donc pas besoin d'attribuer des droits manuellement).
L'objectif : comment savoir quels objets sont problématiques à l'aide d'une requête SQL qui interroge les tables systèmes ?
Pour savoir qui est le propriétaire d'une table en particulier :
SELECT tableownerPour voir la liste des tables et le propriétaire de chacune :
FROM pg_catalog.pg_tables
WHERE tablename = 'nom_de_la_table'
SELECT tablename, tableownerPour modifier le propriétaire d'une table :
FROM pg_catalog.pg_tables
ORDER BY tablename
ALTER TABLE tablename OWNER TO usernameConnecté en tant que l'utilisateur postgres, on peut obtenir la liste des bases de données et leurs propriétaires respectifs :
SELECT datname, rolnameOn peut changer le propriétaire de la base de données :
FROM pg_database as d
INNER JOIN pg_authid as a ON d.datdba = a.oid
ORDER BY datname
ALTER DATABASE dbname OWNER TO usernameCependant, il faut savoir que les objects conservent le propriétaire original. Si on veut changer tous les objets de propriétaire, il faudra les changer un par un. Mieux vaut faire un script qui boucle sur l'ensemble des objets.
Saviez-vous que l'éditeur NetBeans possède un client FTP intégré ? Du moins, une version de base et qui est bien cachée.
Pour configurer le FTP :
- Sur le répertoire du projet, cliquez avec le bouton droit de la souris
- Choisissez Properties
- Catégorie : Run Configuration
- Run As : Remote Web Site (FTP)
- Plus bas dans le même écran : FTP Connection / Manage
- Entrez un nom pour la connexion (Connection Name)
- Entrez le hostname, username et password
- Vous pouvez maintenant tester l'accès en cliquant sur le bouton "Test".
- Faites OK pour enregistrer la configuration
- Sélectionnez le ou les fichiers modifiés
- Cliquez avec le bouton droit de la souris pour ouvrir le menu contextuel
- Choisissez Upload
En entrée de matière, vous devez absolument lire l'article paru le 23 novembre 2009 sur Cyberpresse / La Presse pour connaître l'histoire de Nathalie Blanchard. Cette employée d'IBM souffrait d'une grave dépression et sa compagnie d'assurance, Manuvie, a utilisé des moyens divers pour s'introduire dans son profil privé de Facebook où elle a récupéré des photos où Mme Blanchard s'amusait un peu trop à leur goût. Résultat : Manuvie lui coupe ses prestations de maladie de longue durée.
Comment est-ce possible puisque son profil était limité ? Mais où donc s'en va la vie privée ? Juste pour vous donner un aperçu à quel point ça devient inquiétant, j'ai trouvé un service nommé Spokeo dans lequel on peut entrer une adresse courriel et l'engin de recherche scrute à la loupe l'information que vous avez entré à propos de vous sur différents services qui utilisent cette même adresse. Les résultats proviennent des blogues, Flickr, Picasa, des sites de réseautage social comme Facebook, Last.fm, Windows Live, Amazon, LinkedIn, etc.
Vous pouvez le tester avec votre adresse personnelle, vous aurez un aperçu de ce qu'ils ont trouvé sur vous (ou libre à vous d'espionner quelqu'un). Pour l'information complète, le service est payant. Sans compter qu'à ma connaissance, ils n'offrent pas de support pour vous aider à effacer vos traces les plus embêtantes.
Méfiez-vous des services que vous utilisez pour préserver votre vie privée. J'ai surtout l'impression que tout ça n'ira pas en s'améliorant...
Je ne me souviens pas comment j'ai découvert ce blogue mais je dois dire que j'ai eu beaucoup de plaisir à regarder les livres les plus horribles avec leurs jaquettes trop souvent explicites.
En scrutant sur la thématique technologique, vous trouverez sur Awful Library Books des titres comme :
The Complete Y2K Home Preparation Guide
1999 - 432 pages - Prentice Hall
Remarquez, ce livre a été écrit par un "New York Times Best Seller Author". C'est supposé être crédible. Ou bien les gens sont trop crédules.
Disponible en copie de seconde main sur Amazon à partir de 0.39$. À surveiller : la sortie imminente de son prochain succès sur l'apocalypse de 2012. En liquidation dès 2013.
How to Make Money With a Home Computer
1986 - 92 pages - Bond Enterprises
Celui-là explique comment faire de l'argent avec un ordinateur personnel.
En 1986, il n'y avait ni P2P ni de sites d'enchères comme eBay alors vous deviez vous rabattre sur la comptabilité, le traitement de texte, et surtout les autres choses.
Toute une génération d'initiés qui a fâché son avenir en finissant par créer des fichiers Powerpoint à envoyer à leur amis.
Getting Ready for a career in computers
1996 - 48 pages - Coughlan Publishing
Tout ce que vous devez savoir, en 48 pages illustrées. Une bible de C++ compte au moins 1000 pages. Ce qui fait que si votre carrière bat de l'aile, vous pouvez toujours écrire des livres sur l'an 2000.
La preuve où il y a des fois que ça vaut la peine de trainer dans les librairies et les ventes de garage (désignation québécoise pour bazar).
Comme j'ai annoncé récemment, je me suis acheté une nouvelle guitare, après avoir mis de côté la pratique pendant des années. C'est d'usage commun d'apprendre à lire les partitions en utilisant des tablatures, un système de notation qui indique à quel endroit placer ses doigts (frette et corde). Et comme je n'ai jamais pris de cours, j'ai tout appris en tant qu'autodidacte. Et je dois dire que je m'en sors pas trop mal.
Mais avec le temps, ma curiosité m'a poussé à vouloir me mettre à niveau pour comprendre la notation musicale standard à partir d'une portée. Pour m'aider à mémoriser les notes, j'avais trouvé NoteCard 2.01, une petite application gratuite de moins de 500 Kb qui permettait de faire des exercices de reconnaissance des notes (notation internationale, sur piano ou sur le manche d'une guitare) sous forme de "flash cards". C'était assez rudimentaire mais c'est comme ça que j'ai débuté la transition et ça marche très bien.
Quand j'ai voulu installer la version la plus récente (NoteCard 3.1), j'ai vu que le petit outil avait évolué pour devenir plus complet. L'interface a été revue avec des améliorations majeures, plus conviviale, l'ajout d'un profil utilisateur pour compiler nos pointages et statistiques, le choix d'instrument (notation internationale de A à G, notation par notes de Do à Si, Piano 1 ou 4 octaves, manche de guitare de 7 ou 12 frettes, clavier PC), connectivité MIDI, etc.
Avec l'apparition de nouvelles fonctionnalités, il faut s'attendre à y mettre un prix. Il existe toujours une version gratuite de NoteCard 3 mais les fonctions avancées se retrouvent pour la plupart dans la version payante. Heureusement, la license ne coûte qu'environ 20$ US. Mais le défaut principal, et là je pense aux enfants qui veulent apprendre, est que l'interface est disponique uniquement en anglais. À partir de quel âge les enfants commencent à apprendre l'anglais à l'école au Québec ? Comme l'utilisation de ce mini-jeu est principalement visuel, ça ne devrait pas être un si gros frein. Donnez-lui un essai (au moins la version gratuite), vous verrez.
Les ordinateurs sont inutiles. Ils ne savent que donner des réponses.
Dans les derniers jours, je ne m'étais pas donné la peine de mettre à jour Ubuntu à 9.10 sur mon netbook (duquel j'écris présentement) car je pensais faire un éventuel essai de Chrome OS. Mais finalement, ce ne sera pas pour tout de suite (d'autant plus qu'après lecture des fonctionnalités et le visionnement des vidéos, je risque de le tester par une machine virtuelle).
De plus, j'ai remarqué dans les statistiques d'accès de mon blogue que plusieurs personnes y arrivaient en recherchant des mots clés pour trouver comment faire la mise à jour d'Ubuntu 9.04 à 9.10.
Si notre ordinateur est déjà équipé d'Ubuntu, on peut procéder à la mise à jour automatique par le web où le système d'exploitation s'occupera de télécharger et d'installer tout le nécessaire.
Comme je possède plus d'un PC à mettre à niveau, j'ai jugé bon de télécharger une seule fois le disque ISO de 9.10 plutôt que procéder au téléchargement automatique sur chaque poste. Pour procéder à la mise à jour, il est important de savoir qu'il existe deux types de CD pour Ubuntu :
- disque d'installation standard (pour les nouvelles installations)
- disque alternatif
Une fois en possession du fichier ISO, on peut suivre les instructions de mise à jour à partir d'un CD alternatif. Ce que je n'ai pas fait... J'ai eu le réflexe de prendre l'image du disque, de l'installer sur ma clé USB avec UNetbootin comme je l'avais fait précédemment quand j'avais remplacé Windows par Linux sur mon Netbook (Ubuntu 9.04 standard, pas l'édition Netbook remix).
Comme l'image du disque a été extraite sur la clé USB, ce n'était pas vraiment un problème. Il me suffisait de faire pointer la commande au bon endroit :
- démarrer Ubuntu normalement
- se connecter avec son utilisateur ou root
- introduire la clé USB
- ALT+F2 pour afficher le Run Dialog
- entrer la commande gksu "sh /media/disk/cdromupgrade"
Microsoft installera Chrome OS sur les ordinateurs ?
Regardez cet imprimé d'écran d'un article publié par Branchez-vous Techno.
Le paragraphe à la fin indique que :
Sunchar Pichai, vice-président de la gestion des produits chez Microsoft, a annoncé dès le début de la conférence (qui commençait vers 10 h, à l'heure du Pacifique) que Chrome OS allait être installé sur les ordinateurs vendus dès l'automne prochain.
Hum.... j'ai comme un doute ? Probablement une erreur de rédaction ou d'inattention. Microsoft ne ferait certainement pas de cadeau au géant Google, même à l'approche des fêtes.
Après vérification, j'ai trouvé M.Pichai sur Facebook. Gradué de Stanford en 1995, fait parti du réseau Google. Merci, livre de visages!
Hier soir, je suis allé rejoindre des amis pour assister à la 14ème édition du Pecha Kucha Montréal. Les présentations ont débuté avec un peu de retard, ce qui n'était pas si mal puisque ça nous laissait le loisir de discuter en personne plutôt qu'avec les médias sociaux web (email, Facebook, Twitter, etc). Et avec une bière à la main, Dieu sait que c'est agréable !
Je n'ai pas l'intention de résumer la soirée (c'était à vous d'y être!) mais je vais au moins présenter mes coups de coeur.
Bien sûr, on ne peut pas passer à côté de tous les intervenants qui sont venus présenter leurs projets créatifs dans le cadre du concours de design des éléments de mobilier urbain amovibles à l’usage des festivals. Le seul hic, j'ai l'impression (et je ne suis pas le seul) d'être passé à côté de l'identité du lauréat.
Celui qui m'a le plus marqué est Michel Dallaire. Son nom ne vous dira probablement rien, mais si je vous dis qu'il a été le concepteur de la torche pour la flamme olympique des jeux de Montréal en 1976 ? Que c'est aussi lui qui a conçu le mobilier de la Grande Bibliothèque du Québec (toujours sans vandalisme, a t-il tenu à préciser) ? Du moniteur pour bébé Angel Care ? Sans compter le design du Bixi ! Un beau résumé de sa brillante carrière (j'ai trouvé une courte biographie ici).
Concernant le vélo Bixi, il expliquait que le concept et la forme s'inspirent du boomrang : quand il part on veut qu'il revienne. Bien dit.
Une autre présentation que j'ai apprécié est celle du collectif de Babel. Charles Robert Simard (si je me fie au nom dans le programme) est un excellent orateur en plein contrôle de son sujet. Le contenu était riche tant en mots qu'en images et suffisamment mystérieux pour avoir le goût d'en apprendre plus et d'aller jeter un oeil à leur travail. Le collectif tire son inspiration de la nouvelle La Bibliothèque de Babel de l'auteur argentin Jorge Luis Borges (excellent en passant). Visitez leur site web pour de plus amples informations.
Du côté des technologies, j'ai retenu la présentation des travaux de Christopher Salter (je fais exprès de copier/coller son titre pour vous donner un aperçu : "Ph.D., Asst. Professor of Computation Arts, Faculty of Fine Arts, Concordia University, & Researcher"). Imaginez sa carte d'affaire. Visitez la section Projects de son site web pour comprendre l'étendue de ses réalisations (Just Noticable Difference, AirXY, Chronotopia, etc).
Enfin, un petit chien sorti de nulle part se promenait dans la salle tout au long de la soirée. Mais à qui était-il ?
Quant à ce soir, la conférence de Guy Kawasaki "The Art of Innovation" est sold out me dit-on...
Pendant qu'on apprend que le co-fondateur de Microsoft, Paul Allen, est atteint d'un cancer, combien d'entre vous commencent à penser que l'utilisation quotidienne du téléphone sans fil ne sera pas sans dommages pour le cerveau ? À quel point les ondes auront-elles un effet sur les cellules de votre matière grise ?
De façon plus préoccupante, je soulève la question : quels sont les impacts à passer plus de 7 heures par jour assis à côté de la tour de votre ordinateur et d'exposer votre corps à ce flux d'électricité intense ? Un risque de développer un cancer de la jambe droite ?
Saviez-vous que COREL corporation, l'entreprise canadienne basée à Ottawa qui commercialise WordPerfect, CorelDRAW et WinZip, a été nommée à partir du nom de son fondateur, Michael Cowpland ?
En fait, les deux premières lettres de son nom figurent dans l'acronyme :
Cowpland Research Laboratory
Ça ne fait pas si longtemps que j'ai abandonné le bon vieux Winamp au profit de Songbird, le lecteur audio libre basé sur la plateforme XULRunner de Mozilla. Il semble être sur une bonne lancée puisqu'il continue à cumuler les extensions (pour le personnaliser à l'image de Firefox).
Je l'avais paramétré au début selon mes besoins et j'avais conservé la même configuration pendant plusieurs mois. Hier soir, je suis retourné dans le nid d'oiseau (songbirdnest.com) pour voir ce qui s'était développé.
Et j'ai trouvé un skin bien sympathique à l'image du joli petit iPod. Comme vous avez vu l'image ci-jointe, vous mourez probablement déjà d'envie d'installer le même sur votre ordinateur.
Voici comment procéder :
- Débarassez-vous de tout lecteur audio que votre ordinateur contient, surtout s'il se nomme Windows Media Player (même s'il semble exister un skin iPod pour WMP...)
- Installez le sublime lecteur Songbird qui vous procurera du bonheur assuré
- Téléchargez d'abord l'extension Pure Player qui permet de modifier l'apparence autrement que par les feathers standards
- Obtenez d'un seul coup les skins du iPod en différentes couleurs (noir, bleu, vert, orange, rose, rouge, argent, violet et jaune. Comme le iPod nano, donc pas de version en blanc)
- Obtenez séparément le skin du iPhone (un peu plus complet dans les fonctionnalités)
- Profitez de la musique !
Si vous avez exploré le système de fichiers de Linux, vous avez certainement remarqué que les commandes binaires exécutables sont réparties à plusieurs endroits :
- /bin
- /sbin
- /usr/bin
- /usr/sbin
- /usr/local/sbin
/bin
- contient les commandes les plus importantes, les plus souvent utilisées : ls, cp, cat, nano...
- d'autres commandes importantes sont aussi placées dans /usr/bin, mais celles qui se retrouvent ici avaient une raison historique qui concernait la vitesse des disques durs. À l'époque, les disques rapides étaient dispendieux alors que les plus lents étaient économiques. Un de chaque type était monté dans l'ordinateur et les programmes souvent utilisés étaient placés sur le disque rapide (/bin) tandis que les autres étaient sur le disque lent (/usr/bin). Une pratique qui n'est plus plus effective aujourd'hui pour les raisons qu'on connait.
- sbin = system binaries
- au sens large, les commandes qui s'y trouvent sont celles les plus utilisées reliées au domaine de l'administration du système : init, fdisk, shutdown, reboot, etc...
- commandes générales, de démarrage et de gestion du disque dur
- elles sont vitales au bon fonctionnement du sytème
- d'autres commandes systèmes moins utilisées se retrouvent dans /usr/sbin
- utilitaires employés moins souvent
- ce sont des commandes destinées à l'utilisateur du système
- contient plus de 1000 fichiers exécutables dont diff, find, gcc, gzip, less, locate, man, etc
- commandes systèmes non vitales réservées à l'administrateur système : adduser, chroot, chpasswd, cron....
- contient des daemons qui roulent en silence
- contient des programmes installés localement (pour cet ordinateur spécifique) à l'attention des administrateurs systèmes
Curiosité n'est que vanité. Le plus souvent, on ne veut savoir que pour en parler.
J'avais entendu parler d'un easter egg dans Linux (que certains considèrent aussi comme un applet, ou est-ce deux choses différentes ?) nommé Wanda The Fish.
- Dans Gnome, faites ALT+F2 pour ouvrir une boîte de dialogue Run Application.
- Entrez la phrase : free the fish
- Cliquez sur le bouton Run
Un petit poisson se promènera sur votre bureau. Cliquez dessus pour le faire fuir. Mais comme il revient un peu plus tard, si on veut s'en débarasser, on peut ouvrir un terminal et entrer : skill gnome-panel.
À part amuser mes parents, si vous lui trouvez une autre utilité, faites moi signe.
Quand j'ai vu ce tweet sur Twitter, je pensais que c'était une curiosité mais pourtant, ça semble être un produit qui pourrait avoir du potentiel. Il s'agit de CodeRun Studio, un éditeur de code source en ligne (encore en version Beta) qui permet de créer des projets en C#, JavaScript et PHP.
À ce stade du développement, on peut utiliser des gabarits de projet pour :
- Silverlight, Facebook, MVC .NET, application web, WPF Browser Application
- JQueryUI
- Site PHP
Trois options que j'aime bien vu le contexte :
- la possibilité d'enregistrer ses projets en ligne
- l'importation en ligne le code d'un projet (en un seul zip) en vue de poursuivre le développement
- la présence d'un bouton "Download" qui permet de récupérer l'ensemble du projet compressé en un fichier zip
Dans l'ergonomie d'une interface, c'est toujours gagnant d'avoir un champ autocomplete. J'en utilise depuis des années dans mes projets et étonnamment, j'ai toujours utilisé exclusivement le composant de la librairie Yahoo! User Interface (mieux connu sous le nom YUI). Ce qui me fait penser que je n'ai pas encore essayé celui de la version YUI 3 donc pour le moment, j'expliquerai comment intégrer celui de la version 2.
- Téléchargez YUI 2 - Full Developer Kit
- Décompressez l'archive zip
- Placez le répertoire yui à l'intérieur de votre projet (pour faire simple)
- Les librairies qu'on aura besoin se trouvent dans yui/build
Pour utiliser le composant autocomplete, il faut placer en entête (entre les balises HEAD) une référence vers chacune de ces librairies JavaScript et il ne faut pas oublier d'inclure la feuille de style CSS.
<link type="text/css" rel="stylesheet" href="/yui/build/autocomplete/assets/skins/sam/autocomplete.css">2. Créer le markup HTML pour YUI
<script type="text/javascript" src="/yui/build/yahoo/yahoo-min.js"></script>
<script type="text/javascript" src="/yui/build/event/event-min.js"></script>
<script type="text/javascript" src="/yui/build/yahoo-dom-event/yahoo-dom-event.js"></script>
<script type="text/javascript" src="/yui/build/datasource/datasource-min.js"></script>
<script type="text/javascript" src="/yui/build/get/get-min.js"></script>
<script type="text/javascript" src="/yui/build/connection/connection-min.js"></script>
<script type="text/javascript" src="/yui/build/animation/animation-min.js"></script>
<script type="text/javascript" src="/yui/build/json/json-min.js"></script>
<script type="text/javascript" src="/yui/build/autocomplete/autocomplete-min.js"></script>
YUI a besoin de savoir dans quelle portion du DOM il doit chercher le markup pour appliquer les changements. Pour cela, il faut placer la classe "yui-skin-sam" sur un conteneur. La documentation suggère de le mettre comme attribut de la balise BODY, mais on peut aussi bien le mettre sur un DIV :
<div class="yui-skin-sam">Ce snippet de code devrait faire parti d'un formulaire quelconque dans lequel le champ d'auto-complétion serait intégré. Le champ qui possède l'ID "ac_field" est celui où l'utilisateur entrera un mot clé au clavier. Au fur et à mesure que les touches seront enfoncées, les propositions de résultats qui correspondent seront affichées dans le conteneur "ac_container" que YUI prend en charge automatiquement. Enfin, le champ caché "selected_id" servira à récupérer la clé unique qui correspond à l'enregistrement sélectionné dans la liste déroulante de l'autocomplete.
<div id="container">
<input type="text" id="ac_field" />
<div id="ac_container"></div>
<input type="hidden" id="selected_id" name="selected_id" value="" />
</div>
</div>
3. Initialisation JavaScript
Maintenant, on est prêt à initialiser le composant et à programmer la façon dont il réagira. Pour faciliter le tout, je vais utiliser un peu de jQuery alors il ne faut pas oublier d'attacher une librairie supplémentaire en entête.
D'abord, il faut définir une source de données. Dans mon cas, j'utilise un XMLHttpRequest (XHR) pour obtenir la liste à partir d'un fichier dynamique PHP qui recevra un paramètre $_GET['q'] pour chercher dans une base de données et qui filtrera les résultats (clause LIKE).
Ensuite, j'indique que le résultat que retournera ma source de données XHR utilisera la notation JSON. Je pourrais aussi bien choisir parmi plusieurs autres types dont le XML mais j'ai une nette préférence pour la structure JavaScript Object Notation.
Tout ce que votre fichier PHP doit retourner, c'est du JSON, peu importe la façon qu'il est généré (statique, par la base de données, json_encode(), etc). Je vous recommande de vérifier la syntaxe résultante avec ce validateur JSON.
Ce que je retourne respecte le schéma suivant (tel qu'indiqué plus loin) :
{Pour la suite, j'ai commenté à l'intérieur du code pour que ça soit plus facile à suivre :
"Results" :
[
{"id":100,"name":"Firefox"},
{"id":200,"name":"Internet Explorer"},
{"id":300,"name":"Safari"}
]
}
$(document).ready( initAutoComplete );4. Personnalisation
function initAutoComplete(){
// Source
var oDS = new YAHOO.util.XHRDataSource("/ajax/list.php");
// le paramètre envoyé à list.php sera nommé "q"
oDS.scriptQueryParam = "q";
oDS.responseType = YAHOO.util.XHRDataSource.TYPE_JSON;
oDS.responseSchema = {
resultsList: "Results",
fields:["name", "id"]
};
// Contrôle autocomplete
var oAC = new YAHOO.widget.AutoComplete("ac_field", "ac_container", oDS);
// on affiche l'autocomplete dès qu'il y a au moins 2 caractères
oAC.minQueryLength = 2;
// on veut absolument qu'on choisisse un élément de la liste
oAC.forceSelection = true;
// ce qui se passe lorsqu'on sélectionne un item
// on copie la clé unique (ID) dans le champ caché
oAC.itemSelectEvent.subscribe(
function(type, args) {
var oData = args[2];
$("#selected_id").val(oData[1].toString());
}
);
}
Dans mon exemple, j'ai écrit le strict minimum pour que ça fonctionne. Il sera peut-être nécessaire d'ajouter un peu de CSS pour faire une mise en page correcte. À mesure que vous explorerez ce composant, vous verrez qu'il y a une tonne d'options possibles et que la documentation est tellement vaste qu'on a parfois de la difficulté à savoir où commencer. C'est d'ailleurs la raison pour laquelle j'ai décidé d'en faire un tutoriel le plus simplifié possible. J'espère qu'il vous sera utile.
P.s. comme les lignes de code sont longues et que la largeur de page est trop étroite, ça provoque des sauts de lignes indésirables. Je vous recommande de cliquer sur "View plain" dans le coin supérieur gauche de chaque bloc de code, ça sera plus lisible et plus facile à copier.
Je prends quelques minutes pour écrire un court message pour vous dire que j'ai maintenant accès au preview de Google Wave (après plusieurs semaines d'attente) et que je peux offrir quelques invitations à ceux qui sont intéressés à explorer le nouveau gadget de Google.
Faites moi signe si vous êtes curieux de voir ça (j'aurai besoin de votre adresse courriel). Dire qu'il y en a qui vendent ces invitations par eBay (ordinaire non ?)...
Cependant, comme je les donne, s'il y a trop de demandes, je me réserve le droit de les faire tirer au hasard.
J'ai découvert malgré moi un raccourci pratique dans Firefox et qui après avoir testé, fonctionne aussi dans Internet Explorer.
Dans la barre d'adresse, si on entre un domaine sans entrer le préfixe "www" ni le suffixe ".com", il suffit de compléter avec la combinaison de touches CTRL+ENTER pour que le fureteur l'ajoute automatiquement. Ce n'est peut-être pas le truc du siècle mais ça a le mérite d'accélérer un peu les choses.
Si vous utilisez Firefox et que ça vous embête parce que vous visitez principalement des sites web canadiens, vous pouvez le configurer et modifier le préfixe et le suffixe. Entrez about:config dans la barre d'adresse, faites ENTER. Promettez que vous ferez attention (!). Avec le filtre, recherchez les clés suivantes :
- browser.fixup.alternate.prefix (quoi que peu pratique à changer)
- browser.fixup.alternate.suffix
Dans le cas où certains d'entre vous utilisez Internet Explorer, vous pouvez modifier le suffixe en allant dans Tools / Internet Options / Onglet General / Languages. Entrez le nouveau suffixe dans l'encadré au bas de la fenêtre. Contrairement à Firefox, CTRL+ENTER ajoutera toujours .com alors il faudra utiliser le raccourci CTRL+SHIFT+ENTRER pour utiliser le suffixe personnalisé.
Chez moi ou au bureau, j'écoute continuellement de la musique. Le hasard a fait que j'ai entendu deux "ripoff" du thème de l'émission de dessins animés The Simpsons dans la musique que j'ai écouté durant la dernière semaine.
En musique, on appelle un ripoff une imitation volontaire ou non d'un thème original connu, repris dans un autre contexte.
Dans ce cas-ci, c'est tellement évident que ç'en devient une sorte de clin d'oeil, un genre de "running gag" populaire de la part des musiciens.
Le premier que j'ai trouvé se trouve dans la pièce # 11, Dance of the Idiots de l'album du même nom de l'artiste klezmer Koby Israelite (Tzadik Records, 2003). Vous entendrez un court extrait de quelques secondes si vous positionnez la pièce à 2 minutes et 3 secondes.
La deuxième passage que j'ai remarqué est interprété par le quatuor de jazz manouche Les Doigts de l'Homme. Sur leur album éponyme (2005), la 8ème pièce, intitulée Rythme Futur, aborde le thème des Simpsons à deux reprises entre 1:41 et 2:00.
Je vous les recommande puisque ce sont deux bons artistes découvrir et à intégrer à votre collection. Sinon, si vous avez fait d'autres observations du même genre, je vous invite à les partager avec moi. Bonne écoute.
Samedi, quand j'ai transcrit l'énumération des 10 points que j'avais trouvé dans l'article, j'aurais dû, pour respecter le classement original, numéroter la liste dans l'ordre inverse (de 10 à 1).
Comme j'utilisais une combinaison de OL/LI (ordered list), le résultat affiché fût sans surprise de 1 à 10. Quelle technique est-ce que j'aurais pu utiliser pour inverser la numérotation ? Prenons un exemple plus court avec une liste comptant 5 items :
<ol id="list">On sait qu'il existe un attribut HTML pour la balise LI qui s'appelle value. Lorsqu'on lui donne une valeur, la numérotation se poursuit au nombre indiqué, en incrémentant de 1 chaque item qui suit.
<li>A</li>
<li>B</li>
<li>C</li>
<li>D</li>
<li>E</li>
</ol>
<ol id="list">Affichera : 1, 10, 11, 12, 13
<li>A</li>
<li value="10">B</li>
<li>C</li>
<li>D</li>
<li>E</li>
</ol>
Encore là, il n'existe aucun moyen d'indiquer à la liste de compter en sens inverse. On est contraint à attribuer une valeur statique à chaque LI pour obtenir le résultat attendu. Sinon, on pourrait utiliser une boucle dynamique par programmation pour attribuer le nombre à chaque LI. Ça se fait facilement avec un langage exécuté côté serveur (comme PHP) mais je vais vous montrer comment le faire par la manipulation du DOM en JavaScript et jQuery.
Au chargement de la page (onLoad / $(document).ready), ce simple bout de code suffit :
var listLi = $("#list").find("li");On récupère chaque LI de la liste qui possède l'ID list. Du tableau résultant, on compte le nombre d'éléments au total : ce sera la valeur maximale à partir de laquelle on débutera la numérotation. Finalement, on boucle sur chaque LI pour remplacer l'attribut "value" par la valeur du compteur qui se décrémente.
var totalLi = listLi.length;
listLi.each(
function(i){
$(this).attr('value', (totalLi - i));
}
);
Au final, la même liste sera affichée mais elle sera numérotée en ordre décroissant, peu importe le nombre d'éléments qui la compose.
Dimanche matin, c'est le temps du ménage. Tout le monde connait les serviettes absorbantes ShamWow et les publicités télévisées douteuses par son curieux porte-parole Vince Offer.
Si vous avez la chance de vivre au Québec, vous avez surement raffolé de la traduction québécoise encore plus crédible :
(Oups, cette version a été retirée temporairement de YouTube)
On peut citer des phrases clés comme :
- ça va moisir en dessous et ça va pas sentir très bon
- si vous appelez dès maintenant, d'ici 10 minutes parce que ça va pas durer toute la journée
- c'est fait en Allemagne et vous savez que les allemands font des bons produits...
Qu'est-ce qu'on voit en haut ? MADE IN GERMANY. Ben oui, les allemands font des bons produits.
Cette copie éponge au moins 95% de l'eau que j'ai mis sur la table pour faire le test comme dans la publicité. Pour 1$, ce n'est pas si pire. Ajoutez 19$ pour le branding et vous avez un ShamWow!
Maintenant, voyez l'excellente parodie de Marc Labrèche à 3600 secondes d'extase :
Une personne intelligente résout un problème. Un sage tente de l'éviter.
10 petits secrets que vous devez savoir sur le travail en informatique
Je partage avec vous ce matin un article de Jason Hiner publié sur TechRepublic en 2007 et qui met le doigt sur des faits reliés aux emplois dans le domaine des technologies de l'information. Malheureusement, je dois dire qu'il dit vrai.
Comme je n'ai pas trouvé de version française nulle part, je me permets une traduction libre des grandes lignes :
- Le salaire est élevé par rapport à d'autres professions mais comme vous êtes bien payé, on vous considère souvent comme si vous étiez la propriété de l'entreprise
- Ce sera votre faute si les utilisateurs font des erreurs stupides
- Vous passerez de héro à zéro plusieurs fois au sein d'une même journée
- Les certifications ne vous aideront pas à devenir un meilleur technicien mais elles peuvent vous aider à décrocher un meilleur emploi ou une augmentation de salaire
- Vos collègues de travail moins techniques compteront sur vous pour les dépanner avec leur ordinateur personnel à la maison
- Les vendeurs et consultants prendront tout le crédit du travail lorsque ça va bien mais vous blâmeront lorsque la situation ira mal
- Vous passerez beaucoup plus de temps à supporter les vieilles technologies qu'à en implanter des nouvelles
- Les vétérants en TI représentent souvent le plus gros frein à intégrer des nouvelles technologies
- Certains professionnels des TI déploient des technologies qui les aident à consolider leur pouvoir plutôt que d'aider à faire évoluer l'entreprise dans la bonne direction
- Les pros des TI utilisent du jargon pour semer la confusion chez les gestionnaires moins techniques afin de cacher le fait qu'ils ont échoué
Saviez-vous qu'au niveau de la performance, un accès au disque dur (I/O) peut représenter l'équivalent d'exécuter 2000 lignes de code PHP?
Ceci est dû au fait que les disques durs sont mécaniques (comme un tourne-disque, avec la tête de lecture au bout du bras), ce qui cause une lenteur, tout comme l'accès à un réseau. Pour réduire le temps d'exécution, vous pouvez utiliser le caching (bytecode, data, results, etc), du RAID (Redundant Array of Independent Disks) ou encore un disque dur de technologie récente comme le SSD (Solid-state drive).
Un disque dur SSD de 32 Go se détaille présentement 120$ et un de 64 Go vaut autour de 160$ canadiens. Comme c'est le cas pour toute technologie, vous risquez de rire lorsque vous relirez cet article dans quelques années (voir la référence au disque dur de 15 Mo de Radio Shack...).
Ma blonde a fait une sélection de près de 200 photos dans le but de les charger sur une carte mémoire à placer dans un cadre numérique. À raison de 3 ou 4 Mo par photo, il aurait fallu une carte d'une capacité de 1 Go pour les contenir toutes et je ne voulais pas en sacrifier une que je souhaitait conserver pour l'usage de mon appareil photo.
À la place, j'ai retrouvé une vieille carte SD de 128 Mo et mon objectif était de réduire la taille des photos pour qu'elles puissent être stockées dessus. De toute façon, comme le cadre a un écran d'une dimension de 7 pouces, ce n'était pas nécessaire de les avoir dans leur meilleure résolution.
Comment les réduire en lot, d'un seul coup ? Je ne connais pas assez Photoshop et GIMP pour savoir s'ils ont une fonction qui permettrait de le faire automatiquement. Par contre, comme j'ai travaillé récemment avec ImageMagick (gratuit et disponible sur les plateformes Windows et Linux), je savais qu'on pouvait appeler les librairies par le command line.
Avec ce logiciel, j'avais déjà redimensionné des photos individuellement et je figurais que je pourrais simplement créer un script qui boucle sur chaque image pour appliquer les modifications. Et pourtant, la solution s'est avérée encore plus simple que ça.
Lorsqu'on installe ImageMagick , plusieurs utilitaires s'ajoutent au système, dont mogrify.
- Installez ImageMagick
- Lancez un terminal / interpréteur de commandes
- Rendez-vous au répertoire où se trouvent les photos à redimensionner (je suggère de faire une copie car les fichiers originaux seront écrasés)
- Entrez la commande suivante pour redimensionner toutes les images (png, jpg, gif) :
mogrify -resize 1024x1024 *.* - Pour appliquer la commande que sur les images d'un certain type :
mogrify -resize 1024x1024 *.jpg
- par exemple, si je spécifie 1024x1024, elles seront modifiées au maximum de 1024 pixels en hauteur OU en largeur, tout en conservant les proportions (ça ne fait pas des images carrées)
- les images plus petites seront agrandies au maximum de 1024 pixels
- pour éviter de provoquer une erreur, assurez-vous que le répertoire ne contienne que des images (évidemment, un répertoire de Windows pourrait contenir le fichier Thumbs.db)
- C'est performant mais gourmand sur la mémoire vive et le CPU.
mogrify -format jpg *.png
Difficile de faire mieux, non ?
Je viens à l'instant de tomber là-dessus sur le site de DirectCanada.com (fournisseur de matériel informatique) : clé USB DataTraveler de Kingston de 4 et 16 Go à 10 799 999,99 $. Mais la livraison est gratuite :-)
Je ne sais pas ce qui s'est passé (erreur de conversion, injection SQL, mauvaise entrée de données ?) mais gageons qu'ils n'en vendront pas beaucoup... Il reste que c'est un très bon site où acheter du matériel informatique à prix très compétitif.
Je viens de recevoir la carte postale de Google AdSense qui m'indiquait mon NIP pour compléter mon profil et ainsi obtenir les redevances pour les publicités affichées sur ce blogue.
C'est ma première expérience avec ce système et pour le moment, il n'y a pas de quoi s'énerver ! Au moins je peux me familiariser avec leur approche et les interfaces de gestion, question d'en apprendre toujours un peu plus.
Quand j'ai aperçu la carte dans ma boîte aux lettres, j'ai machinalement jeté un oeil sur l'oblitération pour en connaître la provenance :
US International AIRMAIL
Postage Paid
Jamaica, NY
PAR AVION
Voulez-vous bien me dire pourquoi les américains ont baptisé plusieurs de leurs villes du même nom que certains endroits connus dans le monde ?
- Jamaica, dans l'état de New York, comme le pays des Antilles
- Montréal, état de Géorgie, comme ma ville de résidence (Québec, Canada)
- Paris, ville lumière, présente dans plusieurs états
- Jésus en personne serait passé par la Pennsilvanie pour aller à Nazareth et Bethlehem
- On a récemment mis à terre le mur de Berlin, au Vermont
- Sydney est en Floride, surtout pas en Australie !
- Venez en grand nombre célébrer l'Oktoberfest à Munich, Dakota du Nord
- Quand les américains parlaient de guerre froide avec Moscow, c'était peut-être celui de l'Idaho ?
- Tous les chemins mènent à Rome... en Géorgie
Il m'arrive parfois de travailler avec des programmeurs qui comptent moins d'expérience (et parfois) et fait surprenant, il semblerait que ça soit le cauchemar de tous et chacun lorsque vient le temps de générer une table HTML dynamique. Par dynamique, j'entends qu'elle est créée par programmation, par exemple en PHP.
Habituellement, le code est parsemé de "if", de flags pour indiquer où on est rendu et des instructions echo qui impriment une portion du code HTML ici et là. Bref, rien de facile à suivre et le résultat s'apparente rapidement à l'image qu'on se fait du code spaghetti.
De plus, ça arrive très souvent que la validation HTML ne respecte pas les standards d'évaluation de Tidy, SGML Parser ou W3C (ce que j'ai vu le plus souvent est un </td> ou </tr> qui ne ferme pas parce que le bris de séquence est mal construit).
Pour contrer cela, il existe plusieurs moyens mais je suggère une solution simple et originale : créer le tableau avant de l'afficher. Une fois que la structure du tableau (array) illustre la représentation de la table HTML, il suffira de faire une première boucle pour afficher les rangées et une deuxième imbriquée pour lister les colonnes.
Imaginons les données suivantes qui pourraient provenir d'une base de données :
$data = array(Je définis une constante qui me servira à faire les calculs nécessaires pour construire un tableau à 3 colonnes.
array('id' => 10, 'value' => 'a'),
array('id' => 20, 'value' => 'b'),
array('id' => 30, 'value' => 'c'),
array('id' => 40, 'value' => 'd'),
array('id' => 50, 'value' => 'e'),
array('id' => 60, 'value' => 'f'),
array('id' => 70, 'value' => 'g')
);
DEFINE('NB_COLS', 3);Ensuite, c'est là que la magie s'opère. L'idée est de créer une matrice où chaque indice de l'array principal représentera une rangée (TR) du tableau. À l'intérieur de chaque rangée sera créé un array qui représente les colonnes (TD) et son contenu. Pour avoir une matrice complète, il sera peut-être nécessaire d'ajouter des cellules vides au tableau.
# 7 éléments au totalPour bien comprendre ce qui se passe, je vous suggère de faire un print_r($rows) après l'appel de array_chunk(), et avant/après la boucle for. Vous aurez une meilleure idée des changements qui se sont opérés pour construire la bonne structure.
$nbElems = count($data);
# créer des regroupements de 3 éléments
$rows = array_chunk($data, NB_COLS);
# $rows contient 3 rangées
# (deux pleines et une avec un seul élément)
$nbRows = count($rows);
# 3 rangées de 3 colonnes = 9 cellules
$totalTableCells = NB_COLS * $nbRows;
# combien de cellules vides doit-on créer ?
$nbEmptyCells = $totalTableCells - $nbElems;
# ajouter les cellules vides au bon endroit
for($i=0 ; $i < NB_COLS ; $i++){
# dernière colonne
if( !isset($rows[$nbRows-1][$i]) ){
$rows[$nbRows-1][$i] = array();
}
}
Enfin, deux boucles imbriquées feront générer le tableau HTML. Remarquez à quel point le code source est clair.
<?php if( count($rows) > 0 ){ ?>Vous pouvez reprendre cet exemple dans d'autres langages, le principe demeure le même. Maintenant, je vous lance un petit défi : tentez de trouver une alternative à la boucle for qui ajoute les cellules vides dans la dernière rangée du tableau.
<table>
<?php foreach($rows as $tr){ ?>
<tr>
<?php foreach($tr as $td){ ?>
<td>
<?php if( !empty($td) ){ ?>
<?php echo $td['id']; ?>
<?php } ?>
</td>
<?php } ?>
</tr>
<?php } ?>
</table>
<?php } ?>
En attendant le résultat de l'élection municipale montréalaise, j'en ai profité pour suivre un petit tutoriel pour GIMP (édition photo). Si vous êtes comme moi, il n'y a rien de pire que d'essayer de trouver la correspondance des termes anglais d'un tutoriel pour la faire correspondre à ceux de l'interface français. D'ailleurs, mon système Windows est anglophone mais GIMP s'est installé en français, sans doute parce qu'il a détecté la préférence régionale dans la configuration.
J'ai fouillé dans les menus de l'application et dans l'aide mais je n'ai rien trouvé pour le changer. Je me suis alors tourné vers la documentation pour dénicher un petit truc qui permet de lancer GIMP dans la langue de son choix.
Dans Windows, il faut ajouter une variable d'environnement nommée LANG :
- Rendez-vous au Control panel (panneau de configuration)
- Double cliquez sur l'icône System
- Onglet Advanced
- Dans l'encadré User variables, cliquez New
- Entrez les valeurs suivantes :
Variable name: LANG
Variable value: en
Pour Linux, on peut simplement lancer GIMP par une console en entrant :
LANG=en gimp
Maintenant qu'il est en anglais, je n'ai plus à chercher comment a été traduit le nom de chacun des outils, propriétés, etc. Le tutoriel peut maintenant commencer.
Les ennuis, c'est comme le papier hygiénique : on en tire un, il en vient dix.