Archive

Articles taggués ‘Node.js’

On aime, on partage #61

Bienvenue dans la série « On aime, on partage » de VISEO Technologies ! Chaque mois retrouvez les meilleurs articles du web issus de notre veille technologique.

Java

Java for small teams – Guidance for clean Java code

Un bon rappel des bases qui ne fait pas de mal à la plupart des développeurs (y compris les seniors).

Agilité

Matinée de retours d’expériences de transformations Lean & Agile

VISEO vous propose de découvrir lors d’une matinale inédite, le 7 avril 2016, des retours d’expériences sur des programmes de transformations dans de grandes organisations privées et publiques, en France et à l’étranger.

Au programme :

  • Michael Stump de Scaled Agile
  • Thierry Delvaux d’ING Belgique
  • Shane Harrisson de Crédit Suisse
  • Michel Levaslot et Cécile Auret de Pôle Emploi

Mobile

Xamarin sera finalement racheté par Microsoft

Que  peut-on en attendre ? Une meilleur intégration dans l’écosystème Microsoft ? Une intégration des coûts de licence dans l’abonnement MSDN classique ?

Lire la suite…

On aime, on partage #60

Bienvenue dans la série « On aime, on partage » de VISEO Technologies ! Chaque semaine retrouvez les meilleurs articles du web issus de notre veille technologique. Tous les contributeurs souhaitent à nos lecteurs une belle année 2016.

A la une

Sortie officielle de la version 1.0 de PM2

PM2 est un process manager pour la mise en production d’applications Node.js. Il supporte notamment le hot-reload et est particulièrement adapté aux architectures microservices. Il est utilisé par Paypal et Viadeo.

Quelques statistiques marquantes :

  • 2 millions de téléchargements
  • Plus de 11 000+ étoiles sur Github
  • Le 94ème projet JavaScript le plus populaire sur Github

Agilité

NoEstimates Applied to Software Contractors

Dans cet interview, Vasco Duarte, auteur du livre sur le mouvement NoEstimates répond aux questions concernant l’application du mouvement aux prestations logicielles. On retiendra qu’il est fondamental d’avoir constitué un premier backlog reprenant les fonctionnalités clés (organisé par exemple avec du Story Mapping), qu’il est recommandé de fonctionner par itérations, de se baser sur une quantité de valeur produite, et d’avoir des règles simples d’arrêt. Etonnamment, il semblerait que certaines sociétés conjuguent NoEstimates et NoContracts, preuve d’une grande maturité et relation de confiance entre les parties prenantes.
L’interview se termine avec une proposition de Minimum Viable Contract.

Sortie de la version 4.0 de SAFe

SAFe 4.0 est renommé « SAFe 4.0 for Lean Software and Systems Engineering ».

Lire la suite…

VISEO recrute des développeurs Front-End / Full Stack (AngularJS) H/F

Vous aimez avoir toujours une longueur d’avance, vous savez que le front-end est l’avenir du web et que les pratiques agiles sont efficaces pour mener à bien un projet ?
Développeur talentueux, vous êtes enthousiaste à l’idée d’évoluer dans des univers techniques exigeants ?

Vous êtes la référence front de vos projets, désireux d’intervenir dans des projets  complexes : applications web et mobiles, e-commerce, m-commerce, objets connectés (voiture, TV, habitat…), tablettes… etc. ?
Rejoignez une entreprise de passionné(e)s à la pointe de l’innovation et des nouvelles technologies !

Au sein d’une équipe technique et créative, spécialiste en Javascript, vous avez en charge d’accompagner nos clients dans leurs chantiers de migration web et responsive. Vous êtes amené(e) à implémenter des composants complexes basés sur des directives Angular, des services évolués pour des processus métiers ou des protocoles de communication (Push, Protobuf…). Vous intervenez dans le choix des solutions techniques et vous savez garantir la performance de vos applications. Vous assurez l’architecture et les développements JavaScript (Angular…) de plateformes innovantes ou de sites web grand public.

Votre connaissance du web et de ses pratiques vous permet de participer à l’élaboration des guidelines et best practices.

Environnement technique : JavaScript (AngularJS), Javascript côté serveur (NodeJS), HTML/CSS (Bootstrap), Responsive Design

Découvrez notre offre d’emploi et postulez en ligne : http://www.viseo.com/fr/offre-demploi/developpeur-se-front-end-developpeur-se-full-stack 

On aime, on partage #54

Bienvenue dans la série « On aime, on partage » de Viseo Technologies ! Chaque semaine retrouvez les meilleurs articles du web issus de notre veille technologique. Vous n’êtes pas sans savoir que cette semaine ont eu lieu les Microsoft Tech Days, nous y avons participé et reviendrons dessus spécifiquement.

