ideyoでHTML5+CSS+JSのテストファイルを自動生成

ちょっとJSのテストコード書いて見ようと思った時に、簡単に開発環境を用意できる私のフロントエンドっていうのを作ったんだが初回にGruntを叩いたりgrunt watch:sassを起動することすら面倒くさく感じ始めた

github.com

上記の開発環境はそのまま本番にも適用できるような仕組みになっているのが問題なんだな。テストコードなんだから書いたら捨てるし、適当なベースファイルが手に入ればいいってことで、それらを自動で準備するものを作ってみた

github.com

使い方

Githubに置いてあるPythonに引数を付けて実行するだけ

$ curl -sS https://raw.githubusercontent.com/hoge/ideyo/master/go.py | python - html js css

MySQLのデータベースのdumpを作成する

mysqldumpでデータベースのダンプが作成できる

mysqldump -h (ホスト) --port (ポート番号) -u (ユーザー名) (データベース名) -p --skip-lock-tables > ~/backup.sql

他にオプションはいろいろあるが、これくらいだろう。Dockerが出てきてポート番号を最近指定することが多くなった。

MySQLのデータベースとテーブルの文字コードを確認する

データベースの文字コードを確認するにはSHOW CREATE DATABASE hogehogeを使う

mysql> SHOW CREATE DATABASE hoge;
+----------+---------------------------------------------------------------+
| Database | Create Database                                               |
+----------+---------------------------------------------------------------+
| hoge     | CREATE DATABASE `hoge` /*!40100 DEFAULT CHARACTER SET utf8 */ |
+----------+---------------------------------------------------------------+
1 row in set (0.00 sec)

テーブルの文字コードを確認するにはSHOW CREATE TABLE hogehogeを使う

