読者です 読者をやめる 読者になる 読者になる

CentOS 7 に Redash インストールして MySQL のデータをグラフ表示してみた

作業環境

Docker + Docker Compose のインストー

Re:dash は CentOS では Docker のコンテナ上で起動させるので、まずは Docker をインストールします。

Kernel のバージョンを確認する

CentOS 7 に Docker をインストールするには Kernel が 3.10 以上ではないといけないようなので Kernel のバージョンを確認します。

$ uname -r
3.10.0-327.el7.x86_64

3.10 以上なので、Docker のインストールを進めていきます。

Docker のインストー

まずは root ユーザに変更します。

$ sudo su -

ここからは root ユーザでの作業にになります。

次のコマンドで Docker のインストールができます。

# curl -fsSL https://get.docker.com/ | sh

インストールが完了したので、バージョンを確認します。

# docker --version
Docker version 1.12.1, build 23cf638

Docker を起動させます。

# service docker start
Redirecting to /bin/systemctl start  docker.service

自動起動の設定も行っておきましょう。

# chkconfig docker on
Note: Forwarding request to 'systemctl enable docker.service'.
Created symlink from /etc/systemd/system/multi-user.target.wants/docker.service to /usr/lib/systemd/system/docker.service.

これで Docker のインストールは完了です。

Docker Compose のインストー

Re:dash は Docker コンテナの管理を Docker Compose で行っているので、Docker Compose もインストールします。

GitHub のリリースページ から最新のコマンドをコピーして、実行します。

# curl -L https://github.com/docker/compose/releases/download/1.8.0/docker-compose-`uname -s`-`uname -m` > /usr/local/bin/docker-compose
# chmod +x /usr/local/bin/docker-compose

これで Docker Compose のインストールが完了となりますので、バージョンを確認してみます。

# docker-compose --version
docker-compose version 1.8.0, build f3628c7

Re:dash のインストー

Docker + Docker Compose のインストールが完了したので、いよいよ Re:dash のインストールをしたいと思います。

まずは、git clone して、サンプルの設定ファイルを元に設定ファイルを作成します。

# git clone https://github.com/getredash/redash.git
# cd redash/
# cp docker-compose-example.yml docker-compose.yml

まずは PostgreSQL のコンテナを起動します。

# docker-compose up postgres

PostgreSQL のコンテナが起動したら、次のコマンドを実行していきます。

なお、PostgreSQL のコンテナ起動後、端末は操作できなくなるので、別タブを開いたりして、再度アクセスし、root ユーザに変更してください。

# ./setup/docker/create_database.sh
# docker-compose up

これで Re:dash が起動したので、ブラウザからアクセスしてみましょう。

f:id:enomotodev:20170519203657p:plain

無事ログインできました!

ログイン画面が表示されたので、ログインしてみましょう。

初期の Email、Password はこちらになります。

  • Email:admin
  • Password:admin

f:id:enomotodev:20170519203705p:plain

MySQL への接続

画面右上の『Data Sources』 → 『New Data Source』をクリックし、MySQL の設定を行っていきます。

ここで注意するのは、MySQL はコンテナのホスト側にあるので、MySQL の Host は Re:dash への接続元 IP になります。

Re:dash への接続元 IP はコンソールに出力されている Re:dash のアクセスログから判断することができます。

グラフ表示する

まず、画面上部の『Queries』 → 『New Query』から Query 入力画面に移動し、『Data Source』に先ほど登録した Data Source がきちんと設定されていることを確認します。

次に、入力フォームに SQL を記述し、『Execute』ボタンを押します。

そうすると下記のように結果が出力されます。

f:id:enomotodev:20170519203711p:plain

結果に問題ないようであれば、『Save』ボタンで今回の SQL を保存することができます。

結果をグラフ化するには『+ NEW VISUALIZATION』ボタンを押して、Visualization Editor に移動します。

画面に従って、グラフの種類や、縦軸・横軸に表示するカラムを設定していくと次のようなグラフが完成します。

f:id:enomotodev:20170519203717p:plain

まとめ

Re:dash を使うことによって、SQL の結果を簡単にグラフ化することができました。

