OmniAICreator/Qiita-1.07M huggingface dataset:
PhpStormのコードフォーマッタをWordPressのコーディングスタイルにする

WordPressのコーディングスタイルが普段使っているフレームワークのと異なり不便だったのでPhpStormに助けてもらったので設定方法をメモ。（Mac前提）

参考：[JetBrainsオフィシャルサイト](https://www.jetbrains.com/help/phpstorm/wordpress-aware-coding-assistance.html)

Preference を開いて
① Editor > Code Style > PHP を開く
② プロジェクト毎かPhpStorm自体の設定とするか選択
③ WordPressのスタイルを選択

![Screen_Shot_2021-01-16_at_12_21_20.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/138322/4a65dd1c-dfb4-c733-5971-2a68bb15bbfc.png)

![Screen Shot 2021-01-16 at 12.26.16.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/138322/eabb975a-579e-3a00-2940-420936226704.png)

で、OKで閉じる。


設定後はソースコード開いて（キー設定変えてなければ） option + command + l (エル）のショートカットキーでフォーマッタを適用できる。


以上！
ASUSのルーターのCLIで遊ぶ

# はじめに
ASUSのルーターは, CLIでログインできる.
個人的に, よく使うコマンドや参照するファイルをまとめる.

:::note info
CLIログインの有効化の方法は, 以下の公式FAQを参照
:::

https://www.asus.com/jp/support/FAQ/1048201

# 確認機種

https://www.asus.com/jp/Networking/RT-AX3000

<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/6361/56d2a541-dfaf-cb15-a1b0-0746780d1ba5.png" width="300px" alt=rt-ax3000>

:::note info
管理画面は, 以下のASUS公式でデモがあるので, 試しに触ることができる. 
:::

https://demoui.asus.com/JP/

![nw_map.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/6361/cbb6ce59-f8ad-c5bb-8746-15b37b74e639.png)


# 基本

- NVRAMに保存するパラメータ一覧を表示

```sh
# nvram show
```

なお, JFFS (`/jffs/nvram`) のディレクトリ配下でも確認できる.

# ネットワーク

[管理画面で確認できる接続 (NAT) 履歴](https://demoui.asus.com/JP/Main_ConnStatus_Content.asp) は, CLIでは `/tmp/connect.log` で確認できる.

![nat.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/6361/0153ca52-51c6-9902-0a65-37f2c81204e1.png)


# ワイヤレス

https://wiki.dd-wrt.com/wiki/index.php/Wl_command

`wl`コマンドを使う.

```sh
# wl status
SSID: "skkzsh12ap"
Mode: Managed   RSSI: 0 dBm     SNR: 0 dB       noise: -87 dBm  Channel: 10
BSSID: AA:BB:CC:DD:EE:FF        Capability: ESS ShortSlot RRM
Supported Rates: [ 1(b) 2(b) 5.5(b) 6 9 11(b) 12 18 24 36 48 54 ]
HE Capable:
        Chanspec: 2.4GHz channel 10 20MHz (0x100a)
        Primary channel: 10
        HT Capabilities: 40MHz SGI20 SGI40
        Supported HT MCS : 0-15
        Supported VHT MCS:
                NSS1 Tx: 0-11        Rx: 0-11
                NSS2 Tx: 0-11        Rx: 0-11
        Supported HE MCS:
            20/40/80 MHz:
                NSS1 Tx: 0-11        Rx: 0-11
                NSS2 Tx: 0-11        Rx: 0-11
```

# DHCP

- [DHCP固定割当IPアドレス](https://demoui.asus.com/JP/Advanced_DHCP_Content.asp) の一覧を確認

```sh
# nvram get dhcp_staticlist
```

また, 以下のようにプロセスを確認すると, dnsmasqを使用していることが分かる.

```sh
# ps | grep dns | grep -v grep
 1359 nobody    2380 S    dnsmasq --log-async
```

https://wiki.dd-wrt.com/wiki/index.php/DNSMasq_as_DHCP_server

よって, [DHCPの設定](https://demoui.asus.com/JP/Advanced_DHCP_Content.asp) は `/etc/dnsmasq.conf` で確認できる.
[DHCPリースの状態 (リース時間, MACアドレス, IPアドレス, ホスト名)](https://demoui.asus.com/JP/Main_DHCPStatus_Content.asp) は `/var/lib/misc/dnsmasq.leases` で確認できる.

![dhcp_lease.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/6361/2810ae2a-84bd-7020-4374-ad219af7837b.png)


# IPv6

- [接続しているクライアントの一覧 (ホスト名, MACアドレス, IPv6アドレス)](https://demoui.asus.com/JP/Main_IPV6Status_Content.asp) は `/tmp/ipv6_client_info` や `/tmp/ipv6_client_list` で確認できる.

- [ファイアウォールの設定](https://demoui.asus.com/JP/Advanced_BasicFirewall_Content.asp) を確認

```sh
# nvram get ipv6_fw_rulelist
```

# デーモン

```sh
# ps | grep :22 | grep -v grep
 1282 nobody    2312 S    dropbear -p 192.168.50.1:22 -a
```

より, SSHサーバはdropbearを使っていることが分かる.
SASEについてまとめてみた

# SASEについてまとめてみた


## 背景・目的・読み手

### 背景
　最近バズワードになってきているSASEについて、そもそもどういうものか、他のセキュリティソリューションとの違いがよくわからなかったのでまとめ。

### 目的
　2020年後半のSASEに関する動向をまとめ、後で見返せるようにしておく。

### 読み手
　SASEが何かよく分からない方。


## SASE概要

　SASE(Secure Access Service Edge)と書いて「サッシー」「サージー」と呼びます。

　2019年8月にGartner社が提唱しています。"The Future of Network Security Is in the Cloud"にて定義されたネットワーク・セキュリティモデルです。ざっくりいうと「既存のIT基盤のコンポーネントをクラウド上に統合するという概念」[^1]であり「デバイス・利用者に依存しないセキュリティモデル」です。[^2]

　参考文献1[^1]のGartner提供の図がそのイメージとなります。

　注意したいのは、SASEという名前のサービスがあるわけではなく、また、SASEが要求する全ての項目を満たすサービスは2020年時点ではないようです。いくつかのソリューションを組み合わせ、SASEで定義されるネットワーク・セキュリティを提供するソリューションが出ているといったところになります。

　特定の製品を押す意図はありませんが、SASEソリューションのイメージを掴む資料としては参考文献3[^3]などが分かりやすいです。

　ところで、こうしてみてみると、これまでのバズワードであるゼロトラスト・CASBあたりと似ている気がしますが、そのあたりの違いはどこにあるのでしょうか？


## ゼロトラスト・CASBとの違い


### ゼロトラストとSASEの違い

　ゼロトラストは「情報にアクセスしてくるデバイス・利用者を一切信用しない」「認証したあとも最低限の権限しか与えない」というセキュリティ設計の考え方になります。ゼロトラストを掲げている製品は、こういった考え方のもと、サービスやソリューションを提供しています。

　SASEとして提供されるソリューションには、この考え方を取り入れたセキュリティ設計がなされることになります。[^4]


### SASEとCASBの違い
　CASB(Cloud Access Security Broker)は「キャスビー」と読みます。こちらもGartner社が提唱した概念です。シャドーITなどが問題になり、こうした問題を回避しつつも、利用者の利便性を上げるための情報セキュリティに関するコンセプトです。構成される機能は主に以下のようなものがあります。[^5]

- クラウドサービスの利用状況の可視化/制御
- アクセス権限の監視
- データ持ち出しのチェック/ブロック
- セキュリティポリシーの準拠監査
- 脅威の検出/分析/防御

　これらの機能を実現するために、例えば利用者～クラウド間に監視ポイントを設け、そこで上記機能を提供し、セキュリティの強化を高める仕組みが考えられます。

　SASEを掲げるソリューションの中にはCASBの仕組みを含めて提供しているものもあるようです。



## おわりに

　まだ新しい概念のため、各社それぞれ工夫を凝らしてサービスを提供しているようです。また、「SASE入れとけば安心」みたいなものではないのですが、更にバズって来ると上の方からそういうことを聞かれることがあるかもしれません。どういうものかを分かりやすく説明できるようにしておく必要はありそうです。



## 参考文献

[^1]: [第1回：SASE登場の理由と3つのエッジ \- ZDNet Japan](https://japan.zdnet.com/article/35163107/)
[^2]: [SASE（Secure Access Service Edge）とは？仕組みやメリットについて徹底解説](https://cybersecurity-jp.com/column/35849)
[^3]: [注目のSASE（サッシー）それだけでは足りないクラウド活用の3つのポイント \- IIJ Omnibus](https://www.iij.ad.jp/svcsol/campaign/sase_202010.html?m=0619c)
[^4]: [SASE とゼロトラストの違いを簡単に説明](https://securitychecklist.net/hikaku/ZTN/sasuke-vs-zero_trust.html)
[^5]: [CASBとは何か？基本を解説](https://products.nvc.co.jp/forcepoint/blog/what-is-casb)
SHA-1, SHA-2とは

## 勉強前イメージ

あんまり良くわかってない・・・・
SHA1は廃止されたとは言ってたけど
暗号化アルゴリズム？

## 調査

### SHA-1, SHA-2とは

Secure Hash Algorithmシリーズの暗号学的ハッシュ関数 の略で、サーバー証明書で使用される署名アルゴリズムに利用されているハッシュ関数です。
もちろんサーバ証明書のチェックのための技術でないため、他の箇所にも使われています。

わかりやすく言うと
サーバ証明書が正しいものかチェックするのは、
`サーバ証明書に付与された署名(証明書をハッシュ化して、認証局の公開鍵で暗号化したもの)を復号化した内容` と `SSLサーバ証明書をハッシュ化した値` を比べます。
このときに使用される `ハッシュ関数` がSHA1,SHA2と呼ばれるものです。


### SHA-1

任意の長さの元データを元に160ビットの値を生成するハッシュ関数。
NSA(米国家安全保障局)が考案し、1995年にNIST(米国立標準技術研究所)により標準化されました。
2005年にSHA-1に対する攻撃法が発見されSHA-2への移行が推奨されています。

### SHA-2

SHA-1を元に改良が加えられたハッシュ関数。
こちらも、2001年にNSAが開発しNISTにより標準化されました。
SHA-2 には、 `SHA-224` , `SHA-256` , `SHA-384` , `SHA-512` と種類があり、末尾の数字がハッシュ値のビット長を表しています。
一般的には、 `SHA-256` がよく使用されています。

## 勉強後イメージ

全然暗号化アルゴリズムじゃなかったwww
ハッシュ化するときの関数かー
そうなれば、ハッシュ化と暗号化って何が違うんやろ・・・わからなくなってきた。今度調べる

## 参考

- [5分でわかるSSL通信　SHA-1、SHA-2の違いとは？](https://geechs-job.com/tips/details/37)
- [SHA-1/SHA-2とは何か、SSLのどこで利用されているのか](https://qiita.com/pink/items/7329d6931545b3450f0f)
- [SHA-1、SHA-2、SHA256が結局なんなのかわからないので調べた](https://qiita.com/souhub/items/025353003c5acb6e89fb)
Mac + US配列キーボード で ` (バッククォート) を入力すると § (セクション)  が出力されてしまう

# 状況

`` `(バッククォート)``を入力すると、`§(セクション)`が出力されてしまう。
同様に`~(チルダ)`を入力すると、`±(プラスマイナス)`が出力されてしまう。
Karabinerの設定を見ても特に変換はしていない。
日本語キーボードから入力しても同様に発生する。
一体何が原因なんだ、、、。

# 原因と対策
MacOSのキーボードの種類の設定が原因でした。
この現象が発生している場合は、`ISO（欧州）`を選択してしまっています。

![スクリーンショット 2021-01-16 11.50.17.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/547464/f7765df3-da0d-2479-1b99-413e4cc45ba2.png)

おとなしく`ANSI（米国その他）`を選択しましょう。
![スクリーンショット 2021-01-16 11.51.23.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/547464/1962a46d-40f6-27be-bc93-4a7fd7f91a9e.png)

この設定は、`システム環境設定 > キーボード > キーボードタブ > キーボードの種類を変更...`から変更できます。

![スクリーンショット 2021-01-16 12.02.59.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/547464/df453239-538c-ddac-2ae9-a13fdccd02ec.png)

# 「キーボードの種類を変更」が表示されない場合

以下のファイルを手動起動することにより変更できるようです。

```
Macintosh HD/システム/ライブラリ/CoreServices/KeyboardSetupAssistant.app
```

参考: [Macキーボードの「JIS / US」を手動で切り替える](https://kobe-tshirt.com/mac-keyboard-jis-us/)

# 記号の英語読み（余談）
ちなみに、この問題を調べる際に日本語で情報が出てこないため英語で調べようとしたが、まず記号の英語読みがわからない、、、。
調べるのに少し苦労したが、以下の読み方らしい。

| 記号 | 英語読み |
| --- | --- |
| ` | grave accent |
| ~ | tilde |
| § | section mark |
| ± | pulus-minus sign |

# キーリマップの方法（もう一つ余談）

筆者はKarabinerくらいしか知らなかったが、`hidutil コマンド`というものでも変更できるらしい。
以下の記事が詳しい。

[macOS Sierra でキー入力のリマップをする方法](https://dev.classmethod.jp/articles/remapping-keys-in-sierra/)
インタプリタとコンパイラの違い

# コンパイラとは
人間が理解できるように書かれたコンピュータ言語はHTMLやCSS、Rubyですが、
その言語をコンピュータが理解できるように変換してくれるのが<font color="Red">コンパイラ</font>です。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/332381/07070944-936c-09dd-7dca-64900628828e.png)

コンパイラは上図のように、人間が書いたソースコード、を機械が理解できる<font color="Red">バイナリコード</font>に変換してくれます。
バイナリコードは２進数で表されるもので、例えば「こんにちは」は「11100011 10000001 10010011 11100011 10000010 10010011 11100011 10000001 10101011 11100011 10000001 10100001 11100011 10000001 10101111」と表現されます。

このように人間が理解できるソースコードをバイナリコードに変換するのが<font color="Red">コンパイラ</font>や<font color="Red">インタプリタ</font>と呼ばれるものなのです。

#コンパイラとインタプリタの違い
コンパイラとインタプリタではバイナリコードへの変換方法が異なります。

## コンパイラは翻訳家
コンパイラはソースコードの全てをまとめてバイナリコードに翻訳します。

例えるならば、<font color="Red">英語で書かれた本を全てまとめて日本語に翻訳する「翻訳家」のような役割</font>です。この特徴はプログラミング用語で「一括翻訳型（いっかつほんやくがた）」と呼ばれています。

## インタプリタは同時通訳者
コンパイラが翻訳家だとしたら、インタプリタは同時通訳者と言えます。
インタプリタは<font color="Red">ソースコードを１行ずつバイナリコードに翻訳する</font>という特徴があるからです。

この特徴を逐次翻訳型（ちくじほんやくがた）と呼びます。下図コードを1行ずつ順番に翻訳していくような流れです。

# コンパイラのメリット・デメリット
##コンパイラのメリット　
- プログラムの実行速度が早い

##コンパイラのデメリット
- プログラム実行に手間がかかる
- エラーを見つけにくい

##インタプリタのメリット　
- プログラムをすぐに実行できる
- エラーを見つけやすい

##インタプリタのデメリット
- 実行速度が遅い

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/332381/bc8703ae-a132-3fa1-4284-bdf79a782b04.png)

使用される場面によって向き不向きがあるので、上手に使い分けられるといいですね。

# 参考
https://blog.codecamp.jp/compiler-interpreter-commentary
https://wa3.i-3-i.info/word12211.html
Linux【シェルコマンド】

#はじめに
これは学習用のメモになります。
今回はよく使うシェルコマンド（ショートカットキー）を学習していきます。

#カーソル移動
|コマンド| 内容
|:------:|:------:|
|Ctrl+f| 1文字次へ移動| 
|Ctrl+b| 1文字前へ移動| 
|Ctrl+a| 行の先頭に移動| 
|Ctrl+e| 行の最後に移動| 
|Meta+f(esc+f)| 一単語次へ移動| 
|Meta+b(esc+b)| 一単語前へ移動| 

#文字列の編集
|コマンド| 内容
|:------:|:------:|
|Ctrl+h| カーソルの左1文字削除| 
|Ctrl+d| カーソル部分を1文字削除| 
|Ctrl+w| カーソル位置の単語を削除（カーソルの前の部分）| 
|Ctrl+u| カーソルの位置から行頭まで削除| 
|Ctrl+k| カーソルの位置から行末まで削除| 
|Ctrl+y| 最後に削除した内容を挿入| 

#トラブル時の対応
|コマンド| 内容
|:------:|:------:|
|Ctrl+c| 実行中のコマンドを強制終了| 
|Ctrl+l| 画面の消去。文字化けしたときのクリアにも使える| 
|Ctrl+s| 画面表示のロック（キーボードから文字の入力を受け付けない）| 
|Ctrl+q| 画面表示のロックを解除| 

#補完・コマンド履歴
|コマンド| 内容
|:------:|:------:|
|Tab| コマンドやパスの補完| 
|Ctrl+p、または↑キー| 一つ前の履歴を見る| 
|Ctrl+n、または↓キー| 一つ後の履歴を見る| 
|Ctrl+r| コマンド履歴のインクリメンタル検索|
vscodeでArduinoを開発する@Ubuntu

環境はUbuntu20です。

Arduinoを/opt/にダウンロードインストールします。

````
wget https://downloads.arduino.cc/arduino-1.8.13-linux64.tar.xz ;
tar xvf arduino-1.8.13-linux64.tar.xz ;
sudo mv arduino-1.8.13-linux64 /opt/ ;
cd opt arduino-1.8.13-linux64/ ;
sudo ./install ;
````

vscodeのインストール

公式サイトからダウンロード

````
https://code.visualstudio.com/download
````

Ubuntuなのでdebを選択してファイルをダウンロードし、インストールを行う。

````
sudo apt install ~/Downloads/code_* ;
````

vscode の起動

````
code ;
````

vscodeにArduinoを認識させます。

まずは拡張機能 Arduino（Microsoft製）のインストール

````
ctrl + shift + x
````

もしくは

````
File -> Preferences -> Extensions
````
Arduino（Microsoft製）を選択

次に、/opt/にインストールしたArduinoのパスを設定します。
設定画面を開く

````
ctrl + ,
````

もしくは

````
File -> Preferences -> Settings
````

|項目|設定値|
|---|---|
|Arduino: Command Path|arduino|
|Arduino: Path|/opt/arduino-1.8.13|

サンプルプログラムを開く

````
ctrl + shift + p
↓
Arduino:Examples
````

ボードの指定を行います。

````
ctrl + shift + p
↓
Arduino:Board Config
````

例）

|項目|設定値|
|---|---|
|Selected Board|Arduino Nano|
|Prosessor|ATmega328P(Old Bootloader)|

スケッチをボードへアップロード

````
ctrl + alt + u
````

シリアルポートを指定
例）
ttyUSB0

usbシリアルポートを書き込みできるようにします。

````
sudo chmod a+rw /dev/ttyUSB0 ;
````

ただ、これは毎回コマンドを打つのが面倒なのでudevにルールを記載します。

````
sudo gedit /lib/udev/rules.d/50-udev-default.rules;

# serial
KERNEL=="tty[A-Z]*[0-9]|pppox[0-9]*|ircomm[0-9]*|noz[0-9]*|rfcomm[0-9]*", GROUP="dialout", MODE="0666"
````

シリアルモニタの表示

````
ctrl + shift + p

Arduino:Open Serial Monitor
````

よく使用しますのでテキスト横の歯車をクリックしてショートカットを割り当ててもいいかと思います。

転送速度をUSBタイプに指定します。
ウィンドウ右下の数字115200をクリック
例）
9600
Raspberry PiでKubernetes 1.20.1が不安定だったので対処したときのこと

# はじめに

おうちラズパイを作っていてKubernetest v1.20.1をセットアップしたけど動きがすごい不安定だったので対処したときのメモ。

結論から言うとk8sのバージョンを落とすと安定しました。

# 症状

環境: Raspberry Pi Model B 8GB

```
uname -a
Linux k8s-master 5.4.79-v7l+ #1373 SMP Mon Nov 23 13:27:40 GMT 2020 armv7l GNU/Linux
```


```
apt-get update
apt-get install -y kubelet kubeadm kubectl
```

でセットアップした場合、現行では v1.20.1が入った。このままクラスタを構成したら、挙動が非常に不安定になった。具体的には20分に1回くらいの割合でlivezやreadyzがconnectin refusedを起こして再起動を繰り返す。そのせいでkubectlがエラーを頻発しとても使いづらくなった。

いろいろ調べたけど決め手になる情報を見つけることができなかった。

# 対策

いろいろ試した挙げ句 v1.19.6にすることで安定した。
dockerをセットアップするところからログを貼っておきます。

```
sudo -i
wget https://download.docker.com/linux/debian/dists/buster/pool/stable/armhf/containerd.io_1.4.3-1_armhf.deb
wget https://download.docker.com/linux/debian/dists/buster/pool/stable/armhf/docker-ce-cli_20.10.1~3-0~debian-buster_armhf.deb
wget https://download.docker.com/linux/debian/dists/buster/pool/stable/armhf/docker-ce_20.10.1~3-0~debian-buster_armhf.deb
dpkg -i containerd.io_1.4.3-1_armhf.deb
dpkg -i docker-ce-cli_20.10.1~3-0~debian-buster_armhf.deb
dpkg -i docker-ce_20.10.1~3-0~debian-buster_armhf.deb
docker version
sudo apt-mark hold docker-ce
usermod -aG docker pi

apt-get update && apt-get install -y apt-transport-https curl
curl -s https://packages.cloud.google.com/apt/doc/apt-key.gpg | apt-key add -

cat <<EOF | tee /etc/apt/sources.list.d/kubernetes.list
deb https://apt.kubernetes.io/ kubernetes-xenial main
EOF

apt-get update
apt-get install -y kubelet=1.19.6-00 kubeadm=1.19.6-00 kubectl=1.19.6-00
apt-mark hold kubelet kubeadm kubectl
```

```
kubeadm version -o yaml
clientVersion:
  buildDate: "2020-12-18T12:07:25Z"
  compiler: gc
  gitCommit: fbf646b339dc52336b55d8ec85c181981b86331a
  gitTreeState: clean
  gitVersion: v1.19.6
  goVersion: go1.15.5
  major: "1"
  minor: "19"
  platform: linux/arm
```

クラスタを構成する場合にk8sのバージョンを指定する。セットアップのメモリ検証時にエラーが発生したので`--ignore-preflight-errors=Mem`を追加した

```
kubeadm init  --kubernetes-version=1.19.6 --pod-network-cidr=10.244.0.0/16 --ignore-preflight-errors=Mem
```

これで普通に動くようになった。

# おわりに

1.20.xはRPiには早かったか。ちなみに安定後も[これ](https://github.com/kubernetes/kubernetes/issues/95039)が出続けている。どうもARM環境独特の問題みたいだけど特に障害にはなっていない。
【新人注目】データベースの主キーと外部キーのお話



## 主キーとは
データベースを扱う際に、必ずひとつの情報を特定できるキーとなるものが必要になります。
例えば、大学でいう学籍番号のようなものです。
この番号があれば、``S12H1234という学籍番号は田中太郎くんだ``というように、特定をすることができます。

データベースの表には必ずひとつひとつの行（レコード）を識別することができるように、キーとなる情報が必ず含まれるようになっています。これが主キーです。

### 主キーを構成する列に必要な条件
重複していないこと
空でないこと

このふたつが主キーに必要な条件。
 

## 外部キーとは
アプリケーションを開発する中で、使用するのがリレーショナルデータベースというものです。これはひとつひとつの表を関係付けできることが特徴になります。表と表とを関係付けるために、``外部キー``というものを使います。

学生表

| 学籍番号 | 名前 | 学部ID |
|:-:|:-:|:-:|
| S12463545 | 田中太郎  |  1 |
| S12346456 | 鈴木一郎  |  2 |
| S14345678 | 山田二郎  |  3 |

学部表

| 学部ID | 学部名 | 
|:-:|:-:|:-:|
| 1 | 法学部  |
| 2 | 経済学部  |
| 3 | 体育学部  |

上の表からすると、学生表では学部表の主キーを参照し、外部キーとして学部IDの列を設けています。
これにより、``田中太郎くんの学部はどこ？という問いに対して、法学部というような返答ができる``ようになります。
[Unity]Input ManagerとInput Systemに初心者狩りされた話

## Input Manager(Input System) ってなに？

`W`,`A`,`S`,`D` キーを押したら前後左右に動く
`左クリック` したらFire1(攻撃モーション）をする

上記のようにキーに割り当てをするためにUnityがデフォルトで搭載している機能です。

## 初心者狩りされた話について

最初の説明を見た分には何も難しいことはなさそうですよね。
そうです、機能の内容は特に難しくありません。

Input ManagerとInput Systemの違いですが、前者が旧式で後者が新型です。
機能として変わったところは、１つのボタンを押してる時（Update中）に新しいキー入力（Start）を受け付けることができるようになったところだそうです。

ここまでは大丈夫なのですが。。。

Asset Storeでキャラクターのフリー素材をダウンロードしたところ、Input Managerはplayerの設定で使われていませんと出てきました。
じゃあ直そと思ってEdit->ProjectSettings->Playerで設定をInput Managerに直しました。

そしたら、今度は逆にStanderd AssetsでInput Systemがplayerの設定で使われていませんと出てきてしまいました。
じゃあどっちか片方のAssetしか使えないじゃん！となって「詰んだ」となったというお話でした。

※最終的には１日じゅう検索して、参考のブログに出会ってなんとかなりました


## エラー文の例
```
InvalidOperationException: You are trying to read Input using the UnityEngine.
Input class, but you have switched active Input handling to Input System package in Player Settings.
```

## 解決した方法
当初見落としていたEdit->ProjectSettings->Playerの設定の中に、両方使えるようにする（both）と言う選択肢があり、それを選択することで解決しました。

![スクリーンショット 2021-01-16 10.22.58.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/555157/2a437355-723e-270a-7d7d-e3422b90bfce.png)




## 非常に参考にさせてもらった記事
tomo_manaのブログ：https://tomo-mana.hatenablog.com/entry/20200807/1596810573
ubuntuでmkdirを使う


ubuntu＆C/C++でのプログラム中にmkdirを使っていてハマったので備忘録がわりに。

windowsだとあまり気にせずmkdir使ってもなんとかなるんやけど、
ubuntuで使うとオプション指定が必要。
まちがえるとアクセス権限がないディレクトリを作ってしまって、
直後のソースでそのディレクトリの中にファイルを新規作成するときに蹴られる。

なんで己の権限がないディレクトリが作れるんや。
意味わからんやんけ（仕様をちゃんと確認してないくせに逆ギレ）。
ディレクトリを作った直後にシステム側から権限を付与するから作るときは関係ないのか？
（ここまで書いてて◯ンター☓◯ンターの◯ラピカをちょっと思い出した）

さて、作りたかったのは、相対パスで指定したディレクトリ名にフルパスつけて、
そのディレクトリを作った上でそのフルパスを返す関数。
ディレクトリ作成に失敗したらなんせ空のstringを返すようにしとく（対応が雑）。

いいの。どうせシステム中ではディレクトリ構成がFIXされた状態でしか運用しない予定だから。
（↑こういう考えの奴がチーム開発の足を引っ張る）

※↓もとのソースをいじってアップしているから動作確認してません。

```C++
std::string create_dir(std::string dir_name)
{
	char buf[1024] = "";
	if (NULL == getcwd(buf, sizeof(buf)))
		return "";
	std::string new_dir = buf + std::string("/") + dir_name;
	if (0 != mkdir(new_dir.c_str(), S_IRWXO | S_IRWXU | S_IRWXG))
	{
		return "";
	}
	else
	{
		return new_dir;
	}
}
```

例えばここで、

```C++
	if (0 != mkdir(new_dir.c_str(), S_IRWXO))
```

とかやるとあとで後悔することになる。
自分で作ったくせに自分にはアクセス権限がないから（S_IRWXOは第三者へのフルアクセス権限付与）、
そのあとでファイルを中に作成しようとするとよくわからんことになる。

デフォルトで全員にフルアクセスにしといてくれたらいいやんか。
意識高い人は自分でオプション指定するやろ。
しかもmkdirのページにオプションのこと書いてないやんけ。
どういうことやねん。せめてリンク貼れ。。
【PHP】array_filterの色々な書き方

# array_filterとは

```php
array_filter(array $array, callable|null $callback = null, int $mode = 0): array
```

>(PHP 4 >= 4.0.6, PHP 5, PHP 7)
>array_filter
>コールバック関数を使用して、配列の要素をフィルタリングする
>[公式より](https://www.php.net/manual/ja/function.array-filter.php)


配列を非破壊的にフィルターするPHPの内部関数です

# パターン 1 (コールバック関数)
```php
$arr = ['a', 'b'];

$res = array_filter($arr, function($val) {
    return $val === 'a';
});
// ['a']
```
【メリット】
・一番王道（多分）
・読みやすい
・関数名を考えなくてよい

【デメリット】
・条件式を再利用することができない

# パターン 2 (クロージャ)
```php

$arr = ['a', 'b'];

$func = function($val) {
    return $val === 'a';
};

$res = array_filter($arr, $func);
// ['a']
```
【メリット】
・関数($func)のスコープを狭めることができる

【デメリット】
・見慣れていない人にとっては読みにくい
・func内で、スコープ外の変数を扱う時に必要
（useは変数が定義された時の値となるため）


# パターン 3 (関数)
```php
$arr = ['a', 'b'];

function func($val) {
    return $val === 'a';
}

$res = array_filter($arr, 'func');
// ['a']
```
【メリット】
・同じ条件でフィルターしたい時、関数を再利用することができる

【デメリット】
・関数をグローバルに定義している、汚染しないような工夫が必要


# パターン 4 (クラスのメリット)
```php
class Filter {

    public function func($val) {
        return $val === 'a';
    }
}

$arr = ['a', 'b'];
$obj = new Filter;

$res = array_filter($arr, [$obj, 'func']);
// or
$res = array_filter($arr, [new Filter, 'func']);
// ['a']
```
【メリット】
・フィルター用のクラス（関数群）を用意することができる

【デメリット】
・呼び出し元でnewが必要
・クラスの中身を見ないと、条件式が見れない

# パターン 5 (クラスの静的メソッド)
```php
class Filter {

    public static function func($val) {
        return $val === 'a';
    }
}

$arr = ['a', 'b'];

$res = array_filter($arr, 'Filter::func');
// or
$res = array_filter($arr, ['Filter', 'func']);
// ['a']
```
【メリット】
・フィルター用のクラス（関数群）を用意することができる

【デメリット】
・クラスの中を見ないと、条件式が見れない

# パターン 6 (マジックメソッド __invoke())

```php
class Filter {

    public function __invoke($val) {
        return $val === 'a';
    }
}

$arr = ['a', 'b'];

$res = array_filter($arr, new Filter);
// ['a']
```
【メリット】
・呼び出し元での、コード量が少ない

【デメリット】
・フィルター用に1つクラスを用意することになる

# パターン 7 (アロー関数)

```php
$arr = ['a', 'b'];

$res = array_filter($arr, fn ($val) => $val === 'a');
// ['a']
```
【メリット】
・コード量が少ない
・JavaScriptを書いている人にとっては、読みやすいかも？

【デメリット】
・php 7.4以上でないと使えない
[・コールバック関数(パターン1)より遅いらしい](https://mebee.info/2021/01/08/post-24670/)
※コメントにも書きましたが、早い時と遅い時があるようです
## パターン おまけ（null）

``` php
$arr = ['a', ''];

$res = array_filter($arr);
// ['a']
```
空を取り除いてくれます。内部的には``empty()``を行っています。


# おわりに
調べてみたら奥が深かったです。
よほどのことがない限り、パターン1,2かなと思っています。
新しい記法見つけたら、追記していきます。


# 参考
[コールバック/Callcable(公式)](https://www.php.net/manual/ja/language.types.callable.php)
初心者限定！！Vueで横幅（width）の変化を検知する方法

今回は、タイトルにも書いてる通りwindowの横幅の変化を検知したいと思います！！！

長ったらしい話はせずにもうコードを書いていきますね！

まず、初めにdataオブジェクトで``currentWidth``というプロパティを宣言し、横幅が変化するたびに呼び出す関数を設定していきます。

```App.vue
<script>
export default {
  data() {
    return {
      currentWidth: window.innerWidth,
    }
  },
  methods: {
    calculateWindowWidth() {
      // 横幅を取得する関数
      this.windowWidth = window.innerWidth
    }
  }
}
</script>
```

初期値として、``window.innerWidth``を設定しておきます。

次に、DOM要素と紐づけられた後に行う関数``mounted``、DOM要素が消去される前の関数``beforeDestroy``を用いて、横幅の変更を検知します。

```App.vue
<script>
export default {
  data() {
    return {
      currentWidth: window.innerWidth,
    }
  },
  mounted() {
    // 横幅の変更を検知
    window.addEventListener('resize', this.calculateWindowWidth)
  },
  beforeDestroy() {
    // 横幅の変更を検知
    window.addEventListener('resize', this.calculateWindowWidth)
  },
  methods: {
    calculateWindowWidth() {
      // 横幅を取得する関数
      this.currentWidth = window.innerWidth
    }
  }
}
</script>
```

いかがだったでしょうか？

僕は、最初に``computed``で行ってしまい横幅の変更を検知してくれませんでした。

最初は``computed``便利だな～って思ってたんですけど、最近使い方が難しいことに気づきました。

なんとなく出来たので良しとします。

以上、「初心者限定！！Vueで横幅（width）の変化を検知する方法」でした！

良かったら、LGTM、コメントお願いします。

また、何か間違っていることがあればご指摘頂けると幸いです。

他にも初心者さん向けに記事を投稿しているので、時間があれば他の記事も見て下さい！！

Thank you for reading
超簡単！サクッとDockerにPython + Flask環境

[週末ハッカソン](https://twitter.com/hashtag/%E9%80%B1%E6%9C%AB%E3%83%8F%E3%83%83%E3%82%AB%E3%82%BD%E3%83%B3) で
WEBサイトを作ろうと思いDockerにPython + Flask環境を構築した

**ダウンロード・インストール**
Get Docker for Macからダウンロード
[https://docs.docker.com/docker-for-mac/install/]()
ダウンロードしたDocker.dmgを展開してインストール完了
インストール後にチュートリアル開始
NEXT STEP を押していき動作確認

**Python + Flask環境**    

*Dockerfile*

```Dockerfile
FROM python:3.7.4

WORKDIR /app
ADD . /app

RUN apt-get update && apt-get clean;

RUN pip install -r requirements.txt

ENV TZ Asia/Tokyo
ENV LANG ja_JP.UTF-8
ENV LANGUAGE ja_JP:ja
ENV LC_ALL ja_JP.UTF-8
ENV FLASK_APP /app/app.py
ENV PYTHONPATH $PYTHONPATH:/app

ENV PORT 8080
EXPOSE 8080

CMD ["python", "app.py"]
```

サンプル用アプリ  
コードの中身が知りたい方は[Document](https://flask.palletsprojects.com/en/1.1.x/)を参照してください。  

```HTML
weekend-hackathon/  
|-- app  
|   |-- views  
|   |	 `-- sample.py  
|   `-- __init__.py  
|-- app.py  
|-- Dockerfile  
`-- requirements.txt  
```

*weekend-hackathon/requirements.txt*  

```
Flask==1.1.2
```

*weekend-hackathon/app/views/sample.py*  

```Python
from flask import Blueprint

sample = Blueprint("sample", __name__)


@sample.route("/")
def index():
    print("sample.index")
    return "sample.index"

```

*weekend-hackathon/app/\_\_init\_\_.py*  

```Python
from flask import Flask
from app.views.sample import sample


def get_app():
    app = Flask(__name__)
    _register_blueprint(app)
    return app


def _register_blueprint(app):
    app.register_blueprint(sample)

```

*weekend-hackathon/app.py*  

```Python
import app

app = app.get_app()

if __name__ == "__main__":
    app.run(host="0.0.0.0", port=8080, debug=True)

```

**Docker ビルド**

```
$ docker build -t weekend-hackathon .
```

**Flask起動**

```
$ docker run --name weekend-hackathon -p 8080:8080 -v ~/Sites/weekend-hackathon/:/app -it --rm weekend-hackathon
```

http://localhost:8080/にアクセス  
`sample.index` が表示される。


**参考コマンド**  

1. イメージ確認 : ```docker images```  
2. コンテナ確認 : ```docker ps```  
3. コンテナ確認（停止） : ```docker ps -a```  
4. コンテナ起動 : ```docker start xxxxx```  
5. コンテナ接続 : ```docker exec -it xxxxx /bin/bash```    
6. コンテナ停止 : ```docker stop xxxxx```  
7. コンテナ削除 : ```docker rm xxxxx```  
8. イメージ削除 : ```docker rmi xxxxx```
SQL 重複レコードの検索

## 重複レコードを検索するSQL
ほとんど自分用のメモです。

```sql
SELECT *
FROM `テーブルA` AS table1
WHERE EXISTS(
              SELECT table2.`列A`
              FROM `テーブルA` AS table2
              WHERE table1.`列A` = table2.`列A`
              GROUP BY table2.`列A`
              HAVING COUNT(table2.`列A`) > 1
          )
ORDER BY table1.`列A`;
```

## 参考
[重複しているレコードを検索するSQL(大量データも対応)](https://qiita.com/necoyama3/items/4c24defd6f504366aebe)
【Vue】親から孫へとPropsを受け渡す方法

#はじめに
本記事へのアクセスありがとうございます。
Atomic designの実装においてPropsによるデータの受け渡しが多発したので、親コンポーネントから孫コンポーネントまでの一連のデータの流れを備忘録も兼ねて記事に残したいと思います。
では、さっそく見ていきましょう。
#親から孫コンポーネントへ
##親コンポーネント

```vue
<template>
  <div>
    <child :parent-to-child-prop="sendData" />
  </div>
</template>
<script>
export default {
  components: {
    Child: () => import('@/components/Child')
  },
  data() {
    return {
      sendData: '親から孫へ'
    }
  }
}
</script>
```

##子コンポーネント

```vue
<template>
  <div>
    <grand-child :child-to-grand-child-prop="parentToChildProp"/>
  </div>
</template>
<script>
export default {
  props: {
    parentToChildProp: {
      type: String,
      default: ''
    }
  },
  components:{
    GrandChild: () =>import('@/components/GrandChild')
  }
}
</script>
```
##孫コンポーネント

```vue
<template>
  <div>
    {{ childToGrandChildProp }}
  </div>
</template>
<script>
export default {
  props: {
    childToGrandChildProp: {
      type: String,
      default: ''
    }
  }
}
</script>
```

#おわりに
propsを用いるときはtypeとdefaultは設定しておきましょう。
また、テンプレート内にcomponentを書くときはケバブケースでpropsで貰って使うデータはキャメルケースで書くようにしています。
誰かのお役に立てれば幸いです🙇‍♂️
Web API入門#7 〜ステータスコードの意味と活用〜

## はじめに

タイトルについて記事にしました。
この記事で得る内容は以下の通りです。

・ ステータスコードの意味と活用方法について

■ Web API入門についての過去記事
・ [Web API入門#1 〜APIとWeb API、Webの概要〜](https://qiita.com/s79ns/items/8dd2f06145cbf9464b99)
・ [Web API入門#2 〜REST、アーキテクチャについて〜](https://qiita.com/s79ns/items/bd8b1f50c34ada016196)
・ [Web API入門#3 〜URIの基礎知識〜](https://qiita.com/s79ns/items/c4ec2db048fa3b13638e)
・ [Web API入門#4 〜クールなURIの設計方法について〜](https://qiita.com/s79ns/items/e2f3b6f66059c2917206)
・ [Web API入門#5 〜HTTPの基礎〜](https://qiita.com/s79ns/items/31a6f6affdd28bb8b026)
・ [Web API入門#6 〜CRUDとHTTPメソッド〜](https://qiita.com/s79ns/items/9b0f76f4bfdf4140a506)

#### ステータスコード

HTTP通信には、リクエストとレスポンスが存在します。レスポンスを受け取った際に、どんな応答が返ってきているのか簡潔に分かりやすくしたものが3桁のステータスコードです。
ステータスコードの処理結果に応じて条件分岐をさせることができますし、仮に処理が失敗してもエラー処理を行う...といったプログラムを定義することができます。

## ステータスコードの大分類

ステータスコードは、基本的に3桁で1xx,2xx...のように処理結果に応じて先頭の数字が変化します。
従って、先頭の数字でどのようなレスポンスが返ってきているのかを把握することができます。

| ステータスコード | 意味 | 詳細 |
|:------------:|:---:|:---:|
| 1xx | 処理中 | 処理が継続中<br>クライアントがそのままリクエストを継続か再送信するか判定 |
| 2xx | 成功 | リクエストの成功 |
| 3xx | リダイレクト | 他のリソースへのリダイレクト<br>Locationヘッダーを見て新しいリソースへ接続 |
| 4xx | クライアントエラー | クライアントのリクエストが原因でエラーが発生 |
| 5xx | サーバーエラー | サーバー側で何らかのエラーが発生 |

例えば、444のような不吉（？）で未知のステータスコードが表示されていても、先頭のコードを見れば
クライアント側で起きているエラーと大枠で判別することができます。

## よく見かけるステータスコード（OK）

よく見かけるステータスコードの成功した際に表示される場合について表にしました。

| ステータスコード | テキストフレーズ | 意味・特徴 |
|:------------:|:---:|:---:|
| 200 | OK | GET：取得したリソースがメッセージ本文で送信される<br>HEAD：ヘッダー情報がメッセージ本文で送信される<br>PUT or POST：操作の結果がメッセージ本文で送信される|
| 201 | Created | 新たなリソースが作成された<br>PUTまたはPOSTのレスポンス |
| 204 | No Content | リソースのレスポンスとして送信するコンテンツはないが<br>リクエストは成功 |
| 301 | Moved Permantly | リソースの恒久的な移動 |

301については、過去記事の[Web API入門#4 〜クールなURIの設計方法について〜](https://qiita.com/s79ns/items/e2f3b6f66059c2917206)でご紹介しました
301リダイレクトの際に表示されるもので、リソースが古いURIから新しいURIに移動されたので、そちらに移動して下さいという意味です。

## よく見かけるステータスコード（エラー）

よく見かけるステータスコードのエラー時に表示される場合について表にしました。

| ステータスコード | テキストフレーズ | 意味・特徴 |
|:------------:|:---:|:---:|
| 400 | Bad Request | リクエストの構文やパラメータが間違っている |
| 403 | Forbidden | コンテンツへのアクセス権がない（認証されていない） |
| 404 | Not Found | リソースが存在しない・URIを解釈できなかったなど |
| 500 | Internal Server Error | サーバー側で処理できないエラーが発生した |
| 502 | Bad Gateway | ゲートウェイとなるサーバーが正常に動作しなかった |
| 503 | Service Unavailable | サーバーがメンテナンスや過負荷などでダウンしている |

403は、ログインの認証が必要なページに直接アクセスしたり、認証をしないと取得できないリソースにGETメソッドを実行したりすると返ってきます。

他にもステータスコードはたくさんありますので、興味がある方は[HTTP レスポンスステータスコード](https://developer.mozilla.org/ja/docs/Web/HTTP/Status)というサイトを覗いて見て下さい。

## 次の記事はこちら

[Web API入門#8 〜HTTPヘッダー・キャッシュ〜](https://qiita.com/s79ns/items/c39e9fc3cc117348b269)
pandasのDataFrame 2つのリストからDataFrameを作ってファイル書き出しまで

# 初めに

DataFrameって難しい。次の問題に頭を悩ませる。

- list1とlist2をインデックス0とインデックス1に格納？
- list1とlist2のインデックスが揃っているところでペア？

私の編み出した覚え方は、"知りたいのは<strong>アリス</strong>の<strong>身長</strong>"。
これで「あ、アリスとアリスの身長をペアにすればいいんだ！」となる。

以下では2つの配列からDataFrame経由でファイル書き出しまで書き留める。

# 2つの1次元配列 → 2次元配列 → DataFrame → csvファイル

```python
import pandas as pd

list1 = ['Alice', 'Bob', 'Charlie']
list2 = ['165', '175', '180']

dim2list = [[list1[i], list2[i]] for i in range(len(list1))]
df = pd.DataFrame(dim2list, columns=['Name', 'Length'])

df.to_csv('output.csv', index=False, header=True)

```

```output.csv
Name,Length
Alice,165
Bob,175
Charlie,180
```

# 2つの1次元配列 → 2次元配列 → DataFrame → txtファイル

```python
import pandas as pd

list1 = ['Alice', 'Bob', 'Charlie']
list2 = ['165', '175', '180']

dim2list = [[list1[i], list2[i]] for i in range(len(list1))]
df = pd.DataFrame(dim2list, columns=['Name', 'Length'])

df.to_csv('output.txt', sep='\t', index=False, header=True)
```


```output.txt
Name	Length
Alice	165
Bob	175
Charlie	180

```

# 参考記事
- note.nkmk.me
https://note.nkmk.me/python-pandas-to-csv/
Anaconda3インストール後に、コマンドライン環境設定で「zsh: no such file or directory: /opt/anaconda3/bin/conda」のエラー

自宅MacにAnaconda３をインストールしようとしたら初回でつまづきました。

パッケージインストールまではうまくいき、コマンドライン環境設定で、

>/opt/anaconda3/bin/conda init zsh

上記コマンドを実行すると、

>zsh: no such file or directory: /opt/anaconda3/bin/conda

:frowning2:

#解決方法：
Anaconda３のインストール先をアプリケーション内にしていたのが原因でした。
MacintoshHDにインストール先を変更し、コマンドを実行して、無事成功:girl_tone2:

###参考にしたURL
https://www.python.jp/install/anaconda/macos/install.html
リモート先の Mac で Docker login できない（Error saving credentials）

> リモート先（`ssh` 接続先）の macOS で `docker login` するとエラーが出ます。

```shell-session
$ docker login
Login with your Docker ID to push and pull images from Docker Hub. If you don't have a Docker ID, head over to https://hub.docker.com to create one.
Username: keinos
Password: 
Error saving credentials: error storing credentials - err: exit status 1, out: `error storing credentials - err: exit status 1, out: `User interaction is not allowed.``
```

[「mac docker login できない」でググって](https://www.google.com/search?q=mac+docker+login+%E3%81%A7%E3%81%8D%E3%81%AA%E3%81%84)もドンピシャの記事が出てこなかったので、自分のググラビリティとして。

## TS; DR

> 「キーチェーンアクセス」にロック（アクセス制限）がかかってます。

画面共有でリモート先を確認するか、以下のコマンドでロックを解除します。

```bash:キーチェーンアクセスの解除コマンド（要パスワード）
security unlock-keychain
```

## TL; DR

macOS には「[キーチェーンアクセス](https://ja.wikipedia.org/wiki/Keychain)」と呼ばれる、パスワード・公開鍵・秘密鍵などの情報を一元管理する標準アプリがあります。iCloud 同期されるので、同じ Apple ID であれば別の環境でも保存されたパスワードが同期されます。

- 参考文献: [macOS の標準機能でパスワードをランダム生成する方法](https://qiita.com/KEINOS/items/fd49c4ece0890fb5843f) @ Qiita

[1password](https://1password.com/jp/) のような便利さがある反面、セキュリティのため色々と動作にシビアな面があります。

そのうちの 1 つに、キーチェーンアクセスの許可が必要な OS やアプリのアップデートが行われると**ユーザが承認するまでリモート操作の一部が制限される**ことがあります。

特に `docker login` などの、パスワード情報をキーチェーンアクセスに保存して利用するタイプのセキュリティ重視のアプリがリモート先で何かしらのポップアップを表示している場合です。

```shell-session
$ # ロックがかかっているパターン
$ docker login
Login with your Docker ID to push and pull images from Docker Hub. If you don't have a Docker ID, head over to https://hub.docker.com to create one.
Username: keinos
Password: ******
Error saving credentials: error storing credentials - err: exit status 1, out: `error storing credentials - err: exit status 1, out: `User interaction is not allowed.``

$ # ロック解除
$ security unlock-keychain
password to unlock default: ******

$ docker login
Login with your Docker ID to push and pull images from Docker Hub. If you don't have a Docker ID, head over to https://hub.docker.com to create one.
Username: keinos
Password: ******
Login Succeeded
```

私の場合、リモート先の macOS が HighSierra (OSX 10.13.6) であったため、Docker の最新バージョンがあるものの「使えないよ」と叱られていました。このポップアップが表示された状態でも、`security unlock-keychain` を実行すれば先に進めました。

![Docker_OSX_10.13_is_not_supported.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/78776/6d8f48fb-450f-8a47-4665-bc0df2ad2db5.png "OS X 10.13 is not supported. There is an update but you are on OS X 10.13 or an earlier version. Upgrade to the latest version of macOS to install it.")


### 参考文献

- [macOS の「画面を共有」でログインできないが SSH 接続できる時の対処法](https://qiita.com/KEINOS/items/de47e470407a5c5bb960) @ Qiita
csvファイルからmatplotlibでグラフを描く

# 初めに
pythonでcsvファイルからグラフを出力するという作業に慣れておらず時間がかかってしまったので、今後のスピードアップのために簡単にまとめておく。

# コード

```input_csv_data.csv
No,Value
1,12
2,7
3,-19
4,28
5,60
```



```python

import pandas as pd
import matplotlib.pyplot as plt

input_csv = pd.read_csv('./input_csv_data.csv')
first_column_data = input_csv[input_csv.keys()[0]]
second_column_data = input_csv[input_csv.keys()[1]]

plt.xlabel(input_csv.keys()[0])
plt.ylabel(input_csv.keys()[1])

plt.plot(first_column_data, second_column_data, linestyle='solid', marker='o')
plt.show()

```

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/621414/9607645c-2159-ccc1-a95d-c13062053e94.png)

# 手順まとめ

1. pandasでデータを読み込む
2. 列名・列データを取得する
3. グラフの軸名を設定する
4. 描画設定をする


# 参考記事
- matplotlib公式ドキュメント
https://matplotlib.org/3.3.3/api/_as_gen/matplotlib.pyplot.plot.html
emacs の typescript-mode でハードタブを利用するには

indent-tabs-mode を t にして、tab-width と typescript-indent-level の値を揃えることで、typescript-mode でハードタブが使われるようになる。tide を利用している場合の設定は以下のとおり。

```.lisp
(defun setup-tide-mode ()
  ;; snip
  (setq indent-tabs-mode t)
  (setq typescript-indent-level 2)
  (setq tab-width 2)
  )

(add-hook 'typescript-mode-hook #'setup-tide-mode)
(add-hook 'web-mode-hook
          (lambda ()
            (when (string-equal "tsx" (file-name-extension buffer-file-name))
              (setup-tide-mode))))
```

prettier を利用することでも実現できたが、遅いのでボツ。

```.lisp
;; https://github.com/prettier/prettier-emacs
(require 'prettier-js)

(add-hook 'typescript-mode-hook 'prettier-js-mode)
(add-hook 'web-mode-hook 'prettier-js-mode)

(setq prettier-js-args '(
  "--use-tabs" "true"
  ))
```
Ubuntu(Linux)でのJava環境構築方法

# TL;DR
UbuntuでJava環境を構築する際には、[SDKMAN](https://sdkman.io/)を使用することがおすすめです。
apt経由でもJavaをインストールすることは可能ですが、自分でバージョンを選択したりバージョンを切り替えたりすることが難しいです。また、gradleなどのツールはリポジトリの追加が必要など、手間がかかってしまいます。
SDKMANを使用すれば、簡単に複数バージョンのJava（とJava関連のツール）をインストールし、バージョンを切り替えて使用することができます。

# SDKMANのインストール
[公式サイトのインストール手順](https://sdkman.io/install)に沿って行います。
まず、以下のコマンドを実行します。SDKMANがダウンロードされ、インストールされます。
`curl -s https://get.sdkman.io | bash`
インストール完了後、新しいターミナルを開き、以下のコマンドでSDKMANにパスを通します。
（一度実行するだけでOK。.bashrcなどに記載する必要は無し。）
`source "/home/ユーザー名/.sdkman/bin/sdkman-init.sh"`

インストールに成功しているかは、以下のコマンドで確認します。バージョンが表示されれば、インストールは成功です。
`sdk version`

# Javaのインストール
まず、以下のコマンドでインストール可能なJavaを確認します。
`sdk list java`
インストールは以下のようにして行います。（例：AdoptOpenJDKのJava11(LTS)をインストール）
`sdk install java 11.0.9.open-adpt`
別バージョンのJavaをインストールする場合も、同様にインストールします。
`sdk install java 14.0.2.hs-adpt`

# Javaツールのインストール
AntやMaven、GradleなどのJavaツールもSDKMANでインストール可能です。
例えば、Gradleをインストールする場合、Javaと同様に以下のコマンドでインストールします。
`sdk list gradle`
`sdk install gradle 6.8`

# 参考サイト
- [SDKMANで複数のJDKを管理](https://tworks55.hatenablog.com/entry/2020/05/04/230528)
WarファイルをApache TomcatのManageでデプロイするやり方

# はじめに
Java Servlet初心者が記載した備忘録。
前提として、Tomcatはインストール済みです。
Tomcatバージョン：8.0.36.0
javaSE8

## Tomcatユーザー作成
- Tomcatがインストールされているパスのconfフォルダにある**tomcat-users.xml**をメモ帳で開く。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/999952/96f405a8-02cf-b005-39f2-6d1373e59d86.png)
- 赤枠の通りユーザー情報を記述し、上書き保存する。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/999952/dfb7fcb4-8735-3426-9409-b2c201e3ef61.png)


## Tomcat起動
- Tomcatがインストールされているパスのbinフォルダにある**startup.bat**を起動する。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/999952/de703e71-f987-380d-7f74-abb1fd640941.png)
- Tomcat画面が表示できれば起動成功。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/999952/3cecbcec-3e93-de70-debe-768bb5351f4f.png)

## Manager起動
- ブラウザでhttp://localhost:8080 を入力する。
- **ManagerApp**を押下し、Tomcatユーザーの名前とパスワードを入力する。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/999952/91fae597-6168-55dd-3d1a-1850e36a26c6.png)
- Manager画面が起動。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/999952/e44ba546-58c1-fae2-9594-50f8035d60c3.png)

## Warファイルデプロイ
- あらかじめ作成していたwarファイルを選択し、配備する。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/999952/251584e2-2370-7df7-8578-dca35e6dfd0e.png)
- アプリケーション一覧に追加されたことを確認。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/999952/3bcd744c-c555-7361-7081-3cb2ebe855ee.png)

## 実行確認
- ブラウザでhttp://localhost:8080/WebSample を入力。
macのVSコードで日本語を含むパスでターミナル分割ができなくなったorz

## 概要

日本語を含むディレクトリでターミナル分割しようとするとエラーが発生するようになりました。
困ったのでとりあえず分割できるようにする方法を紹介します。

![スクリーンショット 2021-01-16 9.49.12.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/105030/1eaa334a-ade4-331f-e2aa-d6d9133b30d5.png)

## やり方
やることは簡単で`terminal.integrated.splitCwd`の値をworkspaceRootに変えれば一応分割できました。

ただし開くディレクトリがworkspaceRootになります。
inheritedのまま使える方法が知りたいですね。

以上小ネタでした。

## 余談

最近windows派に戻りつつあります。
WindowsTerminalがVSCodeに統合できるのでこれでいいじゃん、的な。
ProgateでHTML,CSSを学んでみた（3日目）


#概要
Web開発に興味が出てきたのでとりあえず一通り必要そうなものを触ってみることにしました。
ただ触るだけだと忘れてしまいそうなのでメモとして学んだことを書いてみます。
ここにあるコードはほぼ全てProgateで出てきたものです。

##\<head>要素の中身
\<head>要素はには以下の要素が含まれる。

<ol>
    <li>文字コードの指定</li>
    <li>ページのタイトルの設定(ブラウザのタブに表示される)</li>
    <li>CSSの読み込み</li>
</ol>

書き方は以下。
link rel="stylesheet"でCSSを読み込むよ！と宣言

    <head>
    <meta charset="utf-8">
    <title>Progate</title>
    <link rel="stylesheet" href="stylesheet.css">
    </head>

##Webページのレイアウト
\<div>でbody要素の中にレイアウトを構成する。
divはdivisionの略で要素をグループ化するために使用される。
これを使って、ヘッダー、メイン、フッターの要素を作る。

    <div class="header">
    </div>
    <div class="main">
    </div>
    <div class="fotter">
    </div>

##ヘッダーの作り方
ヘッダーの中にロゴとリストを作ってみる。

      <div class="header-logo">
        LOGO
      </div>
      <div class="header-list">
          <ul>
              <li>fuga</li>
              <li>moge</li>
          </ul>
      </div>

##リストに黒点をつけない方法
CSSに以下のように書くと黒点がつかない


```hoge.css
    li{
      list-style: none;
    }
```

##要素を横並びにする
要素を横並びにするにはfloat:leftをCSSで指定する。
floatの種類は3種類あり、left、right、noneである。
以下のURLにfloatで引っかかりそうな罠が乗っていた。
floatした要素の下に別の要素を配置したいときはclear:leftが必要みたい。
https://udemy.benesse.co.jp/design/web-design/css-float.html

```hoge.css
    .header-logo {
        float: left;
        font-size: 36px;
     }
```

##余白を入れる
余白を入れるにはCSSでpaddingを追加する。
paddingは上下左右に入れることができ、以下のように書く。

```hoge.css
    .hoge{
        padding-top:20px;
        padding-right:10px;
        padding-bottom:30px;
        padding-left:5px;
    }
```

以下のように書くと左から、上右下左(上から時計回り)の順に余白のサイズを指定することができる。

```hoge.css
    .hoge{
        padding:20px 10px 30px 5px;
    }
```

また、以下のように書くと、上下に20px、左右に10pxを指定することができる。

```hoge.css
    .hoge{
        padding:20px 10px;
    }
```
Document-Based AppのmacOSアプリでメニューからファイルオープンするために必要なこと

画像ビューアを作ってみようかと思ったら初手で軽くハマったので、同じようなことでつまずく人もいるでしょう、ということで。
環境はXcode12.3。

#Document Appでプロジェクトを新規作成

これは当然なので説明は省略。

#Document Typesに対象となるファイルの種類を登録

Target->Info->Document Typesにファイルを登録していく。

Classにはプロジェクト作成時に自動的に作成される"Document"クラスを指定。

IdentifierにはUTIというものを指定する。具体的にどんな文字列を指定すればいいかはApple本家の情報が見当たらないが、下記サイトに一覧が書かれている。
http://potting.syuriken.jp/potting_conv/understanding_utis_J/chapter4.html

以下、画像ファイルを開くための例。

![スクリーンショット 2021-01-16 9.30.09.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/824193/3d551c41-876f-9a40-5e0d-356b67a1eb5b.png)

#DocumentクラスをObjective-Cから利用できるようにする

SwiftベースのアプリではNSDocumentを継承した"Document"クラスがそのままでは使えないそうで、@objcを使った一行を追加する必要がある。（この情報がなかなか見つからなかった・・・）
具体的にはこんな感じ。

```Swift
@objc(Document) // 追加
class Document: NSDocument {
...
```

#Documentクラスの読み込みのメソッドに手を入れる

ここまでくればファイル選択まではできるので、あとは実際の読み込み処理を追加する。
デフォルトでは下記のメソッドが呼び出される。

```Swift
override func read(from data: Data, ofType typeName: String)
```

ファイルパスでもらいたい場合は下記のメソッドをオーバーライドする。

```Swift
override func read(from: URL, ofType: String)
```
PostgreSQLのCASE文で日付のNULLを空文字にする

case文を使ってデータベースに登録されている日付(DATE型)がNULLの場合に空文字に変換し,
それ以外はそのまま使います。

```SQL

SELECT 
CASE HOGE_DATE
     WHEN HOGE_DATE IS NULL THEN ''
     ELSE TO_CHAR(HOGE_DATE,'YYYY/MM/DD')
END
FROM HOGE_TABLE 

```

CASE文ではELSEの前後で型が同じでなければならないそうなので、HOGE_DATEを文字列に型変換しています（僕は最初なぜか''を日付型に型変換しようとしてました）。
さらにTO_CHARの第２引数に日付の型を書かなければならないことにも注意です。
FreeRTOS で sleep() 相当をする

ふつうの C プログラムの感覚で `sleep(1)` とか書いてしまうと、FreeRTOS では全体が停止してしまい、マルチタスクにならない。

特定のタスクを止める場合は以下のようにする。

```c
void someTask(void *pvParams) {
    printf("sleep 3sec... ");
    const TickType_t delay = 3000 / portTICK_PERIOD_MS;  // 3sec.
    vTaskDelay(delay);
    printf("done\n");
}
```
コマンドプロンプト Cドライブから Dドライブに移動する

# 目的

- Windows10のコマンドプロンプトでカレントドライブをCドライブからDドライブに移動する方法をメモ的にまとめる

# 方法

- 下記コマンドを実行する。

    ```cmd
    pushd D:\
    ```
The truth value of a Series is ambiguous.

# 事象 : Pandasで読み込んだExcelの行情報のNone判定で怒られた
- 環境
    - Windows10 Pro バージョン1909
    - PyCharm 2020.2.2(Community Edition)
    - pandas 1.0.5

```bash:コンソールのエラー
The truth value of a Series is ambiguous. Use a.empty, a.bool(), a.item(), a.any() or a.all().
```

```py
# 1. pandasを使って
import pandas as pd
# 2. Excelファイルを読み込んで
book = pd.read_excel(excel_file, sheet_name=None, header=None)
# 3. 任意のシートを読み込んで
sheet = book[sheet_name]
# 4. 1行づつ処理しようとして
for index, row in sheet.iterrows():
    # 5. 処理前に一応Noneを判定したい
    if not row:
        # やりたい処理...
```

## 原因 : 何に対してboolを使っているのか曖昧(ambiguous)だから

> Pythonにおいて、if文の条件式や`and`, `or`, `not`の演算などでは、オブジェクトや式が`bool値`（`True`, `False`）として評価される。
> ...省略...
> `numpy.ndarray`に対して`bool`値を評価しようとするとエラーとなるようになっている。
> `# bool(a_bool)`
> `# ValueError: The truth value of an array with more than one element is ambiguous. Use a.any() or a.all()`
> ambiguous（曖昧）という文言の通り、何に対して`True`, `False`を判定したいのか（オブジェクト＝要素全体なのか、各要素なのか）が曖昧だというエラー。
> [NumPy, pandasのValueError: ...one element is ambiguousの対処法 | note.nkmk.me](https://note.nkmk.me/python-numpy-pandas-value-error-ambiguous/)


今回エラーになった行情報(`row`)の型は、`<class 'pandas.core.series.Series'>`だけど`numpy.ndarray`と同じことが起こるとのこと。

### 対応 : はっきりと「Noneじゃなかったら」と書く
```py
    # やりたいことはきちんと伝える
    if row is None:
        # やりたい処理...
```
エラーメッセージの日本語化

## はじめに
オリアプ制作の中で、エラーメッセージの日本語化を行ったので、忘れないよう載せておこうと思います。
ユーザーがきちんとフォーム入力を出来ていない際に、エラーメッセージが英語ではどこに不備があるかが分かりづらいのでは？と感じたため、日本語化を実装しようと思いました。


事前状況：ユーザー登録等にはdeviseを導入している / 単体エラーコードは記述済み
今回の流れとして、localeファイル内に日本語変換用yamlファイルを作成する事で英語を翻訳していく。
（localeファイル：多言語化用の言語ファイル）
## 1.gemの導入
**1.エラーメッセージを日本語化するために『rails-i18n』というgemをGemfileに記述しbundle installする。
これは以下のリンク先に記述してある語句を日本語にしてくれるもの。**
https://github.com/svenfuchs/rails-i18n/blob/master/rails/locale/ja.yml

```ruby:Gemfile
gem 'rails-i18n'
```

**2.config/application.rb に config.i18n.default_locale = :ja を記述し、言語の設定を行う**
 
```ruby:config/appllication.rb
module IdeaApp
  class Application < Rails::Application
    # 中略
    config.i18n.default_locale = :ja
    # 中略
  end
end
```

## 2.devise関連の日本語化
ユーザー登録等にはdeviseを導入しているため、それに関連するものの日本語化を行う。
**1.config/locales に devise.ja.yml を作成する。**
　→**config / locales / devise.ja.yml**

**2.devise.ja.yml内に以下のリンク先に記述してあるコードをペーストする。**
ペーストすることで、記述してある語句を日本語にする。
https://github.com/tigrish/devise-i18n/blob/master/rails/locales/ja.yml

## 3.指定した単語の日本語化
ここまでの実装で、**rails-i18n**や**devise.ja.yml**に記述してある語句に関しては日本語化出来ているが、そのほかの語句は以下の画像のように日本語化出来ていない。
<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/941480/4ce41782-53ab-8ebe-bad7-39d814debc08.png" width=50%><img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/941480/2810bb91-f2b7-8acd-119a-c4802b792a80.png" width=50%>

そのため、こちらで語句（NicknameやTitle、Category）などを指定し、日本語に変換する必要がある。


**1.config/locales に ja.yml を作成する**
　→**config / locales / ja.yml**

**2. ja.yml に以下のように変換したい語句の変換前・変換後を記述する**

```ruby:config/locales/ja.yml
ja:
  activerecord:
    attributes:
      user: #Userモデル
        nickname: ニックネーム
        phone_number: 電話番号
        first_name: 名前
        last_name: 名字
        first_name_kana: 名前カナ
        last_name_kana: 名字カナ
      idea: #Ideaモデル
        title: アイデア名
        idea: アイデアの内容
        price: 価格
        category_id: カテゴリー
    errors:
     messages:
       other_than:  「--」以外を選択してください
```

## 4.日本語に変換後
これでエラーメッセージを日本語化することが出来た。
<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/941480/0d4eff29-0a3e-6aeb-7ed8-65da97c84f05.png" width=50%><img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/941480/5e16b01e-d3a0-68f2-ca05-0d94cf93c5a6.png" width=50%>

## 5.補足：エラーコード修正
すでに単体テストコードを記述している場合は、期待するエラーメッセージも日本語に変換されるため、書き換えが必要になる。
例としてNicknameのエラーコードを記載する。

```ruby:spec/models/user_spec.rb　　書き換え前
# 中略
context '新規登録がうまくいかないとき' do
  it 'nicknameが空だと登録できない' do
    @user.nickname = ''
    @user.valid?
    expect(@user.errors.full_messages).to include("Nickname can't be blank")
  end
end
# 中略
```
```ruby:spec/models/user_spec.rb　　書き換え後
# 中略
context '新規登録がうまくいかないとき' do
  it 'nicknameが空だと登録できない' do
    @user.nickname = ''
    @user.valid?
    expect(@user.errors.full_messages).to include("ニックネームを入力してください")
  end
end
# 中略
```
## 最後に
英語が苦手な人にもエラーメッセージが読めるように実装することが出来ました。
今後も誰にでも使いやすいアプリを制作できるように意識していきたいです。
[Mac OS Big Sur]でGOの開発環境を作る

GOを使う必要があったため、Mac OS Big Surで環境を作りました。

##内容
- goenvのインストール
- goのインストール

## goenvのインストール

当初、`brew install goenv`でインストールしてみたいのですが、
バージョンが古るかったため、Gitでインストールしました。

```zsh
% git clone https://github.com/syndbg/goenv.git ~/.goenv
```

シェルはzshを使っているので、環境変数を設定します。

```zsh
% echo 'export GOENV_ROOT="$HOME/.goenv"' >> ~/.zshrc
% echo 'export PATH="$GOENV_ROOT/bin:$PATH"' >> ~/.zshrc
% echo 'eval "$(goenv init -)"' >> ~/.zshrc
```

シェルを再起動し環境変数を反映します。

```zsh
% exec $SHELL
```

 goenvのバージョンを確認します。

```zsh
% goenv -v
goenv 2.0.0beta11
```

## goのインストール

インストール可能なgoのバージョンを確認します。

```zsh
% goenv install -l
Available versions:
  1.2.2
  1.3.0
    :
  1.15.4
  1.15.5
  1.15.6
  1.16beta1
```

バージョンを指定してgoをインストールします。

```zsh
% goenv install 1.15.6
```

シェルはzshを使っているので、環境変数を設定します。

```zsh
% echo 'export PATH="$GOROOT/bin/$PATH"' >> ~/.zshrc 
% echo 'export PATH="$PATH:$GOPATH/bin"' >> ~/.zshrc 
% exec $SHELL
```

ここまでで、`~/.zshrc`には、以下の設定が追加されているはずです。

```zsh
export GOENV_ROOT="$HOME/.goenv"
export PATH="$GOENV_ROOT/bin:$PATH"
eval "$(goenv init -)"
export PATH="$GOROOT/bin/$PATH"
export PATH="$PATH:$GOPATH/bin"
```

使用するGOのバージョンを指定します。

```zsh
% goenv global 1.15.6
```

GOのバージョンを確認します。

```zsh
% go version
go version go1.15.6 darwin/amd64
```

任意にプロジェクトの場所を指定したいのでGo Modulesを設定します。
まずは、Go Modulesの設定を確認します。

```zsh
% go env GO111MODULE
```

設定されていれば`on`と表示されますが、表示されないので設定します。

```zsh
% go env -w GO111MODULE=on
% go env GO111MODULE
on
```

ここまででGOの環境ができているので、
`go mod init ＜プロジェクト名＞`で進めていきましょう。
投資quest:pyhtonでシステムトレードを作る(2)ボリンジャーバンド

## pythonでシステムトレード：ボリンジャーバンドを描く
### ボリンジャーバンドとは
ボリンジャーバンドは、よく次のようなグラフで説明されます。
monex証券ＨＰより。https://info.monex.co.jp/technical-analysis/indicators/003.html

![003_p_01.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/336017/6c9d1e7b-8e3f-acd8-a645-0f86ee25f272.jpeg)

よく証券会社のＨＰで見る絵ですが、ここで疑問がわきます。なぜ？２５移動平均線（２５ＳＭＡ）、なぜ、±1、2σなの？
５ＳＭＡ、７ＳＭＡとか、0.9σとか、1.4σとか、半端な値に最適値があるかもしれません。これくらいＤＸの世の中なので、自宅のコンピューターのパワーで計算は簡単です。
このσとＳＭＡの最適値を求めるのをやってみようと昨晩思いつきました。思いついただけで、うまくいくかどうかはわかりませんが・・・。
そのためには、まずボリンジャーバンドを描く必要があります。

###　ボリンジャーバンドを描く
ボリンジャーバンドを描くためには、移動平均線を描いたのと同様に`rolling`を使って標準偏差を求めます。
`df["5day_std"]=df["end_price"].rolling(5).std().round(1)`
この標準偏差を平均値に足したり引いたりするだけです。＋１σなら、
`df["5day_bol_+1"]=df["5day_ave"]+df["5day_std"]`
です。

```python
#標準偏差を求める
df["5day_std"]=df["end_price"].rolling(5).std().round(1)
#ボリンジャーバンドを求める（±１σ）
df["5day_bol_+1"]=df["5day_ave"]+df["5day_std"]
df["5day_bol_-1"]=df["5day_ave"]-df["5day_std"]

```
これで、２０年度下期のグラフを描いてみます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/336017/702b2025-857f-c52f-1c54-5b435cf1bf57.png)

細かく見てみようと思います。２０年１２月の状況です。トレンドを追って上昇しているところと反転しているところがあります。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/336017/a57c7cc4-1fbe-9d1f-da5d-6df94cbfd55f.png)


このグラフは±１σですが、コンピューターですので、いくらでも細かく計算できます。例えば±0.8σとか、±1.1σとか。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/336017/bcb3a88e-85e2-9dd8-dfd5-a6f73494cd4d.png)

この移動平均線（ＳＭＡ）の日数とバンド幅で最適値を見付けたいと思います。

まず最初の単純な作戦は、

短期勝負にする。移動平均線の日数は数日。
ボリンジャーバンドで反転するかトレンド入りするかのバンド幅と日数の最適解がないか探索する。

これで考えてみようと思います。

では、次にそのための特徴量と目的変数を作っていこうと思います。

それは次の[「投資quest:pyhtonでシステムトレードを作る(３)」](https://qiita.com/motoyuki1963/items/cf4f00e0f9538fffa16d)で。
manimの作法 その15

#概要

manimの作法、調べてみた。
Dot、使ってみた。



#サンプルコード


```
from manimlib.imports import *

class test(Scene):
	def construct(self):
		dots = dict()
		annos = dict()
		var_index = 0
		for x in range(-7, 8):
			for y in range(-4, 5):
				annos[f"{x}{y}"] = TexMobject(f"({x}, {y})")
				dots[f"{var_index}"] = Dot(np.array([x, y, 0]))
				var_index = var_index + 1
		for anno, dot in zip(annos.values(), dots.values()):
			self.add(anno)
			self.add(dot)
			self.wait(0.2)
			self.remove(anno)


```

#生成した動画

https://www.youtube.com/watch?v=jjD-SdepSkA

以上。
kubectl get deploymentコマンドで「No resources found in default namespace.」エラー

kubernetesで作成したDeploymentを確認しようと、以下のコマンドを実行したのですがエラーになりました:cry:

```
$ kubectl get deployment
No resources found in default namespace.
```

##原因・解決法
どうやらDeploymentが正しく作成できていなかったことが原因のようです。
kubectlのバージョン1.8より前は、以下のコマンドでdeploymentを作成できていました。

```
$ kubectl run --restart Always　--image (imageの種類)
```

しかしバージョンが1.8以降は--restart AlwaysでDeploymentが作成されなくなったようです。
そこでバージョン1.8以降でDeploymentを作成するときは以下のコマンドで作成しましょう。

```
$ kubectl create deployment --image (imageの種類)
```
Deploymentが作成されたか確認します

```
$ kubectl get deployment
NAME     READY   UP-TO-DATE   AVAILABLE   AGE
sample   0/1     1            0           11m
```
ちゃんと作成されたようですね:grin: