dimanche 25 novembre 2012

Utilisation de la librairie async.js pour Node.js

Dans un environnement synchrone classique, les fonctions s’enchaînent les une a la suite des autres de manière linéaire.

Avec Node.js doté d'un système d'entrée-sortie  non bloquant et asynchrone, les choses ne se déroulent pas toujours dans l'ordre souhaité.

Soit par exemple 3 fichiers: un petit , un moyen et un gros fichier.

Le programme ci-dessous en coffeescript va lire les 3 fichiers:

Le résultat d'exécution sera:

>coffee async1.coffee 
traitement termine
 Je termine de lire le petit fichier
 Je termine de lire le moyen fichier
 Je termine de lire le gros fichier


Deux remarques:
Le display de la dernière ligne s'affiche en premier . 
Les fonctions se terminent dans un ordre différent de leur appel: celle relative au fichier le plus petit , appelée en dernier se termine la première.

Tout cela est normal dans une logique asynchrone: Toutes ces appels de fonctions sont réalisés dans le même cycle d'exécution du moteur Node.js. Node.js n'attend pas la fin de l’exécution de la fonction pour passer à la suivante.

Pour enchaîner l’exécution des fonctions dans un ordre précis il faudrait re-ecrire le programme comme ceci:
Avec cette fois le résultat suivant:


> coffee async2.coffee
traitement termine
 Je termine de lire le gros fichier
 Je termine de lire le moyen fichier
 Je termine de lire le petit fichier

Chaque fonction appelle la fonction suivant dans sa dernière instruction. On se retrouve alors à devoir gérer des callbacks imbriqués dans des fonctions. Le programme perd en lisibilité.

Il existe une librairie très populaire dans la sphère de Node.js : async.js. qui prend en charge ce type de problème.
Ce module disponible par la commande  npm install async. permet de gérer plus facilement l'ordre d’exécution des fonctions.

Dans cet exemple, on utilise deux formes d'appel : le mode en série et parallèle.
Dans le  mode en série (serial),  async.js va attendre la fin de chaque fonction pour lancer la suivante.

remarque1 : async.js appelle vos fonctions en ajoutant une fonction de retour en paramètre  ce parametre ne sert qu'a un usage interne à async.js
(midf = (callback)-> fs.readFile 'middle_file', (err,data) => ...)

remarque2: la méthode toString appliquée à une fonction permet de lister le source de la fonction
 (console.log callback.toString() ...)
   
Think asynchrone ...



samedi 24 novembre 2012

Qu'est ce qu'un websocket

Les websockets sont un nouveau mode d'échange  d'information entre un client (navigateur) et un serveur, défini par la RFC 6455.

Source http://fernetjs.com/wp-content/uploads/2012/11/cables21.jpg

Le dialogue ente le client et le serveur commence par un échange HTTP ou HTTPS puis se continu en mode WS ou WSS (Web Socket et Web Socket Secure).


source:http://warmcat.com/websocket-lifecycle.png

Ce mode d'échange est Bidirectionnel : Le serveur peut pousser des informations au client (ce que ne permet pas directement le HTTP) . C'est le protocole d'avenir des applications web ou non web.

http://websocket-sample.googlecode.com/svn/trunk/images/ws_vs_http.png

Pour tester les websockets: avec Node.js , rien de bien compliqué:
npm install socket.io  
D'autant que les websockets sont adaptées à un fonctionnement de gestion d’évènement asynchrone non bloquant (Comme Node.js) 

Pour Ruby et Rails il existe un gem fournissant un serveur de websocket : em-websocket
En résumé: plus de souplesse , plus rapide moins verbeux, les  websockets sont les invités privilégiés  des smatphones ou des tablettes pour des applications interactives.

vendredi 23 novembre 2012

Comment enregistrer son terminal avec la commande script

Pour réaliser des screencasts , j'utilise Kazam  , mais il y plus simple: la commande script

La page de manuel de la commande script
La syntaxe de lancement est la suivante: 
script -t session1 2>session1.time


Et pour rejouer la session :
scriptreplay session1.time session1