Re:dash は一つひとつの SQL やグラフに固定の URL が割り振られるので、URL さえあれば、SQL での分析結果をみんなで共有することができ、分析結果の属人化を防ぐことができます。

導入自体もそれほど難しくはないので、今後積極的に活用していきたいと思います。

Embulk を使って CSV から MySQL へデータ投入してみた

今回は Embulk を使って、CSV から MySQL にデータを投入してみたいと思います。

Embulk とは

Embulk とはバルクデータローダーと呼ばれる、データ転送ツールです。

Fluentd を開発した Tresure Data によって開発され、Fluentd を知っている方は、Fluentd のバッチ版だと考えると理解しやすいと思います。

(Fluentd についてはこちらで記事にしています)

Fluentd のように入力・出力のプラグインは多数公開されており、例えば、MySQL の入力プラグインと、ElasticSearch の出力プラグインを組み合わせることによって、MySQL のデータを ElasticSearch に移したりなど、異なるデータストア間でのデータの交換が容易に行うことができます。

作業環境

※ Embulk の実行には Java が必須となるので、事前にインストールしておきましょう。

Embulk のインストー

GitHub に記載されている通りにコマンドを叩いていきます。

$ curl --create-dirs -o ~/.embulk/bin/embulk -L "http://dl.embulk.org/embulk-latest.jar"
$ chmod +x ~/.embulk/bin/embulk
$ echo 'export PATH="$HOME/.embulk/bin:$PATH"' >> ~/.bashrc
$ source ~/.bashrc

以上で完了となるので、バージョンを確認してみます。

$ embulk --version
embulk 0.8.13

seed.yml から設定ファイルを自動生成する

livedoor グルメの研究用データセットを使い、口コミのデータを MySQL に投入したいと思います。

まずは、口コミデータ CSV をダウンロードしてきます。

$ wget -O test.tar.gz https://github.com/livedoor/datasets/blob/master/ldgourmet.tar.gz?raw=true
$ tar xfvz test.tar.gz
areas.csv
categories.csv
prefs.csv
ratings.csv
rating_votes.csv
restaurants.csv
stations.csv

何個か CSV ファイルがありますが、この中から ratings.csv のみ使用していきます。

ratings.csv は次のような内容になっています。

id,restaurant_id,user_id,total,food,service,atmosphere,cost_performance,title,body,purpose,created_on
156445,310595,ee02f26a,5,0,0,0,0,,"...",0,"2006-10-07 05:06:09"
3842,10237,fcc21401,1,0,0,0,0,,"...",0,"2004-10-20 00:34:28"
144379,3334,06412af7,2,0,0,0,0,,"...",0,"2006-06-03 16:07:43"
...

Embulk は config.yml ファイルを元にデータの移行を行うのですが、ゼロから記述する場合、CSV ファイルの文字コード、改行コード、デリミタなどをいちいち指定していくのは大変なので、設定ファイルを自動生成してくれる embulk guess コマンドを使って、config.yml ファイルを作成したいと思います。

自動生成するにしても最低限の情報がなければいけないので、seed.yml ファイルに次のように記述します。

  • seed.yml
in:
  type: file
  path_prefix: "./ratings.csv"
out:
  type: stdout

出力ファイル名に config.yml を指定して embulk guess コマンドを実行します。

$ embulk guess seed.yml -o config.yml
2016-09-05 16:30:57.386 +0000: Embulk v0.8.13
2016-09-05 16:30:58.470 +0000 [INFO] (0001:guess): Listing local files at directory '.' filtering filename by prefix 'ratings.csv'
2016-09-05 16:30:58.474 +0000 [INFO] (0001:guess): Loading files [ratings.csv]
2016-09-05 16:30:58.620 +0000 [INFO] (0001:guess): Loaded plugin embulk/guess/gzip from a load path
2016-09-05 16:30:58.630 +0000 [INFO] (0001:guess): Loaded plugin embulk/guess/bzip2 from a load path
2016-09-05 16:30:58.645 +0000 [INFO] (0001:guess): Loaded plugin embulk/guess/json from a load path
2016-09-05 16:30:58.653 +0000 [INFO] (0001:guess): Loaded plugin embulk/guess/csv from a load path
in:
  type: file
  path_prefix: ./ratings.csv
  parser:
    charset: UTF-8
    newline: CRLF
    type: csv
    delimiter: ','
    quote: '"'
    escape: '"'
    trim_if_not_quoted: false
    skip_header_lines: 1
    allow_extra_columns: false
    allow_optional_columns: false
    columns:
    - {name: id, type: long}
    - {name: restaurant_id, type: long}
    - {name: user_id, type: string}
    - {name: total, type: long}
    - {name: food, type: long}
    - {name: service, type: long}
    - {name: atmosphere, type: long}
    - {name: cost_performance, type: long}
    - {name: title, type: string}
    - {name: body, type: string}
    - {name: purpose, type: long}
    - {name: created_on, type: timestamp, format: '%Y-%m-%d %H:%M:%S'}
