[Rails5] Railsのデバッグ、rdebug-ideの起動を少しでも速くする方法


# rdebug-ideの起動を速くしたいと思った経緯
以前私は [こちらの記事](https://qiita.com/takmt/items/0858dbd3c53cabaa4395)でステップ実行が出来る環境までもっていく方法を記載いたしました。

簡単な概要だけ記載すると、

* CentOS7がゲストOS ... 用途はRailsの環境
* Windows10がホストOS ... 用途はVSCodeを使用してRailsのリモートデバッグ

というものです。

この際CentOS7とWindows10で共有するフォルダの環境としては

* VirtualBox上にCentOS7をインストールする。
* VirtualBoxの機能を使ってWindowsのフォルダを共有する。

という事を[この箇所で](https://qiita.com/takmt/items/0858dbd3c53cabaa4395#virtualbox%E4%B8%8A%E3%81%A7windows%E3%81%AE%E3%83%95%E3%82%A9%E3%83%AB%E3%83%80%E3%82%92%E5%8F%82%E7%85%A7%E5%87%BA%E6%9D%A5%E3%82%8B%E3%82%88%E3%81%86%E3%81%AB%E3%81%99%E3%82%8Bwindows10%E5%81%B4) 行ってきました。

そして実際にRailsの学習を行う為に下記コマンドを打ち込みましたが。。。。

```
bundle exec rdebug-ide --host 0.0.0.0 --port 1234 --dispatcher-port 26126 -- bin/rails s -b 0.0.0.0
```
このコマンドとほぼ同時にVSCodeからデバッグ開始を行ったとしても、
**ブラウザからアクセスして動作確認できるようになるまで、**
**1分30秒かかりました。**

確認方法としては

```
time bundle exec rdebug-ide --host 0.0.0.0 --port 1234 --dispatcher-port 26126 -- bin/rails s -b 0.0.0.0
```

とし、
`Use Ctrl-C to stop`
と出た瞬間にCTRL+Cを押下して出てきた時間が 1m30sです。

**正直初心者がややこしい処理を作っている途中にデバッグ確認を多くしたい場合、非常にストレスがかかります。**

# どうすれば速くなるの？

[こちらの記事を読みましたが](https://qiita.com/pocari/items/9f83573272f2a2754a76#%E3%83%87%E3%83%90%E3%83%83%E3%82%B0%E5%AE%9F%E8%A1%8C) どうもVirtualBoxの共有フォルダが遅い模様。

実際に私も同様の問題かVirtualBox上でWindowsのフォルダをマウントしたディレクトリ以外でRailsのアプリを作成し実行してみましたが、超高速化(約10秒で起動)しました。

# Windowsとのフォルダ共有 + デバッグ実行の高速化の為に

* Windows10でVSCodeを使用しつつ
* VSCodeからステップ実行が出来る環境で
* CentOS7上で動作しているRailsをリモートデバッグする方法

をVirtualBoxの共有フォルダの機能を使用せずにストレスなくデバッグする為にはどうすればよいのかと考えてみましたが、私が絞り出せたアイデアは下記2点です。

1. **CentOS7上にSambaをインストールしそのディレクトリ上にRailsアプリをインストールする。**
2. **CentOS7からWindows10の共有フォルダにcifsでアクセスする。**

それぞれの特徴としては下記です。

- ①の特徴

 - CentOS7に共有フォルダを作成しWindows10からアクセスする。
 - CentOS7上にディレクトリを置いている為、間違いなくRailsの起動が速くなる。
 - しかしVirtualBox上の仮想マシンが壊れた段階で作成したRailsアプリの内容ごと消えてしまう可能性がある。


- ②の特徴

  - Windows10に共有フォルダを作成しCentOS7からアクセスする。
  - Railsの起動の際に若干遅くなる見込みがある。
  - VirtualBox上の仮想マシンに問題があったとしてもファイルはWindows上に存在する為、無事である。

**試してみたところどちらもRailsサーバー起動までに10秒を切る好タイムを出しました。**

正直Gitでソースコードをこまめにpushすると思うので、ソースコードが消えたらどうしようという問題はあまり気にしなくていいかもしれないのですが、
好き嫌いがあると思うので、今回は両方の構築方法を記載しておきます。

# ①の環境構築方法

主に操作はCentOS7側(ゲストOS)になります。

まずはsambaの環境構築方法です。
筆者は例のごとくsambaも初心者で、調査しながら出来た方法を記載しております。
※前回と同様CentOS上には userという名前のユーザー名を記載しております。
※特にselinux周りのコマンドは完全にわかっておりません。。。

```
sudo yum install -y samba
sudo firewall-cmd --add-service=samba --permanent --zone=public
sudo firewall-cmd --reload
sudo setsebool -P samba_enable_home_dirs on
sudo pdbedit -a user
sudo systemctl enable smb nmb
```

次にsambaの設定ファイルを記載します。

```
vim /etc/samba/smb.conf
```

下記が変更後のファイル内容です。
[主にこちらの記事](https://www.hiroom2.com/2016/05/26/centos-7-samba%E3%82%92%E3%82%A4%E3%83%B3%E3%82%B9%E3%83%88%E3%83%BC%E3%83%AB%E3%81%97%E3%81%A6windows-10%E3%81%A8%E3%83%95%E3%82%A1%E3%82%A4%E3%83%AB%E5%85%B1%E6%9C%89%E3%81%99%E3%82%8B/) を参考にしました。

下記設定では主にshareという共有ディレクトリを作成します。

```
[global]
        #workgroup = SAMBA
        workgroup = WORKGROUP
        security = user

        unix charset = UTF-8
        dos charset = CP932
        wins support = yes

        passdb backend = tdbsam

        printing = cups
        printcap name = cups
        load printers = no
        cups options = raw

[share]
        path = /home/user/share
        read only = no
        browsable = yes
        writeable = yes
```

各種設定内容は省略致しますが、
後は各種共有用のフォルダを作成設定し、sambaを再起動するのみです。

```
mkdir -p /home/user/share
chmod -R 0777 /home/user/share
chcon -R -t samba_share_t /home/user/share
sudo systemctl restart smb nmb
```

ここまでくればWindows10側(ホストOS側)から
CentOS側の IPアドレス+ディレクトリ名で可能です。

実際にアクセスしてみましょう。
私のゲストOS(CentOS7)から

`\\192.168.1.27\share`
とエクスプローラーのアドレス部分に打ち込むことでアクセス可能です。

![001-folder.png](https://qiita-image-store.s3.amazonaws.com/0/383232/a57fefb5-8d74-47a5-a072-30b942fd5eb1.png)

ユーザー名とパスワードが求められた場合は、
CentOS上のユーザー名とパスワードを入力すればOKです。

あとはCentOS7側から共有フォルダにRailsアプリケーションを作成すれば、Windows側でも見れるようになります。

# ②の環境構築方法

###### Windows側の設定

こちらはWindows10側に共有フォルダを配置し、
CentOS7側からアクセスする方法です。

まずWindows10側で共有フォルダを作成します。
今回は `rails_win_share`というフォルダを作成しました。

![001-folder.png](https://qiita-image-store.s3.amazonaws.com/0/383232/d86a8280-801f-7c27-9d6f-f0ecd16c51ad.png)

その後、共有フォルダの設定を行います。
フォルダを右クリックしてプロパティを選択した後、
下図共有タブから共有ボタンを押下し、

![001-folder.png](https://qiita-image-store.s3.amazonaws.com/0/383232/9df25b60-beed-98e6-edd2-d2720c525047.png)

さらにその先で共有(H)を選択します。

![003-folder.png](https://qiita-image-store.s3.amazonaws.com/0/383232/6360e52e-882a-9890-4789-b4742979de1b.png)

その後の画面で終了を押下すれば共有完了です。

![004-folder.png](https://qiita-image-store.s3.amazonaws.com/0/383232/51345682-10cb-c8d0-d3d5-f4838ef5d6c3.png)

実際に `\\(Windows側のIPアドレス)\rails_win_share` にアクセスできるか確かめてみましょう。
私の環境ではWindows側のIPが192.168.1.21なので、 `\\192.168.1.21\rails_win_share` でアクセスできました。

###### CentOS7側の設定

ここからはCentOS7側の設定です。
主に[こちら](https://www.hiroom2.com/2017/08/02/centos-7-cifs-utils-ja/) を参考にしました。

やる事はCentOS7上のマウントディレクトリを作成し、
そのディレクトリにWindowsの共有フォルダのマウントを行うだけなのですが少し手順が必要です。

まず一般ユーザーでログイン後、linuxのuid , gidを調べましょう。

```
id <user名> # もし userという名前のユーザー名の場合は id user と入力。
```

すると下記のような結果が返ってきます。
この値を覚えておきましょう。
`uid=1000(user) gid=1000(user) groups=1000(user)`

次は実際にマウントを行います。

```
sudo yum install -y cifs-utils
mkdir /home/user/rails_win_share
sudo mount -t cifs -o username=<windowsのユーザー名>,password=<Windowsのパスワード>,uid=<CentOS7のユーザーのuid>,gid=<CentOS7のユーザーのgid>,nobrl //<windowsのIP>/rails_win_share /home/user/rails_win_share 
```

Windows側のIPが192.168.1.21 , ユーザー名がwinusr , パスワードがwinpas、CentOS7側のuidとgidが1000だった場合は、
`sudo mount -t cifs -o username=winusr,password=winpas,uid=1000,gid=1000,nobrl //192.168.1.21/rails_win_share /home/user/rails_win_share`

になります。

ここでPermission denied(13)などが出る場合はコマンドやWindows側のパスワードなど間違っている箇所を探す必要がありますので、エラーが出た場合は各自調査をしてください。

またuidやgidが誤っている場合は、マウント先フォルダに書き込み権限がなくファイルの作成などが出来なくなる場合があります。

マウントが成功した場合はWindows側の共有フォルダにファイルを配置し、
CentOS7側のマウント先(例では /home/user/rails_win_share)にファイルが存在しているか確認しましょう。

> [注意] 
> nobrlオプションは忘れないようにしてください。
> [sqlite3を使っている時にmigrate出来ない場合があります。](https://github.com/docker/for-win/issues/11)

ここまでくれば、あとはCentOS7が起動する度に自動マウントするように設定するだけです。

```
sudo vim /etc/fstab
```

その後下記行を追加します。

```
//<windowsのIPアドレス>/rails_win_share /home/user/rails_win_share cifs username=<windowsのユーザー>,password=<windowsのパス>,uid=<linuxのユーザーのuid>,gid=<gid>,nobrl 0 0
```

ファイルを保存後、最後に再起動をします。

```
reboot
```

これで再起動後もマウントフォルダが見れるようになります。

あとはCentOS7側からWindowsの共有フォルダをマウントしたパスにRailsアプリケーションを作成すれば、Windows側でも見れるようになります。

# お疲れさまでした。

以上がrdebug-ideの速度を上げる方法です。
もう少し効率の良い方法があればよいのですが筆者はそこまで知識がないのでもしよければアドバイスなどあればコメントお願いします。

また間違っている箇所などがあればご指摘下さい。