Archive

Archive for the ‘developpement’ Category

White paper optimisation des développements ActionScript 3

mars 1st, 2010

En faisant ce matin le tour des mes blogs préférés, j’ai découvert sur le blog de Michaël Chaize que Thibault Imbert avait rédigé un white paper sur les optimisations des développements ActionScript 3 pour mobile.

Travaillant sur de plus en plus de projet en flex (et par conséquent en ActionScript 3) j’ai entamé la lecture de ce document disponible à l’adresse suivante (une version pdf existe aussi) :

http://help.adobe.com/en_US/as3/mobile/index.html

Premier constat, c’est vraiment très intéressant et ce n’est pas dédié uniquement aux développeurs Flash sur plateforme mobile. Toutes les astuces et recettes de cuisine présentées sont utilisables quelque soit le device (ordinateur de bureau, smartphone, …) et quelque soit la machine virtuelle (flash player, AIR, …).

On y apprend comment économiser de la mémoire, optimiser les traitements CPU, optimiser les échanges réseau, …

Un exemple tout bête : lorsqu’on veut convertir un Number positif en entier la méthode Math.round() et plus performante que la méthode Math.floor().

Un document que tout développeur ActionScript devrait lire et connaitre.

Bonne lecture ;)

VN:F [1.0.8_357]
Rating: 0.0/5 (0 votes cast)

developpement, flex , ,

La version 1.4 de JQuery disponible

janvier 15th, 2010

Pour fêter dignement son 4ième anniversaire JQuery passe en version 1.4. Un site a d’ailleurs été développé pour l’évènement : http://jquery14.com/.

Au menu de cette nouvelle version on retrouve :

  • des performances améliorées notamment pour les méthodes dites “populaires ” telles que .addClass(), .removeClass(), .css(), .append(), .html(), …
  • la sérialisation des tableaux a la mode PHP pour les appels ajax
  • détection automatique du content-type lors de retour d’un appel ajax (j’imagine que bon objet doit être instancié JSON, XML, text, ..)
  • une nouvelle syntaxe : la “Quick Element Construction” pour ajouter des élements à une page (au passage je trouve cette nouvelle fonctionnalité énorme, nous y reviendrons plus loin dans cet article)
  • le “multi-binding” d’évènement. Vous pouvez abonner un élément à plusieurs event (click, mousenter, …) en une seule ligne

Je vous laisse découvrir la suite sur le site de JQuery mais ce n’est que du bon.

présentation de Quick Element Construction

C’est une nouvelle syntaxe qui permet en une seule instruction de créer et de qualifier complètement un élément du DOM (un div par exemple). Maintenant en une instruction vous pourrez :

  • créer l’élément,
  • rattacher l’élément à un parent,
  • définir ses paramètres de style
  • définir ses évènements et les callback associés

plus qu’un long discours un exemple est plus parlant :

quick_element_jquery.jpg

Pour finir sur cette sortie de JQuery 1.4, voici mon avis personnel. Cette bibliothèque hausse encore son niveau que je trouve pour ma part excellent et offre encore plus de souplesse et de robustesse pour les développeurs web. Toutes les évolutions apportées par cette nouvelle version vont, à mon avis, dans la bonne direction en conservant la philosophie de base de JQuery : simplicité et rapidité.

C’est dans des jours comme aujourd’hui que je me dis quelle joie de faire du développement ;)

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

developpement , , ,

Désassembler un fichier swf grâce à FLASM

octobre 1st, 2009

Je suis en train d’aider un copain à faire évoluer son site : changement d’hébergement, utilisation de rewrite rule pour avoir des belles urls lisible, …

Tous ces changements ont abouti à un problème épineux. Pour certaines   fonctionnalités le site utilise des flashs (lecture de vidéos soumises à authentification par exemple) qui font des appels au site en URLLoader. Or comme les urls du site ont changé et que les adresses de vérifications dans les flashs ont été codées en dur (ce qui n’est pas beau du tout je vous l’accorde) il faut les modifier.  Manque de chance, nous ne disposons pas des sources des flashs pour effectuer les modifications. Heureusement il existe un outil, flasm, qui permet de désassembler les binaires flashs c’est-à-dire de générer un fichier texte contenant le langage machine de l’exécutable.

A la base cet outil a été développé pour les développeurs flash qui voulaient optimiser le bytecode généré par le compilateur pour le flash player. Personnellement j’ai plutôt tendance à faire confiance au compilateur ;)

Pour pouvoir utiliser l’outil, il vous faut premièrement télécharger le logiciel qui est disponible sous forme d’archive pour windows, mac et linux puis l’installer (par exemple dans le répertoire c:\flasm pour windows).

Ensuite pour désassembler un fichier swf, il suffit d’exécuter la commande suivante :

