Rails開発環境をubuntuからwindows(上のVMのubuntu)にした

[2019/01/01 追記 RLoginのコピペの記述漏れ、全角記号が半角になる問題追記]
[2019/01/25 追記 キーリマップがyamyからのどかに乗り替えた]

## TL;DR
Mac→ubuntu 乗り替え [Thinkpad X1 carbon(Gen 5)をubuntu-gnome16.04で使う - Qiita](https://qiita.com/u1tnk/items/9e82404628862dc0e4ff) を昨年10月にやったが更にwindowsに乗り替えた話。

## なぜか？

ざっくりまとめると、ubuntuに不満はあるがMacはMBPはおさわりバーだし、iMacは欲しいスペックだと30万以上はかかるしwindows上のVMで良いんじゃね？と試した結果良さそうだったので移行。

- ubuntu18.04の不満点の解消
    - スリープからの復帰とか安定性が微妙。
        - スリープに関してはThinkpadでは問題無かったがデスクトップだとダメ。
    - HiDPI対応がデフォルトだと100/200/300%しか無く、無理矢理150%にするとUI崩れたりフォントまわり面倒…とか、マルチディスプレイとかちょいちょい不便。
    - windows or macが必要な場面(iTunesとかゲームとか)でデュアルブートで対応してたがダルい。
- Windowsへの不満点が昔に比べて減少している
    - Macに移行した https://twitter.com/u1tnk/status/11525786074 から実に8年を経てだいぶまともになった。当時はwindows7
- ゲーム用に組んだ強いデスクトップがあった。
    - Ryzen1700/GTX-1070/32GB/SSD
    - VMで多少オーバーヘッドあってもMBPより快適。
        - MBPでもdocker動くのはVMなのでそこはほぼ変わらない。
    - 移行前のデスクトップで直接ubuntuが開発次の速度としては最高ではある。
    - ちなみにubuntu環境は最初Thinkpadだったがデスクトップにしている。ほぼ家で仕事してるし速いので。
        - Thinkpadはリソース不足なので今のところubuntuで運用する予定。
- docker化で環境構築が容易になった。

## 採用構成
- ホストOS Windows10
- VM化 VirtualBox
- ゲストOS Ubuntu 18.04 desktop
    - 中身は移行前とほぼ同じ
- ssh クライアントで接続して開発

VM上のlinuxにssh接続という10年前でも可能な構成になって自分でも微妙な気はするが、色々検討した結果。
10年前とはPCの物理パフォーマンスが違うし、ubuntu上での開発の経験も経ての判断なので良しとする。

## 不採用にしたものたち
- hyper-v
    - ベンチ取るとI/O僅かに早いし採用…と思ったが
        - 共有ディスクとかのサポート機能が貧弱
        - ネットワークが謎。
            - 勝手に作られる「既定のスイッチ」を選択するとゲストは通信不可(普通はブリッジとして動いて両方通信可能らしい :thinking: ) 、NIC二枚挿せば動く事は分かったがVirtualBoxなら簡単に動くしバカらしくなった。
        - hyper-v使ってないので windows proじゃなくても大丈夫 :smiley: 
- Ubuntu Server
    - [ryanb/letter_opener: Preview mail in the browser instead of sending.](https://github.com/ryanb/letter_opener) 使っていたり、GUIと連動する開発ツールもあるのでほぼ使わなくてもGUIあった方が困らないと判断した。最悪desktopならVMのGUI使えばubuntu直接時と変わらない開発できるはずなので保険の意味もある。
        - 結局X転送で letter openerも windows側で表示できてるのでほぼVMのGUI使う事は無い。
- VM Ware 
    - 8年前使ってた覚えはあるが、Mac/UbuntuでVirtualBoxに慣れてしまったし、パフォーマンス大差無いという話なので。
- Docker for Windows
    - 動きはしそうだが、エディタやらzshやらのdockerその他を操作する方の環境整備が大変そうなのでやめた。
- WSL (元Bash on Ubuntu on Windows)
    - dockerは動くならしいがこれだけだと docker-compseがダメ 、docker for windowsと組み合わせればなんとかなりそうだが、そんなに頑張るほどのメリットが見当たらない。
        - windowsとの連携を重視してないので、docker-composeができるようになってもVMより管理が容易とか圧倒的に速いとかのメリットが無ければ使いそうに無い。
- VM上のUbuntuDesktopのGUIで開発
    - 以前にwindows開発検討してやめた理由である「もっさり感」がどうしても解消できなかった。
    - 3D 有効とか色々設定試したが無理だった。
    - サクサク動くようになればコレでも良いのだが。
- ubuntu上のVMにWindowsを載せてアプリ使えるようにする
    - ubuntuそのものへの不満は解消できない。
    - ゲームは無理がある(ストV試したが全然無理)
        - GPU二個なら回避可能らしいがRyzenでCPU内GPU無いので二枚挿しまではしたくない。

## Windows側の開発環境詳細

ubuntu側は前と変わらないので割愛。

### ターミナル
昔のwindows使用当時はputty使ってたが調べると [rlogin/telnet/ssh(クライアント)ターミナルソフト](http://nanno.dip.jp/softlib/man/rlogin/) が評判良かったので使ってみたところ良さそうだったので採用。

###  エディタ
基本VM内のvimでやる事にした。とはいえ何も無いと不便なのでデフォルト状態のOniVimで。ほぼやらない。

### キーリマップ
最低限のカスタマイズとは言えここは譲れない :sunglasses: 
窓使いの憂鬱後継を探したが、yamyとのどかが見つかった。だが、のどかの試用版が2015年までのものしか見つからず、試せなかったのでとりあえずyamyにしている。
そこまでは変えてないが、Mac風に使えるようにカスタマイズした。
https://github.com/u1tnk/dotfiles/blob/master/my.mayu

↓
リマップした後にCtrlがロックされる現象が多発し、のどかに乗り替えた。
のどかは現在試用が使用不可能だが、ダメ元でやったら改善された。
Slackで Alt+x 押すとCtrl+xにリマップされててAltで開くメニューが開いしてしまう現象に悩まされたがSlackだけAltをoneshotモディファイヤに設定してみたら発生しなくなった。本来のoneshotモディファイヤの目的では無くハック的な解消とは思う。
参考: [「のどか」 - MANUAL - CUSTOMIZE](http://www.appletkan.com/nodoka-doc/CUSTOMIZE-ja.html)
https://github.com/u1tnk/dotfiles/blob/master/my.nodoka


### ubuntuとのクリップボード共有

mac/ubuntu時代からやっていたクリップボードをtmuxとneovimで共有するのを再現。X転送でやっていたのでwindowsだとハマるかと思ったら案外サクっとできた。

- Xmingのインストール  [Xming X Server for Windows 日本語情報トップページ - OSDN](https://ja.osdn.net/projects/sfnet_xming/)
- 参考 [さくらVPSのUbuntu14.04LTS にRLogin でX11ログインする方法 - 余白の書きなぐり](http://auewe.hatenablog.com/entry/2014/11/28/223731)
で rlogin 上の Xフォワード有効にする

### dotfilesのダウンロード
ほぼwindows上では使わないがyamyの設定ファイル等入れるので一応。github for windowsで解決。

### スクショ
snipping toolは使いづらいし、gyazoで良いかと思ったが、課金しないと編集もできなくてイマイチなので [Monosnap - Free Screenshot Tool](https://monosnap.com/welcome) にした。

### 日本語入力
[nathancorvussolis/corvusskk: SKK-like Japanese Input Method Editor for Windows](https://github.com/nathancorvussolis/corvusskk)

iBus-SKKはイマイチだったので改善点

## tips
### RLogin で ctrl+Vでコピペしたい

https://qiita.com/cs_sonar/items/04a4aab6f5eb105c5add
yamyで RLoginのときだけのキーリマップを設定して、RLogin側のキーボード設定で $EDIT_PASTE/$CLIPBOARD命令をマップする。


### virtualboxの共有ディレクトリに通常ユーザで接続

通常rootのみだが、以下でvboxsfグループに入れればアクセス可能
https://qiita.com/SUZUKI_Masaya/items/fb2d3c8141ba82d16801

### VM内の時間がズレる
Oracle VM VirtualBox Extension Pack をインストールする。最初から入れておいて欲しい。
https://www.virtualbox.org/wiki/Downloads

### RLoginで全角記号(→)とかが半角になる。
https://tmtms.hatenablog.com/entry/201811/windows-terminal
デフォルトで付いてる「8428 Aタイプを半角で表示」を外す。

## 結果
何せsshログインしてからは元の環境とほぼ変わらないため移行してから数日でほぼ仕事するにあたっての不安は無くなった。(そもそもubuntuのときからターミナル内とchromeで9割済んでたというのもある)
WindowsUpdate時以外再起動する事も無い、かつ再起動したとしてもVMが保存できる為、リモートサーバへのsshのようにtmuxプロセスが残り続けるので tmux起動や docker-compse up のようなお約束作業の頻度が激減したので想定以上の効果だと思う。
WindowsUpdateやWindowsそのものが練度が低くて使いづらいという不満はあるが、開発関係ほぼVM内に入れたのでWindowsでやる事はほぼchromeとslackなので、大した不満では無い。
ちなみにノートは使用頻度も低いしリソース不足なので当面デュアルブートでVM化はしない。次マシンは4コア/32GB/そこそこのGPU確保して同構成にしたい。
(Thinkpad X1 extremeなら不満はまったく無いができれば13インチで欲しい)

### メリット
- スリープが安定
- VMが起動したまま保存できるので、Windows自体を再起動しkてもtmuxセッションが残る。
    - ubuntuのスリープ問題と合わせて結構不便だったので一番の改善点かも。
- iTunesが動く
- ゲームもできる
- VirtualBoxが保存できるのでtmuxセッションが切れない
- デバイス互換性に不安が無い
- (Macと違って)強い自作デスクトップマシンで使える
    - これはMac比較最大のメリット
        - ディスプレイ入れても20万前後で重いと思う事がほぼ無い
- iBus-SKKよりCorvusSKK の方が使いやすい
- 150%拡大で普通に作業できる。

## デメリット
- 速度
    - Railsが20%ほど遅くなる(テストで計測)
        - 体感で微妙な差を感じる程度
- 新マシンへの乗り替えが手間
    - VM部分は逆にラクなので大差無いかもしれない。
        - ここはMacが一番ラク。
            - linuxは「ノウハウが溜まっていれば 」もっとラクできそうではあるがトータルコストを考えると安くは無いと思う。
    - windowsは浦島太郎なので運用法を模索していきたい。
-  Windows Update
    - 2018年にもなって月数回強制で再起動入る、しかも油断したら知らないうちに。正気なのか。
        - October Updateは特にひどかったらしい。 [「Windows 10 October 2018 Update」で見つかっている不具合のまとめ（2018年12月10更新） - やじうまの杜 - 窓の杜](https://forest.watch.impress.co.jp/docs/serial/yajiuma/1154651.html)
            - 私の環境だと勝手にhyper-v有効になっててVirtualBox上のVMが起動不可になって焦った。ひどい。
- 俺のTLだとwindows数人なのでtwitterで誰も助けてくれない

## 困っている事
- yamyのリマップがブラウザ上のエディタとかでは効かない。具体的には今編集に使っているesa上でctrl-cにリマップしたalt-cが効かない。
    - のどかはdriverベース、yamyはdriver不要にした…という事なのでのどかなら効くのかもしれないが…現状試用できないので厳しい。改善するなら買う。
        - 自作キーボード勢からマサカリ飛んで来そうだがHHKB勢なので勘弁して欲しい。
- スリープからの復帰後chromeで ctrlを押してないのに押しっぱなしの挙動をする。 一番怪しいyamyを落としても変わらないので別アプリの悪戯っぽい。一回chrome再起動すれば解消されるので許容範囲。


## まとめ

狙い通り大体快適。今のMacのハードに不満が溜まってるけど、linux直接入れるのはちょっと…という人におすすめしたい。ノウハウ共有しましょう :muscle: