lundi 28 mai 2007

Mephisto, le moteur de blog sur JRuby on Rails...

Salut,

impatient de mettre Rails sur la jvm et ainsi bénéficier d'une vitesse accrue, d'une facilité à accrue à déployer dans des environnements existants ou encore de démultiplier la puissance de Rails en faisant appel aux innombrables frameworks java (dont J2EE) ?

Cela devrait se concrétiser très vite. Mais à cette heure, celui qui veut déployer sur JRuby on Rails devra encore se frotter à quelques bugs coriaces listés ici:
http://jira.codehaus.org/browse/JRUBY

Ceci dit, l'équipe de dev (dont une partie est payée par Sun Microsystem) est très réactive et très pro. Regardez d'ailleurs les méthodes de développement agile qu'ils emploient (intégration continue, tests unitaires et fonctionnelles, TDD avec rspec, chat developper irc, wiki d'explication, liste de diffusions...), il s'agit de méthodes exemplaires. Et la qualité du code est est là pour en témoigner. Microsoft et son IronRuby est largué à des années lumières à titre de comparaison (en dépit d'une VM potentiellement plus riche pour les languages dynamiques avant java7 du moins)...

Aujoud'hui, je viens d'installer Mephisto, le célèbre moteur de blog sur JRuby. L'installation est lapidaire et expliquée en détails ici: http://weblogs.java.net/blog/arungupta/archive/2007/05/mephisto_on_gla.html

Résultat des courses? ça marche, aussi bien avec webrick que Glassfish ou Tomcat comme serveur JRuby. Un bug ennuyeux persiste cependant: les expression régulières ne marchent pas avec l'UTF-8 et cela fait que tout charactère accentué est remplacé par un '?' dans le corps des articles seulement. Mais les développeurs de JRuby traquent déja ce bugs... Donc à bientôt pour de prochains statuts de JRuby on Rails.

D'ici là, n'hésitez pas à vous jetter à l'eau avec JRuby:
http://www.headius.com/jrubywiki/index.php/Main_Page

Raphaël Valyi.

dimanche 22 avril 2007

Ajax vers d'autres sites, sans proxy, JSON With Padding et Google AJAX Feed API

Ajax, c'est cool. Mais beaucoup d'entre vous aurons remarqué que les requètes AJAX doivent se limiter à appeler le site où est hébergée la page. Tout comme essayer de modifier une iframe situéee sur un autre domaine, appeler un autre site par Ajax provoque une erreur de sécurité.

Ceci est nécessaire afin de limiter autant que possible les attaques par "cross-scripting". Par exemple, si tel n'était pas le cas, il me suffirait de présenter un DIV avec un accès AJAX à GMail dans mon site et alors il me serait possible de voler tous vos idendentifiants (et donc votre compte) si jamais vous vous logguiez en passant par mon site...

Donc lorsqu'on veut inclure des flux RSS venant de l'extérieur ou permettre les requêtes AJAX vers l'extérieur, il faut mettre une place un proxy sur votre serveur. Par exemple, voici comment faire en java . Hélas ceci est complexe et a plein de défauts, notamment:
  1. vous chargez votre serveur alors qu'on pourrait très bien utiliser la puissance du client web qui vous visite.
  2. Il vous faut maîtriser la programmation serveur, c'est à dire que cela limite l'offre de service aux seuls avertis et cela limite donc globalement la qualité de l'offre par manque de concurrence.
  3. Il n'est pas forcément possible ou facile de mettre cela en oeuvre chez les hébergeurs mutualisés qui offrent les coût d'hébergement les plus faibles...
A) JSON with padding

Heureusement il existe des solutions. Le première soultion générique que je vais évoquer est JSON with padding. L'idéee générique est que si les requètes AJAX vers d'autres domaines sont interdites, il est tout à fait possible d'inclure dans sa page une feuille javascript provenant d'un autre site. Et on peut l'appeler par javascript depuis sa page. Mais surtout, il est possible de changer dynamiquement la source (attribut src) d'une page javascript inclue dans la page.

