OmniAICreator/Qiita-1.07M huggingface dataset:
MySQL8の同時実行制御検証(1)

## はじめに

100人が同時に、映画館予約システムの「予約」ボタンを押した、
といったシナリオを考えてみます。
テーブル定義はこんな感じ、

|座席番号|予約状況|
|------|-----|
|A1|NO|
|A2|YES|
|B1|NO|
|...|...|

複数トランザクションから同時に、空席の問い合わせと予約状況の更新が走ります。
MySQLを使って、トランザクション間でロック待ちを起こさずに、実現できるでしょうか。

## ロックされているレコードの行ロック解放を待たずに処理続行できたらいいが。。。

Oracleにはそのための NOWAIT と SKIP LOCKED オプションがありますね。
それが、MySQLも 8.0 から同じオプション使えるよ、と同僚が教えてくれました(えー、知らなかったの？とお声が)。 

## MySQL 8 で、NOWAIT と SKIP LOCKED オプション の定義

引用元: https://dev.mysql.com/blog-archive/mysql-8-0-1-using-skip-locked-and-nowait-to-handle-hot-rows/


- NOWAIT
```
A locking read that uses NOWAIT never waits to acquire a row lock. 
The query executes immediately, failing with an error if a requested row is locked.
```

- SKIP LOCKED

```
A locking read that uses SKIP LOCKED never waits to acquire a row lock. 
The query executes immediately, removing locked rows from the result set.
```

これで、獲得可能なロックのみ獲得し即時に結果を返せるので(両者の違いはエラーを返すか返さないか)、
行ロックが解放されるまで待機する必要がなくなり、さくっと空席を予約できそうです。

### 注意書き

データ一貫性は担保できない、と特記事項ありました。

```
Note
Queries that skip locked rows return an inconsistent view of the data.
SKIP LOCKED is therefore not suitable for general transactional work.
However, it may be used to avoid lock contention when multiple sessions
access the same queue-like table.
```

別トランザクションによりロックかけられているレコードはスキップされ、
問い合わせ結果に含まれないので、当たり前のことかもしれません。

ですので、

- 行競合が発生しうる並列処理を分散させたい
- ただし、問い合わせ結果に抜け漏れが出でもOK

のような場面で使用できそうです。


## おわりに

MySQL 8 からの NOWAIT と SKIP LOCKED オプションを用いて、 
期待とおり、さくっと座席予約できるか、そのパフォーマンスはいかがなものか、
など、検証してみたいですね。
お楽しみに。

##### [次回] [MySQL8の同時実行制御検証(2)](https://qiita.com/mingchun_zhao/items/0d0f081115d3820af364)
自分で買ったスマホにauのsimを刺して、ezwebのメールを送受信したい

# 目的
自分で買ったスマホにauのsimを刺して、ezwebのメールを送受信したい
（Qiitaに書くことなのか、というツッコミは甘んじて受け入れる）

# 前準備
1. UAを偽装する
何故かiPhoneでしかメール設定が表示されない。
スマホにUA偽装ツールを入れる。
（今使えても、将来使えなくなっている可能性大なので、適当に探す）

2. 偽装状態で下記へアクセスする
https://set.mail.ezweb.ne.jp/md/signin

3. auIDログイン
4. 「手動設定」をクリック
5. 「設定URLを取得する」
6. SMSにアドレスが送られてくる 

# メール設定
Gmainなどの好きなメールアプリに↓の設定する

## パスワード
| 項目名 | 設定 |
| ---- | ---- |
|メールアドレス|自分のアドレス@ezweb.ne.jp|
|ユーザー名|SMSに送られてきたユーザ名|
|パスワード|SMSに送られてきたパスワード|

## 受信サーバ
| 項目名 | 設定 |
| ---- | ---- |
|IMAPサーバ|imap02.au.com|
|SSL使用|on|
|ポート番号|993|

## 送信サーバ
| 項目名 | 設定 |
| ---- | ---- |
|SMTPサーバ|smtp02.au.com|
|SSL使用|on|
|ポート番号|587|
Python: Windows10 WSL Ubuntu20.04に、apt-getで入ってくれないPython3.10.xをインストール



なにはともあれ↓をしましょう

```bash
$ sudo apt-get upgrade
$ sudo apt-get update
```

ではPython3の最新バージョン3.10.3をインストールしましょう。
わたしの場合はすでにPython3.Xは入っていたので、upgrade で実行してみます。

```bash
$ sudo apt-get upgrade python3

Reading package lists... Done
Building dependency tree
Reading state information... Done
python3 is already the newest version (3.8.2-0ubuntu2).
Calculating upgrade... Done
The following packages have been kept back:
  fwupd libfwupd2 libfwupdplugin1 libgl1-mesa-dri libglapi-mesa libglx-mesa0 mesa-vulkan-drivers
0 upgraded, 0 newly installed, 0 to remove and 7 not upgraded.
```

`apt-get` じゃ3.8.2までしか入らないのでソースコードから手動で入れます。

まず必要なものをインストールします。
```bash
$ sudo apt install build-essential zlib1g-dev libncurses5-dev libgdbm-dev libnss3-dev libssl-dev libreadline-dev libffi-dev libsqlite3-dev wget libbz2-dev
```

Python公式サイト https://www.python.org/downloads/source/ でソースコード本体のURLを調べてwgetでダウンロードします。
```bash
$ wget https://www.python.org/ftp/python/3.10.3/Python-3.10.3.tgz
```

tgz圧縮されているので解凍します。
```bash
$ tar -xzvf Python-3.10.3.tgz
```

インストールの準備をします。
```bash
$ cd Python-3.10.3/
$ ./configure --enable-optimizations

$ make -j 12
```

満を持してインストールを実行します。
```bash
$ sudo make altinstall
```

インストール結果を確認してみます。
```bash
$ python3.10 --version
Python 3.10.3

$ pip3.10 --version
pip 22.0.4 from /usr/local/lib/python3.10/site-packages/pip (python 3.10)
```

ええやん。

だがしかし・・・

```bash
$ python --version
Python 3.8.10
```

`python` コマンドだと古いバージョンが呼ばれる。
直したい。

```
$ sudo update-alternatives --install /usr/bin/python python /usr/local/bin/python3.10 1
update-alternatives: using /usr/local/bin/python3.10 to provide /usr/bin/python (python) in auto mode

$ python --version
Python 3.10.3

$ sudo update-alternatives --install /usr/bin/python3 python3 /usr/local/bin/python3.10 1
update-alternatives: using /usr/local/bin/python3.10 to provide /usr/bin/python3 (python3) in auto mode

$ python3 --version
Python 3.10.3
```

`pip` も直します。


```bash
$ echo "alias pip=pip3.10" >> ~/.bashrc

# ターミナルを再起動

$ pip --version
pip 22.0.4 from /usr/local/lib/python3.10/site-packages/pip (python 3.10)
```
MatAutoCompleteを1つのComponentに複数実装する際に、入力補完が全て同じになってしまう

メモ代わりの記事です


やりたかったこと
Angular Material mat-form-fieldで入力補完がしたかったのでmat-autocompleteを使用した
mat-form-fieldを2つ実装して別々に入力補完したかった

失敗したこと
mat-form-fieldを2つ実装したが、1つ目の入力補完の内容が2つ目にも反映されてしまった


要約
コード一部抜粋
```TS
<input type="text"
                 matInput
                 [formControl]="control"
                 [matAutocomplete]="auto">
          <mat-autocomplete autoActiveFirstOption #auto="matAutocomplete">

<input type="text"
                 matInput
                 [formControl]="otherControl"
                 [matAutocomplete]="auto">
          <mat-autocomplete autoActiveFirstOption #auto="matAutocomplete">
```

matAutocomplete用のテンプレート変数を分ける
上記だと#autoの指定が一緒なので1つめのautocompleteの内容が反映される
テンプレート変数を分ければ正常に別々の入力補完が聞くようになる
新人のうちにこれだけは直してほしいこと

# はじめに
本当に当たり前のことばかりですが、
新人のうちに直した方がいいことをまとめてみました。

あくまで業務上に絞った内容なので、
土日に勉強しない等は入れていません。

※この記事は私の独断と偏見で構成されています。


## やったと嘘をつくのはやめよう

(例)
Aさん：これテストしましたか？
Bさん：えーと、しました！（嘘）
Aさん：動かないけど？
Bさん：…

こうなるとAさんはBさんのことが信用出来なくなります。
当たり前のことですが、
信頼関係を構築する為にも大切なことです。
私の経験談でもありますが、こんな嘘をつかれると悲しいです。

## 公式ドキュメントを読もう
あるある1。

公式ドキュメントは確かに情報量が多く、読みにくいものもありますが、
適切に読めるとすぐに問題解決に繋がります。

開発の自走力を高めたいのであれば、
公式ドキュメントを読むのが近道だと思います。

## ログを読もう
あるある2。

答えはログに書いてあります。
英語が苦手でも頑張って読みましょう。

余力があれば、目grepは是非鍛えましょう。

https://www.slideshare.net/murachue/grep-8132856

## バージョン差異には気をつけよう
PHPやPython等、
バージョンが違うとほぼ別物になってしまうような言語もあります。

ドキュメントを読むときも自分の環境のバージョンはいくつなのか、
しっかり把握することが大切です。

## 自分で質問する際のルールを決めておこう
10分悩んで分からなければ〇〇さんに相談するなど、
自分の中で質問するルールを決めておくことで、
質問するかどうかで悩まない様にしましょう。


## 質問の仕方を考えておこう
何が分からないのかを言語化するのは難しいですが、
5W1Hに落とし込んで伝えたり、相手に理解して貰いやすい質問の仕方を常に意識しましょう。

例えば、以下のようなテンプレートを用意しておくと悩まずに済みます。

```
○○を実行すると、○○というエラーになってしまいます。

私の行った手順は以下です。
(1)
(2)
(3)

以下のような結果になりました。

【結果のスクショやコピペ】

【参考資料】を参考にして、
私は【予想結果】になると思いました。

原因を確かめるため、以下のようなことを試しましたが、
解決には至りませんでした。

(a) 入力を○○ではなく××にしてみた
→上記と同じ結果になった

(b) ソースプログラムの○○をやめて、××にした
→以下のようなコンパイルエラーになった

【エラーメッセージのコピー＆ペースト】
```


