OmniAICreator/Qiita-1.07M huggingface dataset:
Unityでオブジェクトを動的生成する

スクリプトによってオブジェクトを自動生成させる。


新しくspriteを追加して，Assetに適当な画像を追加し，その画像をNew SpriteのSpriteにドラッグ&ドロップする。
![douteki_imageset.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/149593/a2308c17-bac1-97d9-57e5-3a539ad47e61.png)

Assetsにフォルダを加える。<font color="red">名前は「Resources」にする。</font>こうしないと動かない。
理由としては内部的にResourcesフォルダの中のファイルを取得できる「Resources関数」を使用するかららしい。
![douteki_createfolder.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/149593/b8b6cfa7-a426-0166-a584-628682186a35.png)

プレハブ(Prefab)を作成する。
New SpriteをResourcesフォルダにドラッグ&ドロップする。
![douteki_createprefab.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/149593/99a7b9e2-3c9f-0125-1302-ab830a272e8e.png)

フォルダ内にNew Spriteのプレハブが作られる。
![douteki_checkprefab.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/149593/8ceecdcc-3ef9-82b3-0615-eade1c9a831c.png)

Hierarchyを右クリックしてCreateEmptyする。
![douteki_createempty.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/149593/31205786-dc1f-cd6f-d524-111423e9b001.png)

GameObjectに新しくスクリプトをAdd Componentする。
![douteki_addcomponent.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/149593/7be462fb-6d2e-3fef-b6a4-18860785807e.png)

スクリプト名はなんでもいいが、とりあえずAddObjectにしてCreate and Addを押す。
![douteki_rename.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/149593/a7b47ef2-09ac-5f0b-4008-5f24bdbc1b7a.png)

スクリプトファイルをダブルクリックするとvisual studioが開く。
![douteki_scriptdoubleclick.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/149593/2dfa4469-908a-2c22-8cb3-9c51e3ce539a.png)

スクリプトの中身をアタッチする。

元のこれを

```C#
using System.Collections;
using System.Collections.Generic;
using UnityEngine;

public class CreateObject : MonoBehaviour
{
    // Start is called before the first frame update
    void Start()
    {
        
    }

    // Update is called once per frame
    void Update()
    {
        
    }
}
```

Start()関数をいじってこのよう変更する

```C#
using System.Collections;
using System.Collections.Generic;
using UnityEngine;

public class AddObject : MonoBehaviour
{
    // Start is called before the first frame update
    void Start()
    {
        // ResourcesフォルダにあるNew SpriteプレハブをGameObject型で取得
        GameObject obj = (GameObject)Resources.Load("New Sprite");
        // New Spriteプレハブを元に、インスタンスを生成、
        Instantiate(obj, new Vector3(0.0f, 2.0f, 0.0f), Quaternion.identity);
    }

    // Update is called once per frame
    void Update()
    {
        
    }
}
```

ctrl + s で保存して、実行すると
![douteki_zikkou.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/149593/6693d0d7-7e71-48d1-8052-43172c087835.png)


指定した位置（今回は中心からちょっと上）にオブジェクトが出現する。
Hierarchyにもクローンが生成される（増えてくると番号が割り振られる？）。
![douteki_result.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/149593/db1b3db5-85a7-394f-e0fe-8e074dd179a8.png)


参考：https://www.sejuku.net/blog/54672
enebularで加速度センサーデータの取り出しと可視化に取り組む

こんにちは、寺尾です。
魂はラスベガスにいるのでまで12月6日ですね。

[enebular Advent Calendar](https://qiita.com/advent-calendar/2019/enebular) 6日目です。

enebularで加速度センサーの可視化をしようと取り組んだ話です。

# MakerFaire 深圳でつくったもの

11月のMakerFaire 深圳に、日本Geek中文学会という団体で出展して、魔棍(mogun)という、中国語の四声をテストするデバイスを作りました。

![IMG_2698.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/70132/fea218f5-1519-bcb5-6a8d-6b0f4c955f5f.jpeg)


中国語には4声という独特のイントネーションがあります。しかし、日本語をあやつる私たち日本人は、こういったイントネーションがとても苦手なのです。なので、発音は覚えられても、この四声は直ぐに忘れてしまいます。そのためには、良く聞いて、たくさん発音するのが王道なのですが、まず最初に覚えるときは、手を使ってモーションで覚える方が身につきやすいと言う結果が、僕の所属する日本Geek中国語講座でのノウハウとしてあります。

であれば、この手のモーションを取れば試験をするためのデバイスが作れるのでは無いかと思い立ち、作ったのがこちらです。

![スライド3.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/70132/c863d9a3-e547-00b9-8777-8eca8c72972b.png)
![スライド4.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/70132/c116c741-2a8b-65cf-2b43-79846876f78f.png)

デバイスとしていろいろと課題はあるものの、それはまた別の機会に書くとして、これを開発する時に、四声に対応するためのモーションを実際に振ってみてどんな加速度が出るのかを見ながら判定するのですが、それがとてもとても分かりづらい。面倒くさい。

振ってはシリアルコンソールを見てエクセルに貼り付け、振ってはシリアルコンソールをみてエクセルに貼り付け、そして、そこからルールを導き出して、それなりに判定できる判定ルーチンを作るんです。

コーディングだけで言えばそこまで面倒では無いですが、とにかくサンプルデータを取るのが面倒。それに、シリアルコンソールを見るためにはUSBケーブルを繋ぎっぱなしにしないといけないので、振りにくさもありますし、実際にケーブルが繋がっていないときと振り方も違ってくると思います。

ということで、次はSDカードに書き込もうと思ったのですが、振ってはカードを抜き出して、Macに繋いで、開いて。。。と言う作業は、シリアルコンソールよりも面倒な作業になってしまいました汗

前置きが長くなりましたが、やっぱり、無線で飛ばしたいよねということで、MQTTで飛ばして見たいと思います。

が最初に断っておきますが、作業時間の関係でまだ完成してません。自分の実力の低さが残念でなりませんが、僕にはもう少し時間が必要でした。ということで、今回はコンセプトだけです。

## 構成

構成を考えたときに、0.1秒単位のデータを取るので、遅延の無いローカルにある方が好ましいため、enebuular editorを使う事にしました。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/70132/e2ad762d-0a84-f532-2e6a-2677af497437.png)

こうすれば、ローカルでグラフ化できて、生データも無線で繋がるはずです。

## M5Stackをネットワークに接続

M5Stackは、Wifiに対応しているので、Wifiに繋ぎます。標準のライブラリでサクッと繋がりました。

## enebular editorの用意