out: {type: stdout}
Created 'config.yml' file.

これで次のような config.yml が生成されました。

  • config.yml
in:
  type: file
  path_prefix: ./ratings.csv
  parser:
    charset: UTF-8
    newline: CRLF
    type: csv
    delimiter: ','
    quote: '"'
    escape: '"'
    trim_if_not_quoted: false
    skip_header_lines: 1
    allow_extra_columns: false
    allow_optional_columns: false
    columns:
    - {name: id, type: long}
    - {name: restaurant_id, type: long}
    - {name: user_id, type: string}
    - {name: total, type: long}
    - {name: food, type: long}
    - {name: service, type: long}
    - {name: atmosphere, type: long}
    - {name: cost_performance, type: long}
    - {name: title, type: string}
    - {name: body, type: string}
    - {name: purpose, type: long}
    - {name: created_on, type: timestamp, format: '%Y-%m-%d %H:%M:%S'}
out: {type: stdout}

embulk-filter-column プラグイン

このまま MySQL にデータを取り込んでも良いのですが、今回は必要なカラムを絞り、id, restaurant_id, user_id, total, created_on の5つのみのデータを扱うことにしたいと思います。

カラムの絞り込みには embulk-filter-column という便利なプラグインがあるので、これを使ってみたいと思います。

まずは embulk gem install コマンドでインストールします。

$ embulk gem install embulk-filter-column
2016-09-05 16:37:50.601 +0000: Embulk v0.8.13
Fetching: embulk-filter-column-0.5.4.gem (100%)
Successfully installed embulk-filter-column-0.5.4
1 gem installed

インストールが終わったら config.ymlinout の間に、次のように必要なカラムのみ記述します。

  • config.yml
in:
(略)
filters:
  - type: column
    columns:
      - {name: 'id'}
      - {name: 'restaurant_id'}
      - {name: 'user_id'}
      - {name: 'total'}
      - {name: 'created_on'}
out: {type: stdout}

MySQL にデータを取り込む

いよいよ MySQL にデータを取り込んでみたいと思います。

embulk-filter-column プラグインの時と同じように、今度は MySQL の出力用のプラグインembulk-output-mysql をインストールします。

$ embulk gem install embulk-output-mysql
2016-09-05 16:50:54.513 +0000: Embulk v0.8.13
Fetching: embulk-output-mysql-0.6.3.gem (100%)
Successfully installed embulk-output-mysql-0.6.3
1 gem installed

プラグインのインストールが完了したら config.ymloutembulk-output-mysql プラグイン用の設定を記述していきます。

  • config.yml
out:
  type: mysql
  host: localhost
  user: root
  password: uhsd!Aid;3Zt
  database: testdb
  table: ratings
  mode: replace

mode という部分は insert も選択することができ、Embulk を繰り返した時に、insert だと追記、replace だと置き換えになります。今回は replace を選択しました。

データベースは事前に作成しておく必要がありますが、テーブルやスキーマの作成は Embulk 側で自動で作成してくれるので、事前に作成する必要はありません。

それでは embulk run コマンドでデータの取り込みを開始したいと思います。

$ embulk run config.yml

20万件以上のデータなので、少し時間がかかると思います。

※ 私の環境では完了するまで 5 分ほどかかりました。

データの取り込みが完了したので、MySQL のデータを確認してます。

mysql> select count(*) from ratings;
+----------+
| count(*) |
+----------+
|   205805 |
+----------+
1 row in set (0.04 sec)

