OmniAICreator/Qiita-1.07M huggingface dataset:
NumPy で行列の差分計算

極めてニッチで一体誰の参考になるのかという小ネタだけど、自分用のメモとして。

## 前提
`np` で NumPy を使えるものとする。

``` python
import numpy as np
```

## やりたいこと
以下のような要素のリスト (例: 1から6までの整数) があったとする。

``` python
arr = np.arange(1, 7)  # array([1, 2, 3, 4, 5, 6])
```

このリストから2つの要素を選ぶ全ての組み合わせについて、何らかの計算 (例: 2要素の積) をした行列を求めたとする。

``` python
X, Y = np.meshgrid(arr, arr)
matrix = X * Y
# array([[ 1,  2,  3,  4,  5,  6],
#        [ 2,  4,  6,  8, 10, 12],
#        [ 3,  6,  9, 12, 15, 18],
#        [ 4,  8, 12, 16, 20, 24],
#        [ 5, 10, 15, 20, 25, 30],
#        [ 6, 12, 18, 24, 30, 36]])
```

(補足) 上記のコードは、下記のコードでも同じ結果が得られる。

``` python
prod = lambda X, Y: X * Y
matrix = prod(*np.meshgrid(arr, arr))
# 上記と同じ行列が得られる
```

ここで、**リストに対して要素が追加されることになった**、とする。

``` python
arr_new = np.arange(7, 10)  # array([7, 8, 9])
```

もともとの要素 arr と追加要素 arr_new を結合した新しいリストについて、先ほど計算したような行列を再び求めたい。

愚直に書くとこうなる。

``` python
arr_all = np.concatenate([arr, arr_new])
matrix_new = prod(*np.meshgrid(arr_all, arr_all))
# array([[ 1,  2,  3,  4,  5,  6,  7,  8,  9],
#        [ 2,  4,  6,  8, 10, 12, 14, 16, 18],
#        [ 3,  6,  9, 12, 15, 18, 21, 24, 27],
#        [ 4,  8, 12, 16, 20, 24, 28, 32, 36],
#        [ 5, 10, 15, 20, 25, 30, 35, 40, 45],
#        [ 6, 12, 18, 24, 30, 36, 42, 48, 54],
#        [ 7, 14, 21, 28, 35, 42, 49, 56, 63],
#        [ 8, 16, 24, 32, 40, 48, 56, 64, 72],
#        [ 9, 18, 27, 36, 45, 54, 63, 72, 81]])
```

しかし、もともとの要素 arr に関する計算済みの行列 matrix があるので、この行列を利用して新しい要素に関する拡張部分だけを計算することにして、計算量を抑えたい。

この差分計算を NumPy で書きたい。

## 解法
このような関数を作ると実現できる。

``` python
def extend_matrix(matrix_base, arr_base, arr_new, func):
    part0 = func(*np.meshgrid(arr, arr_new))
    part1 = func(*np.meshgrid(arr_new, arr_new))
    return np.concatenate([
        np.concatenate([matrix_base, part0], axis=0),
        np.concatenate([part0.T, part1], axis=0),
    ], axis=1)
```

行列の新しく増える部分だけを計算して、既存の行列と結合している。

使うときは、こう。

``` python
matrix_new = extend_matrix(matrix, arr, arr_new, prod)
# array([[ 1,  2,  3,  4,  5,  6,  7,  8,  9],
#        [ 2,  4,  6,  8, 10, 12, 14, 16, 18],
#        [ 3,  6,  9, 12, 15, 18, 21, 24, 27],
#        [ 4,  8, 12, 16, 20, 24, 28, 32, 36],
#        [ 5, 10, 15, 20, 25, 30, 35, 40, 45],
#        [ 6, 12, 18, 24, 30, 36, 42, 48, 54],
#        [ 7, 14, 21, 28, 35, 42, 49, 56, 63],
#        [ 8, 16, 24, 32, 40, 48, 56, 64, 72],
#        [ 9, 18, 27, 36, 45, 54, 63, 72, 81]])
```

追加要素についての差分計算だけで全体の行列を求めることができた。
Dockerfileを楽に作りたい（imageから自動生成したい）

# この記事には修正版があります．そちらをご覧ください． -> https://qiita.com/RyodoTanaka/items/c7e4889a1b9383291799

#### 2019.05.29時点で下記手順でうまく行かない事を確認しました...orz -> 修正しました(2019.05.30)

修正版を作りました．
https://qiita.com/RyodoTanaka/items/c7e4889a1b9383291799

---
表題のとおりです．
Dockerfileを楽に作りたいなぁと思った時，どうやりますか？
私は下のような手順で出来るといいなと思ってます．

1. Docker image の実行
2. 環境構築
3. imageからDockerfileを作成

#### 1. Docker image の実行
例えば，`Ubuntu 16.04`をベースにしたいなと思ったとき，まずはimageを引っ張ってきますよね．

```bash
$ docker pull <image repository name> 
```

でもってPullが完了したら，そいつを実行します．

```bash
$ docker run -it <image name>
```

### 2. 環境構築
実行してるcontainer内で色々環境構築します．
具体的に何をするかは皆様お好きに！
環境構築が終わったら`exit`コマンドとか使って終了します．

### 3. containerからimageを作成する
まずはcontainer 情報を下記コマンドで確認します．
ここからDockerfileを作りたいcontainer IDか名前を取得します．

```bash
$ docker ps -a
```

そしたら，下記コマンドで希望のcontainerを任意の名前のimageにします．

```bash
$ docker container commit <container ID> <image name>
```
一応作成し終わったら，下記コマンドでimageがちゃんと作られてるか確認します．

```bash
$ docker images
```

#### 4. imageからDockerfileを作成
はい．やっと本記事のミソですね．
適当にぐぐったところ，海外の方が神bashをアップしてくださってました．
やっぱりStack Overflow なしでは生きていけません．
https://stackoverflow.com/a/50926503

```bash
$ docker history --no-trunc <image name>  | tac | tr -s ' ' | cut -d " " -f 5- | sed 's,^/bin/sh -c #(nop) ,,g' | sed 's,^/bin/sh -c,RUN,g' | sed 's, && ,\n  & ,g' | sed 's,\s*[0-9]*[\.]*[0-9]*[kMG]*B\s*$,,g' | head -n -1
```

ただ，こいつ長いですよね．
なので，`dfimage`というコマンドを作りました．
https://github.com/RyodoTanaka/.bash_extend/blob/master/dfimage.bash
こいつを`.bashrc`で読み込んでやれば，

```bash
$ dfimage <image name>
```

とするだけで，Dockerfileを標準出力に出力してくれます．
なのでUNIX系使いの方であれば

```bash
$ dfimage <image name> > Dockerfile
```

とすれば自動でDockerfileが出来上がります！

### まとめ
というわけで，`dfimage`コマンドを作って簡単にDockerfileが作成できるようにしました．
これでDocker Hubにイメージをアップしまくれますね！！！
Git リモートとのやりとり　自分用メモ

# リモートからの情報取得


## リモートの表示
`git remote`

対応するURLを表示
`git remote -v`
fetch用、push用で2つ出てくる

## リモート詳細情報を表示
`git remote show <リモート名>`
`git remote show origin`

## リモートリポジトリの追加
最初のリモートリポジトリを作るのと同じ動き

リモートリポジトリは複数登録できる

`git remote add <リモートリポジトリ名> <リモートリポジトリURL>`
このコマンドの本質は、URLにエイリアスをつけること。Gitコマンドの中で、リモートリポジトリ名でURLにアクセスできるようにしているだけ


## リモートからの情報取得（フェッチ、プル）

「他人が加えた変更をローカルに持ってくる」という場面

### フェッチ（"取り出す"）

リモートリポジトリからローカルリポジトリに情報を持ってくる
**自分の手元（ワークツリー）に持ってくるわけ ではない**
ローカルリポジトリ　`remotes/<リモート名>/<ブランチ名>`　という場所に保存される

`git fetch <リモートリポジトリ名>`

例：リモートリポジトリだけに変更を加えるため、GitHubからhome.indexというファイルを追加してみる。
`git fetch origin` で、リモートリポジトリの情報をローカルリポジトリのremotes/origin/masterに保存する

この時点では、ローカルリポジトリ/masterには何の変更もない。
ただremotes/origin/masterという所定の場所にリモートリポジトリの情報を持ってきただけ。

内容を確認するには、ブランチを切り替える必要がある。
`git checkout origin/master`
lsしてみると、GitHub上で追加したファイルが表示されている。

いったんローカルリポジトリに戻る（`git checkout master`）
フェッチしてきた情報をワークツリーに、反映させるにはマージ（統合）を行う必要がある

`git merge origin/master`
「ローカルリポジトリに保存した、originリモートのmasterブランチ情報を、現在いるブランチ（この場合はローカルのmaster）に統合する」
**（リモートリポジトリから直接持ってきているわけではなくフェッチによってローカルリポジトリに保存した情報を使うため、
`git merge origin master`ではなく、`git merge origin/master`となる。）**
lsしてみると、GitHub上で追加したファイルがmasterにも反映されている。

