軽量多機能なUNIXライク環境 MobaXterm

## 概要

[MobaXterm](http://mobaxterm.mobatek.net/)
2017/04/10現在の最新バージョンは10.2

* Cygwinをベースにcoreutils部分をbusyboxに置き換えた軽量なUNIXライク環境
* 最初からターミナルとシェル(bash)がついてる
* 最初からtelnet,ssh,mosh,rdp,vncクライアントが使える
* x serverを内蔵しているのでx11なプログラムが動くしssh x11 forwardingもできる
* Cygwinベースなのでapt-cygコマンドによるパッケージ管理ができる
* 圧縮状態なら**25MB強程度のサイズしか無い超軽量環境**

MobaXtermのポータブル版を使って持ち運べるUNIXライク環境を構築します

## 初期設定
初回起動時は`%appdata%\..\Local\Temp\MxtXXX`に`CygUtils.plugin`を展開しルート`/`を作成するため少々時間がかかる。

### rootとhome
初期設定では`Temp`ディレクトリにルートが作成されるが、`Temp`のままだと環境構築をする上で使い勝手が悪い。
MobaXtermでは設定画面から`home`と`root`を作成するディレクトリを指定できるが、絶対パスでしか指定できない。
そのためUSBメモリにインストールして環境を持ち運ぶ、等の用途に適さない。
しかし設定ファイルを直接記述するとを相対パスや環境変数で設定できるので、
これを利用して永続利用可能な場所に環境を構築することにする。

利用可能な環境変数は以下を参照する。
[MobaXterm/Changelog](http://mobaxterm.mobatek.net/download-home-edition.html)

例えば、`MobaXterm_Personal_XXX.exe`がある場所にルートディレクトリとして`.\slash`を作成し、
`.\home\mobaxterm`をホームディレクトリとして使う場合は以下のように設定する。

```
[Misc]
HomeDir=%CurrentFolder%\home\mobaxterm
SlashDir=%CurrentFolder%
```

すると以下のようなディレクトリ構造になる。

```
MobaXterm
├── CygUtils.plugin
├── home
│   └── mobaxterm
├── MobaXterm.ini
├── MobaXterm_Personal_10.2.exe
└── slash
    ├── bin
    ︙
    ├── etc
    ├── home
    ├── lib
    ︙
    └── var
```

### プラグイン
MobaXtermはプラグインを追加することで機能を増強できる。
[MobaXterm/Plugins](http://mobaxterm.mobatek.net/plugins.html)

プラグインを導入することで`git`,`svn`,`vim`,`emacs`,`gcc`,`make`などが利用可能になる。
プラグインは単一ファイルになっており、`MobaXterm_Personal_XXX.exe`と同一ディレクトリに置き再起動するだけで有効になるため非常に簡単。

しかし、プラグインになっているプログラムは概ねバージョンが古く更新されていないため注意が必要。
例えば2017/04/10現在の`git`の最新バージョンは2.12.2だがプラグインの`git`は2.1.4とかなり古い
(apt-cygでインストールしても2.8.3までしか入らないけど…)

プラグインによる導入は、サイズが小さく、パス変更に強く、そして簡単であるため
"ミニマル"で"持ち運べる環境"を"簡単に作る"という面では非常に有用

素の状態のMobaXtermにgitをインストールする場合

|            |バージョン   | サイズ       | インストール時間 |
|:-----------|------------:|:------------:|:----------------:|
| プラグイン | 2.1.4       | 20MB程度     |数十秒程度        |
| apt-get    | 2.8.3       | 150MB程度    |数分～数十分      |

#### MobaXtermにプラグインをインストールするシェルスクリプト

```bash:install_plugin.sh
#!/bin/bash

URL="http://mobaxterm.mobatek.net"
SlashPath=$(cygpath -au $(cygpath -aw "/"|awk -F '\\' -v OFS='\\' '{$NF="";print}'))

Response=$(curl ${URL}/plugins.html)
eval PluginList="($(echo -e "$Response"|grep -oP '(?<=<p class="moba_plugin">).+(?=</p>)'|grep -oP '(?<=<b>).+(?=</b>)'|sed s/"^\(.*\)$"/"\"\1\""/g|tr "\n" " "))"
eval TextList="($(echo -e "$Response"|grep -oP '(?<=<p class="moba_plugin">).+(?=</p>)'|grep -oP '(?<=: ).+(?=</a>)'|sed s/"^\(.*\)$"/"\"\1\""/g|tr "\n" " "))"
eval UrlList="($(echo -e "$Response"|grep -oP '(?<=<p class="moba_plugin">).+(?=</p>)'|grep -oP '(?<=href=").+(?="><i)'|sed s/"^\(.*\)$"/"\"\1\""/g|tr "\n" " "))"

for ((i = 0; i < ${#PluginList[@]}; i++)) {
    echo -e "[$i]\t${PluginList[i]}"
    echo -e "\t${TextList[i]}\n"
}

echo -n "number:"
read num
eval num="($num)"

for ((i = 0; i < ${#num[@]}; i++)) {
    wget -nc ${URL}/${UrlList[${num[i]}]} -P $SlashPath
}

echo "Please restart MobaXterm to enable Plugin."
```

##### 使い方
install_plugin.shを実行するとMobaXtermからプラグイン一覧を取得して表示する
インストールしたいプラグインの番号をスペース区切りで入力する

例:`Gcc, G++ and development tools`と`zip`をインストールしたい場合

```bash
$ ./install_plugin.sh
[0]     CygUtils.plugin
        Collection of core UNIX tools for Windows

[1]     Corkscrew
        Corkscrew allows to tunnel TCP connections through HTTP proxies

[2]     Curl
        Curl is a command line tool for transferring data with URL syntax

[3]     CvsClient
        A command line tool to access CVS repositories

[4]     Gcc, G++ and development tools
        the GNU C/C++ compiler and other development tools
︙
︙
[39]    XServers
        Xephyr, Xnest, Xdmx, Xvfb and Xfake alternate X11 servers.

[40]    Xmllint
        A command line XML tool.

[41]    Zip
        Zip compression utility.

No.: 4 41
```

## 運用
ホームディレクトリを`MobaXterm\slash\home\mobaxterm`ではなく`MobaXterm\home\mobaxterm`にしたのは
パーティションを分けるように`/`と`home`を分離したかったから。
MobaXtermは`CygUtils.plugin`にシステムを保持しているため、たとえ`slash`ディレクトリを削除しても
`CygUtils.plugin`とプラグインファイルと`dotfiles`さえあれば、MobaXterm起動時に元の環境が容易に復元できるため、環境に依存しにくく変化に頑強なUNIXライク環境が作れる。

`dotfiles`と`MobaXterm.ini`を`github`で管理しておけば、
インターネットさえあれば以下の3ステップで自分好みの環境がいつでもどこでも作れてしまう。

1. MobaXterm本体を落とす
2. gitと好みのプラグインを落とす
3. githubにある自身の`dotfiles`を落とす

「USBメモリに環境を入れて持ち運びたい」
「環境を構築して配布したい」
「会社と自宅で同じ環境を構築したい」
などの要求に簡単に答えることができる。

## 便利なコマンド
* apt-cyg
    * Ubuntuのapt-getライクなパッケージ管理コマンド
* open
    * Macのopenコマンドに類似。実はcygstartをラップしているだけ。
* iconv
    * Windows上のUNIXライク環境は文字化けとの戦い
    * MobaXtermには`nkf`がないが`iconv`がある
    * `-f`で`from`を、`-t`で`to`を指定可能
    * `iconv -f utf-8 -t shift-jis`と`iconv -f shift-jis -t utf-8`だけ覚えておけば大丈夫
    * nkfも入れれば入るよ

## 小ネタ

古いバージョンのMobaXtermは入ってる証明書が古くてhttpsにつながらない時があった
そういう時は証明書を更新すればいい

```bash
mkdir -p /etc/pki/tls/certs/
wget https://curl.haxx.se/ca/cacert.pem --no-check-certificate -O "/etc/pki/tls/certs/ca-bundle.crt"
```

つづく