RSS Feed

Archives de la catégorie ‘Développement’

Android – avoir accès à une carte mémoire dans l’émulateur

14 January 2010 par SeB Pas de commentaire »

Cette application utilise la carte mémoire insérée dans le téléphone. C’est souvent le cas pour stocker des fichiers volumineux ou des fichiers que l’utilisateur est susceptible de vouloir récupérer. Lors du développement d’une application pour Android, les premiers tests se font dans l’émulateur. Or par défaut, l’émulateur n’a pas accès à une carte mémoire. Bien entendu, les auteurs du SDK pour Android ont prévu cette utilisation.

La carte mémoire sur Android est un système de fichier à part entière. Il faut donc créer une image de système de fichier qui sera utilisée par l’émulateur. Pour cela, placez-vous dans le sous-répertoire tools du SDK et exécutez la commande suivante :

mksdcard.exe -l mysdcard 128M sdcard.img

Cette commande a créé l’image d’une carte mémoire de 128Mo. L’image se trouve dans le sous-répertoire tools avec le nom sdcard.img mais peut être placée là où vous le souhaitez.

Une fois l’image créé, il faut indiquer à l’émulateur de l’utiliser. Lancez Eclipse et allez dans “Run configurations…”. Sélectionnez la configuration de votre application et allez dans l’onglet “Target” ou “Emulator” puis saisissez l’option suivante dans le champ “Additional Emulator Command Line Options” :

-sdcard <SDK_INSTALL_DIR>toolssdcard.img

N’oubliez pas de remplacer <SDK_INSTALL_DIR>\tools\ par le chemin complet du répertoire où se trouve l’image que vous avez créé. Cliquez sur “Apply” puis “Run”. Laissez l’émulateur se lancer et vous verrez qu’il y a une carte mémoire de 128Mo dans votre émulateur Android maintenant. ;)

A vos développements !

 

Emulateur Android avec une ROM personnalisée

11 January 2010 par SeB 10 commentaires »

L’émulateur Android est plutôt bien fait. Cependant, il donne des conditions de test assez simples dans le sens où l’environnement est restreint (pas de Market par exemple) et surtout sans aucune personnalisation (comme la couche HTC Sense ou autre). C’est pourquoi, il peut s’avérer très utilise de pouvoir lancer une ROM personnalisée dans l’émulateur d’Android.

Prenons l’exemple de la ROM Cyanogen. Je pars du principe que le SDK pour Android est déjà installé et fonctionnel.

Allez dans le sous-répertoire tools du SDK et exécutez la commande suivante :

android list target

Vous devriez avoir un résultat de ce type :

Available Android targets:

id: 1 or "android-2"

Name: Android 1.1

Type: Platform

API level: 2

Revision: 1

Skins: HVGA (default), HVGA-L, HVGA-P, QVGA-L, QVGA-P

id: 2 or "android-3"

Name: Android 1.5

Type: Platform

API level: 3

Revision: 1

Skins: HVGA (default), HVGA-L, HVGA-P, QVGA-L, QVGA-P

id: 3 or "android-4"

Name: Android 1.6

Type: Platform

API level: 4

Revision: 1

Skins: HVGA (default), QVGA, WVGA800, WVGA854

Notez l’id de Android 1.5 qui correspond à la version d’Android de la ROM Cyanogen. Dans cet exemple l’id vaut 2.

Maintenant saisissez la commande suivante en remplaçant le 2 par la valeur de l’identifiant que vous avez noté :

android create avd -n cyanogen365 -t 2

Le programme vous demande si vous souhaitez personnaliser le profile matériel de l’émulateur. Si vous ne savez pas de quoi il en ressort, laissez la réponse par défaut (no). Le profile de l’émulateur est créé.

Récupérez la ROM Cyanogen. Décompressez-la. Vous obtenez un fichier system.img. Copiez ce fichier dans le répertoire .android\cyanogen365.avd qui se trouve dans votre répertoire utilisateur (C:\Documents and Settings\<user>\ sur Windows XP ou C:\Users\<user>\ sur Windows Vista).

