IDE派のための「Linuxデスクトップ on VirtualBox on Windows のすゝめ」

# はじめに

会社の開発現場では運用環境がLinuxなのに開発機はWindowsというケースが多いです。

vimやtmuxを駆使してターミナルだけで開発をこなせる人は、LinuxのVMを作ってそこを開発環境にしていると思います。

それに対してIDEを使いたいという人は、Windows上に言語やIDEをインストールして開発環境を構築していると思います。
しかしWindows開発環境ではLinuxとの違いなどで苦労する点が多いです。

そんな悩めるIDE派な人には、Windows開発環境を捨てて「**Linuxデスクトップ on VirtualBox on Windows**」という開発環境に移行することをオススメします。

### 対象読者

- Linux向け開発をWindows上で行っている人
- IDEを使いたい人

### 対象外の人

- Windows向けシステムの開発者
- ターミナルだけで開発をバリバリできる人

# Windows開発環境のダメなところ

まずはWindows開発環境のダメなところを見ていきましょう。

### コマンドプロンプトが辛い

ターミナルとしても使いにくいし、コマンドもLinuxとは違うので覚えるのが面倒です。
代替としてターミナルはConEmuやcmderなど、シェルはcygwinやGitBashなどがありますが、どれも何かしら問題があり決定打に欠けます。

### 開発言語によってはインストールできないパッケージ・ツールがある

主要な開発言語はWindowsでもインストール・実行はできますが、一部Windowsにインストールできないパッケージがあったりします。
そうなるとIDEで実装までは出来ても、実行はVMにコピーしてから動かすというような手間が発生し、デバッガで動かすこともできません。

……という具合に、やれば出来ないこともないのですが色々と厄介なことが多いのがWindows開発環境の実状です。

# Linuxデスクトップ on VirtualBox on Windows のすゝめ

そこでオススメしたいのが「Linuxデスクトップ on VirtualBox on Windows」という以下のような構成です。

- 物理マシン：Windows
    - VirtualBox
        - **VM：Linuxデスクトップ [開発環境]**
            - IDE
            - ターミナル
            - その他デスクトップアプリ

物理マシンのWindowsにVirtualBoxをインストールし、VMでLinuxのデスクトップを動かします。
このVM上のLinuxデスクトップが開発環境になります。
今までWindowsで使用していたIDEなどの開発用アプリはLinuxにインストールして使用します。

# メリット

この構成のポイントは

- Linuxデスクトップを使うこと
- VMで環境構築すること

の2点です。

## Linuxデスクトップを使うことのメリット

### サーバーと近い環境で開発できる

Linuxのディレクトリ構成は標準化されているので、サーバーでも開発環境でもアプリを同じ設定で動かせます。

シェルスクリプトも共通のものが使えます。
Windowsではわざわざ開発環境用にbatファイルを別途作るようなこともありましたが、Linux開発環境では必要ありません。

### ターミナル/シェル環境がWindowsより優れている

ターミナルはデフォルトのものでも十分実用的なレベルです。
シェルについては言うまでもありません。

### IDEが使える

IDEをLinux上で使えばWindowsでは実行できなかったアプリでもデバッガで実行できます。

### デスクトップが選べる/カスタマイズできる

Linuxではデスクトップ環境はGNOME、KDE、LXDEなど複数あり好きなものを選択することができます。
カスタマイズ項目もWindowsやOSXと比べたら豊富です。

## VMで環境構築することのメリット

### Windows環境がそのまま残る

物理マシンに直接Linuxをインストールするのと違い、VMでLinuxをインストールしていればWindows環境がそのまま使えます。
MS-Officeドキュメントがあったり、IEしか対応していない社内システムがあったりと、会社では未だにWindowsが必須な場面があるので結構重要なことです。

### バックアップや復元が容易

VirtualBoxにはスナップショットという機能があり、VMの状態を起動中でも保存することができます。
システムに変更を加える前にスナップショットを取っておくと、もし失敗した場合に元に戻すことができます。

### 複数起動できる

例えばOSの再インストールをする場合、VMを使っていない場合には作業中は現在の環境が使えなくなり、業務に支障をきたします。
しかしVMを使っていれば旧環境でそのまま業務を続行しつつ、裏で新環境の作成をすることができます。

### いつでも破棄できる

Linuxデスクトップが気に入らなければ、いつでも破棄して元の環境に戻れます。

# Linuxデスクトップを使う上での疑問・不安

Linuxのデスクトップを使ったことがない人が疑問や不安に思うようなことをまとめました。

### 操作感はどう？

基本的にWindowsやOSXと大差ないです。

### 日本語使えるの?

設定をすれば使えるようになります。
また、ディストリビューションによってはインストール直後から日本語表示/入力できる状態のものもあります。

わかっている範囲では以下のディストリビューションではインストールの時点から日本語になっています。

