Use the same stream multiple times

Use the same stream multiple times

Hi everibody.

Today I want to share with you something that I discovered after several hours of searching and trying. I’m talking about use the same stream multiple times. Know that you can solve this problem only with the basic tools provided in NodeJS.

Normally, when you eat a flow, we can not do anything if the done method was called. To bypass this limitation, I’ll tell you about the PassThrough streams. Here’s what NodeJS documentation says about them :

This is a trivial implementation of a Transform stream that simply passes the input bytes across to the output. Its purpose is mainly for examples and testing, but there are occasionally use cases where it can come in handy as a building block for novel sorts of streams.

We will use it here to copy our stream several times and use it as many times we create PassThrough. To create a PassThrough stream from another stream, it’s very simple :

// we include nodeJS stream API
var Stream = require('stream');
// our source stream.
var stream; 
// we create empty PassThrough stream
var copyStream1 = new Stream.PassThrough(),
    copyStream2 = new Stream.PassThrough();
// copy source stream into PassThrough stream
stream.pipe(copyStream);
stream.pipe(copyStream2);

Now, we only can use copyStream1 and copyStream2 but, in fact, it’s like using our stream twice. I hope this tip will be useful

Create Node.JS development Environment on OSX

Create Node.JS development Environment on OSX

Preamble

Hi, a lot of people tell me that I make good articles but they are not written in French. So I decided to write it in English for this reason as well to improve my English skill

So I apologize in advance if I make horrible English mistakes.

Introduction

We’ll see how to install a Node.JS development environment on your mac. This environment contains :

  • Homebrew
  • Node.JS
  • MongoDB
  • Nginx
  • Redis
  • and an awesome Bonus
For this tutorial, I perform the installation on the most recent version achieved on Mac OSX : Yosemite. It is possible that some things are different depending on your version and the current state of your system.

Installation

Requirements

You must install the following software before continuing:

  • Xcode (to have gcc and other build requirements)
  • X11 server (for cairo library used for canvas npm module and others)

After installing the X11 server, you will need to add the following line in your ~/.bash_profile file :

export PKG_CONFIG_PATH=/usr/local/lib/pkgconfig:/opt/X11/lib/pkgconfig
Do not forget to run the source ~/.bash_profile command after changing your `~/.bash_profile` file.

Homebrew installation

Homebrew installs all the dependencies you need Apple does not provide you. It is used to install several libraries (gd, imagemagick, cairo, …) and servers (nginx, php, mysql, …).

To install Homebrew, it’s really simple. You just have to enter this line in your terminal :

ruby -e "$(curl -fsSL https://raw.githubusercontent.com/Homebrew/install/master/install)"

Homebrew will ask you to install Command-line tools. Accept and follow the instructions on the screen. At the end of the installation, enter the command brew doctor to see if Homebrew has been properly configured.

Installation of servers stack

Here is an important part of the article. In this part, we will install all servers for node.JS development :

  • Node.JS
  • Nginx
  • MongoDB
  • Redis (used for express and socket.io session storage)

To install the server, enter the following command in your terminal :

brew install nodejs mongodb nginx python redis

After this, run the following commands :