### フェッチとマージを一気にやりたいときは、プル

`git pull <リモート名> <ブランチ名>`
※ `git pull origin master`については、`git pull`と省略できる

`git fetch origin master` + `git merge origin/master` = <font color="Red">   git pull origin master</font>
= **「指定したリモートリポジトリからローカルリポジトリに情報を持ってきて、現在いるブランチをその情報で上書きする」**

## ？？？フェッチとプルの使い分け

### プルの注意点
ローカルの統合先は、あくまでも<font color="red">現在自分がいるブランチ**（同じ名前のブランチ、とかではない）</font>

慣れるまでは、フェッチ + マージ がよい。

#リモート名の変更・削除

## 変更
`git remote <旧リモート名> <新リモート名>`
`git remote rename tutorial new_tutorial`

## 削除
`git remote rm <リモート名>`    rm => "remove"
リモートリポジトリそのものが削除されるわけではない
(GitHubには表示されている)
Swift クロージャのパターン

# この記事は何？
[前回](https://qiita.com/chino_tweet/items/cf6c6af02c45f8eac37e)、クロージャを定数オブジェクトに代入して、呼び出しました。
今回は、パラメータ・返り値の有無で、記述がどう変わるかを確認します。

## 実行環境
以下の環境で、動作を確認しました。
- Xcode10.2.1
- Swift5.x

# ハンズオン
コードを書いてみました。

##こんな関数があったとして
ランダムな整数を出力する関数 `randomNumber` です。

````swift:
func randomNumber() -> Void {
    print( Int.random(in: 1...Int.max) )
}

randomNumber()    // 1~最大整数のランダムな整数
````

`Void` は _存在しない_ と言う意味です。
つまり、`-> Void` は _返り値がない_ ってことになります。
これは省略可能な記述なので、普段のコーディングでは記述されません。

## クロージャのパターン
引数の有無で、全部で4つのパターンがあります。
いずれにしても `{関数の型 in 実装}` となっている点を意識してみると、ふーんって感じになれます。

#### 1. 引数なし・返り値なし

````swift:パラメータなし・返り値なし
let printRandomNumber = { () -> Void in
    print(Int.random(in: 1...Int.max))
}
````

#### 2. 引数あり・返り値なし
「出力するランダム整数の最大値」をパラメータとして指定できるようにしています。

````swift:パラメータあり・返り値なし
let printRandomNumberWithUpperBounds = { (upperBounds: Int) -> Void in
    print(Int.random(in: 1...upperBounds))
}
````

#### 3. 引数なし・返り値あり

````swift:パラメータなし・返り値あり
let getRandomNumber = { () -> Int in
    return Int.random(in: 1...Int.max)
}
````

#### 4. 引数あり・返り値あり
「取得するランダム整数の最小値と最大値」をパラメータとして指定できるようにしています。

````swift:パラメータあり・返り値あり
let getRandomNumberWithLowerAndUpperBounds = { (lowerBounds: Int, upperBounds: Int) -> Int in
    return Int.random(in: lowerBounds...upperBounds)
}
````

# ファーストクラス関数
オブジェクトに代入される関数のパターンを整理してみました。
が、「そりゃそうだ」みないな内容になってしまいました。
ちなみに...
_関数をオブジェクトに代入できる_ ことは、__第一級（ファーストクラス）関数__ と言う要件を果たすための１つだそうです。
ファーストクラス関数の要件には、他に...
_関数をパラメータとして、関数に渡せる_ ことなどがあるそうです。
三重対角行列の解法について(scipy.linalg.solve_banded)

三重対角行列については、scipy.linalg.solve_bandedを用いることで高速に解くことができる。GitHubにサンプルソースあり。

https://github.com/Daisuke0209/Basic_analysis/blob/master/190529_tridiagonal_equation.ipynb

三重対角行列は以下のようのもの

```math
A=
\begin{bmatrix}
a_{11} & a_{12}&0&0&0\\
a_{21} & a_{22}&a_{22}&0&0\\
0 & a_{32}&a_{33}&a_{34}&0\\
0& 0&a_{43}&a_{44}&a_{45}\\
0& 0&0&a_{54}&a_{55}\\
\end{bmatrix}
```
つまり、対角成分とその上下以外0となる行列。ちなみに、英語ではbanded matrixという。   
上の行列で$Ax=b$を解きたい場合、scipy.linalg.solve_bandedの使う前に、次の行列を準備する。

```math
\tilde{A}=
\begin{bmatrix}
0&a_{12}&a_{22}&a_{34}&a_{45}\\
a_{11}&a_{22}&a_{33}&a_{44}&a_{55}\\
a_{21}&a_{32}&a_{43}&a_{54}&0
\end{bmatrix}
```

つまり、三重対角成分を並べた行列である。  scipy.linalg.solve_bandedを用いて、$Ax=b$を解くには、 
   
scipy.linalg.solve_banded((1,1),$\tilde{A}$,b)


としてやればいい。以下実例を示すと、

```python
from scipy.linalg import solve_banded
import numpy as np
a = np.array([[5,2, 0, 0, 0],
              [1,4, 2, 0, 0],
              [0,1, 3, 2, 0],
              [0,0, 1, 2, 2],
              [0,0, 0, 1, 1]])
ab = np.array([[0,  2, 2, 2, 2],
               [5,  4,  3,  2,  1],
               [1,  1,  1,  1,  0]])
b = np.array([0, 1, 2, 2, 3])
x = solve_banded((1, 1), ab, b)
print(x)
np.dot(a,x)
```
これの実行結果は、

```python
[-1.    2.5  -4.    5.75 -2.75]
array([0., 1., 2., 2., 3.])
```
となる。
Pythonでmultiprocessingを用いて並列実行するときに、プロセスそれぞれの進捗バーをtqdmで表示する

# 概要
Pythonでmultiprocessingを使って並列処理を実行するときに、それぞれのプロセス毎に進捗を表示したい時があるかと思います。
そこで、tqdm を用いてプロセス毎にバーを表示してみました。

参考 : [tqdm](https://github.com/tqdm/tqdm)

# 目標
プロセス毎に独立してプログレスバーを表示！
<img width="650" alt="スクリーンショット 2019-05-29 17.16.13.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/263059/3c0690a4-c87e-cea3-ffff-ace2515d4e97.png">

# Code

```python
from time import sleep
import random
from tqdm import tqdm
from multiprocessing import Pool, freeze_support, RLock

L = 8


def long_time_process(p):
    info = f'#{p:>2} '  # 進捗バーの左側に表示される文字列
    for _ in tqdm(range(20), desc=info, position=p+1):
        sleep(random.random())
    return p * 2


if __name__ == '__main__':
    freeze_support()  # Windows のみ必要
    with Pool(L,
             # Windows のみ必要
             initializer=tqdm.set_lock, initargs=(RLock(),)) as p:
             result = p.map(long_time_process, range(L))
    print("\n" * L)  # tqdm終了後のカーソル位置を最下部に持ってくる
    print(result)

```

# 解説
`long_time_process`: 並列実行したい関数

`freeze_support, initializer, initargs`: Windowsでのみ必要になるそうです。Macではこれを省いても特に問題ありませんでした。

`position=p+1`: 本来はpositionは0から始まるため、画像を見るとわかるように、プログラムを実行したときに上に1行分のスペースができています。position=0から表示させると、一番上のプログレスバーが終了したタイミングで全体の表示がずれてしまうため、ここでは1から始めています。

(追記) positionの挙動については、OSや実行時環境により挙動が異なるようです。この辺り、`position=p` にするのか `position=p+1` にするのかは実際に試してみて綺麗に動くほうを採用するのがよいかと思われます。

# 結果
レイアウトが崩れることなく、プログレスバーの表示、及びその後のprint出力もできています。
<img width="649" alt="スクリーンショット 2019-05-29 17.17.04.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/263059/773eaab4-6f90-30ca-c5c0-a4404f354cfd.png">
Powershell 5.0 でアルファベットの範囲演算子の代替処理を実装する

# はじめに
Powershell 6.0 では、範囲演算子が拡張され、 `'A'..'Z'`とすると、`ABC...XYZ`の結果を返すようになるそうです。

私が使っているPowershell 5.0で使いたい場合の実装をメモします。

# 環境
Powershell 5.0
※6.0の方は、標準で提供されているものを使用してください。

# 実装
```powershell:範囲演算子の代替処理
#[byte][char]'A'
# -> 65
#[byte][char]'Z'
# -> 90

foreach ($num in 65..90) {
    $([char]$num)
}
```

実行すると、`A～Z`がずらーっと表示されます。

# 参考
Powershell 6.0 で範囲演算子が追加される件
https://blog.shibata.tech/entry/2015/12/03/000000

Powershellで文字をコードで扱う方法
https://hiros-dot.net/PowerShell/string/string06.htm
ABC071 C - Make a Rectangle

最初cnt[a[i]]で表示して、大きい方から見て行って、2以上countされている箇所をピックアップすればいいと思ったけど、vectorの要素数が10^9に対応できていなくて、詰まってしまった。

```ABC071C.cpp
#include <bits/stdc++.h>
using namespace std;

int main() {
 int n,acnt=0,bcnt=0;
 cin >> n;
  vector<long long> a(n);
  for(int i=0;i<n;i++){
    cin >> a[i];
  }
  long long b=0,c=0;

  sort(a.begin(),a.end(),greater<long long>());
    for(int i=0;i<n;i++){
      if(a[i]==a[i+1]){
        if(b==0)b=a[i];
        else if(c==0)c=a[i];
        i++;
      }
    }
    cout <<  (long long)b*c << endl;
  }

```
時刻なしの日付データを作る方法

# はじめに

今日からxxx日後の日付(時刻なし)を算出しFrom・Toといった範囲指定の値をつくる方法を考えてみました。
例）今日から1週間後の日付データを算出する。今日を(5/24)としたときは

 + From:2019-05-24T00:00:00.000 JST
 + To:2019-05-31T00:00:00.000 JST

といった感じです。

# 環境
+ OS: Windows10
+ Java:1.8.0.201
+ ASTERIA Warp : 1812

# フロー

Mapper関数だけですが最初は何も考えず、以下の構成で組み立てました。
<img width="405" alt="Now1.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/180292/c2cf1b6f-528d-b268-ac63-0b2d11f92268.png">

### Now関数で現在日時を取得
<img width="414" alt="Now2.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/180292/277d4948-93f1-46b9-8e3c-6adba5ced689.png">

### DateSplit関数で日付データを分割
![Now5.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/180292/b8b868d1-fd68-2a9c-bac6-72662d3d3d4c.png)

### DateTimeEx関数で分割した値をもとに日付データを作成(日付部分のみ)
<img width="496" alt="Now4.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/180292/a64471d6-7909-3514-c2f8-2d77a1b22f72.png">

時分秒には固定で`0`をセットしています。

## Now関数の「時刻を指定しない」プロパティを使う

Now関数のプロパティをよくみると「時刻を指定しない」というプロパティを発見。
![Now6.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/180292/00020a07-7e60-90a6-5f8a-7a65b3b4c0cf.png)


時刻なし(00:00:00.000)の日付データが取得できるので、圧倒的にシンプルになりました。

![Now8.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/180292/ab6a5673-abe8-3c3f-a926-30c392509701.png)


### Now関数で現在日時を取得してDateCalc関数で計算対象を`日`にして加算
![Now7.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/180292/1fd2094d-eecd-8944-1bb8-116169128bdf.png)

だけです。

# 終わりに
時刻なしの日付データをNow関数1つで作れるんですね。見落としてました。基本的な関数でもプロパティをよくよくチェックすると新しいアイディアや発想が浮かぶかもしれません。

以上です。
Awakeってインスタンス化直後に呼ばれるものじゃないの……？

# 前置き
- Awake=インスタンス生成時処理だと思って実装してきた
- そしたら違かった
- 親子関係含めてどういう挙動なのか再確認したくなった

# 結論
- Awakeはインスタンス化後、初めてActiveになったタイミングで実行される。

# 環境
- Unity 2018.4.1f1

# 実験スクリプト

```AwakeTest.cs
using UnityEngine;

public class AwakeTest : MonoBehaviour
{
    public string objectName = null;

    void Awake()
    {
        Debug.Log("Awake!" + objectName);
    }
}
```

objectNameはどのオブジェクトかを判別するために使用。

# 挙動確認
## 0. 前提
こんな感じでGameObject/Cube/Sphereに上記のスクリプトをアタッチして、ObjectNameにはオブジェクト名をそのまま設定しておく。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/87713/4ae3bcab-a22f-f36c-529c-5a419b5f2fd6.png)

GameObject/Cube/Sphereのactive状態を切り替えての実験。

## 1.初めからActive
- 実行前のactive状態  
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/87713/6091e135-7aed-b1a2-d2c0-7bd0e9a73025.png)

- 実行時log
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/87713/4f678b2d-8ba9-32e4-c231-a5c1945bdbfc.png)

生成と同時にActive状態なので、実行後すぐ呼び出される！

## 2.初めはDeactive

- 実行前のactive状態
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/87713/56e20ad2-8ee9-3367-5796-628691af2155.png)

- 実行時log
何もでない！
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/87713/58bb2b25-87e7-1dc1-db30-17ebe444f172.png)

- 手動でGameObjectをActive
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/87713/23365dbc-4e06-e138-092c-a35c102e2623.png)

- Active後のlog
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/87713/5b3b95af-5bcd-02a3-1591-5a16259659eb.png)

インスタンス生成後、はじめにActiveになったタイミングでの実行は本当だった。

## 3.子要素だけ一部Deactive

- 実行前のactive状態（CubeだけDeactive）
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/87713/a05a06df-ceb9-1733-cf22-81e5c3078b81.png)

- 実行時log
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/87713/deae534a-6443-99bc-a76e-17a1a48ba27d.png)
Cubeだけ出ない！
→CubeをActiveにすると、logもちゃんと出た。

## 4.それでも僕はインスタンス化直後に処理を書きたいんだ！
### スクリプトの修正
コンストラクタ定義してみるは？

```AwakeTest.cs
using UnityEngine;

public class AwakeTest : MonoBehaviour
{
    public string objectName = null;

    public AwakeTest()
    {
        Debug.Log("Init!" + objectName);
    }

    void Awake()
    {
        Debug.Log("Awake!" + objectName);
    }
}
```

### 実験
3.子要素だけ一部Deactiveに該当する条件で、実行後に `Init!Cube` って出力されれば勝ち！

- 実行時log

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/87713/ad3d5e4f-aa38-0c21-6513-b88884cb89a0.png)

🤔...

基本MonoBehaviour継承するケースではイベント関数使いましょうということですね。（newするのもダメだし）
それでもどうしても……！という場合は、Prefab定義してInstantiateして生成直後に専用の処理呼び出すとか、やり方によってはできそうな雰囲気。

# 再度結論
- Awakeはインスタンス化後、初めてActiveになったタイミングで実行される。
- Unity使う以上、Unityの鉄則に従おう。


