Laravel HomesteadをWin10とHyper-Vで使うということ

# Laravel Homesteadとは

簡単に言うと、「Laravelをすぐ使うためのVagrantのコンテナ」かな？

そもそも、Laravelを使うにあたって必要なものは直ぐに思いつくものでも以下のものがある。

- そもそもOS
- php(Laravelが要求するバージョン)
- Nginx(Apache)
- MySQL(MariaDB、PostgreSQL)
- Composer

キューを使う場合、Redisをインストールしたほうがいいよ？とかもあるので、実は結構インストールするものは多い。
インストールがめんどい・・・というときのために、ダウンロードしてすぐ使えますというのがLaravel Homesteadというもの。

## Vagrantとは

私自身、あまりに仮想化の技術に疎いので「Linux環境だとかでVagrantの話はたくさんあるけどWin環境でVagrantは使えないんでしょう？」とか思いこんでたので敬遠してた。

とある仕組みをLaravelで作れるか急遽知りたくなって、すぐに環境が作れるものがほしくなって調べたところ、実はWin環境でも普通に使えると。。
https://www.vagrantup.com/downloads.html

Vagrantとは「VM系のツールにOSのインストールから必要なミドルの設定までしてくれるもの」という理解をしている。
VM系のツールとはVirtualBox、VMWare、Hyper-Vのことを指している。

仮想化技術に疎い私は、Laravel HomesteadがVagrantを使っていると知って上記の理解となるところまでもちょっと時間を使った。

## Win10でVagrant

Laravel Homesteadを使う人はなぜかVirtualBoxを使う人が多かったのだが、Win10はHyper-Vを使う方が効率的でしょう？ということでHyper-Vで作成。
「効率的でしょう？」の根拠は以下。

- Win10ではHyper-Vを無料で使える(「Windowsの機能の有効化と無効化」でチェックボックスをONにするとインストールできる)
    - それってすなわちWindows的に効率的な構成でVMが使えるってことなんじゃないの？っていう思い込み
    - http://www.nicovideo.jp/watch/sm19504496 この動画ではHyper-Vが一番速い

Hyper-V限定の話なのか、ほかのVMツールでも共通なのか、CPUのVT-xに依存するという話がある。
「VMが使うCPUを直接物理で使うのか？」的な理解。

とにかく私はWin10上にHyper-V＋Vagrantの構成で構築することを決定。


私の最初の理解では、「最終的にHyper-V上に作られたイメージにアクセスして使うのかな？？」という感じだったが、進めていくうちにちょっと違う印象になってきた。
イメージで使われるUbuntuは、GUIがないような・・・。
VSCodeとかでコーディングしたいんだけど・・・。

ゆくゆく見ていくと次のような形で使いそう。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/57515/576f5e84-7466-c9a8-fc29-30818ca4487b.png)


なるほどなぁ。

## インストール

インストールするにあたって、CPUを確認しておくとよいらしい。
CPUがVT-xに対応しているかどうかが、動作の速さに影響するからだと思われる。（たぶん対応してなくても動くのではないかな？）
以下のようなツールで確認できるとのこと。（既にHyper-Vが動いていると正しく動作しないとか）
https://openlibsys.org/index-ja.html

VT-xを有効にするには、BIOSもしくはUEFIの設定をいじること。（Virtual Technology～とかいうものを有効にする）

### Hyper-Vの有効化

- Windowsボタンを右クリック→「アプリと機能」→右側の「プログラムと機能」→左側の「Windowsの機能の有効化または無効化」
- 「Hyper-V」のチェックボックスを入れる
- たぶん再起動が必要になる

インストールが終わると、Windowsのメニューから「Hyper-V マネージャー」が選べるようになるので開く。
右側の「操作」の中から「仮想スイッチマネージャ」を開き、ネットワークカードの追加を行う。

- スイッチの種類は「外部」
- ネットワークカードは実際にネットワークに接続されているものを選択する


### Vagrantのインストール

- https://www.vagrantup.com/downloads.html からインストーラをダウンロード→インストール
- 再起動を求められる

### Gitは地味に必要

リポジトリからリソースを取得することもさることながら、SSHのキーを生成するのにも使う。
- https://gitforwindows.org/

### Laravel Homesteadのインストール

Vagrantは管理者権限で実行することを強いられるので、Windowsボタンを右クリック→「Windows PowerShell(管理者)」で実行することが必要になる。

次のコマンドで、Laravel HomesteadのVagrantのboxを取得。

```
vagrant box add laravel/homestead
```
GithubからLaravel Homesteadの資産を取得。
C:直下にしたのは、ガイドラインの~/Homesteadがうまくいかなかったから。
v7.3.0をチェックアウトしてるのは、最新ソースが安定版とは限らないから。

```
cd C:\
git clone https://github.com/laravel/homestead.git Homestead
cd Homestead
git checkout v7.3.0
```
C:\Homestead\init.batを実行する。
Homestead.yamlを編集する。
IPは立ち上げたときのIPを後からふり直した。（.10.10はあまり意味がない？）
~/Codeは、わかりやすくC:\codeをあらかじめ作ってそちらで対応する。
siteのtoは最終的にcodeディレクトリにtestというLaravelプロジェクトを作成するのでこのパスになる。

```
ip: "192.168.10.10"
provider: virtualbox
...
folders:
    - map: ~/Code
...
sites:
    - map: homestead.test
      to: /home/vagrant/code/public
```
↓

