開発環境構築手順書 2024

# macOS 環境構築

## 更新履歴

- 2024/03/28 macOS Ventura 14.4.1 M2 Proの動作確認を実施

## 概要
新規購入したApple silicon版のmacOS上で開発環境を整えるための手順書
dotfilesによる自動化手法は認識していますが、アンコントローラブルはなるべく避けたいため、意図的に手順書としています。

## 事前準備
- [ ] 1. macOSの初回セットアップを行う
- [ ] 2. ファイアーウォールが有効にする
- [ ] 3. FileVaultを有効にする
- [ ] 4. セキュリティソフトをインストールする

## 前提
コマンドは特別な明記がない限り、一行ずつ実行していく。
「{...} >> ~/.zshrc」のような括弧で囲まれたブロックコマンドの場合は、全てコピーして実行してください。
## 手順
### Jetbrains社製ソフトウェアのインストール
- [ ] 1. [Jetbrains ToolBox](https://www.jetbrains.com/ja-jp/toolbox-app/)のインストール
- [ ] 2. ToolBoxから[IntelliJ IDEA](https://www.jetbrains.com/ja-jp/idea/)のインストール
- [ ] 3. ToolBoxから[Pycharm](https://www.jetbrains.com/ja-jp/pycharm/)のインストール
- [ ] 4. ToolBoxから[WebStorm](https://www.jetbrains.com/ja-jp/webstorm/)のインストール
- [ ] 5. ToolBoxから[CLion](https://www.jetbrains.com/ja-jp/clion/)のインストール

### XCode Command Line Tool
- [ ] 1. terminal.appを起動
- [ ] 2. XCode Command Line Tool

```bash
xcode-select --install
```
- [ ] 3. ライセンスに同意

```bash
sudo xcodebuild -license
```
### Zshフレームワークのインストール
#### ZInit

- [ ] 1. terminal.appを起動
- [ ] 2. ZInit本体のインストール

```bash
bash -c "$(curl --fail --show-error --silent --location https://raw.githubusercontent.com/zdharma-continuum/zinit/HEAD/scripts/install.sh)"
```
- [ ] 3. ZInitプラグインのインストール

```bash
  {
    echo "\n\n# Zinit Plugin"
    echo "zinit light zsh-users/zsh-syntax-highlighting"
    echo "zinit light zsh-users/zsh-history-substring-search # Need to write after highlighting"
    echo "zinit light zsh-users/zsh-autosuggestions"
    echo "zinit light zsh-users/zsh-completions"
    echo "zinit light zdharma-continuum/history-search-multi-word"
  } >> ~/.zshrc
```
- [ ] 4. Zshターミナルテーマのインストール

```bash
  {
    echo "\n# Terminal Theme"
    echo "## Prune (https://github.com/sindresorhus/pure)"
    echo "zinit ice compile'(pure|async).zsh' pick'async.zsh' src'pure.zsh'"
    echo "zinit light sindresorhus/pure"
    echo "zstyle :prompt:pure:path color cyan"
    echo "zstyle :prompt:pure:git:branch color yellow"
    echo "zstyle :prompt:pure:virtualenv color cyan"
    echo "PURE_CMD_MAX_EXEC_TIME=180"
  } >> ~/.zshrc
```
- [ ] 5. Zshスタイル設定

```bash
  {
    echo "\n# Zsh Style"
    echo "zstyle ':completion:*' menu yes select"
    echo "zstyle ':completion:*' file-list all"
  } >> ~/.zshrc
```

- [ ] 6. エイリアスの設定(任意)

```bash
  {
    echo "\n# Alias"
    echo "alias c='clear'"
  } >> ~/.zshrc
```
- [ ] 7. ~/.zshrcの読み込み
どのパターンでも可能

```bash
# パターン1. zshを呼び出す
zsh

# パターン2. sourceで読み込む
source ~/.zshrc

# パターン3. ターミナルを再起動か新規ウィンドウを表示
```

### Homebrew
- [ ] 1. terminal.appを起動
- [ ] 2. Homebrew本体のインストール

```bash
/bin/bash -c "$(curl -fsSL https://raw.githubusercontent.com/Homebrew/install/HEAD/install.sh)"
```

```bash:output
# パスワードの入力
# ==> Checking for `sudo` access (which may request your password)...
# Password:

# 文字通りEnterキーを押下
# Press RETURN/ENTER to continue or any other key to abort:
```

- [ ] 3. Homebrewの設定

```bash
  {
    echo "\n# Homebrew"
    echo "# Set PATH, MANPATH, etc., for Homebrew."
    echo "eval \"\$(/opt/homebrew/bin/brew shellenv)\""
  } >> ~/.zprofile
```

- [ ] 4. Homebrewの読み込み

```bash
eval "$(/opt/homebrew/bin/brew shellenv)"
```

- [ ] 5. Homebrewの動作確認

```bash
brew --version
```


- [ ] 6. 「~/.Brewfile」として、下記内容を記入して保存する。
microsoft-edgeのインストール時にPasswordが要求されます。

<details><summary>長くなったので折りたたんでいます。</summary><div>

```text:.Brewfile
# 前提環境
# - XCode CLI Toolがインストール済みである事
# - MacAppStoreで予めログインしている事
# - MacAppStoreで予め購入済みである事

###################
# 公式リポジトリ一覧 #
###################

tap "homebrew/bundle"
tap "homebrew/cask"
tap "homebrew/cask-versions"
tap "homebrew/core"

##########################
# Normal Depens Binaries #
##########################

####################
# 第0階層 (依存なし) #
####################

brew "ca-certificates"
brew "cmake"
brew "gdbm"
brew "gettext"
brew "gmp"
brew "go"
brew "lua"
brew "lz4"
brew "m4"
brew "mandoc"
brew "mas"
brew "mpdecimal"
brew "nodebrew"
brew "pcre2"
brew "pkg-config"
brew "readline"
brew "texinfo"
brew "xz"
brew "zlib"

########################
# 第1階層 (第0階層に依存) #
########################

brew "autoconf" # M4
brew "docker-compose" # Go
brew "git" # GetText, Pcre2
brew "go-md2man" # Go
brew "isl" # Gmp
brew "libcbor" # Cmake
brew "libtool" # M4
brew "mpfr" # Gmp, TexInfo
brew "ncurses" # Pkg-Config
brew "openssl@3" # Ca-Certificates
brew "sqlite" # ReadLine

##########################
# 第2階層 (第0~1階層に依存) #
##########################

brew "automake" # AutoConf
brew "berkeley-db" # OpenSSL
brew "docker" # Go, Go-MD2Man
brew "libfido2" # Cmake, LibCbor, ManDoc, OpenSSL, Pkg-Config
brew "libmpc" # Gmp, Mpfr
brew "libssh2" # OpenSSL
brew "pyenv" # AutoConf, OpenSSL, Pkg-Config, ReadLine
brew "tig" # NCurses, ReadLine
brew "zstd" # Cmake, Lz4, Xz

##########################
# 第3階層 (第0~2階層に依存) #
##########################

brew "gcc" # Gmp, Isl, Mpfr, LibMpc, Zstd
brew "libevent" # AutoConf, AutoMake, LibTool, OpenSSL, Pkg-Config
brew "libyaml" # AutoConf, AutoMake, LibTool
brew "oniguruma" # AutoConf, AutoMake, LibTool
brew "perl" # Berkeley-DB, Gdbm
brew "ruby-build" # AutoConf, AutoMake, LibTool

##########################
# 第4階層 (第0~3階層に依存) #
##########################

brew "jq" # Oniguruma
brew "mysql-client" # Cmake, LibEvent, LibFido2, OpenSSL, Pkg-Config, ZLib, Zstd 
brew "rbenv" # Ruby-Build
brew "ruby" # LibYAML, OpenSSL, Pkg-Config, ReadLine

##########################
# Python Depens Binaries #
##########################

#########################################
# 第0階層 (Normal Depens Binaries に依存) #
#########################################

brew "python@3.12" # MpDecimal, OpenSSL, Pkg-Config, SqLite, Xz

##################################################
# 第1階層 (第0階層 + Normal Depens Binaries に依存) #
##################################################

brew "docutils" # Python@3.12
brew "ninja" # Python@3.12
brew "six" # Python@3.12

####################################################
# 第2階層 (第0~1階層 + Normal Depens Binaries に依存) #
####################################################

brew "aws-sso-util" # Python@3.12, Six
brew "rust" # libgit2, libssh2, llvm, openssl@3, pkg-config

####################################################
# 第3階層 (第0~2階層 + Normal Depens Binaries に依存) #
####################################################

brew "awscli" # Cmake, DocUtils, Python@3.12, Rust, Six

####################################################
# 第4階層 (第0~3階層 + Normal Depens Binaries に依存) #
####################################################

brew "vim" # GetText, Lua, NCurses, Perl, Python@3.12, Ruby

#############
# Cask 一覧 #
############

cask "alfred"
cask "deepl"
cask "drawio"
cask "firefox-developer-edition", args: { language: "ja" }
cask "google-chrome-dev"
cask "iterm2"
cask "microsoft-edge"
cask "postman"
cask "rancher"
cask "the-unarchiver"
cask "visual-studio-code"

#####################
# Mac App Store 一覧 #
#####################

mas "Microsoft To Do", id: 1274495053
```
</div></details>

- [ ] 7. brew bundleを実行してインストール

```bash
brew bundle --global
```
- [ ] 8. Homebrewのキャッシュ削除

```bash
brew cleanup --prune=all
```

- [ ] 9. nodebrewのディレクトリ作成

```bash
nodebrew setup_dirs
```

- [ ] 10. zshrcへ追加

```bash
  {
    echo "\n# Nodebrew"
    echo "export PATH=\$HOME/.nodebrew/current/bin:\$PATH"
    echo "\n# Pyenv"
    echo "export PYENV_ROOT=\"$HOME/.pyenv\""
    echo "eval \"\$(pyenv init --path)\""
    echo "eval \"\$(pyenv init -)\""
    echo "\n# Rbenv"
    echo "eval \"\$(rbenv init - zsh)\""
    echo "\n# Mysql Client"
    echo "export PATH=\"/opt/homebrew/opt/mysql-client/bin:\$PATH\""
  } >> ~/.zshrc
```
- [ ] 11. 補完機能の設定

```bash
sed -i '' -e $'1s/^/autoload -Uz compinit \\&\\& compinit\\\n/' ~/.zshrc
```

- [ ] 12. ~/.zshrcの読み込み
どのパターンでも可能

```bash
# パターン1. zshを呼び出す
zsh

# パターン2. sourceで読み込む
source ~/.zshrc

# パターン3. ターミナルを再起動か新規ウィンドウを表示
```

### nodebrew
- [ ] 1. NodeJSの最新版を控える

NodeJS Ver: 

```bash
nodebrew ls-remote
# example) v17.2.0
```
- [ ] 2. NodeJSの最新版をインストール

```bash
nodebrew install [NodeJS Ver]
nodebrew use [NodeJS Ver]
```
- [ ] 5. NodeJSのバージョン確認

```bash
node -v
```

### pyenv
- [ ] 1. Pythonの最新版を控える

Python Ver:

```bash
pyenv install -l
```

- [ ] 2. Pythonの最新版をインストール

```bash
pyenv install [Pythonバージョン]
pyenv global [Pythonバージョン]
```

- [ ] 3. Pythonのバージョンを確認

```bash
python -V
```

### SDKMAN
- [ ] 1. terminal.appを起動
- [ ] 2. SDKMAN本体のインストール

```bash
curl -s "https://get.sdkman.io" | bash
source "$HOME/.sdkman/bin/sdkman-init.sh"
```
#### Java
- [ ] 1. Amazon Correttoの最新版を控える

最新版のバージョン: 

```bash
sdk list java | grep amzn
#example) 17.0.1.12.1-amzn
```
- [ ] 2. Amazon Correttoの最新版をインストール

```bash
sdk install java [最新版のバージョン] 
# globalにするのかを聞かれたら Y を入力。
# 聞かれていない場合は、下記コマンドを実行
sdk default java [最新版のバージョン]
```
- [ ] 3. Amazon Correttoのバージョンを確認

```bash
java -version
```
#### Sbt
- [ ] 1. Sbtの最新版を控える

最新版のバージョン: 

```bash
sdk list sbt
#example) 1.5.7
```
- [ ] 2. Sbtの最新版をインストール

```bash
sdk install sbt [最新版のバージョン] 
# globalにするのかを聞かれたら Y を入力。
# 聞かれていない場合は、下記コマンドを実行
sdk default sbt [最新版のバージョン]
```
- [ ] 3. Sbtのバージョンを確認

```
sbt about
```
#### Scala
- [ ] 1. Scalaの最新版を控える
最新版のバージョン: 

```bash
sdk list scala
#example) 3.1.0
```
- [ ] 2. Scalaの最新版をインストール

```bash
sdk install scala [最新版のバージョン] 
# globalにするのかを聞かれたら Y を入力。
# 聞かれていない場合は、下記コマンドを実行
sdk default scala [最新版のバージョン]
```
- [ ] 3. Scalaのバージョンを確認

```
scala -version
```

### Docker
#### Lima Docker

2023年版の手順書を参考にしてください。筆者はRancher Desktopに移行しました

#### Rancher Desktop

- [ ] 1. rancherをインストール(手順書冒頭のBrewfileでcaskに記載済み)
- [ ] 2. Rancher Desktopを起動
- [ ] 3. Dockerで動作確認

```bash
docker version
# macOS側
# Client: Docker Engine - Community
# ....
#  OS/Arch:           darwin/arm64
# ...

# Rancher Desktop(裏はLima+QEMU)側
# Server: Docker Engine - Community
#  Engine:
# ...
#   OS/Arch:          linux/amd64
# ...
```

#### その他のDockerコマンド集

- [ ] Opensearch(or Elasticsearchの為に設定変更

```bash
 limactl shell [instance名] sudo sysctl -w vm.max_map_count=262144
```
- [ ] docker-composeバルスコマンド

```bash
docker-compose down --rmi all --volumes --remove-orphans
```

#### Docker-compose - LocalStack

- docker-composeファイル

下記ファイルを作成後、このファイルがあるディレクトリで「docker-compose up」

```yaml
version: '3'

services:
  localstack:
    image: localstack/localstack:latest
    ports:
      - "127.0.0.1:4566:4566"
      - "127.0.0.1:4510-4559:4510-4559"
      - "127.0.0.1:443:443"

```

- localstackの動作確認

何かしらのAWSコマンドでエンドポイントをローカルホストにすればOK。
サービスによってポート番号が異なるので各自調べていただく。

```shell
aws s3 ls --endpoint-url=http://localhost:4566
```

- localstackの状態を取得

```shell
curl -s http://localhost:4566/health | jq
```

## 補足
### ARP-SCAN

```bash
sudo arp-scan -I [ifconfigのインターフェイス] -l
# ex) sudo arp-scan -I en0 -l
```

### システム設定
- キー入力の連打を有効化させる

```bash
defaults write -g ApplePressAndHoldEnabled -bool false
```

### limaの基本コマンド

2023年版の手順書を参考にしてください。筆者はRancher Desktopに移行しました

### ecrの認証情報の取得
```bash
aws ecr get-login-password --region ap-northeast-1 | docker login --username AWS --password-stdin [accountID].dkr.ecr.ap-northeast-1.amazonaws.com
```

### iOSバックアップ - NAS 間 シンボリックリンク
```bash
ln -s /Volumes/BackUps/Buckup /Users/${USERNAME}/Library/Application\ Support/MobileSync 
```

### Terminal.appの背景を透明にする方法

1. Terminal.appの環境設定→「プロファイル」タブを選択
1. 「カラーとエフェクト」をクリック
1. 出てきたウィンドウの「不透明度」を50~60%に、「ブラー」を0%にする
1. Terminal.appを再起動

### Apple Developerの証明リスト出力

```shell
security -v find-identity
```

### 過去の記事

- [2023年版](https://qiita.com/devchrist/items/1d6d3fca6adbdf0a582a)

### 参考文献

- [Docker Desktop for Macの実用的な代替手段: lima + Docker](https://qiita.com/yoichiwo7/items/44aff38674134ad87da3)