あらかじめ [enebular editor](https://docs.enebular.com/ja/enebulareditor/) を用意して、フローを用意します。MQTTブローカーを配置するだけで基本的には終わりです。（のはずです）

## M5Stack から送信

M5Stack からセンサーデータを読み取って、MQTTで送るところです。

このあたりから、敗色濃厚なのですが、まず、魔棍(mogun)を作ったのはM5Stack Fireを使いました。これは、MPU6050というセンサーが載っていました。

しかし、Fireは家においてきたため、先日深圳で買ったばかりのGrayを使って実践しようとしたのですが、こちらはMPU9250というセンサーを使ってます。なれた方なら、ちょっと書き直せば動くのかも知れませんが、僕レベルだと結構一大事です。とはいえ、時間がかかりながらも、センサーデータは読み出せました。

次に送信です。MQTTで接続するわけですが、これがどうにも繋がらずタイムオーバーです。

## データの保存とグラフ化

残念ながらここは手つかず。次回に回します。

# おわりに

とにかく教訓は、「余裕を持って検証して記事を書こう」です。ホント完成せず申し訳ない。と言う事で、追って続編を書かせて貰います。

今回はセンサーデータの取り出しと可視化をテーマにしました。今後いろいろ作って見るときに、大事だなーと思うんです。センサーデータを取り出すのは、こうやると楽だよっていう方法があれば、ぜひ教えていただけるとありがたいです。
BtrfsなLinux環境でローカルKubernetesを立ち上げる

意外に詰まったのでメモ。
環境はArch LinuxでファイルシステムがBtrfs。

# kind

[kind](https://github.com/kubernetes-sigs/kind)(Kubernetes IN Docker)というものがあり、これを使おうと考えていた。
しかし試してみたところエラーが出てしまい、どうやらBtrfsでは使えないとのこと。
https://kind.sigs.k8s.io/docs/user/known-issues/

# minikube

仕方がないので別の方法ということで、minikubeを使うことに。

```
$ sudo pacman -S minikube
```

vm-driverにはvirtualboxを使う。そのためVirtual Boxもインストールしておく。

```
$ sudo pacman -S virtualbox
```
 
ここでBtrfs特有で注意が必要なのは、ディスクイメージを保存するディレクトリでCopy On Writeを無効化する必要があること。これを行わないと動作しないわけではないが、パフォーマンス上悪影響が出る恐れがある。
https://wiki.archlinux.jp/index.php/VirtualBox#.E9.81.A9.E5.88.87.E3.81.AA.E3.83.95.E3.83.AD.E3.83.B3.E3.83.88.E3.82.A8.E3.83.B3.E3.83.89.E3.81.AE.E4.BD.BF.E7.94.A8

通常のVirtual Box利用であれば`chattr +C ~/VirtualBox\ VMs`で良いが、minikubeはこのディレクトリではなく~/.minikubeにイメージを保存するらしい。なので、

```
$ mkdir ~/.minikube
$ chattr +C ~/.minikube
```

をあらかじめ実行しておく。**minikube実行後では意味がないので注意！**
lsattrを実行してCフラグが立っていればOK。

```
$ lsattr -d ~/.minikube
---------------C---- /home/matl/.minikube
```

あとはドキュメントどおりに

```
$ minikube start --vm-driver=virtualbox
```

で進めれば問題ない。
Node-REDのフローを簡単にテストする（ためのノードを作った）

Node-REDでフローをテストするために[node-red-contrib-flow-asserter](https://www.npmjs.com/package/node-red-contrib-flow-asserter)というノードを作りました。
機能を追加して、そこそこ満足してきたので記事を書いてみました。

このノードには、

- Node-REDエディタ上でフローのテストを実行できる
- 複数のテストケースを作成してボタンクリック1回でまとめてテストできる
- テスト実行中は値を検証したい位置以降にはメッセージが流れない 

という特徴があります。

![dialog.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/182261/cca93ede-b670-d5d2-fdf7-049f7dee5de8.png)


# フローのテストは面倒だった

Node-REDはご存知の通りにノードをマウス操作で繋ぎ、設定を行なうだけで簡単にプログラム（フロー）を作ることができます。フローが単純な場合はそのまま使い始めますが、複雑になるとフローの動作をテストすると思います。
ここで問題になるのは、フロー作成の簡単さに比べるとテストは面倒くさいということです。

テストの際、私はテスト用のInjectノードとDebugノードをフローに追加し、ボタンを押してはデバッグサイドバーで値を確認していました。
また、フローの一部をテストしたい場合、不必要なフローを実行したくない場合にはノード間のワイヤーをテスト中に付け替えることもしていました。
さらに、いったん使い始めてからフローのリファクタを行なった場合、再度全ての値でテストを繰り返していました。
このように、Node-REDではフローをテストしようとすると非常に煩わしいことになっていました。

# node-red-contrib-flow-asserterという解決策

このようなテストの煩わしさを解決するため、node-red-contrib-flow-asserterを作成しました。

このモジュールにはFlow-asserter inノード（ボタン付きのノード）とFlow-asserter outノード（入力ポートと出力ポートが1つずつあるノード）という2つのノードが含まれています。

## Flow-asserter inノード

テストケースを設定するためのノードです。
テストケースには入力値（Input）、検証方法とその検証で比較する値を指定します。

![testcases.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/182261/96df65e7-7883-19e7-b4e1-fd91a047c7aa.png)

検証方法は`==`のような一般的な演算子や`equals`、あとはSwitchノードで使える比較演算子です。

上図では見切れていて表示されていませんが、このノードのテストケースの値を検証する位置、つまりFlow-asserter outノードを指定する必要があります。

ボタンはクリックすることでテストを開始できます。テスト実行時の動作は後述してあります。

出力ポートは2つあります。
上側はテスト実行時にテストケースのInputに記述した値がペイロードに代入されてメッセージが送出されます。
下側のポートはテストケースの検証結果が送出されます。

## Flow-asserter outノード

編集ダイアログを開いて設定することはありません。
テストにおいてメッセージの値を検証したいフロー位置に挿入しておき、Flow-asserter inノードで指定します。
このノードにたどり着いたときに`msg.payload`をFlow-asserter inノードで設定した検証方法と検証用の値で比較が行なわれます。

# フローでのメッセージの流れ

![assertflow.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/182261/76f2c4fc-0f27-1e7f-21ef-982ed3b51c34.png)

このフローの作成過程は[GitHubのREADME](https://github.com/s1r-J/node-red-contrib-flow-asserter/blob/master/README_ja.md#usage)に記載してあります。

## テスト実行時

1. Flow-asserter inノードのボタンをクリックすることでテストが実行され、テストケースの入力値がペイロードに代入されたメッセージオブジェクトが上側のポートから送出されます。
2. メッセージはDelayノード、Functionノードを介してFlow-asserter outノードに到達します。
3. すると、Flow-asserter outノードはメッセージを自身の出力ポートに繋がっているDebugノードに送らず、代わりに値を検証します。
4. 検証結果はFlow-asserter inノードの下側のポートから送られます。

## テストではない時

1. テスト以外で実行した場合（Injectノードのボタンを押した場合）、Delayノード、Functionノードを介してFlow-asserter outノードに到達します。
2. しかし、このノードでは値の検証は実施せず、直後のDebugノードにメッセージをそのまま送出します。

# おわりに

Node-REDのフローのテストを簡単にする[node-red-contrib-flow-asserter](https://www.npmjs.com/package/node-red-contrib-flow-asserter)というノードの特徴とその簡単な使い方と挙動を紹介しました。

説明不足は否めませんが、[GitHub](https://github.com/s1r-J/node-red-contrib-flow-asserter)には[日本語のREADME](https://github.com/s1r-J/node-red-contrib-flow-asserter/blob/master/README_ja.md#usage)もあるので是非参考にしてもらい、Node-RED上で利用していただけると嬉しいです。
Excelで”^”は使わずPOWER()関数を使おう

#Abstract
- Excelの演算子”^”を使うときは注意が必要
- Excelでは、「-x^y」の計算は「(-x)^y」と解釈される
- 「POWER(x,y)」という関数を使うことで、この問題は避けられる

#問題
Excelで累乗（3の2乗、等）を計算する方法として、演算子”^”が用いられます。
`=3^2`
と入力すると
`9`
と表示されます。

演算子”^”で累乗を表現するのは割と一般的で、
TEXでも”^”を使って累乗を表します[^1]。

ところが、Excelで
`=-3^2`
と入力すると
`9`
と表示されます。

先に`3^2`が計算されて、最後に符号`-`が付いて
`-9`
と表示されるのと期待するのが普通だと思いますが、そうはなりません。

なお、Excelで
`=0-3^2`
と入力すると、
`-9`
と表示されます。

#Excel…どうして…
[こちら](http://www5e.biglobe.ne.jp/~emm386/2014/excel/operator.htmlWeb)のページによれば、
どうやらExcelの演算子の優先順位が特殊で、
同じ”-”でも

- 式の先頭の”-”
- 式の途中の”-”

では扱いが異なるようです。
それぞれの”-”と”^”の優先順位を並べると、
（先頭の”-”）>（”^”）>（途中の”-”）
となっています。

そのため、
`=-3^2`
の式は
`=-3^2`→`=(-3)^2`→`=9`
となる一方、
`=0-3^2`
の式は
`=0-3^2`→`=0-(3^2)`→`=0-9`→`=-9`
となります。

#POWER()関数
Excelには、累乗を計算する関数としてPOWER()というのがあります。
`=POWER(3,2)`
と入力すると
`9`
と表示されます。

この関数を使うことで、
`=-POWER(3,2)`
と入力すれば
`-9`
と表示されますし、
`=POWER(-3,2)`
と入力すると
`9`
と表示されます。

#後書き
ExcelでRCフィルタ回路計算をさせているときに、計算が合わずにハマりました。
「^」と比べると「POWER()」ってタイピングするのは手間ですが、
後で計算が合わなくなって困るよりはマシだと思って
累乗計算では「POWER()」を使うようにしています。

明らかにExcelの仕様ミスな気がしますが、互換性の観点から、修正されることはないでしょうね[^2]。

[^1]: プログラム言語はまちまちです。昔、C言語でうっかり’10^3’と打って痛い目見たことあります。
[^2]: 未だにセル指定状態で「/」と打つとメニューバーがアクティブになる仕様が生きてますしね。これ、いにしえの表計算ソフト「Lotus 1-2-3」と操作性の互換を取るためなんです。（なお、設定で無効にできます。）
Azure Kinect Body Tracking SDK v0.9.5 ChangeLog

3D Sensor Advent Calendar 2019の7日目の記事です。

Azure Kinect Body Tracking SDK v0.9.5がリリースされました。
この記事ではAzure Kinect Body Tracking SDK v0.9.5の変更を紹介します。

Download
--------
以下のURLからダウロードすることができます。

* msi https://www.microsoft.com/en-us/download/details.aspx?id=100636
* nuget https://www.nuget.org/packages/Microsoft.Azure.Kinect.BodyTracking/0.9.5

ChangeLog
---------
#### CPUモードのパフォーマンス改善
Azure Kinect Body Tracking SDKはv0.9.4からCPUのみで動作するモードをサポートしました。
v0.9.5ではパフォーマンスが少し改善しています。  

e.g. Intel Core-i9 9900K

| Version | FPS          |
|:-------:|:------------:|
| v0.9.4  | about 1.5fps |
| v0.9.5  | about 3.8fps |

#### CPUモードのAPI変更
<code>k4abt_tracker_configuration_t</code>の<code>cpu_mode</code>が<code>processing_mode</code>変更されています。
これに伴い、<code>k4abt_tracker_processing_mode_t</code>列挙体が追加されました。
将来的にGPU以外の推論アクセラレーターを選択できるようになるかもしれないですね。

```cpp
k4abt_tracker_configuration_t tracker_configuration = K4ABT_TRACKER_CONFIG_DEFAULT;
tracker_configuration.processing_mode = k4abt_tracker_processing_mode_t::K4ABT_TRACKER_PROCESSING_MODE_GPU;
```

#### 推論を実行するGPUデバイスの選択
Azure Kinect Body Tracking SDKはこれまでデフォルトのGPUデバイスでのみ推論を実行可能でした。
v0.9.5では推論を実行するGPUデバイスを選択することができるようになりました。
これにより、Thunderbolt3など外部接続のGPUを利用することができます。
これに伴い、<code>k4abt_tracker_configuration_t::gpu_device_id</code>が追加されています。

```cpp
k4abt_tracker_configuration_t tracker_configuration = K4ABT_TRACKER_CONFIG_DEFAULT;
tracker_configuration.gpu_device_id = 0;
```

#### 複数台のAzure Kinectをサポート
Azure Kinect Body Tracking SDKはv0.9.4までトラッカー（<code>k4abt_tracker_t</code>、<code>k4abt::tracker</code>）を1つしか作成できませんでした。
そのため、Azure Kinectを複数台接続しても1台のみでしか動作させることができませんでした。
v0.9.5ではトラッカーを複数作成することができ、各Azure Kinectから取得したデータで人物姿勢推定をすることができます。

#### 軽微なAPIの変更
v0.9.5では以下の変更がありました。

* <code>k4abt_frame_get_num_bodies()</code>の戻り値が<code>size_t</code>から<code>uint32_t</code>に変更されました。
  これに伴い、各APIの引数の型が変更されています。

* <code>k4abt_joint_id_t</code>の<code>K4ABT_JOINT_SPINE_NAVAL</code>が<code>K4ABT_JOINT_SPINE_NAVEL</code>に修正されました。（Fix Typo）

#### C#ラッパーの追加
v0.9.5ではAzure Kinect Body Tracking SDKのC#ラッパー（Microsoft.Azure.Kinect.BodyTracking.dll）が追加されました。
ただし、現在はNuGetパッケージにのみ含まれるようです。（ミスっぽい？

まとめ
-----
Azure Kinect Body Tracking SDK v0.9.5の変更をまとめました。

明日12/8(日)はHoloMonさんで「BlenderとAzureKinectを組み合わせて何かする」です。お楽しみに！
SpringBootを使って遊んでみる。

#はじめに
Spring Bootを使うにあたって設定方法や詰まった部分を自分用にメモしていきます。メモです。
フレームワークを初めて使用した（まずservlet、JSPでこつこつ書いてた）初学者としては、フレームワークすげー！便利ー！てなっています。

#動作環境
- windows10
- Eclipse IDE
- MySQL

（バージョン調べておきます）

#もくじ
１．Spring Boot initializer
２．Hello World
３．まとめ

#１．spring boot initializer
ってなに？からですが、要はプロジェクトの雛形です。Spring Bootでプロジェクトを作成するにあたって、言語はどれでバージョンはこれでデータベースはこれで～って選ぶだけで必要なものを準備してくれます。
　→[SpringBoot initializer](https://start.spring.io/)

- 今回の設定
 
 - Project：Gradle Project
 - Language：Java（11）
 - Spring Boot version：2.2.2
 - Project Metadata - Option - Packaging：War
 - Dependencies：Spring Web, MySQL Driver, MyBatis Framework, Thymeleaf
 
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/408233/9d17c47c-30a2-52c2-ce64-edeb7ce39488.png)

zipファイルがインストールされる。解凍しておきましょう！



#２．Hello World


- プロジェクト作成
 - Eclipseで「既存プロジェクトをインストール」を選択。 
 - Gradleでプロジェクト作成。
 - ワークスペースに追加にチェックを入れて、その他設定はデフォルトのまま完了。

　　プロジェクトが作成されました！

-  Hello Worldを表示させる。
  
　コントローラ：HelloWorld.java
　　をメインクラスと同じ階層に作成。パッケージを作成してその下に置いてもオッケー。

　HTMLファイル：hello.html
　　をtemplateの直下に作成。

　階層は以下の通り。置き間違えるだけでビルド失敗するから、ファイルの階層大事！！
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/408233/e8313d26-6afe-b1e9-e2c7-b1f05331c929.png)


```ruby:HelloWorld.java
package com.test.test;

import org.springframework.stereotype.Controller;

@Controller
public class Controller {
　　　　 @RequestMapping(value = "/test")
	public String sayHello() {
			return "top";
	}
}
```

　@Controllerでコントローラークラスであることを定義します。
　sayHelloメソッドは「@RequestMappping」によってマッピングされていて、
　["http://localhost:8080/test"](http://localhost:8080/test)アクセス時に実行されるようになってます！


　遷移先のhtmlファイルを作成します。



```ruby:top.html
<!DOCTYPE html>
<html xmlns:th="http://www.thymeleaf.org">

<head>
<meta charset="utf-8" />
<title>こんにちは</title>
</head>

<body>
	<h1>Hello World！</h1>
</body>

</html>
```
　※htmlファイル、文字化けするときは、まずEclipseコンソールの文字コードを確認しておく。
「Window - 設定」を開いて、「一般 - ワークスペース」の文字コードを「utf-8」に変更する。



　準備できましたね、ではさっそく、アプリケーション実行！


　といきたいところですが、今回のプロジェクトにMyBatisを追加しているので（？）
　このまま実行すると、データベース定義がないよ！っていって
　ビルドエラーが起きるので、データベースの定義もしておきましょう。

　resourcesの直下にあるapplication.propertiesファイルに以下を記述する。

```ruby:application.properties
spring.datasource.url=jdbc:mysql://localhost:3306/xxxx
spring.datasource.username=yyyy
spring.datasource.password=zzzz
spring.datasource.driverClassName=com.mysql.jdbc.Driver
```




これでアプリケーション実行！


![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/408233/a6e52aa8-e9e9-565b-dac7-6e404cee78fc.png)

　Hello World！　無事に表示できました。


ここでは省略しますが、Hello World表示させるだけでも結構時間かかりました。。
ビルドエラーだったり404エラー（これに関しては見飽きたレベル）だったり、エラー解消法とかもまとめておこうかな
2つの配列からhashを作る方法

仕事で2つの配列を組み合わせて配列型を作るにはどうすればいいんだと悩んだので、シェアします。

もっとより良い書き方があったら教えて頂ければ幸いです。

```ruby
numbers = [1,2,3]
words = ['apple','banana','grape']

numbers.zip(words).to_h
=> {1=>"apple", 2=>"banana", 3=>"grape"}
```
製薬企業研究者がPythonにおける関数についてまとめてみた

# はじめに

ここでは、Python初心者向けに「関数」について解説していきます。
Python3系の使用を想定しています。

# 関数の作成

関数を作成するときは、`def`を使います。
`def 関数名(仮引数1、仮引数2、・・・):`の次の行は半角スペース4つ分インデントして書き始めます。
返り値は`return`で書きます。
関数名は、組み込み関数などと同じにならないように注意が必要です。

```python:function_1.py
def hello_python(): # 仮引数はなくても良い。
    return 'Hello, Python!'


def average(a, b): # 仮引数を2つ指定する。
    return (a + b) / len([a, b])


def greeting(word, n = 3): # 仮引数のデフォルト値を指定する（この例では第二引数）。
    return (word * n)
```


# 関数の呼び出し

関数を作成したら、実行したい箇所で関数名を呼び出します。
関数を作成しただけで実行されるわけではありません。

```python:function_2.py
print(hello_python())

print(average(1, 3))

print(greeting('Hello!', n = 2))
print(greeting('Bye!')) # 第二引数を指定しないとデフォルト値が使われる。
```


# 変数のスコープ

関数内で定義した変数（ローカル変数）は、関数外では同じオブジェクトとして使うことはできません。
関数外で定義した変数（グローバル変数）は、関数内で使うことはできますが、関数内での変更を反映させたい場合は、グローバル変数であることを関数の定義時に明示する必要があります。

```python:function_3.py
def add_one(n):
    a = 1
    return n + a


print(add_one(2))
print(a) # 変数aが定義されていないということで、エラーになる。
```

```python:function_4.py
a = 1


def add_one(n):
    return n + a


print(add_one(2))
print(a) # エラーにならない。
```

```python:function_5.py
a = 5


def add_one(n):
    a = 1 # ローカル変数
    return n + a


print(add_one(2))
print(a) # 関数内での変数aの値の変更は反映されない。
```


```python:function_6.py
a = 5


def add_one(n):
    global a
    a = 1 #グローバル変数
    return n + a


print(add_one(2))
print(a) # 関数内での変数aの値の変更が反映される。
```


# まとめ

ここでは、Pythonにおける「関数」の基本について解説しました。
特に、変数のスコープについては注意が必要です。


# 参考資料・リンク

[プログラミング言語Pythonとは？AIや機械学習に使える？](https://pharma-engineer.com/basic-programming/python-summary/)
Contact  Form 7 でリッチなサンクス表示をさせる

標準のテキストメッセージだけでは味気ない。
HTMLでがっつり装飾したい、そんな時に。
サンクスページをわざわざ作ってわざわざ飛ばすよりラクだと思うよ。

#考え方
単純です。大胆かつ柔軟。
- メールを送信したら、bodyにクラスを付与する。
- そのクラスでサンクス領域を表示する。
- ついでにフォームは隠してしまおう。

##実装
###メールを送信したら body に wpcf7-mail-sent クラスを付与する。
クラス名はなんでもいいんだけど。とりあえずわかりやすく。

```php:functions.php
add_action( 'wp_footer', 'add_wpcf7_mail_sent_script' );
function add_wpcf7_mail_sent_script() {
echo <<< EOD
<script>
document.addEventListener( 'wpcf7mailsent', function( event ) {
  document.body.classList.add( 'wpcf7-mail-sent' );
}, false );
</script>
EOD;
}
```
###サンクス内容は投稿内に直接書いておく
```html:WPのPost内
<section class="wpcf7-mail-sent_hide">
<!-- フォーム部分 -->
[contact-form-7 id="123" title="Form"]
</section>

<section class="wpcf7-mail-sent_show">
<!-- サンクス部分 -->
  <h1>Thanks!</h1>
  <img src="thanks.gif">
  <p>Thank you very much !!!</p>
  <a href="/">Back to Top</a>
</section>
```
フォームを隠さず出したまんまにする場合は、wpcf7-mail-sent_hide を外す。


###切り替え用CSS
style.css とか読み込んでるやつに追加しよう。

```scss:SCSS
.wpcf7-mail-sent {
  &_show { /* 最初は隠しておく */
    display: none;
  }
  & &_show { /* クラス付いたら表示する */
    display: inherit;
  }
  & &_hide  { /* 今度はこっち隠す */
    display: none;
  }
}
```

CSS で普通に書くとこう。

```css:CSS
.wpcf7-mail-sent_show {
  display: none;
}
.wpcf7-mail-sent .wpcf7-mail-sent_show {
  display: inherit;
}
.wpcf7-mail-sent .wpcf7-mail-sent_hide  {
  display: none;
}
```
装飾は、普段通りにどうぞ。
これだとフォームのページが何枚あっても同じパターンでいける。内容もそれぞれ変えられるしね。
飛び先のアドレスだのなんだのの管理もしなくていいし、運用考えてもページ飛ばすよりラクじゃないかな、と。
C言語の関数,ポインタまとめ（後半）


#前半
☆[関数の作り方の基本、メモリのアドレスの説明](https://qiita.com/kalmanfilter_/items/bbdd280ad300d2c8db90)


参考にした本：粂井康孝『猫でもわかるC言語プログラミング　第３版』SB Creative

#後半
7.2：ポインタの基本
7.3：ポインタへの値の代入
7.4：ポインタと引数

##7.2：ポインタの基本（p155）
###定義
ポインタ：アドレスを格納するための変数
###性質
・一般の変数と同様に、使う前に宣言する。　
・`pi`は「int型へのポインタ」となる。　ex. `int *pi`;
・~~＊はポインタ宣言子という。~~（p153,4行目を訂正）
→**`*pi`はポインタ宣言子といわれる（`*` 単独で宣言子ではない）**
参照：[宣言子の例](https://www.ibm.com/support/knowledgecenter/ja/SSGH2K_12.1.0/com.ibm.xlc121.aix.doc/language_ref/examples_declarator.htm)
・よって,`p`の型名は`int*`であるが、文法上は`int`という型指定子と`*p`という宣言子で構成されることになる。
・`scanf("%d", &a);`における`&a`は、アドレスを教えて、関数を呼び出した側の変数にはなんの変化も起こらないようにする、安全装置の役割があった。
###コード

```C 
int a;
int *pa;
pa = &a;/*paはポインタで、aのアドレスが格納された*/
```
`a`に値を代入する。`*pa`は変数`a`の値を表している.

```C 
int a,b;
int *pa;

a = 5
pa = &a;/*paはポインタで、aのアドレスが格納された*/
b = *pa;
```
POINT：基本的には普通の変数と同じで、**宣言→代入**の順番でよい。
##7.3：ポインタへの値の代入（p156）
###要点
・`int a;`　により,メモリ上のどこかに4バイト分の領域が確保される。
・`a`のアドレスを100番地とすると,100番地から103番地までの4バイトが`a`のために使える。
・`pa=&a;`とすることで`pa`に100が代入される。
・`*pa`に5を代入するいうことは,100番地から103番地の4バイトの入れ物に5を代入することである。

###コード
*paに5に代入すれば,結果としてaに5を代入したことになる。

```C
#include <stdio.h>

int main(){

    int *pa;
    int  a;

    pa = &a;/*aにアドレスを代入*/
    *pa = 5;/*aのアドレスに5を入れる、*が必要*/

   
    printf("*pa = %d\n", *pa);
    printf("a = %d\n", a);    

    return 0;
}
```
実行結果

```C
*pa = 5
a = 5
```
POINT：`pa = &a;`でポインタを**初期化**すること。知らないアドレスに数値を入れない。
##7.4：ポインタと引数（p159）
###要点
参照呼び出し：関数内で仮引数の値を変更すれば、呼び出し元の実引数も変更される。
###コード（失敗例）
swap関数で`a`と`b`との値を入れ替えたい。（↓では入れ替えられない）

```C
#include<stdio.h>

void swap(int, int);

int main()
{
    int a, b;

    a = 10;
    b = 20;

    swap(a, b);

    printf("a = %d, b = %d\n", a, b);

    return 0;
}

void swap(int a, int b)
{
    int c;

    c = b;
    b = a;
    a = c;

    return;
}
```
実行結果（入れ替わってない）

```C
a = 10, b = 20
```
原因：swap関数,main関数の変数は別物だから。
###コード（成功例）
・`z`以外のswap関数内の変数をmain関数内の変数のアドレスの変更する。
・`swap(&a, &b);`でmainの変数`a`,`b`のアドレスを教える。

```C
#include<stdio.h>

void swap(int *, int *);

int main()
{
    int a, b;

    a = 10;
    b = 20;

    /*swap関数内に変数a,bのアドレスを教える*/
    swap(&a, &b);

    printf("a = %d, b = %d\n", a, b);

    return 0;
}

void swap(int *x, int *y)
{
    int z;/**はいらない*/

    z = *y;
    *y = *x;
    *x = z;

    return;
}
```
実行結果（成功。入れ替わった）

```C
a = 20, b = 10
```
エンジニアなら誰でも重宝される災害ボランティア

#サイバーボランティアアドベントカレンダー第5日目です。


そもそもサイバーボランティアって？という方は@hiro_matsuno2さんの[記事](https://qiita.com/hiro_matsuno2/items/8708cd12e70d791138d9)をご覧下さい。



第一日目の記事にも書いてある通り、エンジニアリングによるボランティア活動は多々あります。
私は[IT　DART](https://itdart.org)という団体の活動に参加しました。

#この記事で伝えたいこと
**自分の知識で人の役に立てるって達成感や充実感あるよ**ってことです。


#エンジニアとして参加できるボランティアとは
ボランティアと言っても世には様々なボランティアが存在します。
ボランティアというと阪神大震災や東日本大震災のような大規模災害発生後の災害ゴミ（瓦礫や土砂など）の除去ボランティアを連想される方が多いかと思います。
ニュースとかで被災地の大変な状況は知りつつも「何か手伝えることはないかな〜」「でも、体力ないし行っても邪魔になるだけじゃないか…」と何か自分にできることはと思いつつも躊躇してしまう人は特にエンジニアには多いのではないのでしょうか。

サイバーボランティアは名の通り、エンジニアリングによってボランティアを行うことです。
現地に赴きPCのセッティングなどの情報面での支援を行う、はたまた支援が必要な場所を写真と共に地図にプロットするシステムを開発するなど様々な支援の形があります。
私は現地に赴いて支援のお手伝いをしました。

#台風19号での災害ボランティア
私がサイバーボランティアとして参加したのは主に千葉県に被害をもたらした台風19号の災害ボランティアです。
現地の状況としては部分的な停電や断水、倒木による道路の寸断が発生していました。ボランティアとして参加されていた方々の多くは、ゴミの除去や倒木の撤去作業にあたっていました。
それらの作業を行うにも情報が必要です。ボランティアの支援を求める情報は被災者などからの情報提供により集められ、位置情報と必要な作業内容を紙面に印刷しボランティアの方々に依頼票という形で渡されていました。

私が従事した活動はその依頼票を印刷するプリンタや作業するPCにトラブルが発生した際のトラブルシューティングでした。
普段IT業に従事している方からしたら、当たり前にできるレベルの事と感じるかもしれません。
しかし、現地で情報収集して取りまとめを行うのは地元のボランティア団体の方々です。様々な個人情報が含まれるため、致し方ないことです。それらの方々の中にITリテラシーが高い方がいらっしゃればそれまでのことですが、必ずしもその限りではありません。
カラープリントが綺麗に印刷されない、PCから印刷を行っても印刷されない、PCの操作でわからない部分がある、といった事象を解決していきました。
文字に起こすと大した作業ではありませんが、知識があり支援ができる人間が被災地にいるというのは決して意味のないことではないと感じました。

#おわりに
簡単ではありますが私の経験談でした。
ぜひご自身の知識を活かしたサイバーボランティアに参加されてはいかがでしょうか。
ボランティアの前提として、他人に感謝される事を期待して行うことではありません。しかし、自身の知識が何か役にたつというのは仕事では感じづらい経験です。
また、ボランティアの現場においてITリテラシーがある方がまだまだ少ないのが現状です。一人でも多くのエンジニアが興味を持っていただけたら幸いです。
Ionicのバージョンアップ方法まとめ

IonicはSemVerを採用しており、約6ヶ月毎のメジャーリリース、毎月のマイナーリリース、不具合などへの軽微な修正を行うパッチリリースが行われています。Angular9とIvy対応にあわせてIonic5リリースが用意されているため、メジャーリリースだけは遅れていますが、それ以外は頻繁にアップデートが行われています。

プロジェクトでも依存パッケージに追随してバージョンアップを行うべきです。バージョンアップには、脆弱性の修正以外にもパッケージサイズや実行の最適化による高速化による恩恵をうけることができます。また、その背景についてAngular日本ユーザー会というコミュニティの副オーガナイザの奥野さんがとても適切な言及をしているので、引用します。

> Chromeは6週間ごと、Firefoxは4週間ごとにあたらしいバージョンがリリースされます。（中略）そして、このウェブの早さに慣れることこそが、ウェブを生業にする者の宿命だと思っています。
https://qiita.com/okunokentaro/items/503ab7a4c7601b564de0#%E3%83%90%E3%83%BC%E3%82%B8%E3%83%A7%E3%83%B3%E3%82%A2%E3%83%83%E3%83%97%E3%82%B5%E3%82%A4%E3%82%AF%E3%83%AB

Ionicにおいても実行するブラウザがこの速さで進化を続けているので、それに追随することはとても重要です。

# どうやってバージョンアップするの？
## バージョンアップを発見する
まずバージョンアップが行われていることに気づく必要があります。原則は、一次リソースであるIonicのレポジトリを確認しましょう。

https://github.com/ionic-team/ionic/releases

どの不具合が解消されて、どのような機能が実装されたかを一読することができます。英語？Google翻訳で大体読むことができますので、躊躇なく翻訳をかけてください。

ただ、毎日もしくは毎週こちらを確認するのは億劫ですので、Ionic Japan User Groupのslack（ https://ionic-jp.herokuapp.com ）の #release チャンネルで、release情報が更新されるとGitHubからRSS経由に通知が行われるようにしています。RSSリーダーをご利用の方は自分で受信するのもいいと思います。

## バージョンアップ方法を確認する
依存パッケージを巻き込んだバージョンアップを行わないといけない時は、先程のレポジトリで「このようにバージョンアップしましょう」と記述されています。さほど数はないのですが、例えばIonic 4.7.0へのアップデートではレポジトリでバージョンアップ方法が案内されました。

https://github.com/ionic-team/ionic/releases/tag/v4.7.0

また、アップデートがややこしい場合、Ionic Japan User Groupのslackの #release チャンネルでも、バージョンアップ方法を日本語で案内しています。

## バージョンアップする
### Ionic/Angularの場合
Ionic/Angularを利用している時、肝になるのは `ng update` コマンドです。Angularは、定期的にバージョンアップに巻き込む形で、 `angular.json` などパッケージ以外のアップデートを行っており、これは `ng update` コマンドで自動化されています。このコマンドは「前バージョン→最新バージョン」の差でパッケージ以外のバージョンアップを行いますので、 `npm i @angular/core@latest` などでアップデートしてしまった時、恩恵を受けることができず手動作業が生じます。

特にバージョンアップのガイドがない場合、まず実行すべきは

```bash
% ng update @ionic/angular
```

です。うまくいく場合は依存パッケージを巻き込んで最新バージョンにしてくれます。しかし、残念なことにこの方法ではうまくいかないことが多いです。例えば `@angular/core` も追随してアップデートしないといけないなどエラーがでますので

```bash
% ng update @ionic/angular @angular/core @angular/cli
```

など3つを指定してバージョンアップする必要があったりします。ちなみに筆者は大体は

```
% npm i @ionic/angular@latest
% ng update @angular/core @angular/cli
```

を行うことが多いです（ `@ionic/angular` は依存パッケージの `ng update` は提供してるものの、他の自動マイグレーションは今のところ実装されていないため）。

#### Ionic/Angular 4.7.0以下のバージョンアップ
このバージョンアップがIonic的には節目になっていまして、固定バージョンでバージョンアップしないといけないのでコマンドを案内しておきます。4.7.0以下は、4.7.1を中継ぎにしてバージョンアップください。

```bash
% npm i @ionic/angular@4.7.1 @ionic/angular-toolkit@2.0.0 -D
% npm i @angular-devkit/architect@0.801.2 @angular-devkit/build-angular@0.801.2 @angular-devkit/core@8.1.3 @angular-devkit/schematics@8.1.3 @angular/cli@8.1.3 @angular/compiler@8.1.3 @angular/compiler-cli@8.1.3

(場合によってはここでnode_moduleを削除しないといけないかも)

% npx ng update @angular/core@8.1.3 @angular/cli@8.1.3
```

### 他のパッケージを利用してる場合
この場合は通常の `%npm i packageName@latest` で大丈夫です。ただ、Angularのように自動アップデートを提供していないだけですので、例えばIonic/Reactをご利用の場合は、React本体のバージョンアップを確認しながら進めてください。

# まとめ
バージョンアップは夏休みの宿題のようなもので、ひとつバージョンをあげるのは1分程度の作業ですが、ちりつもで溜めに溜め込むとかなりの時間を要する作業になります。Ionic5のリリースも目前ですので、思い立ったら吉日としてぜひこの記事を読んだ今日バージョンアップにチャレンジしてください！

それでは、また。
each.with_indexで番号をつけよう！ ❏Ruby❏

```ruby:sample.rb
fruits = ["バナナ","りんご","みかん","パイナップル"]

fruits.each.with_index(1) do |fruit, index|
  puts "(#{index}): #{fruit}"
end
```

↓

```:出力結果
(1): バナナ
(2): りんご
(3): みかん
(4): パイナップル
```

()の中から始まる数字を順番に振ってくれます。
||の中の第２引数に変数を入れます。

<br>
似たものに `each_with_index`がありますが、必ず0から始まるので使い勝手がイマイチです。

個人的な意見としては、好きな数字から始められる `each.with_index`に軍配が上がります。

<br>
参考
>https://shirusu-ni-tarazu.hatenablog.jp/entry/2012/11/04/173513
>https://qiita.com/gestalt/items/d2c663b4be524581747e

<br>
ではまた！
「public なフィールド」 より強い ＜ 「{ get; private set; } プロパティ」 より強い ＜ 「readonly」が良さそう

[Unity #2 Advent Calendar 2019](https://qiita.com/advent-calendar/2019/unity2) 2日目を、1週間過ぎました。。

---
フィールドを、public で他のクラスに公開するのは良くないよ！

```cs
public string itemName;
```

自動実装プロパティで、setのアクセスレベルを設定できるからこう書くといいよ！

```cs
public string ItemName { get; private set; }
```


という感じの書き方をよく見かけていたので
そんな感じで使っていましたが、

## それより、「readonly」を使うと良さそうです。

```cs
public readonly string itemName;
```

うんうん。

## MonoBehaviour を継承したクラスは、コンストラクタ使えないじゃん？

これは極端な思想だと思う人もいるかもしれないですが、
（そこまでしなくてもいいと思う人もいるかもしれないですが）
MonoBehaviour を継承したクラスには、[SerializeField] の変数だけあれば良いと思います。
MonoBehaviour を継承したクラスには、readonly にしたいような変数は置かない。

* 一時的な状態を格納する変数は、ViewModelとして別のクラスに持たせる。
* 最初に初期化してその後変更しない変数は、Modelなど別のクラスに持たせて「readonly」にする。

逆に、この２つを分けないと、神なビューが出来上がりますよね。
コンポーネントを細分化しても、それだけでは、神なコントローラーが出来上がりますよね。

とするとやっぱり、readonly にしたいような変数はMonoBehaviourを継承したクラスには置かないほうが良さそうです。


以上です。
readonlyを定数(const的な)位にしか使ってこなかった人に届くと嬉しいです。
ファイルを一括リネームするバッチファイルを作る

# 背景
サーバーのログファイルを取得して特定のフォルダに保管するという作業があったのですが、複数の同名ログファイルがあるので取得したら一括でリネームしたい。  
作業端末がWindows10なので簡易的なバッチファイルを書いてみることにしました。

## こんな感じにしたい
リネーム後のログファイル名は、

- サーバ1で取得したログ　〇〇〇〇.log → 〇〇〇〇_server1.log
- サーバ2で取得したログ　〇〇〇〇.log → 〇〇〇〇_server2.log

のように末尾にサーバ名を付加する。
なお元のログファイル名の長さはどのファイルも同じ長さです。
またリネームしたいファイルとバッチファイル以外のファイルはフォルダに置かないようにします。

# できたバッチ
```bat
@echo off

set /P STR_INPUT="サーバ1なら1を、サーバ2なら2を入力："

IF %STR_INPUT%==1 (
set serverName=server1
) ELSE IF %STR_INPUT%==2 (
set serverName=server2
) ELSE (
echo 1か2を入力してください
pause
goto :EOF
)

for %%f in (*.log) do call :sub %%f
echo リネーム完了
pause
goto :EOF

:sub
rename ?????.log ?????_%serverName%.log
goto :EOF

```
付加するサーバ名を選べるようにして、フォルダにある.logファイルを一括でリネームする、という簡単な内容です。  
ただバッチファイルを作るのが初めてだったので、微妙にハマったところがいくつか。。。  

## ハマったところ
### IFの書き方
IF文を書いたけどなぜか動かない。ネットで解説記事を読んでみても間違ってなさそう。。。  
とよくよく調べてみると、

```
IF 条件式 (
    処理
)
```
文法としては上記のように書くのだが、条件式とカッコ( の間には**半角スペースが必要**と判明。
最初に書いたプログラムではスペースがなかったため、ちゃんと動いてませんでした。。。
ELSE IFやELSEの当該箇所でもスペースを入れ忘れるとIF文全体が機能しなくなるので注意。

### pause
処理が完了したら「リネーム完了」と画面に表示するようにしたかったのですが、最初に書いたプログラムでは画面に表示されませんでした。コマンドプロンプトから起動すると表示されるのになんでだろう？？？  
調べてみると**pause**が入っていないのが原因でした。
pauseを入れる理由は、バッチファイルを直接ダブルクリックで実行する場合、処理が完了するとすぐ画面が閉じてしまうため、echoでメッセージが表示されない。そのためpauseを入れることでメッセージを表示するところでいったん処理をとめる、ということが必要らしい。
なおtimeoutでも処理を指定の秒数分遅らせることができるとのこと。

#### ?????について
個人的にはあんまりイケてないなあと思うところですが、今回リネームする対象のファイルはファイル名が一定であることからこのような処理としました。
?は文字を表しており、?????は半角5文字ということになります。たとえばaudit.logが対象だとすると、.logの前が半角5文字なので処理対象となります。なので文字数が異なるファイルがあると正しくリネームされないです。

#### できたはいいけど
作業端末だとセキュリティの関係でバッチファイルが動かなかった。。。
なんちゃってスマートホーム

使用してるハード
umidigi one pro（家に放置するスマホ、Autoinputが動くならなんでもいい）
[セサミ mini スマートロック](https://www.amazon.co.jp/Alexa%E8%AA%8D%E5%AE%9A%E8%A3%BD%E5%93%81%E3%80%91-%E3%82%B9%E3%83%9E%E3%83%BC%E3%83%88%E3%83%AD%E3%83%83%E3%82%AF%E6%9C%AC%E4%BD%93-%E3%82%B7%E3%83%A3%E3%83%B3%E3%83%91%E3%83%B3%E3%82%B7%E3%83%AB%E3%83%90%E3%83%BC-%E3%82%B9%E3%83%9E%E3%83%BC%E3%83%88%E3%83%95%E3%82%A9%E3%83%B3%E3%81%A7%E3%83%89%E3%82%A2%E3%82%92%E6%96%BD%E9%8C%A0%E8%A7%A3%E9%8C%A0-Assistant/dp/B07QP7DQ4N/ref=sr_1_1?__mk_ja_JP=%E3%82%AB%E3%82%BF%E3%82%AB%E3%83%8A&keywords=sesame&qid=1575680173&smid=AN1VRQENFRJN5&sr=8-1&th=1)
[Broadlink RM Mini 3（黒豆）](https://ja.aliexpress.com/item/33007260333.html?spm=a2g0o.productlist.0.0.2e6e3ad2URCW5f&algo_pvid=d4315424-7da8-4094-98d7-47c521a4ae09&algo_expid=d4315424-7da8-4094-98d7-47c521a4ae09-0&btsid=76be9ac0-5c84-4da0-b339-881d4e688a3b&ws_ab_test=searchweb0_0,searchweb201602_1,searchweb201603_55)
[Xiaomi Gateway](https://ja.aliexpress.com/item/32821192659.html?spm=a2g0o.productlist.0.0.135a3e3fOwRufT&algo_pvid=f00e3ff9-872c-4866-a9c2-f5dac634c902&algo_expid=f00e3ff9-872c-4866-a9c2-f5dac634c902-0&btsid=62fedf20-2dea-4fb1-bedc-5ad5117fb095&ws_ab_test=searchweb0_0,searchweb201602_1,searchweb201603_55)
[xiaomi door sensor](https://ja.aliexpress.com/item/32829391822.html?spm=a2g0o.productlist.0.0.75681b3eDoeCJ7&algo_pvid=76fb3f30-36bf-4064-8fc2-ddda39373622&algo_expid=76fb3f30-36bf-4064-8fc2-ddda39373622-0&btsid=225ad16c-de18-4ed8-bf1b-51c6afba1de5&ws_ab_test=searchweb0_0,searchweb201602_1,searchweb201603_55)
[xiaomi ワイヤレススイッチ](https://ja.aliexpress.com/item/32825685057.html?spm=a2g0o.detail.1000013.1.28ed73139eAbyH&gps-id=pcDetailBottomMoreThisSeller&scm=1007.13339.146401.0&scm_id=1007.13339.146401.0&scm-url=1007.13339.146401.0&pvid=f8b92dcb-d10f-4e71-a03e-23b190b35063)
多分全部買っても5万超えない


使用してるアプリ
[Tasker](https://play.google.com/store/apps/details?id=net.dinglisch.android.taskerm&hl=ja)
[IFTTT](https://play.google.com/store/apps/details?id=com.ifttt.ifttt&hl=ja)
[PushBullet](https://play.google.com/store/apps/details?id=com.pushbullet.android&hl=ja)
[AutoInput(Taskerから使うタップ自動化アプリ)](https://play.google.com/store/apps/details?id=com.joaomgcd.autoinput&hl=ja)
[mihome(xiaomi用)](https://play.google.com/store/apps/details?id=com.xiaomi.smarthome&hl=ja)
[ihc(黒豆用)](https://qiita.com/yb3/items/2a534da33f0d739fd560)
[SESAME(スマートロック用)](https://play.google.com/store/apps/details?id=co.candyhouse.sesame&hl=ja)
[通知キャンセラー（Taskerの動作不良対策）](https://play.google.com/store/apps/details?id=jp.co.punigram.notican&hl=ja)

必要なもの
仕事中に家の鍵が勝手に開いても折れない心
言うことを聞かない家電に根気よく接する体力
全てのハードの技適を申請する強い精神力

全体の流れ
とにかくTaskerとAutoInputで各個アプリを自動で動かせるよう設定する
（TaskerのTASKSタブに「sesame_unlock」みたいなタスクを大量に作る）
プロファイルからイベントpluginのPushBulletで「これを受け取ったらこれして」を同じように大量に作る
自分の普段持ちのスマホにlocaleとPushBulletの因果関係を大量に書く
（自宅付近に近付いたら暖房付けて、ここまで近付いたら鍵開けてなど）

クソみたいな知見
セサミのアプリがよく動作不良起こすので3時間に一回くらいリブートしとく（重要）
AutoInputのアプリも良く動作不良起こすので一時間に一回立ち上げとく（重要）
Taskerの通知トリガーで各個アプリの通知を2回以上受け取る時に動作不良起こすので、
その対策に通知キャンセラーで受け取った通知を毎回殺す動作にしておく（重要）

詳細の説明
がんばって
『テストも開発なのだ』と実感できた瞬間！

#テストケースが仕様書という感覚
　そもそもテストケースもテストを指定（Specify)しているので仕様書です。JSTQBの用語集を見ても、「テスト仕様書」や「テストケース仕様」という用語が見つかります。ですが、私個人としてはこれまであまり仕様書という感覚はなく、仕様書だという意識も薄かったです。
　しかし、今の現場でテストコードを実装している人と会話すると彼らは仕様書という言葉を使い、そして仕様書という認識していることが強いことが分かりました。テスト実行者にはあまりない感覚かなとも思いました。また、『テストも開発なのだ！』と言われることもありますが、これをより実感できるようになりました。テストケースにおいて、しっかり指定すべき、明確にすべきなのだという意識が高まりました。
　それは、自動テストの場合、手動テストのようにテスターが色々考えて補ってくれないからです。実装した通りにしかテストは実行されません。テスト実装者が気をきかせて盛り込んでくれるということも無くは無いですが、それを期待してテスト設計するのはあまりにも愚かです。
　さて、テストケースには様々な要素がありますが、その中でも前提条件、手順、期待結果の３つの指定について触れたいと思います。

#前提条件のこと
　まずは前提条件ですが、ここにはテストケースの手順を実施する際のテスト対象の状態や環境を指定することになります。「初期状態であること」「ｘｘが登録済みであること」「xxxでログインしていること」「テスト対象内にｘｘｘというデータが複数存在すること」「テストサーバーに接続されていること」などです。
　実現したいテストを実施するうえで必要になるものを指定します。これは前提条件と言うくらいなので、テストそのものではなく、あくまで前提の内容になります。ただし、これを誤ってしまうと、いくらその後の手順が正しくても期待する結果にならなくなります。そして何よりやりたいテストが実現されないことになります。そのため、当たり前だからといって記載を省くようなことはせず、正確な情報をしっかりと指定する必要があります。ある程度パターン化されているなら状態Aとか環境Bとかにして情報量を減らす、伝えやすくするという工夫はあるかなと思います。

#手順のこと
　手順を明確に書くことは当たり前ですが、それ以外にも気をつけた方が良い点がいくつかあります。これは私が実際にテスト実装者（自動化エンジニア）とやりとりする中で気づかされたことです。
　まず一つ目はある画面内の要素のフォーカスの仕方です。例えばある画面に「30秒」、「1分」、「なし」と言う項目が上から順に並んでいるとします。「30秒」の項目確認後、「1分」の項目を確認したいので、「1分にフォーカスする」という手順を書きます。私は↓キーを押すことによって「1分」にフォーカスして欲しいと思っていましたが、それは明記せず、無意識にそうするものだと思い込んでいました。しかし、自動化ツールによる操作の場合↓キーを押すことなく、「1分」という項目を探して直接フォーカスすることも可能だったりします。（今回の場合は実際にそうでした）もしその内容で実装されてしまった場合、↓キー操作によるフォーカスの切り替えは確認されないことになります。キー操作のテストが不要だった場合はこの内容でも問題ないですが、↓キー操作によるテストも必要だった場合はテスト漏れになります。そのため、キー操作が必要なのであればしっかりと明記する、もしくはテスト設計者、実装者間で、このようにテストケースに書いてある場合はこう実装して欲しいなどのルールを作り、共有することが大事です。
　また、もう一つ気をつけた方が良いと感じたのは、初回だけに表示されるチュートリアルの画面の扱いです。つまりある操作を行った際に表示される画面が初回と2回目以降で変わってしまうと言うことです。これをあまり意識せず手順に書いてしまうと実装する時に困る、もしくは自動テストの実行で失敗する可能性がでてきます。この点をしっかり手順に盛り込む、もしくは前提条件で指定することにより回避するなどの対策が必要です。

#期待結果のこと
　期待結果で気をつけた方がよいのは、まずは何をもってそれを確認するかということだと思います。「xx画面が表示されること」「xx画面に遷移すること」などの場合、画面タイトル、もしくはその他の画面内要素で判断することになることが多いです。
　「xxが開始すること」「xxの登録が成功すること」などであれば変化が生じるポイントがあります。ステータスやボタンの名称や色が変わる、何かメッセージが表示されるなどです。このようなポイントをしっかりと伝える必要があります。これをその都度テストケースに明記するのでもいいですが、ある程度パターン化されたものであればテスト設計者と実装者で共通認識をもてる記述ルールを設けるのもありだと思います。
　あとは記述が漏れがちなのは、「表示されない要素」についてです。例えば、ある状態では「A,B,C」の3項目が表示され、状態が変わると「B,C」が表示されるとします。この時、状態が変わったあとの期待結果を「B,Cが表示されること」と記述したとします。そして実装もBとCの存在有無を確認して判断していた場合、もしB,C以外に表示されてはいけないAが表示されていたとしてもこのテストコードではその不具合を検出することはできません。「B,Cが表示されること」というのが、暗黙的に「Aが表示されてないこと」を含んでいたのであればしっかりと明記することが必要です。手動テストであれば、「B,Cが表示されること」というテストケースにたいしてAも表示されていればテスターは変だなと感じアクションを起こす可能性が高いと思います。ただし自動テストで要素の有無によって判断する場合は検出できる可能性はゼロです。その場合は、画像比較などによって判断するなど自動化の実現方法を検討する必要があります。テストケースだけみると細かな点なのですが、不具合検出漏れにもつながるので非常に重要なポイントになります。

#まとめ
　テストケースはテスト実装者にとっては仕様書で、テスト開発における重要なものであることを書きました。自動テストのことで気づかされたことではあるのですが、もちろん手動テストを実施する場合でも同様に重要となるものです。上記で紹介した事例も手動テストでも起きうるものです。自動テストの場合、よりそれが厳しく、悪い方向に影響してしまうのです。手動テストでは補ってもらえることを期待できるのですけどね。自動テストを考えていると、テスターの気づきに甘えていていたことに気づかされることが多いです。
Rustのactix-webでPostgreSQLを扱う

# 目的
[actix-web](https://crates.io/crates/actix-web)にあるサンプルに最小限でPostgreSQLを使えるように修正してみました。
[example/r2d2](https://github.com/actix/examples/tree/master/r2d2)を参考にしています。こちらはSQLLite。

# プログラム
```rust:Cargo.toml
[package]
name = "web"
version = "0.1.0"
edition = "2018"

[dependencies]
actix-web = "^1.0"
futures = "0.1"
r2d2_postgres = "^0.14"
```

```rust:main.rs
use actix_web::{web, App, Error, HttpResponse, HttpServer};
use futures::Future;
use r2d2_postgres::{postgres, r2d2::Pool, PostgresConnectionManager, TlsMode};

fn index(
    info: web::Path<(String, u32)>,
    // コネクションをメソッドの引数でうけとる
    db: web::Data<Pool<PostgresConnectionManager>>,
) -> impl Future<Item = HttpResponse, Error = Error> {
    // DBの結果が返ってくるまでblock
    web::block(move || {
        let conn = db.get().unwrap();
        let rows = conn.query("SELECT now()::TEXT", &[])?;
        let row = rows.get(0);
        let now: String = row.get(0);

        // ここで戻り値の型を明示する必要がある
        let result: Result<String, postgres::Error> = Ok(now);
        result
    })
    .then(move |res| match res {
        Ok(now) => {
            Ok(HttpResponse::Ok().body(format!("Hello {}! id:{} now:{}", info.0, info.1, now)))
        }
        Err(_) => Ok(HttpResponse::InternalServerError().into()),
    })
}

fn main() -> std::io::Result<()> {
    // PostgreSQLのコネクションプールを作成する
    let postgres_manager = PostgresConnectionManager::new(
        "postgres://user:pass@localhost:5432/test",
        TlsMode::None,
    )
    .unwrap();
    let postgres_pool = Pool::builder().build(postgres_manager).unwrap();

    HttpServer::new(move || {
        App::new()
            // Webデータとして設定
            .data(postgres_pool.clone())
            .service(web::resource("/{name}/{id}/index.html").to_async(index))
    })
    .bind("127.0.0.1:8080")?
    .run()
}

```
Kotlinで関数定義


### 基本的な関数定義と呼び出し

基本的な関数定義。

```Main.kt

// 引数なし、戻り値なしの関数。値を返さない関数の戻り値はUnit型として扱われる。また、Unit型は省略可能。
// 本来はこうだが、
fun 関数名(): Unit {
    // コード
}
// こう書ける
fun 関数名() {
    // コード
}

// 引数あり、戻り値ありの関数
fun 関数名(引数1: 型1, 引数2: 型2): 戻り値の型 {
    // コード
    return 戻り値
}

// デフォルト引数の指定も可能
fun 関数名(引数1: 型1 = デフォルト値1, 引数2: 型2 = デフォルト値2): 戻り値の型 {
    // コード
    return 戻り値
}

// 関数本体が単純な式の場合はブロックを省略できる。また、型推論が働くため戻り値の型も省略できる
fun 関数名(引数1: 型1 = デフォルト値1, 引数2: 型2 = デフォルト値2) = 式

```

```Main.kt
fun main() {
    println(sum1(3, 5))         // デフォルト引数なしの関数呼び出し

    println(sum2(3))            // デフォルト引数ありの関数呼び出し, bとcはデフォルト引数が採用される
    println(sum2(b = 3))        // 引数の値は明示的に指定が可能

    println(sum3(1, 4))
}

fun sum1(a: Int, b: Int): Int {
    return a + b
}

// デフォルト引数の指定も可能
fun sum2(a: Int = 5, b: Int = 4, c: Int = 8): Int {
    return a + b + c
}

// 関数本体が単一の式を返す場合、中括弧を省略することができる。また、型推論が働くため戻り値の型も省略できる。
fun sum3(a: Int, b: Int)  = a + b
```

### 可変長引数を持つ関数

```Main.kt
fun main() {
    varargFunction(1, 2, 3, 4, 5)
}

// vararg修飾子を使って可変長引数を定義できる、引数は配列となる
fun varargFunction(vararg nums: Int) {
    // Kotlinでは関数リテラルがパラメータを1つだけ持つ場合省略可能、その場合itという名前になる
    nums.forEach { print(it) }
}
```
強化学習30.1　chainerとchainerRLの今後とchokozainerRLの今後

 強化学習の「人間の学習」を行う上で、colaboratoryは便利であり、その上で動くことを基本とするならば、chainerRL＋OpenAIgymは多分、最も簡単な方法と思われます。
 ただし、もともと気になっていたのですが、tensorflowとpytorchの存在。tensorflowは製品開発向けで、pytorchは研究向けなどという意見もあります。
そんな中、
https://preferred.jp/ja/news/pr20191205/

chainerの開発は終了する予定みたいです。
もともと、オープンソースでしたが、pytorchとtensorflowが伸びる中で、独自性を維持する理由がないとの判断のようです。
pytorchとchainerはかなり似ているとの評価もありますので、移行がスムーズになるならば、いいのかなあと思います。
chainerRLの学習部分はchainerを利用しており、Pytorchのoptimizerは、もともとはchainerのもの？らしいので、変化は比較的小さいのかなあと思っています。

chainerRLのラッパーとして、初学者がやりやすいように、chokozainerRLをゆっくり開発していこうと思うので、当面は、このまま進めてみようと考えています。
それくらい、他の方法（KerasRLなど）を調べてみると、chainerRLは使いやすいんですよね。パラメータ設定するだけで、DQNが動くって、すごいじゃないですか。
Live2D Cubism SDKのActionという名前でハマった話、名前空間と衝突

## Actionという名前の衝突
#### 「Action」って名前のスクリプトファイルを自分で作っちゃダメ
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/58548/ca5cc923-a00f-592e-0dad-503a0b26a6c8.png)
自分で作らなくてもインポートした他のアセットが同じ名前を使っていると名前が衝突するので変更の必要が出てくる。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/58548/e8a85ef2-b486-fea2-1305-156a0fffa652.png)

エラーメッセージ(コンソールウィンドウを表示させる Ctrl+Shif+C 必要があります)：
>Assets\Live2D\Cubism\Framework\CubismUpdateController.cs(52,39): error CS1503: Argument 1: cannot convert from 'Action' to 'System.Delegate'

>CubismUpdateController.csでエラー(52行目,39文字目)
引数1：「Action」から「System.Delegate」に変換できません(Google翻訳)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/58548/afe83867-a270-451d-3e50-bd812aa81440.png)
↑「Action.cs」を作る前 (Actionにマウスカーソルを合わせたときの型名に注目)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/58548/ae35eed0-9c6f-54b7-f1df-08951f43baef.png)

↑「Action.cs」を作ったあと(「System.Action」の筈なのに自分で作った「Action」と誤解して52行目でエラー)

#### 同様の事例
↓氷音さんの記事でも同じ問題が発生して回避しています(記事の下の方)。
[今度こそ！Live2DとUnityPlaygroundを組み合わせてゲームを作ってみた【前編】](https://crazy-omamagoto.hatenablog.com/entry/2019/12/04/000225)
>（私がやったことはActionってのがUnityPlaygroundとLive2D SDKとで被ってたので
UnityPlaygroundのActionってお名前をちょっと変えただけです）

#### SDK側を修正して対応する方法
↓この問題はSDK側のスクリプトを修正するだけでも対応可能です（なるべくやりたくないですが…）
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/58548/918b7b4e-d4a2-a21b-fcff-4e81cc96cb1a.png)

「Action」って名前を「System.Action」という誤解のない完全名に変更しています。

#### どういうことなの？
「イチロー！」って呼んだら「マリナーズのイチロー」と「友人の山田イチロー」を混同したので、「マリナーズのイチロー」って完全名で呼ぶようにして誤解をなくした感じです。「SystemのAction」って呼んであげるようにしました。

#### スクリプトの冒頭によく書く「using なんちゃら;」って何？
18行目の **「using System;」** の意味は、いちいち完全名の「マリナーズのイチロー」って呼ぶのメンドクセーから「マリナーズの(Systemの)」って言うのはもう省略しようぜ！って意味です。

便利ですが、知り合いにイチローって名前の別人が居ると、どっちを指しているのかわからなくなります。
なので、面倒ですが堅実に書くなら毎度、毎度、「マリナーズのイチロー」って完全名で呼んであげるのが1番確実です。

(このSDKへの修正で悪影響が出ることは無い筈…たぶん)


#### 自分のスクリプト側を完全名にして呼ぶ
namesspace 名前空間名 { } でクラスを囲って自分で名前空間を作り、自分が使うときに完全名で呼ぶ…
その解決策でもよい

#### 過去の自分のやらかし
<blockquote class="twitter-tweet"><p lang="ja" dir="ltr">詰まって放置していた自分のゲームのLive2D SDKのアップデートが上手く行った。Action…などという馬鹿なクラス名を作ってしまったせいで、追加されたCubismUpdateController内のSystem.Actionと衝突、クラス名を変更したらCubismUpdateController.cs内のAction型名まで変更されていた…。</p>&mdash; 栗坂こなべ@C97落選 (@kurisaka_konabe) <a href="https://twitter.com/kurisaka_konabe/status/1167723882360344577?ref_src=twsrc%5Etfw">August 31, 2019</a></blockquote> <script async src="https://platform.twitter.com/widgets.js" charset="utf-8"></script>

#### その他
Live2D SDK側が用意したスクリプト名や名前と衝突すると色々と面倒なことになる。Unityでは同一プロジェクト内に同じ名前のC#スクリプトがあるとエラーになる。インポートしたSDKやアセットと衝突してもダメ。詳細は長くなるので後日余力があれば…
Amazon Sumerianの紹介

Three.js Advent Calendar 2019の番外編的なアドベントカレンダー投稿です。
AWSのサービスの1つにAmazon Sumerianというものがあります。これは3D、AR、VRアプリケーションの開発と公開が可能な製品でWebGLをベースとしています。

GUIで操作することができ各種AWSサービスとの連携もできるようになっています。
画面イメージは以下のとおりです。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/52178/5ce57017-5e93-a6b7-dc5b-917314f6fd1d.png)

# デモ
デモ画面を作ってみました。いきなりしゃべり始めますので閲覧時はご注意ください。（デフォルトでは右下のスピーカーマークがミュートになっているかもしれません）
初めから用意されているテンプレートでしゃべる文章だけ少しカスタマイズしました。

https://ap-northeast-1.sumerian.aws/7829d82b3cae48b0b60d0badd6eff0b2.scene

# 参考情報
https://aws.amazon.com/jp/sumerian/
Universal Loginを使ってみる

#Universal Loginを使ってみる

##１.動機
ブロックチェーンなんぞ興味ないという一般の人からすると、Dappsを触るために秘密鍵を記憶・管理することは難しいと思います。一つのパスワードとかで全部使えればいいのになーという思いからそんな製品を調べました。

##2.Universal Loginとは
Dappsを使用する際に秘密鍵の管理など複雑なプロセスを解消し使用のハードルを下げるアプリです。
2018年のDevcon4で発表され、今年のDevcon5でも途中経過が説明されていました。
Roadmapとしてはこんな感じです。
<img width="1062" alt="スクリーンショット 2019-12-07 8.52.40.jpg" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/474778/20af0cc8-6ca7-f55c-f8d1-d4f0cea77363.jpeg">

##3.どんな特徴があるの？
公式で説明されているのは下記の4つです。
① どんなブラウザでも使用可能
② クレジットカードや銀行口座を使用し、すぐにETHを購入可能
③ 機器を紛失したとしても、事前に設定していた家族のアカウントなどから復元可能
④ ETH以外の送金時にETHを持っていない場合も送金可能

##4.使ってみよう
今年beta版が出たということなので早速使ってみましょう。
Jarvis Web Walletという名前でdemoがあるようです。　→  [https://beta.jarvis.network/](https://beta.jarvis.network/)

ここで新規アカウントを作成していきます。
<img width="1404" alt="スクリーンショット 2019-12-07 9.00.04.jpg" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/474778/c476e0f4-277b-7375-9b49-43cbeaf5a3f7.jpeg">

ここで仮想通貨か法定通過を送リます。
仮想通貨を送るのにwalletがいるので全くUX改善されていないのがまだbetaたる所以なのか。。。
<img width="792" alt="スクリーンショット 2019-12-07 9.00.48.jpg" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/474778/478856a3-9ec6-cbdc-2e42-4cdded444908.jpeg">

無事送付しトランザクションが完了すればアカウント作成完了です。
こちらが自分のwallet画面となります。
<img width="1248" alt="スクリーンショット 2019-12-07 9.09.53.jpg" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/474778/ed9f30dd-f484-459f-318c-ead2ae061f19.jpeg">

では複数デバイスで使用できるか試してみます。
現在はこのように一つのデバイス（ここではPC)のみです。
携帯から登録したusernameでログインしようとするとPCに「新たなデバイスが接続したい」というコメントが表示され、接続するか選べます。
<img width="975" alt="スクリーンショット 2019-12-07 9.21.56.jpg" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/474778/29c0d6e9-f8c3-56a6-6891-36bf2de4d9a4.jpeg">

接続ボタンを押すとこのように確認画面にいき、携帯に表示されているものと同じ順番で絵文字を選択する必要があります。これを正しく入力すると確認が完了し接続できるようになります。
<img width="982" alt="スクリーンショット 2019-12-07 9.19.39.jpg" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/474778/4d330c6f-ea9d-9eb6-f9b7-34c8c20a02f0.jpeg">

完了した物がこちら　（携帯からもwalletが見れることを確認できました）
<img width="964" alt="スクリーンショット 2019-12-07 9.27.41.jpg" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/474778/7ab054cd-99e4-270e-5f59-555f7583b4b8.jpeg">

##5.まとめ
シンプルで使いやすいなというのが率直な意見ですが、登録するのにETHが必要なのはUX改善されてないように思いました。
今後こういったUX改善の製品がどんどん出てきて、広く一般的にDappsが使用されるようになると嬉しいですね。



##参考
公式HP　[https://universallogin.io](https://universallogin.io/#process)
Medium [https://medium.com/universal-ethereum/universal-login-beta-is-live-heres-how-you-can-apply-7386890c2e0d](https://medium.com/universal-ethereum/universal-login-beta-is-live-heres-how-you-can-apply-7386890c2e0d)
技術的な日本語解説
[https://qiita.com/toshiaki_takase/items/9c5147592572733cc236](https://qiita.com/toshiaki_takase/items/9c5147592572733cc236)
(d10n Lab会員であれば)[https://junyahirano.com/overview_universal_login/](https://junyahirano.com/overview_universal_login/)
球種予測に関する研究サーベイ

この記事は[「スポーツアナリティクス Advent Calendar 2019」](https://adventar.org/calendars/3930)の７日目の記事です。

# はじめに
本記事では、野球における「投手が次に何を投じるかを予測する」ことを目的とした論文を紹介します。テーマは「野球における投手が次に投じる球種を予測する」というものです。今回はこの分野での最新の論文を紹介します。
その前にまずは、そもそもなぜ僕が球種予測に興味を持ったのかについてお話ししたいと思います。

## 球種予測について
野球における数理的タスクには以下のようなものがあります。

- 投球と故障の関係性（この医療分野が一番活発）
- 選手の獲得戦略
- 戦略面の最適化
- 試合結果や打席結果などの結果系の予測
- 球種選択や作戦等の意思決定の予測

今回のタスクは一番最後の「球種選択や作戦等の意思決定の予測」に当たります。もしこの意思決定に関する予測の精度を高めることができれば、意思決定のモデリングが可能になったといえます。
例えば、配球のモデリングが可能になれば、いつもとは異なる配球をしたシーンを検出することができるようになり、選手の心理状況の変化を可視化することに繋がると考えています。
もしそうなれば、いわゆる「流れ」や「心理的影響」の定量化に一歩近づくことができるのではないでしょうか？この点に僕は非常に魅力を感じたため、意思決定の予測タスクに興味を持ちました。

野球における意思決定の予測タスクを行う場合、予測対象になりうるものは2つあると考えています。球種予測と作戦予測です。作戦予測の場合は、発生するケースがかなり限定されてしまうため、予測対象にするには難しいと考えられます。（ex.スクイズは0,1アウトかつランナーが3塁にいるケースのみが予測対象となる）
一方、球種予測の場合は全投球が予測対象となるため、予測モデルを作成するのが容易であると考えられます。そのため、予測対象として扱いやすいのです。

これらの理由により、僕は球種予測というタスクに興味を持ちました。ちなみに、配球予測という意味では投球のコースまで予測する必要がありますが、コース予測の場合は「意図したところに投手が投げ分けることができるとは限らない」、「そもそも投手がどこに投げたかったのかという情報がデータとして残っていない」という理由があるため、予測困難であり（かつ意思決定の予測からは話がそれてしまう）、研究では予測対象から外されています。

# 論文紹介
今回紹介するのは"[Using Multi-Class Classification Methods to Predict Baseball Pitch Types](https://content.iospress.com/articles/journal-of-sports-analytics/jsa171)"という論文です。2018年、Journal of Sports Analyticsから出版されています。

## 論文のざっとした内容
### 背景
球種予測をテーマにした研究はいくつもあるが、多くは2値(ストレートor変化球)のみを予測するもので多クラス(球種そのもの)を予測する研究は2つしかない。さらにその2つの研究もワールドシリーズの試合だけを予測していたり、投手を4人だけに絞っていたりと非常に限定的。
そこでこれらの2つの論文を拡張し、より汎用的な予測を行った際にどれだけの精度を得ることができるのかを知りたい。
### 目的
長期間のデータでもっと多くの投手を対象として球種予測を行う際に以下のことを調査する。

- 最も良いパフォーマンスを発揮する手法とその精度
- 予測精度と投手の成績指標は関係性があるのか
- 予測するうえで重要な変数は何なのか
- 実際のゲームをリアルタイムで予測したときにどれだけの精度を残せるか

### 結果
- LDA,SVM,ランダムフォレストの3つの手法で7種類の球種を予測したところランダムフォレストが最も精度が高く，その精度は66.62%だった
- 予測が難しい投手ほど、FIP[^1]やWAR[^2]といった指標も良い傾向にあった
- 予測に重要な変数として投球数，カウント，前投球の情報などが挙げられた
- リアルタイムで予測すると59.07%の精度を得られた

[^1]: https://ja.wikipedia.org/wiki/DIPS_(野球)
[^2]: https://ja.wikipedia.org/wiki/WAR_(野球)

## 論文紹介メイン
Qiitaでまとめていたのですが、ちょっと見栄えが悪かったので、pptにまとめてSlideShareで公開することにしました。[こちら](https://www.slideshare.net/raijinshibata/ss-202233945)からご覧ください。

# おわりに
今回の記事では、野球において投手が次に何を投げるかを予測した研究を紹介しました。意思決定をモデリングすることは流れや心理的影響の定量化につながると述べましたが、それ以外にも

- 現場での実際の作戦面への応用
- ゲーム等のアルゴリズムの改良
- メディアにて公開することでエンターテインメントの1種とする

のような応用先が考えられます。僕は特に最後のエンターテインメントの1つとしての可能性に非常に期待しています。2017年の日本シリーズではzunoさんという投球予測AIが視聴者と投球予測バトルを行うというイベントがありました。([参考](https://dentsu-ho.com/articles/5558))
実際にAIが予測した結果をリアルタイムで紹介し、視聴者がそれに関して議論を交わす。こんな新しいスポーツ観戦の楽しみ方があってもいいのではないかと思っています。



ちなみに、私自身も昨年度の[スポーツデータ解析コンペティション](https://estat.sci.kagoshima-u.ac.jp/sports/index.htm)にて「LSTMを用いた球種予測モデルの構築」というテーマで研究結果を発表しました。大変ありがたいことに、昨年度の野球分析部門にて最優秀賞を受賞させていただきました。[^3]
本年度のスポーツデータ解析コンペでの分析事例は、Advent Calendar 25日目の加藤さんの記事で紹介されるとのことなので、楽しみに待ちましょう。

[^3]: 内容についてはここでは割愛しますが、統計数理研究所刊行の「スポーツデータ解析におけえる理論と事例に関する研究集会　第６巻」にて報告書としてまとめられています。