Raspberry Pi への Node.js インストールとnvmでのバージョン管理

Raspberry Pi のGPIOに色々なデバイスを接続しIoTを試しています。Node.jsとJohnny-fiveを使えばRaspberry PiでIoTを容易に実現できます。しかし，GPIOを使った入出力制御にはroot権限が必要でNode.js動作環境のセットアップに工夫が必要です。このページは，その工夫の備忘書きです。

###1.概要
1. RASBIAN JESSIE には node v0.10.29 が収容されていますが，現行のものと比べてかなり古いバージョンなのでアンインストールしv5.4.0をインストールします。
1. nvm(node version manager)を使うとnodeのインストールとバージョンコントロールを極めて簡単に行うことができます。
1. しかし，nvmの一般的方法でインストールしたnodeは複数ユーザで使う考慮がされてません。
1. sudo node としてroot権限でnodeを動かそうとしても node: command not found となります。
1. 上の不都合を回避するための環境設定が必要です。
 
###2.前提
1. RASBIAN JESSIEがインストールされ正しく動いていること。
1. インターネットに接続していること。
1. gitコマンドが有効になっていること。
1. shell(bash)の操作に，ある程度習熟していること。
 
###3.作業
1. コンソールの表示を英語モードにします。<br />
 日本語モードのままでもOKなのですが，条件によっては日本語フォントが表示できず操作への反応メッセージがトーフ（■）で表示され場合があるのでこれを回避するためです。<br />
$ export LANG=C<br /><br />
1. gitコマンドの動作を確認します。<br />
$ git --version<br />
git version 2.1.4<br />
バージョン番号が帰ってくればgitコマンドは動作します。<br /><br />
1. node v0.10.29をアンインストールします<br />
$ sudo apt-get autoremove nodejs<br /><br />
1. nvmをインストールするディレクトリ(/usr/local/nvm)を作成しアトリビュートを変更します<br />
$ sudo mkdir /usr/local/nvm<br />
$ sudo chmod 777 /usr/local/nvm<br /><br />
1. nvm.gitリポジトリのクローンを作成します<br />
$ git clone https://github.com/creationix/nvm.git /usr/local/nvm<br /><br />
1. nvmを使えるようにします<br />
$ source /usr/local/nvm/nvm.sh<br /><br />
1. nodeをインストールします<br />
 nvmでインストールできるnodeのバージョン一覧を表示<br />
$ nvm ls-remote<br />
v5.4.0をインストール<br />
$ nvm install v5.4.0<br /><br />
1. node, npm のバージョン表示して動作することを確認します<br />
$ node -v<br />
v5.4.0<br />
$ npm -v<br />
3.3.12<br /><br />
1. ログイン時にnvm,nodeの起動設定を行うようにします<br />
/etc/profile.d/ディレクトリ配下に次の内容のnvm.shを作成します。<br />
$ sudo vi /etc/profile.d/nvm.sh<br />
  または<br />
$ sudo nano /etc/profile.d/nvm.sh<br />
でnvm.shを作成し，次の行を記述して保存<br />
source /usr/local/nvm/nvm.sh<br /><br />
node-v5.4.0 が node コマンドで起動するようにdefaultエイリアスを設定します。<br />
$ nvm alias default v5.4.0<br /><br />
以上の設定でログイン時にnvm.shが実行され node コマンドへの v5.4.0の割り付けとnvm, npmへのパスが設定されます。<br /><br />
1. sudo node が動くようにします<br />
$ sudo visudo<br />
nanoエディタが起動しsudoの動作定義ファイルが開きます。<br />
次の行をコメントアウトします。<br />
\#Defaults    secure_path = /sbin:/bin:/usr/sbin:/usr/bin<br />
次の行を追加します。<br />
Defaults    env_keep += "PATH"<br />
sudoの動作環境に現在のユーザのコマンド・パスを引き渡す設定です。<br />

###4.NodeでGPIOを動かす
1. johnny-five他のパッケージをインストールします<br />
 johnny-fiveパッケージのインストール<br />
$ npm install johnny-five<br />
raspi-ioパッケージのインストール<br />
$ npm install raspi-io<br /><br />
1. GPIOの７番ピンに接続したLEDを１秒(1000mS)間隔で点滅させます。<br />
次のコードを記述したソース・ファイルgpio-led7.jsを作成します。<br /><br />
var raspi = require('raspi-io');<br />
var five = require('johnny-five');<br />
var board = new five.Board({<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;io: new raspi();<br />
});<br />
board.on('ready', function() {<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;var led = new five.led('P1-7');<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;led.blink(1000);<br />
});<br /><br />
sudoで実行します<br />
$ sudo node gipo-led7.js<br />
1453297162821 Device(s) RaspberryPi-IO <br />
1453297162907 Connected RaspberryPi-IO<br /> 
1453297162937 Repl Initialized <br />
>><br /><br />
一般ユーザで実行して見ます<br /> 
$ node gpio-led7.js<br />
wiringPiSetup: Must be root. (Did you forget sudo?)<br />
Aborted<br />
GPIOを操作するプログラムは sudo で実行しないと動作しません。

###5.Node.jsのバージョン管理
1. Node.jsの開発スピードは非常に早く頻繁にバージョンアップされます。
nvmは使用するNode.jsのバージョンコントロールを強力にかつ簡単に行なえます。<br /><br />
1. Node.jsのバージョンリストを表示する。<br />
$ nvm ls-remote<br />
リストが表示されます。青文字のバージョンは現在自分がaliasに設定している（node で起動する）バージョンです。
末尾が奇数のバージョンは開発版，偶数のものが安定版です。<br /><br />
1. 最新版をインストールする<br />
2016.06.18時点での最新安定版v6.2.2をインストールします。<br />
$ nvm install v6.2.2<br />
Downloading https://nodejs.org/dist/v6.2.2/node-v6.2.2-linux-...<br />
######################################################### 100.0%<br />
Now using node v6.2.2 (npm v3.9.5)<br /><br />
1. インストールされているNode.jsのリストを表示する<br />
$nvm ls<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;v5.4.0<br />
->       v6.2.2<br />
default -> v5.4.0<br />
node -> stable (-> v6.2.2) (default)<br />
stable -> 6.2 (-> v6.2.2) (default)<br />
iojs -> N/A (default)<br />
v5.4.0とv6.2.2がインストールされているのがわかります<br /><br />
1. defaultをv6.2.2にする<br />
$ nvm alias default v6.2.2<br /><br />
1. 旧バージョンを使う<br />
ソースコードが新バージョンに対応せず旧バージョンのNode.jsで実行したいときは<br />
$ nvm use v5.4.0<br />
として，一時的にnodeのaliasをv5.4.0に変更します。<br /><br />
1. 旧バージョンのアンインストール<br />
$ nvm uninstall v5.4.0<br />

原典　http://make.kosakalab.com/make/electronic-work/nodejs_raspi/