Afficher le plan d’execution d’une requête MySql

février 23rd, 2009

Mysql offre la possibilité d’afficher à l’utilisateur le plan d’exécution pour une requête données. Pour cela, il suffit de précéder la requête à analyser de l’instruction EXPLAIN.

Ainsi utilisé, MySql affiche en résultat à l’utilisateur un tableau permettant de détailler comment l’optimiseur de requête va exécuter celle-ci. C’est ce qu’on appelle le plan d’exécution. Le tableau affiché en résultat peu contenir de 1 à plusieurs lignes.

Dans le cas d’une requête simple, ce tableau contiendra une ligne.

Dans le cas d’une requête contenant deux instructions SELECT associées avec la clause UNION, le tableau contiendra trois lignes :

  • une ligne pour chaque exécution de l’instruction SELECT,
  • une ligne pour le résultat de l’instruction UNION

Le tableau affiché contient les colonnes suivantes :

  • id : L’identifiant de l’instruction SELECT. Correspond au numéro de l’instruction SELECT au sein de la requête. Est utilisé dans le cas où l’optimiseur va effectuer plusieurs instructions SELECT (comme dans l’utilisation de la clause UNION par exemple),
  • select_type : le type d’instruction SELECT que l’optimiseur va exécuter. Les différents types sont :
    1. SIMPLE : exécution d’une instruction SELECT simple (par de select imbriqué ou de clause UNION)
    2. PRIMARY : SELECT principal dans une requête avec des instructions select imbriquées
    3. UNION : seconde ou dernière instruction SELECT d’une requête contenant la clause UNION
    4. DEPENDANT UNION : seconde ou dernière instruction SELECT d’une requête contenant la clause UNION qui dépend d’une requête externe
    5. UNION RESULT : le résultat de la clause UNION (après exécution de l’ensemble des instructions SELECT)
    6. SUBQUERY : première instruction SELECT dans une requête contenant des select imbriqués
    7. DERIVED : résultat de l’instruction SELECT d’une requête imbriquée dans la clause FROM
  • table : le nom de la table contenant les lignes retournées par la clause SELECT de la requête
  • type : le type de jointure utilisé sur la table dans la requête
  • possible_keys : cette colonne indique les index que MySQL peut utiliser pour trouver les lignes utiles dans la tables
  • key : cette colonne indique l’index que MySQL a décidé d’utiliser. La valeur de cette colonne vaut NULL si MySQL n’a pas utilisé d’index.
  • key_len : cette colonne indique la longueur de l’index que MySQL a décidé d’utiliser.
  • ref : cette colonne affiche qu’elles colonnes de la table ou constantes ont été comparées à l’index afin de trouver les lignes utiles dans la table
  • rows : cette colonne affiche le nombre de lignes de la table que MySQL devra exéminer pour exécuter cette partie de la requête
  • extra : cette colonne affiche des informations supplémentaires sur la manière utilisée par MySQL pour résoudre la requête

L’utilisation du plan d’exécution est indispensable afin de comprendre comment MySQL exécute une requête et ainsi optimiser les performances. Cette instruction vous permet notamment d’identifier si la requête utilise des index ou pas.

VN:F [1.0.8_357]
Rating: 4.1/5 (7 votes cast)

MySQL, developpement ,

A la découverte de la librairie as3corelib pour Actionscript 3

février 23rd, 2009

Je vous ai déjà parlé de cette librairie dans l’article “Utiliser le cryptage MD5 en Actionscript 3” mais j’ai voulu approfondir la présentation de cette bibliothèque et de ses fonctionnalités.

Cette librairie téléchargeable à l’adresse http://code.google.com/p/as3corelib/downloads/list propose un ensemble de classes permettant d’étendre les fonctionnalités du langage actionscript 3 utilisé dans Flash, Flex et Adobe AIR.

Vous trouverez dans la suite de cet article la présentation de chaque package.

Package com.adobe.air.logging

