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

lundi 30 novembre 2009

Utilise les regex avant que je vire fou !

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

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...


Tags: Programmation

dimanche 29 novembre 2009

In Search of Stupidity

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

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.


Tags: Livres

Citation no. 58 sur la confiance

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

Vous ne pouvez pas faire confiance en du code que vous n'avez pas totalement créé vous-même.

- Ken Thompson


Tags: Citations

vendredi 27 novembre 2009

Propriétaire d'une table PostgreSQL

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

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 tableowner
FROM pg_catalog.pg_tables
WHERE tablename = 'nom_de_la_table'
Pour voir la liste des tables et le propriétaire de chacune :
SELECT tablename, tableowner
FROM pg_catalog.pg_tables
ORDER BY tablename
Pour modifier le propriétaire d'une table :
ALTER TABLE tablename OWNER TO username
Connecté en tant que l'utilisateur postgres, on peut obtenir la liste des bases de données et leurs propriétaires respectifs :
SELECT datname, rolname
FROM pg_database as d
INNER JOIN pg_authid as a ON d.datdba = a.oid
ORDER BY datname
On peut changer le propriétaire de la base de données :
ALTER DATABASE dbname OWNER TO username
Cependant, 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.


Tags: PostgreSQL

mercredi 25 novembre 2009

Configurer le FTP dans Netbeans

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

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
Lorsque vous aurez modifié du code source :
  • Sélectionnez le ou les fichiers modifiés
  • Cliquez avec le bouton droit de la souris pour ouvrir le menu contextuel
  • Choisissez Upload
À noter qu'avec la version 6.5.1, seule l'option FTP est disponible et qu'à partir de la version 6.7, il est possible de transférer à l'aide de SFTP. Cependant, il ne semble pas y avoir d'option de synchronisation comme le fait Dreamweaver.


Tags: Coffre à outils, Programmation

mardi 24 novembre 2009

Mais où s'en va la vie privée ?

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

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...


Tags: Sécurité

lundi 23 novembre 2009

Livres informatiques douteux

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

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).


Tags: Curiosités, Livres

dimanche 22 novembre 2009

NoteCard, pour apprendre ses notes de musique

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

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.


Tags: Musique

Citation no. 57 sur les ordinateurs

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

Les ordinateurs sont inutiles. Ils ne savent que donner des réponses.

- Pablo Picasso


Tags: Citations

samedi 21 novembre 2009

Mise à jour Ubuntu 9.10 sur mon netbook

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

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
Si on veut effectuer une mise à jour, j'ai cru comprendre qu'on doit prendre le CD alternatif. On peut le reconnaître à son nom de fichier qui contiendra le mot "alternate" : ubuntu-9.10-alternate-i386.iso (j'ai téléchargé le mien à partir du site miroir d'iWeb).

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"
Voilà, la mise à jour est en cours. Durée estimée : 45 minutes.


Tags: Linux

vendredi 20 novembre 2009

Microsoft installera Chrome OS sur les ordinateurs ?

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

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!


Tags: Curiosités

jeudi 19 novembre 2009

Notes sur le Pecha Kucha Montréal # 14

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

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...


Tags: Le coin du geek

mardi 17 novembre 2009

Cancer de la jambe droite ?

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

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 ?


Tags: Le coin du geek

Que veut-dire le nom Corel ?

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

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


Tags: Saviez-vous que

lundi 16 novembre 2009

Skin iPod pour Songbird

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

Ç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 :

  1. 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...)
  2. Installez le sublime lecteur Songbird qui vous procurera du bonheur assuré
  3. Téléchargez d'abord l'extension Pure Player qui permet de modifier l'apparence autrement que par les feathers standards
  4. 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)
  5. Obtenez séparément le skin du iPhone (un peu plus complet dans les fonctionnalités)
  6. Profitez de la musique !


Tags: Coffre à outils, iPod, Musique

dimanche 15 novembre 2009

Classement des binaires sous Linux

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

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
Comme je trouvais moi-même que ça portait à confusion (je me considère encore novice en matière de Linux), j'ai décidé de faire le point et de noter les différences.

