OmniAICreator/Qiita-1.07M huggingface dataset:
PostgreSQL: truncate tableするときにシーケンスをリセットするにはrestart identityをつける

PostgreSQLで`truncate table`でテーブルを空っぽにする際、同時にIDなどのシーケンスをリセットして`0`に戻すには、クエリに`restart identity`を付け加えます。

```sql
truncate table product restart identity;
```

## 実行例

```sql
-- テーブルを作る
create table product (id serial, name varchar);

-- シーケンスを2つ消費する
insert into product (name) values ('item1'), ('item2');

-- テーブルの内容
select * from product;
--  id | name
-- ----+-------
--   1 | item1
--   2 | item2
-- (2 rows)

-- テーブルを空っぽにしつつ、シーケンスをリセットする
truncate table product restart identity;

-- シーケンスを2つ消費する
insert into product (name) values ('item1'), ('item2');

-- テーブルを確認すると1から発番されなおされている
select * from product;
--  id | name
-- ----+-------
--   1 | item1
--   2 | item2
-- (2 rows)
```
Ubuntu 20.10 から Docker 内の MySQL 5.7 に接続

Ubuntu 20.10 に MySQL 5.7 をインストールしようとすると、次のようなメッセージが出ます。

```bash
sudo dpkg -i mysql-apt-config_0.8.12-1_all.deb
```

![mysql_aa.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/179446/b181c0e8-d4b3-2e28-95a5-f96d23b4f5c2.png)

そこで、Docker を使います。

Docker のインストール

```bash
sudo apt update
sudo apt install docker-ce docker-ce-cli containerd.io
```

動作の確認

```bash
sudo docker run hello-world
```

```text
$ docker run hello-world

Hello from Docker!
This message shows that your installation appears to be working correctly.

To generate this message, Docker took the following steps:
 1. The Docker client contacted the Docker daemon.
 2. The Docker daemon pulled the "hello-world" image from the Docker Hub.
    (amd64)
 3. The Docker daemon created a new container from that image which runs the
    executable that produces the output you are currently reading.
 4. The Docker daemon streamed that output to the Docker client, which sent it
    to your terminal.

To try something more ambitious, you can run an Ubuntu container with:
 $ docker run -it ubuntu bash

Share images, automate workflows, and more with a free Docker ID:
 https://hub.docker.com/

For more examples and ideas, visit:
 https://docs.docker.com/get-started/
```


MySQL5.7 のイメージのダウンロード

```bash
sudo docker pull mysql/mysql-server:5.7
```

イメージの確認

```bash
sudo docker images
```

イメージの起動
root のパスワードを mysql とします。

```bash
sudo docker run --name my2021 -p 3306:3306 -e MYSQL_ROOT_PASSWORD=mysql -d mysql/mysql-server:5.7
```

MySQL5.7 に接続

```bash
sudo docker exec -it my2021 mysql -uroot -pmysql
```

接続したら、root のパスワードを変更

```sql
ALTER USER 'root'@'localhost' IDENTIFIED BY 'tiger123';
```

mysql で接続しようとして、エラーを出します。

```text
$ mysql -uscott -psecret -h 127.0.0.1
mysql: [Warning] Using a password on the command line interface can be insecure.
ERROR 1045 (28000): Access denied for user 'scott'@'172.17.0.1' (using password: YES)
```

>172.17.0.1 から接続しようとしたことが分かります。

Docker で、MySQL に接続して ユーザーを作成します。
テスト用のデータベースも作成します。

```sql
create user scott@172.17.0.1 identified by 'secret';
create database city;
grant all on city.* to scott@172.17.0.1;
```

mysql コマンドで接続します。

```bash
mysql -uscott -psecret -h 127.0.0.1
```

結果

```text
$ mysql -uscott -psecret -h 127.0.0.1
Welcome to the MariaDB monitor.  Commands end with ; or \g.
Your MySQL connection id is 16
Server version: 5.7.41 MySQL Community Server (GPL)

Copyright (c) 2000, 2018, Oracle, MariaDB Corporation Ab and others.

Type 'help;' or '\h' for help. Type '\c' to clear the current input statement.

MySQL [(none)]>
```
PostgreSQL: シーケンスの次の値を発番するにはnextvalを使う

PostgreSQLでシーケンスIDの次の値を発番するクエリです。

```sql
select nextval('project_id_seq') as "projectId";
```

## 解説

シーケンス名を引数に`nextval()`関数を実行すると次のシーケンス値を取得できます。

取得されるシーケンス値の型は`bigint`です。PostgreSQLのクライアントサイドのプログラミング言語やライブラリによっては`bigint`をそのプログラミング言語の`string`型にマッピングすることがあります。その場合は、`cast(nextval('...') as int)`のようにSQLで型変換を行うことで数値型にマッピングできるかもしれません。

`as "projectId"`の部分は必要ないですが、このエイリアスを指定しない場合、カラム名が`nextval`になります。

## 実行例

```sql
-- テーブルを作る
create table project (id serial not null);

-- IDを発番する
select nextval('project_id_seq') as "projectId";
```

実行結果

```
 projectId
-----------
         1
(1 row)
```
Amazon Kinesis とは

## 勉強前イメージ

ストリーム処理って感じ
でもなんか種類いっぱいあるみたい

## 調査

### Amazon Kinesis とは

ストリーミングデータをリアルタイムで収集、処理が出来る
フルマネージド型の分析サービスです。
また、スケーラブルでストリーミングデータのサイズに上限はありません。

### メリット

- リアルタイム

ストリーミングデータをリアルタイムで取得、バッファ、処理を行います。

- 完全マネージド型

データをストリーミングするために必要なインフラやストレージは準備する必要はありません

- スケーラブル

ストリーミングデータに合わせてスケーラブルを行います

### Amazon Kinesis の機能・サービス

#### Kinesis Data Streams

リアルタイムなデータストリーミングサービスです。
収集データはミリ秒単位で処理することができます。
リアルタイム分析もダッシュボード上で管理でき、異常検知も行います。
登録されたデータは複数のアプリケーションから参照することが出来ます。

#### Kinesis Data Firehose

登録できるデータとしては、Kinesis Data Streams と同様。
ストリーミングデータを変換して、他のアプリケーションへ自動的にエクスポートを行います。

#### Kinesis Data Analytics

ストリーミングデータをの処理や集計を行います。
SQLやJavaを使用することが出来ます。

## 勉強前イメージ

こんなイメージかな？
とりあえずリアルタイムで処理を行えることはわかった。

Data Streams ・・・ リアルタイムのデータの処理
Data Firehose ･･･ 変換してデータ保存？
Data Analytics ・・・ 一定期間集計して処理？

## 参考

