M1 MacでHomebrewセットアップからLaravel でnpm run watchするまで


知識レベルフロントエンドエンジニアがM1でLAMP環境整えるための覚書です。

##Homebrew インストール

M1の場合、「/opt/homebrew/」ディレクトリにインストールする必要がある。

ルートからoptへ移動
```bash:~
cd /opt
```

```bash:/opt
sudo mkdir homebrew
Password:
sudo chown joraku:admin homebrew
curl -L https://github.com/Homebrew/brew/tarball/master | tar xz --strip 1 -C homebrew
```

optからルートへ移動

```bash:/opt
cd ~
```

インストールが終わったら「.zshrc」ファイルでパスを通す。

```bash:~
vim .zshrc
```

```bash:.zshrc
export PATH=$PATH:/opt/homebrew/bin
```
escキー、:wqで保存して閉じる。

ターミナルを再起動するか、sourseで.zshrc反映。

```bash:
source ~/.zshrc
```

「brew -v」で動いてるか確認。

```bash:
brew -v
Homebrew >=2.5.0 (shallow or no git repository)
Homebrew/homebrew-core N/A
```

上記のようにバージョンが表示されたらOK。
続けてwgetのインストール。

```bash:
brew install wget
```

wgetコマンドが実行できるようになる。

##phpインストール

インストール可能なphpを調べる

```bash:
brew search php
==> Formulae
brew-php-switcher            php-code-sniffer             php@7.2                      php@7.4                      phplint                      phpmyadmin                   phpunit
php                          php-cs-fixer                 php@7.3                      phpbrew                      phpmd                        phpstan
==> Casks
```

現時点で最新のphp@7.4を入れます。
（というか7.3以下はM1ネイティブではないという記述を見た気がする）

```bash:
brew install php@7.4
```

インストール終わったらlink。

```bash:
brew link php@7.4
Linking /opt/homebrew/Cellar/php@7.4/7.4.19... 25 symlinks created.

If you need to have this software first in your PATH instead consider running:
  echo 'export PATH="/opt/homebrew/opt/php@7.4/bin:$PATH"' >> ~/.zshrc
  echo 'export PATH="/opt/homebrew/opt/php@7.4/sbin:$PATH"' >> ~/.zshrc
```

パスを通すように指示が出るので、その通り実行。

```bash:
echo 'export PATH="/opt/homebrew/opt/php@7.4/bin:$PATH"' >> ~/.zshrc
echo 'export PATH="/opt/homebrew/opt/php@7.4/sbin:$PATH"' >> ~/.zshrc
```

念のため通っているかcatで確認。

```bash:
cat ~/.zshrc
export PATH=$PATH:/opt/homebrew/bin
export PATH="/opt/homebrew/opt/php@7.4/bin:$PATH"
export PATH="/opt/homebrew/opt/php@7.4/sbin:$PATH"
```
先程のhomebrewに加えて、phpの設定も追加された。

ターミナルを再起動するか、sourseで.zshrc反映。

```bash:
source ~/.zshrc
```

インストールしたphpが反映されているか確認。

```bash:
which php
/opt/homebrew/opt/php@7.4/bin/php
```


##Apacheインストール

Macに元から入っているapacheを
止める。

```bash:
sudo apachectl stop
Password:
/System/Library/LaunchDaemons/org.apache.httpd.plist: Could not find specified service
Unload failed: 113: Could not find specified service
```

が、「指定されたサービスが見つかりませんでした」となっているのでM1では動いていない？
何にしても動いてなければOK。

Homebrewでapacheを確認。

```bash:
brew search httpd
==> Formulae
darkhttpd                         httpd                             httpdiff                          libmicrohttpd                     lighttpd                          mighttpd2
```

確認できたのでインストール。

```bash:
brew install httpd
```

###「httpd.conf」「hosts」の設定

「httpd.conf」をvimとかで触るのはめんどくさいので、
「Visual Studio Code」などのエディタで触ります。