Node

io.js sort en 1.1.0

L’équipe a supprimé le suffixe « -unstable » dans la semaine. Nous avons testé cette version sur des projets / POC en cours et avons rencontré des problèmes sur certains modules (ex. deasync), mais la communauté est très réactive (les modules sont rapidement mis à jour pour se baser sur les changements apportées dans io.js) et certains acteurs majeurs migrent déjà vers io.js.

Création de la fondation Node.js

Les membres fondateurs sont Joyent, IBM, PayPal, Microsoft, Fidelity et SAP. Joyent espère rallier la communauté autour du fork io.js

Agilité

Fun with Scrum

La société Boston Agile Training a publié deux jeux gratuits pour réviser vos connaissances sur Scrum :  « Scrum Jeopardy » et « Who Wants to be an Agile Millionaire ? »

Lire la suite…

On aime, on partage #48

Bienvenue dans la série « On aime, on partage » de Viseo Technologies ! Chaque semaine retrouvez les meilleurs articles du web issus de notre veille technologique.

Web

Calendriers de l’avant du développeur Web

Deux initiatives de calendriers de l’avant, un article par jour sur le Web pendant 24 jours :

Google introduit « No CAPTCHA reCAPTCHA »

Utiliser le Machine Learning pour revoir l’utilisation des Captchas, c’est ce que Google propose. Plus d’informations sur le site dédié.

Learning JavaScript Design Patterns

Addy Osmani a publié la version 1.6 de l’alternative gratuite en ligne de son livre publié aux éditions O’Reilly.

Lire la suite…

On aime, on partage #41

Bienvenue dans la série « On aime, on partage » de VISEO ! Chaque semaine retrouvez les meilleurs articles du web issus de notre veille technologique.

Node.JS

12 Fabulous Node.js Frameworks for Developers

Une sélection de frameworks Node.js pour vous faciliter la vie. http://thecreativeproject.co/2014/06/08/12-fabulous-node-js-frameworks-for-developers/

User Experience

Agile UX vs Lean UX, which should you choose?

Quelques explications sur ces deux buzzwords afin de mieux comprendre ce qui se cache derrière et de choisir la méthode qui convient le mieux a chaque projet.

http://www.webdesignerdepot.com/2014/05/agile-ux-vs-lean-ux-which-should-you-choose/

Outillage

Git tips from the trenches

Parce que GIT c’est que du bonheur, voici quelques tips pour mieux l’utiliser et améliorer son workflow quotidien.

https://ochronus.com/git-tips-from-the-trenches/

Java

Better Java

Une compilation riche de libs, de bonnes pratiques et d’outils pour le développement en Java.

https://github.com/cxxr/better-java

Le repo de la semaine

Une nouvelle entrée dans notre série hebdomadaire, “le repo de la semaine”. Chaque semaine retrouvez le lien vers un projet GitHub qui nous a aidé dans notre travail ou que nous avons aimé pour son originalité.

Promise Chains with AngularJS $q – Demos, source, & tutorial :

https://github.com/ThomasBurleson/angularjs-FlightDashboard

Nos contributeurs :

Un grand Merci aux contributeurs de cette semaine : Jean-François FOURMOND et Nicolas ROCHE

REX node.js dans un projet front

Pitch projet

Il s’agit de réaliser une plate-forme web permettant d’organiser des évènements musicaux privés en direct. Le matériel musical est mémorisé dans des vidéos Youtube®. Cette plate-forme contient :

  • La gestion de la programmation des sessions DJ.
  • Une interface DJ pour gérer l’enchaînement et un mixage sonore des vidéos.
  • Un système de votes et un chat en temps réel.

La plate-forme doit supporter environ 100 utilisateurs connectés simultanément avec une tolérance de quelques secondes maximums de latence. Elle doit simuler le fonctionnement d’un streaming vidéo.

Solution

On simule un flux vidéo en synchronisant l’affichage des vidéos sur tous les navigateurs connectés en même temps ; en s’assurant que tous les utilisateurs voient la même chose en même temps. La capture d’écran ci-dessus montre l’interface DJ. Chaque action du DJ (volumes A et B, switch video et crossfader) est transmise au serveur puis dispatchée aux auditeurs via une web-socket.

Le choix de la solution s’est porté sur node.js pour ses capacités de push et sa facilité de mise en place. En général, node.js n’est pas utilisé seul car il n’est pas bon dans tous les cas. Les fichiers WEB sont servis par Apache et PHP.

La logique contenue dans node.js gère (entre autres) :

  • L’association de la socket avec la session PHP. Opération simple d’initialisation, nécessaire à la cohabitation des deux mondes.
  • La réception et la diffusion des messages ASAP

