RSS Feed

Archive de April, 2006

Bitty Browser – un butineur embarqué

28 April 2006 par SeB Pas de commentaire »

Ou comment afficher un butineur dans une page web ?

Bitty Browser est réalisé en JavaScript et permet d’afficher un mini-butineur sur un site web :


Un gadget inutile ? Eric Dupin y voit une application intéressante : une émulation live pour les appareils mobiles tels que les PDAs. En effet la taille de la zone d’affichage est totalement redimensionnable. Néanmoins, il ne faut pas oublier que Bitty adopte les mêmes comportements que le butineur utilisé pour l’afficher. Ainsi les comportements peuvent fortement différer par rapport à un vrai PDA.

Son utilisation reste anecdotique, mais sympathique.

 

Des attributs dynamiques dans les TagLibs

27 April 2006 par SeB Pas de commentaire »

Comment procéder pour créer ses propres TagLibs acceptant des attributs dynamiques ?

C’est à cette question que cet article tente de répondre par un simple exemple. Les TagLibs permettent aux développeurs de pages JSP d’implémenter leurs propres tags JSP qui exécutent du code Java plus ou moins complexe. Pour rendre ce code paramétrable, il est possible d’utiliser les attributs du tag.

Exemple simple

Voici un exemple d’implémentation de taglib avec la classe com/company/project/HelloTag.java :

package com.company.project;
import java.io.IOException;
import javax.servlet.jsp.JspException;
import javax.servlet.jsp.tagext.TagSupport;
public class HelloTag extends TagSupport {
	private String from = null;
	private String to = null;
	public void setFrom(String from) {
		this.from = from;
	}
	public void setTo(String to) {
		this.to = to;
	}
	public int doStartTag() throws JspException {
		try {
			pageContext.getOut().println	("Hello <blink>"+to+"</blink>"+(from!=null?", I'm "+from:"")+".");
		} catch (IOException e) {
			throw new JspException ("I/O Error", e);
		}
		return SKIP_BODY;
	}
}

Sa défintion dans WEB-INF/ht.tld :

<?xml version="1.0" encoding="ISO-8859-1" ?>
<!DOCTYPE taglib PUBLIC "-//Sun Microsystems, Inc.//DTD JSP Tag Library 1.2//EN"
	"http://java.sun.com/dtd/web-jsptaglibrary_1_2.dtd">
<taglib>
	<tlib-version>1.0</tlib-version>
	<jsp-version>1.2</jsp-version>
	<short-name>ht</short-name>
	<uri>ht</uri>
	<display-name>Hello tag</display-name>
	<description>Hello tag</description> 	<tag>
		<name>hello</name>
		<tag-class>com.company.project.HelloTag</tag-class>
		<body-content>empty</body-content>
		<attribute>
			<name>from</name>
			<required>false</required>
		</attribute>
		<attribute>
			<name>to</name>
			<required>true</required>
		</attribute>
	</tag>
</taglib>

Et la page JSP l’utilisant index.jsp :

<?xml version="1.0" encoding="ISO-8859-1" ?>
<jsp:root xmlns:jsp="http://java.sun.com/JSP/Page" version="2.0" xmlns:ht="/WEB-INF/ht.tld">
<html xmlns="http://www.w3.org/1999/xhtml"> <head>
	<title>Hello tag</title>
</head>
<body>
	<ht:hello to="you" from="me" /><br />
	<ht:hello to="you" />
</body>
</html>
</jsp:root>

Cet exemple fonctionne assez bien et affiche le texte suivant :

Hello you, I'm me. Hello you.

Cependant, les attributs to et from sont souvent amenés à être dynamiques. C’est à dire, qu’ils peuvent être le résultat d’un scriptlet ou d’expressions languages. Malheureusement le code ci-dessus ne fonctionne pas avec des attributs dynamiques.

Les scriptlets

Si la page JSP est modifiée pour utiliser un scriptlet ainsi :

	<ht:hello to="<%=request.getParameter("name")%>" from="me" />

Le résultat de l’exécution de la page en passant la valeur pipo au paramètre name est :

Hello <%=request.getParameter("name")%>, I'm me.

Pour que le scriptlet soit évalué, il est nécessaire de modifier la définition du taglib de manière à préciser que les attributs du tags peuvent être le résultat de scriptlets :

<?xml version="1.0" encoding="ISO-8859-1" ?>
<!DOCTYPE taglib PUBLIC "-//Sun Microsystems, Inc.//DTD JSP Tag Library 1.2//EN"
	"http://java.sun.com/dtd/web-jsptaglibrary_1_2.dtd">