Ce package fournit une unique classe FileTarget permettant de stocker dans un fichier sur le système local de l’utilisateur les logs applicatifs. Attention cette classe n’est utilisable qu’avec Adobe AIR.

Package com.adobe.crypto

Ce package fournit un ensemble de classes qui implémentent les algorithmes de cryptage usuels tels que HMAC, MD5, SHA1, SHA224, SHA256

Package com.adobe.fileformats.vcard

Ce package fournit un ensemble de classes qui permettent d’implémenter le système de données vCard en actionscript 3.
Les classes Address, Email, Phone et VCard permettent de représenter en objets actionscript 3 le système vCard.
La classe VCardParser permet de construire un objet VCard à partir de la version sérialisée d’une carte de visite.

Package com.adobe.images

Ce package fournit un ensemble de classes qui permettent d’encoder une image en Jpeg ou PNG à partir d’une instance de l’objet actionscript BitmapData.

Package com.adobe.net

Ce package fournit un ensemble de classes qui étendent les fonctionnalités natives d’interaction réseau de l’actionscript 3.

Package com.adobe.net.proxies

Ce package fournit une unique classe RFC2817Socket qui permet d’ouvrir une connection via un socket en passant via un proxy HTTP en accord avec la recommandation RFC 2817.

Packages com.adobe.protocols.dict, com.adobe.protocols.dict.events, com.adobe.protocols.dict.util

Ces packages fournissent un ensemble de classe afin d’implémenter le protocole DICT du côté client. DICT est un protocole de communication utilisé pour ‘implémenter les fonctions de dictionnaire.
Ce procotole a été créé par le “DICT Development Group”.

Ces classes permettent donc de se connecter à un serveur DICT, de l’interroger et de traiter les résultats.

Vous trouverez plus d’information sur http://www.dict.org.

Package com.adobe.serialization.json

Ce package fournit tout un ensemble de classes pour traiter les structures de données au format JSON. Il est ainsi possible d’encoder ou de décoder des chaines au format JSON et d’extraire les données stockées dans ces chaines.

Package com.adobe.utils

Ce package fournit un ensemble de classes qui présentent des méthodes statiques pour manipuler les tableaux, les dates, les nombres entiers, les chaines de caractères, les documents XML, …
La classe ArrayUtil par exemple permet de comparer deux tableaux actionscript (méthode arraysAreEqual), ou bien encore de déterminer si un tableau contient une certaine valeur (méthode arrayContainsValue).

Voila un peu plus en détails cette librairie que je trouve presque indispensable pour les développeurs actionscript.

VN:F [1.0.8_357]
Rating: 5.0/5 (2 votes cast)

flex , ,

Utiliser le cryptage MD5 en Actionscript 3

février 12th, 2009

Je travaille actuellement sur une application web dont le front est développé en flex. Ce client flex communique avec le serveur en postant les données à traiter vers du code PHP.

Dans ce genre de communication, j’aime bien poster un checksum en supplément des données à traiter afin de valider que la requête est bien issue du client flex et pas d’un hacker qui appelle le code en direct.

Le principe est simple. L’application flex calcule le checksum à partir des données à traiter et encode le tout en MD5. Du côté PHP on applique le même calcul et on compare la chaine calculée au checksum reçu. Si ils ont égaux on considère que la requête provient bien du flex.

Seul problème, le language Actionscript ne permet pas en standard d’encrypter une chaine en MD5 comme c’est par exemple le cas en PHP.

Heureusement, une implémentation open source existe. Il s’agit de la libriarie as3corelib disponible sur google code.

Pour utiliser cette bibliothèque, il suffit de télécharger le fichier zip, de le décompresser et de copier le contenu du répertoire “src” à la racine de votre projet flex.

Ensuite, dans votre code actionscript, il suffit de procéder comme suit :

import com.adobe.crypto.MD5;
var hash:String = MD5.hash(”test”);

Dans la variable hash, vous trouverez le résultat de l’encodage en MD5 de la chaine “test”.

