閉域でnode+socket.ioを使えるようにする

#はじめに
企業にありがちな proxy とかでガチガチで外に出られない閉域かつ
npm でレポジトリからの取得が自動で使えない環境下で、頑張って node と node-gyp を使えるようにし Socket.io と redis + hiredis なアプリケーションを動かすようにするまでの軌跡をここに記す。

ちなみに筆者はnodeもlinuxの扱いもど素人なのでツッコミ歓迎です。
#gccのインストール
sironeさんの下記の記事を参考にしました。
http://qiita.com/sirone/items/511c6f68d763dbb66e14
**ありがとうは須良さんとshironeさんへ**

CentOS 6.4 な gcc 4.4.7 を gcc 4.9.3 まで上げる

##準備
まずは作業場を作る

```shell-session:
# mkdir ~/gcc-install
# cd ~/gcc-install
```

##gmpの展開
下記のURLから適当なバージョンをダウンロードしてくる。6.0.0aで動作確認済み。
https://gmplib.org/

```shell-session:
# cd ~/gcc-install
# tar xvf ./gmp-6.0.0a.tar.bz2
```

##mpfrのインストール
下記のURLから適当なバージョンをダウンロードしてくる。3.1.2で動作確認済み。
http://www.mpfr.org/

```shell-session:
# cd ~/gcc-install
# tar xvf mpfr-3.1.2.tar.gz
```

##mpcのインストール
下記のURLから適当なバージョンをダウンロードしてくる。1.0.3で動作確認済み。
http://www.multiprecision.org/

```shell-session:
# cd ~/gcc-install
# tar xvzf mpc-1.0.3.tar.gz
```

##gccのインストール
下記のURLから適当なバージョンをダウンロードしてくる。4.9.3で動作確認済み。
https://www.gnu.org/software/gcc/

```shell-session:
# cd ~/gcc-install
# tar xvf gcc-4.9.3.tar.gz
# cd gcc-4.9.3
```

ここはシンボリックリンクでしのぐ。。。

```shell-session:
# ln -s ../mpfr-3.1.2 mpfr
# ln -s ../gmp-6.0.0 gmp
# ln -s ../mpc-1.0.3 mpc
```

**※必ずbuildディレクトリを切る。cacheが残るためconfigureをやり直してもビルドが止まる。その時ディレクトリが消せるのは大きい。**


```shell-session:32bitの場合
# mkdir build
# cd build/
# ../configure --prefix=/usr/local/gcc-4.9.3 --enable-languages=c,c++,fortran
# make
# make install
```

64bitの場合はconfigureがこうなる

```shell-session:64bitの場合
../configure --prefix=/usr/local/gcc-4.9.3 --enable-languages=c,c++,fortran --disable-multilib
```

PATHを通す。チキンなので使う時は毎回通す筆者。共存環境なんです。。。

```shell-session:
$ export PATH=/usr/local/gcc-4.9.3/bin:$PATH
```

gccのバージョン確認

```shell-session:
$ gcc --version
```

**※インストールしたバージョン番号が出るはず**

#nodeのインストール
ビルドせずにただダウンロードして突っ込む
morisさんの記事を参考にしました。
http://qiita.com/moris/items/4850d4e19392186e34f0
**ありがとうはmorisさんへ**

https://nodejs.org/en/download/
からプラットフォームに応じたLinuxバイナリをダウンロード

```shell-session:
# sudo tar --strip-components 1 -xzvf node-v4.2.2-linux-x86.tar.gz -C /usr/local
```

#node-gypのインストール
こっからは、変なコマンド三昧（筆者ががんばったとこ）Socket.ioの依存関係だけでも大変なので。。。
##準備(依存関係解決済みパッケージの作成)
**※Proxyの無い環境で行う**
https://github.com/nodejs/node-gyp/releases
からnode-gypをダウンロードし、展開する。

```shell-session:
$ cd node-gyp-3.0.3
```

