Macの環境構築、PHP用環境構築

# 前提

## 対象
* web系エンジニア（特にPHPバックエンド）

## 環境
以下の環境で確認しました。
Appleシリコンmacなら同様にできると思います。
* macos Sonoma
* MacBook Pro - Apple M3 Pro

## 前置き
* intel MacからM3 Macに移行するにあたって移行ツールを使用せずに手動移行したのでその備忘
* 一緒に働く人へ環境構築方法を共有したいのでついでにわかりやすく書こうと思った
* PHP開発はDockerで行うがローカルにもPHPが必要な場面があるので入れている
* ~~phpstan以外の静的解析~~、~~Laravel向けのVS Code拡張~~、AI系のVS Code拡張、~~Node.jsとそのバージョン管理~~については追記したい気持ちがある
  * phpcs、Laravel向け拡張機能、asdfによるNode.js管理について追記しました

# はじめに

## システム設定
システム設定アプリから行う内容です

* トラックパッドによるポインタの移動速度
  * トラックパッド > 軌跡の速さ > 最も速くする
* トラックパッドのタップでクリックができるようにする
  * トラックパッド > タップでクリック　（お好みで）
* アップデート
  * 一般 > ソフトウェアアップデートでアップデートがあれば行う
* ファイアウォール設定
  * ネットワーク > ファイアウォールをON
* キーボード設定
  * 入力ソースの「編集」　> スペースバーを２回押してピリオドを入力をOFF
  * 他の設定もお好みで変更
* ポインタの設定 
  * アクセシビリティ > ポインタの設定で大きくしたり色を変えたり　（お好みで）

## Finder設定
Finderで行う設定です

* Finder > 設定 > 詳細 > すべてのファイル名拡張子を表示をON
* 表示 > パスバーを表示
* 表示 > ステータスバーを表示

## ターミナルで行う設定
ターミナルアプリを開いて行う設定です。

- 隠しファイルを表示
  ```shell
  $ defaults write com.apple.finder AppleShowAllFiles YES

  # 設定をすぐに反映させるには以下
  $ killall Finder

  # 元に戻す場合は以下
  $ defaults delete com.apple.finder AppleShowAllFiles
  ```
　
- スクショの保存場所を変更
  ```shell
  $ mkdir ~/ScreenShots
  $ defaults write com.apple.screencapture location ~/ScreenShots/

  # 設定をすぐに反映させるには以下
  $ killall SystemUIServer
  ```
# HomeBrew
## インストール
以下にインストールコマンドがあるのでコピーする。

https://brew.sh/

```shell
/bin/bash -c "$(curl -fsSL https://raw.githubusercontent.com/Homebrew/install/HEAD/install.sh)"
```
パスワードやエンターを求められるので、都度入力する。

インストール後以下のように表示されたので言われたことを実行する。
```
- Run these two commands in your terminal to add Homebrew to your PATH:
    (echo; echo 'eval "$(/opt/homebrew/bin/brew shellenv)"') >> /Users/ユーザ名/.zprofile
    eval "$(/opt/homebrew/bin/brew shellenv)"
- Run brew help to get started
```
```shell
$ (echo; echo 'eval "$(/opt/homebrew/bin/brew shellenv)"') >> /Users/ユーザ名/.zprofile
$ eval "$(/opt/homebrew/bin/brew shellenv)"
```

# 必須アプリ

## ランチャー
Alfredに課金済みであればそちらを。

### Raycast

https://www.raycast.com/

```shell
$ brew install --cask raycast
```

cmd+spaceを割り当てるためSpotlight検索をoffにする
1. システム設定　> キーボード　> キーボードショートカット
1. Spotlight > Splotlight検索を表示をOFF

古いmacから移行する場合は、古いmacで設定をエクスポートしたものをインポートする
1. 古いmacのRaycastの設定 > Advanced > Export
1. 新しいmacのRaycastの設定 > Advanced > Import でExportで作ったファイルを選択


## ブラウザ
Safariは元から入っているので、Clomium製ブラウザとFireFoxを入れる。

### Clomium

Arc, Brave, Chrome, Edge, Vivaldi, など

https://arc.net/

```shell
$ brew install --cask arc
```

