OmniAICreator/Qiita-1.07M huggingface dataset:
Ansible インストール後の環境設定・動作確認

<!-- wp:paragraph -->
<p>Ansibleから各サーバーへSSH接続するための鍵を生成します。</p>
<!-- /wp:paragraph -->

<!-- wp:loos-hcb/code-block {"langType":"bash","langName":"Bash"} -->
<div class="hcb_wrap"><pre class="prism undefined-numbers lang-bash" data-lang="Bash"><code>[ansibleuser@localhost ~]$ ssh-keygen -t rsa -b 4096
Generating public/private rsa key pair.
Enter file in which to save the key (/home/ansibleuser/.ssh/id_rsa):
Created directory &#39;/home/ansibleuser/.ssh&#39;.
Enter passphrase (empty for no passphrase):
Enter same passphrase again:
Your identification has been saved in /home/ansibleuser/.ssh/id_rsa.
Your public key has been saved in /home/ansibleuser/.ssh/id_rsa.pub.
The key fingerprint is:
SHA256:6e4iivhgOo/VB96sXcutaCFVJXceLNFJJKUbn++MfQI ansibleuser@localhost.localdomain
The key&#39;s randomart image is:
+---[RSA 4096]----+
|        ..=B*.   |
(省略)
|=++..ooo*.. . +o |
+----[SHA256]-----+</code></pre></div>
<!-- /wp:loos-hcb/code-block -->

<!-- wp:paragraph -->
<p>作成された  .ssh/id_rsa.pub は接続先サーバーのユーザーの .ssh/authorized_keys に追記しましょう。追記後、鍵を作成した時のパスワードで接続できれは成功です。</p>
<!-- /wp:paragraph -->

<!-- wp:loos-hcb/code-block {"langType":"bash","langName":"Bash"} -->
<div class="hcb_wrap"><pre class="prism undefined-numbers lang-bash" data-lang="Bash"><code>[ansibleuser@localhost ~]$ ssh  ansibleuser@192.168.254.101
Enter passphrase for key &#39;/home/ansibleuser/.ssh/id_rsa&#39;:
Last login: Sun Jan  9 09:28:04 2022
[ansibleuser@localhost ~]$</code></pre></div>
<!-- /wp:loos-hcb/code-block -->

<!-- wp:paragraph -->
<p>次に、ansibleコマンドで接続できるかを確認します。接続先サーバーを設定するhostsファイルを作成します。</p>
<!-- /wp:paragraph -->

<!-- wp:loos-hcb/code-block {"langType":"bash","langName":"Bash"} -->
<div class="hcb_wrap"><pre class="prism undefined-numbers lang-bash" data-lang="Bash"><code>[Host003]
192.168.254.101 ansible_user=ansibleuser</code></pre></div>
<!-- /wp:loos-hcb/code-block -->

<!-- wp:paragraph -->
<p>ansibleのコマンドで接続してみましょう。</p>
<!-- /wp:paragraph -->

<!-- wp:loos-hcb/code-block {"langType":"bash","langName":"Bash"} -->
<div class="hcb_wrap"><pre class="prism undefined-numbers lang-bash" data-lang="Bash"><code>[ansibleuser@localhost ansible]$ ansible -i hosts  Host003 -m shell -a hostname
Enter passphrase for key &#39;/home/ansibleuser/.ssh/id_rsa&#39;:
192.168.254.101 | CHANGED | rc=0 &gt;&gt;
localhost.localdomain
[ansibleuser@localhost ansible]$</code></pre></div>
<!-- /wp:loos-hcb/code-block -->
【Project Euler】Problem 15: 格子状の道