- [Amazon Kinesis](https://aws.amazon.com/jp/kinesis/)
- [AWS再入門 Amazon Kinesis編](https://dev.classmethod.jp/articles/cm-advent-calendar-2015-aws-re-entering-kinesis/)
- [Amazon Kinesisの主な機能と使い方 − 強力なストリーミングデータ処理](https://business.ntt-east.co.jp/content/cloudsolution/column-20.html)
そろそろSourcetreeから卒業したい1年目

# 概要
入社して約1年、git操作にはSourcetreeを使っていましたが、そろそろ卒業したいと考えていました。
これまで業務で使うことのあったgit操作に対応するコマンドをまとめてみました。
いろいろと調べた結果、筆者的CLIでgit操作できるメリットは下記4点です。

- 慣れるとGUIより操作が速くなるらしい
- 特定のGUIの操作方法を覚える必要がない
- 最新verのgit機能を使うことができる
- **とりあえずかっこいいい**

## 環境
- git version 2.27.0.windows.1
- Rev. P4Merge/NTX64/2021.1/2085655


# コマンド
下記以外にも重要なコマンドはいくつもあるかと思いますが、今回は筆者がこれまで業務で使うことがあった範囲に限って書いていきます。(rebaseとか使わなかった。）



## コミット
```
git commit -m "コミットメッセージ"
```
## プッシュ
```
git push origin ブランチ名
```
## プル
```
git pull origin ブランチ名
```
## ステータスの確認
```
git status
```
## クローン
```
git clone <url>
```

## ブランチ

### ブランチの確認
```sh
git branch 
 ```
### リモートも含めた確認
```sh
git branch -a
```
### ローカルのブランチ削除
```
git branch -d ブランチ名
```
### リモートのブランチ削除
```
git push --delete origin ブランチ名
or
git push origin :ブランチ名
```
### ブランチ作成と同時にチェックアウト
```
git checkout -b ブランチ名
```
### ブランチ名の変更
```
git branch -m 旧ブランチ名 新ブランチ名
```

## ステ―ジング
### ファイル指定のステージング
```
git add ファイル名
```
### カレントディレクトリ内のステージング
```
git add .
```
### ステージングエリアの内容をアンステージする
```
git reset HEAD ファイル名
```
### ステージされていない変更を破棄する
```
git chekout --ファイル名
```
### アンステージする
```
git reset HEAD ファイル名
```

## ログ
### ログの表示
```
git log 
```
### 一行でログを表示
```
git log --oneline
```
### コミットグラフを表示
```
git log --graph
```
### 全ブランチのログを表示
```
git log --all
```
## マージ,フェッチ
### 現在のブランチに指定したブランチをマージする
```
git merge ブランチ名
```
### フェッチする
```
git fetch origin ブランチ名
```

## 差分
### ディレクトリとステージングエリアの差分表示
```
git diff 
```
### ディレクトリとローカルリポジトリの差分表示
```
git diff HEAD
```

## スタッシュ
### スタッシュする
```
git stash
```
### スタッシュした変更を戻す
```
git stash apply stash@{n}
```
### スタッシュの削除
```
git stash drop stash@{n}
```
### 変更を戻すと同時に削除する
```
git stash pop stash@{n}
```
### スタッシュの一覧表示
```
git stash list
```
### 追跡していないファイルも含めてスタッシュする
```
git stash -u
```
## サブモジュール
```
git colone --recurse-submodle <url>
```

## CLI操作はかっこいいが...
CLI操作にはメリットはありますが，やはり差分はGUIのほうが見やすかったりします。
下記コマンドで，gitのdifftoolを設定することができます。
今回はこちらの[p4merge](https://www.perforce.com/downloads/visual-merge-tool)をdifftoolとして設定しました。

```
git config --global diff.tool p4merge
git config --global difftool.p4merge.path <p4merge.exeのパス>
git config --global difftool.prompt false
```

上記であげたdiffに関するコマンドの「diff」を「difftool」に置き換えて，コマンドを打つとp4mergeが起動して，差分が見られるようになります。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/817032/c1281eb3-24cf-7b06-b365-af5f648a10c0.png)
TypeScriptでdomでエラーが出るときの対処法【`lib` コンパイラ オプションが 'dom' を含むように変更してみてください。】


TypeScriptにて、下記のようなdomのエラーが出た時の対処法になります。

```
名前 'document' が見つかりません。ターゲット ライブラリを変更しますか? 
`lib` コンパイラ オプションが 'dom' を含むように変更してみてください。
```

## tsconfig.jsonのオプションを追加することで解決
エラー文通りに、tsconfig.jsonにオプションを追加します。

```tsconfig.json
{
  "compilerOptions": {
    "lib": ["dom"],
  }
}
```

上記のオプションを追加することで、TypeScriptでdomを指定することができるようになります。
初めてのRaspberry Pi Pico ㉖　標準出力用ターミナルを起動するシェル

　C言語で開発するとき、標準出力のターミナルを使います。ダブルクリックで起動できるシェルを作ります。開発環境はラズパイ4です。

###シェルの内容
　テキストファイルを新規に作り、

```shell
#! /bin/bash
minicom -b 115200 -o -D /dev/serial0
```

をたとえば、term.shのファイル名で保存します。

###実行権を付ける
　File Managerでterm.shを右クリックし、一番下のPropertiesを選択します。
　PermissionsのタブのExcuteを下記のように変更します。
<img width="330" alt="ファイル名" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/407635/6169f43e-f6f6-c95b-09c3-df1d9cac4aad.png">

　これをデスクトップにコピーします。

###ダブルクリックをすると
　ダブルクリックすると小さなパネルが出るので、ターミナルで実行を選択すると、ターミナルで通信ソフトminicomが動き出します。

<img width="530" alt="ファイル名" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/407635/b6a3bce6-cf32-a3c8-62d5-3324c8ee714b.png">
Pandasの文字列のSplitとJoinが変だった件



# Split (pd.Series.str.split)
https://pandas.pydata.org/pandas-docs/stable/reference/api/pandas.Series.str.split.html

Pythonのstr.splitと同様に指定の文字列で文字列を分割できます。

```python
df = pd.DataFrame({"name" : ["a", "b", "c"], 
                   "code": ["123.456.789", "234.567.890", "345.678.901"]})
df
```
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/181998/22153ec3-06a2-c1a4-57c0-4c1ba1ec19b4.png)

```py
df["code_split"] = df["code"].str.split(".")
df
```
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/181998/c1f71a01-4a70-de87-1c73-ffc30b55918b.png)


また、引数の"expand"をTrueに設定すると複数カラムに分割の結果を割り当てることができます。

```py
df[["code_1", "code_2", "code_3"]] = df["code"].str.split(".", expand=True)
df
```

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/181998/200c8ab6-d2ec-0f5a-0af8-f7d9ff08869f.png)


## 困ったこと
Splitした結果に加工を加えてもう一度１つの文字列にするときに何を使えばいいのか迷いました。
なぜかというと、Splitした結果が配列のように見えており、
pandasの配列の値の入ったカラムの扱い方などは知らなかったからです。

# Join (pd.Series.str.join)
str.joinで当然のようにJoinできました。
PythonのString.joinと比べて、セパレータと配列は逆の位置になっています。

```py
df["code_joined"] = df["code_split"].str.join(".")
df
```

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/181998/d6a618fa-0d15-6b8f-312e-53a1c5e19139.png)

また、splitの結果の配列の各要素もstrから取得できました。

```py
df["code_split"].str[0]
```
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/181998/a297f312-4665-819f-3e37-018bfa33940d.png)


データ型がObjectであれば配列でも".str"からアクセスできるんですね。


---
勝手に掲げていた毎週更新が滞ったので4週目で滞ったので昨日5分ほど詰まったところの共有です。。。

この辺は公式ドキュメントにも記載されていました。
https://pandas.pydata.org/pandas-docs/stable/user_guide/text.html#text-string-methods

10 minutes to pandasをやってすぐ実務に移ってしまっていたので
この辺を勉強した方がいいのかもしれません…
権限があるのに、カスタムオブジェクトが消せない

https://trailblazers.salesforce.com/answers?id=9064S000000De4f

最終的にはサポートで解決したようです。

Set up > Translation Language Setting > Enable it
[設定]> [翻訳言語の設定]> [有効にする]有効にした後、このカスタムオブジェクトを削除できます。


何故かはわかりませんが、きっと次に直面しても思い出せないので記録しておきます。
CVE-2021-3129: Laravel 8.4.2以前で任意コードが実行される脆弱性をLaravel 6 (LTS)で修正

- 2021-03-03: Packagistにfacade/ignition 1.16.15 が登録されました。
- 2021-03-03: facade/ignition 1.16.15 is now available on Packagist.

Laravel 8.4.2以前で任意コードが実行される脆弱性をLaravel 6 (LTS)で修正するには、facade/ignitionを1.16.15以降に更新すれば良いが、~~現時点でPackagistに登録されていないので、以下で更新する。~~

For Laravel 6 (LTS), to fix vulnerability of arbitrary code execution in Laravel 8.4.2 and before, you can update facade/ignition to 1.16.15 as below ~~since it's not tagged on Packagist yet.~~

```
$ # OBSOLETE: composer require facade/ignition 1.x-dev --dev
$ composer require facade/ignition ^1.6.15 --dev
```

CVE-2021-3129
https://nvd.nist.gov/vuln/detail/CVE-2021-3129
【Sails】Hello Worldを出力する