Le terme ASAP est plus proche de la réalité que le terme temps-réel. Le moteur (V8) de node.js contient un garbage collector qui rend difficile voire impossible de maîtriser le temps d’exécution.

Remarque, à plein régime, la latence constatée ne dépasse pas 500ms sur une machine bas de gamme.

Exemple de code de gestion des sessions/sockets.

Dans le tiers node.js, la connexion web-socket représente un utilisateur.  La socket étant un objet javascript, on le complète avec les données de session.

//////// CLIENT ////////

// Le module socket.io sert lui-même son client js au navigateur via http sur le port ouvert pour servir la websocket.

var urlNode = "http://domaine:port/";
var socket = io.connect(urlNode, {
    // (...)
    'reconnect':true
});

// Reception du message arbitraire 'ready'
socket.on('ready', function(data) {
    // Connexion établie
    var msg = {};
    msg.sessionId = "1234567890";
    socket.emit('whatever', msg);
});

// Message prédéfini
socket.on('connect_failed', function () {
    // gestion des erreurs de connection
    // Autres messages prédéfinis : error, reconnect_failed, disconnect
});
//////// SERVER ////////

var socket_io = require('socket.io');
// Création du serveur de WSocket
var io = socket_io.listen(port);
// Paramétrage socket.io
// Voir : https://github.com/LearnBoost/Socket.IO/wiki/Configuring-Socket.IO
io.configure(function() {
    // (...)
    io.set('transports', [ 'websocket', 'flashsocket', 'htmlfile', 'xhr-polling', 'jsonp-polling' ]);
});
// Création des callbacks
io.sockets.on('connection', function socketOnConnection(socket) {

    socket.on('disconnect', function socketOnDisconnect() {
        // Exécuté quand la connexion est perdue.
    });

    // Réception d'un message
    socket.on('whatever', function socketOnWhatever(data) {
        // 'whatever' est une string envoyée par le client
        // data est un objet contenant les données transmises par le client.
        // socket est l'objet du scope 'socketOnConnection' qui représente la connexion.
        // par exemple renvoyer des données au client : socket.json.emit('whateverback', data);
    });

    socket._session = {};
    // Init des données session utilisateur
    socket._session.lang = 'fr';
    socket._session.userData = {};
    socket._session.userData.identified = false;

    // io.sockets.clients() contient un array d'objets Socket.
    console.log('New connexion. Total connected : ' + io.sockets.clients().length);

    socket.json.emit('ready', {});
});

Notes

Socket.io est très pratique pour gérer les messages échangés entre le client web et le serveur. Il gère aussi des namespaces (rooms). Il ne permet pas de gérer les données binaires nativement. Il faut envisager d’autres solutions pour les uploads d’images ou pour exploiter les données webRTC.

Node.js en deux mots : ”Node.js is a platform built on Chrome’s JavaScript runtime for easily building fast, scalable network applications. Node.js uses an event-driven, non-blocking I/O model that makes it lightweight and efficient, perfect for data-intensive real-time applications that run across distributed devices.”

On peut penser à Node.js pour répondre à un besoin d’architecture Single Page, temps-réel léger. Une solution facile et rapide à mettre en place pour faire du push vers le navigateur. Pour apporter aux utilisateurs les avantages ergonomiques du mode connecté. On peut y penser dans un middleware pour interfacer un bus de messages. D’une manière générale, Node.js sera bon quand il y a beaucoup I/O.

On peut oublier Node.js quand on a de gros besoins en CPU.

Références

Découvrir node.js : http://book.mixu.net/node/

Référence : http://nodejs.org/api/

Cookbook : http://howtonode.org/

Implémentation de la webSocket avec un down grade transport vers Flash, AJAX ou JSONP : http://socket.io/

Contributions communautaires pour node.js : https://npmjs.org/

Categories: Divers Tags: ,

Node.js et Websocket sur mobile : Une combinaison gagnante !

Dans le cadre du développement de l’application iPhone du projet Leilas, j’ai voulu mettre en place un système de communication multi-plex ou bidirectionnelle, pour permettre des mises à jour temps réel de mes données.

Le projet Leilas consiste à géo localiser le contenu de documents ou de sites web pour leur donner une dimension géographique. Concrètement, on traite des documents via un portail web pour en extraire des lieux et construire ainsi une base de connaissance exploitable.

Comme application, nous avons réalisé un portail orienté tourisme et des applications mobiles permettant de visualiser la base de connaissance sur une carte et de créer des itinéraires à partir de ces lieux. Les plateformes mobiles accédent aux données via des web services de type REST.

Le rendu sur  iPhone est présenté sur une carte (voir ci-dessous).


Le problème