Maintenant, il ne vous reste plus qu’à lancer l’émulateur avec la commande suivante :

emulator -avd cyanogen

Le chargement de l’émulateur est un peu lent la première fois mais c’est normal. Une fois démarré, vous pouvez constater que c’est la version Cyanogen qui tourne dans l’émulateur. ;)

Pour ceux qui utilisent Eclipse pour le développement Android, notez qu’il est possible de créer le profile de l’émulateur et de lancer ce dernier à partir d’Eclipse.

Je n’ai pas réussi à démarrer avec succès la ROM du HTC Hero. Que ce soit la ROM officielle ou bien celle générée à partir de mon téléphone. Si quelqu’un a des informations sur le sujet, ça m’intéresse énormément car ce serait très pratique de pouvoir tester certain développement avec la couche HTC Sense via l’émulateur (et donc sans risquer de le faire sur le téléphone).

Je vous laisse vous amuser avec les ROMs personnalisées ! :)

 

Eclipse Maven – Nexus Indexer vide avec le plugin m2eclipse

5 January 2010 par SeB Pas de commentaire »

Je viens d’installer Eclipse 3.5, plus connu sous le nom de Galileo, et le plugin m2eclipse permettant de gérer des projets Maven. Lors de la création d’un nouveau projet Maven, il m’était impossible de sélectionner un archétype car la liste “Nexus Indexer” était vide.

Heureusement, il existe une solution à ce problème. Allez dans le menu “Window” et cliquez sur “Show view > Other…”. Ensuite sélectionnez “Maven > Maven Indexes” et cliquez sur “OK”. Une nouvelle vue “Maven Indexes” s’affiche. Elle doit alors contenir deux dépôts : workspace et local. Faites un click-droit sur cette vue et cliquez sur “Add Index”. Mettez la valeur http://repo1.maven.org/maven2/ pour le champ “Repository URL” et central pour “Display name (optional)”. Enfin, cliquez sur “OK”. Eclipse va alors lancer le traitement “Updating indexes”. Une fois ce traitement terminé, vous pourrez créer un nouveau projet Maven et sélectionner un archétype puisque la liste “Nexus Indexer” ne sera plus vide.

Vous pouvez continuer à vous amuser avec Maven sur Eclipse !

 

AjaxLoad – icône animé d’attente

18 June 2009 par SeB 2 commentaires »

A force de mettre de l’Ajax un peu partout, il est nécessaire d’afficher un signal visuel pour indiquer à l’utilisateur que des données sont en cours de chargement ou qu’un traitement est en cours. Ceci se fait avec de simples icônes animés. Le site AjaxLoad propose un générateur gratuit d’icône sur la base d’une quarantaine de modèle et laisse libre choix sur les couleurs !

Rien de bien révolutionnaire mais ça se révèle très pratique. Alors pourquoi s’en priver ! ;-)

 

Internet Explorer – la fonction window.open() perd le referer

15 June 2009 par SeB 4 commentaires »

Je viens de découvrir que Internet Explorer ne transmet pas le referer lorsqu’une popup est affichée avec la fonction window.open() en Javascript. Bien entendu, votre butineur préféré, Firefox, transmet correctement le referer mais pas Internet Explorer ! :-(

La première idée qui vient à l’esprit est d’utiliser le tag <a />  avec l’attribut target comme ceci :

<a href="monlien"
   target="_blank">Cliquez ici<a>

Cette méthode fonctionne très bien. En revanche, elle ne permet pas de spécifier certaines options propres aux popups qui leurs donnent leur aspect bien particulier. C’est pourquoi, je vous propose une solution qui est un contournement au problème rencontré avec Internet Explorer et qui fonctionne aussi avec Firefox :

<a href="monlien"
   onclick="javascript:window.open('','mapopup','modal=yes,scrollbars=no,menubar=no,toolbar=no');"
   target="mapopup">Cliquez ici<a>

Voilà ! Vous avez un lien qui ouvre une popup correctement. Et ce lien transmet sous Firefox et surtout sous Internet Explorer le referer.

 

YSlow – gestion des profils

22 May 2009 par SeB Pas de commentaire »

Je vous ai récemment présenté l’outil YSlow qui permet d’optimiser un site web assez simplement. Sur les conseils avisés de Laurent, j’ai découvert qu’il était possible de sélectionner le profil de son site :

  • Classic(V1)
  • YSlow(V2)
  • Small Site or Blog

En choisissant ainsi le profil “Small Site or Blog”, certains critères de notation peuvent changer comme les ETags qu’il n’est plus nécessaire de désactiver pour des sites de moindre importance (en terme d’infrastructure). De plus, le CDN devient hors de propos et il n’est plus nécessaire de modifier la configuration de cette extension Firefox pour obtenir attendu. ;-)