Le principe de JSON with padding est donc le suivant: on va 'inliner' une requète AJAX classique en une requète de type GET et cette requète GET sera l'url de l'attribut src de la feuille javascript à inclure.

Du coup, notre serveur, distant, s'il est conçu pour traiter les appels JSON with Padding, il va recevoir cette requète GET contenant un certain nombre de paramètre. Lui va traiter la requète et générer une feuille javascript correspondante dans la quelle il y a un objet javascript réponse sérializé au format JSON. Il va renvoyer cette feuille javascript en réponse. Là, notre client web reçoit la feuille de style et demande l'évaluation du code JSON qu'elle contient, c'est le format JSON with padding.

Vous êtes perplexes? Eh bien regarder cette démo qui notamment fait des recherches Google en AJAX sans taper sur le serveur qui héberge la démo, mais en appelant directement Google:
http://www.geocities.jp/stormriders999/jsontest.html
(cliquez sur Google, entrez un mot et enfin dépliez l'arbre de la réponse).
Vous pouvez aussi utiliser le plugin LiveHTTPHeaders pour Firefox pour vérifier que la requète AJAX par directement chez Google et que c'est Google qui répond.

B) Google entre en scène: AJAX Feed API

Vous l'avez vu, Google fournis déjà une API de recherche de ce type (mais aussi Yahoo, Del.ico.us, Amazon...). Mais ajourdh'ui, Google va plus loin, il fourni une API pour rechercher n'importe quel flux RSS qu'il aura mis dans ses caches!
Les détails sont fournis ici:
http://code.google.com/apis/ajaxfeeds/index.html

Mieux que ça, l'API traite de façon unifiée les différents types de flux: Atom 1.0, Atom 0.3, RSS 2.0, RSS 1.0, RSS 0.94, RSS 0.93, RSS 0.92, RSS 0.91, RSS 0.9. Au final, on se retrouve avec les éléments title, link, description, author et une liste de entries[]. Cette liste entries[] a elle même les élements suivant: title, link, content, contentSnippet, publishDate, et categories.

C'est dément. Cela veut par exemple dire que sur ce blog (dont je ne maître pas l'hébergement), je peux par exemple donner les dernières nouvelle parues sur le site du Monde. Avant ça n'était pas possible. Cela devrait démultiplier la puissance des échanges de flux, merci Google.

jeudi 8 mars 2007

Ruby on Rails sur l'IDE Netbeans: Sun redistribue les cartes!

Ok, Rails c'est super cool et tellement puissant que l'IDE est de moindre importance que pour d'autres languages. Mais malgré tout, je suis sûr que ça vous manquait de ne pas pouvoir aller d'un click sur le corps d'une méthode (surtout d'une API tierce), de re-formater votre code afin qu'il reste à la fois beau et synchronisé sur les CVS/SVN...

Et bien Sun Microsystem viens de donner un coup de pied dans la fourmilière:
regarder ces démos (surtout la 2) pour preuve:
http://blogs.sun.com/roumen/entry/two_demos_jruby_on_rails

Voilà tout est là: télécharger Netbeans 6 milestone 7 ici:
http://nbi.netbeans.org/m11/download.html

puis installer le plugin Ruby avec Module manager de Netbeans:
Tools > Update Center > Check the web for available modules > Next puis taper 'r' pour trouver Ruby dans la liste des modules à télécharger.

Ensuite après avoir redémarré Netbeans, on peut créer un nouveau projet Rails ou encore le créer à partir d'un dossier source existant.

Voilà, ça ressemble à RadRails, mais:
* si on fait CTRL+click sur une méthode, on va à sa définition,
* si on fait CTRL+espace dans le code, on a l'auto-complétion,
* on peut reformatter le code Ruby;
* on peut apparemment refactorer du code,
* si on sélectionne une variable on voit ses occurrences dans le fichier,
* on peut aussi tourver les références dans le projet entier
* on à l'aide RDoc dispo avec l'auto-complétion
* on peut lancer son serveur/navigateur avec F6