Lorsqu’un utilisateur insère un document via le portail et de  nouveaux lieux sont trouvés, les utilisateurs sur mobile ne sont pas notifiés et la carte n’est pas mise à jour. Beaucoup de solutions existent pour résoudre ce problème mais elles ne sont pas toutes simples et surtout pas toutes appropriées pour le mobile.

Une première solution naïve serait de faire du   « server polling » pour vérifier si nos données sont à jour. À titre d’expérimentation, j’ai implémenté une solution faisant un appel au serveur toutes les « X » millisecondes pour faire un « timestamp check ». Cette approche comporte plusieurs problèmes. Premièrement, une forte consommation de la batterie des téléphones, nous le confirmerons un peu plus tard. Deuxièmement, même si moins problématique, nous constatons une surcharge de connexions coté serveur et de bande passante dû à l’en-tête-http de chaque polling.

Alors comment faire proprement du push sur mobile?

 Pour éviter de faire du polling mais pour garder les avantages du protocole http, je me suis appuyé sur la solution WebSocket, un standard dont le « handshake » repose sur http et le port 80,  qui permet des communications bidirectionnels. On peut également utiliser Websocket en SSL avec WSS pour s’assurer de passer la plupart des pare-feux.

Faire du Websocket coté client sur un mobile n’est pas très complexe, vous trouverez plusieurs solutions open source, y compris en Objective-C compatible iOS. Coté serveur, il existe également plusieurs implémentations, mais pas toutes scalables. Voici un article comparant Atmosphere, Netty, Vert.x et Node.js : http://weblog.plexobject.com/?p=1698).

Je m’impose aussi comme contrainte de ne pas modifier ma stack JEE existante (Tomcat6, Jersey, Spring…). J’ai donc choisi d’ajouter un serveur « on the side » qui fera lui -même le polling et se chargera de notifier tous les mobiles via Websocket.

Mon choix s’est porté sur Node.js. Cette technonologie propose une approche évènementielle permettant des appels à des webservices de façon complètement asynchrones et intègre WebSocket via un module Socket.io d’une simplicité diabolique.

Voici un schéma simplifié de l’architecture mise en place :

Un peu plus d’explication sur Node.js

Le modèle de Node est diffèrent des architectures plus classiques, qui tendent à coupler une connexion à un thread. Node possède un « front thread » qui traite toutes les requêtes entrantes et délègue tout I/O à un « background thread pool ». De par ses API JavaScript, il est très facile de créer ses propres « events » et d’interagir avec la « run loop » principale. Cet article, « Future proofing your apps : Cloudfoundry and Node.js » explique clairement pourquoi Node ne se résume pas seulement à un framework web JavaScript et pourquoi son approche est parfaitement « scalable ».

D’autres technos reprennent ces principes, donc pourquoi Node.js plutôt qu’une autre ?

Il est vrai qu’il existe des alternatives, par exemple Vert.x (http://vertx.io/) est l’équivalent++ de Node en java. La réalité c’est que Node.js possède déjà une énorme communauté, avec un « repository » de Modules (npm : https://npmjs.org/) pour faire à peu près tout ce qu’on veut. Un autre argument en sa faveur est le nombre de PaaS qui le supportent aujourd’hui, dont plusieurs sont « WebSocket compatible ».
Personnellement, ce qui m’a attiré le plus c’est sa simplicité.

Voici un bout de code JavaScript/Node pour récupérer le timestamp d’un seul user et de le notifier en cas de mise à jour :

Pour une gestion multi-utilisateur, le code n’est guère plus compliqué.

Coté iOS, j’ai utilisé une librairie tiers pour initier la connexion Socket.io :
[socketIO connectToHost:url onPort:80];
et recevoir des « events » :
didReceiveEvent:(SocketIOPacket *)packet.
Une fois l’ « event » reçu, j’ai utilisé une NSNotification pour mettre à jour ma carte. Toujours rien de très compliqué.

Voici une comparaison de l’utilisation CPU (Faite par Xcode Instruments) d’un iPhone3GS entre la solution naïve décrite plus haut et la solution avec WebSocket. Le scenario consiste en 1 min d’activité avec une seule mise à jour des  entités, logiquement représenté par les pics dans les deux cas.

Avec WebSocket, on a une activité de l’application quasi inexistante lorsqu’aucune mise à jour n’est nécessaire. Une indication qui nous permet de dire que sur cette fonctionnalité, on a un gain de batterie évident.

Une dernière chose intéressante à noter sur Socket.io est qu’il offre une réel interface pour créer des applications de type comet, non seulement avec Websocket. Cette solution, Node.js/Socket.io peut donc facilement se « plugger » à beaucoup d’existants, même des applications web nécessitant le même genre de mécanismes.

Voila pour la petite anecdote.