Encore merci à Laurent et bons profilages !

 

YSlow – comment optimiser son site web en quelques minutes ?

13 May 2009 par SeB 14 commentaires »

Votre site est poussif ? Le temps de chargement ou d’affichage des pages est trop long ? Avant de penser à changer d’hébergement et avant de se plonger dans le code afin d’y trouver des points d’amélioration, il est peut-être important de regarder de plus près comment sont conçues vos pages web.

Yahoo propose une extension Firefox très intéressante, nommée YSlow. Il faut prononcer “why slow” pour “pourquoi ça rame ?”. ;-) Cette extension permet de faire des contrôles sur une page à partir d’une checklist qui se compose de 13 points :

  • Réduire le nombre de requêtes HTTP
  • Utiliser un CDN
  • Ajouter des entêtes HTTP d’expiration
  • Compresser le contenu des données échangées
  • Placer les feuilles de style CSS le plus tôt possible
  • Placer les scripts Javascript le plus tard possible
  • Éviter les expressions CSS
  • Extraire un maximum de CSS et Javascript dans des fichiers à part
  • Réduire le nombre de résolution DNS
  • Réduire la taille du Javascript
  • Éviter les redirections HTTP
  • Supprimer les scripts en double
  • Supprimer les ETags

En respectant ces 13 points, votre site web devrait être plus performant si ce n’était pas le cas auparavant. Le plugin permet de donner une note globale pour une page avec une note pour chaque point. La documentation est très bien faite. Alors plutôt que d’expliquer tous les points en donnant des axes d’amélioration, je vais vous détailler un exemple concret. :-)

Je travaille sur un site pour les fans du jeu de cartes à collectionner Magic: The Gathering. Le design est plus que rudimentaire (avis aux artistes ! :-D ), c’est pourquoi je n’en ai pas encore parlé ici. La base de données des cartes est assez conséquente et regorge d’information. Il se peut donc que certaines pages puissent mettre un peu de temps à s’afficher. C’est pourquoi j’ai travaillé sur l’optimisation du site.

Comme vous pouvez le voir, la première note obtenue était un D avec un score de 61 (sur 100).

 

Résultat YSlow avant optimisation

J’ai donc décidé de commencer par le dernier point en supprimant les ETags. En effet, cette information est très peu et très mal utilisée. Alors, pour réduire le taille des données transportées autant l’enlever. Et cela se fait très facilement (si vous utilisez Apache comme serveur HTTP) en ajoutant la ligne suivante dans votre fichier .htaccess :

FileETag none

Après avoir fait cette modification, la note globale était toujours un D et le score est seulement monté à 63. Mais pour ce point, le F s’est transformé en B. :-)

Ensuite, je me suis attaqué au positionnement des entêtes HTTP d’expiration. Ce paramétrage permet de réduire le nombre de requête HTTP faite par le navigateur en lui indiquant de conserver certaines données plus ou moins longtemps. C’est tout aussi simple à mettre en place que l’astuce précédente puisqu’il faut modifier le même fichier en y ajoutant les lignes suivantes :

ExpiresActive On
ExpiresByType text/css "access plus 30 days"
ExpiresByType text/javascript "access plus 7 days"
ExpiresByType application/x-javascript "access plus 7 days"
ExpiresByType application/javascript "access plus 7 days"
ExpiresByType image/x-icon "access plus 7 days"
ExpiresByType image/vnd.microsoft.icon "access plus 7 days"
ExpiresByType image/png "access plus 30 days"
ExpiresByType image/gif "access plus 30 days"
ExpiresByType image/jpeg "access plus 30 days"
ExpiresByType image/jpg "access plus 30 days"
ExpiresByType application/x-shockwave-flash "access plus 60 days"