* 本記事は[ProjectEuler](https://projecteuler.net/about)の「100番以下の問題の説明は記載可能」という規定に基づいて回答のヒントが書かれていますので、自分である程度考えてみてから読まれることをお勧めします。

### 問題 15. 格子状の道

原文 [Problem 15: Lattice paths](https://projecteuler.net/problem=15)

**問題の要約：20 x 20の格子状の道を左上から右下まで行くルートは何通りあるか求めよ**
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1922159/0d7ec1c6-66e7-83cf-7165-3665fe3a7059.png)

各格子点に入る道は、上からと左からの2つで、それぞれの前の格子点までのルートの数を足せばよいので、[パスカルの三角形(Wikipedia)](https://ja.wikipedia.org/wiki/%E3%83%91%E3%82%B9%E3%82%AB%E3%83%AB%E3%81%AE%E4%B8%89%E8%A7%92%E5%BD%A2) になることが分かります。パスカルの三角形は前の行を一つずらして足して行きます。n=2の時は4行目まで求めて、その真ん中の値が答えになっています。

```python
import numpy as np
n = 2
p = np.array([1])
for i in range(2*n):
  p = np.append(p, 0)+np.append(0, p)
  print(p)
print(f"Answer : {p[n]}")
#[1 1]
#[1 2 1]
#[1 3 3 1]
#[1 4 6 4 1]
#Answer : 6
```

もちろんパスカル三角形のn行r列は組合せの数$nCr$なので、sympyのbinomialでも簡単に求めることが出来ます。

```python
from sympy import binomial
n = 20
print(binomial(2*n, n))
```


（開発環境：Google Colab）
[Unity初級]Prefab Variantを作成する時に勘違いしやすい事

#概要
Prefab Variantを作成する時、作り方によって少し挙動が変わるところがあります。
Unityを使い慣れている人にとっては当たり前の事ですが、初心者の方にとっては混乱の原因になるポイントだと思います（自分含む）

#本文
このbox prefabのPrefab Variantを作りたい時
![スクリーンショット 2022-01-09 8.40.37.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/617265/952c2dd1-0322-7127-d856-e9b5971c227b.png)
Hierarchy上のbox(box prefab)をProjectビューへドラッグ&ドロップして、ポップアップメニューから"Prefab Variant"を選択するとHierarchy上のbox(box prefab)はbox(Prefab Variant)に切り替わります。
Hierarchy上のboxをbox prefabのままにしておきたい時は
![スクリーンショット 2022-01-09 8.35.35.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/617265/d3196eec-6f7b-9344-baa8-3fefa50421a8.png)
Projectビュー上にあるbox prefabの右クリックメニューからPrefab Variantで作ります。
#Original Prefabの場合
先程の例の中でHierarchy上のbox(box prefab)をProjectビューへドラッグ&ドロップする時に表示されるポップアップ
![スクリーンショット 2022-01-09 8.34.22.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/617265/a10aa18a-9aa4-9fbb-1ccd-63e1ff62d108.png)
選択肢の"Original Prefab"も同様です。
Hierarchy上のbox(box prefab)をProjectビューへドラッグ&ドロップして"Original Prefab"を選択すると、Hierarchy上のbox(box prefab)はbox(Original Prefab)に切り替わります。

Hierarchy上のboxをbox prefabのままにしておきたい時は、改めてbox prefabで置き換える等の操作が必要になります。
#補足
Projectビュー上のPrefabを選択した状態でctrl+D(macならCommand+D)で複製することもできます。
RaspberryPi 4 Model B の消費電流の測定(平均値、最大値)

#1. はじめに
RasspberryPi 4 では、プロセッサの処理能力向上により、以前の RaspberryPi より消費電流が大きくなっています。
[公式 AC アダプタ](https://www.raspberrypi.com/products/type-c-power-supply) は、定格 5.1V 3A です。

実際どれくらいの数字なのか、消費電流を計ってみました。
動作中のピーク電流値も知りたいので、AC 対応の電流プローブで測定しています。


#2. 使用環境

1. Raspberry Pi 4 Model B (8GB) - Element14 版、2021/10 頃の購入品
2. Raspberry Pi OS (2021-05-07 Release 版)
3. Raspberry Pi Camera V2.1
4. HDMI 入力のディスプレイ、USBキーボード、USBマウス、USB3.0メモリ(16GB)、LAN(Gbハブに接続)
5. USB AC アダプタ (ダイソー 3.4A 出力、USB 2口タイプ)
6. USB 電源ケーブル1 (A オス - Type-C) 自作 0.5m2 (AWG 20 相当) 1m
7. USB 電源ケーブル2 (A オス - Type-C) ダイソー [USB-C 側 L 字タイプ 1m](https://jp.daisonet.com/products/4549131710175)
8. 電源(HP E3632A)
9. オシロスコープ(Agilent MSO6104)
10. 電流プローブ(Agilent 1147A)
11. 電子負荷(富士通 EUL-75JL)
12. テスタ


#3. ハードウェアの準備

RaspberryPi の CPU 熱対策のため、放熱板(14 x 14mm、高さ 8mm)を貼り付けておきます。

まず、
>E3632A 電源 - (電流プローブ) - 電子負荷

と接続して、0.1A, 1A, 3A, 5A でそれぞれ

・電源の表示電流値
・オシロの電流リードアウト値
・電子負荷の表示電流値

が、概ね一致することを確認します。
(各表示値のバラつきは、±10% 以内に収まります)

1147A 電流プローブはくたびれていて、ゼロ調整で 0mA まで調整することができません。
オフセットが -100mA 程度残りますので、オシロスコープのリードアウト値に +100mA した値が実際の値になります。

![1.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/955220/6871a339-3f77-9fee-49af-fdb4e3e84b0a.jpeg)



RasPi には、CPU に負荷をかけるため、stress コマンドをインストールしておきます。
>sudo apt-get install stress


#4. 負荷テストの内容

>stress -c 4 --vm 4 --vm-bytes 1024M

として、CPU を 4 つ回します。
これでデスクトップ右上の CPU 負荷表示がほぼ 100% に張り付きます。

裏で、
>raspivid -t 0 -w 1920 -h 1080 -fps 30 -p 0,0,320,180 -b 500000 -o ->null

として H.264 エンコーダを回します。
カメラ画面が、小さく左上に表示されます。

その状態で、標準でインストールされているゲーム "Soccer" をプレイします。


#5. 消費電流の測定
ダイソー AC アダプタと、自作 USB 電源ケーブル1 を使用します。
![6.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/955220/6099730b-1a69-ed02-f7e3-d525128bce45.jpeg)

![2.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/955220/3fd8f15b-d710-e63b-4ff5-fc076ff48253.jpeg)

負荷をかけた状態で、Soccer をしばらく遊んだ後、測定値は下記のようになりました。
室温22℃に対して、プロセッサ温度は74℃になっています。
ダイソー AC アダプタは、触っていられる温度で発熱しています(体感 45℃ 前後？)

![3.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/955220/32d0535f-a357-b5d9-7fc8-b30c83d863b0.png)


測定された消費電流値は、
![4.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/955220/21cd607e-aa93-0a9c-2377-22d99b1c9a9a.png)


最大 1.86A + 100mA = 1.96A
平均 960mA + 100mA = 1.06A

でした。


#6. 電圧降下について
ダイソー AC アダプタの出力端での測定電圧は 5.12V でした。

自作 USB 電源ケーブルで供給して、RasPi 側の GPIO の 5V 端子で計った電圧は 5.01V になっていました。
自作 USB 電源ケーブルでは 0.11V の電圧降下が起きていました。

ケーブルをダイソーの片側 L 字ケーブルに交換してみると、RasPi 側の電圧は 4.85V 前後になりました。
ダイソー USB ケーブルでは 0.27V の電圧降下が起きています。動作は問題無いようでした。
![5.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/955220/36add048-da73-dc12-7981-c749bef3418e.jpeg)

このケーブルは大電流対応していないので、電圧降下が大きいです。
とはいえ、L字で柔らかく、ナイロン外装で使い勝手が良いので、普段使いのお気に入りです。


#7. まとめ
Raspberry Pi 4 Model B (8GB) の通常動作範囲で、負荷 100% 動作時の +5V 電源消費電流は、平均 1A 前後、ピーク約 2A でした。

思っていたよりも、消費電流は少ないようです。
負荷率を考慮すると、連続 3A 出力の AC アダプタは妥当なところです。

ケーブルで電圧降下が起こりますので、できるだけ太い USB 電源ケーブルで接続するのが良いです。
(公式 AC アダプタは AWG18 なので 0.75m2 相当あり、今回使用した自作ケーブル 0.5m2 よりも太いです)

RaspberryPi に USB や GPIO で外部デバイスを接続する場合、その消費電流が追加されます。
利用状況に合わせて、電源への配慮が必要と思います。
【Project Euler】Problem 14: 最長のコラッツ数列

* 本記事は[ProjectEuler](https://projecteuler.net/about)の「100番以下の問題の説明は記載可能」という規定に基づいて回答のヒントが書かれていますので、自分である程度考えてみてから読まれることをお勧めします。

### 問題 14. 最長のコラッツ数列

原文 [Problem 14: Longest Collatz sequence](https://projecteuler.net/problem=14)

**問題の要約： $N<10^6$ で最長のコラッツ数列となる開始の数を求めよ**

昨年朝日新聞にも「[「コラッツ予想」証明できたら１億２０００万円](https://www.asahi.com/articles/DA3S15089454.html)」で紹介されたコラッツ数列の問題ですね。定義は[コラッツの問題(Wikipedia)](https://ja.wikipedia.org/wiki/%E3%82%B3%E3%83%A9%E3%83%83%E3%83%84%E3%81%AE%E5%95%8F%E9%A1%8C)に詳細があります。問題そのものは定義に沿って書けば簡単で、数列の長さを求める関数**collatzLen**は以下のようになります。

```python
import itertools
def collatzLen(n):
  for cnt in itertools.count(2):
    n = n // 2 if n % 2 == 0 else 3*n + 1
    if n == 1: break
  return cnt
```

```python
termmax = 0
N = 10**6
for n in range(2, N):
  term = collatzLen(n)
  if term > termmax: 
    startn, termmax = n, term
print(f"Answer : {termmax} at n={startn}")
```
これだけだと面白くないのでWikipediaにもあるグラフを**matplotlib**で書いてみました。x軸がnで、y軸が数列の長さです。1つだけ飛び出ているのが答えですね。プログラムは下にあります。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1922159/0be593d3-6480-5ede-a494-5c0c95b864f6.png)

```python
import matplotlib.pyplot as plt
N = 10**6
fig = plt.figure(figsize=(12,12))
ax = fig.add_subplot(1, 1, 1)
ax.set_xlim(0, N) 
ax.set_ylim(0, 600) 
ax.grid()

for n in range(1,N+1,2):
  cs = collatzLen(n)
  ax.plot(n, cs, marker='.',markersize= 3, color='b')
plt.show
```

（開発環境：Google Colab）
C言語でプログラムの開始時と終了時に何かを実行する方法

## 例

ctorsはconstructors、dtorsはdestructorsの略称です.
exitを呼ぶと、

1. `_fini` -> `do_dtors`
1. [_exit](https://linuxjm.osdn.jp/html/LDP_man-pages/man2/exit.2.html)
    * プロセスが消滅するので、`printf("never\n")`は実行されません.

等が実行されます.

`_fini`は`crt1.c:_start`で`atexit(_fini)`している.
atexitで登録された関数はプログラムの終了時に呼ばれます.

```c
#include <stdio.h>
#include <stdlib.h>

int count = 0;

void init1()
{
    count++;
    printf("ctors test. (init1)\n");
}

void init2()
{
    count++;
    count++;
    printf("ctors test. (init2)\n");
}

void fini1()
{
    printf("dtors test. (fini1)\n");
}

void fini2()
{
    printf("dtors test. (fini2)\n");
}

void fini3()
{
    printf("atexit test. (fini3)\n");
}

void (*fp1) (void) __attribute__((section(".ctors"))) = init1;
void (*fp2) (void) __attribute__((section(".ctors"))) = init2;
void (*fp3) (void) __attribute__((section(".dtors"))) = fini1;
void (*fp4) (void) __attribute__((section(".dtors"))) = fini2;

int main()
{
    atexit(fini3);
    printf("%d\n", count);
    exit (0);
    printf("never\n");
}
```


```sh
$ clang ctors.c
$ ./a.out
ctors test. (init2)
ctors test. (init1)
3
atexit test. (fini3)
dtors test. (fini1)
dtors test. (fini2)
```
java ソースコードを github に上げるまで

java のソースコードを github に上げるまでの手順です。
ここでは「args_parser」というプロジェクト名とします。

## 1. github でリポジトリを作成
[github](https://github.com/) でリポジトリを作成します。
![スクリーンショット 2022-01-09 10.18.32.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/248817/576314e6-39fc-af92-5b78-618b2d07f9a0.png)

ローカルに `clone` します。

```sh
$ git clone git@github.com:h-isota/args_parser.git
```

## 2. gradle で Java プログラムの雛形を生成

java ソースコードの雛形を作成します。

```sh
$ cd args_parser
$ gradle init --type java-application
```

「app」というフォルダ内にソースコードが作成されるので、app フォルダから出します。

```sh
$ mv -i app/build.gradle app/src/ ./
$ rmdir app/
$ rm settings.gradle
```

test が実行できることを確認します。

```sh
$ ./gradlew test
```

## 3. eclipse にインポート

build.gradle の「plugins」に、`id 'eclipse'`を追加します。

```Grooby:build.gradle
plugins {
    id 'application'
    id 'eclipse'
}
```

eclipse の設定ファイルを生成します。

```sh
$ ./gradlew eclipse
```

eclipse を起動し、プロジェクトをインポートします。
パッケージ名を右クリック→「構成」→「Gradleネーチャーを追加」をクリックします。
メニューから「実行」→「JUnitテスト」でテストができることを確認します。

## 4. github にコミット

コミットします。

```sh
$ git add .
$ git commit -m "Set up Gradle, JUnit and Eclipse"
$ git push
```

以上です。
 ( 結果: https://github.com/h-isota/args_parser )
OpenWRT vs ZRouter.org

OpenWRTを使えるようになったのでZRouter.orgとの比較をしてみます。

||OpenWRT|ZRouter|
|:--|:--|:--|
|System|Linux|FreeBSD 12|
|Build tool|make|make|
|Menu|Yes|Yes|
|.config|Yes|No|
|build speed|Slow|Fast|
|target|many|little|

OpenWRTはmenuconfigで.configを作って、これを元にmakeしますが、ZRouterはmenuで選択されたパラメータでmakeを実行してビルドします。ZRouterはFreeBSDのビルドシステムのラッパーなので、高速にビルドが可能です。

||OpenWRT|ZRouter|
|:--|:--|:--|
|needed pkg|many|little|
|local tools|many|little|

OpenWRTはいろいろpkgのインストールが必要ですが、ZRouterはFreeBSDの基本システムをビルドにはperlなどのいくつかのpkgしか必要としません。またOpenWRTは自前でhostのツールをかなりたくさんビルドしますが、ZRouterは圧縮ツールなど5つくらいのツールしかビルドしません。OpenWRTはローカルでホストツールをいろいろビルドしてますがすべてpkgすればビルドが高速にできるのではないでしょうか。

||OpenWRT|ZRouter|
|:--|:--|:--|
|binary|feeds|FreeBSD,portsもどき|
|profile|many|little|

OpenWRTのバイナリはfeedsを元に構成されます。ZRouterは基本システムはFreeBSDから選んだものだけです。他の追加のバイナリはportsをZRouterで改造したportsもどきでインストールされます。portsもどきはビルド依存を解決できないので、手動でpkgをインストールします。実行時依存(lib)も解決できないので、事前時にportsもどきとしてビルドが必要です。

OpenWRTはfeedsでいろいろなバイナリのビルドが提供されていますが、ZRouterはFreeBSDの基本システムとわずかなportsもどきしかありません。


||OpenWRT|ZRouter|
|:--|:--|:--|
|Ethernet Switch support|Yes|Yes|
|Command|swconfig|etherswitchcfg|

ZRouterはFreeBSD以外ではビルドできませんが、OpenWRTは頑張れば*BSDなどでもビルドできるかもしれませんが、現実的ではありません。
Qiita 記事のテンプレート

自身のメモ

## 章

### 節

#### 項

- 箇条書き

1. 番号付き
1. 全部 `1. 項目` で良い

## 画像の貼り方
画像をドラッグ＆ドロップ
![スクリーンショット 2022-01-09 8.53.42.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/248817/f43ced71-460f-0221-661d-0e6a36fa6806.png)

```md:コードブロック.md
<!-- #タイトル : Qiita では書かない -->

## 章

### 節

#### 項
```

> 記事の引用
PremiereProの個人用ショートカット

ちょいちょいショートカットキーの設定がぶっ飛ぶので、自分用のキーボードショートカットをメモしていく。左手で大体の作業ができるように、よく使う設定をメモしておく。

## S 編集点を追加

編集点をワンタッチで追加する。

## X 全てのトラックに編集点を追加

複数トラックを一気に処理している時はこっち。

## Q マーカーを追加

## W 次のマーカーへ移動

## A 次の編集点へ移動
django_restframework X vscodeでAPIドキュメントを自動作成する

# 目的
django_restframeworkでAPIを作成していたが、APIはバックエンドとフロントエンドのインターフェースであり、**フロント担当者が自分が作成したAPIをどのように扱えば良いのかすぐにわかるような状態にしなければそれはまともなAPIとは言えないのではないか。**

と思い、簡単なものにはなるが、下の画像のようなAPIのドキュメントを作ってみることにした。
![スクリーンショット 2021-12-26 午後0.58.02.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/487834/049e75cd-bfe1-c798-13b8-d21fe5a9913c.png)


# 概要
**DjangoRestframeworkにはAPIの定義書を(urls.pyから?)自動で作成してくれる素晴らしすぎる機能がある。**

このAPI定義書があることによって開発担当者以外のエンジニアもAPIを簡単に利用することができるようになるのでとても大事。

正直手順自体は本当にびっくりするくらい簡単だった。

手順としては
1. ```pip install PyYAML==5.3.* uritemplate==3.0.*```でPyYAML,uritemplateをインストール
2. ```python manage.py generateschema --file schema.yml```でOpenAPIスキーマファイルの自動生成を実行
3. VsCodeの拡張機能のSwagger Viewerをインストールする
4. Swagger Viewerで自動生成されたOpenAPIスキーマファイル(yaml)を確認する
というものだ。


# 方法
### PyYAML,uritemplateをインストール
#### PyYAML
YAML形式のデータを扱うためのライブラリ
#### uritemplate
URIを簡単に組み立てるためのライブラリ

```terminal
$ pip install PyYAML==5.3.* uritemplate==3.0.*
```

### OpenAPIスキーマファイルの自動生成を実行
スキーマをgenerateする。
ファイル名は自分で指定可能。

```terminal
python manage.py generateschema --file APIschema.yml
```

### Swagger Viewerをインストール
vscodeの拡張機能から検索。
![スクリーンショット 2021-12-26 午後0.55.21.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/487834/3bb7211b-cb08-b924-640e-25bf8d00bdf1.png)

### OpenAPIスキーマファイル(yaml)を確認
自動生成されたルートディレクトリにあるschema.ymlを選択した状態で、
```shift + command + p```(macの場合)で```Preview Swagger```を選択

このようなAPI定義書が表示される。
![スクリーンショット 2021-12-26 午後0.58.02.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/487834/049e75cd-bfe1-c798-13b8-d21fe5a9913c.png)


# 参考文献
[OpenAPI Document の自動生成](https://32imuf.com/django-rest-framework/generating-openapi-document/)
[Django REST Framework で API ドキュメンテーション機能を利用する方法（DRF 3.12 最新版）](https://akiyoko.hatenablog.jp/entry/2020/12/08/120230)
可変長引数

初めて可変長引数を使ったので メモ

### 関数定義

```cpp:
void CTest::Select( int iCount, ... )
{
}
```

`...` 部分が可変長引数になるけど、ここに何が入って 何個入るのかはわからない。
なので `iCount`のようにヒントが必要。


### 基本の使い方

```cpp:
void CTest::Select( int iCount, ... )
{
	va_list argList;
	va_start( argList, iCount );
	for( int i = 0; i < iCount; i++ ){
		CString strData = va_arg( argList, CString );
	}
	va_end( argList );
}
```
可変長引数の中身が必ず`CString`の場合の例です。
`iCount`で個数が指定されているので、for文で指定個数分取得しています。

### 中身の型を選択
```cpp:
void CTest::Select( int iMode, int iCount, ... )
{
	va_list argList;
	va_start( argList, iCount );
	CTestType* pTt = NULL;
	for( int i = 0; i < iCount; i++ ){
		if( iMode == 0 ){
			pTt = va_arg( argList, CTestType* );
			if( pTt == NULL )
				continue;
		}else if( iMode == 1 ){
			CString strData = va_arg( argList, CString );
		}
	}
	va_end( argList );
}
```
ヒントとして `iMode` を追加しました。
iModeが`0`の場合は`CTestType*`になります。
iModeが`1`の場合は`CString`になります。
その他は 同じです。

### 2周

```cpp:
void CTest::Select( int iCount, ... )
{
	va_list argList;
	va_start( argList, iCount );
	for( int i = 0; i < iCount; i++ ){
		CString strData = va_arg( argList, CString );
	}
	va_end( argList );

	va_start( argList, iCount );
	for( int i = 0; i < iCount; i++ ){
		CString strData = va_arg( argList, CString );
	}
	va_end( argList );
}
```
1周終わって再度取得する場合 再度`va_start`～`va_end`すれば、取れました。
数式の練習④二次ハイパス・フィルタ

　数式の練習です。

　伝達関数は、二次ローパス・フィルタの分子を$s^2$に変更すると、二次ハイパス・フィルタになります。

#二次ハイパス・フィルタ
|　　　　　　   　　　 二次ハイパス・フィルタ　回路図　　   　　　　　 |
|:------------:|
|<img width="300" alt="ファイル名" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/407635/e06dead2-4c80-a7e4-5ed9-4f12d3121e4b.png">|
|　　**伝達関数**　　　|
|　　　　　$T(s)=\LARGE \frac{s^2}{ω_0^2 + 2sζω_0 + s^2}$　　　　|
|　$(  s はラプラス変数。  jω はsとする。 ω_0は角周波数(角振動数?)。 $  $ζは減衰係数。Q はフィルタのクオリティ・ファクタ。ζ = \frac{2}{Q}) $|
|　　　　　**TeXの記述**　　　|
|　　　　　``$T(s)=\LARGE \frac{s^2}{ω_0^2 + 2sζω_0 + s^2}$``　　　　|


　Qの取る値によって、フィルタの特性は大きく変わるのは、二次ローパス・フィルタと同じです。
　matlabとLTspcieでも、$Q$（$ζ$）を2通りに変化させています。


###matlab

```matlab
time_constant = 0.16;  % 時定数
natural_freq = 1 / time_constant;  % 固有角振動数 ωn
damping_ratio = 1.0  % ζ（ゼータ）減衰係数（ダンピング比）。１＞；実数解、1；実数解、・・・1/√2；複素数解、1/√2＜；複素数解、ピークあり
G = tf([1, 0, 0 ], [1, 2 * damping_ratio * natural_freq, natural_freq^2])

h = bodeplot(G);
p = getoptions(h);
p.FreqUnits = 'Hz';
setoptions(h,p);
grid on

hold on
damping_ratio = 0.15 % ζ（ゼータ）減衰係数。１＞；実数解、1；実数解、・・・1/√2；複素数解、1/√2＜；複素数解、ピークあり
G2 = tf([1, 0, 0], [1, 2 * damping_ratio * natural_freq, natural_freq^2])

h = bodeplot(G2);
p = getoptions(h);
p.FreqUnits = 'Hz';
setoptions(h,p);

hold off
nyquistplot(G);
hold on
nyquistplot(G2);
grid on
```
　実行例です。

![2022-01-08 (3).png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/407635/f8a32da7-7934-04ae-8ce0-f7b18f0403de.png)




###LTspice

![2022-01-08 (4).png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/407635/3838d5c0-ad86-3d14-229d-c5289ec8fce7.png)











####環境
matlab　R2021b update1（ホームライセンス）、tr関数はControl System Toolboxが必要。ラプラス関数のSymbolic Math Toolboxはホームライセンスでは購入できない。
【Rails】paramsについて

##paramsとは？
→データの入れ物

##どんなデータが入ってるのか？
基本的には以下の2種類の方法で収集されたデータが入ってる。
・投稿フォームなどからPOSTで送信されたデータ
・getのクエリパラメータ

>【クエリパラメータとは？】
例えば、基本のURLが「https:// ○△×□.jp/」だとして、基本のURLにクエリ文字列（URLパラメーター）を加えると「https:// ○△×□.jp/?●=▲×■&○=△×□」となります。
「?●=▲×■&○=△×□」の部分が、クエリパラメーター（URLパラメーター）です。
引用：https://online.dhw.co.jp/kuritama/query-string/
Githubにある自作のnpmモジュールをnpm installしてENOENTなエラーが出た時

# はじまり

自分で作ったnpmモジュールをubuntu環境へinstallしようとしたときに以下のエラーが出ました。

```bash:log
root@ca04e13630cb:/usr/app# npm install git+https://github.com/Landmaster135/FeedFetcher.git
npm ERR! code ENOENT
npm ERR! syscall spawn git
npm ERR! path git
npm ERR! errno -2
npm ERR! enoent An unknown git error occurred
npm ERR! enoent This is related to npm not being able to find a file.
npm ERR! enoent

npm ERR! A complete log of this run can be found in:
npm ERR!     /root/.npm/_logs/2022-01-08T17_49_46_172Z-debug-0.log
```

# 原因と解消法

僕の場合、gitがubuntu環境に入っていないことが原因だった。

```bash:console
apt install git-all -y
```

gitを入れた後は、以下の何れのコマンドでも`npm install`できた。権限とかpackage.jsonの問題ではなかった。

```bash:console
npm install git+https://github.com/<user name>/<repo name>.git
```

```bash:console
npm install git+ssh://git@github.com/<user name>/<repo name>.git
```

```bash:console
npm install git+ssh://github.com/<user name>/<repo name>.git
```

```bash:console
npm install https://github.com/<user name>/<repo name>
```

# おしまい
`An unknown git error occurred`とは、なんてスパルタな・・・。
[Swift]シングルトンを実装してみよう


##シングルトンとは
シングルトンパターンとはインスタンスが１個しか生成されないことを保証するものです。

##ではどんな時に使うのか
実際に使う目的としてはインスタンスが1個しか生成されないことを保証したいときに使うのですが、ではどのような時に1個しかインスタンスを生成するべきなのでしょうか？
目的はいくつかあって、、

・情報(値)を共通化したいのに使用するクラスで都度、インスタンスを生成するのが手間
→メモリを節約したい
・たくさんのインスタンスからアクセスされると困る時

などと書きましたが、ざっとまとめると、
インスタンスを一回一回生成する処理を書いていたらコードも冗長だし、値も都度リセットされてしまうから同じ値をいろんなところで使うには適してないよねっていう時に使うという認識で間違いないと思います。

##実際に実装してみよう

```swift
public class Hoge {
    init() {} 
    private var hoge: [String: Any] = ["name": "Luffy", "age": 19] 
}
```
こちらのクラスにシングルトンを実装していきましょう。

###①継承されないためのfinal
シングルトンは継承されてしまっては効果を発揮しません。
そのため、継承を防ぐためのfinalをクラスにつけてあげる必要があります。
（継承されていないのを明示するためにも）

```swift
final public class Hoge {

}
```

###②初期化(init)をprivate化
シングルトンであるためには使用する時に直接インスタンス化をさせないようにするためにinitをprivate化してあげます。

```swift
final public class Hoge {
   private init() {}
}
```

##③sharedというプロパティを実装

外部からのアクセスはこのsharedというプロパティを介して行うことにするために
public static let shared = Hoge()
と書きHogeクラスのインスタンスを割り当てます。

```swift
final public class Hoge {

　　　　　　public static let shared = Hoge()

   private init() {}
}
```
staticはインスタンスを共通化できます。
staticの特徴として、複数のスレッドが一度にstaticプロパティにアクセスした時インスタンスが複数回生成されることを防ぐことができます。
ここまでがシングルトンの真髄になります。

##④実際にメソッドを実装する
シングルトンパターンのクラスに実際にメソッドを加えてみましょう。

```swift
final public class Hoge {

   public static let shared = Hoge()

   private init() {}

   public func keyString(forkey key: String) -> String? {
    return hoge[key] as? String
   }
}
```
先程のHogeクラスのhogeに格納されている値にアクセスするメソッドです。

##⑤シングルトンを使ってアクセスする
先程定義したsharedを窓口にしてメソッドにアクセスしてみます。

```Swift
print(Hoge.shared.keyString(forkey: "name"))   // Optional("Luffy")
print(Hoge.shared.keyString(forkey: "age"))   // Optional(19)
```



##参考記事
本記事はこちらの記事を自分なりにまとめたものです。
分かりやすい記事をありがとうございました！
https://ticklecode.com/swiftsingleton/
【C言語】paizaでSランクをとるまで

#はじめに
結論から言うとpaizaでSランクをとることは難しいことではありません。
なぜならC言語が苦手な私でも取ることができたからです。
![スクリーンショット 2022-01-09 025434.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2414749/302e7605-3f81-9dc7-d65b-13d4a7ffc6f4.png)
なので**やる気**さえあれば、Sランクはとることはできます。

しかし、やる気があってもやり方を間違えれば遠回りしてしまうこともあります。
なので今回は私が実際にやっていたことを紹介したいと思います。
<br>
注）必ずしもこのやり方が正しいわけではありませんので参考程度に見ていただけると幸いです。
#目次

- 分からなかったら調べる

- [paiza.io](https://paiza.io/ja/projects/new)を使ってみる

- レートを気にせずにやってみる

- 回数をこなす

- まとめ

#分からなかったら調べる
これはやっている人が多いと思います。
しかし中には、
>- どうやって調べたらいいかわからない
- 何がわからないかわからない

と思っている人もいると思います。

自分の分からないないところが分かっているなら単純に
**”C言語　switch”** や　**”C言語　ポインタ　使い方”** といったように **”C言語　~　”**　と調べれば大体出てきます。

分からないところが分かっていない場合はまずじっくり考えて自分のやりたいことを簡単な日本語に直して検索をします。

例えば、**if** が分からない場合は　**”C言語　条件分岐"** といったように検索することができます。

調べてただコードを書くのではなく、次回使うときに覚えていられるようにしましょう。
#paiza.ioを使ってみる
今回１番知ってもらいたいのが[paiza.io](https://paiza.io/ja/projects/new)です。
もちろん問題にもよりますがSランクの問題がAランクの問題と違う点はどれだけ**簡潔に効率の良いコードを書けるか**です。
初めてSランクの問題をやってみて起こったのは処理時間の超過です。ループをさせすぎたり無駄な条件分岐を書いたりすると処理時間が伸びてしまいます。
そしてもう一つよくあるのが、”サンプルケースが通るのにテストケースが通らない”　ということです。
それは[paiza.io](https://paiza.io/ja/projects/new)を使うことで何が違うか見つけることができます。

よくある間違いとして多いのが境界値でのテストケースエラーです。
こういうのは条件式を考え直せばすくに直せるせるものです。
しかし、処理時間エラーは簡単には直すことはできません。そのプログラムの大部分を変更しなければいけないこともあったりするので早いうちにどこが違うのかわかるようにするため使うのをおすすめします。
#レートを気にせずやってみる
paizaにはpaizaレーティングという自分の実力のようなものを表すものがあります。
![スクリーンショット 2022-01-08 211332.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2414749/6d5004de-1ecf-b914-d70b-2a434245ca0d.png)
最初のほうはDランクやCランクをやっていてもレートはどんどん上がっていきます。
しかしだんだんと上がりづらくなっていき、Bランク以上をやらないと上がらなくなっていきます。
もちろんSランクともなればかなり上がります。

「じゃあBランクやればいいじゃん！」

と思いますが、１００点でクリアしなければレートが下がっていまいます。そのせいで私も最初のころはBランク以上に手を付けれずにいました。
しかしそれでは実力なんかまったくついてこないことを知りBランク、Aランク、そしてSランクに挑戦するようにしました。
それからは自分でもわかるくらいに成長を感じるようになりました。
なので、まだBランク以上をやったことのない人はすぐにでもBランク以上に挑戦したほうがいいと思います。
#回数をこなす
結局これが１番大事なことで、回数をこなすことで分からなかったことも覚えていきます。
ただただ回数をこなすよりも、これまでに紹介したことを意識しながらやることで成長速度は格段に上がると思います。
そうすることで問題文も見るとどんなコードを書けばいいのかが大体わかるようになります。
#まとめ
今回初めて記事を書かせていただきました。
あくまでも私はこのやり方で勉強をしてだけですので自分に合った勉強方法が１番大事だと思います。
文ばかりで読みにくかったり見づらかったりしたとは思いますが、少しでも参考になれたらうれしいです。

最後まで読んでいただき、ありがとうございました。
ターミナルから現在のディレクトリでvscodeを開く方法

今回は、ターミナルから現在のディレクトリでvscodeを開く方法について書きます。

他の記事を参考に、以下のように進めました。

1.　vscodeをアプリケーションから起動
2. shift + command + P　とショートカットキー 
3. そこから、shellと入力するとコマンドパレッドで(Shell Command: Install code command in PATH)の表示があると思うのでそれを選択してインストールしてください。
4. 完了すれば、「シェルコマンド'code'がPATHに正常にインストールされました。」メッセージが表示されます。


本来であれば上記の手順を踏むことで、ターミナル上で、、

```
$ code .
```

と入力すればターミナルから現在のディレクトリでvscodeを開くことができるのですが、私はエラーが出て開くことができませんでした。

エラー文としては以下のように表示されました。


```
.pyenv/shims/python: line 21: /usr/local/Cellar/pyenv/1.2.16/libexec/pyenv: No such file or directory
```

調べてみるとpyenvのバージョンが変わったことにより、今まであった場所にファイルがなくなったことが原因らしいです。

そこで、以下のコマンドを実行するエラーが解消されました。

```
$ pyenv rehash
```

でもなんで、pythonが絡んでくるのか、、、
backoff: リトライをギブアップしたときに出力されるログメッセージのレベルを変える

# 環境
* Python 3.9.7
* backoff 1.11.1


# はじめに
[backoff](https://github.com/litl/backoff)モジュールを使って、webapiへのアクセスのリトライ処理を実装しています。

```python:bar.py
import backoff
import requests
import logging

@backoff.on_exception(
    wait_gen=backoff.expo, exception=requests.exceptions.RequestException, max_tries=3
)
def get_url(url):
    res = requests.get(url)
    res.raise_for_status()
    return res


def main():
    logging.basicConfig()
    get_url("https://httpbin.org/status/500")


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


```
$ python bar.py
INFO:backoff:Backing off get_url(...) for 0.3s (requests.exceptions.HTTPError: 500 Server Error: INTERNAL SERVER ERROR for url: https://httpbin.org/status/500)
INFO:backoff:Backing off get_url(...) for 0.6s (requests.exceptions.HTTPError: 500 Server Error: INTERNAL SERVER ERROR for url: https://httpbin.org/status/500)
ERROR:backoff:Giving up get_url(...) after 3 tries (requests.exceptions.HTTPError: 500 Server Error: INTERNAL SERVER ERROR for url: https://httpbin.org/status/500)
```

リトライしたとき（backing off）はINFOレベル、リトライをギブアップしたとき（giving up）はERRORレベルのログが出力されます。



# リトライをギブアップしたときのログレベルを変える
リトライをギブアップしたときのログレベルがERRORなのは、ツールによってはログレベルが高すぎる場合があります。
そのようなときは、`on_exception`関数の`giveup_log_level`引数に、適切なログレベルを指定しましょう。



```python
@backoff.on_exception(
    wait_gen=backoff.expo,
    exception=requests.exceptions.RequestException,
    max_tries=3,
    giveup_log_level=logging.INFO,
)
```

なお、リトライしたときのログレベルは`backoff_log_level`で指定できます。

`giveup_log_level`, `backoff_log_level`に関する説明は、backoffのREADMEには書かれていなかったので、Qiitaに投稿することにしました。
各引数の説明は、ソースコードのコメントを参照してください。
https://github.com/litl/backoff/blob/c2f4e1826b1996348177215f4c009c055777603f/backoff/_decorator.py#L77
TiDB の期刊 - 一

# 前言

この記事は[`TiDB`](https://github.com/pingcap/tidb)に関わる開発のニュースであり、創刊期ので、このシリーズの説明はここにします：

* 私は PingCAP で働いてのに、これは個人の理解だけ、オフィシャルの記事ではない。
* この記事はデータベースの技術の勉強材料で、ユーザーマニュアルではありません。
* 個人はまだ日本語を勉強中ので、完全な正しい説明をよくできない。質問や誤りやなんでもコメントを遠慮なくてお願いします。
* `TiDB` は PingCAP から開発したオープンソースのデータベース、しかし PingCAP 以外の人間がその開発および実現の細分を理解は難しい。この現象の理由は複数があって、ここでは説明しません。このシリーズの目的は本気のオープンソースを目指します。
* 更新は不定期、そしてあまり詳しないです（興味があったら、リンクを開いてください）。
* できるだけ私の知識の範囲で、開発中の特性およびそのメカニズムを説明つもりです。

# TiDB

## Top-SQL([#24875](https://github.com/pingcap/tidb/issues/24875))

SQL を実行のは遅い時、通常にデータベースは問題が出る、問題を解決ために、様々の情報が欲しい。Top-SQL はデータベースに最も遅い SQL のディテール情報を集まって、問題の解決をやすくなる。

## Paging Coprocessor([#30578](https://github.com/pingcap/tidb/issues/30578))


これは私が作った機能で、特別に説明しております


データベースの中に、一つのユーザーケースがある、インデックスでデータを読むこと。グローバルインデックスのデータベースでは、データを読んでために、通常に二つの読むことが必要です。インデックスを読んで、その結果によってデータを読みます。そのプロセスはシリアライズで、レイテンシがでる、もし Pipeline および Streaming でプロセス、並行することができる。Paging Coprocessor は大きなインデックス読む結果が分かれて、複数の返信で、Streaming とにっている効果が作る。

## [Lock View](https://github.com/pingcap/tidb/blob/master/docs/design/2021-04-26-lock-view.md)

トランザクションの間に競合ができたら、レイテンシがでる。その場合には、競合の様子を見ませんか。Lock View によって、今実行中のトランザクションがどのロックをブロックさせることを見ることができる。今は、現在実行中のトランザクションしかみえませんが、その歴史の競合を見ることはまだ計画中。

## Avoid Data Inconsistency([#26833](https://github.com/pingcap/tidb/issues/26833))

データの一貫性は正确の基本的な保証で、それを確保することは必要です。しかし今、データが一貫しない場合は、データを読むまでエラーが出ってこない。すなわち、エラーが出る時、そのエラーが作った時は昔の可能性がある。その機能はデータを書き込む時、一貫性をチェックして、一貫しない時、違うデータを書いて防ぐことができる。

# TiKV

## [Raft Engine](https://github.com/tikv/raft-engine)

Raft Engine は TiKV の Multi-Raft 専用のストレージエンジン。かつて、二つの RocksDB があって、データを書き込むのは二つのステップが必要です。先ずは、Raft の RocksDB に書き込んで、その後で全部のデータの RocksDB（KV RocksDB）に書き込む。Raft にとって、RocksDB は複雑すぎて、問題がある。例えば、WAL が一つの I/O depth しか利用できなくて、Write Stall が頻繁に出るから、Raft Engine は Raft にとって、もっと適合なエンジンです。

## [Dynamic Size Region](https://github.com/tikv/rfcs/blob/master/text/0082-dynamic-size-region.md)

データを Raft アルゴリズムで処理で、並行することができない。そのために、Multi-Raft が作るが必要です。しかし、Raft Group の数量が多いすぎる時、ハートビートは性能をインパクトする。そこは矛盾の点があって、Region は大きい時、同じ Region で並行するコマンドは渋滞します。Region は小さい時、ハートビートは厄介です。この Dynamic Size Region のデザインで違う Region が違うサイズが出る、コマンドが多い Region は小さいので、コマンドが少ない Region は大きいです。

## [In-memory Pessimistic Locks](https://github.com/tikv/rfcs/pull/77)

Pessimistic Lock は悲観的なロックで、楽観的なロックの向こうです。トランザクションの競合が高い時、楽観的なトランザクショは失敗するのは多いです。それに対して、悲観的なトランザクショは悲観的なロックを作って、悲観的なロックはトランザクションをコミット前さえ他のトランザクションをブロックすろことができて、失敗の可能性が減らす。しかし今では、RocksDB の Lock Column Family で悲観的なロックを書き込むことが必要です。In-memory Pessimistic Locks で悲観的なロックが RocksDB で入らなくてもいいのいで、悲観的なトランザクションの性能は大幅に上がります。
【Rails, Active Storage】 　画像が割れて表示されてしまった件


## 実行内容


Active Storageを使ってアップロード済のユーザーアイコン画像を、
以下のコードにより表示させようとした。

```erb
<% if @user.avatar.attached? %>
  <%= image_tag @user.avatar, size: "100x100" %>
<% end %>
```
## 問題点
以下のように割れた画像が表示された。
![スクリーンショット 2022-01-09 1.33.04.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2449886/08a548e6-dae1-1190-a0bc-b51a0cf84190.png)

## 解決策
以下のようにコードを修正し、うまく表示された。

```erb
<% if @user.avatar.attached? %>
  <%= image_tag url_for(rails_blob_path(@user.avatar)), size: "100x100" %>
<% end %>
```
[Ruby] Stringクラスのindexメソッド

学習したことのアウトプットとして

# indexメソッド
Rubyの組み込みライブラリ
**index(pattern, pos = 0)  ->  Integer | nil**
文字列のインデックス pos から右に向かって pattern を検索し、最初に見つかった部分文字列の左端のインデックスを返す。
見つからなければ nil を返す。

- 引数 **pattern** は探索する文字列または正規表現で指定
- 引数 **pos** が負の場合、文字列の末尾から数えた位置から探索する、0の場合省略可

例）

```ruby
 "astrochemistry".index("str")         # => 1
 "regexpindex".index(/e.*x/, 2)        # => 3
 "character".index(?c)                 # => 0

 "foobarfoobar".index("bar", 6)        # => 9
 "foobarfoobar".index("bar", -6)       # => 9
```


※補足等があればコメントいただけると幸いです
MongoDBのfindで配列フィールドの登録数を不等号条件でfilterしたい

## 概要
MongoDBではフィールドに配列の型を持てますが、その登録数をfindで条件にしたい時もあるかなと思います。
特定の数（例えば配列の中に1個登録）を条件にしたい場合は、[$size](https://docs.mongodb.com/manual/reference/operator/query/size/)のオペレーターを使用すれば大丈夫ですが、1個以上とか不等号を使いたくなる場合もありますよね。ただ、`$size`は数値型しか設定できないので、例えば`array_field : { $size: { $gt : 1 }`のような指定は不可となります。
では、このように不等号を使いたい場合は、どのように対応すれば良いのかというのをメモ書きします。

## 対応方法
[Is there a way to query array fields with size greater than some specified value?](https://www.mongodb.com/community/forums/t/is-there-a-way-to-query-array-fields-with-size-greater-than-some-specified-value/54597)にいくつか対応方法が挙げられてます。一番短く書けそうなのが`{ “countries.1” : { “$exists” : true } }`のような感じで、配列のフィールドに条件を指定したい項番を指定して`$exists`を指定します。


## 実装サンプル
Golangで実装した場合のサンプルを、以下に記します。以下のサンプルでは、`array_fileld`の配列に一つ以上の項目が登録されているドキュメントを取得します。

```go:sample.go
// コレクション取得までの接続処理は割愛・・
// filter条件の設定
filter := bson.D{{Key: "array_fileld.0", Value: bson.D{
  {Key: "$exists", Value: true}},
}}
// クエリ発行
cur, err := col.Find(context.Background(), filter)
// カーソルからの取得処理は割愛・・
```
flutter_native_splash使ってみた


## 要約
- Splashとは？
- flutter_native_splashを使ってみる
- Android実装時の注意点
    - OS 12の注意点
    - Flutter2.5以上ではAndroidManifestの`meta date`を消す
- 感想
- 参考記事

## Splashとは？
アプリを立ち上げるときに一瞬表示される画面のことです。
<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/320838/8264139c-e7bb-4cc4-9546-b2c754273f06.gif" width="300">

## flutter_native_splashを使ってみる
`pubspec.yaml`にライブラリと`flutter_native_splash`の設定を追加する

```pubspec.yaml
dependencies:
  flutter_native_splash: ^1.3.3

flutter_native_splash:
  color: "#FFFFFF"
  image: images/hogehoge.png
  android: true
  ios: true

// ローカルに保存されている画像を呼び出せるよにする
assets:
    - images/
```

### Android実装時の注意点
#### OS 12の注意点
AndroidOS12ではデフォルトで`Splash`が実装されてます。
デフォルトのSplashを削除することはできないため、

#### Android実装時の注意点
Flutter2.5からは`io.flutter.embedding.android.SplashScreenDrawable`は不要なため削除すると以下のLogは表示されなくなります。

`A splash screen was provided to Flutter, but this is deprecated. See flutter.dev/go/android-splash-migration for migration steps.`

```AndroidManifest.xml
<meta-data
  android:name="io.flutter.embedding.android.SplashScreenDrawable"
  android:resource="@drawable/launch_background"
/>
```

## 感想
とても簡単に画面を作らずにSplashを表示できる。
しかし、SplashにAccessTokenの処理を書きたい、Splashの表示時間を長くしたいなど、場合によってはこのライブラリを使わない可能性もある。

## 参考記事
https://pub.dev/packages/flutter_native_splash

https://qiita.com/stmon19/items/fcfde6af4b706b8c566b
[Ruby] Integerクラスのeven?メソッド

学習したことのアウトプット

# even?メソッド
Rubyの組み込みライブラリ
自身が偶数であれば真を返し、そうでない場合は偽を返す。

例）

```ruby
10.even?    # => true
5.even?     # => false
```

※補足等ある場合はコメントしていただけると幸いです。
クラスとインスタンスの違いを簡潔にまとめる

# はじめに
どんどんアップデートしていく記事にしていこうと思っています。

# 結論
```
クラス全体で共通した振る舞いを示す
クラスから生成されたインスタンスの振る舞いを示す
属性と属性値の関係
属性はみんなが共通で持っている項目で属性値は個別で異なる
【React】イベントハンドラプロパティ一覧【JavaScript】

## はじめに
　本記事は、プログラミング初学者が、学習を進めていて疑問に思った点について調べた結果を備忘録も兼ねてまとめたものです。
　そのため、記事の内容に誤りが含まれている可能性があります。ご容赦ください。
　間違いを見つけた方は、お手数ですが、ご指摘いただけますと幸いです。

## 公式ドキュメント
イベントハンドラの一覧は公式ドキュメントにあります。こちらをご覧ください。

https://react.dev/reference/react-dom/components/common



### ~~イベント属性一覧~~
~~Reactで、イベント処理はタグ内に`onClick`などのイベントハンドラ用の属性を指定することで定義できます。~~
~~Reactでのイベント処理の記述には以下の特徴があります。~~

- ~~イベントは小文字ではなく camelCase で名付けられる~~
- ~~イベントハンドラとして文字列ではなく関数を渡す~~

~~イベント処理を記述する際のイベント属性について以下にまとめます。~~

```.js:イベント属性一覧
// クリック関連
 onClick	     // 要素やリンクをクリックした時に発生
 onDblClick      // 要素をダブルクリックした時に発生
 onMouseDown     // マウスでクリックした時に発生
 onMouseUp       // クリックしたマウスを上げた時に発生


// フォーム関連
 onSubmit        // フォームを送信しようとした時に発生
 onReset	     // フォームがリセットされた時に発生
 onBlur	         // ページやフォーム要素からフォーカスが外れた時に発生
 onFocus	     // ページやフォーム要素にフォーカスが当たった時に発生
 onChange        // フォーム要素の選択、入力内容が変更された時に発生

// テキスト関連
 onSelect        // テキストが選択された時に発生

// キー関連
 onKeyUp         // 押していたキーをあげた時に発生
 onKeyDown       // キーを押した時に発生
 onKeyPress      // キーを押してる時に発生

// 画像読み込み関連
 onAbort	    // 画像の読み込みを中断した時に発生
 onError	    // 画像の読み込み中にエラーが発生した時に発生
 onLoad	        // ページや画像の読み込みが完了した時に発生

// ウィンドウ関連
 onUnload        // ウィンドウを閉じた時、他のページに切り替えた時、ページをリロード（更新）した時に発生

// マウス関連
 onMouseOut      // マウスが離れた時に発生
 onMouseOver     // マウスが乗った時に発生
 onMouseMove     // マウスを動かしている時に発生

```
CLion起動後の画面の切り替え

# CLion起動後に前回開いてたプロジェクトが開いてしまう

自動的にプロジェクトが開いてしまい、新しいプロジェクトとか違うプロジェクトを開きたい時にひと手間かかってしまうけど、どこで変更できるんだろう....

## この設定変えるだけだった

`Settings > Appearance & Behavior > System Settings`
の
`Project`タブの**Reopen projects on startup**のチェックボックスを外せばヨシ
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1563715/ee00cd13-efa0-a734-8ac1-6c4e6c762c36.png)

以上。備忘録でした。
Golangに入門してみた

# Golangに入門してみた

最近、転職活動をしているときにgRPCについての話があり、あまり詳しく知らなかったのでハンズオンしたいな、と思いどうせならgRPCの醍醐味である別言語間での通信を実現してみたいなと思い、現在使えるJavaScript, Python, Rubyに加え、流行のGolangを用いてAPI作ってみたいなと思い、Glangのtutorialをやってみました。

そこで、とりあえずGolangのfor文 + if文を使って平方根を求めるエクササイズがあったので、それをググりながら書いてみた。そこまで難しくないし、ヒントも出されているので、5分くらいで終わったのですが、その回答を載せます。答えは見てないので、非効率なプログラム書いているかもしれませんが、まぁいいでしょう。

## エクササイズ内容

こちらのページのエクササイズを行いました。
https://go-tour-jp.appspot.com/flowcontrol/8

![](https://storage.googleapis.com/zenn-user-upload/99d4cb256a76-20211228.png)

## 回答内容

```Go
package main
import (
	"fmt";
	"math"
)

func Sqrt(x float64) float64 {
	z := float64(1) // 初期値
	for i := 0; i < 100; i++ {
		prev_z := z
		z -= (z*z - x) / (2*z)
		
		if math.Abs(prev_z - z) < 0.0000001 {
			return z
		}
	} 
	return z
}

func main() {
	fmt.Println(Sqrt(2))
	fmt.Println(math.Sqrt(2))
}

出力：----------------------
1.4142135623730951
1.4142135623730951
```

math.Sqrt(2)と同様の答えになったので、良いでしょう。
>次に値が変化しなくなった (もしくはごくわずかな変化しかしなくなった) 場合にループを停止させます。 

この部分をどう再現するかがもっと別の書き方あるような気がしますが、もし他に「この書き方がいいよ！」というのがあれば教えてください。


## 感想

Golang初めて触ってみましたが、型指定とかあっていいですね。
Pythonは型指定ないので機械学習の実装しているときに、この変数のデータには何が入っているのだろう？と思うことがあるのでGlangで機械学習実装できたら嬉しいですね。

Pythonでも型指定みたいなことできるので、型が間違っていればエラーを出すようにすればいいのでしょうけども。

あと、３,4章くらいtutorialがあるので、それもやってしまおうと思います。
iOS  APIでは RSA/ECB/OAEPwithSHA-256andMGF1Padding の暗号化・復号ができない

iOS の標準APIでは、Java の RSA-OAEP の "RSA/ECB/OAEPwithSHA-256andMGF1Padding" の暗号化・復号ができません。SHA-512も同様。

## iOS API と Java の OAEP の違い

[OAEP](https://ja.wikipedia.org/wiki/Optimal_Asymmetric_Encryption_Padding) は RSA で使われる平文パディングの手法で、アルゴリズムとしては2つのダイジェスト(ハッシュ)アルゴリズムを使います。

* メッセージダイジェスト
* MGF(Mask Generation Function) ダイジェスト

iOS の標準API と Java API では OAEP の仕様が微妙に違います。

* Java の RSA/ECB/OAEPwithSHA-256andMGF1Padding: メッセージダイジェスト=SHA-256, MGF1ダイジェスト=**SHA-1**
* iOS の SecurityAlgorithm.rsaEncryptionOAEPSHA256: メッセージダイジェスト=SHA-256, MGF1ダイジェスト=**SHA-256**

メッセージダイジェストは同じなのですが、MGF1ダイジェストが違うため、互換性がありません。
MGF1ダイジェストのほうは普通 SHA-1 で十分なはずなのですが、iOS ではなぜかメッセージダイジェストに合わせて変わってしまう様子。

このため、iOS 標準API では、Java の　"RSA/ECB/OAEPwithSHA-256andMGF1Padding"　に対応することは不可能です。

## 対策1) Java 側を iOS に合わせる

Java 側を iOS の仕様に合わせる方法です。

Java 側では、メインダイジェストと MGF1 ダイジェストを個別に指定することができるので、容易に iOS 側に合わせることができます。

```Java
Cipher cipher = Cipher.getInstance("RSA/ECB/OAEPPadding");
cipher.init(Cipher.DECRYPT_MODE, privKey, 
    new OAEPParameterSpec("SHA-256", "MGF1", MGF1ParameterSpec.SHA256, PSource.PSpecified.DEFAULT));
```

## 対策2) 自前で OAEP を実装する

iOS 側で自前で OAEP を実装する方法です。こちらはちょっと面倒。

iOS 側では、OAEP Padding のみを実装し、あとは rsaEncryptionRaw で RSA 暗号化・復号を実行する、ということで MGF1 ダイジェストをあわせることができます。
OAEP の実装自体はそれほど難しくありません。OAEP を実装したものを [RsaOaepPadding.swift](https://github.com/tmurakam/rsa-oaep/blob/master/iosRsa/iosRsa/RsaOaepPadding.swift) として公開しています。

これを使うと、RSA/ECB/OAEPwithSHA-256andMGF1Padding 相当の暗号化は以下のように実装できます。

```Swift
let plainData = "TEST TEXT".data(using: .utf8)!

// main digest SHA256, MGF1 digest SHA1 で RsaOAEPPadding クラスを生成
let padding = RsaOAEPPadding(mainDigest: OAEPDigest.SHA256, mgf1Digest: OAEPDigest.SHA1)

// OAEP Padding を計算 (RSA鍵長は 2048bit = 256byte前提)
let padded = try! padding.pad(plain: plainData, blockSize: 256);

// raw で暗号化
guard let cipherData = SecKeyCreateEncryptedData(publicKey, SecKeyAlgorithm.rsaEncryptionRaw, padded as CFData, &error) else {
    // Error処理
}
```

復号は以下のようになります。

```Swift
guard let decryptedBlock = SecKeyCreateDecryptedData(privKey, SecKeyAlgorithm.rsaEncryptionRaw, cipherData as CFData, &error) else {
    // Error 処理
}

// OAEP Padding 解除
let decrypted = try! padding.unpad(padded: decryptedBlock as Data)

let decryptedString = String(data: decrypted, encoding: .utf8)!
```

## 検証用テストプログラム

検証用のプログラムおよびライブラリを　https://github.com/tmurakam/rsa-oaep においておきます。

## Apple に言いたいこと

[SecKeyAlgorithm](https://developer.apple.com/documentation/security/seckeyalgorithm) の説明、不足しすぎじゃね？

## 参考文献・サイトなど

* [OAEP](https://ja.wikipedia.org/wiki/Optimal_Asymmetric_Encryption_Padding) (Wikipedia)
* [RSAのパディング：PKCS#1 v1.5, OAEP, PSSを整理してみた](https://qiita.com/kj1/items/aebbb73a034f36d73e40)
CLIを使わずにSORACOMのSIM入りデバイスへリモートSSH

# はじめに
SORACOM Napterは，SIM入りデバイスをインターネットに晒すことなくリモートから接続可能にする便利なサービスですが，Napter経由でリモート接続する際にはその都度ポートマッピングを作成する必要があります。

コンソールから作成することも可能ですが，毎回コンソールにログインして画面操作するのは非常に手間がかかります。そんな時に便利なのが，SORACOMが提供しているAPI。これを使ってスクリプトを書けば，コマンド一つでポートマッピングの作成からリモートデバイスへの接続までできてしまいます。

さらにSORACOM CLIも使えばより簡単にAPIが叩けるんですが，そっちの記事はもうあるので，今回は敢えてCLIを使わないとどうなるのか，お見せしようと思います。

[SORACOM Napterをcliから使ってみる - Qiita](https://qiita.com/kkimura/items/50375cac7b4cc99d36a1)

CLIを入れるかどうか迷ってる方は，是非見比べて参考にしていただければと思います。

# 前提条件
- 接続先デバイスに入っているSORACOM SIMに名前が付けられていること
- スクリプトの実行環境でjqコマンドが使えること

# コード
```napter.sh
# APIキーとトークンを取得
read API_KEY TOKEN <<(curl -s -X POST -H "Content-Type: application/json" \
-d '{"email": "*****", "password": "*****"}' https://api.soracom.io/v1/auth \
| jq -r "[.apiKey,.token]|@tsv")

# 操作したいSIMのIMSIを取得
IMSI=$(curl -s -X GET -H "X-Soracom-API-Key: ${API_KEY}" \
-H "X-Soracom-Token: ${TOKEN}" https://api.soracom.io/v1/subscribers \
| jq -r '.[] | select(.tags.name=="*****") | .imsi')

# ポートマッピングを作成
curl -s -X POST -H "Content-Type: application/json" \
-H "X-Soracom-API-Key: ${API_KEY}" -H "X-Soracom-Token: ${TOKEN}" \
-d "{\"destination\": {\"imsi\": ${IMSI}, \"port\": 22}, \"duration\": 28800, \"tlsRequired\": false}" \
https://api.soracom.io/v1/port_mappings

# ポートマッピングが作成されていることを確認
echo ''
curl -s -X GET -H "X-Soracom-API-Key: ${API_KEY}" -H "X-Soracom-Token: ${TOKEN}" \
https://api.soracom.io/v1/port_mappings | jq ".|length"

# NapterのエンドポイントのIPアドレスとポート番号を取得
IFS=: read ADDRESS PORT <<(curl -s -X GET -H "X-Soracom-API-Key: ${API_KEY}" \
-H "X-Soracom-Token: ${TOKEN}" https://api.soracom.io/v1/port_mappings \
| jq -r ".[]|select(.imsi==\"${IMSI}\")|.endpoint")

# IFSを元に戻す
IFS=$' \t\n'

ssh -p $PORT pi@$ADDRESS
```

SORACOMアカウントのメールアドレス，パスワード，SIMの名前，ポートマッピングの有効期限（`duration`），ラズパイ側のユーザ名などは適宜置き換えてください。

基本的には，`curl`でAPIを叩いた結果から必要な値を`jq`で取り出す仕組みになっています。`curl`の戻り値から必要な値を取り出して変数に格納する方法については，以前書いたこちらの記事をご参照ください。

[「cURLで取得したJSONの複数フィールドを別々の変数に格納する」を1行で - Qiita](https://qiita.com/yagaodekawasu/items/59b36b92c3da564b0eb9)

「ポートマッピングが作成されていることを確認」のところでは，現在有効なポートマッピングの数が表示されます。

環境変数`IFS`は引数を分割するための区切り文字（デリミタ）で，デフォルトではスペース，タブ，改行になっています。NapterのエンドポイントをAPIで取得すると`192.168.0.1:22`のような形で返ってくるため，`IFS`を`:`に書き換えることによってアドレスとポート番号を`read`で別々の変数に格納することができます。

[readコマンドで1つの文字列から複数の変数に代入するとき - j3iiifn’s blog](https://j3iiifn.hatenablog.com/entry/2019/07/31/010000)

ただし，`IFS`を変更したままだと他のコマンドの挙動に影響してしまうため，用が済んだら忘れずに元に戻す必要があります。

# おわりに
シェルにちょっとだけ詳しくなりました。あと`jq`って偉大だなーと思いました。

# 参考
[Getting Started: IoT デバイスに SSH ログインする | SORACOM Napter | SORACOM Users](https://users.soracom.io/ja-jp/docs/napter/login-with-ssh/)
[はじめに: API キーと API トークン | SORACOM API 利用ガイド | SORACOM Users](https://users.soracom.io/ja-jp/tools/api/key-and-token/)
[リファレンス: SORACOM API リファレンス | SORACOM API 利用ガイド | SORACOM Users](https://users.soracom.io/ja-jp/tools/api/reference/)
[jq コマンドを使う日常のご紹介 - Qiita](https://qiita.com/takeshinoda@github/items/2dec7a72930ec1f658af)
CentOS7.9にMySQLをインストールする！

## 環境
* VirtualBox
    * CentOS: ver7.9


## 手順
1. MaraiaDBの削除

```bash
# yumのパッケージの中にmariadb-libsがあるかどうかの確認
# *を使っているのはX86_64と後ろに続き、環境ごとに差異があるとおもうので
yum list | grep mariadb-libs*

# 確認をしたら削除します
yum remove mariadb-libs

# 既存にある場合下記フォルダーを削除
##確認
ls /var/lib/ | grep mysql
## あったら削除
rm -rf /var/lib/mysql
```
2.リポジトリのインストール

*下記のURLでMySqlのrpmがインストールできます
* `http://dev.mysql.com/get/mysql80-community-release-el{CentOSのversion}.noarch.rpm`

```bash
#どちらかのコマンドでインストールしましょう
rpm -ivh http://dev.mysql.com/get/mysql80-community-release-el7-9.noarch.rpm
##又は
yum localinstall http://dev.mysql.com/get/mysql80-community-release-el7-9.noarch.rpm
```

3.MySqlのインストール

```bash
yum install mysql-community-server
```

## 所感
ZabbixのTutorialを行おうと思い、Mysqlをインストールを行いました。その作業が結構時間がかかりました。原因は、手順1のMariaDBの削除を行っていなかったからだ。なので下記のサイトは非常にありがたかった。
時間がかかったおかげで、yum repあたりのコマンドに詳しくなった。

>参考
* https://www.searchlight8.com/centos-7x-mysql-install/
公式
* https://dev.mysql.com/doc/refman/8.0/ja/linux-installation-yum-repo.html
Winodws10のubuntuにてDockerでReactNative


教材
--

https://qiita.com/Tak-Iwamoto/items/0eca0bf678be0dd570e5

ありがとうございます。とても参考になりました。


準備
--
Winsows10 Ubuntu インストール済み


手順
--

Dockerfile

```Dockerfile

FROM ubuntu:latest

RUN apt-get update && apt-get install -y curl
RUN curl -sL https://deb.nodesource.com/setup_12.x | bash
RUN apt-get install -y nodejs
RUN curl -sS https://dl.yarnpkg.com/debian/pubkey.gpg | apt-key add && echo "deb https://dl.yarnpkg.com/debian/ stable main" | tee /etc/apt/sources.list.d/yarn.list && apt update && apt install -y yarn

ENTRYPOINT [ "/bin/bash"]

WORKDIR /react-sample
```

Dockerfileがあるディレクトリで以下を実行

```
docker build . -t react/ubuntu:latest
```

```
yarn global add create-react-app
create-react-app react-sample
```

```
docker run -p 3000:3000 -v /[ホストのパス]/react-sample:/react-sample -it react/ubuntu:latest
```

```
yarn 
yarn start
```

ほぼ教材にさせていただきました参考サイト通りです。
一点だけ

>yarn global add create-react-app

が何故か通らなかったので代わりに
npm install -g create-react-app
を実行しました。

yarn 
yarn start
で無事ローカルのブラウザでReactの画面を確認できました。

Dockerメモ
--

sudo service docker start
起動

sudo docker info
起動確認

sudo docker ps
確認

コンテナから抜けるとき
Winodws上のDockerからSTOPする
またはexitする

終わりに
--

勉強のためにguthubにpushしました。
git-lfsをバージョン指定してインストールする

git-lfsをバージョン指定してインストールしたい時がたまにある。以下を参照すればOK。

> [https://github.com/git-lfs/git-lfs/releases](https://github.com/git-lfs/git-lfs/releases)
> [https://packagecloud.io/github/git-lfs](https://packagecloud.io/github/git-lfs)

###（例）git-lfs=2.13.3を使いたい場合

以下のように実行すればOK。

> [https://packagecloud.io/github/git-lfs/packages/ubuntu/bionic/git-lfs_2.13.3_i386.deb](https://packagecloud.io/github/git-lfs/packages/ubuntu/bionic/git-lfs_2.13.3_i386.deb)

```bash
# Installする場合
$ sudo apt-get install git-lfs=2.13.3

# wgetする場合
$ wget --content-disposition https://packagecloud.io/github/git-lfs/packages/ubuntu/bionic/git-lfs_2.13.3_i386.deb/download.deb
$ sudo dpkg -i git-lfs_2.13.3_i386.deb 
```

## git lfsのトレースをする

> GIT_TRACE は、どの特定のカテゴリにも当てはまらない、一般的なトレースを制御します。 これには、エイリアスの展開や、他のサブプログラムへの処理の引き渡しなどが含まれます。

以下の設定をしてから`git-lfs`を実行するとトレースが出る

```
GIT_TRACE=true
```

> [10.8 Gitの内側 - 環境変数](https://git-scm.com/book/ja/v2/Git%E3%81%AE%E5%86%85%E5%81%B4-%E7%92%B0%E5%A2%83%E5%A4%89%E6%95%B0)

# 参考
[https://github.com/git-lfs/git-lfs/releases](https://github.com/git-lfs/git-lfs/releases)
[https://packagecloud.io/github/git-lfs](https://packagecloud.io/github/git-lfs)
[https://packagecloud.io/github/git-lfs/packages/ubuntu/bionic/git-lfs_2.13.3_i386.deb](https://packagecloud.io/github/git-lfs/packages/ubuntu/bionic/git-lfs_2.13.3_i386.deb)
[10.8 Gitの内側 - 環境変数](https://git-scm.com/book/ja/v2/Git%E3%81%AE%E5%86%85%E5%81%B4-%E7%92%B0%E5%A2%83%E5%A4%89%E6%95%B0)
PythonのライブラリをUnrealEngine4上で表示させる

#はじめに

今回はUnrealEngine4のエディタ上でPythonのライブラリのプログラムを記述したいと思います。
プラグインでのライブラリだとnumpyやsckitlearnが入っていないので使える様にする手引きまで今回は扱います(具体的な用途についてはまだ勉強中です)

#環境
UnrealEngine4 4.25
＊以下UE4と略します
Python 3.7.0
osはWindowsになります。

#プラグイン
UE4上で起動させ,「Scripting」から「Python Editor Script Plugin」を選択

![スクリーンショット (921).png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2401903/4ebbd5f7-e5e5-df41-848f-cda48d041007.png)


#Hello World
「ウインドウ」から「アウトプットログ」を表示させておく。既存のunrealライブラリから呼び出します。その際に左下からPythonのコマンドを選択します。

![スクリーンショット (923).png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2401903/c86f4b75-da9c-c587-691a-725464faccb7.png)


以下のスクリプトを書きます

```
import unreal
unreal.log("Hello world")
```

以下の様に返ってきます。
![スクリーンショット (925).png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2401903/9d6a62a2-c937-953c-49c5-0f2661d18f25.png)


#外部ライブラリのインストール
今回はnumpy,matplotlib,sckitlearnのインストールします。まずはディレクトリはEpic内でPythonにあるディレクトリを探します。今回のosはWindowsなのでコマンドプロンプトで
C:\Program Files\Epic Games\UE_4.26\Engine\Binaries\ThirdParty\Python3\Win64
を見つけて移動します(cd)

そして移動後以下の様にインストールします(pipからだとダメでした)

```
Python -m pip install numpy
Python -m pip install scikit-learn
Python -m pip install matplotlib
```

#スクリプト

実際に上記のライブラリを用いて,今回はKmeans法を試します。
人工データを生成し,クラスタを割り当てます。以下のファイルを作成

```py:kmeans_Test.py
import numpy as np
import matplotlib.pyplot as plt
from sklearn.cluster import KMeans

#正規乱数による生成
np.random.seed(0)
a=np.random.randn(40,2)
b=np.random.randn(40,2)+np.array([1,0])
c=np.random.randn(40,2)+np.array([1,1])

#すべてを結合しシャッフル
abc=np.r_[a,b,c]
np.random.shuffle(abc)


#学習
model= KMeans(n_clusters=3)
result=model.fit(abc)

marks=["x","+","*"]

#表示
for i in range(3):
  p=[result.labels_[j]== i for j in range(len(result.labels_))]
  plt.scatter(abc[p][:,0],abc[p][:,1],marker=marks[i])

plt.show()

```

#実行

ファイル作成後,UnrealEngineの「ファイル」から実行![スクリーンショット (927).png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2401903/dcebdf41-9eee-c38a-b765-55bcd3ea35c0.png)

以下の様に表示されたら成功

![Figure_1.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2401903/56245fe9-3010-778d-0d20-e26e845f0bb3.png)



#最後に

Unreal内でのアセット管理などでPythonは有効活用出来るみたいなので,色々リサーチしたいと思います。