OmniAICreator/Qiita-1.07M huggingface dataset:
ApexからChatterに投稿する

ちょうど、質問があって回答がされていたので忘れないように記録しておきます。

[How to Create chatter post and mention user in chatter post using Apex class?](https://trailblazers.salesforce.com/answers?id=9064S000000DTYoQAO)

```
//Adding a Text post
FeedItem post = new FeedItem();
post.ParentId = oId; //eg. Opportunity id, custom object id..
post.Body = 'Enter post text here';
insert post;

//Adding a Link post
FeedItem post = new FeedItem();
post.ParentId = oId; // Record Id eg. Opportunity id, custom object id..
post.Body = 'Enter post text here';
post.LinkUrl = 'http://www.infallibletechie.com';
insert post;

//Adding a Content post
FeedItem post = new FeedItem();
post.ParentId = oId; // Record Id eg. Opportunity id, custom object id..
post.Body = 'Enter post text here';
post.ContentData = base64EncodedFileData;
post.ContentFileName = 'infallible.pdf';
insert post;
```
【メモ】KITTI 2015 Scene Flow dataset test にGroud Truthがない件

<h1>KITTI 2015 Scene Flow dataset test にGroud Truthがない件</h1>

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/482094/b6fbbd44-6e25-684b-ca78-236411cf52a5.png)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/482094/1e6ac704-1548-0eab-d0ce-ae41f3ab4922.png)

Kittiでstereo depthを評価しようと思いdatasetをdownloadしたが、test folderにground truthがない。
どうやってtestするねん！！


![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/482094/8974794c-8f36-2831-cc2f-aa2e79ebb357.png)


2GBって書いてあるデータがダウンロードしても1.7GBしかない><


![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/482094/9e6e0bb7-fce6-0f96-d5ad-b95b7979b5ab.png)

どこかに無いかと探し続けたが結局なんか無いらしい事がわかった。



<h1>結論</h1>
お金払わないとget出来ないとかかな？！

<h1>参考文献</h1>
https://arxiv.org/pdf/1803.09719.pdf#page=9&zoom=100,66,229
http://www.cvlibs.net/datasets/kitti/eval_scene_flow.php?benchmark=stereo
Konyでwidgetにマウスカーソルを設定する方法

#目次
1. はじめに
2. 実装方法
3. まとめ

#はじめに
パソコンでウェブブラウザのリンク等マウスカーソル（マウスポインタ）を乗せると、指の形に変化するのをみたことあるかと思います。
該当箇所にマウスカーソルを乗せる事をHover（ホバー）といいます。
KonyにもHover時のSkinを設定することでマウスカーソルの設定を行うことができます。

この記事では**widgetにマウスカーソルを設定する方法**をご紹介したいと思います。

#実装方法
####**①画面の作成**
このような画面を作成してみました。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/592264/f60a8b29-6061-936d-529c-46ebf0d46578.png)

FlexContainer:`flxTest`を配置しています。
右にある `Properties` > `Skin` > `Normal Skin`にはこのように設定しております。
(色は赤色 `#ff0000`を指定しています。）
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/592264/2bfbe7b3-fde9-1b2b-f159-2ca3c09b301b.png)

####**②Hover Skinの設定**
マウスカーソルを設定する箇所は**Hover Skin**のみとなっております。
まずは、Hover Skinを作成します。

**STEP1**
FlexContainer:`flxTest`をクリックします。
右にある `Properties` > `Skin` > `Hover Skin`をクリックします。
`Enable`にチェックを入れます。
Nameは `sknFlxDemeHover`としています。
(色は赤色 `#ff0000`を指定しています。）

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/592264/6a7a0141-201e-a5e1-94d8-884118e4c27b.png)

**STEP2**
`Platform`の右にある**`...`**をクリックします。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/592264/d31e3150-0085-7ae8-ed19-b99fc297ce94.png)

**STEP3**
ポップアップが表示されます。
`HTML5 SPA`にチェックを入れ、`OK`をクリックします。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/592264/db631b6d-fb5d-86e7-d2b5-b66acce5a4bb.png)

**STEP4**
`Properties` > `Skin`の中に`Cursor Type`が表示されるようになりました。
`Cursor Type`をクリックし、目的に合ったものを選択してください。
今回は`Pointer`を選択しました。

参考：マウスカーソルの値一覧と表示について
https://saruwakakun.com/html-css/basic/cursor

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/592264/e13d8d15-c73f-ea36-f865-6ab0412f8754.png)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/592264/42424d7d-bb79-67e5-90ab-f52803025150.png)

ここまでで、**マウスカーソルを設定する方法**が完了しました。
実際にどうなるかみていきましょう！

####**④実装の確認**
![pointerrr.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/592264/8ee84d90-85ec-18cf-1399-22e3ff80a4fa.gif)
FlexContainer:`flxTest`の上にカーソルを持っていくと、カーソルが変わっていることが分かりますね！

#まとめ
今回は、Konyでwidgetにマウスカーソルを設定する方法を説明しました。
目的に適したカーソルを設定することで、ユーザにとっても分かりやすいWeb作りができるのでは無いかなと思います。
またGUIだけで設定できるのもいいですね！
ぜひ試してみてください:wave:

#参考
カーソルの値一覧と表示について：
https://saruwakakun.com/html-css/basic/cursor
CentOS8にsambaをインストールしてWindows10のエクスプローラから接続する手順

# やりたいこと

* CentOS8にsambaをインストールしたい。
* CentOS8の自分のホームディレクトリに、Windows10のエクスプローラからアクセスしたい。
* CentOS8の自分のホームディレクトリに置いてある各種ファイルを、Windows10のエディタやIDEで編集したい。



# 前提

* Windows10+VirtualBox+CentOS8での仮想サーバが構築済みであること。
* root権限でSSH接続できること。
* SELinuxが無効化してあること。

# sambaインストール

```
dnf -y install samba
```


# conf設定

```
cd /etc/samba/
vi smb.conf
```

### 下記に修正する。

`/home/yamato/` は自分のホームディレクトリ。

```
[global]
workgroup = WORKGROUP
server string = Samba Server %v
netbios name = centos8
security = user
map to guest = bad user
dns proxy = no

[Share]
path = /home/yamato/
browsable =yes
writable = yes
guest ok = yes
read only = no
```


# パーミッション

例：/home/yamato にエクスプローラで接続して、/home/yamato/myapp/ に置いてあるファイルをWindows10から編集したい場合。

```
cd /home/
chmod 777 yamato
```

```
cd /home/yamato/
chown -R nobody: myapp
```



# ファイアウォール

```
firewall-cmd --permanent --zone=public --add-service=samba
firewall-cmd --reload
```


# samba起動

```
systemctl enable smb.service
systemctl enable nmb.service
systemctl restart smb.service
systemctl restart nmb.service
```


# Windows10からの接続

エクスプローラのアドレスバーに、仮想サーバのIPアドレスを入力して、
CentOSのユーザとパスワードにて接続する。

```
\\192.168.1.14
```

### ユーザとパスワード

* USER: yamato
* PASSWORD: ********

エクスプローラからファイルが見えたらOK。

# アクセスできない場合

Windows10のエクスプローラから

```
\\192.168.1.XX
```

のようにサーバのIPを入力しても接続できない場合は下記を疑う。

* 「Windowsの機能の有効化または無効化」でSMB 1.0/CIFS ファイル共有のサポート　にすべてチェックが入っていること。
* Wi-Fiのネットワークプロファイルが「パブリック」ではなく「プライベート」になっていること。
* 「ファイアウォールとネットワーク保護」の「プライベートネットワーク」を確認しSMBが許可されていることを確認する。

上記を確認しPCを再起動する。
同一ネットワーク内にPCが2台ある場合、別のPCからだとSMBに接続できる場合がある。
その場合、SMBサーバ側の問題ではなくクライアントPC（Windows）側の問題と断定できる。
Amplifyの基礎知識と使い方メモ

## 基礎知識

* Amplifyとは「AWSの様々なサービスをより簡単に扱えるツール」のこと
* Firebaseに似てる
* AmplifyはWebブラウザ用のコンソールと呼ばれる画面上でも一部操作可能だが、基本的にはCLIで操作する
* CLIの各種コマンドを実行すると裏でCloudFormationが動く仕組みになっている
* `【重要】` CLIコマンド実行中に途中で強制停止するとトラブルの元になり、最悪の場合元に戻せないので注意
* Amplifyにはプロジェクトという概念があり、基本的には一つのプロダクトにつき一つのプロジェクトを作成
* プロジェクトを作成すると、リポジトリ内にamplifyという名前のフォルダが生成される

## CLIインストール

* ローカルでAWSの認証情報を設定する
* 任意のprofile名を付ける
* 下記コマンドでCLIインストール

```bash
npm install -g @aws-amplify/cli
```

## Category (カテゴリ)

* Amplifyには「category (カテゴリ)」という概念がある
* api、auth、functionなど様々なカテゴリが用意されている
* 例えばapiカテゴリはGraphQL APIやREST APIを作るときに使う
* GraphQL APIは裏でAppSyncが動き、REST APIではAPI GatewayやLambda等が動く
* 他にも、authはCognito、functionはLambda、hostingはRoute53やS3、storageはS3が動く
* CLIで `amplify api add` を実行すれば apiを追加でき、 `amplify api remove` で削除できる
* functionなら `amplify function add` 、authなら `amplify auth add` といったように実行する