c:\flasm>flasm -d chemin_vers_swf/fichier.swf > chemin_vers_swf/fichier.flm

Vous obtenez en sortie un fichier avec l’extension .flm qui est lisible par un éditeur texte (dans mon cas j’utilise scite ;) ). Ce fichier contient des instructions assembleur qui représentent le langage machine exécuté par le player flash. Dans mon cas j’ai donc pu modifier les variables définissant les urls du site appelées. En effet toutes les variables apparaissent en clair dans le code assembleur. En général c’est une instruction push qui s’occupe de l’affectation des variables. Via une recherche il est très facile de retrouver ces affectations.

Une fois les modifications effectuées et sauvegardées sur le fichier flm, il reste à assembler le fichier flm pour générer un nouveau swf. Pour cela il suffit d’exécuter la commande suivante :

c:\flasm>flasm -a chemin_vers_swf/fichier.flm

Tout n’est pas rose et il y a une restriction. Pour le moment flasm ne peut désassembler que des fichiers swf actionScript 1 ou actionScript 2. Ce qui veut dire ques les flashs récents ne peuvent pas être désassemblés pour le moment. Ceci étant c’est un outil bien utile et sans celui-ci nous aurions été obligé de redévelopper l’intégralité des flashs du site.

Un grand merci à Christophe Bessis qui m’a fait découvrir cet outil.

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

developpement ,

equivalent de la fonction explode PHP en PL/SQL

septembre 17th, 2009

Je travaille actuellement sur un projet utilisant une base de données Oracle 10g. Dans ce projet, tous les traitements sur les données sont effectués par le serveur de base de données (en PL/SQL)  pour alléger le serveur applicatif qui ne s’occupe que de la couche de présentation.

Dans un des traitements PL/SQL j’ai eu besoin de transformer une chaine de caractères en un tableau de données. En PHP j’aurais utilisé la fonction explode. Malheureusement, cette fonction n’existe pas en PL/SQL.

J’ai effectué des recherches sur internet et j’ai trouvé quelques traitements PL/SQL qui semblaient implémenter l’équivalent de la fonction explode.  Mais ces implémentations étaient très complexes pour ne pas dire incompréhensible.

J’ai donc décidé de réaliser moi même une fonction explode en PL/SQL. Pour cela, j’ai utilisé :

  • les possibilité de récursivité d’oracle (instruction loop)
  • la fonction instr qui permet de détecter la première position d’un ensemble de caractères dans une chaine
  • la fonction substr qui permet de séparer une chaine en plusieurs
  • les collections oracle

trêve de bavardage, voici le code de cette fonction :

FUNCTION explode(delimiter VARCHAR2, str VARCHAR2) RETURN ARR_STRING IS
extract_chaine varchar2(2000) := ”;
position number(3) := 0;
TYPE ARR_STRING is table of varchar2(64) index by binary_integer;
cur_idx number(3) := 1;
current_str varchar2(20000) := str;
BEGIN
Loop
— on determine la position du premier champ sepatateur
select instr(current_str, delimiter) into position from dual;
IF position > 0 THEN
– on isole le bout de chaine jusqu’au separateur
select substr(current_str, 1, position - 1) into extract_chaine from dual;
— on stocke dans le tableau resultat le bout de chaine
arr_res(cur_idx):=extract_chaine;
cur_idx:=cur_idx+1;
— on supprime la partie de chaine traitée
select substr(current_str, position + length(delimiter)) into current_str from dual;
END IF;
exit when position = 0;
end loop;
– on stocke dans le tableau resultat la dserniere occurence non traite dans la boucle
arr_res(cur_idx):=current_str;
RETURN arr_res;
END explode;

Voici un exemple d’appel de la fonction :

DECLARE
TYPE ARR_STRING is table of varchar2(64) index by binary_integer;
ret ARR_STRING;
BEGIN
ret := explode(’@;’, ‘val1@;val2@;val3@;val4@;val5@;val6@;val7@;val8@;val9′);
for i in 1..ret.count loop
dbms_output.put_line(ret(i));
end loop;
end;

Si on regarde en détail le code de la fonction:

  • le paramètre str contient la chaine à traiter,
  • la paramètre delimiter contient le caractère qui permet d’exploser la chaine en un tableau
  • la variable arr_res définit une collection qui contiendra les différentes parties de la chaines traité

Il existe très certainement d’autres algorithmes permettant d’effectuer l’équivalent de la fonction explode, mais celui-ci à le mérite de fonctionner correctement et d’être relativement simple à comprendre.

N’hésitez pas à tester ce code et à me laisser vos remarques ou vos optimisations.

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

Projets professionnels, developpement ,

Firefox 3.5 disponible ce soir (30 juin) à 18h

juin 30th, 2009