mysql> SHOW CREATE TABLE user \G
*************************** 1. row ***************************
Table: user
Create Table: CREATE TABLE `user` (
`id` bigint(20) NOT NULL AUTO_INCREMENT,
`name` varchar(20) NOT NULL,
PRIMARY KEY (`id`),
KEY `name` (`name`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8
1 row in set (0.01 sec)

MySQLのデータベースとテーブルの文字コードを変更する

データベースの文字コード変更

データベースの文字コードを変更するにはALTER DATABASE データベース名 CHARACTER SET 文字コードとする

mysql> SHOW CREATE DATABASE hoge;
+----------+-----------------------------------------------------------------+
| Database | Create Database                                                 |
+----------+-----------------------------------------------------------------+
| hoge     | CREATE DATABASE `hoge` /*!40100 DEFAULT CHARACTER SET latin1 */ |
+----------+-----------------------------------------------------------------+
1 row in set (0.01 sec)
mysql> ALTER DATABASE hoge CHARACTER SET utf8;
Query OK, 1 row affected (0.01 sec)
mysql> SHOW CREATE DATABASE hoge;
+----------+---------------------------------------------------------------+
| Database | Create Database                                               |
+----------+---------------------------------------------------------------+
| hoge     | CREATE DATABASE `hoge` /*!40100 DEFAULT CHARACTER SET utf8 */ |
+----------+---------------------------------------------------------------+
1 row in set (0.02 sec)

テーブルの文字コードを変更する

テーブルの文字コードを変更する時はALTER TABLE テーブル名 CONVERT TO CHARACTER SET 文字コードを使う

mysql> SHOW CREATE TABLE user \G
*************************** 1. row ***************************
Table: user
Create Table: CREATE TABLE `user` (
`id` bigint(20) NOT NULL AUTO_INCREMENT,
`name` varchar(20) NOT NULL,
PRIMARY KEY (`id`),
KEY `name` (`name`)
) ENGINE=InnoDB DEFAULT CHARSET=latin1
1 row in set (0.01 sec)
mysql> ALTER TABLE user CONVERT TO CHARACTER SET utf8;
Query OK, 0 rows affected (0.04 sec)
Records: 0  Duplicates: 0  Warnings: 0
mysql> SHOW CREATE TABLE user \G
*************************** 1. row ***************************
Table: user
Create Table: CREATE TABLE `user` (
`id` bigint(20) NOT NULL AUTO_INCREMENT,
`name` varchar(20) NOT NULL,
PRIMARY KEY (`id`),
KEY `name` (`name`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8
1 row in set (0.00 sec)

ALTER TABLE テーブル名 CHARSET=文字コードとしてもできるが例のようにテーブル自体の文字コードしか変わらず、カラムの文字コードは変更されない。

mysql> SHOW CREATE TABLE user \G
*************************** 1. row ***************************
Table: user
Create Table: CREATE TABLE `user` (
`id` bigint(20) NOT NULL AUTO_INCREMENT,
`name` varchar(20) NOT NULL,
PRIMARY KEY (`id`),
KEY `name` (`name`)
) ENGINE=InnoDB DEFAULT CHARSET=latin1
1 row in set (0.01 sec)
mysql> ALTER TABLE user CHARSET=utf8;
Query OK, 0 rows affected (0.02 sec)
Records: 0  Duplicates: 0  Warnings: 0
mysql> SHOW CREATE TABLE user \G
*************************** 1. row ***************************
Table: user
Create Table: CREATE TABLE `user` (
`id` bigint(20) NOT NULL AUTO_INCREMENT,
`name` varchar(20) CHARACTER SET latin1 NOT NULL,
PRIMARY KEY (`id`),
KEY `name` (`name`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8
1 row in set (0.00 sec)

カラム毎に違う文字コードを指定している場合は後者を使ってカラム毎の文字コードを維持することができるので、後者はそういう時に使えるんだと思う。でも気持ち悪いから前者のようにカラムも含めて文字コードは統一していたいけどねw

MySQLでテーブルを作成するCREATE TABLEのサンプルSQL

MySQLでテーブルを作成するにはCREATE TABLEを使う

CREATE TABLE `user` (
`id` bigint(20) NOT NULL AUTO_INCREMENT,
`name` varchar(20) NOT NULL,
PRIMARY KEY (`id`),
INDEX (`name`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8;
CREATE TABLE `profile` (
`user_id` bigint(20) NOT NULL,
`key` varchar(20) NOT NULL,
`value` varchar(100) NOT NULL,
PRIMARY KEY (`user_id`,`key`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8;

このSQLはユーザーデータとそれに紐づくデータを格納するためのプロフィールテーブルを作成するサンプルである。いろいろテストする時に適当なテーブル作るけど、これを毎度コピペすれば良いな。

INSERT INTO user (id, name) VALUES (1, 'ウルトラマン');
INSERT INTO user (id, name) VALUES (2, 'あやか');
INSERT INTO user (id, name) VALUES (3, 'まゆみ');
INSERT INTO profile (user_id, `key`, value) VALUES (1, '身長', '20m');
INSERT INTO profile (user_id, `key`, value) VALUES (1, '体重', '1t');
INSERT INTO profile (user_id, `key`, value) VALUES (1, '年齢', '100歳');
INSERT INTO profile (user_id, `key`, value) VALUES (2, '身長', '150cm');
INSERT INTO profile (user_id, `key`, value) VALUES (2, '体重', '40kg');
INSERT INTO profile (user_id, `key`, value) VALUES (2, '年齢', '16歳');
INSERT INTO profile (user_id, `key`, value) VALUES (3, '身長', '145m');
INSERT INTO profile (user_id, `key`, value) VALUES (3, '体重', '40kg');
INSERT INTO profile (user_id, `key`, value) VALUES (3, '年齢', '12歳');

ダミーデータはこんな感じ

MySQLのテーブルにインデックスを貼る

2つ方法があってテーブル作成時にINDEXを指定する以下の方法と

CREATE TABLE user (
id bigint(20) NOT NULL auto_increment,
name varchar(20) NOT NULL,
PRIMARY KEY (id),
INDEX (name)
);

ALTER TABLE profile ADD INDEX hogehoge_index (hoge);と後から貼る方法がある

mysql> SHOW INDEX FROM profile;
+---------+------------+----------+--------------+-------------+-----------+-------------+----------+--------+------+------------+---------+---------------+
| Table   | Non_unique | Key_name | Seq_in_index | Column_name | Collation | Cardinality | Sub_part | Packed | Null | Index_type | Comment | Index_comment |
+---------+------------+----------+--------------+-------------+-----------+-------------+----------+--------+------+------------+---------+---------------+
| profile |          0 | PRIMARY  |            1 | user_id     | A         |           0 |     NULL | NULL   |      | BTREE      |         |               |
| profile |          0 | PRIMARY  |            2 | key         | A         |           0 |     NULL | NULL   |      | BTREE      |         |               |
+---------+------------+----------+--------------+-------------+-----------+-------------+----------+--------+------+------------+---------+---------------+
2 rows in set (0.00 sec)
mysql>  ALTER TABLE profile ADD INDEX value_index (value);
Query OK, 0 rows affected (0.03 sec)
Records: 0  Duplicates: 0  Warnings: 0
mysql> SHOW INDEX FROM profile;
+---------+------------+-------------+--------------+-------------+-----------+-------------+----------+--------+------+------------+---------+---------------+
| Table   | Non_unique | Key_name    | Seq_in_index | Column_name | Collation | Cardinality | Sub_part | Packed | Null | Index_type | Comment | Index_comment |
+---------+------------+-------------+--------------+-------------+-----------+-------------+----------+--------+------+------------+---------+---------------+
| profile |          0 | PRIMARY     |            1 | user_id     | A         |           0 |     NULL | NULL   |      | BTREE      |         |               |
| profile |          0 | PRIMARY     |            2 | key         | A         |           0 |     NULL | NULL   |      | BTREE      |         |               |
| profile |          1 | value_index |            1 | value       | A         |           0 |     NULL | NULL   |      | BTREE      |         |               |
+---------+------------+-------------+--------------+-------------+-----------+-------------+----------+--------+------+------------+---------+---------------+
3 rows in set (0.01 sec)

他にも方法があるようだけど私がよくやる方法はこれくらい

MySQLのテーブルでインデックスが貼られているか確認する

SHOW INDEX FROM hogehogeでいけるようだ。以下のようにuser_idkeyがPRIMARYである時はuser_idkeyにインデックスが貼られている事が確認できる。

mysql> desc profile;
+---------+--------------+------+-----+---------+-------+
| Field   | Type         | Null | Key | Default | Extra |
+---------+--------------+------+-----+---------+-------+
| user_id | bigint(20)   | NO   | PRI | NULL    |       |
| key     | varchar(20)  | NO   | PRI | NULL    |       |
| value   | varchar(100) | NO   |     | NULL    |       |
+---------+--------------+------+-----+---------+-------+
3 rows in set (0.01 sec)
mysql> SHOW INDEX FROM profile;
+---------+------------+----------+--------------+-------------+-----------+-------------+----------+--------+------+------------+---------+---------------+
| Table   | Non_unique | Key_name | Seq_in_index | Column_name | Collation | Cardinality | Sub_part | Packed | Null | Index_type | Comment | Index_comment |
+---------+------------+----------+--------------+-------------+-----------+-------------+----------+--------+------+------------+---------+---------------+
| profile |          0 | PRIMARY  |            1 | user_id     | A         |           0 |     NULL | NULL   |      | BTREE      |         |               |
| profile |          0 | PRIMARY  |            2 | key         | A         |           0 |     NULL | NULL   |      | BTREE      |         |               |
+---------+------------+----------+--------------+-------------+-----------+-------------+----------+--------+------+------------+---------+---------------+
2 rows in set (0.01 sec)

続いてidがPRIMARYであり、nameにインデックスを張っている場合は以下のようにインデックスが貼られている事が確認できる。

mysql> desc user;
+-------+-------------+------+-----+---------+----------------+
| Field | Type        | Null | Key | Default | Extra          |
+-------+-------------+------+-----+---------+----------------+
| id    | bigint(20)  | NO   | PRI | NULL    | auto_increment |
| name  | varchar(20) | NO   | MUL | NULL    |                |
+-------+-------------+------+-----+---------+----------------+
2 rows in set (0.02 sec)
mysql> SHOW INDEX FROM user;
+-------+------------+----------+--------------+-------------+-----------+-------------+----------+--------+------+------------+---------+---------------+
| Table | Non_unique | Key_name | Seq_in_index | Column_name | Collation | Cardinality | Sub_part | Packed | Null | Index_type | Comment | Index_comment |
+-------+------------+----------+--------------+-------------+-----------+-------------+----------+--------+------+------------+---------+---------------+
| user  |          0 | PRIMARY  |            1 | id          | A         |           0 |     NULL | NULL   |      | BTREE      |         |               |
| user  |          1 | name     |            1 | name        | A         |           0 |     NULL | NULL   |      | BTREE      |         |               |
+-------+------------+----------+--------------+-------------+-----------+-------------+----------+--------+------+------------+---------+---------------+
2 rows in set (0.01 sec)

MySQLのテーブルを削除する

DROP TABLE hogehogeで削除できる

mysql> show tables;
+----------------+
| Tables_in_hoge |
+----------------+
| user           |
+----------------+
1 row in set (0.00 sec)
mysql> DROP TABLE user;
Query OK, 0 rows affected (0.02 sec)
mysql> show tables;
Empty set (0.02 sec)

MySQLでデータベースを作成

データベースを作成するにはcreate databse hogehoge

mysql> create database hoge;
Query OK, 1 row affected (0.00 sec)

データベース一覧を確認してみる

mysql> show databases;
+--------------------+
| Database           |
+--------------------+
| information_schema |
| mysql              |
| performance_schema |
| hoge               |
+--------------------+
4 rows in set (0.01 sec)

CREATE DATABASE データベース名 CHARACTER SET 文字コード文字コードを指定しながらデータベースを作成することもできる

mysql> CREATE DATABASE hoge CHARACTER SET utf8;
Query OK, 1 row affected (0.01 sec)
mysql> show databases;
+--------------------+
| Database           |
+--------------------+
| information_schema |
| mysql              |
| performance_schema |
| hoge               |
+--------------------+
4 rows in set (0.00 sec)
mysql> SHOW CREATE DATABASE hoge;
+----------+---------------------------------------------------------------+
| Database | Create Database                                               |
+----------+---------------------------------------------------------------+
| hoge     | CREATE DATABASE `hoge` /*!40100 DEFAULT CHARACTER SET utf8 */ |
+----------+---------------------------------------------------------------+
1 row in set (0.00 sec)

boot2dockerでMySQLを立ち上げる

私が困ったことは、boot2dockerは自分のホスト上の特定のポートで実行され、MySQLはさらにboot2docker内の別のポートで実行されていて、じゃあどうやってmysqlで接続するのかって所。全体を通してメモを残しておく。

MySQLの起動

公式でMySQLのイメージが公開されているのでそれをダウンロードする

docker pull mysql

そのイメージをポート13306で起動する

docker run --name mysql -p 13306:3306 -e MYSQL_ROOT_PASSWORD=test -d mysql

MySQLの接続

接続する

mysql -u root -h [boot2dokcerのホストのIPアドレス] --port 13306 -p

boot2dockerは適当なポートで実行されてはいるが、MySQLに接続する時はこんな感じみたいだぞ。-hの所でポートは指定せず、mysqlのコマンドで--portとしてポートを渡すようだ。

追記。こういう風に3306を3306で立ち上げればまるでMacMySQLインストールした雰囲気で利用できる

docker run --name mysql -p 3306:3306 -e MYSQL_ROOT_PASSWORD=test -d mysql

接続する時はこんな感じだね

docker -h dockerhost -u root -p

どうせ一個しか立ち上げないしこっちの方がいいかな