samedi 29 octobre 2011

Les evenements #Node.js et #cofffeescript

J'ai evoqué dans un  précedent post, l'importance des fonctions de retour  (callback) dans l'architecture d'une application asynchrone. Gérer une suite d'action asynchrone par un chainage de callback se révèle vite très difficile. Aussi , il existe un deuxième composant venant en complément des callback : les évènements.
Node.js fournit une librairie pour gérer les évènements : require ('event'). Les évènements sont le véritable centre nerveux d'une application asynchrone dans Node.js. Ils  émettrent  des signaux qui  associés à des callback, orientent et cadencent  le déroulement du programme.
Exemple:
Les opérations pour  interroger une  page WEB les suivantes:
1) Se connecter au serveur
2) Lancer la requête
3) Traiter les entêtes
4) Traiter le corps de la page
4) Se déconnecter

Pour ne pas bloquer le système entre chaque étape notamment celle qui attend la réponse du serveur, il est judicieux de programmer l'émission de signaux à des moments clés du cycle. Exemple 'j'ai reçu les entetes'  , 'j'ai  reçu les données de la page' et 'le serveur m'indique que c'est terminé'.  pour chacun de ces signaux, il sera nécessaire de les 'ecouter' et de réagir  en  lançant les actions associées (callback) .
Ce système est composé de deux parties: l'emetteur de signaux (evenement) et le recepteur (listener) qui attend les évenements et lance les actions (callback ) prévues.


Les API de base de node.js sont livrées avec une gestion d’évènement, en charge pour le developpeur de réaliser la partie qui va traiter ces évènements.
(Exemple API HTTP: documentation ici )



  Avec  ici un exemple de récepteur sur l’évènement 'data':


  res.on('data', function (chunk) {
    console.log('BODY: ' + chunk);
  });
Comment mettre en place son propre système d’évènement.

La partie réception et traitement est la plus facile en voici un exemple:


Deux récepteurs sont mis à l'écoute.

La partie émission des signaux.

Node.js fournit la libraire 'event' et voici un exemple en coffeescript qui fonctionne avec le programme précédent:


Il ne faut pas grand chose ! C'est la magie de coffeescript et la puissance de node.js.
Pourquoi la magie de coffesscript ?
Parce en javascript écrit à la main, dans les règles de l'art,  cela donne:


La premiere fonction sert à construire proprement des objets, sans effet de bord sur d'autres modules.
(copiée sur api_request )

Il est intéressant de voir que tous ces problèmes de constructeur sont pris en charge par coffescript comme le montre le javascript issu du programme coffee. 

Aussi, coffescript n'est pas un simple générateur de code. Il met en place les bonnes pratiques et vous économise des lignes de code.



mercredi 26 octobre 2011

Temporisation en coffeescript et javascript

Pour un néophyte ,il est surprenant de ne pas trouver un équivalant à wait ou sleep dans les instructions du javascript. ci dessus des exemples de timers en coffeescript:
Le bloc à base de while est à éviter. Il monopolisera les ressources durant son exécution.

L'instruction qui permet de simuler ce comportement est la fonction setTimeout. Sa premiere utilisation est délicate. En effet on est souvent tenté de lui passer en paramètre un appel à une fonction mais c'est une expression qui est attendue.
Dans l'exemple en coffeescript le symbole '->'  permet de définir des fonctions anonymes. '=>' est une variante à cette utilisation.

dimanche 23 octobre 2011

Client HTTP asynchrone avec node et coffescript

Un des points forts de Node est de pouvoir programmer facilement des fonctions asynchrones.  Ci dessous un exemple de programmation d'un client HTTP. Cette fonction va interroger une base NoSQL en faisant varier la clé de 0 à 4.  Le programme est en coffeescript,  il utilise la librairie api_request. disponible ici sur github



