OmniAICreator/Qiita-1.07M huggingface dataset:
jqチートシート

# ほしい要素だけ抜き出す

```sh
jq '{name, description}'
```

# 指定した複数の要素をスペース区切りの文字列として出力する

```sh
jq -r '"\(.id_str) \(.text)"' < file
```


# 文字列のエスケープを解除して出力する

- `-r`オプションを使う

```shell-session:エスケープされたまま
$ echo '{"key": "value\n\"aaaa\""}' | jq .key
"value\n\"aaaa\""
```

```shell-session:エスケープ解除
$ echo '{"key": "value\n\"aaaa\""}' | jq -r .key
value
"aaaa"
```

# 素の文字列を1行ずつJSON文字列にエスケープする

- `-R`を使う

```shell-session
$ printf '"aaa\nbbb cccc\tdddd' | jq -R
"\"aaa"
"bbb cccc\tdddd"
```

# 複数行の素の文字列を1つのJSON文字列にエスケープする

- `-R`と`--slurp`を使う

```shell-session:元の文字列
$ printf '"aaa\nbbb cccc\tdddd'
"aaa
bbb cccc	dddd
```

```shell-session:JSON文字列としてエスケープ
$ printf '"aaa\nbbb cccc\tdddd' | jq -R --slurp
"\"aaa\nbbb cccc\tdddd"
```

# 文字列に改行が含まれているJSONを扱う

例として以下のようなJSONがあったとします。

```json:tweet.json
{
  "text": "遅れた！今描いた。\n\n#key\n#Kanon\n#水瀬名雪誕生祭\n#水瀬名雪誕生祭2019\n#12月23日は水瀬名雪の誕生日 https://t.co/zOGPbmBkwI",
  "id_str": "1209146623982366720",
  "source": "<a href=\"http://twitter.com/#!/download/ipad\" rel=\"nofollow\">Twitter for iPad</a>",
  "created_at": "Mon Dec 23 16:19:54 +0000 2019",
}
```

ほしい要素は`text`と`id_str`です。
安直に、`jq -r '"\(.id_str) \(.text)"'`とやると、

```shell-session
$ cat tweet.json | jq -r '"\(.id_str) \(.text)"'
1209146623982366720 遅れた！今描いた。

#key
#Kanon
#水瀬名雪誕生祭
#水瀬名雪誕生祭2019
#12月23日は水瀬名雪の誕生日 https://t.co/zOGPbmBkwI
```

このように`\n`がunescapeされてしまうので改行がはいってしまいます。

そこで、`text`に含まれる`\n`を`\x1f`に置き換えることにしました。

```sh:repnl.sh
#!/bin/sh

RS="$(printf '\x1e')"
US="$(printf '\x1f')"

cat tweet.json                        |
jq -r '"\(.id_str) \(.text)'${RS}'"'  | # text の末尾にRSをつける
tr '\n' ${US}                         | # \n をUSで置換する
sed 's/'${RS}${US}'/'${RS}'/g'        | # RSとUSが連続している箇所をRSで置換する
tr -d '\n'                            | # grepが出力した末尾の \n を除去する
tr ${RS} '\n'                           # RSを \n で置換する

```

実行するとこんな感じになる。

```shell-session
$ ./repln.sh < tweet.json 
1209146623982366720 遅れた！今描いた。#key#Kanon#水瀬名雪誕生祭#水瀬名雪誕生祭2019#12月23日は水瀬名雪の誕生日 https://t.co/zOGPbmBkwI
```

`text`の内部の改行が単純に削除されているように見えるが、[byte2hex](https://qiita.com/miminashi/items/13ab0f09a4b3b67edc29)（odとかでもよい）を使って1バイトずつ見てみると、`1f`というバイトが6個あるのがわかる。

```shell-session
$ ./repln.sh < tweet.json | byte2hex
.
.
.
81
9f
e3
80
82
1f  <-
1f  <-
23
6b
65
79
1f  <-
23
4b
61
6e
6f
6e
.
.
.
```

`\x1f`で置換した改行は`tr $(printf '\x1f') '\n'`で元の改行に戻せるので、例えばこんな感じで再利用ができる。

```shell_session:textの中の各行の先頭にidを付加する
$ ./repln.sh < tweet.json | while read -r l; do id="$(echo "${l}" | cut -d ' ' -f 1)"; echo "${l}" | cut -d ' ' -f 2 | tr $(printf '\x1f') '\n' | sed 's/^/'${id}' /'; done
1209146623982366720 遅れた！今描いた。
1209146623982366720 
1209146623982366720 #key
1209146623982366720 #Kanon
1209146623982366720 #水瀬名雪誕生祭
1209146623982366720 #水瀬名雪誕生祭2019
1209146623982366720 #12月23日は水瀬名雪の誕生日
```


# 条件にマッチした行だけ抽出する

## 文字列が一致

```sh
jq 'select(.id_str == "1213800636321390593")'
```

## nullでないもの

```sh
jq 'select(.entities.media != null)'
```


# 配列を個々のオブジェクトに展開する

```sh
cat user_timeline.json | jq .[]
```

# 1オブジェクト1行で表示する

```sh
cat user_timeline.json | jq -c .[]
```


# 要素を追加する

```sh
jq --arg type "default" '. + {"type": $type}'
```
Laravueの勉強会に参加してきたのでその備忘録

# はじめに
https://laravue.connpass.com/event/92231/
友人に誘われ、`Laravel/Vue.js勉強会#6`お邪魔させていただいたので個人的な忘備録を作成。
本日の登壇者のみなさん本当にありがとうございました！

# 講演内容
## スポンサー枠
キーワード: `vue-tour`, `チュートリアル`
vue-tourを活用したチュートリアル画面の作成についての発表でした。
https://github.com/pulsardev/vue-tour
vue-tourで簡単にチップツール的なUIを構築でき、そこにアンカーリンクを張ることでツアーを実現できるという内容で、setIntervalを組み合わせれば自動再生も実現していました。

GitHubみた感じ、コードの記載量も少なくお手軽な感じなので一度触ってみようかな。

## 登壇1
キーワード: `Laravel Nova`, `Nuxt.js`, `Cloud Fornt`, `S3 Origin`, `WAF`
https://slides.com/kotamatsumoto/nuxt-generate-laravel-nova/#/
「Nuxt generate Laravel Nova on AWSが綺麗にハマった話」という事で、Laravueでのアーキテクチャ全般のお話。
Front側のエラー制御を、CloudFront, S3 Originを組み合わせて実現し、NovaにWFAでのアクセス制限を実施した場合も、Front側のエラー制御と処理を統合出来たという認識（合ってるか不安）

S3 originで 存在しないリソースにアクセスした場合でも`403`が返るのは、`404`だと存在しないリソースだと判断され、攻撃の軸にされるというのは、今後何かで活かす機会がありそう。
昔、`401`エラーだとメソッド違いが存在すると推察されるから、`404`で返すとした事があったけど、`403`にするという手もあるのか...
どっちが良いか今度検討してみる。
`Laravel Nova`は有償との事なので、話題に少しだけ上がった`Laravel Admin`を触ってみようかな。
https://github.com/z-song/laravel-admin

## 登壇2
キーワード: `Storybook`, `Netlify`, `reg-suit`, `画像回帰テスト`, `OOP`
「俺の最強Vue.js環境」というテーマでの発表でした。
https://slides.com/k-okina/vuejs-oop#/8
https://github.com/storybooks/storybook
https://reg-viz.github.io/reg-suit/
https://github.com/k-okina/book-management

とても濃密な内容で、理解しきれていないけれども、Storybookを活用しつつ、reg-suit使って、画像回帰テストを実現して、デザインに関してもレビューできるようにしたよ。って事と、Vue.js+OOPでクリーンアーキテクチャ実現したよ。って2本が大筋だったと理解。

どちらも内容を把握しきれていないので、`reg-suit`, `クリーンアーキテクチャ`について、調べてみる。

## LT1
キーワード: `vue.js`, `GAOGAO`
「営業から転身（3ヶ月目）でVueでアプリ作った」というテーマの発表。
技術的な話題というより、メンタルの話だったけれども、まぁとにかくすごい。
何かに、手を付けては挫折を繰り返しているという性格なので、`期間内で動くものを作る`というスタンスを実現できている事に感服しました。
この人は、凄い成長する。負けないようにアンテナ伸ばして手を動かさないと...

## LT2
キーワード: `Electron`, `Vue.js`
「Electron + Vue.js でデスクトップアプリが作る」というテーマの発表。
https://github.com/bdero/electron-vue-typescript-starter
ここから簡単に作れる！ただし、Windowsのビルドと本番のビルドは注意が必要という内容
Electronでのアプリ開発に関してそもそも知見が無いので、思ったより簡単に実装できる事に驚愕。

テンプレートの使い方が分かれば、何かの役に立つかもしれないという内容でした。

# まとめ
久しぶりに勉強会に参加しましたが、凄く刺激になりました。
まだまだ、Vue.js初心者なので、面白いものが作れるように勉強します！
あぁ、こんな時間だよ寝ないと。
ホストの環境変数を Docker Compose を使ってコンテナ内に引き継ぐ方法

引き継ぎたい環境変数名を書くだけでホストの環境変数をコンテナ内に引き継ぐことができます。
以下は、docker-composeの例です。

```docker
version: '3'
services:
    mysql:
        build: mysql
        ports:
            - "3306:3306"
            restart: always
        environment:
            - PATH        # export PATH=aiueo などをホストでしたもの
```


#参考
https://docs.docker.com/compose/environment-variables/#pass-environment-variables-to-containers
https://www.kimullaa.com/entry/2018/03/17/130014
Jupyter上で使用するGPUを指定する最適解

皆さん、DNNしてますか？
私は~~お金もないので~~共用サーバのGPUを使ってプログラムを動かしています。
ですが共用サーバ上でJupyterを利用するとき、私はいつも不安を抱えていました。
というのも、Jupyter上でTensorflowを実行すると基本的に全GPUを食い尽くしてしまうからです。
共用サーバでこんなことをすると周りの目が怖いので、各自使用するGPUを指定するのですが、その設定は若干面倒です。

通常のプログラムを実行するときは

```bash
export CUDA_VISIBLE_DEVICES=0 #GPU一つ利用
export CUDA_VISIBLE_DEVICES=0,1,2 #GPU複数利用
```
でいいのですが、Jupyter上で

```bash
!export CUDA_VISIBLE_DEVICES=0
```

としてもGPUをすべて使ってしまいます。これは内部の環境変数をJupyter上で設定できないからかと思われます。
かといってプログラム内部で使用するGPUを指定する場合、利用するフレームワークにより記述方法が異なります。

簡単にフレームワークごとのGPU指定方法をまとめると、

- Tensorflow
  - tf.session内にてconfigを定義する。

```python
import keras
import tensorflow as tf
tf.Session(config=tf.ConfigProto(device_count = {'GPU': 0}))
```
- Keras
  - Tensorflowと同様。ただしtensorflow_backendで上記コードをwrapする必要あり。
- PyTorch
  - 基本的にはCPUモードでdeviceに指定したGPUがあるときはそれを使う仕様。
  - また変数の指定の際にもGPUを指定する必要あり。


```python
device = torch.device("cuda" if torch.cuda.is_available() else "cpu")
```

となってしまい、フレームワークごとに覚えることも多く非常に面倒です。

## Jupyter上でGPUを指定

Jupyter上でも環境変数を設定することで使用するGPUを指定できます。
やり方は非常に単純で、最初のセルにて下記のコードを実行すれば完了です。

```python
import os
os.environ["CUDA_VISIBLE_DEVICES"]="0"
```

これだけ覚えていれば、今後サーバ上のGPUを食い尽くして嫌な目で見られることもなくなりますね！
ボタンによるレベル遷移


前回の記事ではタイトル画面を作成しました。
しかしタイトル画面だけではもちろんゲームとして成り立っていないのでタイトルからゲームモードへの移行について説明します。


##今回できること
- ボタンによってのレベル遷移


#ボタンの設置
前回作成したウィジェットブループリントを開きます。パレットから”Button”をCanvasPanelへとドラッグ&ドロップします。
次に”Text”をButtonにドラッグ＆ドロップします。これは子ウィジェットにする作業~~（正式名称は知らない）~~
今までの背景画像のImageやタイトル文字のTextはCanvasPanelの子ウィジェットとして設定していたというわけです。

それでは好きなところに設置してサイズなど適当にいじってみましょう、ボタン内のテキストは「START」とします。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/315086/b1c7c575-a060-5b53-8772-5fb633eed102.png)



