ローカル開発環境の構築

# 導入する理由
1. より高度な開発を行っているとインターネットに常につながっているサーバが必要になってくる
1. サーバを借りるのにはお金がかかる
1. 手元のPCにサーバと同じ環境を構築しておいて、そこでテストができるとベスト（=ローカル開発環境）

# 導入するもの
* VirtualBox
    * 仮想環境
    * DLリンク: https://www.virtualbox.org/
* Vagrant
    * VirtualBoxを便利に使うもの
    * https://www.vagrantup.com/
* Cyberduck
    * ファイル転送ツール

# Vagrantを使ってCentOSを立ち上げる手順
1. VirtualBoxをインストール
    * https://www.virtualbox.org/
2. Vagrantをインストール
    * https://www.vagrantup.com/
3. Vagrant初期化
    * `local:~$ mkdir MyVagrant`
    * `local:~$ cd MyVagrant/`
    * `local:~/MyVagrant$ mkdir mycentos`
    * `local:~/MyVagrant/mycentos$ vagrant init bento/centos-6.7`
    * `local:~/MyVagrant/mycentos$ vim Vagrantfile`
        * コメントアウトを外す
        *  `29    config.vm.network "private_network", ip: "192.168.33.10"`
4. Vagrantを使ってCentOS起動
    * `local:~/MyVagrant/mycentos$ vagrant up`

# PHPやRubyの導入手順
1. 上記手順でCentOSを立ち上げる
1. CentOSにログイン
    * `vagrant ssh`
1. GitHubにあるシェルスクリプトを使って一気にインストール
    * `[vagrant@localhost ~]$ sudo yum -y install git`
    * `[vagrant@localhost ~]$ git clone https://github.com/dotinstallres/centos65.git`
    * `[vagrant@localhost ~]$ cd centos65`
    * `[vagrant@localhost ~]$ ./run.sh`
1. railsインストール
    * `[vagrant@localhost ~]$ rbenv -v`
        * rbenvコマンドが見つからない場合は
        *  `export PATH=$PATH:$HOME/.rbenv/bin:$HOME/.rbenv/shims`
    * `[vagrant@localhost ~]$ gem install rails -v 4.1.4`
    * 

1. PostgreSQLインストール
    * 公式サイトでインストール方法を確認
        * http://www.postgresql.org/download/linux/redhat/
        * `[vagrant@localhost ~]$ sudo yum install postgresql-server`
    * データベースの初期化
        * `[vagrant@localhost ~]$ sudo service postgresql initdb`
    * 自動起動をONにする
        * `[vagrant@localhost ~]$ sudo chkconfig postgresql on`
    * ステータス確認
        * `[vagrant@localhost ~]$ sudo service postgresql status`
    * 起動
        * `[vagrant@localhost ~]$ sudo service postgresql start`
    * postgresというユーザができているので、パスワードを設定(postgres)
        * `[vagrant@localhost ~]$ sudo passwd postgres`
    * ログイン
        * `[vagrant@localhost ~]$ su - postgres`
    * バージョン確認
        * `-bash-4.1$ psql --version`
    * 現状のユーザを確認
        * `-bash-4.1$ psql`
        * `postgres=# \du`
    * postgresはスーパーユーザなので作業ユーザを作成
        * `postgres=# create user vagrant createdb password 'vagrant' login`
1. Hetoku Toobeltインストール
    * `[vagrant@localhost ~]$ wget -O- https://toolbelt.heroku.com/install.sh | sh`
    * `[vagrant@localhost ~]$ echo 'PATH="/usr/local/heroku/bin:$PATH"' >> ~/.bash_profile`

1. 主要なものがインストールできているか確認
    * `[vagrant@localhost ~]$ php -v`
    * `[vagrant@localhost ~]$ ruby -v`
    * `[vagrant@localhost ~]$ mysql --version`
    * `[vagrant@localhost ~]$ sudo service httpd status`
    * `[vagrant@localhost ~]$ rails -v`
    * `[vagrant@localhost ~]$ psql --version`
    * `[vagrant@localhost ~]$ heroku --version`
1. CentOSからログアウト
    * `[vagrant@localhost ~]$ exit`
1. CentOSを停止
    * `local:~/MyVagrant/mycentos$ vagrant suspend`

