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 31 août 2009

5 sites où acheter des t-shirts en ligne

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

À cette période de l'année, le changement de saison approche à grands pas. Pour certains, c'est synonyme de retour en classe et pour les autres, la preuve que l'été nous a fait un pied de nez et a pris ses jambes à son cou (c'est notre cas à Montréal, la période estivale a duré à peine 1 semaine).

Je n'ai pas pu porter mes shorts très souvent cette année, mais une chose est certaine, ma garde-robe de t-shirt demeure une valeur sûre à porter dans un environnement de travail comme le mien. Confortable, économique et évocateur de votre état d'esprit. En effet, quoi de mieux pour un geek que d'arborer fièrement un t-shirt aux références obscures au bureau ? C'est probablement l'uniforme par excellence pour les programmeurs de ce monde. Parfois j'ai l'impression que plus le code vestimentaire se rapproche de la cravate, moins l'emploi est stimulant et créatif!

Gardez vos porte-feuilles à portée de la main pour effectuer quelques achats compulsifs, je vous suggère 5 sites web où vous pourrez vous procurer des t-shirts originaux à bas prix.

BustedTees

  • Choix de 20 t-shirts à 9.99$ chacun
  • Vente à 8$
  • Coup de coeur : The future is in your hands
ThinkGeek
  • Prix moyen de 18$
  • Très cool, très geek
  • Coup de coeur : T-Qualizer interactif
Threadless
  • Prix variant entre 9$ et 15$
  • Abonnement d'un an disponible, un nouveau t-shirt exclusif chaque mois!
  • Coups de coeur : Living in Harmony et Allow me to explain through interpretive dance
6 dollar shirts
  • Comme le nom l'indique, 6$ chacun
  • Super spécial 10 pour 50$
  • Soumettez vos propres design et gagnez de l'argent (entre 50 et 500$!)
  • Choix vintage comme Cool Aid, Knight Rider, Flux Capacitor 1.21 Gigawatts (Back to the Future), Konami Code, etc
  • Coup de coeur : Volume 11 (pour comprendre la référence à Spinal Tap. Tout simplement hilarant!)
Ten Bills
  • Entre 7$ et 10$ chaque
  • présentement 20% de rabais sur les pré-ventes
  • Coup de coeur : Old School Technology, évidemment


Tags: Le coin du geek, Liens

dimanche 30 août 2009

Easter egg dans Python

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

Voici un petit easter egg documenté depuis longtemps concernant le langage de programmation Python. Ouvrez un terminal et entrez python :

# python

Ensuite, entrez :

>>> import this

Vous verrez apparaître les principes directeurs pour la conception de Python.

The Zen of Python, by Tim Peters

Beautiful is better than ugly.
Explicit is better than implicit.
Simple is better than complex.
Complex is better than complicated.
Flat is better than nested.
Sparse is better than dense.
Readability counts.
Special cases aren't special enough to break the rules.
Although practicality beats purity.
Errors should never pass silently.
Unless explicitly silenced.
In the face of ambiguity, refuse the temptation to guess.
There should be one-- and preferably only one --obvious way to do it.
Although that way may not be obvious at first unless you're Dutch.
Now is better than never.
Although never is often better than *right* now.
If the implementation is hard to explain, it's a bad idea.
If the implementation is easy to explain, it may be a good idea.
Namespaces are one honking great idea -- let's do more of those!


Tags: Easter Eggs

Citation no. 45 sur Perl

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

Perl combines all the worst aspects of C and Lisp: a billion different sublanguages in one monolithic executable. It combines the power of C with the readability of PostScript.

- Jamie Zawinski


Tags: Citations, Perl

samedi 29 août 2009

Créer un singleton en PHP

Publié par Infinite Loop, à 11 h 25 1 commentaire

Le pattern de création singleton permet de s'assurer qu'il existe une seule instance d'un objet à l'intérieur du projet. Et d'autres mots, le constructeur est privé, ce qui veut dire qu'on ne peut en aucun cas appeler "new" sur la classe pour obtenir de multiples copies. Comme la méthode est statique, il n'y a pas d'instance à manipuler, on ne fait que la récupérer.

Voici un gabarit de base de la structure du singleton sur lequel on pourra développer :

class Singleton{
private static $_instance = false;

private function __construct(){
echo 'chargement des valeurs par défaut';
}

public static function getInstance(){
if( self::$_instance === false ){
self::$_instance = new Singleton();
}

return self::$_instance;
}
}
Déclaration statique ou non ?
  • la classe ne doit pas être déclarée statique
  • la propriété $_instance doit être statique
  • la méthode getInstance() doit être statique
Dans la classe, la propriété $_instance conservera l'instance unique de l'objet. C'est pour cette raison que dans la fonction getInstance() vérifie si l'objet est initialisé, autrement une instance de la classe Singleton sera créée et conservée dans cette variable.

En rendant le constructeur privé, on empêche la classe d'être instanciée à l'extérieur de l'objet. Autrement dit, l'objet peut être créé uniquement à l'intérieur de lui-même.

La ligne suivante provoquera une erreur du type "Call to private Singleton::__construct() from invalid context..." :
$obj = new Singleton();
Pour récupérer l'instance de l'objet singleton, on devra utiliser :
$obj = Singleton::getInstance();
Mise en garde
Avant d'utiliser ce gabarit de conception, assurez-vous de réfléchir adéquatement à son application. Je vous suggère une lecture complémentaire très pertinente sur l'utilisation des singletons : Êtes-vous atteint de singletonite ?


Tags: PHP

vendredi 28 août 2009

Modèle de Go Kart en batmobile !

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

Comme c'est vendredi, j'ai décidé de mettre de côté le sujet que j'avais prévu parler pour le remplacer par quelque chose de moins technique, plus léger, qui terminera bien la semaine.

Vous adorez la course automobile et le super-héros Batman ? Vous rêvez de conduire la plus récente version de la batmobile (celle qui apparaît dans Batman Begins et The Dark Knight) ?