Les délais d’expirations dépendent beaucoup de la vie du site. En effet, si des fichiers CSS ou Javascript sont menés à changer régulièrement, il faut réduire ce délai sous peine que les butineurs des visiteurs ne prennent pas en compte la nouvelle version. Cette optimisation a permis d’obtenir un B pour ce point et un C en note globale avec un score de 73. Ça progresse…

Après avoir réglé ces deux points, la compression du contenu m’a parue être une optimisation essentielle et à moins coût. Ceci réduit considérablement la taille des fichiers HTML ou XML et ainsi les pages se téléchargent plus rapidement. Pour activer la compression GZip des données, il faut encore ajouter dans le fichier .htaccess la ligne suivante :

AddOutputFilterByType DEFLATE text/javascript application/javascript text/css application/xhtml+xml text/html text/plain application/json text/xml

Avec la compression GZIP, YSlow attribue la note A pour ce point et la note globale B avec un score qui continue sa progression en arrivant à 82.

En regardant le comportement du butineur, j’ai remarqué que le composant Javascript Script.aculo.us générait un grand nombre de requête HTTP pour télécharger de nombreux fichiers de scripts. De plus, ces fichiers ne sont pas proposés en version compactée. En cherchant un peu, j’ai trouvé un package nommé Protoculous qui est une version compacté de Prototype et Script.aculo.us en un seul fichier ! Voilà une bonne méthode pour réduire le nombre de requête HTTP.

En remplaçant ces composants par Protoculous, le site obtient la note A pour ce point et la note globale passe à A avec un score de 90.

Le site n’est pas “encore” assez conséquent pour utiliser un CDN. Mais juste pour voir la note obtenue avec un CDN, j’ai ajouté le paramètre suivant dans Firefox (dans la page about:config) :

extensions.yslow.cdnHostnames=www.mtgaddict.net

En réglant ce dernier point le site obtiendrai la note A pour ce point et son score serait de 97. Pas mal, non ? :-)

 

Résultat YSlow après optimisation

Il y a encore quelques points d’amélioration possibles. Mais j’ai voulu montrer comment améliorer les performances d’un site en fournissant très peu d’effort. Des pages HTML de près de 275Ko ne font plus que 25Ko. Et les temps d’affichage des pages se sont nettement réduits.

Couplé à ces optimisations, j’ai également activer le cache HTML côté serveur pour certaines pages stratégiques à contenu fixe. Si votre moteur de rendu offre cette fonctionnalité, pensez-y aussi.

 

Dites au revoir aux PermGen space

6 June 2008 par SeB 4 commentaires »

Vous travaillez sous Eclipse ? Vous utilisez un serveur d’applications intégrant Tomcat tel que JOnAS ou JBoss ? Et l’accès aux données est fait via Hibernate (même encapsulé dans la couche EJB3) ? Et pour finir, votre application contient un module web ?

Si vous avez répondu par l’affirmative à la majorité de ces questions, vous devez bien connaitre le message suivant :

PermGen space

Ceci se produit après quelques déploiements à chaud de votre application et provoque le blocage de votre serveur d’application. Après une telle erreur, il ne reste plus qu’à tuer le processus du serveur (le script d’arrêt ne fonctionnant plus) puis à le relancer.

Après avoir investigué sur le sujet, il semble que l’utilisation de bibliothèques externes qui font du chargement dynamique de classe ne soit pas compatible avec le redéploiement car l’URLClassLoader de Tomcat garde des références sur des objets dont les classes ont été chargées dynamiquement lors de l’exécution. Ce qui empêche le garbage collector de faire correctement son travail. ;-)

Or Hibernate utilise la bibliothèque CGLIB pour le chargement dynamique de classe (lazy=false).

