OmniAICreator/Qiita-1.07M huggingface dataset:
terraformでredash環境を構築する時のRDSの初期テーブル作成エラー

AWS上にterraformでredash環境を構築する場合にRDSの接続でエラーが出たのでメモ  

#構成  

- redashはECSクラスター上でコンテナにして動かす  
- redashのバックエンドはElasticCacheとRDSを利用  
- RDSのデータをredashで可視化する  

今回はバックエンドで使用するRDSデータベースに関して

<img width="507" alt="スクリーンショット 2017-08-25 18.11.35.png" src="https://qiita-image-store.s3.amazonaws.com/0/198985/98f78a48-550c-daec-bda1-da905afb119c.png">

#問題となったエラー文
以前お手製で作ったRDSだとうまくいったが、
それと同じ設定のterraformで作成したRDSだと以下のエラーがでた。

`Task redash.tasks.refresh_queries ... relation "queries" does not exist ...`  

queriesテーブルがないよって言われてる...
確かにRDSの中身を見てみるとterraformで作成したRDSのpostgresスキーマには
テーブルが一つも存在していなかった。

以前作ったRDSには色々テーブルができているがredashはいつ作ったのだろうか...

#解決
初期設定時に自動で作ってくれそうな気もするが、
ひとまずデータベース作成用のコンテナを起動することでテーブルが作成された。
毎回create_dbをするのは少し違う気がするがひとまずデータが消えるわけでもないのでそれで対応
  
```task_definition.json
...
{
    "essential": false,
    "name": "create_db_worker",
    "environment": [
      ...
    ],
    "image": "redash/redash:2.0.0.b2963",
    "command": [
      "create_db"
    ],
    "logConfiguration": {
      "logDriver": "awslogs",
      "options": {
        "awslogs-group": "ecs-log-group",
        "awslogs-region": "ap-northeast-1",
        "awslogs-stream-prefix": "redash"
      }
    },
    "cpu": 10,
    "memoryReservation": 128
  },
...
```
C++ | boost > CRC-16 (Modbus)

```txt:動作環境
https://wandbox.org/
- gcc HEAD 8.0.0 2017
- Boost 1.64.0
- C++1z(GNU)
- no pedantic
```