## 自分の思い込みでの作業はやめよう
きっとこうだろうで業務を進めると、
手戻りが発生し、余計に時間が掛かります。

思い込みで作業するのは、周りにも迷惑が掛かるので絶対に止めましょう。

## 書いたコードの動作確認しよう
動作確認せずに出来ましたというのは、実際に動かないことが多いのでよくありません。

レビューする人に対しても失礼なので、
最低限、ちゃんと動くことをを確認しましょう。

つよつよな人やベテランも、動作確認は必ずしていると思います。

## ヤバくなる前にアラートをあげよう
アラートは、手の施しようがなくなる前(ヤバくなる前)にあげましょう。

基本的にチームで動いている場合、事前にアラートがあがれば、
なにかしらのフォローが出来る場合が多いです。


## プロジェクトの開発スケジュールを意識しよう
ウォーターフォールやアジャイルなどの開発手法によっても多少異なりますが、
大体、どのプロジェクトでもガントチャート等でスケジュールは管理をしているかと思います。

全体の開発スケジュールを把握しておくことで、自タスクの進捗の逆算が出来たり、
フェーズ毎に何をすればいいか等、色々と学びも多いと思います。

## 自分のタスクの進捗を簡潔に説明できるようにしておこう
定例などで、自分の進捗を周囲に共有する場面があるかと思いますが、
そういった際には、ダラダラと話さずに要点だけを伝えられるように心掛けることが大切です。

ミーティングの時間も限られていますし、質疑応答せずに伝えられる方がスマートだと思います。

## パスワード関連を把握しておこう
よくあるのが、「このzipファイルのパスワードなんでしたっけ…？」や、
「検証環境のテストユーザのアカウントとパスワードを忘れました…」など、

そういうところに時間を割くのはとても勿体ないので、
メモに残せるものであれば残して、
パスワード関連が記載されているWikiのページ等は把握しておきましょう。

# おわりに
これらは私の経験を元にしており、
サンプル数としては少ないので、まだ他にもあるよとコメントで教えて頂けると幸いです。
Pythonの辞書で条件に合致する要素を削除する

```py
d = {"a": 1, "b": 0, "c": 1}
```

上記のような辞書があったとして、値が`0`である要素のみ削除したいとする。
直感的に以下のコードを書いてみる。

```py
for k, v in d.items():
    if v == 0:
        del d[k]
```

動かすと、以下のエラーが発生する。

```py
RuntimeError: dictionary changed size during iteration
```

