dimanche 11 mars 2012

module forever de #node.js: pour une production sure

Dans un post précédent j'ai évoqué le fonctionnement de Node.js. Il existe un module appelé 'forever' qui industrialise le lancement de script javascript pour Node.js.
L'installation se fait comme d'habitude par la commande

sudo npm -g install forever

Le résultat doit etre:


/usr/local/lib/node_modules/forever
├── pkginfo@0.2.3
├── timespan@2.0.1
├── watch@0.5.0
├── microtime@0.2.0
├── daemon@0.4.1
├── node-fork@0.4.2
├── nssocket@0.3.7 (eventemitter2@0.4.8 lazy@1.0.8)
├── cliff@0.1.7 (colors@0.6.0-1 eyes@0.1.7)
├── portfinder@0.2.1 (mkdirp@0.0.7)
├── optimist@0.2.8 (wordwrap@0.0.2)
├── broadway@0.1.13 (colors@0.6.0-1 eventemitter2@0.4.8 optimist@0.3.1)
├── minimatch@0.0.5 (lru-cache@1.0.5)
├── utile@0.0.10 (async@0.1.18 mkdirp@0.3.0 rimraf@1.0.9 ncp@0.2.5)
├── flatiron@0.1.14 (director@1.0.9-1 optimist@0.3.1 prompt@0.1.12)
├── nconf@0.5.1 (async@0.1.18 ini@1.0.2 optimist@0.3.1)
├── ps-tree@0.0.2 (parse-table@0.0.0)
└── winston@0.5.10



Le lancement d'un programme par forever est très simple :

forever start 'monprogramme.js'


Exemple :(commande start et list)

 forever start cluster1.js

info:   Forever processing file: cluster1.js

german@german-1001PX:~$

german@german-1001PX:~$ forever list

info:   Forever processes running

data:       uid  command script      forever pid  logfile                        uptime     

data:   [0] YJVa node    cluster1.js 2857    2858 /home/german/.forever/YJVa.log 0:0:0:7.882


Si le programme lancé par forever vient à tomber, il  sera relancer automatiquement.
Forever est lui même en mode daemon (on peut fermer son terminal de lancement) 

L'aide sur forever est la suivante:

L'article http://blog.nodejitsu.com/keep-a-nodejs-server-up-with-forever et le site de forever complètent mon propos.
Sur stackoverflow : un exemple d'usage de forever à l'intérieur d'un programme.

samedi 10 mars 2012

#node.js en cluster


Dans son mode de fonctionnement normal Node.js sera vu  par le système d'exploitation comme un programme mono-thread tournant sur un seul processeur. Ce mode d’exécution est optimum pour Node.js: il n'aura pas à partager des variables ni à synchroniser des threads. C'est plus une philosophie qu'une limite de Node.js.
Si vous avez  besoin de renforcer votre infrastructure en utilisant tous les processeurs,vous pouvez utiliser le module cluster. Ce dispositif permet de lancer le même  programme javascript sur plusieurs instances Node.js. Attention tous les programmes ne se prêtent pas à cette forme d'écriture et d'utilisation. Dans certains cas il sera nécessaire de mettre en place une communication inter-processus, mais c'est une autre histoire. L'installation se fait par


npm install -g cluster


Structure du programme.


La structure du programme est classique pour ce type d'utilisation :
La partie père du programme  accède à une fonction qui  retourne la liste des processeurs disponibles sur le PC. Puis en fonction du nombre, la partie père lance autant de fils que nécessaire. Dans l'exemple proposé, un numéro de PID pair d'un fils retourne un code OK '200', un numéro impair retourne une erreur '400'.
 


Après le lancement du script via node.js, la commande ps ax|grep node donnera:

 ps ax|grep node

 2596 pts/0    Sl+    0:00 node cluster1.js

 2598 pts/0    Sl+    0:00 /usr/local/bin/node /home/german/cluster1.js

 2599 pts/0    Sl+    0:00 /usr/local/bin/node /home/german/cluster1.js



La première ligne correspond au job du père, les deux autres aux  fils. Ce sont eux qui prennent indifféremment les connexions entrantes.
En cas de perte d'une instance le flux sera pris par la deuxième.
Les règles de répartion sont gérées par l'OS.
La fonction cpus donne sur ma machine:



[ { model: 'Intel(R) Atom(TM) CPU N450   @ 1.66GHz',
    speed: 1667,
    times:
     { user: 1768110,
       nice: 31500,
       sys: 936040,
       idle: 2281930,
       irq: 160 } },
  { model: 'Intel(R) Atom(TM) CPU N450   @ 1.66GHz',
    speed: 1667,
    times:
     { user: 1753240,
       nice: 40410,
       sys: 910150,
       idle: 2252070,
       irq: 140 } } ]


Tests avec jmeter

J'ai utilisé le projet libre jmeter pour tester le bon fonctionnement du dispositif.
Les copies d'écran présentent le plan de charge et le résultat de son exécution. 
Le plan de test

En  vert les codes retour 200 (OK)  en rouge les codes 400 (erreurs)


La aussi pas de surprise: plus la taille de l'échantillon augmente et plus la répartition est proche de la médiane.

En conclusion: Le mode cluster est à réserver pour un usage limité. Si on recherche de la tolérance de panne, le module forever sera plus adapté.

mardi 6 mars 2012

Livres gratuits #node.js

Sur amazon : un livre gratuit consacré à Node.js.
Lien ici....


Un autre ici..... Mastering Node.js

lundi 5 mars 2012

Programmez - mars 2012 (150) #coffeescript #jQuery

Dans le dernier numéro de Programmez : (numéro 150) .


Le titre du dossier est prometteur et  bonne nouvelle : il tient ses promesses.

Au sommaire:

  • Un très bon article sur coffeescript : ce langage permet aux développeurs 'coté serveur' de programmer en javascript comme des développeurs 'coté client'. L'article prend un exemple en java et le porte en coffeescript.
  • Une introduction au langage 'R' . R est le langage de programmation des statistiques.
  • Une guide pour bien démarrer avec jQuery.
  • Hadoop et du javascript .. 

samedi 3 mars 2012

Une semaine sur #Pinterest

J'ai essayé le nouveau truc à la mode qui s'appelle 'pinterest'.


 Nous sommes nombreux à coller des choses sur la porte du frigo.

 Avec pinterest vous disposez d'une immense porte de frigo ou d'un tableau magnétique géant pour accrocher des photos ou des vidéos. Il est possible d'organiser par thème ses tableaux. Ce site connait un gros succès avec un nombre d'utilisateur croissant (> à 10 millions) . Son public est majoritairement féminin.

Pourt suivre mes tableaux : c'est ici.  Je m'en sert pour conserver des illustrations au fur et à mesure de mes explorations. Pour 'punaiser' plus facilement, il est recommander d'ajouter le composant pinterest à son navigateur.




vendredi 2 mars 2012

#Ruby sur #android avec ruboto


Réaliser une simplement application pour android 

Remarque préalable.
Les smartphones sont divisés en deux familles les iphones sur IOS et les android.
La technologie à privilégier sur Iphone pour réaliser une application est objective-C.

Sur ANDROID , c'est le langage JAVA qui est utilisé. La pile java sur Android est différente de celle de votre PC. Sur un PC le schéma classique est le suivant: 
Confection d'un source java 
Compilation par le programme javac afin d'obtenir un fichier  de type pseudobyte  (.class) qui sera interprété par une JVM.

Sur ANDROID, le pseudobyte est à son tour compilé pour obtenir un fichier 'dex' interprété non pas par la JVM mais par un dispositif semblable : dalvik
conclusion intermédiaire: une application en  objective-c sera plus performante que son équivalant sur ANDROID. Son code est compilé, directement exécutable.
Source: 
http://www.technomicon.com/ElectroPolitics/ElectroPolitics-11-15-10.html

Installation sur le PC.
Pour ANDROID, le développement se fait sur un PC doté d'un kit de développement complété le plus souvent d'un émulateur de smartphone. Cet émulateur permet de tester très simplement et en toute sécurité vos applications sans avoir recours à un vrai smartphone.
L'outil privilégié pour réaliser tout ça est le plus souvent l'IDE éclipse avec les extensions pour ANDROID.

Il existe une solution alternative avec Ruby et RUBOTO. A l'origine tout commence par jruby, ce projet permet d'écrire des programmes en Ruby qui seront exécutés sur une JVM.  A partir d'un source Ruby, Jruby génère le bytecode qui sera interprété par la JVM. Le projet RUBOTO fourni plusieurs fonctionnalités: 
a) Génération de squelette d'application pour ANDROID
b) Outils pour créer un fichier directement en pseudo-code dex. Jruby intervient  pour la partie amont de traduction du source Ruby en pseudo-code java.  
c) Les librairies à installer sur le système ANDROID pour faire fonctionner les applications RUBOTO.

Le guide de démarrage du site RUBOTO donne la marche à suivre pour obtenir votre première application.
Les principales étapes sont les suivantes:

Les prérequis:
  • installation du
  • installation de jruby
  • SDK ANDROID
  • installation d'un émulateur ANDROID.
L'installation de jruby peut se faire avec l'utilitaire rvm (Ruby Virtual Machine). Pour le reste suivre la documentation du site RUBOTO. Tout fonctionne parfaitement sous Ubuntu
Sur votre ANDROID.

Il faudra récuperer le 'ruboto core' : c'est l'ensemble des librairies utilisées pour faire tourner vos application. L'installation se fait par l'android market. (copie d'écran) 

Un autre utilitaire sera necessaire pour faire passer votre application de votre PC à votre téléphone. J'ai utilisé l'application 'Apk Installer'  toujours par l'android market 

 Après avoir relié le smartphone au PC par le cable USB, il suffira de déposer le programme-archive (.apk)  dans l'arborescence de la SD.  L "APk installer" sera alors capable d'installer l'application comme si elle était issue de l'android market.

Un projet RUBOTO propose des dossiers pour ranger les ressources de l'application (icones).





L'application est ici: 


Elle ressemble à ceci:
L'émulateur  donne cet écran:


La doc  de Ruboto détaille comment accéder aux informations du GPS ou du wifi.

En conclusion:

Dans le cas présent on est dans le domaine des applications de type 'client lourd'.
Réaliser une application de type client léger serait encore plus simple (et plus portable)  mais il manquerait l'accès aux ressources locales (GPS, wifi etc) . L'annonce du portage de chrome sur Android est très importante. Car chrome vient avec son moteur javascript 'V8'.  L'objectif d'avoir un serveur web local léger comme node.js se rapproche.