Si vous avez l'âme d'un garagiste, vous pouvez vous procurez les plans de go kart de la batmobile sur eBay (vendus par tully712 pour la modique somme d'une trentaine de dollars américains ) et construire votre réplique suivant le populaire principe DIY (Do It Yourself). Visitez T-man's karts pour plus de détails.



Vous pourrez connaître tous les détails techniques et l'historique de la batmobile sur la page qui lui est consacrée sur Wikipedia.

Dommage qu'il n'existe pas de réplique de la DeLorean de BTTF, je me serais volontier porté acquéreur. Par contre, j'ai trouvé le site bttfdelorean.com qui vend tous les accessoires nécessaires pour convertir votre DeLorean en authentique véhicule à voyager dans le temps. Vous pouvez aussi tenter d'intégrer un convecteur temporel à votre Hyundai Pony pour approximativement 400$ ou encore, pour ceux qui disposent d'un budget limité, simplement acheter un t-shirt à l'image du 1.21 gigawatts (6$)!


Tags: Humour, Le coin du geek

jeudi 27 août 2009

SQL Inject Me

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

Je viens à l'instant d'installer l'extension Firefox SQL Inject Me, créé par la compagnie Security Compass, qui sert à tester les vulnérabilités d'une page web au SQL injection. Cet outil fait parti de la suite Exploit Me qui comprend aussi un testeur contre le XSS et les accès aux ressources (ce sont toutes des extensions indépendantes pour Firefox).

L'extension SQL Inject Me permet de soumettre un jeu de tests pré-construit pour voir comment le site réagira. Si la programmation présente des faiblesses, on apercevra les résultats des erreurs 500, l'état des redirections, etc. Dans mon cas, j'ai testé le formulaire de login d'un CMS en ASP pour voir ce que ça dénicherait (beaucoup de sites en ASP sous IIS présentent des lacunes en sécurité; ce sont habituellement les plus vulnérables, les plus bavards et les plus faciles à infiltrer) :


(cliquez pour agrandir)

Ce que j'ai appris ? Qu'il ne fallait entrer que la chaîne 1' OR '1'='1 dans le champ nom d'usager et mot de passe, ou encore uniquement ' OR username IS NOT NULL OR username = ' dans le champ du nom d'usager pour réussir à me connecter à l'interface de gestion du site web. Et j'ai accès à absolument tout!

Heureusement pour eux, je ne suis pas du genre à profiter de l'opportunité pour saccager leurs données. Tout ce qui m'intéresse, c'est de tester les vulnérabilités existantes et savoir comment les corriger. Mieux vaut apprendre les techniques de SQL injection si on veut être en mesure d'implémenter correctement le code qui permet de les éviter.

C'est dommage pour les développeurs et leurs clients car ils courent un risque énorme puisque leur plateforme centrale est utilisée pour gérer les données de nombreux sites... Qui sait, le prochain à y pénétrer sera peut-être plus mal intentionné que moi ?


Tags: Extensions Firefox, Sécurité

mercredi 26 août 2009

Désastres de Photoshop

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

Tout à l'heure, en parcourant les nouvelles sur Digg, je suis tombé sur un article du site engadget.com intitulé Microsoft sucks at Photoshop qui démontre que la compagnie a utilisé la photo originale du site américain et l'a modifiée pour son site polonais en substituant dans la photo le visage de l'homme noir pour celle d'un blanc. Certains crient déjà au racisme.



Suite à la controverse, Microsoft a fait changer l'image retouchée pour remettre l'originale. Le plus drôle dans toute cette histoire : regardez la main de l'homme blanc au centre. Oui, elle est toujours noire (cliquez sur l'image pour l'agrandir). Au moins, si vous souhaitez retoucher une photo, faites le comme il faut!

Si vous avez l'oeil pour détecter les anomalies de ce genre, vous apprécierez le blogue PsD - Photoshop Disasters qui recense des centaines d'exemples aussi curieux.


Tags: Humour

mardi 25 août 2009

Recherche dans le code DDL de PostgreSQL

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

Ce matin, je devais changer le nom d'un champ dans une table de la base de données d'un projet PostgreSQL pour qu'il soit plus représentatif du rôle qu'il occupait. J'ai aisément pu remplacer les références dans le code source PHP (find/replace) mais pour ce qui était des fonctions PL/pgSQL, comment trouver les fonctions qui utilisent ce champ dans le code ? Pour moi, c'était hors de question de les ouvrir une par une ! Il devait bien exister un moyen plus simple...

J'ai jeté un oeil à la documentation pour trouver une piste de solution et j'ai dirigé mes recherches vers les tables systèmes, toutes préfixées par "pg_". La solution se trouve ici :

  • La table pg_proc contient les définitions de fonctions
  • Le champ proname est la colonne qui contient le nom de la fonction
  • Le champ prosrc contient le corps / code de la fonction
Donc pour lister les noms des fonctions qui possèdent ce texte dans le code plpgsql, une simple requête SQL suffit :
SELECT proname
FROM pg_proc
WHERE prosrc ILIKE '%bout de code%'
ORDER BY proname
Voilà une économie de temps substantielle qui m'a permis de passer à des problèmes plus stimulants.


Tags: PostgreSQL

lundi 24 août 2009

Mémoire virtuelle à l'aéroport

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

À l'aéroport, en voulant vérifier le statut de mon vol, je suis tombé par hasard sur cet écran :

Windows - Virtual Memory Minimum Too Low
Your system is low on virtual memory. Windows is increasing the size of your virtual memory paging file. During this process, memory requests for some applications may be denied. For more information, see Help.



Heureusement, ce n'était pas à l'intérieur de l'avion :-)

Quelqu'un est au courant de quel genre de système d'exploitation utilisent les avions ? Je suis curieux alors si quelqu'un travaille en aéronautique et pourrait m'informer à ce sujet, faites le moi savoir.

Dans le même ordre d'idée, j'ai trouvé cet article très drôle : If Operating Systems Ran The Airlines...


Tags: Curiosités

dimanche 23 août 2009

Schtroumpf programmeur

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

Je ne sais pas exactement pourquoi, mais la plupart des programmeurs que je connais possèdent sur leur bureau un artéfact, généralement un jouet, qui sert d'inspiration ou qui témoigne de leur personnalité.

Dans mon cas, c'est schtroumpf programmeur qui trône fièrement sur la surface de mon bureau. Je ne croyais pas que les habitants des champignons étaient si avant-gardistes! Par contre, je dois souligner qu'ils n'utilisent pas le même type de disposition des touches que nous (QWERTY ou AZERTY). En effet, il semblerait qu'ils préféreraient le ADFGHJKLÖÄ.

Pire encore, leur clavier ne possède même pas de touche pour la lettre "S", ce qui rend impossible l'écriture de leur nom (Schtroumpf ou Smurf) !


Au moment de l'achat, la version avec l'écran CRT était aussi disponible mais je trouvais que ça faisait un peu trop "old school" :


J'en profite pour informer les cinéphiles qu'il y aura un film en 3D intitulé The Smurfs qui devrait sortir vers la fin de 2010.


Tags: Le coin du geek

Citation no. 44 sur l'échec

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

Je n'ai pas échoué. J'ai simplement trouvé 10 000 solutions qui ne fonctionnent pas.

- Thomas A. Edison


Tags: Citations

samedi 22 août 2009

Wez's Evil Shell

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

Vous aimez les workspaces de Linux mais ça vous manque dans votre environnement Windows ? Vous cherchez un remplacement simple au bureau de Windows et appréciez le style de la barre des tâches de Mac OS ? Il existe un compromis léger et gratuit : le Wez's Evil Shell.

Compatible avec XP et Windows Server 2003, ce petit gratuiciel permet de remplacer la barre des tâches de Windows, le menu Démarrer et le system tray pour en faire une version moins gourmande en ressources système que ce qu'utilise explorer.exe.

Le bureau devient très épuré : aucun icône en arrière plan, une barre des tâches minimale, incluant les applications dans le "quick launch", l'horloge et le system tray. En revanche, vous aurez accès à 4 espaces de travail (workspaces) qui peut être configuré pour en avoir jusqu'à 32! Utilisez le raccourci ALT-F1 à F4 pour basculer de un à l'autre.

La combinaison de touches Windows-R lancera l'équivalent de "Run" ainsi qu'un chercheur d'applications. Win-E ouvrira un explorateur de fichiers alors que Alt-TAB permet de changer d'application avec un visualiseur de fenêtre (preview). De plus, un très utile gestionnaire pour Putty est intégré.

Une fois l'installateur terminé (à peine 1 Mo), vous devrez redémarrer ou vous déconnecter pour que l'application prenne effet et remplace le bureau de Windows.

Personnellement, j'ai très confiance en la fiabilité et la stabilité de ce module car il a été développé par Wez Furlong, le créateur de PDO (PHP Data Object). Vous verrez que ce n'est pas évident à s'habituer au début mais le jeu en vaut la chandelle.


Tags: Coffre à outils

vendredi 21 août 2009

Valeur par défaut dans une procédure stockée

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

Dans SQL Server, dès le moment où j'ai découvert les procédures stockées, je n'ai plus jamais été capable de m'en passer. Imaginez deux applications, une basée web, l'autre un exécutable Windows. Plutôt que de coder la logique de l'application dans chaque instance, on la centralise directement dans la base de données. Poussées à l'extrême, les structures des applications consistent presque uniquement en des appels aux procédures.

Dans SQL Server, le langage utilisé pour coder des procédures porte le nom de T-SQL (pour Transact-SQL). La syntaxe de base est :

CREATE PROCEDURE dbo.proc_name
-- paramètres ici
AS
-- code T-SQL ici
Au moment de l'appel, on s'y prend en préfixant le mot clé EXEC avant le nom de la procédure (sans parenthèses pour englober les arguments). Le terme "dbo" indique le database owner de l'objet.
EXEC dbo.proc_name 1, 'test', 0
Cette procédure prend 3 paramètres en entrée mais il existe un moyen pour les rendre optionnels. Ainsi, on pourrait aussi faire les appels suivants (il s'agit de la même fonction, contrairement à PostgreSQL qui permet des fonctions du même nom avec un nombre différent de paramètres) :
EXEC dbo.proc_name 1, 'test'
EXEC dbo.proc_name 1

-- et sans aucun paramètre
EXEC dbo.proc_name
Pour y arriver, on doit indiquer des valeurs par défaut au moment de déclarer les paramètres. Plutôt que d'avoir une définition comme celle-ci :
CREATE PROCEDURE dbo.proc_name
@param1 INT,
@param2 VARCHAR(50),
@param3 BIT
AS
PRINT @param1
PRINT @param2
PRINT @param3
GO
On remplacera l'entête par :
@param1 INT = 100,
@param2 VARCHAR(50) = 'Kaamelott',
@param3 BIT = 1
La fonction PRINT permet d'imprimer le contenu sans l'envoyer par la sortie standard (un recordset, le return value ou un output parameter).

Mais que faire si dans certains cas, c'est le deuxième paramètre qu'on ne veut pas fournir ? Rien de plus simple, on utilisera le mot clé DEFAULT qu'on écrira à la position du paramètre qu'on veut utiliser la valeur par défaut (ici 'Kaamelott').
EXEC dbo.proc_name 77, DEFAULT, 0
Dans le pire des cas, on pourrait sans doute faire ceci, même si ce n'est pas très utile :
EXEC dbo.proc_name DEFAULT, DEFAULT, DEFAULT


Tags: SQL Server

jeudi 20 août 2009

Ubuntu 9.04 démarre en 7.83 secondes

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

Ça faisait un bout de temps que je n'avais pas lu l'excellent blogue de Matt Cutts (ingénieur chez Google) alors je suis allé y jeter un oeil pour voir ce que j'avais manqué dans les derniers mois.

OMG! Il s'est payé du luxe : un Solid-State Drive (SSD) Intel X25-E Extreme, le nec plus ultra des disques durs SSD (rien de mécanique, juste des puces). Juste pour vous donner une idée, TigerDirect.ca en vend de taille 32 Go pour 594$ canadiens.

Il a fait le test d'installer Ubuntu sur une partition Ext4, de le démarrer et de chronométrer le temps qu'il prend pour charger... Voyez le clip vidéo :



Voyez l'article original publié en avril dernier. Vous pouvez aussi visionner ses autres vidéos sur le channel Matt Cutts sur YouTube. Par exemple, il a connecté une Wii Balance Board sur Linux et vérifie le calibrage à l'aide d'un programme Python :-)


Tags: Linux

mercredi 19 août 2009

Securing PHP Web Applications

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

Je viens de compléter la lecture le livre Securing PHP Web Applications, par les auteurs Tricia Ballad et William Ballad, publié en 2009 chez Addison-Wesley.

Au fil des pages, j'avais constamment deux impressions : soit il était question de sujets pertinent que j'avais rarement vu ailleurs, soit je voyais des évidences qu'on aurait pu se passer, le pire étant probablement des imprimés d'écrans où on montre l'endroit exact où cliquer pour télécharger telle application. Peut-être est-ce à cause de l'expérience des auteurs à avoir écrit des livres "For Dummies" ?

Il reste que c'est quand même positif dans l'ensemble. On peut lire sur les appels aux fonctions systèmes par PHP, les permissions, le buffer overflow, la validation des paramètres (je le répète tout le temps, un must!), un cours de regexp 101, créer un API pour isoler les risques (j'ai utilisé celle-là dans un récent projet), l'encryption, les sessions, etc. C'est aussi là que j'ai connu l'application CAL9000, où j'ai pu avoir des renseignements pertinents sur le cross-site scripting, du moins, plus que dans cet ouvrage car il en compte à peine que 3 pages!

J'ai aussi trouvé qu'il avait un penchant sur Windows (SQL Server, IIS), même si on parle un peu d'Apache et MySQL. Voyons-y une tentative d'être équitable, même si le second est de loin plus populaire.

À la fin du livre, le passage m'a fait sourire, soit celui où ils font mention de la révision du code par les pairs comme bon moyen critique. C'est effectivement un excellent moyen de prendre le poul sur le fruit de notre travail et les suggestions d'améliorations des autres membres de l'équipe. Justement cité dans ce chapitre, j'ai été témoin plus souvent qu'à mon tour d'une des pires méthodes, soit de demander au "Yes Man", où un programmeur demande à un ami qui l'approuvera à coup sûr plutôt que d'affronter la critique. Comme quoi on demande toujours à ceux qui pensent pareil comme nous!

Dans l'ensemble, je lui accorde la note B.


Tags: Livres

mardi 18 août 2009

Caractère ? dans une regex

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

Petite note à moi-même concernant le caractère ? dans les expressions régulières :

Dans une regex, on sait que le modificateur ? rend le caractère ou le sous-ensemble précédent optionnel. Par exemple, on a qu'à penser à http(s)? au début d'un URL.

D'un autre côté, si on veut faire correspondre le caractère ?, on doit l'échapper avec un backslash (\?). C'est la règle pour tous les méta-caractères qui ont une signification dans la rédaction d'une expression régulière (.$?*+, etc).

Un double ? (??) rend l'expression lazy. C'est exactement comme le ? sauf que le caractère optionnel sera exclut de la correspondance, sauf si la chaîne ne correspond pas sans lui. Ainsi, pour l'adresse : https://www.desjardins.com/, le pattern https? reconnaîtra "https" alors que https?? se contentera de "http".


Tags: Programmation

lundi 17 août 2009

Captain Crunch

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

Présentation d'un personnage mythique : Captain Crunch. Pas la mascotte des boîtes de céréales, mais un hacker ingénieux qui a su utiliser, en 1971, un jouet distribué dans une boîte à déjeuner et devenir un "phone hacker". Son vrai nom : John Draper.

Il avait découvert que le jouet en question, un sifflet, pouvait être facilement modifié pour reproduire la fréquence de 2600 hertz (Hz) que faisaient la tonalité des téléphones dans le réseau AT&T pour indiquer qu'une ligne était disponible pour transmettre un nouvel appel. Ainsi, il réussit à placer des appels longue distance à travers le monde et ce, gratuitement.

Il fût découvert et arrêté lorsque le Esquire Magazine fît mention de la technique qu'il utilisait. Il obtîent une peine de 5 ans de probation pour fraude téléphonique.

Faits à noter :

  • il a travaillé brièvement chez Apple et AutoDesk (AutoCAD)
  • il a développé le premier éditeur de texte pour le Apple II, EasyWriter
  • on note une référence à Captain Crunch dans le film Cowboy Bebop


Tags: Saviez-vous que

dimanche 16 août 2009

Connaissez-vous vos ports TCP ?

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

À titre de référence, savez-vous quels sont les ports TCP par défaut des applications et protocoles suivants : HTTP/www, FTP, SSH, Telnet, SMTP, SQL Server, MySQL, PostgreSQL ?

Voici les réponses :

HTTP/www : 80
FTP : 21
SSH : 22
Telnet : 23
SMTP : 25
SQL Server : 1433
MySQL : 3306
PostgreSQL : 5432

Je me suis moi-même posé la question car je ne les connaissais pas tous. Si ça vous intéresse, j'ai trouvé une liste qui répertorie les numéros de ports sur le site de IANA.

Maintenant, si vous souhaitez connaître les ports utilisés par les applications sur votre machine Windows, vous devrez :

  • ouvrir un invite de commande
  • lancer la commande suivante : netstat -ano
  • vous verrez la liste de tous les ports et leur statut
  • remarquez la dernière colonne : PID
Pour savoir à quel application ça correspond, vous devrez comparer le Process Identifier (PID) avec ceux inscrits dans le Task Manager de Windows :
  • Menu Start / Run / taskmgr (ou le raccourci CTRL+Shift+ESC)
  • Rendez-vous à l'onglet Processes
  • Cliquez sur le menu View / Select Columns
  • Choisissez PID / OK
Il ne vous restera plus qu'à comparer les colonnes et voir la correspondance. Par exemple, sur mon poste, je retrouve le PID 1832 qui correspond dans le Task Manager à filezilla.exe. Le port est indiqué après l'adresse IP de la colonne Foreign Address : xx.xx.xx.xx:21.


Tags: Saviez-vous que

Citation no. 43 sur l'optimisation

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

If you optimize everything, you will always be unhappy.

- Donald Knuth


Tags: Citations

samedi 15 août 2009

Récupérer une séquence, équivalence PostgreSQL vs MSSQL

Publié par Infinite Loop, à 12 h 44 0 commentaire

Dans une fonction PostgreSQL ou une procédure stockée SQL Server, c'est assez commun de devoir récupérer la séquence courante suite à l'insertion d'un enregistrement. La plupart du temps, c'est pour la retourner comme valeur de retour ou encore pour s'en servir pour insérer des enregistrements dépendants dans une base de données modélisée en forme normale 3FN.

Juste pour vous situer, c'est comme dire qu'on doit conserver la trace d'un message et la liste des destinataires dans deux tables séparées. On récupérera l'ID du message pour ensuite l'utiliser dans l'insertion des destinataires, selon une relation 1 à plusieurs.

L'important, c'est de s'assurer que l'ID principal correspond à la bonne insertion. Si on faisait quelque chose comme ceci (pseudo-code) :

INSERT INTO messages (...) VALUES (...);

-- conserver max(message_id) dans une variable
SELECT MAX(message_id) FROM messages);

INSERT INTO recipients (message_id, email)
VALUES ($id, 'lui@hotmail.com');

INSERT INTO recipients (message_id, email)
VALUES ($id, 'elle@hotmail.com');
Il y aurait de fortes chances pour que quelqu'un d'autre ait au même moment inséré un autre message, ce qui aurait pour conséquence qu'on récupérerait le mauvais ID.

Pour s'assurer qu'on récupère le bon, mieux vaut l'englober dans une procédure stockée. Avec SQL Server, immédiatement après l'insertion principale (message), on peut appeler la fonction T_SQL scope_identity() qui retournera le dernier ID inséré dans n'importe quelle table pour la session courante, selon la portée de la fonction/procédure/trigger qui l'appelle. D'où l'importance de l'appeler immédiatement après l'insertion.
DECLARE @id integer

INSERT INTO messages (...)
VALUES (...);

SET @id = SCOPE_IDENTITY()

INSERT INTO recipients (message_id, email)
VALUES (@id, 'lui@hotmail.com');
Mais faites attention car il existe aussi @@identity mais celui-ci n'est pas limité à la portée.

Avec PostgreSQL, on fait la même chose dans une fonction. Cependant, comme les séquences sont nommées, on les récupère avec la fonction currval() qui prend comme paramètre le nom de la séquence. Ici, il n'y a pas d'ambiguité, c'est la valeur courante qui est retournée.
DECLARE id integer;

INSERT INTO messages (...) VALUES (...);
id := currval('nom_de_la_sequence');

INSERT INTO recipients (message_id, email)
VALUES (id, 'lui@hotmail.com');
En utilisant cette technique, ça vous évitera de devoir chercher les incohérences dans l'intégrité de vos données.

Finalement, je ne suis pas très connaisseur de MySQL mais je crois que son équivalent est la fonction last_insert_id(). Cependant, il faut faire attention si on insère en batch : la fonction de MySQL retournera l'ID du premier élément inséré dans la batch tandis que scope_identity() de MSSQL retournera le dernier.


Tags: PostgreSQL, SQL Server

vendredi 14 août 2009

Autre source d'icônes

Publié par Infinite Loop, à 12 h 44 0 commentaire

Je vous avais déjà glissé un mot sur la librairie d'icônes FamFamFam.com et pourtant, il y avait un site plus complet que j'avais complètement oublié : IconFinder.net.

Ce moteur de recherche d'icônes en compte au delà de 100 000, disponibles en .png et .ico. Les licences varient selon les auteurs donc veuillez lire attentivement les termes d'utilisation.

Les contributions sont regroupées par ensembles qui respectent une uniformité. On y trouvera : icônes standards, drapeaux, fichiers, applications, cartes de crédit, icônes haute définition, réseautage social, utilisateurs, avatars, finance, Gnome & KDE, halloween, iPhone, émoticons, Mac, Oxygen, Type Polaroid, Vista, RSS, Shopping Cart, Timbres, Météo, Twitter, Fureteurs web, autres thèmes...



Tag cloud créé à l'aide du générateur wordle.net.


Tags: Intégration

jeudi 13 août 2009

Prévenir le vol d'images

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

Certaines personnes amateures qui programment des sites web ont la fâcheuse tendance à faire des "hotlinks" sur des images qui proviennent de d'autres sites. Non seulement ce n'est pas très professionnel envers le travail original des auteurs, mais au moins, s'ils avaient pris la peine de les copier et les héberger sur leurs serveurs, ça n'utiliserait pas la bande passante des sites originaux.

Bien qu'on ne puisse pas les empêcher de les copier (le JavaScript qui contraint le right click de la souris n'est pas une protection valable!), on peut prévenir le vol d'images en écrivant une règle dans le fichier .htaccess qui validera que les images sont sur le même serveur qui tente de les afficher. Assurez-vous d'abord que mod_rewrite est installé sur Apache.

RewriteEngine On
RewriteCond %{HTTP_REFERER} !^$
RewriteCond %{HTTP_REFERER} !^http://(.+\.)?domaine\.com(/)?.*$ [NC]
RewriteRule .*\.(gif|jpe?g|png)$ - [F,NC]

Testez cette configuration et jetez un oeil aux requêtes HTTP (Firebug ou Live Http Headers), vous devriez voir la demande pour obtenir l'image et la réponse du serveur distant : 403 Forbidden (déclenché par [F] à la dernière ligne).

Sinon, vous pouvez aussi choisir l'option d'envoyer une autre image de votre serveur à la place de celle demandée, un peu en guise d'avertissement (par exemple "Merci de ne pas voler cette image". Allez-y avec votre bon jugement.). Cette technique est moins recommandée car elle sollicitera quand même votre bande passante, ce qu'on souhaite éviter.

RewriteEngine On
RewriteCond %{HTTP_REFERER} !^$
RewriteCond %{HTTP_REFERER} !^http://(.+\.)?domaine\.com(/)?.*$ [NC]
RewriteRule \.(gif|jpe?g|png)$ /images/ne-pas-voler.jpg [L,NC]

Pour ceux moins familiers avec mod_rewrite, voici une petite légende pour vous aider à comprendre les flags entre crochets.

NC : No Case - Insensible à la casse
F : code HTTP 403 forbidden
L : last rule - Dernière règle à appliquer


Tags: Apache

mercredi 12 août 2009

Prévenir les attaques de fixation de session

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

Le protocole HTTP est "stateless" ce qui veut dire que si on veut retenir certaines informations sur l'utilisateur alors qu'il navigue entre plusieurs pages, on doit créer une session. Celle-ci peut être la cible d'attaques pour pouvoir usurper l'identité du visiteur connecté et se faire passer pour lui en lui "volant" sa session.

Dans un site programmé en PHP, tous les utilisateurs sont vulnérables s'il utilise seulement session_start(). Si le hacker est capable de récupérer l'ID de votre session active, il pourra l'utiliser en l'initialisant par la querystring (page.php?PHPSESSID=identifiant).

Pour contrer cette vulnérabilité, on peut utiliser la fonction built-in de PHP session_regenerate_id() qui génère un nouvel identifiant de session lors de la vérification de l'initialisation.

session_start();

if( !isset($_SESSION['initialized']) ) {
session_regenerate_id();
$_SESSION['initialized'] = true;
}
Si, comme moi, vous montez vos projets avec Zend Framework, vous préférerez certainement le composant Zend_Session :
$defaultNamespace = new Zend_Session_Namespace();

if( !isset($defaultNamespace->initialized) ) {
Zend_Session::regenerateId();
$defaultNamespace->initialized = true;
}
À la fin, assurez-vous aussi de détruire la session, que ce soit par un mécanisme de déconnexion ou par une expiration forcée par le serveur (voir php.ini ou ini_set).
# PHP
session_destroy();

# ZF
Zend_Session::destroy();


Tags: PHP, Sécurité, Zend Framework

mardi 11 août 2009

Engins de recherche reliés à la programmation

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

Savez-vous qu'on peut configurer la case de recherche de Firefox (coin supérieur droit) ? Trop souvent, je me contentais d'utiliser la recherche par défaut de Google pour toutes mes requêtes, sinon, j'avais des toolbars qui comprenaient chacune une boîte de recherche spécifique (Zend Browser & Google). J'ai finalement décidé de m'en débarasser pour les remplacer par les extensions pour Firefox qui se sont avérées plus pratiques à mes besoins (et surtout moins achalant visuellement).

J'ai dressé une liste de quelques extensions pratiques qui permettent de fouiller dans la documentation officielle de différents langages et outils reliés à la programmation.

Manuels pour langages de programmation :

  • PHP
  • Perl
  • Python
Bases de données
  • MySQL
  • Manuel SQL pour Oracle
Autres
  • jQuery
  • Zend Framework
  • MSDN (par l'intermédiaire de Google)
Firefox et Internet Explorer respectent un standard OpenSearch donc on peut ajouter des plugins aux deux fureteurs sans problème. Vous pourrez aussi faire comme moi et créer vos propres engins de recherches (par exemple PostgreSQL) en utilisant le projet Mycroft de Mozdev.org qui vous guidera pas à pas dans la création de l'extension (le résultat sera un fichier XML).


Tags: Extensions Firefox

lundi 10 août 2009

Liste des mots de passe des routeurs

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

Votre routeur sans fil détecte le réseau d'un voisin ? On peut presque vous considérer chanceux si celui-ci n'est pas sécurisé, vous pourriez lui emprunter. Sinon, il y a de fortes chances pour qu'il soit encore configuré avec le mot de passe par défaut de l'usine.

On sait que des listes de mots de passe par défaut de routeurs existent sur le web (celle-ci n'est pas tout à fait mise à jour puisqu'elle date de 2008). Ainsi, les mots de passe les plus populaires sont "admin", "password", "linksys," "default," "Wireless," "NETGEAR," "belkin54g"...

Je ne vous suggère pas d'endoser ce genre de pratiques, surtout que ce n'est pas très éthique ni légal, je dis seulement que ça existe. Surtout si vous souhaitez conserver des bonnes relations de voisinage!

D'un autre côté, réfléchissez plutôt à ceci : le voisin en question, c'est peut-être vous! Vous êtes sujet à ce type d'escroquerie où vos voisins mal intensionnés peuvent emprunter votre bande passante, pour finalement vous ramasser avec une facture salée à la fin du mois.

Alors pensez donc à changer le mot de passe de votre routeur sans fil. Oh, et profitez en pour changer le mode d'encryption WEP pour WPA ou WPA2! De nos jours, WEP peut facilement être craqué.


Tags: Sécurité

dimanche 9 août 2009

Citation no. 42 sur le passé

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

Those who cannot remember the past are condemned to repeat it.

- George Santayana, Life of Reason


Tags: Citations

Lire un fichier continuellement avec less

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

J'étais connecté à un serveur avec putty car je devais lire en temps réel le fichier de log d'une application. Au lieu de le fermer et le réouvrir pour voir le contenu s'ajouter, l'administrateur réseau m'a conseillé ce truc avec less pour pouvoir lire le fichier continuellement. Chaque fois que du contenu y est ajouté à la fin, la page est rafraîchie automatiquement.

  • ouvrir un terminal
  • démarrer le programme "less" en indiquant le nom du fichier :

    less mytextfile

  • une fois le contenu du fichier affiché, faites la combinaison des touches SHIFT+F
  • au bas de l'écran, vous verrez apparaîtrela mention "Waiting for data... (interrupt to abort)"
  • dès que du contenu sera ajouté, vous devriez voir les données se rafraîchir
  • pour sortir de ce mode, faites CTRL+C
Maintenant, si vous n'avez pas de fichier de log à votre disposition, vous pouvez le simuler pour constater son fonctionnement.
  • Préparez d'abord un premier terminal avec less tel que décrit plus haut.
  • Démarrez en un deuxième qui servira à ajouter des lignes dans le fichier de log
  • Disposez des fenêtres de façon à les voir simultanément
  • Dans la deuxième, entrez la commande suivante pour insérer du texte à la fin du fichier :

    echo ligne 1 >> mytextfile
Observez la première fenêtre avec less et notez le changement.


Tags: Linux

samedi 8 août 2009

Redémarrer et éteindre un ordinateur à distance

Publié par Infinite Loop, à 10 h 14 1 commentaire

Ça m'arrive de temps en temps de travailler de la maison. En me connectant au réseau VPN du bureau, je lance ensuite Remote Desktop (Windows) et j'accède à mon poste comme si j'étais sur place.

En semaine, les employés ont tendance à laisser leurs postes ouverts mais la directive interne de l'entreprise est qu'on doit les fermer durant la fin de semaine.

Exceptionnellement, durant un weekend, j'ai eu à appliquer une mise à jour sur l'application web d'un client. J'ai donc laissé mon poste ouvert pour pouvoir y accéder à distance. Lorsque le travail fût terminé, j'ai voulu fermer mon PC mais le menu Démarrer de Windows n'affichait plus l'option pour redémarrer ou fermer l'ordinateur. À la place, c'était remplacé par "Fermer la session".

Sans surprise, la combinaison de touches CTRL-ALT-DELETE lançait la fenêtre du gestionnaire des tâches de mon PC local. Alors quelles sont les alternatives pour lancer la même commande sur un PC distant ?

D'abord, on peut le faire par un autre raccourci clavier : CTRL+ALT+END. Celle-ci fait afficher la fenêtre de Sécurité de Windows et l'option pour Arrêter ou redémarrer l'ordinateur distant est présent.

Sinon, par l'invite de commande :

Éteindre
shutdown -s

Redémarrer
shutdown -r


Tags: Saviez-vous que

vendredi 7 août 2009

Internet Explorer et JPEG CMYK

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

Récemment, un de nos clients nous a téléphoné en panique pour se plaindre qu'il avait placé des images sur son site web à l'aide du CMS (Content Management System) que nous avions programmé, et qu'il soupçonnait un bogue car il ne les voyait pas en ligne.

Suite à quelques recherches, nous avons constaté que les images étaient bien sur le serveur, qu'elles apparaîssaient correctement dans Firefox mais qu'Internet Explorer refusait de les afficher. C'est en ouvrant les images dans Photoshop que nous avons compris pourquoi : elles étaient sauvegardées en mode CMYK et Internet Explorer est incapable de les interpréter.

Normalement, elles auraient dû être enregistrées en mode RGB (Red-Green-Blue), mieux adapté pour le web car le CMYK (Cyan-Magenta-Yellow-Black) est un procédé généralement réservé à l'impression.

Un autre point à savoir, c'est que l'engin de rendu d'IE est aussi intégré dans d'autres applications de Microsoft, comme Outlook par exemple, où on retrouvera le même problème. Donc mieux vaut enregistrer ses images en RGB pour le web.

Contrairement à Photoshop, l'éditeur d'images GIMP manque de support CMYK. Le plugin Separate offre une solution partielle au problème.


Tags: GIMP, Intégration

jeudi 6 août 2009

Imiter des fonctions Prototype en jQuery

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

jQuery est vraiment agréable à utiliser mais pour avoir expérimenté Prototype en premier, il y a quelques petits points dont je m'ennuie :

1. Énumérables

Dans jQuery, ce n'est pas tout à fait au point. Pour combler le manque, j'ai déniché une librairie qui permet d'étendre le framework sur les énumérables, en s'inspirant par ce qu'offre Prototype, pour y ajouter les fonctions all, any, inject, invoke, min, max, partition, pluck, reject, randomize, etc.

2. Create Class

Pour créer des classes OOP en Prototype, on utilise l'objet Class. Cette librairie s'inspire de cet objet et en crée une version semblable pour jQuery : Class-0.0.2.js.

3. DOM Builder

Avec Prototype, j'aimais particulièrement créer des éléments dynamiques dans la page à l'aide du DOM Builder.

new Element('input', { id: "searchBox", name: "q", value: "keywords" });

Pour jQuery, j'ai vu trois plugins qui font l'équivalent sans toutefois être aussi simples d'utilisation : HSJN, HAML-JS et Dom Builder.

Quelqu'un a quelque chose de mieux à proposer ?


Tags: JavaScript

mercredi 5 août 2009

Code 18 de ma blonde !

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

À l'instant, ma copine a décidé d'utiliser l'ordinateur portable pendant que j'étais sur le PC. Je lui ai conseillé de le brancher à la prise murale du salon pour le recharger car je savais que la batterie était faible.

Quelques minutes plus tard, elle m'informe qu'il s'éteint automatiquement. Serait-ce Windows 7 qui commence déjà à faire des siennes ? Pourtant, on appuyait sur le bouton de démarrage et les lumières s'allumaient momentanément, pour étouffer à nouveau. J'ai craint une panne ou une défectuosité dans mon laptop flambant neuf...

Jusqu'à ce que je réalise que bien qu'il soit branché au mur, il était connecté à la prise raccordée à l'interrupteur de la lumière du hall d'entrée qui elle, était éteinte.

J'ai fait basculer l'interrupteur à "on" et voilà, tout est revenu à la normale.

Je sais bien ma belle que tu me lis tous les jours, alors je publie un de tes rares "code 18" ici pour me moquer un peu de toi ;-)

P.s. j'espère ne pas dormir sur le divan ce soir.


Tags: Le coin du geek

Filtres de validation PHP

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

À mon travail, il y a un intégrateur qui montre beaucoup d'intérêt pour la programmation et qui me demande régulièrement conseil, question d'en apprendre un peu sur le tas. Je perçois positivement sa curiosité, mais je sais qu'il finira tôt ou tard par préférer la programmation et les défis qui y sont rattachés (est-ce que je me trompe ?).

Il a voulu relever un petit défi et il a fait une tentative pour écrire un bout de code. Après révision avec lui, je lui ai montré ce truc pour lui faciliter la vie. En fait, c'est directement relié à la validation d'une variable représentant un URL, où il voulait s'assurer que la donnée saisie par l'utilisateur débutait par "http://". Il avait écrit quelque chose en utilisant la fonction strstr() et je lui ai fait remarqué que si le client entrait ceci, ça trouverait quand même la chaîne recherchée.

$var1 = 'http://www.google.com/';
$var2 = 'www.google.com/http://';

echo strstr($var1, 'http://');
echo strstr($var2, 'http://');
Même si je lui avais suggéré d'utiliser une regex, ça aurait peut-être été trop avancé car il commence à peine à apprendre le PHP, c'est beaucoup lui en demander.
$pattern = '/^http:\/\/.*/';
echo preg_match($pattern, $var1);
echo preg_match($pattern, $var2);
En attendant, pour qu'il puisse poursuivre son projet sans devoir faire l'effort d'apprendre un "langage" dans un langage, je lui ai suggéré à la place d'utiliser les filtres de données PHP.

Ce qui est bien avec ce module, c'est qu'il présente tout le nécessaire pour valider ou épurer des données. De plus, plusieurs expressions régulières sont disponibles sous forme de constantes, donc nul besoin de se casser la tête avec une syntaxe supplémentaire.

Pour un URL, il suffit d'utiliser FILTER_VALIDATE_URL tandis que pour la syntaxe d'un courriel, ce sera FILTER_VALIDATE_EMAIL. La fonction retournera la valeur si elle correspond au filtre choisit, sinon false.
$url = 'http://code18.blogspot.com/';
if( filter_var($url, FILTER_VALIDATE_URL) ){
echo 'url valide';
}

$email = 'code18.blogspot@gmail.com';
if( filter_var($email, FILTER_VALIDATE_EMAIL) ){
echo 'email valide';
}
Avec ça, c'est clair et il n'a pas à se casser la tête. De mon côté, par curiosité, j'ai écrit une boucle qui vérifie chaque filtre un après l'autre sur la variable $data pour voir le comportement.
$filters = array(
'default' => FILTER_DEFAULT,
'boolean' => FILTER_VALIDATE_BOOLEAN,
'int' => FILTER_VALIDATE_INT,
'float' => FILTER_VALIDATE_FLOAT,
'url' => FILTER_VALIDATE_URL,
'email' => FILTER_VALIDATE_EMAIL,
'ip' => FILTER_VALIDATE_IP
);

$data = 'http://code18.blogspot.com/';
foreach($filters as $filterName => $filterValue){
echo $filterName . ' = ';
echo filter_var($data, $filterValue, FILTER_REQUIRE_SCALAR) ? 'Valide' : '-';
echo '<br/>';
}
Dans mon exemple, le seul filtre manquant est celui où on peut définir notre propre expression régulière. Je vous ai écrit un extrait reprenant le premier exemple, indenté pour vous aider à visualiser la structure.
$options = array(
'options' =>
array(
'regexp' => '/^http:\/\/.*/'
)
);

echo filter_var($data, FILTER_VALIDATE_REGEXP, $options);
Je vous invite à jeter un oeil aux options possibles, vous serez surpris de voir à quel point c'est complet.


Tags: PHP

mardi 4 août 2009

CAL9000, un outil pour hackers

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

J'ai lu récemment sur cet outil sur lequel j'ai bien l'intention de m'initier davantage, pas que je sois un hacker, mais la sécurité des projets que je développe me tient particulièrement à coeur. Avec les années, j'ai eu la chance de travailler sur des projets de clients de plus en plus prestigieux et je ne voudrais pas avoir sur la conscience une attaque rendue possible par ma négligence (si tel était le cas!).

CAL9000 version 2.0 est une collection d'outils permettant de tester les vulnérabilités d'un site web, par exemple le cross-site scripting (XSS) (Est-ce nommé à l'image du super ordinateur intelligent HAL 9000 dans le livre (et le film) 2001, L'Odyssée de l'espace ? Probablement).

Disponible à partir du site de OWASP.org (Open Web Application Security Project), cette application web-based comprend :

  • un dictionnaire des attaques XSS connues
  • un encodeur / décodeur (différents modes)
  • visualiseur de requêtes et réponses HTTP*
  • un bloc notes
  • cheat sheets (aide-mémoire)
  • outils divers : IP encoder/decoder, string generator, etc
  • checklist : suggestions et conseils
  • AutoAttack : pour construire vos propres attaques HTTP contre vos applications
* Malheureusement, certaines portions ne sont plus à jour car les fureteurs récents semblent bloquer certaines fonctionnalités, par exemple dans l'outil pour obtenir les réponses HTTP. Pour des raisons de sécurité, il n'est plus possible de faire de requêtes XMLHttpRequest vers un site externe (voir la Same Origin Policy).

Tout comme ses auteurs, je n'insisterai jamais assez pour dire que vous DEVEZ utiliser les connaissances fournies dans cet outil sur vos propres sites seulement, autrement vous pourriez vous attirer des problèmes.

D'ailleurs, la carte de Monopoly présentée en première page de l'outil web résume bien l'idée : Get Out of Jail, Free.



C'est juste pour dire que c'est à la limite d'être légal, sauf si vous le faites avec l'intention de vous mettre vous-même au défi.

Au moment d'écrire ces lignes, le serveur principal pour le téléchargement affichait une page de GoDaddy. J'ai retrouvé un site de téléchargement alternatif ici. C'est très simple à installer, il suffit de télécharger l'archive .zip (23 Mb), la décompresser dans son serveur web et ouvrir le fichier CAL9000.html. Sinon, j'ai trouvé un serveur live où CAL9000 est installé si vous comptez y jeter un oeil.

Avantage : il est entièrement gratuit
Inconvénient : la dernière révision date de 2006


Tags: Coffre à outils, Sécurité

lundi 3 août 2009

Interpréter du JSON en PHP

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

J'ai appris quelque chose à mes dépens aujourd'hui concernant la notation JSON (JavaScript Object Notation). Vous savez, le genre de situation où on se sent particulièrement imbécile parce qu'on avait la solution sous nos yeux ? Je m'explique.

J'avais l'habitude de représenter les objets sous la forme :

{ key : value }

Ce qui est 100% valide en JavaScript. Cependant, avec l'application web que je suis en train de développer, je devais dans certains cas récupérer l'output JSON à partir de PHP et le décoder à l'aide de la fonction json_decode(). Pour moi, c'était une première. Pourtant, au moment de la lecture, PHP ne reconnaissait rien. Une chaîne de caractère vide!

J'ai lu la documentation, juste au cas où que quelque chose m'ait échappé, et j'ai vu que la fonction prenait un deuxième argument optionnel, false par défaut, ce qui veut dire que le résultat est retourné sous la forme d'un objet.

# sous la forme d'un objet basé sur stdClass
# $obj = json_decode($json);
$obj = json_decode($json, false);

echo $obj->key;

# sous la forme d'un tableau associatif
$as = json_decode($json, true);

echo $as['key'];
J'ai essayé les deux formes, sans succès. Mais la solution s'est finalement présentée. Pour être décodée, la chaîne JSON doit être formatée avec le nom des clés entre guillemets :

{ "key" : value }

Voilà où était le bobo. La magie dans tout ça est que cette notation est valide autant côté client que serveur. Alors à l'avenir, je m'efforcerai de toujours l'écrire de cette façon.

Sur le même sujet, un autre truc que je peux partager avec vous suite à mon expérience concerne les valeurs booléennes. Faites attention comment vous la faites imprimer dans votre objet JSON. Au même titre que la déclaration suivante lance une erreur :
var bool = True;
Le langage JavaScript accepte uniquement les valeurs true / false écrites en minuscules, même à l'intérieur d'un objet JSON :
// refusé
{ "inserted" : True }

// accepté
{ "inserted" : true }
Autrement, ça invalidera la totalité de l'objet et json_decode() ne pourra pas l'interpréter.


Tags: JavaScript, PHP

dimanche 2 août 2009

Gérer les fuseaux horaires en PHP

Publié par Infinite Loop, à 15 h 22 4 commentaires

Une bonne pratique de programmation en PHP est de spécifier pour chaque projet le timezone à utiliser. Pourquoi le faire s'il est déjà configuré par défaut sur le serveur à l'installation de PHP ? D'abord, parce que si le client décide de changer d'hébergeur et que celui-ci se trouve dans un fuseau horaire différent, l'affichage des dates risque de ne plus correspondre à la réalité de l'application. Ensuite, parce que le serveur peut ne pas être dédié, c'est-à-dire qu'il peut être partagé entre plus d'un client qui ne nécessitent pas la même configuration.

Par défaut, mon serveur de développement possède le timezone "America/New_York". Par un pur hasard pour mes besoins, c'est exactement le même que celui de Montréal. On peut connaître la configuration de plusieurs façons :

  1. par la fonction phpinfo(), dans la section Date : Default timezone.
  2. par la fonction date_default_timezone_get() qui retourne la chaine de caractère "America/New_York"
  3. dans certains cas, dans le fichier php.ini, dans la section [Date], à la ligne "date.timezone". Cependant, si cette valeur n'a pas été écrasée à l'installation du serveur, la ligne risque d'être commentée et non interprétée (avec un ; devant)
La configuration dans php.ini correspond à celle du serveur, donc pour tous les projets. On peut la configurer autrement si on sait que la plupart de nos clients se trouvent dans le même fuseau horaire, par exemple au Québec : America/Montreal. Pour le changer, modifiez la ligne suivante dans php.ini :

date.timezone = America/Montreal

Vous pouvez consulter la liste des timezones supportés ici.

À l'intérieur d'un projet, on peut écraser cette configuration en tout temps, soit avec la fonction date_default_timezone_set() ou ini_set().
date_default_timezone_set('America/Montreal');
# ou
ini_set('date.timezone', 'America/Montreal');
En forçant la configuration dans un fichier inclut globalement au projet (donc un require_once dans toutes les pages ou par auto_prepend_file), on s'assure qu'il n'y aura pas de mauvaises surprises dans le futur.

C'est bien de vouloir spécifier le timezone, mais ça peut être ordinaire de placer cette instruction PHP au début de toutes les pages. Si vous n'avez pas besoin de la charger dynamiquement selon l'emplacement de l'utilisateur, l'alternative est d'y aller avec le fichier .htaccess. Il suffit d'ajouter la ligne suivante :

php_value date.timezone America/Montreal

Vous pourrez tester le changement d'heure selon le timezone avec la ligne suivante :
# format 2009-08-02 03:22:20 PM
echo date('Y-m-d h:i:s A');
À noter que si les trois méthodes sont utilisées, le serveur Apache chargera dans l'ordre le fichier php.ini en premier, ensuite il écrasera la configuration par ce qui est indiqué dans .htaccess et il terminera par la configuration server-side en PHP. La dernière configuration trouvée sera celle retenue.


Tags: Apache, PHP

Citation no. 41 sur l'investissement

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

An investment in knowledge always pays the best interest.

- Benjamin Franklin


Tags: Citations

samedi 1 août 2009

Vidéos viraux québécois

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

En ce samedi matin, j'ai décidé de revisiter les classiques des vidéos viraux québécois et d'en dresser une petite liste non-exaustive.

Star Wars Kid
Plus besoin de présentation, tout le monde connaît l'histoire de Star Wars Kid, qui a soulevée débats et questions éthiques. Néanmoins, il y a une leçon à retenir de tout ça : si on ne vaut pas une risée, on ne vaut pas grand chose...



PFK Kid
Cette scène d'anthologie du film Pea Soup de Julien Poulin et Pierre Falardeau (1978) a refait surface sur le web et soulève plusieurs questions, comme par exemple : qui est-il ?



Fidel Lachance

Sa réputation n'est plus à faire, Fidel (pour les intimes) est le signaleur routier / chanteur de country le plus populaire au monde, en Beauce. Cette entrevue à la télé communautaire avec Anita Pouliot l'a mis sur la "map" comme on dit.



Farador
Réalisé par Tom et ses chums, cette parodie du jeu Donjons & Dragons a un brin de réalisme. Vous avez genre mis des G pis des K pour que ça fasse "médiéval"...


Tags: Humour

Messages plus récents Messages plus anciens Accueil
S'abonner à : Messages (Atom)
    Suivre @code18 sur Twitter

    Catégories

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

    Divers

    Archives

    • ►  2015 (6)
      • ►  août 2015 (1)
      • ►  juillet 2015 (1)
      • ►  février 2015 (3)
      • ►  janvier 2015 (1)
    • ►  2014 (8)
      • ►  décembre 2014 (1)
      • ►  novembre 2014 (1)
      • ►  octobre 2014 (1)
      • ►  août 2014 (2)
      • ►  juillet 2014 (2)
      • ►  janvier 2014 (1)
    • ►  2013 (53)
      • ►  décembre 2013 (2)
      • ►  novembre 2013 (1)
      • ►  octobre 2013 (3)
      • ►  septembre 2013 (2)
      • ►  août 2013 (5)
      • ►  juillet 2013 (3)
      • ►  juin 2013 (5)
      • ►  mai 2013 (3)
      • ►  avril 2013 (7)
      • ►  mars 2013 (7)
      • ►  février 2013 (11)
      • ►  janvier 2013 (4)
    • ►  2012 (105)
      • ►  décembre 2012 (8)
      • ►  novembre 2012 (5)
      • ►  octobre 2012 (4)
      • ►  septembre 2012 (1)
      • ►  août 2012 (8)
      • ►  juillet 2012 (7)
      • ►  juin 2012 (7)
      • ►  mai 2012 (10)
      • ►  avril 2012 (13)
      • ►  mars 2012 (15)
      • ►  février 2012 (15)
      • ►  janvier 2012 (12)
    • ►  2011 (146)
      • ►  décembre 2011 (14)
      • ►  novembre 2011 (11)
      • ►  octobre 2011 (12)
      • ►  septembre 2011 (13)
      • ►  août 2011 (15)
      • ►  juillet 2011 (17)
      • ►  juin 2011 (18)
      • ►  mai 2011 (15)
      • ►  avril 2011 (9)
      • ►  mars 2011 (7)
      • ►  février 2011 (3)
      • ►  janvier 2011 (12)
    • ►  2010 (398)
      • ►  décembre 2010 (29)
      • ►  novembre 2010 (28)
      • ►  octobre 2010 (32)
      • ►  septembre 2010 (34)
      • ►  août 2010 (22)
      • ►  juillet 2010 (35)
      • ►  juin 2010 (42)
      • ►  mai 2010 (36)
      • ►  avril 2010 (37)
      • ►  mars 2010 (34)
      • ►  février 2010 (32)
      • ►  janvier 2010 (37)
    • ▼  2009 (429)
      • ►  décembre 2009 (32)
      • ►  novembre 2009 (34)
      • ►  octobre 2009 (33)
      • ►  septembre 2009 (37)
      • ▼  août 2009 (37)
        • 5 sites où acheter des t-shirts en ligne
        • Easter egg dans Python
        • Citation no. 45 sur Perl
        • Créer un singleton en PHP
        • Modèle de Go Kart en batmobile !
        • SQL Inject Me
        • Désastres de Photoshop
        • Recherche dans le code DDL de PostgreSQL
        • Mémoire virtuelle à l'aéroport
        • Schtroumpf programmeur
        • Citation no. 44 sur l'échec
        • Wez's Evil Shell
        • Valeur par défaut dans une procédure stockée
        • Ubuntu 9.04 démarre en 7.83 secondes
        • Securing PHP Web Applications
        • Caractère ? dans une regex
        • Captain Crunch
        • Connaissez-vous vos ports TCP ?
        • Citation no. 43 sur l'optimisation
        • Récupérer une séquence, équivalence PostgreSQL vs ...
        • Autre source d'icônes
        • Prévenir le vol d'images
        • Prévenir les attaques de fixation de session
        • Engins de recherche reliés à la programmation
        • Liste des mots de passe des routeurs
        • Citation no. 42 sur le passé
        • Lire un fichier continuellement avec less
        • Redémarrer et éteindre un ordinateur à distance
        • Internet Explorer et JPEG CMYK
        • Imiter des fonctions Prototype en jQuery
        • Code 18 de ma blonde !
        • Filtres de validation PHP
        • CAL9000, un outil pour hackers
        • Interpréter du JSON en PHP
        • Gérer les fuseaux horaires en PHP
        • Citation no. 41 sur l'investissement
        • Vidéos viraux québécois
      • ►  juillet 2009 (39)
      • ►  juin 2009 (38)
      • ►  mai 2009 (37)
      • ►  avril 2009 (35)
      • ►  mars 2009 (36)
      • ►  février 2009 (32)
      • ►  janvier 2009 (39)
    • ►  2008 (84)
      • ►  décembre 2008 (34)
      • ►  novembre 2008 (39)
      • ►  octobre 2008 (11)

    Abonnés

Copyright © All Rights Reserved. Code 18 | Converted into Blogger Templates by Theme Craft