研修でSQL講座をやるときに事前準備ゼロから最速で全員分の環境を用意する

4〜5月といえば新人研修の時期ですね。
近頃はエンジニア以外も SQL の研修をする機会が増えているかと思います。
ただそういった方面に疎い方を含めて、研修の参加者全員に事前に環境構築をしておいてもらうというのはハードルが高いときがあります。

上記の課題を解決するために、全員が一切の事前準備をせずに研修の開始数分で等しく環境を用意できる方法を説明します。使うものはブラウザだけです。

(この例では、 https://dev.mysql.com/doc/index-other.html にある `sakila database` というサンプルデータ使います)

## 事前に必要なもの

これだけは事前に管理者(担当者)が用意してください。

- AWS アカウント (一つあれば良い)
- 研修の参加者がログインするための IAM (Cloud9 が使えれば良い)

## ワークショップ開始時にやること

### 参加者が自分の Cloud9 environment を作成する

AWS Web コンソールにログインしたら https://ap-northeast-1.console.aws.amazon.com/cloud9/ を開きます。

`Create environment` を選択します。

[![Image from Gyazo](https://i.gyazo.com/ca72f8a6149f616f1e3d618533211617.png)](https://gyazo.com/ca72f8a6149f616f1e3d618533211617)

適当な名前を付けます。他の人と重複しないように。

[![Image from Gyazo](https://i.gyazo.com/1a7fb6a048d33dbd7a2178018bc920f3.png)](https://gyazo.com/1a7fb6a048d33dbd7a2178018bc920f3)

設定は何も変更しません。

[![Image from Gyazo](https://i.gyazo.com/f836c988e81d600d79fdf75499ef312a.png)](https://gyazo.com/f836c988e81d600d79fdf75499ef312a)

この後 `Create Environment` を選択してしばらく待ちます。

## Cloud9 environment に入ったらやること

### Terminal のフォントサイズ変更 (任意)

フォントサイズは Preferences から変更できます。

[![Image from Gyazo](https://i.gyazo.com/72a41894b9cfa855122b31dd058d2e13.png)](https://gyazo.com/72a41894b9cfa855122b31dd058d2e13)

[![Image from Gyazo](https://i.gyazo.com/5a23aaaee56cd794078a1e060321dfd8.png)](https://gyazo.com/5a23aaaee56cd794078a1e060321dfd8)

## Terminal でやること

### mysql の設定ファイルを用意する

mysql は ver8.0 よりデフォルトの認証方式が変わりました。これを旧方式に変更するため、下記の設定ファイルを事前に用意しておく必要があります。

```
$ mkdir config
$ touch config/my.cnf
```

そして `my.cnf` の中身は下記をコピペして保存します。

```txt:config/my.cnf
[mysqld]
default_authentication_plugin=mysql_native_password
```

### mysql を用意する

ポート 3306 で既に MariaDB が稼働しているので、ポート 3307 で mysql を稼働させます。

```
$ docker run --name mysql -v ~/environment/config:/etc/mysql/conf.d -e MYSQL_ROOT_PASSWORD=root -d -p 3307:3306 mysql:8.0
```

(ref: https://medium.com/@crmcmullen/how-to-run-mysql-8-0-with-native-password-authentication-502de5bac661)

※ Docker コンテナーを削除したいときは下記のコマンドで。

```
$ docker rm -f mysql
```

## サンプルデータを用意する

シードデータをダウンロードします。

```
$ curl -OL http://downloads.mysql.com/docs/sakila-db.zip && unzip ./sakila-db.zip
```

mysql にログインして、シードデータをインポートします。

```
$ mysql -h 127.0.0.1 -P 3307 -uroot -proot
```

(稀に失敗するので、何回か試す)
ログインが成功すると、

```
$ mysql>
```

このような表示に切り替わります。 `source` コマンドでシードデータをインポートしましょう。

```
$ mysql> source sakila-db/sakila-schema.sql;
$ mysql> source sakila-db/sakila-data.sql;
```

(ref: https://dev.mysql.com/doc/sakila/en/sakila-installation.html)

ここまででサンプルデータの準備は完了です。
他に適当なデータがあればそれを使うと良いでしょう。

開始からここまでに要する時間は数分です。

## SQL 実践

`sakila` データベースにあるテーブルに対して適当なクエリを投げます。

```
$ mysql> use sakila;

$ mysql> show full tables;
+----------------------------+------------+
| Tables_in_sakila           | Table_type |
+----------------------------+------------+
| actor                      | BASE TABLE |
| actor_info                 | VIEW       |
| address                    | BASE TABLE |
| category                   | BASE TABLE |
| city                       | BASE TABLE |
| country                    | BASE TABLE |
| customer                   | BASE TABLE |
| customer_list              | VIEW       |
| film                       | BASE TABLE |
| film_actor                 | BASE TABLE |
| film_category              | BASE TABLE |
| film_list                  | VIEW       |
| film_text                  | BASE TABLE |
| inventory                  | BASE TABLE |
| language                   | BASE TABLE |
| nicer_but_slower_film_list | VIEW       |
| payment                    | BASE TABLE |
| rental                     | BASE TABLE |
| sales_by_film_category     | VIEW       |
| sales_by_store             | VIEW       |
| staff                      | BASE TABLE |
| staff_list                 | VIEW       |
| store                      | BASE TABLE |
+----------------------------+------------+
23 rows in set (0.00 sec)

$ mysql> select * from actor limit 10;
+----------+------------+--------------+---------------------+
| actor_id | first_name | last_name    | last_update         |
+----------+------------+--------------+---------------------+
|        1 | PENELOPE   | GUINESS      | 2006-02-15 04:34:33 |
|        2 | NICK       | WAHLBERG     | 2006-02-15 04:34:33 |
|        3 | ED         | CHASE        | 2006-02-15 04:34:33 |
|        4 | JENNIFER   | DAVIS        | 2006-02-15 04:34:33 |
|        5 | JOHNNY     | LOLLOBRIGIDA | 2006-02-15 04:34:33 |
|        6 | BETTE      | NICHOLSON    | 2006-02-15 04:34:33 |
|        7 | GRACE      | MOSTEL       | 2006-02-15 04:34:33 |
|        8 | MATTHEW    | JOHANSSON    | 2006-02-15 04:34:33 |
|        9 | JOE        | SWANK        | 2006-02-15 04:34:33 |
|       10 | CHRISTIAN  | GABLE        | 2006-02-15 04:34:33 |
+----------+------------+--------------+---------------------+
10 rows in set (0.00 sec)
```

この Sakila というデータベースが なんなのか についてはこのように説明されています。

> Sakilaサンプルデータベースは当初、MySQL ABドキュメントチームの元メンバーであるMike Hillyerによって開発され、書籍、チュートリアル、記事、サンプルなどの例に使用できる標準スキーマを提供することを目的としています。

(from: https://dev.mysql.com/doc/sakila/en/sakila-introduction.html)

## 研修が終わったら

研修が終わったら、参加者は自分が作った Cloud9 environment を削除します。

ちなみに、研修で使う程度なら Cloud9 のコストはタダみたいなものなので、SQL 以外にも有用な場面は色々あります。