/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
  • 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
/usr/bin
  • 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
/usr/sbin
  • commandes systèmes non vitales réservées à l'administrateur système : adduser, chroot, chpasswd, cron....
  • contient des daemons qui roulent en silence
/usr/local/sbin
  • contient des programmes installés localement (pour cet ordinateur spécifique) à l'attention des administrateurs systèmes
Ce n'est évidemment pas une liste exaustive de toutes les caractéristiques de ces répertoires mais j'espère que ça vous aidera à vous y retrouver un peu.


Tags: Linux

Citation no. 56 sur la curiosité

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

Curiosité n'est que vanité. Le plus souvent, on ne veut savoir que pour en parler.

- Blaise Pascal


Tags: Citations

samedi 14 novembre 2009

Faire apparaître Wanda The Fish dans Linux

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

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.


Tags: Easter Eggs, Linux

vendredi 13 novembre 2009

CodeRun - Online IDE

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

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
L'application présente aussi plusieurs options concrètes comme les vrais IDE : Build, Run, Debug, Output Call Stack, Watch, Deploy, Share, coloration syntaxique, code-completion et plus. Elle compte aussi du support pour les bases de données SQL Server 2005 et Amazon SimpleDB.

Trois options que j'aime bien vu le contexte :
  1. la possibilité d'enregistrer ses projets en ligne
  2. l'importation en ligne le code d'un projet (en un seul zip) en vue de poursuivre le développement
  3. la présence d'un bouton "Download" qui permet de récupérer l'ensemble du projet compressé en un fichier zip
Une très belle application web à essayer, surtout que c'est gratuit.


Tags: Programmation

jeudi 12 novembre 2009

Champ autocomplete avec YUI

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

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.

  1. Téléchargez YUI 2 - Full Developer Kit
  2. Décompressez l'archive zip
  3. Placez le répertoire yui à l'intérieur de votre projet (pour faire simple)
  4. Les librairies qu'on aura besoin se trouvent dans yui/build
1. Inclure les fichiers nécessaires

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">

<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>
2. Créer le markup HTML pour YUI

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">
<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>
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.

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) :
{
"Results" :
[
{"id":100,"name":"Firefox"},
{"id":200,"name":"Internet Explorer"},
{"id":300,"name":"Safari"}
]
}
Pour la suite, j'ai commenté à l'intérieur du code pour que ça soit plus facile à suivre :
$(document).ready( initAutoComplete );

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());
}
);
}
4. Personnalisation

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.


Tags: Intégration, JavaScript

Invitation gratuite pour Google Wave

Publié par Infinite Loop, à 16 h 05 4 commentaires

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.


Tags: Le coin du geek

mercredi 11 novembre 2009

Raccourci dans Firefox pour compléter le domaine

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

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
Changez la valeur pour ce que vous désirez : .ca

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é.


Tags: Coffre à outils

mardi 10 novembre 2009

Ripoff du thème musical des Simpsons

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

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.


Tags: Musique

lundi 9 novembre 2009

Liste numérique HTML à ordre inversé

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

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">
<li>A</li>
<li>B</li>
<li>C</li>
<li>D</li>
<li>E</li>
</ol>
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.
<ol id="list">
<li>A</li>
<li value="10">B</li>
<li>C</li>
<li>D</li>
<li>E</li>
</ol>
Affichera : 1, 10, 11, 12, 13

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");
var totalLi = listLi.length;

listLi.each(
function(i){
$(this).attr('value', (totalLi - i));
}
);
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.

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.


Tags: HTML, JavaScript

dimanche 8 novembre 2009

Copie du ShamWow au Dollorama

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

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
Mais surtout :
  • c'est fait en Allemagne et vous savez que les allemands font des bons produits...
Ce qu'il faut savoir, c'est que ce produit est en vente au prix de 19,95$ US. La dernière fois que je suis allé au Dollorama, j'ai acheté une copie appelée Wizcloth Plus :



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 :


Tags: Curiosités, Humour

Citation no. 55 sur les problèmes

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

Une personne intelligente résout un problème. Un sage tente de l'éviter.

- Albert Einstein


