Amazon Cloud9では、gccとvimも使おう。

#はじめに

すぐに始められるWeb IDEとして有名な、cloud9無償版のいいところを３行で。

- ブラウザ上でUbuntu(14.04)環境が無料で使えるよ。
- ブラウザのエディタを用いて、プログラム開発ができるよ。
- 親会社はAmazon。Amazon EC2などのクラウドへの移行が<del>楽かも</del>シームレスに行えるようになった(2017 12/1～)。

これらは既に使っている人たちには当然のことなんだろうけど、
何年か前の出たての頃のcloud9をweb上の統合開発環境的な認識で使ってみた僕は、
cloud9のエディタに特に興味を持たなかったこともあり、
cloud9のUbuntu的な側面もまったくかじる気にもならなかった。

最近、IoT開発にcloud9のgccを活用して、的な記事を見て、改めてcloud9をかじってみたところ、
少なくとも、なじみの少ないプログラム言語をお試しするにはいいな、と思った。
本エントリーでは、他のエントリーであまり言及がないように思う、
cloud9のUbuntu14.04の使い勝手をレポートしておきたい。

キャッチコピー的には、「Cloud9を、web開発だけでなく、gcc/vim環境としても使おうよ。」ということ。
実際、ブラウザ上のCloud9のvimは、普通の使用感だった。導入のお気楽感からするとこれは地味にすごいこと。
ブラウザ上のUbuntuとして、cloud9を数時間お試したした後の画面はこんな感じ。
*(※元の画面の解像度高めなので詳細はクリックして見てみてください)*

