blogs

Le Javascript peut aussi être marrant !

D'habitude, lorsqu'on vous parle de Javascript, vous sentez une poussée d'urticaire, des frissons vous parcourent, ou vous vous enfuyez au loin :D (qui a dit que j'en fait un peu trop ? oO) Mais le Javascript, ça peut aussi être fun ! La preuve:

  1. ouvrez votre navigateur préféré
  2. rendez vous sur Google
  3. dans la barre d'adresse, remplacez l'URL par le code Javascript suivant, validez et appréciez :): javascript:R=0; x1=.1; y1=.05; x2=.25; y2=.24; x3=1.6; y3=.24; x4=300; y4=200; x5=300; y5=200; DI=document.images; DIL=DI.length; function A(){for(i=0; i-DIL; i++){DIS=DI i .style; DIS.position='absolute'; DIS.left=Math.sin(R*x1+i*x2+x3)*x4+x5; DIS.top=Math.cos(R*y1+i*y2+y3)*y4+y5}R++}setInterval('A()',5); void(0);

Note 1: testé sous IE 6 SP2 et Firefox 2.0.0.2 sous Windows XP Pro... Je n'ai pas d'Opéra sous la main ni d'accès à un Linux ou un MacOS pour vous garantir que ça fonctionnera également sur ces plateformes.

Note 2: ce script fonctionne également avec d'autres sites contenant des images, mais l'effet peut ne pas être le même !

Tapestry Wouah! 5

Le titre est un peu aguicheur mais les faits sont là.

Je viens à l'instant de dérouler le tutorial Tapestry 5 et j'en suis resté bouche bée. Le projet est encore en plein développement mais est déjà extrêment prometteur. Tapestry dans sa version 4 était déjà un trés bon cru - le retour à Struts étant plutôt douloureux -, mais la version 5 promet réellement d'être exceptionnelle:

  • Les composants sont de simples POJO, le tout fonctionnant grâce au respect des conventions de nommages.
  • Les composants n'ont plus besoin d'être abstraits. Il s'agissait en effet d'un point assez déroutant pour quiconque découvrait Tapestry 4.
  • Suppression de la signalétique XML qui est avantageusement remplacée par un mécanisme d'annotations.
  • Rechargement à chaud des templates et des classes de composants.
  • Blazing fast comme mentionné sur le site de Tapestry qu'on peut traduire grosso modo par rapide comme l'éclair.

Et après test je peux malheuresement vous dire que tout cela est VRAI!

Le déploiement à chaud fonctionne à merveille et cela même en modifiant la signature des méthodes ou en ajoutant carrément d'autres composants à la volée.

Question rapidité j'ai été aussi réellement impressionné. Tapestry 4 avait l'habitude de traîner des pieds lors du 1er chargement de l'application Web - la faute à Hivemind paraît-il -; La comparaison avec Tapestry 5 est flagrante. Voilà par exemple les traces de Jetty que j'obtiens lors que je lance l'application servant de base au tutorial en passant par le plugin Eclipse:

launching Jetty webapp: /hilo on address: 0.0.0.0:8080 using dir: [/home/alain/Documents/Development/Java/hilo/src/main/webapp] 
22:49:04.704 INFO   [main] org.mortbay.log.LogImpl.add(LogImpl.java:109) >16> added org.mortbay.log.OutputStreamLogSink@758fc9
22:49:04.678 INFO   [main] org.mortbay.log.LogImpl.reset(LogImpl.java:228) >11> reset
22:49:04.714 INFO   [main] org.mortbay.log.LogImpl.add(LogImpl.java:109) >11> added org.mortbay.log.OutputStreamLogSink@1113708
22:49:06.709 INFO   [main] org.apache.tapestry.TapestryFilter.init(TapestryFilter.java:91) >10> Startup time: 563 ms to build IoC Registry, 1,465 ms overall.
22:49:39.325 INFO   [SocketListener0-1] org.example.hilo.services.AppModule$1.service(AppModule.java:62) >31> Request time: 932 ms
22:49:43.326 INFO   [SocketListener0-1] org.example.hilo.services.AppModule$1.service(AppModule.java:62) >31> Request time: 547 ms
22:49:43.364 INFO   [SocketListener0-1] org.example.hilo.services.AppModule$1.service(AppModule.java:62) >31> Request time: 34 ms
22:49:45.293 INFO   [SocketListener0-1] org.example.hilo.services.AppModule$1.service(AppModule.java:62) >31> Request time: 3 ms
22:49:45.417 INFO   [SocketListener0-1] org.example.hilo.services.AppModule$1.service(AppModule.java:62) >31> Request time: 22 ms

Pour résumer

  • démarrage de Jetty via le plugin Eclipse + initialisation de la WebApp hilo : ~ 2 secondes
  • appel de la 1er page : < 1 seconde
  • appel de la 2e page : ~ 500 millisecondes
  • on passe ensuite sous la barre des 50 millisecondes et tout cela dans un environnement de développement avec le rechargement des composants à chaud.

