ISUCONの過去問題用の環境を構築する（11本選、PHP）

ISUCON過去問題用の環境構築手順です。

### クローン

```
git clone ssh://git@github.com/isucon/isucon11-final.git
```

実際には自分の環境では [ghq](https://github.com/x-motemen/ghq) を使っているため下記です。


```
ghq get ssh://git@github.com/isucon/isucon11-final.git
```

### Docker環境の起動

```
cd dev
docker-compose -f docker-compose-php.yaml up -d
```

4つのDockerコンテナが起動します。

```
$ docker ps
CONTAINER ID   IMAGE                       COMMAND                  CREATED        STATUS         PORTS                               NAMES
0503a90d2   dev_frontend                "/docker-entrypoint.…"   2 months ago   Up 3 minutes   0.0.0.0:8080->80/tcp                dev_frontend_1
ed9d3f52a   dev_backend                 "dockerize -timeout …"   2 months ago   Up 3 minutes   0.0.0.0:7000->7000/tcp              dev_backend_1
97f97b874   mysql                       "docker-entrypoint.s…"   2 months ago   Up 3 minutes   0.0.0.0:3306->3306/tcp, 33060/tcp   dev_mysql_1
585b6a05f   adminer:latest              "entrypoint.sh php -…"   2 months ago   Up 3 minutes   0.0.0.0:7001->8080/tcp              dev_adminer_1
```


### 動作確認
ローカルの8080にアクセスするとフロントを確認することができます。

http://localhost:8080/

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/47327/2eaf7a25-d136-5fd9-afd5-62cb5b1886a5.png)

ログインは `S00000 : isucon` といった組み合わせでログインできます。[^dousa1]

|  | 学内コード | パスワード
---|----|-----
学生 | S00000 | isucon
教員 | T00000 | isucon
学生	| S99999 | isucon
教員	| T99999 | isucon

[^dousa1]: https://github.com/isucon/isucon11-final/blob/main/docs/manual.md#isucholar-%E3%81%B8%E3%81%AE%E3%83%AD%E3%82%B0%E3%82%A4%E3%83%B3

### ベンチ
ホスト側からベンチマークを実行する場合、Goの環境を整えておきます。

```
cd benchmark/bin
./benchmarker

中略

15:11:20.416815 raw score (1663) breakdown:
15:11:20.416823 SubmitAssignment    : 300 回 (900 点)
15:11:20.416827 GetAnnouncementList : 763 回 (763 点)
15:11:20.416832 tag: SubmitAssignment                 : 300
15:11:20.416836 tag: GetAnnouncementList              : 763
15:11:20.416841 tag: !1.SkipRegisterNoCourseAvailable : 0
15:11:20.416844 tag: !2.SkipAddStudentPoolEmpty       : 0
15:11:20.416848 tag: !3.ValidateTimeout               : 0
```


### Dockerコンテナに入る

```
docker exec -it dev_backend /bin/bash
```


### docker composeでMySQLの設定をローカルに持ってくる

docker composeでMySQLの設定をローカルに持ってくる

```yaml:docker-compose-php.yam
  mysql:
     （...略....）
    volumes:
      - mysql_data:/var/lib/mysql
      - ./mysql_conf/my.cnf:/etc/my.cnf
      - ./mysql_log:/var/log/
```

Dockerコンテナの再起動

```
docker-compose -f docker-compose-php.yaml down  && docker-compose -f docker-compose-php.yaml up -d
```


### docker composeのNGINXの設定をローカルに持ってくる

NGINXはフロントのコンテナで動いている。
その基本的な設定は `dev/nginx` ディレクトリに入っている。

ディレクトリごと設定をホスト側に持って来たい場合には下記のようにする。

```bash
$ mkdir frontend_conf
$ docker cp dev_frontend_1:/etc/nginx ./nginx
```


```yaml:docker-compose-php.yam
  frontend:
     （...略....）
    volumes:
      - ./frontend_conf/nginx:/etc/nginx
```

#### nginxの設定を書き換えて文字列を返す
あるURLに対して特定の文字列を返すようにする。

```conf:dev/nginx/default.conf
  location /api-dummy {
    return 200 "Hello world";
  }
```

```bash
$ curl 'http://localhost:8080/api-dummy'

Hello World
```


#### announcementsをキャッシュする

announcementsを取得するにはログインが必要なので、ブラウザを使ってログインし、そのリクエストを利用する。

![Screenshot 2023-04-11 at 12.39.43.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/47327/eec97e36-6976-ea62-6e61-a8f466fd3043.png)


```bash
$ curl 'http://localhost:8080/api/announcements' > announcements.json
```