Amazon Dash Buttonを秒数当てゲーム機に改造

#Amazon Dash Buttonとは
<img width="400px" alt="photo" src="https://qiita-image-store.s3.amazonaws.com/0/135757/39e8de09-70a4-11e2-2498-f7c35d40cf42.jpeg">

　要はボタン押すだけでアマゾンの商品を注文できるボタン。ボタンが押されてから商品が届くまで、次の注文ができないので、連打は無効になっている。
　ただし、なんでも注文できるわけではなく、洗剤やシャンプーなどの何回も買い替えが生じる消耗品が対象。１つのボタンに設定できるのは１商品だが、個数とか別の種類も選択可。アメリカでは２０１５年に発売されており、日本では２０１６年１２月上旬に販売された。現時点（２０１６年１２月１０日）では、４２種のボタンが販売されており、人気なものに関しては最長２ヶ月待ちとなっている。[（AmazonDashButtonの購入ページ）](https://www.amazon.co.jp/s/ref=nb_sb_ss_c_1_11?__mk_ja_JP=%E3%82%AB%E3%82%BF%E3%82%AB%E3%83%8A&url=search-alias%3Daps&field-keywords=amazon+dash+button&sprefix=amazon+dash%2Caps%2C259&crid=N17MK6NVGPWF)
　余談になるが、Amazonの最初の社名は「Cadabra.com」だったが、あるとき電話口で「Cadaver(死体の意)?」と聞き返されたため、社名を変更したという。

#環境
・Mac OS Sierra 10.12.1

#流れ
1.Finkのダウンロード
2.libp-capをapt-get
3.nodebrewインストール
4.Nodeをインストール
5.パッケージインストール
6.Dash Button Wifiスキャン
7.Deploy

#環境構築
##1.Finkのダウンロード
ライブラリを使うときにapt-getでインストールしたいので、Finkを使います。(apt-getしないでインストール出来る方法わかる方いたら、教えてください。。。)
[ここ](http://www.finkproject.org/download/srcdist.php)から入手できます。
`XCode`がすでに入ってるのであれば、インストールしたfinkのフォルダから、ターミナルで`./bootstrap`と打つと、基本設定を行います。結構時間かかります。３０分くらい？

##2.libp-capをapt-get
[こちら](https://www.npmjs.com/package/dash-button)のページを参考に、ライブラリをapt-getします。

```bash:Terminal
sudo apt-get install libpcap-dev
```

##3.nodebrewインストール
nodeのバージョン管理として有名なのが、nvmとnodebrew.
今回はnodebrewを使って管理します。
別にnvmでも可能.
↓のコマンドを叩きます

```bash:Terminal
$ curl -L git.io/nodebrew | perl - setup
```
すると、nodebrewのインストールが始まります。

```bash:Terminal
  % Total    % Received % Xferd  Average Speed   Time    Time     Time  Current
                                 Dload  Upload   Total   Spent    Left  Speed
  0     0    0     0    0     0      0      0 --:--:-- --:--:-- --:--:--     0
  0     0    0     0    0     0      0      0 --:--:--  0:00:01 --:--:--     0
  0     0    0     0    0     0      0      0 --:--:--  0:00:02 --:--:--     0
100 24340  100 24340    0     0   6400      0  0:00:03  0:00:03 --:--:--  166k
Fetching nodebrew...
Installed nodebrew in $HOME/.nodebrew

========================================
Export a path to nodebrew:

export PATH=$HOME/.nodebrew/current/bin:$PATH
========================================
```

`.zherc`に上記のexporet~部分を記載

```bash:.zshrc
export PATH=$HOME/.nodebrew/current/bin:$PATH
```
設定を読み込み
```$ source ~/.zshrc```
これでnodebrewのインストールが完了されたはずです。`nodebrew -help`とかで確認してみましょう。コマンド一覧みたいなのが出てきます。

##4.Nodeをインストール
続いてNode.jsのインストールします。

```bash:Teminal
nodebrew ls-remote
```
これで取得可能なnodeのバージョン一覧が出てきます。
インストール方法ですが、２通りあって、`nodebrew install <Version>`または`nodebrew install-binary <version>`というコマンドで、後者のうほうが早かったりするので、後者でインストールしてみてください。
その他、最新版をインストールするときは、`nodebrew install latest`、安定版をインストールするときは`nodebrew install stable`とします。
その後、nodeがインストールされてることを確認します。

```bash:Terminal
nodebrew ls
v6.2.0

current: none
```
currentが現在使用しているnodeのバージョンを表しており、ここではまだ使えません。
使えるようにするには`use`します。

```bash:Terminal
nodebrew use v6.2.0
use v6.2.0
```
こうすると、`node -v`や`npm -v`で現在入ってるバージョンの確認ができます。

##5.パッケージインストール
↓のコマンドを打ちます。`package.json`の中身は最初はデフォルトで構いません。

```bash:Terminal
$ npm init
$ npm install --save dash-button
```

次に`package.json`の中身のStrings部分を`"dash-button scan"`に書き換えます。
最終的な`package.json`は下記のようになります。

```text:package.json
{
  "name": "amazondash",
  "version": "1.0.0",
  "main": "index.js",
  "scripts": {
    "scan": "dash-button scan"
  },
  "author": "",
  "license": "ISC",
  "dependencies": {},
  "devDependencies": {},
  "description": ""
}
```

##6.Button Wifiスキャン
↓のコマンドを打ちます。

```bash:Terminal
sudo npm run scan
```
ここで、エラーがでなければ電波の受信待ちになるので、Amazon Dash Buttonのほうで設定を行います。
###Amazonアプリの設定
　お持ちのスマホでAmazonアプリをインストールしてください。（パソコンでできないのか。。。）
次にメニューの「アカウントサービス」→「Dash端末」→「新しい端末をセットアップ」でスマホのほうで、Dash ButtonのBluetooth電波を受信してください。
商品選択画面が出ると思うので、そこで右上の✕ボタンを押して抜けてください。
ここまでやると、ターミナルの画面にAmazon Dash Buttonのフィジカルアドレスが表示されるはずです。

```bash:Terminal
$ sudo npm run scan
> dash-button scan

Scanning for DHCP requests and ARP probes on en0...
Detected a DHCP request or ARP probe from 6c:40:08:81:aa:72 //←fromからフィジカルアドレス
```
#実装
##7.Deploy
[こちら](http://qiita.com/takustaqu/items/8539b33780c9675c8657)のページを参考にindex.jsを作成します。
###仕様
・ターミナル上で、カウントする数字（秒）をいれる
・入力した秒数のタイミングでAmazon dash buttonを押す。
・入力した数字と、ボタンを押したタイミングの差分を結果表示

```js:index.js
//定数の設定
const DashButton = require("dash-button"); // モジュール読み込み
const PHY_ADDR = "50:f5:da:51:dc:c4"; // ここでフィジカルアドレスを指定

//変数の設定
var readline = require('readline');

var rl = readline.createInterface({
  input: process.stdin,
  output: process.stdout
});

let button = new DashButton(PHY_ADDR); // ボタンのアドレスを引数に渡してDashButtonクラスを呼び出し
let answer;
let count=-1;
let Timer;
let status=0;

rl.question("How long you count ?", function(number) {
  // TODO: Log the answer in a database
  rl.question("If you are ready, push return key",function(){
  	console.log("COUNT DOWN START!!");
  	Timer = setInterval(function(){
  		// console.log(answer);
  		count++;
  		console.log(count);
  		button.addListener(() => {
  			status = 1;
  			answer = number-count;
  			if(answer > 0){
  			console.log(answer+"秒早いです");
  			clearInterval(Timer);
  			
	  		}else if(answer == 0){
	  			console.log("Conglaturation!");
	  			clearInterval(Timer);
	  		}else{
	  			console.log(Math.abs(answer)+"秒遅いです");
	  			clearInterval(Timer);
	  		}

		});
  	},1000);
  	rl.close();
  });
});

```
いっけぇえええ〜！！
※6章で商品を登録してなければ、押しても商品は注文されません。

```bash:Terminal
node index.js
How long you count ?5
If you are ready, push return key
COUNT DOWN START!!
0
1
2
3
4
5
Conglaturation!
Conglaturation!
Conglaturation!
Conglaturation!
Conglaturation!
Conglaturation!

```
##あとがき
・ボタンを押してから、反映されるまで結構タイムラグがあるので、難しい。
・結果表示が複数出てしまうのが直せてない。
・１ゲームやったら、終了する、部分が直せていない。
といろいろとバグがまだあります。が、一応遊べます。

#参考
・[Amazon Dash Buttonを(正しくない方向で)使ってみた](http://qiita.com/takustaqu/items/8539b33780c9675c8657)
・[npmライブラリ：dash-button](https://www.npmjs.com/package/dash-button)