ArcのSyncはiCloud経由で行えるようになっている。
パスワードなどを移行する場合はClomium系共通でGoogleの設定からエクスポートしたものをインポート。

### FireFox
```shell
$ brew install --cask firefox
```

## ターミナル
好きなものを。Warpはメモリ使用量が多い。。

### Warp

https://www.warp.dev/

AIにやりたいことを伝えるとコマンドを教えてくれるターミナル。

```shell
$ brew install --cask warp
```

### iTerm2

```shell
$ brew install --cask iterm2
```

## エディタ
後述のPHPの設定はVS Code互換エディタで解説するのでここでは対象エディタのみを紹介します。

### Cursor

https://cursor.sh/

```shell
$ brew install --cask cursor
```

### VS Code

https://code.visualstudio.com/

```shell
$ brew install --cask visual-studio-code
```

## Docker

### Docker Desktop

https://www.docker.com/get-started/

## コミュニケーションツール
組織で使用しているものを。


画面共有機能を使う場合、あらかじめ設定をしておかないと、いざ共有をしようとしたときにアプリの再起動が必要になるので注意。
設定は、システム設定 > プライバシーとセキュリティ　> 画面収録とシステムオーディオ に追加する。

![スクリーンショット 2024-01-22 1.36.39.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/87345/943b8185-0043-ec51-b6bc-149300c14af7.png)


### Zoom

https://www.zoom.us/

```shell
$ brew install --cask zoom
```

### Slack

https://slack.com/intl/ja-jp

```shell
$ brew install --cask slack
```

### Discord

https://discord.com/

```shell
$ brew install --cask discord
```

# 一般アプリ
以下からは任意のアプリ

## 日本語入力切り替え
usキーボードのデフォルトの切り替え方法から変えたい場合のみ。
⌘英かなはすぐに落ちるのでkarabinerを利用する。

### karabiner

https://karabiner-elements.pqrs.org/

左⌘ を押すと英語、右⌘ を押すと日本語、のようにできる。

```shell
$ brew install --cask karabiner-elements
```

## ノート
お好きなのを。PCが壊れても復帰できるような仕組みを構築できるものにする。

### Notion

https://www.notion.so/ja-jp

```shell
$ brew install --cask notion
```

# 開発用アプリ

## Gitクライアント

色々あるので好きなのを。

https://git-scm.com/downloads/guis

### GitKraken

https://www.gitkraken.com/

有料。

```shell
$ brew install --cask gitkraken
```

### SourceTree

https://www.sourcetreeapp.com/

日本語に対応している。

```shell
$ brew install --cask sourcetree
```

## データベースクライアント

色々あるので好きなのを。
古いバージョンのDBを扱う場合、最近のアプリは対応していないことがある。

### DBeaver

https://dbeaver.io/

```shell
$ brew install --cask dbeaver-community
```

### MySQL Workbench

https://www.mysql.com/jp/products/workbench/

```shell
$ brew install --cask mysqlworkbench
```

# CLIツール

## プロンプト

最低限プロンプトに、gitリポジトリ内にいる場合にどのブランチにいるかわかるような表示を出しましょう。
プロンプトだけならStarshipが簡単だが、zshの設定も一緒にできるPreztoの方がトータルで楽かもしれない。

### Prezto

https://github.com/sorin-ionescu/prezto

```shell
$ git clone --recursive https://github.com/sorin-ionescu/prezto.git "${ZDOTDIR:-$HOME}/.zprezto"

# このときすでにzshの設定ファイルが存在したらエラーになるので消す　or リネームしておく
$ setopt EXTENDED_GLOB
for rcfile in "${ZDOTDIR:-$HOME}"/.zprezto/runcoms/^README.md(.N); do
  ln -s "$rcfile" "${ZDOTDIR:-$HOME}/.${rcfile:t}"
done

# 設定
# 順番があるらしいが「prompt」より前に記述しておけば良さそう
# https://github.com/sorin-ionescu/prezto/tree/master/modules/syntax-highlighting
$ vim ~/.zpreztorc
zstyle ':prezto:load' pmodule \
  'environment' \
  'terminal' \
  'editor' \
  'history' \
  'directory' \
  'spectrum' \
  'utility' \
  'completion' \
  'history-substring-search' \
+ 'archive' \
+ 'autosuggestions' \
+ 'git' \
+ 'syntax-highlighting' \
  'prompt'

# Auto set the tab and window titles.
+ zstyle ':prezto:module:terminal' auto-title 'yes'

# テーマ設定
$ vim ~/.zpreztorc
  # Set the prompt theme to load.↲
  # Setting it to 'random' loads a random theme.↲
  # Auto set to 'off' on dumb terminals.↲
+ zstyle ':prezto:module:prompt' theme 'powerlevel10k'↲

# 設定後、iTerm2かデフォルトターミナルで開くとプロンプト設定用の質問が続くので
# 答えていくとプロンプトが出来上がる
```