Je m'enflamme peut être un peu mais pour l'instant je suis bluffé. On a vraiment l'impression que tout a été fait pour permettre au développeur d'être efficace et de gagner en productivité. Le simple fait de penser à mon environnement de développement au boulot me déprime - en bref Liferay + Appfuse avec ~ 1 minute pour démarrer Tomcat auquel il faudra rajouter bien 2 minutes de compilation -.

Résolution du mois prochain : prendre Tapestry 5 en main et voir s'il en a vraiment dans le ventre

26 ans déjà...

public class Personne {
	private String nom;
	private String birthdate;

 

public String getNom() { return this.nom; }

 

public String getBirthdate() { DateFormat df = new SimpleDateFormat("dd/MM/yyyy"); String today = df.parse(new Date());

 

if(this.birthdate.split("/")[0].equals(today.split("/")[0] && this.birthdate.split("/")[1].equals(today.split("/")[1]) { System.out.println("JOYEUX ANNIVERSAIRE !!!"); }

 

return this.birthdate; }

 

public void setNom(String nom) { this.nom = nom; }

 

public void setBirthdate(String birthdate) { this.age = birthdate; }

 

public Personne(String nom, String birthdate) { this.setNom(nom); this.setBirthdate(birthdate); } }

 

public class Toto { public static void main(String[] args) { Personne reno = new Personne("reno", "20/02/1981");

 

reno.getBirthdate(); // Purée, 26 ans déjà :S } }

PowerDNS et récursivité

Ces derniers jours j'ai eu besoin de mettre en place rapidement une petite architecture DNS en place pour des besoins internes. Les critères pour la mise en place du serveur DNS étaient les suivants :

  • simple
  • possibilité de configuration via un annuaire LDAP
  • et surtout, la possibilité de l'installer facilement via apt.

A coup de apt-cache search je suis tombé sur PowerDNS et aprés un tour sur le site Web du projet ma foi celui ci semblait répondre à tous mes critères de recherches - Bind ne semblait pas fournir de support LDAP sans patch.

$ sudo aptitude install pdns-server pdns-recursor pdns-backend-ldap

Dans mon cas à moi l'installation du packet pdns-recursor est important car cela va permettre à PowerDNS d'interroger d'autres serveurs DNS pour des requêtes qu'il n'est pas capable de gérer.

Je passe sur la configuration LDAP, assez simple ma foi, pour me concentrer sur celle du récursor. En effet la documentation en ligne ne m'a pas bcp aidé à ce sujet même si au final le principe est simple :

  • faire fonctionner PowerDNS comme un serveur DNS
  • autoriser la récursivité sur les interfaces locales. Le pourquoi ici : http://alternc.org/marchives/dev/2006-March/002151.html
  • préciser à PowerDNS l'IP et le port du récursor
  • démarrer le recursor.

Dans le fichier /etc/powerdns/pdns.conf

allow-recursion=127.0.0.1 10.1.10.0/24
allow-recursion-override=on
recursor=127.0.0.1:5353

Ensuite pour /etc/powerdns/recursor.conf

allow-from=127.0.0.0/8
local-port=5353
local-address=127.0.0.1

Manque plus qu'à rédémarrer le bazar

$ sudo /etc/init.d/pdns restart

Restarting PowerDNS authoritative nameserver: stopping and waiting..done Starting PowerDNS authoritative nameserver: started $ sudo /etc/init.d/pdns-recursor restart Restarting PowerDNS recursor: pdns-recursorFeb 19 23:17:12 PowerDNS recursor 3.1.4 (C) 2001-2006 PowerDNS.COM BV (Nov 12 2006, 23:19:09, gcc 4.1.2 20061028 (prerelease) (Debian 4.1.1-19)) starting up Feb 19 23:17:12 PowerDNS comes with ABSOLUTELY NO WARRANTY. This is free software, and you are welcome to redistribute it according to the terms of the GPL version 2. Feb 19 23:17:12 Operating in 32 bits mode Feb 19 23:17:12 Only allowing queries from: 127.0.0.0/8 Feb 19 23:17:12 Inserting rfc 1918 private space zones Feb 19 23:17:12 Listening for UDP queries on 127.0.0.1:5353 Feb 19 23:17:12 Listening for TCP queries on 127.0.0.1:5353 Feb 19 23:17:12 Done priming cache with root hints Feb 19 23:17:12 Calling daemonize, going to background

Mise à jour du site

Voilà j'ai enfin pris un peu de temps pour migrer le site vers Drupal 5. Au passage j'en ai également profiter pour utiliser le thème Aberdeen où j'ai apporté quelques modifications. Il y aura encore sans doute quelques modifications sur la charte graphique, pas assez contrasté à mon goût pour l'instant.

Et puis comme d'habitude des galères de charset lors des opérations d'import/export entre mon MySQL local et celui de l'hébergeur. Décidément ça ne s'arrêtera jamais.