####エディタがない場合（ある人はスキップ）
持っていない場合はインストールしておきます。
→[Visual Studio Code](https://code.visualstudio.com/Download)
Apple Silicon版またはUnivarsal版をダウンロードしてインストール。


M1の場合、「/opt/homebrew/etc/httpd/」に設定ファイルがある。
openでディレクトリを開きます。

```bash:
open /opt/homebrew/etc/httpd/
```

開きました。
![httpd.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/229958/3d55c184-a34f-f33f-b1cb-63238f3618d4.png)

####httpd.confの編集
httpd.confを「Visual Studio Code」などのエディタで開く。

「Listen 8080」を書き換え。（8080のままでもOK、ポートの環境による）

```bash:http.conf
Listen 80
```


コメントアウト

```bash:http.conf
LoadModule userdir_module lib/httpd/modules/mod_userdir.so
LoadModule rewrite_module lib/httpd/modules/mod_rewrite.so
```

上記コメントアウトの下あたりに追記

```bash:http.conf
LoadModule php7_module /opt/homebrew/opt/php@7.4/lib/httpd/modules/libphp7.so
<IfModule php7_module>
  AddType application/x-httpd-php .php
  PHPIniDir "/opt/homebrew/opt/php@7.4/php.ini"
</IfModule>
```

「#ServerName www.example.com:8080」を以下に書き換え。
（myhostにしているけど、これはお好みでOK）

```bash:http.conf
ServerName myhost
```

「AllowOverride none」を書き換え。

```bash:http.conf
<Directory />
    AllowOverride all
    Require all denied
</Directory>
```

「DirectoryIndex index.html」にindex.phpを追記。

```bash:http.conf
<IfModule dir_module>
    DirectoryIndex index.php index.html
</IfModule>
```

コメントアウト

```bash:http.conf
# User home directories
Include /opt/homebrew/etc/httpd/extra/httpd-userdir.conf

# Virtual hosts
Include /opt/homebrew/etc/httpd/extra/httpd-vhosts.conf
```

####httpd-vhosts.confの編集

http.confのあったディレクトリにある「extra」フォルダ内にttpd-vhosts.confはある。
![vhosts.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/229958/d1e7ecb2-5d49-bb72-061d-b5a10ce85957.png)

こちらもエディタでサクッと編集してしまいます。
デフォルトで書いている内容は全部消してしまって大丈夫。
例として、phpMyAdminをローカルに置いて起動する想定で以下記述。

>以下の設定の想定で記述
>macのユーザー名:taroyamada
>phpmyadminの場所: taroyamada/web/phpMyAdmin
>ServerName: phpmyadmin.myhost
>自身の環境に置き換えてよしなにやってください

```bash:httpd-vhosts.conf
<VirtualHost 127.0.0.1:80>
    ServerAdmin admin@phpmyadmin.myhost
    DocumentRoot "/Users/taroyamada/web/phpMyAdmin"
    ServerName phpmyadmin.myhost
    ErrorLog "/opt/homebrew/var/log/phpMyAdmin.localhost-error_log"
    CustomLog "/opt/homebrew/var/log/phpMyAdmin.localhost-access_log" common
    <Directory "/Users/taroyamada/web/phpMyAdmin">
        Options Indexes FollowSymLinks Includes ExecCGI
        AllowOverride All
        Require all granted
    </Directory>
</VirtualHost>
```

M1じゃない環境から設定をコピペする場合、ログファイルのディレクトリが
「/opt/homebrew/var/log/」となるよう気をつける。

####hostsの編集
ターミナルでの操作に戻り、hostsの設定をいじる。
管理者権限でhostsを開く。

```bash:~
sudo vim /private/etc/hosts
```

開いたら「i」を押して編集モードにして
一番下に、例としてあげたphpmyadminのサーバーネームを追加。

```bash:hosts
##
# Host Database
#
# localhost is used to configure the loopback interface
# when the system is booting.  Do not change this entry.
##
127.0.0.1       localhost
255.255.255.255 broadcasthost
::1             localhost
127.0.0.1       phpmyadmin.myhost

```

追加できたら「esc」キーからの「:wq」で閉じる。


パスを通す。

```bash:
echo 'export PATH="/opt/homebrew/bin:$PATH"' >> ~/.zshrc
```

ターミナルを再起動するか、sourseで.zshrc反映。

```bash:
source ~/.zshrc
```

whichでちゃんと切り替わったか確認。

```bash:
which apachectl
/opt/homebrew/bin/apachectl
which httpd
/opt/homebrew/bin/httpd
```
/opt/homebrew/binになってたらOK。

Apacheの全設定が完了したので起動してみる。

```bash:hosts
sudo apachectl start
Password:
```

起動後ブラウザで以下にアクセス。
http://localhost/

![itworks.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/229958/7e39b452-6a4c-cc36-09e2-397b96b03cea.png)

「It works!」と表示されたらOK。


##MySQLのインストール
HomebrewでMySQLを確認。

```bash:
brew search mysql
==> Formulae
automysqlbackup                   mysql++                           mysql-client@5.7                  mysql-sandbox                     mysql@5.6                         mysqltuner
mysql                             mysql-client                      mysql-connector-c++               mysql-search-replace              mysql@5.7                         qt-mysql
==> Casks
homebrew/cask/mysql-connector-python     homebrew/cask/mysql-shell                homebrew/cask/mysql-utilities            homebrew/cask/navicat-for-mysql          homebrew/cask/sqlpro-for-mysql
```

確認できたのでmysql@5.7をインストール。

```bash:
brew install mysql@5.7
mysql@5.7: stable 5.7.34 (bottled) [keg-only]
Open source relational database management system
https://dev.mysql.com/doc/refman/5.7/en/
/opt/homebrew/Cellar/mysql@5.7/5.7.34 (319 files, 234.0MB)
  Poured from bottle on 2021-05-21 at 00:12:20
From: https://github.com/Homebrew/homebrew-core/blob/HEAD/Formula/mysql@5.7.rb
License: GPL-2.0-only
==> Dependencies
Build: cmake ✘
Required: openssl@1.1 ✔
==> Caveats

〜省略〜

If you need to have mysql@5.7 first in your PATH, run:
  echo 'export PATH="/opt/homebrew/opt/mysql@5.7/bin:$PATH"' >> ~/.zshrc

For compilers to find mysql@5.7 you may need to set:
  export LDFLAGS="-L/opt/homebrew/opt/mysql@5.7/lib"
  export CPPFLAGS="-I/opt/homebrew/opt/mysql@5.7/include"

〜省略〜
```

例の如くパスを通す必要があると出るので通す。

```bash:
echo 'export PATH="/opt/homebrew/opt/mysql@5.7/bin:$PATH"' >> ~/.zshrc
echo 'export PKG_CONFIG_PATH="/usr/local/opt/mysql@5.7/lib/pkgconfig"' >> ~/.zshrc
```

ターミナルを再起動するか、sourseで.zshrc反映。

```bash:
source ~/.zshrc
```

###MySQLの設定

####初期設定
mysql_secure_installationで初期設定を行う

```bash:
mysql_secure_installation
```

```bash:
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: Y
```

VALIDATE PASSWORD PLUGIN　を使うかどうか→Y

```bash:
There are three levels of password validation policy:

LOW    Length >= 8
MEDIUM Length >= 8, numeric, mixed case, and special characters
STRONG Length >= 8, numeric, mixed case, special characters and dictionary                  file

Please enter 0 = LOW, 1 = MEDIUM and 2 = STRONG: 0
```

強度はローカルなのでLOWでOK→0

```bash:
Please set the password for root here.

New password:

Re-enter new password:

```

パスワードの設定→（rootパスワード、忘れないように）

```bash:
Estimated strength of the password: 50
Do you wish to continue with the password provided?(Press y|Y for Yes, any other key for No) : y
```

パスワードの強度これで良いか聞かれる→Y

```bash:
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
```

初期であるanonymousユーザー消すか→Y

```bash:
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
```

リモートでrootログインできなくするか→Y

```bash:
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
```

初期であるtestデータベース消すか→Y

```bash:
 - 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
```

設定を今すぐ反映するか→Y

```bash:
Success.

All done!
```

初期設定終了。

####my.cnf設定
次はmy.cnfの確認。

```bash:
mysql --help | grep my.cnf
                      order of preference, my.cnf, $MYSQL_TCP_PORT,
/etc/my.cnf /etc/mysql/my.cnf /opt/homebrew/etc/my.cnf ~/.my.cnf
```

/opt/homebrew/etc/my.cnfがあるのでこれを編集

```bash:
vim /opt/homebrew/etc/my.cnf
```

「character-set-server = utf8」と「default_password_lifetime = 0」を最終行に追加。

```bash:
[mysqld]
# Only allow connections from localhost
bind-address = 127.0.0.1
character-set-server = utf8
default_password_lifetime = 0
```

####起動テスト

root、先ほど初期設定で入力したパスワードで起動。

```bash:
mysql -u root -p
```

無事mysqlが立ち上がったら、まず新しくデータベースを作成する。
database_nameは目的のものを作ればOK。

```bash:mysql
CREATE DATABASE database_name;
```

ユーザーを作る。
your_name、your_passwordは好きに変えてOK。

```bash:mysql
CREATE USER 'your_name'@'localhost' IDENTIFIED BY 'your_password';
```

作成したユーザーに作成したデータベースの操作権限を付与する。

```bash:mysql
GRANT ALL PRIVILEGES ON database_name.* TO 'your_name'@'localhost';
```

設定を反映する

```bash:mysql
FLUSH PRIVILEGES;
```

完了、exitでmysqlを閉じる。

```bash:mysql
exit;
```

##composerのインストール

composerをインストール。

```bash:mysql
brew install composer
```

##Node.jsのインストール

nodebrewをインストール・・・としようとしたが、
2021年5月現在、どうもHomebrewからインストールするとうまくいかない模様。
調べるとM1ではnodebrew1.1.0から正式対応な模様。

とりま、以下のやり方でインストール。

```bash:
curl -L git.io/nodebrew | perl - setup
```

また例の如くパスを通す必要があると出るので通す。

```bash:
echo 'export PATH=$HOME/.nodebrew/current/bin:$PATH' >> ~/.zshrc
```

ターミナルを再起動するか、sourseで.zshrc反映。

```bash:
source ~/.zshrc
```

バージョンが最新であることを確認。

```bash:
nodebrew -v
nodebrew 1.1.0
```

インストール可能なnode.jsのバージョン確認。

```bash:
nodebrew ls-remote
v0.0.1    v0.0.2    v0.0.3    v0.0.4    v0.0.5    v0.0.6

〜省略〜
v14.16.1  v14.17.0

〜省略〜
v15.13.0  v15.14.0

v16.0.0   v16.1.0   v16.2.0

〜省略〜

```

Apple Siliconにネイティブ対応しているのはv15.x以降。
だけど既存プロジェクトで動作確認しているのはv14.x。
１４も動くがせっかくなのでとりあえずv15.xを入れる。

が、ここでエラーが発生。
どうもarm版のデータが存在しない模様（なんでやねん）。
調べると、compileからだといけるとのこと。

なので一旦安定版を入れる。

```bash:
nodebrew install-binary stable
```

過去の案件がstable版では動かないことがわかっているので、v15もコンパイルしていれる。

```bash:
nodebrew compile v15.6.0
```

↑おおよそ１時間近くかかります。
この後v14も同様に入れて、とりあえずインストールできているか確認。

```bash:
nodebrew list
v14.17.0
v15.6.0
v16.2.0
```

３つともインストールできた。
とりあえず、v15を動かすことにする。

```bash:
nodebrew use v15.6.0
```

毎度お馴染み、パスを通す。

```bash:
echo 'export PATH=$HOME/.nodebrew/current/bin:$PATH' >> ~/.zshrc
```

ターミナルを再起動するか、sourseで.zshrc反映。

```bash:
source ~/.zshrc
```

バージョン確認できたら完了。

```bash:
node -v
v15.6.0
```

```bash:
npm -v
7.4.0
```

##プロジェクト環境を用意して移動、準備

クローンするなりしてプロジェクト環境を用意。
cdディレクトリに移動。

今回は、laravelのプロジェクト。
composerのインストール。

```bash:
composer install
```

Node.jsのパッケージをインストール。

```bash:
npm install
```

README.mdなどを読みながらプロジェクトに必要な設定を行う。

```bash:
//envを設定したり
cp .env.example .env

//php artisanしたり
php artisan key:generate
php artisan migrate

〜他諸々設定〜
```

↑↑↑
これらは一例であり、必須なものでもない。
不明な場合はプロジェクトの担当者に確認すること。






参考：

https://zenn.dev/myb/articles/4b1dd3821703aa2ac95b
https://qiita.com/shibukawa/items/797b7cbb7e530842e6f7
https://qiita.com/shibukawa/items/797b7cbb7e530842e6f7
https://zenn.dev/yaeda/scraps/4f17d8b2d3ad4c