```
ip: "192.168.x.x"
...
provider: hyperv
...
folders:
    - map: c:/Code
...
sites:
    - map: homestead.test
      to: /home/vagrant/code/test/public
```

sshのキーファイルを作成する。
Git For WindowsのBashを起動して以下のコマンドを実行。
.sshディレクトリはなければ作成。

```
cd ~/.ssh
ssh-keygen
ファイル名をid_rsaとする
```

Vagrantの起動。

```
vagrant up
途中、使用するVMのネットワークカードを聞かれるので、実際にネットワークに接続されているものを指定。
また、ユーザとパスワードも聞かれたが、これはWin10のアカウントを記入。共有ディレクトリで使われるものと思われる。
```
ゲストOSにアクセスする。

```
vagrant ssh
```

### Laravelのインストール
SSHでアクセスした後、/home/vagrant/codeディレクトリでLaravelをインストールする。
→/home/vagrant/codeディレクトリはHomestead.yamlで共有ディレクトリの設定がされている。

```
cd code
composer create-project laravel/laravel --prefer-dist test
```

## アクセス確認

ifconfigでVMのIPを確認し、下記URLで確認する。
ネットワークカードを外部で指定するが、その時に動的にIPが割り振られていたので、ifconfigでIPを確認する。

```
http://確認したIP
```

## VS Codeでコマンド操作

何気にPowerShellを管理者権限で立ち上げて`vagrant ssh`をいつもやるのか？という疑問が生まれた。
そもそもVS Codeでコーディングしたいといって始めているのに、VS Codeのターミナルで扱えないのは不便すぎる。

VS Code上でPowerShellの管理者権限実行はそもそもめんどくさい。（しかも私には今のところ見つけられていない）
なのでVS Code上では次のようにして使う。

```
ssh vagrant@192.168.x.x
```

地味に気づくのが遅くて自分にびっくりした。


# まとめ
使い方が微妙にわかりづらかったHomesteadを自分なりにまとめたもの。
間違いがあれば直して正しい知識にしたいので、指摘がほしいところ。

**`vagrant up`でユーザとパスワードを聞かれて、Win10のアカウントを記入するのは後で地味に忘れるので注意。**

# 以後あったこと
## 2018/11/5 DBから取得する日本語が化ける
実はLaravelを使っているところではない処理で発覚。
Homesteadのデフォルトはlatin1という設定になっている。
本来はDBを作る前にUTF-8の対策をしておくべきな様子。
https://agatayoshimi.blogspot.com/2015/02/laravelhomesteadmysql.html

```
sudo vi /etc/mysql/my.cnf

最下部に追記
[mysqld]
skip-character-set-client-handshake
character-set-server = utf8
collation-server = utf8_general_ci
init-connect = SET NAMES utf8

mysql再起動
sudo service mysql restart
```

DBはlatin1のところが残ったけど、
とりあえず文字化けは治ったので良しとする。

## 2018/10/6 Hyper-Vのネットワークが壊れる
いつかのWin10のアップデートのせい（と私は思っている）でHyper-VのNICの設定が壊れた。

仮想スイッチマネージャからNICを再作成してイメージへのアクセスは回復。

```
vagrant ssh
password: vagrant
```

しかし、共有とかは壊れたままHyper-Vからアクセスできない状態。

仕方がないので、vagrantのコンテナ入れ直し。

管理者権限のPowerShell起動して以下を実行。

```
PS C:\Homestead> vagrant halt
PS C:\Homestead> vagrant destroy
PS C:\Homestead> vagrant up
ネットワークカードにどれ使うか聞かれる
```


## 2018/10/6 環境のデフォルトパスワード類
以下様式は　アカウント / パスワード

* Vagrant
    * vagrant / vagrant
* MySQL
    * homestead / secret
* PostgreSQL
    * homestead / secret

## 2019/1/14 LaravelはPHPだがnode.jsも使う、そして...
基本的にLaravel本体のフレームワークはPHPでできているのでPHPが入ってればいいや・・・と思っていたら、最近は（？ずっと前からか？）そうでもないらしい。

フルスタックで、UIを作るんだからJavaScriptやSCSS/LESSなどを使うのはもはや当たり前。
JavaScriptを使うにしても独自のものだけで色々やるのもアリだけど、最近はVueを使ってみたりnpmでインストールできるモジュールを使ってみたいというのもあるかもしれない。

そうなってくると、webpackのようなものを使いたくなってくる・・・Laravelにはそんな機能をまとめたものがある。
→ Laravel Mix
https://readouble.com/laravel/5.7/ja/mix.html

・・・と、ここまでは前置きで、言いたいことはこの後。

### node.js関連のコマンド（npm）はホスト側（Win側）で実行する
前述の通り、Laravelにはnode.js系の操作→npmの操作が必要になってくる。
npmを実行するためのpackage.jsonもプロジェクト内に置いてある。

普通に考えてゲスト側（Ubuntu側）でnpmも使えるのかと思いきや、npmはホスト側でなければ動かなかった。↓その時の経験。
https://qiita.com/asuzuki2008/items/acc963569526ff941619

VirtualBoxでのHomesteadでも同様だったので、WindowsでHomesteadを使うときの制限みたいなものかなと。
一つのコンソールで全部できないというのは不便だなぁ。