### Starship

https://starship.rs/ja-jp/

```shell
$ brew install starship
# フォント
$ brew tap homebrew/cask-fonts
# フォントを選んでインストール
$ brew install --cask font-hack-nerd-font
```

### 手動

以下、参考になりそう。

https://zenn.dev/sprout2000/articles/bd1fac2f3f83bc

# vim
### AstroNvim

```shell
$ brew install neovim

# AstroNvim
$ git clone --depth 1 https://github.com/AstroNvim/AstroNvim ~/.config/nvim

# 面倒なので.zshrcに「alias v='nvim'」などと入れておくと良い
$ nvim
```

# git設定
### git導入
1. ターミナルで`git --version`と入れてみる。
1. gitが入っていなければコマンドラインデベロッパーツールのインストールを勧められるので行う

### git config
gitのユーザ設定を行う（社用PCの場合は会社リポジトリのアカウントに合わせる、など）

```shell
$ git config --global user.name '自分の名前'
$ git config --global user.email '自分のメールアドレス'
# 大文字小文字の区別をつける
$ git config --global core.ignorecase false
```

現在の設定確認
```shell
$ git config --global -l
```
# GitHub設定
設定ファイルをGitHubに置いている場合は必要

## SSH認証キーの作成

```shell
$ mkdir -p ~/.ssh/github/
$ ssh-keygen -t rsa -f ~/.ssh/github/id_rsa
```
2~3質問をされるのでエンターを押すだけ

```shell
$ vi ~/.ssh/config
```
```config:config
Host github github.com
  HostName github.com
  IdentityFile ~/.ssh/github/id_rsa
  User git
```
## GitHubへキーを登録
キーの中身をクリップボードへコピー
```shell
$ pbcopy < ~/.ssh/github/id_rsa.pub
```
設定ページ（2024.1月）

https://github.com/settings/keys

「New SSH key」ボタンから登録

# VS Code

## 移行

旧環境から移行する場合は以下をコピーしてくるか設定の同期機能を使用する。

|内容|ディレクトリ名|パス|
|---|---|---|
|拡張機能| .vscode | ~/.vscode |
|キーバインド等の設定| User | ~/Library/Application  Support/Code/User  |

## 拡張機能（一般）

### Japanese Language Pack for Visual Studio Code

https://marketplace.visualstudio.com/items?itemName=MS-CEINTL.vscode-language-pack-ja

日本語化。

### indent-rainbow

https://marketplace.visualstudio.com/items?itemName=oderwat.indent-rainbow

インデントを見やすく色分け。

（補足）デフォルトのカッコの色と揃える

https://tech-blog.cloud-config.jp/2021-12-08-vscode-rainbow/

### Code Spell Checker

https://marketplace.visualstudio.com/items?itemName=streetsidesoftware.code-spell-checker

スペルチェック。

### TODO Highlight v2

https://marketplace.visualstudio.com/items?itemName=jgclark.vscode-todo-highlight

`TODO:`と書いたところをハイライト。

### GitLens

https://marketplace.visualstudio.com/items?itemName=eamodio.gitlens

誰がどのコミットで書いたコードかすぐ分かる。チーム用。

### Iceberg

https://marketplace.visualstudio.com/items?itemName=harg.iceberg

テーマ。好きなものを。

### vscode-icons

https://marketplace.visualstudio.com/items?itemName=vscode-icons-team.vscode-icons

アイコン。好きなものを。

## 拡張機能（PHP）