# 参考
- [イベント関数の実行順](https://docs.unity3d.com/ja/2018.2/Manual/ExecutionOrder.html)
- [【Unity】僕はAwake()のことを知っているようで知らなかったんだ](https://www.urablog.xyz/entry/2017/07/28/081418)
Swift Closureのキホン

# この記事は何？
Swiftプログラミングを理解する上で欠かせない _Closure（クロージャ）_ について、キホンから勉強できます。

## 実行環境
Xcode10.2.1
Swift5.x

# ハンズオン
実際にコードを書いて、確認します。

## カンタンに言うと
クロージャを使うと、関数をオブジェクトとして扱えるようになります。
関数を _何かしらの目的を果たしてくれる機能_ として捉えてみましょう。
そんな表現で、クロージャを使うと...

- 機能をオブジェクトに代入する
- 機能をパラメータとして関数に渡す

みたいなことができます。


### 普通の関数
こんな関数 `sum(numbers:)` があったとします。
この関数は、整数の配列になっている各要素の合計値を計算してくれます。

````Swift:
func sum(numbers: [Int]) -> Int {
    var total = 0
    for number in numbers { total += number }
    return total
}
````

パラメータとして `[Int]` を受けて、`Int` を返していることに注目しておきましょう。
これは、この関数の型 `[Int]->Int` です。

実行すると...

````Swift:
sum(numbers: [1, 2, 3])    // 6
````
`1 + 2 + 3 = 6` ですね。

### クロージャ
同じ機能をクロージャで表現します。

````Swift:
let sumNumbers = { (numbers: [Int]) -> Int in
    var total = 0
    for number in numbers { total += number }
    return total
}
````

クロージャを定数オブジェクト `sumNumbers` に代入してる感じです。
`{ 関数の型 in 実装 }` の部分がクロージャです。
関数の型だけに注目すると...
`(numbers: [Int]) -> Int` となっています。
最初の関数 `sum(numbers:)` と同じ型になっていますね。
__機能をオブジェクトに代入する__ ことができました。
この定数オブジェクトの機能を実行するには...

````Swift:
sumNumbers([1, 2, 3])    // 6
````
と記述します。
結果は `1 + 2 + 3 = 6` ですね。

# クロージャのパターン
この記事で扱ったクロージャは...
_引数あり・返り値あり_ な機能でした。と言うことは、他にも...

- 引数なし・返り値ありなクロージャ
- 引数あり・返り値なしなクロージャ
- 引数なし・返り値なしなクロージャ

があるんでしょうね。
Git　操作取り消しメモ 自分用メモ

## ファイルへの変更を取り消し
git add、git commitなどをしておらず、単純にファイルへの変更を取り消したい場合

＝ **ローカルリポジトリの状態を、ステージの情報と同じにする**

`git checkout ファイル名`

`git checkout ディレクトリ名`

`git checkout .` 全ファイルについての変更を取り消す

## ステージに追加した(git add)変更を取り消し

= **最新のコミットを参照して、ステージの内容を上書きしている**

`git reset HEAD ファイル名 or ディレクトリ名 or .`
* `git checkout --`と違い、ローカルリポジトリには影響しない。
ローカルリポジトリの変更も取り消したい場合は、git reset HEAD後に、`git checkout --`する



## コミットをやり直す

誤ったコミットをしてしまった場合。
正しい変更を加えた状態で`git add .` 後
`git commit --amend`
= **最新のコミットを、現在のステージの状態で上書きする**

Pushしてからこれやると大変なことになる。
（Pushの内容を直したい場合は、普通に`git commit`してPushする？？？）
Cognos Analytics データモジュール 新規データアイテムの作成

#新規データアイテムの作成
エンドユーザー向けの簡易データモデリングツールである、「データモジュール」にて、計算式を使った新規のデータアイテムを作成します。※下図の「積算」「売上」「製品ライン_タイプ」を作成
![017.JPG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/147246/29db792b-1076-183b-233f-07ac4192d06e.jpeg)


#手順
C2で作成したデータモジュールを開始点とする。
![001.JPG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/147246/8751544d-3cdf-ab74-a514-340e6d785d7f.jpeg)

Ctrlキーを押しながら「数量」と「単価」を選択し、「・・・」から「計算式を作成」を選択。
![002.JPG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/147246/2d2b23df-4f87-f4cf-8de9-7de99263f51e.jpeg)

名前を「売上」として、式の演算子を「ｘ」に変更し「OK」。
![003.JPG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/147246/e82edc35-bae7-b867-a628-89847c2280a9.jpeg)

新データアイテム「売上」が作成される。
![004.JPG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/147246/9a173cf7-1f1a-79a7-f189-8985f32840aa.jpeg)

次に、表にあたる「販売実績.csv」の「・・・」から「計算」を選択。
![005.JPG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/147246/6e030b90-77c2-cbc6-cd5f-ede1eb7e2d6d.jpeg)

この様にデータアイテムを選択せずに、新規に計算式を作成した場合、計算エディターとして開かれる。
![006.JPG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/147246/ddefcab1-f49e-ef75-4b3d-009be5515dd0.jpeg)

名前を「積算」として、f(x)タブから関数一覧を開き「running-total」を式にドロップし、以下のように記載する。
**running-total (数量)**
![007.JPG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/147246/d8361e79-858d-82f2-104d-5806ae42ccfa.jpeg)

次に、文字データアイテムを連結できるかやってみる。
「製品マスタ.csv」の「・・・」から「計算」を選択。
![008.JPG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/147246/90989293-1b12-9da2-6f54-eb0ca23d9712.jpeg)

名前を「製品ライン_タイプ」として、以下のように記載。
**製品ライン || '\_' || 製品タイプ**
![009.JPG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/147246/17704ef5-fc08-4f22-0450-c495aeba886e.jpeg)

「グリッド」タブで「販売実績.csv」を選択して、表示される結果データを確認する。
![010.JPG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/147246/70ba1bb4-524d-68db-01ed-fda2c1108fc7.jpeg)

「製品マスタ.csv」も同様に確認する。
![011.JPG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/147246/e36687ce-23e7-8530-f195-9c0590ccab15.jpeg)

データモジュールを保存し、新規レポートからデータソースとして開いて確認。
リストを配置し、製品に対する「積算」や「売上」の新規アイテムを配置する。
![012.JPG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/147246/4fce10c0-7117-855d-5dca-11dcef393be3.jpeg)

レポートを実行すると、意図した結果となっている。
![013.JPG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/147246/fded8206-c564-d37a-431f-45b58e7c1f7c.jpeg)

「製品ライン_タイプ」も「製品タイプ」と同じ集計結果になっている事がわかる。
![016.JPG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/147246/21621e13-25df-38cc-f4f4-91873d41382e.jpeg)


#自己学習記事一覧
**Cognos Analytics をエンドユーザーの方に自己学習して頂くためのサイト**
https://qiita.com/shinyama/items/95885c7246dc413b6448
【Google Playに更新ボタンが出ない問題】の解決＆備忘録

【きっかけ】
---

すでにリリース済み(Version 1.0)のアプリをアップデートしようと思い、
通常通りGoogle Play Cosoleでapk(version 1.3)を追加し、リリース処理をした。
それが無事に通過してgoogle Play上ではversion 1.3などと表示されている。

にもかかわらず「更新」とか「アップデート」ボタンが表示されない！
つまり、既存のユーザーがアップデートできない！！！
という問題に直面したので、その原因と解決方法を記載しておきます。
原因はとても恥ずかしいものですが、この問題になかなか気づけなかった自分への反省の意を込めて記載します。

【原因】
---
【リリース済のapk】version 1.3のBundle Version Codeが「1」となっていて
【更新させたいapk】version 1.0のBundle Version Codeが「2」となっていた。

Google Play Console上からも確認します。
左メニューから
　<b>リリース管理　＞　アプリリリース　＞　製品版トラック　＞リリース履歴</b>
とたどると、過去のバージョンコードが表示されます。
![怒るおじさんーバージョン履歴比較.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/21780/2728495e-1b2a-4bb6-2787-ec99e0de953d.png)

version 1.3（バージョンコード 1） < version 1.0（バージョンコード 2）

バージョンコード(Bundle Version Code)が新しいやつの方が小さい値だった！
---
簡単に言うとこれが原因です。

どういう意味かを解説しますと、
Unityでは<b>「Bundle Version Code」</b>（Google Play Console上では<b>「バージョンコード」</b>と呼ばれるもの）の数値が
<font color="Magenta"><b>大きいものがgoogle ストア側で「新しい」と判断される</b></font>ということなのです。
ここでいうversion 1.0とかversion1.3というのが<b>「ストアに表示させる便宜上のバージョン名」</b>なので、これはバージョン管理にはまったく関係ない！ってことなのです。

上記の場合のBundle Version Codeが
version 1.3 < version 1.0
となっていたためversion 1.0の方が新しいアプリと判断され、そのため「更新」ボタンが表示されなかったのです。
ただ、アプリをアンインストールして、Google Playストアからインストールするとversion 1.3になっちゃいます。
googleのサポートさんにいろいろと問い合わせしたのですが、結局は自分のBundle Version Codeのミスとたどり着きました！
そもそも、なんでversion 1.0でBundle Version Codeを２として登録したのかが意味不明ですが、
これ以上過去の自分を責めても仕方ないのでやめておきます。

【言い訳】
いや、当然と言えば当然なんですが、iOSだとversion とコードがセットで管理されてるんですよね。だからそのなんというか…


【結論】Bundle Version Code（バージョンコード）は必ず前のアプリのバージョンより新しくすること！
---
CustomVision と Edge デバイス（de:code2019パーソナルスポンサー　提供サンプルコード）

Microsoft Azure Cogniyive ServicesのCustomVision（以下 CustomVisionと表記します）を利用すると独自のオブジェクト認識モデルを簡単に作ることができます。作成したモデルはREST APIから利用することもできますが、モデルを出力してスタンドアローンで利用することもできます。
今回のサンプルコードではCustomVisionで7種類の犬を判別するモデルを作成し、出力したモデルを使ってRaspberryPi上で推論を実行してみます。

#実行環境
RaspberryPi3(Raspbian Stretch 04/08)
Tensorflow 1.13
OpenCV4.1.0

Windows10 PC(CustomVisionのモデル作成に使用）
ブラウザが利用できればなんでも可

#モデルの作成
・次の[URL](https://github.com/linyixian/decode2019sample)からサンプルコードをPCにダウンロードします。

・ダウンロードしたフォルダにある「dogs.zip」を解凍します。

・CustomVisionの[サイト](https://www.customvision.ai/)にログインします。
![0.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/62606/37bb4496-b517-d46a-1514-f3c30faa2942.png)

・「New Project」をクリックします。
![01.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/62606/c1194aa5-f3b5-f2f9-f463-c1b0b4731ab2.png)

・次の画面で
  「Name（任意）」、
  「Project Types：Object Detection」、
  「Domains：General(compact)」、
  「Export Capabilities：Basic platforms」
を入力します。
![02.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/62606/4e7c011a-acf3-e7be-be77-bcaab5364ca1.png)

・ファイルアップロード画面に移ります。
![03.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/62606/6a85966c-09e5-2d95-a118-d9808e81b52a.png)

・解凍した犬のデータを1種類アップロードします。
![04.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/62606/28469930-fcd6-7038-dd4a-a5dfd00b7795.png)

・続いてアップロードした画像のアノテーションを行います。
　マウスカーソルを対象のオブジェクトに近づけると枠が表示されるのでサイズを調整して、タグ名を登録します。もし枠が表示されない場合は対象をドラッグして囲みます。アップロードした画像すべてにタグをつけていきます。
![06.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/62606/9e96f1b4-129a-f7de-cb50-8c1ff1f859f9.png)

・アノテーションが完了したら「testset」以外残りの画像もフォルダごとに同様の作業を繰り返します。
![11.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/62606/b1bfcbe7-cb4c-db59-c5c7-1b28a1f854e0.png)

・すべての作業が完了したら、「Performance」タブをクリックします。「Train」ボタンをクリックし、トレーニングを開始します。
![07.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/62606/af380c72-fbb5-caa1-37b0-70dda412a03e.png)

・トレーニングが完了すると次の画面になります。
![08.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/62606/bc6d9a7b-96a0-4003-dd46-91dd9285be93.png)

・「Export」をクリックします。
![08-1.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/62606/d3e87aa2-35c8-46c9-97eb-4d2cd623315b.png)

・モデルの出力形式を選択します。「Tensorflow」を選んでください。
![09-1.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/62606/1acddf51-b711-d7d1-c14a-18c5e4abd361.png)

・「Export」ボタンをクリックします。
![10.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/62606/be3d4340-2fc2-4a61-6de0-2a340370e884.png)

・次の「Download」ボタンをクリックしてPCに保存します。
![11.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/62606/18fd44a0-4674-2299-ee0e-59907c494dbb.png)

・ダウンロードしたファイルを解凍し、「model.pb」、「label.txt」をRaspberryPiに用意したサンプルコードのディレクトリにコピーします。
![12.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/62606/1eb5906a-4bff-2eda-015f-f5e340eac1ff.png)

・RaspberryPiのターミナルを起動して、サンプルコードのディレクトリに移動します。

・コマンドラインから「python3 predict.py （認識させる画像ファイル）」を実行します。

・無事認識されたら犬が写っている範囲と犬種、確率が表示されます。
【Vue.js】v-modelの基本的な使い方と、修飾子の使い方

### 本記事について

v-modelの挙動と、v-modelでのinputタグの値の取得のTipsを記載します。

### 目次
・v-modelとは
・v-modelを使ってみる
・v-modelで使う修飾子

### v-modelとは
v-modelとはそもそも何なのか。
[公式ドキュメント](https://jp.vuejs.org/v2/guide/forms.html#%E5%9F%BA%E6%9C%AC%E7%9A%84%E3%81%AA%E4%BD%BF%E3%81%84%E6%96%B9)によると
> form の input 要素 や textarea 要素、 select 要素に双方向 (two-way) データバインディングを作成するには、v-model ディレクティブを使用することができます。それは、自動的に入力要素のタイプに基づいて要素を更新するための正しい方法を選択します。

とのことです。うーん、ちょっとわかりにくい。。

とりあえず、コードを書いて理解してみましょう。

### v-modelを使ってみる

とても基本的な使い方ですが、まずはHTMLに下記のように書きます。

```html:index.html
<!-- Vue.jsが読み込まれている前提 -->
<div id="app">
  <input type="text" v-model="sample_v_model" placeholder="sample_v_model"><br>
  <p>ここにsample_v_modelの値をリアルタイムに表示: {{ sample_v_model }}</p>
</div>

<script>
new Vue({
  el: "#app",
  data: {
    sample_v_model: ''
  }
})
</script>
```
inputタグに```v-model="sample_v_model"```という記述があります。
そして、scriptタグの中身に```sample_v_model: ''```という記述があります。

new Vueとして、Vueインスタンスを作っているわけですが、それをマウントする先が```#app```で囲まれた箇所になるので、HTML側の```v-model="sample_v_model"```とjs側の```sample_v_model: ''```が紐づいているのですね。

公式ページに書いてあった、「双方向 (two-way) データバインディングを作成するには、v-model ディレクティブを使用することができます」という部分がこれに当たるのだと理解できました。

jsの方ではsample_v_modelというデータを持っていて、ページが読みこまれた表示された時にはその中身は空っぽ、そして、inputタグも空っぽという状態です。なので、ページが表示された時には

・inputタグの中身は空っぽ
・js上で定義されたデータの中身も空っぽ

ということになります。

↓こんな感じですね。

<img width="506" alt="スクリーンショット 2019-05-29 16.12.03.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/76779/af7695f6-786b-1636-bed5-244bc3a46b31.png">

これで、v-modelの基本的な使い方を理解することができました。

### v-modelで使う修飾子
今回はinputタグの中身を計算する上で数値にする必要があり、そのデータをHTML上にも反映しようとしたところ、v-forの部分でそれがうまくいかず、「100」と入力すると。「1」「0」「0」と入力されたと見なされてしまったので、その解決のためにnumber修飾子を使いました。

その実際のコードがこちらです

```html
<div class="">
  <label for="number_of_years">運用する年数</label>
  <input type="number" v-model.number="number_of_years" placeholder="運用する年数を入力してください">年
</div>

(略)

<tr v-for="number_of_year in number_of_years">
  <th>{{ number_of_year }}年後</th>
  <td>{{ Math.round(amountOfShare * Math.pow(rateOfIncrease, number_of_year)) }}</td>
</tr>
```
これで、無事に数値としてnumber_of_yearsをv-forのところで使う数値の部分に入れることができました。

今回はnumberを使いましたが、他にも修飾子があったので下記にまとめておきます。

|修飾子|内容|
|---|---|
|lazy|入力ボックスに入力されたタイミングではなく、入力し終わったタイミングでデータを変更する。|
|number|入力した値の型変換を自動で数値にする。|
|trim|入力した値から自動で空白を削除する|

それぞれ使うタイミングが出てきたら具体的な例も追記できればと思います。
Ruby CSV 取り込み ヘッダーの上にいらない行がある場合の処理

# はじめに
CSV取り込み処理を作ることって結構ありますよね？
たまに１行目がヘッダーではないCSVデータってありますよね？
あれ何なんでしょうね？
何でそんなことをするのかわからないんですけど、取り込まないといけないですよね？（使命感）

# どんなデータ？
こんなデータ
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/147005/0edd92c4-4283-a961-deb3-1d7328baf593.png)

# 実装
1、2行目をスキップして行を配列として取得するだけなら単純なんですが、
CSV.foreachと同じようにrow['ヘッダー名']でデータを取得できるようにするには一工夫が必要です。

```ruby
# CSVをオープン
csv = CSV.open(
  path,
  undef: :replace,
  replace: '?'
)

# ヘッダの上に邪魔な行が2行あるので除去
csv.readline
csv.readline

# ヘッダを退避
header = csv.readline

csv.each do |row|
  # CSV.foreachと同じようなデータの取り方にパース
  row = CSV.parse_line(row.join(','), headers: header)
end
```

# おわりに
邪魔な行があったりなかったりする場合の処理はよしなにやってください。

ブログで見たい方はこちら
[Ruby CSV取り込み ヘッダーの上にいらない行がある場合の処理](http://nabesys.com/article/2019/05/29681/)
通り魔を自動で感知し110番通報するAI

昨日、川崎で[通り魔殺傷事件](https://ja.wikipedia.org/wiki/%E5%B7%9D%E5%B4%8E%E6%AE%BA%E5%82%B7%E4%BA%8B%E4%BB%B6)が発生しました。人工知能で何かできないかと思い考えてみました。

![川崎殺傷事件.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/208363/fa109609-aac0-d7e9-f9a8-406736aeb52d.png)

## ①通り魔を感知
刃物を持っているかどうかで通り魔か判断します。
データセットは、AGH科学技術大学の[Knives Images Database](http://kt.agh.edu.pl/~matiolanski/KnivesImagesDatabase/)からダウンロードしました。
![Sample-images-from-the-knife-detection-dataset-positive-and-negative.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/208363/f3b5b316-ab26-66bf-ac72-bdd4db914421.png)
刃物を持っているかどうかで2クラス分類を行います。
![cloud.google.com_automl_ui_vision_datasets_evaluate_dataset=ICN2236136325597437171&model=ICN6762080808297186833&project=knives-detection.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/208363/a05abb0a-720c-d85b-027a-97ab65792380.png)

精度は、99.9%と通り魔をほぼ完全に認識できました。

EdgeTPUで認識すると200fps(レイテンシ5ms)で認識可能です。
![cloud.google.com_automl_ui_vision_datasets_train_dataset=ICN2236136325597437171&model=ICN5762911230117943738&project=knives-detection.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/208363/ba24e914-f14d-341f-d6bf-b4c6ecf1c167.png)

最近はTecoGANやSENetなど超解像技術の進歩がめざましいのでコンビニのような荒くてノイズが入るカメラでも高精度で認識することが可能です。

## ②警報を鳴らす
コンビニなどの警報機と連携がんばる
警報ブザーを鳴らすことで周囲に危険を伝え逃げる時間を与えたり、犯人を動揺または抑止させることができるかも知れません。

## ③110番通報
AmazonConnectで110番通報(未検証)
問い合わせフローを作成
![retirement2.awsapps.com_connect_contact-flows_edit_id=arn_aws_connect_ap-northeast-1_933720645938_instance_c966ced7-ca79-43f3-af67-dbe8da954848_contact-flow_875a14b4-3685-47ee-9fcd-8a233d0470c6.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/208363/b3d46878-74ea-ad3e-9e90-91e916da93d7.png)

場所は、柔軟に変更できるようにしました。
![retirement2.awsapps.com_connect_contact-flows_edit_id=arn_aws_connect_ap-northeast-1_933720645938_instance_c966ced7-ca79-43f3-af67-dbe8da954848_contact-flow_875a14b4-3685-47ee-9fcd-8a233d0470c6 (1).png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/208363/332e1ec2-e8a9-7748-1455-6a9e0f1c88ca.png)

startOutboundVoiceContact APIで110番に通報(未検証)

```javascript
// import entire SDK
var AWS = require('aws-sdk');
 
// load config file
AWS.config.loadFromPath('./config.json');
 
// create amazon connect object
connect = new AWS.Connect({apiVersion: '2017-08-08'});
 
// create API request parameter
var params = {
  Attributes: {
    location: 'ファミリーマート登戸新町店'
  },
  ContactFlowId: "875a14b4-3685-47ee-9fcd-8a233d0470c6",
  // 電話番号をE.164形式で設定するため、例えば「050-0000-0000」の場合は、
  //国番号（日本：81）を付けて以下のようになります。
  DestinationPhoneNumber: "+81110",
  // amazon connectのコールセンターのインスタンスID
  InstanceId: "c966ced7-ca79-43f3-af67-dbe8da954848",
  // 電話番号の設定方法は、DestinationPhoneNumberと同様
  SourcePhoneNumber: "+810000000000"
};
  
// call API with parameter
connect.startOutboundVoiceContact(params, function(err, data) {
  if (err) {
    console.log(err);
  } else if (data) {
    console.log(JSON.stringify(data));
  }
});
```
スマホに掛けて動作確認はしましたが、緊急性のない110番は迷惑となるため検証してません。

# まとめ
防犯カメラをコンビニだけでなく、バス停やバスにも取り付けて、このシステムを実用化すれば、致命傷を回避できるかもしれません。
そもそもいくら対策を講じても通り魔を0にすることは難しいと思います。(対策を否定するわけではない)
危険を1秒でも早く察知することで、もっと救える命があるかもしれません。
Docker on Storybook@Vueを最小構成で動かす

# 何時もの備忘録として

- docker-compose runの仕様にはまった

## まずはチュートリアル通りに動かす

[こちら](https://storybook.js.org/docs/guides/guide-vue/)を参照に進める

## docker-compose.ymlの準備

```yml
version: '3'
services:
  node:
    image: node:12.3.1-alpine
    volumes: 
      - ./:/app
    working_dir: /app
    ports:
      - 9001:9001
```

## モジュールをインストール

```
docker-compose run node npm init
docker-compose run node npm install @storybook/vue --save-dev
docker-compose run node npm install vue --save
docker-compose run node npm install vue-loader vue-template-compiler @babel/core babel-loader babel-preset-vue --save-dev
```

## package.jsonの編集

以下を追加

```package.json
{
  "scripts": {
    "storybook": "start-storybook --ci -p 9001 -c .storybook",
  }
}

```

## 設定ファイルを作成

.storybook/config.jsを作成 .storybookディレクトリに注意

```.storybook/config.js
import { configure } from '@storybook/vue';

function loadStories() {
  require('../stories/index.js');
}

configure(loadStories, module);
```

./stories/index.jsを作成

```index.js
import Vue from 'vue';
import { storiesOf } from '@storybook/vue';
import MyButton from '../components/Button';

storiesOf('Button', module)
  .add('with text', () => '<my-button>with text</my-button>')
  .add('with emoji', () => '<my-button>😀 😎 👍 💯</my-button>')
  .add('as a component', () => ({
    components: { MyButton },
    template: '<my-button :rounded="true">rounded</my-button>'
  }));
```

./components/Button.vueを作成

```Button.vue
//何でもいいので作る

<template>
  <button @click="hello">hello</button>
</template>

<script>
export default {
  methods: {
    hello: e => {
       alert('hello');
    }
  }
}
</script>
```

そして

```
docker-compose run run node run storybook
```

でブラウザが開かない。。。

[docker-compose runの仕様でそのままだとportsのマッピングが効かない](https://github.com/docker/compose/issues/1259)。知らなかった。。。

気を取り直して

```
docker-compose run --service-ports node npm run storybook
```

[localhost:9001](http://localhost:9001)でStorybookが確認できる

<img width="1428" alt="スクリーンショット 2019-05-29 16.32.46.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/133718/f43a3e19-a6ee-2809-3a7f-09ca4b327855.png">

## 参考

[チュートリアル](https://storybook.js.org/docs/guides/guide-vue/)
[Issue](https://github.com/docker/compose/issues/1259)
【Rails】ネストされたcontroller宛てのform_withの書き方


namespaceでnestされたcontroller(**Admin::User**など)のアクション宛てformを
**`form_with`**で記述したい場合の雛形になります。


#書き方
## ◆ new → create

new.html.erbのviewから**`Admin::UsersController`**の`create`アクションへ送りたい場合、htmlレベルでは

```
<form action="/admin/users" method="post" >
  <input type="text" name="user[name]">
</form>
```
こうなっていてほしいが、form_withではどう記述すればよいか？

###① model: を使う方法
`model:`で@userを指定し、`url:` でpathを指定します。

```new.html.erb
<%= form_with model: @user, url: admin_users_path, local: true do |f| %>
  <%= f.text_field :name %>
<% end %>
```

###② model: を使わない方法
`scope:`で`:user`を指定し、 `url:`でpathを指定します。
`scope: :user`によってパラメーターの`user[]`を生成するようです。

```new.html.erb
<%= form_with scope: :user, url: admin_users_path, local: true do |f| %>
  <%= f.text_field :name %>
<% end %>
```



（ちなみに、`scope: :user`をなくすと）

```new.html.erb
<%= form_with url: admin_users_path, local: true do |f| %>
  <%= f.text_field :name %>
<% end %>
```

↓htmlレベルでは

```
<form action="/admin/users" method="post" >
  <input type="text" name="name">
</form>
```

`user[name]`ではなく、`name`になっています。

## ◆ edit → update
同様に、edit.html.erbから**`Admin::UsersController`**の`update`アクションへ送りたい場合、htmlレベルでは

```
<form action="/admin/users/3" method="post"><input type="hidden" name="_method" value="patch" />
  <input type="text" name="user[name]">
</form>
```
こんな感じになっていてほしいが、form_withではどう記述すればよいか？

###① model: を使う方法
`model:`で@userを指定し、`url:` でpathを指定します。

```edit.html.erb
<%= form_with model: @user, url: admin_user_path, local: true do |f| %>
  <%= f.text_field :name %>
<% end %>
```

###② model: を使わない方法
`scope:`で`:user`を指定し、 `url:`でpath、`method:`で`:patch`を指定します。

```edit.html.erb
<%= form_with scope: :user, url: admin_user_path, method: :patch, local: true do |f| %>
  <%= f.text_field :name %>
<% end %>
```

（ちなみに、`method: :patch`をなくすと）

```edit.html.erb
<%= form_with scope: :user, url: admin_user_path, local: true do |f| %>
  <%= f.text_field :name %>
<% end %>
```
↓htmlレベルでは

```
<form action="/admin/users/3" method="post">
  <input type="text" name="user[name]">
</form>
```
`<input type="hidden" name="_method" value="patch" />`が無くなりました。
これにより**「htmlメソッドはpatchという体裁で送っているよ」**というメッセージが消えたので、railsサーバーは**POST**が届いたと認識します。(詳しくは[こちら](https://qiita.com/yusaku_/items/54479e5744cd7af31f89))
methodがPOST、pathがadmin_user_pathの組み合わせは存在しないので、**Routing Error**になるはずです。

#結論
form_withでは`model:`を使えば空気を読んで自動翻訳くれるのでかなり楽。
しかし、nestされている状態とpathまでは空気読みきれないので、`mode:` と`url:`のセットを使えばOK.
AndroidStudioでJavaからCをCからJavaを

AndroidStudioでNDKを使っているとJavaからCを呼ぶのは簡単ですが、時々CからJavaを呼び出したくなるので覚書
（AndroidStudio 3.4.1を使用しています）
■Setp1：プロジェクト作成
---
![2019-05-29 (1).png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/122121/88197d2e-6a37-bc0d-0d26-f2e3b373dbb4.png)
AndroidStudioの「File」「New」「New Projekut」でプロジェクトを作成します。
![2019-05-29 (3).png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/122121/addcacdd-ccd9-8400-d443-e468e57e0f31.png)
今回はJavaからCを呼びたいので「Native C++」を選択し「Next」で次の画面に
![2019-05-29 (4).png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/122121/02bef90b-fb25-ce97-87b7-fa8707576dd8.png)
Nameは適当に今回は「test01」
Save locationで今回作成するプロジェクトディレクトリを指定
Languageは「Java」で作成をします、設定ができたら「Next」で次の画面に
![2019-05-29 (5).png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/122121/f7509eeb-519c-3db3-51c9-ac75d35db043.png)
ここはただ単に「Finish」を選択します。
（この画面ではC++11とか、C++14を使う設定ができますが、後からでも設定できるので無視）
![2019-05-29 (6).png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/122121/d6af331b-c50e-d6ed-90b1-dc6a781ae167.png)
こんな画面がでたら、とりあえず、プロジェクト作成できました。
■Setp2:JavaからC
---
プロジェクト作成した時点で、JavaからCを呼び出すソースになっています。
実行すれば「MainActivity」のなかから「stringFromJNI()」をよんでいるので、native-lib.cppの「Java_l_toox_test01_MainActivity_stringFromJNI」が呼ばれています。
（細かい話は、別途勉強しましょう）
■Step3:CからJava
---
[MainActivity.Java]にCから呼ばれる関数「testFunc」を追加します。

```java:MainActivity.java
package l.toox.test01;

import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.widget.TextView;

public class MainActivity extends AppCompatActivity {

    // Used to load the 'native-lib' library on application startup.
    static {
        System.loadLibrary("native-lib");
    }

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        // Example of a call to a native method
        TextView tv = findViewById(R.id.sample_text);
        tv.setText(stringFromJNI());
    }

    /**
     * A native method that is implemented by the 'native-lib' native library,
     * which is packaged with this application.
     */
    public native String stringFromJNI();

    public void testFunc(){
    }
}
```

次にCからJavaを読みだす部分。[Native-lib.cpp]を以下のように修正します。

```c:native-lib.cpp
#include <jni.h>
#include <string>

extern "C" JNIEXPORT jstring JNICALL
tugini 
        JNIEnv *env,
        jobject in_thiz) {

    jobject my_class = env->NewGlobalRef(in_thiz);
    jclass clazz = env->GetObjectClass(my_class);
    jmethodID mobj = env->GetMethodID( clazz, "testFunc", "()V" );
    env->CallVoidMethod( my_class, mobj );
    env->DeleteLocalRef( clazz );

    std::string hello = "Hello from C++";
    return env->NewStringUTF(hello.c_str());
}
```
（引数が　jobject in_thiz　となっている事を注意してください。）

これで実行すればCからJavaを呼び出しています。
![2019-05-29 (10).png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/122121/966c5c48-3a21-3db1-aa82-c9dfed611bc3.png)
デバッグ実行でブレークもはれます。
UWP Tips - Flyoutに配置したTextBoxを編集可能にする

#概要
UWPのサンプルアプリを作成する中でつまづいたことを書き留めておく備忘録。
タイトルに書いている通り、Flyoutに配置したTextBoxに値が入力できなくて困った話。

#解決策
今回作成したサンプルアプリは、Face APIを呼び出す仕様で、
そのAPI Keyを設定するUIをFlyoutで表示するTextBoxで実現しようと
考えてました。

フツーにTextBoxタグを書いただけでは、
なぜか編集できない・・・。

で、AppBarButton側にこれを入れたら編集できるようになります。
_AllowFocusOnInteraction="True"_



```
<AppBarButton Icon="Setting" Label="API Key Setting" AllowFocusOnInteraction="True">
    <AppBarButton.Flyout>
        <Flyout>
            <StackPanel Width="300">
                <TextBlock>API Key</TextBlock>
                <TextBox Name="SecretKey" Text="Test" />
            </StackPanel>
        </Flyout>
    </AppBarButton.Flyout>
</AppBarButton>
```


TextBoxだけじゃなくて、ComboBoxでも同様に操作できない現象が出るようですね。
なんか地味にはまる・・・。
SIGGRAPH 2019 character animation 関連論文メモ

## NeuroSkinning: Automatic Skin Binding for Production Characters with Deep Graph Networks Author Preprint

skin binding の計算を deep learning あたりで自動でやる.

Kun Zhou ラボから.

## Direct Delta Mush Skinning and Variants

Delta Mush (https://dl.acm.org/citation.cfm?id=2633376 ) を直接計算して skinning するっぽい. より精度の高い skinning animation ができるはず.

JP Lewis 先生も Google ですか.

Delta Mush は Maya など既存 3D package に搭載されている.


## Spline Interface for Intuitive Skinning Weight Editing

skinning の weight をエディットするインターフェイス. libigl + NanoGUI + weighted average on surfaces(libigl に実装されている?)で実装.
パラメータと軌跡（数学II）

## 数学の軌跡を求める問題
### 問題
高校数学の数学IIの図形と方程式の問題です。


実数のパラメータ$t$によって，次のように定まる$x$，$y$を座標とする点Pの軌跡を求めます。
$$x=\frac{t}{1+t^2}\cdots\text{①},\quad y=\frac{1}{1+t^2}\cdots\text{②}$$


### 解答その１

$t$を消去して，$x$，$y$の関係式を作ります。

$x=ty$、$y\neq 0$なので，$t=\frac xy$として，②に代入し，
$$y=\frac{1}{1+\frac{x^2}{y^2}}=\frac{y^2}{x^2+y^2}$$
$$\therefore y(x^2+y^2)=y^2$$
$$\therefore y(x^2+y^2-y)=0$$
となります。$y\neq 0$より，
$$x^2+y^2-y=0$$
$$\therefore x^2+\left(y-\frac12\right)^2=\frac14$$
よって、点Pは
$$\text{中心}\displaystyle{\left(0,\,\frac12\right)}\text{，半径}\displaystyle{\frac12}\text{の円周上}$$
にあることがわかります。

しかしながら，この円周上のすべての点に点Pが来るかどうかはわかりません。実際に，Pは原点に来ることはありません。

パラメータ$t$で点Pを追跡すると，下の図のようになります。

<img width="553" alt="スクリーンショット 2019-05-29 16.46.20.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/426542/60e0a12a-fc02-cdd3-a8a3-8f712defb205.png">
PDOでPostgresqlから大量のデータをSELECTする(メモ)

何も考えずに70万件くらいのテーブルから全データSELECTしたらメモリが足りなくなってしまいました。（当然）

# 結論

~~~ php:メモリがたりない

$selectSql = "SELECT * FROM でかいテーブル";
// query() すると結果のデータがPHPのメモリに乗ってしまい、メモリが足りない。
$statement = $this->query($selectSql);

while($row = $statement->fetch(PDO::FETCH_ASSOC)){
    //なんなりと
}

~~~

~~~ php:だいじょうぶ

$selectSql = "SELECT * FROM でかいテーブル";
// 以下オプション付きでprepareすればOK。
$statement = $this->pdoSource->prepare($selectSql,[PDO::ATTR_CURSOR => PDO::CURSOR_SCROLL]);
// 実行
$statement->execute();
//第二引数はデフォルト値と同じなので、省略しても良い
while($row = $statement->fetch(PDO::FETCH_ASSOC, PDO::FETCH_ORI_NEXT)){
    //なんなりと
}

~~~

# 感想
パラメタの無い単なるSELECT文をプリペアドステートメントで実行するという発想がなかった。。

# 注意点

~~~ php
//prepare の場合、rowCount() が取れない
$selectSql = "SELECT * FROM でかいテーブル";
$statement = $this->pdoSource->prepare($selectSql,[PDO::ATTR_CURSOR => PDO::CURSOR_SCROLL]);
$statement->execute();
$statement->rowCount();//0件
~~~

# 参考
https://www.php.net/manual/ja/pdo.prepare.php
https://www.php.net/manual/ja/pdostatement.fetch.php
gem 'devise'  デバイス実装の流れ自分メモ

>まずデータベース作成した後

```gemfile.rb
gem 'devise'
```

```terminal.rb
$ bundle install
$ rails generate devise:install
```

>$ rails g controller home（このタイミングでコントローラーを作成した）

```development.rb

config.action_mailer.default_url_options = { host: 'localhost', port: 3000 }
```


```terminal.
rails g devise モデル名
```


```terminal

create    db/migrate/20190529070217_devise_create_users.rb
```
このようにマイグレーションファイルが作成されるのでこれをdb:migrateして反映させる

== 20190529070217 DeviseCreateUsers: migrating ================================
-- create_table(:users)
   -> 0.0015s
-- add_index(:users, :email, {:unique=>true})
   -> 0.0008s
-- add_index(:users, :reset_password_token, {:unique=>true})
   -> 0.0009s
== 20190529070217 DeviseCreateUsers: migrated (0.0035s) =======================


*localhost3000/users/sign_upしてみる


```application_controller.rb
before_action :authenticate_user!
```
認証していないとアクセスを弾くコマンド


ただトップページだけは認証されていなくとも表示したいので、

```home_controller.rb
class HomeController < ApplicationController
  skip_before_action :authenticate_user!
  def index
  end
end
```
としておく。

ここからtaskのモデルを作っていこうと思う
文系学生のプログラミング学習3日目ー成長ー

#配列が分かってきた

ドットインストールで「王様ゲーム」というものを作成したのですが、そこで配列を使用しました。
命令をいくつか格納して、それをランダムで取り出すという作業をしたのですが、「配列」と聞くとどうしても数字というイメージが強くなってしまい、「なんで命令に配列を使うんだろう？」と思っていました。

配列は何かをランダムに取り出したいときなどに、[]に命令を格納し、Math.floor(Math.random＊length)を使ってランダムに取り出すことができるんですね。
クイズゲームの問題などは配列を使ってランダムに取り出しているのですかね？
JavaScriptではいろいろなことが出来るので、はやく何かを作ることができる段階になりたいです。

#アウトプットの難しさ

ブログの投稿が3日に１回とかになっていますが、プログラミング自体は毎日やっています。毎日投稿出来ていないのはその日その日の気づきをアウトプットすることがとても難しいからです。「今日書くほどの気づきないな」と思う日が良くあります。
これでは効率が悪いと思うので、些細なことでも自分の成長につなげたいです。
高位合成~High Level Synthesis~ とは

##高位合成 (HLS)
高位合成はHigh Level Synthesis の略で一般にHLSと言われています.
高位合成は, C 言語などの動作記述を入力としてハードウェア記述言語を自動生成する技術で
す. また, 高位合成の一種にアセンブリや機械語を入力としてハードウェア記述言語を自動生成
するバイナリ合成という技術もあります.
簡単な話, ハードウェア版のコンパイラです.

* コンパイラ
  * C を入力することでバイナリを出力
* 高位合成システム
  * Cを高位合成することでハードウェア記述言語 VerilogHDLを出力します
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/353646/595fd340-d8ea-73a2-000e-14b01244313d.png)

高位合成システムの9割が入力としてC, Javaを入力します.

###高位合成のメリット, デメリット
ハードウェア記述言語は手で書くこともできるのですが非常に難しいため, 作成に時間がかかるしデバッグも大変です.
同様にソフトウェアの世界でも本気を出せばバイナリ, アセンブリでプログラムすることはできますけど, 時間がかかるしデバッグも難しいですよね．
そのためメリット, デメリットもコンパイラとほとんど一緒です.

* メリット
  * デバッグが比較的楽
  * ハードウェア記述言語を理解する必要がない
  * 大規模のシステムを作成する場合, 高位合成を使った方が速度が早い
* デメリット
  * 高位合成システムのツールの使い方を学ぶ必要がある
  * 小さいシステムの場合手書きの方が早い

一部補足します.
大規模なシステムの場合高位合成を使った方が早いのもコンパイラと一緒です.
人が完璧な実装ができると仮定すると, どのような場合でも手書きの方が速度の早いシステムを作ることができます．
しかし, 人は完璧ではありません. 最適化処理を高位合成システムに任した方が早いシステムになります．
小さいシステムの場合, 人でも完璧に理解できるため手書きの方が速度が出ます．

###有名な高位合成システム
有名な高位合成システムにVivadoHLSがあります.
(逆にこれ以外使う必要がないかも...)

高位合成, FPGAの世界には大きな会社が二社あります.

* Xilinx
* Intel (旧Altera)

Intel はAlteraを吸収したことで有名になりました.
VivadoHLS はXilinx社の提供する高位合成システムです．
シミュレーションシステムにVivadoがあり, それの高位合成を担っているのがVivadoHLSです.

(FPGAは書き換え可能な集積回路で, VerilogHDLで書き込むことで回路を設計できます.)
[Python3] Fleiss' Kappa値を求める

# はじめに
複数人の評価の一致率を調べてみたかったのですが，評価者が2人か3人以上で求めるカッパ値が違う(2人のときはCohen's Kappaで3人以上のときはFleiss' Kappa)とのことでした．
調べてみるとCohen's Kappaについては沢山情報やプログラム，数式等があったのですが，Fleiss' Kappaについては「3人以上のときにはこっち使えよ」程度の文献しか引っかからず，英語じゃないと見つからなかった(ggり力不足かも？)ので日本語の情報として残したいというモチベーションで記事を書いています．

※とりあえず動かしたい人は下にプログラムがあります．

# Fleiss' Kappa値の求め方

[英語のwikipediaのページ](https://en.wikipedia.org/wiki/Fleiss%27_kappa)が例題つきでわかりやすかたので，英語アレルギーじゃない方はこちらを参照してください．

以下の式で計算できます．

```math
\kappa=\frac{\bar{P}-\bar{P_e}}{1-\bar{P_e}}
```

ただし，

```math
p_j = \frac{1}{Nn} \sum_{i=1}^{N} n_{ij} \\
\sum_{j=1}^{k} p_j = 1 \\
\bar{P} = \frac{1}{Nn(n-1)} \biggl(\sum_{i=1}^{N} \sum_{j=1}^{k} n_{ij}^2 - Nn \biggr) \\
\bar{P_e}= \frac{1}{N} \sum_{j=1}^{k} p_j^2
```

で，$n$は評価者の数，$N$は評価対象の数，$k$は評価対象への評価カテゴリーの数，$n_{ij}$はある$i$番目の評価対象にカテゴリー$j$を付与した人の数です．

(ここらへんの式は[Cohen's Kappaの話](http://kamiyacho.org/ebm/ce201.html)を見たほうがイメージがつかみやすいかもしれません)

# kappa値の解釈

これも[英語のwikipediaのページ](https://en.wikipedia.org/wiki/Fleiss%27_kappa)からそのまま持ってきました．

|$\kappa$  |解釈|
|---|---|
|<0  |一致していない|
|0.01 - 0.20|わずかに一致|
|0.21 - 0.40|だいたい一致|
|0.41 - 0.60|適度に一致|
|0.61 - 0.80|かなり一致|
|0.81 - 1.00|ほとんど一致|

# プログラム

入力値の例外処理とかはやっていないので，使う方は関数に投げる前に処理お願いします．

```python:fleiss_kappa.py
# config:utf-8
'''
fleiss kappa値を計算するプログラム
'''

def compute_fleiss_kappa(rate_list: list, n: int) -> float:
    '''
    与えられた集計結果に対してのfleiss kappa値を返す関数

    Parameters
    ----------
    rate_list: list
      [size N * k: N = 評価対象の総数, k = 評価のカテゴリー数]
    n: int
      評価者の数

    Return
    ----------
    kappa: float
      fleiss kappa値
    '''
    N = len(rate_list)
    k = len(rate_list[0])
    # 入力された情報の確認
    print('評価者の数 = {}'.format(n))
    print('評価対象の数 = {}'.format(N))
    print('評価カテゴリー数 = {}'.format(k))

    # Piの値を求めて，P_barを求める
    P_bar = sum([(sum([el**2 for el in row]) - n) / (n * (n - 1)) for row in rate_list]) / N
    print('P_bar  = {}'.format(P_bar))

    # pjの値を求めて，Pe_barを求める
    Pe_bar = sum([(sum([row[j] for row in rate_list]) / (N * n)) ** 2 for j in range(k)])
    print('Pe_bar  = {}'.format(Pe_bar))

    # fleiss kappa値の計算
    kappa = float(0)
    try:
        kappa = (P_bar - Pe_bar) / (1 - Pe_bar)
    except ZeroDivisionError:
        kappa = float(1)

    return kappa

def main():
    n = 14
    test_list = [
      [0, 0, 0, 0, 14],
      [0, 2, 6, 4, 2],
      [0, 0, 3, 5, 6],
      [0, 3, 9, 2, 0],
      [2, 2, 8, 1, 1],
      [7, 7, 0, 0, 0],
      [3, 2, 6, 3, 0],
      [2, 5, 3, 2, 2],
      [6, 5, 2, 1, 0],
      [0, 2, 2, 3, 7]
    ]

    print('kappa = {}'.format(compute_fleiss_kappa(test_list, n)))

if __name__ == '__main__':
    main()
```

# 実行結果例

[英語のwikipediaのページ](https://en.wikipedia.org/wiki/Fleiss%27_kappa)のworked exampleを実行した結果です．
評価者が14人いて，評価対象1(表の1行目)に対して5と評価した人が14人中14人といった見方になるかと思います．
2つめの評価対象には1を付けた人が0人，2が2人，3が6人，4が4人，5が2人です．

```terminal
$ python3 fleiss_kappa.py
評価者の数 = 14
評価対象の数 = 10
評価カテゴリー数 = 5
P_bar  = 0.378021978021978
Pe_bar  = 0.21275510204081632
kappa = 0.20993070442195522
```

# おわりに
もし何か間違いがあったり，わかりやすい文献をご存じの方はコメントお願い致しますm(_ _)m
(統計難しい...)

# その他参考文献
[各種一致係数](http://www.aichi-gakuin.ac.jp/~chino/anova/chapter3/sec3-1.html#Fleiss71)