さくらのレンタルサーバ（スタンダード）でNode.jsをインストールする

「Node.js」をさくらでやるならVPSを契約しないとだろうなあ、レンタルサーバじゃ無理だよなあ。と思っていたら、できるという噂が。そこで、試してみた。

尚、開発環境はMac OS X 10.9（2014/06時点で最新のもの）。

# さくらのレンタルサーバにSSHでログインする

ターミナル（自分の場合はiTerm2）を開いて、sshコマンドでログイン。（サーバの文字コード設定がEUC-JPになっているため、ターミナルの文字コード設定も「Japanese(EUC)」にしないと日本語が文字化けする。）

```shell-session:
$ ssh (sakura's login name)@(sakura's domain name)
password:(input your password)
```

# vimをインストール

別に不要かもしれないが、何かと便利そうだったので、vimをインストールすることにした。以下のサイトを参考にさせてもらった。（この後の内容は、ほぼ、このサイトと一緒。）

* [さくらインターネットの共用サーバに vim をインストールする](http://www.hazama.nu/t2o2/archives/002696.shtml)

まず、ソース用のディレクトリを作成して移動。

```shell-session:
% mkdir -p $HOME/local/src
% cd $HOME/local/src
```

ソースを手に入れる。2014/06時点でのvimの最新版は7.4版だが、「extra」なるものと「lang」なるものが7.2版までしかないため、vim本体も7.2版をゲットした。

```shell-session:
% wget ftp://ftp.vim.org/pub/vim/unix/vim-7.2.tar.bz2
% wget ftp://ftp.vim.org/pub/vim/extra/vim-7.2-extra.tar.gz
% wget ftp://ftp.vim.org/pub/vim/extra/vim-7.2-lang.tar.gz
```

解凍し、出来上がった「vim72」へ移動。

```shell-session:
% tar jxf vim-7.2.tar.bz2
% tar xvzf vim-7.2-extra.tar.gz
% tar xvzf vim-7.2-lang.tar.gz
% cd vim72
```

パッチ用のディレクトリを作成し、パッチをゲット。（2014/06現在の7.2版のパッチは「446」まである。）

```shell-session:
% mkdir patches
% cd patches
% curl -O 'ftp://ftp.vim.org/pub/vim/patches/7.2/7.2.[001-446]'
```

ひとつ上に戻り、パッチを適用。

```shell-session:
% cd ../
% cat patches/7.2.* | patch -p0
```

インストール。オプションは、参考サイトに従った。

```shell-session:
% ./configure --enable-multibyte --enable-xim --enable-fontset --with-features=big --prefix=$HOME/local
% make
% make install
```

これでインストールは完了。あとは、参考サイトにも書いてある、「vi」で「vim」が起動させるようにする設定を行った。

```shell-session:
% cd
% vi .cshrc
```

"set path = (◯◯...)" となっているカッコ内の一連の記述に「$HOME/local/bin」を追加し、更に、このファイルのどこかに1行、「alias vi vim」の記述を追加。sourceコマンドで、その設定を反映。

```shell-session:
% source .cshrc
```

whichコマンドで確認してみた。

```shell-session:
% which vi
vi: 	 aliased to vim
```

ついでに$HOMEに.vimrcも作成。内容は、[Vimの設定ファイルを作る](http://qiita.com/tetsuya/items/75987487ffac42250d3b)と、[ずんWiki - vim](http://www.kawaz.jp/pukiwiki/?vim)にある「文字コードの自動認識」のものをそっくりそのまま入れさせてもらった。

```vim:.vimrc
"#####表示設定#####
set number "行番号を表示する
set title "編集中のファイル名を表示
set showmatch "括弧入力時の対応する括弧を表示
syntax on "コードの色分け
set tabstop=4 "インデントをスペース4つ分に設定
set smartindent "オートインデント

"#####検索設定#####
set ignorecase "大文字/小文字の区別なく検索する
set smartcase "検索文字列に大文字が含まれている場合は区別して検索する
set wrapscan "検索時に最後まで行ったら最初に戻る

" 文字コードの自動認識
if &encoding !=# 'utf-8'
  set encoding=japan
  set fileencoding=japan
endif
if has('iconv')
  let s:enc_euc = 'euc-jp'
  let s:enc_jis = 'iso-2022-jp'
  " iconvがeucJP-msに対応しているかをチェック
  if iconv("\x87\x64\x87\x6a", 'cp932', 'eucjp-ms') ==# "\xad\xc5\xad\xcb"
    let s:enc_euc = 'eucjp-ms'
    let s:enc_jis = 'iso-2022-jp-3'
  " iconvがJISX0213に対応しているかをチェック
  elseif iconv("\x87\x64\x87\x6a", 'cp932', 'euc-jisx0213') ==# "\xad\xc5\xad\xcb"
    let s:enc_euc = 'euc-jisx0213'
    let s:enc_jis = 'iso-2022-jp-3'
  endif
  " fileencodingsを構築
  if &encoding ==# 'utf-8'
    let s:fileencodings_default = &fileencodings
    let &fileencodings = s:enc_jis .','. s:enc_euc .',cp932'
    let &fileencodings = &fileencodings .','. s:fileencodings_default
    unlet s:fileencodings_default
  else
    let &fileencodings = &fileencodings .','. s:enc_jis
    set fileencodings+=utf-8,ucs-2le,ucs-2
    if &encoding =~# '^\(euc-jp\|euc-jisx0213\|eucjp-ms\)$'
      set fileencodings+=cp932
      set fileencodings-=euc-jp
      set fileencodings-=euc-jisx0213
      set fileencodings-=eucjp-ms
      let &encoding = s:enc_euc
      let &fileencoding = s:enc_euc
    else
      let &fileencodings = &fileencodings .','. s:enc_euc
    endif
  endif
  " 定数を処分
  unlet s:enc_euc
  unlet s:enc_jis
endif
" 日本語を含まない場合は fileencoding に encoding を使うようにする
if has('autocmd')
  function! AU_ReCheck_FENC()
    if &fileencoding =~# 'iso-2022-jp' && search("[^\x01-\x7e]", 'n') == 0
      let &fileencoding=&encoding
    endif
  endfunction
  autocmd BufReadPost * call AU_ReCheck_FENC()
endif
" 改行コードの自動認識
set fileformats=unix,dos,mac
" □とか○の文字があってもカーソル位置がずれないようにする
if exists('&ambiwidth')
  set ambiwidth=double
endif
```

もう一度「vi .vimrc」で開いて、文字色など設定した内容が反映されていることを確認。これで、vimのインストールは完了。
```

# Node.jsをソースコードからインストール

## その前にlibexecinfoのインストール

[root権限なしでNode.js、MongoDBをインストールする方法](http://uguisu.skr.jp/Windows/node.html) や [さくらのレンタルサーバ（スタンダード）にnode.jsをインストールしてみた](http://blog.tmtr.jp/2013/04/nodejs.html) を参考にした。Node.jsの前に「libexecinfo」とやらをインストールしないとNode.jsをビルドできないらしいので、まずはlibexecinfoをインストールする。

### 更にその前にportsのインストール

そのlibexecinfoをインストールする上で、どうやらportsというもののインストールが必要であるっぽい。[Sakura共用サーバにportsをインストール](http://d.hatena.ne.jp/faw/20090109)を参考に、インストールしてみた。

まずはports treeとやらの取得。

```shell-session:
% cd ~/local
% mkdir work
% mkdir work/ports
% mkdir work/ports/distfiles
% mkdir var
% mkdir var/db
% mkdir var/db/portsnap
% vi work/ports/portsnap.conf
```

portsnap.confを以下のように記述。

```text:portsnap.conf
# Default directory where compressed snapshots are stored.
WORKDIR=/home/(user name)/local/var/db/portsnap

# Default location of the ports tree (target for "update" and  "extract").
PORTSDIR=/home/(user name)/local/work/ports

# Server or server pool from which to fetch updates.  You can change
# this to point at a specific server if you want, but in most cases
# using a "nearby" server won't provide a measurable improvement in
# performance.
SERVERNAME=portsnap.FreeBSD.org

# Trusted keyprint.  Changing this is a Bad Idea unless you've received
# a PGP-signed email from <security-officer@FreeBSD.org> telling you to
# change it and explaining why.
KEYPRINT=9b5feee6d69f170e3dd0a2c8e469ddbd64f13f978f2f3aede40c98633216c330

# Example of ignoring parts of the ports tree.  If you know that you
# absolutely will not need certain parts of the tree, this will save
# some bandwidth and disk space.  See the manual page for more details.
#
# WARNING: Working with an incomplete ports tree is not supported and
# can cause problems due to missing dependencies.  If you have REFUSE
# directives and experience problems, remove them and update your tree
# before asking for help on the mailing lists.
#
REFUSE arabic chinese french german hebrew hungarian
REFUSE korean polish portuguese russian ukrainian vietnamese
REFUSE x11 x11-clocks x11-drivers x11-fm x11-fonts x11-servers x11-themes x11-toolkits x11-wm
REFUSE palm cad astro
```

portsnapコマンドで、このconfigファイルを指定。

```shell-session:
% portsnap -f ~/local/work/ports/portsnap.conf fetch extract update
```

次にportsからのインストール設定。portsからインストールするものは「$HOME/local/ports」に全てインストールするようにした。

```shell-session:
% cd ~/local
% mkdir ports
% cd ports/
% mkdir -p bin sbin etc lib tmp/dist tmp/work var/db/pkg var/db/ports var/run
% vi ~/.cshrc
```

### portsとNode.jsのための設定を.cshrcに追加する

以下のsetenvの設定を追加。

```text:.cshrc
setenv  PATH    ${PATH}:${HOME}/local/ports/bin
setenv  NODE_PATH   ${HOME}/local/ports/bin/node
setenv  NODE_MODULES    ${HOME}/local/lib/node_modules
setenv  LD_LIBRARY_PATH
setenv  LD_LIBRARY_PATH ${LD_LIBRARY_PATH}:${HOME}/local/lib

setenv	INSTALL_AS_USER	yes
setenv	PREFIX	${HOME}/local/ports
setenv	LOCALBASE	${HOME}/local/ports
setenv	PKG_DBDIR	${LOCALBASE}/var/db/pkg
setenv	PKG_TMPDIR	${LOCALBASE}/tmp/
setenv	PORT_DBDIR	${LOCALBASE}/var/db/pkg
setenv	DISTDIR	${LOCALBASE}/tmp/dist
setenv	WRKDIRPREFIX	${LOCALBASE}/tmp/work
setenv	PORTSDIR	${HOME}/local/work/ports
setenv	PKGTOOLS_CONF	${LOCALBASE}/etc/pkgtools.conf
setenv	DEPENDS_TARGET	'install clean'

setenv	X11BASE	${LOCALBASE}

setenv	PKG_CONFIG_PATH	"$HOME/local/ports/lib/pkgconfig:$HOME/local/ports/libdata/pkgconfig:/usr/lib/pkgconfig:/usr/local/lib/pkgconfig:/usr/local/libdata/pkgconfig:/usr/libdata/pkgconfig"

# Set user and group variables to ourself
setenv	BINOWN	`whoami`
setenv	BINGRP	`id -G -n ${BINOWN}`
setenv	SHAREOWN	${BINOWN}
setenv	SHAREGRP	${BINGRP}
setenv	MANOWN	${BINOWN}
setenv	MANGRP	${BINGRP}

# Make sure files are installed with correct default permissions
setenv	BINMODE	744
setenv	SHAREMODE	644
setenv	MANMODE	644

# Make sure we don't really try to become root, but just execute everything as ourselves
setenv	SU_CMD	"sh -c"

# Make sure the systemdefault make.conf is not read
setenv	__MAKE_CONF	${LOCALBASE}/etc/make.conf

# Keep our own version of ldconfig hints
setenv	LDCONFIG	"/sbin/ldconfig -i -f ${LOCALBASE}/var/run/ld-elf.so.hints"
#setenv	LDCONFIG	"/sbin/ldconfig -f=${LOCALBASE}/var/run/ld-elf.so.hints -i -R=${LOCALBASE}/etc/ld-elf.so.conf "
setenv	LD_LIBRARY_PATH	${LOCALBASE}/lib
setenv	LD_RUN_PATH	${LOCALBASE}/lib

setenv	PATH	${LOCALBASE}/bin:${LOCALBASE}/sbin:${PATH}
setenv	MANPATH_MAP	${LOCALBASE}/bin:${LOCALBASE}/man

# Set application specific variables to make sure it doesn't pick up things from the main system
setenv	APXS	${LOCALBASE}/sbin/apxs
setenv	PERL	${LOCALBASE}/bin/perl
setenv	PERL5	${PERL}
setenv	SITE_PERL	${LOCALBASE}/lib/perl5/site_perl/5.8.8
setenv	SITE_PERL5	${SITE_PERL}
setenv	PERL_VERSION	5.8.8
setenv	PERL_VER	${PERL_VERSION}

setenv  SRCCONF     ~/local/ports/etc/src.conf
```

## Node.jsのインストール

[Node.js公式のダウンロードページ](http://nodejs.org/download/)からソースコードをゲットし…とやってみたものの、上手くいかなかった。試行錯誤の結果、先ほどインストールしたportsとやらにNode.jsが入っていたので、そちらのものを「make install」することでインストールした。

```shell-session:
% cd ~/local/work/ports/www/node
% make install
```

途中、依存するライブラリに関して「◯◯をインストールしますか」的なダイアログが表示されるが、全てデフォルトのままで「OK」を選び、インストールを続けた。

インストールが完了したら、「node -v」のコマンドで、インストールが正常に完了したかを確認する。

```shell-session:
% node -v
v0.10.28
```

バージョンが表示されれば、インストールは正常に完了。

# このあと調べたいこと

で、どこまでNode.jsが使えるかっていう。[root権限なしでNode.js、MongoDBをインストールする方法](http://uguisu.skr.jp/Windows/node.html) に書かれているような、express入れて、socket.ioで何やかんやとか、MongoDB入れて、とかって本当にレンタルサーバでできるのか、を調べてみたい。もう少し遊んでみる予定。