VN:F [1.0.8_357]
Rating: 4.6/5 (8 votes cast)

developpement, flex , , ,

Les 25 erreurs de développement les plus dangereuses

février 10th, 2009

Des dixaines d’experts informatiques se sont regroupés le 12 janvier 2009 à Washington DC afin d’établir la liste des 25 erreurs de développement à éviter absolument.

Cette liste a été rédigée fort du constat qu’en 2008, avec seulement 2 des 25 erreurs listées, plus de 1,5 millions de sites internet dans le monde étaient vulnérables à du piratage et des failles de sécurité.

Tous les plus grands acteurs de l’informatique (Symanctec, Microsoft, la division cybercriminalité de la NSA, …) ont participé à la rédaction de cette liste dans le but de sensibiliser tous les développeurs à sécuriser leurs codes.

L’objectif de cette liste est multiple :

  • permettre à tous les développeurs d’écrire du code sécurisé et ne contenant pas une des 25 erreurs,
  • permettre aux développeurs d’identifier et corriger ces erreurs dans les applicatifs existants.

Vous retrouverez dans cette liste les fameuses erreurs d’injection SQL, de cross site scripting, … que l’ont rencontre malheureusement encore trop souvent ainsi que de nombreuses autres.

Cette liste est très intéressante et utile et j’invite tous les developpeurs à la lire et la relire à l’adresse suivante http://www.sans.org/top25errors/ afin de rendre nos codes encore plus sûrs.

VN:F [1.0.8_357]
Rating: 5.0/5 (1 vote cast)

developpement ,

Faire cohabiter JQuery avec un autre framework javascript

janvier 21st, 2009

JQuery est de plus en plus à la mode. Résultat nombreux sont ceux qui veulent l’utiliser pour des développements futur.

Mais quid de l’existant.

En effet, il peut être parfois fastidieux de recoder toutes les fonctions javascript d’un site qui utilisait un autre framework javascript tel que prototype.

Inclure JQuery en même temps que prototype par exemple génère des conflits. Dans ce cas par exemple, il résultera un conflit à cause de la fameuse fonction $ qui existe dans en JQuery et en Prototype.

Heureusement, JQuery répond à la problématique en introduisant le mode de fonctionnement “No Conflict“. Pour cela, il suffit d’invoquer la méthode jQuery.noConflict(); à la suite du chargement de l’ensemble des frameworks.

Ainsi, en reprenant l’exemple de la fonction $, celle-ci n’utilisera pas JQuery mais un autre fremewok (ou une fonction propriétaire) définissant cette fonction.

ATTENTION, pour utiliser les fonctions de JQuery, il faut utiliser l’operateur jQuery.xxx et non plus l’opérateur $.xxx.

VN:F [1.0.8_357]
Rating: 4.0/5 (3 votes cast)

developpement , , ,

Développement de gadgets iGoogle sans cache

janvier 16th, 2009

Je viens de débuter depuis quelque jours le développement d’un gadget iGoogle pour un des sites sur lesquels je travaille. Je suis rapidement tombé sur un problème ennuyeux lors de la phase de développement le cache. N’ayant pas trouvé la solution facilement je vous fait partager mon expérience.

Avant d’aller plus loin, voici quelques rappels.

Un gadget iGoogle est une petite application qui s’installe sur la plateforme iGoogle. En général ces applications servent à mettre en avant les contenus d’un site Internet (la météo, les résultats sportifs, …) mais certaines font beaucoup plus qu’être un simple agrégateur du flux RSS ou XML. C’est applications sont en général un document XML contenant de l’HTML couplé à des feuilles de styles CSS pour l’interface utilisateur ainsi que du code javascript pour les interactions.

La plateforme iGoogle est le conteneur de ces applications (à noter qu’il existe d’autres conteneurs d’applications tels que facebook, myspace, …). Elle permet ainsi d’ajouter et/ou supprimer des applications, gérer leur affichage ainsi que leur comportement. Pour finir sur la présentation du conteneur iGoogle, Google fournit toute une série d’API de développement utilisables en javascript (appels ajax, API opensocial, …) au sein d’un gadget.