言っていることは分かるが、納得できなくて狂いそう･･･！（静かなる怒り）
対処法として、辞書と直接紐づかないiterableな変数を用意してfor文を回すことを考える。
具体的には、値が`0`であるキーのリストでfor文を回す。
ここでリストの内包表記が使えると考えられるが、Python触り始めて半年以上経つのに、
オレにはまだ内包表記が･･･ よく分からんのよ･･･！
[@ITの記事](https://atmarkit.itmedia.co.jp/ait/articles/2107/06/news020.html)が分かりやすかった（小並感）。以下のコードは引用。

```py
some_var = [expression for item in iterable_obj if condition]
```

```py
some_var = []
for item in iterable_obj:
    if condition:
        some_var.append(expression)
```

この2つのコードが同じであるとのこと。
後者のコードを今回やりたいことに当てはめると、以下のコードになる。

```py
target_keys = []
for key in d.keys():
    if d[key] == 0:
        target_keys.append(key)
```

これをリストの内包表記に変換する。

```py
target_keys = [key for key in d.keys() if d[key] == 0]
```

というわけで、辞書から値が`0`である要素を削除するためのコードは以下の通り。

```py
for target_key in [key for key in d.keys() if d[key] == 0]:
    del d[target_key]
```

･･･ヨシ！

# 追記

3年以上前にほぼ同じことをやっているQiitaの記事がありました。
[Python の辞書で条件に一致するキーと値を削除する](https://qiita.com/kyoshidajp/items/27acb27ceabe1c11afbb)
ちょっとググれば見つかるのに何で見落としてるんですかね？？？
一応、あちらの記事が新しい辞書を作成するのに対し、こちらの記事は既存の辞書の要素を削除するという違いはあります。
【チートシート】SQLのコマンド一覧（演算子）

## 〈 算術演算子 〉
| コード | 使用例 | 意味 |
|:-:|:-:|:-:|
| +  | ① + ②  | ①に②を加える (加算)  |
| - | ① - ②  | ①から②を引く (減算)  |
| *  | ① * ②  | ①に②をかける (乗算)  |
| /  | ① / ②  | ①を②で割る (除算)  |
| %  | ① % ②  | ① を ② で割った余り (剰余)  |

## 〈 比較演算子 〉
| コード | 使用例 | 意味 |
|:-:|:-:|:-:|
|=   |① = ②   |①と②は等しい   |
|<=>   |① <=> ②   |①と②は等しい   |
|<>   |① <> ②   | ①と②は等しくない  |
|!=   |① != ②   | ①と②は等しくない  |
|<   | ① < ②  | ①は②よりも小さい  |
|<=   | ① <= ②  | ①は②以下  |
|>   | ① > ②  | ①は②よりも大きい  |
|>=  | ① >= ②  | ①は②以上  |
|BETWEEN AND   | ① BETWEEN Min AND Max  | ①はMin以上Max以下  |
|NOT BETWEEN AND   | ① NOT BETWEEN Min AND Max  | ①はMinより小さい、または、Maxより大きい  |
|IS NULL   |① IS NULL   |①はNULLではない   |
|IS   |① IS true   |①はtrueである   |
|IN   | ① IN (値1,値2,...)  |① は 括弧内のいずれかの値に等しい   |
|LIKE   |① LIKE パターン1   | ①はパターン1に合致する  |
|NOT LIKE   |① NOT LIKE パターン1   |①はパターン1に合致しない   |

## 〈 論理演算子 〉
| コード | 使用例 | 意味 |
|:-:|:-:|:-:|
| AND  | ① AND ②	  | ① と ② が共にTRUEの時にTRUE  |
| &&  | ① && ②  | ① と ② が共にTRUEの時にTRUE  |
| OR  | ① OR ②  |① か ② の少なくとも1つがTRUEの場合にTRUE   |
| ｜｜  | ① ｜｜ ②  | ① か ② の少なくとも1つがTRUEの場合にTRUE   |
| XOR  | ① XOR ②	  | ① か ② のどちらか1つがTRUEの場合にTRUE  |
|NOT   | NOT ①  | ① がTRUEならFALSE、① がFALSEならTRUE  |
| !  | !①  | ① がTRUEならFALSE、① がFALSEならTRUE |
さくらvpsにRailsアプリをデプロイするまで (1)  各種設定

# 0.でぷろいまで
　ついに個人アプリが形になった。つぎはデプロイまですることにした。HerokuやAWSを使う方法があるが、前者は速度が遅いし、後者は金額が高すぎる。AWSには無料枠があって、サービスの種類によってはアカウント取得から1年間無料で利用できるものもあった。しかし、私はすでにアカウントを開設してからしばらくの年月が経っていたのでできない。

　ちょっとかんがえてさくらvpsを使うことにした。月額1000円程度で使えるみたいだし、独自ドメインの設定やhttpsの設定もできるらしい。やっていこう。

　アカウントを取得した。

https://vps.sakura.ad.jp/

# 1.サーバーの設定
　もろもろのやりかたは公式に書いてある。


https://knowledge.sakura.ad.jp/8218/

## 1-1.やっていこう

#### rootログイン

さくらvpsサーバーを起動したら、ターミナルに打っていく。

```terminal
$ ssh root@xxx.xxx.xxx.xxx
```

xxx.xxx.xxx.xxxにはサーバーのIPアドレスが入る。


```terminal
[root@xxx ~]#
```

うまくいくとこうなる。今後はサーバーに入ってからのコマンドは#ではじめる。

#### OSアップデート

```terminal
# yum update
```

 最新のものになる。


## 1-2.安全な接続

#### 一般ユーザーを作る

　rootユーザーだけだと、乗っ取られた時にやばい。もうひとつ一般のユーザーをつくり、そいつだけログインできるようにする。rootはログインできないように。

　そうすると、一般ユーザーでログインし、ログイン後にrootに切り替えることになる。やっていこう。

　一般ユーザーを作るには以下を打つ。パスワードも設定する。

```terminal
# adduser vpsuser

# passwd vpsuser
```

　設定したら、一旦`exit`でサーバーから抜ける。

```terminal
# exit
```

　今度はつくったユーザーでログインしてみる。

```terminal
$ ssh vpsuser@xxx.xxx.xxx.xxx
```

　できたらOK。

```terminal
# su -
```

　これでrootユーザーに切り替えることができる。

#### rootユーザーによるログインを禁止する

　サーバーの中にある設定ファイルを書き換える。rootユーザーで作業する。

```terminal
# vim /etc/ssh/sshd_config
```

 vimが立ち上がってファイルを編集できるようになる。iと打ってインサートモードにしよう。

```diff_c
- #PermitRootLogin yes
+ PermitRootLogin no
```

 #をはずしてコメントアウトをなくす。

おわったらescキーでノーマルモードの戻してから':wq'を打つ。
保存されてもとの画面に戻る。

次のコマンドで再起動。設定を有効にする。

```terminal
# systemctl restart sshd.service
```

## 1-3.もう少し安全にする:鍵認証

#### 説明

鍵認証の説明は以下のやつがわかりやすい。

https://knowledge.sakura.ad.jp/3543/

#### 鍵の生成

まずはローカル環境に鍵をつくっていく。
ターミナルを開いて.sshフォルダがないか確認する。なければ作ろう。
アクセス制限もつける。

```terminal
$ cd
$ ls -a

$ mkdir .ssh
$ chmod 700 .ssh
```

.sshフォルダのなかでパスワードをつくろう。

```terminal
$ cd .ssh
$ ssh-keygen
```

ssh-keygen はいろいろオプションがあるが特に指定しなくても作れる。

これによって`id_rsa.pub`と`id_rsa`が作られる。
`id_rsa.pub`が公開鍵なので、こちらをサーバーにアップして覚えさせる。

いろいろやり方はあるが、内容をコピーしてvimでファイルを編集する時にペーストするやつがしっくりきた。それをやる。

```terminal
$ cat id_rsa.pub
```

これで表示される文面をコピーしておく。


#### サーバーへ公開鍵をアップロード

一般ユーザーでサーバーへログインして作業する。ホームディレクトに.sshフォルダがなければつくる。

```terminal
# mkdir .ssh
# chmod 700 .ssh
# cd .ssh
```

.sshフォルダの中に`authorized_keys`というファイルをつくる。

```terminal
# vim authorized_keys
```

vimが立ち上がるので、そこに先ほどコピーしておいた公開鍵をペーストする。
終わったら `:wq` 。
書き込み権限を変えておく。

```terminal
# chmod 600 authorized_keys
```


あとは一旦ログアウトして、鍵認証で入れるかテストする。


```terminal
$ ssh -i .ssh/id_rsa vpsuser@xxx.xxx.xxx.xxx
```

できたらOK


# 2. おわり

　まだつづくけど、きょうはここまで。
【Docker】React環境構築

## はじめに
　本記事は、プログラミング初学者、学習を進めていて疑問に思った点について調べた結果を備忘録も兼ねてまとめたものです。
　そのため、記事の内容に誤りが含まれている可能性があります。ご容赦ください。
　間違いを見つけた方は、お手数ですが、ご指摘いただけますと幸いです。

## DockerでReactの開発環境を構築する方法

```Dockerfile:Dockerfile
FROM node:14.17.5

ENV LANG=C.UTF-8
ENV TZ=Asia/Tokyo

WORKDIR /usr/src/app
```

```docker-compose.yml
version: '3'

services:
  frontend:
    build: .
    environment:
      - NODE_ENV=development
    volumes:
      - ./:/usr/src/app
    command: sh -c 'cd frontend && yarn start'
    ports:
      - '3000:3000'
    tty: true

```
Union-Find

[問題](https://atcoder.jp/contests/abc097/tasks/arc097_b)

各親に属する全ての子のfを1にする

f[i(全ての子)] = i(1) にできるなら ans++

```c++
struct UnionFind {vector<int> par; // uf(x,y)->y
    UnionFind(int NV) //宣言
    { par.clear(); rep(i, 0, NV) par.push_back(i); } //値の代入
    void reset() 
    { rep(i, 0, par.size()) par[i] = i; } //自身を親とする
    int operator[](int x) 
    { return par[x] == x ? x : par[x] = operator[](par[x]); } //自身が親か？
    void operator()(int x, int y) 
    {x = operator[](x); y = operator[](y);if (x != y) par[x] = y;}}; //同じ木か？
```

```c++
int N, M, P[101010]; 
vector<int> idx[101010]; //idx[親] = 子
int f[101010]; //

void _main() {
    cin >> N >> M; //頂点数、組数
    rep(i, 0, N) {
        cin >> P[i]; //整数
        P[i]--;
    }
 
    UnionFind uf(N);
    rep(i, 0, M) {
        int a, b; cin >> a >> b; //組
        a--; b--;
        uf(a, b);
    }
 
    rep(i, 0, N) idx[uf[i]].push_back(i);
 
    int ans = 0;
    rep(i, 0, N) {
        //j(親iである子全て)
        fore(j, idx[i]) f[j] = 1; //セット
        fore(j, idx[i]) if (f[P[j]]) ans++; //P[j](j番目の整数) 
        fore(j, idx[i]) f[j] = 0; //リセット
    }
    cout << ans << endl;
}
```
現役医師が立ち上げた、日本を救うスタートアップ。

#### 概要

脳血管内手術を飛躍的に進化させる新技術開発しているiMed Technologyについて書いていきます。

※この記事は、強く関心を寄せているトピックの問題提起のために個人が作成したものであり、医療従事者による記事でないことご理解・ご了承ください。尚、専門家の方からのご指摘があれば誠意を持って、対応・即時修正いたします。記事の質向上へのご協力大歓迎です。

#### 脳血管疾患は日本の死因第3位

2017年厚生労働省発表のデータによると脳梗塞やクモ膜下出血など脳血管疾患は日本の死因第3位です。
救急対応には、素早い対応と手術のできる医師を持つ病院での受け入れが不可欠になります。

従来主要だったクリッピング法（注1）やt-PT（注2）の課題を解決するとされる、「脳血管内手術」と呼ばれるカテーテル等を使用した負担の少ない手術が知られています。
しかし、難易度も高く日本では脳血管内治療ができる体制は不十分です。

（注釈）
1 くも膜下出血や未破裂の脳動脈瘤での従来の頭蓋骨を開く手術。患者への負担が大きい。
2 脳卒中の際、血管の詰まり溶かす点滴治療。太い血管の詰まりに有効性が低く、対応までの時間の制約がある。
　
> **地域ごとに大きな格差が**
> 
> 　日本でも血栓回収療法が「脳卒中ガイドライン2015（2017年追補版）」でGrade A（行うべき治療）として位置づけられており、徐々に広がりを見せていますが、脳血管内治療専門医（またはそれに準ずる医師）が対応可能な施設は限られており、体制整備は十分ではありません。
> 
> 　この治療には都道府県格差があり、10万人あたり全国平均では8.15人ですが、突出して高い高知県では20.25人です。また同一県内でも地域格差があるのが現状です。
> 
> ![img03.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1409234/205cf473-03c4-49fd-ab08-64a7b5eb67c1.jpeg)
> 表　人口10万人あたりの血栓回収療法数

参考：[広がる脳血管内治療の進歩と課題 ( 2018/11/16 )](https://www.senshiniryo.net/stroke_c/09/index.html)
 
#### 現役医師が立ち上げたスタートアップ

2019年設立とわずか3年のスタートアップiMed Technologyが開発する技術が注目されています。
現在全国の提携病院から提供を受けた100万枚のMRIの画像解析により、機械によるサポートを可能にするとのことです。

> **負担の少ないカテーテル手術のAI支援技術適応**
> 
> 　日進月歩を進めるテクノロジーやデバイスのおかげで、破裂した動脈瘤や10ミリ以上の未破裂動脈瘤なども脳血管内治療（カテーテル）が適応できるようになった。一方で、経験のある医師でも未だ難易度の高い手術である。足の付け根の動脈から挿入したカテーテルが血管を突き破ってしまわないよう4枚の X 線映像を見ながらミリ単位の調整を行う。複数の医師や助手が映像を見守り、危険な前兆が見えたら「危ない」と声を掛け合って事故を未然に防いでいるのが現状。
> 
> 参照1：広がる脳血管内治療の進歩と課題 ( 2018/11/16 )
> 参照2：脳血管内手術の手術支援AIを開発するiMed Technologies、初のエクイティファイナンスで1.7億円を調達

参考：[岡山の医療難民を助けたい](https://sites.google.com/view/okayama119/emergencyresponse)


#### 最新情報

今年1月に行われたジャパン・ヘルスケアビジネスコンテストで代表が登壇していました。

発表の中では、今年のサービスリリースを予定していることが伝えられました。
競合他社においては、手術支援ロボット開発の業種の他、Medtronic、Preferred Networks、Googleなどが画像診断技術の分野において競合企業になりえるとのことです。

質疑応答の中では、薬事法の認可取得においてサービスをどのようなカテゴリで進めていくか質問が上がりましたが薬事戦略上非公開とのコメント。
（※しかしながら代表の河野医師は、2020年4月から厚生労働省医政局医事課にも所属しており、認可取得はスムーズに降りるのではないかと期待されます。）

特許取得については、臨床現場を行いながら改良していった点についてもそれぞれ特許をとっていると報告しており、後に参入してきた競合への対策を講じていると述べていました。
リリース後の展望においては、世界の学会でガイドラインへの導入検討などがされると急速な普及が期待できると予想していました。
　
<iframe width="640" height="360" src="https://www.youtube.com/embed/qmbiqxTJ-SA" title="YouTube video player" frameborder="0" allow="accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture" allowfullscreen></iframe>
　

河野医師は、今も時折現場に経ちながら改良を進めているそうです。
とにかく事業内容も一点集中で取り組んでいる真っ直ぐな企業、競合に邪魔されずに展開してくれることを願っています。
　　
この企業を見つけた際、「探していたものが日本で開発進められてるんだ！」と感動してしまいました。
個人的にも手術体制の改善を切に願っていますし、私も画像・データの分野を極めてぜひ何らかの形で貢献できたらと密かな思いを抱いていたりもします。

ここまで読んでいただきありがとうございました。
 
 
 
#### 追記
始めて間もない中ですが、この記事で@koki_develop様集計のLGTMデイリーランキングで28位をいただきました。
![QiitaDailyRanking.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1409234/dc677780-74c8-065e-d062-da46a51ebe2a.png)
共変微分の交換関係メモ

# 結論
Riemannテンソルを
```math
R^\mu{}_{\alpha\beta\gamma}:=\Gamma^\mu{}_{\alpha\gamma,\beta}-\Gamma^\mu{}_{\alpha\beta,\gamma}+\Gamma^\mu{}_{\lambda\beta}\Gamma^\lambda{}_{\alpha\gamma}-\Gamma^\mu{}_{\lambda\gamma}\Gamma^\lambda{}_{\alpha\beta}
```
と定義すると以下が成り立つ．
```math
\begin{align}
&A^{\mu}{}_{;\alpha\beta}-A^{\mu}{}_{;\beta\alpha}= R^{\mu}{}_{\nu\beta\alpha}A^\nu\\
&A^{\mu\nu}{}_{;\alpha\beta}-A^{\mu\nu}{}_{;\beta\alpha}=R^{\mu}{}_{\rho\beta\alpha}A^{\rho\nu}+R^{\nu}{}_{\rho\beta\alpha}A^{\mu\rho}
\end{align}
```
# 導出
1階テンソルの共変微分は
```math
A^\mu{}_{;\alpha} = A^\mu{}_{,\alpha}+A^{\nu}\Gamma^{\mu}{}_{\nu\alpha}
```
である．これを$\beta$で共変微分する．
```math
\begin{align}
A^\mu{}_{;\alpha\beta} &= (A^\mu{}_{;\alpha})_{;\beta}\\
&= (A^\mu{}_{;\alpha})_{,\beta}+A^\nu{}_{;\alpha}\Gamma^{\mu}{}_{\nu\beta}\\
&= (A^\mu{}_{,\alpha}+A^{\nu}\Gamma^{\mu}{}_{\nu\alpha})_{,\beta}+(A^\nu{}_{,\alpha}+A^{\rho}\Gamma^{\nu}{}_{\rho\alpha})\Gamma^{\mu}{}_{\nu\beta}\\
&= A^\mu{}_{,\alpha\beta}+A^{\nu}{}_{,\beta}\Gamma^{\mu}{}_{\nu\alpha}+A^{\nu}\Gamma^{\mu}{}_{\nu\alpha,\beta}+(A^\nu{}_{,\alpha}+A^{\rho}\Gamma^{\nu}{}_{\rho\alpha})\Gamma^{\mu}{}_{\nu\beta} 
\end{align}
```
$\alpha$と$\beta$を入れ替えて
```math
A^\mu{}_{;\beta\alpha} = A^\mu{}_{,\beta\alpha}+A^{\nu}{}_{,\alpha}\Gamma^{\mu}{}_{\nu\beta}+A^{\nu}\Gamma^{\mu}{}_{\nu\beta,\alpha}+(A^\nu{}_{,\beta}+A^{\rho}\Gamma^{\nu}{}_{\rho\beta})\Gamma^{\mu}{}_{\nu\alpha} 
```
を得る．偏微分は交換するとしてこれらを辺々引くと
```math 
\begin{align}
A^\mu{}_{;\alpha\beta}-A^\mu{}_{;\beta\alpha} &= A^{\nu}\Gamma^{\mu}{}_{\nu\alpha,\beta}+A^{\rho}\Gamma^{\nu}{}_{\rho\alpha}\Gamma^{\mu}{}_{\nu\beta} - A^{\nu}\Gamma^{\mu}{}_{\nu\beta,\alpha}-A^{\rho}\Gamma^{\nu}{}_{\rho\beta}\Gamma^{\mu}{}_{\nu\alpha} \\
&=(\Gamma^{\mu}{}_{\nu\alpha,\beta}-\Gamma^{\mu}{}_{\nu\beta,\alpha}+\Gamma^{\mu}{}_{\rho\beta}\Gamma^{\rho}{}_{\nu\alpha}-\Gamma^{\mu}{}_{\rho\alpha}\Gamma^{\rho}{}_{\nu\beta})A^\nu\\
&=R^{\mu}{}_{\nu\beta\alpha}A^\nu
\end{align}
```
を得る．2階テンソルも同様である．
Vue/Cli3でSassを使用する方法

スタイルをめちゃくちゃ楽に書けるようにするSass。

この記事では、こんな風にVueでSassを使うための手順を紹介していきます。
```
<template>
  <div class="app__container">
    <h1>タイトル</h1>
  </div>
</template>
<style lang="sass">
.app__container
  width: 50%
</style>
```

## 前提条件
+ Vue/Cli 3で環境構築済み

コマンドラインで`vue -V`を実行して3.xと出ればOKです。

## Sassを使うための手順
Sassを使うためには2つパッケージをインストールすればいいのですが、Vue/Cliのバージョンによって、インストールするバージョンを変更する必要があります。なのでその点に注意してください。

バージョンさえ合っていればすぐに使えるようになります。

### ①node-sassのインストール
node-sassはバージョンしなければ7がインストールされますが、7だとエラーが起きるため6にダウングレードする必要があります。
`npm install node-sass@6.x`

### ②sass-loaderのインストール
sass-loaderも同じく、11以上のバージョンだとエラーが起きるため、10にバージョン指定しています。
`npm install sass-loader@10.x`

## Sassを使ってみる！
これでページトップのように style にlang="sass"を追加すればこれで使えるようになるはずです。

もし使えない場合は（無いとは思いますが）
+ バージョンが合っているか確認
+ 余計なパッケージをインストールしていないか確認

こちらを試してみてください。

## 参考
+ https://stackoverflow.com/questions/66082397/typeerror-this-getoptions-is-not-a-function
+ https://www.npmjs.com/package/sass-loader

## おまけ
ついでなのでCSSとSassを自動で変換してくれるツールがこちらです。
[CSS 2 SASS/SCSS CONVERTER](https://css2sass.herokuapp.com/)
プレフィックスリスト 作ってみた

## プレフィックスリストとは

プレフィックスリストの概要は [こちら](https://qiita.com/miyuki_samitani/items/141a192f6bef839de58e) をごらんください。
一言でいうと複数のCIDRブロックを一元管理することができるVPCの機能です。

## プレフィックスリストの作成

- VPCに移動し、プレフィックスリストを作成

![01マネージドプレフィックスリスト _ VPC Management Console - Google.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/129517/5469671d-6ad8-fc57-c827-f839aa89b778.png)


- 詳細設定を記載

プレフィックスリスト名とエントリ数を記載します。
今回はIPv4ですが、IPv6であればアドレスファミリーも変更してください

![02VPC Management Console - Google Chrome 2022-03-16.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/129517/89a35bd4-ec9f-9947-08de-f71ee4af2a8a.png)


エントリに関しては、今回は一旦ローカルIPで作ってみました。

![03VPC Management Console - Google Chrome 2022-03-16.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/129517/e45e4d8d-331f-bedd-4d90-f5d00c40e380.png)


書けたらプレフィックスリスト作成を行います。

- プレフィックスリストの完了

プレフィックスリストが作成できました。

![04VPC Management Console - Google Chrome 2022-03-16.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/129517/4fd31301-3b0c-bb70-bfa2-06e63059aebf.png)


- セキュリティグループに設定してみる

セキュリティグループの作成に移ります。

![05VPC Management Console - Google Chrome 2022-03-16.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/129517/e22cd2ef-5871-0f7b-7f89-7468f1fba524.png)


- セキュリティグループの詳細設定

セキュリティグループ名を記載します。

![06VPC Management Console - Google Chrome 2022-03-16.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/129517/af9af9da-ecd4-45ba-3e00-558dba122e28.png)


今回はインバウンドルールの80番ポートにプレフィックスリストを設定してみます。

![07VPC Management Console - Google Chrome 2022-03-16.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/129517/c1d740b1-8c40-e111-1759-88658c1844a5.png)


- セキュリティグループの作成完了

プレフィックスリストを使ってセキュリティグループを作ることができました！

![08VPC Management Console - Google Chrome 2022-03-16.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/129517/13c18a76-b23f-272f-ac4f-f3d515593258.png)
dp

[ナップサック dp](https://qiita.com/sibata_yuna/items/68fdca90e1c202e27e12) 
部分和、区間分割、比較

[ビットdp](https://qiita.com/sibata_yuna/items/fae47ebd9df69dc14a38)
ナップザックdpで情報が足りない時に使用

・訪れた頂点の情報をbitに持つ(巡回セールスマン)
・日ごとに参加する人の情報をbitに持つ(シフト制)

[区間dp](https://qiita.com/sibata_yuna/items/a326f54b87d0b2997c5d)
隣接するものを取り除く場合に使用

・値が近く、隣接するものを取り除く (だるま落とし)
・隣接する大きいほうを取り除く(ケーキの切り分け)
Ubuntu20.04 LTSでOSインストール後ログインできない


Ubuntu入れて、ユーザ名とパスワードを設定したのにログインできない問題が発生した。対処法を備忘録としてまとめる。

# リカバリーモードに入る
マシン起動直後にShiftキーかEscキーを押してリカバリーモードに入る。
詳しくは[こちら](https://www.kuzilla.co.jp/blog/20201014_ubuntu_login_recovery)

# ユーザ作成
```
passwd 'ユーザ名'
```

この通りに打っても、「passwd: user 'ユーザ名' does not exist」と表示される。
試しに
```
users
```

と打っても何も表示されない。そこでユーザ作ればいい!
```
adduser 'ユーザ名'
adduser: The group 'ユーザ名' already exists
```

しかし、エラー...
そこで
```
groupdel 'ユーザ名'
```

これでグループから削除する。そうすると、adduserが使えるようになる。
```
adduser 'ユーザ名'
gpasswd -a 'ユーザ名' sudo
```

これで解決。あとは普通にOSを起動するだけ。
コマンドプロンプトで「exit」を押し「resume」を選択してEnterするとログインができるようになる。
【Android】Googleマップアプリ駅の出発案内画面へのショートカットを手動で作成

# 問題
純正の「ショートカットを作成」ボタンで作成したショートカットは動作しなくなったりする
# 解決への導き
現在のAndroid Googleマップアプリは、駅を選択するとデフォルトで出発案内画面が表示される
# 解決
代わりにその駅の **Googleマップ 場所のURLリンク** をブックマーク等の形式でホームなどに配置
# 解決: 操作方法の一例
  - Chrome（PC / Android）でGoogleマップ（WEB, デスクトップ版）を開き、駅をクリックし、駅の詳細画面を表示させ、共有ボタンをクリック。
  - **場所のURLリンク** が表示され、それをコピーして保持しておく。
  - Taskerアプリでタスクを新規作成。アクションは「URLを開く」を１つ追加。URL入力欄に上のステップで取得したURLを貼り付けて保存。タスクを再生(実行)し、Googleマップアプリ駅の出発案内画面が表示されることを確認。（タスクを保存し、「戻る」ボタンでTaskerを閉じる）
  - Launcher（ホームアプリ）でショートカットを追加＞Taskerタスク＞上のステップで作成したタスクを選択、アイコンを設定し、ホーム画面に戻る。作成したTaskerタスクショートカットでGoogleマップアプリ駅の出発案内画面を一発表示させることができる。

# 補充説明
- この不具合はAndroidのショートカットシステム、Launcher(ホーム)アプリ、Intentと深いかかわりがあると見られる
- 不具合が発生すると、作成した全ての出発案内画面ショートカットが一斉に動作しなくなる。マップアプリのキャッシュクリア、データ削除（この時点でショートカットがLauncherホームアプリから削除される）、再インストールしても解決できない場合がある。
[Route53 ドメイン] 時々アクセスできる、時々NXDOMAINエラーが発生する

## はじめに
第 4 、5レベルサブドメインがあります (「help.cloud.example.link」など)。

ブラウザでドメインにアクセスする場合、
時々アクセスできる
時々NXDOMAIN（ERR_NAME_NOT_RESOLVED）エラーが発生する。

nslookupコマンドを実行して確認すると、結果は
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1901067/1c63bdd0-c6f2-5879-78fa-709942184a41.png)

## 原因
サブドメインの委任設定（NS レコード設定）が Cloudflare、OpenDNS　などの DNS リゾルバーで階層構造をたどって名前解決を実行する仕様を満たしていないことが原因となります。

具体的には、第 4 レベルサブドメイン(「help.cloud.example.link」など) NS レコードが第 2 レベルドメイン(「example.link」など)に配置されております。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1901067/bbe393cb-9b24-280e-d82c-d2bb7dc9572f.png)

## 対応方法
よって、別のホストゾーンに管理委任するための NS レコードを 1 つ近いレベルにあるサブドメインのホストゾーンにご配置ください。

例えば、
・「help.cloud.example.link」第 4 レベルホストゾーン用の NS レコードを、「cloud.example.link」第 3 レベルホストゾーンに配置します。
・「cdn.help.cloud.example.link」第 5 レベルホストゾーン用の NS レコードを、「help.cloud.example.link」第 4 レベルホストゾーンに配置します。

## 参考ドキュメント：
[サブドメインのトラフィックのルーティング | サブドメインの追加レベルのトラフィックのルーティング]
https://docs.aws.amazon.com/ja_jp/Route53/latest/DeveloperGuide/dns-routing-traffic-for-subdomains.html#dns-routing-traffic-for-sub-subdomains
>下位レベルのサブドメインに別のホストゾーンを作成することにした場合、ドメイン名に 1 つ近いレベルにあるサブドメインのホストゾーン内にある、下位レベルのサブドメイン用に NS レコードを作成します。これにより、トラフィックがリソースに正しくルーティングされます。
コンテスト用(まとめ)

## 基本アルゴリズム
全探索

[二分探索](https://qiita.com/sibata_yuna/items/dbc7a6235fa86491f72f)

[最短経路問題](https://qiita.com/sibata_yuna/items/9d3f03288422c96af632)

[深さ優先探索](https://qiita.com/sibata_yuna/items/d08932e39051026fec36)

[dp](https://qiita.com/sibata_yuna/items/8079261825d7d5f38516)

[最小全域木問題](https://qiita.com/sibata_yuna/items/31fd72887ff093bac3cc)

[高速な素数判定法](https://qiita.com/sibata_yuna/items/728f3fd08262a7c513f0)

[modint](https://qiita.com/sibata_yuna/items/6ea1c473bdc08d41f56d)

[累積和](https://qiita.com/sibata_yuna/items/b8dd7bf2582381c122aa)

## 基本データ構造
グラフ

木

[Union-Find](https://qiita.com/sibata_yuna/items/62c0e44eea08eca4bee4)

[segment tree](https://qiita.com/sibata_yuna/items/9971c33328b8c283da18)

## その他
[標準ライブラリ](https://qiita.com/sibata_yuna/items/18ff7c47e5e1e9ba886a)

[実行時間計測](https://qiita.com/sibata_yuna/items/bdeb9b96020e11cb3bed)

[エラー確認](https://qiita.com/sibata_yuna/items/2a93399471a2b1c4482b)
レーベンシュタイン距離

[問題](https://algo-method.com/tasks/315)

変更 ⇒ Sが1つ消え、Tが1つ増える(基本的に使用)

削除 ⇒ Sが1つ消える(Sの文字が多いときのみ)

挿入 ⇒ Tが1つ増える(Sの文字が少ないときのみ)


```c++
// 入力
int n, m;
string S, T;

// DP テーブル
int dp[1010][1010]; //[S : i番目][T : j番目]

int main() {
  cin >> S >> T;

  // 初期化
  for (int i = 0; i < 1010; ++i) for (int j = 0; j < 1010; ++j) dp[i][j] = INF;
  dp[0][0] = 0;

  for (int i = -1; i < (int)S.size(); ++i) {
    for (int j = -1; j < (int)T.size(); ++j) {
      if (i == -1 && j == -1) continue;   //dp[0][0] 
      if (i >= 0 && j >= 0) { //変更
        if (S[i] == T[j]) dp[i+1][j+1] = min(dp[i+1][j+1], dp[i][j]); //既に同じ
        else dp[i+1][j+1] = min(dp[i+1][j+1], dp[i][j] + 1); //異なる
      }
      if (i >= 0) dp[i+1][j+1] = min(dp[i+1][j+1], dp[i][j+1] + 1); //削除
      if (j >= 0) dp[i+1][j+1] = min(dp[i+1][j+1], dp[i+1][j] + 1); //挿入
    }
  }

  cout << dp[S.size()][T.size()] << endl;
}
```
GitHub Actions の composite で環境変数をセットする方法

# 問題点
GitHub Actions で環境変数を用意したいとする。

[ドキュメント](https://docs.github.com/en/actions/creating-actions/metadata-syntax-for-github-actions#inputs) には以下のように記述することで環境変数が設定できると書かれている。

```yaml
inputs:
  numOctocats:
    description: 'Number of Octocats'
    required: false
    default: '1'
  octocatEyeColor:
    description: 'Eye color of the Octocats'
    required: true
```

上記の YAML を定義すると `INPUT_NUMOCTOCATS` や `INPUT_OCTOCATEYECOLOR` という変数が使えるようになる[^1]、とのこと。

[^1]: 細かいルールは次のとおり。1. `INPUT_` という接頭辞がつく。2. すべて大文字に自動変換される。3. スペースは `_` に自動変換される。つまり今回の場合、`numOctocats` の部分が `NUMOCTOCATS` に変換され、先頭に `INPUT_` が付与され `INPUT_NUMOCTOCATS` となる。`octocatEyeColor` も同様。

しかし、残念ながらこれは [`composite`](https://docs.github.com/en/actions/creating-actions/creating-a-composite-action) の場合は使えない。



# 解決策
[ここ](https://github.community/t/input-variable-name-is-not-available-in-composite-run-steps/127611/2) に書かれているとおり、`env` を使って自分で定義すると良いとのこと。

```yaml
inputs:
  numOctocats:
    description: 'Number of Octocats'
    required: false
    default: '1'
  octocatEyeColor:
    description: 'Eye color of the Octocats'
    required: true

runs:
  using: 'composite'
  steps:
    - run: echo ${INPUT_NUMOCTOCATS}, ${INPUT_OCTOCATEYECOLOR}
      shell: sh
      env:
        INPUT_NUMOCTOCATS: ${{ inputs.numOctocats }}
        INPUT_OCTOCATEYECOLOR: ${{ inputs.octocatEyeColor }}
```

これで環境変数 `INPUT_NUMOCTOCATS` と `INPUT_OCTOCATEYECOLOR` が使えるようになった。

ちなみにここでは `composite` ではない場合の自動生成と同じ環境変数名にしているが、同じにする必要は特にない。
ミドルウェアとは

https://lanchesters.site/%E3%83%9F%E3%83%89%E3%83%AB%E3%82%A6%E3%82%A7%E3%82%A2%E3%81%A8%E3%81%AF/

・サーバの構成「OS↔︎ミドルウェア↔︎ソフトウェア」の中間に位置する


WEBサーバの代表的なミドルウェアは、Apache
APサーバの代表的なミドルウェアは、Tomcat
DBサーバの代表的なミドルウェアは、MySQLやOracle
（独習Ruby on Rails）フォームオブジェクトを利用したバリデーション

# 概要
ある程度勉強を進めていたけれど、あまりにも基礎が不足しているので書籍「独習Ruby on Rails」をやり始めたのだけれど、フォームバリデーションのところでサンプルコードどおりに入力しても全然動かなかったのでその対応をメモとして残す。

## 環境
・Rails 7.0.2.2
・ruby 3.0.0
・macOS Monterey 12.2.1

## フォームオブジェクトによるバリデーション

### 例題概要
- 書籍の例題としてはフォームオブジェクトを利用したバリデーションで利用規約のチェック機能を実現するというもの。
- チェックボックスではなくテキストフィールドに'yes'と入力した場合に正常形として画面遷移し、それ以外はエラーを表示するというもの。

（サンプルイメージ）

![スクリーンショット 2022-03-17 0.08.44.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/600163/c88626c1-2a4c-0716-8891-ef83c8487f98.png)

・ここでyes以外を入力またはブランクで「承認」を押下

![スクリーンショット 2022-03-17 0.11.51.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/600163/89df1228-8538-643f-b449-f9bc6b17bc11.png)

この「Accepting must be accepted」のメッセージを表示するのに手こずった。

### 原因
バリデーションでエラーと判定されているが、renderでViewにオブジェクトが渡された際にエラーが０件の状態で渡されていたため。
以下のとおりrender処理時の引数「status」に適当なエラーデータを渡すことでバリデーションの結果をViewに表示できるようになった。

```ruby
class AcceptancesController < ApplicationController
  def new
    @acceptance = Acceptance.new
  end

  def create
    @acceptance = Acceptance.new(acceptance_params)
    if @acceptance.valid?
      puts '承諾されました！！'
      redirect_to books_path
    else
      # ここで「status:」としてエラーであるという情報を渡さないといけない。
      #　（statusを明示的に渡さないと処理が200OKのステータスになってしまう）
      render :new, status: :unprocessable_entity
    end
  end

  private

  def acceptance_params
    params.require(:acceptance).permit(:accepting)
  end
end
```

### 最後に
書籍の方はRails５が前提なので、Rals7との仕様差異なのかもしれないけど全然情報がなくてなかなか答えに辿りけなかった。

Udemyの講座がRails７に対応してくれていたので助かった...
まだ途中までしかやってないけどわかりやすくておすすめです。
https://www.udemy.com/course/the-ultimate-ruby-on-rails-bootcamp/

Udemyさん、また講座買います!!（いつとは言っていない）
Mermaid のフローチャートで同じ名前のオブジェクトを複数作成する方法

この記事では [Mermaid](https://mermaid-js.github.io/mermaid/#/) を使用しています。Mermaid の図が正しく表示されない場合は [Zenn の記事](https://zenn.dev/noraworld/articles/mermaid-duplicate-objects) でご覧ください。

# やりたいこと
[Mermaid](https://mermaid-js.github.io/mermaid/#/) で以下のようなフローチャートを作りたいとする。

```
        C --- D
       /       \
A --- B         E --- F
       \       /
        C --- D
```

そして、以下のような Mermaid のフローチャートを書いたとする。

```
flowchart LR
    A --- B --- C --- D --- E --- F
    B --- C
    D --- E
```

しかし、これだと以下のように出力されてしまう。

```mermaid
flowchart LR
    A --- B --- C --- D --- E --- F
    B --- C
    D --- E
```

以下のように書いた場合も同じ出力になる。

```
flowchart LR
    A --- B
    B --- C
    B --- C
    C --- D
    D --- E
    D --- E
    E --- F
```

```mermaid
flowchart LR
    A --- B
    B --- C
    B --- C
    C --- D
    D --- E
    D --- E
    E --- F
```

同じ文字列のオブジェクトを複数箇所で書くと、それらは単一のオブジェクトとみなされ、二重結合してしまう。



# 正しい書き方
同じ文字列のオブジェクトを複数作成したい場合は、以下のように ID と文字列を別々に定義すれば良い。

```
flowchart LR
    A --- B --- c1[C] --- d1[D] --- E --- F
          B --- c2[C] --- d2[D] --- E
```

上記の例のように、`C` ではなく `c1[C]`、`c2[C]` のようにすることで、見た目上は同じ `C` となるが、別々のオブジェクトとして区別される。`D` も同様。

ID (上記の例でいう `c1`, `c2`, `d1`, `d2` の部分) はかぶらなければ任意の文字列を設定できる。単なる識別子で、出力結果には表示されない。

上記を出力すると以下のようになる。

```mermaid
flowchart LR
    A --- B --- c1[C] --- d1[D] --- E --- F
          B --- c2[C] --- d2[D] --- E
```



# 参考サイト
* [Flowchart ― Mermaid](https://mermaid-js.github.io/mermaid/#/flowchart)
* [Duplicate objects in two directions #1231](https://github.com/mermaid-js/mermaid/issues/1231)
認証と認可

https://dev.classmethod.jp/articles/authentication-and-authorization/
●認証（Authentication）・・・通信の相手が誰（何）であるかを確認すること

パスワード認証、顔認証、生体認証、SMS(ショートメッセージサービス)による認証、家の鍵や車の鍵

認証強化の例・・・ログイン時に使用する情報として知識情報・生体情報・所持情報を組み合わせる「多要素認証」を導入することで、情報システムへの不正な侵入を防ぐことができます

 

●認可（Authorization）・・・何かしらの権限や権利を与える事を指します

チケットを購入した人・・・利用することが出来るという権限(認可)

認可強化の例・・・それぞれのログインアカウントへ与える権限を最小化させることで、仮に不正アクセスが発生したとしても、被害を最小限に防ぐことが可能になります
【Pythonanywhere】環境変数の設定（SECRET_KEYなど）

## 環境
+ PythonAnywhere
+ Python 3.9
+ GNU bash 5.0.17(1)-release (x86_64-pc-linux-gnu)

## ディレクトリ構成
```:ディレクトリ構成（一部）
/
 └ home/
    └ USERNAME/
       └ mysite/
          ├ static/
          ├ templates/
          ├ .env
          └ flask_app.py
```

## 手順
### 1. 環境変数をプロジェクトフォルダー直下の `.env` に保存
1. [Bash Console を用いる方法](#1-1-bash-console-を用いる方法)
1. [直接 .env を作成する方法](#1-2-直接-env-を作成する方法)

#### 1-1. Bash Console を用いる方法
Consoles タブをクリックし、Bash Console で以下を実行
```bash:Bash
cd ~/mysite
echo "export SECRET_KEY=sekritvalue" >> .env
echo "export OTHER_SECRET=somethingelse" >> .env
```
#### 1-2. 直接 `.env` を作成する方法
Files タブをクリックし、プロジェクトフォルダー直下に `.env` を作成
```text:.env
SECRET_KEY=sekritvalue
OTHER_SECRET=somethingelse
```
### 2. `python-dotenv` のインストール
1. [virtualenv を使用している場合](#2-1-virtualenv-を使用している場合)
1. [virtualenv を使用していない場合](#2-2-virtualenv-を使用していない場合)

:::note warn
古いバージョンでは `.env` ファイルの行頭で `export` を処理できないため、少なくともバージョン0.8の `python-dotenv` パッケージであることを確認する。
:::


#### 2-1. `virtualenv` を使用している場合
```bash:Bash
workon my-virtualenv-name
pip install python-dotenv
echo python-dotenv >> requirements.txt # 必要であれば
```

#### 2-2. `virtualenv` を使用していない場合
```bash:Bash
python3.8 -m pip --user install python-dotenv
echo python-dotenv >> requirements.txt # 必要であれば
```
詳しくはこちらを参考に

https://qiita.com/probabilityhill/items/ed49b4ec81eaea6952a7

### 3. 環境変数を利用できるようにする
環境変数の利用が
1. Webアプリ自体の場合
→ [3-1. WSGI ファイルに .env ファイルをロード](#3-1-wsgi-ファイルに-env-ファイルをロード)
 （インターネット上で実際にWebアプリを提供しているワーカープロセスが環境変数を利用できるようにする）
1. Bashコンソールの場合
→ [3-2. virtualenv の postactivate スクリプトに .env ファイルをロード](#3-2-virtualenv-の-postactivate-スクリプトに-env-ファイルをロード)
 （データベースの移行を実行している、またはWebアプリと他のコマンドライン操作を行っている）

#### 3-1. `WSGI` ファイルに `.env` ファイルをロード
Web タブをクリックし、Code 欄の `WSGI` ファイルへのリンク `/var/www/USERNAME_pythonanywhere_com_wsgi.py` をクリック -> 末尾に以下のコードを追加
```py
# このファイル内で project_home = '/home/USERNAME/mysite' と設定されている前提

import os
from dotenv import load_dotenv

# プロジェクトフォルダ直下に.envを置く場合
load_dotenv(os.path.join(project_home, '.env'))

# プロジェクトフォルダ直下に置かない場合
project_folder = os.path.expanduser('~/mysite')
load_dotenv(os.path.join(project_folder, '.env'))
```
##### 環境変数の使用法
`os.getenv` で変数にアクセスできるようになる
```py:py
import os
SECRET_KEY = os.getenv("SECRET_KEY")
```

#### 3-2. `virtualenv` の `postactivate` スクリプトに `.env` ファイルをロード
Bashコンソールで `.env` ファイルから環境変数をロード
```bash:Bash
set -a; source ~/mysite/.env; set +a
```
Webアプリに `virtualenv` を使用していると仮定し、`virtualenvwrapper/workon` を使用していると仮定すると、Bashコンソールセッションで使用できる環境変数を設定する便利な場所は、`postactivate` と呼ばれる特別なスクリプト。 `virtualenv` をアクティブ化するたびに自動的に実行される。一般的な場所は、`/home/USERNAME/.virtualenvs/my-project-virtualenv/bin/postactivate`

上記の `source` コマンドを `postactivate` スクリプトに追加
```bash:Bash
echo 'set -a; source ~/mysite/.env; set +a' >> ~/.virtualenvs/my-project-virtualenv/bin/postactivate
```
例えば、`workon my-project-virtualenv` を使用して `virtualenv` をアクティブ化し、次に `echo $SECRET_KEY` を実行して、これをテストする。

これで、環境変数がWebアプリと `virtualenv` の両方に自動的に読み込まれる。

## 参考
https://help.pythonanywhere.com/pages/environment-variables-for-web-apps/
システム開発の流れとは

## システム開発の工程(ウォーターフォール)

1. **要件定義（要求定義）**
    1. 新しく開発するシステムにどんな要素を盛り込みたいか明確にする
    2. 予算や人員、期間を計画していく
    3. システム開発を行う目的やターゲットについて打ち合わせを行う
    4. 特にウォーターフォールでは最初の打ち合わせで決定する計画こそが重要となり、システム開発の最終的な完成に相違がないように打ち合わせでしっかり認識を合わせる必要がある
2. **外部設計**
    1. 要件定義をもとにユーザーインターフェースを設計する
    2. ユーザーの使い勝手に直結するので打ち合わせの内容をしっかり詰める
3. **内部設計**
    1. 外部設計が決まったら内部のプログラミングの設計。開発者側の視点でシステムの設計をする。
4. **プログラミング**
    1. 内部設計を元にプログラムの作成を行う
5. **単体テスト**
    1. 実際に作成したプログラムの一つ一つが要件定義の基準を満たしているかを確認する。
    2. 単体テストではモジュールごとにテストする。
6. **結合テスト**
    1. 複数のプログラムを組み合わせた状態でそれらがうまく機能するかの検証をする
    2. データの受け渡しの際にプログラムが正常に連携するかなど。
7. **システム総合テスト**
    1. 全てを含めたシステム全体のテストを行う。すべてのプログラムが要件定義の通りに動くの確認する工程。多くのアクセスへの耐久性や処理速度のテストなど。
8. **運用テスト**
    1. 無事システムテストをクリアしたら実際の業務取り入れられるかのテストを行う
    2. 実際の環境下でシステムに不具合がないかを確認する。
    3. 実用性に重点をおいてテストする
9. **システム移行**
    1. システムを実際に使えるように移行する工程。
    2. 一気に切り替える一斉移行、徐々に切り替える順次移行などがある。
10. **運用・保守**
    1. 運用に問題ないようメモリの利用状況などを確認する工程。
    2. よりよい状態で使えるように随時アップデートを行う。
    3. 持続的にシステムを活用し続けるために常にシステムを監視する必要がある

## 開発手法

### **ウォーターフォール**

上記のように上流工程から下流工程へ、順に行っていく。

<aside>
💡 メリット

- 進捗状況の把握が容易
- 計画的に工程が進むため品質が担保しやすいということ
- スケジュール管理が必要な大規模なシステム開発に向いている
</aside>

<aside>
💡 デメリット

- 開発に時間を要する
- スピード感が重要な新規事業には向いていない
</aside>

### **アジャイル**

ウォーターフォールのような工程を順に行う決まりはなく、スピード感のある開発方法。

全体を作りつつ随時変更や修正を行っていく。とりあえず作って、修正を加えながら開発をしていく。

<aside>

💡 メリット
- スピーディーな事業展開が求められる新規事業に向いている
- 素早く成果物をつくることができる
</aside>

<aside>
💡 デメリット

- 全体像のわかりずらい大規模なシステムには向いていない
</aside>

## 覚えておきたい略語

<aside>
💡 **システム開発用語の略語**
**企画 / SP**
**要求分析 / SA**
**システム方式設計要求分析 / SA**
**要求分析 / SA**
**要件定義 / RD–UI**
**基本設計 / UI**
**基本設計 / BD**
**構造設計 / SS**
**機能設計 / FD**
**詳細設計 / DD**
**詳細設計 / PD**
**詳細設計 / PS**
**プログラム設計 / PD**
**コーディング / CD**
**プログラミング / PG**
**総合テスト / PT**
**運用テスト / OTO**
</aside>

とりあえず工程について復習ついでにまとめてみた。

書いてる最中に地震＆停電でびっくりした、、、
Blenderでパズルのアニメーション

## Blenderでパズルのアニメーション

Blender3.1で、パズルのアニメーションをするPythonで作成したアドオンの紹介です。

<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/13955/c5fa72ec-3881-85cf-f68f-4188e4f409f3.gif" width="300">

## パズルのルール

- アイテムを動かして、各棒のアイテムが揃ったら完成
- アイテムは上からしか動かせない
- 移動先は、空の棒か同じアイテムの上でないといけない
- 1本の棒は4つまでしかおけない
- 同じアイテムは同時に動かせる

## アドオン動作の前提条件

- 3本以上の棒といくつかのアイテムが必要です。いずれも`puzzle`というコレクションに入っている必要があります。
- アイテムは、焼き鳥のように棒に刺さっている必要があります。
- 棒の高さは揃えてください。アイテムの高さは棒を4分割したくらいの高さで揃えてください。
- アイテムはマテリアルで区別します。1つのマテリアルにちょうど4つのアイテムが必要です。

## やり方

- [Puzzle-Anim（Blender Add-on）](https://github.com/SaitoTsutomu/Puzzle-Anim)をインストールしてください。
- サイドバーの編集タブの「Puzzle Anim」を開いてください。
- 「Make sample」を押してください。サンプルのオブジェクトを作成します。
- 「Make animation」を押してください。パズルを解くアニメーションがはじまります。

## 変更してみよう

棒とアイテムは下記のようにいくつでも置いたり場所も変えられます。
※ アイテムの追加は、アニメーションをクリアしてから行ってください。アニメーションが残っていると、追加時に位置が再設定されます。

<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/13955/67fca9b3-81af-e931-0fd8-58e92bc732e6.jpeg" width="300">

アイテムを変更したら、再度、「Make animation」を押すと新しいアニメーションがはじまります。

## ロジック

- puzzuleコレクションのオブジェクトの高さを2つにクラスタリングして、高い方を棒と認識し、残りをアイテムと認識します。
- 棒の位置を初期値にして、xy座標でクラスタリングして、各棒に刺さっているアイテムを識別します。
- 深さ優先探索で解を探索します。
- 解からアニメーションを作成します。

※ クラスタリングは、自前でkmeansで行っています。

以上
【チーム団欒ノスヽメ】GitHub のコメントに自動で LGTM 画像を投稿しよう

# はじめに
筆者が所属しているプロジェクトのチームでは、GitHub の Issue や PR で "LGTM" を含むコメントをすると LGTM 画像が投稿される。

![](https://raw.githubusercontent.com/noraworld/developers-blog-media-ja/master/lgtm-github-actions/Screen%20Shot%202022-03-08%20at%2021.46.27.png)

上記のスクリーンショットの例では釜玉うどんの LGTM 画像が表示されているが、この画像は毎回ランダムで表示される。

この記事では、これの導入方法について解説する。



# 何か意味あるの？
一見すると何の生産性も上がらない無駄なもののように思えるが、潜在的には必ずしもそうとは限らないと筆者は考えている。

たしかに業務の効率化などには全くならないかもしれないが、チーム内の話のネタや雰囲気作りになり、それによりコミュニケーションが円滑にできるようになり、結果的にチーム全体としての生産性は上がるのではないかと思っている。

実際、筆者が所属しているプロジェクトでも、この LGTM 画像をきっかけに Slack で会話が弾んだりしてコミュニケーションが取れることがよくある。

業務においてコミュニケーションが取りやすいというのはかなり重要である。何かわからないことがあったときに気軽に質問できる雰囲気、困ったことがあったときに相談できる雰囲気があるチームのほうが、経験上、仕事もうまくいくことが多いように感じる。

そういう観点でいえば導入する価値はあるのではないだろうか。毎回どんな LGTM 画像が出るのかというガチャ的な要素もあって PR にコメントするのが楽しくなるのもメリットの一つだ。



# 導入方法
すでにこれを実現するサービスと GitHub Actions が存在する。それらを利用することで、とても簡単に導入することができる。

* [LGTMoon](https://lgtmoon.dev)
* [action-lgtmoon](https://github.com/Doarakko/action-lgtmoon)

`.github/workflows/main.yml`[^1] というファイルを作成し、その中に以下の設定を追加するだけで良い。

[^1]: `.github` は隠しディレクトリである点に注意。

```yml:.github/workflows/main.yml
name: LGTM
on:
  issue_comment:
    types: [created]
  pull_request_review:
    types: [submitted]
  pull_request_review_comment:
    types: [created]

jobs:
  lgtm:
    runs-on: ubuntu-latest
    steps:
      - name: LGTM
        uses: Doarakko/action-lgtmoon@v1.0
        if: >-
          contains(github.event.comment.body, 'lgtm')
          || contains(github.event.review.body, 'lgtm')
        with:
          github-token: ${{secrets.GITHUB_TOKEN}}
```

特に書き換える必要がある部分はない。`${{secrets.GITHUB_TOKEN}}` もそのままで良い。

バージョンは `v1.0` に固定すること。`v1.1` は正常に動作しない[^2]。

[^2]: https://github.com/Doarakko/action-lgtmoon/issues/3 が解決されたら、解決されたあとのバージョンや `@main` を指定しても良いかもしれない。

## ファイル名は任意
ファイル名は `main.yml` である必要はない。他の GitHub Actions のファイルもある場合は、わかりやすく `lgtm.yml` とかにしても良いかもしれない。

## ディレクトリは固定
ファイルを置く位置は `.github/workflows` とすること。

## ブランチはデフォルト
GitHub Actions はデフォルトブランチに上記のような YAML ファイルがないと動作しない。つまり、`main` ブランチや `develop` ブランチなどがデフォルトブランチだった場合はそのブランチにファイルがないといけない。

そのため、**トピックブランチを切って上記の YAML ファイルを作成して、デフォルトブランチにマージする PR を作っても、その時点では動作しない** 点に注意すること。

裏を返せば正しく動作するかどうかはデフォルトブランチにマージしてみないとわからない。デバッグがしづらいのが GitHub Actions の弱点だろうか。



# 動作確認
デフォルトブランチに上記の YAML ファイルを作成したら、実際に動作確認してみよう。

適当にテスト用の Issue を作って "LGTM" を含むコメントをした際に、`github-actions` という bot からランダムな LGTM 画像が投稿されれば正しく動作している。

Issue だけでなく PR でも同様に機能するはずだ。



# 参考サイト
* [【LGTMoon】LGTM すると自動で LGTM 画像が投稿される GitHub Actions を作りました](https://zenn.dev/peperoncicicino/articles/f92bfc548d7b72)
GitHub Actions で Git の操作 (前のコミット ID 取得など) がうまくいかないときの対処法

# GitHub Actions で Git の操作をする方法
GitHub Actions で YAML 内に以下を追加すると Git の操作ができるようになる。

```yaml
- uses: actions/checkout@v2
```

たとえば、push 時に発火して、push 直前のコミットと最新のコミットの間で変更されたファイル一覧を取得したかったとする。

```yaml
run: git diff --name-only ${{ github.event.before }} ${{ github.sha }} | xargs
```

# エラー
しかし、これを GitHub Actions 上で実行すると以下のようなエラーが出る。

```
fatal: bad object 1486f018f2a4958801fef8059f264d8101203404
```

ローカルに clone してきて同じコマンドを実行するとうまくいく。

# 解決策
`fetch-depth` を追加する。

```yaml
- uses: actions/checkout@v2
  with:
    fetch-depth: 0
```

[この記事](https://zenn.dev/satococoa/articles/e026c0689e5678) に以下のように書かれている。

>actions/checkout@v2ではチェックアウト時の時間短縮のために指定されたブランチの先頭コミットしか取得(fetch)してきません。

引用元: https://zenn.dev/satococoa/articles/e026c0689e5678

先の例では、`fetch-depth` を指定しないと、push 直前のコミットが取得できないのでエラーになってしまっていた、ということ。

# 参考
* [GitHub Actionsで特定のコミットをcheckoutしてワークフローを実行する](https://zenn.dev/satococoa/articles/e026c0689e5678)
* [Changed files](https://github.com/tj-actions/changed-files)
* [Get changed files in github actions](https://dev.to/scienta/get-changed-files-in-github-actions-1p36)
ビッグデータとはなんぞや

# ビッグデータを一言でまとめると
従来のデータベース管理システムなどでは記録や保管、解析が難しい __巨大なデータ群__ のことです。

# 概要
一言で言うと __巨大な__ データ群ということになりますが、量意外にも大切な特性があります。
それが3Vと呼ばれる3つの特性です。
__・Volume：データの量__
　→膨大なデータがあること
__・Variety：データの種類__
　→偏ったデータではなく、多種多様なデータがあること
__・Velocity：データの発生頻度/更新頻度__
　→データがリアルタイムで収集されていること


ビッグデータにははっきりした定義がないため、これら3つ全ての条件を満たすものもあれば、1つだけを満たすものもあります。

# ビッグデータが着目されるようになった背景
一昔前までは企業の3大経営資源は __「ヒト・モノ・カネ」__ であると言われてきました。
それが最近では、この3大経営資源に __「情報」__ が追加され4大経営資源と言われるようになるほど、情報の優先順位は上がってきています。情報が溢れている昨今、この情報をどのように扱うかが企業の永続的な繁栄に不可欠な要素となっています。

他にもIoTとAIの発展が挙げられます。
`IoT対応機器の増加に伴い、大量に集まったデータ（≒ビッグデータ）を、AIを駆使して解析し、最適な解を求める。`という流れが企業の意思決定の方法として注目されるようになりました。
これにより、新三種の神器とよばれる、「[IoT](https://qiita.com/7_inai_/items/f2a56498b70b39befa0b)、ビッグデータ、[AI](https://qiita.com/7_inai_/items/095f95279a7257eaa01b)」は相互的に発展してきました。


# 導入事例
■ポイントカード
なぜ小売店ではお客さんに対して積極的にポイントカードを作成するように勧めるのかをご存知でしょうか?
いくつか理由はありますが、最も大きな理由は顧客の囲い込みとデータ分析です。
1つ目の顧客の囲い込みに関しては、皆さん知っていたと思いますが、もう1つの顧客のデータ分析という目的は知っていたでしょうか?
ポイントカードを作成する時には「住所、性別、生年月日」のような個人情報を記入しますよね。その情報と顧客毎に購入した商品を結びつけています。そうすることで、「この商品は色んな人が買っているのか、それともヘビーユーザーがいるのか」ということや「性別や年齢による購入対象の違い」といった多くの情報（ビッグデータ）をポイントカードを活用して集客しています。

■製造工場でのばらつき分析
同品種を大量生産するような工場では、規格内のモノを大量に作ることが求められます。しかし、実際には規格を超過し廃棄処分となるモノも多くあります。工場では、全く同じ条件で作業しているつもりでも実際には、機械の経年劣化や、天気の変化により微妙な誤差が生じていることもあります。そういった誤差をなくすために今までは、職人の勘に頼っていた部分も多くありましたが、作業者による差を無くそうという考え方が最近のトレンドです。そこで、今まで計測仕切れていなかった条件と作られたモノを、ビッグデータとして集計・分析することで製品を作る際の最適解を求めることができます。


# 終わりに
ビッグデータの定義は少し曖昧でどこからがビッグデータと呼ばれるというような線引きはありません。
大量のまたは色んな種類のデータがビッグデータとして扱われヒトが答えを出す際に使われているというくらいの感覚で捉えられればいいと思います。

最後までお付き合いありがとうございました。
VoltaをinstallしたけどAngularが使えないんだけど

# Angularがインストールできない
Voltaをinstall時にAngualrがインストールできませんでした。
表示されたエラーは以下の通りです。
```sh
C:\Users\○○>npm install --global @angular/cli

added 190 packages, and audited 191 packages in 30s

23 packages are looking for funding
  run `npm fund` for details

found 0 vulnerabilities
Volta error: Could not create shared environment for package '@angular/cli'

Please ensure you have correct permissions to the Volta directory.
Error details written to C:\Users\○○\AppData\Local\Volta\log\volta-error-2022-03-16_22_39_12.457.log
```

どうやらvolta側に問題がありそうだが・・・。
```sh
Please ensure you have correct permissions to the Volta directory.
```

# 解決法[^1]
:::note info
- 開発者モードを有効にする（推奨）
- 昇格された特権でVoltaを実行する（非推奨）
:::



# 開発者向け設定とは
タスク バーの Cortana 検索ボックスに「開発者向け」と入力する

![Coltana検索「開発者むけの設定」](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2600119/9c5598dc-6914-e95c-8454-c0d8b77e0905.png)

開発者モードをオンにする
![開発者モードをオンにする](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2600119/ba02e561-cbfd-e9f5-4d7d-c7987b499916.png)

# まとめ
ドキュメントはちゃんと見ましょう

### Thank you charles

https://github.com/volta-cli/volta/issues/928


[^1]:https://docs.volta.sh/guide/getting-started
[JavaScript] functionとアロー関数の違い

# function
```javascript
function showNameFunction() {
  this.name = 'wadayamada';
  console.log(this);
}

showNameFunction();
```
### Output
```javascript
<ref *1> Object [global] {
  global: [Circular *1],
  clearInterval: [Function: clearInterval],
  clearTimeout: [Function: clearTimeout],
  setInterval: [Function: setInterval],
  setTimeout: [Function: setTimeout] {
    [Symbol(nodejs.util.promisify.custom)]: [Function (anonymous)]
  },
  queueMicrotask: [Function: queueMicrotask],
  clearImmediate: [Function: clearImmediate],
  setImmediate: [Function: setImmediate] {
    [Symbol(nodejs.util.promisify.custom)]: [Function (anonymous)]
  },
  name: 'wadayamada'
}
```

# アロー関数
```javascript
const showNameArrowFunction = () => {
  this.name = 'wadayamada';
  console.log(this);
};

showNameArrowFunction();
```
### Output
```javascript
{ name: 'wadayamada' }
```
rails db:reset コマンドの挙動について

# はじめに
１月〜プログラミングスクールで学習しています。
これから平日は~3/25まで毎日何かしらアウトプットのため投稿を続ける予定です。
rails db:resetコマンドを実行した際に疑問に思った事があったのでメモを残します。
※Ruby2.6.5の環境を使用し学習しています。

# 経緯
以前書いた`rails db:migrateを実行した時に出たエラーを解決した話`で書いていなかったのですが、
`rails db:reset`を実行後、再度`rails db:migrate`を実行してしまい、何も出力されずプロンプトが返ってきました。
そこで`rails db:reset`が気になり調べてみました。

# 調べた結果
結論としては下記のような動きをしているようです。
[4.3 データベースをリセットする](https://railsguides.jp/active_record_migrations.html#%E3%83%87%E3%83%BC%E3%82%BF%E3%83%99%E3%83%BC%E3%82%B9%E3%82%92%E3%83%AA%E3%82%BB%E3%83%83%E3%83%88%E3%81%99%E3%82%8B)
- 以下Railsガイドを引用
>bin/rails db:resetコマンドは、データベースをdropして再度設定します。
このコマンドはrails db:drop db:setupと同等です。

`rails db:reset`を実行すれば削除から作成して反映まで全てやってくれているようです。
なので、`rails db:migrate`をする必要が無かったんですね。
（resetコマンドで既にmigrateしてる）という事を分からず使っていました。。。
基本情報技術者試験対策　7日目

基本情報技術者試験勉強　7日目
-
この記事の目的
-
今年の4月に基本情報技術者試験の午前を合格するために、過去問で間違えた箇所をただまとめる自分のための記事

プロフィール
-
・文系大学の３年生
・ITパスポートを保有
・ウェブアプリやサイト作成を個人で行ったことがある程度
・猫好き

本日の目標
-
なんとなくで答えたり、丸暗記せずに、一つ一つイメージやポイントを意識して、取り組む。



間違えた箇所
-
1,フォロー・ザ・サン
２つ以上の異なる拠点に配置され、中央での統括管理によって、24時間365日のサービスを提供する

２、SNTP(Simple Network Management Protocol)
ネットワーク上の機器の情報を収集して、監視や制御を行うプロトコル

３、シーケンス制御
あらかじめ定められた順序で制御する

４、フィードフォワード制御
外からの影響が起こる前に、制御を行う

５、フィードバック制御
出力結果と目標値を比較して、一致するよう制御する

６、フォールトトレラントシステム
プロセッサ、メモリ、チャネル、電源系などを二重に用意して、片方に障害が起こったときでも処理を継続する

7,リプート
サーバを再起動して再開する

８、フォールバック
故障した高瀬品目を切り離し、システムのより重要な機能を存続させること

９、スループット
システムで単位時間あたりに処理される仕事の量
スプーリング
出力データを助保記憶装置へと転化して、補助記憶装置からプリンタにデータを転送する

１０、モーフィング
自然に変形する映像を作成できる

１１、キーフレーム法
動きのポイントとなる物体の位置や形を定義して、滑らかなアニメーションを作成する

１２、OC曲線
製品の抜き取り検査をする際のロットの不良率とそのロットの合格率の関係
ロットとは、ネジやボルトなど製品の最小単位

13,パリティチェック
データ通信やメモリチェックなどに置いてデータのビット誤りを検出
誤りが検出されたときは、送信もとに再送要求をする
誤りが偶数個だと検出できない→ 垂直水平パリティ方式だと１ビットの誤り訂正、２ビットの誤り検出が可能

奇数パリティ
ビット列とパリティビットを合わせて1の個数が奇数になるようパリティビットを負荷する

偶数パリティ
ビット列とパリティビットを合わせて1の個数が偶数になるようパリティビットを負荷する

１４、密結合プロセッサシステム
複数のプロセッサがネットワークを介して雪像され、資源を共有するシステム
一つのOSによって２つ以上のCPUを制御

１５、ウォークスルー
開発者がエラーの早期発見を目的として、設計書やプログラムに問題がないかを確認する

振り返り
-
今日は６0問程度で1時間ぐらいかかったが、次回からはもっと、一問あたりの時間を短く答えて、一問30秒程度で応えるよう取り組む。

>引用
https://www.fe-siken.com