##仮ステージの設置
それではSTARTボタンを押した際に遷移するレベルを先に作っておきましょう。
左上のファイルから新規レベル作成で”空のレベル”を選択し保存、名前は「MainGame」にしました。
レベルに遷移したことをわかりやすくするために前回の記事同様に新しいウィジェットブループリントを作成し、画像を設置します。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/315086/251c37e5-c666-d2f3-e279-80e8933f3838.png)
↑こんな風に

その後レベルブループリントでウィジェットの表示を設定し完了です。



#レベル遷移
タイトル画面のウィジェットブループリントを開きます。
Buttonを選択し、画面の右側にある詳細の下の方にある”イベント”にある”On Clicked”の＋ボタンを押下します。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/315086/0e042fde-9843-20b8-553f-7b255a14ad4d.png)

すると自動的にイベントグラフ画面に移動したと思いますのでそのまま作業を続けます。
出力ピンから伸ばし、”Open Level”を選択、Lebel Nameを前の工程で作った仮ステージに設定します。ここでは「MainGame」です。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/315086/2c312174-fdec-5993-13f8-15f251afe7dc.png)


実際にプレイし、確認してみましょう。　
このようにボタンに対してイベントを設定しOpen Lebelによってレベルを開きます。

これで今回の作業は終わりです、お疲れさまでした。


##その他イベントについての余談
On ClickedのほかにOn PressedやOn Hoveredなど色々あったと思います。
それらの挙動について説明しましょう。

On Clicked　→　対象をクリックし離した際にイベント発生。しかし対象の範囲外へとカーソルを移動してから離した際は発生しない。　

On Pressed　→　対象をクリックした瞬間にイベント発生。

On Released　→　対象をクリックし離した際にイベント発生。対象の範囲外へカーソルを離してもイベントは発生します。

On Hovered　→　対象にカーソルを合わせた際にイベント発生。

On Unhoverd　→　対象にカーソルを合わせてから、範囲外へ出たときにイベント発生。


それぞれ場面に合わせてうまく使えるといいですね。
Amazon EC2のDockerコンテナで実行しているアプリが停止していた

# 前提

監視するほどのものでもなかったので特にCloudWatch等での監視は行っていない。

# 気づき

rsyslog・httpd・nginx・mysqld・php-fpm・memcached等はsystemdでの自動起動の設定の一般的ですが、Dockerコンテナの癖はついていなかった。
監視するほどのものでもなくてもDockerでアプリケーションを作る場合はコンテナ自体の自動起動の設定は必要。

# 事象

ある日アプリケーションが停止していた。

Dockerのコンテナを見たら停止していた。

システムログ

```
# view /var/log/messages
```

容量等も問題なかった。