mysql> select * from ratings limit 20;
+--------+---------------+----------+-------+---------------------+
| id     | restaurant_id | user_id  | total | created_on          |
+--------+---------------+----------+-------+---------------------+
| 156445 |        310595 | ee02f26a |     5 | 2006-10-07 05:06:09 |
|   3842 |         10237 | fcc21401 |     1 | 2004-10-20 00:34:28 |
| 144379 |          3334 | 06412af7 |     2 | 2006-06-03 16:07:43 |
| 144377 |         15163 | 06412af7 |     5 | 2006-06-03 15:14:45 |
|  75967 |           567 | 4ceec99d |     3 | 2004-12-01 23:12:29 |
| 104898 |          1026 | 4ceec99d |     5 | 2005-01-04 03:57:02 |
|  86073 |          1058 | 4ceec99d |     5 | 2004-11-09 00:34:17 |
|  13968 |          2569 | 4ceec99d |     3 | 2004-09-22 23:29:57 |
|  97833 |          3309 | 4ceec99d |     4 | 2005-05-28 23:17:16 |
|  13991 |          3648 | 4ceec99d |     4 | 2004-09-27 11:14:50 |
|  69284 |          4226 | 4ceec99d |     5 | 2004-10-31 16:32:43 |
|   5658 |          4659 | 4ceec99d |     4 | 2004-09-22 23:04:12 |
|  89226 |          5075 | 4ceec99d |     5 | 2005-03-21 22:56:45 |
|  15001 |          5099 | 4ceec99d |     3 | 2004-09-24 11:42:10 |
| 116898 |          5219 | 4ceec99d |     5 | 2005-09-20 00:53:40 |
|  21991 |          5449 | 4ceec99d |     5 | 2004-11-10 00:13:09 |
|  68974 |          6033 | 4ceec99d |     4 | 2004-11-03 23:45:02 |
|  15434 |          6899 | 4ceec99d |     5 | 2004-09-22 22:29:51 |
| 116890 |          8638 | 4ceec99d |     4 | 2005-09-20 00:34:25 |
|  13997 |          8895 | 4ceec99d |     5 | 2004-09-27 10:54:32 |
+--------+---------------+----------+-------+---------------------+
20 rows in set (0.00 sec)

mysql> select total, count(*) from ratings group by total;
+-------+----------+
| total | count(*) |
+-------+----------+
|     0 |     7159 |
|     1 |     4975 |
|     2 |    14565 |
|     3 |    64743 |
|     4 |    79593 |
|     5 |    34770 |
+-------+----------+
6 rows in set (0.10 sec)

まとめ

Embulk を使って CSV から MySQL へデータを投入してみました。

もう一度 Embulk を使うことによって、今度は MySQL から ElasticSearch などにデータを投入することもできるので、いろいろな使い方を考えていきたいと思います。

CentOS 7 に MySQL 5.7 を yum インストールして初期設定までやってみた

CentOS 7.2 上に MySQL 5.7 を yum インストールして、初期設定まで行ったので、その手順を記していきたいと思います。

はじめに

CentOS 7 よりデータベースサーバの MySQLMariaDB に置き換えられました。

もしすでに MariaDB がインストールされている場合はこれからインストールする MySQL と競合を起こさないように削除しましょう。

$ sudo yum remove mariadb-libs
$ sudo rm -rf /var/lib/mysql

これで MariaDB 本体とデータフォルダを削除できました。

yum リポジトリの追加

CentOS 7 に MySQL 公式の yum リポジトリを追加します。

$ sudo rpm -ivh http://dev.mysql.com/get/mysql57-community-release-el7-8.noarch.rpm

MySQL のインストー

MySQL 公式の yum リポジトリが追加できたので、yum install コマンドでインストールしましょう。

$ sudo yum install mysql-community-server

バージョンを確認します。

$ mysqld --version
mysqld  Ver 5.7.14 for Linux on x86_64 (MySQL Community Server (GPL))

無事 MySQL 5.7 がインストールできました!

MySQL の起動

MySQL がインストールできたので、早速起動させましょう。

$ sudo systemctl start mysqld.service

自動起動の設定も行っておきます。

$ sudo systemctl enable mysqld.service

MySQL の初期パスワード確認