Moralité, à ma connaissance aucun des IDE Rails que j'ai pu tester ne proposait tout cela (ni Textmate, ni Radrails, ni Emacs + plugin Rails, ni JEdit + plugin Rails, ni Scite)

Enfin, notez que JRuby pourrait bientôt également être une excellente implémentation de Ruby pour Rails; En effet, le tout récent JRuby 0.9.8 pass plus de 98% des tests de non régression de Rails. C'est un peu plus lent que Ruby MRI (mais plus tant que ça) et surtout les développeurs travaillent très dur à la compilation Just In Time par la JVM Hotspot du code Ruby. D'ici quelques mois JRuby sera plus radide que MRI Ruby dans l'essentiel des benchs.

PS: troubleshooting: si Netbeans ne s'ouvre pas sur votre distro Linux avec Desktop 3D Beryl il suffit d'ajouter ces lignes dans votre fichier /etc/environment (puis redémarrer votre session et Netbeans):

AWT_TOOLKIT="MToolkit"
export _JAVA_OPTIONS="-Dswing.defaultlaf=com.sun.java.swing.plaf.gtk.GTKLookAnd$

samedi 30 décembre 2006

Howto encoding: ouvrir sous LInux un projet Eclipse créé sous Windows

Récemment, j'ai eu à récupérer sous Linux un projet Java créé par Eclipse sous Windows, quelle ne fut pas ma stupeur de voir que tous les accents avaient alors disparus des fichiers de propriétés et autres JSP...

Donc, voici l'astuce:
par défaut, sous winbouz, Eclipse ne crée pas les projets en UTF8 bien que cela ait été proposé (https://bugs.eclipse.org/bugs/show_bug.cgi?id=108668) mais en Cp1252 (Et oui, ça existe).

Hors quand vous récupérez par CVS votre projet sous Linux toujours avec Eclipse, l'encodage par défaut est UTF8, d'où le souci.

Le workarround consite alors à choisir ISO-8859-1 dans la drop down de l'encodage du projet (popup sur le projet puis info).

Sinon la meilleur solution reste quand même de créer tous vos projets en UTF8. Ah sacré bilou va!

RadRails rapide sous Linux comme sous windows

UPDATE: CE PROBLEME SEMBLE AVOIR ETE RESOLU PAR LES VERSIONS RECENTES DE RAILS OU RADRAILS.

Faît rarissime, un IDE tourne plus lentement (et comment) sous notre OS préféré, Linux bien sûr, je veux parler de RadRails l'IDE (plugin Eclipse) pour développer rapidement en Ruby on Rails. RadRails est très lent, vous voyez votre CPU grimper à 100% en lançant Radrails sous Linux? Alors ce post est pour vous.

Le problème principal vient du fait que Radrails fait mauvais ménage avec certains liens symboliques créés par Rails. Le workarround consiste à:
  1. supprimer le lien symbolique 'rails' dans $RAILS_ROOT/vendor/. (Ce lien pointe sur lui même ce qui donne des pbs à RadRails).
  2. Ensuite, créez un répertoire 'rails' dans $RAILS_ROOT/vendor/
  3. Enfin, copiez tous les dossiers, liens, fichiers de $RAILS_ROOT/vendor/ (sauf le nouveau répertoire 'rails') et copiez les dans ce répertoire 'rails'.
Après cela, redémarrer RadRails, il marche déjà beaucoup plus vite (et Rails marche comme avant). Certes, sous mon Ubuntu, cela ne me laisse toujours pas la possibilité de créer des projets ou de piloter des serveurs depuis RadRails (c'est pas grave, un XTerm fait très bien l'affaire), mais cela rend RadRails enfin utilisable sous Linux, nul besoin d'aller se prendre la tête à avec EmacsOnRails ou Vim (si je devais conseiller un alternative, je recommanderai juste JEdit avec le 'jEdit Ruby Editor Plugin' car c'est à la fois humain à installer et efficace (complétion automatique, project tree explorer, RDoc...)

sur ce, bon Rails à tous, tout autre workarround est bien venu.