OmniAICreator/Qiita-1.07M huggingface dataset:
ESLintをコマンドだけで簡単に導入する方法

# はじめに
ちょっとしたコードを書く時、「ちょっとだけだからLinterはいらないや」という気持ちでいざコードを書いてみたら、どんどん統一感がなくなっていき、次第に「やっぱりLinter欲しい。。」となったことはありませんか？
私はよくこの症状に陥るのですが、その度に「packageって何入れればいいんだっけ？」や「.eslintrcの書き方どうだっけ？」となって、毎回ググってしまいます。
そこで、今回はコマンドだけで簡単にESLintを導入できる方法を見つけたので共有します。

# やり方
ソースコードがあるフォルダで以下を実行します。
ちなみに私はAirbnb派なので、その例を示します。

```bash:bash
$ npm init  # package.jsonが既にあれば不要
$ npm install -D eslint
$ ./node_modules/eslint/bin/eslint.js --init  # binまで行けばtabで補完できます
> Use a popular style guide
> Airbnb
> N
> Javascript
```

`--init`によって、必要なpackage（`eslint-config-airbnb-base`と`eslint-plugin-import`）のインストールと、`.eslintrc.js`の作成を行ってくれます。
ESLintのPluginを入れたエディタを使っているのであれば、これだけでESLintを利用できます。
コマンドでLintをかけたいのであれば、

```bash:bash
$ ./node_modules/eslint/bin/eslint.js . --fix  # --fixをつけると自動修正
``` 

または、package.jsonの`"scripts"`に

```json:package.json
"scripts": {
  "eslint": "eslint . --fix"
}
```

を追加して

```bash:bash
$ npm run eslint
```

で実行できます。

いやー、initって便利ですね。
credstash を使って Docker にクレデンシャル情報を渡す例２つ

Docker の起動スクリプトや docker-compose.yml を git で管理していると、パスワードなどのクレデンシャル情報の扱いに困ることがよくあります。