## amplifyフォルダ

* amplifyフォルダ内には、amplify関連の各種設定やLambda関数のソースコードファイル、GraphQLスキーマファイル等が配置される
* amplifyフォルダにはGit管理下のファイルと、そうでないファイルがある
* `/amplify/.config` には基本的な設定ファイルが配置される
* `/amplify/backend` にはカテゴリ毎にフォルダが配置され、それぞれに関連ファイルが配置される
* `/amplify/team-provider-info.json` は環境設定を記述するJSONファイル（詳しくは後述）

## env （環境）

* Amplifyには「env (環境)」という概念がある
* これは例えば本番環境、ステージング環境、開発環境といったように環境を分けたい場合に役立つ
* 環境ごとに全く別々のAWSリソースが構築される
* 例えばLambda関数（function）を作り、2つの環境（stgとdev）を作ると、AWSコンソールを見ると同じソースコードのLambda関数が2つ生成されていることが確認できる
* 同様に、DyanmoDBのテーブルやS3のバケット等も全て環境ごとに生成される
* 現在存在する環境一覧をリスト表示するには `amplify env list` を実行
* 現在選択中の環境には名前の横にマークが付く
* 環境を切り替えるには `amplify env checkout stg` のように最後に環境名を指定して実行
* 新たに環境を追加するにはCLIで `amplify env add` を実行
* 環境の削除は `amplify env remove` で簡単に実行できるが、再度作り直してもIDが変わってしまい、全く同じ環境ではなくなるので注意
* 環境関連コマンドを実行すると `/amplify/team-provider-info.json` の内容が書き換わる
* 前述のJSONファイルに環境が存在しなければ、 `amplify env checkout {環境名}` コマンドを実行できない

## amplify codegen

* GraphQLスキーマを `/amplify/backend/api/{API_NAME}/schema.graphql` に書く
* `amplify codegen` というコマンドを実行すると、GraphQLスキーマファイルに基づいたJSファイルが生成される
* 生成先は `/src` フォルダ（設定で変更可）
* 生成されたJSファイルをアプリケーション側でimportすることでGraphQL APIを扱うことができる
* 基本的にcodegen後のファイルはGit管理下にするべきではない（GraphQLスキーマファイルとの不一致を防ぐため）
* 生成された以外のGraphQLを書きたい場合は、別途ファイルを作成してimportする
CentOS8+Anaconda+Django開発環境構築手順


# やりたいこと

* Djangoの個人開発環境をPCに構築したい。
* python環境はAnacondaで構築する。
* 仮想サーバはWindows10+VirtualBox+CentOS8で立ち上げる。
* httpでDjangoの初期画面を表示するところまで。

# 前提

* Windows10+VirtualBox+CentOS8のインストールまで完了していること。
* root権限でSSH接続できること。
* 管理者権限を持つ任意のユーザ（この記事ではyamato）を作成済みであること。


## 下準備

CentOS8にSSHで接続して、root権限にて下記を実行する。　

```
yum -y update
yum install -y wget
sysctl -w net.ipv6.conf.all.disable_ipv6=1
yum -y install vim-enhanced
```

# SELinux無効化

```
setenforce 0
vi /etc/selinux/config

下記を編集
SELINUX=disabled
```


# ポート開放

Djangoへhttpアクセスする際のポートを開放しておく。

```
firewall-cmd --add-port=80/tcp --zone=public --permanent	
firewall-cmd --add-port=8000/tcp --zone=public --permanent
firewall-cmd --add-port=8081/tcp --zone=public --permanent
firewall-cmd --reload
```



# Anacondaインストール

CentOSにユーザ（ここでは yamato）を作成済であり、管理者権限があること。

### インストール用シェルを取得する。

```
su yamato
cd /home/yamato
wget https://repo.anaconda.com/archive/Anaconda3-2020.11-Linux-x86_64.sh
```

### シェルをたたいてインストール開始。


```
sh Anaconda3-2020.11-Linux-x86_64.sh
```

ウィザードに従い yes を入力して進める。
終わったらパスを有効化する。

```
source .bashrc
```

* condaコマンドが使えることを確認する。
* pipコマンドが使えることを確認する。


# Djangoインストール

### pipコマンドでインストールする。

```
pip install django
```

### 試しに myapp を作成する。

```
cd /home/yamato
django-admin.py startproject myapp
```

### settings.py を編集する。

```
vi /home/yamato/myapp/myapp/settings.py
```

### ALLOWED_HOSTS を修正する。

```
#ALLOWED_HOSTS = []
ALLOWED_HOSTS = ["*"]
```

# 起動

### 下記でhttpサーバが立ち上がる。

```
python /home/yamato/myapp/manage.py runserver 0.0.0.0:8000
```

### ブラウザからhttpでアクセスする。

仮想サーバのIPアドレス（ここでは 192.168.1.14）で、ポート 8000 にて httpアクセスする。

http://192.168.1.14:8000/


### 下記の画面が表示されたらOK。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/75451/643ea5cb-cd4c-5381-548d-26ed77681dec.png)
GitHubのdefaultブランチを変更する

#はじめに
2020年10月からGitHubのデフォルトブランチがmaster→mainに変わったそうで、それに気づかず10月以降にポートフォリオを作成しpushし続け、後に就職活動で見て頂くGitHubのURLに悩んだ為変更を行いました。
#方法
(1)1番右のSettingsをクリック
![スクリーンショット 2021-01-05 9.22.21.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/973512/716b10ea-cb67-c13a-63b0-06144e565413.png)
(2)左サイドに表示された上から4番目のBranchesをクリック
![スクリーンショット 2021-01-05 9.22.48.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/973512/da0b9748-e557-8765-df71-ccbbff1539c4.png)
(3)ここでデフォルトにしたいブランチを変更し、Updateをクリックしたら変更終了
![スクリーンショット 2021-01-05 9.22.57.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/973512/397d65f7-8050-2121-c7ac-faa8971b8237.png)
#最後に
これからはgit push origin mainで。
時系列分析関係メモ

```python
from statsmodels.tsa.stattools import acf,acovf,ccf , ccovf
```

・acf：autocorrelation function　自己相関関数
・acovf：autocovariance function　自己共分散関数
・ccf：cross-correlation function　相互相関関数
・ccovf：cross-covariance function　相互共分散関数

```python
from scipy import signal
x, y = signal.periodogram(taiyo["sunspot"])
```

・ピリオドグラム

```python
AIC=n*np.log(2*np.pi*RSS/n)+2*(1+1)+n
```
RSS：残差平方和
https://www.iwanttobeacat.com/entry/2018/02/24/123626

```python
from scipy.stats import boxcox,shapiro
p_ = []
for i in np.arange(-1, 1, 0.1):
    henkan = boxcox(taiyo["sunspot"]+1, lmbda=i)
    W, p=shapiro(henkan)
    p_.append(W)
```

・正規性の出し方
論理演算、シフト演算

## 論理演算

２進数値０と１で演算する方法
1を**真(True)**、0を**偽(False)**とする

- 論理積（AND） ・・・ AとBのビットが**両方とも1**ならば、結果は**1**。それ以外は0。（掛け算）
- 論理和（OR） ・・・ AとBのビットが**両方とも１、または一つでも１**ならば結果は**1**。両方０ならば０。（足し算）
- 否定（NOT） ・・・ Aが0ならば、結果は1。Aが１ならば、結果は0。
- 排他的論理和（XOR） ・・・ AとBのビットが**両方とも1**または**両方とも0**ならば、結果は**0**。それ以外は1。  


|  A  |  B  | A AND B | A OR B | A XOR B |
|:---:|:---:|:-------:|:------:|:-------:|
|0|0|0|0|0|
|0|1|0|1|1|
|1|0|0|1|1|
|1|1|1|1|0|

| A | NOT A |
|:---:|:----:|
|0|1|
|1|0|

#### 複数ビットの演算の場合
各桁ごとで演算

```math

\begin{matrix}
&1010 \\
AND &1100 \\
\hline
&1000
\end{matrix}

```

```math

\begin{matrix}
&1010 \\
OR &1100 \\
\hline
&1110
\end{matrix}

```

## シフト演算
桁を移動させる操作  
一番左側のビット(符号ビット)の扱いで**論理シフト**と**算術シフト**に分かれる  
数値を２倍や1/2倍にしたいときに使用する  
数値を1ビット左シフトするごとに**２倍**、1ビット右シフトするごとに**1/2倍**になる（つまり、２ビット左シフトだと４倍したことになる）

- **論理シフト** ・・・ 全体をずらす（シフトしたことにより**桁あふれ**をしたビットは捨てて、空いたビットには0を補う）

`1 1 0 0 1 1 0 1`

↓ 左に２ビット論理シフト（あふれた桁は**捨てる**）

`0 0 1 1 0 1 0 0` ← **０を補う**

↓ 右に2ビット論理シフト(あふれた桁は捨てる)

`0 0 0 0 1 1 0 1`

<br>

- **算術シフト** ・・・ 最上位（符号）ビットは**固定**し、それ以外はずらす

`1 1 0 0 1 1 0 1`

↓ 左に２ビット算術シフト(あふれた桁は捨てる)

`1 0 1 1 0 1 0 0` ← **最上位ビットだけ**残して、あふれ桁を捨てる