ln -sfv /usr/local/opt/nginx/*.plist ~/Library/LaunchAgents
ln -sfv /usr/local/opt/mongodb/*.plist ~/Library/LaunchAgents
ln -sfv /usr/local/opt/redis/*.plist ~/Library/LaunchAgents

launchctl load ~/Library/LaunchAgents/homebrew.mxcl.nginx.plist
launchctl load ~/Library/LaunchAgents/homebrew.mxcl.mongodb.plist
launchctl load ~/Library/LaunchAgents/homebrew.mxcl.redis.plist

These commands add the services to run servers in Mac OSX.

Finally, you can add the following line in your ~/.bash_profile file :

alias nodejs='node'    

I created this alias because, at work, I work on Linux, and the command to start NodeJS is nodejs. You can either start Node.JS with node or nodejs.

Install Node.js modules Dependencies

Several modules need to install libraries in Mac OSX so that they work properly. If you do not have the libraries required when installing a module, NPM will stop the installation. So I recommend you to install the following libraries to be quiet for most of the node modules :

brew install imagemagick gd icu4c cairo libpng libjpeg giflib

I recommend you then run the following command to avoid errors with modules requiring icu4c library.

brew link icu4c

Now all dependencies are installed.

Configuration

Nginx

Normally, Nginx works like Apache, with two directories to manage your virtual-hosts :

  • sites-available : Files for available websites but not necessary activated
  • sites-enabled : Files (essentially links to sites-available files) for enabled websites

But, in OSX, this directories are not created. To create this, run the following commands in your terminal :

cd /usr/local/etc/nginx
mkdir sites-available
mkdir sites-enabled

And edit your /usr/local/etc/nginx/nginx.conf file like this :

user  replacebyyourusername staff;
worker_processes  1;

events {
    worker_connections  1024;
}

http {
    include       mime.types;
    default_type  application/octet-stream;

    include /usr/local/etc/nginx/sites-enabled/*;
}

If you look at the configuration file, you’ll notice the following line:

user  replacebyyourusername staff;

On Unix systems, it is necessary to run the Nginx server as root to use port 80. Under development sites are stored in our current directory, we need to tell Nginx with which user it runs. In our case, it must run as ourselves.

Redis

By default, the Redis master password is disabled. You must enable it by editing the /usr/local/etc/redis.conf file and looking for the following line:

#requirepass foo 

Uncomment this line and replace the default password that you choose.

MongoDB

For MongoDB, you must create an administrator for the server and a user for each database you will have. An article should be here soon to explain how to do it but in the meantime, I recommend you to see this mongodb official tutorial. I will update this article when it is written.

Bonus

Well, the article is completed, but before you leave, I give you some bonus to simplify server administration and software installation within OSX.

Homebrew Cask

Homebrew cask is an extension of Homebrew. It allows you to install, from the terminal, an application for Mac OSX without the dmg file. Enter this command in your terminal:

brew install caskroom/cask/brew-cask

We need Homebrew Cask for further bonuses.

Servers status monitoring

I know, on Mac OSX is not easy to start and stop a service. For example, this is the command to start mongoDB service :

launchctl start ~/Library/LaunchAgents/homebrew.mxcl.mongodb.plist

To simplify this, @jimbojsb developed launchrocket to manage the various services installed with Homebrew. To install, run the following command :

brew cask install launchrocket

Next, go to System Preferences. You should see the bottom of the window, the launchrocket button. Click it to access the Service Manager. If you do not see services, this is normal. Click on the button Scan Homebrew to refresh the homebrew installed services.

Note : You should click on this button after new service installation and after service upgrade.

Robomongo

To explore your mongodb databases and collections, I recommend you to use Robomongo. It’s simple and really helpful to test some aggregation requests, remove and add indexes, …

To install this with cask, execute this command :

brew cask install robomongo

Conclusion

Now, you have all the requirements to start your future NodeJS development. I know, with this article, i prefer show you how to install all new technologies with NoSQL and Node.JS.

I preferred to ignore MySQL because, nowadays, the major part of developers go on the couple NodeJS/MongoDB rather than NodeJS/MySQL.

I hope I have been around and not doing too many mistakes in this article. If you see or want to see new things in this article, do not hesitate to tell me in the comments.

Mise en production projet node.js

Mise en production projet node.js

Présentation

Après un temps d’abscence, me revoici pour vous présenter comment mettre en production votre projet Node.js au sein de votre serveur de production. Personnellement, j’utilise NGinx pour faire le lien avec le serveur http de node.JS.

Sachez que j’utilise un serveur Ubuntu x64 14.04 LTS pour cet article. Il se peut que selon votre distribution, certaines commandes changent.

Prérequis

Avant de commencer, sachez que je n’utilise pas les versions de node.js et de npm fournis par ubuntu car elles ne sont pas mise à jour régulièrement et que la mise à jour de npm par lui même ne marche pas, De même pour NGinx. De plus, pour gérer comme il faut mon projet Node.JS, j’utilise monit et upstart. Voici donc toutes les commandes à rentrer pour être prêt à commencer :

# avant de commencer, mettre à jour Ubuntu
sudo apt-get update && sudo apt-get upgrade
# installation de paquets nécessaires disponibles dans ubuntu
sudo apt-get install imagemagick libicu-dev libgd2-xpm-dev python-software-properties software-properties-common build-essential upstart monit
# installation de nginx et de node.js
sudo add-apt-repository ppa:nginx/stable
sudo add-apt-repository ppa:chris-lea/node.js
sudo apt-get update
sudo apt-get install nginx nodejs
Attention : Avec cette installation de Node.JS nous nous retrouvons en 0.10.X. De plus, la commande de base n’est pas node mais nodejs

Utilisateur webuser

De base, l’utilisateur exécutant la partie web chez moi ne doit pas avoir les accès sudo. Je créée donc un nouvel utilisateur avec pour nom webuser :

sudo useradd -d /home/webuser -m webuser
sudo passwd webuser
su webuser
# on est chez webuser
cd
mkdir public_html
exit

NGinx

Maintenant voici le fichier NGinx à créer pour pouvoir faire le lien entre le port 80 (ou 443 si vous passez via https) et votre processus node (les 3/4 du temps sur le port 3000). Le fichier sera à placer dans /etc/nginx/sites-available/

upstream app_nodenomunique {
        server 127.0.0.1:3000;
}

server {
    listen 443 ssl;
    server_name api.testnode.com;
    ssl_certificate /etc/nginx/certificates/site.crt;
    ssl_certificate_key /etc/nginx/certificates/site.key;
    ssl_protocols SSLv3 TLSv1 TLSv1.1 TLSv1.2;
    ssl_ciphers HIGH:!aNULL:!MD5;

    access_log /var/log/nginx/votreprojet.log;

    # supposedly prevents 502 bad gateway error;
    # ultimately not necessary in my case
    large_client_header_buffers 8 32k;

    client_max_body_size 10M;

    # pass the request to the node.js server with the correct headers and much more can be added, see nginx config options
    location / {
        proxy_set_header X-Real-IP $remote_addr;
        proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
        proxy_set_header Host $http_host;
        proxy_set_header X-NginX-Proxy true;

        # prevent 504
        proxy_read_timeout 600;

        # supposedly prevents 502 bad gateway error;
        # ultimately not necessary in my case
        proxy_buffers 8 32k;
        proxy_buffer_size 64k;

        proxy_pass http://app_nodenomunique/;
        proxy_redirect off;

        # the following is required as well for WebSockets
        proxy_http_version 1.1;
        proxy_set_header Upgrade $http_upgrade;
        proxy_set_header Connection "upgrade";
    }
}

Comment ça marche exactement ici ? La liaison vers votre serveur node.JS est renseignée via cette partie du fichier :

upstream app_nodenomunique {
        server 127.0.0.1:3000;
}

Ensuite, nous indiquons dans la partie location /, qui correspond aux réglages de la racine de notre url (ici api.testnode.com) de passer par le proxy http://app_nodeunique/ qui correspond à notre redirection vers 127.0.0.1:3000. Pour l’utilisateur accédant à votre site, api, … c’est entièrement transparent.

Pour finir, vous devrez créer un lien symbolique pour placer le fichier dans le répertoire sites-enabled puis de relancer nginx :

sudo ln -s /etc/nginx/sites-available/api.testnode.com /etc/nginx/sites-enabled/
sudo service nginx restart
Si vous essayez d’accéder à votre site, vous devriez avoir, si bien entendu votre serveur node.JS est coupé, une erreur 502 voulant dire que Nginx ne peut réaliser la redirection.

Initialisation du projet depuis GIT

Cette partie vous concerne si vous avez votre projet hébergé chez git. Je donne ici les commandes à effectuer pour initialiser ce projet. De toute manière voici l’arborescence que vous devriez avoir :

/
˪ home
    ˪ webuser
        ˪ public_html
            ˪ votreprojet 

Et maintenant l’initialisation via git :

cd /home/webuser/public_html
sudo -u webuser -H git clone git@votreserveur:userougroupe/votreprojet.git
cd votreprojet
sudo -u webuser -H npm install

Upstart

Upstart va servir à démarrer notre serveur comme si c’étasit un service linux, avec le bon utilisateur comme propriétaire. Pour cela, vous devez créer le fichier /etc/init/votreprojet.conf avec le contenu suivant :

#/etc/init/votreprojet.conf
description "NodeServer init script"
author "throrin19"

start on startup # it's possible to use "net-device-up IFACE=eth0" for starting the process when the ethernet adapter is up
stop on shutdown

script
    cd /home/webuser/public_html/votreprojet
    exec sudo -u webuser NODE_ENV=production /usr/bin/nodejs /home/webuser/public_html/votreprojet/server.js >> /home/webuser/logs/nodeserver.log 2>&1
end script
Attention : Vous devrez impérativement créer le répertoire /home/webuser/logs.

Monit

Monit lui, va servir à redémarrer le serveur nginx s’il est en panne, redémarrer l’api si elle est innaccessible et envoyer un email d’erreur dès qu’il y en a. Pour cela, vous devrez créer deux fichiers :

  • /etc/monit/monitrc.d/votreprojet
  • /etc/monit/monitrc.d/email

Quand les fichiers sont crées et complétés, vous devrez faire un lien symbolique vers /etc/monit/conf.d de la manière suivante :

sudo ln -s /etc/monit/monitrc.d/email /etc/monit/conf.d/
sudo ln -s /etc/monit/monitrc.d/votreprojet /etc/monit/conf.d/
sudo ln -s /etc/monit/monitrc.d/nginx /etc/monit/conf.d/

votreprojet

check host nodeapp with address 127.0.0.1
    start "/sbin/start votreprojet"
    stop "/sbin/stop votreprojet"
    if failed port 3000 protocol HTTP
        request /
        with timeout 10 seconds
        then restart
        if 5 restarts within 5 cycles then timeout

email

set mailserver smtp.gmail.com port 587
    username "user@gmail.com" password "password"
    using tlsv1
    with timeout 30 seconds


set alert votremail@domain.com

set mail-format { 
    from:server@domain.net 
    subject: [production]monit alert -- $EVENT $SERVICE 
    message: $EVENT Service $SERVICE 
             Date: $DATE 
             Action: $ACTION 
             Host: $HOST 
             Description: $DESCRIPTION 
}

Start, Stop, Restart

Maintenant, si vous voulez lancer, arrêter et redémarrer l’api, vous n’aurez qu’à faire

sudo start votreprojet
sudo restart votreprojet
sudo stop votreprojet
Attention : Avec monit, si vous arrêtez l’API, elle se redémarrera automatiquement au bout de 30s.

Si vous voulez couper et relancer monit, faites juste :

sudo service monit stop
sudo service monit start

Script de mise en production

Lors de la mise à jour de l’API, tout comme pour l’installation, vous avez juste à lancer le script suivant :

#!/bin/sh
cd /home/webuser/public_html/votreprojet
sudo -u webuser -H git pull
sudo -u webuser -H npm install
sudo restart votreprojet

Le mot de la fin

Voilà. Maintenant vous êtes aptes à mettre en production votre projet NodeJS. Certains d’entre vous passeront par les tags plutôt que par la branche master pour les mises à jour de la production. Je suis bien preneur pour un script permutant ceci. De plus je n’ai pas parlé des scripts de migration pour mettre à jour la BDD, … Je me suis concentré sur l’essentiel. N’hésitez pas à me faire vos remarques.

Personnalisation du terminal : Powerline

Personnalisation du terminal : Powerline

Bonjour et tout d’abord. Bonne Année 2014 à tous. Pour commencer cette année sur de bons pieds, je vais vous apprendre à installer Powerline sur votre machine UNIX.

À l’heure où j’écris cet article, l’installation a été effectuée sous Max OSX Maverick et Ubuntu 13.04. Je ne promets pas que l’installation soit similaire sous les versions antérieures.

Introduction

Powerline qu’est-ce que c’est ? C’est un programme python permettant une personnalisation spécifique du Terminal, Vim, … Vu qu’un screenshot parle plus que des mots, voici comment sera votre terminal à la fin de cet article :

powerline_1

Installation

Prérequis

Avant d’installer Powerline, un certain nombre de choses doivent être installées sur votre machine.

Vous devrez installer Python avant toute chose. Vu que Powerline est écrit en Python, il est nécessaire de l’avoir pour que celui-ci fonctionne. De plus, pour la suite de l’installation, nous avons besoin d’installer pip permettant d’installer de nouveaux packages au sein de Python (tout comme npm pour node).

# OSX
brew install python
# Ubuntu 
sudo apt-get install python
# La suite est commune
sudo easy_install pip

Ensuite, afin que les commandes des modules complémentaires de Python soient reconnus par votre terminal, vous devrez rajouter les lignes suivantes dans votre ~/.bash_profile :

OSX :

if [ -d "$HOME/Library/Python/2.7/bin" ]; then
    export PATH="$HOME/Library/Python/2.7/bin:$PATH"
fi

Linux :

if [ -d "$HOME/.local/bin" ]; then
    export PATH="$HOME/.local/bin:$PATH"
fi

Pour que les modifications soient prises en compte, relancez votre terminal ou bien tapez source ~/.bash_profile si vous l’avez d’ouvert.

Pour finir, pour que les caractères spéciaux de powerline marchent sur votre poste, vous devrez installer une police pré-patchée que vous pourrez trouver ici : Github powerline pre-patched fonts. Personnellement, je vous conseillerais de prendre la police UbuntuMono.

Le coeur de l’installation

Maintenant que vous avez installé tous les prérequis, il ne reste plus qu’à installer et configurer powerline. Pour l’installation, rien de plus simple :

pip install --user git+git://github.com/Lokaltog/powerline

Voilà powerline est installé dans sur votre poste. Par contre, votre terminal n’a pas changé. C’est normal. Vous devrez rajouter la ligne suivante dans votre ~/.bash_profile puis relancer le terminal :

# ligne sous OSX
. ~/Library/Python/2.7/lib/python/site-packages/powerline/bindings/bash/powerline.sh
# ligne sous Linux
. ~/.local/lib/python2.7/site-packages/powerline/bindings/bash/powerline.sh

Normalement, vous devriez avoir l’apparence de la capture d’écran en haut de l’article.

Bonus

Si vous voulez, en plus de ça, savoir dans quelle branche GIT/SVN/… vous êtes quand vous vous baladez dans vos projets, voici ce que vous devez faire :

mkdir ~/.config/powerline
# OSX
cp -R ~/Library/Python/2.7/lib/python/site-packages/powerline/config_files/* ~/.config/powerline
# Linux
cp -R ~/.local/lib/python2.7/site-packages/powerline/config_files/* ~/.config/powerline
vim ~/.config/powerline/config.json

Et maintenant, vous devrez changer la valeur de ext.shell.theme qui est à default en default_leftonly. Après ceci, vous devriez voir dans quelle branche vous vous trouvez.

Conclusion

Ici, je ne vous ai montré que l’installation de Powerline pour votre terminal. Mais il faut savoir que vous pouvez aussi l’installer pour VIM (article à venir), rajouter des informations (load average, réseau disponible ou non, …).

Source

Powerline Spellchecker

Kitkat goût Nexus 4 (toutes MAJ)

Kitkat goût Nexus 4 (toutes MAJ)

by Throrïn 3 Comments

Vous n’êtes pas sans savoir que depuis 4 jours la mise à jour OTA (over the air), vers android Kitkat, est en cours de déploiement. Et bien sachez que depuis hier, des gens de chez XDA ont récupéré ce lien vers le fichier de la mise à jour et, grâce à ça, nous pouvons passer à KitKat via la commande ADB.

Prérequis

Tout d’abord, vous devez avoir le SDK android d’installé et configuré sur votre poste. Pour les utilisateurs d’OSX, je les invite à se rendre sur mon article dédié. Vérifiez ensuite que la commande adb est disponible en tapant juste adb dans votre terminal (pour les plus malchanceux : utilisateurs windows, vous devez le taper dans la console).

Vous devez aussi avoir un nexus 4, toujours en ROM stock avec le recovery de base et non rooté

Liens de l’OTA

Deux liens sont à disposition. Je les indique ici par le numéro de build source vers celui de l’OTA. Le numéro source est pour celui présent sur votre Nexus dans paramètres -> à propos du téléphone -> numéro de build

Mise à jour

Maintenant, suivez les instructions suivantes pour une mise à jour sans risque :

  • Téléchargez le fichier de l’OTA vous concernant
  • Renommez le en update.zip
  • Si vous êtes sous Windows, placez le au même endroit que la commande adb.exe
  • Dans la console/terminal, placez vous dans le répertoire de votre fichier update.zip
  • Vérifiez que le débogage USB est activé sur votre nexus (se trouve dans les options pour développeur)
  • Branchez votre nexus sur votre PC en USB et tapez la commande adb reboot recovery
  • Quand le bugdroid apparaît à l’écran, appuyez sur le bouton Power puis en même temps appuyez brièvement sur le bouton volume Haut
  • Le menu du recovery apparaît, sélectionnez apply update from adb puis validez avec le bouton POWER.
  • Tapez la commande adb sideload update.zip puis allez prendre un café.
  • Quand c’est terminé, sélectionnez reboot puis reprenez un café car vous en avez pour un moment

Et voilà. Vous êtes sur la toute dernière version d’Android.

Source

Updates :

  • 06/12/2013 : Ajout de l’update 4.4.1
  • 09/12/2013 : Ajout de l’update 4.4.2
  • 05/06/2014 : Ajout de la version 4.4.3