もし実行環境がAWSにあるのなら、[credstash](https://github.com/fugue/credstash) というツールを使うとクレデンシャル情報の管理が簡単にできます。AWS以外の環境ではあまり使えません。

credstash はクレデンシャル情報を KMS を用いて暗号化した上で DynamoDB に保存してくれるツールです。
KMS や DynamoDB にアクセスする権限は IAM Role により制御できるため、例えば ansible vault のように、マスターパスワードを持つ必要がありません。

credstash については https://qiita.com/winebarrel/items/71e534f294a10224cbd3 などで詳しく紹介されているので、こちらをご覧ください。

この記事では docker と credstash を組み合わせて使う例を２つほど紹介します。

# その１ ~ `docker` コマンドから渡す

`docker run` コマンドは `-e` オプションで環境変数を渡すことができます。

例えば、次のような起動スクリプトを書くことができます。

```sh:run.sh
docker run -e MY_PASSWORD=$(credstash get my-password) my-image
```

# その２ ~ `CMD` 内部で取得する

docker 起動時にコンテナ内部でクレデンシャル情報を取得する方法です。

コンテナ内部から credstash を利用する場合、 credstash のGo版である [gcredstash](https://github.com/winebarrel/gcredstash) がバイナリ１つでインストールできるので便利です。

```dockerfile
FROM ubuntu
...
RUN curl -L https://github.com/winebarrel/gcredstash/releases/download/v0.3.5/gcredstash-v0.3.5-linux-amd64.gz > /usr/local/bin/gcredstash \
 && chmod +x /usr/local/bin/gcredstash
...
CMD MY_PASSWORD=$(gcredstash get my-password) \
    ./run-my-app
```

docker build 時ではなく、コンテナ起動時に gcredstash を呼び出すため、`ENV` コマンドではなく `CMD` コマンドでクレデンシャルを取得する必要があることに注意です。

この方法は、特に docker-compose で ECS の実行環境を管理している場合に便利です。

例えば、次のような docker-comose.yml を用いると、dockerイメージに手を加えることなくクレデンシャルを渡すことができます。
ECS コンソールにもクレデンシャル情報は表示されません。

```yaml
service: '2'
---
services:
  app:
    ...
    volumns:
    - /path/to/gcredstash:/usr/local/bin/gcredstash
    command: |
      bash -lc '
      MY_PASSWORD=$$(gcredstash get my-password) \
      ./run-my-app
      '
```
Zipファイルへの総当り攻撃

前回 ，[PythonでBasic認証へ総当たり攻撃](https://qiita.com/nekkoneko/items/5663c901a3b31386c7e1)という記事を書いたのですが，今回はZipファイルに対して総当たり攻撃を行いました．

* 悪用厳禁です！
    * ペネトレーションテストで使うなりしてください．

# ソースコード

```python
# args[1] -> dictionary file , args[2] -> zip file


import os
import sys

args = sys.argv

dic = open(args[1],"r")
passwd_list=dic.read().split("\n")

for passwd in passwd_list:
    if len(passwd) == 0:
        print("empty")
    else:
        result=os.system('unzip -P ' + passwd + ' ' + args[2])
        if result == 0:
            print("password is found!!! ->",passwd)
            sys.exit()
print("password is not found")
```

# 一応説明

そんな説明することもないのですが，一応

* ひとつ目の引数に辞書ファイル、ふたつ目の引数にzipファイルを渡す．
* 辞書ファイルを1行ずつ読み、Zipファイルのパスワードと照合．
* パスワードが見つかれば, sys.exit()でプログラム終了
    * 見つからなければその旨を出力

# 辞書ファイルを作る

* crunch というコマンドを使いましょう．
    * 参考 -> [総当たり攻撃用の「.txt」ファイルを作ってくれるソフト【Crunch】の使い方](https://qiita.com/alice109/items/6fa36cdb262672e18166)
* 8桁の英数字の全組み合わせとか作ろうとしたら，容量が大きすぎて無理

# パスワードは厳重に

* この程度のソースコードとcrunchで作った辞書ファイルで破られるようなパスワードにはしないでください．(crunchで10桁とか作っている人がいたら厳しいんですけどね・・・)


# 最後に

* 自分のパスワードの管理方法を紹介します．

1. まずはパスワードを8桁以上で作成する．（使い回しはやめよう）
2. パスワードをテキストファイル( (例)pass.txt )にメモする．（よくないかも）
3. outguessコマンドを使った，ステガノグラフィーで適当な画像ファイルにpass.txtを埋め込む. -> [参考](https://qiita.com/nekkoneko/items/1ce814ad83716928ce12)
4. 画像ファイルをzipコマンドでパスワード付きで圧縮する．

* zipファイルのパスワードが破られたとしても，画像ファイルが出てくるだけなので，わからないひとには全くわからない（はず）
【Google Apps Script】その19　Chatwork Webhookを使い、スプレッドシートに発言を溜める

この記事は[Google Apps Scriptを実例交えて基礎からざっくり学ぶ Advent Calendar 2017](https://qiita.com/advent-calendar/2017/gas_beginner)　19日目の記事です。

本アドベントカレンダーは@rt_pの個人プロジェクトですが、筆者は[Ateam Brides Inc. Advent Calendar 2017](https://qiita.com/advent-calendar/2017/a-t-brides)にも参加しています。そちらでも出張版記事を書いているので、覗いていただけると嬉しいです。

# はじめに

今回はChatworkの特定の部屋に投稿されたメッセージをスプレッドシートに溜めていきます。
記事を書いた後に思ったのですが、昨日の記事の方が圧倒的に難易度高いですね…。

![sheet.png](https://qiita-image-store.s3.amazonaws.com/0/199678/f536c37c-e846-2a47-52e8-611aff97beb0.png)

# スプレッドシートの準備

スクリプトエディタを開き、以下コードに置き換えて実行します。
スクリプトエディタの開き方や*承認が必要です*メッセージが出た際の対処法が分からない場合は
[アドベントカレンダー1日目のHello, world!記事](https://qiita.com/rf_p/items/0535ec495df8f9d2b894)をご参照ください。

```javascript:webhook_spreadsheet.gs
// doPostのデバッグ用
function dummyPost() {
  var webhookEvent = {
    'webhook_event': {
      'body': 'こんにちは'
    }
  };
  var e = {
    'postData': {
      'contents': JSON.stringify(webhookEvent)
    }
  };
  var res = doPost(e);
  Logger.log(res);
}

function doPost(e) {
  try {
    var json = JSON.parse(e.postData.contents);
    var body = json.webhook_event.body;
    SpreadsheetApp.getActiveSheet().appendRow([body]);
  } catch (e) {
    return false;
  }
  return true;
}
```

デバッグ用の`dummyPost()`を実行すると、スプレッドシートにメッセージが追記されます。

![msg.png](https://qiita-image-store.s3.amazonaws.com/0/199678/7cfecb49-9203-a859-01e9-92b3f00fa557.png)

# APIの公開

*公開→ウェブアプリケーションとして導入*から、
*アプリケーションにアクセスできるユーザー:全員（匿名ユーザーを含む）*に設定して公開します。

（昨日の記事と全く同じことを書きますが）設定後は当然ながらこのAPIにアクセスに誰でもPOSTを投げられるようになります。誤ってURLを漏洩でもしない限りよっぽど大丈夫かと思いますが、自己責任でお願い致します。

# Webhookの設定

ChatworkのAPI設定リンクからWebhook設定ページに飛び、以下の通り新規作成します。

![webhook.png](https://qiita-image-store.s3.amazonaws.com/0/199678/4df5333f-efa4-db43-67cd-505fbcddf562.png)

設定が問題なく済むと、指定した部屋に投げた発言がスプレッドシートに自動記録されていきます。

![cw.png](https://qiita-image-store.s3.amazonaws.com/0/199678/a5b20228-e045-6ece-c495-03715868da7f.png)
![sheet.png](https://qiita-image-store.s3.amazonaws.com/0/199678/f536c37c-e846-2a47-52e8-611aff97beb0.png)

# おわりに

私は業務でこれを応用し、システムエラーが発生するとChatwork部屋に自動投稿される→その投稿をスプレッドシートに溜めていきデイリーの不具合件数を夜に通知する
というシステムを作りました。

ChatworkのAPIを使えば部屋のメッセージ一覧を取得することも可能なのですが、メッセージ収集だけならWebhook＋GASのExecutionAPI（doPost）で実現でき、GAS側にChatworkトークンを持たせなくて良いのが利点です。

他にも例えば、仕事のやり取りでエビデンスを残しておきたい時に使うといいかもしれません。Webhookでスプレッドシートに投稿時の発言を残しておけば、後から更新・削除しても追うことができるので。
スプレッドシートという、簡単に編集削除できるものに残すのが適切とは思えないですが…:sweat_smile:

# 明日

[【Google Apps Script】その20　今日の予定をChatworkに一括通知する](https://qiita.com/rf_p/items/3b1874f9a71f0d39ccab)
となります。
予定表と連携し、予定を一括通知するシステムを作ります。

前の記事
[【Google Apps Script】その18　日本語で話しかけると3ヶ国語で返すChatwork botを作る](https://qiita.com/rf_p/items/28190b50d79195fec1ba)
次の記事
[【Google Apps Script】その20　今日の予定をChatworkに一括通知する](https://qiita.com/rf_p/items/3b1874f9a71f0d39ccab)
ESP32+micropythonでBLEを動かしてみた

[MicroPython Advent Calender](https://qiita.com/advent-calendar/2017/micropython "MicroPython Advent Calender") 18日目です。

今日はESP32+micropythonでBLEを試してみました。

ESP8266とESP32の大きな違いはBLE機能が搭載していることです。
micropythonでも動かしてみたいものですが、残念ながら公式で配布されている
ファームはBLEに対応していません。

今月号のInterfaceでBLEを動作させる記事が書かれていますがビルドが必要となり
そこそこ大変です。

気軽にできないかと模索してみてPycom（Wipy）のファームを書き込んだESP32-devkit
でBLEの動作が確認できました。
Pycom（Wipy）のファームの書き込み方法は14日目の記事をご確認ください。

ファームを書いたらPycomのドキュメントにあったsampleを動かしてみました。

https://docs.pycom.io/chapter/firmwareapi/pycom/network/bluetooth/

```py3
from network import Bluetooth

bluetooth = Bluetooth()
bluetooth.set_advertisement(name='ESP32', service_uuid=b'1234567890123456')

def conn_cb (bt_o):
    events = bt_o.events()   # this method returns the flags and clears the internal registry
    if events & Bluetooth.CLIENT_CONNECTED:
        print("Client connected")
    elif events & Bluetooth.CLIENT_DISCONNECTED:
        print("Client disconnected")

def main():
	bluetooth.callback(trigger=Bluetooth.CLIENT_CONNECTED | Bluetooth.CLIENT_DISCONNECTED, handler=conn_cb)
	bluetooth.advertise(True)
```

このコードを転送して実行すると、、、

iphoneでESP32が出てきました。

<img width="375" alt="IMG_0801.PNG" src="https://qiita-image-store.s3.amazonaws.com/0/146663/7e3e6852-94ac-09c9-e6d8-c2d82b955dba.png">

ESP32をタッチすると接続しに行くので、CLIENT_CONNECTEDが検出されました。
画面を戻るとCLIENT_DISCONNECTEDになりました。

![2017-12-18_00h16_14.png](https://qiita-image-store.s3.amazonaws.com/0/146663/ad017882-9829-d0fd-b885-d571ecf9cd83.png)

非常に簡単な動作確認ではありますが、Pycom（Wipy)のファームであればBLEが
動作するようです！

次は文字のやりとりに挑戦です。
Google-Home + 艦これ時報

アドベントカレンダー　9日目
投稿されないようなので、先ほど作成したも物をご紹介します。

# 何をするの？
ラズパイを使ってGoogle-Homeに、艦娘たちの声で時報を行なってもらいます。

# どうやる？
ラズパイ上のcronを使って、Google-homeからMP3を再生。
前提条件として、Google-Home-Notifierのインストールと
ApacheなどのWebサーバが動いている事が条件となります。

# 環境
- Raspberry Pi
 - Apache （Webサーバとして）
 - Node.js
  - Google-Home-Notifier
  - Node-Cron
  - PM2
 - FTP (MP3アップロードにあったほうがいい)
- 艦娘たちのボイスMP3
 - 録音を頑張って。

# ボイスMP3の準備
艦娘の時報MP3ファイルの名前規則を以下としました。

```金剛　→　kongo_00.mp3 , kongo_01.mp3 ...```
名前をローマ字に、その後に時刻を24hで表記、これで起動の際に数字を指定します。

これらをWebサーバが参照できる場所にFTPなどで保存します。
<img width="659" alt="スクリーンショット 2017-12-18 00.11.08.png" src="https://qiita-image-store.s3.amazonaws.com/0/178507/f8543b75-24c0-c096-81e6-ede4b1961992.png">

# 発信スクリプト
Cron用のスクリプトが以下です。

```cron.js
require('date-utils');
const googlehome = require('./google-home-notifier');
const language = 'ja';
googlehome.device('Google-Home', language);

// 艦娘のリスト現在は4人だけ収集しました。
var kanmusu = [
'kongo_',
'fubuki_',
'akatsuki_',
'hiei_',
'iku_'];

let cron = require('node-cron');
cron.schedule('0 0 18-23,0,1 * * *', () => {

var dt = new Date();
var H_word = dt.toFormat("HH24"); //24時間表記で取得
var date_word = dt.toFormat("DD"); //いずれは日によって振り分けしたい。

time_word = H_word;　
date_word = "4"; //現在は伊19限定、0にすれば金剛、1にすれば吹雪となる。

//URLの組み立て。
sp_text='http://192.168.1.207/~pi/jiho/'+ kanmusu[date_word] + time_word + '.mp3'

//アクション
googlehome.play(sp_text, function(res) {
  console.log(res);
});


});
```
Cronの時間表記で喋らせたい時間も変更可能。
応用編として艦これだけでなく、定期連絡のアナウンスに使えるかも。


この後、PM2でスタートすればデーモン化して常駐する。
``` pm2 start cron.js ```


テストショット。
[![0時の伊19](http://img.youtube.com/vi/hfSZj-JcE-I/0.jpg)](http://www.youtube.com/watch?v=hfSZj-JcE-I)
NefryでJenkinsのXFD作ったり、電子工作コンテストで賞もらった話

#はじめに
[nefry.studio](http://nefry.studio/)の[Nefryでできること+作品集](http://nefry.studio/Nefry%E3%81%A7%E3%81%A7%E3%81%8D%E3%82%8B%E3%81%93%E3%81%A8+%E4%BD%9C%E5%93%81%E9%9B%86/)で紹介してもらった、自分の作品を中心になんやかんや書いていこうと思います。

#Nefryとの出会い
２０１６年の7/9(土)、7/10(日)のメイカーズバザール大阪2016で出会いました。
当時、電子工作歴半年の自分は、ESP8266の事は知らず、
Wifi付きで、ArduinoIDEでプログラミングできるデバイスを、自分で基板起こして、ソフトも作っててしかも大学生！！！
すげー！！！と思ったのがNefryとの出会いです。
[メイカーズバザール大阪2016　出展レポート](https://qiita.com/onoche/items/9f8c8c6319094a79e3c4)


#Nefryでiotカーテン作ってみた
Nefryで最初に作った作品はこちら。何か面白いことしたーいと思って、エレキットの電子工作コンテスト「くらしハックコンテスト」に応募してみたら、なんと特別賞をいただきました！！

[くらしハックコンテスト](https://www.elekit.co.jp/contest/2016pu/?page=result)
動画が見れます。

[![カーテン自動開閉](http://img.youtube.com/vi/TwJYxDXwZ0c/0.jpg)](http://www.youtube.com/watch?v=TwJYxDXwZ0c)


このネタで2016/10/5 IoTLT大阪 vol.3 でLTしました。
[LT資料](https://www.slideshare.net/BlueTone1/161005-io-tltnefryiot)

この時に自分が実装したやり方はNefryのクラスを改造してWebページ追加とかしてましたが、あまり良くない実装でした。
後に紹介するXFDを作った時のNefry.setIndexLink()や、Nefry.getWebServer()->on()でinoファイルに処理を書くのが良いです。


#見える！「IoT」 NefryでJenkinsのXFD作ってみた
2017/6/28 「第3回 梅キャンIoT勉強会」と、2017/8/10「第10回 大阪Jenkins勉強会」 でLTしました。

詳しくは、スライド参照で。
[見える！「IoT」 NefryでJenkinsのXFD作ってみた](https://www.slideshare.net/BlueTone1/170810-jenkins-nefryjenkinsxfd)

[デモ動画(ツイッター)](https://twitter.com/bluetoneinfo/status/880795339485200384)

ポイントは
・スライドの16p、JenkinsからHook受信で、NefryからJenkinsに状態を取りに行く仕組み。
・jsonで通信してみた。
ってところでしょうか。

作ってみた感想としましては、
上で書いたNefry.setIndexLink()や、Nefry.getWebServer()->on()でめちゃめちゃ簡単に実装できました。
JenkinsのURL等、可変パラメータも簡単に実装できる！
Nefryステキ！！！

#まとめ
・簡単に実装できる、Nefryステキ！！！
・作った物を発表すると、いろんな人に知り合ったり、フィードバックもらえたり、色々良いことがあった！

ちょっと古いネタを掘り返してきましたが、NefryBTもゲットしているので、CO2濃度モニター作りたいなーとか考えています。

ハバ・グッド・メイク！！
エンタープライズIoT事例

#産業界とIoT
IoTに関して一般事業会社は、これまでのSIっぽい「専門家（SIer）に丸投げする→SIerは仕様通りウォータフォールで作る」という姿勢から、「ユーザーを中心に社内の人と社外の人が一体になって試行錯誤しながら作り込む」に変わってきました。
その結果、ユーザーならではの面白いIoT事例がたくさん出てきたので、何かのヒントになればといくつか紹介しようと思います。

#稼働監視システム「i-Look」

飯山精器(株)さん（従業員70名くらい。丸物の旋盤加工が得意。）が自作したシステムです。

![alt](http://www.iiyamaseiki.co.jp/iot/assets/images/page/case_1s.jpg)

工作機械の稼動状況を把握するために三色灯というものがあります。
青が正常で、黄色が異常で、赤色が停止、みたいな事を表します。
この情報をデータから直接取得すると、三色灯メーカーのオプションを付けなければなりません。
（センサーデータを直接取得すると、メーカーの保証外となります。）

そこで、飯山精器(株)さんは三色灯の３ヶ所に照度センサーを着けました。
そして、どれが明るいかで何色が点灯しているかわかるシステムを構築しました。
仕組みはとてもシンプルで、照度センサー値をwifi経由で飛ばすだけです。

![alt](http://www.iiyamaseiki.co.jp/iot/assets/images/page/sys3.png)

でも、これだけで遠隔から機器の稼働状況がわかりますし、通電時間やアラート発生時間もわかります。
例えば、夕方の帰宅前、大量に材料をセットして自動運転モードで翌朝まで機械を回すことは多いのですが、自動制御や自動リカバリまでじゃなくても動いているか止まっているかが、どこにいても判るのは業務効率の視点でも重要ですし何より気持ちが楽になりそうです。

#中小製造業向け総合情報管理システム「BIMMS」

武州工業(株)さん（従業員160名くらい。パイプ加工が得意。）が自作したシステムです。
その中でも面白いのは、ipod touchを使ったカウンターです。

![クリップボード02.jpg](https://qiita-image-store.s3.amazonaws.com/0/178685/c2853eed-b1a2-1140-d56c-54835d9155bb.jpeg)

上の写真の機械は、写真の左側にレバーがあって、レバーを下ろすと黄色い部分が右側にスライドして、出っ張っている２つの丸筒が加工物に穴を開けるというものです。油圧で動くので、電気的な機構は持っていません。
これまで、この機械で何ショット加工したか、という情報は取ることが出来ませんでした。

そこで、武州工業(株)さんは、使わなくなったipod touchを黄色い部分の真ん中に両面テープで付けてました。
そして、ipod touch内臓の加速度センサーの値を取り出して、ざっくりカウントしたりグラフにして１日の進捗を管理しています。

#ちいさくはじめる「身の丈IoT」

中堅中小企業を中心に、自分たちがやりたい事を自分たちで出来る範囲でまずはやってみようという流れが加速しています。
そこでの課題は、気楽に手伝ってくれるエンジニアがいないことです。
例えば、毎週土曜日午前中とか、平日19時以降とか、そんな感じで一緒にツール作りをしてくれる人を探す会社は多いです。
周りや友達の友達にそんな会社があれば、ぜひ協力してあげて下さい。
UE4でVR空間にカノジョを錬金 23日目

[UE4でVR空間にカノジョを錬金する Advent Calendar 2017](https://qiita.com/advent-calendar/2017/ue4vrgame-create) 23日目の記事です。

12/1～25日までに一人で、UE4を用いてサ○○レッスンとかVR○○ジョっぽいゲームを作って仮想彼女を生み出すことにチャレンジします。

今回、吐くのに必要な回転値を求める計算式を書きます。
呼吸ロジック最後の記事です。

#回転値を求める計算式

21日目に書いてあるのと同様の処理を、吐く用変換して実装します。

ただ、吸うときの処理をそのまま入れるとアニメーションがおかしくなるため、回転値を求めた後、各ボーンのinhaleから引いた値を回転値としてセットします。

GetExhaleRoatatorという関数を作成し、上記に記載した処理を実装しています。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/104377/f430a53c-f057-b454-99da-9fe8c524d1ec.png)

つづいて、吐くアニメーションに必要な回転値を実装します。

`[各ボーンの吐くアニメーション最大回転値] * EffectRate * Sin((GetAudioTimeSecounds - StartTime)/(exhale*durationRate))`

上記の計算式をBluePrintで書くと以下の通りになります。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/104377/749b9c13-db11-a25c-7337-9feacc003a4e.png)

胸、首、頭も同様の処理を挟みます。
これで息を吐くアニメーションが出来たと思います。

呼吸アニメーション実装完了です。

#次回
残り２日、何を実装しようかな……。
現在考え中です。
あなたもやろう、IoTLT

この記事はIoTLTアドベントカレンダー17日目の記事です。

昨日は @m_ando_japan さん、明日は　@yamacho1111 さんです。

## 自己紹介

IoTLT札幌の開催を担当しています。

IoT的な活動としては、 地元のバスロケーションシステムの研究開発に携わったり、Wio-Node や micro:bit（chibi:bit） を大学の授業やプログラミング教室に使ったりしています。

## はじめに

ご存じ、地方開催は[日本全国8箇所](https://iotlt.connpass.com/)に展開されているIoTLTですが、**せっかくなので47都道府県1,700市町村に広がってほしい**ですよね。

「うちの地元にもあればいいのにな」と思いつつモタモタしていた私も、半年前から札幌での開催に携わらせてもらっています。

この記事を読んでいただいて、まだ参加されていない皆さんも、**ぜひLTでの参加や、あわよくば地方開催をしてみませんか**と背中を押す目論見で、そしてIoTLT札幌の半年間の開催報告を兼ねて、

- 札幌でIoTLTをやろうと思った動機
- IoTLT札幌を開くまでの準備
- 開催して改めて感じたIoTLTの良さ

を~~数日前にLTしたばかりで、技術的なところはネタ切れなので~~ご紹介させてください。

## 札幌でIoTLTをやろうと思った動機

大阪出張と日付がちょうど重なっていた[大阪版IoT縛りの勉強会！IoTLT大阪 Vol.5](https://iotlt.connpass.com/event/49599/)に参加したことがきっかけです。（大阪の皆様、その節は大変お世話になりました）

この時にとても印象に残ったことは、発表者と発表テーマの幅広さでした。

具体的には

- 学生さんも初心者もベテランも話題を持ち寄って発表する
- 計画段階のものも、失敗談でも発信している
- 発表の方向性が多岐に渡り「そんなのもあるのか」という発見がある

という点が、率直な感想でした。

### 私が参加or主催してきた勉強会では...

通常の勉強会では、

1. 何か主テーマとなる言語や技術がある　
2. 聴講者はそのノウハウを求めて参加する　
3. 発表者もそれを前提に（テーマに関する情報やノウハウ化を準備して）発表する 

という枠組みが基本形と感じています。

テーマについて深く学べる一方で、学生さんや初心者が登壇することは、ゼロではないものの珍しいのではと思っています。

### IoTLTでは...

IoTLTでは、

1. IoTという広い枠組みがテーマ
2. 登壇者が話題を持ち寄って話す  （"作ってみた"でも、失敗談でも、計画段階でも、調べてみたことでも良い）
3. LTのテンポのよい形式で進む

という枠組みになっていて、**発表者にとっての敷居は低く、けれども聴講者にとっても浅く広い知識の共有や面白みがある**、という両立を感じました。

（注：もちろん、どっちが良い論ではないです。そのやり方を基本にしているというだけで、IoTLTだけに限った形式でもないです）

これを地元に持ち込めば、きっと札幌でも面白い発表（者）が集まってくれるんじゃないか、という予感がしました。

## IoTLT札幌を開くまでの準備

あなたがIoTLTを地元でやりたい！ということになったとしたら、大まかにこういう手順になると思います。

1. 地方 or 東京のIoTLTに参加して、雰囲気や流れを確認しておく
2. 主催ののびすけさん（@n0bisuke）にコンタクトする
3. 開催の目処をつける（会場・日程等）
4. FB/Connpassで募集・コンタクトをとれるようにする
5. 開催する

私の場合は、

1. 大阪の懇親会で、のびすけさんに連絡したら良いと伺う
2. そうだね、でも初対面だし突然連絡したら失礼かもしれないし...とモタモタしながら「できればIoTLTを札幌でやりたいな」的なことをつぶやいたら、のびすけさんから「やりましょう」と連絡をいただいてしまう
3. 一応、東京のIoTLTも見に行く（数百人集まってすごい熱気）
4. 開催の目処をつける（会場・日程、ひとまず自分の発表ネタ）
5. FB/Connpassで発表者募集する
6. 無事開催

という運びになりました。
おかげさまで[2017/9/1に第1回](https://iotlt.connpass.com/event/53217/)、[2017/12/15に第2回](https://iotlt.connpass.com/event/72454/) を開催できました。


## 開催して改めて感じたIoTLTの良さ

- 1回目から予想以上の発表者が集まってくれた
- 1回目に加えて2回目は初参加の発表者・聴講者が集まってくれた
- 発表者の背景によって面白い情報が集まってきた

2回目のものですが、雰囲気は[ハッシュタグ #iotlt_sapporo](https://twitter.com/hashtag/iotlt_sapporo?src=hash)を追っていただけるとわかるかもしれません。

例えば[スマートルアー株式会社](http://smartlure.hatenadiary.jp/)さんの取り組みや計画をご紹介いただいたり、人工知能系の研究をしている学生さんは[面白いツール](https://www.movidius.com/)を紹介してくれたり。

学生さんは授業の成果を報告してくださったり、勉強会の登壇が初めてという方も発表してくださいました。

ハードとソフトを両方使うmicro:bitとラズパイの連係や雑談APIを使ったしゃべるぬいぐるみ、流行のAlexaの事例からスマートスピーカーのベンダ毎の違いの話題に発展したり、ツイートの中でも「そういうのもあるのか」と参加者が感じている内容が目立っているのではないかと思います。

正直なところ、地元や個人レベルでIoTにチャレンジする事例がこんなにあるのか、と驚きました。

「次回は発表しようと思います」「実はこんなことを個人でやってます」と声をかけて下さる方も多く、今後もいろいろな知見が共有されるのではないかと期待しています。

![fig01.jpg](https://qiita-image-store.s3.amazonaws.com/0/8064/36def261-1a46-903b-d14b-74e2dee209af.jpeg)
図：発表時にデモが動かず焦る筆者

## おわりに

俺が、俺たちがIoTLTだ！　という勢いで、参加者だけでなく、ぜひ地方のIoTLTも増えて欲しいなと思います。

札幌も、次回は来年5月に開催する予定です。

来年は地方もふくめて、どんなIoTの話題が持ち寄られるでしょうか。楽しみに年を越したいと思います。
PostgreSQLにOrafceをインストールする

# PostgreSQLにOrafceをインストールしよう
OrafceはオラクルDBの関数をPostgreSQLでも使えるようにするextensionです。
いまどきかよ。。。
という気もしますが、古くからみなさまにご愛用いただいているWebシステムではまだ重宝されています。
ちょっと古い環境を用意する必要があり、Orafceを導入した際の手順をまとめておきます。

## 環境
```
CentOS7.3
PostgreSQL 9.3
```

## RPMでインストール
makeを使ってインストールする方法もありますが、
自分の環境ではうまく入らず。。。
嬉しいことにRPMが公開されていたので、こちらを利用させていただきます。
https://centos.pkgs.org/7/epel-testing-x86_64/orafce-3.1.2-3.el7.x86_64.rpm.html
こちらからRPMをダウンロードしておきましょう。

ダウンロードが済んだらインストールするだけです。

```
rpm -ivh orafce-3.1.2-3.el7.x86_64.rpm
```

自分の環境ではココにインストールされました。

```
root@orafcedb orafce]# find / -name "*.sql"
/usr/share/pgsql/conversion_create.sql
/usr/share/pgsql/extension/plpgsql--1.0.sql
/usr/share/pgsql/extension/plpgsql--unpackaged--1.0.sql
/usr/share/pgsql/extension/orafce--3.1.sql
/usr/share/pgsql/extension/orafce--unpackaged--3.1.sql
/usr/share/pgsql/extension/orafce.sql
/usr/share/pgsql/extension/uninstall_orafce.sql
```

## PostgreSQLにOrafceを導入

PostgreSQLにログインし、Orafceを導入したいデータベースに接続します。
その後、以下のクエリを実行します。

```
create extension orafce;
```

Orafceが入っているか確認します。

```
\dx
-[ RECORD 1 ]----------------------------------------------------------------------------------------------
Name        | orafce
Version     | 3.1
Schema      | public
Description | Functions and operators that emulate a subset of functions and packages from the Oracle RDBMS
・・・
```

後は、Oracleの関数を実行できるか確認します。
以下のように`next_day`関数が実行できればOrafce導入成功です。

```
postgres=# select next_day(current_date, 'saturday');
-[ RECORD 1 ]--------
next_day | 2017-12-16
```

以下のようにエラーになってしまったら失敗です。
どこか間違っているかもしれません。

```
postgres=# select next_day(current_date, 'saturday');
ERROR:  function next_day(date, unknown) does not exist
LINE 1: select next_day(current_date, 'saturday');
               ^
HINT:  No function matches the given name and argument types. You might need to add explicit type casts.
```

古い環境とはいえ、
動いた時は感動ものですね。
Nefryクラウド(仮)をつくってみた

はじめまして＆こんにちわ、わみです。
今回はNefryクラウド(仮)を作りましたのでその紹介をさせていただこうと思います。

**2019/12/20にアップデートのため停止予定です**

# Nefryの問題点

Nefryには大きな問題がありました。
それはネットからNefryにメッセージを送る難易度が高いことです！

一応AzureIoTHubやMilkcocoa(**Nefry BT未対応**)などがありますが、Nefry BTでは特にMilkcocoaに対応していないので特に難易度が高いです。

その問題を解決するために仮ではありますが、Nefryクラウド(仮)を作ってみました。
セキュリティが強固ではないので秘匿性の高いデータは扱わないでください。

# Nefryクラウド(仮)って？

Node-Redで作られた、Nefry用のクラウドです。
HTTPリクエストで受け取ったメッセージをMQTTを経由してNefryに送るようになっています。
Node-Redのフローについても後日公開する予定です。

>あとNefryクラウド(仮)は正式なサービスではありませんので、**突然停止することや廃止される**ことが可能性があります。
なにか問題があった際には[FacebookのNefryユーザグループ](https://www.facebook.com/groups/nefry/)で告知させていただく予定なのでご参加ください。

# Nefryクラウド(仮)の使い方

Nefryクラウド(仮)の使いかたを紹介します。
クラウドに登録してから、Nefryにプログラムを書き込み、HTTPでメッセージを送るところまでを紹介します。

## Nefryクラウド(仮)に登録

>##[Nefryクラウド(仮)のリンク](http://cloud.nefry.studio:1880/nefrysetting/)

![2017-12-17_22h59_07.png](https://qiita-image-store.s3.amazonaws.com/0/97208/2deeda5d-1672-3855-fdb4-b15ee5a78d52.png)

ユーザ名とメールアドレスを入力してください。
こちらメールアドレスに必要なAPIKeyを送るので正しいメールアドレスにしてください。

![2017-12-17_22h58_51.png](https://qiita-image-store.s3.amazonaws.com/0/97208/1bc8447e-a0a2-8e4b-5e33-75752c1b2136.png)

上のようにメールアドレスとユーザ名を入力したらSendを押してください。
問題なければ下の表示になり、メールが送られます。

![2017-12-17_22h59_00.png](https://qiita-image-store.s3.amazonaws.com/0/97208/077dcf9d-ec1a-320e-7ef3-9e5eff7f8bda.png)

メールが無事に届けば、APIKeyが分かりますのでそれをNefryのプログラムに書き込むので覚えておいてください。
メールが届かない場合、迷惑メールフォルダ等に入っている可能性が高いのでそこを確認してください。

![2017-12-17_22h59_17.png](https://qiita-image-store.s3.amazonaws.com/0/97208/e40ac004-4610-d78d-614a-5164bce18db9.png)

必要なデータが不足している場合、エラーメッセージが出るのでそれをみて対応してください。

## Nefryのプログラムを書こう

あらかじめ[こちらのライブラリ](https://drive.google.com/open?id=15wHNn3ceyG7f0QEh2PPrnWGt0kIyStfW)をインストールしてください。

```cpp:NefryCloud.ino
#include <Nefry.h>
#include <NefryCloud.h>

NefryCloud nefryCloud;

void onpush(String message);

void setup() {
  nefryCloud.begin("user","apikey");//サイトで登録したuser,メールで受け取ったapikeyを入力してください
  nefryCloud.on(onpush);
}

void loop() {
  nefryCloud.loop();
}

void onpush(String message) {//Nefryクラウド(仮)から通知が来ます
  Nefry.print("onpush : ");
  Nefry.println(message);
  if(message.equals("on")){
    //onという文字列がきたときに処理をする
  }
}
```

```
nefryCloud.begin("user","apikey");//サイトで登録したuser,apikeyを入力してください
```
この行に先ほど登録したユーザ名とメールで受け取ったAPIKeyを置き換えて入力してください。

# 外部からNefryに通知を送ってみる

一例ですが、user名がnefry、apikeyが2056f57db84f6c6a2e276119eだった場合このようなURLを叩いてください。
**このURLを叩いてもメッセージは送れません**
データを送ることができる機能もあります。この場合Nefryにtestdataというメッセージが送られます。

GETメソッド http://cloud.nefry.studio:1880/nefrysetting/setdata?user=nefry&key=2056f57db84f6c6a2e276119e&data=testdata

POSTメソッド http://cloud.nefry.studio:1880/nefrysetting/setdata
Content-Type : application/json
{"user":"nefry","key":"2056f57db84f6c6a2e276119e","data":"testdata"}

>IFTTTからNefryクラウド(仮)にメッセージを投げる例
![2017-12-18_00h46_01.png](https://qiita-image-store.s3.amazonaws.com/0/97208/cb353b40-3c21-0e6c-ede0-836e788b7c93.png)

# まとめ

簡単ではありますが、Nefryクラウド(仮)の紹介とさせていただきます。
Node-Redを使うことで上のようなサービスを１日程度で簡単にサービスを作ることができます。ぜひお試しください。

>あとNefryクラウド(仮)は正式なサービスではありませんので、**突然停止することや廃止される**ことが可能性があります。
なにか問題があった際には[FacebookのNefryユーザグループ](https://www.facebook.com/groups/nefry/)で告知させていただく予定なのでご参加ください。
UE4でVR空間にカノジョを錬金 22日目

[UE4でVR空間にカノジョを錬金する Advent Calendar 2017](https://qiita.com/advent-calendar/2017/ue4vrgame-create) 22日目の記事です。

12/1～25日までに一人で、UE4を用いてサ○○レッスンとかVR○○ジョっぽいゲームを作って仮想彼女を生み出すことにチャレンジします。

今回は呼吸処理、吐く処理を実装していきます。

#吐くロジック

息を吐くように見せるアニメーションの関数説明に入ります。

![image.png](https://qiita-image-store.s3.amazonaws.com/0/104377/1a464c0e-6da9-f992-36b1-d82306ba11f6.png)

今回は下にあるSet Exhaleメソッドについての説明です。

##Set Exhaleメソッド

扱う変数が微妙に違うだけで、大体SetInhaleメソッドと一緒になります。

こちらが関数の全体図です。

![image.png](https://qiita-image-store.s3.amazonaws.com/0/104377/a1ecc6ef-f648-1b7e-3b9c-fad21b3507a6.png)

一番下が吐くアニメーションの時間を判定しています。

![image.png](https://qiita-image-store.s3.amazonaws.com/0/104377/0b7e2c52-4ea9-eca9-903d-2af909025cd8.png)

呼吸の時間は以下のように計算しています。

`exhale * durationRate + 0.5`

0.5は今回実装した時に自然に呼吸させるように見せるために必要な調整時間です。
これを吐くモーション開始してからの経過時間を計り、もし過ぎたら待機状態にフェーズを移行するようにセットします。

続いて各ボーンの回転値をセットします。
今回は息を吸って膨らむようにボーンを回転させた値から、ほぼ元の位置に戻すように計算するメソッドを挟んでいます。

![image.png](https://qiita-image-store.s3.amazonaws.com/0/104377/f338dcf3-1f58-44af-3146-58e0e4f64641.png)

ボーンを回転させるのは縦方向なので、ボーンの向きを見て正しく動くように値をセットします。
今回、ユニティちゃん、グレイちゃん共にX（Roll）が縦方向に回転するので、Xにセットしています。

回転値はGetExhaleTimeという関数を作成して取得しています。

※関数名が色々オカシイのは許してください。20日目に書いた記事と同様の理由になります。
※よい子の皆さんはちゃんと適切な関数名にしましょう。

本日はここまでです。

#次回
次は吐くのに必要な回転値を求める計算式を書きます。
Drupalで機能を作る際に考えること

こちらはHameeアドベントカレンダー18日目です。
https://qiita.com/advent-calendar/2017/hamee

~~本当はpython（opencv）での画像マッチングについて書こうとコードを書いてあとはinputとoutputを決めて実行し記事を書くだけの状況にしていたのですが、前日にmacが突然お亡くなりになりコードとプログラムの実行手段がなくなりこの記事を書いています・・・・~~

Drupal7のモジュールについてお話します。
# Drupalとは
オープンソースのCMSの1つでありモジュールを取り入れて拡張することを基本としており、またCMSとしての用途だけではなく簡単にWEBアプリケーションを作成することが可能である。またセキュリティの信頼も高い

# Drupalのモジュールとは？

Drupalで作成するWebアプリケーションの機能の1部であり、モジュールには以下の3つの種類が存在します。

1 コアモジュール
コアモジュールとはDrupalをインストールした段階から備わっているモジュールで以下のようなものが存在する。

2 カスタムモジュール（他の人が作ったもの）
他の開発者が提供しているモジュールで以下にまとめられています。https://www.drupal.org/project/project_module
ここから必要となるモジュールをダウンロードしてDrupalに取り込むことによって使用することができます。私の場合、stableであるか・使っているユーザー数がどれくらいいるか・モジュールの更新が頻繁にあるかを確認して使っています。

3 カスタムモジュール(自分で作成したもの)
Drupal配下のsites/all/moduelesに作成するモジュールのディレクトを作成し必要なファイルを作成していく。

# どのモジュールを使うか？
普通アプリ開発では要件を決め外部設計をしたあとに内部設計・実装をする必要があるが、Drupalではこの間にモジュール調査というフェーズを挟む
つまり作成すべき機能が

１Drupalの標準機能で作成することができるか？
２Drupalで公開されているモジュールを使って作成することができるか？
３自分でモジュールを作る必要があるのか？

を確認する。

1・2で機能の要件を満たすことができるのであれば、開発をする必要がなくなりまたセキュリティのアップデートも開発者が行ってくれるのでそれを取り込むだけで済みます。

# モジュール調査はどのくらい大変？
やる作業としては以下を行います。
１コアモジュールでできるかを確かめる
２できなければモジュールサイトでモジュールを探し説明を読み実際に入れ設定を加えて要件を満たしているかを確認するできなければ違うモジュールを探すこれを繰り返します。

慣れてくるとコアでできそうとかあのモジュールでできそうという推測ができてくるので大変ではないですが、慣れるまでは時間がかかりますと言う意味でとても初期の勉強時間が結構かかりました。

以下サイトが個々のmoduleの使い勝手を確かめるのにとても便利です。
https://simplytest.me/

ただ公開されているモジュール自体は40000弱 （2017年12月現在）存在するため開発をほとんどすることなく一般的な機能は構築できると思います。
# 参考記事
Drupalのモジュールを使うときはよく以下のサイトを参考にさせてもらっています。
https://drupal.studio-umi.jp/blog
http://drupal-navi.jp/
https://annai.co.jp/article
チームのモチベーション維持のためにやるといいかなと思うこと

# はじめに

チームで開発をする上で、チームメイトの開発に対するモチベーションは開発効率に直結することが多いです。

自分は大学でサークルやプロジェクトを引っ張って行く機会が何回かあり、チームメイトのモチベーションの問題でうまく活動やプロジェクトが進まないといったことがあったので、うまくチームメイトのモチベーションを引き出す方法について簡単ながら書いていきたいと思います。

# チームメイトどうしのコミュニケーションの促進

普段チームでミーティングや仕事のやりとりをしていても、事務的なやりとりばかりではチームメイト同士の繋がりは気薄なものになりがちです。

チームメイト同士の仲を深めることは、チームに居場所を作り出し、個人のモチベーションアップに繋がります。

飲み会や食事会を使ってこういった場を作ることでよりチームの仲は深まります。

また、飲み会や食事会を使わなくてもミーティングなどでチームメイト同士でラフな会話ができる時間を設けるなどで補うこともできます。

ただ、１つ注意すべきこととして、チームメイトへの強制や、特定の人が楽しめる場にしないことです。

チームメイトみんなが楽しむことのできる場にするにはどうするといいかを考えることが重要です。

# チームでなぜその目標を達成したいのかを共有する

チームで何かを作ったり目標に向かって物事を進めていく上で、なぜそれを作るのか、その目標を達成しなければならないのかを考えることは、目標に説得力を持たせます。

また、チームメイトになぜの部分をしっかり共有しておくことで、チームメイトの目標に対する共感を得ることができ、モチベーションアップに繋がります。

伝える時に、

- 感情的な理由づけがある
- シンプルな言葉で伝える
- 人によって伝え方を変える

といったことに気をつけることで共感してもらいやすくなります。

# 終わりに

自分でもちゃんと整理してかけているのか疑問なところはありますが、少しでもチーム全体のモチベーションを上げるための参考になればと思います。
UE4でVR空間にカノジョを錬金 21日目

[UE4でVR空間にカノジョを錬金する Advent Calendar 2017](https://qiita.com/advent-calendar/2017/ue4vrgame-create) 21日目の記事です。

12/1～25日までに一人で、UE4を用いてサ○○レッスンとかVR○○ジョっぽいゲームを作って仮想彼女を生み出すことにチャレンジします。

本日は吸う処理の回転値を求める計算式を書きます。

#回転値を求める計算式

まずフルートさんの記事[スクリプトで呼吸させる - 第2回 | Unity3D](http://mebiustos.hatenablog.com/entry/2015/08/31/201902)に書いてある記事を引用します。

>人間の吸気時の吸気量曲線はsinカーブに似ているらしいので、吸う時のイージングはEaseOutSine曲線を、吐く時はEaseInOutQuad曲線を採用。

なるほど、sinカーブに似ていることなのでsinノードを使って計算していきましょう。

元のスクリプトを見ながら四苦八苦した結果、最終的に以下の計算式に落ちついたため、これをメソッドとして切り離しました。

`[各ボーンの吸入最大回転値] * EffectRate * Sin((GetAudioTimeSecounds - StartTime)/(inhale*durationRate))`

BruePrintで記述すると以下の通りです。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/104377/8051cc9d-c2df-d64d-7d10-d39f63103eef.png)

胸、首、頭も同様の処理を挟みます。
これで吸入時のアニメーションが出来たと思います。

#次回
次は吐く時の処理を記述していきます。
neovim + neoterm

Vimでコードのテストをしながら書きたい。一行ずつ書きたい。間違ってたら一行だけ戻って再実行したい。この目的のためにnvim-Rを使ってきたが、Rだけじゃなくてshell-scriptやpythonをテストしながら書きたいんだ！もちろんVimで！

neovimに搭載されたterminal emulatorに編集中のソースを投げてくれるneotermというプラグインを使えば簡単に実現出来ます。neotermが対応している対話環境が提供されていれば拡張子に応じて自動的に対話環境も立ち上げてくれる。

例
![neovim.gif](https://qiita-image-store.s3.amazonaws.com/0/215021/0de052be-cd76-cd06-905e-14d8a0756fbb.gif)

1. neovimをインストールする。
2. neotermをインストールする。[deinを使った](http://replicity.hateblo.jp/entry/2017/04/21/001736)。
3. nvimの設定ファイルに以下を記載(~/.config/nvim/init.vim等)

```init.vimに記載
let g:neoterm_autoscroll=1 #REPLを自動的に改行
tnoremap <silent> <ESC> <C-\><C-n><C-w> #ESCでターミナルモードを抜けるため
nnoremap <silent> <C-R> V:TREPLSendLine<cr> #ノーマルモードで現在のカーソル行を実行
vnoremap <silent> <C-R> V:TREPLSendSelection<cr>'>j$ #ヴィジュアルモードで選択範囲を実行
```

あとは拡張子付きのファイルを開いてコードを書いて、ctrl-rで適当な対話環境が立ちあがり実行されます(.r, .sh, .py etc)。キーバインドは上記の通り、
・ノーマルモードでctrl-rで現在の行を実行
・visual modeで範囲選択したうえで```ctrl-r```で選択範囲を実行
・（デフォルト）ノーマルモードで```ctrl-w + hjkl```でペイン間の移動
としています。サーバへの導入も簡単でssh越しでも問題なく使えるので大変便利です。

#### 2018年2月末追記

ctrl-rはRedoだったため一行スクロールのctrl-eを潰すことにしました。executeと覚えよう。また、実行後に次の行に遷移できるように少し変更。縦分割に。

```
let g:neoterm_autoscroll=1
let g:neoterm_position='vertical'
tnoremap <silent> <ESC> <C-\><C-n><C-w>
nnoremap <silent> <C-e> :TREPLSendLine<CR>j0
vnoremap <silent> <C-e> V:TREPLSendSelection<CR>'>j0
```
Docker For Mac を使って STF を動かす方法

実機の Android を Mac から操作したいと思っていろいろ調べた所、オープンソースかつ活発に開発されている[STF](https://github.com/openstf/stf) (Smartphone Test Farm) というツールを知りました。

この記事では、その STF を Docker で簡単に立ち上げる方法を紹介しています。

## 前提条件

- [Docker For Mac](https://www.docker.com/docker-mac) が入っている
- Mac 上で ADB server がポート 5037 を LISTEN して立っている

## STF の走らせ方

```yaml:docker-compose.yml
version: '2'

services:
  db:
    image: rethinkdb
    command: rethinkdb --bind all
  stf:
    image: openstf/stf
    ports:
      - 7100:7100
      - 7110:7110
      - 7400:7400
    links:
      - db
    environment:
      - RETHINKDB_PORT_28015_TCP=tcp://db:28015
      - RETHINKDB_ENV_DATABASE=test
    command: stf local --allow-remote --public-ip 127.0.0.1 --adb-host docker.for.mac.localhost
```

上記を docker-compose.yml に書いて、それがあるディレクトリで `docker-compose up -d` をコンソールから叩き、http://127.0.0.1:7100 にアクセスしてください。ログイン画面ぽいのが出ますがが、テキトーなユーザ名とメールアドレスを入れれば良いです。後は Mac に Android を繋げば OK です。

## その他

中身をちょっといじれば STF と ADB を別のホストに分けて走らせることもできます。
Python(3.6)にてアクセストークンを生成する

# 概要（やりたいこと含む）
ふと、Webサーバの認証でよく利用されるアクセストークンをpythonで生成するにはどうしたらいいんやろうと思って調べてみました。

アクセストークンについては、ご存知の方が多いかもしれませんが、
わかりやすく説明されていると感じたものを紹介しておきます。

- [アクセストークンとは？－Webサービスにおけるユーザー認証－](https://n.career-info.jp/contents/?id=10161)
- [認証を含む API 開発で検討すべきこと](http://www.bokukoko.info/entry/2015/12/20/%E8%AA%8D%E8%A8%BC%E3%82%92%E5%90%AB%E3%82%80_API_%E9%96%8B%E7%99%BA%E3%81%A7%E6%A4%9C%E8%A8%8E%E3%81%99%E3%81%B9%E3%81%8D%E3%81%93%E3%81%A8)

# 生成方法
調べたところ、どうやらpython3.6より前は特にそういうモジュールはなさそう
（調査不足かもしれませんので、ご存知の方がいらっしゃればぜひコメントお願いします）
Python 3.6にて[`secrets`](https://docs.python.org/ja/3/library/secrets.html)というモジュールが標準で利用できるようになったらしいです。

16進数のランダムな文字列(≒アクセストークン）を生成するには`secrets.token_hex`を利用すればよいとのこと。
引数にバイト数を指定できるが、2017年12月17日時点では、32 バイト (256 ビット)が生成される模様
（ドキュメントによればこのデフォルト値は変更する可能性があるとのことです）

```py3
import secrets

token = secrets.token_hex()
print(token) # 7fca54bac0f3d2bbd6e4b493dec45366ea2fb7f884e8ac97f13c40fd00cc4e5f などが出力される（デフォルト256bit)
```

文字列（トークン）同士の比較は、`secrets.compare_digest`を利用すればよいとのこと。
なお、このメソッドではタイミング攻撃と呼ばれるリスクを減らす方法で比較を行うみたいなので、普通に`==`よりもこちらを利用するのがよさげです。

```
import copy
import secrets

token1 = secrets.token_hex()
token2 = copy.deepcopy(token1)
token3 = secrets.token_hex()

print(secrets.compare_digest(token1, token2)) #True
print(secrets.compare_digest(token2, token3)) #False
```


パスワードリセットなどで一時的なURLを生成する場合は、`secrets.token_urlsafe`を利用すればよいとのこと

```py3
import secrets

url = 'https://mydomain.com/reset=' + secrets.token_urlsafe()
print(url) # https://mydomain.com/reset=Gc5CzVbf6f-zu9Mr5fpRtTBeQQCK00blasM7EWtrSis などが出力される
```

# 所感
アクセストークンについてもなんとなくは理解してましたが、ちゃんと調べてなかったので、いい勉強になりました。あと、タイミング攻撃という言葉も恥ずかしながら初めて知った...。
ふと気になったことを調べて、知らない知識が増えてなんか得した感じがしました（笑）


# 参考
- [Python Document](https://docs.python.org/ja/3/library/secrets.html)
- [アクセストークンとは？－Webサービスにおけるユーザー認証－](https://n.career-info.jp/contents/?id=10161)
- [認証を含む API 開発で検討すべきこと](http://www.bokukoko.info/entry/2015/12/20/%E8%AA%8D%E8%A8%BC%E3%82%92%E5%90%AB%E3%82%80_API_%E9%96%8B%E7%99%BA%E3%81%A7%E6%A4%9C%E8%A8%8E%E3%81%99%E3%81%B9%E3%81%8D%E3%81%93%E3%81%A8)
- [timing attack (タイミング攻撃、タイミングアタック) とは](http://source.hatenadiary.jp/entry/2014/03/11/110021)
React 開発環境に ESLint + Prettier を導入して、静的検証+コード整形を実現する

# この記事は？
react で開発するときにエラーが起きないようにチェックしたり(ESLint)、ソースコードを自動で綺麗に整形したり(Prettier)することを実現します。

# ESLint 導入
以下を実行。

```sh
$ yarn add -D eslint-config-airbnb eslint-plugin-import eslint-plugin-react eslint-plugin-jsx-a11y
```

その後設定ファイルを記述します。

```js:.eslintrc.js
module.exports = {
    "extends": "airbnb",
    "plugins": [
        "react",
        "jsx-a11y",
        "import"
    ],
};
```

# Prettier 導入
prettier と eslint の競合を防ぐため、prettier-eslint を使用します。

以下を実行。

```sh
$ yarn add -D eslint prettier-eslint prettier-eslint-cli
```

# 実行準備
簡単に実行できるよう、package.json に記述します。

```json
{
  ...省略
  "scripts": {
    ...省略
    "lint": "prettier-eslint --write src/*"
  },
  ...省略
```

# 実行
以下で実行できます。
prettier で整形した後、`eslint --fix` を実行してくれます。

```sh
$ yarn lint
```


# おまけ
これでいけると思っているのだが、以下を実行したらエラーになった。

```sh
$ ./node_modules/eslint/bin/eslint.js src/index.js

Error: Cannot find module 'eslint-config-airbnb'
...
```

素直に `npm install --save eslint-config-airbnb` したら解決した。`yarn` で追加できていなかった・・・？
LaravelをVimで開発してて、マジックメソッドの定義元にタグジャンプしたい時

恥ずかしながら、 `ctags` の設定ちゃんとしてませんでした。情弱でした。

下記の設定を `~/.ctags` に書いておきます。

```bash:~/.ctags
--regex-php=/get([a-z|A-Z|0-9]+)Attribute/\1/
--regex-php=/scope([a-z|A-Z|0-9]+)/\1/
```

これで `ctags` を打てば、Vimの `C-]` でLaravelのマジックメソッドである `getHogeAttribute` と `scopeOfHoge` に飛べるようになります。

かなり快適になりそう。
UE4でVR空間にカノジョを錬金 20日目

[UE4でVR空間にカノジョを錬金する Advent Calendar 2017](https://qiita.com/advent-calendar/2017/ue4vrgame-create) 20日目の記事です。

12/1～25日までに一人で、UE4を用いてサ○○レッスンとかVR○○ジョっぽいゲームを作って仮想彼女を生み出すことにチャレンジします。

昨日に引き続き、呼吸のロジック実装です。

#吸うロジック

早速吸うように見せるアニメーションの関数説明に入ります。

![image.png](https://qiita-image-store.s3.amazonaws.com/0/104377/1a464c0e-6da9-f992-36b1-d82306ba11f6.png)

今回は上にあるSet Inhaleメソッドについての説明です。

##Set Inhaleメソッド

全体は以下の通りです。

![image.png](https://qiita-image-store.s3.amazonaws.com/0/104377/a39cb1c1-a507-5472-45d3-d1e9ea81712b.png)

簡単に説明すると、このメソッドでは各ボーンの吸うアニメーションに必要な回転値をセットしています。

一番下が吸うアニメーションの時間を判定しています。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/104377/a8316fca-59ac-ff2c-b792-0c4227fa8059.png)

呼吸の時間は以下のように計算しています。
`inhale * durationRate + 0.5`
0.5は今回実装した時に自然に呼吸させるように見せるために必要な調整時間です。
これを吸うモーション開始してからの経過時間を計り、もし過ぎたら待機状態にフェーズを移行するようにセットします。

続いて各ボーンの回転値をセットします。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/104377/f3e1a2a2-62a0-99b7-d334-d75f80ec7357.png)

ボーンを回転させるのは縦方向なので、ボーンの向きを見て正しく動くように値をセットします。
今回、ユニティちゃん、グレイちゃん共にX（Roll）が縦方向に回転するので、Xにセットしています。

回転値はGetInhaleTimeという関数を作成して取得しています。

※関数名が色々オカシイのは許してください。元は時間を取るためのメソッドでしたが色々試した結果、最終的に回転値を取るメソッドになってしまいました。
※よい子の皆さんはちゃんと適切な関数名にしましょう。

本日はここまでです。

#次回
明日は回転値の計算式を書きます。
simplecovでRspecのテストを書くが楽しくなった話

##はじめに
これは、Railsを学び始めてRspecを書くようになったけどなんだかピンとこなかったのがsimplecovを使い出したら俄然楽しくなった、という話です。

ちなみに筆者は、１年ほど前に初めてRailsに触れて最近スタートアップで働き始めた駆け出しエンジニアです。

##この記事の対象
・いまRailsを学んでいる最中の方
・一応Rspecを書いたことはある方
・Rspecをきちんとかけるようになったらいいなと思っているけど、いまいちよくわからないなと感じている方


##Rspecってよくわからなくない？
僕がRspecを学び始めたから、結構長い間よくわからないなーと感じていました。
なんかもやもやするというか、Railsの難しさとは違う難しさがあるなぁ。でもどこが難しいのかもよくわかんないな、という感覚を持っていました。

今思うと、よくわからなかったのはこんな部分だと思います。
・テストが通っても、それがちゃんとテストしたことになっているのかがわからない。
・どの程度細かいところまでカバーするように書いたらオッケーなのか基準が全くわからない。
・今コード全体に対してどれくらいテストが完了したのか掴みづらい。

学習中も、テストが大事という記事はよく見ていたので、業務でコーディングするならテストは必須なんだろうなとは思っていました。

なので、Rspecの神 伊藤淳一さんが翻訳された「Everyday Rails - RSpecによるRailsテスト入門」などを参照し、とりあえずテストは書けるようになってきました。

でも、何かがわかってない感は依然として拭えずにいたのです。

何かテストをサポートしてくれるツールはないか探しているときにsimplecovというgemを見つけました。

simplecovはRspecで書いたテストのカバレッジを計測してくれるツールです。カバレッジとは、コード全体に対して、どの程度の範囲をテストがカバーできているかを算出したものです。

最初にsimplecovを使うとどんなことができるかご覧ください。

まずexampleを１つだけ書いてテストを実行します。

![171217-0005.png](https://qiita-image-store.s3.amazonaws.com/0/102230/2a626f10-9a9d-2d6f-8277-56d2633cea34.png)

その状態で、カバレッジを確認するとこんな表示になります。

![171217-0001.png](https://qiita-image-store.s3.amazonaws.com/0/102230/f5c8b732-1bad-9cb1-9651-f077df13bfe8.png)

このコントローラはアクションが少ないので、これだけでカバレッジが68％になりました。

また、検証ができた箇所は緑に、まだのところは赤くなります。

そのため、成功するパターンはテスト済みだけど、失敗するパターンは検証できていない、
などどこまで終わったかが視覚的にわかります。

そして、その赤い部分を消すようにテストを書いていくと、、

![171217-0004.png](https://qiita-image-store.s3.amazonaws.com/0/102230/623cdb30-f0ae-0bb0-b3a4-7891bc5a3479.png)

やった！カバレッジ１００％！

ちょっとしたゲームみたいな感覚になってテストコードを書くのが楽しくなりました。

ここで気づいたのは、なんで今までテストを書くことにモチベーションが持ちにくかったのか、ということです。

例えば、フロントとかはコードを書くと見た目に変化があって、これだけ進んだな、という実感が持てます。
それに対して、テストは結果は見えるけどなんか開発が進んでいるという感覚をリアルに持つことが難しいからだったのかな、と思います。

テストって大事なのはわかっているけど、なんか地味というかちょっと辛い作業というイメージがあったので、モチベーションが上がったのは僕にとって大きな収穫でした。

インストールもとても簡単です。

##simplecovのインストール


```ruby:gemfile

gem 'simplecov'

```

```
> bundle install
```

```ruby:spec_helper.rb
（追加）
require 'simplecov'

SimpleCov.start 'rails'

```

上記の設定をしてから、Rspecのテストを実行するとアプリのルートディレクトリにcoverageというフォルダができます。
その中のindex.htmlを開くと、上で紹介したカバレッジを見ることができます。

##最後に

仕事でコーディングしていれば当然カバレッジは計測すると思いますが、個人でRailsを学んでいる方は使ったことがないかたもいるのではないでしょうか？

当然テストの精度はカバレッジだけで測ることはできませんが、個人的にはテストに対する印象を大きく変えてくれたgemだったのでご紹介をさせていただきました。

興味を持たれた方はぜひ一度お試しください。

では、楽しいRspecライフを！
[メモ]古いRaspberry Pi(Wheezy)でdns_sh関連のコンパイルエラーを修復する

古いRaspberry Pi(2)上で

`npm install -g --unsafe-perm homebridge`

を実行中、

```
  CXX(target) Release/obj.target/dns_sd_bindings/src/dns_sd.o
In file included from ../src/dns_sd.cpp:1:0:
../src/mdns.hpp:32:20: fatal error: dns_sd.h: そのようなファイルやディレクトリはありません
 #include <dns_sd.h>
                    ^
compilation terminated.
dns_sd_bindings.target.mk:150: recipe for target 'Release/obj.target/dns_sd_bindings/src/dns_sd.o' failed
```

というエラーが出て止まった。どうもg++のバージョンが古いのが原因のようなので、

[メモ：Raspbianをwheezyからjessieにアップデート - Qiita](https://qiita.com/spicemanjp/items/91e4239934bc94ba463a)

を見ながら設定ファイルのwheezyをjessieに書き換えてから

```
sudo apt-get update
sudo apt-get upgrade
sudo apt-get reboot
```

とし、再び

```
sudo apt-get update
sudo apt-get install gcc
sudo apt-get install g++
sudo apt-get install libavahi-compat-libdnssd-dev
```

とやったらうまくコンパイルが通るようになった。
ゲームパッドをMIDIコントローラーとして使おうとした

この記事は [CPS Lab Advent Calendar 2017](https://qiita.com/advent-calendar/2017/cps) の17日目です．
16日目は [2年ゲーム制作に関わってのまとめ](http://fjsmu.hatenablog.com/entry/2017/12/16/003821) です．

# 概要

ゲームパッドでMIDI入力をしたいと思ったので実践した．

## 使用したもの

### ・ゲームパッド

#### Xbox360コントローラー

筆者愛用．そこそこ安価で使いやすい．

### ・入力制御

#### JoyToKey Ver5.9

言わずと知れた入力割り当てソフト．シェアウェア．
設定方法は以下のサイトを参照した．

[JoyToKey 設定と使い方](http://www.game-rev.com/review/gameut/joytokey.html)

### ・DAW

#### FL Studio 12

MIDI入力に対応していてピアノロールが開けば良いので何でも良い．

# 手順

## 1. DAW側上でのキー対応を確認する

![piano.png](https://qiita-image-store.s3.amazonaws.com/0/218217/121c4688-5bdd-f923-ae51-f78a7bb2e8e8.png)


確認したところFL Studioでは以上のようになっていた．
表示されている文字とキーボードが対応している．
(黒鍵含む一部省略．)

## 2. JoyToKey側に入力を割り当てる．

今回は4つのボタン(X,Y,B,A)に割り当てていく．

![wariate.png](https://qiita-image-store.s3.amazonaws.com/0/218217/63e48278-c1dc-9543-6ae9-395971365886.png)

割り当ては
#### X → N Q E
#### Y → C B M W
#### B → V N , /
#### A → B M . R

このように割り当てることで
**Xボタンを押すとFM7(Fメジャーセブンス)**
**Yボタンを押すとG7(Gセブンス)**
**Bボタンを押すとEm7(Eマイナーセブンス)**
**Aボタンを押すとAm(Aマイナー)**
を鳴らすことが出来る．

「メジャー？マイナー？セブンス？」という方は，以下を参考に．

[五章 コード入門 - DTMハイパー初心者講座](http://dtm-hyper.com/dtm5/)

[七章 コード入門後半 - DTMハイパー初心者講座](http://dtm-hyper.com/dtm7/)

ここでは「同時にキーを押した時のセットに名前が付いていて，それがメジャーやマイナーやセブンス」と捉えていただければOK．
要するに**同時押しの割り当て**を行っている．

# 結果

![FL-Studio-12-2017_12_17-22_50_02-_online-video-cutter.com__2_.gif](https://qiita-image-store.s3.amazonaws.com/0/218217/547b25df-08a7-4beb-627b-7a441e0aa3c6.gif)

実際にゲームパッドを用いてリアルタイムMIDI入力が出来た．

# まとめ

### ゲームパッドはMIDIコントローラーとして使える．

しかし，普段使いレベルの実用性を考えるとまだまだハードルがいくつかある．

- 改善すべき点
    - どのゲームパッドでも対応出来るようにする
    - ピッチベンドを扱えるようにする
    - JoyToKey無しで扱えるようにする

現状では，
「パフォーマンスプレイの一種としてゲームパッドを使うのはアリかも？」
といったところである．

## 今後の展望

- 先述の改善すべき点3項目を実装．
- WebMIDIと組み合わせる

## 所感

~~たぶん需要が無い~~
誰もやろうとしない(と思う)ので唯一性はある…はず．
開拓の期待値としては後者の「WebMIDIと組み合わせる」方が高め．

万一，進捗が出たら続きを書きます．


18日目の記事は
[お手軽に出来合いのものを組み合わせて赤外線リモコン操作する(Google Homeもあるよ！)](http://haru2036.hatenablog.com/entry/ir-remocon-with-googlehome) です．
Goの初心者が最初にはまりそうというか気になりそうなポイント

こんばんわ、ameshoです。

この記事は、[Go4 Advent Calendar 2017](https://qiita.com/advent-calendar/2017/go4)の18日目です。

私は2017/3/17日から毎週水曜日に[プログラミング言語Goの読書会](https://lancers-engineer.connpass.com/)をLancersを会場にして開いています。冒頭から全員で範囲を決めて読み進めていく方式です。途中業務が忙しくて若干出来ない時期がありましたが幸いに再開でき、現在、9章まで来ています。

参加しているのは、ほとんどGo触ったことが無い人も割といまして、私自身も真面目に使うのは今年は行ってからぐらいなので、勉強会で出た内容と、みんなこんなところを気にしたり、はまったりするんだなと言うのをまとめてみました。

## Unicodeで文字とされている物がすべて名前として有効

プログラム始めたばかりだと気づかない人多いんですが、最近の言語はUnicodeで文字とされているものが名前として有効だったりします。Goもそれに漏れず対応していまして、

```go
package main

import "fmt"

func main() {
    変数だよ := "hello"
    fmt.Println(変数だよ)
}
```

このような書き方が出来ます。

追記：

https://twitter.com/mattn_jp/status/942531041503322112

mattnさんにtwitter上でこのようなコメントをいただきましたので。追記致します。`実際は全角数字から始まる識別名などは使えません。` @mattnさんありがとうございました。

## 省略変数宣言

変数宣言が以下のように通常のものと省略変数宣言もありまして、

```go

// 通常
var name type = expression

// 省略
name := expression
```

これ、どっち使えばいいんですかね？という質問が出たりしました。個人的には、事前にまとめて宣言すると不要なメモリ領域を確保して使わないケースがあるので省略宣言の方がいいのかなと思っていたりします。

## 変数の生存期間

関数内部で割り当てられたローカル変数を返すことが出来ます。最近のLL使ってる人だとあまりピント来ないかもしれませんが、Cは明示的にヒープかスタックに乗せるか書いてる人が選択出来るので、Cを使ってる方からこういう話が出ました。GCの上で動いているので、変数が到達不能(unreachable)になるまで生存し続けます。


## パッケージ変数の初期化は依存関係が解決されてからされる

これも普段スクリプト系を書いている人からすると、便利だなと言う機能で宣言されているパッケージ変数の初期化を考えなくていいという話です。この辺の依存関係を自動で解決してから初期化が始まるので保守とかすごく楽になります。


## Goの型の宣言がこの順番の理由

CとかJavaとかを使って人からすると、Goの型宣言がなんでこの順番になっているか疑問に思う人が多いです。私もそうでした。これは、パースに関連していたようで、こちら「[Go's Declaration Syntax](https://blog.golang.org/gos-declaration-syntax)」に書かれていました。


## 構造体の宣言はフィールドをまとめて宣言したり、位置を買えたりしただけで違う型として認識される

スクリプト言語を使っていると、Hashとかでデータを使い回したりするんですが、この場合順序を意識したりする必要性はないですが、Goの場合は構造体の宣言の仕方を変えただけで違う型として認識されます。

## 関数のスタックが可変長

これは、再帰呼び出しの時に関係ある内容で、固定長の場合割と少なめのサイズが設定されていて、再帰呼び出しが深くなるとstackoverflowを起こします。Goの場合は関数のスタックが可変長なので再帰呼び出しの深さをあまり気にせずに再帰を書くことが出来ます。

## まとめ

こんな感じで、[プログラミング言語Go](https://www.amazon.co.jp/dp/4621300253/?&_encoding=UTF8&tag=amesho-22&linkCode=ur2&linkId=7e29043d833086d36f8b64c2ed3721b2&camp=247&creative=1211)を読むと意外な落とし穴とか、そんなのあったんだというものに気づかされたりするので読んでみてはいかがでしょうか。
Google Homeで感謝のタコスを送る

タコスって美味しいですよね。
この記事はGoogle Homeを使って近所のメキシコ料理店にタコスの注文ができる・・・
というものでは全くありませんのでご注意ください。

実はこのタコス、最近ではチームビルディングにも一役買っているんです。
Slackというコミニュケーションツールはかなり有名ですが、利用者の中でタコスを送り合う習慣があるみたいです。
[HeyTaco! - Bring your team together](https://www.heytaco.chat/)

チャット上で、タコスと一緒に感謝のメッセージを送るんですね。
側から見るとナンノコッチャと思いますが、実際に利用してみるとそのありがたみがわかる気がしました。
仕事場で、些細なことでもお互いに感謝の言葉を交わす機会が増えるんです。恥ずかしさはタコスが包み隠してくれるんです。

でも、どうせなら感謝の気持ちはキーボードでなく言葉に出して伝えたいですよね。
そこで今回はGoogle Homeからタコスを送ってみましょう。

## 各種連携

DialogflowとGoogle Homeの連携に関しては以下の記事がわかりやすいです。
[Dialogflow入門 - Qiita](https://qiita.com/kenz_firespeed/items/0979ceb05e4e3299f313)


DialogflowとSlackの連携はWebhookという技術を使うと簡単にできます。
[Webhookとは？ - Qiita](https://qiita.com/soarflat/items/ed970f6dc59b2ab76169)

今回は両者の間にPythonで作ったプログラムを挟みます。全体として、

Google Home: 発話受信
Dialogflow: 発話分解
Python: 発話解析
Slack: 発話送信

以上のような役割分担になります。それでは早速、
「太郎さん今日は助かりました」というメッセージをGoogle HomeからSlackまで届けていきましょう。

##発話分解

全体像がこちら。

![image.png](https://qiita-image-store.s3.amazonaws.com/0/163466/93b20820-7b97-0f00-47fd-19c96b7774f1.png)

「感謝を伝える人　＋　感謝のメッセージ」というEntityの組み合わせでIntentを構成しています。

人名は@sys.given-nameというSystem Entity（Dialogflowで予め用意されているEntity）を用いることで簡単に実装できます。こちらの記事にも上手な使い方が載っています。

[【プログラミング不要】Siriのように会話ができるAI（人工知能）の作り方 | AI入門ブログ（人工知能の作り方など人工知能に関する情報を公開）](http://ai-kenkyujo.com/2017/03/13/api_ai/)

##発話解析

分析した発話をSlackに送る前に微調整が必要になります。

今回はFlaskを使ってPythonでその処理をします。

``` python3:app.py
@app.route("/", methods=['POST'])

def webhook_taco():
    req = request.get_json(silent=True, force=True)
    resp = jsonify(taco_post(req))
    return resp

def taco_post(request_data):
    name = request_data['result']['parameters']['name']
    word = request_data['result']['resolvedQuery']
    names = {'太郎': 'Taro'}
    mension = names[name]
    requests.post(<webhook URL>, data = json.dumps({
        'text': u'@' + mension + ':taco:' + word ,
        'username': u'me',
        'icon_emoji': u':snake:',
        'link_names': 1,
    }))
    return {
        "speech": name + 'さんに感謝のメッセージとタコスを送りますね',
    }
```

解析と言ってもやるのは

```python3
names = {'太郎': 'Taro'}
mension = names[name]
```

これだけです。
Dialogflowからもらった人名を、Slackで送れるようにメンション名に変える処理ですね。

その後の`'text': u'@' + mension + ':taco:' + word `が実際に送信されるメッセージの内容です。

##発話送信

あとは解析した発話をWebhookでSlackまで届けるだけです。
[Incoming Webhooks | Slack](https://api.slack.com/incoming-webhooks)



![image.png](https://qiita-image-store.s3.amazonaws.com/0/163466/be44aa43-660c-4879-5d87-d20695622dd5.png)


メッセージを送りたいSlackのチャンネルを選択するだけです。


![image.png](https://qiita-image-store.s3.amazonaws.com/0/163466/e16716e5-7b70-5e83-ccda-6715fd9d3c0b.png)

こんな感じでタコスが送られてきます。
ただ、今回の例ではタコスの送信者を指定できないので、実際にチームで使う際には注意が必要です。


##おわりに
Google Homeは６人まで声を登録できるので、送信者を声から認識できるようになれば家族でも利用できそうですね。家族の絆を深め、最後はみんなでタコスを食べにいってみてはいかがでしょうか。
UIViewControllerのサブクラスでの初期化定義

UIViewControllerをプログラムで作成する場合の初期化(init)の定義方法のまとめです。

## 新規作成のViewControllerにinitがない
例えば新規「Single View App」を作るとViewController.swiftが作られます。
このファイルにはinitのコードはありません。viewDidLoadなど一部のコードがあるだけです。
「initは定義する必要なし？」かなと思いましたが、親クラスのinitを実行しているようです。

このViewControllerはデフォルトでMain.storyboardに関連づけられているのでこれで問題ありません。

## 自作のUIViewControllerをプログラムで生成する場合

UIViewControllerのinitを利用する場合は、以下のようになると思います。

```swift
let vc = CustomViewController(nibName: nil, bundle: nil)
```

nil渡すのめんどくさいので、引数なしのinitを定義しますが、初期化方法を理解していないと意外とはまります。

例えば以下のコードを追加するとエラーです。

```swift
/// エラーです！
init() {
   // 処理省略
}
```

サブクラスでinitを定義するときには、必ずrequiredメソッドを実装する必要があります。

```swift
required init?(coder aDecoder: NSCoder) {
    fatalError("init(coder:) has not been implemented")
}
```

よく見る奴ですね。ただし、requiredを使わないパターンもあります。それが"convenience init"です。

```swift
convenience init() {
   self.init(nibName: nil, bundle: nil)        
}
```

"convenience init"は初期化っぽく見えますが、初期化処理をラッピングして利用する方法のようです。initとは違います。そのためletなどの初期化はconvenienceの中ではエラーになります。

## まとめ

独自のinitを定義する場合はサブクラスでもrequiredも必要になる。convenienceはinitとは違うのでプロパティの初期化はできないようです。
機械学習を使えるようになりそうな本たち

[ヴァル研究所 Advent Calendar 2017](https://qiita.com/advent-calendar/2017/val) の17日目は機械学習に関する記事です。

---

機械学習の技術って色々できそうでワクワクしますね。
しかし、いざ使ってみようと調べてみると、知識や課題設定に色々な前提があることに気付きます。

この記事では、機械学習の活用を始める際に私が読んでいる本について簡単に紹介します。
きちんと通読していないので、内容は一部不正確かもしれません。

この記事の想定読者（調査開始時点の私）の認識や状況はこんな感じです。

- 機械学習は何かの推測結果を出してくれるもの。機械学習には学習させるためのデータがある程度必要。
- 推測したい事柄（データ）は明確に決まっている。推測に使う予定のデータや推測対象は画像ではない。
- Rubyは書いたことあるけどPythonはほぼ初めて。スクリプトを書くことに抵抗は無い。
- 統計学の知識はほぼ無し。

Machine Learning 実践の極意
===

https://www.amazon.co.jp/dp/4295002658

良いところ
---

学習や推測の根拠となるデータを準備する工程を前処理と呼びます。前処理で必要なことを説明している本は貴重だと感じています。

機械学習をこれから調査し活用する状況において、実務寄りとビジネス寄り、どちらの人にも有益な範囲で説明されています。機械学習活用の全体感を掴むのに良いです。

Pythonのサンプルコードも記載されていますが、コードを動かさずとも分かるように解説されている印象です。必ずしもパソコンの前で読む必要がないのは嬉しいです。

各章の章末にあるまとめが秀逸です。先に章末のまとめを見て気になる内容があれば本文に目を通す、という使い方もいけそうです。

ケーススタディとして以下の内容が取り上げられており、種類が豊富です。

- タクシーのチップ料金予測
- 映画レビューの感情分析（自然言語を扱う）
- 広告のクリック率予測

惜しいところ
---

実務の入門書ではありません。実務を始めるなら他の情報源も必要です。

高円寺にあるヴァル研究所を会場として読書会が開催されていません。

ゼロから作るDeep Learning
===

https://www.amazon.co.jp/dp/4873117585

良いところ
---

機械学習の用語と基本的な仕組みをPythonスクリプトを読んで動かしながら学べます。

機械学習を活用した画像識別などの既成サービスではなく、機械学習によるモデル構築から始める実務者向けです。

高円寺にあるヴァル研究所を会場にして読書会が開催されています！

惜しいところ
---

MNIST（手書きの数字画像と正解の数字がセットになったデータ集）を用いたNクラス分類（これはどの数字か）のみを扱っています。画像以外のデータや異なる種類の推測を行いたい場合は、別に調査する必要があります。

良いところの裏返しですが、付属のサンプルコードを読み解いて得られる情報がないと途中から説明が乏しく感じます。パソコンの前で読まないとつらい本です。
docker-compose操作系コマンド

長期間開発していないアプリをある日触り始めるとメモやCIに
自分が解決した課題の解決法が反映されていなかったり。。。
今回もその事象にはまったので以下に書いておきたい。

**docker-compose**

```
# container build (setting check
docker-compose build
# container start
docker-compose up
```

**django migration**

```
## Required docker-compose up
# sync model (make migrate script output to /migrations
docker-compose exec web python manage.py makemigration
# sync database
docker-compose exec web python manage.py migrate
```

**その他、想定外事象対応**
誤って手動でテーブル削除してmigrateエラーが出た場合
→/migrations以下のファイルを実際のテーブルと同じ状態にしてmigrate実行

修復不可能なぐらい差異ができてしまった
→/migrations以下のファイルを削除（「__init__.py」は除く）、かつ、djangoが利用しているDBの「django_migrations」テーブルをtruncateして、makemigrationを実施する