![スクリーンショット 2017-08-20 20.17.52.png](https://qiita-image-store.s3.amazonaws.com/0/16455/a1bf5104-85c2-bde3-b533-85c9abd5518d.png)

vimが良い存在感を出していて、cloud9の方のエディタは補佐役といった感じだね（左がnim0.17,右がswift-4-dev）。小さめのテキストファイル相手の場合、動作にもっさり感なし。

#cloud9ワークスペースの作成と、gccの試用
##①C++のワークスペースを作成

[cloud9サイト](https://c9.io)にアクセス・ログインして、「Create a new workspace」すると、
以下の画面が登場する　（*※cloud9にはgithubアカウント等でサインインできる*）:

![スクリーンショット 2017-08-20 18.58.24.png](https://qiita-image-store.s3.amazonaws.com/0/16455/be4bcad4-a3f7-43fe-53d6-bc3ea00008f2.png)

「Choose a template」のところで真っ先に目に入るのは、　HTML/node/js/PHP/django/rails　などが使えるテンプレートだけど、下の方には「C++」のテンプレートもある。ruby やpythonの実行はC/C++に依存しているから、cloud9のC/C++のコードが当然に走る。cloud9のC++テンプレートがいいなと思ったのは、普通のununtu　（現時点では14.04）を速攻使い始められるところ。

##②Hello World!

C++テンプレートのワークスペースに入った直後はこんな感じ。
![スクリーンショット 2017-08-20 19.22.52.png](https://qiita-image-store.s3.amazonaws.com/0/16455/5173524e-3754-0389-ef2a-41a273044f75.png)

上の方にhello worldの行い方が書かれた文書が開かれていて、下の方にはコンソール画面がある。文書に従いながら、makeすることで　、C/C++でhello worldできる。
コマンドとしては以下のような感じ。

```.sh
~/workspace$ ls
Makefile  README.md  hello-c-world.c  hello-cpp-world.cc

~/workspace $ make
g++ -std=c++11 hello-cpp-world.cc -o hello-cpp-world
gcc hello-c-world.c -o hello-c-world

~/workspace $ ls
Makefile  README.md  hello-c-world*  hello-c-world.c  hello-cpp-world*  hello-cpp-world.cc

~/workspace $ ./hello-c-world 
Hello World!
```
##③提供環境
提供されている環境を見ておこう。

```.sh
$ df -h
Filesystem                Size  Used Avail Use% Mounted on
none                      2.2G  4.0M  2.0G   1% /
tmpfs                      26G     0   26G   0% /dev
tmpfs                      26G     0   26G   0% /sys/fs/cgroup
/dev/mapper/volg1-lvdata  1.2T  588G  594G  50% /nix
shm                        64M     0   64M   0% /dev/shm
tmpfs                      26G     0   26G   0% /sys/firmware

kmry1:~/workspace $ gcc -v
Using built-in specs.
COLLECT_GCC=gcc
COLLECT_LTO_WRAPPER=/usr/lib/gcc/x86_64-linux-gnu/4.8/lto-wrapper
Target: x86_64-linux-gnu
Configured with: ../src/configure -v --with-pkgversion='Ubuntu 4.8.4-2ubuntu1~14.04.3' --with-bugurl=file:///usr/share/doc/gcc-4.8/README.Bugs --enable-languages=c,c++,java,go,d,fortran,objc,obj-c++ --prefix=/usr --program-suffix=-4.8 --enable-shared --enable-linker-build-id --libexecdir=/usr/lib --without-included-gettext --enable-threads=posix --with-gxx-include-dir=/usr/include/c++/4.8 --libdir=/usr/lib --enable-nls --with-sysroot=/ --enable-clocale=gnu --enable-libstdcxx-debug --enable-libstdcxx-time=yes --enable-gnu-unique-object --disable-libmudflap --enable-plugin --with-system-zlib --disable-browser-plugin --enable-java-awt=gtk --enable-gtk-cairo --with-java-home=/usr/lib/jvm/java-1.5.0-gcj-4.8-amd64/jre --enable-java-home --with-jvm-root-dir=/usr/lib/jvm/java-1.5.0-gcj-4.8-amd64 --with-jvm-jar-dir=/usr/lib/jvm-exports/java-1.5.0-gcj-4.8-amd64 --with-arch-directory=amd64 --with-ecj-jar=/usr/share/java/eclipse-ecj.jar --enable-objc-gc --enable-multiarch --disable-werror --with-arch-32=i686 --with-abi=m64 --with-multilib-list=m32,m64,mx32 --with-tune=generic --enable-checking=release --build=x86_64-linux-gnu --host=x86_64-linux-gnu --target=x86_64-linux-gnu
Thread model: posix
gcc version 4.8.4 (Ubuntu 4.8.4-2ubuntu1~14.04.3) 

kmry1:~/workspace $ ruby -v
ruby 2.4.0p0 (2016-12-24 revision 57164) [x86_64-linux]

kmry1:~/workspace $ python3
Python 3.4.3 (default, Nov 17 2016, 01:08:31) 
[GCC 4.8.4] on linux
Type "help", "copyright", "credits" or "license" for more information.
>>> 
```
ユーザーが使えるディスクスペースは、一番上の
> none                      2.2G  4.0M  2.0G   1% /

のところだ。gccのバージョンは4.8.4、C++11のコードがコンパイルできる。バージョンが若干低いが、ruby2/python3も使える。

#お試し環境の構築例　〜nim0.17とswift4-devの導入
以上でだいたいの雰囲気は分かる気がするんだけど、2GBのディスクスペースで何ができるのか、イメージをつかんでもらうためにも、自分の環境構築記録をレポートしておこう。

##① 環境構築の狙い
ただいま、いわゆる植物工場向けに音声サポートありのIoTシステムをスクラッチから作るための調査中（三カ年プロジェクト）。
想定しているシステム構成は環境制御端末（Raspberry pi） + 操作端末（スマフォ/音声端末 + serversideというもの。
ちょっと意識しているのは、最近登場したAlexa SDKの導入。（Raspberry pi＝音声端末） + （serverside＝cloud9）という開発環境ができそうだ。

> ※以下は、AmazonのAlexaチームのSDK発表プレゼンをキャプチャして引用（出典　[AmazonがあらゆるサードパーティデバイスにAlexa機能を持たせるべくSDKを無料オープンソースで公開](http://jp.techcrunch.com/2017/08/18/20170817amazon-opens-up-access-to-developer-tools-for-adding-alexa-to-commercial-products/)）。真ん中へんのサーバーのところはAmazon EC2が基本形となるだろうから、cloud9環境で開発を進めることもやりやすいと思っている。

![スクリーンショット 2017-08-20 12.06.59.png](https://qiita-image-store.s3.amazonaws.com/0/16455/fc03fd7a-6c11-669b-62c6-2da4b3a7fb18.png)

次年度に、環境制御端末（Raspberry pi）部分を作り、次々年度に全体を完成させるスケジュール感。
Raspberry piのところは、ネイティブコードとスクリプト言語（たぶんpython）という構成を予定。

>※データベースは、Raspberry pi向けのredisをカスタマイズする予定（専用モジュールをCで作成）。ネイティブコードのところの生産性を高めたいと思っていて、C/C++と親和性が高いコンパイル言語のnim/swiftを活用できないかと思っている。
※まずは、redisのカスタムモジュールの作成から取り組みたい。

ということで、gcc依存のコンパイル言語nim0.17、clang依存のコンパイル言語swift4-devをcloud9に導入してみた。gccがあれば、こうした新言語のお試しもどんどん行える。
（インストールではまったときなどは、ブラウザの窓を閉じるだけで、自分のPCのローカル環境への影響なし）

##②gccでのコンパイル
### nimの導入
真っ先にやったことは、コンパイル言語nimのソースコードをgithubから取得して、gccでコンパイル。gitは最初から使える。

実行したコマンドは以下のとおり

> wget https://nim-lang.org/download/nim-0.17.0.tar.xz
tar -Jxvf nim-0.17.0.tar.xz
cd nim-0.17.0
sh build.sh
bin/nim c koch
./koch tools


![スクリーンショット 2017-08-20 11.17.12.png](https://qiita-image-store.s3.amazonaws.com/0/16455/0ddc5238-2a4a-84c6-5940-50bd3b34c1d3.png)

当然ながらコンパイルにそこそこ時間がかかるんだけれど、一回だけだし、他の調べものとかをしてのんびりしているうちにコンパイル終了。

### swift4-devの導入

swiftの方は、すでにCloud9でお試し記を書いてくださっていた方がいたので、そちらにならって導入。
Cloud9でswiftしたい方は、こちらを参考とするのが良い:
[Cloud9で始めるServer Side Swift (Vapor)](http://qiita.com/keygx/items/0fb77e9bfad0fc92c874)

参考先にあるように、　github上にCloud9導入用のスクリプトを一式あげておくのはスマートなやり方だね。

僕もfolkさせてもらい、swidt3のところをswift4-devに書き換えてインストールをトライ。ところがswift4-devについてはなぜか、Cloud9上でwgetできない。しょうがないので、ブラウザから直接にswift4-devのインストールファイルをアップロード（左下部分）:
![スクリーンショット 2017-08-20 14.03.15.png](https://qiita-image-store.s3.amazonaws.com/0/16455/88e78a26-882c-30fa-a8d1-8b5c2f974803.png)

アップロードはかなりちんたらしたスピードだったけれど、100MBを超えるファイルをアップロードさせてくれる
cloud9無償版をは太っ腹(githubの場合、アップロードは25MBという制限がある)。

アップル製言語swiftはclang依存なので、swiftインストール後はclangも実行できるようになる。

## ③vimのカスタマイズ
マイナー言語であるnimと、主にiOS向け言語であるswiftは、cloud9のエディタではシンタックスハイライトが効かない:
![スクリーンショット 2017-08-20 11.51.35.png](https://qiita-image-store.s3.amazonaws.com/0/16455/079d455f-03e1-acee-bfba-6e3ebcc653bb.png)

だけれど、僕らにはvimがある。どんなマイナー言語であろうと、vimが使えればたいていはシンタックスハイライトやコード補完ができる。

nimやswift4-dev使う人は変人か根性ある人で委細はなんとかするだろうから、参考リンクと導入結果だけ載せておく。当然、rustやD言語だって、同じようにvim使えるね。

導入したnim用vimプラグイン
https://github.com/zah/nim.vim

導入直後（色はついたが配色がダメ）:
![スクリーンショット 2017-08-20 15.29.36.png](https://qiita-image-store.s3.amazonaws.com/0/16455/de5bd666-798b-0ca6-c133-9ca5fac01d28.png)

colorscheme lucario を導入後　かなり視認性がアップ:
![スクリーンショット 2017-08-20 15.57.21.png](https://qiita-image-store.s3.amazonaws.com/0/16455/813470ec-e60c-c65c-dc45-ca1f713608df.png)

...　swift用のシンタックスハイライトも導入したけけれど、こちらは若干微妙な感じ。swift4を使うようになったら、再調整が必要だろう。

さらにいろいろしようと思い、neovimも入れてみようかと思ったんだけれど、無償版だけに空き容量がだいぶ減ってきていた。
このままviをメインに使っていくこととした（別途　nimとneovimだけの環境も　cloud9上で作ってみてはいる）。

```.sh
$ df -h
Filesystem                Size  Used Avail Use% Mounted on
none                      2.2G  1.3G  766M  63% /
```

ということで、冒頭の環境に落ち着いた次第。まずは、redisのカスタマイズモジュールをnimで作成して見る予定。

redisのカスタムモジュール・・・neo4j互換のクエリが使えるグラフデータベースをredis上に構築するモジュールなど、気になる！
http://redismodules.com/modules/redis-graph/

#まとめ
無償版のUbuntu環境のユーザー向けディスク容量は2GBしかないんだけど、その環境をいくつも作ることができる（環境のコピーも容易）。
チームでの開発実務に使う時には有償版となんだけど、無償版はプログラミングの学習や言語のお試しに良さそうだ。
ふだん、web界隈の業界にいない人にもおすすめ。

いずれ、　cloud9上で、音声記録をターゲットとしたredisベースのグラフデータベースを走らせてみた、とかのエントリーを書いてみたいかも。