[memo] Cloud9 を NanoPi NEO2 にインストールする

# はじめに

[https://github.com/c9/install](https://github.com/c9/install)

上記で公開されている Cloud9のローカル環境インストール手順は、
64bit ARM 環境にインストールしようとするとエラー終了してしまいます。
半無理やり感もありますが、無事インストールできたのでインストール手順～デバッグ環境構築までを書いてみます。

<img width="512" alt="_72D8784.PNG" src="https://qiita-image-store.s3.amazonaws.com/0/187531/d390ebac-32b7-7a31-ac20-36d271eae92d.png">

BeagleBoneBlack : Cloud9 もともと入っている
NanoPi NEO : 公式手順で問題なくインストールできた
NanoPi NEO2 : エラーでてインストールできなかった。
Nanohat PCM5102A : 今回関係なし。(右上のNEOにもくっつけている)

## なぜインストールに失敗する？

以下の3つの理由のようです

- install.sh でアーキテクチャ判定が非対応
  - aarch64 が未サポートなのが原因
- install.sh で nodejs のパッケージが取れない
  - arch64 ではなく、arm64 として取得しないといけない
- install.sh で ncurses のビルドに失敗
  - config.guess が古く、./configure で失敗する。
  - config.guess が aarch64 に対応できていない(模様)。
 
# インストール手順 (2017/06/16 現在)

## 環境

- ハードウェア : [NanoPi NEO2](http://wiki.friendlyarm.com/wiki/index.php/NanoPi_NEO2)
   - CPU : Allwinner H5
   - MEM : 512 MB
- OS
   - Official ROM image : [nanopi-neo2_ubuntu-oled_4.11.2_20170531.img.zip](https://www.mediafire.com/folder/ah4i6w029912b/NanoPi-NEO2#b7f7bt3s240uw)
        - kernel         : Linux 4.11.2
        - distribution : Ubuntu 16.04 LTS

## Cloud9 のインストール

インストール中 g++が必要になるので、入っていない場合は apt-get install g++で入れておきます。
 
では、本題のCloud9インストールです。
arm64以外に入れる場合は

```console:NanoPi-NEO
apt install g++

cd /usr/local
git clone git://github.com/c9/core.git c9sdk
cd c9sdk
./scripts/install-sdk.sh
```

で済みます。
が、arm64では途中で失敗しまくります。
ですので、期待する結果になるようスクリプト修正しながら進めていきます
install-sdk.sh そのものと、呼び出される install.sh の２つのファイルを編集していきます。
行頭の＋－は追加削除です。

```console:NanoPi-NEO2
cd /usr/local
git clone git://github.com/c9/core.git c9sdk
cd c9sdk

cp ./scripts/install-sdk.sh ./scripts/install-sdk-aarch64.sh
nano ./scripts/install-sdk-aarch64.sh
```

```bash:./scripts/install-sdk-aarch64.sh
	・
	・
	・
installGlobalDeps() {
    if ! [[ -f ~/.c9/installed ]]; then
        if [[ $os == "windows" ]]; then
            URL=https://raw.githubusercontent.com/cloud9ide/sdk-deps-win32
        else
            URL=https://raw.githubusercontent.com/c9/install
        fi
-        $DOWNLOAD $URL/master/install.sh | bash
+       cat install.sh | bash
    fi
}
	・
	・
	・
```


```console:NanoPi-NEO2
wget https://raw.githubusercontent.com/c9/install/master/install.sh
nano install.sh
```

```bash:install.sh
	・
	・
	・
  case "$arch" in
    *armv6l*) arch=armv6l ;;
    *armv7l*) arch=armv7l ;;
+    *aarch64*) arch=arm64 ;;
    *x86_64*) arch=x64 ;;
    *i*86*) arch=x86 ;;
    *)
      echo "Unsupported Architecture: $os $arch" 1>&2
      exit 1
    ;;
  esac

	・
	・
	・

  cd "$C9_DIR"
  echo ":Compiling ncurses..."
  tar xzf ncurses-5.9.tar.gz
+  DOWNLOAD https://ftp.gnu.org/pub/gnu/ncurses/ncurses-6.0.tar.gz ncurses-6.0.tar.gz
+  tar xzf ncurses-6.0.tar.gz
+  cp ./ncurses-6.0/config.guess ./ncurses-5.9
+  rm -r ncurses-6.0 
+  rm ncurses-6.0.tar.gz
  rm ncurses-5.9.tar.gz
  cd ncurses-5.9
  echo ":Configuring Ncurses"
  CPPFLAGS=-P ./configure --prefix="$C9_DIR/local" --without-tests --without-cxx
  echo ":Compiling Ncurses"
  make
  echo ":Installing Ncurses"
  make install
	・
	・
	・
```

```console:NanoPi-NEO2
scripts/install-sdk-aarch64.sh
```

successでれば成功です！

![スクリーンショット (3).jpg](https://qiita-image-store.s3.amazonaws.com/0/187531/545d3dc7-d489-98a7-d72f-df821dde4d20.jpeg)



# 自動起動

rc.local に起動コマンドを追加。
ディストリビューションによっては、rc.local で自動起動されないので注意。

```bash:/etc/rc.local
	・
	・
	・
export HOME=/root
export PATH=$PATH:/root/.c9/node/bin
node /usr/local/c9sdk/server.js -l 0.0.0.0 -a : -w /root/ &
	・
	・
	・
```

rc.local からcloud9起動するとhome directory must be set になるので、export HOMEも必要になっています。

自動起動自体は上記で動くようになるが、
デバッガ接続等する場合のために node へのパスを通しておく必要がある。
.bash の最終行にでも追加しておく。

nano ~/.bashrc

```bash:~/.bashrc
	・
	・
	・
export PATH=$PATH:/root/.c9/node/bin
```

これでボードが起動すると自動的にCloud9が立ち上がるようになりました

![スクリーンショット (5).png](https://qiita-image-store.s3.amazonaws.com/0/187531/8c39f13e-3833-9072-3c72-1b655958068f.png)


# デバッグ環境を整える

## python

デバッガを有効にして実行すると以下が表示されるので、素直に従えばOK

```console:stderr
/usr/bin/python2: No module named ikpdb

    To use python debugger install ikpdb by running:
 
        sudo apt-get update;

        sudo apt-get install python-dev;

        sudo pip install ikpdb;
 
```

指示通り
apt-get install python-dev
pip install ikpdb
を実行したらOKだった。

## C, C++

デバッガを有効にして実行すると以下が表示されるので、
素直に従えうとハマる。かなりハマる。google先生に聞いても対処策が分からなかった。

```console:srderr
ERROR while lauching the debugger:
     "gdbserver" is not installed
```

結論は、

apt-get install gdbserver gdb

になるが、gdbserver 入れたのに動かない！って人は、
不適切なエラーログに悩まされている結果かも知れません。
気になる人は以下を直してみてね。

```js:~/.c9\bin\c9gdbshim.js
        this.proc = spawn('gdb', ['-q', '--interpreter=mi2', BIN], {
            detached: false,
            cwd: process.cwd()
        });
        
        this.proc.on("error", function(e) {
            console.error("ERROR while launching the debugger:");
            if (e.code == "ENOENT") {
-                console.log("\t\"gdbserver\" is not installed");
+                console.log("\t\"gdb\" is not found");
            } else {
                console.error(e);
            }
        });
```


## ARM64用のインストールスクリプト (2018/09/09追加)

ARM64環境用のスクリプトを準備してみました。
以下でインストール＆自動起動可能になります。

```console:
apt install g++

cd /usr/local
git clone git://github.com/blue777/Cloud9_core_arm64.git c9sdk
cd c9sdk
./scripts/install-sdk.sh

nano /etc/rc.local
-----
・・・
export HOME=/root
export PATH=$PATH:/root/.c9/node/bin
node /usr/local/c9sdk/server.js -l 0.0.0.0 -a : -w /root/ &
-----
reboot
```