# Cyberduck導入
1. VirtualBoxのネットワークを追加
    * CentOSを終了
        * `local:~/MyVagrant/mycentos$ vagrant halt`
    * VirtualBox > 環境設定 > ネットワーク > ホストオンリーネットワーク追加
        * vboxnet0が作成される
    * CentOSにログインしてeth1があるか確認
        * `sudo vi -R /etc/sysconfig/network-scripts/ifcfg-eth1`
    * 変更を加えた場合はネットワークを再起動
        *  `[vagrant@localhost ~]$ sudo /etc/init.d/network restart`
    *  ifconfigでeth1のIPアドレスを確認
        *  `[vagrant@localhost ~]$ ifconfig`
            *    `inet addr:192.168.33.10`
1. Cyberduckをインストールして起動
1. 新規接続設定
    * 新規接続ボタンをクリック
    * プロトコルをSFTP(SSHによる暗号化FTP)を選択
    * ifconfigで確認したIPアドレスを設定
    * Vagrantで立ち上げたマシンのユーザ名/パスワードは" _vagrant_ "
    * 詳細設定のパス
        * `/var/www/html`


# VirtualBoxに立てたWebサーバに外部からhttpアクセスしてみる
1. /var/www/html配下にindex.htmlを作成
1. CentOSのネットワーク設定を変更
    * CentOS設定 > ネットワーク > アダプター1(NAT) > ポートフォワーディング追加
        * `apache TCP 80(ホストポート) 80(ゲストポート)`
1. http://192.168.33.10/index.html にアクセス

※ Macのポート確認方法: http://joppot.info/2014/04/22/1256


# コマンドインストール
ack導入

~~~

curl http://beyondgrep.com/ack-1.96-single-file > ~/ack
sudo mv ~/ack /bin/ack
sudo chmod 755 /bin/ack
~~~


# その他
こんなエラーが出たら...

### vagrant upでこんなエラー

~~~
local:~/MyVagrant/mycentos$ vagrant up

Failed to mount folders in Linux guest. This is usually because
the "vboxsf" file system is not available. Please verify that
the guest additions are properly installed in the guest and
can work properly. The command attempted was:

mount -t vboxsf -o uid=`id -u vagrant`,gid=`getent group vagrant | cut -d: -f3` vagrant /vagrant
mount -t vboxsf -o uid=`id -u vagrant`,gid=`id -g vagrant` vagrant /vagrant

The error output from the last command was:

/sbin/mount.vboxsf: mounting failed with the error: No such device
~~~

１. CentOSにログインして、リビルドして

~~~
[vagrant@localhost ~]$ sudo /etc/init.d/vboxadd setup
Removing existing VirtualBox non-DKMS kernel modules       [  OK  ]
Building the VirtualBox Guest Additions kernel modules
The headers for the current running kernel were not found. If the following
module compilation fails then this could be the reason.
The missing package can be probably installed with
yum install kernel-devel-2.6.32-573.12.1.el6.x86_64

Building the main Guest Additions module                   [失敗]
(Look at /var/log/vboxadd-install.log to find out what went wrong)
Doing non-kernel setup of the Guest Additions              [  OK  ]
[vagrant@localhost ~]$ exit
logout
~~~

２. 再起動

~~~
$ local:~/MyVagrant/mycentos$ vagrant halt
==> default: Attempting graceful shutdown of VM...
$ local:~/MyVagrant/mycentos$ vagrant up
~~~




### public_htmlを読み込んでくれない
1. /home/配下にログインユーザのディレクトリを作成（すでにあるはず）
2. httpd.confの設定を編集
    * `[vagrant@localhost ~]$ sudo vi /etc/httpd/conf/httpd.conf`
        * `367|     UserDir enabled vagrant`
3. apache restart
    * `[vagrant@localhost ~]$ sudo /etc/init.d/httpd restart`
4. /home/[user]/配下にpublic_html配下のファイルをコピー
5. /home/[user]のパーミッションが701になっていることを確認
6. シンボリックリンク貼る
    * `[vagrant@localhost ~]$ ln -s /home/vagrant/wordpress /var/www/html/`


### 上記だとvimが入ってないじゃねーか
`yum -y install vim-enhanced`
あと、セットアップ周りのファイルをBitbucketからcloneして、ホームディレクトリに移動させる

### rails newするとエラーが出る
`[vagrant@localhost ~]$ sudo yum -y install postgresql-devel`