OmniAICreator/Qiita-1.07M huggingface dataset:
pythonで"grep -f"的な文字列の抽出。のメモ

#そもそも...
例えば、`list_1.txt`の中から`list_2.txt`にある文字列を含む行を抽出したいとき。

```tex:list_1.txt
0001, aaa, AAA
0002, bbb, BBB
0003, ccc, CCC
0004, ddd, DDD
0005, eee, EEE
```

```tex:list_2.txt
0002
0004
```

シェルスクリプトなら**『grep -f `文字列` `検索対象`"』**と簡単に書けるので次のようになるわけです。

```sh
$ grep -f list_2.txt list_1.txt

0002, bbb, BBB
0004, ddd, DDD
```

#あえてpythonで書く
大人しくシェルスクリプトでやればいいのですが、敢えてpythonで書いていく。ここでは`list.csv`に結果を出力する。

内包表記での`for`の二重ループは**[** `式` `外側のforループ` `内側のループ` **]**で書くので、、、

```py:
# それぞれのlist_.txtをリストに格納
list1 = [line1.strip() for line1 in open('list_1.txt').readlines()]
list2 = [line2.strip() for line2 in open('list_2.txt').readlines()]

# 抽出
r_list = [line1 for line2 in list2 for line1 in list1 if line2 in line1]

# list.csvに出力
with open('list.csv', 'w') as exp_file:
    for line in r_list:
        print(line, file=exp_file)
```
結果

```csvs:list.csv
0002, bbb, BBB
0004, ddd, DDD
```

#あえてpythonで書く　その２
シェルスクリプトを使えば楽なことはわかっているがもう少し無駄な抵抗。subprocessを使ってみる。こちらの方が楽だし、わかりやすい。
上と同様に抽出結果を`list.csv`に結果を出力する。

```py:
import subprocess
# それぞれのファイルへのpathを記載
file1 = 'list_1.txt'
file2 = 'list_2.txt'

# 抽出と出力
with open('list.csv', 'w') as f:
    r_list = subprocess.run(['grep', '-f', file2, file1], stdout=f)

```

##ほんとは...
もっと他にもやり方はあると思う。これはメモ程度ということでご勘弁を。
cronでselenium実行できない？

# cronでselenium実行したい

## ・・・動かない？ 
手動では実行できるのに、cronではエラーで実行されず。

```{r}
$ sudo /etc/init.d/cron status
```

![errorsample.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/324570/913a2b79-3db7-c025-c9a9-3f1973e85aef.png)

こんな感じでエラーがでた。

## 解決策
原因はここに書いてある内容だった。
環境変数DISPLAYが無いので、ブラウザ画面を表示できないでブラウザが起動できない、という事らしい。

https://teratail.com/questions/329108

cronを編集

```{r}
$ crontab -e
```

cronのコマンド前に、DISPLAY=:0.0を追加。
これで解決した。

![cronsample.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/324570/7260b69c-f014-0a12-6edd-d824c5ca6a15.png)

ブラウザ表示が不要ならchrome driverのoptionを--headlessモードにすればよいらしい。

https://www.miki-ie.com/raspberry-pi/raspberry-pi%E3%81%ABselenium%E3%81%A8chromedriver%E3%81%A7%E3%83%96%E3%83%A9%E3%82%A6%E3%82%B6%E6%93%8D%E4%BD%9C/

```{r}
CHROME_BIN = "/usr/bin/chromium-browser"
CHROME_DRIVER = '/usr/lib/chromium-browser/chromedriver'
 
options = Options()
options.binary_location = CHROME_BIN
options.add_argument('--headless')
 
driver = webdriver.Chrome(CHROME_DRIVER, options=options)
```
イニシャライザとは？ -init()

##イニシャライザとは、
型（クラス、構造）のインスタンスを初期化（僕のイメージでは再設定）するメソッドのこと

```swift
 class User {
    let name: String

    // funcが不要（initキーワードのみ）
    init(name: String) {
        // 全てのプロパティを初期化する前にインスタンスメソッドを実行することはできない
        // printName() → コンパイルエラー
        self.name = name
        printName() // OK
    }

    // インスタンスメソッド
    func printName() {
        print(name)
    }
}
let user1 = User.init(name: "hoge")
// 呼び出し時のメソッド名が省略可能
let user2 = User(name: "hoge")
```
####イニシャライザの順序
イニジャライザは、プロパティの初期化をしてからインスタンスメソッド（インスタンスプロパティにアクセス、変更するためのインスタンスの目的に関連した機能としてサポートするメソッド）を実行するという順序が存在します。

参考文献
・https://qiita.com/shtnkgm/items/8b7979fc84a3cc065238
IPアドレスの固定をやろうとしたら/etc/dhcpcd.confがなかった