Les responsables de Mozilla ont annoncés hier que la  nouvelle version de Firefox, la 3.5 (initialement nommée 3.1) sera disponible à partir d’aujourd’hui et plus particulièrement vers 18h pour la France.

Comme toujours cette nouvelle version sera disponible via le site internet de Mozilla ou via le système de mise à jour automatique.

Voici une liste des nouveautés :

  • gestion de la vie privée,
  • amélioration de la vitesse de chargement,
  • amélioration de la vistesse d’exécution du javascript grace au nouveau moteur traceMonkey,
  • géolocalisation,
  • prise en charge de certaines nouvelles balises HTML 5 (audio, vidéo, API drag n’drop, …)
  • prise en charge de nouvelles clause CSS (text-shadow, word-wrap, …)
  • nouvelles fonctionnalités DOM (propriété localStorage, multi-threading, objet NodeIterator, …)
  • support natif du format JSON
  • requete XmlHttpRequest cross-site autorisé (si supporté par le serveur)

Vous pouez retrouver l’ensemble des modifications sur le site des developpeurs Mozilla : https://developer.mozilla.org/en/Firefox_3.5_for_developers

Mise à jour (le 30 juin 2009 à 17h30) :

Il est officiellement possible de télécharger firefox 3.5 sur le site officiel de mozilla : http://fr.www.mozilla.com/fr/

VN:F [1.0.8_357]
Rating: 0.0/5 (0 votes cast)

developpement

Wordpress 2.8 prévu pour le 10 juin

juin 9th, 2009

Si tout va bien la version 2.8 de Wordpress devrait être disponible le 10 juin 2009 (soit demain ;) ).

C’est en tout cas ce qu’annonce le site de l’association Wordpresse francophone.

Au niveau des nouveautés, on retrouve :

  • un nouveau look pour l’interface d’administration
  • le dashboard devient personnalisable
  • installation des thèmes simplifiés via un module de recherche et d’installation des thèmes depuis l’interface d’administration
  • la possibilité de supprimer un thème depuis l’interface d’administration
  • un nouvel éditeur de fichiers (pour modifier le code des templates par exemple) basé sur CodePress
  • documentation des API accessible directement depuis l’interface d’administration
  • et bien d’autres ….

En conclusion cette mise à jour de Wordpress s’annonce prometteuse et j’ai hate de pouvoir opérer la mise a jour de ma plateforme. En attendant demain, vous pouvez toujours tester la RC1 de Wordpress 2.8 en la téléchargeant sur le site officiel.

VN:F [1.0.8_357]
Rating: 0.0/5 (0 votes cast)

General, developpement , , ,

Google met à disposition des développeurs une API Google Analytics

avril 23rd, 2009

Depuis le 21 Avril 2009, Google a mis à notre disposition une API Google Analytics (Cf. post sur le blog de google).

Cette API permet d’interroger le service Google Analytics afin de pouvoir extraire les données de consultations qui y sont stockées. Celle-ci est encore en version beta mais c’est une excellente nouvelle car ce type de fonctionnalité était attendue depuis très longtemps.

Google met à disposition 3 modes d’accès différents pour s’interfacer avec le service Analytics :

  • en requête HTTP
  • en JAVA
  • en Javascript

requête HTTP

C’est la méthode de base pour interroger le service Analytics. On accède aux données en interrogeant des urls fournies par google. Que ce soit via les API Java ou Javascript la méthode d’accès aux données reste la même : des appels en HTTP vers les urls google. Google fourni en réponse des appels un flux XML contenant les données qui correspondent à la requête (nombre de visiteurs sur un période, nombre de pages vues, ….).

C’est ce protocole qu’il faudra employer pour s’interfacer avec le service Analytics pour tout autre langage que Java et Javascript (ie: PHP, Python, …).

Vous trouverez plus d’informations à l’adresse : http://code.google.com/intl/fr/apis/analytics/docs/gdata/1.0/gdataProtocol.html

API Java

Google met à disposition des développeurs Java un ensemble de classes masquant la “tuyauterie” d’appel ainsi que le traitement du flux XML en retour.

Vous trouverez plus d’informations à l’adresse : http://code.google.com/intl/fr/apis/analytics/docs/gdata/1.0/gdataJava.html

API javascript

Comme pour le langage Java, Google met à disposition des développeurs Javascript une bibliothèque de fonctions  masquant la “tuyauterie” d’appel ainsi que le traitement du flux XML en retour.

Vous trouverez plus d’informations à l’adresse : http://code.google.com/intl/fr/apis/analytics/docs/gdata/1.0/gdataJavascript.html