<taglib>
	<tlib-version>1.0</tlib-version>
	<jsp-version>1.2</jsp-version>
	<short-name>ht</short-name>
	<uri>ht</uri>
	<display-name>Hello tag</display-name>
	<description>Hello tag</description> 	<tag>
		<name>hello</name>
		<tag-class>com.company.project.HelloTag</tag-class>
		<body-content>empty</body-content>
		<attribute>
			<name>from</name>
			<required>false</required>
			<rtexprvalue>true</rtexprvalue>
		</attribute>
		<attribute>
			<name>to</name>
			<required>true</required>
			<rtexprvalue>true</rtexprvalue>
		</attribute>
	</tag>
</taglib>

Avec cette modification, le taglib fonctionne mieux et donne le résultat suivant :

Hello pipo, I'm me. Hello you.

Les expressions languages

Les scripltets sont très bien. Mais depuis JSP 2.0 et aujourd’hui avec JSP 2.1, il est préférable d’utiliser les expressions languages. La page JSP utilisant ces expressions est la suivante :

<?xml version="1.0" encoding="ISO-8859-1" ?>
<jsp:root xmlns:jsp="http://java.sun.com/JSP/Page" version="2.0" xmlns:ht="/WEB-INF/ht.tld">
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
	<title>Hello tag</title>
</head>
<body>
	<ht:hello to="${param.name}" from="me" />
</body>
</html>
</jsp:root>

A l’exécution de cette page, le résultat obtenu est le suivant :

Hello ${param.name}, I'm me.

L’expression language n’est pas interprétée. Pour résoudre ce problème, il est nécessaire de modifier le code du taglib. Voici la version améliorée et supportant les expressions languages :

package com.company.project;
import java.io.IOException;
import javax.servlet.jsp.JspException;
import javax.servlet.jsp.tagext.TagSupport;
import org.apache.taglibs.standard.lang.support.ExpressionEvaluatorManager;
public class HelloTag extends TagSupport {
	private String from = null;
	private String to = null;
	public void setFrom(String from) {
		this.from = from;
	}
	public void setTo(String to) {
		this.to = to;
	}
	public int doStartTag() throws JspException {
		try {
			String fromEL = (String)ExpressionEvaluatorManager.evaluate("from", this.from, String.class, this, super.pageContext );
			String toEL= (String)ExpressionEvaluatorManager.evaluate("to", this.to, String.class, this, super.pageContext );
			pageContext.getOut().println	("Hello <blink>"+toEL+"</blink>"+(fromEL!=null?", I'm "+fromEL:"")+".");
		} catch (IOException e) {
			throw new JspException ("I/O Error", e);
		}
		return SKIP_BODY;
	}
}

Cette fois, la page affiche correctement le message :

Hello pipo, I'm me. Hello you.

Maintenant ce taglib paramétrable accepte les attributs dynamiques. Ainsi le code HTML généré pourra dépendre du contexte de l’utilisateur.

 

Un stade de fans rien que pour vous

25 April 2006 par SeB Pas de commentaire »

Saviez-vous que le luxe de s’offrir un stade rempli de vos supporteurs est la la porté d’un clique ?

Alors que certain vont appel à Zinedine Zidane pour recruter des supporteurs de l’équipe de France et ainsi remplir un stade aux couleurs de la France. D’autres remplissent les stades plus simplement comme vient de la faire Debian Addict :

Un stade rempli pour Debian Addict

Comme l’explique Netwizz dans son billet sur les 1024 personnes, l’exploit a été possible grâce au travail de Maripo GODA. En effet, sur son site, il propose de générer à partir d’une image (photo, logo, …), une nouvelle image de fans dans un gradin aux couleurs de votre première image. La version anglaise du site ne permettant pas toujours de tester le service, il est préférable de passer par la traduction.

 

Modèle d’anti-conception pour la gestion des exceptions

24 April 2006 par SeB Pas de commentaire »

Les exceptions sont très utilisées. Pourtant, il n’est pas toujours évident de savoir comment les gérer correctement.

Tim McCune a écrit un article intitulé Exception-Handling Antipatterns où il présente les modèles d’anti-conception sur le traitement des exceptions.

Cet article donne les réponses aux questions :

  • Faut-il créer ses propres exceptions ?
  • Quand faut-il lever une exception ?
  • Quand capturer une exception ?

De son étude, on peut retenir qu’il existe deux types d’exception à créer soi-même :

  • Quand un problème survient : elle est propre à la couche applicative.
  • Pour encapsuler et lever une exception rencontrée : elle est utilisé pour masquer l’implémentation sous-jacente.

Quelques cas d’anti-conception

De plus, il nous conseille de ne pas tracer puis lever une exception. En effet lors de la capture d’une exception, il faut soit la tracer soit la lever. Mais il ne faut pas faire ces deux actions en même temps, sous peine de rencontrer les piles d’exception en double (voir plus) dans les traces.