package.jsonを編集する

```shell-session:
$ vi package.json
```

dependenciesを見ながらbundleDependenciesを追記、またinstallVersionの数字をメモする。

```json:package.json
  ...
  "version": "3.0.3",
  "installVersion": 9, //これをメモ
  "author": "Nathan Rajlich <nathan@tootallnate.net> (http://tootallnate.net)",
  "repository": {
    "type": "git",
    "url": "git://github.com/nodejs/node-gyp.git"
  },
  "preferGlobal": true,
  "bin": "./bin/node-gyp.js",
  "main": "./lib/node-gyp.js",
  "dependencies": {
    "fstream": "^1.0.0",
    "glob": "3 || 4",
    "graceful-fs": "^4.1.2",
    "minimatch": "1",
    ...
  },
  "bundleDependencies": [ //これを追記
    "fstream",
    "glob",
    "graceful-fs",
    "minimatch",
    ...
  ]
  "engines": {
    "node": ">= 0.8.0"
  },
  ...
```

追記が終わったら

```shell-session:
$ npm install
```

をして、下記のコマンドで依存関係丸ごとパッケージ化する

```shell-session:
$ npm pack
```

すると、実行フォルダにnode-gyp-3.0.3.tgzができるので、これを閉域に持ち込む。

##準備(node-v4.2.2-headers.tar.gzの取得)

https://nodejs.org/download/release/v4.2.2/node-v4.2.2-headers.tar.gz

のURLで自分がインストールしたnodeのバージョン(x.x.x)に対応したnode-headersをダウンロードし、こちらも持ち込む

##インストール

持ち込んだnode-gypをインストールする
※rootでPATHを通すのが面倒でした。。。

```shell-session:チキンなログレベル
$ sudo /usr/local/bin/npm install -g ./node-gyp-3.0.3.tgz --loglevel verbose
```

この段階ですnode-gypが実行可能になっている

```shell-session:なんかでる
$ node-gyp
```

同様にダウンロードしたnode-headersを展開する

```shell-session:
$ tar xvf node-v4.2.2-headers.tar.gz
```

展開したnode-headersをnode-gyp内に配置する

```shell-session:
$ mv node-v4.2.2 ~/.node-gyp/4.2.2
```

配置後は

```shell-session:
ls ~/.node-gyp/4.2.2
```

でincludeディレクトリのみが見える状態が正しい。

installVersionファイルを作る

```shell-session:
$ vi ~/.node-gyp/4.2.2/installVersion
```

記述内容は、先ほどメモしたinstallVersionを記述する

```text:
9<改行>
```

#開発したアプリケーションの展開
この操作はdependencies変更時に毎回行う。手順は閉域でソースコードを改変している場合、改善の余地が大いにある。Proxyがない環境で開発している場合は楽ができる
##準備(依存関係解決済みパッケージの取得)
**※MacなどProxyの無い環境で行う**
作成したアプリケーションにnode-gypのとき同様package.jsonにdependenciesを見ながらbundleDependenciesを追記する

同じように依存関係を解決させてpackする。
**※npm packを二回目以降実行する場合は古いtgzを消しておく**

```shell-session:
$ npm install
$ npm pack
```

すると、実行フォルダにプロジェクト名の.tgzができるので、これを閉域に持ち込む。

###gccのバージョン確認

```shell-session:チキンなので
$ gcc --version
```

**※インストールしたバージョン番号が出るはず**

##インストール

```shell-session:
$ npm install ./<プロジェクト名>.tgz --loglevel verbose
```

node_moduleが作成され、それ以下にプロジェクト名のディレクトリがあり、その中がアプリケーションルートになっているので適当な場所に移動する。

もう、これでnpm startで動き出す。node-gypもあるのでコンパイルも怖くない！え、

ビルド済みのバイナリ持ち込んだらどうかって？それは言わないお約束ですよ。。。