CRC-16 (Modbus)に関して、@h_matsumuraさんに[教えていただいた](http://qiita.com/7of9/items/79db45461513029f4ac1#comment-0e0ac3962ee98ced1278)Boostの方法を試してみる。

### 参考

**中国語のサイトです**。
https://www.amobbs.com/thread-5630500-1-1.html

xiè-xie nín


### code

```cpp
#include <iostream>
#include <boost/crc.hpp>

int main(void) {
    typedef boost::crc_optimal<16, 0x8005, 0xFFFF, 0, true, true> modbus_crc;
    char pdu[] = "123456789";
    
    modbus_crc crc;
    crc.process_bytes(pdu, 9);
    
    std::cout << std::hex << crc.checksum() << std::endl;
	return 0;
}
```

```txt:run
Start
4b37
0
Finish
```

https://www.lammertbies.nl/comm/info/crc-calculation.html
の結果「CRC-16 (Modbus)」0x4B37と同じになった。
rspecでexcludeを使用したい

# rspecのテストでexcludeを使用したい

includeの逆のexcludeを使用したかった。
しかしexcludeとしてもエラーになってしまうので解決方法をメモ。

## include
rspecのテストで

```include_hogehoge_rspec.rb
@expected = "hogehoge"
expect(response.body).to include(@expected)
```

bodyに`hogehoge`という文字が含まれているかかどうかを調べるにはこのようにすればいい。


## exclude

逆に、`hogehoge`という文字が含まれてないかをするには

```exclude_hogehoge_rspec.rb
@expected = "hogehoge"
expect(response.body).to exclude(@expected)
```

このようにすればいいと思っていた。
しかし、定義されていないようで

```
undefined method `exclude'
```
と出てしまう。

## 解決方法

includeの反対はexcludeだよと定義してあげればいいらしい。

```exclude_hogehoge_rspec.rb
# これでincludeのネガティブをexcludeと定義する
RSpec::Matchers.define_negated_matcher :exclude, :include

@expected = "hogehoge"
expect(response.body).to exclude(@expected)
```

なるほど便利。
[linux] システム起動時間を取得するサンプルコード

uptimeコマンドで確認できる、Linuxシステムが起動してからの時間をC言語のコードから取得できるようにする

```shell-session:uptimeコマンドの実行例
$ uptime
 16:35:03 up  7:39, 11 users,  load average: 0.00, 0.00, 0.00
 ```

/proc/uptime の中を見ると以下のように、二つの値が取得できる

```shell-session:/proc/uptimeの取得例
$ cat /proc/uptime
27118.96 189325.22
```

このうち、左から1番目の値が起動からの秒数でuptimeコマンドで取得できる値である。2番目はアイドル時間である。1番目の値を取得するようにコードを書けばよい

```c++:サンプルコード
//#include <stdio.h>  // printfしたければinclude
#include <stdlib.h>  // strtof
#include <string.h>
#include <time.h>
#include <fcntl.h>
#include <unistd.h>
#include <errno.h>
#include <locale.h>

/**
 * Linuxの起動時間を取得する
**/
time_t
getLinuxUptime()
{
    int fd;
    char buf[64];
    char *endptr, *saveptr;
    ssize_t len;
    time_t get_time = 0;
    char *savelocale;

    fd = open("/proc/uptime", O_RDONLY);
    if (fd < 0){
//        printf("cannot open proc uptime: %s", strerror(errno));
        return 0;
    }
    lseek(fd, 0L, SEEK_SET);

    savelocale = strdup(setlocale(LC_NUMERIC, NULL));
    if (savelocale) {
        setlocale(LC_NUMERIC,"C");
    }

    len = read(fd, buf, sizeof(buf)-1);
    if (len < 0) {
        buf[0] = '\0';
//        printf("cannot read proc uptime: %s", strerror(errno));
    } else {
        buf[len] = '\0';
    }

    if (savelocale) {
        setlocale(LC_NUMERIC, savelocale);
        free(savelocale);
    }

    close(fd);

    if (strtok_r(buf, " ", &saveptr) != NULL) {
        get_time = (time_t)strtof(buf, &endptr);
        if (*endptr != '\0') {
//            printf("linux uptime parse miss. buffer=%s", buf);
        }
    }

//    printf("Linux Uptime: %lu\n", (unsigned long)get_time);

    return get_time;
}
```


procps-ngのコードが参考になった
https://gitlab.com/procps-ng/procps

ソースを見て初めて知ったのだが、uptimeの"-s"オプションを指定するとシステムを起動した時間が分かる。

```shell-session:実行例
$ uptime -s
2017-08-18 08:55:20
```
※ 現在時刻を基準に算出しているので、コマンド実行時に正しい時刻が設定されていることが前提
Anaconda: ビギナーズガイド

Pythonのディストリビューションの一つであるAnacondaをインストール, そして簡易的な操作をまとめた.

#### 著者の環境
MacOS Sierra 10.12.1

### 特徴

Anacondaはデータサイエンス分野で有用なパッケージがあらかじめ含まれているため, その分野において好まれている.
 `conda`という独自のパッケージ管理を利用する(`pip`も利用可能).

### インストール

[公式サイト](https://www.continuum.io/)からインストーラをダウンロードしてインストール. Python 3.6か2.7かは使用用途に応じて選択.　
容量が厳しいなら全てではなく必要なパッケージだけをインストールすることもできる.

**ここからはterminalでの操作.**

### バージョンの確認, パッケージ一覧の取得

| コマンド       　　|       用途		　|
|:-----------------|:------------------|
| `python`         |インタプリタを起動してversionの確認. `exit()`で抜け出す. |
| `pip list`       |`pip`を使用してパッケージ一覧を取得. |
| `conda list`     | `conda`を使用してパッケージ一覧を取得.(`pip`よりもこちらを推奨) |


### 環境設定

pyenvでも可能な環境の切り替え.

| コマンド       　　|       用途		　|
|:-----------------|:------------------|
| `conda create --name hoge flask`  |環境名:`hoge`の新規環境を作成. `hoge`以降は欲しいパッケージを必ず一つは指定(今回の例では`flask`). |
| `conda create --name hoge27 python=2.7 flask`      | Pythonのバージョンを指定して環境名:`hoge27`の新規環境を作成. |
| `source activate hoge`       |`hoge`環境に移行.  |
| `source deactivate hoge`     | `hoge`環境を離脱. |
| `conda env list`     | 利用可能な環境の一覧を取得. `*`がついているものが現在有効になっている環境. |
| `conda remove --name hoge --all`     | 環境`hoge`を削除. |

#### Jupyter Notebookについて

Anacondaをインストールした後は, terminalで`jupyter notebook`をタイプすれば起動できる.
マークダウンに書かれたコードを実行する

マークダウンはコードを手軽に表現できる書類です。それからコードだけを出力するコマンドを用意するとドキュメントからコードを生成する事が可能です。従来はコードのコメントでドキュメントを生成しますが、その逆を実現してみようというお話です。

コマンドを``md2code``と名付けてRubyで実装してみました。ソースを以下に示します。とても簡単な内容なのでRuby以外の使用環境に適した言語で実装できるかと思います。

## md2code

<pre>#!/usr/bin/env ruby

if ARGV.length == 0 || ARGV[0] == &#39;-h&#39; || ARGV[0] == &#39;--help&#39;
  STDERR.puts &#39;usage: md2code markdownfile&#39;
  exit 1
end

begin
  ARGV.each do |arg|
    File.read(arg).scan(/(&#096;&#096;&#096;+)(.*?\n)(.*?)(\1\n)/m){puts $3}
  end
rescue =&gt; e
  STDERR.puts &#39;md2code: &#39; + e.message
end</pre>

### 使用例

<pre>$> md2code md2code-doc.rb.md | ruby</pre>

マークダウン書類の<code>&#096;&#096;&#096;</code>で囲まれたコードが抽出されて標準出力、Rubyへと渡されて実行されます。

このドキュメント自体(``md2code-doc.rb.md``)が``md2code``のサンプルコードでもあります。

<span style="font-size:0.9em">＊ここまでの上記コードはマークダウンを変換したものではなくHTML埋め込みによる表示なので``md2code``では無視されます。</span>

ここから先は実際に動作可能なコードとなります。

---

これはRubyのサンプルです。

```ruby
puts 'hello ruby'
```

もう一度。

```ruby
puts 'hello ruby (again)'
```

以上です。
Raspberry pi のZabbixをバージョンアップした 3.2→3.4

# raspberry piのZabbixを3.4へバージョンアップ

## やること

Raspberry pi 内のZabbix3.2を3.4へバージョンアップします。
ソースからコンパイルしています。

恐らく過去の3.0→3.2のバージョンアップ方法と基本は変わらないと思われます


## 前提

Zabbix 3.2.6 インストール済み

raspbian 情報

```
pi@raspberrypi:~ $ cat /etc/debian_version
8.0
pi@raspberrypi:~ $ cat /proc/version
Linux version 4.9.35-v7+ (dc4@dc4-XPS13-9333) (gcc version 4.9.3 (crosstool-NG crosstool-ng-1.22.0-88-g8460611) ) #1014 SMP Fri Jun 30 14:47:43 BST 2017
```

## 準備

### サーバの停止

```
sudo systemctl stop zabbix-server
sudo systemctl stop zabbix-agent
```

### DBのバックアップ

```
mysqldump -uzabbix -pzabbix --default-character-set=utf8 --database zabbix > zabbix_dump.db
```

## インストール

###必要モジュールの追加インストール

3.2の時は入っていなくてもコンパイル可能でしたが
3.4では無いと環境チェックで怒られました

```
sudo apt-get install libevent-dev libncurses5-dev libpcre++-dev
```

### 展開

sourceforgeからDLします
ファイル名潰れるから--trust-server-names使う。

```
cd /usr/src
wget --trust-server-names "http://sourceforge.net/projects/zabbix/files/ZABBIX%20Latest%20Stable/3.4.1/zabbix-3.4.1.tar.gz/download"
tar -zxvf zabbix-3.4.1.tar.gz
cd zabbix-3.4.1
```

### コンパイル&インストール

3.2をコンパイルした時のオプションを流用

```
./configure --enable-server --enable-agent --with-mysql --with-net-snmp --with-libcurl --with-openipmi --with-ssh2 --with-libxml2 --enable-ipv6 --with-unixodbc --with-openssl --enable-java --with-jabber --with-ldap

sudo make install
```

### フロントエンドのコピー

```
cd /var/www/html/zabbix
mkdir ~/zabbix_back
sudo mv * ~/zabbix_back/

cd /usr/src/zabbix-3.4.1/frontends/php
sudo cp -a . /var/www/html/zabbix
sudo cp ~/zabbix_back/conf/zabbix.conf.php /var/www/html/zabbix/conf/
```

グラフ用日本語フォントコピー（文字化け回避）

```
sudo cp ~/zabbix_back/fonts/ipagp.ttf /var/www/html/zabbix/fonts/
```

フォント設定
DejaVuSans → ipagp

```
vi /var/www/html/zabbix/include/defines.inc.php
```

↓ファイル内容を変更する

```
define('ZBX_GRAPH_FONT_NAME',　'ipagp');
define('ZBX_FONT_NAME', 'ipagp');
```


## Zabbix起動

```
sudo systemctl start zabbix-server
sudo systemctl start zabbix-agent
```

これでDBもマイグレーションされて動くはず。


アップデート後フロントエンドのダッシュボード、グラフ表示が崩れる場合Shift+F5かCtrl+F5でフルリロードを行って下さい。

3.4.0→3.4.1へのバージョンアップもほぼ同じ手順です。

パーミッション次第でsudoが不必要な場所もあるかもしれないです。
Rails5.1.2 + Webpacker + ReactをCapstranoでデプロイする手順書②

前回: [Rails5.1.2 + Webpacker + ReactをCapstranoでデプロイする手順書をCapstranoでデプロイする手順書①](http://qiita.com/gcmae/items/95ebd532742f736b8c98)
# 前書き
前回の続きになります。
前回はローカルでの作業
今回は、サーバ側の作業からデプロイまでを記載します。

# サーバ手順
サーバ側にてデプロイ受けの設定を行います。
主にNginxの設定です。
## Nginx設定
### 手順
- Nginxインストール
- 設定ファイル作成

### Nginxインストール
WEBサーバである、Nginxをサーバへインストールします。

```
# Nginxのインストール
$ sudo yum install nginx
# Nginxの設定ファイル作成(conf.dまでディレクトリはNginxインストールで作成されます。)
$ sudo vim /etc/nginx/conf.d/アプリ名.conf
```

設定ファイルの内容は以下の通りです。

```rb

# log directory
error_log  /var/www/rails/アプリ名/current/log/nginx.error.log; #ログ
access_log /var/www/rails/アプリ名/current/log/nginx.access.log; #ログ
# max body size
client_max_body_size 2G;
upstream unicorn {
  # for UNIX domain socket setups
  server unix:/var/www/rails/アプリ名/current/tmp/unicorn.sock;
}
server {
  listen 80;
  server_name サーバのIP;
  keepalive_timeout 5;
  root /var/www/rails/アプリ名/current/public;
  try_files $uri/index.html $uri.html  $uri @unicorn;

  location @unicorn {
    # HTTP headers
    proxy_set_header X-Real-IP $remote_addr;
    proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
    proxy_set_header Host $http_host;
    proxy_pass http://unicorn;
  }
}
```

ざっくり解説すると
log directoryは、Capistranoが作成するcurrentの中を指定します。
ここは制約がないため、自由です。
upstream unicornには、Unicornのsockファイルを指定します。
サーバ上でUnicornが起動すると作成されるファイルです。
作成場所は前述したUnicornの設定ファイルで指定されたディレクトリです。

以上までできればあとは、もう少しです。

## ディレクトリ作成

サーバ上にて、アプリケーションのディレクトリを作成します。
場所は基本自由ですが、Capistranoの設定ファイルに合わせた場所にしておきましょう

```bash
$ mkdir /var/www/rails/アプリ名
```

# デプロイ
設定ファイルお疲れ様でした！
ここまでこれば、あとはデプロイを試すだけです。
まずは今までの設定ファイルをGit pushします(CapistranoがDeployするブランチを確認)
masterが最新になり、masterにUnicornやCapistranoの設定があることを確認したら
早速、ローカルで以下のコマンドを実行します。

```bash
$ bundle exec cap production deploy
```

設定ファイルに問題がなければ、続々とターミナルでDeployのコマンドが流れると思います。
その中で、Git cloneしたり、bundle installしたり、Webpacker compileしたり、migrateしたり云々
ちなみに
今更感ありますが
WebpacerのCompileで、例えば**manifest.jsonがない！！**といったエラーが出る場合
ほとんどが、**サーバのスペック不足**になります。
サーバと接続しながら、それでいてデプロイのコマンドを流して、それのログをローカルへ送ってなどしているためかと思います(ざっくり)
現に、最初はt2.microで作業していたのですが、Webpackerでよく転けるため、一度、t2.smallへ変更したところ
何事もなかったかのようにデプロイができました。
一度、ご確認を！

デプロイが正常に終了すると、**deploy log_revision**と表示されターミナルが帰ってきます。
一度、サーバへSSHで入ってもらうと、作成した/var/www/rails/アプリ名の中にcurrentフォルダとreleasesフォルダが作成できていると思います。

フォルダ作成が確認できたら、Nginxを起動します。

```
sudo service nginx start
```

正常に起動したら、
ブラウザで接続し、アプリが表示されれば、Capistranoのデプロイ完成になります。


# 後書き
サーバ系を本格的に触るのは初めてでしたが、思ったよりも簡単にCapistranoでのデプロイが出来ました。
ReactをフロントとしたRailsのアプリは今、かなりキテいる構成だと思いますので、
今後の新規サービスデプロイのため、この手順は大切に覚えていこうと思います(笑)
Laravel Join scopeOfComputer

laravel の　Modelでjoinの使い方

Computerテーブルは post_id と　server_id持っている。
例1.

```php
    public function scopeOfComputer($query, $computerId)
    {
        return $query
            ->join('post_servers', 'post.id', '=', 'post_id')
            ->join('servers', 'server_id', '=', 'servers.id')
            ->where('servers.computer_id', $computerId);
    }
```

例2.

```php
 public function scopeWatchersOf($query, Topic $topic)
    {
// function ($join) use ($topic) メソードの中の関数に受け取ったを引数を渡す
        return $query->join('watches', function ($join) use ($topic) {
            $join->on('watches.topic_id', '=', 'topics.id')
                ->where('watches.topic_id', '=', $topic->id);
        })
            ->join('users', 'users.id', '=', 'watches.user_id')
            ->select(['users.id', 'users.name', 'users.avatar']);
    }
```
hasManyThroughの使い方

```php
class Country extends Model
{
    public function posts()
    {
        return $this->hasManyThrough('App\Post', 'App\User','country_id', 'user_id', 'id');
    }
}
```
リレーションのキーをカスタマイズしたい場合は、hasManyThroughメソッドの第３引数と、第４引数を指定してください。第３引数は仲介モデルの外部キー名、第４引数は最終的なモデルの外部キー名です。そして第５引数はローカルキーです。
Python > datetime > 実行時引数 > すぐに処理を始める

```txt:動作環境
Raspberry Pi 2 Model B (以下RPi)
Raspbian Jessie
Python 2.7.9
```

[Python > datetime > 開始時分秒まで待つ](http://qiita.com/7of9/items/0ec6c6b830409dfc0441)にて待機処理を実装した。

一方で、ある条件においては「すぐに始めたい」場合もあるだろう。

実行時引数をチェックする処理を実装した。

### import用

```util_arg_no_wait_170825.py
from __future__ import absolute_import
from __future__ import division
from __future__ import print_function
import argparse

# PEP8


def hasNoWaitArgument():
    parser = argparse.ArgumentParser(description="wait mode")

    parser.add_argument(
        '-n',
        '--noWaitStart',
        dest='noWaitStart',
        action='store_true',
        help='no wait start')

    cmd_args = parser.parse_args()
    return cmd_args.noWaitStart


if __name__ == '__main__':
    if not hasNoWaitArgument():
        print('waiting')
        # do some wait
    print('started')

```

### help

```
$ python util_arg_no_wait_170825.py -h
usage: util_arg_no_wait_170825.py [-h] [-n]

wait mode

optional arguments:
  -h, --help         show this help message and exit
  -n, --noWaitStart  no wait start
```

### waitあり実行例

```
$ python util_arg_no_wait_170825.py 
waiting
started
```

### waitなし実行例

```
$ python util_arg_no_wait_170825.py -n
started
```

### 使用例

http://qiita.com/7of9/items/0ec6c6b830409dfc0441
のutil_wait_170825.py (v0.2)も使用した場合。

```py
from __future__ import absolute_import
from __future__ import division
from __future__ import print_function
import time
import serial
import datetime
import util_wait_170825 as wai
import util_arg_no_wait_170825 as arg_nw

#=== { Configuration
#start time
ST_HH, ST_MM, ST_SS = 16, 4, 0
#=== }


if not arg_nw.hasNoWaitArgument():
    print('waiting')
    wai.wait_until(ST_HH, ST_MM, ST_SS)

# 何かの処理...

```
netstat と ss コマンド で LISTEN しているポートを調べる

# 概要

netstat がないが ss があるときに、どのように LISTEN しているポートを調べるかを知りたい

# まとめ

これとか

```
ss -nat
```

プロセス情報もいれるなら

```
ss -natp
```

# 参考情報

* [RHEL7/CentOS7でipコマンドをマスター - めもめも](http://enakai00.hatenablog.com/entry/20140712/1405139841)
ARKitでつくったAR空間上に置いたSpriteKitのSKNodeをアニメーションで動かす方法


この記事では、ARKitとSpriteKitをつかってAR空間に配置したSKNodeをアニメーションで動かす方法を紹介します。

WWDC2017の『[Going Beyond 2D with SpriteKit](https://developer.apple.com/videos/play/wwdc2017/609/ "Going Beyond 2D with SpriteKit")』セッションでは、つぎのようなデモアプリを紹介していました。

![IMG_0103.png](https://qiita-image-store.s3.amazonaws.com/0/38924/7d187782-6067-a7a4-ec64-409888a449f0.png "IMG_0103.png")

ARKitをつかって表示した画面をタップすると、AR空間上に絵文字が置かれます（この絵文字はARAnchorというアンカーで固定されていて、カメラを動かしてもAR空間の同じ位置に表示されます）。

タップで絵文字（SpriteKitのSKLabelNode）を置く処理は、Xcode9のテンプレートで『Augmented Reality App』を選択すると最初から組み込まれているので、この記事では割愛します。

ここからは、AR空間上に置いたSKNode（SKLabelNodeやSKSpriteNode）をアニメーションで動かす方法を紹介します。

## アニメーションできなくてハマる

そもそもこの記事を書いた理由は、AR空間に置いたSKNodeをアニメーションで動かそうとしてハマったからです。

上でも書いたとおり、AR空間上に置いたSKNodeはARAnchorというアンカーで固定されていています。そのおかげで、カメラを動かしてもAR空間の同じ位置に表示されます。

しかし、ここにハマりポイントがあります。

SKNodeをSKActionでアニメーションして動かそうとしても、動かないのです。文字通り、アンカーで固定された物体をむりやり動かそうとするかのように、プルプルするだけなのです。

ARKitとARAnchorの役割を考えると、その結果は当然です。しかし、せっかくSpriteKitをつかうのですから、SKActionで動かしたくなります。

というわけで、試行錯誤した結果、つぎのような方法へとたどりつきました。

## 親を動かせないなら、子どもを動かせばいいじゃない

その方法とは、『子ノードを追加して、子ノードを動かす』というものです。

ARAnchorで固定したSKNode（仮におとうぱんノードとします）は動けません。しかし、おとうぱんノードにaddChildしたSKNode（仮にこぱんノードとします）にはARAnchorがついていないので、自由に動けます。そうです、親の元を離れて自由に羽ばたくことができるのです（おとうぱん、さみしい）。

![8の字ダンス.png](https://qiita-image-store.s3.amazonaws.com/0/38924/7e346123-b0a3-732c-51a1-191f53ab6793.png "8の字ダンス.png")

この方法の便利な点は、おとうぱんノードというAR空間上の拠点を持っていることです。つまり、こぱんノードは、AR空間上の任意の場所（おとうぱんノードがARAnchorで固定されている場所）にいつでも戻ることができつつも、自由にアニメーションして動くことができるのです。

たとえば、おとうぱんノードを中心にして、こぱんノードが八の字ダンスをすることもできますし、おとうぱんノードからこぱんノードがわらわらとうまれてく徘徊することもできます。

もし、おとうぱんノードが不要なら、ダミーの透明画像をつかったSKNodeにしておけば、こぱんノードだけを登場させることもできます（おとうぱん、せつない）。

## 削除するときは忘れずに

こんな失敗をする人はいないかもですが、わたしがうっかりやってしまったので、蛇足ですが書いておきます。

こぱんノードをタップして削除するような場合には、親であるおとうぱんノードも削除するのを忘れないようにしないといけません。

しかし、おとうぱんノードをremoveで削除すると、自動的に子ノードであるこぱんノードも削除されてしまいます。ですので、こぱんノードを削除してから、忘れずにおとうぱんノードも削除するようにしましょう。

## 最後に

![NewGame.png](https://qiita-image-store.s3.amazonaws.com/0/38924/fdacb81e-bcbc-ae13-c9af-55f5bd914a14.png "NewGame.png")

ARKitをつかっておとうぱんとこぱんが活躍するゲームを開発しています。ARKitをつかうことで、いままでとはちがう面白さがうまれてとても楽しいです。

目標は、iOS11と同時リリースです。

この記事が、ARKitで素敵なアプリをつくりだす手助けになれば幸いです。

こちらの記事もご参考までにどうぞ。

[WWDC2017のデモアプリみたいに、ARKitとSpriteKitをつかってSKNodeをタップしてみた](http://qiita.com/toshi586014/items/802c06302a107aa88b80 "WWDC2017のデモアプリみたいに、ARKitとSpriteKitをつかってSKNodeをタップしてみた")
Laravelの予約クラスに注意する

Laravel5.1で何も考えずクラスを作ったら予約クラスと被って変なエラーに遭遇したのでその記録です。

LarabelでMemberというサービスクラスを作成して

```
<?php
namespace App\Http\Controllers;

use App\Services\Member;

class Cart {
	...
}
```

という感じで使おうとすると開発環境では正常に動作しましたが、本番環境にデプロイ（git checkout）すると

```
PHP Fatal error: Cannot use App\Services\Member as Member because the name is already in use in /var/www/appname/app/Http/Controllers/cart.php on line 3
```

というエラーが発生しました。

どうやらLaravelには、App\Member;というクラスがありそいつと干渉しているようです。

でも開発環境で起こらず、本番で発生して、20分後に勝手に解消したのでキャッシュ的な要因だと思いますが、時間なくクラス名をMembersに変更するとで解決しました。

何かご存じの方ご教示よろしくお願いします！

TODO

PHPのOPcacheが噛んでる的な話もあり、こんなライブラリをあとで検証する。

https://github.com/appstract/laravel-opcache
api.aiのFulfillmentの概要

https://api.ai/docs/fulfillment

# Fulfillment
webhookを設定することにより、マッチするIntentから得た情報をwebサービスへ送信し、結果を取得する事ができる。

## Webhook Requirements
### AUTHENTICATIOn
2種類の認証が可能

- ベーシック認証（ログインIDとパスワード）
- Additional Authenticationヘッダを使う

連携するサービスが認証を必要としない場合は、authenticationフィールドは空のままでよい。メソッドはHTTPSを使うのが好ましい。

## Limits
- サービスレスポンスのタイムアウト時間は5秒
- サービスから受け取るデータは64KBまで


## Webhook for Slot Filling
API.AIの必須パラメータに対してwebサービスからリクエストを送る場合は、**User webhook for slot filling**オプションにチェックをする。


## Webhook Example
https://api.ai/docs/getting-started/basic-fulfillment-conversation
api.aiのDialogsの概要

https://api.ai/docs/dialogs

# Dialogs
ボイスインタラクションのシナリオを考慮するための2種類のダイアログがある。
- **Linear dialogs** - 必要とされるアクションを完了するために必要な情報を集めるためのダイアログ（例えば、ベストなホテルを見つけるとか、ライトを点けるとか、聞きたい曲を再生するなど）
- **Non-linear dialogs** - ユーザの回答によっていくつかの枝を持つ。


## Linear Dialog
リニアダイアログを構築するには、slot fillingとして知られている機能を用いる。下記の例はホテルの予約アプリのAgentである。

api.aiは自然言語を理解できるので、旅行者はたくさんの手段でホテルをリクエストすることができる。ユーザのリクエストに応じて異なるパラメータがある。

- “I need to book a hotel."
- “Find a cheap hotel in Rome.”
- “Book a hotel in New York, check in November 10, check out November 15.”

アプリケーション側では少なくとも下記3つのパラメータが必要となる。

- 目的地
- チェックイン日
- チェックアウト日


これらはfilling featureによって取得できる（？）
User Saysセクション内のexamplesのリストアップを始める前に、アプリケーションが検索音ために使うパラメータの全てをリストアップすることができる。（requiredもoptionalも両方）

**Required**としてパラメータをマークしたとき、ユーザのリクエストの中に必須パラメータが無いときにアプリケーションからユーザに聞くためのpromptsを設定する。

ドラッグ&ドロップで必須パラメータを質問する順番を入れ替えることができる。

Agentは必要な情報が集まるまで、これらのpromptsを聞き続ける。ユーザは「Cancel」と言うことによって初めからやり直すことができる。

## Non-linear Dialogs
非線形ダイアログの例を見てみよう。この例では、ホテルの顧客満足度調査を扱う。
次の2つの質問から開始する。

- How would you rate the location of the property?
- How would you rate the facilities at the hotel?

各質問において、4つの回答を受け付ける。

- poor
- fair
- good
- excellent

このダイアログを構築するために、Contextが必要となる。
api.aiのEventの概要

https://api.ai/docs/events

# Events
Eventはユーザクエリの代わりにイベント名によってintentを呼び出すことができる機能である。
まず、Intent内でEvent名を定義する。そして、`event`パラメータを含む/queryリクエストを送信することによって、Intentを呼び出すことができる。

## Event Name
Event名は50文字以内の文字列である。a-z、A-Z、0-9、アンダースコア、ハイフンが使用可能。イベント名は大文字小文字を区別しない。

幾つかの文字列は予約語になっている。

## Defining Event Names in Intents
デベロッパーコンソールや/intentエンドポイントを伴ったAPI呼び出し経由内Intentが持つEvent名を定義する事ができる。
IntentのEvent項目から設定できる。
API経由でイベントを発生冴えるには、`"event"`フィールドを使うと良い。

```
"events": [
    {
        "name": "<event_name>"
    }
]
```

## Invoking an Event via Query Request
Event名によって特定のIntentを発火されるには、`"event"`パラメータの値を含む/queryリクエストを送信する。
queryリクエストは`"query"`または`"event"`パラメータを含む必要がある。

### GET /query Request
Eventを呼び出すためにGETメソッドを使用する場合、下記のフォーマットでEvent名を送信することができる。`e=<event_name>`

```
curl -H "Authorization: Bearer YOUR_CLIENT_ACCESS_TOKEN" "https://api.api.ai/v1/query?v=20150910&e=event_name&timezone=Europe/Paris&lang=en&sessionId=1234567890"
```

### POST /query Request
Eventを呼び出すためにPOSTメソッドを使用する場合、`"event"`パラメータの値は下記のフォーマットとなる。

```
"event":{  
  "name":"<event_name>",
  "data":{
      “<parameter_name>”:”<parameter_value>”  
  }
}
```


### Sending Parameters in a Query Request
`"event"`パラメータを付けてクエリリクエストを送るとき、api.aiはEvent名と同じ名前のContextを生成し、Contextのlifespanを0とする。このLifespanの値は、Contextが現在のリクエストを処理する間のみ有効であることを意味する。

`"data"`オブジェクトからActionセクションに手動で定義されたパラメータにあたいをわたすときや、発火したIntentのResponseセクション内またはIntentのパラメータ値の参照にこのContextを使うことができる。


## Default Welcome Intent
新規でAgentを作成したとき、自動的にDefault Welcome Intentが追加される。このようなIntentは事前定義されたWelcomeイベントとテキストレスポンスを持っている。

このWELCOMEイベントはサポートされたone-clickインテグレーションのための一般的なイベントである。後続イベントを設定するための手っ取り早い方法である。GOOGLE_ASSISTANT_WELCOME, FACEBOOK_WELCOME, TELEGRAM_WELCOME, KIK_WELCOME.

エンドユーザが、サポートされたメッセージプラットフォームからIntentを発火させたとき、関連するイベントがAPI.AIに送られる。特定のメッセージングプラットフォームに対応して定義された明確なイベントがない場合、Default Welcome Intentが発火する。（よくわかんね）

例えば、ユーザがFacebook Messenger内のGet Startedボタンをクリックした場合、`{"event": "FACEBOOK_WELCOME", "data": {}}`がAgentに送信される。まず、API.AIはFACEBOOK_WELCOMEイベントを含んでいるIntentをチェックする。もしそのようなIntentがない場合、Default Welcome Intentが発火する。


## Invoking Event from Webhook

自分自身のWebサービスから`"followupEvent"`を含んだevent名が送られるfulfillmentを経由してEventを呼び出すことができる。
この`"followupEvent"`パラメータは下記のフォーマットのオブジェクトである。

```
{
   "followupEvent": {
      "name": "<event_name>",
      "data": {
         "<parameter_name>":"<parameter_value>>"
      }
   }
}
```

後続するfollowupIntentを発火するためにwebサービスにリクエストを送ったIntentが発火したとき、JSONレスポンス内には`"metadata"`フィールドをが含まれ、`"executionSequence"`を含む。データ群の最初のシーケンスはシーケンスを発火させるためのIntentについての情報を含んでいる。例えば、API.AIからウェブサービスに送られたリクエストなど。最初のシーケンスに含まれる`"webhookTriggeringEvent"`の値は、follow-up intentをwebサービス側から発火させるEventの名前である。
api.aiのContextの概要

https://api.ai/docs/contexts

# Contexts
Contextはユーザのリクエストの現在のコンテキストを表す。これは、ユーザの好み、地理的な位置、アプリケーションないのページ、会話のトピックなどに依存して意味が異なったり漠然とした居留守異なったフレーズを扱うのに便利である。

例えば、ユーザが音楽を聞いていて興味を引くバンドを見つけたとしたしたとき、「このバンドの他の曲をもっと聞きたい」というようなことを言うだろう。開発者としては、Agentが他のIntent内で使えるようにするためにリクエスト内にバンド名を含めることが出来る。

また、あなたがスマートホームデバイスの製造者というのであれば、ライトや家電製品を遠隔で操作するアプリケーションを作ることができる。ユーザは「ライトをつけて」と言ったあとに「それを消して」という。コンテキストを設定することによって、アプリケーションは1つめのリクエストで言及されているライトを2番めのリクエスト内で理解することができる。もしユーザが「コーヒーマシーンをオンにして」といいい、「それを消して」といった場合、先の例とはコンテキストが異なるので違った結果になる（=消えるのはライトではなくコーヒーマシーン）。


## Contextsの追加
Contextを定義してIntentに追加するためには、 **Add input context**か **Add output context**フィールドをクリックして所望のコンテキスト名を入力し、エンターキーで確定する。


### Lifespan
デフォルトではContextは有効化されたタイミングから5リクエストか10秒で期限切れとなる。Contextを更新するIntentはカウンターをリセットして、追加の5リクエストまたは10秒を仕掛ける。

現在のLifespanをクリックしてリクエスト数を入れ直すことでContextのLifespanを変更することができる。Lifespanを0にすると、Contextがリセットされる。

### Output Contexts
Contextはユーザのセッション（APIコール内で渡されるセッションID）に紐付けられる。ユーザの表現があるIntentにマッチした場合、そのIntentはアウトプットContextを設定することができる。また、ユーザのリクエストをあなた自身のAPIに送ったときにもコンテキストを設定することができるｌ．

### Input Contexts
InputContextは特定のコンテキストがセットされているときにのみIntentとマッチするように制限する。

音楽の例において、「このバンドの曲がもっと聞きたい」といったようなリクエストに対する2つのIntentを作成する。このContextなしのIntentは、アプリケーションがアーティストについての情報を持っていないときにマッチし、ユーザからアーティストの情報を取得する必要が出てくる。これはrequiredパラメータで提供されるPromptによって取得する。


## Contextsからのパラメータ値の抽出
定義されたアウトプットContextと紐付いたIntent内で抽出されたパラメータの値をさんしょうするには、次のフォーマットをVALUEカラムで使う。`#context_name.parameter_name`
api.aiのActions and Parameterの概要

https://api.ai/docs/actions-and-parameters

## Actions
あなたのアプリケーションのステップに対応するActionはユーザの入力によって特定のIntentが発火したときに働く。Actionはユーザのリクエストから抽出した情報に対するパラメータを持つことができ、下記のJSONフォーマットの中に出現する。

```
{“action”:”action_name”}
{“parameter_name”:”parameter_value”}
```

アクション名とパラメータはどちらもIntent内のActionセクションで定義される。例えば、メッセージを送るためのアプリケーションを構築しているとき、Actionセクションは自動または手動で追加されたパラメータと同様に、アクション名をもつ。

## Parameters
Parametersは一般的にユーザの応答とEntityを接続するために使われる要素である。クエリに対応するJSONレスポンス内では、Parameterは下記のフォーマットで返される。

```
{“parameter_name”:”parameter_value”}
```

Parametersは2つの異なる領域に表示される。User Saysセクションでは、例が追加された後、既知のEntityに関連するParametersがハイライトされて表示される。1つの例（=User Saysの1行）内のアノテーションされた単語をクリックすると、選択されたEntity上のデータがテーブルに表示される。

IntentないのParametersのテーブルは、Actionセクションの下部に表示される。このテーブルは、現在のIntentに含まれる全てのUser Saysで使われている全てのパラメータを表現している。

### Defining Parameters
#### Automatic(Default)
User Saysセクションに例を入力したときに、system entityやdeveloper entityに対応する単語がハイライトされ、Parameterが自動的にパラメータテーブルに追加される。

#### Manual
Parameterの値を手動で編集したりていぎしたりする必要があるときがあるだろう。例えば、あなたのアプリケーションがロボットの歩行モーターを制御する場合、Parameterに対して固定値を割り当てたい。そんなときはそれらの値を手動で設定する。


### Deleting Prameters
Parameterの右側の☓ボタンから削除できる。

### The Parameter Table
User SaysやActionパラメータテーブルの両方のエントリは、手動で定義・編集することができる。User Saysテーブルでのパラメータの変更は、選択されたUser Syasの例にしか影響しない。アクションテーブルでのパラメータの変更は、現在のIntent内にあるそのパラメータ全てに影響する。

|COLUMN|DESCRIPTION|
|:---|:---|
|REQUIRED|チェックすると必須パラメータになる。これが有効なとき、Promptsカラムが出現する。これは、必須パラメータが取得できなかったときのレスポンスとなる。|
|PARAMETER NAME|パラメータ名。JSONのキーになる。|
|ENTITY|パラメータとリンクさせるEntity。リンクされたEntityは現在のプロパティを選択して検索リストから新しいEntityを選択することで変更ができる|
|VALUE|パラメータにアサインされる値。User Saysテーブルにおいて、特定の例から得られた解決された値が表示される。アクションテーブルにおいては、`$`とパラメータ名で表現されている。|
|IS LIST|このプロパティはパラメータの値をリストとして保持するかを設定する。ユーザの入力が列挙を含むときに理想的である。例えば、 “I would like apples, bananas, and oranges.” |

### Defining Values
api.aiのEntitiesの概要

https://api.ai/docs/entities

# Entities
- Entitiesは自然言語の入力からパラメータを抽出するためのパワフルなツール
- ユーザのリクエストから取得したいあらゆるデータをEnitityに一致させることができる。
- 特定のAgentで使われるEntitiesはagent functioningの結果として返されるパラメータの値に依存する。
- 言い換えれば、開発者はAgentの中で言及される可能性がある全ての概念に対してEntityを作る必要はなく、アクショナブルなデータのために必要なもの飲みに対して作れば良い。
- Entityには3つのタイプがある。system(API.AIがデフォルトで用意しているもの)、developer(開発者が定義するもの)、user(リクエストごとに個々のユーザに対して生成するもの)。これらはそれぞれmapping（参照する値をもつもの）、enum（参照する値がないもの）、composite（エイリアスを伴って他のEntityを含んだり、オブジェクト型の値を返すもの）がある。


## Types of Entities
### System Entities
System Entitiesはもっとも一般的な概念を簡単にハンドリングするためにAPI.AIによって事前にビルドされている。

|Type|Example|
|:--|:--|
|Mapping|These system entities have reference values. For example, @sys.date matches common date references such as "January 1, 2015" or "The first of January of 2015" and returns a reference value in ISO-8601 format: "2015-01-01T12:00:00-03:00"|
|Enum|These entities have no reference value. For example, @sys.color matches most popular colors and returns the matched color as it is without mapping it to any reference value. For example, shades of red, such as "scarlet" or "crimson", won't be mapped to "red" and will return their original values "scarlet" and "crimson".|
|Composite|These entities can contain other entities with aliases and return object type values. For example, @sys.unit-currency is meant for matching amounts of money with indication of currency name, e.g., "50 euros" or "twenty dollars and five cents". It returns an object type value consisting of two attribute-value pairs: {"amount":50,"currency":"EUR"}|

### Developer Entities
WebフォームまたはJSON, CSVフォーマットをapi経由でアップロードすることで開発者が独自のEntityを作成できる。AgentごとにEntityは一意の名前にする。先頭はアルファベットで、A-Z, a-z, 0-9, _, -を含めることができる。

|Type|Example|
|:--|:--|
|Dev Mapping|同義語と参照する値のマッピングを定義できる。例えば、食べ物の種類Entityは参照する値を"vegetarian"とし、同義語として"veg"や"veggie"を紐付ける|
|Dev Enum|Enum型は参照する値へのマッピングを持たないEntitiesの集合を含めることができる。エントリは単純な単語やフレーズ、他のEntityを含められる。EnumタイプのEntityを作るためには、Define Synonymsのチェクを外してエントリを追加する|
|Dev Composite|enumタイプのEntityは他のEntityやcomposite entityを呼ぶためのエイリアスを含むことができる。Composite Entityは複数の異なる属性を持つオブジェクトやコンセプトを説明するのに最も便利である。|

### User Entities
User EngityはセッションIDレベルで再定義することができ、例えばユーザのプレイリストのような明確なコンセプトを受け入れる。詳しくはReferenceを参照。


## Batch Operations
省略

## Export/Upload Entities
省略

## Allow Automated Expansion
Developer mapping entityのこの機能は、AgentがEntityに明示的にリストアップされてない値を認識することを許容する。

Entity内にリストアップされていないアイテムを含むユーザのリクエストが来た場合、Automatic Expansionはそれまで定義されていなかったアイテムをパラメータとして追加する。すごすぎ。 Agentがユーザのリクエストを見ることは、リクエストされたアイテムを派生させることができるように例を与えいることと似ている。User Saysセクションでたくさん定義するのも良いが、Automated Expansionの方が良い結果を出すだろう。（？）
api.aiのAgentの概要

https://api.ai/docs/agents

# Agents
- Agentは自然言語理解のモジュール
- 自分のアプリケーションや製品、サービスに組み込むことができる
- 自然言語によるユーザのリクエストをアクショナブルなデータに変換できる
- アクショナブルなデータへの変換はAgentの中に用意されたIntentに合致させることによって実行される
- InetntはAgentの中に存在するユーザリクエストを処理するための事前に定義されたコンポーネントかもしくは開発者が定義したコンポーネントである
- ContextやIntentのプロパティ、webhookを通したfulfillment等を利用することによって、Agentは会話の流れを管理するためにデザインすることが可能

![スクリーンショット 2017-08-07 17.17.59.png](https://qiita-image-store.s3.amazonaws.com/0/29971/26fe9008-6367-bbf7-d4b6-9cb443a9f528.png "スクリーンショット 2017-08-07 17.17.59.png")


## Agentの作成
コンソール画面でCreate AgentをクリックするとAgent作成のメニューが開く
![スクリーンショット 2017-08-07 17.19.25.png](https://qiita-image-store.s3.amazonaws.com/0/29971/2cc8cbff-c1d9-f1c9-aeec-02d0f4fb785d.png "スクリーンショット 2017-08-07 17.19.25.png")
- Description - Agentの説明
- Add Sample Data - Agentにセットする事前に定義された知識を選ぶ。prebuilt agentと似ているが、Intent内のレスポンスをインクルードする点で異なる（prebuilt agentにはレスポンスは含まれない）。
- Language - Agentで扱う言語を選択する
- Default Time Zone - Agentのデフォルトタイムゾーンを選択する
- Google Project - 既に存在するGoogle Cloud Projectを選ぶか、新しく作るかを選択する。(※Google Cloud Platformのプロジェクト）

## Agentの設定
コンソールで歯車アイコンをクリックするとAgentの設定画面が表示される。
- Update Avatar - Agentを表すアバターの設定
- Description - Agentの説明
- Language - Agentが取り扱う言語
- Default Time Zone - Agentのデフォルトタイムゾーン
- Google Project - AgentとリンクするGoogle Cloudプロジェクト
- Client Access Token - クライアントからアクセスする際のAPIキー
- Developer Access Token - EntityやIntentを管理するためのAPIキー
- Delete Agent - Agentの削除


## Agentの事前ビルド
Prebuilt AgentsはAPI.AIのチームによって開発されたAgentのコレクションで、ユースケースに合わせてダウンロードし、自分のアプリの会話インターフェースを構築するベースとして使うことができる。

### Prebuilt Agentのインポート方法
コンソールの左メニューで「Prebuilt Agents」をクリックしすると、キーワードに関係するユースケースのAgentを探せる画面に移る。特定のAgentをクリックするとImportボタンが出てくるので、クリックする。

### Prebuilt Agentの構造
Prebuilt Agentはユーザの入力を分類する準備ができたもので、ユーザの自然言語による入力をアクショナブルなデータに変換する。
webhook経由で取得する外部ソースや特定のユースケースに依存するため、レスポンスは提供されない。例えば、天気予報ではサードパーティの天気APIからレスポンスを取得する必要がある。


### Prebuilt Agentのカスタマイズ方法
Prebuilt Agentは十分にカスタマイズすることができる。

#### Topics CoveragetとClassification Modelのカスタマイズ
Prebuilt Agentは最も一般的なユーザの入力をカバーしている。同じ領域や反対の領域に関係する追加のトピックや、一部のユーザしか使わないような質問をカバーしたい場合は、IntentやEntityを削除・追加することで対応できる。

Agent間でIntentやEntityをコピーしたり移動したり、一度にIntentやEntitiyを削除することができる。

#### Agentのレスポンスのカスタマイズ
##### Intent内でのレスポンスの定義
シンプルなユースケースにおいては、Intent内で直接レスポンスを定義することができる。他のメッセージングプラットフォームを使う場合はテキストだけでなくリッチメッセージも定義することができる。

##### Fulfillment Service内でのレスポンスの定義
webhook経由で自身で作成したWebサービスと接続することができる。自身のWebサービス内で、Agentから受け取った悪所なブルなデータに基づいたレスポンスを定義したり、オペレーションを定義したりDBやサードパーティAPI等の外部ソースからデータを取得したりできる。

自前のバックエンドサービスを持っている場合、Agentに対するクエリリクエスト（ユーザが入力した自然言語?）を送って、独自のビジネスロジックでレスポンスを定義したいと考えるだろう。異なるプラットフォームや言語でクエリリクエストを送ってレスポンスを取得するために、[SDK](https://api.ai/docs/sdks)を使うことができる。
Keras バックエンド速度比較 CNTK vs TensorFlow

Keras のバックエンドでCNTKを使うことができるようになっているようです（2017/8/25時点 Beta）
サンプルの多いKerasが、高速なCNTKで動く。いいですね！！

極めて簡単ではありますが、速度比較をしてみたので共有します。

##結果

mnist 20 epochs (Keras exsample) のモデル作成にかかった時間

|TensorFlow  |CNTK  |
|---|---|
|72.77秒  |54.36秒  |

##詳細

###実行環境

Dell xps15 with GTX1050 / windows 10 で、共に python 3.5 です。

Tensorflow GPU support 
　https://storage.googleapis.com/tensorflow/windows/gpu/tensorflow_gpu-1.3.0-cp35-cp35m-win_amd64.whl

CNTK GPU
　https://cntk.ai/PythonWheel/GPU/cntk-2.1-cp35-cp35m-win_amd64.whl

###実施方法

　CNTKのsetup結果確認用に紹介されていた、Keras exsample の　mnist_mlp.py に 時間計測部分を追記して実施。

　参考「Using CNTK with Keras (Beta)」
　　https://docs.microsoft.com/en-us/cognitive-toolkit/using-cntk-with-keras

　コード、一応貼っておきます。

```mnist_mlp.py
from __future__ import print_function
import time
start_time = time.time()

import keras
from keras.datasets import mnist
from keras.models import Sequential
from keras.layers import Dense, Dropout
from keras.optimizers import RMSprop

batch_size = 128
num_classes = 10
epochs = 20

# the data, shuffled and split between train and test sets
(x_train, y_train), (x_test, y_test) = mnist.load_data()

x_train = x_train.reshape(60000, 784)
x_test = x_test.reshape(10000, 784)
x_train = x_train.astype('float32')
x_test = x_test.astype('float32')
x_train /= 255
x_test /= 255
print(x_train.shape[0], 'train samples')
print(x_test.shape[0], 'test samples')

# convert class vectors to binary class matrices
y_train = keras.utils.to_categorical(y_train, num_classes)
y_test = keras.utils.to_categorical(y_test, num_classes)

model = Sequential()
model.add(Dense(512, activation='relu', input_shape=(784,)))
model.add(Dropout(0.2))
model.add(Dense(512, activation='relu'))
model.add(Dropout(0.2))
model.add(Dense(10, activation='softmax'))

model.summary()

model.compile(loss='categorical_crossentropy',
              optimizer=RMSprop(),
              metrics=['accuracy'])

history = model.fit(x_train, y_train,
                    batch_size=batch_size,
                    epochs=epochs,
                    verbose=1,
                    validation_data=(x_test, y_test))
score = model.evaluate(x_test, y_test, verbose=0)
print('Test loss:', score[0])
print('Test accuracy:', score[1])

#時間表示
end_time = time.time()
print('start: ' + str(start_time) + '(sec)')
print('end: ' + str(end_time) + '(sec)')
print('processing time: ' + str(end_time - start_time) + '(sec)')
```

##実行結果
TensorFlow backend 実行
![image.png](https://qiita-image-store.s3.amazonaws.com/0/123399/a22d4d8b-a819-a9f1-566b-27b906217679.png)
結果
![image.png](https://qiita-image-store.s3.amazonaws.com/0/123399/2fb6d79e-eb2b-788d-5bfe-3c0394cbed12.png)

ユーザー\.keras\skeras.json を書き換えて、、

```keras.json
{
    "epsilon": 1e-07, 
    "floatx": "float32", 
    "image_data_format": "channels_last", 
    "backend": "cntk"
}
```

CNTK backend 実行
![image.png](https://qiita-image-store.s3.amazonaws.com/0/123399/20f6b1a1-9644-940e-e6f0-1da9419b1dbf.png)
結果
![image.png](https://qiita-image-store.s3.amazonaws.com/0/123399/377a5789-2c51-9a7d-8c78-7189bfcbbceb.png)

お疲れ様でした。
最後まで読んでいただきありがとうございます。よい CNTK ライフを!!
Sage | Wordpress Starter Theme インストール

[Sage 公式](https://roots.io/sage/)

## ducumentを読んでインストールしたので備忘録。
- 2017/8/22 時点

#### 環境
- macOS

### Theme Installation
**手順**   

1. Wordpressのテーマディレクトリにフォルダを用意しコピー、**Sage**をインストール
2. composerがインストールされているか確認
3. WordpressのテーマディレクトリからCompeserを使ってインストール 

```
/Users/~~~~~~~~~~~/wordpress/wp-content/themes
```
↑自分はVCCW でWordpressのローカル環境を構築しました！


[vccw インストール　おすすめ](http://vdeep.net/first-vccw)



```
$ composer create-project roots/sage your-theme-name 8.5.3
```
* your-theme-name は自分のテーマ名
* composer create-projectは、対象のパッケージをgit cloneしてからcomposer install するのとほぼ同じことをしているようです。

### Theme Development and Building
**プロジェクトの依存関係のインストール**

次の要件を満たしている必要があるようです。

- Node.js >= 4.5.0

npmのupdateも勧められていたので。

```
npm install -g npm@latest
```

- **gulp**と**Bower**をグローバルにインストール

```
npm install -g gulp bower
```

- テーマディレクトリに移動して

```
npm install
```

```
bower install
```





### Theme Deployment
- Generating production ready assets
- フォルダをチェックすると`gulpfile.js`が入っていることを確認

```
gulp --production
```

コンパイルされたのでwordpress上でcssが適応されているのを確認できるかと思います。


この先開発をしていく時に便利なのが
`gulp watch`
これでファイルの変更があった時に自動でコンパイルしてくれます。
【プログラマーのための統計学】条件付き確率と乗法定理

## 目次
[プログラマーのための統計学 - 目次](http://qiita.com/Esfahan/items/bd9e52837bbaeb168b9f)

## 条件付き確率とは
事象Bが起きるという条件のもとに事象Aが起きる確率を、条件付き確率といいます。
以下の式で求めることができます。
`条件付き確率 = AかつBが起こる確率/Bが起こる確率`

```math
P(A|B) = \frac{P(A∩B)}{P(B)}
```

### 例題
さいころを2回振って、出た目の和が8以上となる確率を計算します。
ただし、1回目には「4」が必ず出ることとします。

この場合、以下の式が成り立ちます。

```math
条件付き確率 = \frac{(1回目は4∩1回目と2回目の合計は8)}{1回目は4}
```

1回目は4になる確率は、

```math
\frac{1}{6}
```

です。

1回目は4かつ1回目と2回目の合計は8になる確率は、
`4になる確率 x 4,5,6のどれかが出る確率` で求められるので、以下の式で算出できます。

```math
\frac{1}{12} = \frac{1}{6}\times\frac{3}{6}
```

これらを、最初に書いた公式に当てはめると、

```math
\frac{1}{2} = \frac{\frac{1}{12}}{\frac{1}{6}}
```

答えはは`1/2`となります。
つまり、この例題の条件付き確率は、`50%` ということになります。

## 独立
事象Bが起きるという条件があっても、事象Aに事象Bが影響しないとき、事象Aと事象Bは「独立」であるといいます。

```math
P(A|B) = P(A)
```

## 排反
事象Bが起こったときに事象Aは起こらない場合、事象Aと事象Bは「排反」であるといいます。

```math
P(A|B) = 0
```

## 乗法定理
条件付き確率を求める式を、以下の様に変形させたものを、乗法定理といいます。

```math
P(A∩B) = P(A) \times P(A|B)
```

### 例題
10本のくじがあり、当たりが4本含まれているとします。
Aさんが当たりを引いたあと、Bさんがくじを引きます。
AさんもBさんも当たりである確率はいくらでしょうか？

```math
Aさんが当たる確率 = \frac{4}{10}
```

```math
Bさんが当たる確率 = \frac{3}{9}
```

となるので、答えは、`2/15` となります。

```math
\frac{2}{15} = \frac{4}{10} \times \frac{3}{9}
```

## 参考
- [条件付き確率とは](https://bellcurve.jp/statistics/course/6438.html)
JWT Json web token

JWT : JSON Web Token 
ざっくりいって署名の出来る JSON を含んだ トークンである。
署名とは、署名時に使ったsecretを用いて、JSONが改ざんされていないかをチェック出来るようにすることです。

```
eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJzdWIiOiIxMjM0NTY3ODkwIiwibmFtZSI6IkpvaG4gRG9lIiwiYWRtaW4iOnRydWV9.TJVA95OrM7E2cBab30RMHrHDcEfxjoYZgeFONFh7HgQ
```
３つの部分に分れている

header：
- 宣言の型
- 暗号化の名v 通常はSHA256
例:

```
{
  'typ': 'JWT',
  'alg': 'HS256'
}
//base64で
eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9
```


payload：
中身を載せる

例：


```
{
  "sub": "1234567890",
  "name": "John Doe",
  "admin": true
}
//base64で
eyJzdWIiOiIxMjM0NTY3ODkwIiwibmFtZSI6IkpvaG4gRG9lIiwiYWRtaW4iOnRydWV9
```

signature ：

header + payloadを暗号化したら secret

```
eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJzdWIiOiIxMjM0NTY3ODkwIiwibmFtZSI6IkpvaG4gRG9lIiwiYWRtaW4iOnRydWV9.TJVA95OrM7E2cBab30RMHrHDcEfxjoYZgeFONFh7HgQ
```
sercretはサーバーで保存している、Jwtの生成もサーバーでやる。
ユーザー毎回requestの時header + payloadを送ってくる、改ざん検証できる、サーバーで認証をやる。
CRC-16 > 色々あるようだ | On-line CRC calculation and free library

CRC-16の実装コード(C++)がある。

Python実装は以下で見つけた。
https://gist.github.com/oysstu/68072c44c02879a2abf94ef350d1c7c6

比較してみた。結果が異なる。

CRC-16と言っても色々あるようだ。
https://blogs.yahoo.co.jp/edamatsu_denki/24482845.html
> 
・CRC16-IBM       (x16 + x15 + x2 + 1)
・CRC16-ANSI      (x16 + x15 + x5 + 1)
・CRC16-CCITT     (x16 + x12 + x5 + 1)
・CRC16-XMODEM (x16 + x12 + x5 + 1)

C++実装はCRC-16(Modbus)。
PythonのコードはCRC-16-CCITT。

[On-line CRC calculation and free library](https://www.lammertbies.nl/comm/info/crc-calculation.html)
にさらに多くの種類が紹介されている。
Let's display the map using Basemap

## ENV
Mac
anaconda4.4.0(python3.6)

## Library Install
### GEOS
geometry engine
https://trac.osgeo.org/geos/
<details><summary>**</summary>not english lesson service.http://geos.jp/</details>

`brew install geos`
3.6.2(2017/08/XX)

### Basemap(matplotlib basemap toolkit)
plotting library of maps
https://github.com/matplotlib/basemap/archive/v1.1.0.tar.gz
after decompressing the file
`python setup.py install`

https://matplotlib.org/basemap/users/installing.html

### pyproj
PROJ.4 library
`pip install pyproj`

## trial Map display
```py3
from mpl_toolkits.basemap import Basemap
import matplotlib.pyplot as plt

m = Basemap(projection='mill')

m.drawcoastlines()
m.fillcontinents()
m.drawmapboundary()

plt.show()
```

![image](https://qiita-image-store.s3.amazonaws.com/0/73615/1a6750dd-d13a-1431-c4b9-14d0f09f35df.png)
日本語文章のクレンジング処理

# 概要
日本語文章を形態素解析にかける時、文章内にあるスペースや句読点、HTMLタグ等が解析の邪魔をする。
そのため、クレンジング処理をかけて、形態素解析に必要な情報だけ残す。

# 実行環境
OS: Windows 7
言語: Java

# 目次
１．HTMLタグ消し
２．全角半角の統一
３．記号の削除

# 1．HTMLタグ消し
```
<td><tr>
```
HTMLのタグが残っていると、中身の「td」「tr」等が単語として認識される場合があるため、削除する。
削除後の文章をくっつけてしまうと、変な単語ができる可能性があるため、単語の切れ目の記号(ここでは「/」)をつける。

```html:sample
Pattern.compile("<.*?>").matcher(sentence).replaceAll("/");
```

>例：\<tr>\<td>第1巻\</td>\<td>物体の運動について\</td>;
>⇒//第1巻//物体の運動について/

# 2．全角半角の統一

```
ＡａbB１２３45ｱｲｳｴｵカキクケコ
```

アルファベットの全角半角、数字の全角半角、カタカナの全角半角が混在する文章は、データとしても見た目としても良くないため、どちらかに統一させる。

```html:sample
Normalizer.normalize(sentence, Normalizer.Form.NFKC);
```

java6から使えるNormalizerが便利
上記の処理で、
・全角アルファベット⇒半角アルファベット
・全角数字⇒半角数字
・半角カタカナ⇒全角カタカナ
へ変換できる。（記号も全角から半角へ変換される）
>例：ＡａbB１２３45ｱｲカキ
>⇒AabB12345アイカキ

# 3．記号、スペースの削除

```
今日 何を すればいいのか。。
```

文章にスペースが残っていると形態素解析時に単語の切れ目として認識しない。
「。」など頻繁に表れる記号は形態素解析時にノイズになりやすい。
タグの処理と同様に削除後の文章をくっつけてしまうと、変な単語ができる可能性があるため、単語の切れ目の記号をつける。

```html:sample
Pattern.compile("[\\p{Punct}！”＃＄％＆’（）＝～｜‘｛＋＊｝＜＞？＿－＾￥＠「；：」、。・ 　]+").matcher(sentence).replaceAll("/");
```

>例：今日 何を すればいいのか。。
>⇒今日/何を/すればいいのか/

※ \\\\p{Punct}は句読文字: !"#$%&'()*+,-./:;<=>?@[\]^_`{｜}~のいずれかを示す。
※ 記号は闇が深く、この処理方法では一般的に文章内に現れる記号のみ対応している。

参考資料：https://www.slideshare.net/tsudaa/ss-36658329
http://qiita.com/kasei-san/items/3ce2249f0a1c1af1cbd2
メソッド引数にシンボルを渡したとき、三項演算子が使えない

メソッド引数にシンボルを渡す方法を探していて、それを実際に自分のコードに適応した際に起きたので共有します。

特に意味のないコードを書いていますが悪しからず。。。

## 動作環境

Ruby 2.3.0

※環境によって結果が異なるようです、ご注意ください。

## メソッド引数にシンボルをわたす

これはご存知の通りの書き方でいけます。
一応例。

```
def sorts(data)
  @data = data
  ary = [a: 'a', b: 'b', d: 'd', c: 'c']
  ary.sort do |before, after|
    before[@data] <=> after[@data]
  end
end

sorts:a
#=> [{:a=>"a", :b=>"b", :d=>"d", :c=>"c"}]
```

上のコード自体はほとんど意味がないので気にしないでください。
自分のコードでそれっぽく書いただけです。

sortsメソッドにシンボルaを引数に渡しています。
ここまでは大丈夫だと思います。

## 実際に三項演算子に入れてみる

上のメソッドをそのまま使ってみます。

```
a = true ? sorts:a : sorts:c

SyntaxError: unexpected tSYMBEG, expecting keyword_do or '{' or '('
a = if true ? sorts:a : sorts:c
                    ^

a = true ? (sorts:a) : (sorts:c)

SyntaxError: unexpected tLABEL
a = true ? (sorts:a) : (sorts:c)
                              ^
```

三項演算子自体にほとんど意味はないです。
上記のように、true、false評価のところにシンボルを引数としたメソッドをおくと`SyntaxError`で弾かれます。

要注意です。。

## 終わりに

結局if文で書いたのですが、長い時間これに詰まったので、同じ人がいれば注意喚起ということでこの記事は終わりたいと思います。

もしどなたか良い対処法があればコメントくだされば幸いです。


## 追記(修正)

```
def sorts(data)
  @data = data
  ary = [a: 'a', b: 'b', d: 'd', c: 'c']
  ary.sort do |before, after|
    before[@data] <=> after[@data]
  end
end

p sorts(:a)

a = true ? sorts(:a) : sorts(:c)
```
上記の書き方で解決いたしました、ありがとうございます！


2.3系では`p sorts:a`した場合結果がnilで返ってきてました(動作検証不足です、すみません)。

2.4系だと

```
p sorts:a

NameError: undefined local variable or method `a' for main:Object
from (pry):8:in `__pry__'
```
のエラーが出ます。

ご報告・ご指摘ありがとうございます。
LINEのWAVE(Clova)開封の儀メモ

##LINEのスマートスピーカー「WAVE」

LINEのスマートスピーカー「WAVE」の先行版が8/23から発送開始となり、無事手元に届きましたので、開封の儀を行いました。
初期設定のところあたりまでをメモします。

参考記事：LINE Conference 2017 メモ
http://qiita.com/yuka_jyotei/items/13f8b8663c8aa7f36e5f

「Clova」 公式サイト
https://clova.ai/ja

「WAVE」 LINE FRIENDS
https://www.linefriends.jp/products/317551472

##開封の儀
外箱はこんな白くておしゃれです。

<img src="https://qiita-image-store.s3.amazonaws.com/0/79466/484b4e30-0119-0f14-92cd-9788e6bdbc9d.jpeg" width=50%>

内箱はダンボール風。
<img src="https://qiita-image-store.s3.amazonaws.com/0/79466/8f426528-afe6-69d8-37d7-e092b5bb6648.jpeg" width=50%>

文字がシルバーで入っていてスタイリッシュ。
<img src="https://qiita-image-store.s3.amazonaws.com/0/79466/df15c216-9b87-9a7a-f709-93eb5625ca23.jpeg" width=50%>

開けるとこのようにWAVEが入っています
<img src="https://qiita-image-store.s3.amazonaws.com/0/79466/494f2098-d33b-7755-ad09-9c5cc55819d1.jpeg" width=50%>

出してみました。顔よりは大きそう（長い）です。
<img src="https://qiita-image-store.s3.amazonaws.com/0/79466/f2ed481c-b027-767a-c3d7-1638274499d0.jpeg" width=50%>

電源スイッチと、電源とつなぐ部分。到着したら、まずは充電しましょう。
<img src="https://qiita-image-store.s3.amazonaws.com/0/79466/4735ef2d-ab14-4dc1-4e71-3f72fb90a384.jpeg" width=50%>

##アシスタントアプリの準備
Clovaのアシスタントアプリ「LINE Clova」（スマホアプリ）をダウンロードし、LINEアカウントでログインします

iOS
https://itunes.apple.com/jp/app/line-clova/id1264480038?mt=8

Android
https://play.google.com/store/apps/details?id=com.linecorp.clova

アプリの画面はこのような感じです。（iOS）

トップ画面
<img src="https://qiita-image-store.s3.amazonaws.com/0/79466/3bea15ff-e027-d62b-e6b8-a6a60ca9bc0e.jpeg" width=50%>

WAVEと連携させます
<img src="https://qiita-image-store.s3.amazonaws.com/0/79466/4c7c64d4-84b2-7d31-397b-192d7dc90797.jpeg" width=50%>

無事できました
<img src="https://qiita-image-store.s3.amazonaws.com/0/79466/f11a95b0-2cae-4fbe-5066-fa7620c449bd.jpeg" width=50%>

「Clova（クローバ）」と話しかけてみましょう。
なおスマホアプリから設定して「ジェシカ」に変更することもできます。
<img src="https://qiita-image-store.s3.amazonaws.com/0/79466/97becdd4-5ac9-0fee-43b7-5c66520971f0.jpeg" width=50%>

##LINE Musicも利用可能
また、「LINE Music」を使って、音楽を再生することができます。
購入時に6ヶ月分のLINE MUSIC無料チケットがついてきました。（有効期限があるので注意）

iOS
https://itunes.apple.com/jp/app/line-music-%E9%9F%B3%E6%A5%BD%E8%81%B4%E3%81%8D%E6%94%BE%E9%A1%8C-%E3%83%A9%E3%82%A4%E3%83%B3%E3%83%9F%E3%83%A5%E3%83%BC%E3%82%B8%E3%83%83%E3%82%AF/id966142320?mt=8

Android
https://play.google.com/store/apps/details?id=jp.linecorp.linemusic.android&hl=ja


##WAVEで何ができるのか
2017/8/25時点では、アシスタントアプリを見る限り以下のことがWAVEでできるようです。

・LINE MUSICの再生
　曲名の読み上げや、「xxさんの曲を流して」「リラックスできる曲を流して」等の問いかけも可

・天気
　今日の天気を聞いたり、明日の降水確率を確認したり

・アラーム
　「明日7時にアラームを鳴らして」「10分後にタイマーをセットして」「アラームを止めて」

・時計、カレンダー
　「今何時？」「今日は何曜日？」

・Bluetoothの接続/解除

##今後期待すること
　SDK、お待ちしております！
　また、こちらは先行版なので正式版？がどうなるかも気になりますね。
　正式版は1万5000円ですが、先行版は1万円なのでお得に購入できました。

音楽再生時や問いかけに反応する際は、下の部分が光ります。綺麗ですね。色も変わるようです。
<img src="https://qiita-image-store.s3.amazonaws.com/0/79466/eaf729bf-0a2d-976f-1f76-604ee51be8b6.jpeg" width=50%>

ひとまず開封の儀と初期設定までですが、色々と操作を試してみたいと思います！

WAVE 公式サイトはこちら
https://www.linefriends.jp/products/317551472
Pythonの疑似private変数とクラス継承によるトラブル


Pythonのクラスにはメンバ変数のアクセス制限という概念がありません。全ての変数がpublicとして扱われます。

そこで、疑似private変数を作れるようになっているのですが、これをクラス継承と併用しようとするとバチこいたためトラブルシューティングとしてメモ。

```python:error_case
class BaseClass(object):
    def __init__(self):
        self.__param = "I'm BaseClass"
        
class ChildClass(BaseClass):
    def hello(self):
        print self.__param

ChildClass().hello()
```

> ```
AttributeError                            Traceback (most recent call last)
<ipython-input-7-898f72a5b39a> in <module>()
----> 1 ChildClass().hello()
<ipython-input-6-9e0be3f6ef4d> in hello(self)
      5 class ChildClass(BaseClass):
      6     def hello(self):
----> 7         print self.__param
AttributeError: 'ChildClass' object has no attribute '_ChildClass__param'
```

## 疑似private変数

メンバ変数の名前の頭にアンダースコアを二つつけると、疑似的にprivate変数を作ることができる。

しかし内部的には、``` _{classname}__{変数名}```という名前のpublic変数を用意して、クラス内からは```__{変数名}```という名前で参照できるようにしているだけ。それが「疑似」private変数である所以。

```python:sample_program
class Sample(object):
    def __init__(self):
        self.__param = "I'm Sample"

sample = Sample()
print sample.__param
```

> ```
AttributeError                            Traceback (most recent call last)
<ipython-input-8-f5d0d60ad401> in <module>()
      4 
      5 sample = Sample()
----> 6 print sample.__param
AttributeError: 'Sample' object has no attribute '__param'
```

```python:sample_program
sample = Sample()
print sample._Sample__param
```

> ```
"I'm Sample"
```

## クラス継承との組み合わせ

一番上のエラーケースのように、 **親クラス内のメソッドで設定した疑似private変数に、子クラスの内部からアクセスしようとすると失敗する**。

どうやら原因は疑似private変数の内部仕様による。

親クラス内で宣言した疑似メンバ変数は、それが継承されていようと、内部的には```self._BaseClass__param```に突っ込まれるらしい。

一方、子クラスから```self.__param```を見ようとすると参照されるのは当然```_ChildClass__param```なので、そんな変数ないよというエラーが帰ってきてしまうというカラクリ。

## 解決策

クラス継承を使うなら、親クラス内で一緒にゲッタを宣言しておく。

```python:successful_case1
class BaseClass(object):
    def __init__(self):
        self.__param = "I'm BaseClass"
        
    def get_param(self):
        return self.__param
        
class ChildClass(BaseClass):
    def hello(self):
        print self.get_param()
```

> ```
"I'm BaseClass"
```

(更新) 親クラスのプロパティにする。外部からの直接のセットを防ぐことができる。

```python:successful_case2
class BaseClass(object):
   def __init__(self):
       self.__param = "I'm BaseClass"

   @property
   def _param(self):
       return self.__param

class ChildClass(BaseClass):
   def hello(self):
       print self._param
```

滅多に起きないシチュエーションかもしれないが意外と不便。

## version

2.7.12 |Anaconda 4.2.0 (x86_64)| (default, Jul  2 2016, 17:43:17) \n[GCC 4.2.1 (Based on Apple Inc. build 5658) (LLVM build 2336.11.00)]