OmniAICreator/Qiita-1.07M huggingface dataset:
AtCoder Beginner Contest 156 WriteUp

# 総評

いつも通り、「ABC問題を3完してD問題で一生詰まる」という感じ。順位表を見ていると、目標としている緑〜青帯に近づくためには、D問題の正解率を上げていきたいところ…

 

コンテストのページはこちら : 

https://atcoder.jp/contests/abc156

# A - Beginner

https://atcoder.jp/contests/abc156/tasks/abc156_a

$R_{in}$を内部レーティング、$R_{out}$を外部レーティングとすると、

$$
R_{in} = \max(
R_{out}+100 \times (10-K),
R_{out})
$$
である。

```python
[N,R]=[int(item)for item in input().split()]
print(max(R, R+100*(10-N)))
```

https://atcoder.jp/contests/abc156/submissions/11763127

---

普通にKの大小で場合分けするのもあり。[^1]

```python
[N,R]=[int(item)for item in input().split()]
print(R if N>=10 else R+100*(10-N))
```

https://atcoder.jp/contests/abc156/submissions/11755645

---

# B - Digits

https://atcoder.jp/contests/abc156/tasks/abc156_b

例えば、100~999は、10進数で**3桁**の数である。

すなわち、$10^2 $ 〜 $10^3-1$の値は、10進数で**3桁**となる。

また、1000~9999の値、すなわち$10^3 $ 〜 $10^4-1$の値は、10進数で**4桁**となる。





2進数で考えてみる（今後、2進数の値の右下に2をつけて、2進数であることを明示する。例えば、10進数の「5」は2進数の「101」だが、これを$101_{2}$のように表す。）

例えば、6を2進数で表すと$110_2$ であり、3桁となる。

もっと言うと、4~7($100_2$~$111_2$)の間の数は、2進数で**3桁**となる。

ちなみに、4~7は$2^2$〜$2^3-1$とも表せる。

また、8~15($1000_2$~$1111_2$)の間の数は、2進数で**4桁**となる。

またまたちなみに、8~15は$2^3$〜$2^4-1$とも表せる。



勘のいい読者諸氏は気づいただろうが[^2]、この、(下限〜上限)の上限の部分、$10^3-1$、$10^4-1$、あるいは$2^3-1$、$2^4-1$の指数と、10進数の桁数に、関係性がある。

一般に、10進数のNをK進数に直した時、[桁数、K、N]の間に、
$$
K^{(桁数)-1}\leq N\lt K^{(桁数)}
$$
の関係が成り立つ。

各項に対してKの対数を取ると
$$
(桁数)-1 \leq \log_K(N)\lt (桁数)
$$
となる。

(例えばサンプルの場合(N,K)=(11,2)であり、$(桁数)-1 \leq \log_2(11)=3.45...\lt (桁数)$が成り立つ。$(桁数)$に入りうる整数が4しかないことから、11は2進数で4桁である。)



ここで、
$$
(桁数)-1 =\lfloor \log_K(N) \rfloor
$$
となることに注目すれば、K進数におけるNの桁数は
$$
(桁数)=\lfloor \log_K(N) \rfloor+1
$$


として計算できる。

あとはこれを、プログラムに落とし込むと…

```python
import math
[N,K]=[int(item)for item in input().split()]
#print(math.log(N,K))
print(math.floor(math.log(N,K))+1)
```

https://atcoder.jp/contests/abc156/tasks/abc156_b

## 考察

$log_2(11)=3.45...$であった。これは、仮に「小数の桁」の概念が存在すれば、11という数を、2進数で表現するのに必要な桁数が、3.45...になることを意味している。もちろん桁数に小数の概念はないため(ないハズ)、11を十分に表すためには最低でも4桁が必要というわけだ。

情報理論における情報エントロピーの「香り」がする…が、無学なので、よくわからない。とても残念。

## C - Rally

https://atcoder.jp/contests/abc156/tasks/abc156_c

この問題で求めるPの座標を、そのまんま$P$とする。改めて書き直すと、求めるPは
$$
P=\min_{P'}\sum^N_{i=1}(X_i-P')^2
$$
となる。