Il est très dangereux de capturer directement l’exception générique : Exception. En effet, si le code appelé est modifié et peut lever de nouvelles exceptions, il est possible de passer à côté de nouveaux cas d’erreur non gérés.

Il faut faire attention à l’utilisation de l’encapsulation d’exception pour ne pas perdre les informations transmises par l’exception source.

De même, il n’est pas conseillé de retourner null lors qu’une exception est rencontrée. Comme son nom l’indique, une exception est un cas exceptionnel. Il faut réserver l’utilisation de la valeur null pour les cas fonctionnels.

Le traitement d’une exception peut passer par l’exécution de code de finalisation. Ce code ne doit en aucun cas pouvoir lever une exception sous peine de perdre la cause réelle la première exception.

Parfois l’implémentation de certaines méthodes ne sont pas toujours disponible. Cela se traduit souvent par l’écriture d’une méthode qui retourne la valeur null. Il est préférable de retourner une exception expliquant que la méthode n’est pas implémentée.

La gestion des exceptions, par le traitement de la cause de l’exception, fragilise le code. En effet, lorsque l’on est pas maitre du code levant l’exception, la cause de l’exception peut changer si l’implémentation change. Le code appelant compilera toujours, pourtant le résultat à l’exécution n’est pas garanti !

Quelques conseils supplémentaires

Sur le même thème, Gunjan Doshi et Jim Cushing ont écrit respectivement les meilleures utilisations de la gestion des exceptions et trois règles pour la gestion des exceptions. Les auteurs insistent sur la différence entre les classes Throwable, Error, Exception et RuntimeException en Java.

J. Cushing explique également qu’il faut lever le plus tôt possible une exception. Et de la même manière, il faut capturer le plus tard possible une exception levée. Le fait de lever le plus tôt possible une exception la rend plus spécifique et donc plus explicite. Et en capturant le plus tard possible une exception, cela permet de bénéficier d’une pile d’exception plus complète et donc plus facile à analyser.

Conclusion

La prochaine fois que vous vous posez des questions sur la façon dont il faut concevoir la gestion des exceptions dans votre application, repensez à ces modèles d’anti-conception. Celà vous permettra d’éviter quelques pièges.

 

Smarty – postfilter ou output filter ?

21 April 2006 par SeB Pas de commentaire »

Quelle est la différence entre les filtres de post-compilation et les filtres de sortie ?

Smarty est un excellent moteur de templates PHP. Ce framework compile les templates écris par les développeurs pour exécuter par la suite la version compilée[1].

Parfois, il est nécessaire très pratique d’automatiser des traitements sur les templates. Par exemple pour modifier les URLs, appliquer des filtres sur les adresses emails, … C’est pourquoi Smarty propose les systèmes de postfilters et output filters. Mais lesquels utiliser ?

Les postfilters sont appliqués après la phase de compilation et juste avant que le template compilé ne soit enregistré dans le cache. Alors que les output filters sont appliqués à l’exécution du template compilé. Qu’est-ce que cela change dans la pratique ? Dans le premier cas, les modifications sur le template sont réalisées une seule fois et enregistrées dans le cache. Dans le second cas, les modifications sont réalisées à chaque appel au template.

Les postfilters semblent être une solution plus performante que les output filters. Pourtant lorsque les traitements à appliquer sur un template doivent être dynamiques à l’exécution[2], les output filters sont obligatoires.

Après ces quelques précisions, vous pouvez retourner à vos filtres[3]

Notes

[1] Par souci d’optimisation des performances.

[2] Par exemple si les modifications dépendent du contexte utilisateur.

[3] N’oubliez pas qu’il existe aussi les prefilters qui sont appliqués avant l’étape de compilation de templates.

 

La newsletter est disponible !

20 April 2006 par SeB Pas de commentaire »

Afin d’offrir un maximum de média de diffusion, une newsletter est maintenant disponible pour suivre l’actualité du site.

En plus des flux RSS, il est possible de s’inscrire à la newsletter pour être informé des nouveaux billets publiés.

Cette newsletter a été mise en place grâce au plugin :

  • Newsletter 1.9.4.4 : qui envoi une lettre d’information sous forme de mail dès qu’un nouveau billet est publié.

Le plugin a été modifié rapidement à cause d’une incompatibilité avec le script d’URL Rewriting pour Free. Quelques investigations vont être menées avant de communiquer sur cette modification. Il ne reste plus qu’à la mettre en valeur visuellement. ;-)

 

EasyPHP et PHP5

19 April 2006 par SeB Pas de commentaire »

Comment mettre à jour EasyPHP pour obtenir les fonctionnalités de PHP5 ?

EasyPHP est une solution logicielle qui installe et configure sous MS Windows : Apache, PHP, MySQL ainsi de quelques outils de configuration et d’administration. La dernière version stable est la 1.8 qui correspond à :

  • Apache 1.3.33
  • PHP 4.3.10
  • MySQL 4.1.9
  • phpMyAdmin 2.6.1