Il faut noter que pour toutes les méthodes d’accès, il faut respecter les pré-requis suivants:

  • disposer d’un compte Google Analytics,
  • utiliser l’API d’authentification Google avant de pouvoir effectuer une requête (documentation sur l’api d’authentification ici)
  • Respecter la règle de quota mise en place par google : pas plus de 10 000 requêtes par 24h et moins de 100 requêtes toutes les 10 secondes. Au delà, vous le service Analytics retourne une erreur HTTP 503 (Service Unavailable)

Je vous reparle très rapidement de cette API dès que j’aurais eu le temps de jouer un peu avec ;)

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

developpement ,

Comment simuler une IP étrangère sur internet

mars 23rd, 2009

Je travaille actuellement sur un projet utilisant la géolicalisation (cf mon post extension ezPublish ezGeolocalization).

Or je suis rapidement tombé sur un problème : Comment tester mon module de géolocalisation depuis mon poste de développement ?

Ce qui se traduit aussi par comment simuler une IP étrangère pour faire croire à mon serveur web que je suis un internaute étranger.

La solution qui vient tout de suite à l’esprit est d’utiliser un proxy étranger. Mais comment mettre en oeuvre et configurer cela.

après quelques recherches sur internet pas vraiment fructeuses je me suis tourné vers les forums informatiques. Au final il y a peut de sujets sur la question et la plupart ne donnent pas de réponses concrètes. De plus les sujets dérivent assez rapidement. En effet la question génère rapidement de la suspicion de la part des intervenants des forums.

Heureusement un collègue (merci MaNu) ma présenté le site Unblock & Bypass : http://unblockbypass.com/.

Ce site vous permet de naviguer et d’afficher n’importe quel site dans son interface. Ce site étant basé en Allemagne vous apparaissez donc comme un internaute Allemand pour votre serveur.

Grâce à ce site j’ai pu tester mon module de géolocalisation.

Attention toutefois cette technique présente quelques limitations : votre site doit être accessible sur internet (cette solution ne fonctionne pas pour les développements en local), vous ne pouvez apparaitre que comme client Allemand ce qui est assez limité.

    A noter, qu’il existe d’autres solutions telles que des logiciels qui modifient vos paramètres réseau ou encore l’extension firefox Foxy Proxy qui permet de passer par un proxy étranger. Mais je n’ai pas testé ces solutions.

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

    developpement

    Extension ezPublish ezGeolocalization

    mars 20th, 2009

    Je viens de mettre à disposition dans les contributions du site d’ezPublish ma toute dernière extension : ezgeolocalization.

    Celle comme son nom l’indique vous permet de géolocaliser les internautes à partir de leur IP. La géolocalisation est de plus en plus utilisée notamment pour proposer des contenus aux internautes en fonction de leur position géographique (par exemple les salles de cinéma proches de chez moi) ou alors pour protéger des contenus (par exemple j’ai l’exclusivité sur les actualités de la formule 1 mais seuls les internautes de france métropolitaine peuvent y accéder).

    J’ai donc développé une extension ezPublish proposant une solution de géolocalisation. L’extension utilise les bases de données de géolocalisation gratuites des pays et des villes fournies par la société Maxmind. Elle utilise de plus l’API virtualearth de microsoft afin de vous permettre d’afficher sur une carte interactive et dans le navigateur la position de la ville ou du pays de l’internaute comme présenté sur la capture d’écran :

    ezgeolocalization.jpeg

    J’ai préféré utiliser virtualearth plutot que googlemap tout simplement car l’API de microsoft (virtualearth) contrairement à celle de google ne nécessite pas de génération de clé d’authentification pour l’utiliser ce qui était un objectif capital pour pouvoir diffuser mon extension.

    Fonctionnalités de l’extension

    1. pour le front, des opérateurs de templates et une classe métier PHP afin de pouvoir géolocaliser un internaute via son IP
    2. une interface backoffice permettant d’effectuer les mises à jours manuelle des bases de données ainsi qu’une interface permettant de géolicaliser une IP
    3. un cron de mise à jour automatique de la base de géolocalisation des pays (la base des villes est trop grosse pour cela) à partir du site de Maxmind

    Vous pouvez télécharger cette extension à l’adresse suivante : http://agdeveloppement.e3b.org/ezpublish/ezgeolocalization.zip (22Mo).

    Installation

    1. décompresser l’archive zip et la copier dans le repertoire extension d’ezPublish
    2. décompresser le fichier /sql/dump_ezgeo.zip et exécuter le script SQL afin de créer les tables de géolocalisation
    3. activer l’extension dans le backoffice
    4. vider le cache d’ezPublish

    Ce n’est pour l’instant que la version 1 de cette extension et je travaille encore dessus afin de lui apporter de nouvelles fonctionnalités.

    N’hésitez pas à me laisser vos commentaires ils me seront très utiles pour faire évoluer ce projet.

    VN:F [1.0.8_357]
    Rating: 3.2/5 (6 votes cast)

    developpement, ezPublish ,

    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 ,