シミュレーション用計算環境の構築

いろいろシミュレーションなどするときの環境を構築するにあたって、システム環境が壊れてしまったりしてととてもめんどくさいをすることが多いです。そこで、通常使う環境をシステム環境に影響のないやり方で構築する方法をまとめてみました。

# 今回構築する環境

* ubuntu (本当はxubuntu17.04を使っています。18.04になったらubuntuに戻るかどうかをもう一度考え直すかも)
* python 3.5以上の最新版 (numpy で行列式演算子の `@` を利用したいので、3.6以上が望ましい)
    * numpy, scipy, matplotlib, jupyter notebook
    * spyder 数値計算やシミュレーション用の環境を構築するには、jupyer notebookよりもこちらのほうが便利かも
* R (なんだかんだでこっちも使います)
    * rstudio, tidyverse
* latex (論文執筆用、システムに同梱されるtexliveで困らない)
* julia (数値計算の高速化用 こちらも最新版)
* pycharm (IDE)


基本的には、texlive を除いて、最新環境が欲しいものは `$HOME`以下に構築することにします。具体的には、以下のようなディレクトリ構成にします。

```
$HOME
  .local/julia
  .local/pycharm
  .pyenv/(anacondaでpython、R、juliaを管理)
```

# pythonの環境構築