$\sum^N_{i=1}(X_i-P')^2$を式変形すると

```math
\sum^N_{i=1}(X_i-P')^2\\
\begin{align}
&=P^2-2X_1P' + X_1^2\\
&+P^2-2X_2P' + X_2^2\\
&\vdots\\
&+P^2-2X_nP' + X_n^2\\
&=nP^2-2(X_1+X_2+...+X_n)P' + (定数項)\\
&=(P-\frac{X_1+X_2+...+X_n}{n})^2+(定数項)\\
\end{align}\\
```
$(P-\frac{X_1+X_2+...+X_n}{n})^2\geq0$であり、$P=\frac{X_1+X_2+...+X_n}{n}$のとき、$(P-\frac{X_1+X_2+...+X_n}{n})^2 = 0$となるため、式全体が最小となる。

(もちろんPで微分しても同じ結果が得られる)



# D - Bouquet

解き次第記述します。



[^1]: どっちの実装のほうが良いのかは、初心者的にはよくわかりませんな。
[^2]: https://twitter.com/kiricat848/status/1246676059606536192
MT4 で実行可能なプログラムの種類

#はじめに

MT4 では3種類のプログラムがあります。

- EA (Expert Advisor)
- カスタムインジケーター
- スクリプト

##イベントハンドラ

各プログラムにはイベントハンドラと呼ばれる MT4 のシステムから呼び出される関数があります。
自分で作成したプログラムでは必要なイベントハンドラのみ定義すれば自動的に呼び出されます。
また、イベントハンドラはプログラムの種類によって呼び出されるものと呼び出されないものがありますので注意が必要です。コンパイル時に警告を出してくれるものもあります。

##EA (Expert Advisor)

自動売買を実行するためのプログラムで、実行すると停止するまでチャート上に常駐します。
定期的に OnTick() が呼び出されますので、自動売買のロジックはこのハンドラに記載します。
一つのチャート上では一つだけ実行が可能です。

###イベントハンドラ

```C++
int OnInit();
void OnDeinit(const int);
void OnTick();
void OnTimer();
double OnTaster();
void OnChartEvent(const int, const long &, const double &, const string &);
```

###サンプルプログラム
```C++
#property version   "1.00"
#property strict

int OnInit()
{
	Print(__FUNCTION__);
	EventSetTimer(60);
	return INIT_SUCCEEDED;
}

void OnDeinit(const int reason)
{
	Print(__FUNCTION__);
	EventKillTimer();
}

void OnTick()
{
	Print(__FUNCTION__);
}

void OnTimer()
{
	Print(__FUNCTION__);
}

double OnTester()
{
	Print(__FUNCTION__);
	return 0.0;
}

void OnChartEvent(const int id,
                  const long &lparam,
                  const double &dparam,
                  const string &sparam)
{
	Print(__FUNCTION__);
}
```

##カスタムインジケーター

チャートをカスタムするためのプログラムで、実行するとインジケーターから削除するまでチャート上に常駐します。
一つのチャート上で複数の実行が可能です。

###イベントハンドラ

```C++
int OnInit();
void OnDeinit(const int);
int OnCalculate(const int, const int, const datetime &[], const double &[], const double &[], const double &[], const double &[], const long &[], const long &[], const int &[]);
void OnTick();
void OnTimer();
void OnChartEvent(const int, const long &, const double &, const string &);
```

###サンプルプログラム
```C++
#property version   "1.00"
#property strict
#property indicator_chart_window

int OnInit()
{
	Print(__FUNCTION__);
	EventSetTimer(60);
	return INIT_SUCCEEDED;
}

void OnDeinit(const int reason)
{
	Print(__FUNCTION__);
	EventKillTimer();
}

int OnCalculate(const int rates_total,
                const int prev_calculated,
                const datetime &time[],
                const double &open[],
                const double &high[],
                const double &low[],
                const double &close[],
                const long &tick_volume[],
                const long &volume[],
                const int &spread[])
{
	Print(__FUNCTION__);
	return rates_total;
}

void OnTick()
{
	Print(__FUNCTION__);
}

void OnTimer()
{
	Print(__FUNCTION__);
}

void OnChartEvent(const int id,
                  const long &lparam,
                  const double &dparam,
                  const string &sparam)
{
	Print(__FUNCTION__);
}
```

##スクリプト

実行すると OnStart() が呼び出されて、それが完了次第プログラムは終了します。

###イベントハンドラ

```C++
int OnInit();
void OnDeinit(const int);
void OnStart();
```

###サンプルプログラム

```C++
#property version   "1.00"
#property strict

int OnInit()
{
    Print(__FUNCTION__);
    return INIT_SUCCEEDED;
}

void OnDeinit(const int reason)
{
    Print(__FUNCTION__);
}

void OnStart()
{
    Print(__FUNCTION__);
}
```

#おわりに

今回紹介した3種類のプログラムはそれぞれ用途が違いますので、目的に応じたものを選択するようにしてください。
また、イベントハンドラについては後日紹介します。
UnityでTileMap使用時にスクリプトからComposite Collider 2DのGenerateが出来ない場合の回避方法

#はじめに
UnityでTileMapの当たり判定を取る場合、Tilemap Collider 2DとComposite Collider 2Dを使用することが多いと思います。TileMapをシーンにベタ置きするのではなくスクリプトを使ってTileをシーンに配置したい場合（ステージがたくさんあるパズルゲームなどを想定しています）、配置後にComposite Collider 2DをGenerateする必要があります。しかしスクリプトでTileを配置直後に

```C#:sample.cs
CompositeCollider2D.GenerateGeometry();
```

を実行してもComposite Collider 2Dが生成されません。

#解決策1
Tileを配置後にComposite Collider 2DをGenerateする前に1Fのウェイトを挿入する。

```C#:sample.cs
yield return new WaitForEndOfFrame();
CompositeCollider2D.GenerateGeometry();
```

#解決策2
Composite Collider 2DのGeneration Type = Synchronousで使用する。
インフラのテスト自動化(Windows)

# はじめに
アプリケーションのテスト自動化について整理していたら、たまたまインフラのテスト自動化の記事も見つけたので、後で利用することも想定して一旦用意！！

# TODO
□RESOURCE TYPESでできることを確認
□インストールアプリケーションのチェック方法
□環境構築
□お試し実行

# 参考サイト

## Serverspec関連
◆インフラの自動テストを実現するツール「Serverspec」
　https://qiita.com/oh_4shiki/items/006a852ee72476b6f5ea
　　※ここをベースに作業を進めていければ...

◆WindowsとServerspecでいろいろ
　http://ninna2.hatenablog.com/entry/2017/07/09/WindowsとServerspecでいろいろ
◆WindowsでServerspecを試すwithAzure
 http://ninna2.hatenablog.com/entry/2017/06/29/WindowsでServerspecを試すwithAzure

◆WindowsでのServerspec
　https://opcdiary.net/windowsでのserverspec/
◆serverspecでWindowsをテストするための設定
　https://qiita.com/oh_4shiki/items/006a852ee72476b6f5ea
◆ServerspecをWindows 10 PCにインストールしてテストを行う場合に、てこずりそうな箇所の解決方法についてメモしました
　http://linuxcommand2007.seesaa.net/article/465919283.html
　　※この辺は環境構築回り...


## Ansible関連
◆開発チームの環境をAnsibleで一括構築しよう
　https://thinkit.co.jp/article/10481

◆Gitlab(Runner、Container Registry)＋AnsibleでローカルにCI環境を作ってみる
　https://qiita.com/comefigo/items/d5c4d3f61edd30ba46ee

◆Ansibleを使用して、CentOS 7にGitLabをインストールする
　https://qiita.com/GENO/items/6bf1a9d7e1cf41ed358f

◆Ansible + GitLab Runner で作るデプロイジョブ
　https://labs.septeni.co.jp/entry/ansible-gitlab-runner

◆ITインフラ自動化のあらゆるトピック・事例が紹介された、Red Hat Ansible Automates Tokyo 2020 Day1
　https://zine.qiita.com/event/202007-red-hat/
◆自動化の進め方から、導入の経験談、内製ソフトとの連携まで。Red Hat Ansible Automates Tokyo 2020 Day2
　https://zine.qiita.com/event/202007-red-hat-2/

◆Windows Serverもansibleで自動構築してServerspecでテストしよう
　https://qiita.com/uzresk/items/48ef72dd0f572ada2dfa
　　※ここはAnsibleの比重が大きいので...

◆Ansible｜ライトウェルブログ｜株式会社ライトウェル
　https://lightwell-solution.com/blog/ansible/

◆Ansible入門者向け学習ガイド (Windows編)
　http://c.itdo.jp/technical-information/ansible/ansible%E5%85%A5%E9%96%80%E8%80%85%E5%90%91%E3%81%91%E5%AD%A6%E7%BF%92%E3%82%AC%E3%82%A4%E3%83%89-windows%E7%B7%A8/

◆Windowsサーバ2016をAnsibleで設定してみた
　https://qiita.com/ksawada1979/items/31214d147277042f1e32

◆AnsibleでWindowsを操作する準備をする
　https://qiita.com/yunano/items/f9d5652a296931a09a70
macOSのnpmでグローバルインストールに失敗する

## 事象

1. `-g`オプション付きの`npm`コマンドでパッケージをグローバルインストールしようとすると、次のエラーが発生する。

    ```shell
    % npm install -g typescript
    npm WARN checkPermissions Missing write access to /usr/local/lib/node_modules
    npm ERR! code EACCES
    npm ERR! syscall access
    npm ERR! path /usr/local/lib/node_modules
    npm ERR! errno -13
    npm ERR! Error: EACCES: permission denied, access '/usr/local/lib/node_modules'
    npm ERR!  [Error: EACCES: permission denied, access '/usr/local/lib/node_modules'] {
    npm ERR!   stack: "Error: EACCES: permission denied, access '/usr/local/lib/node_modules'",
    npm ERR!   errno: -13,
    npm ERR!   code: 'EACCES',
    npm ERR!   syscall: 'access',
    npm ERR!   path: '/usr/local/lib/node_modules'
    npm ERR! }
    npm ERR! 
    npm ERR! The operation was rejected by your operating system.
    npm ERR! It is likely you do not have the permissions to access this file as the current user
    npm ERR! 
    npm ERR! If you believe this might be a permissions issue, please double-check the
    npm ERR! permissions of the file and its containing directories, or try running
    npm ERR! the command again as root/Administrator.

    npm ERR! A complete log of this run can be found in:
    npm ERR!     /Users/foobar/.npm/_logs/2020-04-11T18_25_19_969Z-debug.log
    ```

## 原因

1. NPMの公式サイトでアナウンスされています。
https://docs.npmjs.com/resolving-eacces-permissions-errors-when-installing-packages-globally

1. macOSのデフォルトでは、次のように設定されています。

    ```shell
    % npm config get prefix
    /usr/local
    ```

## 対処方法

1. 次のコマンドを実行する。

    ```shell
    % mkdir ~/.npm-global
    % npm config set prefix '~/.npm-global'
    ```

1. ~/.profileファイルを編集し、パスを通す。

    ```shell
    % vi ~/.profile
    ```

    ```text
    export PATH=~/.npm-global/bin:$PATH
    ```

1. ~/.profileファイルの内容をシェルに適用する。

    ```shell
    % source ~/.profile
    ```

## 動作確認

1. エラーが発生しなくなることを確認する。

    ```shell
    % npm install -g typescript
    /Users/foobar/.npm-global/bin/tsserver -> /Users/foobar/.npm-global/lib/node_modules/typescript/bin/tsserver
    /Users/foobar/.npm-global/bin/tsc -> /Users/foobar/.npm-global/lib/node_modules/typescript/bin/tsc
    + typescript@3.8.3
    added 1 package from 1 contributor in 0.75s
    ```

    ```shell
    % tsc --version
    Version 3.8.3
    ```
Windows 10 に Hyper-V をインストールする

## Windows 10 に Hyper-V をインストールする手順について

本手順では、Windows 10 Pro に Client Hyper-V をインストールから Hyper-V マネージャーを起動するところまでの手順を記載します。
検証環境構築等の参考になれば幸いです。

## 前提条件

Windows のエディションは **Pro** であることが条件の1つです。
Windowsキー＋r キーを投下して、名前に「winver」と入力し、エディションをご確認ください。

![Hyper-V_Install_000.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/617437/4989973d-3908-f020-79c7-4104c9b3f67c.png)

**Windows 10 Pro** と記載があればokです。

![Hyper-V_Install_001.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/617437/f65bb730-4011-899e-32d1-c401173a71ca.png)

Hyper-Vを稼働させるための細かい条件はまだありますが、よほど古いPCでなければ条件は満たしている可能性は高いため、エディションの注意を抜粋しました。
詳しくは下記リンクをご確認ください。

[Windows 10 Hyper-V のシステム要件](https://docs.microsoft.com/ja-jp/virtualization/hyper-v-on-windows/reference/hyper-v-requirements)



## クライアント Hyper-V インストール手順

## 01．Windows の機能を起動

Windowsキー＋r キーを投下して、ファイル名を指定して実行の名前に「appwiz.cpl ,2」と入力

![Hyper-V_Install_002.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/617437/645e536a-bd6b-a1ca-0077-07addd9b1d2c.png)

## 02．Windows の機能の有効化または無効化の Hyper-V にチェックを入れる

![Hyper-V_Install_003.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/617437/a24393f8-8e08-9065-07e6-abb6cbbf6abc.png)

## 03．Hyper-Vをインストール後PC再起動

![Hyper-V_Install_004.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/617437/8defa07a-ad85-3d84-59c9-67e28822effc.png)

## 04．PC再起動後、Hyper-Vマネージャを起動

Windowsキー＋r キーを投下して、ファイル名を指定して実行の名前に「virtmgmt.msc」と入力

![Hyper-V_Install_005.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/617437/c32d9856-6051-d5dc-127b-dbf7d31abac4.png)

Hyper-V マネージャが起動したことを確認

![Hyper-V_Install_006.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/617437/93b1c922-8820-97d5-b987-e01395259ee0.png)
Perlにおけるhash（ハッシュ）は、Pythonにおける辞書（ディクショナリ）

# Perlにおけるhashは、Pythonにおける辞書

・Key（キー）とvalue（値）をセットで格納する。

正直、私はPerlのhashの機能はよく知らない。

Pythonで辞書は
x = {"book":"Yomitai", "hon":3}
のように、key:valueを{}の中で定義する。

```kiri.py
kiri = {"price":20, "number":12}
for key in kiri:
    print(key+":"+str(kiri[key]))
```

for key, value in kiri.items():
のように、itemsメソッドを使うと、辞書のキーと値をセットで取得できる。
その時は、str(kiri[key])では無くて、str(value)で良い。

更に、formatを使うと簡潔にできる。

```formatkiri.py
kiri = {"price":20, "number":12}
for key, value in kiri.items():
    print("{0}:{1}".format(key, value))
```


（書き足すかも）
python のマルチプロセスプログラムを VSCode でデバッグする

python の multiprocessing モジュールを使ったプログラムを VSCode 上でデバッグする方法です  
## 想定している読者  
- multiprocessing モジュールを使用した python のコードが、コンソールでは問題なく動くのに VSCode 
でデバッグをしようとすると動かねーっていう方  
- python のマルチプロセスプログラムを理解したいけどデバッガがないと判り味がねーっていう方
- VSCodeでデバッグする時 ↓ こんなエラーがでて困ってる方  

```
Exception escaped from start_client  

failed to launch debugger for child process  

AssertionError: can only join a child process  

RuntimeError: already started
```

## やりかた
multiprocessing モジュールを使用したプログラムのデバッグには次の3点が必要です

#### ・1. if \_\_name__ == "\_\_main__": を書くこと  
デバッグを開始するファイル (トップレベル モジュール) には if \_\_name\_\_ == "\_\_main\_\_":  が必須です。もしこのステートメントが記載されていないなら追加して、コードを整形しましょう。
場合によってはめんどくさい作業になるかもしれませんが、必須です。

#### ・2. multiprocessing.set_start_method('spawn', True) というステートメントを書くこと  
例えば、main ステートメントの直下に次のように書いとけばうまく行きます。  

```Python:記載例
if __name__ == "__main__": 
    import multiprocessing 
    multiprocessing.set_start_method('spawn', True)
```

windows の方はさらに  
freeze_support()  
という行の追加が必要かもです

#### ・3. launch.json に  ' "subProcess": true ' というセクションを書くこと  
Ctrl+Shift+D でデバッグモードにして構成の launch.json ファイルを編集します。  


![openjson.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/167499/c8bdd62f-9be8-940a-c039-3c022f489942.jpeg)

ここに、"subProcess": true というセクションを追記します。  

```json:構成の例
{
  "version": "0.2.0",
  "configurations": [
    {
      "name": "Python: Current File",
      "type": "python",
      "request": "launch",
      "program": "${file}",
      "subProcess": true,    // 追記
      "console": "integratedTerminal"
    }
  ]
}
```

## jupyter notebook ファイル (.ipynb) のデバッグ
VSCode は jupyter notebook のファイル (.ipynb) を開いて実行することができます。 しかしながら開いているコードをデバッグする機能はまだ無いです。もしマルチプロセスプログラムのデバッグをしたいなら VSCode の機能でpython スクリプトに変換したあと、上述の方法を適用してください。
## 確認した環境
OS: Debian 10
python: 3.7.4
Visual Studio Code: 1.44.0
ターミナルのショートカットキー

ターミナルを頻繁に使う様になり、カーソルの移動に←→を押し続けるのがしんどくて・・・。
なのでカーソル移動系や削除系のショートカットキーを押さえておけば、とりあえず何とか成るだろうと思いまとめました。


## 環境
macOS Catalina 10.15.4

## まずはショートカットキーでターミナルを起動できるようにする 

### Automatorを起動

1. Launchpad > Automatorを起動すると、書類の種類を選択してくださいと出るので「クイックアクション」を選んで、選択
2. 色々な項目が出てくるので、下にスクロールして「アプリケーションを起動」をダブルクリック
3. その右側の枠の上の方にある「ワークフローが受け取る項目」を「入力なし」を選ぶ
4. その下にある「アプリケーションを起動」枠の中で、ユーティリティ > ターミナル.appを選択
5. 右上の「▶︎ 実行」を押して動作確認
6. メニューバーのファイルから、わかりやすい名前をつけて保存する

### システム環境設定でAutomatorの設定を有効にする
上記で設定した内容を、システム環境設定で有効にします
1. システム環境設定を開いて、キーボード > ショートカットタブ > サービスを選ぶ
2. 右隣の枠を下までスクロールし「一般」の中にある、先ほど名付けた項目を探す
3. ショートカットキーの設定がなしになっているので、任意のコマンドを設定する（私は⌥ + ⌘ + T で設定しました）


## ショートカットキー

### カーソル移動系
|ショートカットキー|効果　　　|
|:--------|-----------|
|Ctrl + A   |行頭に移動  |
|Ctrl + E |行末に移動　|
|Ctrl + L|現在の行を画面最上部に持ってくる|
|Opt + ←|カーソル位置から1単語前に移動|
|Opt + →|カーソル位置から1単語後に移動|

### カット(削除と同意？）・ペースト系

|ショートカットキー|効果|
|:---|---|
|Ctrl ＋ U |カーソル位置から行頭までをカット|
|Ctrl ＋ K|カーソル位置から行末までカット|
|Ctrl ＋ W|カーソル位置から一つ前の単語をカット|
|Ctrl + Y|カットしたものをペーストする|




他にもたくさんありそうだが、まずはこの辺りの基本的っぽいショートカットキーをサラッと使いこなせるようにして、時間節約と疲労軽減に貢献させる！
Linux raspi-linux 4.19.97-v7+でI-O Data Device, Inc. WNGDNUS2 802.11nを使おうとしたら繋がらなかったのを直した件

##Volumioではwi-fiで繋がっていたIO-DATAのWNGDNUS2が、RaspbianBusterでは認識しない。

困ったぞ。４時間くらいずっとネットで調べてたけど、やっと分かった。

##状況
```shell:dmesg
Feb 13 16:23:11 raspberrypi kernel: [  375.799308] usb 1-1.3: Product: WN-GDN/US2
Feb 13 16:23:11 raspberrypi kernel: [  375.799319] usb 1-1.3: Manufacturer: I-O DATA
Feb 13 16:23:11 raspberrypi kernel: [  375.799330] usb 1-1.3: SerialNumber: xxx
Feb 13 16:23:11 raspberrypi kernel: [  375.897969] usb 1-1.3: reset high-speed USB device number 6 using dwc_otg
Feb 13 16:23:11 raspberrypi kernel: [  376.068233] usb 1-1.3: Direct firmware load for carl9170-1.fw failed with error -2
```

"failed with error -2"？iwconfigでwlan0が出てこない。

##解決方法
私はこれで治りました。

###参考サイト
[Atheros AR9170 devices (carl9170)](https://wiki.debian.org/carl9170)

**１　firmware-linux-freeをインストール**

```shell:apt-get
sudo apt-get install firmware-linux-free
```

**２ インストールし終わったら、sudo rebootする。**
すると、

```shell:dmesg
[   17.266924] wlan0: send auth to xx:xx:xx:xx:xx:xx (try 1/3)
[   17.290829] wlan0: authenticated
[   17.298323] wlan0: associate with xx:xx:xx:xx:xx:xx (try 1/3)
[   17.323843] wlan0: RX AssocResp from xx:xx:xx:xx:xx:xx (capab=0xcxx status=0 aid=2)
[   17.332894] wlan0: associated
```

ちなみに

```shell:lsusb
Bus 001 Device 005: ID 04xx:xxxf I-O Data Device, Inc. WNGDNUS2 802.11n
```

```shell:iwconfig
wlan0     IEEE 802.11  ESSID:"xxxxx"
          Mode:Managed  Frequency:2.462 GHz  Access Point: xx:xx:xx:xx:xx:xx
          Bit Rate=30 Mb/s   Tx-Power=20 dBm
          Retry short limit:7   RTS thr:off   Fragment thr:off
          Power Management:off
          Link Quality=70/70  Signal level=-35 dBm
          Rx invalid nwid:0  Rx invalid crypt:0  Rx invalid frag:0
          Tx excessive retries:0  Invalid misc:741   Missed beacon:0
```

```shell:ping
PING 192.168.0.22 (192.168.0.22) 56(84) bytes of data.
64 bytes from 192.168.0.22: icmp_seq=1 ttl=64 time=0.209 ms
64 bytes from 192.168.0.22: icmp_seq=2 ttl=64 time=0.270 ms
64 bytes from 192.168.0.22: icmp_seq=3 ttl=64 time=0.219 ms
64 bytes from 192.168.0.22: icmp_seq=4 ttl=64 time=0.211 ms
--- 192.168.0.22 ping statistics ---
4 packets transmitted, 4 received, 0% packet loss, time 101ms
rtt min/avg/max/mdev = 0.209/0.227/0.270/0.027 ms
```
こんな感じで繋がってくれました。
ただし、
/etc/wpa_supplicant/wpa_supplicant.conf 
/etc/network/interfaces
は設定してあります。


とりあえず、自分用備忘録です。
Kotlinをワンコマンドで実行するスクリプト


## Kotlinをワンコマンド`kt`で実行する

Kotlinでサクッと動作を確認する場合、以下の二行を実行していたのですが、面倒でした。

```bash
kotlinc -include-runtime -d a.jar
java -jar a.jar
```

## `kt`スクリプトでワンコマンドで解決

以下のスクリプトを作りました。

```shell:kt
#!/bin/bash
if test -f "$1"; then
  if kotlinc -include-runtime -d a.jar "$1"; then
    java -jar a.jar
  else
      echo "compile failed"
      exit 1
  fi

else
  echo "$1 doesn't exist"
fi
```

`kt a.kt`といった感じで実行できます

[github](https://github.com/programmerkgit/kt) にあげています。
インストールして`chmod +x kt`してPathを通せば実行できます。
スライドをjQuery & TweenMax & CSS3の合わせ技で自作する

# なぜ、スライダープラグインを使わなかったのか？
お客様が、「是非このサイトのスライドを実装して欲しい！」と強いご要望があったからです。
そのサイトのソースを見ると、バリバリのフルスクラッチ！！
自分の腕では到底真似できません:joy:

これは、既存のスライダープラグインで、
うまく実装できるか分からなかったので、
javaScriptライブラリで、自作スライドをカスタマイズすることにしました。

# 実装したかった内容

## 表示されているスライド以外にもclassを付与する
- **「表示されているスライド」
にclassをつけて、CSS3 Animationを発火させる。**

というのは、よくあるのですが、


- **「表示された直後のスライド」
にもclassをつけて、CSS3 Animationを発火させる。**

という方法は見たことがなかったので、これをどうするか悩みました。。。
これは、「表示されているスライド」のすぐ下に、
「表示された直後のスライド」を移動させるのに必要となります。

## スマホの時、スライドをスワイプさせる
これは、スライダープラグインで当たり前の機能ですが、
自作でできるかちょっと不安でした。。

# 実装方法
## クラス付与させる方法

実装したいスライドと似ている動きだったので、
こちらを参考させていただきましたm（_ _）m
TweenMaxを使って自作スライドを制作されています。
[https://codepen.io/jonathan/pen/qqmBjQ](https://codepen.io/jonathan/pen/qqmBjQ)

これを改造し、
表示された直後のスライドにもclassを付与することに成功しました！

クラスを付与した瞬間に
スライドと、その中の要素のCSS3 Animationを発火させています。
これだと、Animationがカスタマイズしやすいのがメリットです。

## スマホの時、スライドをスワイプさせる

こちらを参考させていただきましたm（_ _）m
jQueryでとても簡単に実装できました！
[https://qiita.com/Hijiri-K/items/5ad5eaec10c0e7921ada](https://qiita.com/Hijiri-K/items/5ad5eaec10c0e7921ada)

## 実装したアニメーションがこれです（CodePen）
https://codepen.io/lifescrewdesign/details/eYpmPQL

- 表示されているスライドには**.is-now**を付与
- 表示された直後のスライドには**.is-old**を付与

しています。
SynologyでSynology(DS120j)でyoutube-dlをタスクスケジューラーから起動させる

#コマンドを実行(ユーザー指定のスクリプト)のところが大事

```
cd /var/services/homes/名前/python
export PATH=$PATH:/var/services/homes/名前/.local/bin
export PATH=/volume1/@appstore/ffmpeg/bin:$PATH
export PATH=$PATH:/var/services/homes/名前/AtomicParsley-source-0.9.0/AtomicParsley-source-0.9.0
PYTHONIOENCODING=utf-8 python3 test.py&>/var/services/homes/名前/python/er.txt
```
cd使ってpyがある階層まで行く
youtube-dl,ffmpeg,AtomicParsleyのあるフォルダーに向けてパスを通す(ffmpegは最初に来るように気をつける)
そして日本語などが出てきたときエラーが起こるためPYTHONIOENCODING=utf-8 python3 test.pyのように起動させる。
そして自分は.pyの中で`os.system('./Youtube-DL.sh')`を使用してyoutubedlを起動していたがなぜかエラーが起こっていた
https://github.com/ytdl-org/youtube-dl/issues/13185
このサイトに書いてあるように
```
LC_ALL=en_US.UTF-8 youtube-dl --download-archive archive.txt --embed-thumbnail --write-thumbnail --add-metadata -o "%(playlist_index)s-%(title)s-%(timestamp)s-%(upload_date)s-%(id)s.%(ext)s" -f bestvideo[ext=mp4]+bestaudio[ext=m4a] URL  > log.txt
```
のようにすることでエラーを回避することができた。
#わからなかったこと(今も)
なぜsshでログインしたときは.pyもyoutubedlのエラー
(UnicodeEncodeError: 'ascii' codec can't encode characters in position)とかetc
パスも`vi /etc/profile`を使って書き込み設定していたのにタスクスケジューラーから起動するとエラーが起こるのかわかりませんでした...
わかる方教えたいただけたらとてもありがたいですお願いします..m(_ _)m
参照渡しではvue-chartjsがリアクティブにならない

#結論
参照渡しになっている場合リアクティブにならない

# 何が起きたか
vue-chartjsのmixinで親から渡されるデータ変更を検知して再描画しようとした。
検知に当たって、オブジェクト自体が別のオブジェクトになる（オブジェクト内部の変更は検知されない為）ことが前提になるため、元のオブジェクトを変数に入れて編集して再代入で別オブジェクトにしようとした。

```js:doughnut.js
import { Doughnut, mixins } from 'vue-chartjs'
const { reactiveProp } = mixins

export default {
  extends: Doughnut,
  mixins: [reactiveProp],
  props: {
    chartData: {
      type: Object,
      default: null
    },
    options: {
      type: Object,
      default: null
    }
  },
  mounted () {
    this.renderChart(this.chartData, this.options)
  }
}

```

```vuejs:component.vue
<script>
export default {
    components: {Doughnut},
    data: () => ({
      chartData: {
        labels: ['sample1', 'sample2'],
        datasets: [
          {
            data: [],
            backgroundColor: ["#1976d2", "#EEEEEE"]
          }
        ],
      },
      selectedTerm: 0,
    }),
    watch: {
      selectedTerm() {
        this.updateChartData()
      }
    },
    methods: {
      updateChartData() {
        //~~中略~~
        let doneRatio = Math.ceil((done.length / histories.length)*100)
        let chartData = this.chartData //これが間違い
        chartData.datasets[0].data = [done.length, notDone.length]
        this.chartData = chartData //更新できると思っていた
      }
    }
  }
</script>
```

#なんでダメだったか
プリミティブ型は値渡し、オブジェクト型は参照渡しとのことなので、当然let chartDataは元のthis.chartDataのまま。chartDataの中身は変更されているがchartDataというオブジェクトは以前のままであるためdoughnut.jsのmixinは変更を検知できない。

#どうしたか
ディープコピーして別オブジェクトにしてから、再代入した。

```vuejs:component.vue
<script>
export default {
    components: {Doughnut},
    data: () => ({
      chartDataTemplate: {
        labels: ['sample1', 'sample2'],
        datasets: [
          {
            data: [],
            backgroundColor: ["#1976d2", "#EEEEEE"]
          }
        ],
      },
      selectedTerm: 0,
      chartData: null,
    }),
    watch: {
      selectedTerm() {
        this.updateChartData()
      }
    },
    methods: {
      updateChartData() {
        //~~中略~~
        let doneRatio = Math.ceil((done.length / histories.length)*100)
        let chartData = JSON.parse(JSON.stringify(this.chartDataTemplate)) // ディープコピー
        chartData.datasets[0].data = [done.length, notDone.length]
        this.chartData = chartData
      }
    }
  }
</script>
```

値の渡され方を知っていればどうということはないけれど、想像以上にハマったので備忘録として記録。
gemってなに？

「gemって結局なんなんだ」とふと思ったので、メモ代わりに

gemとはrubyのライブラリ。Rubyを使うときに便利な機能を作ってまとめてくれたもの。

railsもgem。

ややこしくしてるのがbundler。
bundlerはgemを管理するgem。
C言語でなんちゃってターミナル 

#はじめに
これからC言語を使った何回かに別けてなんちゃってターミナルを紹介していきたいと思います。
qiitaでは駆け出しの方が書いてるものも多いようなので、こちらでも書いていきたいと思います。
ですが私も所詮は素人のやることです。
こんな考え方、やり方もあるんだなと参考程度になればとおもます。

あくまでも個人の考えですが言語の勉強は人を選ぶと思います。
何をきっかけにしてモチベーションとするか、勉強し続けられることが重要なのではないかと思います。
webをやりたいならjavascriptだとか、案件があるからjavaだとか気にするのもいいですが、何をやりたいかはっきりとしない。
そんな時はいろんな言語を触り、見て、感じて、面白いと思ったものを勉強してみるのものいいのではないのでしょうか。

これからやること新しい方々の参考になり助けになればとおもます。

##環境
[VirtualBox](https://www.virtualbox.org/)
[Vagrant](https://www.vagrantup.com/)
[Cent0S7](https://www.centos.org/)



[こちらで構築の紹介をさせていただいてます参考にどうぞ](https://qiita.com/I_S-657/items/63528d09995138c9e46d)

##環境構築
まずは環境構築です。
コンパイルするために必要なgccをインストールします。

```
$ sudo yum install -y gcc
```

インストールが終わったら実際にコードを書いて実行してみます。

```c:hello.c
#include <stdio.h>

int main(void) {

    printf("hello world\n");

    return 0;

}
```
１行づつ説明していきたいですが今回は構築と実行にとどめておきます。

ではこれをコンパイルしてみましょう。


```
$ gcc hello.c
```

ではコンパイルされたものを確認してみます。

```
$ ls
a.out  hello.c
```
viなどのエディタで中身をみてみると何を書いてあるかわからないと思います。
このなにかわからないものを操作してプログラムを実行します。

では実行してみましょう。

```
$ ./a.out
hello world
```

「hello world」と表示されていれば成功です。

ですがこれでは実行する際に「a.out」だとわかりにくいと思います。
なので名前を指定してわかりやすくしてみます。

```
$ gcc -o hello hello.c 
```
これでhelloというファイルができたと思います。

```
$ ls
hello  hello.c
```

では実行してみます。

```
$ ./hello 
hello world
```
同じように「hello world」と表示されていれば成功です。

#まとめ
いかがだったでしょうか、まだ入り口の段階ですが簡単なコードでも色々な意味が込められています。
次回はそこを深堀していきたいと思います。
ElastAlert Kibana Pluginについて

# Kibana 7.10.0～8.9.0対応

設定ファイルの書き方が変わっています。
https://github.com/Karql/elastalert-kibana-plugin

# Kibana 6.8.1～6.8.12、7.5.1～7.9.3対応

https://github.com/nsano-rururu/elastalert-kibana-plugin

# bitsensor/elastalert-kibana-pluginの対応しているKibanaのVersion

https://github.com/bitsensor/elastalert-kibana-plugin

|Version|KibanaのVersion|
|:-----------------:|------------------|
|1.1.0|7.2.0、7.3.0、7.3.1、7.3.2、7.4.0、7.4.1、7.4.2、7.5.0|
|1.0.4|7.0.0、7.0.1、7.1.0、7.1.1|
|1.0.3|6.7.0、6.7.1、6.7.2、6.8.0|
|1.0.2|6.6.0、6.6.1、6.6.2|
|1.0.1|6.3.1、6.3.2、6.4.0、6.4.1、6.4.2、6.4.3、6.5.0、6.5.1、6.5.2、6.5.3、6.5.4|
|1.0.0|6.3.1、6.3.2、6.4.0、6.4.1|

# ライセンス

The 3-clause BSD license (Modified)

# kibana.yml

以下の設定があります

```
elastalert-kibana-plugin.enabled    # defaults to true
elastalert-kibana-plugin.serverHost # defaults to localhost
elastalert-kibana-plugin.serverPort # defaults to 3030
elastalert-kibana-plugin.serverSsl  # defaults to false
```

# できること

・ElastAlertのアラートルールディレクトリのルール作成・編集・削除・テスト

#  できないこと

・ElastAlertのアラートルールディレクトリ直下にディレクトリを作って、作ったディレクトリにアラートルールファイルを置いても画面からルールファイルの編集・削除ができない。
→アラートルールディレクトリ直下だけが管理対象になっている？

・アラートルールのテンプレートに対応していない
[Cant find templates anyomore #71](https://github.com/bitsensor/elastalert-kibana-plugin/issues/71)
[No rule templates showing up in 7.4.2 #142](https://github.com/bitsensor/elastalert-kibana-plugin/issues/142)

・アラートルールの一定期間無効化

# 課題

・Kibana 7.6.0～7.6.2、7.7.0、7.7.1、7.8.0の正式対応は、以下のプルリクエストが取り込まれる必要がある

[manually disabling payload validation on the routes to fix for Kibana 7.6.0 #148](https://github.com/bitsensor/elastalert-kibana-plugin/pull/148)

・最新版は、Kibana 6.8.1～6.8.10、7.5.1、7.5.2に対応した正式版のzipファイルは、公開されていない。
→package.jsonのkibanaのバージョンを変更すれば対象バージョンで動く
[kibana 6.8.1 support #117](https://github.com/bitsensor/elastalert-kibana-plugin/issues/117)
[Can't install elastalert-kibana-plugin-1.0.3-6.8.0.zip to Kibana 6.8.3 #123](https://github.com/bitsensor/elastalert-kibana-plugin/issues/123)
[Plugin elastalert-kibana-plugin [7.5.0] is incompatible with Kibana [7.5.1] #139](https://github.com/bitsensor/elastalert-kibana-plugin/issues/139)
[Plugin installation was unsuccessful due to error "Plugin elastalert-kibana-plugin [7.5.0] is incompatible with Kibana [7.5.2]" #146](https://github.com/bitsensor/elastalert-kibana-plugin/issues/146)
[Support for Kibana 7.5.1, 7.5.2, 7.6.0 and 7.6.1 #147](https://github.com/bitsensor/elastalert-kibana-plugin/issues/147)

・既に同じ名前のアラートルールがある状態で同じアラートルール名で作成すると後から作ったアラートルールの内容で上書きされる
[Create a new rule will overwrite an existed rule file #91](https://github.com/bitsensor/elastalert-kibana-plugin/issues/91)

・Kibanaの設定で背景色を変えても連動しない
[Detect and respect "dark theme" Kibana #124](https://github.com/bitsensor/elastalert-kibana-plugin/issues/124)
Pythonで毎日AtCoder #33

### はじめに
[前回](https://qiita.com/taxfree_python/items/01f120b190a72a22b198)
今日はAtCoder ProblemsのBoot camp for Beginnersを埋めていきます。難易度はMediumです。

### #33
[AGC029-A](https://atcoder.jp/contests/agc029/tasks/agc029_a)
1TLE

**考えたこと**
難しい。操作を行なうとBとWが入れかわります。最終的に、左にWが右にBが集まることになります。$W_i(1\leq i\leq N)$が左に行くためには、そのWよりも左にある全てのBに対して操作をしなければなりません。ですので、$W_i(1\leq i\leq N)$の左にあるBの数を足していけば正解です。

```python
s = list(input())

ans = 0
count_b = 0
n = len(s)
for i in range(n):
    if s[i] == 'B':
        count_b += 1
    if s[i] == 'W':
        ans += count_b

print(ans)
```

[ABC139-D](https://atcoder.jp/contests/abc139/tasks/abc139_d)
1WA

**考えたこと**
余りに関する問題です。$N$までの整数を並びかえた数列$P$に対して、$i(1\leq i \leq N$を$P_i$で割ったときの余りの合計の最大値を求めます。$P$は$N$までの整数が昇順で並んでいると考えます。そのまま操作を行うと余りの合計は0になります。$P$を右に一つずらすと$N-1$になります。$i$に対して$P_i$が1だけ小さいからです。ということは左にずらした時に余りの合計が最大になることが分かります。なぜなら、左にずらすと$i$に対して$P_i$が1だけ大きくなります。すると$i \% P_i = i$になります。$P_i=1$にだけ余りが0になることに注意すると、余りの合計は$\frac{N(N-1)}{2}$になります。詳しい証明は解説に載っています。

```python
n = int(input())

print(n*(n-1)//2)
```

### まとめ
最近、精進不足なので明日のABCが不安です。ではまた、おやすみなさい。
【Flutter】キーボード外タップで、キーボードを閉じる

## キーボードを閉じるには？

主に以下の２つの方法があります。
今回は、1の方法を紹介いたします。

1. キーボード外の画面タップでキーボードを閉じる
2. キーボード上に閉じるボタンを配置する

## キーボード外の画面タップでキーボードを閉じる

キーボードを閉じる処理は以下のコードです。

```Dart
FocusScope.of(context).unfocus()
```

画面タップ時に上記の処理を発火させるには、`GestureDetector`を使用して、以下のように記載いたします。

```Dart
GestureDetector(
          onTap: () => FocusScope.of(context).unfocus(),
          child: HomePage(),
        ),
```

だいたいこんな感じです

```Dart
class MyApp extends StatelessWidget {
  // This widget is the root of your application.
  @override
  Widget build(BuildContext context) {
    return MaterialApp(
      debugShowCheckedModeBanner: false,
      title: '',
      theme: ThemeData(
        primarySwatch: Colors.blue,
      ),
      home: GestureDetector(
          onTap: () => FocusScope.of(context).unfocus(),
          child: HomePage(),
        ),
    );
  }
}
```
なかまのはなし

一緒に目標を目指す仲間って、素晴らしいな！
という話です。

ただの自分語りなので、なんのタメにもなりません（笑）


##チョット自分のこと、話します

そもそもスクールに入ることを選んだ理由として
「独学は厳しいと自分で分かっていた」
ことが挙げられる。
#### 意思が弱いのだ(´・ω・｀)
って、大きな声で言うようなことでも無いが…

少々情けない話ではあるが、思い切って飛び込む世界だからこそ、道筋くらいは間違いなく行きたい。
　・カリキュラムが整っている
　・志が似たような人たちが集まっているはず
　・質問できる環境
　・卒業後のイメージ

こういった事への安心感としてスクールを選んだ。

##before COVIDｰ19
（みんな、新型コロナウィルスとか言ってるけど、正式名称COVID-19だからね）

基礎カリキュラムは順調？？に進んでいた。
平日は仕事終わりに自宅で学習、週末は渋谷の教室で学習という日々が１ヶ月半くらい続いた。

が、目に見えないヤツが来て、影響が出てきたのがちょうど応用カリキュラムに入ろうとする、2ndキックオフ直前だった。

##In the middle of the COVID-19
そこから教室には行けなくなったので、自宅での学習を強いられた。
これは由々しき事態である。
しつこいようだが、自宅で学習が継続できる自信が無いのだ。

それに加えて、連日感染者数は最高を更新。
仕事はどうなる？生活は？実家は大丈夫か？電車乗って大丈夫か？スーパー行っても大丈夫か？

考える事が以前より格段に増えた。不安要素ばかり。
体調も優れない。ほんとにネガティブ要素ばかりが毎日更新されていく。

自分の仕事は今のところ「大きな」影響は無いので、それだけが救いかな…

##仲間の存在
応用カリキュラムに入った途端、内容も求められるレベルもグッと上がった感じがした。
もちろんスムーズになんて事は進まない。
頭にも入ってきづらい。
（ヤバイ、続けられない…　　みんな、どうしてるかな）

##ネットMTG
顔が見れる、状況や想いを共有できるというのは、仮にその時に解決にならずとも
何かしら前を向けるきっかけになるんだと実感。

１時間の予定だったが、結局１時間半以上話していたか…
気持ちはみんな似通っていて、今後１週間事に共有の場を設けることに。

続けることは自分との戦い。
仲間の存在は、その助けになる。
悩みを共有できること、夢を語る事ができること、アドバイスし合えること
全てが互いのためになる

そう感じた。
有難い。「有難い」という言葉の意味をより感じた。

##これから、ここから
after COVID-19の世の中がどう変化していくのか？
どの世界で生きていくにしろ、ここには注目していかねばならない。
どんな世界になったとしても、生きていかなければならないのだから。

どう、自分を表現できるか。
ウィルスによって、人類は試されているのかもしれない。

ありきたりだけど大事なこと。
まずは、とにかく健康に。予防はしっかりと。
そして、適度に楽しみを見つけたり、身体を動かして「心」も健康に。

落ち着いたらみんなでメシ食ったり酒飲んだりしながら
笑って話がしたい。

###どうぞ、ご安全に。ご健康に。


以上
爆速で画像認識ができる！？Teachable Machineでカピバラとビーバー判別をしてみた

#概要
　
　テレビで動物番組や動画番組、ニュースなどに取り上げられる癒される動物といったらカピバラですよね。
私はビーバーが好きなのですが、動物園でビーバーを見ていた際にとなりにいた家族が「**カピバラだー！**」と喜ばれていました。こいつはビーバーだぞとは思いましたがいいだせず...。

　ビーバーとカピバラって似てるといわれると否定はできないので、少しは知ってもらいたいと思いカピバラとビーバーを機械学習で判別してみたいと思いました。

画像認識だけをお手軽にしたいので、何かないかと探していて見つけたのが**Teachable Machie**！
↓
↓

Googleが提供している、画像認識モデルをお手軽に作れるサービス、**Teachable Machin**を使ってみました！

　Teachable Machineでは、画像認識、音声認識、人のポーズを認識することができるようです。今回は画像認識をしてみます。

#できたもの
　最終的には、ビーバーまたはカピバラの画像をアップロードすると、その割合を返してくれるものが作れます。
↓ビーバーの場合
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/183282/77ca8b26-de76-4bf1-4f8c-63b79a4da73c.png)


　実際にTeachable Machineで画像認識モデルを作成している様子は[こちら](https://www.youtube.com/watch?v=dmQvUzSzOf0)です。

#使ってみる
　では、実際に使ってみましょう！必要な開発環境は次の通りです。

 - Google chorme
 - Webカメラ（PCにカメラが付いていない場合）
 - マイク（PCにマイクが付いていない場合）
 
　これだけです。

##Teachable Machinのサイトにアクセス！
　Google chormeでTeachable Machineのサイトにアクセスします。
https://teachablemachine.withgoogle.com/

アクセスすると次のようが画面が現れるので、「Get Started」をクリックします。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/183282/7bfc0644-45f4-118f-1e52-7d06057856e1.png)

##プロジェクト作成
　Get Startedすると新規プロジェクト作成画面に移ります。↓
左の「Image Project」で画像認識プロジェクトを作ります。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/183282/f2d6122b-36c8-e5c3-1e94-4f99748973e3.png)

　プロジェクト作成後、次のような画面に移ります。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/183282/1db56c4d-d7c9-0d92-f707-5b829792f3ec.png)

##学習用画像を入力する
　まずは学習させるための画像を２種類以上用意します。画面左が学習させたい画像、学習開始、学習後のプレビュー、といった風になっています。
　画像の入力にはカメラでキャプチャする方法と、画像ファイルを読み込む方法の２種類があります。今回は画像ファイルを読み込む方法で行きます。
　Uploadボタンをクリックして画像ファイルを入力します。**Class**というのが画像の種類を表しています。分かりづらいので、名前をlass1がビーバー、Class2がカピバラとします。

　入力できるとこのようになります。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/183282/17efe224-1eaf-2143-5043-f2b9149f9aec.png)

##学習開始！
　それでは学習をさせてみましょう。画面中央の「**Train Model**」をクリックすると学習が開始されます。
学習時間は画像の枚数によって長くなります。

##動きを確認！
　学習が完了すると、画面右側の**Preview**が使えるようになります。最初はWebカメラモードになっているので、Fileモードにします。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/183282/b90f9955-25ed-7024-7f4f-8dcc300a94bd.png)

　その後、てきとうな画像ファイルをPreview画面にアップロードすると、判別してくれます。試しにカピバラの画像をアップすると次のようになりました。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/183282/6eecbaac-ca22-5956-8484-10c31621ca2a.png)

ビーバーの場合。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/183282/ace851b6-7e1b-5d01-fc7c-cc3a60eb1d36.png)

　これでビーバーとカピバラの判別モデルを簡易的に作ることができました！！


#おわりに
　静的な画像であれば認識率は高いのではないかと思いますが、動物園で実際に動いている姿を撮って判別するにはまだまだ精度が足りないのではないかと思います。

　また、Teachable Machineにはjs学習済みモデルをエクスポートする機能があるので、いろんなサービスに埋め込めそうですね。
MacでMysql のインストール

仕事で、ローカルPCにMqsqlをセットアップしたのでメモ


1.環境構築
---

```
##brew を使ってインストール、
##まずは最新に
% brew update 
 ****

## mysqlインストール
% brew install mysql
Updating Homebrew...
==> Installing dependencies for mysql: openssl@1.1 and protobuf
==> Installing mysql dependency: openssl@1.1

## サービススタート
% mysql.server start
Starting MySQL
.. SUCCESS! 

## セキュリティ設定
% mysql_secure_installation

## ログイン
% mysql -uroot -p
Welcome to the MySQL monitor.  Commands end with ; or \g.
Your MySQL connection id is 8
Server version: 8.0.19 Homebrew



```

2. Mysqlのクライアント設定
---

いろいろ調べた結果こいつがよさそうなので設定。



その他
* taleplus いい感じのUIだけど、有料版を買えとうるさいのでダメ  
https://tableplus.com/



99.Mysqlのコマンドメモ
---
参考
https://dev.mysql.com/doc/refman/8.0/en/create-user.html

| コマンド       | 内容 |    備忘    |
|:-----------------|------------------:|:------------------:|
| T             |              This |        This        |
Leetcode 30 天挑戰, Week 2 Day 4, Diameter of Binary Tree, in Swift

資料結構和演算法： `Tree` `Backtracking`

突然就是樹了 :flushed:

- 挑戰頁面 - <https://leetcode.com/explore/challenge/card/30-day-leetcoding-challenge/529/week-2/3293/>
- 題目原頁面 - [543. Diameter of Binary Tree](https://leetcode.com/problems/diameter-of-binary-tree/)

## 思維

題目要問的是樹之中某兩個節點之間最長的距離，因此就意味要找樹的高。所以要 go deep 所以就可以先想到 DFS (深度優先搜尋) 和 backtracking 。

### Backtracking

而對於 backtracking 的 subroutine ，我們必須定義結束遞迴呼叫的條件。

#### 停止條件

- 當傳入的 root 為零，就回傳 0 不繼續執行

#### 走訪方式

- 用遞迴走訪左右節點，取得各自的樹高

因此可以拿左右的樹高做兩件事情

1. 算出這個節點出發的直徑和目前做大直徑比較，有大於的話則更新最大直徑。
2. 因為我們只關心最大的樹高，因此找出最大樹高並回傳

### 最大直徑

因為不能確定在樹的哪邊會拿到最大值，因此會需要在遞迴的過程之外有個變數來儲存這個值。並在走訪過程中不斷的檢查和更新她。

## 程式碼

``` swift
class Solution {
    func diameterOfBinaryTree(_ root: TreeNode?) -> Int {
        var result = 0
        height(root, &result)
        return result
    }

    @discardableResult
    func height(_ root: TreeNode?,_ result: inout Int) -> Int {
        if root == nil { return 0 }

        let left = height(root?.left, &result)
        let right = height(root?.right, &result)

        result = max(result, left + right)
        return max(left, right) + 1
    }
}
```

### 複雜度分析

令 n 為節點數

- 時間複雜度： O(n) 。因為我們必須走過每個節點知道所有的可能性
- 空間複雜度： O(n) 。每一個 subroutine 都會宣告 left 和 right 來暫存，所以實際上是 2n ，不過我們可以把它簡化成 n

### 結果

``` text
Runtime: 28 ms (93.83%)
Memory Usage: 21.7 MB
```

## 名稱

以樹的定義來看的話，題目中說的「深度」應該要叫「高」。不過我沒有這麼魔人，只是在命名方法的時候是有點想了一下到底該用哪個名稱好 XDDD
サーマルプリンタをCUPS経由で利用する(Raspberry Pi)

#経緯
サーマルプリンタと自作のプログラムを使って職場で発券機を運用しており
今まで、phpで組んだ発券機プログラムからphp_printer.dllを使ってサーマルプリンタに出力してきました。

閉じられた環境の中、不自由はありませんでしたが、Windows PCはイニシャルコストがばかにならないこと、不具合発生時のリカバリーが面倒なので、低コストかつ一度作ったSDイメージを使うことで容易に交換が可能なRaspberry Piで代替しようというのが始まりです。

#動作環境
- Raspberry Pi 3 Model A+
- Symcode 58MM USB サーマルレシートプリンター

#つまづいたところ
- サーマルプリンタお馴染みのESC/POSコマンドを使った制御方法（python-escpos）だと、印刷をしたあとプリンタを見失い、デバイス番号が変わって印刷ができなくなってしまう（lsusbでの挙動/原因究明諦めた）。Zijiang ZJ-58用のドライバをセットアップしてCUPS経由で印刷に成功した。

#手順
```
sudo apt install system-config-printer cups build-essential cmake libcups2-dev libcupsimage2-dev
```
もろもろインストール

```
git clone https://github.com/klirichek/zj-58
cd zj-58
cmake --build .
sudo make install
```
あとは、CUPSでプリンタのセットアップ(メニュー→設定→印刷設定→ロック解除→+Add→Unknown→Zijiang)
※ロック解除前にrootのパスワード設定(sudo passwd root)はしておくこと

印刷に成功して気付いたけどオートカッターなしモデルなので使い物にならない(´･_･`)
互換性のあるオートカッター付きサーマルプリンタをAmazonで買わなければ…

#参考資料
[Raspberry Piからサーマルプリンタに印刷命令を送りたい](https://teratail.com/questions/164766)
[klirichek/zj-58](https://github.com/klirichek/zj-58)
[Thermal Printer driver for CUPS, Linux, and Raspberry Pi: zj-58](http://scruss.com/blog/2015/07/12/thermal-printer-driver-for-cups-linux-and-raspberry-pi-zj-58/)
[Zj-58, Zj-80 and other receipt printers](https://github.com/klirichek/zj-58#building-and-installing)
OpenID2.0とOpenID Connect

# 経緯
OpenID2.0は開発を終了しているため、深刻な影響を及ぼすセキュリティホールが発見されても対応することが出来ません。
OpenID2.0からOpenID Connectへ認証基盤を移すことでセキュリティを維持することが出来ます。

# 基本概念のおさらい
本記事の目的はOpenID2.0とOpenID Connectの違いを理解できることとします。

## 認証(認可)
認証(認可)はユーザーごとに特定データへのアクセスを許すかどうかを決めるために実装されます。
これにより、他人の情報にアクセスできなく、他人が自分の情報にアクセスすることを防げます。
認証と認可は本来別の意味で使用されますが、大まかな流れの説明をしたいため説明は省略します。
認証にはID/PASS(クレデンシャル情報と言われます)などをコンテンツプロパイダ(認証を行う鯖、以下CP)が持ち判定する<font color="LightSalmon">内部認証</font>と
外部の認証基盤(Identity Provider、以下IdP)を使用して判定結果を貰う<font color="Indigo">外部認証</font>があります。
(内部認証は正式な用語ではないです)

AさんがCPにアクセスしてID-PASSを入力してログインできるのが<font color="LightSalmon">内部認証</font>です。
AさんがCPにアクセスした際に、CPがIdPに確認を取るのが<font color="Indigo">外部認証</font>です。
外部認証の例は、
AさんがCPでとあるキャリアのアカウントで決済を使用したい場合、
CPはAさんがそのキャリアと契約しているのかをIdPに判定してもらう時などです。

⭐️外部認証が内部認証と比較した際に優れているとされるのは以下の点です。
- 外部サービスのユーザー(ユーザー数●●●万人)をそのまま自サービスに持ち込める点
- ユーザーがID-PASSを忘れてしまうことによる利用者のドロップ率の低減
- 外部サービスで認証し、不正ユーザーなどはロックされるためセキュリティの担保
- IdPごとに独自の登録手順を踏むものの実装自体は簡単

## プロトコル
CP-IdP間での認証(認可)のやりとり順序(処理手順)に対して標準化された手法というものが存在しています。
このやりとり順序をプロトコルといい、認証プロトコルとして標準化された手法には
「OAuth 2.0」、「OpenID Connect」、「FIDO 2.0」、「SAML 2.0」などがあります。
今回はOpenIDの説明に留めます。

# OpenID
詳細な情報は [こちらのドキュメント](https://www.openid.or.jp/document/ "こちらのドキュメント")をご覧ください
https://www.openid.or.jp/document/

OpenID2.0は下記の性質のプロトコルです。

>あるユーザが認証された旨の情報、認証をどのように行ったかの情報、当該ユーザの属性情報を、要求元であるWebサイトに対して、提供元となるアイデンティティ・プロバイダが転送するプロトコルである
(引用:https://ja.wikipedia.org/wiki/OpenID_Authentication_2.0)

最近の動き(と言っても古いですが。。。)は下記になります。

>2008年1月30日 Yahoo JAPANが対応「Yahoo! Japan ID」でOpenID対応サイトが利用可能に（Internet Watch:インプレス）。
2008年10月29日 Google, Microsoft が OpenID 2.0 対応を発表[1]。
2014年2月26日、OpenID Connectによって置換えられた。
(引用:https://ja.wikipedia.org/wiki/OpenID_Authentication_2.0)

## OpenID2.0とOpenID Connectの違い
まず、OpenID ConnectはOpenIDと名前がついていますが、プロトコルとしてはOAuth2.0の流れを汲んだものです。
OpenID Connectが登場する前はOpenID2.0とOauth2.0が存在していました。
OAuth2.0の連携の仕組みはTwitterやFacebookなどの巨大SNSに広く親しまれていましたが、OpenID 2.0では、ID情報の連携はできるもののAPI連携には利用できないなど、課題が存在していました。
そのような状況を打開するべく、
OAuth 2.0をベースにOpenIDを設計し直したものが、OpenID Connectです。
じゃー全部OAuth2.0でいいじゃんという感じですが、
OAuthは認可(権利を与える)、OpenIDは認証(誰であるか確認する)という役割の違いがあります。

参考
https://www.openid.or.jp/document/
Pi Network(パイ　ネットワーク)とは？第2のビットコイン　もうスマホアプリで簡単マイニングができる

<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/617483/ff0a3ace-119f-4478-7939-5e3e41e1c56e.png" width=150 height=150/>

#Pi Network(パイ　ネットワーク)とは？

Pi Networkは米国のスタンフォードの博士出身の人達が研究し開発した仮想通貨です。

今のところは全世界中で凡そ450万人が参加し採掘をしています。
たった今でも採掘に参加している人たちは爆増している状況です。

#Pi Networkの特徴
１．シンプルさ。ビットコインと仮想通貨についてこれまで聞いたことがないユーザーは、苦労せずにPI仮想通貨をマイニングして使用することができます。
２．公正な分配。採掘されるコインの数は、デバイスの性能に依存しません。
３．追加収益。プラットフォームの開発に貢献したユーザーには報酬が与えられます。

```

コンピューティング能力に貢献することなくマイニングを可能にするため、
このコインは、暗号ポートフォリオを拡大しようとするすべての人にとって興味深いかもしれません。
マイニングパワーと乗算係数は、とりわけ、参照されたユーザーの数に依存します。
これは、受動的収入と長期的な投資の源として最適です。

```
- 一日でたった一分で採掘を継続可能です、そしてアプリを終了させても構わないです。

- スマホの性能に関わらない公平さのため、最高です。

#Pi Network(パイ　ネットワーク)に対して主観的な意見
採掘の速度が結構早いです。
もう残り少ないビットコイン（Bitcoin-BTC)を狙うのではなく未来に新たな自分の資産になる`Pi Network`を目指すタイミングだと思います。
この世に姿を現したばかりのコインなので、今ならさんざん稼げる機会かもしれません。

![KakaoTalk_20200331_012020239.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/617483/3c9d6a82-7cb8-a50f-a1bf-b3b2f89f1401.jpeg)
今、外国の相場は約30円で取引されていますが、いつ急騰するか誰も知らないです。


#Pi Networkの始め方

１．まずは、アプリケーションをインストールします。
アンドロイド、アップルストアどっちも`Pi Network`で検索できます。
<img alt="IMG_0005.PNG" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/617483/0de5100f-28f2-be38-6d76-74520f1423e9.png" width=300 height=500>

２．インストール完了後、アプリ起動し、新規登録をします。
facebookのIDをお持ちの方はfacebook認証をお勧めします。（簡単！）
携帯電話認証でも構わないです。
<img　alt="" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/617483/13b8e133-487a-25d5-b1c0-9a76f608406f.png" width=300 height=500>

３．facebookのIDとPASSWORDを入力して、認証を済ませます。
（携帯番号なら新規登録後、メニューのProfileから認証ができます。）
<img  src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/617483/18ecafb3-14df-f9d1-d6ec-632a27cbf81d.png" width=300 height=500>


4.　名前とこれから使う自分のユーザー名（招待コードに使われます）を入力します。
<img  src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/617483/95b54787-d7a5-82b6-b311-94a512d868de.png" width=300 height=500>


5.そして招待コードですが、こちらにぜひ`MGgood`をご入力ください。
招待コードの入力により採掘の速度を上げることができます。
<img  src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/617483/f950341c-5f69-3d43-7c7e-7b6df67cc71c.jpeg" width=300 height=500>

6.これで終わりです。緑の⚡のところが今の採掘の速度を表示しています。
初めは採掘の状態になりますが、
これからは24時間に一度アプリを起動し、そのアイコンを押すだけで採掘を継続することができます。
<img alt="IMG_0004.PNG" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/617483/ee903411-6eda-76cc-2d04-5bf087661424.png" width=300 height=500>


お金持ちを目指しましょー
ScaffoldとRidgepoleによるMVC作成とスキーマ管理

# RubyonRailsによる開発
Railsを使用することで素早い開発を実現することができます。
小規模~中規模くらいの開発の時にはScaffoldなどの便利な機能や豊富なGemによりすぐにプロトタイプを作成できるRailsは便利です。
今回はそんな素早い開発を実現するScaffoldによるMVCの一括作成とRidgepoleによるスキーマ管理について記載します。

# 今回扱うもの
- Scaffold
- Ridgepole

## Scaffold
RailsTutorialにもある便利なコマンドです。
作成したい時は

```sh
rails g scaffold user nickname:string age:integer registered_at:datetime
```
削除したい時は

```
rails d scaffold user 
```
です!
ただし空のscssファイルがuntrackedとして残るので完全に戻すにはcheckoutする必要があります。
(最初からcheckoutしても変わりません)

使用できるデータ型は

|  | mysql | sqlite | postgresql |
|---|---|---|---|
|:binary|	bolb|	bolb|	bytea|
|:boolean|	tinyint(1)|	boolean|	boolean|
|:date|	date|	date|	date|
|:datetime|	datetime|	datetime|	timestamp|
|:decimal|	decimal|	decimal|	decimal|
|:float|	float|	float|	float|
|:integer|	int(11)|	integer|	integer|
|:string|	varchar(255)|	varchar(255)|	character varying(256)|
|:text|	text|	test|	text|
|:time|	time|	datetime|	time|
|:timestamp|	datetime|	datetime|	timestamp|

(引用:https://whitech0c0late.hatenablog.com/entry/2012/09/07/183229)

rails g コマンドで作成されるもの

|コマンド|コントローラ|ビュー|モデル|マイグレーションファイル|ルーティング|
|------|-----|-----|-----|-----|-----|
|controller|○|○|×|×|○|
|model|	×|×|○|○|×|
|migration|×|×|×|○|×|
|scaffold|○|○|○|○|○|

マイグレートは別途必要になります。

```sh:sh
rails db:migrate
```

## Ridgepole
スキーマの変更・管理がマイグレーションファイルよりわかりやすく、
コマンド一発で変更できるので使用しています。
gemfileに

``` sh:gemfile
gem 'ridgepole' 
```

を記述し、

```sh:sh
bundle install
```
これで導入は完了。
dbディレクトリ配下にSchemafileを作成されているので、スキーマを記述していく。

```sh:db/Schemafile
create_table "users", force: :cascade do |t|
  t.string "name"
  t.integer "age"
  t.string "email"
  t.string "icon"
  t.string "comment"
  t.datetime "created_at", null: false
  t.timestamp "updated_at", null: false
  t.index ["member_id"], name: "index_member_id_on_users"
end
```
実行コマンドは、

```sh:development環境の場合
bundle exec ridgepole -c config/database.yml -E development --apply -f db/Schemafile
```
プライマリのidは書きません。
optionにinnoDBをつけることもありますがrailsの場合デフォルトはsqliteのため、サンプルコードから消してます。(つけた場合、エラーで落ちます)
sequelize.jsを使ってみる。

# sequelize.jsとは
node環境でDBを操作するための便利なライブラリです。
サーバーサイドをnode.jsで実装する際にexpress.jsと合わせて使用します。

CLIによるモデルの作成とDBマイグレーションについて説明した後、
ORMとしてのサーバーサイドでの呼び出し方法について記載します。

詳細はこちらをご参考ください。→https://sequelize.org/master/

# 導入方法
npm install --saveする。

```sh
npm install --save sequelize
```

## モデルの作成とDBマイグレーション
モデル作成とDBへのマイグレーションはsequelize-cliを使用します。
###インストール

```sh

npm install --save sequelize-cli
```

### 初期化処理

```sh
./node_modules/sequelize-cli/lib/sequelize init
```
コマンドを打つと、config、migrations、modelsといったディレクトリが作成されます。
config/config.jsonにDBへの接続設定を記入します。
migrationsはマイグレーションの管理をし、
modelsはモデルの管理をします。

モデルの作成

```sh
node_modules/.bin/sequelize model:create --name User --attributes userid:string,name:string,photo:text
```

DBへのマイグレーション

```sh

node_modules/.bin/sequelize db:migrate
```

#2,呼び出し方と使い方
サーバーサイドでの呼び出し方と使い方について記載します。

## 呼び出し方

```hoge.js
#オペレーションの導入(ver4.x~)
const { Op } = require('sequelize');
require('sequelize');

#モデルの定義(cliで作成していた場合)
上記cliで作成したModelを呼び出します。
const { models: { Hoge,Fuga } } = require('cliで作成したモデルのPATH');

#参考:モデルから読み込まれる部分(これがcliで作成したmodelの中に記載されています)
sequelize.define('ModelName', {
    id: { type: DataTypes.INTEGER, primaryKey: true },
    name: DataTypes.STRING,
  }, {
    timestamps: false,
  });
```
という感じです。


## 使い方
シンタックスには若干癖があります。
代表例としてSELECT文とUPDATE文を記載します。
返却されるのはPromiseオブジェクトです。
取得した後にthenのメソッドチェーンなどを使用することも可能です。

```hoge.js
# SELECT (SELECT userid as fuga,name FROM Hoge WHERE userid = userid)
Hoge.findAll({
        attributes: [['userid', 'fuga'],['name', 'name']],
        where: {[Op.or]: [{userid: {[Op.eq]: userid}}]},
      }));

# UPDATE (UPDATE Hoge SET userid=userid,name=name WHERE userid=userid)
Hoge.update({ userid: userid, name: name }, { where: {userid: userid} });
```



# こんなエラーが出た
DeprecationWarning: String based operators are deprecated
という内容のエラーが出ることがあります。
要約すると、古いバージョンの書き方だから非推奨です。ということですが、
"sequelize": "^5.8.6"(4.44.3でエラーが出ました)のような感じでpackage.jsonを書き直すと直ります。


```
DeprecationWarning: String based operators are deprecated. Please use Symbol based operators for better security, read more at https://sequelize.org/master/manual/querying.html#operators
```

# まとめ
クライアントをjavascriptフレームワーク使うなら、
サーバーサイドもjavascript(node.js)で書きたいということや、
大量のアクセスやリアルタイム処理に強いので、node.jsやexpress.jsを使用したいということもあるかと思います。
その際のDB周りの処理でsequelize.jsは便利です。
お役にたちましたら幸いです。
エンジニア(ノンデザイナー)のためのガワだけ実装(Laravelとテンプレート)

# 概要
プロダクトを思いついて、ちょっと作ってみたいと思うことがあります。
しかし、エンジニアの中にはフロントもサーバーもコードはかけてもデザインのことになると、あまり自信がない人も多いと思います。(余白の使い方とか色の統一感とかとか)
そんな人のために高速でそれっぽい見た目を作る方法を説明します。

##よくあるデザインの準備の仕方
デザインを調達するにはいくつかの方法があり、以下のような方法がメジャーであると思います。
・ 自分でAdobeXDやfigma、スケッチなどのツールを駆使してデザインをする。
・ 知り合いに頼む
・ 外注する

ただし、これらの方法はお金や技術的な制約から難しいことや、そこまで本格を求めていないこともあります。
最近はAdobeXDワイヤーフレーム制作用の無料UIキットの日本語版Wires jpなど便利なものもありますが、やはり、デザインツールには学習コストがあります。
そんな人にオススメしたいのがガワだけ実装です。

## ガワだけ実装とは？
Laravel(などのフルスタックフレームワーク)に無料のテンプレートを乗せることです。
レスポンシブ対応まで入っていると後々楽です。

## なぜLaravelか
テンプレートの提供されている形式(cssやjavascript)を何も考えずそのままコピペして使うにはLaravelが一番楽で早かったので推奨しています。
Railsは個人的にあまり慣れていないこともありファイル形式を整えたり、手間がかかりました。

## 探し方
「free frontend template」のような感じで検索するといくつか無料のテンプレートがみつかるのでそれをLaravelにコピペします

以下に参考サイトを記載します。
中には有料のものもまざっているかもしれませんので、
ダウンロードやご使用に関してはライセンスや利用規約をよくご確認の上、自己責任でお願いします。

無料bootstrap template
https://themefisher.com/free-bootstrap-templates/

マテリアライズ(Starter TemplateとParallax Template)
https://materializecss.com/getting-started.html

## その他
サーバーサイドまですぐにかけるようにフルスタックフレームワークとしてLaravelをご紹介しましたが、フロントだけ良い場合は、そのようなテンプレートを探すとよいかもしれません。
下記はvue.jsでMITライセンスで提供されているものです。
vue-stic admiin
表や図など豊富で綺麗なUIライブラリがあります。
https://github.com/epicmaxco/vuestic-admin