Ce dispositif est plus léger qu'une vidéo et consomme moins de ressource.


Marcin Kulik a eu une idée géniale : proposer un système de partage pour ces enregistrements en mode console: c'est l'objet du site ascii.io

Pour simplifier cette tache , le site propose de telecharger une nouvelle  commande asciiio
(installation de la commande :curl -sL get.ascii.io | bash)

Cette commande se charge de tout: enregistrement et publication sur le site de partage.

(mon essai en bas à droite)
Pour réaliser son site l'auteur a utilisé du python, du bash , du ruby et nodes.
Mes screencasts sont ici sur slideshare.

good hacking


mercredi 21 novembre 2012

Nouvelle version 9.2 de Postgresql: Json pour tous

La nouvelle  version 9.2 de Postgresql supporte nativement le format JSON.


Le lien de cette page est ici.

Postgresql stocke des données au format JSON mais  peut aussi convertir à la volée des données dans ce format.
Encore une contribution de plus pour Javascript.




lundi 19 novembre 2012

Les moteurs de node.js


Les moteurs de Node : Un V8 et.. un réacteur.

Article écrit dans le cadre de la série:  Node pour les 'pas tout à fait' nuls.

Le moteur V8.

Node n'a pas été écrit à partir de rien. Au contraire c'est un assemblage léger autour du moteur d'exécution javascript le plus répandu au monde : le moteur javascript 'V8' de google chrome.


Vous avez sur le site de liz Stinson des très bons articles sur l'architecture des navigateurs et de V8.
Ce moteur est utilisé chaque fois que votre navigateur Chrome a besoin d’exécuter du javascript.

La relation entre Node.js  et Chrome est un des facteurs du dynamisme du projet : les utilisateurs de Node poussent toujours plus loin l'usage de V8, ce qui profite directement au navigateur Chrome et réciproquement  toutes les améliorations du V8 profitent à la communauté Node.js.

Le réacteur. 

Le V8 fournit la coquille de  la machine virtuelle mais pas le mécanisme utilisé par Node.
Node est basé sur un modèle de traitement appelé : Event Model. La traduction n'est trop parlante: modèle évènementiel. 
Ce dispositif est avant tout un modèle de conception (design pattern), le reactor pattern.


L'idée de base est la suivante: node va lire la suite des instructions contenue dans votre programme javascript. Il va insérer  dans une boucle des agents chargés de guetter des évènements.Quand un évènement survient , l'agent chargé de le surveiller va déclencher QUAND SON TOUR viendra, une série d'action en rapport avec l’évènement à traiter (la fonction de rappel ou callback). 

Aussi, plus le nombre d’évènement à surveiller augmente, plus le nombre d'agent de surveillance va augmenter et plus le parcours de la boucle sera long. 

Les Entrées-Sorties non-bloquantes. 

Un réacteur fonctionnera parfaitement que s'il arrive à faire le tour de ses agents dans un temps raisonnable et qu'aucun agent ne monopolise son attention. Les fonctions d’entrées-sorties (disque ou réseau)  sont les opérations qui génèrent le plus de temps de latence.
Comparaison des vitesses RAM et E/S

 Aussi , il ne faut pas que le système attende l'achèvement  d'une telle fonction pour continuer sa ronde. Le principe des E/S non bloquantes  est simple: je lance une opération sur le réseau ou le disque  et je charge un observateur de m'avertir de la conclusion de l'opération, pendant ce temps, je passe à l'opération suivante. 
Ainsi la ligne d'appel d'une opération non bloquante sera de la forme:

 res.on('data', function(d) {
    process.stdout.write(d);
  });

Le système va charger un agent de surveiller l'arrivée de l’évènement 'data' et dans ce cas, de  lancer la procédure de rappel (callback ) associée.

Pour des fonctions plus simples, l’évènement peut implicitement correspondre à la fin de l'opération:

fs.readFile('/etc/passwd', function (err, data) {
  ... } ) 

Cette ligne déclenche la demande de lecture du fichier, puis une fois l'acquisition réalisée, appellera la fonction de rappel.