L’exécution de programme montre bien l'aspect asynchrone des requêtes : La boucle 'for' est exécutée sans interruption (les lignes : début de fonction) , puis Node commence à envoyer les requêtes au serveur Nosql dans un ordre qui n'est pas celui de la boucle.  Il commence par la 'clé 4' . Avec une boucle plus grande (ex : 100) on retrouve cette 'clé 4' en première requête. Cette valeur peut changer sur une autre machine.  Pendant la boucle for , le gestionnaire d’évènement se contente de stocker les demandes, puis en   fonction de son cycle interne , profite des interruptions pour réaliser les requêtes. Avec une boucle de 100 requêtes, les 10 premières sont en vrac puis le système se régule. Dans un système asynchrone, la fonction appelée retourne un callback  (fonction de retour) et se termine. Ce callback sera appelé lors de la réalisation  de l’évènement associé.
 
Il existe des moyens pour enchaîner des actions synchrones  dans un univers asynchrone (ce n'est pas une aberration) . Le callback doit prévoir cet  enchainement d'action.

exemple :



La fonction de callback fait un appel récursif tout en incrémentant  la clé. A la réception de réponse du serveur, un évènement sera déclenché. La fonction callback associée à la réalisation de l'évènement sera appelé et cette fonction fournira l’enchaînement suivant. On utilise dans cet exemple des techniques de programmation fonctionnelle, ce n'est pas un hasard. Les fonctions callback se déclenchent dans un temps incertain et surtout avec des variables globales dans un état lui aussi incertain. La programmation fonctionnelle donne des modes de résolution pour ce type de problème avec des  variables partagée.





mercredi 19 octobre 2011

L'avenir de Ruby : conférence 2011 de Matz

Dans une conférence Ruby à la Nouvelle Orleans (octobre 2011), le créateur de Ruby :Yukihiro 'Matz' Matsumoto a dressé les perspectives d'avenir de Ruby.
lien ici  et ici.  Le titre de sa présentation 'ruby everywhere'. Matz travaille désormais chez Heroku 


 La société saleforces.com  finance Heroku et son PDG marc  Benioff  croit à l'avenir de Ruby comme langage du cloud 2.0.

A l'opposé sur le segment des gps, portables et tablettes , matz veut  mettre un Ruby minimaliste de partout. Le nom du projet est mruby. (m pour minimalist ?) , le concurrent direct est le langage 'lua' qui est présent dans des terminaux spécialisés mais aussi dans des projets de jeux. Il existe un projet Rhodes ruby qui est clairement destiné aux mobiles sous android.
Il rappelle ET C'EST IMPORTANT que Ruby est engagé dans un processus de standardisation et de normalisation . Des spécifications se portent garant de la bonne implémentation des machines virtuelles (rappel: Java n'est pas un langage normalisé).

Est ce que Ruby pourra absorber ou profiter de  la mouvance Node.js ? . A mon avis la démarche de  Rails est plus interressante : faire en sorte d'avoir une émulation plutot qu'une confrontation.









dimanche 16 octobre 2011

Node.js et le mode debug

Grace à firebug, il est aisé de faire des opérations de mise au point sur des scripts exécutés du coté client.
Ce système n'est pas utilisable sur des programmes  lancés coté serveur sur node.js . Il est fort heureusement possible de lancer un script en mode debug sur node.js.
Pour cela il suffit d'ajouter l'option suivante au lancement d'un script:
nodejs --debug-brk monscript.js


l'option --debug-brk provoque l’arrêt du script sur sa première instruction. Node vous retourne une adresse de connexion pour accéder aux  informations de debug

debugger listening on port 5858

Il est possible alors d'opter pour deux types d'outils. 

Le debug dans un terminal.

Pour cela, ouvrir un deuxième terminal et lancer la commande ndb. Cette commande est un module pour node qui s'installe par la commande npm install ndb

L'ecran ressemble à ceci 




Les commandes disponibles pour le debug sont celles qu'on retrouve sur des produits analogues (perl debug, ruby debug ) mais avec quelques limitations.
La commande 'l' ne permet pas de lister tout un programme.

Le debug dans un navigateur

Au lieu de lancer ndb, il est possible d'utiliser node-inspector. Ce programme se lance comme ndb  mais il retourne une url. cette url est à saisir dans un navigateur (si possible chrome) afin d'obtenir l'écran suivant:


Ce produit est très intéressant car en plus de la mise au point , il permet de faire de l’introspection sur le librairies au coeur de node.  Une liste déroulante propose de debugger votre script mais aussi de faire du pas à pas sur node lui-même.
Node_inspector est un module node, il s'installe donc par la commande npm install node-inspector.
( tip: avec l'option -g ,  npm  installe les modules dans un répertoire partagé ex: /usr/local et non pas dans le répertoire utilisateur) 




samedi 15 octobre 2011

Bref, j'ai mis à jour ma version d'ubuntu

bref , hier soir  j'allume ma machine et elle affiche ce message : voulez mettre à jour votre distribution avec la dernière version d'ubuntu (la 11.10) ?

Bref , je réponds oui , pourquoi pas ?.
Bref la fenêtre suivante s'ouvre :


Bref le temps restant passe de 1 seconde à 4 heures , puis à 7h  puis retombe à 4h pour telecharger 1691 mises à jour

Bref  , je vais me coucher en laissant la machine allumée.

Bref au petit matin l'écran est bloqué sur une boite de dialogue concernant le plugin flash
Bref, il reste une heure pour terminer l'installation
Après 1h 30, la machine redémarre et je n'ai plus de touchpad .
Bref , je pense que je tiens la bonne excuse pour acheter un macbook Air
Bref, je redémarre la machine, tout fonctionne  et j'ai un portable  remis à neuf qui marche encore mieux qu'avant

Bref, j'ai  mis à jour ma version d'ubuntu
Et je ne le regrette pas.




samedi 8 octobre 2011

Une tasse de coffeescript

Coffeescript est un nouveau langage de programmation qui génère du javascript. Le site officiel est ici.

 Ce langage est remarquable, il fait parti des DSL (domain specific language). Son auteur Jeremy Ashkenas a démarré en utilisant un livre très connu des hackers : Comment ecrire son propre langage de programmation.
La première version de coffeescript était en Ruby, un langage très adapté pour les DSL. Les versions suivantes  de coffescript sont en  coffeesript...
Coffeescript utilise la bombe du moment 'node.js' comme interpréteur.


Le programme javascript généré peut s’exécuter dans un navigateur ou sur une instance de node. La syntaxe de coffeescript est un mélange de Ruby et de Python dont il reprend les principes d'indentation.
Un script coffeescript par convention prendra l’extension '.coffee'
La génération du javascript se fait par la commande coffee -c monscript.coffee. On obtiendra ainsi  un  programme monscript.js. Ce programme répond à tous les critères de qualité des outils comme jslint.
Sans l'option '-c' le script est  traduit et exécuté directement  par node.js

Le framework Ruby on Rails dans sa dernière version intègre ce générateur de code.
Il suffit de placer un script avec l'extension coffee dans le répertoire javascript pour qu'il soit compilé et rendu disponible à l'application.

Ici j'utilise jquery via coffeescript :

$ ->
   alert "mon premier script avec coffeescript" 


Après un temps d'adaptation de quelques jours, j'ai du mal maintenant à écrire directement du javascript. D'autant qu'il se charge du sale boulot: déclaration des variables locales, closures etc.
La simple ligne : puts = console.log permet d'utiliser la notation classique puts "mon message" comme en Ruby.
J'ai profité du site www.scoop.it pour rassembler des liens sur le sujet : lien de curation ici.





vendredi 7 octobre 2011

Soirée rails france paris.rb

Mardi soir direction le café 'rubis'  rue du Maine pour une soirée organisée par rubis ou rails france. Nous sommes une bonne quarantaine à nous retrouver dans une salle trop petite. Le rétroprojecteur a fait faux bond, aussi  au lieu d'ajourner la soirée, une présentation est improvisée sur un mac book Air. Il s'agit du projet sproutcore.

C'est un framework javascript qui peut s'interfacer facilement avec Rails.
Ce projet se veut plus complet et intégré que backbone.js. Ce type de produit sert à développer des applications pour clients riches, pas pour faire des sites web classiques.

La présentation est là : (suivre le lien).

La soirée m'a permis d'admirer la maquette du nouveau site rails France avec une page 404 prometteuse
 
Tout de même une bonne soirée