De plus en plus d’hébergeurs proposent PHP5, mais EasyPHP ne propose pas cette version de PHP. Bien sur, il existe d’autres solutions telles que WAMP5 ou Mov’AMP supportent PHP5. Mais cet article propose de mettre à jour la version courante de EasyPHP pour PHP5.

Il faut disposer d’un EasyPHP installé dans un répertoire nommé EASYPHP_HOME. Il est nécessaire de télécharger le binaire MS Windows sous forme de package zip de PHP5, puis de décompresser cette archive dans le répertoire EASYPHP_HOME/php5.

Renommer le répertoire EASYPHP_HOME/php en EASYPHP_HOME/php4, puis EASYPHP_HOME/php5 en EASYPHP_HOME/php.

Editer le fichier EASYPHP_HOME/apache/conf/httpd.conf :

  • Remplacer la ligne LoadModule php4_module "EASYPHP_HOME/php/php4apache.dll" par LoadModule php4_module "EASYPHP_HOME/php/php5apache.dll".
  • Remplacer la ligne AddModule mod_php4.c par AddModule mod_php5.c.

Ces manipulations permettent d’utiliser PHP5. Cependant le module MySQL pour PHP ne fonctionne plus.

Editer le fichier EASYPHP_HOME/apache/php.ini :

  • Ajouter en fin de fichier la ligne extension=php_mysql.dll.
  • Modifier la ligne extension_dir = "EASYPHP_HOME\php\extensions\" pour obtenir extension_dir = "EASYPHP_HOME\php\ext\".

Maintenant l’installation d’EasyPHP est fonctionnelle et permet l’exécution de scripts PHP en version 5.

 

Debian Addict déménage

18 April 2006 par SeB Pas de commentaire »

Le projet souhaite évoluer et proposer plus de services.

La semaine dernière, Debian Addict a changé d’hébergement. L’hébergeur est toujours le même, à savoir : OVH. La migration s’est très bien passée[1].

Avec Olivier, nous avons décidé de partager le même hébergement. Ainsi Debian Addict partage le même espace d’hébergement que GWhere. D’autres surprises devraient venir par la suite…

Notes

[1] Mis à part un petit problème d’encodage du caractère à en UTF-8.

 

Le problème du référencement du Web 2.0

14 April 2006 par SeB Pas de commentaire »

Parmi les zones d’ombres du Web 2.0, le référencement suscite beaucoup d’interrogations.

Le Journal du Net se demande si le Web 2.0 et le référencement font bon ménage. De par l’architecture utilisée, le référencement classique du Web 2.0 est délicat. En effet les moteurs de recherche qui jusqu’à présent devaient indexer de simples pages HTML, ont affaire aujourd’hui à de vrais interfaces graphiques interactives.

Avant le Web 2.0, le contenu et la présentation étaient confondus[1]. Or ces nouveaux sites web proposent une interface riche qui va elle-même interroger un service web distant pour obtenir le contenu.

Donc au-delà un problème technique pour les référenceurs de reproduire les actions des utilisateurs[2] pour indexer un site Web 2.0, ils doivent changer leur perception de l’indexation puisqu’ils n’ont plus accès directement à un contenu.

Parmi les bonnes pratiques du Web 2.0, la diffusion de l’information via RSS est un élément clé. L’utilisation des flux RSS est une piste intéressante pour le référencement du contenu. En effet, avec le RSS les moteurs de recherche ont accès directement au contenu et seulement au contenu[3]. Reste à voir, vers où les moteurs de recherche redirigeront l’utilisateur lorsque le résultat d’une recherche pointera sur un flux RSS ou équivalent.

Même si le problème du référencement tend à se résoudre, il ne faudra pas oublier le problème de l’accessibilité de les services Web 2.0 !

Notes

[1] D’un point de vue référencement. Car d’un point de vue technique, il existe depuis longtemps des techniques telles que le MVC, les feuilles de style CSS, …

[2] En ajoutant le support du JavaScript entre autre.

[3] Dans un format standardisé.

 

Mise à jour de DotClear et anti-spam

12 April 2006 par SeB Pas de commentaire »

DotClear 1.2.4 est sorti, il fallait donc mettre à jour le site !

La migration s’est déroulée correctement comme lors du passage de la version 1.2.0 à 1.2.2.

Suite à une activité de plus en plus féroce des spammeurs, il a été vital nécessaire d’installer un nouveau plugin :

De plus, les commentaires ne sont plus modérés. Vous verrez donc vos commentaires s’afficher en temps réel sauf s’ils sont filtrés par cet anti-spam. Dans ce cas, ils se retrouveront dans une file d’attente pour modération. Ils s’afficheront une fois validés par l’administrateur de ce weblogue.