Ce mode de fonctionnement est la mise en oeuvre d'une forme de programmation particulière: la programmation asynchrone.(A détailler dans un article).

La communauté.

Node est issu du cerveau génial de Ryan Dahl qui est un ovni dans la planète du Net.

Ryan Dahl , le créateur de Node.js a complété le moteur V8 de Chrome pour lui permettre de réaliser des opérations qui ne sont pas prévues en javascript pour un navigateur. On peut citer par exemple l'accès au système de fichier : cette fonction est interdite pour un navigateur.


L'aventure a commencé en 2008 et connait depuis une progression vertigineuse.
  • En 2009 : Node c'est 8000 lignes de  C/C++ et  2000 lignes de Javascript, 14 contributeurs. 
  • En 2010 : Node c'est 11000 lignes of C/C++ et  6000 lignes de JavaScript,  63 contributeurs.


En 2012:  17 881  librairies javascript.

Cette communauté est fédérée autour d'un référentiel des librairies pour Node : npm (Node Packaged Modules)



Licences.

Enfin pour terminer, Node.js est sous licence MIT, le moteur V8 sous licence BSD. Ces licences vous garantissent le caractère 'libre' de Node.js sans aucune restriction.


A venir: qui utilise Node et pour quoi faire



dimanche 18 novembre 2012

Node.js pour les pas-tout-a-fait nuls


Cet article est destiné à faire le point sur Node.js avec un certain recul vis à vis des réactions positives ou négatives engendrées par ce phénomène.
généré à partir du site www.txt2pic.com

Node.js : c'est quoi ?


Node est une machine virtuelle capable d'exécuter des programmes javascript.


Node.js désigne l 'environnement (la galaxie) de Node (sans l'extension .js). Node est un programme (exécutable) écrit en C++ et compilé. Node n'est pas en javascript. Node est un programme qui va recevoir en entrée des fichiers sources de javascript, il va interpréter (traduire) en langage machine les instructions javascript et va les exécuter.

Le résultat de la commande file sur le fichier node
Node est donc un interpréteur de javascript. Il joue le même rôle que la JVM pour les projets java (Machine Virtuelle Java) mais pour le javascript !

Pourquoi le terme de machine virtuelle ?

Tout d'abord définissons le notion de portabilité
La portabilité d'un programme qualifie le niveau d'indépendance d'un programme vis à vis de la machine physique (système) qui l'accueille. Ainsi un programme dit 'portable' fonctionnera sur des systèmes différents, en l'état, sans changement de code majeur.
Pour assurer la portabilité d'un programme (javascript, java ou autre ) il est possible d'avoir deux approches :

La compilation adaptée.

La première approche consiste à recompiler les sources du programme en fonction des systèmes cibles : c'est le dispositif adopté pour les programmes en C ou C++. La contrainte forte est de pouvoir disposer des codes sources du programme et d'un compilateur. Cette solution n'est pas satisfaisante pour les langages interprétés.

L'utilisation d'un composant intermédiaire : la machine virtuelle.

La deuxième méthode consiste utiliser un composant qui va servir de médiateur entre le code (les instructions du programmes) et le système d'accueil : c'est le rôle de l’interpréteur appelé dans ce cas 'machine virtuelle'. Ainsi , il y aura une machine virtuelle adaptée à chaque environnement. Ces machines virtuelles prennent en charge l’interprétation des instructions d'un programme et leurs traductions adaptées au système de la machine physique hôte. Ces machines virtuelles masquent les disparités des environnements d'accueil. Elles prennent à leur charge la gestion des écarts de comportement, de matériel , d'appel de fonction système etc..

Remarque : Une machine virtuelle est couramment 'fabriquée' à partir de la méthode 1 (compilation adaptée) d'un projet 'modèle'.

Ainsi le programme Node va lire des fichiers qui contiennent des instructions 'javascript' et exécutera chaque instruction javascript en les traduisant par des instructions machines et des appels de fonction.
Il existe des machines virtuelles Node pour les systèmes les plus usités : Microsoft, Ubuntu , MacOS etc.
La liste de architectures supportées par Node