#この記事で説明すること
`/etc/dhcpcd.conf`が存在せず、ローカルIPアドレスの固定が出来なかったので、解決法を載せておきます。
※この記事はネットに落ちている情報等をある程度漁ってもIPアドレスの固定が出来なかった人が見る記事です。
初挑戦の方は丁寧に説明してくれている[他の方の記事](https://qiita.com/marie_khr/items/b088ffb252a92eee8f5d)を参考にしてください。

#実行環境

【ハードウェア】
`Raspberry pi 4 4GB`
【OS】
`Raspberry pi OS Lite(32-bit) Release:2020-12-02`


#解決法
インターフェースの名前→eth0
ラズパイに設定したいIPアドレス→192.168.0.28/24
ルーターのローカルIPアドレス→192.168.0.1
という設定で説明をします。

`/etc/network/interfaces`
というファイルの最後に

```
auto eth0

iface eth0 inet static
address 192.168.0.28 //ラズパイに設定したいローカルIPアドレス
network 192.168.0.1 //ルーターのローカルIPアドレス
netmask 255.255.255.0 //サブネットマスク値
broadcast 192.168.0.255 //ブロードキャストアドレス
gateway 192.168.0.1 //ルーターのローカルIPアドレス
dns-nameservers 192.168.0.1 //基本はルーターと同じアドレス
```
を追加して再起動してください。
これでもし出来なかったら`man interfaces`とかで原因を探してみて下さい。

#参考
[Debianの公式サイト](https://manpages.debian.org/jessie/ifupdown/interfaces.5.en.html)
LinuxでC言語の処理にかかった時間を計測する

#実行環境
Raspberry Pi 4 Model B / 4GB
Raspberry Pi OS(旧称Raspbian)
gcc version 8.3.0 (Raspbian 8.3.0-6+rpi1)

ラズパイ4は64bitだがOSは32bit

#clock関数を用いたコード
clock関数は実行した時点までに「プログラムがCPUによって処理された時間(CPU時間)」を返却する関数

```clock関数の使い方.
#include <time.h>
clock_t clock(void);
```

処理時間を計測したい処理の「開始前」と「終了後」それぞれでclock関数を実行し、
その返却値の差分を求めれば、「2つのclock関数実行の間でプログラムがCPUによって処理された時間を計測」することが出来る。

```c:main.c
#include <stdio.h>
#include <time.h>

int main(void) {

    clock_t start_clock, end_clock;

    /* 処理開始前のクロックを取得 */
    start_clock = clock();

    /* 時間を計測する処理 */

    /* 処理終了後のクロックを取得 */
    end_clock = clock();

    /* 計測時間を表示 */
    printf("clock:%f\n", (double)(end_clock - start_clock) / CLOCKS_PER_SEC);

    return 0;
}
```

単位は実行環境によって異なりますが、「CLOCKS_PER_SEC」で割り算することにより秒単位に変換することができます。小数点未満の数字は秒よりも細かい精度の時間（ms や us など）になります。

#参考
- https://daeudaeu.com/time_clock/
ゼロフィルよりは安心でurandom系よりは早いディスク消去方法

# 仕事で使っていたHDDの中のデータを復元できない形で消去する必要が生じたので方法を考えてみた。
削除対象は400TB程度のストレージ装置でNFSでLinux (CentOS)にマウントされている。
## 既存のソフトウエア、方法など
ググるとshredを使う方法、ddを使ってゼロフィルやurandomのデータを書き込む方法などがある。上書き回数については複数回上書きする方がいいという噂もあったが、[Wikipedia](https://ja.wikipedia.org/wiki/データの完全消去)によると、最近のHDDは1回上書きするだけで事足りるらしい。
それならばddでゼロフィルするだけでも事足りるのだろうが、やはり一律ゼロでは残留磁気が残ってしまうような気がして心もとない。かといってshredやurandomはランダム生成に時間がかかりすぎて消去期限に間に合わないことが分かった。

## 作成したスクリプトの動作
1. はじめにurandomで1GB分のランダムデータを生成する。
1. 生成した1GB分のデータをcatで繰り返しつなげて巨大な数個のファイルでディスク領域全体を上書きする。
1. ディスク全体にデータを書き終わると空き容量がない旨のエラーが大量に発生して動作が終了する。
1. 必要に応じてランダムデータのファイルを削除する。

1GB分もランダムデータをcatでつないでしまえば、次の1バイトにどんなデータが来るか予測するのは非常に困難なので残留磁気を読み取るのは事実上不可能と考えた。

## スクリプト
10T分ランダムデータで埋める場合

```bash:randomfill.bash
#!/bin/bash
OUTDIR=OUT # 巨大ファイルの出力先ディレクトリ
mkdir -p $OUTDIR

function main(){
    make1G orig_1G # urandomデータを1GB分カレントディレクトリに保存
    copy1T orig_1G data_1T 10 # 上で作成したデータをcatで1TB分つなげたファイルを10個作成
}

function make1G(){# urandomデータを1GB分カレントディレクトリに保存
    file=$1
    echo "Making a 1GB file: $file"
    time head -c 1000m /dev/urandom > $file
    echo "Done"
}

function make1T(){# 上で作成したデータをcatで1TB分つなげたファイルを作成
    infile=$1
    outfile=$2
    echo "Making a 1TB file from $infile to $outfile"
    touch $outfile
    for ((i=0; i<1024; i++))
    do
        cat $infile >> $outfile
    done
    echo "Done"
}

function copy1T(){# 1TBのファイルを指定した数だけ作成
    file=$1
    outbase=$2
    num=$3
    for ((j=0; j<$num; j++))
    do
        outname=$OUTDIR/$outbase.$j
        if [ ! -r $outname ]
        then
            make1T $file $outname # TB級ストレージの場合
#           cat $file > $outname # 数百GB級ストレージの場合
#           dd if=$file of=$outname bs=64M # ddは遅かった
        fi
    done
}

main
```

## このスクリプトの利点
* 空き領域のみランダムデータで上書きするので残しておきたいデータがある場合にも使える。
* bash on windows で試したところ、フルフォーマットと同程度の速度でデータ消去が完了した。
* 同じプログラムを同時に走らせると別々のファイル名で書き込みを行うので、RAIDなどで複数スレッド同時書込みできる環境では増速も可能。
Go言語で構造体データをファイルに書き出し/読み込みをする方法メモ

# はじめに
## やりたいこと
Goのプログラム内で作成した構造体のデータをバイナリにシリアライズし、ファイルに保存します。
そしてプログラムを次回実行したときには、そのファイルを読み込んでデシリアライズし、構造体のデータをメモリに乗せます。

丁度、Pythonであれば[pickle](https://docs.python.org/3/library/pickle.html)で出来るようなことを、Goで実行する方法のメモです。
# コード
## 概要
Goの標準ライブラリである[gob](https://pkg.go.dev/encoding/gob)を用います。
`Encoder`というクラスで構造体データをバイナリにシリアライズし、`Decoder`というクラスでそれをデシリアライズします。

※サンプルコードからは、例外処理を省いています。
## 書き込み
```go
import (
	"encoding/gob"
)

// 今回保存したいデータ
var stageTiles [screenLength][screenLength]tileInfo
type tileInfo struct {
	SpritesheetNum int
	TileType       string
}

// 中略

// セーブファイルの作成
file, _ := os.Create("savefile.gob")
defer file.Close()
// エンコーダーの作成
encoder := gob.NewEncoder(file)
// エンコード
encoder.Encode(stageTiles)

```
注意したいのが、シリアライズする構造体のフィールドです。構造体のフィールドが他のパッケージからアクセスできるようになっていないと（i.e. 先頭が大文字になっていないと）、値はシリアライズされるデータに含まれません。

> Structs encode and decode only exported fields. 
> - https://pkg.go.dev/encoding/gob

上のコードの場合、`tileInfo`というtypeの二重配列をファイルに保存していますが、最初私はこのtypeのフィールド名を小文字にしていたため、読み込み時に値が初期値（intなら0, stringなら空文字）となっていて、困惑しました。

## 読み込み
```go
import (
	"encoding/gob"
)

// 読み込んだデータを保持する変数
var stageTiles [screenLength][screenLength]tileInfo
type tileInfo struct {
	SpritesheetNum int
	TileType       string
}

// 中略

file, _ := os.Open("savefile.gob")
defer file.Close()
decoder := gob.NewDecoder(file)
err = decoder.Decode(&stageTiles)

```

# 最後に
## 参考
[データのやりとりに gob を使う](https://qiita.com/delphinus/items/67a796cb7876132a1ec0)
composer require -w tymon/jwt-authがエラー

#趣向
composer require -w tymon/jwt-auth　を使用するとエラーが出てしまい
jwt-authをインストールすることができなかった。
Laravel: 8.40
PHP: 8.0

#エラー
下記のエラーがでてしまう。

```
Your requirements could not be resolved to an installable set of packages.

  Problem 1
    - Root composer.json requires tymon/jwt-auth ^0.5.12 -> satisfiable by tymon/jwt-auth[0.5.12].
    - tymon/jwt-auth 0.5.12 requires illuminate/support ~5.0 -> found illuminate/support[v5.0.0, ..., 5.8.x-dev] but these were not loaded, likely because it conflicts with another require.


Installation failed, reverting ./composer.json and ./composer.lock to their original content.
```


#解決
以下のコマンドで実行する。

```
composer require -w tymon/jwt-auth --ignore-platform-reqs
```


※composer require barryvdh/laravel-cors　コマンドも同様でした
SQLの自己結合を用いて部分的に不一致なデータの検索をする

## はじめに

SQLにおいて、自分はあまり聞き慣れなかった自己結合の今後役立つかもしれないテクニックを紹介していきます。

実行結果はこちらで確認できます。

https://www.db-fiddle.com/

## 部分的に不一致なデータの検索

### 例題1

#### テーブル

このような`conpanies`テーブルがあるとします。

| company_name          | company_group_id | address                   | 
| --------------------- | --------- | ------------------------- | 
| 株式会社エース親会社  | 1         | 東京都千代田区千代田1-1   | 
| 株式会社エース子会社1 | 1         | 東京都千代田区千代田1-1   | 
| 株式会社エース子会社2 | 1         | 東京都千代田区千代田1-2   | 
| 株式会社レイボー食品  | 2         | 東京都千代田区皇居外苑1-1 | 
| 株式会社ステップ工業  | 3         | 大阪府豊中市緑丘1-1       | 

`株式会社エース親会社`と`株式会社エース子会社1`は同じ住所なのに、`株式会社エース子会社2`が微妙に違っていてこれが間違っているとします。

同じ会社（同じcompany_id）だけど、住所が違うレコードを検出したい場合、どんなクエリがいいでしょうか？

自己結合を用いて解決できます。

Schema (MySQL v5.7)

日本語対応してなかったので、英語に。

```sql
    CREATE TABLE companies (
      id INT NOT NULL PRIMARY KEY auto_increment,
      company_name TEXT,
      company_group_id INT,
      address TEXT
    );
    
    INSERT INTO companies VALUES
    	(1, 'ACE', 1, 'Japan Tokyo chiyoda 1-1'),
    	(2, 'ACE_1', 1, 'Japan Tokyo chiyoda 1-1'),
    	(3, 'ACE_2', 1, 'Japan Tokyo chiyoda 1-2'),
    	(4, 'RAINBOW_MEAL', 2, 'Japan Tokyo koukyogaien 1-1'),
    	(5, 'STEP_INDUSTRY', 3, 'Japan Osaka fuchu midorigaoka 1-1');
```

#### Query

```sql
    SELECT
    	DISTINCT C1.company_name,
        C1.address
    FROM companies C1
    INNER JOIN companies C2
    	ON C1.company_group_id = C2.company_group_id
       AND C1.address <> C2.address;
```

#### Results

| company_name | address                 |
| ------------ | ----------------------- |
| ACE_2        | Japan Tokyo chiyoda 1-2 |
| ACE          | Japan Tokyo chiyoda 1-1 |
| ACE_1        | Japan Tokyo chiyoda 1-1 |

自己結合と、非同値結合の組み合わせは、とっても便利ですね。

### 例題2

スーパーにある果物（商品）テーブルから

同じ価格のものをグループにして、同じ価格じゃない消費は除外したデータにしましょう。

（同じ価格の商品の組み合わせを取得しましょう。）

#### Schema (MySQL v5.7)

```sql
CREATE TABLE services (
  id INT NOT NULL PRIMARY KEY auto_increment,
  name TEXT,
  price INT
);

INSERT INTO services VALUES
	(1, 'apple', 50),
	(2, 'orange', 100),
	(3, 'grape', 50),
	(4, 'melon', 80),
	(5, 'remon', 30),
	(6, 'strawberry', 100),
	(7, 'banana', 100);
```

#### Query

```sql
SELECT
	DISTINCT S1.name,
             S1.price
FROM services S1
INNER JOIN services S2
	ON S1.price = S2.price
   AND S1.name <> S2.name
ORDER BY S1.price
```

#### Results

| name       | price |
| ---------- | ----- |
| grape      | 50    |
| apple      | 50    |
| strawberry | 100   |
| banana     | 100   |
| orange     | 100   |

例題1もですが、`DISTINCT`付けないと、結果に冗長な行が現れるので付けています。

## 参照

https://www.amazon.co.jp/dp/4798157821/

51 - 53p 

## アウトプット100本ノック実施中

https://qiita.com/ryosuketter/items/713474dbd009870e4103
1分で環境立上げ - create-react-app & typescript & yarn & dockerを実行するまで

## Issue

create-react-app & typescriptでアプリが完成したが、良さそうなDockerfileとdocker-compose.ymlが無い。

## 解決策

過去のプロジェクトからとってきた。
今後検索で引っ掛かるようにここで共有する。

## 前提

- Dockerfileとdocker-composeの知識がある前提なので、わからなければ[公式サイト](https://docs.docker.com/engine/reference/commandline/build/)で勉強することを勧める。
- CRAはEjectしていない前提である。

## 実装

**Dockerfile**

```docker
FROM node:14-alpine AS builder

# set working directory
WORKDIR /app

# Copies package.json and yarn.lock to Docker environment
COPY package.json ./
COPY yarn.lock ./

# Install `serve` to run the application.
RUN npm install -g serve
# Installs all node packages
RUN yarn install --frozen-lockfile

# Copies everything over to Docker environment
COPY . .

# Build for production.
RUN yarn build

# Uses port which is used by the actual application
EXPOSE 5000

# Run application
#CMD [ "npm", "start" ]
CMD serve -s build
```

**docker-compose.yml**

```yaml
version: "3"

services:
  my_webapp:
    build:
      context: .
    volumes:
      - ./src:/app/src # 多分これはいらないかも。
    ports:
      - "5000:5000"
```

あとは、以下のコマンドでローカルと本番環境で実行できる。

`docker-compose build` -> **ビルドを作る**
`docker-compose up -d` -> **バックグラウンドで実行する**

Portの設定は`<HOST>:<CONTAINER>`になる。なので、`- "5000:5000"`の後の部分を変えずに最初の部分だけをホストマシンのポートに設定する。後の部分を変えるのであれば、`Dockerfile`の`EXPOSE 5000`と同じ値である必要がある。

以上。

ハッピーコーディング！
Ｂlenderトラブルシューティング

# fbxファイルにエクスポートしたオブジェクトをUnityでインポートするとオブジェクトが白くなる
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1336886/46012f2f-a12d-d531-6a72-6b9bb882f78b.png)

* デフォルトの設定だとテクスチャ情報がエクスポートされないことが原因
* 以下の箇所をcopyに変更、右側のフォルダをクリックして青くするとテクスチャの出力が有効になる。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1336886/085a6783-ad36-7d4d-795c-d6d053fa2f5a.png)
AWS 触ってみた

# AWSの流れが来ているのでAWS触ってみた

とりあえず「アカウント作成」してWEBアプリ作成の準備をしてみた。

やりたいこと
AWS上でWEBアプリを作成して,サービスとして公開してみる。

使うもの
１nginx
２python(Flask)
３mysql

若干、古い気もするが、調べ物を極力抑えるため、自分の知っている技術を使うことにした。

概要
WEBアプリ作成
　　-- Hello Worldを出すだけ

ひとおとりの流れ
1 外部通信の可能にするため、VPCとかセキュリティグループとか設定
2 EC2作成
3 docokerインストール⇒ngixnのコンテナ作成⇒hello World! を出力するHTML作成
4 docker run
5 localからhttpアクセス⇒「hello World!」が出力
6 以上！

その他
１Amazon RDS作成
とりあえず[MySQL]のインスタンス立ててみたが、インスタンス設定の最後のページで
予測請求額[500USD]的なでた

[USD]⇒アメリカ合衆国ドル
https://ja.wikipedia.org/wiki/アメリカ合衆国ドル

日本円にして約「５万」

・・・

無理

Next
pythonインストール
Flaskインストール

目的
・AWSの知見あつめ
・WEBアプリ作成
Vagrant環境でnpm installができない時に試すべきこと

#目次
- はじめに
    - 開発環境
    - 前提
- 生じた問題
- 対応策
- まとめ
- 参考記事


#はじめに
この記事では、Vagrantを用いてnpm installを行おうとしたときに生じたエラーについて扱います。
私の開発環境は以下の通りですので、ホストOSがwindows環境の方などは注意してください。

##開発環境
ハードウェア

| 項目 | 内容 |
|:-:|:-:|
| OS  | mac OS Big Sur 11.5  |
| 端末種類  |  MacBook Air (Retina, 13-inch, 2020) |
| プロセッサ  | 1.1 GHz クアッドコアIntel Core i5  |
| メモリ | 16 GB 3733 MHz LPDDR4X  |
|　グラフィックス |Intel Iris Plus Graphics 1536 MB |

ソフトウェア

| 項目 | ホストOSバージョン | ゲストOSバージョン |
|:-:|:-:|:-:|
| Vagrant  | 2.2.13 | - |
| VirtualBox  |  6.1.16 | - |
| node.js | 16.0.0  | 8.16.2->10.16.2 |
| npm | 7.10.0 |  6.4.1->6.9.0 |

私の場合は、上記に加えて、チーム開発のため**package.jsonが既に与えられている状態**でした。




#生じた問題
- npm installを行うと、以下のようなエラーが出ました。

```javascript:vagrant(terminal)
npm ERR! path /home/vagrant/code/node_modules/acorn-dynamic-import/node_modules/acorn/package.json.2270336935
npm ERR! code ENOENT
npm ERR! errno -2
npm ERR! syscall open
npm ERR! enoent ENOENT: no such file or directory, open '/home/vagrant/code/node_modules/acorn-dynamic-import/node_modules/acorn/package.json.2270336935'
npm ERR! enoent This is related to npm not being able to find a file.
npm ERR! enoent
```

#対応策
まず、[Vagrantの共有フォルダ上で'npm install'が動かない場合の対処法](https://zenn.dev/amezousan/articles/2020-10-20-tips-vagrant)および[npm トラブルシューティング](https://qiita.com/hatai/items/ba6eadb758a667345b27#sudo-%E3%82%92%E3%81%A4%E3%81%91%E3%82%8B)を試してみてください。
私の環境下では、上記方法でも解決しませんでした。そのため、以下の対処を行いました。

- vagrantにnvmをインストールした。
    - nvmのインストール方法は[こちら(Vagrantで【nvm】を使用して《node.js》と《npm》を入れる方法)](https://dara-blog.com/node-install-in-vagrant)を参照してください。
    - nvmでなくても、node.jsとnpmのバージョン管理ができるものであれば良いです。
- その後、nvmを用いて、node.jsとnpmのバージョンアップを行いました。
    - 用いるべきバージョンは、各人によって異なります。
    - 上記問題の原因は、**package.jsonにおいて求められているnode/npmのバージョンが、ゲストOS環境のnode/npmバージョンと一致していない**ことにあります。
    - そのため、ホストOSのnode/npmのバージョンがpackage.jsonの必要とするバージョンを満たす場合、上記URLの「ホスト側でnpm installする」ことで解決することになります。
    - **ホストOS, ゲストOSのどちらもがnode/npmのバージョン条件を満たさない**ために、エラーが残ってしまっていたみたいです。
    - 私の場合は、nodeを10.16.2にアップグレードすることで利用可能になりました。
    - バージョンを上げすぎてもpackage.json側の要件によってはエラーが生じるため、いくつかバージョンを変えて試してみてください。

#まとめ
1. [Vagrantの共有フォルダ上で'npm install'が動かない場合の対処法](https://zenn.dev/amezousan/articles/2020-10-20-tips-vagrant)
1. [npm トラブルシューティング](https://qiita.com/hatai/items/ba6eadb758a667345b27#sudo-%E3%82%92%E3%81%A4%E3%81%91%E3%82%8B)
1. node.jsとnpmのバージョンを、package.jsonの条件にしたがってアップデートする。

#参考記事
gitにissueがありました。
[NPM Install failing on clean homestead box](https://github.com/laravel/homestead/issues/1239)
ぷよぷよの思考ルーチン（AI）

![ezgif.com-gif-maker (3).gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1384531/400776de-b080-f3f7-c802-1e31ee979175.gif)
去年、こんな感じでぷよぷよのCPU対戦を実装しました。
左の下手くそが私（久々の操作で戸惑ってる図）、右がCPUです。
ぷよぷよに関する知識が０なのでCPUのアルゴリズム自体はかなり単純です。

#アルゴリズム
- ぷよの落下直前の位置・回転のパターンを全て探す
私の場合はステージ幅が横に６マスあったので、

 - 🔴🔵(左右)：この回転状態のぷよの位置は５パターン
 - 🔵🔴(左右)：この回転状態のぷよの位置も５パターン
 - 🔴🔵(上下)：この回転状態のぷよの位置は６パターン
 - 🔵🔴(上下)：この回転状態のぷよの位置も６パターン 
 
　以上の合計２２パターンの状態でぷよが落下した場合の結果を総当たりで調べました。

- 落下予測位置から求められる結果を元にソートする 
求める結果は次の３つです。

    - 連鎖の数
    - 隣接する同色ぷよの数
    - 最下マスとぷよの間に入るマスの数(距離)

　優先順位は上から順番になっています。例えば予測連鎖数の同じ２つの落下パターンがあれば、隣接する同色ぷよの数が多い方が優位になりますし、これも同じであれば地面との距離がなるべく近くなる置き方を試みます。
　ちなみにこのまま実装すると、３つの結果全てが一致するパターンが上位に複数あった場合に左側に積みがちになるなど、検索を行った順に優先順位が設定されてしまうので、私は一応都度検索の順序をシャッフルしたりしていました。

#このアルゴリズムの問題点
仕込みなどの概念がないのでシンプルに弱いです。作った人の頭が足りないとこうなります。ぷよぷよ難しい･･･
ただ「CPU対戦（難易度：易しい）」という設定で遊べるものにはなってると思います。多分。

▼ちなみに私は負けました☻
![ezgif.com-gif-maker (1).gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1384531/233a7726-0244-ddf0-75ec-f75cc173f570.gif)

#追記
よくよくGIF画像のCPUの動きを見てみたら縦に落ちるぷよが１つもないですね。作った当時は気付かなかったのですが何かしらバグがありそうです😢
精進ですね。（直す気力がない）
例外処理について基本

## 概要

- 例外処理についての基本的なことについてまとめです

実務において例外処理を行わないことはないので、基礎的な部分を記載しておきます。

### 基礎構文

```rb
begin
# エラーが起こりうる処理
rescue 
# エラーが起きた時にどのような挙動をしてほしいか記述
end
```

エラーを捕捉したい場合は上記のように `begin ~ rescue` の間に処理を挟む。

エラーが起きると `rescue ~ end` の間に処理が移る。

ちなみにメソッド単位なら `begin` は省略可能

### rescue は複数書ける

```rb
begin
# エラーが起こりうる処理
rescue NomethodError
  puts 'NomethodError'
rescue RuntimeError
  puts 'RuntimeError'
rescue StandardError
  puts 'StandardError'
end
```

### 特定のエラー起こしたい → `raise`

```rb
begin
  raise RuntimeError
rescue NomethodError
  puts 'NomethodError'
rescue RuntimeError
  puts 'RuntimeError' # => ここに処理が飛ぶ
rescue StandardError
  puts 'StandardError'
end
```

- raise で特定のエラーを引き起こすことができる
- ここでは `raise RuntimeError` とすることで `rescue RuntimeError` に処理が飛ぶ

### 特定のエラーを作りたいぜ！ → エラーを継承

```rb
class FugaError < StandardError; end

begin
	raise FugaError
rescue FugaError
	puts "FugaError"
end
# 出力
# FugaError
```
- `StandardError` を継承して特定のエラーを作り出すことができる

### `rescue` の処理の順番に注意すること

```rb
class FugaError < StandardError; end
class HogeError < FugaError; end

begin
	raise HogeError
rescue FugaError
	puts "FugaError"
rescue HogeError
	puts "HogeError"
end

# 出力
# FugaError
```
- エラーが参照されるのは親から。
- `StandardError > FugaError > HogeError` の順で継承している。
- `FugaError` が `HogeError` より上に記載されており、かつ `HogeError` は `FugaError` の子クラスなので先に参照されてしまう。
- `HogeError` 出したければ逆にすること

```rb
class FugaError < StandardError; end
class HogeError < FugaError; end

begin
	raise HogeError
rescue HogeError
	puts "HogeError"
rescue FugaError
	puts "FugaError"
end

# 出力
# HogeError
```

ちなみに `raise` のみ記載しておくと `StandardError` として捕捉される

```rb
begin
	raise
rescue => e
  p e.class
  #=> StandardClass
end
```

### 番外編：例外処理の定義の仕方色々

```rb
#パターン１ 通常

# begin
#   raise StopIteration
# rescue KeyError => e
#   p 'きーえらー'
# rescue StopIteration => e
#   p 'すとっぷいてれーしょん'
# end


# パターン２ 横につなげる

# begin
#   raise NoMethodError
# rescue KeyError, StopIteration, NoMethodError
#   p 'きーえらーとストップイテレーションとのーめそっどえらー'
# rescue StopIteration => e
#   p 'すとっぷいてれーしょん'
# end


# パターン３ スプラッシュ演算子

begin
  raise NoMethodError
rescue *[KeyError, StopIteration, NoMethodError]
  p 'きーえらーとストップイテレーションとのーめそっどえらー'
rescue StopIteration => e
  p 'すとっぷいてれーしょん'
end

```
Jenkinsでログイン画面をスキップさせる[windows]

# 環境
- Windows 10 Enterprise
- Jenkins 2.303.1

# 想定読者  
jenkinsをWindowsローカル環境で起動し、

- ユーザ名とパスワードを設定し忘れた方
- ユーザ名とパスワードを忘れた方
- 毎度ログインをしたくない方


この記事ではWindows10にインストールしたJenkinsを使っています。

# 問題
Jenkins初回実行時、ユーザー作成をスキップしてadminとしてログインをすると、ユーザー名・パスワードを初期化しないままJenkinsダッシュボード画面に入ることができます。
![jenkins_user_create.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/255563/8cdfac83-8752-accd-2b39-13b94a3667bb.png)
上の画面でユーザー作成をスキップしたままadminとして一旦ダッシュボード画面に入ることはできますが、再度Jenkins起動時、下のログイン画面が表示され、ユーザ名とパスワードを設定していないのでログインできない状態になります。
![jenkins_login.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/255563/76f40f38-c2ed-c40f-f74c-8b0f3c93897a.png)


# 解決策
.jenkins配下にあるconfig.xmlの内容を書き換えます。

.jenkinsは、C:\Windows\system32\config\systemprofile\AppData\Local\Jenkins\.jenkins
にあります

コマンドプロンプトまたはPowershellを管理者権限で実行。
.jenkinsディレクトリに移動  

```  
管理者：Windows PowerShell
PS C:\Windows\system32\config\systemprofile\AppData\Local\Jenkins\.jenkins>
```

メモ帳などで config.xmlを開く

```
PS  C:\Windows\system32\config\systemprofile\AppData\Local\Jenkins\.jenkins> notepad .\config.xml   
```
useSecurityタグでtrueとしていたものを、下のようにfalseに修正します。

``` config.xml
 <useSecurity>false</useSecurity>
```

あとは、Jenkinsを再起動するだけです。
Jenkinsをインストールしたディレクトリで、jenkins.exeがあることを確認し、startコマンドを実行します。

```
C:\Program Files\Jenkins> jenkins.exe start
```

ログイン画面を経ずにJenkinsのダッシュボード画面が表示されました！
ユーザを作成していなかった場合は、「Jenkinsの管理」からユーザを作成することができます。
![jenkins_home.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/255563/8cfe5fb2-cc5c-7859-94bc-5f404e46bd24.png)



# 参考元
https://stackoverflow.com/questions/39340322/how-to-reset-the-user-password-of-jenkins-on-windows
VSCode リモートコンテナの Python3.8 にnvm , nodeのインストールをDockerファイルに記述する

リモートコンテナ用のdockerイメージ（Debian11, Python3.8）の環境でnodeを使いたかったので入れた
いろんなOSさわると、遭遇するエラーもさまざま

- 入れた対象OS

```
root ➜ /workspaces $ lsb_release -a
No LSB modules are available.
Distributor ID: Debian
Description:    Debian GNU/Linux 11 (bullseye)
Release:        11
Codename:       bullseye
```

## Dockerファイルに記載してnvmとnodeをインストール（Rebuild Containerで実行して1分かからず）
- 操作しているユーザー環境変数の設定はしていない
- `apt upgrade` はしなくても良い
- node install ではビルドしない（-s 指定しない）
- install.sh が実行されると、`/usr/local/share/nvm` に nvmが入っていることを気づかずにやっていてつまづいた

- 作成したDeockerfile（https://gist.github.com/ssugimoto/acd7fe5d25b9adaf149dd3c8a3bdbf2a ）、以下も同じ

```Dockerfile
FROM mcr.microsoft.com/vscode/devcontainers/python:3.8

RUN apt-get update \
    && apt-get -y install curl \
    && apt-get autoremove -y \
    && apt-get clean -y \

RUN apt-get upgrade \
    && apt-get -y install curl

ENV NVM_DIR /usr/local/share/nvm
ENV NODE_VERSION 12.22.1
#
# Install nvm with node and npm
RUN curl -o- https://raw.githubusercontent.com/nvm-sh/nvm/v0.37.2/install.sh | bash \
    && . $NVM_DIR/nvm.sh \
    && nvm install $NODE_VERSION \
    && nvm alias default $NODE_VERSION \
    && nvm use default

WORKDIR /workspaces
```

- 入れたバージョンの確認

```
root ➜ /workspaces/test $ 
root ➜ /workspaces/test $ nvm --version
0.38.0
root ➜ /workspaces/test $ node --version
v12.22.1
root ➜ /workspaces/test $ npm --version
6.14.12
root ➜ /workspaces/test $ python --version
Python 3.8.11
```


### エラーの対応
- `/bin/sh:   nvm: not found  docker` , `"bash: nvm: command not found"` 
 nvm コマンドがありません。

    - 手動でインストールすると発生しないけど、Dockerfileだと発生する
    - RUN コマンド１行で（まとめて）記載する必要があるんだけど、１行で記載しても解決できず。
    - そもそもnvmがインストールされる場所が想定と違ってた

### 参考

- その１） https://zenn.dev/uttk/articles/a7b085c7774ae9
こちらでは、`alpine linux` のため少し異なる。環境変数適用が違う。Ubuntuの記載がある。

- その２）https://stackoverflow.com/questions/25899912/how-to-install-nvm-in-docker
こちらの stack overflowを参考にしました

- その３）https://gist.github.com/remarkablemark/aacf14c29b3f01d6900d13137b21db3a#file-dockerfile
こちらも 参考にしました。ディスカッションが最もあり参考になる。
debianでのDockerファイルにnvm installを記載する例、ここでも `/usr/local/nvm` のパスで自身の環境とは一致しなかった

```
ENV NVM_DIR /usr/local/nvm
・・・
. $NVM_DIR/nvm.sh
```
の２つの箇所、 /usr/local/nvm にはインストールされないので変更が必要


## なぜ、node用のリモートコンテナを使わないのか
- VSCodeリモートコンテナ Debian10 node12（node12または14）の環境が入っているOS Debian10ではPython3.7がインストール済で、Python3.8 を `sudo apt-get install python3.8` ではインストールできなかった
- Pyhon3.8を使うには いくつかの xxx-devライブラリを入れ、 make altinstall する必要があり、コンテナが使えるまでの時間が長すぎた


## Dockerファイルに書かないで、通常のインストール

- ほぼ、以下のコマンド入る（sudo ついてるけど、rootで作業しています）

```
# sudo apt update
# sudo apt upgrade
# sudo apt-get install curl
 
nvm のインストール
# curl -o- https://raw.githubusercontent.com/nvm-sh/nvm/v0.35.2/install.sh | bash
# nvm --version
# nvm install v12.22.1
```



## コンテナビルドに続いて Amplif cli 入れたら３分くらいかかった（176sec）

devcontainer.json　に 
`"postCreateCommand": "npm install -g @aws-amplify/cli@5.3.1",`
を追記した場合に、npm install が3分かかった

npm install ログの最後

```
+ @aws-amplify/cli@5.3.1
added 1404 packages from 775 contributors in 176.666s
```
【MAMP】PHPのPath設定（.zprofile）

まず、ルートディレクトリに移動します。



``$ cd``

下記を記述してパスを通します。
php7.3.27の部分は、自分の使っているMAMPのPHPのバージョンに変更して下さい。
``$ export PATH=/Applications/MAMP/bin/php/php7.3.27/bin:$PATH``

最後に、下記コマンドを打ち込み設定を反映を反映させます。
``$ source ~/.zprofile``

PHPのバージョン変更が反映されているか確認してみましょう。
``$ php -v``
M1 Macではselenium/standalone-chromeのdocker imageが使えない

# 概要
- クローラーを作る時とかによくseleniumのchrome環境を使うが、バージョン云々でごちゃつくので`selenium/standalone-chrome`のdocker imageをよく使っている
- が、どうやらM1 Macではこのimageが使えないっぽいので、解決策を残しとく

# 解決策
- armでも使えるseleniumのchromeのdocker image`seleniarm/standalone-chromium`を使う
    - まだベータ版っぽいので`seleniarm/standalone-chromium:4.0.0-beta-1-20210215`を使う

# 小言
- M1使えないもの多すぎやろ、特にdocker周り
個人的におすすめなGit管理ツール

Git管理でおすすめなツールがいくつかあるのでそちらを紹介したいと思います。

個人的におすすめなのは以下の３つです。

* SourceTree
* tig
* GitHub Desktop


##SorceTreeについて

公式：https://www.sourcetreeapp.com/

以下のProgateの紹介ページでわかりやすくまとめらているので詳しくは以下を参照ください
https://prog-8.com/blogs/how_to_use_sourcetree

##tigについて
公式：https://jonas.github.io/tig/

tigに関しては以下の記事で使い方が簡単にまとめられているので是非参考にしてみてください
https://qiita.com/suino/items/b0dae7e00bd7165f79ea

##GitHub Desktopについて

公式：https://desktop.github.com/

以下の記事で使い方等がわかりやすくまとめられているので是非参考にしてみてください
https://ferret-plus.com/8498
こんな言い回しをしている記事は，うんざりだ

技術書とまでは言わないが，ちゃんとした文書を書こうと思うなら，それなりの心構えがあってしかるべし

社内文書でもこんな文章を書いているんだろうか



引数（括弧の中）にはインストールしたいパッケージがGitHub上のどこに保存されているかを示す文字列を入れてあげます。→入れます

すでに既出ではありますが　→ 既出ではありますが

本記事においては、~~筆者に厳密な議論をするだけ数学力が無いので~~種々の厳密さを抜きにして　→ 見えケシは本音？だったら消さない。

シミュレーションに落とし込めば良さそう → シミュレーションすれば良さそう

順に~~釈明~~説明していきたいと思います。　→ 見えケシは意味ない

プログラムは下記になります。 → プログラムは以下です。

来週からは気温も落ち着かれることを祈るばかりです → 気温も落ち着くことを

まだ残りまくっていますよね。はい、飛ばしまくったらいつの間にか1週目は残りわずかとなりました。　→ 仲間内での会話体は止めよう

大事な大事なコンポーネントとなります。→ コンポーネントです。（～となりますって，へんな言い回しですね）

今までは上側(Top)によく出現されていましたが、実は下側(Bottom)にもあるのですね。→ 出現していましたが

さっそくコードに入っていきたいのですが、→ コードの説明に入っていきたいのですが

あ、いや、全然そんな、楽したいだなんて、あはは。そそそんなこと、思っては、ななないですよ。　→ 仲間内での会話体は止めよう

新しいものというとMDToolbarのあたりになります。→ MDToolbar などになります

単にprint文を置いているだけになります。→ 置いているだけです。

こちらも顔馴染みとも言えるかもしれません。一言で言えば影の高度。一文字でいうならば影ですが、ちょっと切り落とししすぎかな。→ 言っている意味がわからない

実際に動かしてみたものを見てみましょう。今回は画像になります。→ 今回は画像を提示します。

ターミナルの挙動を見ながらキャプチャしたものが以下になります。→ 以下です。

サイドメニューを開くということやらメニューを開くということやらですね。→ こととか

下部にツールバーを置くにはどうすればよいのだ?ということをやっていきます。→ 見ていきます

ということで、さっそくコードからレッツラゴ。→ 前世紀のおじさん語

目新しいものはicon、type、on_action_button、mode、icon_colorプロパティになります。→ プロパティです

実行結果の方に入っていきたいと思います。→実行結果の説明をしたいと思います

下部のツールバーとしては上のキャプチャのようになります。→ 下部のツールバーは，上に示したキャプチャのようです。

デフォはandroid君が配置されます。→デフォルトは android が配置されます。

気になる方は以下ページも参考情報となります。→ 参考になるでしょう。

今度は動画キャプチャになります。→ 動画キャプチャです

その方法がわからなかったです。→ わかりませんでした。
実行時にエラーが出ることがでるので、→ 出ることがあるので

プログラムは下記になります。→ 下記の通りです。

「時系列分析」に向いている題材なのだろうなと思ってやってみたということになります。→ やって見ようと思いました。

というよな使い方をするみたいです。→ というような使い方をするようです

推定に大きな影響があると判断することができます。→ 判断できます

懸念のあるデータは、ないみたいですね。→ ないようです

体感してもらえるかと思います。→ 体感してもらえると思います

何回かクリックしていくとインストールが行われます。→ インストールされます

３つは覚えときたい。→ 覚えておきたい

ここはやらなくていいです。→ やらなくてよいです

カイ二乗近似を適用しているらしいです。→ 適用しているようです

サンプルサイズが必要になるっぽいです→必要になるようです

いう部分を考えていきたいと思います。→考えます。

P69を参照頂ければなと思います。→ 参照戴きたいと思います

影響が大きいと考えることができます。→ 考えられます

異常値の懸念があるっぽいですね。→ 異常値である懸念があります

組み合わせてみることが多いみたいです。→ 多いようです

警戒しておいた方がいいということなんでしょう→警戒しておいたほうがよいと言うことでしょう

というよな使い方をするみたいです。→というような使いかたをするようです

よく使われる基準ってあるのかなあ→ 基準というのはあるのでしょうか

経済系では割と有名っぽい→ 経済系では割と有名なようです

ないみたいですね。→ ないようです

というような感じになるでしょうか。→ というようなことでした。
3分で読める「ウェブ健康診断」のすゝめ

#はじめに
本記事はIPAが公開している『[ウェブ健康診断](https://www.ipa.go.jp/files/000017319.pdf)』の要約記事です。
引用元pdfも短いので興味ある方はそちらを読むことを推奨しますが、「pdfってなんか読む気なくす…」っていうめんどくさがりさん向け記事です。

#目次
1.[ウェブ健康診断って？](#1ウェブ健康診断って？)
2.[対象の脆弱性](#2対象の脆弱性)
3.[総合判定所見](#3総合判定所見)


#1.ウェブ健康診断って？
IPAが公開しているwebアプリケーションの**簡易検査マニュアル**です。危険度の高い13個のwebアプリケーションの脆弱性の有無を、BurpSuiteのようなツールを使うことでとても簡単に検査できます。

一方で、以下に引用したようにあくまで**簡易的な検査**であることを忘れてはいけません。
脆弱性が発見されたら**より詳細な検査を行う必要があり**、健康診断で見つからなくても**脆弱性がある可能性があります**。


>ウェブ健康診断は「基本的な対策が出来ているかどうかを診断するもの」とご理解ください。また、診断対象のウェブアプリケーションの全てのページを診断するものではなく、診断対象の規模にもよりますが、基本は抜き取り調査(診断)です。

>引用元：IPA『[ウェブ健康診断仕様](https://www.ipa.go.jp/files/000017319.pdf)』

#2．対象の脆弱性
(A)SQLインジェクション
(B)XSS
(C)CSRF
(D)OSコマンド・インジェクション
(E)ディレクトリ・リスティング
(F)メールヘッダ・インジェクション
(G)パス名パラメータの未チェック／ディレクトリ・トラバーサル 
(H)意図しないリダイレクト
(I)HTTPヘッダ・インジェクション 
(J)認証
(K)セッション管理の不備
(L)認可制御の不備、欠落
(M)クローラへの耐性

<details><summary><font color="red">個々の用語解説(知らない人向け)</font></summary><div>
(A)SQLインジェクション：SQL文に不正な文字列を注入すると、DBの不正閲覧・改ざんが可能な脆弱性
(B)XSS(クロスサイト・スクリプティング)：掲示板に別のサイト(クロスサイト)へ遷移するリンクを貼り付け、閲覧者がクリックすると悪意のあるスクリプトが実行される攻撃手法が可能な脆弱性
(C)CSRF：利用者が無害なサイトにログインした状態で不正なURLをクリックすることで予期せぬ動作(犯行予告、キャッシュカードの不正利用)を無害なサイトにたいして行わせる攻撃手法が可能な脆弱性
(D)OSコマンド・インジェクション：webサイトの入力フォームに不正な文字列を入力して、webサイトのOSコマンドを実行できてしまう脆弱性
(E)ディレクトリ・リスティング：URLで指定したディレクトリのファイル一覧が表示されてしまう脆弱性
(F)メールヘッダ・インジェクション：メールヘッダを改ざんすることで不特定多数へのメール送信が可能になってしまう脆弱性
(G)パス名パラメータの未チェック／ディレクトリ・トラバーサル：webサイトが公開を意図していないディレクトリにアクセスできてしまう脆弱性
(H)意図しないリダイレクト：クエリストリングなどを変更することで、別のサイトに遷移させられてしまう脆弱性
(I)HTTPヘッダ・インジェクション： HTTPヘッダを改ざんすることでユーザに表示されるwebコンテンツが改ざんされる脆弱性
(J)認証：認証の仕組みが脆弱でないか
(K)セッション管理の不備：セッション管理が適切か
(L)認可制御の不備、欠落：アクセス制御・認可制御が適切か
(M)クローラへの耐性：検索データベースを作成するためにウェブページのデータを回収する「クローラ」と呼ばれる自動プログラムのアクセスに耐えうるか
－－－－－－－－－－－－－－－－－－－－－－－－－－－－
</div></details>

#3.総合判定所見
検査の結果の所見として「要治療・精密検査」「差し支えない」「以上は検出されなかった」の3段階があります。

|総合判定所見|基準|
|---|---|
|**要治療・精密検査**|危険度が「高」・「中」の脆弱性が検出された|
|**差し支えない**|危険度が「低」の脆弱性のみ検出された |
|**異常は検出されなかった**|脆弱性は検出されなかった|

危険度「高」・・・(A),(D),(G),(L),(E)
危険度「中」・・・(B),(C),(E),(F),(H),(I),(J),(K),(M)
危険度「低」・・・(E),(J),(K),(M)
※検査結果によって危険度が変わる脆弱性も存在します

#4．おわりに
あと書いてないことは、実際の検査コードくらいしかないほど簡単な検査です。
以下に実際に検査を行った記事があるので、興味がある人は見てみてください。
脆弱性検査やってみたいけど、詳しい知識しらない・・・という方の入門にもおススメです。

formzu『[【Web技術】BurpSuiteでウェブ健康診断をしてみる](https://blog.formzu.com/burp_health_check)』
【Laravel】ミドルウェアの作成、登録方法

##はじめに
MVCの説明では登場しなかった「ミドルウェア」について簡単に説明します。
#ミドルウェア(middleware)とは
ミドルウェアとは、ユーザーがリクエストを送信してからコントローラーで処理を行う前もしくは後に、自動的に何らかの処理を行うプログラムのことです。
ミドルウェアを利用しない場合、

```
リクエスト　→　コントローラーのアクション　→　レスポンス
```

という流れになるですが、ミドルウェアを利用すると

```
リクエスト　→　ミドルウェア(前処理)　→　コントローラーのアクション　→　ミドルウェア(後処理)　→　レスポンス
```

という流れになります。

#ミドルウェアの作成
コマンドプロンプトもしくはターミナルを起動し、以下のコマンドを実行します。

```
php artisan make:middleware ミドルウェア名
```

すると、app>Http>Middleware内にファイルが作成されます。
ファイルを開いてみると、

```php:○○Middleware.php
<?php

namespace App\Http\Middleware;

use Closure;
use Illuminate\Http\Request;

class ミドルウェア名
{
    ※　コメント部分は省略
    public function handle(Request $request, Closure $next)
    {
        return $next($request);
    }
}

```

と記述されているはずです。
handleメソッドは、ミドルウェアをコントローラーの前に実行するか後に実行するかで実装の仕方が変わってきます。

#ミドルウェアの3つの登録方法
1) 個々のルーティングに記述する方法

```php:web.php
Route::HTTPメソッド('URI', 'コントローラー名@アクション名')->middleware(ミドルウェア名::class);
```

2) グローバルミドルウェアに登録する方法
まず、app>http内にあるKernel.phpを開きます。

```php:Kernel.php
protected $middleware = [
          .
          .
          .
];
```

この中にグローバルミドルウェアに登録したいミドルウェアを記述します。
ここに記述した場合は、個々のルーティングでミドルウェアを呼び出す必要がないので、->middleware(ミドルウェア名::class)の部分は記述不要です。

3) グループ化して登録する方法
2)と同じく、Kernel.phpを開きます。

```php:Kernel.php
protected $middlewareGroups = [
          .
          .
          .
];
```

既に記述されているwebやapiと同じように、グループを作って以下のように記述します。

```php:Kernel.php
'グループ名' => [
    \App\Http\Middleware\ミドルウェア名::class,
     .
     .
     .

],
```

ルーティングは以下のように記述します。

```php:web.php
Route::HTTPメソッド('URI', 'コントローラー名@アクション名')->middleware('グループ名');
```

##おわりに
何か誤りや気付き等ありましたら、ご指摘願います。
React 入門道場　~JSXってなんやねん~

# はじめに
Reactを学習していてJSXについて理解が浅かったので今回簡単ににまとめてみました。

# JSXとは？

「JSX」とは、「JavaScript XML」の略であり、JavaScriptの拡張言語である。
Reactのコンポーネント内でマークアップ言語を記述するためのHTMLな構文が使用可。

# なぜJSXを使用するのか？
Reactの特徴として、HTMLタグを埋め込むことが出来る.
ブラウザ上に画面描画する際にHTMLのドキュメント言語にJavascriptからHTML変換している。

```jsx
React.createElement(
  MyButton,
  {color: 'blue', shadowSize: 2},
  'Click Me'
)
```

例えば、上記の記述があったとしてこれらを読み込む際、ReactではReact.createElement構文を使用してどんなHTMLであるか定義しなければばらない。そうすると、毎回React.createElementを記述するのは大変になる:sweat_smile:

そんな時、JSXの構文で書いた方がスッキリする。

```jsx
<MyButton color="blue" shadowSize={2}>
  Click Me
</MyButton>
```

この２つの構文は見た目は違っても出力の結果は同じである。このことを等位構文と呼ぶ。
HTMLの記述に慣れているし、毎回React.createElement構文も書くのは大変なのでJSXを使用していきましょう！

# JSXは何しているのか？
__JSXはJavaScriptに変換される__

コンパイル時、
1.JSX → React.createElementの式に変換

```jsx
<MyButton color="blue" shadowSize={2}>
  Click Me
</MyButton>
```
↓

```js
React.createElement(
  MyButton,
  {color: 'blue', shadowSize: 2},
  'Click Me'
)
```


2.React要素を生成


>[React公式](https://ja.reactjs.org/docs/jsx-in-depth.html)
[日本一わかりやすいReact入門【基礎編】JSXの記法](https://www.youtube.com/watch?v=gLbTluYSb_U)
conoha wing にaws-cli v2をインストールする

# 背景･課題

- VPS上に構築していたWordpressサイトをconoha wingに移動させた｡
- VPSでは､シェルスクリプトでバックアップファイル（データベースとファイル群）を作成してAWS S3にアップロードしてきたのだけど､どうすればよいのだろう?
    - Conoha Wing標準のバックアップはサーバ全体のバックアップ･リストアなので使い勝手が悪い
        - 例えば複数のWordpressサイトを運用していた場合､全部リストアされてしまう｡
    - [ConohaのサポートページではWordpressの`BackWPup`プラグイン](https://www.conoha.jp/lets-wp/wp-backup/#section01-01)が推奨されていて､これは無料版でもS3バックアップできるのだけど､サードパーティのプラグインにIAMユーザのシークレットキーを付与するのはなんか気持ち悪いので避けたい｡

# 結論

VPSと同じようにできた｡具体的にはaws-cli v2とmysqldumpを使ってシェルスクリプト書いてそれをcronで実行｡

# 手順

## mysqldump

最初からインストールされていた｡

## AWS CLI

これまでAWS CLIはroot権限のあるサーバでしか使ったことないので､一般ユーザできるのだろうか?と思ったらできた｡
ここだけ印象深かったので記事タイトルにしました｡

```bash
curl "https://awscli.amazonaws.com/awscli-exe-linux-x86_64.zip" -o "awscliv2.zip"
unzip awscliv2.zip
./aws/install -i ~/.local/bin/aws-cli -b ~/.local/bin
```

最後の行がポイント｡`-i`,`-b`に書き込み権限のあるディレクトリを指定すれば､`sudo`なしでインストールできる｡
conoha wingのパス（`echo $PATH`）に`~/.local/bin`が含まれていたのでそれを活用

| オプション | 意味 |
|:-:|:-:|
| -i  | インストール先ディレクトリ  |
| -b  | コマンドのシンボリックリンク作成先  |

# 関連URL

- [Installing, updating, and uninstalling the AWS CLI version 2 on Linux - AWS Command Line Interface](https://docs.aws.amazon.com/cli/latest/userguide/install-cliv2-linux.html)
- [【初心者も簡単】WordPressのバックアップを取る3つの方法！｜ワプ活](https://www.conoha.jp/lets-wp/wp-backup/#section02-01)
カスタマイズしたvalidationチェックを行う

#開発環境
- OS：macOS Big Sur 11.2.2
- Ruby：2.6.5
- Ruby on Rails：6.0.0
- テキストエディタ：Visual Studio Code

#課題
presenceチェックとかnumericalityチェックとかだけではなくて、もっと複雑な入力制御がしたい。
具体的には、入力したある要素の状態に応じて他の要素に制限をつけたい。

プレゼントの申し込み機能というものを実装している。各プレゼントは必要ポイント数が決まっていて、ユーザーの投稿数（料理のレシピ投稿数）が必要ポイントに達している場合にのみ申し込みが受け付けられる仕様にしたい。ついでに「ポイントが足りません」みたいなエラーメッセージを出力したい。

#解決方法
**自分でメソッドを作って指定する。**

```present_order_form.rb
validate :present_check
  def present_check
    # 投稿したレシピが足りていない場合は申し込みできない
      recipes = user.recipes
      point = present.point
      if point > recipes.length
        errors.add(:present, "このプレゼント応募には#{point}投稿が必要です")
        return
      end    
  end
```

これだけ。``validate:``の後にメソッドを指定するだけ。
エラーメッセージは``errors.add(カラム,"出力内容")``で設定できる。
なんと簡単に設定できるのだろう。

#その後
・・・と味を占めて他のところでも使ってみたらエラーが起きた。

```recipes_form.rb
validates :names_check
```
普通のヘルパーメソッドを使うときの癖で``validates``と複数形にしてしまったのが原因。自分でカスタマイズしたメソッドを指定するときは単数形にする。
ちなみに、

```
ArgumentError:
  You need to supply at least one validation
```

出てくるエラーがこうなのだが、``at least one validation``は、あくまで「こちらが用意しているvalidatorの中から少なくとも1つ」指定してね〜くらいの意味なんだろう。

取り違えやすいので、

- 複数用意されているヘルパーメソッドを使うので、**validates**
- 専用(個別に)カスタマイズしたメソッドを使うので、**validate**

と覚えておく。
MKMapView 今日使用したプロパティ（復習）

#今回の内容

今日使用したMKMapViewのプロパティを復習

#コードと簡単解説

* Main.storyboardでMKMapViewを作成しておきます。

```Swift:
    @IBOutlet weak var mapView: MKMapView!
```
##Mapの見た目（.mapType）

```Swift:.mapType
        mapView.mapType = .standard
        mapView.mapType = .satellite  //航空表示
        mapView.mapType = .satelliteFlyover //立体的な航空表示
        mapView.mapType = .hybrid //航空表示に.standardのmapが表示
        mapView.mapType = .hybridFlyover //立体的な航空表示に.standardのmapが表示
```

##スクロールをさせるか？（.isScrollEnabled）

```Swift:.isScrollEnabled
        mapView.isScrollEnabled = true  //スクロールができる
        mapView.isScrollEnabled = false  //スクロールができない
```

##ズームのできるようにするか？（.isZoomEnabled）

```Swift:.isZoomEnabled
        mapView.isZoomEnabled = true  //ズームができる
        mapView.isZoomEnabled = false  //ズームできない
```

##マップを回せるようにするか？（.isRotateEnabled）

```Swift:.isRotateEnabled
        mapView.isRotateEnabled = true  //回せる
        mapView.isRotateEnabled = false  //回せない

```

#終わり
ご指摘、ご質問などありましたら、コメントまでお願い致します。
スクラムを体感してみて

# 背景
アジャイル開発、スクラムの存在は耳では聞いていましたが、
実際にきっちりルールに則って実施しているチームに参画するのは初めてだったので、
実際に経験して学んだこと、思ったことを残します。

# スクラム
## 概要
> スクラムは、チームが作業を管理するために使用するフレームワークです。 

[Azure DevOps - スクラムとは](https://docs.microsoft.com/ja-jp/devops/plan/what-is-scrum)

開発の進め方を指し示すものと考えて良いかと思います。

## 役割
スクラムでは３つの役割に分担して開発を進めます。
### プロダクトオーナー
> チームが何を構築し、なぜチームが構築を行うのかについて責任を負います。 

[Azure DevOps - product-owner](https://docs.microsoft.com/ja-jp/devops/plan/what-is-scrum#product-owner)

俗に言うビジネスサイドです。
何を作るのか、何を優先するのかを決めます。

### スクラムマスター
>スクラム マスターは、チームがどのように改善できるのかについて絶えず目を通しながら、スプリント中に発生する障害や他のブロックの問題も解決します。 

[Azure DevOps - scrum-master](https://docs.microsoft.com/ja-jp/devops/plan/what-is-scrum#scrum-master)

チームの開発を円滑に進める立場です。
リーダーではなく、チームが主体的に開発するのをサポートし、
改善のサイクルを回します。

### スクラムチーム
> これらは、実際に製品を構築する個人です。 チームは、製品のエンジニアリングとそれにかかる品質を所有しています。

[Azure DevOps - scrum-team](https://docs.microsoft.com/ja-jp/devops/plan/what-is-scrum#scrum-team)

俗に言う開発者です。
作るものの品質に責任を負います。

## 道具
スクラムで使用する道具です。

### プロダクトバックログ
> プロダクトバックログ は、チームが提供できる値の優先順位付きリストです。 

[Azure DevOps - product-backlog](https://docs.microsoft.com/ja-jp/devops/plan/what-is-scrum#product-backlog)

円滑な開発を手助けするとともに、
開発者とビジネスサイドを繋げます。

プロダクトオーナーは必ず優先順に並び替える必要があり、
開発者は優先度が高いものから取り掛かる必要があります。

プロダクトバックログを構成するタスクの塊を
PBI(Product Backlog Item)といいます。

### タスクボード
> チームが作業している各バックログ項目を一覧表示し、それを完了するために必要なタスクに分割します。

[Azure DevOps - task-board](https://docs.microsoft.com/ja-jp/devops/plan/what-is-scrum#the-task-board)

PBI内にどんなタスクがあるか、
それらの進捗状況はどうかが見えるツールです。

タスクは開発者で洗い出し、タスクボードに追加します。
タスクは1つ当たり6h以下が望ましいと思います。
（8hのうち2hをスクラムイベントに使用すると換算し、1日内で終わる量のタスクに分割する）

スプリント中は、逐次進捗状況を反映します。

- 手をつけていない
- 進行中
- 完了

というタスクの状況に分類されます。

### バーンダウンチャート
> 残りの作業の日次合計をプロットするグラフ。 

[Azure DevOps - sprint-burndown](https://docs.microsoft.com/ja-jp/devops/plan/what-is-scrum#the-sprint-burndown)

チームの残り作業が一目で分かるグラフです。
また進捗スピードも分かります。
スピードが遅い場合は何かが滞っている可能性が高いので
メンバーに聞いてサポートに入りましょう。

## イベント
スクラムではスクラムイベントというイベントをスプリント内で開催し、
改善のサイクルを回したり開発を円滑に進めたりします。

### プランニング
スプリントの期限内で何ができるかを明確にします。

1部ではプロダクトオーナーが参画し、
スプリント内のPBIを全て、いつでも開発が始められる状態にします。

2部ではPBIの終了条件を満たすにはどんなタスクが必要か洗い出し、
かかる工数と担当者を割り振ります。
スプリント内に収まる工数かどうか検証し、
収まらない場合は次スプリントに持ち込む交渉をします。

### デイリースクラム
いわゆる朝会です。
15分で済ましましょう。
報告会ではなく、メンバーの問題を解決する場所です。

### スプリントレビュー
完成したものを披露しフィードバックを得ます。
達成できたこととできなかったことを明確にし、
次回にどう作るか議論します。

### レトロスペクティブ
KPT（良かったこと、悪かったこと、改善点を議論）をします。
改善点を次スプリントで活かし、
より良い開発にしていきます。

# まとめ
以上が経験したスクラム開発の簡単な中身になります。
スクラムを採用することで、ビジネスサイドにも開発者にもユーザーにも嬉しい開発をすることができます。

# 参考
[Azure DevOps](https://docs.microsoft.com/ja-jp/devops/plan/what-is-scrum)
herokuデプロイ時にパスワードが要求された

#内容

編集したアプリをgithubにpushした後、herokuにデプロイしようとしたところパスワードの要求をされましたが、、、

```
$ git push heroku HEAD
Username for 'https://git.heroku.com': 
Password for 'https://@git.heroku.com': 
remote: !       WARNING:
remote: !       Do not authenticate with username and password using git.
remote: !       Run `heroku login` to update your credentials, then retry the git command.
remote: !       See documentation for details: https://devcenter.heroku.com/articles/git#http-git-authentication
fatal: Authentication failed for 'https://git.heroku.com/your_app.git/'
```

usernameかpasswordどちらかを間違えたのか、怒られました。

#解決法

ひとまず、言われた通り

```
$ heroku login
```
を試してみると、

```
heroku: Press any key to open up the browser to login or q to exit: 
```

と言われたので、テキトーにキーを押すと、herokuのloginページのブラウザが立ち上がります。

![スクリーンショット 2021-08-28 22.50.07.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1067124/e7a88ab4-14e0-12a9-7c23-ae12ae31a4c7.png)
logInボタンを押して、ターミナルに戻ると

```
Logging in... done
Logged in as メールアドレス
```

ログインできたっぽい！

その後、

```
$ git push heroku HEAD
```

を実行すると、、、、デプロイできた！！！
DBUnit + spring-test-dbunit を複数スキーマMySQLで使う設定

## 概要

SpringBoot環境でDBUnitを使う際、spring-test-dbunitを使うとアノテーションで指定するだけでデータベースのセットアップとアサーションができて便利ですね。

spring-test-dbunitは2021年8月現在最終コミットが2016年となっていて、残念ながら更新は完全に止まってしまっているのですが、まだそこそこ使われているようです。

ここではDBUnit + spring-test-dbunitを複数スキーマ切ってあるMySQLで使う際の問題について扱いますので、導入などは他の記事を参考にしてください。

## 問題

ひとつのDBにテスト用のスキーマと検証用のスキーマがある等、複数スキーマの環境でDBUnit + spring-test-dbunitを使うとAmbiguousTableNameExceptionが起きて困りました。

（特に制約がなければテストで使用するDBをH2などのインメモリDBにすればこのような問題は起きないしそうしたいところですが…）

スキーマは指定しているのですがどうやら正しく処理がされていないようです。

## どう設定すればよかったか

DBUnitが使用するコネクションをDataSourceベースのDatabaseDataSourceConnectionにし、MetadataHandlerとしてMySqlMetadataHandlerを設定します。

```java
@Configuration
public class TestConfig {
    @Autowired
    private DataSource dataSource;

    @Bean
    public IDatabaseConnection dbUnitDatabaseConnection() throws SQLException {
        // DatabaseDataSourceConnectionを使用する。テーブル名曖昧問題を解決するにはここでスキーマ名を設定する必要がある
        // afterTestMethodでconnectionのcloseがされるのでDataSourceベースでないクラスを設定すると
        // 2つ目以降のテストでconnectionがclose済みとなり失敗する
        IDatabaseConnection conn = new DatabaseDataSourceConnection(dataSource, "schema_for_test");
        // MetadataHandlerをMySqlMetadataHandlerに設定する
        // この設定をしないとSchema修飾が正しく処理されずスキーマ間で同じ名前のテーブルがあるDBを扱うと失敗する
        conn.getConfig().setProperty(DatabaseConfig.PROPERTY_METADATA_HANDLER, new MySqlMetadataHandler());
        conn.getConfig().setProperty(DatabaseConfig.PROPERTY_DATATYPE_FACTORY, new MySqlDataTypeFactory());
        return conn;
    }
}
```

## 解説

spring-test-dbunitは、DBUnitが使用するコネクションとして、DataSourceかIDatabaseConnectionのいずれかを探して使用しようとします。

テーブル名曖昧問題が起きなければDataSourceで恐らく問題ないと思いますが、DataSourceだとスキーマを指定していても動作してくれないためIDatabaseConnectionを使う必要があると思います。

IDatabaseConnectionの実装として、MySqlConnectionを指定すればテーブル名曖昧問題は解決するのですが、その場合別の問題が起きます。

spring-test-dbunitを使用するとafterTestMethodでconnectionのcloseが呼ばれるため、MySqlConnectionだとDBUnitのテストが２つ以上あるときに最初のテスト以外は `Connection is closed` といったメッセージとともに失敗してしまいます。

よってDataSourceベースのDatabaseDataSourceConnectionを使用します。これでコネクションクローズ問題は解消するのですが、そのままだと相変わらずテーブル名曖昧問題は起こるままです。MetadataHandler#getSchema(ResultSet)の実装がDefaultMetadataHandlerだとMySQLのときにスキーマ名が取得できないのが原因で、上で示したようにMetadataHandlerとしてMySqlMetadataHandlerを設定することでテーブル名曖昧問題も解決となります。

なおDBUnitは2.7.2、spring-test-dbunitは1.3.0、コネクションプール実装としてはHikariCPで上記設定の動作を確認しています。

## リンク

[Spring Test DBUnit – Introduction](https://springtestdbunit.github.io/spring-test-dbunit/)
[DbUnit – Configurable Features and Properties](http://dbunit.sourceforge.net/properties.html)
【Swift】UITextViewでHTMLを表示してアンカータグをタップ可能にする

# やりたいこと
UITextViewでhtmlを表示してアンカータグをタップ可能にかっただけなのですが、巷の記事を参考にしても実装が出来なかったので成功体験を共有できればと思います。

# 環境
* Xcode：12.5.1
* Swift：5.4.2


# 実装
NSAttributedString型に変換する際にオプションを指定してあげるだけです。
これでHTMLとして表示することが可能です。

``` swift
    textView.attributedText = convertToAttributeString(contents: information.infoContents)

    private func convertToAttributeString(text: String) -> NSAttributedString? {
        guard let data = text.data(using: .utf8) else { return nil }
        do {
            return try NSAttributedString(data: data, options: [.documentType: NSAttributedString.DocumentType.html, .characterEncoding:String.Encoding.utf8.rawValue], documentAttributes: nil)
        } catch {
            return nil
        }
    }
```

## アンカータグをタップしたときにブラウザで開けるようにする
UITextViewのプロパティを設定する必要があります。
ポイントは以下の点です。

* Behaviorの`Selectable`をtrueにする
* Behaviorの`Editable`をfalseにする
* Data Detectorsの`Link`をtrueにする
* Interactionの`User Interaction Enabled`をtrueにする

![textview_editing.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/240651/284443c3-e5cf-c4a6-164a-5495d6ee7276.png)
![textview_property2.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/240651/c999781b-fd62-5a83-7657-f83c347ef59e.png)
これで表示されるリンクをタップするとSafariが立ち上がり対象のURLが表示されるはずです。
基本情報技術者試験勉強0828

本日の積み上げ結果
基本情報技術者試験勉強
平成30年秋過去問
平成31年春過去問
間違えた問題の復習
AWSの本を読む

JIS Q 27001:2014(情報セキュリティマネジメントシステム－要求事項)に基づいてISMS内部監査を行った結果として判明した状況のうち，監査人が指摘事項として監査報告書に記載すべきもの　リスクアセスメントを実施した後に，リスク受容基準を決めた。

IT投資評価を，個別プロジェクトの計画，実施，完了に応じて，事前評価，中間評価，事後評価を行う。事前評価について説明したもの　投資目的に基づいた効果目標を設定し，実施可否判断に必要な情報を上位マネジメントに提供する。

自然言語インタフェース　自然言語インタフェースは、人間同士の会話のように自然言語を用いてコンピュータとの対話を行うインタフェース技術です。

連関図法　複雑な要因の絡み合う事象について，その事象間の因果関係を明らかにする方法である。

ボットネットにおけるC&Cサーバの役割　侵入して乗っ取ったコンピュータに対して，他のコンピュータへの攻撃などの不正な操作をするよう，外部から命令を出したり応答を受け取ったりする。

IDS サーバやネットワークを監視し，侵入や侵害を検知した場合に管理者へ通知する。

システム化計画の立案において実施すべき事項　システム構築の組織体制を策定するとき，業務部門，情報システム部門の役割分担を明確にし，費用の検討においては開発，運用及び保守の費用の算出基礎を明確にしておく。

Webシステムにおいて，Webサーバとアプリケーション(AP)サーバを異なる物理サーバに配置する場合のメリットとして，適切なものはどれか。　負荷が軽い静的コンテンツへのリクエストはWebサーバで処理し，負荷が重い動的コンテンツへのリクエストはAPサーバで処理するように，クライアントからのリクエストの種類に応じて処理を分担できる。

ロックの粒度　データを更新するときに，粒度を大きくすると，他のトランザクションの待ちが多くなり，全体のスループットが低下する。

請負契約を締結していても，労働者派遣とみなされる受託者の行為　休暇取得の承認を発注者側の指示に従って行う。

ネットビジネスでのOtoO モバイル端末などを利用している顧客を，仮想店舗から実店舗に，又は実店舗から仮想店舗に誘導しながら，購入につなげる仕組みである。

プログラムのコーディング規約に規定する事項のうち，適切なもの　領域割付け関数を使用するときは，割付けができなかったときの処理を記述する。

ビッグデータの処理で使われるキーバリューストアの説明として，適切なもの　任意の保存したいデータと，そのデータを一意に識別できる値を組みとして保存する。

不正が発生する際には"不正のトライアングル"の3要素全てが存在すると考えられている。"不正のトライアングル"の構成要素の説明として，適切なものはどれか。　"機会"とは，情報システムなどの技術や物理的な環境，組織のルールなど，内部者による不正行為の実行を可能又は容易にする環境の存在である。

OpenFlowを使ったSDN(Software-Defined Networking)の説明として，適切なものはどれか。　データ転送と経路制御の機能を論理的に分離し，データ転送に特化したネットワーク機器とソフトウェアによる経路制御の組合せで実現するネットワーク技術

ファジングで得られるセキュリティ上の効果はどれか。　ソフトウェアの脆弱性を検出できる。

機械学習における教師あり学習の説明として，最も適切なものはどれか。　正解のデータを提示したり，データが誤りであることを指摘したりすることによって，未知のデータに対して正誤を得ることを助ける。

冗長構成におけるデュアルシステムの説明として，適切なものはどれか。　一つの処理を2系統のシステムで独立に行い，結果を照合する方式である。

スコープ　作業及び成果物のうち必要とするものだけを特定し、定義するために必要なプロセスを含む。

データ検索時に使用される，理想的なハッシュ法の説明として，適切なものはどれか。　データを特定のアルゴリズムによって変換した値を格納アドレスとして用いる，高速でスケーラビリティの高いデータ検索技術である。

非機能要件項目はどれか。　システム基盤に関わる可用性，性能，拡張性，運用性，保守性，移行性などの項目

社内カンパニー制を説明したものはどれか。　事業分野ごとの仮想企業を作り，経営資源配分の効率化，意思決定の迅速化，創造性の発揮を促進する。

インターネットで利用される技術の標準化を図り，技術仕様をRFCとして策定している組織はどれか。　IETF

複数のプロセスから同時に呼び出されたときに，互いに干渉することなく並行して動作することができるプログラムの性質を表すものはどれか。　リエントラント

GUIの部品の一つであるラジオボタンの用途として，適切なものはどれか。　互いに排他的な幾つかの選択項目から一つを選ぶ。

サイトアクセス者の総人数に対して，最終成果である商品やサービスの購入に至る人数の割合を高める目的でショッピングサイトの画面デザインを見直すことにした。効果を測るために，見直し前後で比較すべき，効果を直接示す値はどれか。　コンバージョン率

著作者人格権に該当するものはどれか。　自らの意思に反して著作物を変更，切除されない権利

3Dプリンタの機能の説明として，適切なものはどれか。　熱溶解積層方式などによって，立体物を造形する。

IoTの応用事例のうち，HEMSの説明はどれか。　太陽光発電装置などのエネルギー機器，家電機器，センサ類などを家庭内通信ネットワークに接続して，エネルギーの可視化と消費の最適制御を行う。

プロセスイノベーションに関する記述として，適切なものはどれか。　製品の品質を向上する革新的な製造工程を開発する。
【React】 Each child in a list should have a unique "key" prop.のエラー解決

# エラー発生
AWS amplifyのSNSチュートリアルを実装中に、下記エラーに遭遇しました。

```
index.js:1 Warning: Each child in a list should have a unique "key" prop.

Check the render method of `PostList`. See https://reactjs.org/link/warning-keys for more information.
    at span
    at PostList (http://localhost:3000/static/js/main.chunk.js:667:3)
    at PostsBySpecifiedUser (http://localhost:3000/static/js/main.chunk.js:1206:69)
    at Route (http://localhost:3000/static/js/vendors~main.chunk.js:573926:29)
    at Switch (http://localhost:3000/static/js/vendors~main.chunk.js:574128:29)
    at Router (http://localhost:3000/static/js/vendors~main.chunk.js:573561:30)
    at HashRouter (http://localhost:3000/static/js/vendors~main.chunk.js:573226:35)
    at ThemeProvider (http://localhost:3000/static/js/vendors~main.chunk.js:434157:24)
    at div
    at App (http://localhost:3000/static/js/main.chunk.js:218:91)
    at Provider (http://localhost:3000/static/js/vendors~main.chunk.js:570746:20)
```
エラー文を翻訳すると、
>警告 リストの各子は、ユニークな "key "propを持つ必要があります。

のようになるので、該当箇所を探してみました。

# エラー箇所特定
詳細は省きますが、下記コードが今回のエラーの原因となります。

```example.tsx
  {posts.map((post) => (
            <span>
              <PostItem post={post} />
              <Divider component="li" />
            </span>
          ))}
```

# エラー解決

https://reactjs.org/docs/lists-and-keys.html#keys

こちらの記事を参考に、`map`で囲われている要素の**親（？）要素**である`<span>`に`key`を設定することで、無事にエラーを解消することが出来ました。

```example.tsx
  {posts.map((post) => (
            <span key={post.id}>
              <PostItem post={post} />
              <Divider component="li" />
            </span>
          ))}
```

# まとめ
最近はエラー文をよく読み、内容をきちんと理解することを心がけています。

エラー文を理解して、解決につながる箇所を仮定し、その仮定に基づいて検索をかけていきます。

そのように順序立ててエラーを紐解いていくことで、いままでよりエラー解決に至るまでの時間も短くなりましたし、解決できた理由も明確にすることが出来るようになりました。

この調子で、今後もエラーときちんと向き合って行こうと思います。