Tags: Citations

samedi 7 novembre 2009

10 petits secrets que vous devez savoir sur le travail en informatique

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

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 :

  1. 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
  2. Ce sera votre faute si les utilisateurs font des erreurs stupides
  3. Vous passerez de héro à zéro plusieurs fois au sein d'une même journée
  4. 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
  5. Vos collègues de travail moins techniques compteront sur vous pour les dépanner avec leur ordinateur personnel à la maison
  6. Les vendeurs et consultants prendront tout le crédit du travail lorsque ça va bien mais vous blâmeront lorsque la situation ira mal
  7. Vous passerez beaucoup plus de temps à supporter les vieilles technologies qu'à en implanter des nouvelles
  8. Les vétérants en TI représentent souvent le plus gros frein à intégrer des nouvelles technologies
  9. 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
  10. 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é
Vous trouvez que ça a du sens ? Allez lire la version intégrale de 10 dirty little secrets you should know about working in IT pour en savoir plus.


Tags: Le coin du geek

jeudi 5 novembre 2009

Performance vs accès disque

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

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...).


Tags: PHP, Saviez-vous que

mercredi 4 novembre 2009

Redimensionner des images en batch

Publié par Infinite Loop, à 17 h 34 1 commentaire

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
Quelques remarques :
  • 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.
J'en profite pour dire que la commande mogrify est aussi pratique pour changer le format des images :

mogrify -format jpg *.png

Difficile de faire mieux, non ?


Tags: Coffre à outils

SQL Injection sur DirectCanada.com ?

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

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.


Tags: Curiosités

mardi 3 novembre 2009

Carte postale Google AdSense

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

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
D'ailleurs, ça m'a toujours intrigué de savoir pourquoi la ville de Washington ne se trouvait pas dans l'état du même nom...


Tags: Curiosités

lundi 2 novembre 2009

Façon élégante de créer des tables dynamiques

Publié par Infinite Loop, à 19 h 43 4 commentaires

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(
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')
);
Je définis une constante qui me servira à faire les calculs nécessaires pour construire un tableau à 3 colonnes.
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 total
$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();
}
}
Pour 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.

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 ){ ?>
<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 } ?>
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.


Tags: PHP, Programmation

dimanche 1 novembre 2009

Changer la langue de l'interface de GIMP

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

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
Sous Windows 7, on accèdera à Environment Variables par Advanced System Properties / Onglet Advanced (le bouton se trouve au bas de la fenêtre).

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.


Tags: GIMP

Citation no. 54 sur les ennuis

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

Les ennuis, c'est comme le papier hygiénique : on en tire un, il en vient dix.

- Woody Allen


