insideIT.fr : le blog des architectes IT de SFEIR

Aller au contenu | Aller au menu | Aller à la recherche

lundi 13 septembre 2010

Faire une application JavaScript crawlable

Le problème des applications JavaScript est qu'elles ne sont pas crawlable, il est impossible pour un moteur de recherche d'avoir accès à toutes ses informations. Or les interfaces ajax se sont développé énormément depuis quelques années avec la mode du Web 2.0 et la technologie Ajax.

Google a fait une proposition et la mise en oeuvre dans son indexeur pour résoudre ce problème. Il en a parlé initialement sur le blog : http://googlewebmastercentral.blogspot.com/2009/10/proposal-for-making-ajax-crawlable.html, un site dédié à cette technique est maintenant disponible : http://code.google.com/web/ajaxcrawling/

Nous allons développé cette technique dans cet article que nous venons de mettre en place sur le site mobile de SFEIR qui a été réalisé en GWT avec le framework Modding.

Principe d'utilisation

Google part du constat que s’il rencontre un lien contenant une ancre commençant par le signe "!", ce lien ajax doit être indexé. Il va alors rappeler la page en prenant le nom de l'ancre et en la passant en paramètre de la page _escaped_fragment_=

Seulement les liens avec une ancre commençant par un "!" seront indexé, cela permet de contrôler l'indexation et ne pas se retrouver avec tous le contenu de notre application indexé par Google.

Exemple :
monsite.com/page.html#!url_ajax
Deviendra :
monsite.com/page.html?_escaped_fragment_=url_ajax

La première URL est l'URL publique, ce que l'on doit mettre en lien depuis tous les sites où l'on veux avoir un lien, l'application JavaScript doit donc ouvrir automatiquement la page url_ajax dans l'application à son ouverture.

La deuxième URL est utilisé uniquement par Google, et ne doit pas être mis en lien, elle doit retourner la version HTML de la page, c'est à dire ce qu'on aurait si on exportait l'HTML généré par notre application JavaScript si on va sur la première URL. Il est donc nécessaire que le serveur analyse l'URL et si il détecte le paramètre _escaped_fragment_, le serveur génére la version HTML de la page.

Google indexera ainsi le contenus de cette page HTML, mais dans les résultats du moteur de recherche, il affichera la première URL à l'utilisateur.

Mise en place dans une application JavaScript


Pour cela, il faut commencer par modifier son application JavaScript pour utiliser la gestion de l'Historique :
Pour les projets GWT, une api permet de le faire simplement en utilisant History : http://code.google.com/webtoolkit/doc/latest/DevGuideCodingBasicsHistory.html

