OmniAICreator/Qiita-1.07M huggingface dataset:
gcloudとgoapp環境構築手順

# gcloud x goapp環境構築手順

[WIP] いろいろ追記する(｀・ω・´)

## gcloudをインストール

* [google-cloud-sdk-220.0.0-darwin-x86_64.tar.gz](https://cloud.google.com/sdk/docs/) をダウンロードして `$HOME` 直下に解凍する

```bash
$ cat $HOME/google-cloud-sdk/VERSION
220.0.0
$ $HOME/google-cloud-sdk/install.sh
$ source ~/.bash_profile
$ gcloud version
Google Cloud SDK 220.0.0
bq 2.0.34
cloud-datastore-emulator 2.0.2
core 2018.10.08
gsutil 4.34
```

## goappをインストール

```bash
$ gcloud components install app-engine-go
$ chmod +x $HOME/google-cloud-sdk/platform/google_appengine/goapp
$ echo 'export PATH=$HOME/google-cloud-sdk/platform/google_appengine:$PATH' >> ~/.bash_profile
$ source ~/.bash_profile
$ goapp version
go version 1.9.4 (appengine-1.9.75) darwin/amd64
```


# 参考資料
* [Google Cloud SDK ドキュメント  |  Cloud SDK       |  Google Cloud](https://cloud.google.com/sdk/docs/)
* [実践的なGAE/Goの構成について #golang #gcpja](https://qiita.com/koki_cheese/items/216fe73caf958db34aa2)
H2OをGoogle Colabatory上で使う方法

#H2Oとは
H2Oとは機械学習の為のオープンソースのプラットフォーム。
Auto-mlという機能があり、まともな機械学習の経験が無くても簡単に実装できる模様。
似たようなライブラリにはauto-sklearnやTPOTがある。
(参考:https://towardsdatascience.com/whats-auto-ml-b457d2710f9d)

Githubのページによると、動作する環境としては以下の様になっている。

>"H2O uses familiar interfaces like <B>R, Python, Scala, Java, JSON and the Flow notebook/web interface</B>, and works seamlessly with big data technologies like <B>Hadoop and Spark</B>"


#Google Colabatoryとは

無料でJupyter Notebookの様なものをGoogleが提供するVirtual Machine上で走らせる事ができるサービス。
ハイエンドなGPU(Tesla K80 GPU）が積まれており、機械学習のコミュニティから期待されている。

#環境構築


A.クイックスタート(おすすめ！)

1. githubにipynbを保存したので'Open in Colab'を選べばShift + Enterを押すだけでスタート出来るはず。<br>
https://github.com/Cactice/h2o-experiments/blob/master/h2o_quickStart.ipynb

B.ステップバイステップ(上記のクイックスタートの場合不要です。説明として読んでください。)

1. Google Colabのページを開く
https://colab.research.google.com/

2. 左上からNew Python 3 Notebookを選ぶ

3. Javaをインストール
```!apt-get install openjdk-8-jdk```
<i> *「！」はBashであることを提示するので、忘れない様に</i>
Javaのバージョンが最新だとエラーが出たのでここではJava8をインストールしよう(2018年現在は対応していないようだ)<br>
```!java -version```
でバージョン確認が出来るが、もしここで新しいバージョン(openjdk version "10.0.2")などが表示されるのであれば、
```!update-alternatives --config java```</i>
で古いバージョン（openjdk version "1.8.0_181"）に変える必要がある。
4. H2Oインストール
```!pip install H2O```
5. PythonでImport/Initする（bashでは無いので!は付けない）
```import h2o```
```h2o.init()```

これで成功すれば
`checking whether there is an H2O instance running at ...`
などのメッセージが表示されるはず。

続きは以下のリンクで学んで下さい。
- http://docs.h2o.ai/h2o/latest-stable/h2o-py/docs/index.html
- https://github.com/h2oai/h2o-tutorials

(参考:https://medium.com/@naeemasvat.na/how-to-use-h2o-in-google-colab-b69ba539ab1a)

#おまけ
Google Colabはjupyter notebookとはホットキーが違うらしい。
以下にホットキー一覧があります。
https://qiita.com/Intel0tw5727/items/7cc68734edd568357a9e
ウェブページがアクセスできなくなっていないか監視する

# 背景
ウェブページを運営している人間にとって、ページアクセスできなくなるというのは致命的である。
しかし、サーバーが落ちてしまった、サーバー再起動時に自動復旧できなかった、AWSがメンテでインスタンスを落とした、SSLの証明書期限が切れた等の様々な理由で問題が発生することがあるため、すべての起こりうる問題に対してあらかじめ対処しておくことは難しい。
次善の策として、問題発生したら気づけるようにしておきたい。

# 作戦
1. 監視用マシンにて、curlでウェブサイトの疎通確認を行う
1. 問題があったら、Line NotifyでLineに通知する
1. 一定時間ごとに実行する
1. 監視用マシンが生きていることを監視する

## curlでウェブサイトの疎通確認を行う
curlでhtmlをひっぱってくれば良いだろう。そして、中身が正しいことを確認するために、htmlに含まれるべき文字列をgrepする。

```
curl $URL_TO_MONITOR | grep $EXPECTED_STRING
```

## Line NotifyでLineに通知する
LINEにメッセージが来ればすぐに気付けるだろう。LINEのMessaging APIは面倒なので、LINE Notifyという仕組みを使う。
設定は[こちら](https://qiita.com/iitenkida7/items/576a8226ba6584864d95)。設定が終わったらトークンをコピーしておき、以下のような形で実行する。

```
curl -X POST -H "Authorization: Bearer $LINE_NOTIFY_TOKEN" -F "message=test message" https://notify-api.line.me/api/notify
```

Slackに通知したいなら、[こちら](https://qiita.com/mizuki_takahashi/items/3f77c2e5b6142563ce66)が参考になるだろう。

## 一定時間ごとに実行する
ここまでの内容を踏まえて、以下のようなスクリプトを作成してmonitor.shという名称で保存する。

```shell:monitor.sh
#!/bin/sh
curl $URL_TO_MONITOR | grep $EXPECTED_STRING

if [ $? -eq 0 ]; then
  # curl -X POST -H "Authorization: Bearer $LINE_NOTIFY_TOKEN" -F "message=site is working" https://notify-api.line.me/api/notify
else
  curl -X POST -H "Authorization: Bearer $LINE_NOTIFY_TOKEN" -F "message=site is not working" https://notify-api.line.me/api/notify
fi
```
`chmod +x minitor.sh`にて実行権限を付与する。

`crontab -e`にて、定期実行設定する。13分間隔くらいで監視すればよいだろうか。
PATH_TO_SHELL_SCRIPTには、監視スクリプトのパスを記載する。

```
*/13 * * * * PATH_TO_SHELL_SCRIPT >/dev/null 2>&1
```

## 監視用マシンが生きていることを監視する
監視用マシンが落ちていて監視できていないということは往々にて発生するので、ウェブサーバーから監視サーバーに対するpingもしておくと良いだろう。

# ちゃんと見たい場合
ちゃんと監視したいなら、[chromeのheadlessモード](https://developers.google.com/web/updates/2017/04/headless-chrome?hl=ja)でサイトにアクセスしていろいろやると良い。

```
google-chrome --headless --disable-gpu --dump-dom URL_TO_MONITOR
```

chrome使うならば、1GBくらいのマシンを用意しておいたほうが良いので、Amazon EC2ならt3.microインスタンス以上にしておいたほうがいい。

もっともっとやりたいならSeleniumを使うとか、Puppeteerとかを使うのが良いだろう。
【RailsConsole】ActionDispatchの出力を止める

RailsConsole（ `rails c` ）で、APPコントローラーの実行テスト（ `app.get()` とか）をするとき
コンソール内の出力を止めたい時は、以下を実行する。

```ruby
# SQLなどのログ出力の停止
ActiveRecord::Base.logger = nil

# ActionDispatchなどのログの抑止
Rails.logger.level = Logger::ERROR
```
Sorceryでのマイグレーションファイルが作成されない

#問題
なぜかSorceryのサイトの通り下記のように入力してもマイグレーションファイルが生成されない。
＞＞https://github.com/Sorcery/sorcery/wiki/Simple-Password-Authentication

```ruby
$ rails g sorcery:install
$ rails g sorcery:install external --only-submodules
```

#解決
GemfileのSorceryに関する記述を一時的に1から2に変更し「bundle install」

```ruby
1.gem 'sorcery', '~> 0.12.0'
2.gem 'sorcery', github: 'sorcery/sorcery'
```
2.の状態で先のコマンドを実行するとマイグレーションファイルが生成される。
その後Gemfileを1.の状態に戻す。

#教えてください
根本的な問題がよくわかりません。ご存知の方がいらしたら教えてください。
お願いします。
ReactのContext APIを利用してみる


## 準備

環境構築が大変すぎるのでcreate-react-appを利用します。

```bash
create-react-app context
cd context
```

## 実装

App.jsに実装します。これまでの書き方との互換性上、少し古臭い書き方をしております。すみません。

>アロー関数とか使うとthisがFixされるので、余計なbind処理とかがいらなくて便利です。

\<Provider>で定義した変数や関数が子でも孫でも使えます。

```
<Consumer>
	{
		//
	}
</Consumer>
```

という記述がしっくりきませんが、[ここ](https://qiita.com/kazumicho/items/4f862b618eda09e14ec7)の記事を見ればなんとなく理解できます。

```js:App.js
import React, { createContext } from 'react'

// context apiの利用
const Context = createContext()
// const { Provider, Consumer } = Context //分割関数で書いてるのもおおい

//孫
function GrandChild(){
  return(
    <Context.Consumer>
      {
        ({state}) => (
          <div>{state.count}</div>
        )
      }
    </Context.Consumer>
  );
}

//子
function Counter(){
  return (
    <Context.Consumer>
      {
        ({state, actions}) => (
          <div>
            <span>{state.count}</span>
            <button onClick={actions.increment}>+1</button>
            <button onClick={actions.decrement}>-1</button>
            <GrandChild/>
          </div>
        )
      }
    </Context.Consumer>
  );
}

//App
class App extends React.Component{

constructor(){
  super();
  this.increment = this.increment.bind(this);
  this.decrement = this.decrement.bind(this);
}

  state = {
    count: 0
  }

  increment(){
    this.setState({count: this.state.count + 1});
  }

  decrement(){
    this.setState({count: this.state.count - 1});
  }

  render(){
    return (
      <Context.Provider
        value={{
          state: this.state,
          actions: {
            increment: this.increment,
            decrement: this.decrement
          }
        }}
      >
        <Counter/>
      </Context.Provider>
    );
  }
}

export default App
```

確認

下記で。

```bash
npm start
```

## 参考

* https://rskull.hateblo.jp/entry/2018/03/02/021753
* https://blog.leko.jp/post/why-i-need-redux-with-react-new-context/
AWS Certified Developer - Associate (DVA)を取得しました ＊SAAも取得しました

# はじめに
つい先日、表題のとおりAWS Certified Developer - Associate (DVA)の試験に合格し、
DVAの資格を取得しました。
現時点（2018年10月）でかなり価値の高い資格で受験を考えてる方もいると思うので
ちょっとでも参考になれば良いなってことで。
受験したのは、2018年6月リリースのやつです。以前のバージョンとは内容が異なるかもしれません。

# 中の人のAWSスペック
３年前に転職し、業務で２年半くらいAWS触ってます。
使っているサービスはズラーっと書くとだいたい下記の通り
EC2(オートスケールとか含む),S3,ECS,ECR,IAM,
Code三兄弟,EB,Lambda,DynamoDB,Route53,Kinesis,
AWSIoT関係,CloudWatch,RDS
後使ったことはほぼないけど何してるか理解してる（つもり）なのがAPIGateWay,Cognito

転職前は「クラウド？なにそれ」って状態でした。
組み込み開発やらAndroidアプリ開発メインだったのでSQL関係とかは基本さっぱりです。

# 試験前にやったこと
Developing on AWSは2018年6月に受けてきました。
知ってる内容半分、知らない内容半分ってとこでした。

模擬試験も受けてみました。
予想以上にSQSがでてるなぁ、とかなんか回りくどい日本語使ってるなぁとか思いつつ解いたら
５割弱しか取れてませんでした...
こりゃヤバいと思って模擬試験をキャプチャした内容で見直しを行い、
ざっくりと見直し、使ったことのないサービスが何をできる子なのかということを
もう一度理解することに。
ホワイトペーパーとかその類は全く読んでませんでした（小声）

# DVA受験（0回目） in 2018年7月
なんかクレジットカードで支払いできない。なんでや！
公式に問い合わせたらなんか日本のクレジットカード処理でバグってるらしい。
その後仕事がそれなりに忙しくなりお盆のタイミングで受験することに。

# DVA受験（0.5回目） in 2018年8月
受験日に熱出て寝込んでました。いじょう！

# DVA受験（1回目） in 2018年9月
今回はきちんと支払いも受験もできました。
結果は700点/1000店で不合格。合格ラインは720点。
グギギギギ...
敗因を自分なりに分析すると
・使ったことないSQSでわからない問題があった
・x-ray、KMS、CloudTrailあたりがイマイチ理解できていなかった
この二つかなぁと。特にSQSはかなりガッツリ出るので再度確認しました。

# DVA受験（２回目） in 2018年10月
743点/1000点で合格！手応え的には800点くらい取れてた感触はあったので、
多分間違えて理解してる部分があるんだろうなぁ。
とはいえ合格は合格。やったZE。

# 自分流DVA攻略法
とりあえず頭の中を「AWS最高！オンプレとかクソだわ」にしておく。
AWSがやってるAWSの試験なんだから当たり前ですがAWSの悪い部分はでてきません。
解答でも「オンプレミスでやる」だの「他サービスでやる」とか言った選択肢は全部切っておk。
後、AWSはEC2をよくないものと考えがちです。なのでEC2がベストプラクティスに
なることはあまりないです。
例外もありますが、サービスを選ぶ問題の場合、EC2の優先度は低めで考えて問題ないでしょう。

後、とにかく変な言い回しというかわかりにく文章が結構あります。
僕の語学力の問題かもですが

他のアソシエイトレベルの模擬試験も受けておけば、文章に慣れてよし、ちょくちょく出題範囲が被ってるので
復習になってなおよしです。
サービス的には、下記をおさえておけばだいたいいける（と思います）
EC2関係,Lambda,IAM,SQS,RDS関係,dynamoDB,CloudFront,APIGatewat,KVS,Cognito,
CloudWatch,CloudTrail,Code三兄弟,KMS
x-rayは２回目の受験の時には一切出てきませんでした。なんでや！

# 感想
とりあえず受かってよかったです（小並感）
他の試験は知りませんが、AWS関連の資格は実戦に勝る勉強無しだと思います。
サービスを覚えるくらいならそのサービスを遊びでも良いので触りましょう。その方が絶対良いです。
あと、とにかくAWSの資格は人気の割に情報がびっくりするくらい無いです。なので勉強が難しい！
この記事を書いた理由も実はそこ（情報がちょっとでも増えてほしい）だったりします。

# 後日談
Solutions Architect - Associateの模擬試験をDVAの勉強がてら
受けたのですが、なんか正答率が７割くらいありました。
こりゃいけるんじゃね？と思いDVA取得した３日後に受験した結果、無事一発合格でした。
追加で勉強した内容はVPC、EBS、EFSを確認したぐらい。
どーせDVA受けるならSAAも受験しといたほうがいいかもですね。

SysOps Administratorを取得すればアソシエイト三冠達成なのですが、
こっちは模擬試験の正答率が５割ちょいだったので、ちゃんと準備してから受けます....。
VUIアプリを改善するに当たって考えたこと

Clovaスキルの「[ボイスシンガー](https://twitter.com/imasirooo/status/1051758513771311105)」を公開後、改善をするに当たって意識したことをまとめました。
公開して２週間くらい経ちましたが、細かな修正を含めると30回くらいバージョンアップをしています。ClovaでのインテントやBotでのメッセージを全てログを取っており、それを元に改善しています。

# ボイスシンガー

本当に申し訳ないですが、記事の内容上このスキルのコンセプトを知ってもらいたいので、簡単に説明します。
(使ったことある方も、「どういうスキルか」ではなくて「どういうコンセプト」かが重要なので読み飛ばさないでください！)
ユーザーがシンガーさんを知るきっかけを提供する***サービス***になっています。
何か新しい歌に出会いたい、ユーザーの需要と、もっと多くの人に自分の歌を届けたいシンガーさんの需要から成り立っています。
ちなみにここでいう「シンガーさん」はメジャーデビューなどをしていない路上ライブなどをしている方々です。
ところでなぜ***サービス***なのでしょう。今まで***スキル***といってきました。これは、LINE Botと合わせて使うことでこのスキルが生かされるので***サービス***と言っています。以下の流れを提供します。

```
Clovaボイスシンガーを開いて曲を知る
↓
LINEアカウントのボイスシンガーで曲とシンガーさんをもっと知る
↓
TwitterやYouTubeで曲とシンガーさんを好きになる
```

<img width="958" alt="名称未設定_key-3.png" src="https://qiita-image-store.s3.amazonaws.com/0/195882/d7a0334c-9910-cae4-6343-7070f7b85ff5.png">

だいたいこのサービスについて知ってもらえたかと思います。では、これを開発するにあたって考えたことを話します。


# 浮かび上がった問題点

1. 1、2曲聞いて終わる人
2. Botがあまり使われていない


# 問題① 「1、2曲聞いて終わる人」

スキルを開いて１、2曲聞き、Botに通知するわけでもなくスキルを終了してしまう人が3割いました。この問題の原因として考えられたことがあります。

1. スキル起動初回時の説明が長い。
2. Botを友だち追加しないと遊べない。
3. 曲が長い。

## 解決策① 「スキル起動初回時の説明が長い。」

### 問題点

このスキルでは、初回起動時にBotの友だち追加をしていないユーザーに「登録してね！」や、このスキルのコンセプトを伝えていました。そのせいで、「あ、このスキル使うのに時間かかりそう」と思い、すぐスキルを終了してしまう人が多いいのではないかと思いました。
（2回目の起動時は説明はなくなる仕様にしています）

### 改善策

改善策としては単純で、説明を半分くらいに減らしました。しかし「友だち追加してね！」というのは文を短くはしましたが省きませんでした。

### 結果

変わりませんでした。データとしては少し改善しましたが、誤差の範囲でした。
つまり、「スキル起動初回時の説明が長い。」が原因で「1、2曲聞いて終わる人」が多かったわけではない、という結果を得ることができました。

## 解決策② 「Botを友だち追加しないと遊べない。」

### 問題点

スキルの起動時やいいねを送った時などに、むやみやたらとBotの友だち追加を推薦していました。ユーザーは「なんだ、Botを追加しないとちゃんと遊べないのか」と思いスキルを終了してしまうのではないかと考えました。

### 改善策

これも単純にClovaがBotの友だち追加を推薦する回数を減らしました。スキル仕様時には1回しか推薦されません。
さらにはBotを友だち追加していない人には、スキル上で曲名やシンガー名を知ることができる機能を追加しました。Botがなくても楽しめるようにするためです。

### 結果

思ったより変わりませんでした。個人的にはかなり改善されるのでは、と思っていましたがあまり変わった様子はありませんでした。

## 解決策③ 「曲が長い。」

### 問題点

１曲の長さが長いからではないかと考えました。長い曲で30秒流していました。説明などを合わせるとユーザーが聞いている時間が40秒以上ありました。
単純にちょっと使ってみよって思ってスキルを開いたのに、１曲聴くのに時間を取りすぎたのかもしれません。

### 改善策

全ての曲を13秒に減らしました。なぜ13秒かというと、サビをちょっと流すのにちょうどいい秒数が１３秒だったからです。

### 結果

改善しました。一人あたり平均して４曲は聞いてくれる、もしくはBotに通知を送ってくれるようになりました。
ここから、Clovaに喋らす（オーディオを含め）内容は短い方がいいことがわかりました。（スキルによるかもしれませんが）

## そのほかの解決策

これら以外にも試して見たいことがあります。試して見て結果がよければ追加していきます。


# 問題点② 「Botがあまり使われていない」

こちらはまだ改善中です。いくつか試して見て結果が出次第書いていこうと思います。
iOSアプリのUIをAndroidライクに作成できるライブラリを作ってみた

iOS用のビューライブラリを作成したので初Qiita投稿書いてみました。
当方豆腐メンタルのためコメント、ご指摘はお手柔らかにしていただけると嬉しいです。
[作成したライブラリ(SwiftJsonUI)](https://github.com/Tai-Kimura/SwiftJsonUI)
[Wiki](https://github.com/Tai-Kimura/SwiftJsonUI/wiki)
ドキュメント書くのが辛すぎてwikiは所々手抜きになっている箇所もありますので英語力と合わせてご了承ください。

##背景
XcodeでiOSアプリのUIを作成しようとするとAuto Layoutと毎回のコンパイル時間に悩まされて一向に作業が進まなかったので、なんとかして作業効率をあげたくて作成。
##やりたかったこと
1. 再コンパイルなしでビューの修正ができる。
2. Auto Layoutを極力気にせず作成できる。
3. Androidのxmlと近い記述方法で書ける。
4. AndroidのData Bindingが便利なのでそれも実装したい。

##実装内容
###1. コンパイルなしでビューの修正ができる。
こちらはSocketIOを利用することに。
ローカルにサーバーを立ててそこでビューファイルの変更を監視、変更があればアプリに通知して自動でビューファイルをダウンロードし再描画するように実装。開発用の機能なのでdebugビルドでのみプロジェクトに含まれるように実装。
ローカルサーバー側はnode.jsで簡単なものを実装。
###2. Auto Layoutを極力気にせず作成できる。
###3. Androidのxmlと近い記述方法で書ける。
両方ともセットで解決。
xmlをiOSで扱うのが面倒だったのでファイル形式はjsonを選択。
記述方法はAndroidに寄せて作成。AndroidのLinearLayoutやRelativeLayout、match_parentやwrap_contentの仕様をそのまま使えるように実装。
###4. AndroidのData Bindingが便利なのでそれも実装したい。
AndroidのData Bindingがビューとプロパティの紐付けやモデルのデータ反映など色々と便利なのでiOSでも同じ様な感じで使えるように実装。
###おまけ
このライブラリで作成したiOS用のビューを[Androidのxmlに変換して書き出せるパーサー](https://github.com/Tai-Kimura/SwiftJsonUI/tree/master/android_parser)もライブラリに追加してます。
ruby parse_json_to_android_xml.rb で実行できますが、こちらはざっくりと作っているのでお好みで修正を加えてお使いください。
完璧に変換できるわけではないですが、ある程度近い表示はできるので作業時間短縮になるかと思います。

##追記
[サンプルアプリ](https://github.com/Tai-Kimura/chat-test)も作ってみました！
[実装の流れも記事にしました](https://qiita.com/Tai-Kim/items/4aae1e396bacbbd9a16d)のでよろしくお願いします。
kotlinでjsonを扱おうとしたら警告が...

## 概要
書籍を参考にkotlinを学習中していると、躓いたのでメモする

## jacksonの追加
gradleでjacksonというjsonライブラリを追加するように指示があったので、とりあえずコピペしてみる。

```gradle:gradle.build
plugins {
    id 'org.jetbrains.kotlin.jvm' version '1.2.71'
}

version '1.0-SNAPSHOT'

repositories {
    mavenCentral()
}

dependencies {
    compile "org.jetbrains.kotlin:kotlin-stdlib-jdk8"
    compile 'org.slf4j:slf4j-log4j12:1.7.21'
    compile 'com.sparkjava:spark-core:2.6.0'
    compile 'com.fasterxml.jackson.core:jackson-databind:2.8.8.1'      <- ここを追加
    compile 'com.fasterxml.jackson.module:jackson-module-kotlin:2.8.8' <- ここを追加
}
```
すると、以下の警告が表示されるようになり、どうも不安定になる。

```
Warning:Kotlin: Runtime JAR files in the classpath should have the same version. These files were found in the classpath:
    /Users/hoge/.gradle/caches/modules-2/files-2.1/org.jetbrains.kotlin/kotlin-stdlib-jdk8/1.2.71/5470d1f7/kotlin-stdlib-jdk8-1.2.71.jar (version 1.2)
    /Users/hoge/.gradle/caches/modules-2/files-2.1/org.jetbrains.kotlin/kotlin-stdlib-jdk7/1.2.71/4ce93f53/kotlin-stdlib-jdk7-1.2.71.jar (version 1.2)
    /Users/hoge/.gradle/caches/modules-2/files-2.1/org.jetbrains.kotlin/kotlin-reflect/1.1.1/e68cf130c/kotlin-reflect-1.1.1.jar (version 1.1)
    /Users/hoge/.gradle/caches/modules-2/files-2.1/org.jetbrains.kotlin/kotlin-stdlib/1.2.71/d9717625b/kotlin-stdlib-1.2.71.jar (version 1.2)
    /Users/hoge/.gradle/caches/modules-2/files-2.1/org.jetbrains.kotlin/kotlin-stdlib-common/1.2.71/ba18cc/kotlin-stdlib-common-1.2.71.jar (version 1.2)
Warning:Kotlin: Consider providing an explicit dependency on kotlin-reflect 1.2 to prevent strange errors
Warning:Kotlin: Some runtime JAR files in the classpath have an incompatible version. Consider removing them from the classpath
```
どうやら1.1系と1.2系が混ざっているという警告のようだ。
調べてみると下記記述がヒットする。
https://github.com/FasterXML/jackson-module-kotlin/issues/97

```
I upgraded to kotlin 1.2.0 and fasterxml 2.9.2 and it seems to be working
```
そこで、2.8.x系だから良くないのかと、2.9.x系の最新版「2.9.6」に変更する。

```gradle:gradle.build
dependencies {
    compile "org.jetbrains.kotlin:kotlin-stdlib-jdk8"
    compile 'org.slf4j:slf4j-log4j12:1.7.21'
    compile 'com.sparkjava:spark-core:2.6.0'
    compile 'com.fasterxml.jackson.core:jackson-databind:2.9.6'
    compile 'com.fasterxml.jackson.module:jackson-module-kotlin:2.9.6'
}
```

警告が表示されなくなる。
buildが失敗したりと不安定だったので、これで正常に動くようになればいいですが...

## 参考サイト
* [KotlinReflectionInternalError after upgrading to Kotlin 1.2 RC](https://github.com/FasterXML/jackson-module-kotlin/issues/97)
* [GitHub - FasterXML/jackson-module-kotlin](https://github.com/FasterXML/jackson-module-kotlin)
PHP　簡単なフォーム作成

こんにちは。

今日はhtmlで簡単なテキストフォームを作成し

そのフォームからPOSTで文字列データを受け取る

という形のPHPを書きました。

```HTML
<form method="post">
<textarea type="text" name="contact" placeholder="何か入力してください"></textarea>
<input type="submit">
</form>
```

上記のような形で書きまして次にPHPです。

```PHP
<?php
$data = nl2br(htmlspecialchars($_POST["contact"],ENT_QUOTES,'UTF-8'));

echo  $data;
```
というような形で書いてみました。

nl2brというのは改行を表しています。

htmlspecialcharsというのは特殊文字をHTMLエンティティに変換する

事を指しています。


ENT_QUOTESは、特殊文字をHTMLエンティティに変換する

事を指しています。

ここまでできれば次に作るのはメールフォームですね！

フォームからデータを送信したら送信したデータは
メールアドレスに届いていることを確認できればOK

というような形のものを次回、作っていきます。
hubot-slackをv3からv4にあげたやつ（今更）

https://github.com/slackapi/hubot-slack

# 経緯
daemonにぶちこんだはずのhubotが気付いたら息をしなくなる
ログを見ている限り「一定数以上msg.send走った瞬間に即死している」ようにしか見えず、原因が不明
https://kakakakakku.hatenablog.com/entry/2016/11/05/133008
この辺みたらアプデすりゃええよって書いてあったのでとりあえずあげてみようと思った

# 環境
```
$ cat /etc/redhat-release
CentOS release 6.2 (Final)

$ npm list --depth=0 | grep hubot-slack
├── hubot-slack@3.4.2
```

# v4導入手順
```
$ npm info hubot-slack versions
4.5.5が最新なのでそれ使う
```
```package.json
-    "hubot-slack": "^3.3.0",
+    "hubot-slack": "^4.5.5",
```
```
$ npm install
npm WARN engine https-proxy-agent@2.2.1: wanted: {"node":">= 4.5.0"} (current: {"node":"0.12.18","npm":"2.15.11"})
npm WARN engine request@2.88.0: wanted: {"node":">= 4"} (current: {"node":"0.12.18","npm":"2.15.11"})
npm WARN engine agent-base@4.2.1: wanted: {"node":">= 4.0.0"} (current: {"node":"0.12.18","npm":"2.15.11"})
npm WARN engine har-validator@5.1.0: wanted: {"node":">=4"} (current: {"node":"0.12.18","npm":"2.15.11"})
npm WARN engine har-schema@2.0.0: wanted: {"node":">=4"} (current: {"node":"0.12.18","npm":"2.15.11"})
```
nodeがクソ古い

>SyntaxError: Use of const in strict mode.

というエラーが発生するようになるので、いつものコマンドでnodeも更新しておく(0.12.18て・・・)

```
$ nvm ls-remote
$ nvm install v4.9.1 # 4以上を要求されてたのでひとまず4系最新
$ nvm use v4.9.1
$ nvm alias default 4.9.1
$ node -v
v4.9.1
$ npm -v
2.15.11
```

npm install が通ることを確認しておわり

# coffee-script側対応
ほとんど触ってない
よくある「特定roomでのみ喋らせる」やつでの部屋名取得方法が変わってたのでその対応
https://qiita.com/Mahito/items/31e02160ecbdff810a52

```script/1_room_limit.coffee
_ = require 'lodash'
module.exports = (robot) ->
  robot.hear /.*/, (msg) ->
   join_channels = [
      'general',
      'hubot',
      ...
   ]
   channel = msg.envelope.room
   robot.adapter.client.web.conversations.info(channel)
     .then((response) ->
       room_name = response.channel.name
       unless _.contains join_channels, room_name
         msg.finish()
     )
```

上記qiitaでは `robot.adapter.client.web.channels.info` ですが、
[channels.info](https://api.slack.com/methods/channels.info) だと共有chとかプライベートchで動かない、
[groups.info](https://api.slack.com/methods/groups.info) は非推奨なので
[conversations.info](https://api.slack.com/methods/conversations.info) にしてます。

# その後
hubotちゃんは生まれつきメモリパワーが弱く1ヶ月以内に増設が必要です
しかしメモリ増設には10,798円という莫大な費用がかかります。
hubotちゃんを救うためにどうか協力をよろしくお願いします。

hubotちゃん　生存時間　今の所は48時間ほど

# 参考
hubot-slack v4移行時のハマりどころ 
https://www.slideshare.net/knjcode/hubotslack-v4-hubotchatops
スポットインスタンスのTerminate時に、自動でECSクラスタからDeregisterする

ECSとスポットインスタンスは相性がよく比較的多くの場所で推奨されていますが、そのままでは強制Terminate時にきれいにECSクラスタを抜けられないことはあまり良く知られていません。（構築・運用したことがある人はすぐに気づきますが）
今回は簡単な説明と具体的な対応を書いています。

## なぜ対応が必要なのか

スポットインスタンスが強制Terminateされる時に適切な処理が行われていないと下記のような事象が発生します。なので、プロダクションで利用する際は対応はほぼ必須かと思います。

- 該当インスタンス上のコンテナがELBから接続されている場合に、Drainingされずに停止されていしまう。
    - Drainingされなかったリクエストが503 Errorとなる。
    - 状況によっては十分な数のコンテナが存在しない時間帯が発生する。

## どんな対応が必要なのか

公式ドキュメントにも記載がありますが、基本的には [コンテナインスタンスの登録解除](https://docs.aws.amazon.com/ja_jp/AmazonECS/latest/developerguide/deregister_container_instance.html) をすることにより、下記作業が行われます。

- 該当インスタンス上で可動しているコンテナのELBからのDraining
- 該当インスタンス上で可動しているコンテナの、他インスタンスへのオフロード。

また、２分あれば十分かと思いますがELBのDrainingの許容時間なども合わせて見直したほうがいいかと思います。

ただ、自分で設定するのはめんどくさい、、ので今回はCloudFormationのテンプレートを用意しました。

## CloudFormation テンプレート

https://github.com/mats16/ecs-spot-deregister
基本的にはこちらのテンプレートを実行してすればOKです。（リージョン毎に設定されるので、ECSをお使いのリージョンでCFnを実行してください）

基本的には構成図のとおりですが下記のようなことを行っています。

1. CloudWatch Eventsで強制Terminationの２分前通知を検知
2. Lambda Functionを実行
3. Lambda内からAPIを叩き、該当インスタンスをECSクラスタからDeregisterする

![ecs-spot-deregister.png](https://qiita-image-store.s3.amazonaws.com/0/45249/2e1b9805-907a-e647-ba0e-c4451b94c8cd.png)

中のコードを見ていただければわかりますが、`instance_id`から`cluster_name`と`container_instance_id`を直接参照できるAPIが無いので、やや微妙な書き方になっています。

## あとがき

本投稿は、個人の意見であり、所属する企業や団体は関係ありません。お約束です。
久しぶりにpython書いたのでご指摘や機能要望があれば、PullRequestやIssue頂ければと思います。
（SNS挟んだほうがいいとか、Slackに通知したいなど）
AWS EC2 Quick filters (Experimental settings:試験的なもの)

# AWS EC2 Quick filters とは？

最近、EC2 の検索バーに、フラスコのマークがあります。
![step1.png](https://qiita-image-store.s3.amazonaws.com/0/212868/b892f535-4b95-19d4-b852-a2b3991baae9.png)

気になるねという話題になったので有効にしてみました。
いつでも、無効（非表示）に出来ます。

# 設定方法
### 1. フラスコマークを選択します。
### 2. どの機能を有効にするかを聞かれるので、「Quick filters」を選択して、「Save Settings」を選択する。
![step2.png](https://qiita-image-store.s3.amazonaws.com/0/212868/5ea4e7a0-d2ef-7eb7-c1d1-1810787dd181.png)
![step3.png](https://qiita-image-store.s3.amazonaws.com/0/212868/b6833114-9c58-df0c-af38-10bf9180e9dc.png)
![step4.png](https://qiita-image-store.s3.amazonaws.com/0/212868/e54c1af2-ce2a-3f56-24b4-2dafaa261a2e.png)

# 反映結果
EC2 ダッシュボードの「インスタンスの作成」の横に、「クイックフィルタ」という項目が出来ます。

![before.png](https://qiita-image-store.s3.amazonaws.com/0/212868/5ffa7eca-e9d4-aa31-b06c-7e203286dcc4.png)
![after.png](https://qiita-image-store.s3.amazonaws.com/0/212868/67ce872f-d3a6-2a55-c925-52a9f504741b.png)

# 利用方法
### 1. リソースIDを指定するバーで、対象インスタンスのIDを入力する。
![howto1.png](https://qiita-image-store.s3.amazonaws.com/0/212868/22bc2cfc-0342-49d1-129b-af6f0391e29f.png)

### 1'. リソースID以外や、リソースIDをワイルドカードなどにするとエラーになる。
![howto2.png](https://qiita-image-store.s3.amazonaws.com/0/212868/c0442be8-7ac6-b65c-ae9c-ee5b59ba0625.png)

### 2. 正しいリソースIDを入力すると、4つの項目が表示される。

- Use filter for インスタンス
- Use filter for ボリューム
- Use filter for Elastic IP
- Use filter for ネットワークインターフェース

![howto3.png](https://qiita-image-store.s3.amazonaws.com/0/212868/59aeed7a-7da6-53df-b6f0-d9878c7f8ca2.png)

### 3. 確認したい項目のリンクを選択すると、リソースIDが指定された状態で画面が表示されます。
![howto4.png](https://qiita-image-store.s3.amazonaws.com/0/212868/ab13f2d8-d1e4-58ce-5379-5bf17c002645.png)


# 感想

Quickの名の通り
表示される項目は、EC2 > インスタンス > 説明タブ で、確認出来るものが大半でした。
出来れば、どのELBに所属しているかなど、もう少し項目が多くなると嬉しいなと思いました。
ローカルのgitリポジトリからsshでデプロイする

のっぴきならない事情でリモートリポジトリからデプロイできない場合とかに、手元から転送するための方法。

手元でファイル削除しても転送先ではそのまま残るので、だんだんゴミが溜まってくので注意。

```sh:deploy.sh
#!/bin/bash

BRANCH=master
DEST_SERVER=target_server
DEST_DIR=/path/to/dir

# git の root に移動して
cd $(git rev-parse --show-toplevel)

# tar.gz に固めて | sshで転送 + 転送先で目的のディレクトリに展開
git archive $BRANCH --format=tar.gz | ssh ${DEST_SERVER} "mkdir -p ${DEST_DIR} && tar zxvf - -C ${DEST_DIR}"
```

## 他のやり方

sshが通るならリモートポートフォワードして git clone する方法もあるけど、gitにport指定するのが面倒なので今回は見送り。

## 参考

https://qiita.com/takaakikasai/items/4e9b2a67fd2a932f4756
【Vue.js】vuejsで簡単にスライダー(カルーセル)を爆速で実装する

# 本記事の内容

vue.jsでスライダー（カルーセル）を簡単に実装できるコンポーネント
VueAwesomeSwiper(MITLicense)を使ってスライダーを作るのが目的です。

# 環境

+ windows10
+ VisualStudioCode
+ vue.js(3.0.3)
+ npm (6.4.1)
+ vuex

# 1.VueAwesomeSwiperを追加する

npm installでVueAwesomeSwiperを追加します

```
npm install vue-awesome-swiper
```

# 2.main.jsに追加する

グローバルでマウントする場合は以下の追加です。

``` javascript:main.js
import Vue from 'vue'
import VueAwesomeSwiper from 'vue-awesome-swiper'

// require styles
import 'swiper/dist/css/swiper.css'

Vue.use(VueAwesomeSwiper, /* { default global options } */)
```


各コンポーネントでマウントする場合はこちらを使用します

``` javascript:hoge.vue
// require styles
import 'swiper/dist/css/swiper.css'

import { swiper, swiperSlide } from 'vue-awesome-swiper'

export default {
  components: {
    swiper,
    swiperSlide
  }
}
```

# 3.実際に使ってみる

サンプルコードは公式のgithubに書かれています。
基本的にそのままコピペで動きます。
http://idangero.us/swiper/demos/


# 4.追加テクニック

## 1.初期スライドを変更したい

swiperOptionに以下のプロパティ(initialSlide)を設定します

```javascript:hoge.vue
swiperOption: {
  ~~
  initialSlide:1,
}
```

数値を変更すると初期スライドが変更されます。

## 2.スライドが変更された時にイベントを実行したい

swiperOptionに以下のプロパティを設定します

```javascript:hoge.vue
swiperOption: {
  ~~
        on: {
          slideChangeTransitionEnd: () => {
               console.log(this.swiper.activeIndex);
            }
        }
}
```

computedにも追加しておきます。

``` javascript:hoge.vue
  computed: {
    swiper() {
      return this.$refs.questListSwiper.swiper;
    },
```

これで変更時にそのスライドが何枚目のスライドなのかがコンソールに表示されます。
ただし、この場合、初期スライダー(initialSlide)を設定している場合、エラーが発生する為少しオプションの方に条件を追加します。

```javascript:hoge.vue
        on: {
          slideChangeTransitionEnd: () => {
               if(this.swiper){
                  console.log(this.swiper.activeIndex);
                }
            }
        }
```

これでエラーは回避できます。


上記２つを組み合わせることで、例えばページ遷移時の情報をstoreに保存して、次回表示するタイミングでそのスライドから、といった処理が可能になります。

# まとめ

非常に簡単にスライダーを実装できますが、今回実装した機能はVueAwesomeSwiperのほんの１部分にすぎません。
興味がある方はドキュメントを１読してみることをお勧めします。

# 参考
[VueAwesomeSwiper](http://idangero.us/swiper/api/#events)
[Code Blog Bt](https://www.codeblogbt.com/archives/440147)
異なるサブスクリプション、異なるADテナントでvNet Peering

異なるサブスクリプションでのvNet Peeringはこれまでもできましたが、vNetが同一ADテナントに所属している必要がありました。
先日異なるADテナントでも実現できるようになったのでやりかたをまとめます。
[Virtual network peering across Azure Active Directory tenants](https://azure.microsoft.com/es-mx/updates/cross-aad-vnet-peering/)

# これまでは？
[vNet A]と[vNet B]のピアリングはできましたが、[vNet B]と[vNet C]のピアリングはできませんでした。

![image.png](https://qiita-image-store.s3.amazonaws.com/0/180335/32b70f06-d0a0-59fa-421b-d29f2d27843a.png)

# それがこうなる！
異なるADテナントでもピアリング可能になります！

![image.png](https://qiita-image-store.s3.amazonaws.com/0/180335/3eb37b80-e24d-e5d4-7f20-ccf3685c1a09.png)

# [vNet B]→[vNet C]ピアリング

## 権限まわり

* [Subscription C]のActive Directoryから[Account B]をゲストアカウントとして招待してもらいます
![image.png](https://qiita-image-store.s3.amazonaws.com/0/180335/b26b594b-206f-14e1-7dc6-58232706452c.png)

* [vNet C]のIAM設定を開き、[追加]を選択します
![image.png](https://qiita-image-store.s3.amazonaws.com/0/180335/df9cec3e-4de4-ce03-0188-ff19971a056f.png)

* ゲストアカウントとして追加した[Account B]に「ネットワーク共同作成者」権限を付与します
![image.png](https://qiita-image-store.s3.amazonaws.com/0/180335/34ca6a85-f326-9f23-7ccd-e3694203d234.png)

## 接続先vNetのリソースID取得

* [vNet C]のプロパティより、リソースIDを取得する
![image.png](https://qiita-image-store.s3.amazonaws.com/0/180335/5c454dad-fa79-e8c2-eb0f-a483bf9832ac.png)

## ピアリング
権限付与はOKなので、実際にピアリングしてみます。
執筆時点でポータルではできず、Azure CLIで実行する必要があります。
また、なぜかCloud Shell（Bash）ではできなかったので、ローカルPCなりにAzure CLIをインストールして実行します。

* Azure CLIをインストールして、[Account B]でログインします。手順は公式参照。
[Azure CLIのインストール](https://docs.microsoft.com/ja-jp/cli/azure/install-azure-cli?view=azure-cli-latest)

* 以下コマンドを実行します。

```
az network vnet peering create -g [vNet Bが所属するリソースグループ] -n [任意のピアリング接続名] --vnet-name [vNet B] --remote-vnet [vNet CのリソースID] --allow-vnet-access
```

* エラーメッセージなく結果がJSONで返ってきたらOKです

# [vNet C]→[vNet B]ピアリング
逆方向のピアリングは先程の手順の逆をやればよいです

# 確認
* vNetのピアリングから、ステータスが「接続済み」になっていればOKです！
![image.png](https://qiita-image-store.s3.amazonaws.com/0/180335/c9688092-fa27-d57c-4c45-b75b1e613be9.png)
Atom で rubocop 導入時のエラー解消

Atomでrubocopを使おうとした際にエラーが発生したので解決法とともに共有します。

### したこと

1. `gem install rubocop`
2. Atomのパッケージの `Linter` と `linter-rubocop`をインストール


### エラー内容

ここでエラーが発生しました。

```sh:Atomでのエラー内容
[Linter] Error running RuboCop Error: Failed to spawn command `/Users/home/shims/rubocop`. Make sure `/Users/home/shims/rubocop` is installed and on your PATH
    at /Users/home/.atom/packages/linter-rubocop/node_modules/atom-linter/lib/helpers.js:130:24
    at <anonymous>
    at process._tickCallback (internal/process/next_tick.js:188:7)
```

`rubocop` 自体に問題があるのか確認するためにコマンドラインから `rubocop`を動作させると、

```sh
$ rubocop app.rb
rbenv: rubocop: command not found

The `rubocop' command exists in these Ruby versions:
  2.4.1
```
このようなエラーが発生したので上手く `rubocop`　 が動いていなことを確認。

### 修正方法

`.rbenv` ディレクトリが私の場合はhomeディレクトリにあったので、そこの `~/.rbenv/bin/` に入っているrubocopを使用します。
`~/.rbenv/versions/2.4.1/bin/rubocop app.rb` で正しく動作しました。 (2.4.1の所は上記でエラーが出たversionに合わせる)

この方法で動作することが確認できたら、Atom側のrubocopも修正を行います。`設定 → Package` から `linter-rubocop` を検索します。検索するとSettingsのCommandという所があるのでそこを書き換えます。Defaultだと rubocop になっているはずです。
そこに上記の `~/.rbenv/versions/2.4.1/bin/rubocop` を書いてあげれば無事動作しました。
Rubyで組むプログラムに組み込めそうな自然言語処理のツール

Rubyで組むプログラムに組み込めそうな自然言語処理のツールについて備忘録になります。

# 形態素解析
## API
* [Yahoo!JAPAN 日本語形態素解析](https://developer.yahoo.co.jp/webapi/jlp/ma/v1/parse.html)
  * 24時間以内に5万リクエスト以内
  * 1リクエストのサイズ100KB以内
* [gooラボ 形態素解析API](https://labs.goo.ne.jp/api/jp/morphological-analysis/)
  * アプリケーションを公開する際は、以下のような形での表示が必要
  
    ```html
    <a href="http://www.goo.ne.jp/">
    <img src="//u.xgoo.jp/img/sgoo.png" alt="supported by goo" title="supported by goo">
    </a>
    ```

## ソフトウェア
* [MeCab](http://taku910.github.io/mecab/)
  * ポピュラーな形態素解析器
  * 辞書が充実している
     * IPADic
         * デフォルトの辞書
     * [UniDic](http://unidic.ninjal.ac.jp/)
         * [国立国語研究所](https://www.ninjal.ac.jp/)によって規定された言語単位『短単位』に基づいて作成された辞書
     * [mecab-ipadic-NEologd](https://github.com/neologd/mecab-ipadic-neologd/blob/master/README.ja.md)
         * IPADicにWeb上の言語資源から得た新語を追加した辞書
         * 毎週月, 木曜日に更新される
     * [mecab-unidic-NEologd](https://github.com/neologd/mecab-unidic-neologd/blob/master/README.ja.md)
         * [UniDic](http://unidic.ninjal.ac.jp/)にWeb上の言語資源から得た新語を追加した辞書
         * 毎週月, 木曜日に更新される
  * Ruby用のバインディングが存在する
     * [公式バインディング](https://github.com/taku910/mecab/tree/master/mecab/ruby)
     * [natto](https://github.com/buruzaemon/natto)
* [KyTea](http://www.phontron.com/kytea/index-ja.html)
  * [京都大学黒橋・河原研究室](http://nlp.ist.i.kyoto-u.ac.jp/)にて開発されたツール
  * デフォルトでは品詞推定と読み推定が可能
* [JUMAN++](http://nlp.ist.i.kyoto-u.ac.jp/index.php?JUMAN++)
  * [京都大学黒橋・河原研究室](http://nlp.ist.i.kyoto-u.ac.jp/)にて開発されたツール
  * インストール時にとても時間がかかる
  * [knp-utils](https://qiita.com/Kensuke-Mitsuzawa/items/c7f1c53c171d6ff391cc)で高速化可能

# キーフレーズ抽出
## API
* [Yahoo! JAPAN キーフレーズ抽出](https://developer.yahoo.co.jp/webapi/jlp/keyphrase/v1/extract.html)
  * 24時間以内に5万リクエスト以内
  * 1リクエストのサイズ100KB以内
* [gooラボ キーワード抽出API](https://labs.goo.ne.jp/api/jp/keyword-extraction/)
  * アプリケーションを公開する際は、以下のような形での表示が必要
  
    ```html
    <a href="http://www.goo.ne.jp/">
    <img src="//u.xgoo.jp/img/sgoo.png" alt="supported by goo" title="supported by goo">
    </a>
    ```

# 固有表現抽出
## API
* [gooラボ 固有表現抽出API](https://labs.goo.ne.jp/api/jp/named-entity-extraction/)
  * アプリケーションを公開する際は、以下のような形での表示が必要
  
    ```html
    <a href="http://www.goo.ne.jp/">
    <img src="//u.xgoo.jp/img/sgoo.png" alt="supported by goo" title="supported by goo">
    </a>
    ```

## ソフトウェア
* [JUMAN](http://nlp.ist.i.kyoto-u.ac.jp/index.php?JUMAN) ([JUMAN++](http://nlp.ist.i.kyoto-u.ac.jp/index.php?JUMAN++)) + [KNP](http://nlp.ist.i.kyoto-u.ac.jp/index.php?KNP)
  * [京都大学黒橋・河原研究室](http://nlp.ist.i.kyoto-u.ac.jp/)にて開発されたツール
  * インストール時にとても時間がかかる
  * [knp-utils](https://qiita.com/Kensuke-Mitsuzawa/items/c7f1c53c171d6ff391cc)で高速化可能

# Word2Vec
## API
* [Word2Vec【Wikipedia x Neologd】](https://apitore.com/store/apis/details?id=8)
  * Neologdを用いているため、新語に対応している

# 参考文献
* [API利用方法 ｜ソフト・アプリ開発のAPIなら【gooラボ】](https://labs.goo.ne.jp/apiusage/)
* [日本語の形態素解析ができる無料API、ツール、ライブラリー9選](https://ledge.ai/morpho_analysis_japan/)
Kurento Media Server用Filter Moduleをサンプルアプリへ統合する

## 概要

[前回](https://qiita.com/Otama75/items/d73afd0c389a83001e5c)の手順で作成したFilter Moduleを、Kurento Media Serverのサンプルアプリへ統合する。

## アプリへの統合の作業

[Kurentoのインストール時](https://qiita.com/Otama75/items/2e771dfb77f1a734abcf)に動かしたtutorialのサンプルアプリ「kurento-magic-mirror」のフィルタを今作成したCustomFilterに置き換えてみる。


Detached HEAD 6.7.1のからブランチする。(masterのままでは実行できない。)

```console
$ cd kurento-tutorial-java/kurento-magic-mirror
$ git checkout -b 'custom_filter'
```

pom.xmlには先ほど確認したJavaアプリケーション用のモジュールとの依存関係を追加する。

```console
$ vim pom.xml
------- pom.xml -------
# <dependencies>の中に追加
<dependency>
	<groupId>org.kurento.module</groupId>
	<artifactId>customfilter</artifactId>
	<version>0.0.1-SNAPSHOT</version>
</dependency>
-----------------------
```
アプリケーションプログラムの書き換え。元あったFaceOverLayFilterをCustomFilterに置き換える。

```console
$ cd src/main/java/org/kurento/tutorial/magicmirror
$ cp MagicMirrorHandler.java MagicMirrorHandler.java.org
$ vim MagicMirrorHandler.java
----------------------------------MagicMirrorHandler.java-----------------------------------
+//import org.kurento.client.FaceOverlayFilter;
+import org.kurento.module.customfilter.CustomFilter;

//Media logic
+//FaceOverlayFilter faceOverLayFilter = new FaceOverlayFilter.Builder(pipeline).build();
+CustomFilter customFilter = new CustomFilter.Builder(pipeline).build();

+//faceOverlayFilter.setOverlayedImage(appServerUrl + "/img/mario-wings.png", -0.35F, -1.2F,
+//	1.6F, 1.6F);

-webRtcEndpoint.connect(faceOverlayFilter);
-faceOverlayFilter.connect(webRtcEndopint);
+webRtcEndpoint.connect(customFilter);
+customFilter.connect(webRtcEndpoint);
--------------------------------------------------------------------------------------------
```

コンパイルして実行

```console
$ cd ~/kurento/kurento-tutorial-java/kurento-magic-mirror
$ mvn clean compile exec:java -Dkms.url=ws://localhost:8888/kurento
```

Chromeブラウザから、サーバにアクセス。

```
https://<host_ip>:8443/
```
うまく動けば、エッジ検出フィルタが動作する。
<img width="1338" alt="3_opencv_filter.png" src="https://qiita-image-store.s3.amazonaws.com/0/189951/d87c373a-f011-f25f-6a76-d96a1949229e.png">


## フィルタの処理内容を更新する

CustomFilterの`CustomFilterOpenCVImpl.cpp`を修正して、フィルタの処理内容を改変する。

```console
$ cd ~/kms/custom-filter/src/server/implementation/objects
$ vim CustomFilterOpenCVImpl.cpp
```
以下ようにCustomFilterOpenCVImpl::process関数の一番最後に円を書く処理を追加する。

```CustomFilterOpenCVImpl.cpp
void CustomFilterOpenCVImpl::process (cv::Mat &mat)
{
  cv::Mat matBN (mat.rows, mat.cols, CV_8UC1);
  cv::cvtColor(mat, matBN, COLOR_BGRA2GRAY);

  if (filterType == 0) {
    Canny (matBN, matBN, edgeValue, 125);
  }
  cvtColor (matBN, mat, COLOR_GRAY2BGRA);
  // Green circle
  cv::circle(mat, cv::Point(200, 250), 120, cv::Scalar(0,200,0), 8, 8);
}
```

コンパイルとインストール

```console
$ cd ~/kms/custom-filter/build
$ make
$ sudo make install
```

tutorialのkurento-magic-mirrorを起動する。

```console
$ cd kms/kurento-tutorial-java/kurento-magic-mirror/
$ mvn clean compile exec:java -Dkms.url=ws://localhost:8888/kurento
```

フィルタのプログラムの更新ができた。

<img width="1497" alt="4_filter_modify.png" src="https://qiita-image-store.s3.amazonaws.com/0/189951/c599fb3a-2a18-5828-812f-ec84906340bd.png">
長さの違うリストを一つのデータフレームにまとめたかった

長さの違う複数のリストを、一つのデータフレームにまとめたかった。
例えば、こんなリストをまとめようとした。

```R:
#　要素数の異なるリスト
a <- c(1,2,3)
b <- c(1,2,3,4,5,6,7)
```
そして、このリストを次のようにまとめようとすると、エラーになる。

```R:
A <- data.frame(a,b)
# Aの長さは3，Bの長さは7なのでエラー
```

短い方のリストをNAで埋めて、長さをそろえてやるとうまくいく。

```R:
c <- c(1,2,3,NA,NA,NA,NA)
#NAで埋めてあれば、要素数が揃うのでOK
B <- data.frame(a,c)
```

で、いちいち手でNAを入力するのがめんどくさかったので、こういうコードを書いた。

```R:different_length.r
#　2つのリスト長の差を取る関数
diff_length <- function(list1,list2){
  if(length(list1) > length(list2)){
    return (length(list1) - length(list2))
  }else{
      return (length(list2) - length(list1))
    }
}

#　リストをNAで埋める関数
fill_by_na <- function(list, num){
      return (c(list,rep(NA,num)))
}

# 上の関数を組み合わせてこうした
a <- c(1,2,3)
b <- c(1,2,3,4,5,6,7)

shortage <- diff_length(a,b) # 今回は4

fill_by_na(a,shortage)
#  1  2  3 NA NA NA NA

C <- data.frame(a = fill_by_na(a,shortage),b)
#    a b
# 1  1 1
# 2  2 2
# 3  3 3
# 4 NA 4
# 5 NA 5
# 6 NA 6
# 7 NA 7

```

きっと、もっとうまくやる方法があると思うし、そもそもデータフレームの正しい使い方ではない気もする。コメント欄で正しいやり方をご指摘いただけると嬉しいです。
日本ディープラーニング協会のＥ資格の認定プログラムを比較してみました（2018/10/16最新版）

#####第一回目が2018年9月29日(土)に実施されました。
第二回目は2019年2月23日(土)に実施予定です。

##Ｅ(エンジニア)資格とは
ディープラーニングの理論を理解し、適切な手法を選択して実装する能力を持つ人材向けの資格です。

日本ディープラーニング協会の資格は２種類あります。Ｇ検定とＥ資格。
ディープラーニングに関する知識を有し、事業活用する人材（ジェネラリスト）と、ディープラーニングを実装する人材（エンジニア）の育成を目指します。各々に必要な知識やスキルセットを定義し、資格試験を行うとともに、協会が認定した事業者がトレーニングを提供します。 

各々年二回実施予定。
日進月歩する技術であることから、検定・資格実施年毎に実施年号を付与する。

引用：日本ディープラーニング協会　http://www.jdla.org/business/certificate/

Ｇ検定は受験資格に制限がないため気軽？に受けられますが、Ｅ資格は受験するために条件が設定されています。


##概要など
概要：ディープラーニングを実装するエンジニアの技能を認定する
受験資格：JDLA認定プログラム※1を修了していること
試験概要：120分の会場試験にて、小問106問の知識問題（多肢選択式）を出題
試験会場：全国の指定試験会場から、お申し込み時に選択
出題問題：シラバスより、JDLA認定プログラム修了レベルの出題
試験日：2019年2月23日（土）13:00開始または15:30開始（時刻はお申し込み時に選択）
受験料：  一般 32,400円（税込）、  学生 21,600円（税込）、  JDLA正会員・賛助会員 27,000円（税込）
申込期間：2019年2月2日（土）〜2月16日（土）※更新されておらず前回を参考に予想。
申し込むためには、『受験申込コード』が必要です。※２

※１JDLA認定プログラムは、高等教育機関や民間事業者が提供する教育プログラムで、当協会が別途定める基準およびシラバスを満たすもの。
※２お申し込みには、協会から発行される「受験申込コード」が必要になります。このコードは、協会が認定プログラム運営事業者様から受領した講座修了者名簿に従い、協会から直接メールで送付されます。
引用：日本ディープラーニング協会　http://www.jdla.org/business/certificate/


##JDLA認定プログラム一覧
①現場で使えるディープラーニング基礎講座
  認定番号：00001
  講座形態：ハンズオン@東京、大阪、名古屋、オンライン
  運営会社：スキルアップAI株式会社
  詳細ページ：https://www.skillupai.com/deep-learning

②機械学習オンライン／ディープラーニングオンライン
  認定番号：00002
  講座形態：オンライン
  運営会社：株式会社zero to one
  詳細ページ：https://zero2one.jp/#courses

③現場で潰しが効くディープラーニング講座
  認定番号：00003
  講座形態：ハンズオン＠東京（リモート参加可能）
  運営会社：株式会社ナトフ　　共催：アイスタディ株式会社
  詳細ページ：http://study-ai.com/jdla/

④AI_STANDARD for Engineering
  認定番号：00004
  講座形態：オンライン
  運営会社：株式会社STANDARD
  詳細ページ：https://www.ai-standard.jp/

⑤AIジョブカレ ディープラーニング講座
  認定番号：00005
  講座形態：ハンズオン@東京、大阪、福岡
  運営会社：エッジコンサルティング株式会社
  詳細ページ：https://www.aijobcolle.com/dl/

引用：日本ディープラーニング協会　http://www.jdla.org/business/certificate/

##認定プログラム比較①
上の①から⑤までのプログラム認定会社を比較してみました。
・・・が、②と④については、ほとんど情報が得られませんでした。
ですので、①・③・⑤の３社を比較することにします。

|             |①現場で使えるディープラーニング基礎講座|③現場で潰しが効くディープラーニング講座|⑤AIジョブカレ ディープラーニング講座|
|:------------|:---------------|:-----------------|:---------------|
|運　営         |スキルアップAI株式会社|株式会社ナトフ|エッジコンサルティング株式会社|
|オフライン(座学)|　　　○ |　　　○|　　　○|
|オンライン|　　　○ |　　　○|　　　○|
|質問対応|　　　○|　　　○|　　　○|
|受講生募集|　募集中|　募集中|　募集中|
|座学開催地|東京・名古屋・大阪|東京・大阪|東京・大阪・福岡|
|説明会|○　https://www.skillupai.com/deep-learning|○　http://study-ai.com/jdla/|　× 記述無
|

##認定プログラムの比較表②
受講期間や受講費用に関して、応用数学や機械学習を受講する・しない場合を選択するにあたって、調べてみたらなかなか難解だったので、別表でまとめてみました。
<img width="756" alt="JDLA_Ｅ資格比較表.png" src="https://qiita-image-store.s3.amazonaws.com/0/303168/70d9f8ef-214e-a140-4947-b2c0b9dce0ac.png">
##感想
まとめてみて思ったことは次のとおり。
・ディープラーニングのみの講座だけで良いレベルの人は安く済む。
・応用数学や機械学習の講座も受けなければならない人は金額が跳ね上がる場合があるので要注意。
・どの講座も、シラバスに準拠していて協会から認定されているため、それぞれの内容にそこまで大差はない、はず。
・講師陣に関して、どの講師も優秀な経歴や実績をもった方がいる中、③現座で潰しが効くディープラーニング講座の講師にkaggle masterの称号を持っている人がいるのには驚いた。そういう人に教えてもらえるのは今後にプラスになるかもしれない。
※kaggleについて調べる　[kaggle](https://ja.wikipedia.org/wiki/Kaggle)( Wikipedia)

日本初という、ディープラーニング資格のＥ資格試験も９月２９日に終わり合格通知も出ている頃だし、各社の結果を知りたいものです。
MacでGoの環境構築

# [WIP] MacでGo 1.11の環境構築

たぶんこれでイケるはず(｀・ω・´)

## 確認した環境

* macOS High Sierra 10.13.6
* Homebrew 1.7.7

## Go周りの初期インストール

* Goのインストール

```bash
$ brew install go
$ go version
go version go1.11.1 darwin/amd64
```


* Pathの設定

```bash
$ mkdir $HOME/go
$ echo 'export GOPATH=$(go env GOPATH)' >> ~/.bash_profile
$ echo 'export PATH=$PATH:$(go env GOPATH)/bin' >> ~/.bash_profile
$ source ~/.bash_profile
```


* Pathの確認

```bash
$ go env GOPATH
/Users/[自分のPCユーザ名]/go
$ go env GOROOT
/usr/local/Cellar/go/1.11.1/libexec
```

* 自分のgithubユーザのディレクトリを作成

```bash
$ mkdir -p $GOPATH/src/github.com/[githubのユーザ名]

例) mkdir -p $GOPATH/src/github.com/yukinagae
```

## vscodeの設定

[Visual Studio Code](https://code.visualstudio.com)をインストールし, 以下のgo拡張をインストールする.

* [Go - Visual Studio Marketplace](https://marketplace.visualstudio.com/items?itemName=ms-vscode.Go)
Kurento Media Serverのインストール

## 概要

Ubuntu 16.04にKurento Media Server (6.7.1)をインストールする。
Ubuntuのセットアップ方法は[こちら](https://qiita.com/Otama75/items/0a77dc9da389227d1a00)。
参考URL: http://doc-kurento.readthedocs.io/en/stable/user/installation.html

## インストールの準備

環境変数`DISTRO`を設定する。(.bashrcに書く必要はないのかもしれない。)

```console
$ echo 'export DISTRO="xenial"' >> ~/.bashrc
$ source ~/.bashrc
```

Kurentoリポジトリの追加

```console
$ sudo apt-key adv --keyserver keyserver.ubuntu.com --recv-keys 5AFA7A83
```

```console
$ sudo tee "/etc/apt/sources.list.d/kurento.list" >/dev/null <<EOF
# Kurento Media Server - Release packages
deb [arch=amd64] http://ubuntu.openvidu.io/6.7.1 $DISTRO kms6
EOF
```

## インストール

Kurento Media Serverのインストール

```console
$ sudo apt-get update
$ sudo apt-get install -y kurento-media-server
```

Kurento Media Serverの起動と停止コマンド

```console
$ sudo service kurento-media-server start
$ sudo service kurento-media-server stop
```


Kurento Media Serverの起動の確認

```console
$ ps -ef | grep kurento-media-server
kurento   3843     1  6 21:15 ?        00:00:00 /usr/bin/kurento-media-server
```

## Tutorialのインストールと実行

Homeディレクトリの下にkmsフォルダを作成し、そこにJAVA版チュートリアルをインストールする。

```console
$ cd ~
$ mkdir kms
$ cd kms
$ git clone https://github.com/Kurento/kurento-tutorial-java.git
```

Hello Worldサンプルアプリケーションを動かす。Hello Worldでは、ブラウザから送信したカメラ画像をKurento Serverでループバックし、元のブラウザに表示する。このとき、Kurento Media Serverが起動していること。


```console
$ cd kurento-tutorial-java/kurento-hello-world
$ git checkout 6.7.1
$ mvn clean compile exec:java -Dkms.url=ws://localhost:8888/kurento
```

Chromeブラウザから、サーバにアクセス。

```
https://<host_ip>:8443/
```

「この接続ではプライバシーが保護されません」が出たら、[詳細設定] → [(host_ip) にアクセスする（安全ではありません）]  → 緑の[Start]ボタンを押す → カメラとマイクの使用を[許可]する。

ここで下図のようにLocal と Remoteにカメラ画像が表示されたらOK。
<img width="1357" alt="1_hello.png" src="https://qiita-image-store.s3.amazonaws.com/0/189951/9b58253d-bb28-ad3d-d539-69c2ad76d8cc.png">

続いて、OpenCVフィルタのサンプルアプリであるMagic Mirrorを動作させてみる。

```console
$ cd ~kms/kurento-tutorial-java/kurento-magic-mirror
$ mvn clean compile exec:java -Dkms.url=ws://localhost:8888/kurento
```

Chromeブラウザから、サーバにアクセス。

```
https://<host_ip>:8443/
```

うまくいけば、ループバックの画像の人物に赤い帽子が乗る。

<img width="1364" alt="2_magic_mirror.png" src="https://qiita-image-store.s3.amazonaws.com/0/189951/133829dc-dd97-d441-efa6-c074fec35f1f.png">

インストールは、以上。
【cakephp3】複数のmodelを呼び出す

#動作環境
PHP 5.6
cakephp3

#内容
毎回「$this->loadModel();」をコピペして書くのが面倒だなーと思って少しでも省略できないかと思って出来たのこれです。
難しくもなく簡単に出来てちょっとでも面倒を感じた人は是非活用してみてください。


```Controller.php
    public function initialize() {
        parent::initialize();

        $tebles = [
            "Test",
            "Hoge",
        ];
        foreach ($tebles as $teble) $this->loadModel($teble);
    }

```

もしくはAppControllerに下記のように追加して各controllerで呼び出して使うのもよさげです。

```AppController.php

    public function loadModels($tebles) {
        foreach ($tebles as $teble) $this->loadModel($teble);
    }

```

## 追記
よくよく下の内容について考えていましたら、上の内容で十分だなと思いました。
一応、一つの考え方として残しておきます。
ReactもTSも全然わからん状態からReact NativeをTypeScriptでやる[HelloWorld編]

前回[ReactもTSも全然わからん状態からReact NativeをTypeScriptでやる[環境構築編]](https://qiita.com/sabineko/items/db3772dd7cb1596696db)に引き続き、iOSシミュレータで確認しながら進めていきます。

## とりあえずTypeScriptっぽいことしたい！
というわけでまずはTypeScriptの特徴である型を使ったサンプルを書いてみます。
前回の記事で作った「App.tsx」に変更を加えます。

### アクセス修飾子と型情報
JavaScriptに無くてTypeScriptにある特徴の一つに、アクセス修飾子があります。
オブジェクト指向とかアクセス修飾子についてはここでは詳しく書かないのでググってください。（タイトルに「ReactNativeとTypeScript全然わからん」とは書いたけど「プログラミング全然わからん」とは書いてない）

TypeScriptで型付きの、例えばstring型変数はこう書きます。
``` private tsText: string = " &TypeScript"; ```
これで、tsTextというstring型の変数に" &TypeScript"という文字列を入れたことになります。

App.tsxファイルのこの部分に追記しました。

```tsx
...
type Props = {};
export default class App extends Component<Props> {
  private tsText: string = " &TypeScript"; // 追加
  render() {
...
```

## ReactNativeで表示する

そしたら、このtsTextという変数をReactNativeで呼び出して、画面に表示したいと思います。

元々あった

```js

<Text style={styles.welcome}>Welcome to React Native!</Text>
```
この部分を、以下のように改変します。

```js

<Text style={styles.welcome}>Welcome to React Native{this.tsText}!</Text>
```
{this.tsText}というのを付け足しました。


そしてiOSシミュレータをCommand+Rでリロードすると……
<img width="395" alt="スクリーンショット 2018-10-16 10.06.53.png" src="https://qiita-image-store.s3.amazonaws.com/0/231072/6facb15a-fca6-4822-a96a-79d2f1586b8c.png">

tsTextに代入した「&TypeScript」という文字が表示されました！

ちなみに当然ですが、JavaScriptに型やアクセス修飾子はないので、この状態でApp.tsxをApp.jsにリネームするとエラーになります。
あとこれも当然なのですが、{this.tsText = 3}のように文字列以外の要素を代入しようとするとエディタがエラーを出してくれるのでわかりやすくなります。これでやっとTypeScriptの恩恵が得られるようになりました。

これでReactNativeをTypeScriptで書く環境は完成です。あとはReactNativeやTypeScriptの資料を見ながら必要なパーツを付け足したりして画面を作っていきます。
Vue.js の @input がEdgeで効かない問題の解決法

## 題材

![Screen Shot 2018-10-16 at 11.53.11.png](https://qiita-image-store.s3.amazonaws.com/0/109241/9c933843-cfdc-45e6-8f9d-991e0f83431e.png)

セレクトボックスを選択すると `@input` で検知して、下にタグっぽく増えるような実装をしていた。
が、Edge では動かない。

## 対処法
`@change` にすると変更を検知してくれるようになった。
MacBook ProでLaraDockを使ったLaravelのローカル開発環境構築手順

# 本稿の目的 & 前置き

今更感が半端ないが、会社のPCを買い換えた関係でイチから開発環境を構築しなくてはいけなくなった。そのため、今まで愛用していたHomesteadから本格的にLaradockに乗り換えようと思い試してみたのでまとめてみました。

以下の環境でLaraDockを使ったLaravelのローカル環境構築をしていきます。

macOS High Sierra
MacBook Pro (13-inch, 2017, Two Thunderbolt 3 ports)

# インストール手順

## Docker

すでにインストール済みなら飛ばして構わないです。
インストールしたのは**Docker Community Edition**の**Version 18.06.1-ce**です。

[Dockerの公式](https://www.docker.com/get-started)からDockerをダウンロードします。ダウンロードする際にDockerアカウントを作成します。ダウンロードしてきたdmgを使ってインストールしたあと、とりあえず起動。作成したDockerアカウントでログインが求められるので言われるままにログイン。するとDockerが起動します。
<img width="302" alt="スクリーンショット 2018-10-15 15.44.12.png" src="https://qiita-image-store.s3.amazonaws.com/0/69727/e2ab3179-bd8e-1c70-6db5-50fb5bce9583.png">

一番左のクジラのマークがDockerです。

## LaraDock

git cloneしてから起動します。ディレクトリ名はlaradockにしてますが好みでどうぞ。

```
$ git clone https://github.com/laradock/laradock.git laradock
$ cd laradock
$ cp env-example .env
$ docker-compose up -d nginx mysql workspace
```

コンテナ起動する前にenv-exampleをコピーして.envファイルを作成してます。初回起動時は色々インストールが行われるのでそこそこ時間がかかります。

## Laravel

立ち上がったらworkspaceに入ってLaravelプロジェクトを作成。プロジェクト名はlaravelにしときましたが、お好みでどうぞ。

```
$ docker-compose exec workspace bash

root@7f1a2086b457:/var/www# composer create-project laravel/laravel laravel
```

Laravelプロジェクト作成時にcomposerインストールが行われるのでそこそこ時間はかかります。終わったらexitしてworkspaceから一回抜け、コンテナを停止。

```
root@7f1a2086b457:/var/www# exit

$ docker-compose stop
```

その後、Laradockのenvファイル（`cp env-example .env`で作ったもの）を編集します。

```.env

APP_CODE_PATH_HOST=../
　　　　　　　　　　　　　↓
APP_CODE_PATH_HOST=../laravel
```

laravelの箇所は作成したLaravelプロジェクト名です。

.envファイルの修正が終わったらコンテナを再起動します。

```
$ docker-compose up -d nginx mysql 
```

起動したらhttp://localhost にアクセスすると、Laravelのいつものあの画面が表示されます。


## その他

+ 別途、laravel配下のenvファイルの編集が必要
+ laravelプロジェクトはホストコンピュータのlaradock(git cloneしたディレクトリ)と同じ階層にできます。

# 終わりに

間違いあったら指摘おなしゃーす。
Qiita-vim作業用Todo list

gitレポに入れるのもどうかと思いローカルにしか置いていなかったのですが、一応共有しておきます。
Todoとfeatureと混ざっていますがメモなので...

---

support twitter/gist flags @write_item
better text for error message
url_name変数名再考-JSON内の該当する値は`id`に変更されています
更新時通知のon/off
更新時メッセージの追加
更新時tweetvimやtwitvimと連携しtweet
`\\`等で更新
item.deleteのログが雑なので治す
オムニ補完で他記事出す...?
~~/api/v2/tags/:tag_idエンドポイントは使わないのか？~~ done
https://qiita.com/api/v2/schemaからスキーマ解析する
ページネーション対応
~~rate_limit()で取得していたのはLimitの最大値なのか、それとも残り回数なのかを聞く~~ done
createApiWithAuthは削除されました
~~`let user['item_count'] = res['items']` これの意味を聞く。多分*投稿の数*だとは思うのだが、他の意味を持っていたら困るので。~~ done
Herokuで環境を複製する

※heroku forkはdeprecatedです。より良い方法があれば教えてください。

基本は以下の記事を参考に進めるが、forkがdeprecatedなのでうまくいかない部分がある。
[Heroku で既存の本番環境をコピーしてステージング環境を作る](https://qiita.com/ken_c_lo/items/32998d9dd79a15b75c14)

### forkは実行する前にインストールが必要
forkコマンドを打っても、そんなものは無いと怒られる。

```
 »   Warning: fork is not a heroku command.
Did you mean lock? [y/n]:
```

forkする前に以下を実行。（[参考](https://github.com/heroku/heroku-fork)）

```
heroku plugins:install heroku-fork
```

その後に以下でforkはうまくいく。

```
heroku fork --from my-production-app --to my-development-app
```

### 複製した環境にgit pushできない場合
僕の環境では、git pushに失敗した。

```
git push xxx master
Permission denied (publickey).
fatal: Could not read from remote repository.
```

その場合は、SSH Keyを追加することで成功した。
（事前に`heroku keys`でキーがあったのかは未確認）

```
heroku keys:add
Could not find an existing SSH key at ~\.ssh\id_rsa.pub
? Would you like to generate a new one? Yes
```

### 気にしていること
heroku forkで環境の複製ってとても有用だと思うのだけど、deprecatedになった今、他の方々はどのようにやっているのだろう？

[2018/10/16追記]
heroku forkでデータも複製されると思っていましたが、少なくともJawsDBでは複製されませんでした。postgresは、`--skip-pg`というオプションがあるので、できるのかもしれません。（未確認）