「ISUCON4 オンライン予選問題」をローカル環境に構築（Webサーバー：Go）

# はじめに

IT勉強会にて「[ISUCON4 オンライン予選問題](https://github.com/isucon/isucon4/tree/master/qualifier)」をやってみることになり、自分用メモとしてローカル環境で動作させるための手順書を作成してみました。

「データベース」と「ソースファイル」の章は全言語共通、「Webサーバー」の章はGoを対象としています。

自分用メモの都合上、以下のOSとコマンドを使用しています。必要に応じて各自の環境に読み替えて下さい。

OS

* Mac OS X 10.8.5

コマンド

* homebrew（パッケージ管理：MySQLのインストールに使用）
* vim（テキストエディター：文字列の追加と置換に使用）

MySQLは触った事がないため、ユーザーやセキュリティなどの各種設定は出来ておりませんm(__)m

# データベース

## MySQLをインストール

最初、[公式サイト](http://dev.mysql.com/downloads/mysql/)のdmgファイルでインストールしようとしたのですが、インストール後のファイル容量が大きそうだったので断念。tar.gzファイルもあるのですが、展開後の設定方法などがわからなかったのでhomebrewにてインストールしました。

```
$ brew update
$ brew install mysql
```

## MySQLのバージョンを確認

```
$ mysql --version
mysql  Ver 14.14 Distrib 5.6.21, for osx10.8 (x86_64) using  EditLine wrapper
```

## MySQLサーバーの起動と停止の方法

以下、手動による操作です。

起動

```
$ mysql.server start
Starting MySQL
. SUCCESS! 
```

停止

```
$ mysql.server stop
Shutting down MySQL
. SUCCESS! 
```

## 設定ファイル（my.cnf）を修正

後述の`init.sh`を実行した時、以下のエラーになります。

```
ERROR 2006 (HY000) at line 1: MySQL server has gone away
```

MySQLでは、クライアントからサーバーにデータを送信する時のパケットサイズがデフォルトで1Mらしいのですが、今回はそれでは足りないらしく最大値の16Mで設定しました。（ちなみに8Mでもダメでした。）

テキストエディター（ここではvim）にてmy.cnfを開く。

```
$ vim /usr/local/Cellar/mysql/5.6.21/my.cnf
```

以下の一行を追加。

```
max_allowed_packet = 16M
```

# ソースファイル

## GitHubからisucon4のリポジトリーを取得

カレントディレクトリーを移動。

```
$ cd $GOPATH/src/github.com
```

今回は`git clone`にてソースを取得。

```
$ git clone https://github.com/isucon/isucon4
Cloning into 'isucon4'...
remote: Counting objects: 269, done.
remote: Total 269 (delta 0), reused 0 (delta 0)
Receiving objects: 100% (269/269), 20.02 MiB | 480 KiB/s, done.
Resolving deltas: 100% (22/22), done.
```

## サンプルデータ（dummy_log.sql）を修正

## カレントディレクトリーを移動。

```
$ cd isucon4/qualifier
```

後述の`init.sh`を実行した時、以下のエラーになります。

```
ERROR 1292 (22007) at line 1: Incorrect datetime value: '2014-02-22 00:00:00 +0900' for column 'created_at' at row 1
```

ファイル内のデータ値は'2014-02-22 00:00:00 +0900'ですが、datetime型は'2014-02-22 00:00:00'までらしいので' +0900'を削除します。

テキストエディター（ここではvim）にてdummy_log.sqlを開く。

```
$ vim sql/dummy_log.sql
```

コマンドモードにて、文字列の置換を実行。

```
:%s/ +0900//g
```

## データベースの作成＆データのセットアップ

MySQLサーバーを起動。

```
$ mysql.server start
```

`init.sh`を実行して、データベースの作成とデータのセットアップを実施。

```
$ ./init.sh
+ set -e
++ dirname ./init.sh
+ cd .
+ myuser=root
+ mydb=isu4_qualifier
+ myhost=127.0.0.1
+ myport=3306
+ mysql -h 127.0.0.1 -P 3306 -u root -e 'DROP DATABASE IF EXISTS isu4_qualifier; CREATE DATABASE isu4_qualifier'
+ mysql -h 127.0.0.1 -P 3306 -u root isu4_qualifier
+ mysql -h 127.0.0.1 -P 3306 -u root isu4_qualifier
+ mysql -h 127.0.0.1 -P 3306 -u root isu4_qualifier
```

# Webサーバー

## 関連パッケージの取得＆コンパイル

カレントディレクトリーをGoのディレクトリーに移動。

```
$ cd webapp/go
```

`build.sh`を実行すると、martini（Webフレームワーク）やMySQLドライバーが`go get`（ダウンロード）された後、`go build`（コンパイル）が実行されます。

```
$ ./build.sh
```

## Webサーバーを起動

`golang-webapp`コマンドが生成されるので、それを実行。

```
$ ./golang-webapp
```

## 動作確認

Webブラウザーにて、以下のURLにアクセス。

```
http://127.0.0.1:8080/
```

トップページが表示されれば、Goの設定が完了していることを確認できます。

![isucon4_login.png](https://qiita-image-store.s3.amazonaws.com/0/31857/faeebda2-8796-1a5a-70cc-ad01ea5c854c.png)

データベースの設定が完了しているかどうかは、ログインして確認します。

```
ご契約ＩＤ：isucon1
パスワード：isuconpass1
```

次のページが表示されれば、データベースの設定が完了していることを確認できます。

![isucon4_mypage.png](https://qiita-image-store.s3.amazonaws.com/0/31857/19803736-dfcb-846d-2672-bdc7faac2b5f.png)