#プログラミング勉強日記
2021年2月24日
[前の記事](https://qiita.com/mzmz__02/items/03c4bb839a5e5abe02a8)でNode.jsの3大フレームワークについて取り上げた。今日は、SailsでHello Worldを表示する方法をまとめる。

#Meteorを導入する方法
　<b>Node.jsの開発環境が構築されていることを条件とする。</b>Node.jsの環境構築がまだの人は[こちらの記事(Windows版)](https://qiita.com/mzmz__02/items/6cc53f06205fd11367bc)を参考に環境構築してみてください。

　npmを使ってExpressをインストールするだけで、Sailsを導入することができる。

```
$ npm install sails -g
```

#Hello Worldを出力する
　Sailsでプロジェクトを作成するためにnewコマンドを使う。作成したいディレクトリの箇所で下記を実行すると、プロジェクト名のディレクトリが作成される。

```:プロジェクトの作成
$ sails new プロジェクト名
```
　newコマンドを実行すると、`Web App`と`Empty`のどちらのテンプレートをベースにするか聞かれる。(今回はEmptyを指定した。)
　その後、アプリが作成されると@views/pages/homepage.ejs`を編集してHello Worldを出力するするようにした。

```:サーバーを起動する
$ sails lift
```

　デフォルトでは`http://localhost:1337`にアクセスすると表示される。
　

実行結果
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/642821/e1819daf-d1f4-3e5b-15c4-e627a55bec03.png)
【Meteor】Hello Worldを出力する

#プログラミング勉強日記
2021年2月23日
[前の記事](https://qiita.com/mzmz__02/items/03c4bb839a5e5abe02a8)でNode.jsの3大フレームワークについて取り上げた。今日は、MeteorでHello Worldを表示する方法をまとめる。

#Meteorを導入する方法
　<b>Node.jsの開発環境が構築されていることを条件とする。</b>Node.jsの環境構築がまだの人は[こちらの記事(Windows版)](https://qiita.com/mzmz__02/items/6cc53f06205fd11367bc)を参考に環境構築してみてください。
　Windowsの場合、Chocolateyを[公式サイト](https://chocolatey.org/)からインストールする。

```:管理者のPowerShell
$ Set-ExecutionPolicy Bypass -Scope Process -Force; [System.Net.ServicePointManager]::SecurityProtocol = [System.Net.ServicePointManager]::SecurityProtocol -bor 3072; iex ((New-Object System.Net.WebClient).DownloadString('https://chocolatey.org/install.ps1'))
```

```:管理者のPowerShell
$ choco install meteor
```

#Hello Worldを出力する
　Meteorでプロジェクトを作成するためにcreateコマンドを使う。作成したいディレクトリの箇所で下記を実行すると、プロジェクト名のディレクトリが作成される。

```
$ meteor create プロジェクト名
```

　作成されたディレクトリの中に入ってるHTML,CSS,JSファイルは`client`フォルダ内に配置されている。今回は、その中にある`main.html`を書きかえてHello Worldを表示する。

```html:client/main.html
<head>
  <title>sample</title>
</head>

<body>
  <h1>Hello World</h1>
  <div id="react-target"></div>
</body>

```

　プロジェクト名の階層に戻ってmeteorコマンドを実行すると自動的にサーバーが立ち上がる。デフォルトでは`http://localhost:3000`にアクセスするとページが表示される。

```
$ meteor
```

実行結果
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/642821/6eef2a57-d4fc-382b-515b-144922414299.png)
STM32F767のMbedでのHT16K33でナイトライダー


1.SCLとSDAを接続、プルアップも忘れずに
2.電源の接続
3.下記のソースコードを書き込む
4.コンパイル実行で表示されたら終了
5.おわり

```c++

#include "mbed.h"
#include <stdio.h>
 
//Serial pc(USBTX, USBRX); // tx, rx
//Serial pc(SERIAL_TX, SERIAL_RX);

#define ADDR        (0x70<<1)  //  address
#define ADDR_LCD    (0x7C)  //  address

I2C i2c(I2C_SDA, I2C_SCL); //767
//I2C i2c(dp5, dp27); //1114
//I2C i2c(PA_10, PA_9); //010

char data_read[8];  //i2cバッファー
int ii;             //ループカウンター


int main() {
    
///*INIT start *********  

    
    data_read[0]=0x21;
    i2c.write(ADDR, data_read, 1);wait_ms(1);

    data_read[0]=0x81;
    i2c.write(ADDR, data_read, 1);wait_ms(1);

    data_read[0]=0xef;
    i2c.write(ADDR, data_read, 1);wait_ms(1);

    for(ii=0;ii<16;ii++){
        data_read[0]=ii;
        data_read[1]=0x00;
        i2c.write(ADDR, data_read, 2);wait_ms(1);
    }//for

    
    wait_ms(2000);
    
//*/  //INIT end *********    

while(1){
for(ii=0;ii<8;ii++){

    data_read[0]=0;
    data_read[1]= (1<<ii);
    i2c.write(ADDR, data_read, 2);wait_ms(1000);

}
}

    while(1){} //無限ループ

} // main



```
Windows上でVSCode remote containersを使っている場合にコンテナ内からsshでGitHubに接続する方法

普段Windows上で開発していて、GitHubに接続する際はssh認証を使っている人が、VSCode remote containerでcontainer内からGitHubに接続したいときのメモです。

# 環境

|||備考|
|:----:|:------:|:------:|
|OS|Windows10||
|VSCode|1.53.2||
|[Remote - Containers](https://marketplace.visualstudio.com/items?itemName=ms-vscode-remote.remote-containers) | v0.158.0 ||
|docker desktop for windows|3.1.0||
|Git Bash | git version 2.20.1.windows.1||

また、Docker Desktop WSL 2 バックエンドを使っています。

## 前提

[【Git】Windows環境でGitHubにSSH接続してコミットするまでの手順](https://qiita.com/hollyhock0518/items/a3fee20951cd92c87ed9)などを参考に`C:\Users\ユーザー名\.ssh\id_rsa`などにすでに秘密鍵を作成済みで、GitHubに公開鍵を設定済みだとします。

また、GitHubへ接続できているかはGitBash上で次のように確認できます。

```bash
$ ssh -T git@github.com
Hi ユーザー名! You've successfully authenticated, but GitHub does not provide shell acces
```

# ssh-agent

[ssh-agentを利用して、安全にSSH認証を行う](https://zenn.dev/naoki_mochizuki/articles/ce381be617cd312ffe7f)

ここでも書かれているように、サーバー側、今回で言えばContainer内に秘密鍵を置くのは危険です。こんなときは`ssh-agent`を使います。

公式リファレンス、[Developing inside a Container - Using SSH keys](https://code.visualstudio.com/docs/remote/containers#_using-ssh-keys)にかかれていることをやります。

## ssh-agentを起動する

Windows上のpowershellを管理者権限で実行し、ssh-agentを起動します。さらにWindows起動時に自動で立ち上がるようにしています。

```powershell
Set-Service ssh-agent -StartupType Automatic
Start-Service ssh-agent
# 起動できているかの確認
Get-Service ssh-agent
```

## ssh-agentに秘密鍵を登録する

Windows上のpowershellで普段GitHubに接続するときに使っている秘密鍵をssh-agentに登録します。

```powershell
$ ssh-add C:\Users\ユーザー名\.ssh\id_rsa
# 登録できているかの確認
$ ssh-add -l
```

## Container上で接続確認

これでContainer内からssh接続ができるようになったと思います。Container内のターミナルで、

```bash
$ ssh-add -l
# Windows上で登録した秘密鍵がContainer内で認識できているか確認。ハッシュ値が表示されるはず。
$ ssh -T git@github.com
Hi ユーザー名! You've successfully authenticated, but GitHub does not provide shell acces
```

これでContainer内からgit pushなどができるようになったと思います。
macOS Big SurでのPython環境構築の備忘録

macOS Big SurでのPythonの環境構築にかなり手間取ったので記録しておきます。
#1. pyenvでminiforgeをインストール
インストール一覧にあるminiforgeをインストールする

```
pyenv install --list
pyenv install miniforge3-4.9.2
```
#2. Path設定
グローバル化

```
pyenv global miniforge3-4.9.2
```
ファイル位置検索

```
which python
```

#3. condaでNumpy, pandasをインストール
```
conda install numpy
conda install pandas
```

とりあえずこれで環境構築できました。

#参考サイト
[AppleSilicon M1 Macにpythonをインストールする](https://braveam.com/archives/1409)
[pyenvを使ってMacにPythonの環境を構築する](https://qiita.com/1000ch/items/93841f76ea52551b6a97)
機械学習についてさらっと理解する

※本記事は[Techpit](https://www.techpit.jp/?utm_source=qiita&utm_medium=social_media&utm_campaign=qiita&utm_content=ai)の教材[自然言語処理を使ってメンヘラ判定AIを作ってみよう！](https://www.techpit.jp/courses/51/?utm_source=qiita&utm_medium=social_media&utm_campaign=qiita&utm_content=ai)を一部修正したものです。

近年、いろいろなところで耳にする「AI」という言葉。「機械学習」と同じような場面で使われることも多いです。
本記事を最後まで読むことで、**「AI」と「機械学習」は何がどう違うのかをざっくり理解**することができます。

**他にもプログラミング学習に役立つような情報を発信しています！**
[アカウントをフォロー](https://qiita.com/techpit-jp)してお待ちください！

# 「AI」と「機械学習」について


「Artificial Intelligence（人工知能）」の略である「AI」は、人工知能学会では「知的な機械、特に、知的なコンピュータプログラムを作る科学と技術」と大まかに説明されています。しかし、未だにその定義は曖昧で下記のように専門家によっても意見が分かれる言葉です。

![AI](https://camo.qiitausercontent.com/442286c6d33cf79bd5065e8962990dfa98c61c60/68747470733a2f2f71696974612d696d6167652d73746f72652e73332e616d617a6f6e6177732e636f6d2f302f3138303634382f64626333643331302d373963342d666265332d383634372d3664303730623133633461342e706e67)

(出典）松尾豊「人工知能は人間を超えるか」（KADOKAWA）p.45

この「AI」を実現するための1つであり、明示的にプログラムで指示せずにコンピュータに学習をさせる技術が「機械学習」です。今回も具体的に【〇〇という単語が含まれるツイートをしている場合はメンヘラと判定する】というようなプログラムを作成せずに、コンピュータにメンヘラの特徴を学習させて、メンヘラを判定するためのモデルを作成します。そのモデルを元に、コンピュータは新たなツイートに対して、メンヘラか否かを判定します。


# 教師あり学習と教師なし学習について
さらに、この「機械学習」には学習の方法として、教師あり学習と教師なし学習があります。今回、メンヘラ判定器を作成するのに用いるのは、教師あり学習です。

![AI](https://camo.qiitausercontent.com/205e5f1c83d90508ceb29c4d9eebb7f4c552a2ee/68747470733a2f2f71696974612d696d6167652d73746f72652e73332e616d617a6f6e6177732e636f6d2f302f3138303634382f62393062373532312d623236352d303861312d626664332d3338613563616234333261302e706e67)

名前の通り、教師あり学習の場合は訓練データとして、入力データと正解データがセットになったものを使います。今回のようにモデルを作成し、未知のデータを分類したり、予測したりする際に用いられます。

教師なし学習は、正解データを与えずにコンピュータ自身がデータの中から共通項や特徴を見つけ出し、学習します。一見すると相関関係がなさそうなデータ同士の頻出パターンなどを見つけ出したいときに用いられます。



※本記事は[Techpit](https://www.techpit.jp/?utm_source=qiita&utm_medium=social_media&utm_campaign=qiita&utm_content=ai)の教材[自然言語処理を使ってメンヘラ判定AIを作ってみよう！](https://www.techpit.jp/courses/51/?utm_source=qiita&utm_medium=social_media&utm_campaign=qiita&utm_content=ai)を一部修正したものです。
【TypeScript】TypeScript で class を使う方法

#TypeScriptでClassを定義する

```ts
class Department { //クラスの宣言
  name: string; //プロパティの宣言(初期値を設定可能)

  constructor(n: string) { //オブジェクトが作成された時、コンストラクタ引数をnameプロパティに代入
    this.name =n; 
  }
}

//設計図をもとに、オブジェクトを作成
const accounting = new Department('Accounting'); //コンストラクタが呼ばれる
```


* 出力されたes6 のJavaScript（※最新版以外）でのClassには、プロパティ、型がありません
* es5では、コンストラクタ関数が生成され、newキーワードで呼び出すと、コンストラクタ関数にreturnがないが、自動でオブジェクトを生成しオブジェクトが返されます


#Classにメソッドを定義する

```ts
  関数名 (引数:引数の型) {関数の処理}
```

```ts
class Department {
  name: string;

  constructor(n: string) {
    this.name = n;
  }

  //thisで具体的なインスタンスを参照する
  describe() {
    console.log('Department: ' + this.name);
  }
}

const accounting = new Department('Accounting');
accounting.describe();  //Department: Accounting
 
const it = new Department('IT');
it.describe();         //Department: IT
```

#thisを使って参照すべきインスタンスを指定

### thisの挙動に注意
* 別オブジェクトのフィールドで accountingのdescribeメソッドを参照する場合、undefinedになってしまいます

```ts
const accounting = new Department('Accounting'); 
const accountingCopy = { describe : accounting.describe };
accountingCopy.describe(); //Department: undefined
```

* 🌟この describeメソッドは、Copyオブジェクトに追加しているので、Departmentクラスに紐づいていないためです
    * つまり、`accounting.describe`で、Departmentクラスのdescribeメソッドが実行された時に、thisはaccountingオブジェクトを指していないのです

###thisはその関数を呼び出す責任があるオブジェクト
* つまり`.`の前にあるオブジェクトのことです (ここでは accountingCopy )
    * よって、accountingCopy にnameプロパティがないので、undefinedになってしまいます
* ここで、`describe( this : Department )` のように describe メソッドに、型情報を与えることで、インスタンスの型が明示的に Departmentであることを示すことができます
* Departmentオブジェクトと同様に、nameプロパティを追加したら呼び出す事ができます


```ts
class Department {
  name: string;

  constructor(n: string) {
    this.name = n;
  }

  describe(this:Department) { //thisはDepartmentクラスのインスタンス
    console.log('Department: ' + this.name);
  }
}

const accounting = new Department('Accounting');
accounting.describe(); //Department: Accounting

const it = new Department('IT');
it.describe(); //Department: IT

//OK
const itCopy = { name: 'itCopy', describe: it.describe };
itCopy.describe(); //Department: itCopy

//NG 
//const accountingCopy = { describe : accounting.describe };
//accountingCopy.describe(); //Department: undefined

```
Ichigojam BASICでht16k33(24ピン) ナイトライダー

Ichigojam BASIC で ht16k33 24ピン　ナイトライダー

前にichigojam用に書いたプログラム
書いたのは、本人だからコピーでは、ない。
説明は、特にない。

```

10 'HT16K33 KNIGHT RIDER
20 R=I2CW(#70,#21)
30 R=I2CW(#70,#81)
40 R=I2CW(#70,#EF)
50 FOR I=0 TO 7:[I]=0:NEXT
60 R=I2CW(#70,0,#800,16)
70 FOR I=0 TO 7
80 A=1<<I
90 POKE #700,A
100 R=I2CW(#70,0,#700,1)
110 WAIT 10
120 NEXT
130 GOTO 70


```
エラーチェック備忘録

<h2>条件
<p>ログイン画面作成時


DBを作り終えた後、HTMLを構成させ、
<strong>このページにエラーがなかったら次に進めるという認識</strong>


<h2>値が空だった場合
<P>POSTの値が空だった場合の関数を作成
blankの値をつける

```PHP:join.php
if($_POST['name'] === '') {$error['name'] = 'blank';}
```


<p>HTMLに記述


```PHP:join.php
if ($error['name'] === 'blank'):
/ここにエラーメッセージ/
endif;
```

正しい値がほかの間違いで消されないように

```PHP:join.php
value="<?php print (htmlspecialchars($_POST['name'],ENT_QUOTES));?>"
```

<h2>値の文字数が少ないとき
<p>lengthとつけて上と同じようにHTMLに挿入

```PHP:join.php
	if(strlen ($_POST['password'])< 4){
	$error['password'] = 'length';
	}
```

<h2>エラーがなかった場合次ヘすすむ
<p>エラーが空の場合check.phpへ飛ぶ

```PHP:join.php
	if(empty($error) ) {
		header('Location: check.php');
		exit();
	}

```

<h2>送信したページを直接打ち込まれても強制的に登録ページへ
<p>

```PHP:check.php
// 空だった場合強制送還
if(!isset ($_SESSION['join'])) {
	header('Location: index.php');
	exit();
}
```
Qiita Daily Survey memo 2021.02.24

# Qiita Daily Survey memo 2021.02.24
Qiita の記事を可能な限り毎日読むために、読んだmemoを公開することでモチベーションを維持しようという試み。
Daily のトレンドに載せていただきとてもうれしいです！
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/410015/65921bad-07d2-3623-ec52-d04ed5e90ce2.png)

## [【2021最新版】ノンデザイナーだからこそ知っておきたかった10のサイト](https://qiita.com/bo_zu_/items/88f45b132c8293dcd9b1)
じゃんけん 坊主(bo_zu_) さんの記事。
じゃんけん坊主さんがデザインをする際に参考にされているサイトを10件紹介してくださっている記事です。
グラフィックの部分のお勉強を全然してこなかったため、何も見ないで作ろうとすると壊滅的になってしまうことがよくあります…。
Qiita の記事を読んでいると刺激を受けて、何か作ろうー！って気持ちがいっぱいで、タイミングよく紹介してくださって助かります。
参考にさせていただきたいと思います！


## [アーキテクチャに関するドキュメントの残しかた - ADRとARCHITECTURE.md テンプレート](https://qiita.com/e99h2121/items/f508ef4c9743b8fc9f5b)
Nobuko YAMADA(e99h2121) さんの記事。
アーキテクチャのドキュメントってどんなものを作ればよいのか、というのをいくつかの参考記事を根拠に示してくださっている記事です。
2のアーキテクチャの図は、プロジェクトでよく描いたり残したりしますが、1のアーキテクチャ決定議事録は、なるほどなー！と思いました。
特に、だれが決めたんだっけ？というのと、どうしてこの形になったんだっけ？は、絵を描いたタイミングと絵を描いた人は覚えていますが、それ以外の人は忘れてしまうことが多いので、残しておくとよいなーと思いました。
リンク先の記事もとても参考になるものが多いです！


## [マクドナルドの記事を量子コンピュータでやってみた](https://qiita.com/doiken_/items/781fd0779920da6915ba)
土井 健(doiken_) さんの記事。
Daily Survey でも触れた [マクドナルドで一日分の栄養を取れる組み合わせを計算したら衝撃の結果に](https://qiita.com/takobaya391076/items/49b15c1fa36734b3fa53) の記事を量子コンピュータで計算させてみた、という記事になります。
やっぱりこの記事、興味深いですよね…！
ただ計算の媒体とアルゴリズムが異なるだけで、結果が異なるというのが不思議でした。
（そろばんはじいても、電卓たたいても、エクセルで計算しても、計算結果は同じなはず）
そこで計算してみると、条件の選択が異なっていたようで、下記のような結果となりました。

[マクドナルドの記事を量子コンピュータでやってみた](https://qiita.com/doiken_/items/781fd0779920da6915ba)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/410015/ff622dbb-16c9-cd60-b5ba-ea80d12bb9d7.png)

少なくとも一つを満たす、最もカロリーが低い組み合わせを計算されてしまっているかもしれません。
気になって元記事の方も確認してみましたが、こちらはサラダをたくさん食べるおかげですべて満たしているようです。

[マクドナルドで一日分の栄養を取れる組み合わせを計算したら衝撃の結果に](https://qiita.com/takobaya391076/items/49b15c1fa36734b3fa53)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/410015/8a74e175-b6c4-6038-3061-4f169aedb25b.png)


## [一銭も払わずにクラウド上でWebサービスを公開する(2021/02時点)](https://qiita.com/okazu_dm/items/87003109067348e9b7bf)
Kazuma Okada(okazu_dm) さんの記事。
タイトルの通り、無料でWebサービスを公開するいくつかのアプローチを列挙してくださっており、それぞれのメリットを書いてくださっている記事です。
"無料"の概念についても、期間限定で無料と、無料枠で分けて後者について記事を書いてくださっているため安心です。
記事では、GCPとADWとherokuについて触れられており、それぞれの構成例も書いてくださっています。
Qiita に作ってみた系の記事がたくさん上がっていて開発モチベが高まっているので、こちらも助かる記事です！！
何か作った時は参考にさせていただきます…！
VirtualBox上のUbuntu Server 20.04とWindows10間でフォルダ共有する




# 環境
- Windows 10 Pro / 20H2 build 19042.804
- virtualbox 6.1.18
- Ubuntu Server 20.04.2 LTS


## Virtual Box で共有フォルダーの設定を行う
1. Virtual Box上で、仮想マシンを選択し右クリックから`設定`を選択
2. 左側のメニューから`共有フォルダー`を選択
3. ウィンドウの右側にある`追加フォルダ`を選択
4. `共有フォルダーの追加`ウィンドウが表示されるので以下の項目を入力
  - `フォルダーのパス` : windows側のフォルダ名
  - `フォルダー名` : 仮想マシン側で見えるファイルシステム名
  - `自動マウント` : チェックを入れる
  - `マウントポイント` : 仮想マシン側で見えるフォルダパス

![vbox共有ファイル設定.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/85538/d00bdf02-3f96-c0a5-2361-0485d59b6928.jpeg)


## Ubuntuにvirtualbox Guest Additionsをインストールする
Ubuntuを起動したら仮想マシンウィンドウのメニューから`デバイス`→`Guest Additions CD イメージの挿入`を選択。
![Guest Additions CD イメージの挿入.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/85538/b4a1600a-f89b-ef8a-0192-1bd4015cd550.jpeg)


次に、ログインして以下のコマンドを入力してツールをインストールする。

```terminal
$ sudo apt install virtualbox-guest-utils
```

インストールが終わったら仮想マシンを起動しなおす。
再度ログインしたら`df`コマンドで、共有フォルダが追加されているか確認する。
![共有フォルダの確認.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/85538/a489e40b-eab3-c57e-069b-4e9ae7df106f.jpeg)

## ユーザーを`vboxfs`グループに追加する
追加された共有フォルダのグループを確認する。

```terminal
$ cd /media
$ ls -l
```

![共有フォルダのグループ確認.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/85538/f56e2f9c-db43-b49d-3014-2a56f02500f1.jpeg)

ユーザーを`vboxfs`グループに追加。
以下のコマンドを入力。

```terminal
$ sudo gpasswd -a ユーザ名 vboxsf
```

グループに追加後、ログインし直す。


## 共有フォルダにアクセステスト
共有ファイルにアクセスできるかテストファイルを作成してみる

```terminal
$ touch /media/vpc_share/test
```

windouws上で共有フォルダを確認して、作ったテストファイルがあれが成功です。
[ruby]何時から何時までの論理演算子

#はじめに
論理演算子のアウトプットさせてもらいまうす

#何時から何時までの論理演算子
たとえば、体調がいい日で18時から22時までの間しか筋トレができる時間がありません
これをコードにしていきたいと思います
体調がいい時をtrueで悪い時をfalseとして、時刻も同時に入力します。


```ruby:例
def workout(muscle,hour)
  if muscle && (hour >= 18 && hour <= 22) 
    puts "筋トレできます！"
  else
    puts "筋トレできません"
  end
end

workout(true,18)
workout(false,22)
workout(true,24)
workout(false,9)

#実行結果
#筋トレできます！
#筋トレできません
#筋トレできません
#筋トレできません
```

まず、muscle && (hour >= 18 && hour <= 22) ここの所で体調と、筋トレできる時間を判断しています

&&はAかつBを表すことができる演算子なので今回だと、どっちもtrueの時に「筋トレできます！」と表示されます

なので、どちらかがfalseになるとその時点で「筋トレできません」になるということです

#おわりに
簡単なアウトプットでした
【GAS】Google Driveで重複したファイルを検出して削除する

#はじめに
Google Drive上の重複したファイルを検出して削除します．
削除条件は任意に決めることができます．
最初に言うのもあれですが，大量のファイルがあると実行時間が上限を超えてしまうため，あまり実用的ではないです．
素直に謹製同期ソフトでダウンロードしたあと適当なフリーソフトで重複ファイルを削除する方がいいと思います．
利用するのであればファイルの数がコントロールできる特定のフォルダで定期的に実行するとかですかね．

※本ソースコードによって大切なファイルが削除され，復旧できなくなっても当方では一切の責任は負いません．

#ソース

```javascript
function main() {
  //削除条件．上からサイズが同じ，ファイルのタイプが同じ，更新日時が古い，サイズが0以外
  const detectCondition = function(x, y) {
    return x.getSize() == y.getSize() && 
           x.getMimeType() == y.getMimeType() &&
           x.getLastUpdated() <= y.getLastUpdated() &&
           x.getSize() != 0;
  };
  //ファイルの数によっては大変時間がかかる．最大実行時間を超えるとプログラムが強制終了する．
  //const folderID = '特定のフォルダのID';
  //const files = iteratorToArray(getAllFiles(folderID));//特定のフォルダのファイルの取得
  const files = iteratorToArray(DriveApp.getFiles());//すべてのファイルの取得
  const dupulicateFiles = detectDuplicateFiles(files, detectCondition);
  Logger.log(dupulicateFiles);
  dupulicateFiles.map(function(x) {
      //x.setTrashed(true); ファイルを削除する．Logを見てからすること
  })
}
//条件に合致したファイルの取得
function detectDuplicateFiles(files, detectCondition) {
  return files.pullIf(function(file1) {
    return files.some(function(file2) {
      return file1.getId() != file2.getId() && detectCondition(file1, file2);
    });
  });
}

function getAllFiles(folderID) {
  return DriveApp.getFolderById(folderID).getFiles();
}
//イテレータを配列に変換
function iteratorToArray(iterator) {
  var array = [];
  while(iterator.hasNext()) {
    array.push(iterator.next());
  }
  return array;
}
//プロトタイプに直接書くのは良くない．
Array.prototype.pullIf = function(fn) {
  var array = [];
  this.map(function(x){
    if(fn(x)) {
      array.push(x);
    } 
  });
  return array;
}
```

#あとがき
たまに書かないと文法とか忘れてしまいますね．Web上の開発環境が以前より充実していて書きやすかったです．
プログラムの実行時間が長いのは毎回APIに問い合わせているためだと思われるのでまとめて取得できる方法があれば実用的になるかもしれない．

#参考資料
公式リファレンスです．ファイルのプロパティの取得などあります．
Class File  |  Apps Script  |  Google Developers
https://developers.google.com/apps-script/reference/drive/file
Azure 勉強メモ (Azure VNet)


## 1. VNetを利用する理由

- 安全な通信
  - Azureリソース~インターネット間
    - VNet -> Internet: デフォルトで可能 
    - VNet < Internet: パブリックIP, パブリックロードバランサーを利用した場合に可能
  - Azureリソース~Azureリソース間
    - 同一VNet内
    - 2つの異なるVNet内: VNetピアリング
    - VNetリソース〜非VNetリソース: VNetエンドポイント
      - private endpoint (AWSでいうところのinterface型)
      - service endpoint (AWSでいうところのgateway型)
  - Azureリソース~オンプレミス間
    - S2S/P2S VPN
    - ExpressRoute
- ネットワークトラフィックのフィルタリング
  - ネットワーク(NSG)
  - アプリケーション(ASG)
- ネットワークトラフィックのルーティング
  - サブネット作成時にルートテーブル
  - カスタムルートでオーバーライド可能

![vnet_overview.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/288168/0603a8a4-6c29-41a0-f672-d03539b95212.png)


## 2. VNet内のリソースにアクセスする方法

### 2.1. VMにSSH/RDPしたい

- Azure Portal経由からBastionを使う

![vnet_topology_1.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/288168/9738ce1f-df58-42aa-ad2e-9ffd081a7db9.png)


### 2.2. オンプレから **直接** VNet内のリソースにアクセスする

#### 2.2.1. VNetが1つだけの場合

- オンプレと対象VNetをS2S/P2S VPN(or ExpressRoute)で接続する
  - オンプレのクライアントから、インターネットを経由せずにVNet内のサーバにアクセスしたいケースを想定
    - e.g. DBクライアントの操作, インターネットを経由したくないwebアプリ
  - オンプレから直接アクセスする必要がない場合、VNet内に踏み台WindowsとなるVMを作成して、その踏み台に対して先述のBastion経由でアクセスする方法がある

![vnet_topology_2.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/288168/ff11d2c4-471a-af85-9b79-0ffb502b4687.png)


#### 2.2.2. VNetが複数で、ハブスポーク構成をとる場合

- オンプレとVNet(**Hub**)をS2S/P2S VPN(or ExpressRoute)で接続する
- VNet(**Hub**)とVNet(**Spoke**)をピアリングで接続する
- ピアリングのゲートウェイ転送を有効にする

![vnet_topology_3.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/288168/563f91a0-f10a-f6c0-d0bb-67b81d5c8a6d.png)


## 参考資料

- VNet
  https://docs.microsoft.com/ja-jp/azure/virtual-network/virtual-networks-overview
- ハブスポークネットワークトポロジ
  https://docs.microsoft.com/ja-jp/azure/architecture/reference-architectures/hybrid-networking/hub-spoke
- VPNゲートウェイ転送
  https://docs.microsoft.com/ja-jp/azure/vpn-gateway/vpn-gateway-peering-gateway-transit
- ネットワーク全般のポータル
  https://docs.microsoft.com/ja-jp/azure/networking/
Azure 勉強メモ (Azure AD と RBAC)


## 1. Azure AD と Azure サブスクリプション

- Azure ADテナントは1つの組織に対応し、グローバルに一意なドメインを持つ。
- Azure ADテナントとAzure ADディレクトリは一対一であり、この2つはほとんど同義で使われる。
- 2つのADテナント間でIDを共有、同期することは出来ない。ただし、ゲストユーザとして招待することが出来る。
- Azureサブスクリプションのサインアップ時、**Azure ADテナントを1つだけ信頼する**必要がある。
- Azure ADとAzureサブスクリプションの関係は、**包含ではなく信頼**。請求書、支払いもADとサブスクでは別々。
- Azure ADテナントを単体で取得することは出来ない。AzureサブスクやOffice365にサインアップしたときに取得する。

![ad_subsc_overview.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/288168/85229fe0-037b-cd00-5d61-b91835657be5.png)


## 2. Azure AD ユーザ、グループ

- Azure ADのユーザには、ロールやライセンス、アプリケーションアクセス許可が割り当てられる。グループを通して間接的に割り当てることも出来る。
- グループのメンバ管理方法を**グループメンバーシップ**という。
  - 「割り当て済み」: 手動でユーザをグループに加入、グループから脱退。
  - 「動的ユーザ」: 予め作成したクエリにしたがって、属性の指定により自動で加入、脱退。

![ad_user_group.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/288168/0f58d9f5-fbdd-6480-2d4e-fff72cc73ec1.png)


## 3. RBAC

### 3.1. ロールとRBAC 

- AzureとAzure ADにはそれぞれ膨大なアクセスアクセス許可があり、**関連するアクセス許可をまとめたものをロール**という。
- ロールを通じてユーザのアクセス許可を制御することを、**ロールベースのアクセス制御 (Role-Based Access Control, RBAC)** と呼ぶ。
- **Azureリソースロール** と **Azure ADロール** は別物。

### 3.2. ロールの割り当て(プリンシパルとスコープ)

- ロールを割り当てるときには、セキュリティプリンシパルとスコープを定める。
  - **セキュリティプリンシパル** とは、リソースにアクセスする主体のことを指す。
  - **スコープ** とは、アクセス許可が適用されるリソースの範囲を指す。
- スコープには4つの階層がある。上位から順に..
  - 管理グループ
  - サブスクリプション
  - リソースグループ
  - リソース
- 上位階層をスコープとして割り当てられたロールは、下位階層に継承される。

![ad_rbac.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/288168/19665494-af50-bfa7-5c14-91b63e6747e5.png)


### 3.3. 代表的な Azure リソースロール

- 組み込みのAzureリソースロールのうち、代表的なもののロール名、およびアクセス許可の内容を以下にまとめる。

| | 読み取り<br>(課金) | 読み取り<br>(全て) | 書き込み<br>(xxx) | 書き込み<br>(全て) | RBAC<br>割り当て | 
| :---- | :----: | :----: | :----: | :----: | :----: |
| 所有者          | ○ | ○ | ○ | ○ | ○ | ○ |
| 共同作成者       | ○ | ○ | ○ | ○ |   |   |
| xxx共同作成者    | ○ | ○ | ○ |   |   |   |
| 閲覧者          | ○ | ○ |   |   |   |   |
| 課金データ閲覧者  | ○ |   |   |   |   |   |

### 3.4. PIMを利用した期限付き割り当て

- **Priviliged Identity Management, PIM** を利用することで、セキュリティプリンシパルへのロール割り当てを**永続ではなく期限付きに制御**することが出来る。
- 設定方法の違い
  - **永続割り当てはAzureリソース側で実施**
     - Azureポータルより割り当て対象スコープ(e.g. サブスク)の画面に遷移して、そのスコープのIAM管理コンソールにてロールとセキュリティプリンシパルを指定する。
     -  「スコープ→IAM」の順に遷移することに注意。
  - **PIMによる期限付き割り当てはAzure AD側で実施**
     1. Azure AD側でPIM設定の初期化(サブスクのオンボード)を実施
     1. オンボードしたAzureサブスクのリソースロールを対象に、PIMの設定(MFAや承認の要否といった、ロールアクティブ化の条件)を実施
     1. PIM設定を行ったリソースロールについて、割り当て(セキュリティプリンシパルとスコープの指定)を実施
       
  - PIMによる割り当てには「割り当ての種類」というオプションがあり、「対象」と「アクティブ」のうちから値を選択することになる。
  - 常にアクティブとなるのが「アクティブ」、アクティブ化する資格のみ付与するのが「対象」(eligible)。

![ad_pim.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/288168/fc748824-00e1-30e3-c127-56c22132bdde.png)


## 参考資料

- 竹島友理 (2020) 『ひと目でわかるAzure Active Directory 第3版』 日経BP
- RBACの公式ドキュメントポータル
  - https://docs.microsoft.com/ja-jp/azure/role-based-access-control/
Asepriteで縦横サイズが2のべき乗値のPNGファイルを出力する

# 概要

Asepriteで縦横サイズが2のべき乗値のPNGファイルを出力するにあたって調べたことをまとめる。

この記事執筆時のAsepriteのバージョンはv1.2.25-x64である。

# 背景

[Aseprite](https://www.aseprite.org/)はコマンドラインインターフェース(CLI)を持っていて、コマンドを叩くことでAseprite専用の`.aseprite`ファイルからPNGファイルに出力したり、フレームの情報(UV位置やフレームの時間間隔)をJSONファイルに出力したりできる。

1枚の画像の上に複数のフレームのデータを並べたテクスチャをドットバイドットで描画するためには、テクスチャの縦横のサイズを2のべき乗(2,4,8,16,32,...)の値にしないといけないらしい(参考: [このページ](http://marupeke296.com/NGDV_No3_Sprite.html)の下のほう)。AsepriteのCLIのオプションに出力画像サイズを2のべき乗値にするオプションがあれば便利なのだが、そのようなオプションは現状は無いみたいである(参考: [AsepriteのCLIのドキュメント](https://www.aseprite.org/docs/cli/))。このオプションを実装してほしいという旨は[GitHubのIssue](https://github.com/aseprite/aseprite/issues/2289)には上がっているのでそのうち実装されるかもしれないが、とにかく現在は無い。その代わり出力画像ファイルの縦横の大きさを指定するオプションがあったので、こちらを用いて解決できた。

# 具体的な解決法

1. とりあえずAseprite CLIを用いて出力画像のサイズを得る
2. 出力画像サイズから2のべき乗値を計算する
3. Aseprite CLIで出力画像の縦横の大きさを2のべき乗値に指定して画像出力

## Aseprite CLIを用いて出力画像のサイズを得る

```shell
Aseprite.exe -b --data hoge.json --sheet-pack hoge.aseprite
```

- `-b`: GUIを表示しないようにするオプション。
- `--data`: 出力JSONファイル名を指定するオプション。
- `--sheet-pack`: スプライトシートの並べ方を指定するオプション。

このコマンドを実行すると出力画像サイズが入ったJSONファイルを出力してくれる。このJSONファイルを解析して出力画像サイズを得る。画像サイズはJSON内の `meta/size` に格納されている。

出力画像ファイル名を指定する`--sheet`オプションを指定しないことで、JSONファイルのみを出力している。

## 出力画像サイズから2のべき乗値を計算する

```Python:Python
def get_msb(x: int) -> int:
    assert x > 0
    msb = 0
    while True:
        x >>= 1
        if x == 0:
            return msb
        msb += 1

def fix_to_power2(x: int) -> int:
    mask = (1 << get_msb(x)) - 1
    x += mask
    return x & (~mask)
```

上記の`fix_to_power2`関数で変換できる。この関数は入力以上の一番近い2のべき乗値を返す関数である。入出力の例は下表を参照。※筆者はPythonは不慣れなのでPythonらしくなかったりは許してください。

入力 | 出力
-----|----
 127 | 128
 128 | 128
 129 | 256 

### 追記

上記の`fix_to_power2`関数について @shiracamus さんから改善のコメントをいただきました。こちらのほうが分かりやすい！　ありがとうございます！！

```Python:Python
# 修正版
def fix_to_power2(x: int) -> int:
    return 1 << (x - 1).bit_length()
```

## Aseprite CLIで出力画像の縦横の大きさを指定して出力

`--sheet-width`、`--sheet-height`オプションを用いて出力画像の縦横を指定する。

```shell
Aseprite.exe -b --data hoge.json --sheet hoge.png --sheet-pack --list-tags --format json-array --sheet-width <先ほど計算した値> --sheet-height <先ほど計算した値> hoge.aseprite
```

- `--sheet`: 出力画像ファイル名を指定する
- `--list-tags`: タグ情報を付加する (この記事の本筋とは関係ない)
- `--format`: JSONの出力形式を指定する (この記事本筋とは関係ない)
- **`--sheet-width`: 出力画像の横幅を指定**
- **`--sheet-height`: 出力画像の縦幅を指定**

# 感想

ここに書いたこと＋Makefileとかでうまいことやりたいですねえ。
動画編集でもコーディング出来るんだよってお話。

#はじめに
[watnow](https://twitter.com/watnows)の[ひいら](https://twitter.com/Hiira_217)です〜。

[watnowカレンダー](https://www.notion.so/watnow_QiitaCalendar-483ff14121764b2fa6b6afc78ec3cab1)24日目ということで、
コードがゴリゴリ書けない自分は何をしたらいいんだ〜って感じだったのですが、
唯一AfterEffectsをコーディングで制御する方法(エクスプレッション)なら知ってたので記事にしました！

動画編集者の人は見といて損しないと思います:relaxed:

ちなみにめっちゃ基礎的な知識は省いてます😭

#便利なやつ色々紹介

動画編集してて、割と使うやつ紹介します！
超簡単に使えるので、是非やってみてはいかがでしょうか？

##time

時間経過で数値を足したい時に使えます！

```javascript:time使い方
time * 数値
```

と入力するだけです。
超簡単エキサイティング！

time = 1秒間に
って意味があるので、1秒間になんぼ数値が増えてくんじゃって指定方法です。

例えば角度のエクスプレッションに

```javascript:角度に入力
time * 120
```

と入力すると、1秒間に120度ずつ回転するオブジェクトの完成です！

##wiggle

グラグラと動くオブジェクトを作りたい時に使えます！

```javascript:wiggle使い方
wiggle(振動数,振幅)
```

と入力するだけです。

例えば、位置のエクスプレッションに

```javascript:位置に入力
wiggle(10,20)
```

と入力すると、グラグラ動くオブジェクトの完成です！

##random

wiggleと似ている関数なのですが、
wiggleのような連続した数値ではなく、
特定の値にジャンプするというやつです！

```javascript:randomの使い方
random(数値or配列)
```

これは、入力する項目が1次元か2次元かによって変わります！


例えば、
不透明度なら1次元で
位置やスケールは2次元って感じですね。(xとyがあるので！)

例えば、位置のエクスプレッションに

```javascript:位置に入力
random([50,200],[500,1000])
```

と入力すると、
xは50~200の間
yは500~1000の間で
瞬間移動するようなオブジェクトが作れます！
[AtCoder]AtCoder Beginner Contest 127

# はじめに
* AtCoder Beginner Contestの過去問の解法及び提出したソースコードをまとめています。
* 基本的に自分が振り返ることを目的としておりますが、誤りや気になった点、その他質問等もお待ちしておりますので遠慮なくお願いします。

# コンテストページ
https://atcoder.jp/contests/abc127

# A問題
Aの値によって素直に条件分岐してあげます。

```c++
#include <bits/stdc++.h>
using namespace std;

int main()
{
    int a,b;
    cin >> a >> b;

    if(a >= 13){
        cout << b << endl;
    }
    else if(a >= 6){
        cout << b/2 << endl;
    }
    else{
        cout << 0 << endl;
    }

    return 0;
}
```
# B問題
X<sub>i+1</sub>の値はX<sub>i</sub>の値と定数を用いて求まることからループを回して一個前のXの値を利用して計算した結果を表示していってあげればよいです。

```c++
#include <bits/stdc++.h>
using namespace std;

int main()
{
    int r,d,x;
    cin >> r >> d >> x;
    
    for(int i = 0; i < 10; i++){
        x = r * x - d;
        cout << x << endl;
    }
    return 0;
}
```
# C問題
i番目のゲートは(L<sub>i</sub>,R<sub>i</sub>)内の範囲にある番号のカードなら通ることができます。
そしてあるカードですべてのゲートを通過するためにはすべてのゲートの(L<sub>i</sub>,R<sub>i</sub>)の範囲にそのカード番号が含まれている必要があります。
これは任意の二組のゲートの片方のLがもう片方のRより大きい場合成り立ちません。
これらのことから全てのゲートのうちLが最も大きいもの(L_MAX)と、Rが最も小さいもの(R_MIN)を求めてあげれば(L_MAX,R_MIN)に含まれる番号のカードが条件を満たすことがわかります。
答えは条件を満たすカードの数なのでR_MIN-L_MAX+1です。
また、R_MINよりL_MAXが大きい場合は通過できるカードはないので0になることに注意します。

```c++
#include <bits/stdc++.h>
using namespace std;

int main()
{
    int n,m;
    cin >> n >> m;
    int max_l = 0;
    int min_r = INT32_MAX;

    for(int i = 0; i < m; i++){
        int l,r;
        cin >> l >> r;
        max_l = max(max_l, l);
        min_r = min(min_r, r);
    }

    cout << max(0, min_r - max_l + 1) << endl;
    return 0;
}
```
# D問題
※説明のためXをYに置き換えるときXをSRC、YをDSTとします。
合計値を最大にしたいので以下のことがわかります。

* 一つのSRCを二回以上書き換える意味はない
* 書き換える順番は結果に影響しない
* SRCは小さい方から書き換えるべき
* DSTは大きい順に選んでいくべき
* DSTの候補は全てのiについてC<sub>i</sub>がB<sub>i</sub>個ずつ

これらのことから与えられたN枚のカードを昇順にソートし、降順にソートしたDST候補と先頭から比較していって大きい方を選んで足していけばよいです。
「降順にソートしたDST」はすべて列挙する必要はなく大きい順に最大N個で十分です。

```c++
#include <bits/stdc++.h>
using namespace std;
#define ll long long

int main()
{
    ll n,m;
    cin >> n >> m;
    vector<ll> dst(n);
    vector<pair<ll,ll>> bc(m);

    for(int i = 0; i < n; i++){
        cin >> dst[i];
    }

    for(int i = 0; i < m; i++){
        cin >> bc[i].second >> bc[i].first;
    }

    sort(dst.begin(), dst.end());
    sort(bc.begin(), bc.end(), greater<pair<ll,ll>>{});

    vector<ll> src(n, 0);
    // 二重ループを一発で抜けるためだけのラムダ式
    [&](){
        ll count = 0;
        for(auto x : bc){
            for(int i = 0; i < x.second; i++){
                src[count] = x.first;
                count++;
                if(count == n) return;
            }
        }
    }();

    ll ans = 0;
    for(int i = 0; i < n; i++){
        ans += max(dst[i], src[i]);
    }

    cout << ans << endl;
    return 0;
}
```
# E問題(未AC)
まだ解いておりません。

# F問題(未AC)
まだ解いておりません。
Oculus Quest 2 画面の「録画」のファイルの場所

# Oculus Quest 2 画面の「録画」のファイルの場所

最近Oculus Quest 2を手に入れたのでいろいろアプリを作り出しています。
実機にビルドした際の記録を動画で残す時に、取り出す場所がわからず、情報も少ないので探すのに何気に時間がかかったので、そのメモ。

キャプチャを行うには、シェアマークを選択し、画面の動画キャプチャを行うときは「録画」、写真をキャプチャするには「写真を撮る」を選択し、開始することができる。

![com.oculus.shellenv-20210224-013015[1].jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/110060/f12d5c9a-a356-c171-da26-71d1e861b3b9.jpeg)

Oculus Quest 2をPCに接続すれば、デバイス名「Quest2」というドライブとして認識する。
順番に、まず、「内部共有ストレージ」をダブルクリック、
![1.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/110060/61cd9ccb-5b1c-4105-eb15-2c952ea4ea4c.png)

「Oculus」をダブルクリック、
![2.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/110060/55e22c3b-73d0-ce80-28f6-5853a988b4b7.png)

動画の場合は「VideoShots」をダブルクリック、
![3.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/110060/427c0cff-293f-c545-dcc1-34265c7d7c34.png)

このフォルダーに格納されている。
![4.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/110060/887a1be0-ae91-a969-337a-642c73b0ad5c.png)

ちなみに、このキャプチャの内容は、とりあえずお試しで作ったアプリの動作の様子。
https://youtu.be/A35ygDLtsZU

今度、余裕がある際に、Oculus Quest 2へのUnity自作アプリの実機インストール方法等を詳しくまとめたいと思います。
表全体の高さが最小になるような各列の幅の組合せを見つけたい(調査編)

# 文章がいっぱい書いてあるエクセルとは
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/619160/2620b223-c0f4-506c-590f-0049a6cd37aa.png)
こんな感じのものです。セル内で文字が折り返されてますね。
2つの表の横幅は同じですが、高さは違います。
右側の表は「た。」だけの行があったりして無駄に高さを稼いじゃってますね。
なんかこれがいやだったので列幅を調整したりしてたんですが、エンジニアだったら合理的に幅を算出すべきじゃないかと思います。

# 数式で表すとどうなるだろうか
行$i$, 列$j$, 各列の幅$w_j$, 各セルの文字数$s_{ij}$ とする。
表の幅は$W$で固定されているものとする。
**セル内の文字列に改行文字は含まないものとする。**(問題が難しくなってしまうので)
さらに、等幅フォントを使い、$w_j$は「1行に並べられる文字数」で表す。
幅は1以上の整数とする。

## 高さを算出する
例えば80文字セルが列幅9文字なら「80/9=8行あまり8文字」で切上げて9行です。
各セルの高さ$h_{ij} = {\rm ceiling}(s_{ij}/w_j)$ と表します。  
また、行$i$の高さは、結局横にある同行セルの中で一番高いものになります。
行$i$の高さ$h_i={\rm max}(h_{i1}, h_{i2}, ..., h_{iJ})$ と表すことにします。  
最終的な表の高さ$h$は、各行の高さの総和です。これを最小化したいですね。

## 制約
各列幅の総和は表幅となる。 $\sum w_j = W$
列幅は1以上になる。 $w \ge 1 , w \in {\mathbf w}$

# 1行だけの表を例にして考える
これならほかの行との兼ね合いを考えなくていいので楽ですね。
表幅$W=20$、3列で文字数はそれぞれ$s_1 = 5$, $s_2 = 30$, $s_3 = 50$
という例で考えてみます。
${\mathbf w} = (1,1,18)$から${\mathbf w} = (18,1,1)$まで$18^3=5832$個よりは少ない組合せが考えられます。絶対に良い解法ではありませんが、しらみつぶしに探してみます。

```powershell:簡単な例の最適解を無理やり計算する(PowerShell)
$W = 20  # 表幅
$s = (5,30,50)  # 各セルの文字数
$ans = (1,1,18) # 数値に意味はない

$minHeight = 51 # これより悪くはならないという初期値
$minAns = (1,1,18) # 無作為な初期解

function calcH($s, $w){ [Math]::Ceiling($s/$w) } # 0除算はエラーを出す

for($k=1; $k -le 18; $k++){
  for($l=1; $l -le 18; $l++){
    for($m=1; $m -le 18; $m++){
      if($k+$l+$m -ne $W){ continue } # 「各列幅の総和は表幅と等しい」制約
      $ans=($k, $l, $m)
      $h1 = calcH $s[0] $k
      $h2 = calcH $s[1] $l
      $h3 = calcH $s[2] $m
      $height = ($h1,$h2,$h3 | Measure-Object -Maximum).Maximum
      
      if($height -lt $minHeight){
        $minHeight = $height
        $minAns = $ans
      }
      
      echo ("("+ ($ans -join ',') +")=>" + $height + " ==max(" + $h1+","+$h2+","+$h3 + ")") >> min_table_height.log
    }
  }
}
echo ("min height is " + $minHeight + " at " + ($minAns -join ',')) >> min_table_height.log
```

全171パターンの最適解は(1,6,13)で、高さは5行でした。

## さらに簡単にして結果をグラフにしてみる
表幅$W=20$、2列で文字数は$s_1 = 30$, $s_2 = 50$とした場合、
全19パターンの最適解は(6,14)で、高さは5行になります。
1列目の列幅と行の高さの関係は下のグラフのようになります。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/619160/5439ed3d-403d-9a74-c923-215fbcc52a05.png)
列1の幅が狭すぎる最初の方は$y=30/x$っぽいグラフで、逆に最後の方は$y=50/(20-x)$っぽくなってますね。
「し」型の関数と、左右反転した「し」型関数がぶつかってる感じです。
3次元(3列)になったら、これの真ん中に棒を刺して回したようなグラフになりそうです。最悪の場合、卵のパックみたいな局所解が散らばった図形になったりしそうです。

## いかがでしたか
表を縦にコンパクトにするための列幅を探りました。なんか難しそうだったので前提を置きまくり、一番簡単なケースを総当たりで解いてみました。結果、そんなに複雑な解空間じゃないような気がしました。そりゃ一番簡単なケースを解いたんだからそうなるだろうという気もします。でも、「ほかの行との兼ね合い」という要素が加わっても、そんなに複雑にはならないんでしょうかわかりません。  
ここまでやっといてなんですが、メタヒューリスティック手法で解くみたいなオチになると思います。問題について考えてみたけど上手く定式化できないからヒューリスティック手法で解くっていうのは全然合理的じゃない気がしますね。
教科書に載ってる練習問題は解けるのに応用的な文章題を出されると解けない優等生みたいな気分になりましたが、そもそもろくに教科書の問題を解けたことがありませんでした。精進します。
CBORってなんだろう？

# CBORとは
Webサービスでよく使われるデータ交換フォーマットとして有名なものはJSONだと思います。
ただ、サイズが冗長なこともあり、バイナリとして表現しようと様々なものが生まれてきました。(例えば、MongoDBで使われるBSONなど)

=> そんな中、今後注目されそうなものが**RFC8949**でRFC化された**CBOR**です。

## 特徴
* JSONデータモデル「数値、文字列、配列、マップ（JSONオブジェクト）、およびfalse、true、nullなどの値」に基づいている。
* エンコードされたデータは自己記述的である。
* デコードのためのスキーマ記述は不要である。
* JSONを使用したい一部のアプリケーションでは、**暗号化キー**、**グラフィックデータ**、**センサー値**などのバイナリデータを転送する必要があります。  
JSONでは、これらのデータをエンコードする必要があり（通常はbase64形式）、複雑さとかさばりが増します。  
=> CBORでは、このバイナリデータをそのまま受け入れることができます。

一番の特徴は、CBOR自体がバイナリでエンコードされていることから、かさばりが節約されて、処理が高速化されるということです。
つまり、CBORはIoT向きのデータ交換フォーマットということになります。

## 手軽にエンコードしてみたい
* [CBOR playground](http://cbor.me/)にて、エンコードしたいオブジェクトとバイナリの16進表記の変換ができます。

# データフォーマット
データフォーマットについて細かいエンコードの方法を記載していくのは大変なので、今回は割愛します。
下記に詳細が書いてあるのでご参考までに。
[Concise Binary Object Representation (CBOR)](https://www.rfc-editor.org/rfc/rfc8949.html#name-major-types)

## 試してみた
* CBORは、特定のアプリケーション用にゼロから実装するのはシンプルです。
* 今回は、Node.jsでの実装をやってみます。

**1.ライブラリのinstall**

```
npm install cbor
```
参考: https://github.com/hildjj/node-cbor

**2.実装**

```main.js
var CBOR = require('cbor');

var encodedBuffer = CBOR.encode({hello: 'world'});
var decodedObject = CBOR.decode(encodedBuffer);

console.log(decodedObject)
```

**3.実行**

```
❯ node main.js
{ hello: 'world' }
```

# まとめ
思っていた以上に手軽に実行できました！
別記事でデータフォーマットについてもう少し深堀りしてみたいと思います。
会社全体の組織設定 ⇒ マルチ通貨設定の概要

１．新しい通貨を会社の設定に追加する前に何を行う必要がありますか?
２．組織のマスタ通貨について正しい文章はどれですか?
３．高度な通貨管理を有効化すると組織で何ができるようになりますか?
４．マルチ通貨設定と通貨が会社の設定に追加されている場合、ユーザができることは何ですか?
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/634241/7fd6d553-4e4b-d98e-76a4-759cb7b62962.png)
Rigifyでモデルとリグを関連づけるときにCtrl+Pを押しても「自動のウェイト」が表示されなかった

## 概要
Blenderでモデリングしてるときに躓いた問題の備忘録です

## 環境
Blender 2.91.0
Rigfy

モデリングしてもボーン構成とスキニングとコントロールポイントの生成とかめんどいなーと思ってたら
いい感じにやってくれるRigfyというアドオンがあるんですね。便利。

## 事象
Rigifyでモデルとリグを関連づけるときにCtrl+Pを押しても「自動のウェイト」が表示されなかった

![blender_ボーン設定_自動が出ない.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/7680/8050e2a1-f272-7e06-0f6d-3f0e987fe02e.png)

## 原因
よくよくみたらメッシュとボーン以外の要素も選択してるせいだった

ちゃんと対象のメッシュとボーンだけ選択してCtrl+Pを押そう

![blender_ボーン設定_自動が出た.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/7680/a27dbda8-d6d1-e62e-d910-c9afe4d92dff.png)

ポーズモードに移行してボーンをいじるとメッシュがついてくると思います
備忘録　laravel react axios CORSエラーを出ないようにする。

laravelにreactを入れてaxiosを書いて、外部apiにアクセスするとCORSエラーになる場合があります。

原因は、`resources/js/bootstrap.js` の

```js
window.axios.defaults.headers.common['X-Requested-With'] = 'XMLHttpRequest';
```

です。

以下のようにするとエラーが出ないようになります。

```js
// resources/js/components内のファイルなどで記載
const extAxios = axios.create();
delete extAxios.defaults.headers.common["X-Requested-With"];

function Example() {

  useEffect(() => {
      extAxios.get("https://aws.random.cat/meow").then((res) => {
          console.log(res.data.file);
      });
  }, []);

// 以下省略
```

[こちら参考にさせて頂きました。](https://github.com/laravel/framework/issues/30899)