Tags: Citations

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 (56)
    • CSS (8)
    • Curiosités (117)
    • Design Pattern (2)
    • Drupal (8)
    • Easter Eggs (22)
    • Extensions Firefox (20)
    • GIMP (7)
    • Histoire (21)
    • HTML (32)
    • Humour (57)
    • Intégration (34)
    • iPod (12)
    • JavaScript (110)
    • Jeu de combat (6)
    • Le coin du geek (128)
    • Liens (12)
    • Linux (56)
    • Livres (78)
    • Lois et principes (46)
    • Marché des saveurs (26)
    • Mathématique (18)
    • Mobile (5)
    • Montréal (32)
    • Musique (112)
    • Pancartes et écriteaux (16)
    • Perl (8)
    • Pérou (1)
    • PHP (130)
    • PostgreSQL (44)
    • Programmation (105)
    • Saviez-vous que (55)
    • Sécurité (22)
    • SEO (5)
    • SQL Server (22)
    • Vieilles publicités (6)
    • Virtualisation (8)
    • Voyages (1)
    • Zend Framework (26)

    Divers

    Archives

    • ►  2015 (6)
      • ►  août 2015 (1)
      • ►  juillet 2015 (1)
      • ►  février 2015 (3)
      • ►  janvier 2015 (1)
    • ►  2014 (8)
      • ►  décembre 2014 (1)
      • ►  novembre 2014 (1)
      • ►  octobre 2014 (1)
      • ►  août 2014 (2)
      • ►  juillet 2014 (2)
      • ►  janvier 2014 (1)
    • ►  2013 (53)
      • ►  décembre 2013 (2)
      • ►  novembre 2013 (1)
      • ►  octobre 2013 (3)
      • ►  septembre 2013 (2)
      • ►  août 2013 (5)
      • ►  juillet 2013 (3)
      • ►  juin 2013 (5)
      • ►  mai 2013 (3)
      • ►  avril 2013 (7)
      • ►  mars 2013 (7)
      • ►  février 2013 (11)
      • ►  janvier 2013 (4)
    • ►  2012 (105)
      • ►  décembre 2012 (8)
      • ►  novembre 2012 (5)
      • ►  octobre 2012 (4)
      • ►  septembre 2012 (1)
      • ►  août 2012 (8)
      • ►  juillet 2012 (7)
      • ►  juin 2012 (7)
      • ►  mai 2012 (10)
      • ►  avril 2012 (13)
      • ►  mars 2012 (15)
      • ►  février 2012 (15)
      • ►  janvier 2012 (12)
    • ►  2011 (146)
      • ►  décembre 2011 (14)
      • ►  novembre 2011 (11)
      • ►  octobre 2011 (12)
      • ►  septembre 2011 (13)
      • ►  août 2011 (15)
      • ►  juillet 2011 (17)
      • ►  juin 2011 (18)
      • ►  mai 2011 (15)
      • ►  avril 2011 (9)
      • ►  mars 2011 (7)
      • ►  février 2011 (3)
      • ►  janvier 2011 (12)
    • ►  2010 (398)
      • ►  décembre 2010 (29)
      • ►  novembre 2010 (28)
      • ►  octobre 2010 (32)
      • ►  septembre 2010 (34)
      • ►  août 2010 (22)
      • ►  juillet 2010 (35)
      • ►  juin 2010 (42)
      • ►  mai 2010 (36)
      • ►  avril 2010 (37)
      • ►  mars 2010 (34)
      • ►  février 2010 (32)
      • ►  janvier 2010 (37)
    • ▼  2009 (430)
      • ►  décembre 2009 (32)
      • ▼  novembre 2009 (34)
        • Utilise les regex avant que je vire fou !
        • In Search of Stupidity
        • Citation no. 58 sur la confiance
        • Propriétaire d'une table PostgreSQL
        • Configurer le FTP dans Netbeans
        • Mais où s'en va la vie privée ?
        • Livres informatiques douteux
        • NoteCard, pour apprendre ses notes de musique
        • Citation no. 57 sur les ordinateurs
        • Mise à jour Ubuntu 9.10 sur mon netbook
        • Microsoft installera Chrome OS sur les ordinateurs ?
        • Notes sur le Pecha Kucha Montréal # 14
        • Cancer de la jambe droite ?
        • Que veut-dire le nom Corel ?
        • Skin iPod pour Songbird
        • Classement des binaires sous Linux
        • Citation no. 56 sur la curiosité
        • Faire apparaître Wanda The Fish dans Linux
        • CodeRun - Online IDE
        • Champ autocomplete avec YUI
        • Invitation gratuite pour Google Wave
        • Raccourci dans Firefox pour compléter le domaine
        • Ripoff du thème musical des Simpsons
        • Liste numérique HTML à ordre inversé
        • Copie du ShamWow au Dollorama
        • Citation no. 55 sur les problèmes
        • 10 petits secrets que vous devez savoir sur le tra...
        • Performance vs accès disque
        • Redimensionner des images en batch
        • SQL Injection sur DirectCanada.com ?
        • Carte postale Google AdSense
        • Façon élégante de créer des tables dynamiques
        • Changer la langue de l'interface de GIMP
        • Citation no. 54 sur les ennuis
      • ►  octobre 2009 (33)
      • ►  septembre 2009 (37)
      • ►  août 2009 (37)
      • ►  juillet 2009 (39)
      • ►  juin 2009 (38)
      • ►  mai 2009 (37)
      • ►  avril 2009 (35)
      • ►  mars 2009 (37)
      • ►  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