【2017年版】MacOS Sierraに新しく環境構築（主にCUI）

MacOSの開発環境構築手順です。
手元のマシンでプログラムを動作させるのに必要な手順をまとめました。
- Apache（2.4）
- MySQL
- PHP（7.1）
を一通りインストールして自分のマシンでWebページを実行させます。
ApacheやPHPはプリインストールされていますが、あえてHomebrewから取り寄せることでマシンが変わっても流用しやすい環境を構築していきます。
これ以外にも調整がいくらか必要と思います。

# 構築手順

## XCodeをインストール

これをインストールして起動させないと、後述のHomebrewをインストールできなくなります。
ダウンロードはApp Storeで。

ダウンロード後、一度起動させ、表示されるダイアログで「Agree」を選択しておく必要があります。

## XCodeのCommand Line Toolsをインストール

以前はXCodeのメニューからインストールしていたのですが、今は下記のコマンドでインストールするようになっています。
（これをインストールしてなくて、PHPのインストール（brew install php --with-httpd24）が上手くいきませんでした。）

```
xcode-select --install
```

## Homebrewインストール

公式サイトからインストールします。
前述のとおり、インストール前にXCodeのライセンス契約に同意する必要があります。
いったんXcodeを開いて「Agree」でOK。

[https://brew.sh/index\_ja.html](https://brew.sh/index_ja.html)

### インストール
```
/usr/bin/ruby -e "$(curl -fsSL https://raw.githubusercontent.com/Homebrew/install/master/install)"
```

## neovimインストール

.zshrcに、ターミナルから開くエディタをneovimに設定している都合上、こちらを先にインストールします。

```
brew install neovim/neovim/neovim
```

前にneovimを入れたときは、~/.zshrcに以下を追記しました。

```
export EDITOR=/usr/local/bin/nvim
alias vi='nvim'
```

## zshのインストール

bashよりも格段に使いやすいzshをインストールします。
プリインストール版ではなく、Homebrewから取り寄せます。

```
brew install zsh
```

/etc/shellsに、シェルを追加します。

```
sudo vi /etc/shells #/usr/local/bin/zshを追記
```

zshを普段使いのシェルに設定して完了です。

```
chsh -s /usr/local/bin/zsh
```

本当にログインシェルが変わったかどうか確認するには、ターミナルを立ち上げ直して以下を入力します。

```
echo $SHELL
```

## 必須の、あるいは便利なコマンドツールをインストールしていく

```
# GIT: バージョン管理に必須
brew install git
# tree: ディレクトリ構造を標準出力に表示
brew install tree
# wget: 指定したURLからファイル取得
brew install wget
# peco: コマンドラインをインタラクティブに絞り込み、履歴などに適用すると超便利
brew install peco
# .gitignore生成用コマンド。.gitignoreは手書きではやってられないので。
brew install gibo
```

### Gitの設定

#### .gitignore_global（OS全体で使える.gitignore）　を使えるようにする

```:~/.gitconfig
[core]
    excludesfile = /Users/your_user_name/.gitignore_global
```

## MySQLインストールと設定

### インストール

Homebrewからインストールします。

```
brew install mysql
```

### 確認

インストールしたMySQLの内容を確認してみます。

```
mysql: stable 5.7.17 (bottled)
Open source relational database management system
https://dev.mysql.com/doc/refman/5.7/en/
Conflicts with: mariadb, mariadb-connector-c, mysql-cluster, mysql-connector-c, percona-server
/usr/local/Cellar/mysql/5.7.17 (321 files, 234.4MB) *
  Poured from bottle on 2017-04-03 at 08:12:32
From: https://github.com/Homebrew/homebrew-core/blob/master/Formula/mysql.rb
==> Dependencies
Build: cmake ✔
Required: openssl ✔
==> Requirements
Required: macOS >= 10.7 ✔
==> Options
--with-archive-storage-engine
	Compile with the ARCHIVE storage engine enabled
--with-blackhole-storage-engine
	Compile with the BLACKHOLE storage engine enabled
--with-debug
	Build with debug support
--with-embedded
	Build the embedded server
--with-local-infile
	Build with local infile loading support
--with-test
	Build with unit tests
==> Caveats
We've installed your MySQL database without a root password. To secure it run:
    mysql_secure_installation

To connect run:
    mysql -uroot

To have launchd start mysql now and restart at login:
  brew services start mysql
Or, if you don't want/need a background service you can just run:
  mysql.server start
```

こんな感じで表示されました。
これを見るとパスワードなしのrootで接続できるようなので、接続確認します。
当然MySQLサーバーも立ち上げておく必要があります。

```
mysql.server start
mysql -uroot
```

無事に接続されれば成功です。

### rootパスワードの設定

rootのパスワードを設定します。

```
mysql_secure_installation
```

対話式で回答を繰り返し、パスワードも設定します。
具体的な流れは省略します。

### 作業用ユーザーの作成

MySQLへrootで接続できるようにはなりましたが、普段は作業用のユーザーを作ってそのユーザーで接続しています。
作業用のユーザーを作って、全てのデータベースを操作できる権限を与える設定です。
※セキュアではありません。

rootで接続します。

```
mysql -u root -p
```

以下はMySQLコンソール上で行います。
1行目は、すべてのデータベースに設定したユーザー名とパスワードで接続できるようにします。
2行目はデータベースを1つ作ります。

```
GRANT ALL PRIVILEGES ON *.* TO ユーザー名@localhost IDENTIFIED BY 'パスワード';
CREATE DATABASE データベース名 DEFAULT CHARACTER SET utf8 COLLATE utf8_general_ci;
```

いま作成したユーザー名で接続できるかどうか試します。
問題なく接続できれば成功です。

```
mysql -u 今設定したユーザー名 -p
```


## Apacheのインストールと設定

ApacheはOS 10.12では2.4がプリインストールされています。
Apacheは頻繁にアップデートを繰り返すわけではありませんが、OS依存をなくすため、Homebrewでインストールしておきます。

```
brew install homebrew/apache/httpd24
```

### httpd.confの設定

設定ファイルは以下にあるので、開きます。

```
sudo vi /usr/local/etc/apache2/2.4/httpd.conf
```

- mod_rewrite有効化
- Virtual Host有効化

※受け付けるポート番号は変更していません。8080番になっています。

### httpd-vhosts.confの設定

バーチャルホスト用の設定ファイルを開きます。以下にあります。

```
sudo vi /usr/local/etc/apache2/2.4/extra/httpd-vhosts.conf
```

元から設定が2通り書かれていると思いますが、適宜追記などして調整します。

### hostsファイルの編集

バーチャルホストで設定したドメインを適宜追記、調整などします。
詳細は割愛します。

```
sudo vi /private/etc/hosts
```
あと、下記を追記しておく必要があります。

```
# 追記
127.0.0.1 ローカルのアドレス
```

これはapacheを再起動させたときに以下のエラーが出るのを防ぎます。

```
AH00112: Warning: DocumentRoot [/usr/local/opt/httpd24/docs/dummy-host.example.com] does not exist
AH00112: Warning: DocumentRoot [/usr/local/opt/httpd24/docs/dummy-host2.example.com] does not exist
AH00557: httpd: apr_sockaddr_info_get() failed for ローカルのアドレス
```
## PHPのインストール

### インストール

SierraではPHPは5.6がプリインストールされていますが、7.1をHomebrewでインストールします。
PHPは度々バージョンアップするので、OS依存を少なくする意味合いもあります。
今回は7.1をインストールしていますが、5.6の場合もやり方はほぼ同じです。

```
brew install \
homebrew/php/php71 \
homebrew/php/php71-imagick \
homebrew/php/php71-intl \
homebrew/php/php71-xdebug \
homebrew/php/php71-mcrypt \
homebrew/php/php71-opcache \
homebrew/php/php71-apcu --with-httpd24
```
※先にxcode-select --installを実行しないと、エラーが出てしまいます。

```
xcode-select --install
```

```
checking if the location of ZLIB install directory is defined... no
configure: error: Cannot find libz

READ THIS: http://docs.brew.sh/Troubleshooting.html
```
参考までに、Githubのissueに事例があがっています。
[xcode\-select \-\-install](https://github.com/Homebrew/homebrew-php/issues/3986)

※--with-httpd24オプションをつけると、httpd.confにモジュールの場所を追記してくれます。

```:httpd.conf
# 下記が自動的に追記される
LoadModule php7_module        /usr/local/Cellar/php71/7.1.6_18/libexec/apache2/libphp7.so
```

ただしモジュール指定を複数有効化させていると「Segmentation fault: 11  \$HTTPD -k \$ARGV」と表示され起動に失敗してしまいます。複数バージョンのPHPをインストールした場合は1つだけ有効にしておかないといけません。

[PHPを起動するとhttpdがSegmentation faultになる場合の対処法](http://d.hatena.ne.jp/iizukaw/20090216/p1)

### php.iniの設定

php.iniを開いて、以下を調整します。

```:/usr/local/etc/php/7.1/php.ini
date.timezone = Asia/Tokyo 
mbstring.language = Japanese
```
php.iniの場所は以下のphpinfo()で確認できます。

```
php -i | grep ini
```

### Apache httpd.confの設定

ブラウザでPHPを実行させるためには、Apacheの設定ファイルも調整する必要があります。

```:httpd.conf
# 拡張子phpでのアクセスでPHPを実行させるための設定
# <IfModule mime_module>の中に
   AddType application/x-httpd-php .php
```

### Composerのインストール

phpのパッケージ管理システム、Composerをインストールします。
簡単にHomebrew経由でインストールします。

```
brew install composer
```

### PsySHのインストール

インタラクティブシェルとしてPHPスクリプトを実行できる環境です。
var_dump()を使わなくてもスクリプトの戻り値を可視化できるのでデバッグや戻り値の確認に使えます。

```
composer g require psy/psysh:@stable
```

## GUIアプリケーションのインストール

Chromeなどのブラウザから、MacVimやATOMなどのエディタ、PhotoshopやIllustratorなど、手当たり次第に入れていきます。
インストールしているGUIアプリケーションについて過去に投稿しています。
[今、Mac (macOS Sierra)にインストールしているGUIアプリケーション](http://qiita.com/sfp_waterwalker/items/21153ef223bdeb2776f9)

# やらなくなったこと

以前は設定していましたが、今はやっていないことも少しあります。

## 隠しファイルを表示

ターミナルを起動して、以下を実行します。

```
defaults write com.apple.finder AppleShowAllFiles -boolean true
killall Finder
```

元に戻すには、以下を実行します。

```
defaults delete com.apple.finder AppleShowAllFiles
killall Finder
```

隠しファイルを見えないことに困って探した情報ですが、
隠しファイルの表示非表示をcmd + shift + .でコントロールできることを知ったため、やめました。

## Homebrew Cask

より多くのアプリケーションをインストールできるようにする拡張機能です。
これを使うと、通常はHomebrewからインストール出来ないGoogle chromeやAlfred等もインストールできます。 

ただ、最新版に追従していないアプリが多く、App Store経由でインストールできるアプリも増えているのでやめました。
自分のマシンにインストールするだけなので、手動でも大した手間にはならんかな、と。

[自動化厨の自分がhomebrew-caskを使わなくなった理由](http://queryok.ikuwow.com/entry/stop-brew-cask/)

昔は下記のようなコマンドを実行していました。名前が微妙に迷うのも微妙でした。
（「thunderbird-ja」とか「macvim-kaoriya」とか）

```
brew cask install iterm2
brew cask install macvim-kaoriya
brew cask install google-chrome
brew cask install firefox-ja
brew cask install thunderbird-ja
brew cask install alfred
brew cask install sequel-pro
brew cask install quicklook-json
brew cask install qlstephen
brew cask install quicklook-csv
brew cask install betterzipql
brew cask install sourcetree
brew cask install filezilla
brew cask install dropbox
brew cask install libreoffice
brew cask install xtrafinder
brew cask install google-japanese-ime
brew cask install skype
brew cask install coteditor
brew cask install virtualbox
brew cask install shupapan
brew cask install vagrant172 \# その時の最新バージョン
```

## MySQLのパスワード設定をコマンドで行う。

以前はMySQLのパスワード設定下記で行っていました。
履歴に残るので好ましくありません。

### パスワード変更

```
mysqladmin -u root password 'new-password'
```

その後今設定したパスワードを入力して接続できれば成功です。

```
mysql -u root -p
```