↓ 右に２ビット算術シフト(あふれた桁は捨てる)

`1 1 1 0 1 1 0 1` ← **最上位ビットと同じ値**を補う
Python3のプログラミング関数 個人的まとめ

#初めに
これは、競技プログラミングなどで使用するPython3のライブラリや関数の個人的な備忘録です。

### 順になっているリスト
``` python3:
# startからendまでのリスト
# [1,...,100]が欲しいなら、start=1,end=100
li = list(range(start,end+1,step))
```

### リストの要素を反転
``` Python3:
li.reverse()
# または
li[::-1]
```

### リスト内の要素の合計
``` Python3:
sum(li)
```

### リストをソート
``` Python3:
# 元のリスト昇順をソート
li.sort()
# 降順
li.sort(reverse=True)

# リストを昇順にソートしたリストを返す（元のリストは変更されない）
li_2 = sorted(li)
# 降順
li_2 = sorted(li,reverse=True)
```

#自作の比較関数でリストをソート
``` Python3:
from functools import cmp_to_key

# 降順ソート
def comp(x,y):
    if x >= y:
        # 入れ替えなくていいなら、-1を返す
        return -1 # 降順に並べたい時に、x >= y の順番ならば、そのままでいいので、-1を返す
    else:
        # 入れ替えたいなら、1を返す
        return 1 # 昇順に並べたい時に、 x < y の順番ならば、入れ替えたいので、１を返す

# 比較関数にもとづいたソート
li.sort(key=cmp_to_key(comp))
```
Pardot Engagement Studio (Pardot Lightning アプリケーション) ⇒ Engagement Studio のベストプラクティス

１．変数タグはメール内の何を置き換えますか?
２．フェーズベースのプロスペクトマーケティングの 3 つのフェーズは何ですか?
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/634241/6c21d598-3159-7562-de45-96f843be78ca.png)
条件分岐を使ったプログラム

ペッパー君に20時から翌朝6時まで喋ってほしくないので、その時間中は「NG」、それ以外は「OK」と出力するメソットを作成します。
ペッパー君が喋る時をtrue,喋らない時をfalseとして、時刻も同時に入力します。

出力例は、

```bash
pepper_talk(true, 5)
=>NG
pepper_talk(true, 6)
=>OK
pepper_talk(false, 5)
=>OK
pepper_talk(false, 5)
=>OK
```

このようなイメージです。

まず、メソッドを作ります。

```ruby
def pepper_talk(talking, hour)

end
```

出力例になるように処理を書いていきます。
喋ってはいけない時間を0時から6時までと、20時以降で分けて考えてあげると良いと思います。

```ruby
def pepper_talk(talking, hour)
  if talking && (hour < 6 || hour >= 20 )
    puts "NG"
  else
    puts "OK"
  end
end
```
会計について

####勘定科目の種類は5つ
・収益グループ
売上高
・費用グループ
仕入高、給与手当
・資産グループ
現金、売掛金
・負債グループ
買掛金、未払金
・純資産グループ
資本金

####現金主義　発生主義
現金主義:お金が増減した時点で仕訳
発生主義:お金を払う約束、貰う約束をした時点で仕訳

####売上の計上基準
出荷基準:出荷した時点。
引渡基準:商品の引き渡し後
検収基準:商品に問題がないか確認してもらった後。

入荷の場合は、発送基準、入荷基準、検収基準

####月々の仕事
請求書の作成
売上の請求書まとめ
仕入の請求書まとめ
売掛金と買掛金の管理(確認)
試算表の作成
現預金の管理(確認)
→資金繰り票の作成

####年一の仕事
決算書の作成
・固定資産台帳から減価償却費を計算(10万円以上)

損益計算書のまとめ
売上総利益
営業利益
経常利益
税引前当期純利益
当期純利益

賃借対照表のまとめ
資産項目(現金、普通預金、売掛金、未収入金)

負債項目(買掛金、未払金、長期借入金)

純資産項目(資本金、繰越利益剰余金)

決算書作成の流れ
月ごとに作成している試算表に決算特有の決算整理仕訳を追加
・売上原価の計上(棚卸により期末在庫金額を把握し、期首在庫金額と洗い替え)

・締後売上の計上(売上の締日から期末日までの間期間が空いている場合、その間の計上を行う)

・減価償却費の計上

・経過勘定項目の処理(保険料の前払いなどは前払い金とする)

・未払税金の計上(消費税や法人税は決算日から2ヶ月後に納付するが、金額自体は決算時にわかるので、未払計上する)
第1回 AI実装検定【S級】に合格したので色々まとめてみた

