Archive

Archive for février, 2009

Introspection en Flex ou ActionScript, utilisation de l’API de reflection

février 27th, 2009

Il est parfois utile d’avoir à déterminer les caractéristiques d’un objet (méthodes, attributs) ou bien de vouloir instancier de manière dynamique un objet à partir d’un code générique. Pour cela on utilise un mécanisme appelé l’introspection ou Reflection.

Tous les languages de haut niveau proposent ce type de fonctionnement et Actionscript ne déroge pas à la règle. Il y a cependant certaines subtilités à connaitre afin de faire fonctionner l’introspection en ActionScript.

L’utilisation de l’introspection en ActionScript passe par l’utilisation des fonctions disponibles dans le package flash.utils. Nous allons étudier par la suite deux de ces fonctions en détails, celle permettant de déterminer les caractéristiques d’un objet et celle permettant de faire des instanciation dynamique.

Déterminer dynamiquement les caractéristiques d’un objet

Pour déterminer de manière dynamique les caractéristiques d’un objet, il faut utiliser la fonction describeType dont voici la signature :

function describeType(value:*):XML

Cette fonction prend en paramètre tout type d’objet (* signifiant type indéfini) et retourne un XML décrivant la classe.

Instancier dynamiquement un objet

Pour intancier dynamiquement un objet il faut utiliser la méthode getDefinitionByName dont voici la signature :

getDefinitionByName(name:String):Object

Cette fonction retourne une référence de la classe (un pointeur) définie par la chaine de caractère passée en paramètre (le paramètre name).

Prenons tout de suite un exemple. Si on veut instancier de manière dynamique un objet Flex Button le code sera le suivant :

import mx.controls.*;
try{
var myClass:Class = getDefinitionByClassName(”mx.controls.Button”);
}catch(error:Error){
trace(error.message);
}
var myObject:* = new myClass();

Avec ce code on retrouve dans la variable myObject une instance de la classe Flex Button. Ce code compile parfaitement mais malheureusement à ne fonctionne pas à l’execution et générer l’erreur 1065 (variable n’est pas définie). En effet dans ce code, le moteur flash n’embarque à aucun moment la définition de la classe Button car il n’existe aucune variable faisant référence à la classe Button. Pour que le code fonctionne il faut donc créer une variable “bidon” faisant référence à la classe Button pour que le moteur flash l’embarque.
Le code devient donc :

import mx.controls.*;
try{
// hack pour permettre à l’introspection de fonctionner
var buttonBidon:Button;
var myClass:Class = getDefinitionByClassName(”mx.controls.Button”);
}catch(error:Error){
trace(error.message);
}
var myObject:* = new myClass();

Avec l’ajout de cette variable le code fonctionne parfaitement et la variable myObject devient utilisable.

En conclusion, l’introspection est parfaitement fonctionnelle et utilisable en ActionScript. Elle nécessite cependant quelques astuces indispensable.

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

developpement, flex ,

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 ,