### PHP Intelephense

https://marketplace.visualstudio.com/items?itemName=bmewburn.vscode-intelephense-client

コード補完やuse文の自動挿入、定義ジャンプなど、PHPを書くなら必要不可欠な拡張機能。

以下の設定が必要。

1.  拡張機能で「`@builtin php`」を検索
1.  「PHP 言語機能」を選択
1.  無効にする


### PHP DocBlocker

https://marketplace.visualstudio.com/items?itemName=neilbrayfield.php-docblocker

Docコメント入力を補完。

### phpstan

https://marketplace.visualstudio.com/items?itemName=SanderRonde.phpstan-vscode

自動でPHPStanに静的解析させる場合に必要。また、その際はローカルでPHPが動作するように。

## 拡張機能（Laravel）

### Laravel Blade Snippets

https://marketplace.visualstudio.com/items?itemName=onecentlin.laravel-blade

bladeファイルのシンタックスハイライト、ディレクティブの補完など。

### Highlight Matching Tag

https://marketplace.visualstudio.com/items?itemName=vincaslt.highlight-matching-tag

開始タグと閉じタグがハイライトされる。HTMLはもちろんbladeファイルでも適応される。

# VS Code 設定

以下のような感じでお好みで設定していく。

```json:settings.json
{
    // 保存時自動フォーマット
    "editor.formatOnSave": true,
    // 空白文字表示を有効に
    "editor.renderWhitespace": "all",
    // 行末やファイル末尾の空白文字を削除
    "files.trimTrailingWhitespace": true,
    // ファイル末尾に改行必須
    "files.insertFinalNewline": true,

    //========================================================================
    // 言語毎の設定
    //========================================================================

    "[php]": {
        // タブサイズの設定
        "editor.tabSize": 4
    },
    "[markdown]": {
        // タブサイズの設定
        "editor.tabSize": 2,
        // 行末やファイル末尾の空白文字を削除しない
        "files.trimTrailingWhitespace": false
    }
}
```

# Node.js & yarn

Node.jsはプロジェクトごとに使用バージョンが異なるのでバージョン管理させる。
yarnのバージョン管理もできるのasdfにした。Voltaでもできそうではあった。

## asdfインストール

以下を見ながらインストール。

https://asdf-vm.com/guide/getting-started.html

https://qiita.com/ucan-lab/items/0b854cfaa9d7c8ede106

```shell
# 依存ライブラリの導入（curlとgitも必要と書いてあるが導入済みなので以下のみ）
$ brew install coreutils

$ brew install asdf
```

brewでインストールできたらzshを使っている場合は以下。

```shell
$ echo -e "\n. $(brew --prefix asdf)/libexec/asdf.sh" >> ${ZDOTDIR:-~}/.zshrc
```

plugin一覧を見てみる。

```shell
$ asdf plugin list all
...
nodejs                        https://github.com/asdf-vm/asdf-nodejs.git
...
yarn                          https://github.com/twuni/asdf-yarn.git
...
```

### Node.js

asdfでNode.jsを管理できるようにする。

```shell
$ asdf plugin add nodejs https://github.com/asdf-vm/asdf-nodejs.git
```

```shell
# node js インストール可能バージョン一覧
$ asdf list all nodejs
```

```shell
# バージョンを指定してインストール
$ asdf install nodejs 18.15.0
```

導入するプロジェクトのルートに移動して使用バージョンを指定する。

```shell
# バージョンを指定して選択
$ asdf local nodejs 18.15.0
```

### yarn

asdfでyarnを管理できるようにする。

https://github.com/twuni/asdf-yarn

```shell
$ asdf plugin-add yarn
```

```shell
# yarn インストール可能バージョン一覧
$ asdf list all yarn
```

```shell
# バージョンを指定してインストール
$ asdf install yarn 1.22.19
⛔ Missing one or more of the following dependencies: tar, gpg
```

エラーが出た！ tarとgpgが必要と出ている。
ただ、以下で確認するとわかるがtarはmacにデフォルトで入っている。

```shell
$ which tar
/usr/bin/tar
```
gpgがない。

```shell
$ which gpg
gpg not found
```

gpg入れる。

```shell
$ brew install gpg
```