[Dockerのlog](http://docs.docker.jp/engine/admin/logging/journald.html)も問題なかった。

直近のreboot

```
# last reboot
```

何故かrebootが行われていた。

AWSマネジメントコンソールでインスタンスの完了したイベントを確認してみると、rebootが行われた時間にsystem-rebootがスケジュールされていた。

AWSで勝手にインスタンスが再起動されていた様子。

監視するリソースが無いので、Dockerコンテナが自動起動するようにしなければいけない。

# Dockerコンテナの自動起動を設定する

動作確認はローカル環境にAmazonLinux2を作成して確認を行った。

[Amazon Linuxのローカル環境を作成する](https://qiita.com/horikeso/items/cc3d628069421e11d7ab)

[Running Docker Containers with Systemd](https://container-solutions.com/running-docker-containers-with-systemd/)

```
vi /etc/systemd/system/docker.app.service
```

```:/etc/systemd/system/docker.app.service
[Unit]
Description=App Container
After=docker.service
Requires=docker.service

[Service]
Restart=always
ExecStart=-/usr/bin/docker start app

[Install]
WantedBy=multi-user.target
```

```
# systemctl enable docker.app.service

Created symlink from /etc/systemd/system/multi-user.target.wants/docker.app.service to /etc/systemd/system/docker.app.service.
```

これを設定後rebootするとappコンテナが起動していたのでとりあえずこれでOK。

disableにしたらコンテナが起動しないことも確認してみた。

```
# systemctl disable docker.app.service

Removed symlink /etc/systemd/system/multi-user.target.wants/docker.app.service.
```

当然ですが、rebootするとappコンテナは起動しない。
メルカリに学ぶ。ユーザー売上金の支払額を下げる、支払いを遅延させるサービス設計。アプリのUI/UXデザイン。

これは批判記事ではない。

# 売上金は自動支払ではなく、ユーザーの申請が必要。

ユーザーが商品を売り上げても、自動的に支払いがおこなわれるわけではない。毎回の申請が必要。

自分でメルカリを使っていても、商品を売れただけで満足して、うっかり忘れそうになる場合があった。

Amazonなど他のサービス、一般的なサービスがほぼ自動振込なことも、盲点になっていると思う。

# ユーザーが支払額を入力する必要がある。

たとえば12700円の売上金が溜まっているとして、満額を受け取りたい場合は「12700」と入力する必要がある。

僕なら必ず「満額を受け取りたい」と思うのだけれど。人によっては「10000円ちょうど受け取りたい」と思うかも知れない。

# 銀行振込に「お急ぎ便」がある。

急ぎでお金が欲しい人は、200円を払う必要がある。

ここで実質的にユーザーへの支払額を下げることが出来る。

いわゆる人間心理をついた設計になっている。今日の9800円は明日の10000円よりも尊い。

# 偶然？

まさか。

これが偶然だとしたら、メルカリのサービス設計者はただの天才だ。








<!-- Update From Qiita API -->

# チャットメンバー募集


何か質問、悩み事、相談などあればLINEオープンチャットもご利用ください。

https://line.me/ti/g2/eEPltQ6Tzh3pYAZV8JXKZqc7PJ6L0rpm573dcQ





# Twitter


https://twitter.com/YumaInaura


<!-- Update From Qiita API -->
NLPのタスクを紹介するだけの簡単なページ(5) ~MRPC編~

# MRPC ってなんぞ？
　**MRPC** とは **Microsoft Research Paraphrase Corpus** の略で、簡潔に言えば **文章の等価性を** 評価するためのタスクです。

　最近話題の BERT もこのタスクに取り組んでおり、2018年11月でSOTAの地位を手にしています。

# このタスクの特徴は？
　[QQP]() にも似ている気がしますが、ここで主に議論しているのは Web上のニュースで使われていた文章です。また [STS]() とは違って 0/1 の2値を取ります。

# 具体的なデータは？
　データは **文章1** と **文章2** とそれらが意味的に等しいかを示す **2値ラベル** があります。
　
　具体例を以下に示します。

```text:文章1
田中くんは昨日国際会議で発表をした。
```

```text:文章2
昨日国際会議でスピーチをしたのは田中くんでした。
```

```text:ラベル
1 (一致している。)
```
　実際のMRPCに含まれるデータを紹介します。

```text:文章1
The spokeswoman said four soldiers were wounded in the attack, 
which took place just before noon around %%NUMBER%% km 
( %%NUMBER%% miles ) north of the capital Baghdad.

(その広報担当者は、正午過ぎに 首都バグダット北部の %%NUMBER%% キロマイル 付近で、4人の兵士が負傷したと述べた。)
```

```text:文章2
Two US soldiers were killed in a mortar attack 
near the Iraqi town of Samarra yesterday, 
a US military spokeswoman said.

(米軍の広報担当者は、昨日イラクのサマラ周辺の迫撃砲による攻撃によって二人の兵士が殺されたと報じた。)
```

```text:ラベル
0 (意味的に等価ではない。)
```

# どう活用できる？
　日本では例えばライブドアニュースの抽出処理なんかを行う際に使えそうですね。結構先例もありそうなので是非ともここで高いスコアが出ているアルゴリズムを用いて挑戦してみて下さい。

# 参考文献
Microsoft Research Paraphrase Corpus　https://www.microsoft.com/en-us/download/details.aspx?id=52398

# 他ページヘのリンク
[NLPのタスクを紹介するだけの簡単なページ(0)](https://qiita.com/MeguruMokke/items/1201b5fa05ad6ec5efb9)
[NLPのタスクを紹介するだけの簡単なページ(1) ~SQuAD編~]
(https://qiita.com/MeguruMokke/items/44720220d4fe9de3f804)
[NLPのタスクを紹介するだけの簡単なページ(2) ~CoLA編~](https://qiita.com/MeguruMokke/items/44a97158dd446d913c97)
[NLPのタスクを紹介するだけの簡単なページ(3) ~QQP編~](https://qiita.com/MeguruMokke/items/8b6ecd3c65755bda7cc0)
[NLPのタスクを紹介するだけの簡単なページ(4) ~STS編~](https://qiita.com/MeguruMokke/items/4248fcf51a5510a27b48)
[NLPのタスクを紹介するだけの簡単なページ(5) ~MRPC編~]
(https://qiita.com/MeguruMokke/items/962a76a3b6c9e4c99315)
Web開発経験のないインフラエンジニアがGithubでポートフォリオを公開した話

# 2020/06: 追記

現在はGitHub Pages から GitLab Pages に浮気して mkdocs というツールを使って自動デプロイしてます。
詳細は気が向いたら解説記事にします・・・

https://skokado.gitlab.io/portfolio/

# TL:DR
成果物: https://skokado.github.io/

![キャプチャ.PNG](https://qiita-image-store.s3.amazonaws.com/0/154711/592fae69-a079-9027-0d92-569c7e1742a1.png)

- 自作サーバを用意する必要なし、自ドメインも必要なし.
- Web開発の知識必要なし. 既に公開されているWebテンプレートを利用. 先人に感謝.
- URLは```https://[Githubユーザ名].github.io/```で公開される. 個人用だし全く問題ないね!!
- テンプレートダウンロード後に3ステップでオリジナルサイトが完成する.

素晴らしくないですか.

# 前提

自分は社会人6年目のインフラエンジニア.
昨今は転職が当たり前であり、将来転職をする前提でキャリアを考えておく必要があると考えてます.
ただ、今の会社に入社して早2年半. 職務経歴書やスキルセットの棚卸しを全くといっていいほどしてきませんでした.
良い機会なので、今風にWeb上でスキルシートを公開しようと思い至りました.

# Github Pages用のリポジトリ作成

丁寧な手順ページを[Githubが公開しています](https://pages.github.com/).
早い話 **[Githubユーザ名].github.io** という名前のリポジトリを作成するだけ.
私のGithubアカウントは「skokado」ですので、リポジトリ名は「skokado.github.io」です. そしてこれがそのまま公開URLのドメインになります.
![キャプチャ.PNG](https://qiita-image-store.s3.amazonaws.com/0/154711/c489d29e-a15c-2f07-f7cc-ffba2a4cb8d8.png)

# Webページの公開

さて、Github上でリポジトリを作るだけで専用ドメインにWebコンテンツをホストしてくれるわけですが 私はインフラエンジニア.
モダンなUIをサクっと作れるフロントエンドエンジニアでなければ サクっとWebアプリを作れるRuby/PHPエンジニアではありません.
しかし、Github pagesは親切にWebコンテンツのテンプレート(Theme)に誘導してくれました.
https://pages.github.com/themes/
![キャプチャ.PNG](https://qiita-image-store.s3.amazonaws.com/0/154711/de87cbda-dc22-606d-109e-28d0062d66ea.png)

そこまで細かく作りこみたいわけではないし、名前からも **Minimal** が気になったのでこれを選びました.
https://github.com/pages-themes/minimal
あとはこれをcloneして諸々編集するだけです.

### 1. _config.yml

```yml
title: Minimal theme
logo: /assets/img/logo.png
description: Minimal is a theme for GitHub Pages.
show_downloads: true
google_analytics:
theme: jekyll-theme-minimal
```
- title:
その名の通りページのタイトル名
- logo:

- description: ロゴ画像下の説明文.
- show_downloads: ロゴ画像下に, コンテンツをZIP形式などでダウンロードするためのボタンを表示するか否か. ダウンロードしたい意味が分からないのでfalseにした.

### 2. /assets/img/logo.jpg

ページ上部に大きく表示されるロゴ画像. ~~ここで2次元萌え絵を採用するかでその人のジャンルが分かるのではないだろうか~~
変更するなら```_config.yml``` と合わせてパスやファイル名も考慮すること.

### 3. index.md

ページ右側に表示される内容であるマークダウン形式のファイル.
ここがメインコンテンツなので充実させましょう.
draw.ioなんかで作成した構成図を貼り付けるのとか良いですよね.

# 以上!!

Web開発ができない者でもそれなりに見栄えするWebページを作れたと思います.
これだけです. 自作サーバもいらなければDNSの知識なんかも要りません. 
(github.ioのサブドメインですが)自分用ドメインでページを公開できます

というかポートフォリオのページをわざわざゼロから作る労力ってもったいないですよね.
Github様々.
Reactのstateで詰まったところをまとめてみた

## 目的
Reactを勉強するにあたってstateについて詰まったところがいくつかあり、自分の理解度の確認のため。また、これから学ぶ方の参考になればと思います。

###state
 - コンポーネントの状態を保持するオブジェクトのこと。


`profile1.js`と同じ内容をstateを使って書いたのが`profile2.js`になります。


```React:profile1.js

class App extends Component {
    render(){
        var viewText = "プロフィール";
        return (
            <div>
                <p>このページは{viewText}です。</p>
            </div>
        )
    }
}
```

```React:profile2.js
class App extends Component {
    constructor(props){
        super(props);
        this.state = { viewText : 'プロフィール' }
    }
    render(){
        return (
            <div>
                <p>このページは{ this.state.viewText }です。</p>
            </div>
        )
    }
}

```
`profile2.js`では、classにconstructor()メソッドを追加して、this.stateにオブジェクトとしてstateの初期値を定義します。ES6では、super()メソッドを呼び出すようにするのが決まりのようです。


###props
 - 親コンポーネントから子コンポーネントに渡される値のこと。
 
`profile2.js`ではviewTextというプロパティを持っています。


stateを使うことでpropsで流し込むことができるので、画面の(再)描画ができるようになります。
また、propsはプロパティとして渡した値しか影響は受けないため、複雑で巨大なコンポーネントでもそれぞれ独立に、安心して使うことができます。

## まとめ
正直、初めは変数で呼び出したほうが早いのに、、と思っていましたが、コンポーネントが複雑になり受け渡しがうまくいかなかった場合の対処が果てしないように思えましたし、それほどコードも読みにくくならないのでstate,propsを使って書いた方がいいと思いました。
まだまだ自分も知識が浅いので、もっと勉強して早くReactを使いこなせるようになります。
AtomにXdebugを導入する時に「PHP Warning:  Failed loading Zend extension 'ext\php_xdebug-2.6.1-7.2-vc15-x86_64.dll'」等と怒られたら

使用OSはWindows 10です。

# AtomにXdebugを導入する

導入手順については色んなサイトで説明されているので自分で調べてください(特にMacは情報も充実している)。

コマンドプロンプトに「php -i」と入力し、出てきた結果を[公式サイト](https://xdebug.org/wizard.php)でAnalyzeすると私の場合、

Instructions
1. Download php_xdebug-2.6.1-7.2-vc15-x86_64.dll
2. Move the downloaded file to ext
3. Edit C:\php\php.ini and add the line
　zend_extension = ext\php_xdebug-2.6.1-7.2-vc15-x86_64.dll

のような表示が出てきました。
指示通りにダウンロードして、ファイルをphp\extに移動させて、php.iniに「zend_extension = ext\php_xdebug-2.6.1-7.2-vc15-x86_64.dll」と追加しました。

# 「PHP Warning:  Failed loading Zend extension 'ext\php_xdebug-2.6.1-7.2-vc15-x86_64.dll'」等と怒られた

色んなサイトにあるように、コマンドプロンプトで「php -S localhost:9000」と入力してみると、

```
[Mon Nov 12 23:51:39 2018] PHP Warning:  Failed loading Zend extension 'ext\php_xdebug-2.6.1-7.2-vc15-x86_64.dll'
 (tried: ext\ext\php_xdebug-2.6.1-7.2-vc15-x86_64.dll (指定されたモジュ ールが見つかりません。),
 ext\php_ext\php_xdebug-2.6.1-7.2-vc15-x86_64.dll.dll (指定されたモジュールが見つかりません。)) in Unknown on line 0
```

のようなエラーが出ました。
また、Atomでも何か入力するたびに

```
[Linter] Error running PHP
See Console for more info. (Open View -> Developer -> Toggle Developer Tools)
```

と怒られるようになりました。

# php.iniにフルパスを入力しよう

上のInstructionsでphp.iniに「zend_extension = ext\php_xdebug-2.6.1-7.2-vc15-x86_64.dll」を追加しろと言われたわけですが、フルパスで「zend_extension = C:\php\ext\php_xdebug-2.6.1-7.2-vc15-x86_64.dll」と(私の場合)追加しました。

これでエラーは出なくなりました。
NLPのタスクを紹介するだけの簡単なページ(4) ~STS編~

# STS ってなんぞ？
　**STS** とは **Semantic Textual Similarity** の略で、簡潔に言えば **文章の等価性** を評価するためのタスクです。

　最近話題の BERT もこのタスクに取り組んでおり、2018年11月でSOTAの地位を手にしています。

# このタスクの特徴は？
　このタスクは **2つの文章の関係** を評価するタスクです。
　何処かで聞いたことがありますね？はい、[前回]() 紹介した **QQP** のタスクと非常に似ています。しかしこちらはそれよりもやや基準が緩いようです。どのように緩いかはデータの項で明らかになります。

# 具体的なデータは？
　データは、**文章1** と **文章2** とそれらの **類似度** である [0, 5]区間の **連続値** を取ります。

　具体例を以下に示します。

```text:文章1
大福美味しい。
```

```text:文章2
いちご大福大好き。
```

```text:類似度
4.0 (大きいほど似ている。)
```

　実際のSTSに含まれるデータを紹介します。

```text:文章1
a small bird sitting on a branch in winter. 
(冬の枝に止まっている小鳥)
```
```text:文章2
a small bird perched on an icy branch.
(凍った枝の上に止まっている小鳥)
```
```text:類似度
4.2 (相当似ている。)
```

# どう活用できる？
　QQPタスクよりも緩そうな感じですね。活用先としては、これを学習させた後に、**任意の文章に一致しているか** を調べるシステムが想定できます。
　これの良い点は、任意の文章が入ってくるシステムである特定のコンテキストの文章をとり出したいときに、**分類問題にしてしまうと不均衡なデータセット** となってしまう (そのコンテクストの文章とそれ以外の文章の存在比率を考えれば明らか) という問題を解決できるということです。

# 参考文献
Semantic textual similarity http://nlpprogress.com/english/semantic_textual_similarity.html
文の意味構成に伴う高次元空間の最適化と単語表現学習 http://www.anlp.jp/proceedings/annual_meeting/2014/pdf_dir/D6-3.pdf
Learning Semantic Textual Similarity from Conversations
 https://arxiv.org/pdf/1804.07754.pdf
 
# 他ページヘのリンク
[NLPのタスクを紹介するだけの簡単なページ(0)](https://qiita.com/MeguruMokke/items/1201b5fa05ad6ec5efb9)
[NLPのタスクを紹介するだけの簡単なページ(1) ~SQuAD編~]
(https://qiita.com/MeguruMokke/items/44720220d4fe9de3f804)
[NLPのタスクを紹介するだけの簡単なページ(2) ~CoLA編~](https://qiita.com/MeguruMokke/items/44a97158dd446d913c97)
[NLPのタスクを紹介するだけの簡単なページ(3) ~QQP編~](https://qiita.com/MeguruMokke/items/8b6ecd3c65755bda7cc0)
[NLPのタスクを紹介するだけの簡単なページ(4) ~STS編~](https://qiita.com/MeguruMokke/items/4248fcf51a5510a27b48)
[NLPのタスクを紹介するだけの簡単なページ(5) ~MRPC編~]
(https://qiita.com/MeguruMokke/items/962a76a3b6c9e4c99315)
fabric-tools 1.3.0の中身

# fabric-tools 1.3.0の中身

## dockerコンテナを起動

```
$ docker run -it hyperledger/fabric-tools bash
```

## ファイル構成を列挙

```
# tree /etc/hyperledger
/etc/hyperledger
`-- fabric
    |-- configtx.yaml
    |-- core.yaml
    |-- etcdraft
    |   |-- tls-client-1.pem
    |   `-- tls-server-1.pem
    |-- msp
    |   |-- admincerts
    |   |   `-- admincert.pem
    |   |-- cacerts
    |   |   `-- cacert.pem
    |   |-- config.yaml
    |   |-- keystore
    |   |   `-- key.pem
    |   |-- signcerts
    |   |   `-- peer.pem
    |   |-- tlscacerts
    |   |   `-- tlsroot.pem
    |   `-- tlsintermediatecerts
    |       `-- tlsintermediate.pem
    `-- orderer.yaml

9 directories, 12 files
```

```
# find / -name hyperledger
/etc/hyperledger
/var/hyperledger
```

```
# tree /usr/local/bin
/usr/local/bin
|-- configtxgen
|-- configtxlator
|-- cryptogen
|-- discover
|-- idemixgen
|-- node
|-- npm -> ../lib/node_modules/npm/bin/npm-cli.js
|-- npx -> ../lib/node_modules/npm/bin/npx-cli.js
`-- peer

0 directories, 9 files
```
Vue.js + Google Maps Apiで複数マーカーを設置していい感じに中央を表示させる

# はじめに

複数のマーカーを設置して、その中央を表示すると文字にしてもわかりにくいのですが下記のようなイメージです。

![スクリーンショット 2018-11-13 0.10.20.png](https://qiita-image-store.s3.amazonaws.com/0/81308/c1ae54f1-d7b1-c1b8-110a-c5bb6b281695.png)


[上記](https://www.holy-place-photo.com/anime/97991)は、3つの写真に紐づく緯度経度を元にマーカーを設置して

設置した3点のマーカーが地図に入るようにギリギリまで拡大し表示するようになってます。

# 前提

- Laravel version 5.6
- Google Maps Apiの登録済み

# 実装

## HTML

サーバーサイドはLaravelを利用しています。

データの受け渡しはVue.jsのカスタムディレクティブを利用します。

```html
<div id="map" v-photos="{{$photos}}"></div>
```

## JavaScript

カスタムディレクティブを利用し、データを受け取ります。

`mounted()`内で、Google Mapの初期化をします。

その後、緯度経度を元に`google.maps.Marker()`と`bounds.extend()`を利用してマーカーを設置します。

最後に`map.fitBounds()`を利用して、複数マーカーの中央をいい感じに表示させます。

```javascript

Vue.directive('photos', {
  bind: function (el, binding, vnode) {
    vnode.context.photos = binding.value;
  }
});

new Vue({
  el: '#wrapper',
  mounted() {
    this.map = new google.maps.Map(document.getElementById('map'));
    let bounds = new google.maps.LatLngBounds();
    for (let i = 0; i < this.photos.length; i++) {
      const marker = new google.maps.Marker({
        position: {
          lat: this.photos[i]['lat'],
          lng: this.photos[i]['lng']
        },
        map: this.map
      });
      bounds.extend(marker.position);
    }
    this.map.fitBounds(bounds);
  },
  data() {
    return {
      map: {},
      marker: null,
      photos: []
    }
  }
});
```

# 終わりに

`map.fitBounds()`を使うと少し引き気味になるのですが、これはGoogle Mapの拡大ボタンなどに被らないようにしてくれるからだそうです。

~~オフにしたい~~
NLPのタスクを紹介するだけの簡単なページ(3) ~QQP編~

# QQP ってなんぞ？
　**QQP** とは **The Quora Question Pairs** の略で、簡潔に言えば **質問文の等価性** を評価するためのタスクです。
　
　最近話題の **BERT** もこのタスクに取り組んでおり、2018年11月でSOTAの地位を手にしています。

# このタスクの特徴は？
　このタスクは **2つの文章の関係** を評価するタスクの中でも **質問文** にターゲットを絞ったタスクになっています。
　つまり平叙文を2つ用意してこれが等価ですか？という問題は扱っていません。

# 具体的なデータは？
　データは、**質問文1** と **質問文2** とそれらが等価であるかを示す **2値ラベル** (0 は等しくない・1 は等しい) をがあります。

　具体例を以下に示します。

```text:質問文1
あなたの名前を教えてもらえませんか？
```

```text:質問文2
あんた誰？
```

```text:ラベル
1 (等価である)
```

　実際のQQPに含まれるデータを紹介します。

```text:質問文1
How can increase the speed of my internet connection while using a VPN?
(VPN使っているんだけど、ネット回線をどうにか早くできない？)
```

```text:質問文2
How can Internet speed be increased by hacking through DNS?
(DNSハックしてネット回線早くしたいんだけどどうすれば良い？)
```

```text:ラベル
0 (等価ではない)
```

# どう活用できる？
　このタスクをちらっと見たとき、割と粗い精度で等価判定を行うと思っていたんですが、結構シビアなラインで判定するみたいですね。
　ただこのシビアな問題を解くことに注力しているため、大雑把な違いにどう反応するのかはちょっとわからないです。
　
　(そのためあまり良い活用先であるかは疑問ですが、例えば厳密に一致する質問文だけを拾いたいシステムで用いることが考えられます。

　例えば某Virtual AIを自作するとして、「あなたの名前はなんですか？」という質問群に「私はキ◯ナ・◯◯です。」という受け答えをすることなどが考えられます。なぜこのタスクを適用するべきかというと、「XXXの名前はなんですか？」という質問や「あなたのあだ名はなんですか？」という質問には別の受け答えをしてほしいからです。)

# 参考文献
Kaggle-Quora-Question-Pairs　https://github.com/howardyclo/Kaggle-Quora-Question-Pairs
First Quora Dataset Release: Question Pairs https://data.quora.com/First-Quora-Dataset-Release-Question-Pairs
Quora Question Pairs https://www.kaggle.com/c/quora-question-pairs
BERT https://arxiv.org/abs/1810.04805

# 他ページヘのリンク
[NLPのタスクを紹介するだけの簡単なページ(0)](https://qiita.com/MeguruMokke/items/1201b5fa05ad6ec5efb9)
[NLPのタスクを紹介するだけの簡単なページ(1) ~SQuAD編~]
(https://qiita.com/MeguruMokke/items/44720220d4fe9de3f804)
[NLPのタスクを紹介するだけの簡単なページ(2) ~CoLA編~](https://qiita.com/MeguruMokke/items/44a97158dd446d913c97)
[NLPのタスクを紹介するだけの簡単なページ(3) ~QQP編~](https://qiita.com/MeguruMokke/items/8b6ecd3c65755bda7cc0)
[NLPのタスクを紹介するだけの簡単なページ(4) ~STS編~](https://qiita.com/MeguruMokke/items/4248fcf51a5510a27b48)
[NLPのタスクを紹介するだけの簡単なページ(5) ~MRPC編~]
(https://qiita.com/MeguruMokke/items/962a76a3b6c9e4c99315)
soracom-cliでButtonの情報を取得してみた

どうも若松です。

SORACOM API では、エンドポイントの /gadgets にリクエストを送ることで Button の情報を取得することができます。
APIの一覧は以下となります。
https://dev.soracom.io/jp/docs/api/#/Gadget

しかし、インフラエンジニアの私は生のエンドポイントを叩くことに慣れていません。
やはり馴染みのあるCLIで叩きたいわけです。

そこで何の気なしに soracom-cli の github を覗いたところ、gadgets サブコマンドがリリースされていたので、使ってみました。

# soracom-cli
soracom-cli は SORACOM から公式で提供されているコマンドラインツールで、コマンドラインからAPIを叩くことができます。

インストール手順は github のREADMEに記載されています。
https://github.com/soracom/soracom-cli/blob/master/README_ja.md

soracom-cli の利用には(というかAPIを叩くには)、SAMの `AuthKeyId` と `AuthKey` が必要ですが、取得方法等は割愛します。
SAM については以下にまとまっています。
https://dev.soracom.io/jp/start/sam/

# Button の情報を取得する
Button 単体の情報を取得するには、以下のコマンドを実行します。

```bash
soracom gadgets get --product-id button --serial-number XXXXXXXXXXXXXXXX
```
`--product-id` には `button` を指定します。
(おそらく Button 以外の gadgets がリリースされれば他の値と使い分けることになると思います)
`--serial-number` には製造番号(DSN)を指定します。

レスポンスは 以下のような Button 情報の JSON となります。

```json
{
	"attributes": {
		"contractEndingTime": "yyyy-mm-ddThh:mm:ss.xxxZ",
		"firstClickTimestamp": "yyyy-mm-ddThh:mm:ss.xxxZ",
		"remainingCount": 1400
	},
	"createdTime": XXXXXXXXXXXXX,
	"id": "button/XXXXXXXXXXXXXXXX",
	"lastModifiedTime": XXXXXXXXXXXXX,
	"lastSeen": {
		"batteryLevel": 1,
		"clickEventPropagated": true,
		"clickTime": "yyyy-mm-ddThh:mm:ss.xxxZ",
		"clickType": "SINGLE"
	},
	"operatorId": "OPXXXXXXXXXX",
	"productId": "button",
	"serialNumber": "XXXXXXXXXXXXXXXX",
	"status": "active",
	"tags": {},
	"terminatedTime": null,
	"terminationEnabled": false
}
```

#まとめ
soracom-cli は AWSCLI と使用感が非常に似ているので、AWSCLIユーザであれば慣れると思います。
スクリプトに組み込む際に、活用してみてはいかがでしょうか。
UE4 c++でLevelに配置されているの他Actorを検索する

現在ゲーム中に配置されているActorの情報を取得したい状況、ゲームを作っているときはあると思います。
それをc++から実装してみようという内容。
ただし、検索処理はそれなりの時間がかかるので、BeginPlay等で一度Actorを取得した後はその参照を保持し、そこからアクセスを行うようにするといいと思います。

# 環境
UE4 4.20.3
Visual Studio Community 2017

# 参考記事
[レベル間のやり取り]("http://historia.co.jp/archives/5434/")

# 下準備
適当なプロジェクト作成。
新規プロジェクトタブから基本コードのプロジェクトを作成します。
<img width="600" alt="img0000.png" src="https://qiita-image-store.s3.amazonaws.com/0/292112/3dba2c72-997e-b86d-0378-9ce5dade732d.png">

# 検索の実装
新規c++クラスを作成からActorを継承したMyActorを作成します。
<img width="600" alt="img0001.png" src="https://qiita-image-store.s3.amazonaws.com/0/292112/e1e1db42-5ab8-bf37-9ad0-41962f193c9b.png">

内部の実装
### MyActor.h
``` c++
#pragma once

#include "CoreMinimal.h"
#include "GameFramework/Actor.h"
#include "MyActor.generated.h"

UCLASS()
class MYPROJECT_API AMyActor : public AActor
{
	GENERATED_BODY()
	
public:	
	// Sets default values for this actor's properties
	AMyActor();

public:	
	UFUNCTION(meta = (CallInEditor = "true"))
	void GetEmitter();
};
```

### MyActor.cpp
``` c++
#include "MyActor.h"
#include "Particles/Emitter.h"
#include "Kismet/GameplayStatics.h"
#include "Engine/World.h"
#include "Engine/Engine.h"

// Sets default values
AMyActor::AMyActor()
{
 	// Set this actor to call Tick() every frame.  You can turn this off to improve performance if you don't need it.
	PrimaryActorTick.bCanEverTick = false;
}

void AMyActor::GetEmitter()
{
	TSubclassOf<AEmitter> findClass;
	findClass = AEmitter::StaticClass();
	TArray<AActor*> emitters;
	UGameplayStatics::GetAllActorsOfClass(GetWorld(), findClass, emitters);

	if (emitters.Num())
	{
		AEmitter* emitter = Cast<AEmitter>(emitters[0]);
		FString message = FString("EmitterName:") + emitter->GetName();
		GEngine->AddOnScreenDebugMessage(-1, 5.0f, FColor::Cyan, message);
	}
}
```
GetAllActorsOfClassを使ってクラスを指定してWorldに配置されているActorから一致するクラスを持ったアクターを取得できます。
UGameplayStaticsからはクラスの他タグやInterfaceを指定してActorを取得する関数もあります。
UGameplayStatics::GetAllActorsあたりまで入力してインテリセンスを使えば見つかるかと。

# テスト
プロジェクトを作る際、スターターコンテンツを含めた状態で作成をしておいたのでそこから検索用のオブジェクトを配置します。
StarterContent/Particles/にあるP_Fireをビューポート上に配置します。
<img width="957" alt="img0002.png" src="https://qiita-image-store.s3.amazonaws.com/0/292112/cf74b1f2-93db-d9e3-f88b-9d9c1b09ee56.png">

そして、先ほど実装したAMyActorもビューポート上に配置します。
AMyActorのGetEmitterメソッドのプロパティに
UFUNCTION(meta = (CallInEditor = "true"))
を設定してあるので、アウトライナ上でMyActorを選択すると詳細ウィンドウにGetEmitterボタンが表示されます。
それを押すことでビューポート上にデバッグメッセージが表示されるのを確認できると思います。
<img width="495" alt="img0003.png" src="https://qiita-image-store.s3.amazonaws.com/0/292112/3f2722f9-90c9-c369-872b-70038a1c23a3.png">


# まとめ
またも基本的な記事です。
同じ内容が書かれている記事も見つけていたり…自分用の覚え書きと割り切ろう。そうしよう。
ブラウザ上のテキストエリアの内容を画像にして表示

demo
-------

https://jsfiddle.net/42w8vt3p/

リアルタイムで変換します。
デフォルト引数とか使っているので、新しめのChromeでないと動かないかも。

背景
---------

テキストを画像に変換したくて、中央揃えとか色々やってみたかったので書いた。
特に難しいことはしていないが、まとめて書いておきたかったので。

テキストの描画はcanvasを使っているのだけど、そのままだとぼやけてしまう。で、canvasサイズとscaleを2倍にして、表示を1/2にする荒業をやっている。
（なので、出来上がる画像サイズは2倍だしfontsizeも2倍になっている。どうにかしたい。）
【小ネタ】echo $PATHとするとPATHが見れるが、小文字でecho $pathとすると。。。

PATHの区切りのコロンがスペースになって見やすい？というかなにこれ

```
➜  ~ echo $PATH
/Users/hidehiro/.nodebrew/current/bin:./bin:./node_modules/.bin:/Users/hidehiro/.pyenv/shims:/Users/hidehiro/.rbenv/shims:/usr/local/bin:/usr/bin:/bin:/usr/sbin:/sbin:/usr/local/sbin
➜  ~ echo $path
/Users/hidehiro/.nodebrew/current/bin ./bin ./node_modules/.bin /Users/hidehiro/.pyenv/shims /Users/hidehiro/.rbenv/shims /usr/local/bin /usr/bin /bin /usr/sbin /sbin /usr/local/sbin
➜  ~ 
```

# 追記
友人の @Cool0707 から教えてもらいました。
`PATH`は環境変数で、`path`は環境変数と同期しているシェル変数。zshでは`path`は配列となっていて、配列の表示が要素間にスペースを入れるものなのでこう表示されている。

https://qiita.com/uasi/items/c4288dd835a65eb9d709
https://qiita.com/mollifier/items/f897b3fddd2d10369333
AndroidのTextViewに表示する文字を、HTMLタグのまま書く

## 環境
* macOS High Sierra
* Android Studio 3.2
* Nexus 5X API 24 エミュレータ

## 方法
[[android] TextViewでHTMLを表示するには？](https://code.i-harness.com/ja/q/204a42)の抜粋。

HTMLでタグ付けした文字列を`<![CDATA[]]>`で囲ったものをstrings.xmlに書いて、java側で読み込んで表示する

```xml:strings.xml
<resources>
<string name="test">
    <![CDATA[
        <h1>hello HTML</h1>
    ]]>
</string>
</resources>
```

text_sampleというidのTextViewが定義されたlayoutをsetContentView()した上で

```java:MainActivity.java
TextView txt=findViewById(R.id.text_sample);
txt.setText(Html.fromHtml(getString(R.string.test)));
```
`<h1>`が適用されたhello HTMLが表示されるはず
（なんでも適用できるわけではない模様。`<ol>`が数字にならなかったり。）

## CDATAセクションとは

[こちら](http://www.atmarkit.co.jp/aig/01xml/cdata.html)によると、
XMLではマークアップ用記号を直接記述できないが、CDATAセクション内では可能とのこと。

> XMLはマークアップ言語であるため、XML文書を記述する際には、マークアップ用として指定された記号を直接文字として記述することができない。これを記述してもマークアップの指定と解釈され、文字として解釈されないためである。しかし、場合によっては、この方法はXML文書の記述や管理を煩雑にする場合がある。このような場合に、マークアップ専用の記号であって、通常の文字として扱う特例的な部分をつくることができる。これを、CDATAセクションという。

## 参考
* [[android] TextViewでHTMLを表示するには？](https://code.i-harness.com/ja/q/204a42)
* [CDATAセクション](http://www.atmarkit.co.jp/aig/01xml/cdata.html)
Mac で Apache Spark & PySparkするまで

完全なる備忘メモ

# Java 入れる
意外とハマったので[コチラ](https://qiita.com/seijikohara/items/56cc4ac83ef9d686fab2)を参考に↓の感じでJava8を入れる．

```shell
$ brew tap caskroom/versions
$ brew cask install java8
```

```.bashrc``` or ```.zshrc```に

```shell
$ export JAVA_HOME=`/usr/libexec/java_home -v "8"`
$ PATH=${JAVA_HOME}/bin:${PATH}
```
を追記しておく．

# Apache Spark 入れる
[コチラ](https://blog.amedama.jp/entry/2017/05/05/021306)を参考に

```shell
$ brew install apache-spark
```
で入れる．

```shell
==> Downloading https://www.apache.org/dyn/closer.lua?path=spark/spark-2.3.2/spa
==> Downloading from http://ftp.jaist.ac.jp/pub/apache/spark/spark-2.3.2/spark-2
######################################################################## 100.0%
🍺  /usr/local/Cellar/apache-spark/2.3.2: 1,019 files, 243.9MB, built in 5 minutes 15 seconds
```
で，おわり．

# とりあえずPySparkを試してみる
```shell
$ pyspark
```
を試しに打ってみる．

```shell
Python 3.6.0 |Continuum Analytics, Inc.| (default, Dec 23 2016, 13:19:00) 
[GCC 4.2.1 Compatible Apple LLVM 6.0 (clang-600.0.57)] on darwin
Type "help", "copyright", "credits" or "license" for more information.
2018-11-12 23:38:44 WARN  NativeCodeLoader:62 - Unable to load native-hadoop library for your platform... using builtin-java classes where applicable
Setting default log level to "WARN".
To adjust logging level use sc.setLogLevel(newLevel). For SparkR, use setLogLevel(newLevel).
Welcome to
      ____              __
     / __/__  ___ _____/ /__
    _\ \/ _ \/ _ `/ __/  '_/
   /__ / .__/\_,_/_/ /_/\_\   version 2.3.2
      /_/

Using Python version 3.6.0 (default, Dec 23 2016 13:19:00)
SparkSession available as 'spark'.
>>>
```
こんな感じで出てきたらOK

# standalone モードでpysparkを使ってみる
pythonのバージョンを3にしておく．

```shell
pyenv global 3.6.0
```
一つ目のterminalでmasterを立ち上げる．

```shell
cd /usr/local/Cellar/apache-spark/2.3.2/libexec/bin
spark-class org.apache.spark.deploy.master.Master
```
二つ目のterminalでworkerを立ち上げる

```shell
cd /usr/local/Cellar/apache-spark/2.3.2/libexec/bin
spark-class org.apache.spark.deploy.worker.Worker spark://IP:PORT
```
IPはmasterを立ち上げたときに出力される

```shell
Master:54 - Starting Spark master at spark://IP:PORT
```
を探して出力されているIPとPORTを入力する．
三つ目のterminalでsparkを実行する．

```shell
pyspark --master spark://IP:PORT
```
Microsoft Hyper-V Server 2016でNICが読み込まれない問題について

#ガイダンス
こんにちは、はにおかさいです。
「Microsoft Hyper-V Server 2016」にて、ドライバで四苦八苦したので記事にまとめました。

#環境
マザーボードは[こちら](https://www.asus.com/jp/Motherboards/H110M-A/specifications/)。
Realtek® RTL8111H がEthernet。

#ドライバの導入。
##問題把握
サーバー側のcmd.exeで

```
msinfo32
```
と実行してください。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/245977/9e5c280f-2e0a-e8fd-5c42-3e34bdd3fb27.png)

「問題のあるデバイス」を確認。イーサネットが見事にありました。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/245977/d1b1d1e3-dfab-df6f-2c2e-511ea8d5760c.png)
ところが、このmsinfo32は「デバイスマネージャ」のようにドライバが取り込ません。ここで、infファイルを使ってコマンドでドライバをインストールさせます。
このとき、画面黄色で囲ったところをメモっとくこと。（以後記事ではεと定義。）
![image.png](https://qiita-image-store.s3.amazonaws.com/0/245977/59ae19d7-b5c1-d91c-85d3-3166aa9343d1.png)

##ドライバをダウンロード＆編集

###ダウンロード
ドライバを探したが、公式のサイトリンクが切れてる、、、

探したら、インテルのサイトにあった。（よく考えたらマザボ付属のCDにあったやんという）
https://downloadcenter.intel.com/de/download/25016/Intel-Network-Adapter-Driver-for-Windows-10

そのままインストールしても、画面上インストールは進行するが、成功はしない。読み込まれてないっぽい
![image.png](https://qiita-image-store.s3.amazonaws.com/0/245977/e3d0f85a-8287-bcfa-1ccb-e0fcb9614f70.png)

っぽいドライバでもダメだった。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/245977/5f6bce01-14cf-a8d2-b434-e4568d7775b1.png)

###原因
Windows10には対応していても、「Hyper-V Server 2016」のNTバージョンと一致していなかったゆえ、OS側が読み込まなかったよう。

###気を取り直して。
前述のhttps://downloadcenter.intel.com/de/download/25016/Intel-Network-Adapter-Driver-for-Windows-10を
解凍。
その後、PROWinx64\PRO1000\Winx64\NDIS65　をコピーして退避させてください。編集します。
今回の場合、e1d65x64.infを編集します。
写真黄色マーカーに注意しながら、「ε」のデバイスを追加記入してください。妙にOSのバージョンを10.0.1と小数点２コ指定していたのがまずかったよう。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/245977/e0227f3b-309b-13cd-6515-b82e61234095.png)

保存して、外付けHDDにでも編集済み「PROWinx64\PRO1000\Winx64\NDIS65」を入れます。

##ドライバのインストール
###事前にサーバーで
編集したドライバのinfをインストールするのを許可します。

```
bcdedit /set LOADOPTIONS DISABLE_INTEGRITY_CHECKS
bcdedit /set TESTSIGNING ON
bcdedit /set nointegritychecks ON
```
んで、再起動

###インストール
外付けHDDをcmd.exeで開いてください。

```
pnputil –i –a D:\NDIS65\ e1d65x64.inf
```
これで、インストールができたはず。
再起動は不要。

![image.png](https://qiita-image-store.s3.amazonaws.com/0/245977/8299dfa9-3642-d8d2-1ce0-108124141930.png)

![image.png](https://qiita-image-store.s3.amazonaws.com/0/245977/44cbd2c3-6ee8-02f2-1cb1-18fcd14174d2.png)

できた！！

#まとめ
Windows 10のドライバはママ使えるが、バージョン指定の兼ね合いがあるので、infを編集すべし。

#Ref
https://jayrbarrios.com/2014/11/19/intel-nuc-d54250wykh-installing-lan-driver-on-windows-hyper-v-server-2012-r2/

#役立つ記事
https://nashippe.blog/win/winrm-ntlm/
https://qiita.com/hotta/items/d20881cb45fe6af024f1
https://superuser.com/questions/704870/mount-and-dismount-hard-drive-through-a-script-software
https://yun-craft.com/software-crafts/hyper-v-server-2016
https://blogs.msdn.microsoft.com/jpwdkblog/2014/02/27/hyper-v-guest-os-windbg/
laravel-admin gridの「操作」列にボタンを追加する

###gridにボタンを追加する
下記のようにURLを指定することで、別のController等へ直接リンクを張ることが出来る。

```
    protected function grid()
    {
        $grid = new Grid(new YourModel);

        $grid->id('ID')->sortable();
        $grid->created_at('Created at');
        $grid->updated_at('Updated at');

        //「操作」列にボタンの追加
        $grid->actions(function ($actions) {
          //form等のURLを指定する。
            $actions->prepend('<a href="/admin/testform/'.$actions->getKey().'/edit"><button type="button" class="btn btn-primary btn-xs">テストボタン</button></a></br>');
        });
        return $grid;
    }
```

###下記のように表示される
![テストボタン.PNG](https://qiita-image-store.s3.amazonaws.com/0/314837/6ec27276-382a-5a1f-af0e-314ef1805a32.png)
RailsのThorの使い方

###ファイル名と格納場所
 test.thorように「.thor」拡張式でＢＩＮのフォルダーに格納する
　　私の場合は---→　D:\Ruby24-x64\bin

```ruby:test.thor

class Test < Thor # Thorクラスを継承
  desc 'say [Name]', 'say task' # Usage Message, 詳細な説明
  def say(name) # publicで定義したメソッドが実行するタスク
    puts "Hello, #{name}!"
  end
end
```

###実行方法
```ruby:
D:\app\test>thor test:say aaa
Hello, aaa!
```
App Store Connect APIの叩き方

##APIの叩き方概要
App Store Connect APIは App Store Connectの「ユーザーとアクセス」の「キー」から発行、DLしたキーをJWT(JSON Web Tokens)でアカウントを認証する。権限がない場合は「キー」タブは表示されない。

ちなみにこのキーは１度しかDLできない。
詳細：https://developer.apple.com/documentation/appstoreconnectapi/creating_api_keys_for_app_store_connect_api


以下、具体的手順

App Store Connect API


##ユーザとアクセスからキーを発行する

発行できる権限を持ったアカウントで発行（現在は個人アカウントではリクエストするのみ）

##JWTを使用してtokenを発行する処理を書く

作成するJWTには以下の内容が必要
・JWT header
・JWT payload
・JWTの署名

tokenを発行する
WWDCの動画にもあるrubyで記述
jwtがない場合は事前に入れる(https://qiita.com/oshou/items/6283c2315dc7dd244aef からの gem 'jwt'を追加+bundle install)

token.rb

```ruby
require "base64"
require "jwt"
ISSUER_ID = ""
KEY_ID = ""
private_key = OpenSSL::PKey.read(File.read("p8ファイルのアドレス/hoge.p8"))

token = JWT.encode(
   {
    iss: ISSUER_ID,
    exp: Time.now.to_i + 20 * 60,
    aud: "appstoreconnect-v1"
   },
   private_key,
   "ES256",
   header_fields={
     kid: KEY_ID }
 )
puts token
```

ISSURE_ID, KEY_ID,p8ファイルのアドレスを入力する.


上記を実行するとtokenが発行できます
ruby token.rb

##tokenの期限が切れるまでに叩く

```
curl https://api.appstoreconnect.apple.com/v1/apps -H "Authorization: Bearer 発行したトークン"
```

これで叩けます。


期限切れになると以下のように返ってくる。


```
{
	"errors": [{
		"status": "401",
		"code": "NOT_AUTHORIZED",
		"title": "Authentication credentials are missing or invalid.",
		"detail": "Provide a properly configured and signed bearer token, and make sure that it has not expired. Learn more about Generating Tokens for API Requests https://developer.apple.com/go/?id=api-generating-tokens"
	}]
}
```

現時点ではまだprovisioningなどができないため(404が返ってきてしまう)のでアップデートに期待

##参考：　
WWDC動画
https://developer.apple.com/videos/play/wwdc2018/303/ (後半のDEMOの部分が分かりやすいです

App Store Connect API
https://developer.apple.com/documentation/appstoreconnectapi

https://medium.com/xcblog/generating-jwt-tokens-for-app-store-connect-api-2b2693812a35
演算子の結合規則

Scheme (に限らずたいていの LISP 系言語も) では、原則として演算子の優先順位を考える必要がありません。手続き (関数) として提供され、手続きの規則に従うので、演算子に特有の規則は不要だからです。

しかし、結合規則についてはどうでしょうか。

結合規則によって意味が変わるような演算、たとえば割り算を考えてみます。

```scheme
(/ 1 2 3)
```

この式は `(1/2)/3` を意味します。 つまり、左結合的なふるまいをするわけです。

右結合的な動作をする手続きを書くこともできます。

```scheme
#!r6rs
(import (rename (rnrs) (/ rnrs:/)))
(define (/ . args) (fold-right rnrs:/ 1 args)) ;; 右結合版の割り算を定義

(display (/ 1 2 3)) ;; => 3/2
```

つまり、ある手続きが左結合的に動作するか右結合的に動作するかはどちらも有りうるのです。 (Scheme が標準で提供している四則演算手続きに限ってはいずれも左結合的に動作しますが。)

Scheme (などの LISP 系言語) におけるこういった演算は便宜のために多くの引数を受け取れるようになっているだけで、やっていることは二項演算の連鎖に過ぎませんので `(/ 1 2 3)` を `(/ (/ 1 2) 3)` と書けば結合規則に曖昧さは生じませんが、そこまで括弧で明示するなら中間記法で書くのと大差ありません。 Ｓ式は世間で思われているほど曖昧さを排除できているわけではないのかもしれません。
MojaveでCommand + クリックで別タブが開かなくなった時の対処方法

結論から先にはなすと、**Karabiner-Elementsが原因の可能性が高いです。**

Karabiner-ElementsでCommandキーを利用した、かな変換などの設定を行なっている場合、MojaveだとCommand + クリックで別タブが開かない現象が発生するようです。


別タブで開かない現象はKarabiner-Elementsの設定ファイルを編集することで解決できます。

設定ファイルに記載されているcommandキーに関する項目のうち、`"lazy": true`となっている部分を`false`に変更します。
なお、Karabiner-Elementsの設定は`~/.config/karabiner/karabiner.json`に保存されています。

自分の場合はCommandキーで英語とかなのトグル操作を行うようにしていたので、該当部分の設定を変更しました。

![image.png](https://qiita-image-store.s3.amazonaws.com/0/140792/194d55eb-ca45-37ec-194c-4d37b66cd55b.png)
\ufeffって？？？

# 背景
今回、とあるcsvファイルに対して、pythonで読み書きしていました。

```python:open_csv.py
    
    
    with open("data/*****/*****.csv") as f:
        for line in f:
            strs = line.split(",")
            column.append(strs)
            margin = column.count('')
        print(margin,column) 
```
このようにcsvファイルを1行づつ読み込み、「","」で区切り代入し、```print```すると、


`6,['\ufeff', '', '', '', '', 'A', 'B', '', '', 'C']`

このように出力されました。
今回は「''」の個数を数えていきたかったので「\ufeff」が邪魔でした。
「\ufeff」って何？？？どうすれば消えるの？？？と思い調べました！！

##BOM
調べて見たところ`UTF-8`にはテキストの始まりをプログラムに伝える為のデータ内のマークがあります。これは通称BOMと呼ばれるそうですが、このBOMのユニコード表示が「\ufeff」ということですね！！

##BOMの消去
このBOMを消去するには「BOMありUTF-8」と「BOMなしUTF-8」の選択をする必要があるそうです。
この選択にはcsvファイルを読み込む際の`open`に引数`encoding='utf-8-sig'`を指定する必要がありました！！
実際に以下のように指定すると、、、

```BOM_open_csv.py

    with open("data/*****/*****.csv",encoding = "utf-8-sig") as f:
        for line in f:
            strs = line.split(",")
            column.append(strs)
            margin = column.count('')
        print(margin,column) 
```
`7,['\ufeff', '', '', '', '', 'A', 'B', '', '', 'C']`
以下のように正しく「\ufeff」の分もしっかりカウントしてくれました！！
『エンジニアリング組織論への招待』を読んでみて

[エンジニアリング組織論への招待](https://www.amazon.co.jp/dp/B079TLW41L/)を読んでみて結構納得感のある内容だったので、忘れる前に自分的に響いたところなど書き留めておく。あくまで主観を書くので、本の内容など詳しく知りたい方は、実際の書籍を参照してください。

# はじめに
> 問題解決のためには、コードだけでなく、人々の思考・組織・ビジネスの「構造」こそリファクタリングしなければいけないと考えるようになりました。それこそがエンジニアリングの本質なのだと気がついたのです。

いきなり本質をつく言葉。
最近、チームを俯瞰して見る機会があるせいか、この言葉がものすごく「真」だなと感じる今日このごろ。

# Chapter 1. 思考のリファクタリング
> 人間にとって、本質的に「わからないこと」は２つしかありません。それは、「未来」と「他人」です。

これはよく聞く言葉だけど、改めて。レガシーシステムに向き合っていると、これに加えて、「過去」もわからないことが多く、これが結構厄介だなと感じる。「過去」は本質的には「わからないこと」ではないはずなので、「わからないこと」にならないように作っていくことが大事。

> このような局所最適解（システム全体の一部分において最適な答え）が、全体にとって最適な答えかどうかの判断がつかないために、局所最適解同士が争うことになります。

これも、よく出くわすなーって感じ。みんな大きく見ると同じ方向に向かいたいんだけど、いろいろ大事にしている部分が違ったりして、それぞれの「正解」がぶつかって答えがでない感じ。あとは、何が「最適」かってのも判断が難しいところ。。ただ、自分が「正しい」と思っていることが実は局所最適解で、全体にとっては「正解」ではないのかもと心の片隅においておくのが大事なのかも。

> 同じ目的をもったチームメンバーが、局所最適な言い争いを発生させることなく全体最適に向かうことができるように、一次元上の観点から問題を捉えて、システムの全体像を把握していくことで、対立から発展的な議論へと視野が拡大することがシステム思考のメリット

確かに一歩引いた目線で見てみると、現場で実際の人たちから直接見えにくいところが見るようになったり、あるいは、複合的にいろいろ見なければいけないことに気づいたりすることがある。「視座」を変えるってのが大事なのかも。

> 自分にとっての正解が全体にとっての正解にならない

正論。その辺に貼っておきたい。自分も耳がいたい。

# Chapter 3. アジャイルなチームの原理
> 複雑性の解消よりも、複雑性の管理に時間を使い、完了しないプロジェクトが増えていった

まさにSIerにいた頃のプロジェクト。プロジェクト自体が複雑だったり、システム自体が複雑であることは「しょうがない」とされ、その複雑性の解消ではなく、その複雑性と上手に付き合うことを選んでいる。絶対に間違いということではないと思うけど、「もっとシンプルに」という方向性ではなく、「上手にプロジェクトマネジメント」をという方向にどんどん流れて、「いいものを作ろう」という方向ではないような気がする。

> (要約) ソフトウェア開発が「発注者」と「受注者」に分断
発注者は納期の絶対視や無自覚な追加要求
受注者は計画と契約で責任分界点を作る
→受注者はビジネスの成功率減少
→発注者は縛りの多いつまらない仕事に

あぁぁぁ、すごいうまく書かれている。。SIer時代はまさにこんな感じ。Web系企業でも、事業側と開発側が分断されていたりするとこんな感じだなと思うことも多々ある。だからプロダクトオーナーとして、みんな同じチームでやろうよってのは当然の流れなのかも。

> 必要なことは、外でうまくいっている何かを探し出すことではなく、しっかりと自分たちを取り巻く状況を観察すること。そして、何かの流行りのかっこよさを教条的に取り入れるのでなく、今何をすべきかをしっかりと周囲と対話していくことです。

かっこいいからやってみたいと思うのもエンジニアの性だとも思う。ただ、今何が必要かという視点が欠けると、ただの技術的な負債になる可能性も高い。あとはどう導入するかをチームで決めていくというのが大事。

# Chapter 4. 学習するチームと不確実性マネジメント

> 「間に合うか、間に合わないか」ではなく、「スケジュール予測が収束していくかどうか」を管理するようにしなくてはならない

なるほどー。楽観的な見積もりと悲観的な見積もりを定期的にやる感じかな。

> 開発部門には納期絶対主義の管理者が重宝されるようになり、「何を作るべきか」という視点をどんどんと失っていく。本来、ソフトウェアプロダクトを提供する事業において「その日」にリリースされてないといけないという制約は、意図的に作らない限り生まれない

プロジェクトは大事。だけど、プロダクトはもっと大事。ということかな。

> あるときはチームに入り込み、あるときはプロダクトオーナーを助け、あるときはチームの1人1人をメンタリングするというのが、スクラムマスターの役割だといえます。

昔、スクラムマスターを週ごとにまわしてやってて、基本デイリーハドルや振り返りのファシリテーターって感じでやってたけど、本当(?)のスクラムマスターの役割って実はもっと広いし、誰もができる役割ではそもそもないのか。

# Chapter 5. 技術組織の力学とアーキテクチャ

> ソフトウェア開発上の多くの問題は、技術的というより社会学的なものである

これも最近よく実感する。他のチームで困っていることの話を聞くと、技術的な課題の話と思いきや、実はチーム自体の問題が根本であったりすることがある。やはりチームで開発している以上、「人間関係」とシステム開発も切っても切り離せない。

> 開発者がその時点ですべきことは、「今必要な機能をシンプルに作る」ことです。将来的にシンプルであり続けると予測し、アーキテクチャを組むことは、それ自体が技術的負債の材料となる複雑性をシステムに組み込んでしまうことになります

実際現場でこれをよく見かける。そんな要求が今無いのに、いろんな場合に対応できるように、複雑な作りになってるやつ。今の要求を素で書いてみたときにイケテナイねってなって、リファクタリングとしてそういう仕組みになるならありだと思うんだけど、最初からやりすぎると、「The 技術的負債」になる。

# まとめ
マネージャー向けのマネージメント論かと思いきや、実際の現場でよく起こる現象をうまく言語化してくれていたりして、いちエンジニアにとっても結構ためになる本だった。
Python3(OpenCV)を使ってデータ分類(K近傍法)

今回はOpenCVを使ってデータを分類を行いたいと思います．
分類した結果をPython3のmatplotlibを使って可視化します．

## matplotlibとは
matplotlibはPythonでグラフを描画するときなどに使われる標準的なライブラリです．
画像ファイルを作るばかりでなく，簡単なアニメーションやインタラクティブなグラフを作ることもできます．
実際の例はmatplotlibサイトのギャラリーで見ることができます．
https://matplotlib.org/gallery.html

## 準備
サンプルコードを動かす上で予めいくつかモジュールを読み込んでおきます．

``` python
import cv2
import numpy as np
import matplotlib.pyplot as plt
```

## OpenCVとは

OpenCV（Open Source Computer Vision Library）は，コンピューターで画像や動画を処理するための機能がまとめて実装されている，オープンソースのライブラリです．

「OpenCV-Python Tutorials」というサイトで，様々な機能が紹介されていますので，ぜひ確認してみてください．
https://opencv-python-tutroals.readthedocs.io/en/latest/py_tutorials/py_imgproc/py_table_of_contents_imgproc/py_table_of_contents_imgproc.html

先では，`import cv2` が必要と言いました．Python3からOpenCVを利用するには，
opencv-pythonライブラリをインストールします．
OpenCVは，いくつかの方法でインストールできますが，
`pip3 install opencv-python`でインストールするが最も簡単でおすすめです．
`print(cv2.__version__)`　を使ってOpenCVのバージョンを確認することができます．

※「pip3」のバージョンによってpipの可能性があります．

## K近傍法(KNN)
### 概要
K近傍法は，Yが未知のXのデータがあった時に，未知のYを推測する方法です．
K近傍法は，K個の「K」を自分で予め決めておいて，その地点に近い順のK個の地点の情報から，推測する方法です．
また，K近傍法は，データ全体ではなく，一部のデータだけを使いますので，YとXの関係を数式で表す事ができなくても，確からしい推測ができます．
局所的な推測に，有利な方法です．
### 計算
距離関数を使って，既知のX群の中のどの辺りにあるのかを調べます．
次に，結合関数を使って，近傍のk個のYから，未知のYの大きさを計算します．
距離関数や結合関数は自分で選べます．
EX. 距離関数は「ユークリッドの距離」，結合関数は「平均値」があります．


## プログラム
```python
import cv2
import numpy as np
import matplotlib.pyplot as plt

trainData = np.random.randint(0,100,(50,2)).astype(np.float32) #(1)
responses = np.random.randint(0,2,(50,1)).astype(np.float32) #(2)

red = trainData[responses.ravel() == 0] #(3)
plt.scatter(red[:,0], red[:,1], 80, "r", "^") #(3)

blue = trainData[responses.ravel() == 1] #(4)
plt.scatter(blue[:,0], blue[:,1], 80, "b", "s") #(4)

newdata = np.random.randint(0,100,(1,2)).astype(np.float32) #(5)
plt.scatter(newdata[:,0], newdata[:,1], 80, "g", "o") #(5)

knn = cv2.ml.KNearest_create() #(6)
knn.train(trainData, cv2.ml.ROW_SAMPLE, responses) #(6)
ret,results,neighbours,dist = knn.findNearest(newdata, 5) #(6)

print("result:\t{}".format(results))
print("neighbours:\t{}".format(neighbours))
print("distance:\t{}".format(dist))

plt.show()

```

### コード解説

(1): (x,y)データを50個作る，大きさ0~100，50行2列
(2): 50個のデータについてランダムに0のクラスか1のクラスを割り振る，50行1列
(3): 0のデータは赤色の点，プロット
(4): 1のデータは青色の点，プロット
(5): 未分類データの出現(1つ)緑色の点，プロット
(6): KNNを実行します，K=5とします
ここで注意する点は (6)の1，2行目， 
`knn = cv2.KNearest()
knn.train(trainData,responses)`
で書く人がいますが，これではエラーは出ます．
これは古いバージョンの書き方，上記の方は新しいバージョンの書き方です．

上のプログラムを実行して表示する図は以下のようになります．
<img width="752" alt="スクリーンショット 2018-10-05 13.46.19.png" src="https://qiita-image-store.s3.amazonaws.com/0/179248/1d463699-a75e-a4f4-2315-452615387ac4.png">
図にすることによって視覚的に，緑色の点(未分類データ)は，1のデータのクラスに属していることがわかった．


今回のPython3(OpenCV)を使ってデータ分類(K近傍法)は以上で終わります．
読んでいただいてありがとうございます．