[データサイエンティストを目指す人のpython環境構築 2016](https://qiita.com/y__sama/items/5b62d31cb7e6ed50f02c)を参照しつつ構築します。

## ubuntuの基本パッケージ

あとあと `gcc` や `cmake` 、 `git`は必要となるの先に導入してしまいます。

```bash
sudo apt install build-essential cmake git
```

## pyenv

まずは、pyenvを導入します。

```bash
git clone https://github.com/yyuu/pyenv.git ~/.pyenv
echo 'export PYENV_ROOT="$HOME/.pyenv"' >> ~/.bashrc
echo 'export PATH="$PYENV_ROOT/bin:$PATH"' >> ~/.bashrc
echo 'eval "$(pyenv init -)"' >> ~/.bashrc
source ~/.bashrc
```

## anaconda

anacondaは最新版をインストールします。pyenv上のグローバル環境に設定します。pythonを使い分けることは考えていないので、 `$PYENV_ROOT/versions/anaconda3-4.4.0/bin` にパスを通すことはしません。

```bash
pyenv install -l # インストール可能な環境を確認
pyenv install anaconda3-4.4.0
pyenv rehash
pyenv global anaconda3-4.4.0
conda update conda 
conda update --all
``` 

ここで、spyder, numpy, scipy, matplotlibはインストールされるはずです。ただし、spyder はQT5のライブラリの関係でfcitxで日本語入力ができないので、後述の対処を行ってください。

conda のレポジトリに登録されていないパッケージのインストールは `pip` を利用します。ここで、conda の環境が破壊されると後々めんどくさいことになるので、 `pip --user` として `$HOME/.local/lib`以下にpythonのモジュールをインストールします。

```bash
pip install --user simpy 
pip install --user actdiag blockdiag 
pip install --user blockdiagcontrib-cisco blockdiagcontrib-class blockdiagcontrib-eps blockdiagcontrib-excelhogan 
pip install --user blockdiagcontrib-excelshape blockdiagcontrib-labeledbox blockdiagcontrib-math blockdiagcontrib-nationalflags 
pip install --user blockdiagcontrib-octicons blockdiagcontrib-qb blockdiagcontrib-square blockdiagcontrib-tex
pip install --user funcparserlib Markdown markdown-blockdiag nwdiag seqdiag simpy 
pip install --user sphinxcontrib-actdiag sphinxcontrib-blockdiag sphinxcontrib-nwdiag sphinxcontrib-seqdiag 
pip install --user sphinxjp.themecore sphinxjp.themes.basicstrap sphinxjp.themes.bizstyle
pip install --user sphinxjp.themes.dotted sphinxjp.themes.gopher sphinxjp.themes.htmlslide hinxjp.themes.impressjs 
pip install --user sphinxjp.themes.revealjs sphinxjp.themes.s6 sphinxjp.themes.sphinxjp webcolors 
```

# Texlive

Texliveはubuntuに付属のものを使います。フルインストールでも困ることはありませんが、日本語・英語環境のみが欲しいだけだけですので、[TeX wikiのtexlive導入](https://texwiki.texjp.org/?Linux%2FLinux%20Mint#texlive) を参考にします。

```bash
sudo apt install texlive-lang-japanese
sudo apt install texlive-luatex texlive-latex-recommended texlive-latex-extra 
sudo apt fonts-lmodern texlive-xetex latex-cjk-common texlive-fonts-extra
```

# R

`R`はubuntu添付のものではなく、condaで管理ことにします。ついでに、jupyter用のカーネルもインストールします。

```bash
conda install -c r r-essentials rstudio r-tidyverse r-irkernel
```

ただし、RstudioはQT5のライブラリの関係でfcitxで日本語入力ができないので、後述の対処を行ってください。


# QT5アプリケーションへのfcitxからの日本語入力

qt5ライブラリは、conda環境のものを使用することになります。ubuntuのqt5には `libfcitxplatforminputcontextplugin.so` がデフォルトでインストールされますが、condaには添付されていないので、自前で用意する必要があります。

[Ubuntu 16.04LTSでのQtCreator日本語入力](https://qiita.com/sazus/items/4b4f68e1fb86cc2f36cc) を参考にビルドします。

ビルドするための必要なライブラリをインストールします。

```bash
$ sudo apt-get install ecm extra-cmake-modules fcitx-libs-dev libxkbcommon-dev libxkbcommon-x11-dev
```

fcitx用のplatform input context pluginビルドします。

```bash 
git clone git@github.com:fcitx/fcitx-qt5.git
cd ${git clone先のディレクトリ}
git checkout -b Release1.1.0 1.1.0
mkdir build
cd ./build
PATH=$PYENV_ROOT/versions/anaconda3-4.4.0/bin:$PATH  cmake .. -DCMAKE_PREFIX_PATH=$PYENV_ROOT/versions/anaconda3-4.4.0
make
```

ubuntu 16.04だと `make` に失敗することがあるようです。とりあえず、 `libfcitxplatforminputcontextplugin.so` がほしいだけなので、`make fcitxplatforminputcontextplugin` でも大丈夫です。

```bash 
cp ./platforminputcontext/libfcitxplatforminputcontextplugin.so $PYENV_ROOT/versions/anaconda3-4.4.0/plugins/platforminputcontexts/
```

終わったら、シェアードオブジェクトをcondaのプラグインディレクトリにコピーします。

# Julia

Juliaは[公式ホームページ](https://julialang.org/)から最新版をダウンロードしてインストールします。

```bash 
wget https://julialang-s3.julialang.org/bin/linux/x64/0.6/julia-0.6.0-linux-x86_64.tar.gz
tar zxvf julia-0.6.0-linux-x86_64.tar.gz
mv julia-{なにかの文字列} $HOME/.local
ln -s $HOME/.local/julia-{なにかの文字列} $HOME/.local/julia
echo 'export PATH="$HOME/.local/julia/bin:$PATH"' >> ~/.bashrc
source ~/.bashrc
```

juliaは絶賛開発中なので、後々バージョンアップすることを考えて、シンボリックリンクを張ったうえでパスを通しておきます。

```julia
Pkg.add("IJulia")
Pkg.add("DataFrames")
Pkg.add("RDatasets")
Pkg.add("Plots")
Pkg.add("PyPlot")
Pkg.add("GR")
Pkg.add("Gadfly")
Pkg.add("DifferentialEquations")
Pkg.add("ODE")
Pkg.update()
Pkg.build()
```

juliaに導入するパッケージはREPLからインストールします。

# pycharm

pycharmは[公式ホームページ](https://download.jetbrains.com/)から最新版をダウンロードしてインストールします。

```bash 
$ wget https://download.jetbrains.com/python/pycharm-community-{バージョン}.tar.gz
$ tar zxvf pycharm-community-2017.2.3.tar.gz
$ mv pycharm-{なにかの文字列} $HOME/.local
$ ln -s $HOME/.local/pycharm-{なにかの文字列} $HOME/.local/pycharm
$ echo 'export PATH="$HOME/.local/pycharm/bin:$PATH"' >> ~/.bashrc
$ source ~/.bashrc
```

このままだと日本語入力できないので、ubuntuのfcitxの設定からFcitx XIM Frontendを有効にします。