再度試して成功。

```shell
asdf install yarn 1.22.19
```

導入するプロジェクトのルートに移動して使用バージョンを指定する。

```shell
# バージョンを指定して選択
$ asdf local yarn 1.22.19
```

確認。

```shell
asdf list
nodejs
 *18.15.0
yarn
 *1.22.19
```


# PHP

PHPStanのためにローカルへPHPを入れる。
asdfを導入したのでそちらで入れてもいいかもしれない（brewで依存ライブラリをたくさん入れないといけないところが気にはなっている）。

他にもphpenvというバージョン管理ツールもある。

## PHPインストール

好きなバージョンのPHPを必要なだけ入れる。

https://github.com/shivammathur/homebrew-php

```shell
$ brew install shivammathur/php/php@8.3
$ brew install shivammathur/php/php@8.1
```

```shell
# システムのデフォルトとして使用したPHPをリンク
$ brew link --overwrite --force shivammathur/php/php@8.3

# バージョンを確認してみる
$ php -v                                                                                
PHP 8.3.2 (cli) (built: Jan 16 2024 13:46:41) (NTS)
Copyright (c) The PHP Group
Zend Engine v4.3.2, Copyright (c) Zend Technologies
```

## ディレクトリごとに使用するPHPを設定する

ディレクトリごとに環境変数を分けられるようにdirenvというツールを入れる。

```shell
$ brew install direnv
# .zshrcに有効化処理を書き込む
$ echo 'eval "$(direnv hook zsh)"' >> ~/.zshrc
```

```shell
$ cd プロジェクトディレクトのパス
# .envrcファイルを作成、環境変数PATHの内容を変える
$ echo 'export PATH=$(brew --prefix)/opt/php@8.1/bin:$PATH' > .envrc 
# direnvを有効にする
$ direnv allow .
# shellを読み込み直す
$ source ~/.zshrc

# バージョンを確認してみる、このディレクトリではPHP8.1になっている
$ php -v
PHP 8.1.27 (cli) (built: Dec 19 2023 20:35:55) (NTS)
Copyright (c) The PHP Group
Zend Engine v4.1.27, Copyright (c) Zend Technologies
    with Zend OPcache v8.1.27, Copyright (c), by Zend Technologies

```

チーム開発などで、gitリポジトリに`.envrc`を追加したくない場合はリポジトリのルートで以下を行う。
```shell
$ echo '.envrc' >> .git/info/exclude    
```

# PHP Code Sniffer

* プロジェクト単位では導入していない場合が多いのでローカルにダウンロードして使う
* チーム開発で整形すると良くない場合があるので、`PHP-CS-Fixer`ではなく`phpcs`を入れる
  * どちらを使うかは関わるプロジェクトによると思います

### ローカルへダウンロード

PHP_CodeSnifferのリポジトリ  
※2024くらいからリポジトリが移行しました

https://github.com/PHPCSStandards/PHP_CodeSniffer/

GitHubからCloneする方法が載っていたので、ローカルにはcomposerもないのでその方法で行う。
ローカルでComposer使っている場合はそちらを使う方法でOK。

```shell
$ git clone https://github.com/PHPCSStandards/PHP_CodeSniffer.git
```

このリポジトリの`bin`ディレクトリに実行ファイルがある。

### VS Code設定

phpcsという拡張機能を入れる。

https://marketplace.visualstudio.com/items?itemName=shevaua.phpcs

拡張機能の設定に、`Phpcs:EXecutable Path`の項目があるので先ほどの`bin`ディレクトリ内の`phpcs`までのパスを書く。

# 参考
色々参考にさせて頂きました。網羅しきれていないです、すみません。
* Mac を買ったら必ずやっておきたい初期設定
  * https://qiita.com/ucan-lab/items/c1a12c20c878d6fb1e21
* macの開発環境構築
  * https://zenn.dev/renoinn/scraps/90b7dd52d93a0e
* ぼくのかんがえたさいきょうの MacBook 環境構築
  * https://zenn.dev/hasehiro0828/books/setup-awesome-environment
* Macで複数バージョンのPHPを楽に使い分ける
  * https://zenn.dev/ttskch/articles/e6f6b2af2972ab