OmniAICreator/Qiita-1.07M huggingface dataset:
負荷試験実施ツール JMeterについて part2

[前回](https://qiita.com/fy406/items/ea66c2b8fc698f704a70)の続きです。
今回はJMeterに実際に触れてみます。

#JMeterの導入
JMeterは[こちら](https://jmeter.apache.org/download_jmeter.cgi)から入手します。
上記サイトのBinariesという項目のリンクをクリックしますとダウンロードできます。
ダウンロード後、zipファイルを解凍してbinフォルダ内のjarファイルをダブルクリックしますと起動します。特にインストールは不要です。

JMeterを起動しますと以下のような画面が表示されます。
![jm01.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/858317/46c0ec9e-8cca-1e1f-9c5b-fedb76b07397.png)

#JMeterの試用
さっそく試してみたいと思います。
まずは「テスト計画」を右クリックし、「追加」>「Threads(Users)」>「スレッドグループ」をクリックします。
![jm02.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/858317/dd715ac2-de0f-20b2-60f1-395e83c337d4.png)
スレッドグループの設定画面になります。
動作の確認が目的なので、ここでは簡単に以下の設定を入れてみました。

```
スレッド数：100
Ramp-Up期間(秒)：10
```

![jm03.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/858317/b59850a4-d355-31d5-3721-a025e588247b.png)

続いて作成したスレッドグループを右クリックし、「追加」>「サンプラー」>「HTTPリクエスト」をクリックします。

![jm04.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/858317/d9b6333c-27fd-b61f-e5a5-3ebf2ca4cc71.png)

HTTPリクエストの設定画面が表示されますので、この内青枠内の項目を設定します。

```
プロトコル：http
サーバ名またはIP：負荷試験対象IP
ポート番号：80
パス：負荷試験対象サーバーのアクセスしたいhtmlファイルの格納パス
※↑nginxサーバーの場合の例：/usr/share/nginx/html/index.html
```

![jm05.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/858317/fce23b08-afa5-05f5-ef11-ed9ec12c61a8.png)

以上で最低限の設定は完了しました。
テストを実行するには緑色の右向き三角の再生ボタンをクリックします。

![jm06.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/858317/2c5ed377-07fc-8c77-f343-c2bd84b731bd.png)

スクリーンショットを撮り忘れてしまいましたが、ここで設定の保存を促す画面が表示されるので、任意の設定ファイル名で保存します。
テストを実行している間、以下の「STOP」ボタンが赤色に表示されています。しばらくすると「STOP」ボタンが灰色になり、「開始」ボタンが緑色になりますので、そうなったらテスト終了です。
特にそれ以外でテスト完了の通知はなさそうでした。

![jm07.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/858317/412f8b69-448a-3ebf-45e0-192c47d2c9aa.png)

テスト完了しますと、先程保存した設定ファイル(.jmxファイル)と同じフォルダ内にテスト時のログファイル(jmeter.logファイル)が吐き出されています。
ログファイルの中身については次回確認します。
なお、ログファイル名には特に実行日時等は含まれませんので、2回目をそのまま実行しますと既存のログファイルは上書きされてしまいますのでご注意を。
【個人開発】食品催事イベント投稿サイト「Saizy」を作りました！


## はじめに

転職活動とプログラミングの勉強のため、
食品催事イベント専用の投稿サイト「Saizy」を作りました！

名前は催事（さいじ）から取って、Saizy（サイジー）です！
ネーミングセンスがなくてすいません。。。

[Saizy| 美味しいスイーツ、和菓子、惣菜などの催事情報サイト | Saizy](https://saizy.herokuapp.com/)

テストアカウント
email: test@example.com
password: password

![saizy.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/700627/95e8a536-d3d1-72a2-2fbf-97de202f4024.gif)


## 作ろうと思ったきっかけ
現職で催事関連の方達と接することが多く、
コロナで催事出店も少なくなっている中、
ITの世界では、催事に関してのサービスがほぼない状態です。
みなさま、インスタグラムや出店場所のHPにちょこっと掲載されていることが多く、
一つにまとめたサイトがあればいいのになと思ったことがきっかけです。

## 使いかた
![スクリーンショット 2021-07-25 20.19.11.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/700627/8d4600d9-0f88-38ed-20ee-3ee07c863d5c.png)
ログインしていなくても、催事の情報をみることができます。
![スクリーンショット 2021-07-25 19.13.52.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/700627/da1466d3-ed07-5f5e-a0a4-0d1854a6f51f.png)
![スクリーンショット 2021-07-25 20.23.36.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/700627/af8161ef-81c2-8bed-c45c-9abb446a5029.png)

ログインしていただければ、
催事の投稿、いいね、口コミ投稿をすることができます。
![スクリーンショット 2021-07-25 19.15.05.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/700627/f52eeaf9-cce1-1f45-d004-1c8ca6d8943a.png)

投稿画面は簡素なデザインにしました。
出店場所に施設名「新宿駅」などと入力していただくと、
詳細画面に自然と、Googlemapsで指定した場所が表示されます。

## レスポンシブ 
アプリを作っていく中で、
通勤時間や、寝る前などスマホでちゃんと動いているかを確認したかったので、
レスポンシブデザインも最低限実装しました。
![saizy responsive.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/700627/4e883768-54e8-8106-4dbc-0a5dd93ae02e.gif)

HTML、CSSは1から書いています！

## 最後に
アプリを作っていく中で、
どうやったら、こんな実装ができるのか、どうやって調べたらいいのか等、
自分の頭で考え、調べることが多くなりました！
周りにエンジニアがいなかったため、
教えてもらったりなどできなかったのですが、
teratailで助けてくれた方、Qiitaやブログで情報発信ている方のおかげで、
アプリを作ることができました！ありがとうございす！

1日エラーで終わってしまった様な日もありましたが、
毎日、知らないことが頭に入っていく感じがとても楽しかったです！

今回のアプリは修正点がかなりあるかと思いますので、
ご指摘等いただければ大変ありがたいです！

今後は、エンジニアへの転職活動を始めつつ、
いろいろな方が役に立つなーと思ってもらえる様なアプリを作りたいと思っています。

お忙しい中、最後までご覧いただきありがとうございました！

8/1 追記
awsにもデプロイしました！
http://35.75.87.110:3000/
AWS AppSync GraphQL Query with cURL 

AWS AppSync に作成した API を コマンドラインのcURLを使って接続する方法のメモです。

# 環境

* mac
* curl 7.64.1 (x86_64-apple-darwin19.0)

# AppSync API

https://qiita.com/sy250f/items/d52b5135062c58bf221c

# cURL

## singleNote

```
$ curl -s -v  -XPOST -H "Content-Type:application/graphql" -H "x-api-key:<api-key>" -d '{ "query": "query {singleNote(id:29){record {name{value}}}}" }' https://<graphql-endpoint>/graphql
・・・
{"data":{"singleNote":{"record":{"name":{"value":"2/1 やること"}}}}}* Closing connection 0
```

## listNotes

```
$ curl -s -v  -XPOST -H "Content-Type:application/graphql" -H "x-api-key:<api-key>" -d '{ "query": "query {listNotes {records {name{value}}}}" }' https://<graphql-endpoint>/graphql
・・・
{"data":{"listNotes":{"records":[{"name":{"value":"2/1 やること"}},{"name":{"value":"1/25 todo"}},{"name":{"value":"1/25 やること"}},{"name":{"value":"1/24 やること"}},{"name":{"value":"1/23"}},{"name":{"value":"1/21 やること"}},{"name":{"value":"1/19 やること"}},{"name":{"value":"1/18 やること"}},{"name":{"value":"1/17 やること２"}},{"name":{"value":"1/17 やること"}},{"name":{"value":"1/11 やること"}},{"name":{"value":"1/10 やること"}},{"name":{"value":"1/10 やること"}}]}}}* Closing connection 0
```

# 参考

https://curl.se/
「cannot assign method group to an implicitly-typed variable」のエラーが出た

C#の学習をしているときに、

~~~csharp
var data10 = Enumerable.Repeat(1, 10).ToList;
~~~
という書き方をすると、エラーが出てしまった。

~~~csharp
cannot assign method group to an implicitly-typed variable
~~~
というものだった。

## 解決策
ToListがメソッドなので、「ToList()」と書かないといけないので、これを直したた解決。

~~~csharp
var data10 = Enumerable.Repeat(1, 10).ToList();
~~~

今回発生したエラーは返す型が指定されているのに、nullを返すことが分かっていると発生するエラーみたいだ。

## 参考記事


https://docs.microsoft.com/ja-jp/dotnet/csharp/misc/cs0815
bluestacks覚書

# 前提

- hyper-V版
- 複数インスタンス使用  

要するにこんな感じ(以下この環境を想定)
  ![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/310705/24b32f90-a448-41bd-9ed8-80be2eb9e5d9.png)

# ショートカット作成  

## 直接起動用のショートカット  

リンク先に以下を設定  

実装例  

- アークナイツの場合
  - `"Bluestacks.exe" -vmname Android_1 -json "{\"app_icon_url\":\"\",\"app_name\":\"アークナイツ\",\"app_url\":\"\",\"app_pkg\":\"com.YoStarJP.Arknights\"}"`
- ウマ娘の場合
  - `"Bluestacks.exe" -vmname Android_2 -json "{\"app_icon_url\":\"\",\"app_name\":\"ウマ娘\",\"app_url\":\"\",\"app_pkg\":\"jp.co.cygames.umamusume\"}"`

### 注意点

- 素直に生成した時は`Bluestacks.exe`ではなく`HD-RunApp.exe`だが？
  - `HD-RunApp.exe`で起動した場合、どこかちゃんと立ち上がらないのか動かない場合がある為
    - ウマ娘の方で確認
    - 詳しい原因は不明
      - 調べてないともいう
Pythonistaで綺麗なハート💛をプロット

# はじめに
ふと美しい数式をプロットしたくなり、美しい数式を眺めていたら、綺麗なハート型になる数式を見つけた。
その数式をPythonでプロットしてみることにした。
なんとなくスマホですっとハートを出せるようにしたくなったため、Pythonistaで動作するように作成した。

# 実装方針
## 元となる数式について
描きたい数式：
$$(x^2 + y^2 - 1)^3 = x^2 y^3$$
これを$y$について解くと
$$y = \frac{1}{2}(x^\frac{2}{3} \pm \sqrt{x^\frac{4}{3} + 4 (1 - x^2)})$$
実数の平方根は正であるから、$x^\frac{4}{3} + 4 (1 - x^2) \ge 0$である。
これを解くと
$$-1.1390 \lessapprox x \lessapprox 1.1390$$

## 問題：Pythonistaで立方根を求めるnumpy.cbrtが使えない！
numpy.cbrtがimportできない場合に、cbrtの代わりとなるものを作りたい。
powで立方根自体は求められるが、引数が負数になるとエラーとなってしまう。
つまり、$x$が正($x\ge0$)のとき

```python
pow(x, 1/3)
```
を返したい。また、$x$が負($x<0$)のとき

```python
-pow(-x, 1/3)
```
を返したい。

numpy.ndarrayでは、x[条件式]で条件式を満たすものを抽出することができる。
すなわち、$x\ge0$のものを抽出する場合は以下のようになる。

```python
x[x >= 0]
```

以上のことをまとめると、cbrtは以下のように書くことができる。

```python
cbrt = lambda x: np.append(-pow(-x[x < 0], 1/3), pow(x[x >= 0], 1/3))
```


#コード

```python
"""ハート型をプロットする"""

import matplotlib.pyplot as plt
import numpy as np

# Pythonistaのnumpyではcbrtが使えないため
try:
    from numpy import cbrt
except ImportError:
    cbrt = lambda x: np.append(-pow(-x[x < 0], 1/3), pow(x[x >= 0], 1/3))


def numpy_heart():
    """ハート型をプロットする

    数式：(x^2 + y^2 - 1)^3 = x^2 * y^3
    yについて解いた数式：y = 1/2 * (x^(2/3) +- sqrt(x^(4/3) + 4 * (1 - x^2)))
    実数の平方根は正であるから、
    x^(4/3) + 4 * (1 - x^2) = 0の解が, x ~ +-1.1390であるため、
    xが+-1.1390の範囲を計算し、プロットする。
    """
    x = np.arange(-1.1390, 1.1391, 0.0001)
    y_sqrt = np.sqrt(x * cbrt(x) + 4 * (1 - np.power(x, 2)))
    y_positive = (np.power(cbrt(x), 2) + y_sqrt) / 2
    y_negative = (np.power(cbrt(x), 2) - y_sqrt) / 2
    plt.plot(x, y_positive, color="pink")
    plt.plot(x, y_negative, color="pink")
    plt.show()


def main():
    numpy_heart()

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

# 実行結果
実行結果のハート型のプロット画像

![heart.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/537682/46ccadaa-4d79-3b6b-a0d5-02afbee05dd5.png)

# 参考文献
[Heart Curve -- from Wolfram MathWorld](https://mathworld.wolfram.com/HeartCurve.html)
httpサーバを手っ取り早く立てる

# 概要

**開発時** http サーバが欲しくなる以下のような状況について記載します。

- 静的htmlファイルなどを `file:///` を使わずブラウザで開きたい。
- CGI(php) をとりあえず動かしたい。
- リバースプロキシサーバ(nginx)をとりあえず動かしたい。

ここ最近数ヶ月のうちに、2つ目と3つ目の方法が必要になり、調べてました。せっかくなので記事化しておく。

# 対象環境

Linux。メジャーな distribution なら大差ないはず。 

# 手段

## 静的htmlファイルなどを開くためのhttpサーバを立てる

`python3` の `http.server` モジュールを使う。

```
$ python3 -m http.server 8000
Serving HTTP on 0.0.0.0 port 8000 (http://0.0.0.0:8000/) ...
```

`http://localhost:8000/` に接続。
`index.html` が無ければディレクトリ一覧も出るので便利。

## CGI(php) をとりあえず動かしたい。

`php` が使える。

```
$ php -S 0.0.0.0:8000
[Sun Jul 25 18:52:46 2021] PHP 7.4.3 Development Server (http://0.0.0.0:8000) started
```

`http://localhost:8000/` に接続。
ディレクトリ一覧は出せないので、一覧を自力で書くか、routerを定義する必要がある。

router の書き方については、以下の stackoverflow に書かれている回答が役に立ちました。

https://stackoverflow.com/a/67701677

## リバースプロキシサーバ(nginx)をとりあえず動かしたい

リバースプロキシサーバが必要になりました。仕方ないですね。docker で nginx を立てましょう。

https://hub.docker.com/_/nginx

まずは、最も単純な、8000 番ポートに nginx サーバを立てる方法。`python3 -m http.server 8000` と大体同じ。

```
docker run --name my-nice-nginx --rm \
  -v $PWD:/usr/share/nginx/html:ro \
  -d -p 8000:80 nginx
```

終了するには、`docker kill my-nice-nginx` だけでok。`--rm` 付けていますし。

設定ファイルを書き換えるには、以下のように設定ファイルをマウントする。

```
docker run --name my-nice-nginx --rm \
  -v $PWD/nginx/html:/usr/share/nginx/html:ro \
  -v $PWD/nginx/nginx.conf:/etc/nginx/nginx.conf:ro \
  -v $PWD/nginx/conf.d:/etc/nginx/conf.d:ro \
  -v $PWD/nginx/log:/var/log/nginx/:rw \
  -d --net host nginx
```

ポートフォワーディングで（80から8000に変更するような）ポート変更の対応をすると、リバースプロキシとしてnginxを使いたいときに、dockerの設定が大変になる。
ここは `--net host` してしまって、nginx 側の設定でlistenするポートを置き換えると手を抜ける。`conf.d/default.conf` の変更も忘れずに。

本番環境はちゃんとカプセル化しましょう。
3.6(標準) 幾何分布

## 方針

幾何分布について書く．X~Geo(p)の時，Xは「ベルヌーイ試行によって確率pで起きる事象が，ある時点から初めて起きるまでにx回失敗する」という確率変数である．確率密度関数は，

```math
f_X(x)=p(1-p)^x
```

分布関数は，

```math
\begin{align}
F_X(x)&= \sum_{t=0}^xp(1-p)^t\\
&= \frac{p\{1-(1-p)^{x+1}\}}{1-(1-p)}\\
&= 1-(1-p)^{x+1}
\end{align}
```

生存確率(s回以上事象が起こらない確率)は，

```math
\begin{align}
P[s\leq X]&= 1-P[X\leq s-1]\\
&= 1-\{1-(1-p)^s\}\\
&= (1-p)^s
\end{align}
```

条件付き生存確率(s回連続で失敗したとする時，そこからさらにt回失敗する確率)は，

```math
\begin{align}
P[X\geq s+t|X\geq s]&= \frac{P[X\geq s+t]}{P[X\geq s]}\\
&= \frac{(1-p)^{s+t}}{(1-p)^s}\\
&= (1-p)^t\\
&= P[X\geq t]
\end{align}
```

ハザード関数(x回失敗する条件のもとで，次に事象が起きる確率)は，

```math
\begin{align}
\lambda(x)&= \frac{P[X=x]}{P[x\leq X]}\\
&= \frac{p(1-p)^x}{(1-p)^x}\\
&= p
\end{align}
```

また，問題の「xを超えない最大の整数とは「Xのフロア(床)」と呼ばれる．

### フロア(床)，シーリング(天井)

---

任意の実数xに対して，x以下の最大の整数を床またはフロアといい，

```math
\lfloor x\rfloor
```

と書く．またx以上の最大の整数を天井またはシーリングといい，

```math
\lceil x\rceil
```

と書く．例えば，1.5から見た床は1で，天井は2である．

```math
\lfloor 1.5\rfloor=1,\ \lceil x\rceil=2
```

---


今回は，フロアについて「実数xの床が整数yである」とは，「実数xがy以上y+1未満である」ことと同値であることを用いる．

## 答案

```math
\begin{align}
P[Y=y]&= P[\lfloor X\rfloor =y]\\
&= P[y\leq X<y+1]\\
&= F_X(y+1)-F_X(y)\\
&= \{-\exp(-\lambda(y+1))\}-\{-\exp(-\lambda y)\}\\
&= -\exp\{-\lambda(y+1)\}+\exp(-\lambda y)\\
&= \exp(-\lambda y)\{1-\exp(-\lambda)\}\\
&= \{1-\exp(-\lambda)\}\{1-(1-\exp(-\lambda))\}^y
\end{align}
```

より，

```math
Y\sim Geo(1-\exp(-\lambda))
```

である．また，条件付き生存確率は，

```math
\begin{align}
P[X\geq s+t|X\geq s]&= \frac{P[X\geq s+t]}{P[X\geq s]}\\
&= \frac{(1-p)^{s+t}}{(1-p)^s}\\
&= (1-p)^t\\
&= P[X\geq t]
\end{align}
```

## 参考文献

- 『[現代数理統計学の基礎](https://www.kyoritsu-pub.co.jp/bookdetail/9784320111660)』(久保川達也　著)
【CentOS7】Reactの環境を簡単に構築する

## はじめに
CentOS7の環境でReactの環境構築がかなり簡単に出来ました。
とりあえずReactを使ってみたい人向けになります。

まずはアップデート。

```
sudo yum update
```


## node.jsとnpmのインストール。

```
sudo yum install nodejs npm
```

npmとnode.jsのバージョンを確認する。

```sh
npm -v
# 3.10.10
node -v
# v6.17.1
```

## nパッケージをインストール
このバージョンだと古く、Reactの環境構築がうまくいかないので、新しいバージョンにする必要がある。
そのために、nパッケージをインストール。
※nパッケージをインストールするのにnpmとnode.jsが必要なので、上で古いバージョンをとりあえずインストールしています。

```
sudo npm install -g n
```

nを用いてnpmとnode.jsの新しいバージョンをインストール

```
n stable
```

古い方のnode.jsとnpmはいらないのでアンインストールする

```
sudo yum remove nodejs npm
```

再度ログインを行う

```
exec $SHELL -l
```

バージョンを確認

```sh
node -v
# v14.17.3
npm -v
# 6.14.13
```

## 開発用のディレクトリを作成

```
mkdir react
```

ディレクトリの移動

```
cd react
```

## create-react-appを行う
create-react-appを用いて「project-name」という名前のプロジェクトを作成

```
npx create-react-app project-name
```

作成されたプロジェクトに移動

```
cd project-name
```
## プロジェクトを実行

```
npm start
```

このような画面が出れば成功です。
![スクリーンショット 2021-07-25 185526.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/538529/dce21618-7360-3913-ea89-c5ed31219a8b.png)


以上で環境構築完了です。
自分が想定したよりもかなり楽でビックリしました。
とりあえず環境は出来たので、色々と試していこうと思います。
sshポートフォワーディング とは

## 勉強前イメージ

いつもしてるけど、
中身のこと実はわかってないと思う。

## 調査

### ポートフォワーディング とは

IPアドレスのTCPやUDPの特定のポート番号への通信を、
別のアドレスの特定のポートへ自動的に転送することで、
その経路にSSHを使用することで通信を暗号化することができます。

### 図で表してみる

図にすると以下のようなものです。
直接接続先サーバには接続できないですが、踏み台サーバを手前に置いて
踏み台サーバ経由で通信を行います。

![12021-07-24 # sshポートフォワーディング とは - diagrams.net - Go.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/129517/aa50e3aa-5ae9-9d0f-597a-51596f2ae9b0.png)

sshコマンドにはデフォルトでポートを転送する機能があり、
それを使った接続がこのsshポートフォワーディングになります。

### 実際にコマンドを見てみる

使用するコマンドをしましては、以下になります。

```
ssh -L [PCのローカルポート番号]:[接続先サーバのアドレス]:[接続先サーバのポート番号] [踏み台サーバのアドレス]
```

図としては以下になります。

![22021-07-24 # sshポートフォワーディング とは - diagrams.net - Go.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/129517/47a0a55f-dfe6-e1f1-94a3-024f92372eac.png)

接続先サーバの80番ポートの接続を
PCの8080ポートに転送させるためには以下のコマンドになります。

```
ssh -L 8080:Y.Y.Y.Y:80 X.X.X.X
```

以下のように-Nを使用するとsshコマンドは使用されず、ポート転送のみされます。

```
ssh -L -N 8080:Y.Y.Y.Y:80 X.X.X.X
```

## 勉強後イメージ

コマンドも図も大体わかってたけど、
sshのデフォルトでポート転送機能があるのか
普通にsshコマンドでいけるのは知ってたし、使ってたけど
sshにポート転送機能があるっていう頭がなかった

## 参考

- [SSHポートフォワーディング（トンネリング）とは](https://www.koikikukan.com/archives/2016/09/15-000300.php)
- [Tera Termでポートフォワーディングをやってみた](https://glodia.jp/blog/9567/)
【Nuxt.js】Netlifyデプロイ時にError: Cannot find module '@nuxtjs/tailwindcss'が表示される

NuxtとTailwindcssでアプリを作成中、
Netlifyにデプロイしようとしたら、

```
✖ Nuxt Fatal Error  

Error: Cannot find module '@nuxtjs/tailwindcss'
Require stack:  
- /opt/build/repo/node_modules/@nuxt/core/dist/core.js
```

上記が表示されてしまい、デプロイができませんでした。

運良く、
エラーコードで解決方法がわかったので、
備忘録として投稿します(ｏ'∀')ﾉ

[Cannot find module '@nuxtjs/tailwindcss' - Deploy on Laravel Forge #9](https://github.com/nuxt-community/tailwindcss-module/issues/9)

```
$ yarn add @nuxtjs/tailwindcss
```

上記のコマンドで正常にデプロイができました。
上記のコマンドでインストールをしたと思っていたのですが、
--devなどのオプションが付いていたのかもしれません。

Nuxtで最初から、Tailwindcssを使用する場合は
上記のコマンド後、

```
nuxt.config.jsに以下を記載

buildModules: [
  '@nuxtjs/tailwindcss'
]
```

これでNetlifyにデプロイして、正常に動きます！
Laravel AWSのEC2・RDSでデプロイまでの道（作成途中）

#全体像
1.EC2関連の準備
2.RDS関連の準備
3.EC2のpublicサブネットの中にapache, php, git, composer, その他Laravelの環境構築に必要なものをインストール
4.GitHubで管理の対象外となっている.envファイルの設定
5.php artisan migrateでテーブル作成

一番参考になった記事
https://qiita.com/nakm/items/0bcc6564538a0604b2ce
#EC2関連の準備
AWSの基本を


#コマンド
【Git】push時に毎回パスワードを求められる

## はじめに
**push** するときにパスワードを求められるのは面倒くさい・・。
もし同じような挙動が起きている方は簡単に改善できるのでお試しください。

## 対象読者
- Git, GitHub, GitLab 利用者
- Git操作に慣れていない方 

## 目次

- はじめに

- 対象読者

- 目次

- 原因

- 解決策

    - 確認方法

    - 解決方法

    - ※URLってどれ？

    - 設定の確認

- 参考文献


## 原因
HTTPS通信だと毎回求められるようです。
全然意識していなかった・・。

https://docs.github.com/ja/github/getting-started-with-github/getting-started-with-git/why-is-git-always-asking-for-my-password

## 解決策

#### 確認方法

出力結果でoriginのあとに続くものが `ssh` なら大丈夫。
`https` から始まっていると **Https通信** を使用している。

```sh:ターミナル
# コマンド
git remote -v

# 出力結果
origin  https://git.xxx.xxx.git (fetch)
origin  https://git.xxx.xxx.git (push)
```

#### 解決方法


下記のコマンドでURLの変更をすることができる。

```
git remote set-url origin [※URL]
```

#### ※URLってどれ？

確認方法は以下です。（画像も添付いたしましたので参考にしていただけたら幸いです。）

①任意の　**GitHub**　のページにアクセスする
②**Code**　をクリック
③**URL** をコピー(※)

※　**HTTPS**, **SSH**, **GitHub CLI** とありますが今回コピーしたいのは　**SSH**　です。

[![Image from Gyazo](https://i.gyazo.com/624f3b59218de248daf0ed07073186bd.png)](https://gyazo.com/624f3b59218de248daf0ed07073186bd)

#### 設定の確認

**ssh** からはじまっていればokです。

```sh:ターミナル
# コマンド
git remote -v

# 出力結果
origin  ssh://git@xxx.xxx.xxx.xxx.git (fetch)
origin  ssh://git@xxx.xxx.xxx.xxx.git (push)
```

## 参考文献
- [gitのremote urlを変更する(レポジトリ移行時)](https://qiita.com/minoringo/items/917e325892733e0d606e)
- [gitでパスワードを毎回聞かれる問題の解決方法](https://qiita.com/rorensu2236/items/df7d4c2cf621eeddd468)
- [Git が常にパスワードを要求するのはなぜですか？](https://docs.github.com/ja/github/getting-started-with-github/getting-started-with-git/why-is-git-always-asking-for-my-password)
MacのTerminalでのエイリアス利用方法

よく使うコマンドにエイリアス（別名の意）をつけておくと、コマンド入力時間の短縮につながります。
以下はMacユーザーに向けたエイリアス利用方法についての簡潔な解説です。

---

### エイリアス設定方法

ターミナル（ 厳密には zsh や bash というシェル ）の起動時に読み込まれる設定ファイルである `~/.zshrc` や `~/.bashrc` というファイルにエイリアスの定義を記述することで設定できます。

以下、シェルに zsh を用いている場合の説明です。
（ bash を用いている方は、適宜 `~/.zshrc` を `~/.bashrc` に読み替えて下さい ）

`~/.zshrc` の編集方法は、ターミナル上で vim を用いて編集することもできますが、vim の使い方に慣れていない方は、vscode 等のテキストエディタで編集しても良いと思います。

vscode の場合、下記コマンドをターミナルで実行する事で設定ファイルを編集できます。

```bash
code ~/.zshrc
```

場合によっては `~/.zshrc` が存在しない事もあるので、その場合は `touch ~/.zshrc` コマンドを実行してファイルを生成してから上記コマンドを実行して下さい。

`~/.zshrc` をエディタで開いたら、任意の箇所にエイリアスの定義を記述し保存します。
以下は私が設定している alias の定義。

```bash
# ~/.zshrc の記述例

#---------- aliases ----------#
# Git
alias ga="git add"
alias gc="git commit"
alias gcm="git commit -m"
alias gs="git status"
alias gb="git branch"
alias gco="git checkout"
alias gd="git diff"
alias gdc="git diff --cached"
alias gl="git log"
alias gp="git push"

# npm
alias ni="npm install"
alias nv="npm view"

# other aliases
alias ll="ls -l"
alias la="ls -la"
alias lg="ls -l | grep"
```

### 反映方法

`~/.zshrc` は zsh の起動時に読み込まれますので、ターミナルを立ち上げ直す事で編集内容を反映する事ができます。もしくは、立ち上げ直さずに下記コマンドで設定ファイルを読み込むことでも反映できます。

```bash
source ~/.zshrc
```

### 利用方法

上記のエイリアス設定をした場合、例えば `git add hoge.js` というコマンドは、 `ga hoge.js` と打てば同じコマンドが実行されます。
（エイリアスに続けて引数やオプションを指定できる）
オフライン環境下でAnaconda仮想環境を構築する方法

# 背景
オフライン環境下のマシンにパッケージ盛り盛りのPython環境を整えたのでそのメモ。
本記事ではAnacondaを使用して環境構築を行います。

ちなみに、すでにいくつかの記事でオフライン環境下で仮想環境を構築する方法や、パッケージをインストールする方法が紹介されています。

例えば、
- [オフライン環境下にあるPCにAnaconda仮想環境を構築するお話](https://qiita.com/uguisuheiankyo/items/40bcbe4c993504cac09a#6-%E3%81%9D%E3%81%AE%E4%BB%96%E3%83%91%E3%83%83%E3%82%B1%E3%83%BC%E3%82%B8%E3%81%AE%E3%82%A4%E3%83%B3%E3%82%B9%E3%83%88%E3%83%BC%E3%83%AB)
- [WindowsオフラインパソコンにcondaでPython環境構築](https://sabopy.com/py/offline-miniconda/)
- [pip installをオフラインで行う](https://qiita.com/saten/items/d2ac85947583723246bf)

これらの記事に従うと仮想環境の作成まではスムーズにいったのですが、パッケージのインストールで躓きました。

まず、```conda install```を使う場合は、必要なソースファイル（```.conda```, ```.tar.bz2```）を```.../anaconda3/pkgs/```下から探すの面倒です。```pip install``` では単純に目的のソースファイル（```.whl```）のみを持ってきても、うまくいかない場合があります。この原因はパッケージ間に依存関係があるためです。例えば、OpenCVを利用するにはNumPyが必要なので、OpenCVのwhlファイルのみ準備しても、インストールに失敗します。一応、エラー理由を見て、どのパッケージが足りていないかを確認し、必要なwhlファイルを準備する。これを繰り返せばオフライン環境下で所望のパッケージのインストールも可能ですが、あまりに面倒です。

本記事では、この面倒な手続きをすっ飛ばす簡単な方法を紹介します。

# 必要なもの
- オフライン環境下のマシン（以下、オフラインマシン）
- オフラインマシンと同じOSを搭載したオンライン環境のマシン（以下、オンラインマシン）

同じOSを用意するのはビルドされたパッケージがOSに依存している場合があるためです。また、事前に両マシンには同一バージョンのAnacondaをインストールしてください。

# 方法
オンラインマシンで環境構築を行い、オフラインマシンに移植（コピペ）します。

1. オンラインマシン内でconda仮想環境を作成
1. 必要なパッケージをインストール
1. 仮想環境のフォルダごとオフラインマシンに配置

conda仮想環境の作り方などは[他記事](【初心者向け】Anacondaで仮想環境を作ってみる)を参照ください。
所望の環境が作成したら、ターミナルで```conda info -e```と叩き、仮想環境の実体がどこにあるか確認します。Macの場合デフォルトでは```/opt/anaconda3/envs/{環境名}```にあるはずです。

あとはこの```{環境名}```のフォルダをコピーして、オフラインマシンの```.../anaconda3/envs/```下に置くだけ。
これでオンラインマシンで作成した環境をオフラインマシンで使用できます。

# 解説
オンラインマシンで用意した環境をオフラインマシンに移植（コピペ）しました。

---
間違いなどありましたらご指摘お願いします。
[Laravel] Carbon::now() で保存したデータを Carbon インスタンスとして扱う


DATETIMEカラムに Carbon::now() の値を保存したとします。

```php
$table->dateTime('confirmed_at', $precision = 0)->nullable();
```

```php
$post->confirmed_at = Carbon::now();
$post->save();
```

この状態では，データはただの文字列なので Carbon インスタンスとして機能しません。

```php
$post->confirmed_at->format('Y/m/d');
// Call to a member function format() on string
```

## アクセサを定義する

`confirmed_at` にアクセスした際に，自動的に Carbonインスタンスに変換する処理を書きます。

```php:Post.php
use Carbon\Carbon;

/**
 * @param  string $value
 * @return \Carbon\Carbon
 */
public function getConfirmedAtAttribute(string $value): Carbon
{
    return Carbon::parse($value);
}
```

これで `$post->confirmed_at` が Carbon インスタンスを返すようになります。
Ubuntu Server 20.04をWifiに接続する話

# 概要

Ubuntu Server 20.04（以下Ubuntu Server）でWifiに接続する方法を紹介する。
Ubuntu ServerはDesktop版と違って、ネットワーク周りの管理デーモンがNetwork Managerではなく、netplan + systemd-networkdで動作している。

netplanにはwifiのアクセスポイント情報を書くyamlのディレクティブが存在するが、それを設定してもそのままではアクセスポイントに接続してくれない。

原因は、WPA接続のために必要なパッケージ"wpasupplicant"が足りないため。

# 対応方法

## パッケージのインストール

```bash
sudo apt update
sudo apt install wpasupplicant

sudo reboot
```

## Wifiの設定

完全に自分の好み[^1]だが、独自のnetplanの設定は`/etc/netplan/99_config.yaml`に入れている。

```bash
cat - << EOF | sudo tee /etc/netplan/99_config.yaml
network:
  version: 2
  wifis:
    [wifi interface]:
      dhcp4: true
      access-points:
        [SSID]:
          password: [SSID Key]
EOF

sudo netplan apply
```

# 参考文献

<https://askubuntu.com/questions/1042789/ubuntu-server-netplan-for-wifi-and-ethernet>

[^1]: 好みだけではなく、[ubuntuのnetplanのドキュメント](https://ubuntu.com/server/docs/network-configuration)に書いてあるというのもある。
【個人開発】コードネーム（和音）を判定するアプリを作った


構成音をポチポチ選択するだけで、コードネームが判定されるウェブアプリを作りました！
↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓

https://o-to.khufrudamonotes.com/o-to-modal-interchange

![ScreenShot-7202158172554.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/486558/d5cb927e-358f-88ba-8e5b-ad297de62b1a.png)


# もう似たようなアプリあるでしょ？
…ぶっちゃけ、音の組み合わせからコードネームを検索するウェブアプリは他にもあります。

しかし、今回僕の作ったやつはひと味違います。

自ら「推しポイント」を語らせてください。
　
　

コードネームだけではなく…

- コードの読み方
- 詳細情報
- コードの構成音を含む主なスケール

まで同時に表示してくれます！！


　
　
―――え？「だからどうした？」って？


## コードの読み方が分かるメリット
慣れないうちは、複雑なコードネームはまるで呪文です。

しかし、当たり前ですけど読み方が併記されていれば読めます。

![ScreenShot-7202111182521.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/486558/dd8aa1fd-a568-9d8e-fa5a-7d12d4c9d96d.png)

コードに関する記事やアプリは、おそらく”コードネームが読める人”が書いたり作っていると思うので、意外と忘れがちな機能じゃないかと思います。

## 詳細情報が分かるメリット

こういうコードネーム検索アプリを使ってくださる方って、楽器を弾いていて…「お！いい感じの響きのコードを見つけた！」
→「コードネームなんだろう？」って流れで使われるんじゃないか…と思います。

でも、コードネームだけを見て「へぇ〜」で終わってしまうのは「もったいない」と感じるんですよね。
せっかくなら、コードの仕組みや成り立ちまで理解して応用できるところまでいければ良いのにな…と。

その点、コードの詳細情報を確認できると”せっかく発見した素敵な響き”を応用する大きな助けになるはずです。


![ScreenShot-7202157112720.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/486558/bc620638-f55a-7623-1a4d-a58f6d2c9cd1.png)

↑"ドミナント機能を持つコード（不安定なコード）"の場合は、"解決先のコード"の候補と、"手前にいそうなコード"の候補まで表示されます。(※トライトーンの有無から判定しています。)

## コードの構成音を含む主なスケールが表示されるメリット

60種類を超える主なスケールの中から、”指定したコードの構成音を持つスケール”を自動で絞り込みます。

こちらもスケールの名前だけでなく、構成音、調号、親スケールの名前まで表示されます。

![ScreenShot-7202110162653.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/486558/d91d89b3-b3e2-4e71-6f6d-24e2467383e1.png)
コードは前後の流れや、使われているキーに対しての立ち位置によって役割が変わります。

しかし、この機能を使えばそれらが一望できます。

また、複雑なコードを見たときの鉄板リアクションは、「こんなコードいつ使うねん？」だと思います。

それに"答えられる"機能になっているはずです。


# 弱点
という感じで自画自賛の嵐でしたけど…

制作者が思う至らない部分についてもまとめておきます。

#### 異名同音を厳密には判定していない
ある程度の異名同音を区別する処理はしてあります。

~~しかし、「異名同音を厳密に処理しようとすると色々面倒くさくなるなぁ」…と思って躊躇しました。~~

→　**対応しました。**

https://khufrudamonotes.com/enharmonic


#### UST（アッパー・ストラクチャー・トライアド）やハイブリッド・コードの解釈には対応していない。

~~操作の煩雑さを抑えつつ、同じUIで分かりやすく伝える方法が思い浮かばなかったので実装を見送りました。~~ 

~~ただ、有名なUSTやハイブリッド・コードと同じ構成音を持つコードに関しては詳細情報に表示されるようにしています。~~ 

→　**対応しました。**

<blockquote class="twitter-tweet"><p lang="ja" dir="ltr">音楽理論ウェブアプリ、ついに「ハイブリッド・コード」と「UST（ｱｯﾊﾟｰ・ｽﾄﾗｸﾁｬｰ・ﾄﾗｲｱﾄﾞ）」の判定に対応しました！！！！🙌<a href="https://t.co/bL7VDNniAt">https://t.co/bL7VDNniAt</a> <a href="https://t.co/6JhWWs4qwR">pic.twitter.com/6JhWWs4qwR</a></p>&mdash; キムラ ヨシト(KHUFRUDAMO NOTES) (@k1mu0419) <a href="https://twitter.com/k1mu0419/status/1545004392620756992?ref_src=twsrc%5Etfw">July 7, 2022</a></blockquote> <script async src="https://platform.twitter.com/widgets.js" charset="utf-8"></script>

https://khufrudamonotes.com/u-s-t-hybrid-chords

# 使ってね

というわけで、是非使ってみてください！
できれば感想などもらえると嬉しいです！！
↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓

https://o-to.khufrudamonotes.com/o-to-modal-interchange
Railsセキュアパスワードの実装について

<h2>セキュアパスワードとは</h2>
セキュアパスワードという手法を使う際には、
ユーザーにパスワードとパスワードの確認の入力をさせ、
そのままDB上に保存するのではなくハッシュ化したものを
DBに保存する方法のことを指します。


セキュアパスワード使用されるハッシュ化の処理は、
<b>入力されたデータをハッシュ関数を使用して
元のデータに戻すことのできない（不可逆）形</b>にする処理を行なっています。

ユーザー認証は、「パスワードの送信」→「ハッシュ化」→「DB内のハッシュ化された値との比較」といったような手順で進んで行きます。

比較した結果が一致すれば、送信したパスワード（入力したパスワード）は正しいということになり、ユーザー認証されることになります。

仮にDBの内容が盗まれたり、覗き見られるようなことがあってもパスワードの安全性が保たれ、
生のパスワードをデータベースに保存することなく認証することができます。

<h2>セキュアパスワードの実装方法</h2>
<h3>モデルファイルにhas_secure_passwordメソッドを追加</h3>
modelにhas_secure_passwordを追加します。

```ruby:models/user.rb
class User < ApplicationRecord
  has_secure_password
end
```
モデルにhas_secure_passwordを追加することで、下記のような機能が使えるようになります。
<ul>
<li>ハッシュ化したパスワードを、データベース内の「password_digest」という属性に保存することができるようになる</li>
<li>2つのペアの仮想的な属性「password」、「password_confirmation」が使用できるようになり、存在性と値が一致するかどうかのバリデーションも追加される
＊（モデルのオブジェクトからは存在しているように見えるが、データベースには対応するカラムが存在しない、という意味です。）</li>
<li>authenticateメソッドが使えるようになる</li>
</ul>

has_secure_password機能は記述するだけで使用可能になりますが、
モデル内に「password_digest」という属性が存在している必要があります。

<h4>password_digestをテーブルに追加</h4>
コンソールから、属性名と型の情報を入力していきます。

```
$ rails generate migration add_password_digest_to_users password_digest:string
```

```ruby:[timestamp]_add_password_digest_to_users.rb
class AddPasswordDigestToUsers < ActiveRecord::Migration[6.0]
  def change
    add_column :users, :password_digest, :string
  end
end
```

エラー等がなければ、マイグレーションを実行します。

```
$ rails db:migrate
```

<h3>bcryptをinstall</h3>
has_secure_passwordを使ってパスワードをハッシュ化するためには、最先端のハッシュ関数であるbcryptが必要になります

bcryptを使うためにGemfileに追加します。

```ruby:Gemfile
gem 'bcrypt', '3.1.13'
```

```
bundle install
```
[VBA]Workbooks()の使い方

■Workbooks()オブジェクトについて
・ブックに対して操作するもの
・開いているすべてのブックは、Workbooksコレクションに含まれる

■変数の宣言
Dim book As Workbook

■ブックの指定
・「excelbook」という名前のブックを指定する場合
Set book = Workbooks("ファイル名")
とする。

■Workbookのプロパティとメソッド
□プロパティ
・Name:名前
・Path:保存パス
・FullName:保存パス＋名前
・Sheets:すべてのシート
・Worksheets:すべてのワークシート
□メソッド
・Close:閉じる
・Save:上書き保存
・SaveAs:名前を付けて保存
VSCodeでPythonの仮想環境に切り替える


## 背景
VSCodeを立ち上げて仮想環境を実行する度にPowerShell スクリプトの実行ポリシー変更するのが面倒

## やった事
F1 キーでコマンドパレットを表示。
"Open Settings(JSON)"を入力してsettings.jsonを開いて下記を追加

```:Windows
"terminal.integrated.env.windows": {
        "PSExecutionPolicyPreference": "RemoteSigned"
}
```

あとは、PowerShell で仮想環境のactivate 用スクリプトを実行すればよい。
例）./venv/Scripts/Activate.ps1
[03] docker-composeを活用して即座にJenkinsを立てて使ってみる ... WindowsPC を Slave として登録する


# 留意事項

本手順を実施する場合は、次のように読み替えること.

・アカウント名の「`robozushi10`」を各ユーザのアカウントにする

・ホストIP「`192.168.10.115`」を各ユーザの IP やホスト名にする
　

# 概要

[前回](https://qiita.com/robozushi10/items/f6ff1aade15ab2bd06a1) からの発展で、次のように**別途 Windows 上に Slave を立ち上げる場合** の手順である.

前回までと同じ要領で Windows PC を Slave として登録させることができて、さらに Windows 環境でのデプロイもできるようになるので便利である.

// 私の環境では、Slave である Windows PC に対して 5時間以上連続したテストを実施させている

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1246056/4150f1f1-4756-2afc-4bce-b3ef0bd28292.png)



|役割|ホスト側ポート|コンテナ側ポート|補足|
|:--|:--|:--|:--|
|Jenkins Master|43080|43080||
|Jenkins Slave(1)| - | - |Docker on Docker 可能である|
|Jenkins Slave(2)| - | - |Docker on Docker 可能である|
|Jenkins Slave(3)| - | - |Docker on Docker 可能である|
|Jenkins Slave(4)| - | - |Windows PC上に配置する|

　

　

# 手順

## 1. Slave 用のホームディレクトリを作成する

Windows PC での操作である.

### 1. PowerShell ウインドウを開く

「`Windowsキー + R`」→「`powershell`」と入力する

### 2. ディレクトリを作成する

```powershell
new-item -type Directory C:\JenkinsAgent
```

　

　

## 2. Jenkins Master 側で Windows PC を Slave として登録する

Jenkins Master の WEB-UI での操作である.

登録手順は前回までと同じ要領であり、ここでは次のように入力した.

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1246056/fd5fab26-1dbc-2497-369a-d5c06c26ea4d.png)

　


## 3. Windows PC から Jenkins Master に JNLP 接続する

### 1. 事前に Windows PC に対して Java をインストールしておくこと

次の要領でインストールをすれば良い.

```
1. OpenJDK 15.0.1 の Zip ファイルを Oracle のページから Download してくる.
　　https://download.java.net/java/GA/jdk15.0.1/51f4f36ad4ef43e39d0dfdbaf6549e32/9/GPL/openjdk-15.0.1_windows-x64_bin.zip
2. 上記 1 で入手した Zip ファイルを展開(unzip)する
3. 展開(unzip) したデータを、ローカルのディスク (例: C:\OpenJDK-15.0.1\) に配置する
4. システム環境変数 JAVA_HOME に「上記 3 で配置したパス」を記す
5. システム環境変数 Path に「上記 3 で配置したパス + /bin」を記す
```

関連記事: [Windows10用 OpenJDK のインストーラを作ろう](https://qiita.com/robozushi10/items/00e956e50bf42effac54)

　

### 2. Slave を稼働させる

```powershell
> java -jar agent.jar -jnlpUrl http://192.168.10.115:43080/computer/WindowsAgent/jenkins-agent.jnlp -workDir "C:\JenkinsAgent"
```

Windows PC で実施した CI/CD の一例については、下記を参照すること.

[[シリーズ] PowerShell実践例](https://qiita.com/robozushi10/items/0b0605257ad39bc22895)
　

以上

　

　

# 参考サイトおよび書籍

|URL|
|:--|
|https://www.slideshare.net/miyajan/jenkins-61133952|
|[［改訂第3版］Jenkins実践入門](https://gihyo.jp/book/2017/978-4-7741-8928-4)|
週刊Transformer（画像認識向け）7号

凄まじい勢いで増殖中のTransformer論文＋αにとりあえず、目を通しつつコメントを残していく。内容があっている保証はない。
週刊MLPになるのは時間の問題な気がする。

[AS-MLP: AN AXIAL SHIFTED MLP ARCHITECTURE FOR VISION](https://arxiv.org/pdf/2107.08391.pdf)
MLP系でSOTA。Axialごとにシフトしてそれを混ぜる。S2-MLPに似てる？

[CycleMLP: A MLP-like Architecture for Dense Prediction](https://arxiv.org/pdf/2107.10224.pdf)
今までのMLPと違って、local windowを導入することで学習をLinearにして、SSとかObject detectionとかにも使いやすくした。

[Early Convolutions Help Transformers See Better](https://arxiv.org/pdf/2106.14881.pdf)
FAIR論文。ViTで、最初からPatchにするんじゃなくて、そこを普通のConvに変える（Transformer1個分と同じサイズ分。なので、Transformerのブロックは一つ減らす）と、精度良くなったし、学習速くなったし、安定するし良いこといっぱい。

[PVTv2: Improved Baselines with Pyramid Vision Transformer](https://arxiv.org/pdf/2106.13797.pdf)
patchをオーバーラップさせたり、Convまぜたりして、[前のやつ](https://arxiv.org/pdf/2102.12122.pdf)より良くしたよ。

[Understanding the Role of Individual Units in a Deep Neural Network](https://arxiv.org/pdf/2009.05041.pdf)
Convが層ごとに何を見ているか？　図がわかりやすい！

[Deep Learning on a Data Diet: Finding Important Examples Early in Training](https://arxiv.org/pdf/2107.07075.pdf)
学習の最初の方で、必要なデータがどれで、いらないのはどれかがわかる。

---
[LATTE: LSTM Self-Attention based Anomaly Detection in Embedded Automotive Platforms](https://arxiv.org/ftp/arxiv/papers/2107/2107.05561.pdf)
CANメッセージ（車の中の情報伝達メッセージ）の中に変なの流れてたら見つける。

[YOLOX: Exceeding YOLO Series in 2021](https://arxiv.org/pdf/2107.08430.pdf)
最新YOLOシリーズ。anchor-freeに戻ってたりしてて、こっちはこっちで進んでいるらしい。

[RAMS-Trans: Recurrent Attention Multi-scale Transformer for Fine-grained Image Recognition](https://arxiv.org/pdf/2107.08192.pdf)
ViTでパッチサイズをDynamicに選ぶことで、だんだんと細かいところを見ていく。
初心者がgit cloneでぶつかったエラー

###git cloneとは
リモートリポジトリをローカルリポジトリに複製すること
複製という意味は理解してましたが、何をどうしていたかは知らなかったのでしっかり理解すべきだと思いました。

####初めてgit cloneした時のエラー文

```
Permission denied (publickey). fatal: Could not read from remote 
repository.  Please make sure you have the correct access rights
 and the repository exists.
```

######どんな問題が発生しているか。
リモートリポジトリに対してアクセス権が無く、エラーになった。

####解決方法

######1.プライマリーキーの作成

```
ssh-keygen -t rsa -C メールアドレス
```
メールアドレスはgithub登録した時と同じものにしてください。

すると順番にこのように表示されます。

```
Enter file in which to save the key (/home/vagrant/.ssh/id_rsa):
Enter passphrase (empty for no passphrase):
Enter same passphrase again:
```
上から、
・鍵の保存場所の指定
・パスワードの設定
・パスワードの再入力

入力後エンターで先に進めます。

#####2.作成した鍵をコピーする。

```
ls ~/.ssh/
```

id_rsaが秘密鍵
id_rsa.pubが公開鍵

#####3.id_rsa.pubを表示する

```
less ~/.ssh/id_rsa.pub
```
id_rsa.pubファイルを開いて公開鍵の確認
sshから始まる長い文字列が表示されるので末尾のメールアドレスまでをコピーしておきます。

#####4.githubで鍵を登録する
githubのマイページで、この鍵を登録します。
右上のアイコンをクリックし、settings → SSH and GPG keysをクリックしします。
次に、右上のnew keysをクリックしてください。

すると鍵の登録画面が現れます。
Keyのところに先程コピーしたものを貼り付けます。

#####5.ターミナルにてconfigを設定し、疎通確認をする

```
vim ~/.ssh/config   
```


configの内容はこちら

```
Host github
  HostName github.com
  IdentityFile ~/.ssh/id_rsa
  User git
```
git cloneを再び実行すると、パスワードを求められるので設定したパスワードを入力し、クローン完了です。

###参考資料

https://qiita.com/matsubox/items/09904e4c51e6bc267990

https://tusukuru.hatenablog.com/entry/2018/08/29/021651
GCP API v2.0.0の注意点：メソッド名からenumが削除されている

###（ 利用環境 ）

Google Cloud Platform (GCP)のアカウントを取得後、ローカルのMacbookから、GCPにssh接続して、Google Video Intelligence APIを叩いています。

###GCP API v2.0.0のハマりポイント

次のポイントでハマりましたので、解決策を掲載します。

- GCP API v2.0.0から、__メソッド名中のenumは削除__されている。


####GCP VideoIntelligenceのインスタンス作成まで

``` Python3:
>>> import json
>>> from google.cloud import videointelligence
>>> from google.oauth2 import service_account
>>>
>>> service_account_key_name = "electroncgpvision-8bf54f743c93.json"
>>> info = json.load(open(service_account_key_name))
>>> creds = service_account.Credentials.from_service_account_info(info)
>>>
>>> video_client = videointelligence.VideoIntelligenceServiceClient(credentials=creds)
```


####動画ファイル読み込み

```Python3:
>>> path = './olympic.mp4'
>>>
>>> import io
>>>
>>> path = './olympic.mp4'
>>>
>>> with io.open(path, 'rb') as file:
...     input_content = file.read()
... 
>>>
```

####メソッド名の未定義エラー

```Python3:
>>> features = [videointelligence.enums.Feature.OBJECT_TRACKING]
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
AttributeError: module 'google.cloud.videointelligence' has no attribute 'enums'
>>>
```
以下のウェブサイトなどでは、enumの文字列を含むAPIを叩いている。

- [Video Intelligence APIで動画の物体検出をする](https://qiita.com/yoh_n/items/9a60d46e976e7884960f)

> 次にAPIを実行して結果を取得する
>
>```Python3:
>features = [videointelligence.enums.Feature.OBJECT_TRACKING]
>```


__しかし、次のエラーが発生しました。__

```text:エラー
AttributeError: module 'google.cloud.videointelligence' has no attribute 'enums'
```

####GCP API v2.0.0では、__*enum*__が削除されていた

- https://technodaifuku.blogspot.com/2020/10/vision-api-python-v200.html

> enums と types サブモジュールが削除されています。
> 例えば、v1.0.0では、vision.types.Image を v2.0.0では、vision.Image として利用します。同様に、vision.enums.Feature.Typeはvision.Feature.Typeとします。


####以下で成功した。

```Python3:
>>> features = [videointelligence.Feature.OBJECT_TRACKING]
```
Bosch BME280をRasPiにつなぐときの設定

# はじめに

おじさんは以前にBME280をESP32やらRasPiにつないでクラウドにデータをupload していました。今回、新たにセンサーを購入し、クラウドも刷新して作ろうと思ったのですが、humidity が0と読めず、悩みに悩みました。結果、購入したものがBMP280でhumidity を出力しない、似て非なるものだった、という落ちでした。（悲しい）

購入したのははるか昔なのだが、「安いので５個まとめ買い」をしてました。多分amazon で BME280と書かれていたのではと疑っています。（←自分で確認してみるか。。。)

せっかくなので、いろいろ見直した時の内容をメモしておきます。

# Raspberry Piの I2Cの設定

### 配線の確認

I2Cで使うので、こんな感じ。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/294040/acc46a3d-6e97-6d7a-769f-f8e9b730472b.png)

### I2Cの設定確認

raspi-config でI2Cを有効にし、i2ctools をインストールします。

```
$ lsmod | grep i2c
i2c_bcm2835            16384  1
i2c_dev                16384  2
$ i2cdetect -y 1
     0  1  2  3  4  5  6  7  8  9  a  b  c  d  e  f
00:          -- -- -- -- -- -- -- -- -- -- -- -- --
10: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- --
20: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- --
30: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- --
40: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- --
50: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- --
60: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- --
70: -- -- -- -- -- -- 76 --
$ cat  /etc/modules | grep i2c
i2c-dev
$ cat /boot/config.txt | grep i2c
dtparam=i2c_arm=on
```

I2Cのbaudrate が　dmesg で見れるらしいのだが、おじさんはできなかった。


I2Cのbaudrate を変えられるようなので変えてみた。この[記事]
(https://www.qoosky.io/techs/2316d68b2e)を参考に。
dtparam=i2c_baudrate=50000
を最終行に追加しました。50kということかな。


### 配線

当初は下記の記事を読み、pull-up 抵抗が必要かもと思いました。RasPi様は
内蔵している聞いていたので何もしていません。

https://www.mgo-tec.com/blog-entry-bosch-driver-bme280-m5stack-esp32.html/3

おじさんはオシロ使えないので。

# BME280と BMP280の区別

humidity が読めないのでわかる、というのは後付けの知識。
IDのregister を読むと明白です。以下は仕様書。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/294040/c9bb0df3-1d27-551f-86cd-0060f19a50fd.png)

0x0Dを読んでみる。

```python
from smbus2 import SMBus
bus_number  = 1
bus = SMBus(bus_number)
i2c_address = 0x76
bus.write_byte_data(i2c_address, 0xE0, 0xB6)
print("chip ID: ", hex(bus.read_byte_data(i2c_address, 0xD0)) )
```

哀しいことに私のところでの実行結果は


```
chip ID:  0x58
```

だった。
 

## 初期化の処理

初期化で実行するのは

- 測定サイクルとオーバーサンプリングの設定
- configuration parameter の読み込みです

### 測定サイクルとOversampling の設定

- ODR (output data rate)は測定時間と待機時間から計算できる。例えば
normal mode なら　1000[ms] / ( 11.5 + 62.5) [ms] = 13.51 [Hz]

### その他の特性値

- IIR filter の時定数、消費電流は ODRから計算できる。


### config パラメータの読み込み

0x88から0xE7まで読みます。ここら辺はたくさんの実装例が転がっているので省略。
### ソースコード

python でこんなのもあった。

https://pypi.org/project/RPi.bme280/


# まとめ

BME280 (Bosch)だと思ってhumidityを読もうとしたが、実はBMP280で読めなかった。確認するにはレジスタ値で chip ID を確認すればよい。

(2021/07/25)
AWS認定 ソリューションアーキテクト プロフェッショナル 合格記録

オリンピックで盛り上がって？ますが、東京オリンピック開催日に[ソリューションアーキテクト プロフェッショナル](https://aws.amazon.com/jp/certification/certified-solutions-architect-professional/)（SAP）を受験し、合格しました :tada::tada::tada:

# 試験を受けるまで

友人と一緒に取ろうとして半年以上前から言っていましたが、なかなか身が入らず先延ばしにしていました。

こうなったらもう先に試験を予約してしまおうということで、半ばノリで試験を予約しました。自分は締め切りが決まると火がつくタイプなんだなとつくづく思います。。

# 事前知識

現職だとあまりAWSを触る機会がなく、副業などで少し触る程度でした。

全くのゼロ知識ではないですが、[ソリューションアーキテクト アソシエイトに合格（過去記事）](https://qiita.com/marchin_1989/items/32199930a219778337bb)したときの知識とほぼ変わらない状態でした。

# 学習方法

まず、アソシエイトに合格して1年半ほど経っていたので、まずは[徹底攻略 AWS認定 ソリューションアーキテクト − アソシエイト教科書](https://www.amazon.co.jp/dp/4295010650/ref=cm_sw_em_r_mt_dp_ZD64888HPMKHRTTNKSF8?_encoding=UTF8&psc=1)の本を使って、アソシエイトの復習をしました。

そして下地をつけたところで、主に以下の本と、ブラックベルトを中心に学習しました。

- [AWS認定ソリューションアーキテクト-プロフェッショナル ~試験特性から導き出した演習問題と詳細解説](https://www.amazon.co.jp/dp/4865942483/ref=cm_sw_em_r_mt_dp_361T7651MAMP0PKA18G3)
- [要点整理から攻略する『AWS認定 データベース-専門知識』 ](https://www.amazon.co.jp/gp/product/4839975078/ref=ppx_yo_dt_b_asin_title_o02_s00?ie=UTF8&psc=1)

1つ目の対策本ですが、出版されているSAPの対策本としては、もはやこれしかないという本です。出題される問題でどういう視点で学習すべきかや、SAPを意識したケース問題、解説がついています。模擬試験もついており、それも含め3周しました。
この本を主軸に、理解できなかった場所や、理解が不十分だと思った場所を、ブラックベルトや公式のヘルプなどで学習を進めました。

2つ目の本は、[AWS 認定 データベース – 専門知識](https://aws.amazon.com/jp/certification/certified-database-specialty/)の試験の対策本で、直接SAPの本ではないですが、AWSのDBマネージドサービスごとにその特徴や注意点が説明されており、SAPにも十分対策になると思い購入しました。
書き方が統一されていて、それぞれのサービスを比較して学習できるため、自分は頭に残りやすかったと思います。
また、オンプレからAWSへのDB移行方法などもうまくまとまっており、大変わかりやすかったです。

ちゃんと測ってないですが、試験まで3,4週間ほどということもあり、1日平均5時間ほど勉強をしていたので、トータル80時間~100時間ほどだと思います。

昼休憩もブラックベルトの動画や資料を見ながら取っていたので、大学受験生のような勉強をしてました。

# いざ受験

7月の頭に、オンライン受験を予約して受けようとしていたのですが、当日トラブルが発生し、受験がキャンセルされました。。

オンライン受験では、専用のソフトウェアを入れて、試験担当から監視されつつ自宅で受験ができるのですが、受験当日こちらのカメラがなぜか試験担当に見えなかったようで、キャンセルになりました。（お金は戻ってきました）

またトラブルが起きるのが嫌だったので、3週間後にテストセンターで受験するようにしました。

## 受験時の問題の解き方

試験が180分に対して、75問で、見直しの時間を30分ほど残したかったので、1問2分（1時間に30問）のペースで解いていきました。

しかし、問題が思っていたよりも難しく、予定よりオーバーしてしまい、見直しが20分ほどでした。

ただ、最後の方は、頭が疲弊しており、見直しもそこまで意味がなかったかもしれません。。

# 結果

受験者スコア: 864 でした。
試験結果は、100 から 1000 の間の値で、合格に必要な最低スコアは 750 なので、良くも悪くもない感じですかね。

# 振り返って

学習方法や、試験の受け方について、今回の合格結果をみつつ振り返ってみます。

## 試験の仕切り直しについて

最初の受験日に合わせてラストスパートを切っていたので、一度モチベーションが下がってしまいました。

3週間後に試験を設定しましたが、直前の1週間ほど再度対策本を読むぐらいになってしまいました。ただ、自分の感触的には、当初の試験で受けていてもあまり知識量と増えている感覚はなかったので、どのみち結果は変わらなかったかなと思います。

友達は先に合格していたので、変なプレッシャーはありましたが、合格できてよかったです。

## 本試験の感触

手応えとしては、まったくありませんでした。。最初は落ちたかもとか思ってましたが、合格画面が出たときは安堵しました。

かなり難しい試験とは聞いていましたが、本当になかなかに難しかったです。

## 学習方法について

SAPの対策本のおかげで合格できたと思います。しかし、この本だけで行けたかというと、正直これだけで合格できる！とは言えないなと思いました。実際に学習したことがないサービスも出てきたりして、やはり網羅的に学習しておかないと怖いと思います。

SAP対策本の模擬試験を解くときに、本番を想定して練習していたので、時間感覚は持って望んだのはよかったかなと思います。3時間と長丁場なので、慣れてないと結構しんどいと思います。

また、すでにSAPを持っている友人に、わからないことを聞けたり、一緒に受ける友人と毎日朝会をして、わからないことを一緒に調べたりできたのはとてもよかったと思います。
自分だけだと偏った知識が着いたり、間違った理解をしていたかもしれません。

## 実務に使えるか

いきなり「AWSでのシステム構築なんでもできます」とはならないとは思いますが、十分活かせそうだなと思います。

試験対策の学習の中で、ベストプラクティスに基づいたクラウドらしい設計についての知識が大いに着いたと思うし、ケース問題も実務に直面したときに考える上での参考になると思います。

# まとめ

試験を通してAWSの設計やサービスにもより詳しくなれたし、SAPに合格できたことは、とても自信になったので、受けてよかったなと思います。
Apache httpdのConfigメモ

## 概要
Apache httpdのセキュリティ面で考慮すべきコンフィグ一覧
最低限これぐらいは設定しておいた方が良い。

## Security

### ServerTokens
HTTPリプライヘッダに最小限の情報のみ表示させる。

```
ServerTokens Prod
```

### Header
クリックジャッキング対策

```
Header always append X-Frame-Options SAMEORIGN
```

### Trace Enable
XST対策

```
TraceEnable Off
```

### CoreDumpDirectory
障害発生時のCore取得の為

```
CoreDumpDirectory /var/log/core
```

### Directory
OS「/」アクセスはデフォルト禁止

```
<Directory />
  Options None
  AllowOverride None
  Require all denied
</Directory>
```

### LimitExpect
「GET]「POST」「HEAD」以外のメソッドの禁止

```
<Directory />
  Options None
  AllowOverride None
  <LimitExpect GET POST HEAD>
    Require all denied
  </LimitExpect>
</Directory>
```

### ErrorLog
エラーログファイルの指定

```
ErrorLog /var/log/httpd/error.log
```

### LogLevel
ログレベルの指定

```
LogLevel notice core:info
```

### LogFormat
ログフォーマット定義

```
<IfModule log_config_module>
  LogFormat "%h %t \"%r\" %>s %b %D \"%{Host}i\" \"%{User_Agent}i\" %{pid}P %{tid}P %{SSL_PROTOCOL}x %{SSL_CIPHER}x %{SSL_CIPHER_USEKEYSIZE}x" fmt_accesslog
  SetEnvIf User-Agent "ELB-HealthChecker.*" fmt_healthchecklog
  Customlog /var/log/httpd/httpd_access.log fmt_accesslog env=!fmt_healthchecklog
  Customlog /var/log/httpd/httpd_healthchk.log fmt_accesslog env=fmt_healthchecklog
</IfModule>
```

### ServerSignature Off
バージョン情報の隠蔽

```
ServerSignature Off
```

### SSLHonorCipherOrder
HTTPS接続時の暗号アルゴリズムを、サーバ設定優先にします。
これにより、ダウングレード攻撃等を防御。

```
SSLHonorCipherOrder on
```

### SSLInsecureRenegotiation
```
SSLInsecureRenegotiation Off
```

### SSLCompression
CRIMEやBEASTといった「サイドチャネル攻撃」対策

```
SSLCompression Off
```

### SSLProtocol
危殆化した古いプロトコルを有効にしている場合、古いプロトコルを標的としたダウングレード攻撃等を受ける可能性がある為、新しいプロトコルのみを有効

```
SSLProtocol all -SSLv2 -SSLv3 -TLSv1 -TLSv1.1
```

### SSLCipherSuite
上記とあわせて、暗号アルゴリズムを強度の高いもののみに絞り込む必要があります。
以下の例は最新ブラウザをベースに安全な強度を保つための例

```
SSLCipherSuite HIGH:!RC4+RSA:!EXP:!eNULL:!aNULL:!SRP:!PSK:!MD5:!3DES
```

### RewriteCond
「GET]「POST」「HEAD」以外のメソッドの禁止

```
RewriteCond %{REQUEST_METHOD} !^(POST|GET|HEAD)$
```

### RemoteIPHeader
送信元制御
```
RemoteIPHeader X-Forwarded-For
RemoteIPInternalProxy 10.0.0.0/8
<Location />
  <RequireAll>
    Require all granted
    Require no ip 1.2.3.4/32
  </RequireAll>
</Locatiion>
```
OpenFOAM 9 チュートリアルケースの動作確認 : 多相流体、interFoam、ダムブレイク（層流）

# ケース
$FOAM_TUTORIALS/multiphase/interFoam/laminar/damBreak/damBreak

# 概要
このチュートリアルケースでは、interFoam を用いて、単純化したダムブレイク（水柱の崩壊）の2次元問題を解きます。解析領域の天井は開放されているものとし、壁面はすべり無し（noSlip）条件とします。

# 解析モデル
解析モデルを下図に示します。
![damBreakModel.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1784513/0e7689b3-1a6c-6723-544c-905a39bb6d64.png)

# 解析条件
解析条件を下表に示します。

|項目1|項目2|項目3|単位|設定内容|
|---|---|---|:-:|:-:|
|_system_|_controlDict_|開始時刻|sec|0|
|   |   |終了時刻|sec|1|
|   |   |$\Delta$ _t_|sec|自動調整|
|   |   |最大$\Delta$ _t_|sec|1|
|   |   |最大_Co_|-|1|
|_constant_|_transportProperties_|水の動粘性係数 $\nu$|m2/s|1e-06|
|   |   |水の密度 $\rho$|kg/m3|1000|
|   |   |空気の動粘性係数 $\nu$|m2/s|1.48e-05|
|   |   |空気の密度 $\rho$|kg/m3|1|
|   |   |表面張力 $\sigma$|N/m|0.07|
|   |_g_|重力加速度ベクトル|m/s2|(0 -9.81 0)|
|   |_momentumTransport_|シミュレーション型|-|層流|

# 解析結果
解析結果を以下に示します。
![animation.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1784513/2c34522d-9d0f-a9b2-7367-160c73469f93.png)

# 実行コマンド
前処理 (Pre-processing)
`run`
`cp -r $FOAM_TUTORIALS/multiphase/interFoam/laminar/damBreak/damBreak .`
`cd damBreak`
メッシュ作成
`blockMesh`
alpha.water 場の設定
`setFields`
アプリケーションの実行
`interFoam`
後処理 (Post-processing)
`paraFoam`

# 計算時間
4.2 (sec), シングル, AMD Ryzen 7 3750H with Radeon Vega Mobile Gfx

# 参照
- [OpenFOAM v9 User Guide: 2.3 Breaking of a dam](https://cfd.direct/openfoam/user-guide/v9-damBreak/)
- [XSim](https://www.xsim.info/articles/OpenFOAM/tutorials/multiphase-interFoam-laminar-damBreak.html)
Kotlin Multiplatformのカスタムソースセットで外部ライブラリの依存関係が解決できない問題の対処法

備忘録です。
とりあえず解決策のみ載せていますが、詳細が判明し次第追記していきます。

## 解決策

gradle.propertiesに`kotlin.mpp.enableGranularSourceSetsMetadata=true`を追加する。

``` gradle.properties
kotlin.mpp.enableGranularSourceSetsMetadata=true
```

ヒエラルキーが何ちゃららしいです。

## 参考

https://kotlinlang.org/docs/mpp-share-on-platforms.html#share-code-on-similar-platforms
rails db:migrate時のエラー「Cannot add a NOT NULL column」について

#初めに

某ガイドの学習中にエラーが発生したため、その解決方法を記事にします。
初めての投稿ですので、至らぬ点などあればご指摘いただけますと幸いです。


#エラーが発生した状況
- UserテーブルとTaskテーブルがあります。
- User : Taskの間で1 : 多の関係となるように、マイグレーションファイルを作成し、マイグレーションを行ったタイミングで下記エラーが発生しました。

#発生したエラー

```Ruby:terminal
rails aborted!
StandardError: An error has occurred, this and all later migrations canceled:

SQLite3::SQLException: Cannot add a NOT NULL column with default value NULL: ALTER TABLE "tasks" ADD "user_id" integer NOT NULL

```

エラー内容を見てみると「Cannot add a NOT NULL column with default value」と記載があるとおり、columnにNOT NULLを与えることができないとなっています。

エラーが発生した際のマイグレーションファイルは以下のとおりです。

```Ruby:xxxxxxxxxxxxxx_AddUserIdTasks.rb
class AddUserIdToTasks < ActiveRecord::Migration[5.2]
  def up
    execute "DELETE FROM tasks;"
    add_reference :tasks, :user, null: false, index: true
  end
end
```
execute "DELETE FROM tasks;"はSQLによって、ここまでに作成したタスクを削除しています。
add_reference :tasks, :user, null: false, index: trueでは、tasksにuserと関連付けたuser_idカラムを追加し、制約としてnull: false, index: trueオプションをつけようとしています。
このadd_reference行についてエラーが発生しました。

#解決した方法
先にも記載したとおり「Cannot add a NOT NULL column with default value」ということでしたので、null: falseを削除したら無事マイグレーションできました。

```Ruby:xxxxxxxxxxxxxx_AddUserIdTasks.rb
class AddUserIdToTasks < ActiveRecord::Migration[5.2]
  def up
    execute "DELETE FROM tasks;"
    add_reference :tasks, :user, index: true
  end
end
```

原因について詳しく特定できていませんが、某ガイドの指定しているデータベースとは別のデータベースを用いているのが理由なのかなと考えています。試していないので断言はできませんが。。。

なお、下記を行うことでNOT NULL制約を与えることができました。

```Ruby:xxxxxxxxxxxxxx_ChangeUserIdToTasks
class ChangeUserIdToTasks < ActiveRecord::Migration[5.2]
  def change
    change_column :tasks, :user_id, :integer, null: false
  end
end
```


#参考にさせて頂いた記事
- [Qiita][マイグレショーンファイルを作成する際のnull: false](https://qiita.com/tanakin_prog/items/8eb23ef59e87bbf1c256)
bundle installで初期化できない

# 要約
- Macbookから一度削除したプロジェクトをもう一度クローンした
- Macbookは、削除からクローンの間に、クリーンインストールしてTimeMachineBackupから復元している。
- xcodeがインストールされていないことに起因するエラーであった。

# プロジェクトクローン時に引っかかった
`% bundle install`をするもエラーが大量発生

```
An error occurred while installing nio4r (2.5.7), and Bundler cannot continue.
Make sure that `gem install nio4r -v '2.5.7' --source 'https://rubygems.org/'` succeeds before bundling.

In Gemfile:
  rails was resolved to 6.1.3.2, which depends on
    actioncable was resolved to 6.1.3.2, which depends on
      nio4r


Gem::Ext::BuildError: ERROR: Failed to build gem native extension.

    current directory: /Users/n-syuichi/IdeaProjects/ReservationSample/vendor/bundle/ruby/2.7.0/gems/bcrypt-3.1.16/ext/mri
/Users/n-syuichi/.rbenv/versions/2.7.2/bin/ruby -I /Users/n-syuichi/.rbenv/versions/2.7.2/lib/ruby/2.7.0 -r ./siteconf20210725-26400-18rx3v2.rb extconf.rb
creating Makefile

current directory: /Users/n-syuichi/IdeaProjects/ReservationSample/vendor/bundle/ruby/2.7.0/gems/bcrypt-3.1.16/ext/mri
make "DESTDIR=" clean
xcrun: error: invalid active developer path (/Library/Developer/CommandLineTools), missing xcrun at: /Library/Developer/CommandLineTools/usr/bin/xcrun

current directory: /Users/n-syuichi/IdeaProjects/ReservationSample/vendor/bundle/ruby/2.7.0/gems/bcrypt-3.1.16/ext/mri
make "DESTDIR="
xcrun: error: invalid active developer path (/Library/Developer/CommandLineTools), missing xcrun at: /Library/Developer/CommandLineTools/usr/bin/xcrun

make failed, exit code 1

Gem files will remain installed in /Users/n-syuichi/IdeaProjects/ReservationSample/vendor/bundle/ruby/2.7.0/gems/bcrypt-3.1.16 for inspection.
Results logged to /Users/n-syuichi/IdeaProjects/ReservationSample/vendor/bundle/ruby/2.7.0/extensions/x86_64-darwin-20/2.7.0/bcrypt-3.1.16/gem_make.out

An error occurred while installing bcrypt (3.1.16), and Bundler cannot continue.
Make sure that `gem install bcrypt -v '3.1.16' --source 'https://rubygems.org/'` succeeds before bundling.

In Gemfile:
  devise-i18n was resolved to 1.10.0, which depends on
    devise was resolved to 4.8.0, which depends on
      bcrypt


```
# 解決策(結論)
`% xcode-select --install` を実行し、Xcode Commandlinetoolをインストール

# 原因

MacBookのSSD換装を行い、OS新規インストール後TimeMachineから復元したため、Xcode等がインストールされていなかった。

# チェックしたこと
 - bundlerのパス(vendor/bundleにインストールされているか)
 - rubyのバージョン(rbenv等)
 - エラーメッセージのコマンド実行(Gemコマンドからのインストール)ができるかどうか
 - bundlerがインストールされているかどうか

# 参照先
https://qiita.com/royroy/items/338362362de73a94fc0c