Pour utiliser iGoogle, il suffit de disposer d’un compte chez google (un compte gmail par exemple). Ensuite, vous pouvez utiliser le service et développer vos premiers gadgets.

Lors du développement d’un gadget, le seul moyen de tester notre code consiste à ajouter ce gadget à notre conteur iGoogle. Or c’est à ce moment que se pose notre problème. Lors de l’ajout d’un gadget dans le conteneur, celui-ci est mis en cache par google. Ce comportement est génial lorsque le gadget est finalisé. En effet, le cache évite que le gadget interroge constament votre serveur ce qui pourrait poser problème si le gadget est utilisé par de nombreuses personnes. Par contre, en phase de développement il est impossible de développer avec du cache surtout que la durée de mise en cache est très importante.

Heureusement (il m’a fallu une après-midi pour trouver la solution), google met à notre disposition un gadget : my gadgets qui permet d’administrer les gadgets au sein du conteneur courant. Ce gadget vous permet d’ajouter un gadget dans votre conteneur et définir si celui-ci doit utiliser le cache google.  Pour cela il suffit de décocher la case cached en face du nom de votre widget et le tour est joué.

my_gadget.jpg

VN:F [1.0.8_357]
Rating: 5.0/5 (2 votes cast)

developpement , , ,

Bonne année 2009

janvier 1st, 2009

Je vous souhaite une très bonne et heureuse année 2009.

Que cette nouvelle année vous apporte tout le bonheur possible et que tous vos voeux se réalisent.

Les photos du réveillon son disponible ici

VN:F [1.0.8_357]
Rating: 5.0/5 (3 votes cast)

Non classé

SciTE un éditeur de texte et bien plus

décembre 17th, 2008

Aujourd’hui j’aimerai vous parler d’un éditeur de texte que j’affectionne tout particulièrement en tant que développeur : SciTE.

SciTE signifie Scintilla Text Editor. C’est donc un éditeur de texte qui utilise le composant Scintilla. Ce composant est un éditeur de code source particulièrement performant. Pour preuve, c’est ce composant que l’on retrouve dans d’autres logiciels d’édition tels que Notepad2.

Comme nous le verrons par la suite, SciTE est bien plus qu’un éditeur.

SciTE est disponible pour Linux et Windows et est téléchargeable à l’adresse suivante : http://www.scintilla.org/SciTEDownload.html.

Comme tous les éditeurs de texte SciTE offre la possibilité d’ouvrir plusieurs fichiers simultanément et de naviguer entre eux via des onglets.

De plus lors de l’édition de code (ce qui nous interesse sur ce blog) SciTE offre des fonctionnalités dignes des meilleurs IDE :

  • coloration syntaxique,
  • système de dépliage/repliage de bloc de code
  • appel d’un compilateur
  • fenêtre d’output

De plus tout est configurable avec SciTE malheureusement sans interface graphique. Il faut donc passer par l’édition des fichiers de properties.

Ces fichiers sont au nombre de trois (plus ceux dédiés aux languages spécifiques) :

  1. Le fichier Global définit les options globales par défaut de SciTE (c’est à dire, celles qui s’appliqueront à tous les utilisateurs). Il est préférable de ne pas y touché étant donné que ce fichier sera écrasé à chaque mise à jour
  2. Le fichier User,  qui définit les options pour  l’utilisateur courant.
  3. Le fichier Local qui définit les options à appliquer lors de l’édition de fichiers dans un fichier précis. Il doit se trouver dans le même dossier que les fichiers auxquels on veut appliquer ces paramètres.

Via ces fichiers vous pouvez complètement configurer le comportement de SciTE pour qu’il réponde à vos besoin.

Par exemple lors de l’édition de sources de balises (HTML ou MXML par exemple) vous pouvez configurer SciTE pour que celui-ci ferme automatiquement la balise que vous venez d’ouvrir en plaçant la curseur entre la balise ouvrante et la balise fermante. Pour cela, il vous suffit d’ajouter la ligne suivante au fichier de configuration :

