docker+Jupyter+Rでテキストマイニングできる環境を作る

# やりたいこと

dockerのJupyterでRでテキストマイニングやりたい。[MeCab](http://taku910.github.io/mecab/)と[RMeCab](http://rmecab.jp/wiki/index.php?RMeCab)を使ったら出来そう！と思って [jupyter/datascience-notebook](https://hub.docker.com/r/jupyter/datascience-notebook/) のdockerコンテナにインストールしようとしてみたらハマったのでメモ。

# 起こった問題

とりあえずjupyter/datascience-notebookを起動してRのノートブックを作成するまでは[こちら](https://qiita.com/y4m3/items/c2703d4e131e05084b7b)などを参考にしてさくっと。とりあえずJupyter上から環境を構築してみようとMeCabをインストールまでは手順通りでよかったのだが、いざRMeCabをインストールしようとしたら、エラーメッセージが・・・

```R
# RMeCabをインストールしようとしたら・・・
install.packages("RMeCab", repos = "http://rmecab.jp/R", type = "source")
```

```R
# うまくいかなかった
Warning message in install.packages("RMeCab", repos = "http://rmecab.jp/R", type = "source"):
“installation of package ‘RMeCab’ had non-zero exit status”Updating HTML index of packages in '.Library'
Making 'packages.html' ... done
```

もう少し詳しくエラー内容を見るため、JupyterのterminalからRを起動し、同じようにインストールを試みる。

```R
R
install.packages("RMeCab", repos = "http://rmecab.jp/R", type = "source")
```

```R
RMeCab.cpp:59:70: error: narrowing conversion of ‘144’ from ‘int’ to ‘char’ inside { } [-Wnarrowing]
```

どうやらc++のコード中でint->charのキャストに失敗している？エラーメッセージなどで検索していると、[RMeCabはgcc-5の環境でインストールする必要があるらしい](http://labo.utsubo.tokyo/2017/06/14/gcc6%E3%81%A7rmecab%E3%81%AE%E3%82%A4%E3%83%B3%E3%82%B9%E3%83%88%E3%83%BC%E3%83%AB%E3%81%AF%E3%82%A8%E3%83%A9%E3%83%BC/) 。自分の環境のgccはバージョン7だった。これがRMeCabインストール失敗の原因のようだ。
※int->charのキャストに失敗するのは[これ](https://github.com/veracrypt/VeraCrypt/issues/64)と同じ現象かもしれない。

# インストール手順

最終的にうまくいったのは以下の手順。gcc-5を使ってRMeCabをインストールする。

## 0. 前提

[こちらの記事](https://qiita.com/inu1one/items/075c372059370f6af909)などを参考に```sudo``` が使えるjupyter/datascience-notebookのコンテナが立ち上がっている

## 1. MeCabをインストールする

[install - rmecab](https://sites.google.com/site/rmecab/home/install)のLinuxの説明に沿ってインストール。

```shell
sudo apt update
sudo apt install mecab libmecab-dev mecab-ipadic-utf8
```

インストールできているかを確認。

```shell
mecab
インストールに成功したよ！
```

以下のような結果が表示されたらOK。

```
インストール    名詞,一般,*,*,*,*,インストール,インストール,インストール
に      助詞,格助詞,一般,*,*,*,に,ニ,ニ
成功    名詞,サ変接続,*,*,*,*,成功,セイコウ,セイコー
し      動詞,自立,*,*,サ変・スル,連用形,する,シ,シ
た      助動詞,*,*,*,特殊・タ,基本形,た,タ,タ
よ      助詞,終助詞,*,*,*,*,よ,ヨ,ヨ
！      記号,一般,*,*,*,*,！,！,！
EOS
```


## 2. gcc-5をインストールする

gcc-5をインストール。

```shell
sudo apt install gcc-5
sudo apt install g++-5
sudo apt install gfortran-5
```

## 3. update-alternativesでバージョンを切り替え

複数のgccバージョンがある環境では[update-alternativesでバージョンを切り替えて使う](http://graziegrazie.hatenablog.com/entry/2015/11/14/101050)。今回はgcc-7 <->gcc-5の切り替えが必要。

```shell
sudo update-alternatives --install /usr/bin/gcc gcc /usr/bin/gcc-5 10
sudo update-alternatives --install /usr/bin/g++ g++ /usr/bin/g++-5 10
sudo update-alternatives --install /usr/bin/gfortran gfortran /usr/bin/gfortran-5 10
```

ちなみに登録後は

```shell
update-alternatives --config gcc
```
とすれば、登録してあるバージョンから選択して切り替えができる。


###### 参考
[Ubuntu 14.04にGCC 4.9 をインストールする](https://qiita.com/katoken-0215/items/e9011e02feb131c4526e)
[update-alternativesの使い方](http://graziegrazie.hatenablog.com/entry/2015/11/14/101050)

## 4. RMeCabをインストール

gccが導入出来たら、いよいよRMeCabをインストールする。terminalでRを起動するか、JupyterでRのNotebookを作成し

```R
install.packages("RMeCab", repos = "http://rmecab.jp/R", type = "source")
```

でインストール。成功したかどうかを確認する。

```R
library(RMeCab)
RMeCabC("インストールに成功したよ！")
```

できた！

![RMeCab.png](https://qiita-image-store.s3.amazonaws.com/0/101002/b0fbee2b-5ff8-c14a-66ea-e98ebd369345.png)


# Dockerfileとdocker-compose.yml

ここまでの作業をまとめたDockerfileとdocker-compose.ymlファイルを作成した。同一ディレクトリにこの2つのファイルを置いて```docker-compose up```。

```docker-compose.yml
version: "2"
services:
  jupyter_rmecab: # サービス名
    container_name: Jupyter-RMeCab
    build: . # 現在のディレクトリのdockerfileから構築
    image: mochimo/jupyter-rmecab # buildで作るイメージ名
    ports:
      - "8888:8888" # ポート <host port>:<container port>
    user: root # sudoのため
    volumes:
      - "/home/[User]/[work]:/home/jovyan/work/" # workディレクトリのマウント。[User],[work]は適宜自分のユーザー名と作業フォルダ名に変更
    environment:
      TZ: Asia/Tokyo
      GRANT_SUDO: "yes" # sudoコマンドを使えるようにする
    restart: always # 常に自動で再起動。主にOS起動時に自動起動させるため
    command: start-notebook.sh --NotebookApp.token='' # コンテナ起動時の引数
```

```dockerfile:Dockerfile
FROM jupyter/datascience-notebook
LABEL maintainer="mochimo"

USER root

# font/gcc5 インストール 
RUN apt-get update && apt-get install -y \
fonts-ipaexfont \
gcc-5 \
g++-5 \
gfortran-5 

# mecab インストール
RUN apt-get update && apt-get install -y mecab libmecab-dev mecab-ipadic-utf8

# gcc-5に切り替え
RUN update-alternatives --install /usr/bin/gcc gcc /usr/bin/gcc-5 10 && \
update-alternatives --install /usr/bin/g++ g++ /usr/bin/g++-5 10 && \
update-alternatives --install /usr/bin/gfortran gfortran /usr/bin/gfortran-5 10

USER $NB_UID

# RMeCabのインストール
RUN R -e "install.packages(c('RMeCab'), repos='http://rmecab.jp/R', type='source')"
```