WSL(Ubuntu18.04)にLaravel5.7を導入

# ゴール
1. Windows Subsystem for Linux 上で Laravel5.7 が動作する
2. Laravel5.7 のソースがWindowsから編集できる

# Laravel導入に必要な機能をインストール
## WSL
Microsoft Storeから取得します。
![store.PNG](https://qiita-image-store.s3.amazonaws.com/0/146452/36fd99d8-4519-6ab2-4386-c1ef670e1d28.png)

WSLは有効化しないと利用できないため、以下の手順でWSLを有効化します。
1. コントロールパネル → 「プログラム」を選択
2. 「Windowsの機能の有効化または無効化」をクリック
3. 機能一覧のボックスが出るので、「Windows Subsystem for Linux」にチェックをつけて有効化
4. 「OK」をクリック後、再起動を促されるので再起動する
![wsl有効化.PNG](https://qiita-image-store.s3.amazonaws.com/0/146452/308f9931-79ff-9ede-07bc-23cee6572bcd.png)


### Ubuntu起動
```
Installing, this may take a few minutes...
Please create a default UNIX user account. The username does not need to match your Windows username.
For more information visit: https://aka.ms/wslusers
Enter new UNIX username: *任意のユーザ名*
Enter new UNIX password: *任意のパスワード*
Retype new UNIX password: *任意のパスワードをもう一度入力*
passwd: password updated successfully
Installation successful!
To run a command as administrator (user "root"), use "sudo <command>".
See "man sudo_root" for details.
```

### Ubuntuバージョン確認
```
$ cat /etc/os-release
NAME="Ubuntu"
VERSION="18.04.1 LTS (Bionic Beaver)"
ID=ubuntu
ID_LIKE=debian
PRETTY_NAME="Ubuntu 18.04.1 LTS"
VERSION_ID="18.04"
HOME_URL="https://www.ubuntu.com/"
SUPPORT_URL="https://help.ubuntu.com/"
BUG_REPORT_URL="https://bugs.launchpad.net/ubuntu/"
PRIVACY_POLICY_URL="https://www.ubuntu.com/legal/terms-and-policies/privacy-policy"
VERSION_CODENAME=bionic
UBUNTU_CODENAME=bionic
```
### Ubuntu パッケージ情報更新
```
# パッケージリスト更新
$ sudo apt-get update

# インストールされているソフト更新
$ sudo apt-get upgrade
```

### php7.2
```
# php関連のパッケージ取得
$ sudo apt-get install -y php7.2 php7.2-zip php7.2-mbstring php7.2-dom php7.2-mysql

# composerで使用するパッケージ取得
$ sudo apt-get install unzip

# phpバージョン
$ php --version
PHP 7.2.7-0ubuntu0.18.04.2 (cli) (built: Jul  4 2018 16:55:24) ( NTS )
Copyright (c) 1997-2018 The PHP Group
Zend Engine v3.2.0, Copyright (c) 1998-2018 Zend Technologies
    with Zend OPcache v7.2.7-0ubuntu0.18.04.2, Copyright (c) 1999-2018, by Zend Technologies

# phpモジュール確認
$ php -m
[PHP Modules]
calendar
Core
ctype
date
dom
exif
fileinfo
filter
ftp
gettext
hash
iconv
json
libxml
mbstring
mysqli
mysqlnd
openssl
pcntl
pcre
PDO
pdo_mysql
Phar
posix
readline
Reflection
session
shmop
SimpleXML
sockets
sodium
SPL
standard
sysvmsg
sysvsem
sysvshm
tokenizer
wddx
xml
xmlreader
xmlwriter
xsl
Zend OPcache
zip
zlib

[Zend Modules]
Zend OPcache
```

### Composer
```
# Composerのインストーラ取得
$ curl -sS https://getcomposer.org/installer | php

# Composerの実体ファイルを移動
$ sudo mv composer.phar /usr/local/bin/composer

# 実行属性を付与
$ sudo chmod +x /usr/local/bin/composer

# Composerバージョン
$ composer --version
Composer version 1.7.2 2018-08-16 16:57:12
```

### WSLからWindowsのフォルダにアクセスする設定を付与
Windowsの`C:\laravel`フォルダを共有フォルダとする前提です。
シンボリックリンクでフォルダを共有します。

```
$ ln -s /mnt/c/laravel
```

# Laravelプロジェクトの作成
WSLのUbuntuを起動し、プロジェクトを作成します。

## プロジェクト作成

```
# シンボリックリンク先に移動
$ cd ~/larvel

# --prefer-dist オプションで安定版のLaravelを取得
$ composer create-project laravel/laravel PROJECT_NAME --prefer-dist
Installing laravel/laravel (v5.7.0)
  - Installing laravel/laravel (v5.7.0): Loading from cache
#
# 長いので省略...
#
> @php artisan key:generate
Application key [base64:*アプリケーションのキー*] set successfully.
```

動作を確認します。

```
# プロジェクト作成先に移動
$ cd ~/larvel

# 開発サーバ起動
$ php artisan serve
Laravel development server started: <http://127.0.0.1:8000>
```

ブラウザで`127.0.0.1:8000`にアクセスします。
![laravel.PNG](https://qiita-image-store.s3.amazonaws.com/0/146452/5c8965c1-6688-5ccc-d590-5ddb3bfc534d.png)



## MySQL5.7
データベースも使いたいので、MySQLもインストールします。

```
# MySQLパッケージを取得
$ sudo apt-get install -y mysql-server

# バージョン確認
$ mysql --version
mysql  Ver 14.14 Distrib 5.7.23, for Linux (x86_64) using  EditLine wrapper

# MySQL起動
$ sudo service mysql start
* Starting MySQL database server mysqld
No directory, logging in with HOME=/
```

MySQLの初期設定をします。

```
$ sudo mysql_secure_installation

Securing the MySQL server deployment.

Connecting to MySQL using a blank password.

VALIDATE PASSWORD PLUGIN can be used to test passwords
and improve security. It checks the strength of password
and allows the users to set only those passwords which are
secure enough. Would you like to setup VALIDATE PASSWORD plugin?

Press y|Y for Yes, any other key for No: n
Please set the password for root here.

New password:*任意のパスワード*

Re-enter new password:*任意のパスワードをもう一度入力*
By default, a MySQL installation has an anonymous user,
allowing anyone to log into MySQL without having to have
a user account created for them. This is intended only for
testing, and to make the installation go a bit smoother.
You should remove them before moving into a production
environment.

Remove anonymous users? (Press y|Y for Yes, any other key for No) : y
Success.


Normally, root should only be allowed to connect from
'localhost'. This ensures that someone cannot guess at
the root password from the network.

Disallow root login remotely? (Press y|Y for Yes, any other key for No) : y
Success.

By default, MySQL comes with a database named 'test' that
anyone can access. This is also intended only for testing,
and should be removed before moving into a production
environment.


Remove test database and access to it? (Press y|Y for Yes, any other key for No) : y
 - Dropping test database...
Success.

 - Removing privileges on test database...
Success.

Reloading the privilege tables will ensure that all changes
made so far will take effect immediately.

Reload privilege tables now? (Press y|Y for Yes, any other key for No) : y
Success.

All done!
```

Laravel用のデータベースを作成します。

```
# MySQLにアクセス
$ sudo mysql -u root -p
Enter password:*設定したパスワードを入力*
Welcome to the MySQL monitor.  Commands end with ; or \g.
Your MySQL connection id is 8
Server version: 5.7.23-0ubuntu0.18.04.1 (Ubuntu)

Copyright (c) 2000, 2018, Oracle and/or its affiliates. All rights reserved.

Oracle is a registered trademark of Oracle Corporation and/or its
affiliates. Other names may be trademarks of their respective
owners.

Type 'help;' or '\h' for help. Type '\c' to clear the current input statement.

mysql> show databases;
+--------------------+
| Database           |
+--------------------+
| information_schema |
| mysql              |
| performance_schema |
| sys                |
+--------------------+
4 rows in set (0.00 sec)

mysql> CREATE DATABASE homestead;
Query OK, 1 row affected (0.00 sec)

mysql> show databases;
+--------------------+
| Database           |
+--------------------+
| information_schema |
| homestead          |
| mysql              |
| performance_schema |
| sys                |
+--------------------+
5 rows in set (0.00 sec)
```

データベースで日本語を使えるように設定を変更します。

```
# MySQLの設定確認
$ sudo mysql -u root -p
#
# 省略...
#

mysql> status;
--------------
mysql  Ver 14.14 Distrib 5.7.23, for Linux (x86_64) using  EditLine wrapper

Connection id:          8
Current database:
Current user:           root@localhost
SSL:                    Not in use
Current pager:          stdout
Using outfile:          ''
Using delimiter:        ;
Server version:         5.7.23-0ubuntu0.18.04.1 (Ubuntu)
Protocol version:       10
Connection:             Localhost via UNIX socket
Server characterset:    latin1 # UTF-8に変更したい
Db     characterset:    latin1 # UTF-8に変更したい
Client characterset:    utf8
Conn.  characterset:    utf8
UNIX socket:            /var/run/mysqld/mysqld.sock
Uptime:                 17 min 17 sec

Threads: 1  Questions: 25  Slow queries: 0  Opens: 115  Flush tables: 1  Open tables: 34  Queries per second avg: 0.024
--------------
```

MySQLの設定ファイルを作成し、文字コードを変更します。

```
# 設定ファイルを作成 + 編集
$ sudo vi /etc/mysql/my.cnf

# my.cnfに追加する内容
[mysqld]
character-set-server=utf8
skip-character-set-client-handshake
default-storage-engine=INNODB

[mysqldump]
default-character-set=utf8

[mysql]
default-character-set=utf8

# :wq で編集内容を保存してviを終了
```

設定が反映されているか確認します。

```
# MySQL再起動
$ sudo service mysql stop
$ sudo service mysql start

# 設定確認
$ sudo mysql -u root -p
#
# 省略...
#

mysql> status;
--------------
mysql  Ver 14.14 Distrib 5.7.23, for Linux (x86_64) using  EditLine wrapper

Connection id:          4
Current database:
Current user:           root@localhost
SSL:                    Not in use
Current pager:          stdout
Using outfile:          ''
Using delimiter:        ;
Server version:         5.7.23-0ubuntu0.18.04.1 (Ubuntu)
Protocol version:       10
Connection:             Localhost via UNIX socket
Server characterset:    utf8 # OK!
Db     characterset:    utf8 # OK!
Client characterset:    utf8
Conn.  characterset:    utf8
UNIX socket:            /var/run/mysqld/mysqld.sock
Uptime:                 12 sec

Threads: 1  Questions: 9  Slow queries: 0  Opens: 107  Flush tables: 1  Open tables: 26  Queries per second avg: 0.750
--------------
```

# やってみた所感
WSLならではのハマりどころがあるかと思い身構えていましたが、不慣れな自分でもすんなり進めることができました。
ココはもっとこうしたほうが良い等のツッコミがあれば、教えていただけると幸いです。


# 参考にさせていただいたサイト
以下のリンクに記載いただいている情報に助けていただきました。
情報を共有いただき、ありがとうございます！

## WSL関連
[Windows 10でLinuxプログラムを利用可能にするWSL（Windows Subsystem for Linux）をインストールする（バージョン1803対応版）](http://www.atmarkit.co.jp/ait/articles/1608/08/news039.html)

## Laravelインストール関連
* [ubuntu18.04 php7.2 laravel5.6 インストール](https://qiita.com/mazu/items/479191e7264a9f88e0a5)
* [Laravel5.6 Installation]
(https://laravel.com/docs/5.6/installation)
* [Laravel 5.6 のインストール](https://laravel10.wordpress.com/2015/02/13/laravel%E3%81%AE%E3%82%A4%E3%83%B3%E3%82%B9%E3%83%88%E3%83%BC%E3%83%AB/)

## Ubuntuコマンド関連
* [[Ubuntu] apt-get まとめ]
(https://qiita.com/white_aspara25/items/723ae4ebf0bfefe2115c)
* [シンボリックリンクの作成と削除](https://qiita.com/colorrabbit/items/2e99304bd92201261c60)

## MySQL関連
* [Ubuntu で MySQL](https://qiita.com/kojionilk/items/bdace886c3664d75c5f7)