OmniAICreator/Qiita-1.07M huggingface dataset:
【PyTorch】サンプル④ 〜Defining New autograd Functions（自動微分関数の定義）〜

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/587891/b676b25e-f9b2-9053-cb16-a63b7ed51ad1.png)
###目的
PyTorchのチュートリアル[PyTorch: Defining New autograd Functions](https://pytorch.org/tutorials/beginner/examples_autograd/two_layer_net_custom_function.html#sphx-glr-beginner-examples-autograd-two-layer-net-custom-function-py)を参考にPyTorchテンソル(tensor)と<span style="color: #ff5252">自動微分(autograd)</span>を使って、損失(loss)や重み(weight)の計算をする。

前回の、[【PyTorch】サンプル③ 〜TENSORS AND AUTOGRAD（テンソルと自動微分）〜](https://www.aiprogrammers.net/entry/2020/04/25/194823)では、自動微分の基本的な扱いをご紹介しました。

今回は、前回使用した<span style="color: #ff5252">自動微分のコードを関数化</span>してみましょう。

詳しい解説とコードは、「[【PyTorch】サンプル④ 〜Defining New autograd Functions（自動微分関数の定義）〜](https://www.aiprogrammers.net/entry/2020/04/26/194122)」をご覧ください。


# チュートリアル

- [【PyTorch】チュートリアル(日本語版 )① 〜テンソル〜](https://www.aiprogrammers.net/entry/2020/04/13/014852)
- [【PyTorch】チュートリアル(日本語版 )② 〜AUTOGRAD〜](https://www.aiprogrammers.net/entry/2020/04/13/232357)
- [【PyTorch】チュートリアル(日本語版 )③ 〜NEURAL NETWORKS（ニューラルネットワーク）〜 ](https://www.aiprogrammers.net/entry/2020/04/18/035524)
- [【PyTorch】チュートリアル(日本語版 )④ 〜TRAINING A CLASSIFIER（画像分類）〜](https://www.aiprogrammers.net/entry/2020/04/18/152115)

# サンプル

- [【PyTorch】サンプル① 〜NUMPY〜](https://www.aiprogrammers.net/entry/2020/04/24/092500)
- [【PyTorch】サンプル② 〜TENSOR (テンソル) 〜](https://www.aiprogrammers.net/entry/2020/04/25/190705)
- [【PyTorch】サンプル③ 〜TENSORS AND AUTOGRAD（テンソルと自動微分）〜](https://www.aiprogrammers.net/entry/2020/04/25/194823)
- [【PyTorch】サンプル④ 〜Defining New autograd Functions（自動微分関数の定義）〜](https://www.aiprogrammers.net/entry/2020/04/26/194122)
- [【PyTorch】サンプル⑤ 〜Static Graphs（静的グラフ）〜](https://www.aiprogrammers.net/entry/2020/04/27/191856)
- [【PyTorch】サンプル⑥ 〜 nn パッケージ 〜](https://www.aiprogrammers.net/entry/2020/05/02/190000)
- [【PyTorch】サンプル⑦ 〜 optim パッケージ 〜](https://www.aiprogrammers.net/entry/2020/05/03/190000)
- [【PyTorch】サンプル⑧ 〜 複雑なモデルの構築方法 〜](https://www.aiprogrammers.net/entry/2020/05/04/183000)
- [【PyTorch】サンプル⑨ 〜 動的グラフ 〜](https://www.aiprogrammers.net/entry/2020/05/05/190000)
【PyTorch】サンプル⑤ 〜Static Graphs（静的グラフ）〜

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/587891/b676b25e-f9b2-9053-cb16-a63b7ed51ad1.png)
###目的
Deep Learning(ディープラーニング)で、よく使われるTensorFlowを使って計算グラフの設計からニューラルネットワークの学習をする。

PyTorchが採用している<span style="color: #ff5252">動的グラフ</span>を理解するために、<span style="color: #2196f3">静的グラフ</span>の代表であるTensorFlowに触れる。


詳しい解説とコードは、「[【PyTorch】サンプル⑤ 〜Static Graphs（静的グラフ）〜](https://www.aiprogrammers.net/entry/2020/04/27/191856)」をご覧ください。


# チュートリアル

- [【PyTorch】チュートリアル(日本語版 )① 〜テンソル〜](https://www.aiprogrammers.net/entry/2020/04/13/014852)
- [【PyTorch】チュートリアル(日本語版 )② 〜AUTOGRAD〜](https://www.aiprogrammers.net/entry/2020/04/13/232357)
- [【PyTorch】チュートリアル(日本語版 )③ 〜NEURAL NETWORKS（ニューラルネットワーク）〜 ](https://www.aiprogrammers.net/entry/2020/04/18/035524)
- [【PyTorch】チュートリアル(日本語版 )④ 〜TRAINING A CLASSIFIER（画像分類）〜](https://www.aiprogrammers.net/entry/2020/04/18/152115)

# サンプル

- [【PyTorch】サンプル① 〜NUMPY〜](https://www.aiprogrammers.net/entry/2020/04/24/092500)
- [【PyTorch】サンプル② 〜TENSOR (テンソル) 〜](https://www.aiprogrammers.net/entry/2020/04/25/190705)
- [【PyTorch】サンプル③ 〜TENSORS AND AUTOGRAD（テンソルと自動微分）〜](https://www.aiprogrammers.net/entry/2020/04/25/194823)
- [【PyTorch】サンプル④ 〜Defining New autograd Functions（自動微分関数の定義）〜](https://www.aiprogrammers.net/entry/2020/04/26/194122)
- [【PyTorch】サンプル⑤ 〜Static Graphs（静的グラフ）〜](https://www.aiprogrammers.net/entry/2020/04/27/191856)
- [【PyTorch】サンプル⑥ 〜 nn パッケージ 〜](https://www.aiprogrammers.net/entry/2020/05/02/190000)
- [【PyTorch】サンプル⑦ 〜 optim パッケージ 〜](https://www.aiprogrammers.net/entry/2020/05/03/190000)
- [【PyTorch】サンプル⑧ 〜 複雑なモデルの構築方法 〜](https://www.aiprogrammers.net/entry/2020/05/04/183000)
- [【PyTorch】サンプル⑨ 〜 動的グラフ 〜](https://www.aiprogrammers.net/entry/2020/05/05/190000)
【Linux】IPv6無効化設定

次世代通信プロトコルIPv6!!
とは言いながらあんまり普及してないような気が…
割と他の通信の邪魔をしがちなので無効化します。

CentOS7.4,Ubuntu16.4で確認済み

```
ip a
```
有効になっていると以下のようにinet6が出てきます。こいつ↓です。
`inet6 fe80::4dd:7eff:fe3d:383f/64 scope link`
<br>
無効化には/etc/sysctl.confに項目を追加します。

```java:/etc/sysctl.conf
net.ipv6.conf.all.disable_ipv6 = 1
net.ipv6.conf.default.disable_ipv6 = 1
```
<br>
設定反映

```
sysctl -p
```

確認するとinet6が消えています。
IPv6も今後は確実に必要になってきそうですがね…↓
https://ja.wikipedia.org/wiki/IP%E3%82%A2%E3%83%89%E3%83%AC%E3%82%B9%E6%9E%AF%E6%B8%87%E5%95%8F%E9%A1%8C

<br>
いじょ
【PyTorch】サンプル⑥ 〜 nn パッケージ 〜

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/587891/b676b25e-f9b2-9053-cb16-a63b7ed51ad1.png)
###目的
- [PyTorch: nn](https://pytorch.org/tutorials/beginner/examples_nn/two_layer_net_nn.html#sphx-glr-beginner-examples-nn-two-layer-net-nn-py)を参考にPyTorchの```nn```パッケージを扱う。
- ```nn```パッケージの便利さを感じる。

詳しい解説とコードは、「[【PyTorch】サンプル⑥ 〜 nn パッケージ 〜](https://www.aiprogrammers.net/entry/2020/05/02/190000)」をご覧ください。


# チュートリアル

- [【PyTorch】チュートリアル(日本語版 )① 〜テンソル〜](https://www.aiprogrammers.net/entry/2020/04/13/014852)
- [【PyTorch】チュートリアル(日本語版 )② 〜AUTOGRAD〜](https://www.aiprogrammers.net/entry/2020/04/13/232357)
- [【PyTorch】チュートリアル(日本語版 )③ 〜NEURAL NETWORKS（ニューラルネットワーク）〜 ](https://www.aiprogrammers.net/entry/2020/04/18/035524)
- [【PyTorch】チュートリアル(日本語版 )④ 〜TRAINING A CLASSIFIER（画像分類）〜](https://www.aiprogrammers.net/entry/2020/04/18/152115)

# サンプル

- [【PyTorch】サンプル① 〜NUMPY〜](https://www.aiprogrammers.net/entry/2020/04/24/092500)
- [【PyTorch】サンプル② 〜TENSOR (テンソル) 〜](https://www.aiprogrammers.net/entry/2020/04/25/190705)
- [【PyTorch】サンプル③ 〜TENSORS AND AUTOGRAD（テンソルと自動微分）〜](https://www.aiprogrammers.net/entry/2020/04/25/194823)
- [【PyTorch】サンプル④ 〜Defining New autograd Functions（自動微分関数の定義）〜](https://www.aiprogrammers.net/entry/2020/04/26/194122)
- [【PyTorch】サンプル⑤ 〜Static Graphs（静的グラフ）〜](https://www.aiprogrammers.net/entry/2020/04/27/191856)
- [【PyTorch】サンプル⑥ 〜 nn パッケージ 〜](https://www.aiprogrammers.net/entry/2020/05/02/190000)
- [【PyTorch】サンプル⑦ 〜 optim パッケージ 〜](https://www.aiprogrammers.net/entry/2020/05/03/190000)
- [【PyTorch】サンプル⑧ 〜 複雑なモデルの構築方法 〜](https://www.aiprogrammers.net/entry/2020/05/04/183000)
- [【PyTorch】サンプル⑨ 〜 動的グラフ 〜](https://www.aiprogrammers.net/entry/2020/05/05/190000)
【PyTorch】サンプル⑦ 〜 optim パッケージ 〜

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/587891/b676b25e-f9b2-9053-cb16-a63b7ed51ad1.png)
###目的
- [PyTorch: optim](https://pytorch.org/tutorials/beginner/examples_nn/two_layer_net_optim.html#sphx-glr-beginner-examples-nn-two-layer-net-optim-py)を参考にPyTorchの```optim```パッケージを使って最適化関数(optimizer)を定義する。


詳しい解説とコードは、「[【PyTorch】サンプル⑦ 〜 optim パッケージ 〜](https://www.aiprogrammers.net/entry/2020/05/03/190000)」をご覧ください。


# チュートリアル

- [【PyTorch】チュートリアル(日本語版 )① 〜テンソル〜](https://www.aiprogrammers.net/entry/2020/04/13/014852)
- [【PyTorch】チュートリアル(日本語版 )② 〜AUTOGRAD〜](https://www.aiprogrammers.net/entry/2020/04/13/232357)
- [【PyTorch】チュートリアル(日本語版 )③ 〜NEURAL NETWORKS（ニューラルネットワーク）〜 ](https://www.aiprogrammers.net/entry/2020/04/18/035524)
- [【PyTorch】チュートリアル(日本語版 )④ 〜TRAINING A CLASSIFIER（画像分類）〜](https://www.aiprogrammers.net/entry/2020/04/18/152115)

# サンプル

- [【PyTorch】サンプル① 〜NUMPY〜](https://www.aiprogrammers.net/entry/2020/04/24/092500)
- [【PyTorch】サンプル② 〜TENSOR (テンソル) 〜](https://www.aiprogrammers.net/entry/2020/04/25/190705)
- [【PyTorch】サンプル③ 〜TENSORS AND AUTOGRAD（テンソルと自動微分）〜](https://www.aiprogrammers.net/entry/2020/04/25/194823)
- [【PyTorch】サンプル④ 〜Defining New autograd Functions（自動微分関数の定義）〜](https://www.aiprogrammers.net/entry/2020/04/26/194122)
- [【PyTorch】サンプル⑤ 〜Static Graphs（静的グラフ）〜](https://www.aiprogrammers.net/entry/2020/04/27/191856)
- [【PyTorch】サンプル⑥ 〜 nn パッケージ 〜](https://www.aiprogrammers.net/entry/2020/05/02/190000)
- [【PyTorch】サンプル⑦ 〜 optim パッケージ 〜](https://www.aiprogrammers.net/entry/2020/05/03/190000)
- [【PyTorch】サンプル⑧ 〜 複雑なモデルの構築方法 〜](https://www.aiprogrammers.net/entry/2020/05/04/183000)
- [【PyTorch】サンプル⑨ 〜 動的グラフ 〜](https://www.aiprogrammers.net/entry/2020/05/05/190000)
【PyTorch】サンプル⑧ 〜 複雑なモデルの構築方法 〜

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/587891/b676b25e-f9b2-9053-cb16-a63b7ed51ad1.png)
###目的
このチュートリアルに至るまでは、ニューラルネットワークモデルの定義を積み木を積み重ねるように単純なシーケンス```torch.nn.Sequential```で構築していました。

この```torch.nn.Sequential```を用いた方法は、モデルの定義が簡単である反面、ネットワーク構造も簡素なものしか作ることができません。

例えば、```torch.nn.Sequential```では、ResNetネットワーク構造を構築することがきません。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/587891/8b1345ae-3bee-13ee-ebff-0b5ff13896d0.png)
(Credit:Deep Residual Learning for Image Recognition. Kaiming He, Xiangyu Zhang, Shaoqing Ren, Jian Sun. arXiv:1512.03385 [cs.CV]
  	(or arXiv:1512.03385v1 [cs.CV] for this version) )

このチュートリアルでは、[PyTorch: Custom nn Modules](https://pytorch.org/tutorials/beginner/examples_nn/two_layer_net_module.html#sphx-glr-beginner-examples-nn-two-layer-net-module-py)を参考に、より<span style="color: #ff5252">複雑なニューラルネットワークのモデルが構築</span>できる方法を紹介します。

詳しい解説とコードは、「[【PyTorch】サンプル⑧ 〜 複雑なモデルの構築方法 〜](https://www.aiprogrammers.net/entry/2020/05/04/183000)」をご覧ください。


# チュートリアル

- [【PyTorch】チュートリアル(日本語版 )① 〜テンソル〜](https://www.aiprogrammers.net/entry/2020/04/13/014852)
- [【PyTorch】チュートリアル(日本語版 )② 〜AUTOGRAD〜](https://www.aiprogrammers.net/entry/2020/04/13/232357)
- [【PyTorch】チュートリアル(日本語版 )③ 〜NEURAL NETWORKS（ニューラルネットワーク）〜 ](https://www.aiprogrammers.net/entry/2020/04/18/035524)
- [【PyTorch】チュートリアル(日本語版 )④ 〜TRAINING A CLASSIFIER（画像分類）〜](https://www.aiprogrammers.net/entry/2020/04/18/152115)

# サンプル

- [【PyTorch】サンプル① 〜NUMPY〜](https://www.aiprogrammers.net/entry/2020/04/24/092500)
- [【PyTorch】サンプル② 〜TENSOR (テンソル) 〜](https://www.aiprogrammers.net/entry/2020/04/25/190705)
- [【PyTorch】サンプル③ 〜TENSORS AND AUTOGRAD（テンソルと自動微分）〜](https://www.aiprogrammers.net/entry/2020/04/25/194823)
- [【PyTorch】サンプル④ 〜Defining New autograd Functions（自動微分関数の定義）〜](https://www.aiprogrammers.net/entry/2020/04/26/194122)
- [【PyTorch】サンプル⑤ 〜Static Graphs（静的グラフ）〜](https://www.aiprogrammers.net/entry/2020/04/27/191856)
- [【PyTorch】サンプル⑥ 〜 nn パッケージ 〜](https://www.aiprogrammers.net/entry/2020/05/02/190000)
- [【PyTorch】サンプル⑦ 〜 optim パッケージ 〜](https://www.aiprogrammers.net/entry/2020/05/03/190000)
- [【PyTorch】サンプル⑧ 〜 複雑なモデルの構築方法 〜](https://www.aiprogrammers.net/entry/2020/05/04/183000)
- [【PyTorch】サンプル⑨ 〜 動的グラフ 〜](https://www.aiprogrammers.net/entry/2020/05/05/190000)
BonRecTest のエラー

# 概要
BonRecTest の状態が悪く、Mirakurun が動かず困ったので記録を残します。

```BonRecTest.exe --decoder B25Decoder.dll --driver BonDriver_PT3-S0.dll --output test.ts --channel 11```
上のコマンドをコマンドプロンプトで叩いてみて、BonDriver が動作するか確認する。

もし以下のエラーが出たときは

```
BonRecTest Could not load Decoder
```

Visual Studio 2017 の Microsoft Visual C++ 再頒布可能パッケージをインストールすれば解決します。
【PyTorch】サンプル⑨ 〜 動的グラフ 〜

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/587891/b676b25e-f9b2-9053-cb16-a63b7ed51ad1.png)
###目的
- PyTorchの特徴の一つである動的グラフに挑戦する。

詳しい解説とコードは、「[【PyTorch】サンプル⑨ 〜 動的グラフ 〜](https://www.aiprogrammers.net/entry/2020/05/05/190000)」をご覧ください。


# チュートリアル

- [【PyTorch】チュートリアル(日本語版 )① 〜テンソル〜](https://www.aiprogrammers.net/entry/2020/04/13/014852)
- [【PyTorch】チュートリアル(日本語版 )② 〜AUTOGRAD〜](https://www.aiprogrammers.net/entry/2020/04/13/232357)
- [【PyTorch】チュートリアル(日本語版 )③ 〜NEURAL NETWORKS（ニューラルネットワーク）〜 ](https://www.aiprogrammers.net/entry/2020/04/18/035524)
- [【PyTorch】チュートリアル(日本語版 )④ 〜TRAINING A CLASSIFIER（画像分類）〜](https://www.aiprogrammers.net/entry/2020/04/18/152115)

# サンプル

- [【PyTorch】サンプル① 〜NUMPY〜](https://www.aiprogrammers.net/entry/2020/04/24/092500)
- [【PyTorch】サンプル② 〜TENSOR (テンソル) 〜](https://www.aiprogrammers.net/entry/2020/04/25/190705)
- [【PyTorch】サンプル③ 〜TENSORS AND AUTOGRAD（テンソルと自動微分）〜](https://www.aiprogrammers.net/entry/2020/04/25/194823)
- [【PyTorch】サンプル④ 〜Defining New autograd Functions（自動微分関数の定義）〜](https://www.aiprogrammers.net/entry/2020/04/26/194122)
- [【PyTorch】サンプル⑤ 〜Static Graphs（静的グラフ）〜](https://www.aiprogrammers.net/entry/2020/04/27/191856)
- [【PyTorch】サンプル⑥ 〜 nn パッケージ 〜](https://www.aiprogrammers.net/entry/2020/05/02/190000)
- [【PyTorch】サンプル⑦ 〜 optim パッケージ 〜](https://www.aiprogrammers.net/entry/2020/05/03/190000)
- [【PyTorch】サンプル⑧ 〜 複雑なモデルの構築方法 〜](https://www.aiprogrammers.net/entry/2020/05/04/183000)
- [【PyTorch】サンプル⑨ 〜 動的グラフ 〜](https://www.aiprogrammers.net/entry/2020/05/05/190000)
【Python】縦断データの可視化（プロット・箱ひげ図・バイオリン図・信頼区間・ヒストグラム）

### 目的

- Pythonを用いて、縦断データ(beforeとafter)の可視化

主にやることは、

- プロット (dot plot)
- 箱ひげ図 (box plot)
- バイオリン図 (violin plot)
- 信頼区間 (CI bar)
- ヒストグラム (histogram)

最終的には、このような図を作成する。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/587891/bcbc2915-f678-05aa-d99e-68a2fa208240.png)


詳しい解説とコードは、「[【Python】縦断データの可視化（プロット・箱ひげ図・バイオリン図・信頼区間・ヒストグラム）](https://www.aiprogrammers.net/entry/2020/05/06/190000)」をご覧ください。
【Python】相関行列 (Correlation Matrix)とヒートマップ (Heat Map)の作り方

# 目的

- Pythonで相関行列 (Correlation Matrix)を作成。
- ヒートマップ (Heat Map)で図示。

詳しい解説とコードは、「[【Python】相関行列 (Correlation Matrix)とヒートマップ (Heat Map)の作り方](https://www.aiprogrammers.net/entry/2020/05/07/190000)」をご覧ください。
【MATLAB】ComBatを用いた交絡因子の排除 (実践編)

# 問題
グループ間の差を解析する際、計測した値は、年齢、性別、計測器等の交絡因子の影響を含む。


詳しい解説とコードは、「[【MATLAB】ComBatを用いた交絡因子の排除 (実践編)](https://www.aiprogrammers.net/entry/2020/03/12/020454)」をご覧ください。
【SPM】画像の解像度の変更(Coregistration)

# 目的

- 画像の位置は同じで解像度が異なる2枚の画像の解像度を合わせる
- [SPM](https://www.fil.ion.ucl.ac.uk/spm/)のCoregisterを用いる。


詳しい解説とコードは、「[【SPM】画像の解像度の変更(Coregistration)](https://www.aiprogrammers.net/entry/2020/05/28/154402)」をご覧ください。
KiCad初心者が基板を設計してPCBWayに発注するまでに必要な参考にしたサイトまとめ

一から基板設計してPCBWayに発注するまでに参考にしたサイトをまとめた

# 環境
OS:macOS Catalina 10.15.4
KiCad:5.1.2

## 一通りの流れを知る
これを読めば回路図作成〜基板レイアウト〜発注用ファイル出力までの流れがざっくり理解できる

- [KiCadで雑に基板を作る チュートリアル](https://www.slideshare.net/soburi/kicad-53622272)  
- [基板制作ツールKiCADをはじめてインストールしてから、MouserとかRSの部品情報を読み込み、基板を組み立てて、FusionPCBへ基板製造を発注するまでの手順を丁寧に説明してみました。](https://qiita.com/island_peak/items/)
- [KiCadで初めて基板をおこしてみた](https://qiita.com/nobu_e758/items/47ace2bcbd985b12e1c4)
- [KiCadで初めて部品実装基板をおこしてみた](https://qiita.com/nobu_e758/items/3a4ea1fa68601a07594e)

## 基板レイアウトの仕方
- [KiCad-Pcbnewの基板レイアウト方法](https://spiceman.jp/kicad-pcbnew-layout/#i-5)

## 貫通ビアの打ち方
- [KiCADのパターン配線方法](http://www.kicad.xyz/patern-haisen/)

## 基板発注用のデータ(ガーバーデータ)の出力方法
- [KiCadからデータを出力して、PCBWayにプリント基板を注文してみた](https://asukiaaa.blogspot.com/2018/05/pcbway.html)

## フットプリントの作り方
- [KiCadの回路記号＆フットプリントを作る方法](https://toragi.cqpub.co.jp/tabid/673/Default.aspx)
- [KiCad-フットプリントの作成方法](https://spiceman.jp/kicad-creating-footprint/#i-2)
- [KiCadで手軽に電子回路基板設計　フットプリントエディタの使い方](https://qiita.com/mat-MUNET/items/0fc8730ccc99f560a3d5)

## シンボルの作り方
- [KiCad-回路図シンボルの作成方法](https://spiceman.jp/kicad-creating-symbol/#i-2)

## シンボルとフットプリントの関連付け
- [KiCad-回路図シンボルの作成方法](https://spiceman.jp/kicad-symbol-footprint/)

## 3Dデータの作り方
- [KiCad 基板の 3D データをさくっと作り捨てる](https://qiita.com/nanbuwks/items/e87cc5c4b8cd2aa23233#kicad)

## スルーホール/ネジ穴の作り方
- [コンポーネントの作成](http://jaco.ec.t.kanazawa-u.ac.jp/edu/vlsi/kicad/07.html)
- [Kicad固定穴の打ち方](https://gsmcustomeffects.hatenablog.com/entry/2016/03/19/005643)

## ERC/DRCエラーの対処
- [エフェクター自作のKiCadの手癖](https://qiita.com/kinichiro/items/27e4f3f26d195f151014)
- [KiCad編 第4回　回路図エディタEeschemaの使い方　その3　ピン設定の変更](http://blog.handen.net/archives/4380666.html)

## その他
- [DCジャック変換基板の作成（６）　〜回路コンポーネントとフットプリントの紐つけ〜](http://www.kicad-de-kiban.net/archives/dcjack6.html)  
一般的な炭素皮膜抵抗,LEDなどのフットプリントについて
【Python】画像の類似度の計算（Dice係数）

### 目的
- NIFTI形式の画像からPythonを使ってDice係数を計算する。


詳しい解説とコードは、「[【Python】画像の類似度の計算（Dice係数）](https://www.aiprogrammers.net/entry/2020/06/10/184352)」をご覧ください。
【FSL】大脳基底核(Basal Ganglia)のセグメントと体積(Volume)計測

# 目的
- [FSL](https://www.fmrib.ox.ac.uk/fsl)を用いて大脳基底核(Basal Ganglia)のセグメントと体積(Volume)計測

詳しい解説とコードは、「[【FSL】大脳基底核(Basal Ganglia)のセグメントと体積(Volume)計測](https://www.aiprogrammers.net/entry/2020/06/11/222907)」をご覧ください。
【Linux】DICOMのソート処理

# 目的
- 様々なSeriesDescriptionで撮像されたDICOMデータから特定のSeriesDescriptionのDICOMデータのみを取り出す。
- シェルスクリプトで実行

詳しい解説とコードは、「[【Linux】DICOMのソート処理](https://www.aiprogrammers.net/entry/2020/06/12/142351)」をご覧ください。
【Linux】ファイルやフォルダを小分けにする方法

# 目的
並列でプログラムを実行したい場合、データセットを小分けにしたい場合がある。小分けにする数が多いほど手間がかかる。<br>
そこで、以下を目的とする。

- シェルスクリプトを使ってデータセット（ファイルやフォルダ）を小分けにする

詳しい解説とコードは、「[【Linux】ファイルやフォルダを小分けにする方法](https://www.aiprogrammers.net/entry/2020/06/17/192443)」をご覧ください。
【IBM Cloud】ポータブルストレージの切り離し

※2018年7月時点の記事です。

イメージから再デプロイする時にそういえば2ndDISKはどうなるんや？と思ったのでメモ。

イメージテンプレート自体は1stDISKしかとらないと思う（※選択で外部DISKもとれるが値段がバカ高くなる）ので、ポータブルDISKをつけていた場合は切り離しておく必要があります。


<font color="Blue">Softlayerカスタマーポータルの「ストレージ」タブ→ブロックストレージ</font>
のアクションメニューから切り離しができます。

たいてい、イメージテンプレートからの再デプロイ前後にイメージ元のVSIは削除すると思いますが、切り離しせずに削除するとポータブルDISKまで消えます。罠です。

 
付けたい時は各デバイス詳細画面の「ストレージ」タブから。消しちゃった場合は大人しく新規オーダーしましょう。

 

いじょう
【IBM Cloud】オブジェクトストレージにISOファイルを配置する

IBMCloudのオブジェクトストレージにisoファイルをアップロードして、イメージとしてVSIをブートさせるまでの方法です。
※2018年6月時点のものです。参考程度に。

前提
※ストレージは"Standard Regional Swift API"をオーダー済みであること。
※ストレージの管理権限がついていること

①ポータル上の「ストレージ」タブより、「オブジェクトストレージ」を選択する。
![20180615151444.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/673840/e9cb11e9-d755-6d9b-5e94-c6233c2b2399.jpeg)
画質悪すぎィ!
<br>
②「コンテナの追加」をクリックしてコンテナ名を入力する。
<br>
③作成したコンテナをクリックし、「ファイルの追加」
ってやればアップロードできるのですが、

**ポータル上からのファイルのアップロード・ダウンロードは最大サイズ20MBまで**
という制限があります。

(   ^ ω ^)・・・・なんも置けねえ

のでLinuxサーバ経由でファイルをアップロードします。
これであればサイズの制限がありません。


④LinuxにSwiftクライアントを導入
まず①の画面の「資格情報の表示」をクリック。
![20180615152507.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/673840/984d2f90-ec41-abf5-3028-52886dc259e8.jpeg)
「ユーザ名」、「パスワード」、「エンドポイントの認証」を確認する。

エンドポイントは、
外部接続できる端末から送信する場合は"パブリック"、
VSIなどSoftlayerのプライベートLANを持ったサーバから送信する場合は"プライベート"の方をメモしておく。
<br>
ファイルを送る側の端末にログインして、
pipコマンド、swift-clientをインストール。

```
yum install epel-release
yum install python-pip
pip install pip --upgrade
pip install python-swiftclient
```
<br>
環境変数設定

```java:~/.bash_profile 
export ST_AUTH=https://tok02.objectstorage.softlayer.net/auth/v1.0/
export ST_USER=xxxxxxxxxxxx
export ST_KEY=xxxxxxxxxxxxxxxxxx
```
USERとKEYにメモした資格情報を入力する。
AUTHは本手順ではSoftlayer外のインターネット接続のあるサーバからパブリック経由で送信。

反映

```
. ~/.bash_profile
```
<br>
⑤ファイルをアップロード

コンテナ一覧表示

```
swift list
```

コンテナ内のファイル一覧表示

```
swift list コンテナ名
```
ファイルをアップロード

```
swift upload コンテナ名 /xxxxx.iso --use-slo --segment-thread 30
```

完了するとポータル上からもみえてきます。が、ここまでだとまだ使用可能な状態ではありません。
<br>
⑥アップロードしたファイルをイメージとしてインポート

ポータルの「デバイス」⇒「管理」⇒「イメージ」
「イメージのインポート」タブをクリックする。
![20180615154915.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/673840/734125a3-1e65-17b7-8558-9dccd0541533.jpeg)
アカウント、クラスター、ファイルが格納されているコンテナ、ファイル名を選択してインポートする。

 
完了するとイメージテンプレートとして見えてきますので、
デバイス詳細画面で「イメージからブート」させることが可能になります。
イメージテンプレートは月$25/GBかかりますが、ファイル自体はオブジェクトストレージ分の課金だけで保管されているので、
使用後にイメージを削除して必要になったら随時インポートすればOK。


以上ぇ
【FSL】Affine変換（平行移動＋線形変換）

# 目的

- 異なる画像（NIFITI形式）の位置合わせをAffine変換（平行移動＋線形変換）を用いて実行する。

詳しい解説とコードは、「[【FSL】Affine変換（平行移動＋線形変換）](https://www.aiprogrammers.net/entry/2020/06/17/201609)」をご覧ください。
【Linux】su,sudo設定

基本ユーザにはrootになることを禁止し、
かつ
sudoコマンドを使った場合に証跡を残させたい
って時の設定。

CentOS7とUbuntu16.04で分けて書いていきます。

# 1.1 su禁止設定(CentOS) 
/etc/pam.d/su ファイルを編集します。
`auth required pam_wheel.so use_uid`のコメントを外します。

```java:/etc/pam.d/su
# Uncomment the following line to require a user to be in the "wheel" group.
auth required pam_wheel.so use_uid
```
これでwheelグループに属するユーザのみsuでき、他は禁止する設定となります。
<br>
# 1.2 su禁止設定(Ubuntu)
CentOSとファイルは同じですが項目の記載を変更します。
`group=adm`を追記します。

```java:/etc/pam.d/su
auth required pam_wheel.so group=adm
```
ubuntuにはwheelグループがないので、admにしておきます。
→admグループに所属するユーザのみがsuできる
という設定です。
<br>
# 2.sudo設定(共通) 
```
visudo
```
コマンドで /etc/sudoers ファイルを編集します。

書き方おさらい

```conf:visudo
ユーザー名 ALL = (ALL:ALL) ALL
```

ユーザー名 で権限を付けるユーザを指定。
先頭に%をつけるとグループ単位で指定できます。 

一つめのALLはホストに対する許可(たいていALLで大丈夫です。)

二つめのALLは"どのユーザになるか"

三つめのALLは上記のグループ版
コロン(:)をつけると指定できます。無しでもOK

四つめのALLは"どのコマンドを実行できるか"
コマンドのパスを,区切りで書いていきます。
また、コマンド先頭に!を付けると実行させないの意味となります。

```conf:visudo(例)
%group01 ALL=(ALL:ALL) ALL,!/bin/su,!/usr/sbin/visudo,!/usr/bin/bash,!/usr/bin/sh,!/usr/bin/vi /etc/sudoers
```
→group01グループに属するユーザはすべてのコマンドを全てのユーザとしてsudoで実行できる。ただしsuとsudoersファイルの編集はできない。


ちなみに、
禁止したいコマンドを1つにまとめることもできます。

```conf:visudo(禁止するコマンドをまとめる)
##kinshi
Cmnd_Alias KINSHI = /bin/su,/usr/sbin/visudo
dangogrp ALL=(ALL) ALL, !KINSHI 
```
こんな感じで。
禁止設定自体を変更されるのを防ぐためsudoでsuコマンド,sudoers編集を禁止しておきましょう。

※
上記の方法は完全に禁止できるわけではなく、 抜け道があります。
例えば、シェルコマンドを別のディレクトリにコピーする、別名にする、外部コマンドを起動する、上記で禁止している以外のシェルコマンドを使うなど。
対応策としてコマンドの許可をホワイトリスト形式にする等ありますが、運用が大変な気がします、、、 
<br>
# 3 sudoの証跡を残す(syslogの設定ファイルのみOSで異なる) 

実行結果自体は監査ログに吐かれているのですが、
CentOS：`/var/log/secure`
Ubuntu：`/var/log/auth.log`

これらのファイルが実行結果に埋もれてしまうので、出力先を変更しましょう。
ログを出力するファイルを作成して所有者とグループを変更しておきます。
(CentOSのログファイル所有者はrootなので変更なしでOK)

```
touch /var/log/sudo.log
chown syslog /var/log/sudo.log
chgrp adm /var/log/sudo.log
```


## /etc/sudoersの設定
```
visudo
```
でsyslogへ転送する設定を行います。
Defaultsが並んでいる箇所の下に追記

```conf:visudo(/etc/sudoers)
#sudolog
Defaults syslog=local3
```
local3の部分は0-7のどれでもかまいません。空いてるやつで。

## syslogの設定
・Centosの場合

```
vi /etc/rsyslog.conf 
```
・ubuntuの場合

```
vi /etc/rsyslog.d/50-default.conf
```

以下を追記。先ほどのlocalの番号に合わせます。

```
#sudo log
local3.*　　　　-/var/log/sudo.log
```
syslogサービス再起動

```
systemctl restart rsyslog
```
<br>
これで作成した/var/log/sudo.logにsudoコマンドの証跡が残ります。
試しにroot権限でls -lコマンドを実行すると、

```
sudo ls -l /
```

ログにはこんな感じで残ります。

```java:/var/log/sudo.log
May 28 14:16:10 host01 sudo: user01 : TTY=pts/0 ; PWD=/home/user01 ; USER=root ; COMMAND=/bin/ls -l
```
<br>
これでユーザがroot権限でやばいコマンド打っても特定・説教できますね。

以上お
【Ubuntu】パッケージの自動更新を無効にする

Ubuntuはデフォルトで定期的にパッケージの自動更新を行うようになっています。
便利なようでわりと迷惑なので無効化。 
確認ver.は16.04

設定ファイルは`/etc/apt/apt.conf.d/20auto-upgrades`にあります。
パラメータを0に書き換えます。デフォルトでは1(有効)になっています。

```java:/etc/apt/apt.conf.d/20auto-upgrades
APT::Periodic::Update-Package-Lists "0";
APT::Periodic::Unattended-Upgrade "0";
```
これでセキュリティ関連以外は自動更新されません。
全て無効化したい場合は
`/etc/apt/apt.conf.d/50unattended-upgrades`もいじります。

以下のパラメータに//でコメントアウトします。

```java:/etc/apt/apt.conf.d/50unattended-upgrades
//"${distro_id}:${distro_codename}-security"
```
これで自動更新されません。

<br>
ちなみに、更新時に特定のパッケージだけ更新したくない場合は以下。

全パッケージの状態を確認

```
dpkg --get-selections
```
ステータスがinstallになっているパッケージは更新されます。

```
echo [パッケージ名] hold | dpkg --set-selections
```
で除外
状態を確認するとステータスがholdに変わります。

除外対象から外したい場合は

```
echo [パッケージ名] install | dpkg --set-selections
```

<br>
他にも、

<font color="Blue">/etc/apt/apt.conf.d/50unattended-upgrades</font>の、
`Unattended-Upgrade::Package-Blacklist`パラメータ

にパッケージ名を追加することで更新を無効化する方法もあります。
 

以上。
【Windows】winSCPをコマンドラインで使う

ってできたんや、、、


コマンドプロンプトからexeを実行する際に、引数に"/console"を付けるとコンソールモードで開けます。

```
"C:\Program Files\WinSCP.exe" sftp://ユーザ:ユーザパス@ホスト /console
```
<br>

powershellの場合は、

```
& "C:\Program Files\WinSCP.exe" sftp://ユーザ:ユーザパス@ホスト /console
```

ちなみに引数に `/script="C:\script\xxxxxx.src"`
みたいに/script=ファイルパスも入れてやるとsrcファイル中のコマンド打ってくれます。

コマンドは結構いろいろ使える↓
https://ja.osdn.net/projects/winscp/wiki/script_commands

スクリプトでスケジューラ登録しておけば、定期的に自動でwindowsからLinuxへファイル転送～とかできますね。

いじょう。
【Windows】Linuxを経由したWindowsへのRDP

踏み台の話。
![20180525185637.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/673840/877b84a9-3175-2662-987c-8bc2a73066fd.jpeg)
Linuxサーバを踏み台にしてWindowsへRDPしたい場合どうすんの？
って時の設定。

前提:
・作業端末にLinuxのssh接続クライアントを導入していること。
※ここではteratermを使用しています。

 
`1.まず踏み台のLinuxにssh接続する。`
`2.ウインドウ上部の「設定」→「SSH転送」をクリック。`
`3.ポート転送の画面が出てくるので、「追加」をクリック。`
![20180525184017.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/673840/d17f9ded-8b4c-8197-d717-74e7a22d40c8.jpeg)

`4.以下設定`

```
ローカルのポート：13389
リッスン：空
リモート側ホスト：RDPするWindowsのIPアドレス
ポート：3389
```
3389というのは、Windowsがデフォルトで使っているRDPのポートですね。

`5.teratermは開いたままでRDPを開く。`
`6.接続先に「127.0.0.1:13389」を指定する。`


これでRDPできるはずです。念のためコマンドプロンプトを開いて

```
netstat
```
で確認しましょう。
「外部アドレス」の項目に踏み台サーバのIPアドレスが表示されているはずです。

 当然ですがteratermを閉じるとRDPも切れるので注意。



以上～
【FSL】ROI（VOI）を用いた画像計測

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/587891/1ae81961-9403-c16a-529e-a8a177cfb87a.png)

# 目的

- 関心領域ROI（VOI）内の画像の定量値を計測


詳しい解説とコードは、[【FSL】ROI（VOI）を用いた画像計測](https://www.aiprogrammers.net/entry/2020/06/17/203922)をご覧ください。
【Linux,Windows】時刻同期設定・確認

OS別時刻同期設定です。

# RHEL/CentOS
確認バージョンは7.4。
6まではntpdでしたが、現在はchronydが使用されています。

### 時刻設定(手動)
```
# date -s "01/30 20:00 2018"
```

### ステータス確認

```
# systemctl status chronyd
```

できない場合はYUMインストール

```
# yum install chrony
```

### 自動起動設定

```
# systemctl enable chronyd
```
### 参照先設定
設定ファイルは`/etc/chrony.conf`です。
デフォルトだと以下の項目があるので、これらをコメントアウト。

```bash:/etc/chrony.conf 
#server 0.centos.pool.ntp.org iburst
#server 1.centos.pool.ntp.org iburst
#server 2.centos.pool.ntp.org iburst
#server 3.centos.pool.ntp.org iburst
```

で、以下を追記

```bash:/etc/chrony.conf 
server [NTPサーバ] iburst
port 0
```
`iburst`は起動直後に4回問い合わせを行い、同期を早めるオプション。
`port0`は「クライアントとしてのみ動作する」というオプションです。
<br>
ちなみにstepモード(即時同期)を無効にして、slewモード(長時間かけて時刻を補正)にすればうるう秒対策となります。
(サービス起動後、1秒以上時間がズレていた場合に、即座に時間調整する設定(数字の「3」は試行回数を示す)を無効にし、slewモードのみで動作させて緩やかに時間を調整する)

```bash:/etc/chrony.conf 
#makestep 1 3   ###コメントアウトで上限超えた時のstepモードを解除し、slewモード補正
leapsecmode slew    ### chronyd がうるう秒を徐々に調整することでシステム時計を修正
```
確認は`chronyc tracking`コマンド。

### chronyd再起動

```
# systemctl restart chronyd
```

### 確認① 

```
# chronyc sources
```
同期先のIPアドレスの左側に*がついていればOK。

### 確認②

```
# timedatectl
```

`NTP enabled: yes`
`NTP synchronized: yes`

と表示されていればOK。
<br>
# Debian/Ubuntu
確認バージョンは16.04
こちらでは`systemd-timesyncd`が使用されています。

### ステータス確認

```
# systemctl -l status systemd-timesyncd
```
設定は`/etc/systemd/timesyncd.conf`で行います。

```bash:/etc/systemd/timesyncd.conf
[Time]
NTP=[NTPサーバ]
FallbackNTP=[NTPサーバ]
```
`NTP=`との同期がうまくいかなかった場合に、`FallbackNTP=`の方へ同期する設定です。

### 確認①

```
# systemctl -l status systemd-timesyncd
```
Status:に
`Synchronized to time server [NTPサーバ]`
と表示されればOK。

### 確認②

```
# timedatectl
```
`NTP enabled: yes`
`NTP synchronized: yes`
と表示されていればOK。


# Windows
確認バージョンは2012R2。2016でもできます。

### 設定
```
[コントロールパネル]→[時計、言語、および地域]
[日付と時刻の設定]→[インターネット時刻]
```
![20180516183802.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/673840/0c49f9aa-52c0-b014-3fed-090b7d1042fc.jpeg)
[サーバー]ボックスに同期先サーバのIPアドレスかホスト名を入力して
今すぐ更新をクリック。 

### 確認
管理者でコマンドプロンプトを開き、以下コマンドを実行する。

```
> w32tm /monitor /computers:[NTPサーバ]
> w32tm /query /status /verbose
```
ステータスに設定が反映されていればOK。
他にも最終同期時刻や遅延なども確認できます。
ちなみに、ActivceDirectoryに参加していれば自動でドメインコントローラ―の方へ参照します。


### リアルタイム確認
```
> w32tm /stripchart /computer:[NTPサーバ]
```
![20180516183820.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/673840/b9792856-d8e6-3c1b-fb23-5449a8c1bb1c.jpeg)
チャートの@が真ん中まで移動し、*に変わるまで待ちます。

```
> w32tm /resync
```
で再同期します。

```
> w32tm /monitor /computers:[NTPサーバ]
```
で再確認。
<br>
当然ながら、設定した時の時刻と同期先の時刻にずれが大きいほど時間がかかります。
あまりにもかけ離れているとエラーになるので、
設定時は手動の時間設定とかでなるべく近づけましょう。

いじょ
【Python】カッパ（k）係数の計算

# 目的
- コーエンの重み付きカッパ（k）係数（Cohen's kappa）をPythonで計算
- Sony Neural Network用にも作成


詳しい解説とコードは、[【Python】カッパ（k）係数の計算](https://www.aiprogrammers.net/entry/2020/06/22/002343)をご覧ください。
【Windows】オフラインで日本語化手順

クラウドでオーダーしたサーバはたいてい英語フォーマットになっています。

てことで日本語化する手順。
OSはWindows2012R2。(2016でも同じ手順)

 
・[スタート]→[Control Panel]

・[Clock, Language and Region]下の[Add a Language]をクリック

・[Add a Language]をクリック

・[Japanese]を選択し[Add]をクリック

・[日本語]を選択し、[Move Up]をクリックして最優先言語に設定する

・[日本語]の[Options]をクリック

・[Download and install language pack]をクリックし、日本語言語パックをインストール

 

ここで、サーバがインターネットに出れていればこれでインストールできるのですが、オフラインの場合は、
[Download and install language pack]が表示されず、
代わりに[A language pack isn’t available]と表示されます。
![20180516183642.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/673840/6259932d-5bc0-d08a-21f4-8eb75afa6b89.jpeg)
ぼやけてるけどゆるして
<br>
下記URLから、
「Windows Server 2012 Language Pack (x64) – DVD (Multiple Languages)」
をダウンロードし、
https://msdn.microsoft.com/subscriptions/securedownloads/
※MSDNサブスクリプションが必要です。
ISOイメージ内の「ja-jp」ディレクトリにある「lp.cab」を取得します。
 

サーバの適当な場所に「lp.cab」を配置しておきます。
ここではCドライブ直下のja-jpフォルダに配置します。 

管理者でコマンドプロンプトを開き、以下コマンドを実行

```
dism /online /add-package /packagePath:C:\ja-jp\lp.cab
```
インストールが完了すると、

[A language pack isn’t available]が<font color="Blue">[Make this the primary language]</font>に変わるので、ここをクリック。 
logoffの催促が出るので[Log off now]をクリック。

ログインし直すと日本語になっています。

<br>

以上。
質問：「HTTPSの仕組みをしてください」　回答：～

###まず、HTTPとは？？
⇒クライアントサイドとサーバーサイドの通信やり取りを示す。

###＜詳細＞
PC（ユーザー）からサーバーに情報を要求すること(URLを指定してサーバーにファイルの場所を聞く)をリクエスト、
サーバーからPCへ情報の返答をすること（ファイルの場所を回答）をレスポンスと言う。

前者をクライアントサイド、後者をサーバーサイドと言い、
前者と後者のやり取りがHTTP

###HTTPSとは

HTTP通信に於いて、暗号化方式であるSSLやTSLを利用することで
改ざんや盗聴を防ぐ通信状態をHTTPSという。

一般的に、URLの記入欄の右に鍵マークで表示されている
【Python】バイオリンプロット（Violin Plot）

# 目的
- Pythonのseabornを使ってバイオリンプロットを作成

詳しい解説とコードは、[【Python】バイオリンプロット（Violin Plot）](https://www.aiprogrammers.net/entry/2020/07/16/183614)をご覧ください。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/587891/d3be5c3c-ba1b-8511-88a2-740922b066df.png)
.gitignoreのテンプレート

# .gitignoreの書き方がわからないときに使うテンプレ作成ツール

めちゃくちゃ助かってます

![スクリーンショット 2020-07-17 18.39.21.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/630802/6af59691-505b-fb3e-572c-e878fc0972cb.png)

[サービスはこちら -> toptal/gitignore.io](https://www.toptal.com/developers/gitignore)
[githubはこちら -> toptal/gitignore.io](https://github.com/toptal/gitignore.io)
エラー: プロセス "hogehoge" (PID xxxxx) を強制終了できませんでした。理由: このコマンドを実行するための十分なクォータがありません。と出たとき

# 方法
```bat
taskkill /IM hogehoge
```
と入力して、

```bat
エラー: プロセス "hogehoge" (PID xxxxx) を強制終了できませんでした。
理由: このコマンドを実行するための十分なクォータがありません。
```
と出たときは、

```bat
taskkill /IM hogehoge /T /F
```
と、オプションを加えると、うまくいくことがある。
意味は、
/T 子プロセスもろとも殺す。
/F 強制的に殺す
である。

# 調べたきっかけ

QuiteRSSのタスクトレイのアイコンがいつの間にか消えていて、しかしプロセスが生き残ってるという状況から自動的に再起動するためのbatを開発したのだが、うまくいっていなかった。
しかし今回の方法を試したらうまくいった。子プロセスが干渉していたようだ。

# 参考
[windows — Taskkill / fはプロセスを強制終了しません](https://www.it-swarm-ja.tech/ja/windows/taskkill-f%e3%81%af%e3%83%97%e3%83%ad%e3%82%bb%e3%82%b9%e3%82%92%e5%bc%b7%e5%88%b6%e7%b5%82%e4%ba%86%e3%81%97%e3%81%be%e3%81%9b%e3%82%93/1069276523/)
【Swift】SideMenu ライブラリでメニュー表示時に背景を暗くする


[SideMenu](https://github.com/jonkykong/SideMenu) というライブラリを使用しサイドメニューを実装しました。
サイドメニュー表示時に背景を暗くする方法が分からなかったので、以下の手順で実現します。

1. 画面全体を覆う半透明の `coverView` を作成する。
2. サイドバー表示時に上記の `coverView` を元の View の前面に表示させる。
3. サイドバーが閉じた時に `coverView` を破棄する。

## 環境
- Xcode 11.5
- Swift 5.2.4

今回の例では `NavigationController` が設定されている前提で書いています。

## 画面全体を覆う View を作成

```ViewController.swift
private let coverView: UIView = {
    let mainBoundSize: CGSize = UIScreen.main.bounds.size
    let mainFrame = CGRect(x: 0, y: 0, width: mainBoundSize.width, height: mainBoundSize.height)

    let view = UIView()
    view.frame = mainFrame
    view.backgroundColor = UIColor(white: 0, alpha: 0.3)
    return view
}()
```

`UIScreen.main.bounds.size` で画面サイズを取得し、画面に等しいサイズの View を作成しています。

## サイドメニュー表示時に View を表示

`SideMenuNavigationControllerDelegate` プロトコルで、サイドメニュー表示時に `coverView` を表示させ、非表示時に取り除きます。

```ViewController.swift
extension ViewController: SideMenuNavigationControllerDelegate {
    func sideMenuWillAppear(menu: SideMenuNavigationController, animated: Bool) {
        navigationController?.view.addSubview(coverView)
    }

    func sideMenuWillDisappear(menu: SideMenuNavigationController, animated: Bool) {
        coverView.removeFromSuperview()
    }
}
```

`navigationController` に `addSubView()` することによって、画面全体を `coverView` で覆っています。
画像処理(コンピュータビジョン)の主要なタスクと用いるアーキテクチャについて

# この投稿の目的

画像処理に関連する問題を解く際に実装方法を選択するためのガイドを作る。
※初学者のため、記載内容に過不足・誤りなどがあれば、指摘頂けると幸い。

# 問題解決の流れ

| 項目              | 内容              |
|:-----------------|:------------------|
| タスクの定義        |これから解く問題をどのタスクとして扱うか定義する               |
| アーキテクチャの決定  |定義したタスクの中から主要なアーキテクチャを決定            |
| 評価指標の決定  | 問題に対して適切な評価指標を決める              |



# 画像処理の主要なタスク

解きたい問題が画像認識である時に、要件に応じてそれがどのタスクであるかを定義する

* 画像分類
* 物体検出
* セマンティックセグメンテーション
* 異常検知

# タスク毎の有名なアーキテクチャ

※アーキテクチャ毎の特徴、使い分けを今後追記する

## 画像分類

* AlexNet
* VGG16
* ResNet

## 物体検出

* Yolo-v2, yolo-v3
* SSD

## セマンティックセグメンテーション

* U-Net
* SegNet
* PSPNet
* GCN
* DeepLabv3+

## 異常検知

* auto-encoderを元にしたモデル (特定のタスクがないので標準的なモデルも定まっていない) 

参照：　https://www.youtube.com/watch?v=vFpZrxaq5xU 


# タスク毎の評価指標

※セマンティックセグメンテーション以外は今後メンテナンス

## セマンティックセグメンテーション

* Pixel Wise Accuracy
* Mean Accuracy
* Mean Intersection over Union(Mean IoU)
* Precision, Recall, F1 score
Rustでビットパターンにマッチさせるマクロを作った

# はじめに

[前回の記事（Rustで+++を実現する）](https://qiita.com/dalance/items/18c5f5bb5ec643ac9aec)は完全にネタでしたが、今回は同じく関数呼び出し形式の手続きマクロで実用的なものを作ってみました。

https://github.com/dalance/bitpattern

`bitpattern!`というマクロで整数型とビットパターンのマッチと抽出ができます。

似たようなマクロで [`bitpat!`](https://github.com/jonas-schievink/bitpat) というものがあるのですが、こちらは `macro_rules!` によるマクロとなっていて、宣言的なマクロを再帰で呼び出すことで、任意長のビットパターンに対応しています。このため、ビットパターンが長くなると非常に再帰が深くなり（例えば32ビットのパターンで3万以上の再帰呼び出しが発生しました）、実用的にはちょっと厳しいところがありました。

手続きマクロであれば、ビットパターンは普通の文字列処理として扱えるので、長くなっても問題ありません。
そこで、Rust 1.45.0で安定化した関数呼び出し形式の手続きマクロを使って `bitpattern!` を実装しました。

# 使い方

ビットパターンとして使える値は `0` と `1` と `?` と `_` が特別な意味を持っていて、それ以外にも任意の文字が使えます。
例えば `0` と `1` を使うと

```rust
use bitpattern::bitpattern;

let x = 0xacu8; // 2進数で 10101100
assert_eq!(bitpattern!("1010_1100", x), Some(()));
assert_eq!(bitpattern!("1010_0100", x), None);
```

のように、ビットパターンがマッチすれば `Some(())` が、しなければ `None`が返ってきます。
（パターンは`_`で区切ることができます）

これだけだと単なる一致比較ですが、 `?`を使うと、0/1どちらにもマッチさせることができます。

```rust
let x = 0xacu8; // 2進数で 10101100
assert_eq!(bitpattern!("1?10_1?00", x), Some(()));
let x = 0xe8u8; // 2進数で 11101000
assert_eq!(bitpattern!("1?10_1?00", x), Some(()));
```

適当な文字を使うと、その部分を抽出することができます。
例えば `a` を使って上から2ビット目を抽出した例です。

```rust
let x = 0xacu8; // 2進数で 10101100
assert_eq!(bitpattern!("1a101100", x), Some(0));
```

同じ文字を連続させればその部分がまとめて抽出されます。

```rust
let x = 0xacu8; // 2進数で 10101100
assert_eq!(bitpattern!("1aa01100", x), Some(1));
```

複数の箇所を抽出することも可能です。
抽出箇所が複数の場合タプルで返ってきます。

```rust
let x = 0xacu8; // 2進数で 10101100
assert_eq!(bitpattern!("1aa0aa00", x), Some((1, 3)));
```

抽出箇所が隣接する場合、文字を変えればOKです。

```rust
let x = 0xacu8; // 2進数で 10101100
assert_eq!(bitpattern!("1aabbb00", x), Some((1, 3)));
```

パターンの長さに応じて型は`u8`から`u128`まで自動的に調整されます。

```rust
let x = 0xacf0acf0acf0acf0acf0acf0acf0acf0u128;
assert_eq!( bitpattern!( "1010_1100_1111_0000_1010_1100_1111_0000_1010_1100_1111_0000_1010_1100_1111_0000_1010_1100_1111_0000_1010_1100_1111_0000_1010_1100_1111_0000_1010_1100_1111_0000", x), Some(()));
```

# bitmatch
同じくビットパターンのマッチを`let`や`match`に対するアトリビュートマクロで実現した`bitmatch`というものもあります。

https://github.com/porglezomp/bitmatch

こちらも便利なので、用途に応じて使い分けるといいでしょう。
一緒に使えるように、`bitpattern`のパターン記法はこの`bitmatch`と合わせてあります。

```rust
use bitmatch::bitmatch;
#[bitmatch]
fn decode(inst: u8) -> String {
    #[bitmatch]
    match inst {
        "00oo_aabb" => format!("Op {}, {}, {}", o, a, b),
        "0100_aaii" => format!("Val {}, {}", a, i),
        "01??_????" => format!("Invalid"),
        "10ii_aabb" => format!("Ld {}, {}, {}", a, b, i),
        "11ii_aabb" => format!("St {}, {}, {}", a, b, i),
    }
}
```
【javascript】クラスについて

この記事は以下の書籍を参考にして執筆しました。

- [入門JavaScriptプログラミング](https://www.amazon.co.jp/%E5%85%A5%E9%96%80JavaScript%E3%83%97%E3%83%AD%E3%82%B0%E3%83%A9%E3%83%9F%E3%83%B3%E3%82%B0-JD-Isaacks/dp/479815864X/ref=sr_1_3?__mk_ja_JP=%E3%82%AB%E3%82%BF%E3%82%AB%E3%83%8A&crid=1F76CKY9CIJ66&dchild=1&keywords=%E5%85%A5%E9%96%80javascript%E3%83%97%E3%83%AD%E3%82%B0%E3%83%A9%E3%83%9F%E3%83%B3%E3%82%B0&qid=1595991879&s=books&sprefix=%E5%85%A5%E9%96%80javascript%2Cstripbooks%2C-1&sr=1-3)

```javascript
class DaStore {
  fetch() {
    //ajaxのコールバックとしてthis.callbackを指定
    ajax(this.url, this.callback);
  }
  callback(records) {       //このメソッドはバインドされないため
    this.records = records // thisキーワードは
                          // このインスタンスを指していない
  }
}
```
>出典：[入門JavaScriptプログラミング](https://www.amazon.co.jp/%E5%85%A5%E9%96%80JavaScript%E3%83%97%E3%83%AD%E3%82%B0%E3%83%A9%E3%83%9F%E3%83%B3%E3%82%B0-JD-Isaacks/dp/479815864X/ref=sr_1_3?__mk_ja_JP=%E3%82%AB%E3%82%BF%E3%82%AB%E3%83%8A&crid=1F76CKY9CIJ66&dchild=1&keywords=%E5%85%A5%E9%96%80javascript%E3%83%97%E3%83%AD%E3%82%B0%E3%83%A9%E3%83%9F%E3%83%B3%E3%82%B0&qid=1595991879&s=books&sprefix=%E5%85%A5%E9%96%80javascript%2Cstripbooks%2C-1&sr=1-3)


##解決法

###アロー関数を使用する
```javascript
class DaStore {
  fetch() {
    ajax(this.url, records => this.records = records);
  }
}
```

#superキーワード
スーパークラスのコンストラクタやメソッドの呼び出しを可能にする。
##コンストラクタでのthisの参照
コンストラクタでsuperを使う場合、thisを参照する前にsuperを呼び出すに必要がある。
##使い方
```javascript
super.プロパティ名
super.メソッド名()
```

#クラス拡張時の注意
クラスのプロパティにアロー関数を参照させることでメソッドをバインドできる。

```javascript
class DataStore {
  fetch() {
    ajax(this.url, this.callback)
  }
  callback = (records) => {
    //処理
  }
}
```
>出典：[入門JavaScriptプログラミング](https://www.amazon.co.jp/%E5%85%A5%E9%96%80JavaScript%E3%83%97%E3%83%AD%E3%82%B0%E3%83%A9%E3%83%9F%E3%83%B3%E3%82%B0-JD-Isaacks/dp/479815864X/ref=sr_1_3?__mk_ja_JP=%E3%82%AB%E3%82%BF%E3%82%AB%E3%83%8A&crid=1F76CKY9CIJ66&dchild=1&keywords=%E5%85%A5%E9%96%80javascript%E3%83%97%E3%83%AD%E3%82%B0%E3%83%A9%E3%83%9F%E3%83%B3%E3%82%B0&qid=1595991879&s=books&sprefix=%E5%85%A5%E9%96%80javascript%2Cstripbooks%2C-1&sr=1-3)


**callbackメソッドはDataStoreプロトタイプに追加されない**

**callbackメソッドは作成されたインスタンスに直接追加される**

つまりsuprは使えない。
サブクラスでこのメソッドを使いたい場合どうするか。

対策としては
実際のメソッドとして定義して
コンストラクタの中でインスタンスにバインドする
というものがある

```javascript
class DataStore {
  constuctor() {
    //プロトタイプのcallbackメソッドをインスタンスにバインド
    this.callback = this.callback.bind(this)
  }
  fetch() {
    ajax(this.url, this.callback)
  }
  callback(records) {
    //処理
  }
}

class SubStore extends DataStore {
  callback(records) {
    super.callback(records)
  }
}
```
>出典：[入門JavaScriptプログラミング](https://www.amazon.co.jp/%E5%85%A5%E9%96%80JavaScript%E3%83%97%E3%83%AD%E3%82%B0%E3%83%A9%E3%83%9F%E3%83%B3%E3%82%B0-JD-Isaacks/dp/479815864X/ref=sr_1_3?__mk_ja_JP=%E3%82%AB%E3%82%BF%E3%82%AB%E3%83%8A&crid=1F76CKY9CIJ66&dchild=1&keywords=%E5%85%A5%E9%96%80javascript%E3%83%97%E3%83%AD%E3%82%B0%E3%83%A9%E3%83%9F%E3%83%B3%E3%82%B0&qid=1595991879&s=books&sprefix=%E5%85%A5%E9%96%80javascript%2Cstripbooks%2C-1&sr=1-3)
openblasのインストール(apt-get無)

#openBLASのインストール方法(apt-get無)

openBLASのインストール方法を示します。
apt-getでopenBLASをインストールできますが、どうもインストール先がはっきりとしなくなるので自分はソースコードからインストールしました。

それでは参りましょう。
#openBLASのソースコードのダウンロード
通常ダウンロード:
http://www.openblas.net
gitを使う場合:
$git clone https://github.com/xianyi/OpenBLAS.git

ダウンロードは/home/Qiita/Downloadにします。
(本記事作成バージョンではOpenBLAS-0.3.10.tar.gzでした)

#openBLASのコンパイルとインストール
インストール先は /opt/openblas とします。

```ruby:compile&install
$sudo mkdir /opt/openblas
$cd /home/Qiita/Download
$tar -xvf  OpenBLAS-0.3.10.tar.gz
$cd /OpenBLAS-0.3.10
$make
$sudo make install PREFIX=/opt/openblas
````
終了です。
CodePiplineでLambda関数デプロイ自動化

## 1.Lambda関数と設定ファイルをCodeCommitへpush
### ①lambda_function.py

```python
import json

def lambda_handler(event, context):
    # TODO implement
    return {
        'body': json.dumps('Hello World!')
    }
```
### ②buildspec.yml
```python
version: 0.2

phases:
  pre_build:
    commands:
      - echo Nothing to do in the pre_build phase...
  build:
    commands:
      - export BUCKET=cloudform1
      - aws cloudformation package --template-file template.yml --s3-bucket $BUCKET --output-template-file outputtemplate.yml
      - echo Nothing to do in the build phase...
artifacts:
  type: zip
  files:
    - template.yml
    - outputtemplate.yml
```
### ③template.yml
```phthon
AWSTemplateFormatVersion: 2010-09-09
Transform: AWS::Serverless-2016-10-31
Description: An AWS Serverless Specification template describing your function.
Resources:
  testDeploy:
    Type: AWS::Serverless::Function
    Properties:
      Description: 'I am Urata'
      FunctionName: 'Dep4'
      Handler: 'lambda_function.lambda_handler'
      Role : 'arn:aws:iam::773181940404:role/lambdafull'
      Runtime: 'python3.6'
      MemorySize: 128
      Timeout: 15
      CodeUri: ./
      Events:
        DepApi:
          Type: Api
          Properties:
            Path: /DepResource
            Method: GET
```
## 2．CodePipelineを以下の手順でセット

:::note info
パイプラインを作成するには
「開発者向けツールコンソール」を開きます。
[パイプライン] で、[パイプライン] を選択します。
[Create pipeline] を選択します。
パイプライン設定を行い、[次へ] を選択します。
パイプライン名 – lambda-pipeline
サービスロール – 新しいサービスロール
アーティファクトストア – デフォルトの場所
ソースステージ設定を行い、[次へ] を選択します。
ソースプロバイダー – AWS CodeCommit
リポジトリ名 – lambda-pipeline-repo
ブランチ名 – master
変更検出オプション – Amazon CloudWatch Events
[ビルドプロバイダー] で、[AWS CodeBuild]、[プロジェクトの作成] の順に選択します。
ビルドプロジェクト設定を行い、[CodePipeline に進む] を選択します。
プロジェクト名 – lambda-pipeline-build
オペレーティングシステム – Ubuntu
ランタイム – 標準
ランタイムバージョン – aws/codebuild/standard:2.0
イメージのバージョン – 最新
Buildspec 名 – buildspec.yml
[次へ] を選択します。
デプロイステージ設定を行い、[次へ] を選択します。
デプロイプロバイダー – AWS CloudFormation
アクションモード – 変更セットの作成または置換
スタック名 – lambda-pipeline-stack
変更セット名 – lambda-pipeline-changeset
テンプレート – BuildArtifact::outputtemplate.yml
機能 – CAPABILITY_IAM、CAPABILITY_AUTO_EXPAND
ロール名 – cfn-lambda-pipeline
[Create pipeline] を選択します。
IAM コンソールの [Roles] ページを開きます。
[codebuild-lamba-pipeline-build-service-role] を選択します。
[Attach policies (ポリシーをアタッチします)] を選択します。
[AmazonS3FullAccess] をアタッチします。
デプロイステージを更新するには
「開発者向けツールコンソール」でパイプラインを開きます。
[Edit] を選択します。
[デプロイ] の横にある [ステージを編集] を選択します。
[アクショングループの追加] を選択します。
デプロイステージ設定を行い、[次へ] を選択します。
アクション名 – execute-changeset
アクションプロバイダ – AWS CloudFormation
入力アーティファクト – BuildArtifact
アクションモード – 変更セットの実行
スタック名 – lambda-pipeline-stack
変更セット名 – lambda-pipeline-changeset
:::
以上
rails db:createってしなくてもいいの？

# 結論
Sqlite3であれば開発環境用DBだけしか使わないのであれば、実行しなくてOK

でも、MySQLやPostgreSQLを使用しているのであれば、必要です。

(2020.7.17追記)
# 環境
Ruby on Rails 5.2

# railsでアプリを開発する時の個人的お決まり手順

ターミナル上で

1. rails new "アプリ名"
2. rails db:create
3. rails db:migrate

# 下記でもDB作成→テーブル作成できている

1. rails new "アプリ名"
2. rails db:migrate

rails db:create がマストだと思ってたけど、違うっぽい

# rails db:create を実行する場合としない場合の違い

rails db:create を実行する場合
▶︎ テスト環境用DBと開発環境用DBが作成される

rails db:create を実行しない場合
▶︎ 開発環境用DBのみ作成される
[C#]一定時間ごとに自動でちょっとだけマウスを動かすツール

一定時間ごとにマウスをちょっとだけ動かすハードウェアがあるということで、
そんなものソフトウェアでやればいいんじゃないかということで実装してみた。

カウントダウンして閾値を超えたらマウスをちょっと動かすだけですね。
右に動かしたら次は左と。

```
    int x = Cursor.Position.X;
    int y = Cursor.Position.Y;
    appendValue = -appendValue;
    Cursor.Position = new Point(x + appendValue, y);
```

[ソース](https://github.com/with-leaf-tech/AutoMoveMouse)
[React.js] 配列・オブジェクトのループ表示

## 配列ループ

```
const items = [1,2,3,4,5]
return (
  <div>
    <ul>
      {items.map((item) => (
        <li>{ item }</li>
      ))}
    </ul>
  </div>
);
```


## オブジェクトループ

```
const items = {
  1: "ピカチュウ",
  2: "リザードン",
  3: "カイリュー",
  4, "ゲンガー",
  5: "カビゴン",
  6: "ギャラドス"
}
return (
  <div>
    <ul>
      {Object.keys(items).map(key => (
        <li key={key}>
          {items[key]}
        </li>
      ))}
    </ul>
  </div>
);
```
【執筆中】WebRTC Native Client Momoでデジタルズームを試してみる

# やりたいこと
- ホワイトボードの文字をズームしてみたい
- プロジェクターに投影した資料をズームしてみたい

# 使うテクノロジーなどなど

- WebRTC Native Client Momo
- Sora Labo
- Next.js (vercelにてデプロイ)

# WebRTC Native Client Momoとは
時雨堂さんが開発しているWebRTCクライアントです。

> Momo はウェアラブル端末や Raspberry Pi など、ブラウザのない機器からでも WebRTC で映像や音声を配信できるネイティブクライアントです。
https://momo.shiguredo.jp/


# Sora Laboとは

> Sora Labo は、時雨堂が開発する WebRTC SFU Sora を手軽に検証できるように無料で提供しているサービスです。
https://sora-labo.shiguredo.jp/


# 試してみる端末
- RaspberryPi 4
- Jetson nano
- Jetson Xavier NX

# 検証方法

1. デジタルズームできるクライアントを実装（Sora Labo使います。）
2. ラズパイ、nano, Xavier NXでそれぞれmomoを動かします
3. HD, FHD, (4K) などカメラの解像度を上げていってズームの性能を調べます

# 評価方法
- 1. 簡易式視力表（3メートル用）で、どれくらいまで見れるか検証
- 2. 会議風に使ってみて見れるかどうか肌感でチェック（主観です）

# Step

- [x]  1. sora laboでブラウザ to ブラウザでいじれるクライアントをNext.jsで作る
- [ ]  2. canvas芸でズーム機能を実装してみる（まだブラウザ to ブラウザ）
- [ ]  3. ラズパイ、Jetson nano, Xavier NXでmomoをセットアップ
- [ ]  4. コーデックなどを変えて評価してみる

# Github
https://github.com/azamiya/sora-labo-digital-zoom

# Demo
https://sora-labo-digital-zoom.vercel.app/

# 開発日誌
2020/07/25: sora laboのsender, receiverデモをReactに移植して実装

**執筆中...**
【Nuxt.js】Sassの導入方法

🎈 この記事はWP専用です
https://wp.me/pc9NHC-sc

# 前置き

Sassを使えば
スタイリングを入れ子にして書けたり、
スタイリングの値を変数したり、
管理が便利で見やすくなります🌟

そもそもSassとは何か、
そして導入方法や使用例をご紹介🎀


# Sassとは

Syntactically Awesome Stylesheets

構文的に素晴らしいスタイルシート！
前置きの通り、
スタイリングの管理が便利になるものです🌟

## 2種類の記法

この2つの書き方があります。
SASS記法
SCSS記法

SassとSASSが非常に紛らわしいですね😂
Sassは言語で、SASSが記法です✍️

### SASS記法

セレクタ やクラス名の {} や
値の後ろの ; を書かない書き方

style lang はsass



```index.vue
<style lang="sass" scoped>
 div
   padding: 20px

   p 
     color: pink
</style>
```

### SCSS記法

入れ子(ネスト)した書き方🌸
こちらの方が入れ子になっている感じが
パッと見て分かりやすいです✨👀
このブログではSCSS記法がメインです！

templateの構造と照らし合わせて
どこにどんなスタイルがあるのか
確認しやすいんです…✨

style lang はscss


```index.vue
<style lang="scss" scoped>
 div {
   padding: 20px;

   > p {
     color: pink;
   }
 }
</style>
```

# install

それでは早速インストールしてみましょう✨😄


🎈 続きはWPでご覧ください👀
https://wp.me/pc9NHC-sc
顧客とつながる

１．Financial Service Cloud は何に使用できますか?
２．Financial Services Cloud によって Kotori の仕事はどのように楽になりますか?
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/634241/faed9b95-e463-dbfd-1565-cc82a83334d4.png)
slackチャンネルからメッセージ全部取得したい

###前書き

slackのワークフローを記述することでログ用のチャンネルにメッセージが送信され、
SlackAPP経由でGASが叩かれスプレットシートに追記されるシステムを作った。（現在システムに関する記事執筆中）
ログ用のチャンネルを見返してるのがつらくなったのでメッセージを全部取得するクソコードを書いた。

###成果物

```javascript:module/common.js
const fs = require('fs');

exports.makeOutputDir = path => {
  if (!isExistFile(path)) {
    fs.mkdirSync(path);
  }
}
```

```javascript:main.js
const common = require('./module/common');
const request = require('request');
const fs = require("fs");

main = (path, oldest = '1587362942.000200') => {
  const token = 'トークン'
  const channel = 'チャンネル';
  let url = 'https://slack.com/api/conversations.history?token='+token+'&channel='+channel+'&oldest='+oldest+'&pretty=1'
  var options = {
    url: url,
    method: 'POST'
  };

  function callback(error, response, body) {
    let oldest_t;
    if (!error && response.statusCode == 200) {
      const obj = JSON.parse(body);
      if(obj.messages.length == 0){
        return
      }

      obj.messages.reverse().forEach(element => {
        const text = "\"" + element.text.replace(/,/g, '').replace(/\n/g, '').trim() +  "\",\n";
        console.log(text)
        fs.appendFileSync(path + 'out.csv', text);
        console.log('write end');
        oldest_t = element.ts
      })
    }
    main(path, oldest_t);
  }
  request(options, callback);
}

(() => {
  const date = new Date();
  const path = 'output/' + date.getFullYear() + '-' + ('00' + (date.getMonth() + 1)).slice(-2) + '-' + ('00' + date.getDate()).slice(-2) + '/';
  common.makeOutputDir(path);
  main(path);
})();
```

###説明
https://api.slack.com/methods/conversations.history
こいつを使えば良いだけです！
後は取得した内容を吐き出すだけ！
でも１００件しか取得できないから現状２０００件を超えるメッセージの全取得は無理だ。
なのでタイムスタンプを保存して続きのメッセージを取得するように再帰してる。

トークンの作り方は別の記事に書いてる。（執筆中）
でもググればめっちゃ出てくるからぶっちゃけ僕が書く必要全くないと思う。

以上！！！
pod installしたらimage not foundエラーになった時の対処法

久々に`pod install`しようとしたら下記エラーになりなかなか詰まってしまったので備忘録。

```terminal
 (LoadError)
  Referenced from: /Users/username/.rbenv/versions/2.5.0/lib/ruby/2.5.0/x86_64-darwin18/openssl.bundle
  Reason: image not found - /Users/username/.rbenv/versions/2.5.0/lib/ruby/2.5.0/x86_64-darwin18/openssl.bundle
```

## 解決手順
### グーグル先生に`sudo gem install cocoapods`しなさいと言われたので実行するとまたエラーに。

```terminal
Password:
ERROR:  Loading command: install (LoadError)
	dlopen(/Users/username/.rbenv/versions/2.5.0/lib/ruby/2.5.0/x86_64-darwin18/openssl.bundle, 9): Library not loaded: /usr/local/opt/openssl/lib/libssl.1.0.0.dylib
  Referenced from: /Users/username/.rbenv/versions/2.5.0/lib/ruby/2.5.0/x86_64-darwin18/openssl.bundle
  Reason: image not found - /Users/username/.rbenv/versions/2.5.0/lib/ruby/2.5.0/x86_64-darwin18/openssl.bundle
ERROR:  While executing gem ... (NoMethodError)
    undefined method `invoke_with_build_args' for nil:NilClass
```

一旦Podfileを削除し、pod initし直すもまた同じエラーに。

どうやらOpenSSLが見当たらないというエラーのようで、下記Qiitaを参考にOpenSSLを入れてrubyをインストールし直しました。
[Yosemiteに変えたらgem installできなくなった件](https://qiita.com/YoshiyukiKato/items/e4f67c588d2943c1253d)


### opensslのインストール

```terminal
$ brew update
$ brew install openssl
$ brew link openssl --force
```

### 使っているRubyのバージョンを削除・再インストール

```
$ rbenv versions
  system
* 2.5.0 (set by /Users/MIYU/.rbenv/version)
$ rbenv uninstall 2.5.0
$ rbenv install 2.5.0
```

ちなみに、2.5.0を入れるともうすぐ死ぬよとWARNINGが出たので

```terminal
WARNING: ruby-2.5.0 is nearing its end of life.
It only receives critical security updates, no bug fixes.
```
最新安定版の2.7.1を入れ直しました。

#### 安定版の確認

```terminal
$ rbenv install --list
2.5.8
2.6.6
2.7.1
jruby-9.2.11.1
maglev-1.0.0
mruby-2.1.0
rbx-4.15
truffleruby-20.1.0

Only latest stable releases for each Ruby implementation are shown.
Use 'rbenv install --list-all' to show all local versions.
```

#### インストール・バージョン指定

```terminal
$ rbenv install 2.7.1
$ rbenv versions
  system
* 2.5.0 (set by /Users/username/.rbenv/version)
  2.7.1
$ rbenv global 2.7.1
$ rbenv versions
  system
  2.5.0
* 2.7.1 (set by /Users/username/.rbenv/version)
```

### 再度`sudo gem install cocoapods`

```
Done installing documentation for concurrent-ruby, i18n, thread_safe, tzinfo, activesupport, nap, fuzzy_match, httpclient, algoliasearch, ffi, ethon, typhoeus, netrc, cocoapods-core, claide, cocoapods-deintegrate, cocoapods-downloader, cocoapods-plugins, cocoapods-search, cocoapods-stats, cocoapods-trunk, cocoapods-try, molinillo, atomos, CFPropertyList, colored2, nanaimo, xcodeproj, escape, fourflusher, gh_inspector, ruby-macho, cocoapods after 40 seconds
33 gems installed
```
成功🎉
やっと`pod install`できました。