Archive

Archive for the ‘developpement’ Category

PHP et le calcul du modulo négatif

juin 23rd, 2010

Je viens de tomber sur le cas ce matin, l’opérateur PHP modulo (%) pour des valeurs trop grandes perd complètement les pédales pour donner des résultats totalement incohérents.

A cause d’un dépassement de capacité, le calcul du modulo peut donner des résultats négatifs avec deux opérandes positives ce qui est mathématiquement impossible (il est possible d’avoir un résultat négatif si un des deux opérande est négatif).

Essayez par exemple de calculer 3002223337 % 23 en PHP vous obtiendrez -2 (testé en PHP 5.3.2 sous Windows et Linux).

Heureusement, la formule de calcul du modulo n’est pas très compliquée et comble du luxe Wikipédia nous fourni un exemple d’implémentation de l’opération que votre serviteur vous a traduit en PHP :

function modulo($a, $b) {
return $a - $b * floor($a/$b);
}

Grâce à cela, plus de problème de résultat incohérent ;)

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

developpement

charger un swf externe en Flex

juin 9th, 2010

Dernièrement, pour un projet en Flex j’ai été obligé d’intégrer un composant autonome développé en flash et ActionScript 3 sans les sources. Le composant étant autonome l’objectif était de pouvoir charger le fichier swf dans mon application Flex et de l’ajouter à une vue de l’application.

Heureusement il est possible de réaliser l’opération en ActionScript 3.  pour cela il faut utiliser la classe Loader en respectant les étapes suivantes :

  1. créer un objet URLRequest avec le chemin (en AIR) ou l’url (en FLEX) vers le fichier swf
  2. créer un objet Loader
  3. invoquer la méthode load de l’objet Loader en lui passant en paramètre l’objet URLRequest
  4. ajouter l’objet Loader à une vue de l’application en utilisant un UIComponent

La mise en oeuvre de ces étapes en ActionScript 3 donne le code suivant :

var request:URLRequest = new URLRequest(”METTRE URL OU CHEMIN VERS SWF”);
var loader:Loader = new Loader()
loader.load(request);
var uiComponnent:UIComponent = new UIComponent();
maVue.addChild(uiComponnent);
uiComponnent.addChild(loader);

NB : le chemin peut être une URL ou bien pour une application AIR le chemin sur le disque dur. Dans ce cas, il faut faire attention aux règles de sécurité d’accès au système de fichier définies par le runtime AIR. Pour cela je vous invite à lire la documentation relative sur le site d’Adobe.

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

developpement, flex

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: 5.0/5 (1 vote 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.3/5 (6 votes cast)

    developpement