History.getToken(); //Permet de récupérer le token
History.addValueChangeHandler(new ValueChangeHandler<String>() {
public onValueChange(ValueChangeEvent<String> event) {
event.getValue();
//Permet de récupérer les changements du token
}
};
History.newToken("!url_ajax"); //Ajoute un nouveau token



Notre framework Modding depuis sa version 0.3 est maintenant capable de démarrer une autre activité que l'activité principale lors du chargement de la page avec l'information dans l'url :
http://m.sfeir.com/#!com.sfeir.client.activity.PageActivity?hash=4&url=page%252Fjava.html


Ce liens lancera directement la page "Notre savoir faire / Expertise Java" sans afficher le premier menu disponible normalement :
http://m.sfeir.com


Un autre projet créé par Alexandre Thiel également chez SFEIR, permet de créer une application GWT en utilisant la notation Rest : http://code.google.com/p/restful-gwt/

Mise en place sur le serveur de la version HTML

Il faut maintenant modifier le serveur pour détecter que Google demande la version HTML ou pas, pour cela il faut détecter si le paramètre _escaped_fragment_ existe bien.
http://m.sfeir.com/?_escaped_fragment_=com.sfeir.client.activity.PageActivity?hash=4%26url=page%252Fjava.html

Pour cela, on peux facilement le faire en utilisant un filtre, qui vous permettre de choisir entre afficher la page habituelle ou la version HTML.

Pour cela, il est nécessaire de renommer le fichier html en jsp car il n'est pas possible en Java d'ajouter un filtre sur une page HTML. Ensuite, la configuration du fichier de configuration est très simple dans le fichier web.xml, en ajoutant simplement les balises filter et filter-mapping :
  <filter>
<filter-name>crawler</filter-name>
<filter-class>com.sfeir.server.CrawlerFilter</filter-class>
</filter>
<filter-mapping>
<filter-name>crawler</filter-name>
<url-pattern>*</url-pattern>
</filter-mapping>

Voyons maintenant le fonctionnement de la classe :




Le filtre pour chaque requête, vérifie si le paramètre _escaped_fragment est présent, sinon il lance la chaine suivante des filtres avec le chain.doFilter(request, response);

Dans le cas où la requête est une requête de google pour indexer la page Ajax, on reconstruit l'url originale avec l'ancre ajax.

Il reste donc à produire le code HTML, pour cela, il y a deux stratégies, soit en fonction de l'url, produire la page html en utilisant les technologies habituelles de java : jsp, spring, velocity, etc ...
Soit utiliser un navigateur internet léger comme HtmlUnit pour construire la page directement en utilisant l'application JavaScript.

La deuxième approche conseillée par Google a le mérite d'être simple à mettre en place car on utilise le code de notre application. Voici un exemple d'utilisation avec HTMLUnit :
WebClient webClient = new WebClient(BrowserVersion.FIREFOX_3);
webClient.setThrowExceptionOnScriptError(false);
webClient.setJavaScriptEnabled(true);
HtmlPage page = webClient.getPage(pageName);
webClient.setTimeout(10000);
out.println(page.asXml());
webClient.closeAllWindows();


Le timeout dépend de votre application, et du temps nécessaires pour que le code javascript s'exécute, que les services soient appeler, et que le rendu final soit fait !
Cela peux donc prendre du temps et des ressources.

Pour le site mobile de sfeir, nous avons utilisé la première approche, car le site est hébergé sur Google App Engine, et la bibliothèque n'est pour l'instant pas compatible avec App Engine, le portage est en cours. De plus, nous sommes limité par le temps d'exécution des pages à 30 secondes.
Comme le site mobile est statique, réaliser la version HTML était assez facile, simplement à lire les fichiers HTML normalement chargés par la partie GWT et les écrirent dans la réponse du serveur.

Testons l'indexation

Cette article explique le fonctionnement préconisé par Google pour rendre ses applications indexable, et plus particulièrement les application GWT en Java.
C'est pour Sfeir, l'occasion de mettre en pratique et de lancer un test grandeur nature de ce référencement.

Merci de nous y aider en ajoutant des liens depuis vos sites vers une page particulière de notre site mobile pour tester l'indexation dans Google.

Cette expérimentation nous permettra ensuite de valider la technologie pour l'utiliser chez nos clients et vos clients.

lundi 10 mai 2010

En attendant Google I/O...

googleio_mark.jpg Nous sommes à 9 jours de la grande messe annuelle de Google : "Google I/O".
Pendant 2 jours, 3000 développeurs se retrouvent au Moscone Center à San Fransico pour suivre à un rythme effréné des conférences sur toutes les technologies Google.
Chez SFEIR nous travaillons beaucoup avec ces technologies, en particulier GWT, App Engine et Android, nous sommes donc particulièrement attentifs à ce qui va sortir de cet évènement.
C'est bien souvent l'occasion aussi pour google de faire une annonce fracassante. Pour rappel la session 2009 a levé le voile sur Google Wave qui a fait sensation par son coté avant-gardiste et innovateur.
Alors à quoi peut-on s'attendre cette année ?

Android


android-robot-io.png Tim Bray l'a dit sur le blog android : "I don’t think that I’m telling any secrets when I say that there will be Android-related announcements at that event"
Le petit monde d'Android évolue à toute vitesse : nouvelles versions, nouveaux téléphones, parts de marché à croissance exponentiel.
Des signes nous ont montré l'approche de Froyo, la version 2.2 d'Android qui pourrait être dévoilée lors de l'évenement. On connait déjà quelques nouveautés :

  • Gain de performance important via un compilateur Just In Time pour la machine virtuelle Dalvik
  • Un nouveau market avec mise à jour automatique des applications
  • Console améliorée pour les developpeurs avec les erreurs clientes consultables
  • Support de la radio FM pour les appareils le supportant
  • Support Flash 10.1
  • Des évolutions pour le développement de jeux (OpenGL ES ou autres), terrain sur lequel Google essaye de faire progresser Android qui fait encore pâle figure face à l'iphone.


On parle aussi de nouveaux types d'appareils : le robot s'inviterai sur des tablettes ainsi que sur les télévisions.


App Engine


google-app-engine.png Une roadmap des évolutions de app engine a été publiée il y a quelques temps. La nouveauté la plus attendue est l'arrivée des technologies push (Comet, Websockets, ...), technologie qui va assurément changer notre façon de consommer le web avec des usages plus "temps réels".



Maps & Geo


maps.gif Nous avons récemment eu droit à l'api V3 pour Maps qui va donc être un sujet de certaines sessions.
Concernant les produits "geo" chez google, on parle d'évolutions de Google Latitude pour suivre notamment la mode du "check-in" à la Foursquare.
Buzz qui a un succès mitigé pourrai aussi faire l'objet d'ajustement dans ce sens. La géolocalisation devenant omniprésente dans notre quotidien avec les smartphones, c'est le terrain le plus actif en terme de recherche de nouveaux usages dans les startups et google va aussi continuer à innover dans le domaine.

Chrome


logo-google-chrome-navigateur-web.jpg La version 5 est en cours de développement et apportera sont lot de nouveautés : plus de synchronisation des données avec le cloud, plus de performances, une barre d'adresse revue avec la disparition du "http://", flash player intégré...
Google continue de miser sur son navigateur en le faisant évoluer et en investissant massivement dans la publicité. Le travail semble porter ces fruits car sa part de marché ne cesse d'augmenter et a dépassé celle de safari.
Chrome OS attendu pour la fin de l'année sera peut être le sujet d'annonce, le système d'exploitation pour netbook qui boot en 5 secondes et réduit à l'essentiel : un navigateur chrome. Cela sera peut être un élément clé de la stratégie google dans le futur.
Chrome et Chrome OS intègrent déjà la technologie NaCL (native client) qui permet d'exécuter du code à 99% de la vitesse du code natif dans un environnement protégé mais elle est désactivée par défaut. A la vue du nombre de commiters google sur le projet googlecode et l'activité des commits sur le projet, on peut être certain que cela sera un élément important dans le futur de google, qui pourra faire entrer le domaine du jeu vidéo et des applications gourmandes en calculs couteux dans le navigateur et le cloud. Activation par défaut dans chrome annoncé à google i/o et premier produit annoncé ?


Entreprise


google_apps-300x284.jpg La plus grande attente des entreprises utilisant les google apps est d'avoir accès à plus de produits google en mode "for your domain" comme reader, voice ou google code.
On sait déjà que plusieurs produits vont faire leur apparition cet été : annoncé ici mais peut être des choses inédites vont être annoncées.


Suivez la conférence en live


google io Rares sont les français qui ont la chance d'aller à Google I/O, mais tout n'est pas perdu ! Cette année nous allons pouvoir suivre en direct la conférence via ce channel youtube : http://www.youtube.com/GoogleDevelopers.
Voici le programme : http://code.google.com/intl/fr-FR/events/io/2010/session-schedule.html
Tous les sujets n'ont pas été abordé dans ce billet, il y a encore le langage Go, wave, GWT, ... C'est peine perdu, malgré toutes les rumeurs, google a toujours réussi à créer la suprise, alors rendez vous la semaine prochaine !

Alexandre
@alexandre_t

jeudi 1 octobre 2009

GWT 2.0, App Engine, et WolfEngine

Depuis cet été, nous faisons régulièrement des builds de GWT, vous pouvez les retrouver sur le compte google code créé à cet effet :

http://code.google.com/p/sfeir/

Nous avons aussi écrit deux tutoriaux pour apprendre à utiliser les nouveautés de GWT :

Par contre, nous avions une erreur en utilisant Google App Engine :

@@failed com.google.apphosting.utils.jetty.DevAppEngineWebAppContext@3225c9{/,.} javax.xml.parsers.FactoryConfigurationError: Provider

org.apache.xerces.jaxp.SAXParserFactoryImpl not found@@

Pour résoudre ce problème, il faut ajouter une jar à son projet : xercesImpl.jar Nous avons donc testé WolfEngine avec GWT 2.0, celui-ci fonctionne parfaitement, malgré des Warnings à la compilation sur les classes et méthodes dépréciées qui risquent de disparaitre à la version finale de GWT. Il est bon de tester dès maintenant ses applications pour faire les corrections adéquates et passez ensuite facilement dans la version 2.0.

De plus, le mode debug directement dans le navigateur est vraiment très pratique, on peut ainsi tester dans les navigateurs et utiliser les outils comme firebug lors du développement. Pour utiliser ce mode, il faut ajouter la jar gwt-dev-oophm.jar avant la jar gwt-(window|mac|linux).jar. Ou encore utiliser la dernière version du plug-in google et définir ajouter GWT 2.0 en bibliothèque. Une case à cocher apparait alors en dessous de l'URL dans l'onglet GWT pour sélectionner ce mode.

oophm

Il suffit ensuite de copier coller l'URL donnée dans la barre d'adresse de votre navigateur préféré. L'installation des plug-ins dans les navigateurs est expliqué sur la page affiché. Pour chrome, il faut utiliser les dernières builds (chanel dev), firefox c'est le plus simple, une extension à télécharger et installer. Et pour IE, il faut installer une dll. Amusez-vous bien !