MySQL 5.7 では、初回起動時に初期パスワードが生成されるので、ログファイルから生成されたパスワードを確認する必要があります。

$ $ sudo cat /var/log/mysqld.log | grep password
2016-09-01T13:09:03.337119Z 1 [Note] A temporary password is generated for root@localhost: uhsd!Aid;3Zt

今回の場合、uhsd!Aid;3Zt の部分が初期パスワードになります。

MySQL のセキュリティ設定

mysql_secure_installation コマンドを実行して、MySQL のセキュリティ設定を行っていきます。

対話形式なので、比較的簡単に最低限必要と考えられるセキュリティの設定ができます。

$ mysql_secure_installation

Securing the MySQL server deployment.

Enter password for user root: # ログファイルから取得した初期パスワードを入力します

The existing password for the user account root has expired. Please set a new password.

New password: # root ユーザの新規パスワードを入力します

Re-enter new password: # 確認用にもう一度入力します
The 'validate_password' plugin is installed on the server.
The subsequent steps will run with the existing configuration
of the plugin.
Using existing password for root.

Estimated strength of the password: 100
Change the password for root ? ((Press y|Y for Yes, any other key for No) : y

By default, a MySQL installation has an anonymous user,
allowing anyone to log into MySQL without having to have
a user account created for them. This is intended only for
testing, and to make the installation go a bit smoother.
You should remove them before moving into a production
environment.

Remove anonymous users? (Press y|Y for Yes, any other key for No) : y # 匿名ユーザーアカウントを削除
Success.


Normally, root should only be allowed to connect from
'localhost'. This ensures that someone cannot guess at
the root password from the network.

Disallow root login remotely? (Press y|Y for Yes, any other key for No) : y # ローカルホスト以外からアクセス可能な root アカウントを削除
Success.

By default, MySQL comes with a database named 'test' that
anyone can access. This is also intended only for testing,
and should be removed before moving into a production
environment.


Remove test database and access to it? (Press y|Y for Yes, any other key for No) : y # test データベースの削除
 - Dropping test database...
Success.

 - Removing privileges on test database...
Success.

Reloading the privilege tables will ensure that all changes
made so far will take effect immediately.

Reload privilege tables now? (Press y|Y for Yes, any other key for No) : y
Success.

All done!

MySQL へのログイン確認

さきほど設定した新しいパスワードでログインできるかどうか確認します。

$ mysql -u root -p
Enter password: # 新しいパスワードを入力
Welcome to the MySQL monitor.  Commands end with ; or \g.
Your MySQL connection id is 11
Server version: 5.7.14 MySQL Community Server (GPL)

Copyright (c) 2000, 2016, Oracle and/or its affiliates. All rights reserved.

Oracle is a registered trademark of Oracle Corporation and/or its
affiliates. Other names may be trademarks of their respective
owners.

Type 'help;' or '\h' for help. Type '\c' to clear the current input statement.
mysql> show databases;
+--------------------+
| Database           |
+--------------------+
| information_schema |
| mysql              |
| performance_schema |
| sys                |
+--------------------+
4 rows in set (0.00 sec)

設定変更

MySQL 5.7 からパスワードの有効期限がデフォルトで360日になり、360日を経過するとパスワードの変更を促されて MySQL にログインできなくなります。

default_password_lifetime の値を 0 に変更して、この有効期限の設定を無効にしたいと思います。

また、デフォルトの文字コードUTF-8 に変更します。

  • /etc/my.cnf
[mysqld]
.
.
.
character-set-server = utf8
default_password_lifetime = 0

MySQL を再起動させ、設定内容を反映させます。

$ sudo systemctl restart mysqld.service

以上で設定は完了となります。

まとめ

CentOS 7 に MySQL 5.7 を yum インストールし、最低限の設定を行いました。

本番環境で運用する際は、チューニングも含めて、さらに細かい設定が必要になってくると思いますが、サービスに合わせて適切な設定を考えていきたいと思います。

ECMAScript について調べてみた

最近、ECMAScript2015 や ES6 などの言葉をよく聞くようになってきたので、復習も兼ねて、ECMAScript について調べてみました。

ECMAScript とは?

ECMAScript とは、標準化団体である Ecma International が策定している、JavaScript の標準規格のことです。

開発当初の JavaScript は、各ベンダーのブラウザによって独自拡張が数多く実装されており、互換性が低かったため、Ecma International が中心となり標準規格である ECMAScript が策定されました。

ECMAScript 6 / 2015 って何?

正式名称は『ECMAScript 2015』(省略して『ES2015』とも呼ばれる)。

リリースは2015年6月。

ECMAScript の 6th Edition である為、当初は『ES6』と呼ばれていたが、正式名称を『ECMAScript 2015』とし、今後年単位のリリースとし、バージョンを年(ES2017, ES2018, …)にしていく予定のようです。

なお、最新のバージョンは2016年6月にリリースされた『ECMAScript 2016(ES2016)』になります。

公式へのリンクはこちらです。

ES2015 の新機能

ES2015 で追加された主な機能は下記になります。

  • letconst キーワードによる変数宣言
  • クラス構文
  • アロー関数
  • 分割代入
  • 配列展開
  • 可変長引数
  • 関数のデフォルト引数
  • テンプレート文字列

ここから1つひとつ見ていきましょう。

letconst キーワードによる変数宣言

これまでの var で変数を宣言した場合と違い、letconst で変数を宣言すると、その変数のスコープは宣言したブロック内になります。

if (1) {
    var foo = 'foo';
    let bar = 'bar';
    const baz = 'baz';
}

console.log(foo);  // foo
console.log(bar);  // エラー
console.log(baz);  // エラー

また、const は定数を宣言したい時に使用され、const で宣言された変数は、宣言時を除いて値の代入が不可能になります。

var foo = 'foo';
let bar = 'bar';
const baz = 'baz';

foo = 'foo2';  // 代入可能
bar = 'bar2';  // 代入可能
baz = 'baz2';  // エラー

クラス構文

ES2015 以前までは、prototype を利用することで、クラスのようなものを作成していました。

function Human(name) {
    this.name = name;
}

Human.prototype.hello = function () {
    console.log('私の名前は ' + this.name + ' です。');
};
obj = new Human('enomotodev');
obj.hello();
//=> '私の名前は enomotodev です。' 

これをクラス構文を使用すると

class Human {
    constructor(name) {
        this.name = name;
    }
    hello() {
        console.log('私の名前は ' + this.name + ' です。');
    }
}
obj = new Human('enomotodev');
obj.hello();
//=> '私の名前は enomotodev です。' 

このように書くことができます。

extends を使用してクラスの継承を行うことも可能です。

class Human {
    constructor(name) {
        this.name = name;
    }
    hello() {
        console.log('私の名前は ' + this.name + ' です。');
    }
}

class Engineer extends Human {
    constructor(name) {
        super(name);
        this.occupation = 'エンジニア';
    }
    hello() {
        super.hello();
        console.log('職業は ' + this.occupation + ' です。');
    }
}
obj = new Engineer('enomotodev');
obj.hello();
//=> '私の名前は enomotodev です。' 
//=> '職業は エンジニア です。'

なお、上記のように子クラスでは super() で親クラスの constructor の実行、super.メソッド名() で親クラスのメソッドの実行ができます。

アロー関数

これまでの funciton を使った関数宣言に加えて、=>(アロー)を用いた関数宣言が可能になりました。

アロー関数による関数宣言の特徴としては、

  • 引数が1つの場合は () が省略可能
  • 関数の中身が単一式の場合は、{}return を省略できる

というものになります。

// これまでの function を使った関数宣言
var foo = function(x, y) {
  return x * y;
};

// アロー関数
var bar = (x, y) => {
  return x * y;
};

// 単一式の場合は {} や return を省略可能
var baz = (x, y) => x * y;

// 引数が1つの場合は () が省略可能
var qux = x => x * 2;

分割代入

複数の変数に、複数の値をまとめて代入できるようになりました。

// これまで複数にの変数に代入する場合
var foo = 'abc';
var bar = 123;

// 分割代入を使用した場合
var [foo, bar] = ['abc', 123];

配列展開

関数の呼び出し、配列への代入などに対して、... を使用することにより、配列を展開して使用する事ができるようになりました。

  • 関数の呼び出し
var array = [1, 2, 3];
var foo = function(x, y, z) {
    console.log(x, y, z);
}

f(...array);
//=> 1 2 3

[1, 2, 3] という配列を展開しているので、f(...array)foo(1, 2, 3) という引数での関数 foo の呼び出しと同じになります。

  • 配列への代入
var array = [1, 2, 3];
var foo = [...array, 4, 5, 6];

console.log(foo);
//=> [1, 2, 3, 4, 5, 6]

可変長引数

関数を定義する際に、... を使用することによって、引数に可変長引数を指定することができるようになりました。

var foo = function(x, ...args) {
    console.log(x, args);
};

foo('a', 'b', 'c');
//=> a ["b", "c"]

foo('a', 'b', 'c', 1, 2, 3);
//=> a ["b", "c", 1, 2, 3]

foo('a');
//=> a []

デフォルト引数

関数宣言時に変数に代入を行うことで、デフォルト値を設定できるようになりました。

var foo = function(a, b = 1) {
  console.log(a + b);
};

foo(10);
//=> 11

テンプレート文字列

`` で文字列を囲むことで、文字列内での変数展開が ${} で行うことができ、改行もそのまま反映することができるようになりました。

var name = 'enomotodev';
var hello = `私の名前は
${name} です`;

console.log(hello);
//=> 私の名前は
//=> enomotodev です

ES2016 の新機能

ここまで ES2015 で追加された主な機能を確認してきましたが、ES2016 の新機能についても見ていきましょう。

  • べき乗演算子
  • Array.prototype.includes() メソッド

べき乗演算子

これまでべき乗の計算は、Math.pow() を使用してきましたが、** で簡単に記述できるようになりました。

// これまでの場合(2の5乗)
var foo = Math.pow(2, 5);

console.log(foo);
//=> 32

// ** を使用した場合(2の5乗)
var bar = 2 ** 5;

console.log(bar);
//=> 32

Array.prototype.includes() メソッド

Array.prototype.includes() メソッドは、配列内にある要素が含まれているかどうかを調べるためのメソッドです。

var foo = [1, 2, 3, 4, 5];

// 配列に 1 が含まれているかどうか
console.log(foo.includes(1));
//=> true

// 配列に 6 が含まれているかどうか
console.log(foo.includes(6));
//=> false

まとめ

新機能の紹介がメインとなりましたが、ES2015(ES6)と ES2016 について改めて調べてみました。

もちろん他にもたくさんの新機能がありますので、改めてきちんと学び直してみるのも良いと思います。

一部のブラウザによっては未対応の機能もあるので、Babel などを使いコンパイルする必要がありますが、それらについてはまた別の機会に記事にしたいと思います。

【 Composer 編】Mac に Docker インストールしてみた

前回の『【 php-fpm 編】Mac に Docker インストールしてみた』の続きです

enomotodev.hatenablog.com

Database と連携する前に、Composer と連携し、PHP フレームワークLaravel をインストールしてみようと思います

Composer のイメージを pull する

$ docker pull composer/composer
...(略)
Status: Downloaded newer image for composer/composer:latest

Composer コンテナを起動する

Composer で Laravel をインストールする前に、前回作成した index.php を削除しておきましょう

cd ~/docker/www && rm index.php

それでは Composer で Laravel をインストールしてみます

$ docker run --rm -v /Users/enomotodev/docker/www:/app composer/composer create-project --prefer-dist laravel/laravel ./

これで Laravel がインストールされました

--rm オプションを使用することによって、コンテナを起動して終了するとコンテナを破棄してくれます

~/nginx/nginx.conf を下記のように編集して、Nginx のコンテナを再起動させます

  • ~/nginx/nginx.conf
root /var/www/html;
↓
root /var/www/html/public;
  • Nginx コンテナを再起動
$ docker restart nginx

次にパーミッションを整えます

$ chmod -R 777 ~/docker/www/storage ~/docker/www/bootstrap/cache

ブラウザで確認してみましょう

f:id:enomotodev:20170519202535p:plain

無事 Laravel が起動できました!

まとめ

PHP 開発に欠かせない Composer も Docker で簡単に導入することができました

Composer は install や update 時にしか使わないので、docker run のときに --rm オプションを使用し、コンテナの終了時にコンテナを破棄するのがポイントになります

次回は MySQL と連携していきたいと思います