xml.auto.close.tags=1

Un second exemple, il est possible de définir le look du système de repliage de bloc de code. Pour cela, il vous suffit de modifier la ligne suivante en remplaçant la valeur 1 pour une valeur allant de 0 à 4 (je vous laisse découvrir par vous même le résultat) :

fold.symbols=1

Pour plus d’information sur le paramétrage de SciTE, je vous invite à consulter la documentation en ligne.

En conclusion cet éditeur est vraiment très puissant bien que très léger d’utilisation et je ne peux plus m’en passer.

VN:F [1.0.8_357]
Rating: 4.7/5 (3 votes cast)

developpement , ,

Thickbox la modalbox à la mode JQuery

décembre 12th, 2008

Utilisant comme framework javascript de plus en plus JQuery (comparaison des frameworks javascript) j’ai été amené à développer des interfaces utilisateur à base de “popup ajax”.

thickbox.jpeg

Ne voulant pas réinventer la roue, j’ai cherché quels étaient les plugin JQuery qui offraient cette fonctionnalité. Mon choix s’est arrêté sur Thickbox.

Thickbox est plugin JQuery permettant d’afficher à l’écran du contenu en sur-impression de la page courante.

Ce plugin est très léger : 20ko en version compressée et 58ko en version normale. De plus son mode de fonctionnement est l’un des plus simple que j’ai utiliser et certainement le moins intrusif.

En effet pour ouvrir un contenu dans une “popup ajax”, il suffit (une fois le script chargé dans la page évidemment) de définir un lien HTML portant l’attribut class=”thickbox”. Thickbox se charge donc d’ouvrir la cible du lien dans une popup en sur-impression de la page courante.

La puissance de la bibliothèque ne s’arrête pas là. En effet, le comportement de la popup est paramétrable. Vous pouvez très simplement déterminer par exemple la hauteur ou la largeur de la popup à afficher. Pour cela, rien de plus simple il suffit d’ajouter à la suite de l’url du lien à charger en popup les paramètres height et/ou width.

Par exemple, si nous voulons charger la home de google dans une popup de largeur 200 pixels et de hauteur 300 pixels il suffit de définir un lien dont l’attribut href aura la valeur http://google.fr?height=300&width=200.

de la même manière si nous voulons que notre popup soit modale il nous suffit d’ajouter le paramètre d’url &modal=true.

Je conseille vivement à tous les utilisateurs de JQuery de tester cette bibliothèque très utile et tellement simple d’utilisation qu’elle rendra vos développement javascript encore plus joyeux. Vous remarquerez au passage que le système d’affichage des photos de ce blog utilise thickbox ;)

VN:F [1.0.8_357]
Rating: 3.9/5 (12 votes cast)

developpement , ,

Maximum function nesting level of ‘100′ reached

décembre 8th, 2008

Depuis quelques temps sur mon serveur de développement PHP, je suis régulièrement tombé sur l’erreur fatale suivante : Maximum function nesting level of ‘100′ reached.

N’ayant jamais rencontré cette erreur auparavant et ayant installé dernièrement l’extension PHP Xdebug j’ai creusé dans cette direction.

L’extension PHP Xdebug qui permet de faire du debuggage ainsi que du profiling PHP définit le paramètre de configuration xdebug.max_nesting_level (par défaut à la valeur 100). Ce paramètre permet de déterminer le nombre maximum de fonctions imbriquées avant de stopper l’exécution du script.

Il suffit donc d’augmenter la valeur de ce paramètre de configuration et de redémarrer Apache pour ne plus rencontrer le problème.

NB : je n’ai pas trouvé de valeur permettant d’ignorer ce paramètre comme il est possible de le faire pour la variable max_execution_time par exemple.

VN:F [1.0.8_357]
Rating: 4.3/5 (7 votes cast)

developpement