:warning: 以下の内容は2021年1月当時の内容です。[参考](https://kentei.ai/s)の情報からも分かる様に、2022年から試験主催元変更の影響で、受験料が高額になります。
:warning: この試験を受けた当時は分かりませんでしたが、筆者は後にE資格も受験し、合格しました。この試験の主催元はこの試験がE資格より難易度が高いかの様に記載していますが、筆者の私見としてE資格の方が難しいです。
:warning: 試験対策教材として現在は論文のみになっています。。。(100本ノックは廃止になった様です。)

AI実装検定協会主催のAI実装検定 S級の第1回試験が師走は26日に実施されました。受検してみたところ:cherry_blossom:無事合格:cherry_blossom:しました。故に、記憶が薄れないうちに色々dumpしておこうと思います。

<details><summary>合格通知メール</summary><div>

![mail](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/469079/839774b2-5416-a529-b033-182eb204a0d8.png)

</div></details>

なお、AI実装検定 A級については以下の過去記事にまとめています。

* [第1回 AI実装検定【A級】に合格したので色々まとめてみた](https://qiita.com/y-vectorfield/items/437ae52feb531ab5e69c)

# 受験の動機
昨年の3月にA級を受験し、合格しました。S級は更に実践的な内容だと出題範囲を見た時に思ったため、E資格受験対策の一環で受験を思い立ちました。

# AI実装検定 S級とは？
詳細は[公式の紹介](https://kentei.ai/introduction/detail)及び[公式の出題範囲](https://kentei.ai/introduction/subjecttrend/syllabus_s)に書かれています。E資格と比較するとカバーする範囲は狭いものの、PyTorchによるDeep Learningの知識や画像処理に関する実践的な知識が問われると説明が有ります。

# 受験対策
以下のページに出題範囲のソースコードが公開されています。試験対策としてやったことはNotebookに目を通した程度です。

* [ディープラーニング∞CheatSheet](https://github.com/yoyoyo-yo/DeepLearningMugenKnock)
* [画像処理100本ノック!!](https://github.com/yoyoyo-yo/Gasyori100knock)


# 受検してみての感想
試験問題の質はA級の方が対策教材を協会自ら出しているためか、明らかに質の高い物でした。合格点は何点か分かりませんが、筆者の得点率を見る限りあまり高くないのでしょう。(50％？？)実際に出題されている問題もDeep Learningや画像処理への理解を問うというよりは記憶力？？やGoogleで調べる能力を問う？？問題が大半だったと思います。加えて、S級対策として公開されているノックシリーズのソースコードは、Deep Learning(PyTorch)を学ぶのであれば、公式のドキュメントや技術書の方が遙かに内容が詳しく、画像処理に至ってはOpenCVと愚直に実装したソースコードの2種類を扱っているのは良いのですが、アルゴリズムまで理解して実装出来る必要が有るのか疑問の残る内容や消化不良になりそうな内容が簡潔に扱われているなど決して分かりやすい教材では無いと思いました。画像処理アルゴリズムの多くは正直消化不良:scream:でした。故に、画像処理の理解を深めるために画像処理エンジニア検定 エキスパートに挑戦しようと思います。

* 受験後に記事を執筆するために調べていると[素晴らしいまとめ記事](https://watlab-blog.com/2020/12/21/ai-implementation-s-image100/)を発見しました。

# まとめ
簡単ですが、AI実装検定 S級についてまとめました。ともあれAI関連の資格にまた1つ合格でき、幸先の良い2021年のスタートを切れました。今年はE資格と画像処理エンジニア検定 エキスパートに挑戦してスキルアップを図りたいと思います。

# 2021/1/11更新: 合格証書が到着
合格証書と名刺などに貼り付けられる合格ロゴが届きました。記念にQiitaとGitHubのアイコンを変更しようと思います。

![合格証書](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/469079/b3a8540c-2cbf-ed12-d90f-385fe678d3c1.jpeg)
railsでレコード登録前に確認画面を表示する

# はじめに
Ruby on Rails5　速習実践ガイドのアウトプットで投稿しています。
今回は、レコードの登録前に「こちらの内容で登録します」などの確認画面を表示する機能について投稿します！例として、タスク管理アプリケーションを作成しています。

# 目次
<!-- タイトルとアンカー名を編集 -->
1. [アクションを作成する](#Chapter1)
1. [ルーティングの追加](#Chapter2)
1. [ビューの追加と編集](#Chapter3)
1. [戻るボタンの実装](#Chapter4)
1. [参考文献](#reference)

<!-- 各チャプター -->
<a id="#Chapter1"></a>
# アクションを作成する
まずは、確認画面に遷移するアクションをcontrollerに作成します。

```app/controller/tasks_controller.rb
def confirm_new
  @task = current_user.tasks.new(task_params)
  render :new unless @task.valid?
end
```

<a id="#Chapter2"></a>
# ルーティングの追加
今回はタスクにネストさせるため以下のように設定します。

```config/routes.rb
resources :tasks do
  post :confirm, action: :confirm_new, on: :new
end
```

この記述によって、`/tasks/new/confirm`というURLが生成されます。

<a id="#Chapter3"></a>
# ビューの追加と編集
## 追加
まず、確認画面のビューを作成します。

```app/views/tasks/confirm_new.html.slim
h1 登録内容の確認

= form_with model: @task, local: true do |f|
  table.table.table-hover
    tbody
      tr
        th= Task.human_attribute_name(:name)
        td= @task.name
        = f.hidden_field :name
      tr
        th= Task.human_attribute_name(:description)
        td= simple_format(@task.description)
        = f.hidden_field :description
  = f.submit '戻る', name: 'back', class: 'btn btn-secondary mr-3'
  = f.submit '登録', class: 'btn btn-primary'

```

この画面を表示するタイミングでは、データは保存されていません。このあとにcreateメソッドを実行するときにデータが必要なので、hidden_fieldで前の画面のデータをユーザーからは見えないように保持して渡すようにしています。

## 編集
次に、新規追加画面の遷移先を確認画面に設定しておきます。

```app/views/tasks/new.html.slim
= form_with model: @task, local: true, url: confirm_new_task_path do |f|
  .form-group
    = f.label :name
    = f.text_field :name, class: 'form-control', id: 'task-name'
  .form-group
    = f.label :description
    = f.text_area :description, rows: 5, class: 'form-control', id: 'task_description'
  = f.submit "確認", class: 'btn btn-primary'
```

<a id="#Chapter4"></a>
# 戻るボタンの実装
確認画面の戻るボタンが押されたときの処理を実装していきます。先ほど作成した確認画面の戻るボタンには、name属性に「back」をつけています。このボタンを押したときにparams[:back]というパラメータが送られるので、このparamsがあれば、newメソッドにレンダーするという流れで実装します。

```app/controllers/tasks_controller.rb
def create
    @task = current_user.tasks.new(task_params)
    if params[:back].present?
      render :new
      return
    end
    if @task.save
      redirect_to tasks_url
    else
      render :new
    end
  end
```

以上で、確認画面の実装は終了です！

<a id="#reference"></a>
# 参考文献
- [現場で使える Ruby on Rails 5速習実践ガイド](https://www.amazon.co.jp/%E7%8F%BE%E5%A0%B4%E3%81%A7%E4%BD%BF%E3%81%88%E3%82%8B-Ruby-Rails-5%E9%80%9F%E7%BF%92%E5%AE%9F%E8%B7%B5%E3%82%AC%E3%82%A4%E3%83%89-%E5%A4%A7%E5%A0%B4-ebook/dp/B07JHQ9B5T)
Homebrew の homebrew/core から unrar がライセンス問題で削除されて更新できない

###TL;DR
```bash
brew install carlocab/personal/unrar
```

### brew update したら、こんなメッセージが……
```bash:
==> Searching for a previously deleted formula (in the last month)...
unrar was deleted from homebrew/core in commit 3f8c7632a6:
  unrar: remove (incompatible license)
  See https://fedoraproject.org/wiki/Licensing:Unrar

To show the formula before removal run:
  git -C "$(brew --repo homebrew/core)" show 3f8c7632a6^:Formula/unrar.rb

If you still use this formula consider creating your own tap:
  https://docs.brew.sh/How-to-Create-and-Maintain-a-Tap
```

### 直訳すると……
```bash:
==> 以前に削除された式を検索中（先月中）...
コミット 3f8c7632a6 で homebrew/core から unrar が削除されました。
  unrar: remove (互換性のないライセンス)
  https://fedoraproject.org/wiki/Licensing:Unrar を参照してください。

除去実行前の数式を表示するには、以下のようにします。
  git -C "$(brew --repo homebrew/core)" show 3f8c7632a6^:Formula/unrar.rb

もしまだこの公式を使っているのなら、独自のタップを作ることを検討してみてください。
  https://docs.brew.sh/How-to-Create-and-Maintain-a-Tap

```
### 困ったのでググると、[こちら](https://github.com/Homebrew/discussions/discussions/285)に辿り着き、すでに独自のタップが作られていて……

```bash
$ brew install carlocab/personal/unrar
==> Tapping carlocab/personal
Cloning into '/usr/local/Homebrew/Library/Taps/carlocab/homebrew-personal'...
remote: Enumerating objects: 12, done.
remote: Counting objects: 100% (12/12), done.
remote: Compressing objects: 100% (9/9), done.
remote: Total 346 (delta 6), reused 9 (delta 3), pack-reused 334
Receiving objects: 100% (346/346), 105.69 KiB | 301.00 KiB/s, done.
Resolving deltas: 100% (204/204), done.
Tapped 9 formulae (40 files, 178KB).
==> Installing unrar from carlocab/personal
==> Downloading https://github.com/carlocab/homebrew-personal/releases/download/unrar-6.0.3/unrar-6.
==> Downloading from https://github-production-release-asset-2e65be.s3.amazonaws.com/310470753/154d6
######################################################################## 100.0%
==> Pouring unrar-6.0.3.catalina.bottle.tar.gz
==> Caveats
We agreed to the UnRAR license for you:
  /usr/local/opt/unrar/license.txt
If this is unacceptable you should uninstall the formula.
==> Summary
🍺  /usr/local/Cellar/unrar/6.0.3: 6 files, 564.5KB
```
### ありがたく使わせていただきました
dockerを使うときはバージョンを指定しよう

開発環境をDocker＋docker-composeで構築していましたが、環境を作り直したら動かなくなったのでメモ

# やったこと

- docker-compose downでコンテナ削除
- docker rmiでイメージ削除
- docker-compose upでコンテナ再作成


# 原因

コンテナイメージのバージョンを指定しておらず、latestでプルされるイメージが更新されたことにより動かなくなっていた。


# 結論

dockerコンテナ作成時はちゃんとイメージのバージョンを指定しましょう

※docker imagesで見てもlatestとしか出ないので、バージョンが分からない。。。
AWS上にDockerで環境構築コマンドメモ

AWS上にDockerで環境構築したときのメモです。

# AWS上にDocker環境構築方法

|方法 |備考 |
|:--|:--|
|Dockerレジストリを使う   |Docker Hubにイメージをpullして、pushする。   |
|Dockerfileを送る   |build contextを変えたい、サーバー上で編集したいとき。GitHubを使ったり。   |
|Docker imageをtarにして送る   |サーバーがインターネットにアクセスできないとき。   |

以下、送る方法について使ったコマンドメモです。

# AWSにSSHアクセス
#### 鍵をダウンロード：mydocker.pem

#### 鍵のアクセス権限を変更

```bash
$ chmod 400 mydocker.pem
```
各パーミッションの数値は、所有者、所有グループ、その他。数字の意味は、以下の合計値（全権限は7、readのみなら4）。

| 数値 | 権限 |
|:-:|:-:|
| 4  | read  |
| 2  | write  |
| 1  | execute  |
| 0  | no permission  |

#### SSHアクセス

```bash
$ ssh -i mydocker.pem <username>@<hostname>
```
ubuntuのawsインスタンスの場合は<username>はubuntu、<hostname>はPublic DNS。

# SFTPでファイル転送
SFTPはSecure File Transfer Protocol。

#### SFTPでアクセス

```bash
$ sftp -i mydocker.pem <username>@<hostname>
```

#### ファイルをアップロード

```bash
$ put local/path <remote/path>
```

\<remote/path>を指定しない場合はアップロード先のカレントディレクトリ。

#### ファイルをダウンロード

```bash
$ get remote/path <local/path>
```
\<local/path>を指定しない場合は、sftpを実行したときのディレクトリ。

# Docker imageをtarに
#### Docker imageをtarファイルに

```bash
$ docker save <image> > <filename>
```
#### tarファイルからDocker imageに

```bash
$ docker load < <tar filename>
```

# その他
#### ディスク容量を確認するLinuxコマンド

```bash
$ df -h
```
M1 Mac & Xcodeで「building for iOS Simulator, but linking in object file ... for architecture arm64」エラーの対処法


XcodeプロジェクトファイルにFirebaseをインストール後ビルドをしたら以下のエラーに引っかかった時の対処法

<code>ld: <font color="red">in /Users/[ユーザー名]/[プロジェクト名]/Pods/FirebaseAnalytics/Frameworks/FIRAnalyticsConnector.framework/FIRAnalyticsConnector(FIRAnalyticsConnector_a8eeba373b74508311b8b22b8d3202a6.o), building for iOS Simulator, but linking in object file built for iOS, file '/Users/[ユーザー名]/[プロジェクト名]/Pods/FirebaseAnalytics/Frameworks/FIRAnalyticsConnector.framework/FIRAnalyticsConnector' for architecture arm64</font>
clang: error: linker command failed with exit code 1 (use -v to see invocation)</code>

##開発環境
Xcode 12.3
M1 MacBook Air

##なぜ、このようなエラーが発生するのか
>arm64 アーキテクチャのサポートとXcode12互換バージョンは、多くの一般的なサードパーティライブラリ（Firebase、AFNetworkingなど）ではまだ提供されていません

とのことです。

##対処法　ステップ①
まず、プロジェクトの`Build Settings`の`Excluded Architectures`の`Debug`と`Release`に
<b>`Any iOS Simulator SDK`  `arm64`</b>を追加することでarm64を除外します。
![スクリーンショット 2021-01-05 6.56.05.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/678954/7c3a3d73-2abe-129f-0fe7-d41b304af734.png)

##対処法　ステップ②
ステップ②に関しては、手動でarm64を除外する方法と、`podFile`書き換え後に`pod update`をして上書きする方法があります。

###・手動でarm64を除外する方法
次にPodsの`Build Settings`の`Excluded Architectures`の`Debug`と`Release`にも
<b>`Any iOS Simulator SDK`  `arm64`</b>を追加することでarm64を除外します。
![スクリーンショット 2021-01-05 6.57.20.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/678954/9536a6a2-a06a-dfdf-7205-22ffc0b0e684.png)

###・PodFile書き換え後、updateで上書きする方法
下記のコードをPodFileに追記し、`pod update`を行う

```swift
post_install do |installer|
  installer.pods_project.build_configurations.each do |config|
    config.build_settings["EXCLUDED_ARCHS[sdk=iphonesimulator*]"] = "arm64"
  end
end
```

![スクリーンショット 2021-01-05 7.20.46.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/678954/7892d99b-d323-f7a6-83db-ca699877758b.png)

##対処法　ステップ③
プロジェクト.xcworkspaceを立ち上げ後、`Command` + `Shift` + `K` でクリーンします。

すると、シュミレーターで立ち上げることが出来ました。

##参考
<a href="https://stackoverflow.com/questions/64171400/xcode-12-firanalyticsconnector-build-error">XCode 12, FIRAnalyticsConnector, Build Error</a>
<a href="https://medium.com/@khushwanttanwar/xcode-12-compilation-errors-while-running-with-ios-14-simulators-5731c91326e9">Xcode 12 Compilation Errors (While running with iOS 14 Simulators)</a>

<br>
何か間違いやより良い方法がありましたら、優しく教えていただけると幸いです🙇‍♂️
ESP32のセキュアなプロトタイピング環境を作成した(ドキュメント編)

# はじめに
独学しているIoTセキュリティについて、集大成の意味合いを込めて現在理想と考えるセキュアなプロトタイピング環境を構築しました。
デバイス、サーバー、クライアントアプリの要素技術の勉強を含めて備忘録として分散して記していきます。

# 経緯

[ESP32のセキュアなプロトタイピング環境を作成した(概要編)](https://qiita.com/kmitsu76/items/831380bfd83bd0e7f8c6)の内容をユーザーにトライアルしてもらうためドキュメントの整備を進めた。

今回のプロジェクトのゴールは下記の通りとなる。

プロトタイプ段階から開発クライアント、サーバー、およびデバイス全体を保護
ESP32プラットフォームに対応し、以下の機能を有効にする

- デバイスの起動制御
- セキュアブート、フラッシュ暗号化
- ハードウェアルートオブトラストによるTLS通信暗号化
- OTA機能
- Wifi接続管理

Arduino, ESP-IDFに対応し、ファームウェアをTLS通信で安全に更新可能
AWSおよびAzureへの安全なデバイス接続をサポート

プロジェクト名をrainbowtypeとした。
 ![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/387653/bd90259a-79c8-45f8-e9bd-b118258fef8b.png)

#ランディングページの作成

プロジェクトを知ってもらい、試してもらう目的、また体系的なドキュメント化にランディングページを作ってみた。

[rainbowtype](https://www.rainbowtype.com/)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/387653/5faa108e-ff96-d2a1-bc7e-f9e8e6f2abcf.png)

ベースはReactで作成し、Material-UIのチュートリアルを参考にした。
独自ドメインをValue-domain で取得し、ページはgithub pagesへデプロイした。

まず英語で書いてみたが、追って日本語との切り替えを実装してみたい。

#デモの作成

コンセプトの提示にデモが有効と考え、以下のシナリオでデモを作成し、ランディングページに組み込んだ。

1,　通信経路の暗号化が必須なリモートシリアルコンソールのデモ 
2,　プライバシー保護が必要なWEB監視カメラデモ
3,　接続に証明書認証が必要なAWS接続



#1,　通信経路の暗号化が必須なリモートシリアルコンソールのデモ

リモートシリアル制御では、リモートターゲットデバイスを完全に制御するために、通信パスを保護することが重要となる。
ユーザーが入力するログインパスワードなどのさまざまな認証情報がやり取りされることを想定する。

このようなアプリケーションでは、デバイスからサーバー、およびWebサイトへのすべてのルートで相互認証が必要であろう。

このシナリオでは、ブラウザコンソールから操作できるように、ターゲットデバイスとのシリアル通信をWebSocket経由でサーバーに転送するように構成されたESP32ファームウェアを作成する。

デバイスからWebSocketを受信して​​ルーティングする機能と、ブラウザー側に表示する機能の両方を提供するボイラープレートを作成した。
これはDockerfileに設定されているため、デバイスが指すことができる静的IPを備えたサーバーを用意するだけである。
GCEなど、無料で使える環境で試しやすい。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/387653/f0b7eb48-9cf0-ec8c-993b-0784d3dda281.png)

サーバー側にXterm.jsを使い、見た目も整ったリモートシリアルコンソールを実現した。
[![](http://img.youtube.com/vi/IgnIqqi7Inc/0.jpg)](http://www.youtube.com/watch?v=IgnIqqi7Inc)

#2,　プライバシー保護が必要なWEB監視カメラデモ

監視カメラのアプリケーションでは、プライバシーを保護するために通信パスを保護することが重要である。

このようなアプリケーションでも、デバイスからサーバー、およびWebサイトへのすべてのルートで相互認証が必要であろう。

このシナリオでは、ターゲットデバイスのカメラ画像をWebSocket経由でサーバーに転送するように構成されたrainbowtypeのESP32を使用して、ブラウザーに複数のカメラ画像を表示させる。

この目的のために、デバイスからWebSocketを受信して​​ルーティングする機能と、ブラウザー側に表示する機能の両方を提供するボイラープレートを作成した。
これはDockerfileで設定されているため、デバイスが指すことができる静的IP持ったサーバーを用意するだけで実現可能。
上記同様簡単な例はGCEだが、画像転送は多くの帯域幅を使用するため、請求状況に注意する必要がある。できれば安いVPSなどを使った方がよいだろう。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/387653/0b88e6e3-b2ff-5e0d-f519-7625f54fb52c.png)

Reactでページを構成し、Websocketで着信があったカメラを順番にIDを振り、複数表示させている。
[![](http://img.youtube.com/vi/V85D79XiV2E/0.jpg)](http://www.youtube.com/watch?v=V85D79XiV2E)

#3,　接続に証明書認証が必要なAWS接続
多くのデバイスを使用するIoTアプリケーションの場合、セキュリティ上の理由から、AWSへのデバイス登録は自動的に行う必要があるだろう。

rainbowtypeは、AWS IoTとの接続を安全に保つために、信頼のハードウェアルートとしてATECC608Aを使用できる。
このシナリオでは、AWS IoTジャストインタイム登録（JITR）を使用して、デバイスに署名した証明書を使用してデバイスをAWSIoTに自動的に接続を行う。

rainbowtypeで作成し、デバイスに署名を行ったSigner CA証明書を、AWSへ登録する手順の紹介、デバイス側でAWSへ接続するボイラープレートを作成した。


#今後
rainbowtype向けに開発ボードをelecrowで作成したので、その紹介を予定。
詳細はぜひ[rainbowtype](https://www.rainbowtype.com/)を参照いただければと思う。

少しでも開発者のセキュリティ検討の参考になれれば幸いである。
Django OperationalErrorの解決

Djangoの学習で、はまってしまったので、メモをします。
環境：Windows10 pro 
Django version 3.1.4
Python　3.9

Djangoでブログを作成し、カテゴリを登録しようとしたら、以下のエラーが発生。
![cfszdfded.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/928107/bca8c8d4-3b71-01f7-03c7-71372e97473f.jpeg)

調べて、[「OperationalError: no such table:○○　エラーの解決方法」](https://qiita.com/minari766/items/0d549e4d86704bfec3c1)が参考になりました。
db.sqlite3ファイルを削除
````   


````
PS C:\Users\User\Django\project3> del db.sqlite3
````
admin.py、models.pyなどCategoryを記述した部分をコメントアウトする。
以下のコマンドを実行する。

````
 py manage.py makemigrations app(作成したアプリ名）
 py manage.py migrate
````
問題なければ、コメントアウトしたCategoryを解除する。
再度、以下のコマンド実行する。

````
 py manage.py makemigrations app(作成したアプリ名）
You are trying to add a non-nullable field 'name' to category without a default; we can't do that (the database needs something to populate existing rows).
Please select a fix:
 1) Provide a one-off default now (will be set on all existing rows with a null value for this column)
 2) Quit, and let me add a default in models.py
Select an option: 1　←１と入力

Please enter the default value now, as valid Python
The datetime and django.utils.timezone modules are available, so you can do e.g. timezone.now
Type 'exit' to exit this prompt
>>> 1←１と入力
You are trying to add a non-nullable field 'category' to post without a default; we can't do that (the database needs something to populate existing rows).
Please select a fix:
 1) Provide a one-off default now (will be set on all existing rows with a null value for this column)
 2) Quit, and let me add a default in models.py
Select an option: 1←１と入力
Please enter the default value now, as valid Python
The datetime and django.utils.timezone modules are available, so you can do e.g. timezone.now
Type 'exit' to exit this prompt
>>> 1←１と入力
````
再度、以下のコマンドを実行する。


````
 py manage.py migrate
````


問題なければ、開発サーバを起動する。


````
py manage.py runserver
````
しかし、adminにログインできない。自前に管理ユーザーを作成したがdbを削除した時に消えたようです。
再度、管理ユーザーを作成。

``````
 py manage.py createsuperuser
````
再度、開発サーバを立ち上げて管理画面にログインできました。
カテゴリも正常に作成、追加が出来ました。
PHP Debug + Xdebug Ver3.X系 はphp.iniに追記する設定項目が違うよって話

## はじめに

[Mac PHP Visual Studio Code Xdebugを用いたローカル開発環境でデバッグをできるようにする](https://qiita.com/miriwo/items/6edd6e1817def4fc11d5)
↑の記事を参考にXdebug + PHP Debug環境を構築していたら、 

- phpInfoではXdebugの存在を確認できる
- var_dump()もそれっぽい挙動をしてくれる
- でもブレークポイントで止まってくれない

といった状況で少々「むむむ・・・」となった。

## 解決方法
Xdebugは正常挙動っぽいのでおそらくVSCode側の何かしらが原因だろうと思い、
ひとまずVSCodeのPHP DebugのDetailsを確認

![スクリーンショット 2021-01-05 6.19.00.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/246580/940f01ce-7009-8a3d-d6b2-4e85dfd086a8.png)

めちゃくちゃ丁寧に案内されてた

というわけで

```bash
touch ~user/Desktop/php_info.txt
php -i >> ~user/Desktop/php_info.txt 
```

でphpInfoの内容を書き出して、

```php_info.txt
Configuration File (php.ini) Path => /Applications/MAMP/bin/php/php7.4.9/conf
Loaded Configuration File => /Applications/MAMP/bin/php/php7.4.9/conf/php.ini
```
php.iniのパスを確認して、

### Ver2.X系

```php.ini
[xdebug]
zend_extension="/Applications/MAMP/bin/php/php7.4.9/lib/php/extensions/no-debug-non-zts-20190902/xdebug.so"
xdebug.remote_enable = 1
xdebug.remote_autostart = 1
```
と記載していたのを、

### Ver3.X系

```php.ini
[xdebug]
zend_extension="/Applications/MAMP/bin/php/php7.4.9/lib/php/extensions/no-debug-non-zts-20190902/xdebug.so"
xdebug.mode = debug
xdebug.start_with_request = yes
xdebug.client_port = 9000
```

に修正したらブレークポイントでしっかり止まってくれるようになった。

## 終わりに
そもそも作業前にまず一次情報のInstllationを確認しようねって脳内の自分に怒られました。
dotenvの使い方

#はじめに

今回`dotenv`を使用したので忘れないようにメモとして残しておきます。



#dotenvとは

dotenvを使用することにより、DBのパスワードやあまり見られたくない情報を`.env`に設定し、`settings.py` を経由して読み込むことができます。デプロイする際には、この`.env`はアップロードしません。環境変数を見せずにGitHubにファイルをアップロードできます。

**インストール方法**

```
$ pip install python-dotenv
```

**.envファイルの作成**

このファイルに環境変数を書き込みます。`.env`ファイルは`.gitignore`の対象にして下さい。

```
USER="username"
PASSWORD = "password"
```

**settings.pyの作成**

```.py
import os
from os.path import join, dirname
from dotenv import load_dotenv

load_dotenv(verbose=True)

dotenv_path = join(dirname(__file__), '.env')
load_dotenv(dotenv_path)

USER = os.environ.get("USER")
PASSWORD = os.environ.get("PASSWORD")
```

**main.py**

```.py

import settings

USER = settings.USER
PASSWORD = settings.PASSWORD
```




#終わりに

参考程度にどうぞ。
ESP32の内部ADC値をi2sで取得した場合のサンプリングレート確認

# 1. はじめに
 ESP32の内部ADCをi2s経由で取得すると、（Arduino-IDEで）割り込みとanalogReadを使った場合よりも高いサンプリングレートを設定できます。そのサンプリングレートを確認しました。

# 2. 結論
 [このコード](https://qiita.com/dzonesasaki/items/e491371d68747f9b6ed9)を使った場合は、```.sample_rate```に設定した値の約2倍のレートでサンプリングが行われている。ただし、正確な2倍ではなく、この点の原因は不明。

# 3. 検証
[このコード](https://qiita.com/dzonesasaki/items/e491371d68747f9b6ed9)(```#define I2S_SAMPLE_RATE 38000*2``` つまり、76000 にしています)を書き込んだESP32のピン33番に、agilent (現 Keysight Technologies) 33500Bから1Vオフセット開放端1.5Vppで、1kHzの方形波や正弦波を入力しました。入力信号の確認はTektronix MDO-4104を用いて目視および信号解析機能で行いました。 シリアルモニタから取得した波形データは87040点。これをDFTし、パワースペクトラムのピーク位置を確認しました。なお、DFT前の波形には、DCオフセットを除去しblackmam窓をかけました。

取得した波形(方形波）
![waveform.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/698531/65a821c7-6985-fab7-02ec-d3b173f9d180.png)

パワースペクトラム(方形波）
![spctrumall.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/698531/4377c711-eee9-926b-dd13-9a65a8d2c97d.png)

スペクトラムのピーク付近を拡大
![spctrum.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/698531/82094eed-3fd3-c611-3fc8-ae61b1f4d427.png)

ピーク位置$P_{peak}$、サンプリング周波数$f_s$、参照信号の周波数$f_c$、全データ数$N_{dat}$の関係は、次になります。
$$
f_s = f_c \cdot \frac{N_{dat}}{P_{peak}}
$$

ピークは方形波、正弦波共に575でした。データ点は87040で、ピークは1kHzを指しているので、サンプリングレートは
151374 Sa/s
となります。

念のため、時間波形の時間間隔は目視で約150サンプルでした。1kHzの周期1msが150サンプルということで、ここからも約150kSa/sとなることが判ります。

.sample_rateに設定した値は、76000なので、この値の約2倍のサンプルレートになっていることになります。
ただし、152000に対して差がある理由についてはまだ判ってません。（ピークが1サンプルずれた場合の結果の差は263Hz程度なので、計算上の誤差よりも大きい）

# 4. 感想
 ESP32に基準信号を入力して、内部ADCをi2sで取得する際のサンプリングレートを確認しました。ESP32の内部ADCをi2sで読み込むモードについては、私自身、まだ理解しきれていません。1つずつ確認しながら進めていくことが重要だと、今回の結果から痛感しました。

# 参考
確認で利用したpythonスクリプト

<details><summary>analyFreq.py</summary><div>

```python
import numpy as np

fname='squar1kHz0.txt'
org = np.loadtxt(fname)
strm = org - org.mean()
Ndat=len(strm)
spc = np.fft.fft(strm * np.blackman(Ndat))
sps = np.real(spc)**2 + np.imag(spc)**2
psp = 10*np.log10(sps)
vmax=np.max(psp)
pmax=np.argmax(psp)
nfc = pmax/Ndat

fs = 38000*4
cfc=nfc*fs
fc=1000
cfs=fc/nfc

print(pmax)
print(cfs)
print(cfc)


import matplotlib.pyplot as plt

plt.figure(1)
plt.plot(psp[1:1000])
plt.axis([0,1000,60,np.max(psp)*1.01])
plt.xlabel('freq [*1/87040*fs Hz]')
plt.ylabel('relative power [dB]')
plt.show(block=False)
plt.savefig('spctrum.png')

plt.figure(2)
plt.plot(org[1:500])
plt.axis([0,500,0,np.max(org)*1.01])
plt.xlabel('time [*1/fs s]')
plt.ylabel('voltage [*3.3/4096 V]')
plt.show(block=False)
plt.savefig('waveform.png')

plt.figure(3)
plt.plot(np.arange(-1*Ndat/2,Ndat/2,1)/Ndat ,np.fft.fftshift(psp))
#plt.axis([0,1000,60,np.max(psp)*1.01])
plt.xlabel('normalized frequency')
plt.ylabel('relative power [dB]')
plt.show(block=False)
plt.savefig('spctrumall.png')

```
</div></details>
さくらのレンタルサーバで GNU core utilities をまた野良ビルドした (備忘録)

# さくらのレンタルサーバで GNU core utilities をまた野良ビルドした (備忘録)

10年前の coreutils を使っていることに気づいたので 8.5 から 8.32 に更新した(2021-01-05).

そもそもなんで入れたのか覚えていない. md5sum コマンドが欲しかっただけとかその程度の理由かもしれない.

```sh
$ cd /home/xxx/local/src/
$ wget https://ftp.gnu.org/gnu/coreutils/coreutils-8.32.tar.xz
$ xz -dc coreutils-8.32.tar.xz | tar xf -
$ cd coreutils-8.32
$ ./configure --prefix=/home/xxx/local/
$ make
$ make install
```
Udemy ビジネスパーソンに贈る業務効率化大全 〜Google Apps Scriptによる業務の自動化〜 セクション9:業務効率⑥：Gmailをスプレッドシートに抽出する

## ワークフロー・必要な知識
### ワークフロー
・Gmailから特定の情報に当てはまるような情報を取得する
・取得した情報をスプレッドシートに反映させる

### 必要な知識
・メール情報を取得する方法
・スプレッドシートに情報を書き込む方法

## メールを取得する
・問合せのメールを取得するという条件のもとでメールを取得していく。
・https://support.google.com/mail/answer/7190?hl=ja
    　上のページでGmailで使用できる検索演算子を見つけることが出来る。
・Gmailのメールを検索というところから、件名で[問合せ]と条件を指定することもできる。
・一回の抽出で取得できる情報は500個まで。
・GASに以下のようにコードを書くことでメールを取得することが出来る。
    
 ```gas:gas
        function getMessage() {
    var condition = 'subject:([問合せ])';
    var start = 0;
    var max = 500;
    var threads = GmailApp.search(condition, start, max);
    var messages = GmailApp.getMessagesForThreads(threads);
  
    }
 ```

## メールの必要な情報を取得する
・`getPlainBody`でメールの内容を取得することが出来る。
・取得したい情報(日にちや名前、メールアドレスなど)を以下のように取得することが出来る。
・`split`は文字列を分割、区切ることが出来、今回は取得したい情報の最初と最後を区切って情報を取得している。

```gas:gas
    var body = messages[0][0].getPlainBody();
    var date = messages[0][0].getDate();
    var name = body.split('お名前:')[1].split(' 様')[0];
    var email = body.split('メールアドレス')[1].split('\n')[0];
    var title = body.split('お問い合わせタイトル')[1].split('\n')[0];
    var content = body.split('お問い合わせ内容')[1].split('- - - - - - - -')[0];
```

## 1つのメールをシートに書き込む
・`SpreadsheetApp.getActiveSpreadsheet();`と`ss.　getSheetByName('シート名');`でスプレッドシートを取得する
・`sheet.getRange(何行目から, 何列目から, 何行、何列目まで). setValues([data])`と書くことでスプレッドシートに指定した範囲で情報を書き込むことが出来る。`setValues([data]`で配列を二次元配列にできる。

 ```gas:gas  
    var ss = SpreadsheetApp.getActiveSpreadsheet();
    var sheet = ss.getSheetByName('メール一覧');
    
    var data = [date, name, email, title, content];

    var firstRow = 2;
    sheet.getRange(firstRow, 1, 1,data.length).setValues([data]);
 ```

## 全てのメールをシートに書き込む
`forEach()`を使うことで全てのメールの情報をスプレッドシートに書き込む事が出来る。

 ```gas:gas
    messages.forEach(function(message)){
        var body = message[0].getPlainbody();
  
        var date = message[0].getdate();
        var name = body.split('お名前:')[1].split(' 様')[0];
        var email = body.split('メールアドレス')[1].split('\n')[0];
        var title = body.split('お問い合わせタイトル')[1].split('\n')[0];
        var content = body.split('お問い合わせ内容')[1].split('- - - - - - - -')[0];
  
        var data = [date, name, email, title, content];

        sheet.getRange(firstRow, 1, 1,data.length).setValues([data]);

        firstRow++;
    });
 ```

##最後に
洗練さんでインターン(Udemy ビジネスパーソンに贈る業務効率化大全 〜Google Apps Scriptによる業務の自動化〜 セクション9:業務効率⑥：Gmailをスプレッドシートに抽出する)です。
[Udemy ビジネスパーソンに贈る業務効率化大全 〜Google Apps Scriptによる業務の自動化〜 セクション9:業務効率⑥：Gmailをスプレッドシートに抽出する](https://www.udemy.com/course/gas_for_operational_efficiency/learn/lecture/17126720#notes)

最後に
現在ここでインターンしています。
まだまだ駆け出しですが頑張ります！やる気は人一倍です！
[洗練](https://senren.work/)
任意のテキスト文字列を音声に変換して、Asteriskで電話通知する

そろそろ正月休みも終盤である。
休み中に作った環境を壊す前にAsterisk+IBM Watson TTSのちょっとした実験として、任意の文字列を音声ファイルに変換して、電話をかけてその音声ファイルを再生する、というのをやっておきたいと思った。
まあ、仕事だったらPagerDutyとか使えよというものであるが、外線電話でなく自前のAsteriskにつながったSIPフォンに掛けられるとすれば需要があるかもというもの。

環境は[先日の記事](https://qiita.com/rk05231977/items/99e26397c3ae43a0cfc6)を参照。

# Webhookを作る
単にシェルスクリプトでも良かったのだが、監視システムとの連携を考えるとWebhookになっていた方がいいかと思い、それで。
ruby sinatraでAsteriskサーバー上に実装。

```
# apt-get install ruby
# gem install sinatra --no-ri
```

あと、音声ファイル変換にsoxが必要。

```
# apt-get install sox
```

以下のファイルを作成する。
APIKEY、エンドポイントのURLはIBM CloudのTextToSpeechサービスの管理画面から手に入る。
音声ファイルをSIPフォン6001番に発信するようになっているが、番号はAsteriskから掛けられるものなら何でも。Twilio経由で外線でもいい。はず。
SSMLとか```Accept:audio/wav;rate=8000```とかはまあ、ググれば出てくる。

```ruby:textcall.rb
APIKEY = "＜APIKEY＞"
TTS_SERVER = "＜エンドポイントのURL＞"

require "sinatra"
require "json"

set :bind, "0.0.0.0"
set :port, 8888
post "/" do
  content_type 'application/json'

  File.open($0 + ".flock", "w") do |f|
    f.flock File::LOCK_EX
    r = (JSON.parse request.body.read)["text"]
    ssml = '<speak><break time=\\"1500ms\\"></break>' \
      + r.gsub('"', '').gsub("'", "") + '</speak>'
    puts ssml

    command = 'curl -X POST -H "Content-type:application/json" -H "Accept:audio/wav;rate=8000" -d \'{"text":"' + ssml + '"}\' -u "apikey:' + APIKEY + '" ' + TTS_SERVER + '/v1/synthesize?voice=ja-JP_EmiV3Voice -o 6001.wav'
    `#{command}`
    `sox 6001.wav 6001.gsm`
    `mv 6001.gsm /var/lib/asterisk/sounds/en/6001.gsm`
    `cp callfile /var/spool/asterisk/outgoing/callfile`
    `rm 6001.wav`
  end
end

```

Asteriskの自動発信は、callfileというファイルを```/var/spool/asterisk/outgoing```に配置することで行う。
https://wiki.asterisk.org/wiki/display/AST/Asterisk+Call+Files

今回使用するファイルは以下。

```:callfile
Channel: PJSIP/6001
Application: Playback
Data: 6001

```

ここまで出来たら、以下のコマンドを実行してWebhook宛先サーバーとなるプログラムを起動する。

```
# ruby textcall.rb
```

# 試す
別のsshクライアントでAsteriskサーバーに繋げ直し、curlコマンドを以下の通り実行する。

```
# curl -X POST -d '{"text":"ぉおーまえのかーちゃんでーべそ！"}' -H "Content-type:application/json" localhost:8888
```

SIPフォン6001番（私の環境ではJitsi Meetサーバーだが）に電話がかかり、正しくメッセージが読み上げられただろうか？
Big SurでCocoaPodsがインストールできないとき


ERROR:  While executing gem ... (Gem::FilePermissionError)
    You don't have write permissions for the /usr/bin directory.

というエラーでCocoaPodsがインストールできないとき、以下のコマンドでインストールしてみてください。

sudo gem install cocoapods -n /usr/local/bin

これは/usr/binに権限がないから、/usr/local/binにインストールしてねって意味です。
VBAの悩みはVBAerにきけ_地獄絵図編~フローチャート作成VBA-前編~

#記事の概要
Twitterで見かけた「#VBAの悩みはVBAerに聞け」の応援記事です。
というより、「#VBAの悩みはVBAerに聞け」で色々なVBAerの意見があり、ぜひとも道場破りした……皆の輪に入りたかったので執筆しました。
他のつよつよな方たちがどのようなことを意識してプログラミングされているか触れる機会になってくれればと思います。

##記事の構成
1  .前口上
※注意事項 
2  .ひっさげてきたVBAの仕様・環境
3  .VBAの解説(ソース解説はここにて)

###1.前口上
たのもー！たのもー！某、Mr.bugと申すもの。
Excelの環境はOffice365 64bit
Twitterにおわすもののふ方とお見受けする。
いざ尋常に勝負。

###※初心者向け注意事項
####注意1.この記述方法はどちらかというと汚い記法に属します。
この記述方法はどちらかというと、プログラミングとしては汚い記法に属します。
個人的な思想に基づく危険な書き方なので、初心者の方はTwitterに出現するつよつよな御仁の記法をマネするほうが整理しやすく上達に向いてるとおもいます。
####注意2.このVBA自体、無用の長物です。他のツールの使用を推奨します。
本VBAはフロー図を描くという関係上、一般流通しているPlantUMLの劣化版となります。利点があるとするとカスタマイズができる点とエクセルに出せる点くらいなものです。

ユーザーが多いということはアドバイスしてくれる方も多いということです。フロー図としては2流もいいところなので,フロー図をお求めの方は「回れ右」をお勧めします。

##2.ひっさげてきたVBAの仕様・環境
今回、窒素循環の植物の同化～分解者の分解までをフロー図に起こします。
wikipedeia : 窒素循環
https://ja.wikipedia.org/wiki/%E7%AA%92%E7%B4%A0%E5%BE%AA%E7%92%B0

####VBA環境(シート)
パラメータシート:
どのようなフローを作成するか、または作成先の作成オブジェクトシートの設定を管理します。
![スライド2.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/319265/5cd3b566-8be9-f1aa-fa0a-619ee20d1919.png)
オブジェクトシート:
どのようなオブジェクトを作成するか定義するシート
![スライド5.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/319265/8b7e658b-74a5-44bc-5e99-61832efa7b58.png)
作成オブジェクトシート:
実際フローを書き記すシート
![スライド1.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/319265/40e8678a-8e6e-eea6-b3de-9038475c6679.png)
各種名称管理
名称管理は今回はVBA回ですので、軽く触れるだけとさせていただきます。ですが、VBAがエクセル使って起動する関係上、名称定義をするだけでもだいぶ【ワタシ！イジッテル！！】感がでます。
あと挿入とかにも強くなりますし、エクセルをどうして起動するかという説明もしやすいでしょう。
![スライド13.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/319265/5fbc6c32-16a6-7f03-c9fc-ed5a760c4b0b.png)

####マクロの実行
実行方法はパラメータシートにある[フロー図の作成]を実行するだけ。
完成したらメッセージボックスが出てきます。
![スライド3.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/319265/16542205-907a-2883-610e-6ffca098c5fc.png)

作成オブジェクトシートを確認するとこんな感じになります。
![業務フロー.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/319265/4b61863d-966e-b63c-cb69-1fcb5718aeec.png)

####マクロの仕様説明終了？
![スライド4.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/319265/9e914e7d-cf70-4883-d739-489b74a6611d.png)
あれ？ご指摘がきました？
確かにこの部分だけ[栄養素]で、他の箇所は[現象]ですね。
しかし、現状登録しているオブジェクトは→と□だけですね。
![スライド2.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/319265/6e14e886-407f-375c-e193-56bfa80f935e.png)

ならば登録しましょう。
オブジェクトシートに○を挿入して、[オブジェクト名変更]をクリックします。そしてメッセージボックスに○を登録します。
![スライド6.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/319265/51d160d4-a56a-c36b-66d3-f843991cf914.png)
![スライド7.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/319265/3beef3bb-a86f-fe87-be76-d9418e42fa94.png)
そうすると、オブジェクトの欄が○を選べるようになりましたね。
ここでマクロの説明を終了します。

####マクロの仕様説明終了？？
![スライド8.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/319265/e6302b7a-abb9-86d1-61af-04d83a99c48b.png)
あれ、またご指摘ですか？
レイアウトですか？!では現状の作成オブジェクトシートのレイアウトを編集してみます。

……長すぎてプレビューが画像表示できなくなってきたのでいったんここで切ります。

ソースは次の話にて
https://qiita.com/tako_and_kitune/items/e3072cabe6d90ca0d53d
年に5万回忘れるバリデーションとベリフィケーションを3行で。

|ことば|意味|具体的には|チェック対象|
|---|---|---|---|
|バリデーション<br>Validation|妥当性確認|ユーザ要求を満たす仕様になっているか？|仕様|
|ベリフィケーション<br>Verification|検証|仕様どおりに作っているか？|設計<br>プログラム|

# link
[なぜ，バリデーションが必要なのか？](https://embeddedsoftwaremanufactory.blogspot.com/2017/07/validationverification.html)
JavaScript~文字列カウント~

#はじめに
あけましておめでとうございます前回記事から日が空いてしまいました。
ここやTwitterでの活動のやる気が認められて案件をもらいそれに取り組んでいました。
今まで全然たいした内容は投稿出来ていなかったですがそれを評価していただいて嬉しかったです。
ただ案件に時間がかかってしまいなかなか記事を書けず仕事をしながら投稿を続ける難しさを実感しました。
自分のように今勉強中で転職活動している人は今回のような例もあるので投稿してみるのをオススメします。

今回の投稿内容は文字列の長さをカウントするというコードです。
これは入力フォームの文字カウントに使えるのでぜひ参考にしてもらえたらと思います。

#文字数カウント
文字をカウントする構文は次のようになります。

```JavaScript:構文
文字列.length
```

これを実際に使うと

```JavaScript:例
'テスト'.length //3
'test'.length //4
```

このように文字の後ろに「.length」をつけるだけでカウントしてくれます。

#入力フォームカウント
これを元に入力フォームの文字数をカウントするスクリプトを紹介します。

```HTML:入力フォームHTML
<textarea class="textarea"></textarea>
<p>現在<span class="string_num">0</span>文字入力中です。</p>

<!-- classに関しては好きな名前で大丈夫です。分かりやすいものを使用してください -- >
```
続いてJavaScriptです

```JavaScript:入力フォームjs
const textarea = document.querySelector('.textarea');
//「document.querySelector()」を使うことによって任意のHTML要素を簡単に取得できる。
//今回は「document.querySelector('.textarea')」なのでテキストエリアの要素を取得しています

const string_num = document.querySelector('.string_num');
//上と同様にspanの要素を取得しています

textarea.addEventListener('keyup',onKeyUp);
//「addEventListener()」使ってイベント処理を実現しています。
//「オブジェクト.addEventListener(イベントのタイプ, 関数, オプション);」のように記載します。
//今回の場合はオブジェクトに「textarea」,イベントのタイプが「keyup」でこれは「キーボードのキーを離した際に発生するイベント」で
//文字を入力したり、消したりした後キーボードから指を離すと発生します。
//この関数の名前が「onKeyUp」になります。

function onKeyUp(){
const inputText = textarea.value;
//「textarea.value」によってテキストエリアに入力されたテキストを取得しています。

string_num.innerText = inputText.length;
//「innerText」は要素の中身を変更するもので他には「innerHTML」,「textContent」があります。今回は「string_num」の中身を変更します。
//先ほど取得したテキストを「.length」でカウントしてその結果に変更します。
```
#終わりに
今回は新しい要素がいっぱい出てきてなかなか消化しにくい投稿になってしまいました。
その分今までに比べてポートフォリオ等でも使えるような内容だと思います。
自分としては改めてまとめることで知識の整理にもなってよかったです。
今後も案件があるので毎日投稿は難しいですが自分の知識や技術の向上に繋がるので頑張って投稿しようと思ってます。
最後まで読んでいただきありがとうございました。
(自分用)MySQLあれこれ

#項目
1. コマンドあれこれ(DB作成,切替,テーブル・DB一覧,SQLの状態確認)
2. ユーザ作成と権限付与
3. VSCodeでMySQLに接続する時にエラーが出た場合
4. テーブル一覧
5. カラム追加して要素入れる
6. 型の変更
6. rootで接続

#1.コマンドあれこれ(DB作成,切替,テーブル・DB一覧,SQLの状態確認)
```SQL:SQL
-- DB作成
CREATE DATABASE ~~~;

-- DB切替
USE ~~~;

-- テーブル・DB一覧
show databases;
show table;

-- 状態確認
status;
```

#2. ユーザ作成と権限付与
## ユーザ作成

```SQL:SQL
create user 'ユーザ名'@'ホスト名' identified by 'パスワード';
-- ホスト名は色々と決められる
-- @"IPアドレス"でそのIPのみからログイン可能に
-- @"localhost"はそのままローカルホスト
-- @"%"でどのホストからでもログイン可能

-- ログイン
mysql -u ユーザ名 -p
-- or
mysql -u ユーザ名 -h ホスト名 -p
```
## 権限付与

```SQL:SQL
-- ルートでログインして
GRANT ALL PRIVILEGES ON 使うDB名.* TO 付与するユーザ名@そのホスト名 IDENTIFIED BY 'パスワード';

-- この後作成したユーザで入り直せば成功している筈
```

# 3.VSCodeでMySQLに接続する時にエラーが出た場合
- VSCodeでMySQLの拡張機能に接続しようとしたら`Client does not support authentication ~~`ってエラーが出た

```SQL:SQL
-- ルートでログインして
ALTER USER "使うユーザ名"@"ホスト名" IDENTIFIED WITH 'mysql_native_password' BY "パスワード";
-- これでもう一度1から接続し直したら出来た!
```

# 4.テーブル一覧
```sql:sql
mysql > show tables;
```

#5.カラム追加して要素入れる
- カラムの追加

```sql:sql
-- 末尾に入れたい場合
mysql > ALTER TABLE テーブル名 ADD 追加するカラム データ型;
-- 頭に入れたい場合
mysql > ALTER TABLE テーブル名 ADD 追加するカラム データ型 FIRST;
-- 指定した場所に入れる場合
mysql > ALTER TABLE テーブル名 ADD 追加するカラム データ型 AFTER カラム名(この後ろに入る);
```
- 作ったカラムのNullにデータを入れる

```sql:sql
mysql > UPDATE テーブル名 SET カラム = データ ;
-- WHEREとかで入れる場所を操作
```

#6.型の変更
```sql:sql
ALTER TABLE テーブル名 MODIFY カラム名 型
```

#8.rootで接続
```bash:
$ mysql -u root

#何かエラーが出たらとりあえずMySQL再起動
$ sudo mysql.server restart
#ダメならエラー文でググろう
```