- [Ubuntu 日本語 Remix](https://www.ubuntulinux.jp/download)
- [Kubuntu](http://kubuntu.org/)

### デスクトップアプリって少ないんじゃないの？

メジャーな開発ツールはほとんどがLinux版もあるようです。
わかっている範囲でLinux版がないのはこのくらいです。

- [SourceTree](https://www.sourcetreeapp.com/)
- Visual Studio

それでも代替となるアプリは[AlternativeTo](http://alternativeto.net/)で探せば大抵見つかります。

### 高スペックPCでないと動かないんじゃないの？

WindowsやOSXと比べればLinuxの方がずっとメモリ消費量は小さいので、開発機として普通に使えるレベルのPCであれば問題ないでしょう。

どうしても重いようならLXDEのような軽量デスクトップもあります。

### 設定が難しいんじゃないの？

GUIの設定画面があります。
画面の設定やショートカットキーなどデスクトップ関連の設定はGUIで設定して大丈夫です。

ただしネットワークなどのシステム設定はネットで検索して出てくる情報がシェル上で行うものなので、これらはGUIよりCLIで行うほうがいいです。

### でもお高いんでしょう？

Windowsと違って無償で使えます。

# 自分の環境

ディストリビューションはUbuntuを使ってます。[日本語 Remix イメージ](https://www.ubuntulinux.jp/download)でインストールしました。
デフォルトのデスクトップであるUnityはちょっと重たかったので[MATE](https://ubuntu-mate.org/)に変更しています。

![ubuntu.png](https://qiita-image-store.s3.amazonaws.com/0/35192/4f5775ad-80e3-cd21-78a5-832f43f6b691.png)


## Windowsで使ってるソフト

開発用アプリはLinux上で使ってますが、それ以外はWindowsで使い続けています。

- ブラウザ(Chrome)
- テキストエディタ(Visual Studio Code)
- Slack

毎日使用しているアプリはこのくらいしかありません。
メールはGmailなのでブラウザから使っています。

## Linuxで使っているソフト

:computer: **ターミナル**
画面分割やタブが使える[Terminator](https://gnometerminator.blogspot.jp/)を使用しています。

:a: **CLIツール**
テキストエディタはvimです。デスクトップ環境であってもGUIのテキストエディタは使わないです。
tmuxも試しましたが使い方を覚えるのに苦労して挫折しました。
あとQiitaで存在を知った[peco](https://github.com/peco/peco)や[enhancd](https://github.com/b4b4r07/enhancd)なども使ってます。

:snake: **Python**
現在の開発はPythonなのでIDEは[Pycharm Community](https://www.jetbrains.com/pycharm/)を使っています。
環境切り替えはpyenvです。

:turtle: **VCS**
今の開発現場ではgitではなくMercurialなのでGUIツールとして[TortoiseHG](http://tortoisehg.bitbucket.org/)を使っています。
gitもそうですが、コミットグラフやdiffはCLIよりGUIで見るほうがいいです。

:whale: **Docker**
PostgreSQLなどミドルウェアはDockerコンテナ上で動かしています。

改めて見てみるとインストールしたデスクトップアプリはTerminator、PyCharm、TortiseHG、Chromeしかなかったです。

# 現在に至った経緯

最後に、現在の開発環境に辿り着くまでの経緯を簡単に説明しておきます。

## Java開発時代(2002年頃?〜)

- 物理マシン:Windows [開発環境]
    - Java
    - Eclipse
    - TeraTerm、PuTTY、WinSCPなど

Javaで開発をしていた頃はWindows開発環境でも特に不便なことはなかったです。
サーバーでの作業も少なかったのでターミナルに対する不満も特に感じませんでした。
cygwinを使ったこともありましたが、常用するまでには至りませんでした。

## Gitを始めてから(2015年〜)

- 物理マシン: Windows [開発環境]
    - Java
    - Eclipse
    - ConEmu :new:
        - GitBash :new:
    - VirtualBox/Vagrant
        - CentOS [ローカルテスト環境]

変化が起こったのはGitとVagrantを使い始めた頃からです。
CLIでの作業が増えてターミナルの使い勝手が気になり、ConEmuを使うようになりました。
VMも使い始めましたがこの頃はまだデスクトップではなくCLIのみの環境です。

## SSHに目覚めてから(2015年2月〜)

- 物理マシン: Windows [開発環境]
    - Java
    - Eclipse
    - ConEmu
        - GitBash(Git for Windows)
    - VirtualBox/Vagrant
        - CentOS [ローカルテスト環境]
        - CentOS [SSH環境] :new:
            - ssh

[インフラエンジニアじゃなくても押さえておきたいSSHの基礎知識](http://qiita.com/tag1216/items/5d06bad7468f731f590e)を書いた頃にSSHに目覚めました。
GitBashのSSHだとconfigに多段SSHの設定をしてもエラーで接続できない事が不満になり、SSH接続用のVMを用意するようになりました。
ここはサーバーにSSH接続する為の環境で、`.ssh/config`に多段SSHなどの設定をしてあります。

サーバーに接続するには以下のような手順で行なっていました。

1. ConEmuを開く
2. SSH接続用VMを起動する(`vagrant up`)
3. VMに接続する(`vagrant ssh`)
4. サーバーに接続する(`ssh <サーバー>`)

## Pythonを始めてから(2016年〜)

- 物理マシン: Windows [開発環境]
    - Python :new:
    - PyCharm Community :new:
    - ConEmu
        - GitBash(Git for Windows)
    - VirtualBox/Vagrant
        - CentOS [ローカルテスト環境]
        - CentOS [SSH環境]
            - ssh

今年からPythonでの開発をするようになったのですが、当初はWindows上で行っていました。
初めはWindows上のIDEで実行・デバッグをしていたのですが、後からWindowsでインストールできないパッケージを使うようになった為、実行はVMにコピーして行うようになりデバッガが使えなくて不満が積もってきました。

## 現在

- 物理マシン: Windows
    - VirtualBox
        - VM:Ubuntuデスクトップ :new: [開発環境]
            - Terminator :new: [ターミナル]
            - pyenv :new:
                - Python2.7
                - Python3.5
            - PyCharm Community
            - Docker :new:

そして現在のVMでLinuxデスクトップを使う開発環境にたどり着きました。

## 今後試したいこと

Linuxデスクトップ on Docker 的なものをやってみようかと思ってます。