Un programme javascript s'exécutera et se comportera de la même façon sur tous ces environnements: le javascript est donc portable.

Le javascript est le seul langage de programmation normalisé (standard ECMA-262)  à pourvoir s’exécuter nativement dans un navigateur. Avec Node.js , il s’exécute à présent sur le serveur ou d'une manière générale en dehors du navigateur.


La suite à venir:   mettre un  V8 dans ses programmes, la licence Node.js etc..


Question bonus: Pourquoi les programmes java passent par une phase de pré-compilation (bytecode) ?

vendredi 16 novembre 2012

qsview: accéder instantanément à google street view

Sur ce site : http://www.qsview.com/ , il est possible d'afficher directement une image à partir de google street  view


Vous disposez des contrôles suivants:


Avec une possibilité d'exporter les images sans les boutons de contrôle.


samedi 10 novembre 2012

Un système d'exploitation en javascript

Sur le site https://blog.netbsd.org/tnf/entry/kernel_drivers_compiled_to_javascript l'auteur explique comment il utilise javascript pour emuler un microkernel NetBSD.
En clair: comment disposer dans son navigateur EN LOCAL d'un véritable système d'exploitation.

La démo est ici:http://ftp.netbsd.org/pub/NetBSD/misc/pooka/rump.js/

L'écran se présente comme ceci:



La commande help donne le résultat suivant:


 Ici , nous sommes en présence non pas d'un webos (Système d'exploitation DISTANT sur le web) mais bien d'un OS_in_web : un OS (operatic system) dans le navigateur.

Pour quels usages ? : Un bureau hybride : je récupère mon bureau distant ,(webos) je me déconnecte  et je peux continuer  à travailler sans réseau , à la prochaine connexion je synchronise le tout.


lundi 5 novembre 2012

Le contenu de la circulaire du Premier Ministre sur l'usage du logiciel libre dans l'administration


Dans une circulaire du 19/09/12 le Premier Ministre donne des orientations pour l'usage des logiciels libres dans l'administration.
Cette circulaire est accompagnée par une note de 18 pages de la DISIC :.

Cette  note reprend les origines du logiciel libre avec ses 4 libertés  fondamentales :
- La liberté d'utiliser un logiciel
- La liberté d'étudier le fonctionnement d'un logiciel
- La liberté de copier un logiciel
- La liberté  de modifier un logiciel

Avec comme conséquences:
- Un auto-entretient des logiciels
- Une évolution dictée par le besoin de l'utilisateur
- Une communauté qui conserve le contrôle du logiciel
- Une émulation des acteurs

La licence la plus connue est la GPL.
Un logiciel libre n'est pas forcement gratuit: le coût de licence peut être remplacé avantageusement par un coût de formation ou d'adaptation.

Le choix du logiciel libre est un choix raisonné pour des motifs de coûts et de la meilleure maîtrise du SI par les équipes.

Toutefois , il faut être vigilant à un bon usage du logiciel libre en tenant compte des critères suivants:
- La taille de la communauté
- Le modèle économique adossé: une vraie communauté ou un éditeur

L'administration doit faire chercher dans la limite du possible à reverser du code dans les communautés.

Le document liste les cadres favorables à l'utilisation du logiciel libre dont ces deux points importants:
- Dans le cadre de la virtualisation (en raison du mode de licence à l'usage CPU)
- Dans le cadre du développement Agile (opportuniste) .
.

Comment favoriser l'usage du logiciel libre dans l'administration ?.

La note  revient sur la mise en commun des efforts et afin d'éviter l'éparpillement, sur la nécessité d'un cadre de convergence des projets et des versions (souches).
Les mesures prônées sont par exemple:
- Création et maintient d'un catalogue des projets
- Animation d'un réseaux d'expert sur les thèmes communs  comme :

  • La Bureautique (MIMO)
  • Le socle système  (MIMOS) 
  • La gestion de parc  (MIMOG) 
  • Et les bases de données (MIMDB)