Spécifique à la JVM Sun, le PermGen space est une zone mémoire qui contient tout ce qui n’est pas géré par le garbage collector; tout ce qui est relatif au classes (leur structure: méthodes, champs, annotations…), les champs static, les chaines littérales… On spécifie le PermGen space avec les propriétés -XX:PermSize=256m et -XX:MaxPermSize=256m par exemple. Plus on a de classes différentes plus il faut augmenter la taille de cette zone mémoire.

Pour résoudre le problème, enfin pour le repousser devrais-je dire, il est possible d’ajouter le paramètre suivant lors du lancement de votre serveur d’application : -XX:MaxPermSize=256m. La taille étant à définir selon votre utilisation. Par contre, il faut éviter de mettre le paramètre -noclassgc qui empêche le garbage collector de nettoyer l’espace du PermGen.

L’autre solution est d’utiliser la JVM d’IBM ou JRockit de BEA. Mais on ne fait pas de polémique ici. :-P

 

Les bonnes pratiques avec Struts 2 – afficher un double select horizontalement

4 June 2008 par SeB 2 commentaires »

Voici le second billet dans la série sur Les bonnes pratiques avec Struts 2.

Introduction

Struts 2 permet de gérer facilement des doubles listes déroulantes (tag <select> en HTML) avec le tag <s:doubleselect>. Le problème est que les listes déroulantes générées avec ce tag s’affichent toujours l’une au dessous de l’autre (ie. verticalement). Or, souvent il est souhaitable que ces listes soient affichées l’une à côté de l’autre (ie. horizontalement).

Solutions

En lisant le code du template par défaut de Struts 2, on se rend compte que le retour à la ligne entre les deux listes est forcé avec le tag <br />. Donc, il n’existe qu’une seule solution : réécrire le template pour le tag <s:doubleselect>. Enfin, il faut juste supprimer le tag <br /> présent dans le fichier doubleselect.ftl (ligne 32 dans la version 2.0.11 de Struts 2). ;-)

Conclusion

Encore une fois, on peut s’étonner de l’ajout par Struts 2 d’un <br /> entre les deux listes déroulantes. De plus, j’ai essayé d’ajouter un nouvel attribut au tag<s:doubleselect> pour paramétrer l’alignement (horizontal et vertical), mais je n’ai pas réussi. :-(

 

Supprimer les accents UTF8 avec PHP

8 April 2008 par SeB 9 commentaires »

Il est souvent utile de supprimer les accents des caractères accentués dans une chaîne. Cette action est utilisée par exemple pour générer une URL propre ou bien un nom de fichier qui ne posera pas de problème.

En PHP, le développeur retrouve souvent la solution  suivante :

$str = strtr($str, ‘ÁÀÂÄÃÅÇÉÈÊËÍÏÎÌÑÓÒÔÖÕÚÙÛÜÝ’, ‘AAAAAACEEEEEIIIINOOOOOUUUUY’);
$str = strtr($str, ‘áàâäãåçéèêëíìîïñóòôöõúùûüýÿ’, ‘aaaaaaceeeeiiiinooooouuuuyy’);

Ce bout de code fonctionne très bien en IS0-8859-1. Cependant, avec une chaîne en UTF8, des caractères étranges vont s’immiscer. Cela vient du fait que les caractères sont encodés sur 8 bits.

Après maintes essais avec iconv() et autres strtr(), je n’ai pas trouvé de solution à ce problème. Heureusement, Olivier Laviale a trouvé une astuce. Je ne suis pas convaincu que ce soit la méthode la plus performante, mais elle a le mérite de fonctionner :

$str = htmlentities($str, ENT_NOQUOTES, ‘utf-8′);
$str = preg_replace(‘#\&([A-za-z])(?:uml|circ|tilde|acute|grave|cedil|ring)\;#’, ‘\1′, $str);
$str = preg_replace(‘#\&([A-za-z]{2})(?:lig)\;#’, ‘\1′, $str);
$str = preg_replace(‘#\&[^;]+\;#’, ”, $str);

Je vous laisser consulter le billet original d’Olivier sur le sujet si vous souhaitez avoir plus d’informations.

Ah ! Les joies de l’encodage… :-)