OmniAICreator/Qiita-1.07M huggingface dataset:
OS や開発言語の〇〇PATHって何よ？　③環境変数PATH

# 前回のお話

* プログラムを実行する場合、疑いの余地なく一意に決まる方法=フルパス/FQDNで呼ぶ必要があるよ。
* フルパスでの呼び方は、可搬性に劣るので、そのままだと問題ありありだよ。
* そこで、コマンドサーチパスの概念を導入するよ。

## 名前空間導入のデメリット

ディレクトリを導入すると、同一空間に複数の同一名称のファイルが存在できるようになりました。このファイルを一意に特定するにはフルパス（FQDN）という、長い文字列をコマンドとして利用する必要があります。ここまでに出てきた関連する原則は

* **コンピュータは複数存在しえるものを「勝手に類推」して使ってしまってはいけない。**

です。でも実際問題

``` bash
$ /usr/bin/python
$ python
```

は、両方同様に動作します。あれ？「フルパスいらないじゃん。」確かにそう見えます。これは、ユーザの利便性を向上させるために導入された以下のルールのおかげです。

* **コンピュータは「ユーザが指定した」パスを、順番に「実行ファイル」を探し出して、それを実行することを許される**
  
これにより、コンピュータは以下の流れに従って、実行すべきプログラムを「探し出して」「実行」します

* ユーザの指定したパスの中から順に、実行対象のファイルの名前を探査する。
* 最初にマッチしたファイルを実行し、それ以上の探査は実行しない。
  
ちょうど以下の図のようなイメージです。

![PATH-コマンドサーチパス.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/837176/71e7936f-4817-cb50-6d01-13d2c08ff8b2.png)

この図で、①～④のディレクトリが、調査対象として登録査定されているものとします。

``` bash
$ python
```

①：pythonファイルは存在しないため、次のパスの探査に移る
②：pythonファイルは存在しないため、次のパスの探査に移る
③：pythonファイルが存在しているため、コンピュータは 以下と解釈して実行する。

``` bash
$ /home/shupe/python/bin/python
```

この時既に③でプログラムが発見されているため、コンピュータは④を検索しません。

## 環境変数PATH

コンピュータはユーザからどうやって「ここを探せ」という情報を与えられるのでしょう？多くのOS（オペレーティングシステム）では「環境変数」という仕掛けを使います。環境変数とは、ユーザがコンピュータに「動作環境」を知らしめるための設置を保持する変数です。
環境変数の例を以下に示します。

```
HOME="/home/***"     　　ユーザのホームディレクトリ
LANG="ja_JP.UTF-8"       利用する文字コード
LOGNAME="***"            ユーザ名
SHELL="/bin/bash"        ログインシェル
```
どの値も、ユーザとコンピュータの「動作環境」に関する「決めごと」です。さて、前述のコマンドサーチパスもユーザとコンピュータの間の決めごとなので、当然環境変数を利用して教えてあげる必要があります。歴史的な経緯からなのか、どのOSでも環境変数 PATH を利用して設定します。。参考まで、私の環境のPATHをお見せします。

```
$ echo $PATH
/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin
```

PATHは **:** をセパレータとして複数設定することが可能であることが読み取りれます。この場合、以下の順でコマンドを探して来ます。

1. /usr/local/sbin
2. /usr/local/bin
3. /usr/sbin
4. /usr/bin
5. /sbin

### よくあるはまりポイント

よくある問題として「〇〇というコマンドが使えない。」というものがあります。

```
$java
コマンド 'java' が見つかりません。
```

この場合考えられるのは

1. 対象のプログラムが存在しない
2. 対象のプログラムがコマンドサーチパス上に存在しない。

1は対象のプログラムを導入する必要がありますし、パッケージャを使えばまぁ普通に動作します。2の場合は以下のコマンドで環境変数を設定する必要があります。

```
export PATH=<PATH/TO/TARGET/DIRECTORY>:$PATH
```

ここで注意すべきは **「コマンドサーチパスはディレクトリである必要がある」** ことです。
(コマンドサーチパスの役割を理解していれば当然ですね。)ときどき、初心者の皆さんはここで「ファイル」を追加したりしますので注意が必要です。

また、こんな失敗もあるあるです。

```
export PATH=<PATH/TO/TARGET/DIRECTORY>
```

これだと、従来のPATH設定をすべてつぶしてしまっているので、あらゆるコマンドを探すことができなくなるので、注意が必要です。 
```
export PATH=$PATH:<PATH/TO/TARGET/DIRECTORY>
or 
export PATH=<PATH/TO/TARGET/DIRECTORY>:$PATH
```
とすることで、上書き前のPATHの値を保持しますので、どちらか都合の良い方を洗濯して利用しましょう。
**~/.bash_profile** や **~/.bashrc/** を編集時にこの失敗をすると、ドツボにはまるのでご注意を。

## 名前解決

ここでの環境変数PATHの様に、ある論理的な名前を実際の動作環境に合わせて読み替える処理を **「名前解決」** といいます。せっかくなので覚えておきましょう。


## まとめ

* コマンドサーチパスの導入によって、ユーザの利便性は向上するよ
* OSとユーザの決めごとは **環境変数** を使って設定するよ
* コマンドサーチパスは環境変数 **PATH** を使って設定するよ
* コマンドサーチパスの設定は注意して実行する必要があるよ。

次回は、その他の〇〇PATHについてお話します。
railsチュートリアル第五章 アセットパイプライン

##Sassとアセットパイプライン
最近のRailsに追加された機能の中で最も特筆すべき機能の１つは、CSS、JavaScript、画像などの静的コンテンツの生産性と管理を大幅に強化する「```アセットパイプライン```（Asset Pipeline）」
アセットパイプラインは、Webpackや、Yarn（のどちらともうまく動きます。

このセクションでは、```アセットパイプラインの概要```と、素晴らしいCSS生成ツールである```「Sass」の使い方```について説明します。

###アセットパイプライン
Rails開発者の視点からは、```アセットディレクトリ```、```マニフェストファイル```、```プリプロセッサエンジン```という、3つの主要な機能が理解の対象となります。

#####アセットディレクトリ
```app/assets```: 現在のアプリケーション固有のアセット
```lib/assets```: あなたの開発チームによって作成されたライブラリ用のアセット
```vendor/assets```: サードパーティのアセット（デフォルトでは存在しません）

```
$ ls app/assets/
config  images  stylesheets
```
```取り上げたカスタムCSSが配置された場所と、その理由について理解することができる ```と思います。つまり、custom.scssはサンプルアプリケーション固有のアセットなので、app/assets/stylesheetsに配置されていたのです。

####マニフェストファイル
静的ファイル（アセット）を上記の場所へそれぞれ配置すれば、マニフェストファイルを使って、それらをどのように1つのファイルにまとめるのかをRailsに指示することができます。

```
 *= require_tree .
```
app/assets/stylesheetsディレクトリ（サブディレクトリを含む）中のすべてのCSSファイルが、アプリケーションCSSに含まれる

```
*= require_self
```
CSSの読み込みシーケンスの中で、application.css自身もその対象に含めています

#####プリプロセッサエンジン
必要なアセットをディレクトリに配置してまとめた後、Railsはさまざまなプリプロセッサエンジンを介してそれらを実行し、ブラウザに配信できるようにそれらをマニフェストファイルを用いて結合し、サイトテンプレート用に準備します
Railsはどのプリプロセッサを使うのかを、ファイル名の拡張子を使って判断します。

プリプロセッサエンジンは、繋げて実行する（chain）ことができます。

```foobar.js.coffee ```

上の拡張子の場合、CoffeeScriptプロセッサ経由で実行されます。

```foobar.js.erb.coffee ```

上の拡張子の場合は、CoffeeScriptとERbの両方で実行されます。

#####本番環境での効率性
アセットパイプラインの最大のメリットの1つは、```本番のアプリケーションで効率的になるように最適化されたアセットも自動的に生成```
機能を個別のファイルに分割し、（インデントを多用して）読みやすいフォーマットに整えていました。これは、プログラマにとっては便利な方法ですが、```本番環境にとっては非効率```です。
最小化されていないCSSファイルを多数に分割すると、```ページの読み込み時間が著しく遅くなる```から
(読み込み時間が長くなると```ユーザー体験の質が下がる```ので、読み込み時間は重要な指標の1つです）

アセットパイプラインを使うと、この```「開発効率と読み込み時間のどちらを重視するか」という問題について悩む必要がなくなります。```
開発環境ではプログラマにとって読みやすいように整理しておき、```本番環境ではAsset Pipelineを使ってファイルを最小化```すればよいのです
Asset Pipelineがすべてのスタイルシートを```1つのCSSファイル（application.css）にまとめてくれます。```
それらのファイルすべてに対して 不要な空白やインデントを取り除く処理を行い、```ファイルサイズを最小化```してくれます
結果として、開発環境と本番環境という、2つの異なった状況に対してそれぞれ最高の環境を提供してくれます

感想
理解するのは難しい。
量子回路シミュレータの簡単な性能比較

目的
----

[量子計算シミュレータの簡単な比較](https://qiita.com/tadashi9e/items/06bc300ea918ce3c3d27)の続きです。

- Blueqat
- Cirq
- Qiskit
- SymPy

それぞれについて、同じ量子回路を与えたときの性能比較をしてみます。

いずれも単純に pip でインストールしただけでバックエンド変更など変わったことはしていない状態です。

シミュレーション内容
-------------------

シミュレーションする量子回路は

- [加減算回路の高位合成の試み](https://qiita.com/tadashi9e/items/44656ac35d97ba05ab9d)
- [モジュロ加算器実装の試み](https://qiita.com/tadashi9e/items/4b9874c339895ac27ad7)

で作成した加算器・減算器・モジュロ加算器です。これらの記事では Blueqat をターゲットとした実装を行いましたが、それをほぼそのまま Cirq/Qiskit/SymPy ターゲットに変更して実行時間を測定しました。

実行時間の測定には Python の time.perf_counter を用いました。

ソースコードは [GitHub](https://github.com/tadashi9e/benchmark_quantum_simulators) に置いています。

結果
----

| シミュレータ | 加算器(4bit) | 減算器(4bit) | モジュロ加算器(3bit)  |
| ----------- | -----------: | -----------: | -------------------: |
| Blueqat     |   1.846 sec  |   1.719 sec  |  34.623 sec          |
| Cirq        |  49.281 sec  |  49.234 sec  | 388.213 sec          |
| Qiskit      |   0.204 sec  |   0.130 sec  |   0.943 sec          |
| SymPy       | 199.545 sec  | 199.848 sec  | 430.502 sec          |

SymPy は他のシミュレータとは実行条件がやや異なるので、参考値と考えてください。

Blueqat/Cirq/Qiskit は測定を行う毎にランダムに異なる状態ベクトルを確率分布に従ってシミュレーション結果として得ますが、SymPy の場合は測定可能な結果の全ての組み合わせを観測確率付きで得ます。
SymPy 以外のシミュレータの実行結果と見た目を揃えるために、SymPy の場合には得られた状態ベクトルをランダムに選択して表示しています。
逆に、Blueqat/Cirq/Qiskit の方を SymPy に合わせて測定可能な結果の全ての組み合わせを観測確率付きで出す形にするべきだったかもしれません。
Swift で LCS：Longest Common Subsequence（最長共通部分列）


備忘用メモ

## NOTE

- 問題：https://leetcode.com/problems/longest-common-subsequence
- 実装：DP
- 計算量：O(MN)（長さMと長さNの文字列）


## コード

```swift
func longestCommonSubsequence(_ text1: String, _ text2: String) -> Int {
    let len1 = text1.count
    let len2 = text2.count
    var dp = [[Int]](repeating: [Int](repeating: 0, count: len2+1), count: len1+1)
    let list1 = Array(text1)
    let list2 = Array(text2)
    
    for i in 1..<len1+1 {
        for j in 1..<len2+1 {
            let strI = i - 1
            let strJ = j - 1
            if list1[strI] == list2[strJ] {
                dp[i][j] = dp[i-1][j-1] + 1
            } else {
                dp[i][j] = max(dp[i][j-1], dp[i-1][j])
            }
        }
    }
    return dp[len1][len2]
}
```

## ポイント

- i/jのインデックスが文字とdpでズレてる
  - 個人的には、混乱するので明示的に `strI` / `strJ` で定義しちゃうほうがわかりやすい

- ２ケースについて考える：
  - 青色：`S[strI] == S[strJ]`の場合、`dp[i-1][j-1]+1`
  - 赤色：`S[strI] != S[strJ]`の場合、`max(dp[i-1][j], dp[i][j-1])`

![TMP-10 3.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/186228/a657f160-caca-3b39-3fcb-fa0ac1073615.jpeg)



## REF

- http://www.cs.t-kougei.ac.jp/SSys/LCS.htm
サイシードプログラミングコンテスト2021 (AtCoder Beginner Contest 219) 参戦記

# サイシードプログラミングコンテスト2021 (AtCoder Beginner Contest 219) 参戦記

## [ABC219A - AtCoder Quiz 2](https://atcoder.jp/contests/abc219/tasks/abc219_a)

3分で突破. 書くだけ.

```python
X = int(input())

if 0 <= X < 40:
    print(40 - X)
elif 40 <= X < 70:
    print(70 - X)
elif 70 <= X < 90:
    print(90 - X)
else:
    print('expert')
```

## [ABC219B - Maritozzo](https://atcoder.jp/contests/abc219/tasks/abc219_b)

3分で突破. 書くだけ.

```python
S = {}
S[1] = input()
S[2] = input()
S[3] = input()
T = input()

print(''.join(S[int(c)] for c in T))
```

## [ABC219C - Neo-lexicographic Ordering](https://atcoder.jp/contests/abc219/tasks/abc219_c)

6分半で突破. キーソートするだけ.

```python
X = input()
N = int(input())
S = [input() for _ in range(N)]

t = {}
for i in range(26):
    t[X[i]] = chr(i + ord('a'))

print(*sorted(S, key=lambda s: ''.join(t[c] for c in s)), sep='\n')
```

## [ABC219D - Strange Lunchbox](https://atcoder.jp/contests/abc219/tasks/abc219_d)

29分で突破. DPするだけなんだけど、2次元で2回ダブって取らないようにする方法がぱっと思いつかなくて、1次元化したりしてたら結構時間を溶かしてしまった.

```python
INF = 10 ** 18

N = int(input())
X, Y = map(int, input().split())


def conv(x, y):
    return x * 301 + y


def deconv(n):
    return n // 301, n % 301


dp = [INF] * (301 * 301)
dp[0] = 0
m = 0
for _ in range(N):
    A, B = map(int, input().split())
    for j in range(m, -1, -1):
        if dp[j] == INF:
            continue
        x, y = deconv(j)
        x = min(x + A, 300)
        y = min(y + B, 300)
        k = conv(x, y)
        if dp[k] > dp[j] + 1:
            dp[k] = dp[j] + 1
            m = max(m, k)

result = INF
for j in range(m, -1, -1):
    if dp[j] == INF:
        continue
    x, y = deconv(j)
    if x < X or y < Y:
        continue
    result = min(result, dp[j])

if result == INF:
    print(-1)
else:
    print(result)
```
ローカルファイルをGithubにアップロードする手順

ローカルファイルをGithubにアップロードする手順

<h2>【手順１】　Githubにリモートリポジトリを作成</h2>

![スクリーンショット 2021-09-19 3.44.33.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1159193/9d3e1712-93d3-9631-53a0-d523bfd63736.png)


この段階ではInitialize this repository with：　はスルー

<h2>【手順2】 ローカルリポジトリ　を作成</h2>

<h3>①アップロードしたいフォルダに移動</h3>

コマンド-->```cd フォルダのパス```


Macならフォルダをそのままドラッグ＆ドロップすると自動でパスが入力できる

<h3>②ローカルリポジトリを作成</h3>

コマンド-->```git init```

Initialized empty Git repository・・・と出ればOK

<h3>③ステージング</h3>

コマンド-->```git add .```

対象フォルダの全てのファイルやフォルダを、アップロードの対象にする。

ターミナルには何も表示されない

<h3>④　コミット（保存）</h3>

コマンド-->```git commit -m "コミット名"```

コミット名はメモ書きみたいなもので、ダブルクオーテーション必須

<h2>【手順3】 ローカルとリモートを紐付け</h2>

<h3>①git remote add origin url名</h3>

コマンド-->```git remote add origin url名```

url名-->新規リポジトリを作成したときの画面に出てくるurl　

実行してもターミナルには何も出ない

ローカルとリモートを紐付けるためのコマンドなので2回目のpushからは入力しない


<h3>②push（アップロード）</h3>

コマンド-->```git push origin master```

これでGithubに反映される


<h2>2回目以降のpush手順</h2>

<h3>①アップロードしたいフォルダに移動</h3>
コマンド-->```cd フォルダのパス```

<h3>②ステージング</h3>
コマンド-->```git add -A```

※git add オプション
```git add .```--><b>現在のディレクトリ以下の</b>、変更があったすべてのファイル(変更されたファイル、削除されたファイル、新規ファイル)がステージングされる

```git add -A```-->変更があったすべてのファイル(変更されたファイル、削除されたファイル、新規ファイル)がステージングされる

```git add -u```-->バージョン管理されていて、変更されたファイル、削除されたファイルがステージングされる。新規ファイルはステージングされない。

<h3>③コミット</h3>
コマンド-->```git commit -m "コミット名"```

<h3>④フェッチ</h3>
コマンド-->```git fetch origin```
リモートリポジトリの最新の履歴を取得

<h3>⑤マージ</h3>
コマンド-->```git merge --allow-unrelated-histories origin/master```

--allow-unrelated-historiesを付けないと、以下のエラーが出る場合がある

<pre>fatal: refusing to merge unrelated histories</pre>
<h3>⑥プッシュ</h3>
コマンド-->```git push origin master```
<hr>
＊④⑤をスキップした場合、以下のようなエラーが出る
<pre>! [rejected]        master -> master (fetch first)
error: failed to push some refs to '.....'
hint: Updates were rejected because the remote contains work that you do
hint: not have locally. This is usually caused by another repository pushing
hint: to the same ref. You may want to first integrate the remote changes
hint: (e.g., 'git pull ...') before pushing again.
hint: See the 'Note about fast-forwards' in 'git push --help' for details.
</pre>


<h2>参考</h2>
[初めてのpush時に出たエラーの対処法まとめ](https://qiita.com/terack/items/be1d7f606a89be5cab85)
[git add -u と git add -A と git add . の違い](https://note.nkmk.me/git-add-u-a-period/)
コードでUIボタン(丸ボタン)に影をつける設定をする

今回作ったものはこんな感じ。

![スクリーンショット 2021-09-19 2.57.57.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/494487/7e07f73d-01d9-efc8-25f3-2890006c1808.png)

該当のコードはこんな感じ。Viewの制約関連は載せてないのでそのままだと多分おかしなことになります。

    override init(frame: CGRect){
        
        super.init(frame: frame)
        
        let view1 = UIView()
        view1.backgroundColor = .orange

        let button = UIButton(type: .system)
        button.setTitle("tap", for: .normal)
        button.backgroundColor = .white

       　//制約をコードで実装する際に使用
        button.translatesAutoresizingMaskIntoConstraints = false

        //ボタンを丸くしてる
        button.layer.cornerRadius = 25
        
        //Viewから影までの距離を指定
        button.layer.shadowOffset = .init(width: 1.5, height: 2)
        //影の色
        button.layer.shadowColor = UIColor.black.cgColor
        //影の不透明度
        button.layer.shadowOpacity = 1
        //影の幅
        button.layer.shadowRadius = 15
        
        view1.addSubview(button)

        //ボタンの制約
        [
            button.centerYAnchor.constraint(equalTo: view1.centerYAnchor)//縦軸の制約,
            button.centerXAnchor.constraint(equalTo: view1.centerXAnchor)//横軸の制約,
            button.widthAnchor.constraint(equalToConstant: 50)//横幅の制約,
            button.heightAnchor.constraint(equalToConstant: 50)//高さの制約

        ].forEach({ $0.isActive = true })

    }

    required init?(coder: NSCoder) {
        fatalError("init(coder:) has not been implemented")
    }


制約周りなんですけど、一般的には

    button.centerYAnchor.constraint(equalTo: view1.centerYAnchor).isActive = true
    button.centerXAnchor.constraint(equalTo: view1.centerXAnchor).isActive = true
    button.widthAnchor.constraint(equalToConstant: 50).isActive = true
    button.heightAnchor.constraint(equalToConstant: 50).isActive = true

みたいな書き方されてる方が多いんですが、.isActiveを4回も書かなくて良くねって思うので上記みたいな書き方してます。
　
[]のに制約まとめてそれをforEachで回してます。
　
参考程度にどうぞ。
Ruby Kaigi Takeout 2021に参加した

#概要
[Ruby Kaigi Takeout 2021](https://rubykaigi.org/2021-takeout)に参加しました。
今回は、9月9日〜9月11日の三日間開催です。
<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/185747/59fa3c9c-7748-772a-9632-54d4e1c5eb47.png" width=400>

配信内容はRubyKaigi 公式チャンネルにて現在閲覧することが可能です。
https://www.youtube.com/channel/UCBSg5zH-VFJ42BGQFk4VH2A

# PRK Firmware: Keyboard is Essentially Ruby / Hitoshi HASUMI
特に印象深い[こちらのセッション](https://youtu.be/5unMW_BAd4A)について感想を書きます。
セッションで言及されている DIYキーボードは実質Ruby という角谷さんのLTは[こちら](https://www.youtube.com/watch?v=3NYxhlCdEPQ)です。
このLTも絶対見てください!
自分としても全くその通りだ!と思う話を上記LTではされています。
今回のRubyKaigiのセッションはそのLTの延長戦みたいな Rubyで作られたキーボードファームウェアのお話です。
https://github.com/picoruby/prk_firmware

のっけから 自作キーボードに付属する一般的なProMicroでは動かない話がでてきます。
また、LogicLevelの違いで一手間くわえないといけません。
「それでも Ruby でキーボードの設定をしたいんだ！」 という熱意が感じられます。

prk_firmwareですが、コンパイルしなくていいというのは確かに衝撃的です。
そして設定方法もRubyの記法なので非常に読みやすいです。
Rubyでコーディングして設定できるのは革命的です。
キーボードの中にRubyを処理できる機構があるのでそれで処理をさせるのはちょっと変態的な感じはありますが、夢が広がるという感じは受けます。
使い道は難しいかもしれませんが...
しかし、ここで伏線を回収しました~キーボードは実質Ruby~であると。

内容もさることながら、多彩なデモで非常に面白いセッションでした。
対象のSFE-DEV-17717を手に入れるのが面倒ですが、色々と試してみたいと思います。


#感想
Ruby Kaigiに参加するのは今年が初めてで、初めての参加がオンライン開催となりました。
Ruby Kaigiといえば色んなところで開催していて、それに参加するための移動や観光を含めて一つの体験だと思っていたので、
次回はオフラインで参加して楽しむことができればと思います。
撮影した動画、もしくは生配信でのセッション形式で、配信画面とチャット欄という構成で行われました。
初日は配信トラブルやチャットの不具合などが多々ありましたが、それ以降は比較的スムーズに進行しました。
チャット機能は可もなく不可もなくと言う感じで、PHPカンファレンスで実施されている 専用discord鯖などもあると嬉しいです。

Matzさんのキーノートは概ね去年の[Ruby 3.0 release event](https://rhc.connpass.com/event/195483/)(アーカイブ上がっている場所知っている人いれば教えてください)で言われていたことと変わりありません。
Rubyはこれからも開発者に寄り添う素晴らしい言語として成長していくことを願います。
また、今年のリリースイベントも楽しみにしたいと思います。　関係者の皆様ありがとうございました。
WSL2でNortonのファイアウォールを無効にしなくても通信できるようにする

## はじめに
WSL2でUbuntuなどを動かす場合、`vEthernet (WSL)` という仮想インターフェースを経由してインターネット通信を行う。
Norton 360を導入していると、のスマートファイアウォールによって仮想インターフェース経由の通信が遮断されており、Ubuntuからインターネットに通信できない。（名前解決もできない）
スマートファイアウォールを一時的に無効にすることで通信できるようになるが、セキュリティ上の心配があり、毎回手間なので恒常的な通信許可設定をしたい。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/94938/facbf9a6-a28d-7ae9-a599-1c25b93d30d0.png)

## 環境
- Windows10 
- Norton 360
- WSL(Ubuntu 18.04)

## Nortonの設定変更で回避する方法
インターネット通信に利用しているネットワーク接続を信頼することで、スマートファイアウォールを無効にしなくても通信できるようになった。

Norton管理ツールの`設定＞ファイアウォール＞ネットワークの信頼`から、ネットワーク接続の信頼レベルを `完全な信頼`に設定する。
（デフォルトは`プライベート`や`パブリック`などWindowsの設定と同じになっている）
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/94938/66b478b3-72f7-c66c-7572-e222f6532f5c.png)

この設定によってUbuntu on WSLからインターネット通信ができるようになった。
Allocation size of zFS file system (UNIX file system size) and aggregate (VSAM Leaner Dataset size)


File System size vs VSAM LDS allocation size
-
There is a difference between file system size (df command, zfsadm aggrinfo command output) vs VSAM LDS allocation size (LISTCAT command output).

Understanding Allocation size and file system size
-
- Log file
Records metadata changes. By default, its size is 1% of the disk size. However, it will never be smaller than 14 blocks and it will never be larger than 16,384 blocks (128 MB).
- Bitmap
Lists the blocks that are free on disk. The file size depends on the size of the aggregate.
- Aggregate File System List
Describes the file systems that are contained in the aggregate. For compatibility mode aggregates it is usually only one 8-KB block.

- 8K Blocks
zFS File System allocation is based on 8K blocks, therefore z/OS zFS is able to allocate 6 blocks in 1 track, it means that 90 8 Blocks in 1 cylinder.

- Convert to track count to bytes
<B>49152 Bytes in 1 track</B>
6* 8192 < 56664 < 7 * 8192  <--- Unable to allocate 7 or more 8KBloks in 1 track.
So 15 tracks in 1 clylinder so allocate 90 8Kblocks per 1 cylinder.
We can convert from tracks or cylinders to bytes:

```quote
90 * 8 Kblocks /cilinder = 90 * 8192 bytes = 737280 Bytes = 720 KB / cilinder => 720KB / Clylinder
6 * 8 KBlocks / track = 6 * 8192 bytes = 49152 Bytes = 48 KB / track          =>  48KB / track
```

https://www.ibm.com/docs/en/zos/2.4.0?topic=aggregates-understanding-zfs-disk-space-allocation

- cf) Normal dataset allocation 
<B>56664 Bytes in 1 track </B>
56664 * 15 = 849960 = 830.0390625 = about 830KB / Cylinder

https://www.ibm.com/docs/en/zos/2.4.0?topic=layout-displaying-device-types

- File system size vs VSAM size 
49152 : 56664 --> 56664 / 49152 = 1.15283203125, VSAM allocation size is about 15% greater than file system size.

References
---

- zfsadm fsinfo
 https://www.ibm.com/docs/en/zos/2.4.0?topic=commands-zfsadm-fsinfo
- zfsadm aggrinfo
 https://www.ibm.com/docs/en/zos/2.4.0?topic=scd-df-display-amount-free-space-in-file-system
- df
 https://www.ibm.com/docs/en/zos/2.4.0?topic=scd-df-display-amount-free-space-in-file-system

- LISTCAT
 https://www.ibm.com/docs/en/zos/2.4.0?topic=subcommands-listcat-command
 HI-U-RBA is almost file system size, you can confirm HI-U-RBA / 8192 converting to 8K blocks.
 https://www.ibm.com/docs/en/zos/2.4.0?topic=aggregates-dynamically-growing-compatibility-mode-aggregate
[シリーズ] 中型 fish-shell 集


## 概要

fish-shell スクリプトの実践例.

|コンテンツ|一言|fish-shell|バージョン|
|:--|:--|:--|:--|
|[[fish-shell] [10] プラグイン実装例「zf」... 対話形式でのファイルランチャ](https://qiita.com/robozushi10/items/e07bb8714713a68a6d76)|||2.7.1|
setIntervalを即時関数でやるよ

#初めに
　Guildを作る息抜きにタイマーを作成していたのですが、案外引っかかるところが多かったので、それを記事にしようと思いました。
#即時関数にする理由
　setIntervalは即時関数を使えばちょっとした問題があるみたいです。

https://qiita.com/kouhe1/items/9c23604901039832d385

　このサイトから引用させていただきます。

>setInterval() は指定ミリ秒に呼び出されたコールバックをコールバック関数に引き渡しますが、もしそれが引数のように他のものを期待している場合、それを混同する可能性があります。この問題を回避するためには、コールバックを呼び出すために無名関数を使用してください。

　とのことです。
　例えばが以下のプログラムですね。

```javascript
var count = 0;
setInterval(function(){
  console.log(count)
  count++;
},1000)
```

```javascript
0
1
2
3
4
5
```

　こういう風にずっと続いていきます。

#詰まったところ
　setIntervalしてみると、どうやってsetIntervalを止めるのか分からなかったのです。上の例では、setIntervalは外からclearIntervalで止めることが出来ますが、countが10に達した時点でsetIntervalを止めたい場合、中からif文で条件分離するのが一番ラクでしょう。
　setIntervalを中の関数から止めるにはどうしたらいいのでしょう？

#clearIntearvalで解決
```javascript
var count = 0;
var timerID = setInterval(function(){
  if(count == 10)clearInterval(timerID);
  console.log(count)
  count++;
},1000)
```

```javascript
0
1
2
3
4
5
6
7
8
9
10
```

　案外こうやってもtimerIDのスコープが届くんですね。

#終わりに
　まさかtimerIDをあそこで代入してもスコープがしっかり働くとは思いませんでした。javascriptは参考書を読んだわけではなく、適当にサンプルコードを見て学んだので理解してないところは多いのですが、参考書を読んでみたほうが良いかもなって気になりました。
　以上、息抜きにタイマーを作ってたら案外大変だった話です。
Reactを始めたい人へ。

この記事は下記のような人に役に立てるように書いていければと思います。

- これからReact学びたい！けど何から初めて良いかわからない
- モダンフロントってどこか苦手なレガシー思考な人
- Reactに書かれている記事は見たけど、よくわからない部分が多い
- 開発環境とか整えるのが面倒

これから勉強したい人、今勉強しているけどつまずいてモチベーション上がらない人の助けになればと思います。

僕はまずチュートリアルから開始しました。
[Reactチュートリアル](https://ja.reactjs.org/tutorial/tutorial.html)

## コンポーネント
データが変更されるとReactは再レンダリングします。

```js
class List extends React.Component {
  render() {
    return (
      <div className="list">
        <h1>List for {this.props.name}</h1>
        <ul>
          <li>hoge</li>
          <li>hoge2</li>
          <li>hoge3</li>
        </ul>
      </div>
    );
  }
}

// Example usage: <List name="Test" />
```

上記コードの`List`はReactコンポーネントクラス、Reactコンポーネント型と呼びます。
コンポーネントはPropsと呼ばれるパラメーターを受け取り、renderメソッドで表示するビューの階層構造を返します。

### renderについて
`render`は軽量な記述形式であるReact要素を返します。
それを簡単に記述できるのが『JSX』と呼ばれる構文です。
renderの中で定義された下記のコードは

```js
<div className="list">
  <h1>List for {this.props.name}</h1>
  <ul>
    <li>hoge</li>
    <li>hoge2</li>
    <li>hoge3</li>
  </ul>
</div>
```
ビルドすると以下のコードに変換される。

```js
return React.createElement('div', {className: 'list'},
  React.createElement('h1', /* ... h1 children ... */),
  React.createElement('ul', /* ... ul children ... */)
);
```

## コンポーネントまとめ
単純なコンポーネントを組み合わせることで複雑なUIを再現するというのが一般的な実装です。
Lightsailでプロキシサーバーを立てる

## はじめに
Amazon LightsailのUbuntuでBasic認証ありのプロキシサーバーを構築していきます。

## 環境
Ubuntu 18.04 LTS

## 手順

①パッケージリストの更新

```
$ sudo apt-get update
```

②squidのインストール

```
$ sudo apt install squid
```

③Basic認証のためにapache2-utilsをインストール

```
$ sudo apt install apache2-utils
```

④Basic認証のためのユーザーの作成

```bash
$ sudo htpasswd -c /etc/squid/.htpasswd username #usernameは自分で決めてください
New password:   #パスワードを決めて入力
Re-type new password:
```

⑤990行目あたりの`acl CONNECT method CONNECT`より下に設定を追記

```
$ sudo vi /etc/squid/squid.conf
```

```conf
acl CONNECT method CONNECT #この記述は既にあります

auth_param basic program /usr/lib/squid/basic_ncsa_auth /etc/squid/.htpasswd
auth_param basic children 3
auth_param basic realm Proxy Authentication
auth_param basic credentialsttl 24 hours
acl basic_user proxy_auth REQUIRED
http_access allow basic_user
```

⑥Squidを起動する

```
$ sudo systemctl start squid
```

## その他

1. LightsailがUbuntu20.04だと動かない可能性があります。 
1. ポートを変えたい場合は1620行目のhttp_portを任意のポート番号にする。(デフォルトは3128)
ユークリッドの互除法

# ユークリッドの互除法

RSA暗号について勉強していたら、久しぶり（大学受験以来？）に遭遇したため、アルゴリズムについてまとめました。

- 正の整数 $a_0,a_1$ の最大公約数 gcd($a_0,a_1$) を出力するアルゴリズム
- Input : $a_0,a_1 \in \mathbb{N},\ a_0>a_1>0$
- Output : gcd($a_0,a_1$) 
- Algorithm :
  1. $i\ ← 0$
  1. $a_{i+2} ← a_i \ \text{mod}\ a_{i+1}\quad (0\leq a_{i+2}\leq a_{i+1})$
  1. $\text{if}\ a_{i+2}=0\ \text{then return}\ a_{i+1}$
  1. $\text{else}\ i←i+1\ \text{and return to line }2$

```math
\left\{
\begin{array}{lllll}
a_0=q_1a_1+a_2 \\
a_1=q_2a_2+a_3\\
\qquad\vdots\\
a_{k-1}=q_ka_k+a_{k+1}\\
a_k=q_{k+1}a_{k+1}
\end{array}
\right.
```

- $\text{gcd}(a,b)=\text{gcd}(b,a\ \text{mod}\ b)$
- $\text{gcd}(a_0,a_1)=\text{gcd}(a_1,a_2)=\cdots =\text{gcd}(a_k,a_{k+1})=\text{gcd}(a_{k+1},a_{k+2})=a_{k+1}$

## 例
- $a_0=354, a_1=156$の最大公約数を求める。
  1. $i\ ← 0$
  1. $a_{i+2} ← a_i \ \text{mod}\ a_{i+1}\quad (0\leq a_{i+2}\leq a_{i+1})$
  1. $\text{if}\ a_{i+2}=0\ \text{then return}\ a_{i+1}$
  1. $\text{else}\ i←i+1\ \text{and return to line }2$

```math
\left\{
\begin{array}{lllll}
354=2\cdot156+42 \\
156=3\cdot42+30\\
42=1\cdot30+12\\
30=2\cdot12+6\\
12=2\cdot6+0
\end{array}
\right.
```

- $\text{gcd}(354,156)=6$

## Pythonでの実装例

```python
def gcd(a: int, b: int) -> int:
    x = a % b
    while x > 0:
        a = b
        b = x
        x = a % b
    return b
```
以下、再起を用いたユークリッドの互除法。

```python
def re_gcd(a: int, b: int) -> int:
    if b == 0:
        return a
    else:
        return re_gcd(b, a % b)
```
次は，拡張ユークリッドのアルゴリズムについてまとめます。

## 参考文献
[ユークリッドの互除法の証明と不定方程式](https://manabitimes.jp/math/672)
[最大公約数 ((拡張)ユークリッドの互除法)](https://tjkendev.github.io/procon-library/python/math/gcd.html)
[fish-shell] [05] 多次元配列もどきを実装する


## 概要

「:」を区切りにした 3次元配列もどきの実装例である.
fish-shell V2.7.1 で動作確認済み.

```bash
#!/usr/bin/env fish
#
# 3次元配列もどき の実装例
#

# D3ARAY (3次元配列もどき) を定義する. セパレータは「:」とする.
# そのため、値には「:」を使用しないという制約が必要になる.
set -l    D3ARY    '
  "A"  : "aa" : "1>/tmp/A" 
  "B"  : "bb" : "1>/tmp/B" 
  "C"  : "cc" : "1>/tmp/C" 
'

# D3ARAY (3次元配列もどき) を変数 FLD に格納する
set -l  FLD ( string trim $D3ARY )
set -l  F1
set -l  F2
set -l  F3

# D3ARAY (3次元配列もどき) を一行ずつ取り出す
for i in (seq 1 (count $FLD) )
  # 「:」区切りで各フィールドを取り出している
  set F1 ( string trim (echo $FLD[$i] | cut -d':' -f1) )
  set F2 ( string trim (echo $FLD[$i] | cut -d':' -f2) )
  set F3 ( string trim (echo $FLD[$i] | cut -d':' -f3) )
  echo "--------------------------------------------"
  echo "F1: $F1"
  echo "F2: $F2"
  echo "F3: $F3"
end

```

## 実行結果

```bash
--------------------------------------------
F1: "A"
F2: "aa"
F3: "1>/tmp/A"
--------------------------------------------
F1: "B"
F2: "bb"
F3: "1>/tmp/B"
--------------------------------------------
F1: "C"
F2: "cc"
F3: "1>/tmp/C"

```

以上.
10年後のために今勉強しておきたい技術

# はじめに

10年後のために今勉強しておきたい技術をまとめます。

# 組み込み向けのDevSecOps

[ジェナード氏](https://blogs.windriver.com/wind_river_blog/2020/02/embedded-devops/) が指摘しているように、組み込みでのDevOps(あるいはDevSecOps)には以下の4つの障害があり、なかなか進んでいません。

- 企業文化：
- セキュリティの確保
- ツールセットの互換性
- ハードウェアアクセス

組み込みシステムは、DevSecOps(あるいはDevOps)の最後のフロンティアになるでしょう。

10年後にはあるいは、DevSecOpsを導入できるかもしれません。

10年後に備えて、勉強しておきたい技術を列挙しておきましょう。

## パッケージマネージャ

パッケージマネージャのconan

https://conan.io/

## OS

組み込みOSを自作できるyocto

https://www.yoctoproject.org/

## テスト

Linuxカーネルに基づくシステムの展開をテストすることを目的とした自動検証アーキテクチャのLAVA

https://validation.linaro.org/

## クラスタリング

エッジコンピューティングむけのk8sディストリビューションのk3s

https://k3s.io/

## JTAG

集積回路や基板の検査やデバッグに使う通信規格。

https://ja.wikipedia.org/wiki/JTAG

## FPGA

FPGAは、CPUとGPGPUに並ぶ標準的なコンピューティングリソースになりつつあります。

https://www.intel.co.jp/content/www/jp/ja/software/programmable/overview.html

10年後にはGPGPUのCUDAのようにハードウェアを気にせずに使える、FPGA用の高位合成ライブラリができているでしょう。

# 量子計算

10年後には、量子計算機または疑似量子計算機がごく限られた領域では普及しているかもしれません。

少しずつ、量子計算の理論には馴染んでおきたいですね。


# まとめ

勉強したいことが山ほどあって、時間が足りない。笑
とりあえず、個々で挙げたくらいの内容は勉強しておきたいところですね！
Qiita記事のサムネイル画像を更新したい！→URL末尾に「?」と「適当な数字」を入れればOK

#はじめに
Qiita記事のタイトル変更後、その記事を参照した別記事中にあるサムネイル画像が、自動では更新されませんでした。
Qiitaにも[Twitterカード](https://cards-dev.twitter.com/validator)のようなものがあるのかな？と
Qiitaのヘルプを見たのですが、該当する回答は見つけられず。
ググってもドンピシャの答えは見つからなかったので、記事にしてみました。


#何が起きたか
①Qiita記事Aを書く際、過去に自分が書いた記事BのURLを張り付けて、記事Bのサムネイル画像を表示させました。↓
<img width="500" alt="2 (2).png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/498057/d61c03a3-c39d-a151-a2aa-47eb358cd063.png">

②その後、記事Bのタイトル文末を「(作業中)」から「→解決！」に変更しました。↓
<img width="500" alt="1.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/498057/85e973a6-557d-3488-1526-72eb49a8029e.png">

③記事Aに表示されているサムネイル画像は文末「(作業中)」のまま。↓
<img width="500" alt="2 (2).png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/498057/d61c03a3-c39d-a151-a2aa-47eb358cd063.png">

↓
③のサムネイル画像が、キャッシュから拾ってきている（？）のか、更新されません。
タイトル変更後（文末 「→解決！」）の画像に更新したいと思います。

#動作環境
OS：Windows10
ブラウザ：Google Chrome　バージョン: 93.0.4577.82（Official Build） （64 ビット）

#解決方法
記事A中に張り付けたURLの末尾に「?」と「適当な数字」を入れる。↓（赤線部分）
<img width="500" alt="10.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/498057/d0cad605-e66c-8589-f110-a9c6a85217a0.png">

↓
更新された！
![20.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/498057/3a23530a-7ff7-0464-9ed1-2d008777d741.png)

解決。

#参考
こちらの「画像が更新されない」の項を参考にしました。

https://www.iscle.com/web-it/twitter-card-cache.html
[fish-shell] [04] ある外部コマンドを並列実行させる


## 概要

my_script_1.sh、my_script_2.sh、my_script_3.sh、my_script_4.sh、
を並列で実行させて、全ての終了を待つ処理である.

fish-shell V2.7.1 で動作確認済み.

:::note info
fish-shell 3.0 では wait コマンドが実装されたようなので、
下記のような実装はしなくて良いのだと思う (未検証)
:::

・[fish 3.0がやってきた](https://qiita.com/s417-lama/items/421562458989a0fedbd5)

## コード

```bash
#!/usr/bin/env fish

# my_script_1.sh 〜 my_script_4.sh を並列実行させる
for i in ( seq 1 4 )
  sh my_script_$i.sh &
end

# my_script_1.sh 〜 my_script_4.sh の終了を待つ
while true
  set -l bg_jobs ( builtin jobs -p 2>/dev/null )
  sleep 0.5
end

echo Finished.
```

以上.
[fish-shell] [03] 変数の値を正規表現で判定する


## 概要

変数 FLG_DEBUG 変数が「true」,「TRUE」,「enable」,「ENABLE」,「1」の
いずれかであるかを "**乱暴に**" 判定する.

fish-shell V2.7.1 で動作確認済み.
　

```bash
#!/usr/bin/env fish

if test ( string match -r -i "\A[t|e|1]" "$FLG_DEBUG" )
  echo '多分 true, TRUE, enable, Enable, 1 のいずれかでしょう'
else 
  echo '不一致でした'
end
```

実際の運用ではきちんと判定しましょう...
[fish-shell] [02] ファイル種別に応じた実行コマンドを呼び出す


## 概要

第1引数で与えたファイルの種別を判定し、
ファイル種別に応じたコマンドを呼び出すスクリプト.

fish-shell V2.7.1 で動作確認済み.

## コード

### fish-invoker.fish

```bash
#!/usr/bin/env fish

if test -z {$argv[1]}
  # 引数存在せず
  echo '$argv[1] was empty...'  >&2
  exit 2
else if test ! -e {$argv[1]}
  # ファイル存在せず
  echo "$argv[1]: no such file" >&2
  exit 2
end

# 呼び出したいコマンドを定義する
set -l  MY_EDITOR   "nvim"
set -l  MY_OPEN     "xdg-open"

# 引数で指定されたファイル種別をチェックして、変数 ftype に格納する.
set -l  ftype ( file -b -i $argv[1] )

switch $ftype
  case "text/*"
    # ftype が「text/*」と表示されていれば、nvim $argv[1] として Neovim エディタで開く.
    eval $MY_EDITOR   $argv[1]
  case "application/x-sharedlib; charset=binary"
    # ftype がバイナリ形式と表示されていれば fish シェルに処理させる.
    set cli "fish -c $argv[1]"
    eval $cli
  case "application/x-executable*charset=binary"
    # ftype がバイナリ形式と表示されていれば fish シェルに処理させる.
    set cli "fish -c $argv[1]"
    eval $cli
  case "*x-empty*"
    # 空ファイルと判定されたら何もしない
    echo 'SKIP: $argv[1]: empty file...'
  case "*"
    # 上記に一致しなければ xdg-open に任せる
    eval $MY_OPEN $argv[1]
end 


```

## 実行結果

```bash
#! 現在のディレクトリを表示する
$ fish-invoker.fish /bin/pwd
/tmp/

#! $HOME/.bashrc を nvim で開く
$ fish-invoker.fish $HOME/.bashrc

#! $HOME/Download/a.pdf に関連付けされたアプリを xdg-open を通して呼び出す
$ fish-invoker.fish $HOME/Download/a.pdf
```
ABC219 D問題解説 (python)

## 概要
AtcoderのABC219のD問題が（おそらく）あと一歩のところで解けず、非常に悔しい思いをしたので、
忘れないよう記事にまとめました。

### 問題文

> N 種類の弁当が、それぞれ 1 個ずつ売られています。
i=1,2,…,N について、i 種類目の弁当には Ai個のたこ焼きと Bi個のたい焼きが入っています。
高橋君は、 X 個以上のたこ焼きと Y 個以上のたい焼きを食べたいです。
高橋君がいくつかの弁当を選んで買うことで、 X 個以上のたこ焼きと Y 個以上のたい焼きを手に入れることが可能かどうか判定して下さい。また、可能な場合はそのために高橋君が購入しなければならない弁当の個数の最小値を求めて下さい。
各種類の弁当は 1 個しか売られていないため、同じ種類の弁当を 2 個以上購入することは出来ないことに注意して下さい。

### 制約
>$1≤N≤300$
$1≤X,Y≤300$
$1≤Ai,Bi≤300$
入力はすべて整数

引用元：[Atcoder-ABC219 D問題](https://atcoder.jp/contests/abc219/tasks/abc219_d)

## 解き方の方針
[ナップザック問題](https://ja.wikipedia.org/wiki/%E3%83%8A%E3%83%83%E3%83%97%E3%82%B5%E3%83%83%E3%82%AF%E5%95%8F%E9%A1%8C)を解いたことのある人なら、同様の方法、少なくともDPで解くというのは、思い浮かべるのではないでしょうか？

自分も、DPで解くことはすぐに考えたのですが、三次元の配列でi, x, yを用いた状態の定め方がいまいちピンとぴんと来ませんでした。
そこで、たこ焼きをx個、たい焼きをy個、手に入れるときのお弁当の最小の個数で考えると、二次元の配列で収まり、自分でも実装できそうなイメージでした。
具体的な状態は以下です。

たこ焼きをx個、たい焼きをy個持っているとき、
$dp[x][y] = お弁当の個数$
i種類目のお弁当を買うとき、
$dp[x+a][y+b] = dp[x][y] + 1$

ここで、厄介になってくるのが、x+a、y+bの範囲ですが、弁当全てを購入した時のたい焼き、たこ焼きの最大の個数は、
NX, NYとなり、これに対して全ての計算を行うと、$O(N^2*XY)$で10^9のオーダーとなってしまいます。
そこで、今回はX, Yより多くなるときは、切り捨てて考えることで、
x <= X, y <= Yが担保できます。

実装は以下です。

```
N = int(input())
x, y = map(int, input().split())

# dpの配列を準備。x, yを超える時は、切り捨てて考えるので、配列の大きさも以下で十分。値は、最大値+1で初期化。
dp = [[N+1]*(y+1) for _ in range(x+1)]

# たこ焼き０個、たい焼き０個の時は弁当の数も０
dp[0][0] = 0

bento = []

for _ in range(N):
  a, b = map(int, input().split())
  bento.append([a, b])

# i+aがxより大きい時は、xに変換。j+bも同様にyに変換。
# お弁当nを買った時、全てのdpに反映させるため、x, yでそれぞれfor文を回している。
for n in range(N):
  a, b = bento[n]
  for i in range(x+1):
    for j in range(y+1):
      k = min(i+a, x)
      h = min(j+b, y)
      dp[k][h] = min(dp[k][h], dp[i][j]+1)

# 答えは、x個、y個（以上）の時なので、dp[x][y]を出力。ただし、Nより大きい時は、初期値のまま（全部買っても成り立たない時）なので-1に変換
ans = dp[x][y]
if ans > N:
  ans = -1

print(ans)

```

上記で、見事AC…には、ならず、結局時間いっぱいまでACに出来ませんでした。
皆さんは、なぜ通らないかお気づきでしょうか？

正解は、
```
for i in range(x+1):
    for j in range(y+1):
      k = min(i+a, x)
      h = min(j+b, y)
      dp[k][h] = min(dp[k][h], dp[i][j]+1)
```
この部分で、iとjをそれぞれ小さい順に行なっており、この実装では、
同じ弁当を複数回買った時の状態も含まれてしまうためです。

------
小さい順のイメージ：
たこ焼き１個、たい焼き２個のお弁当を買った時、
dp[1][2] = 1
dp[2][4] = 2
dp[3][6] = 3 ...

------
これを防ぐためには、iとjを大きい順に実装すれば、重複を防ぐことが出来ます。

------
大きい順のイメージ：
dp[1][2] = 1, dp[2][4] = 3, dp[3][6] = 7
たこ焼き１個、たい焼き２個のお弁当を買う時、
dp[3][6] = dp[2][4] + 1 = 4
dp[2][4] = dp[1][2] + 1 = 2

------

というわけで、ACになる実装は、以下になります。

```
N = int(input())
x, y = map(int, input().split())

dp = [[N+1]*(y+1) for _ in range(x+1)]

dp[0][0] = 0

bento = []

for _ in range(N):
  a, b = map(int, input().split())
  bento.append([a, b])
for n in range(N):
  a, b = bento[n]
  for i in range(x+1)[::-1]:
    for j in range(y+1)[::-1]:
      k = min(i+a, x)
      h = min(j+b, y)
      dp[k][h] = min(dp[k][h], dp[i][j]+1)

ans = dp[x][y]
if ans > N:
  ans = -1

print(ans)

```

## 最後に

forの後に[::-1]をつければ良かったんですね。。。。
皆さんもDPの問題で謎のWAに行き詰まった時は、
- 逆から加算してみる
- 制約に触れていないかを考える（今回でいえば、同じものを含まないなど）
などをぜひ考慮してみてください。

ここまでお読みいただき、ありがとうございました。
[シリーズ] 小型 fish-shell 集


## 概要

fish-shell スクリプトの実践例.

|コンテンツ|一言|fish-shell バージョン|
|:--|:--|:--|
|[[fish-shell] [01] 第一階層のディレクトリを抽出する](https://qiita.com/robozushi10/items/b179476bc806edbcc3f9)||2.7.1|
|[[fish-shell] [02] ファイル種別に応じた実行コマンドを呼び出す](https://qiita.com/robozushi10/items/0c7e683492aee5fbb7ce)||2.7.1|
|[[fish-shell] [03] 変数の文字列を正規表現で判定する](https://qiita.com/robozushi10/items/77dd052ae182c00a4027)||2.7.1|
|[[fish-shell] [04] ある外部コマンドを並列実行させる](https://qiita.com/robozushi10/items/5ab6b9fbcb43cfcd7e71)||2.7.1|
|[[fish-shell] [05] 多次元配列もどきを実装する](https://qiita.com/robozushi10/items/e7641b246b6678fec81c)||2.7.1|
AWS Certified Database - Specialty に合格しました

2021/9/18 に AWS 認定データベース専門知識(DBS)試験を受験して、無事に合格しました。試験対策とメモを残しておきます。
![certification.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/780549/76b79355-fb14-41a6-9ea5-422d7328fd77.png)

## 試験勉強

「[要点整理から攻略する『AWS認定 データベース-専門知識』](https://www.amazon.co.jp/%E8%A6%81%E7%82%B9%E6%95%B4%E7%90%86%E3%81%8B%E3%82%89%E6%94%BB%E7%95%A5%E3%81%99%E3%82%8B%E3%80%8EAWS%E8%AA%8D%E5%AE%9A-%E3%83%87%E3%83%BC%E3%82%BF%E3%83%99%E3%83%BC%E3%82%B9-%E5%B0%82%E9%96%80%E7%9F%A5%E8%AD%98%E3%80%8F-Compass-Books%E3%82%B7%E3%83%AA%E3%83%BC%E3%82%BA-NRI%E3%83%8D%E3%83%83%E3%83%88%E3%82%B3%E3%83%A0%E6%A0%AA%E5%BC%8F%E4%BC%9A%E7%A4%BE/dp/4839975078/ref=sr_1_4?__mk_ja_JP=%E3%82%AB%E3%82%BF%E3%82%AB%E3%83%8A&crid=34G9GSHFZH8HM&dchild=1&keywords=aws%E8%AA%8D%E5%AE%9A&qid=1631971866&sprefix=aws%2Caps%2C275&sr=8-4)」を使って対策しました。この 1 冊で DBS 対策は十分ってくらいに内容は充実していました。練習問題も用意されているので、udemy で練習問題を別途購入する必要もありませんでした。

その他、各サービスのメモです。

### RDS

- [マルチ AZ 配置のメンテナンス](https://docs.aws.amazon.com/ja_jp/AmazonRDS/latest/UserGuide/USER_UpgradeDBInstance.Maintenance.html#USER_UpgradeDBInstance.Maintenance.Multi-AZ)
- [Amazon RDS のバックアップと復元](https://aws.amazon.com/jp/rds/features/backup/)
- [Amazon RDS を使った災害復旧戦略の実装](https://aws.amazon.com/jp/blogs/news/implementing-a-disaster-recovery-strategy-with-amazon-rds/)
- [Amazon RDS イベント通知の使用](https://docs.aws.amazon.com/ja_jp/AmazonRDS/latest/UserGuide/USER_Events.html)
- [Performance Insights で Amazon RDS for MySQL をチューニングする](https://aws.amazon.com/jp/blogs/news/tuning-amazon-rds-for-mysql-with-performance-insights/)
- [DB パラメータグループのパラメータの変更](https://docs.aws.amazon.com/ja_jp/AmazonRDS/latest/AuroraUserGuide/USER_WorkingWithParamGroups.html#USER_WorkingWithParamGroups.Modifying)

### CloudFormation

- [スタックのリソースが更新されないようにする](https://docs.aws.amazon.com/ja_jp/AWSCloudFormation/latest/UserGuide/protect-stack-resources.html)

### DMS

- [AWS DMS と AWS Snowball Edge を使用した大規模データ移行の概要](https://docs.aws.amazon.com/ja_jp/dms/latest/userguide/CHAP_LargeDBs.Process.html)

### Amazon ElastiCache for Redis

- [バックアップのパフォーマンスの向上](https://docs.aws.amazon.com/ja_jp/AmazonElastiCache/latest/red-ug/backups.html#backups-performance-improving)

### DynamoDB

- [Amazon DynamoDB グローバルテーブル](https://aws.amazon.com/jp/dynamodb/global-tables/)
クッキーとセッションについて

# はじめに
本記事では、クッキーとセッションについて記述します。
知らない・理解できていない単語シリーズです。

# クッキーとセッション
主に`ステートフルな通信を実現するため`にそれぞれ利用され、
`クッキー`はサーバーからクライアント側に`付与する`情報（セッションID）の仕組みで、
`セッション`はサーバー側に保存される`一連の操作や通信`のことです。

ちょっと何言ってるかわからないですね。（サンドウィッチマン）

# まずはHTTP通信について
以下の記事を参照。
[セッション管理の周辺知識まとめ](https://blog.takanabe.tokyo/2014/12/%E3%82%BB%E3%83%83%E3%82%B7%E3%83%A7%E3%83%B3%E7%AE%A1%E7%90%86%E3%81%AE%E5%91%A8%E8%BE%BA%E7%9F%A5%E8%AD%98%E3%81%BE%E3%81%A8%E3%82%81/)

Google先生より
`ステートレス`
システムが現在の状態を表すデータなどを保持せず、
入力の内容によってのみ出力が決定される方式

`プロトコル`
コンピューター同士が通信をする際の手順や規約などの約束事。

> HTTPはステートレスなプロトコルであり，状態は持たない．クライアントがリクエストを投げてサーバがレスポンスを返す，このキャッチボールを1往復したところで通信は切れる．つまり，一度目の通信でクライアントから某かの情報を受け取ったとしても，二度目の通信は前の通信の状態は引き継がない全く関係のない通信になる．これが，HTTPの通信の原則である．

例えとして、

```
Amazonで、`スマブラのソフト`を買い物カゴに入れたとします。

`参照した、上の文章の通り`であれば、
別のページに移動したとき、本来ならば、`買い物カゴ`にスマブラは`無い`です。

しかし、`実際`には、別のページに遷移したとしても、
買い物カゴに`スマブラソフト`が入った状態が保持されています。
```

これを`セッション`と`クッキー`が実現しているというわけです。

# セッション
セッションとは、

```
Webサービスにおいて情報を一時的に記憶しておく仕組み・概念
```
です。

特徴は、

```
① サーバーサイド側で保存される

② データの改竄の可能性は低い

③ 情報を取り出す際には、sessionIDをサーバーに送信する必要がある
（そのため②の特徴があるとも考えられる）
```

ログインしたユーザーが、
Amazonで`スマブラのソフト`をお買い物カゴに入れたとしますと、
そのスマブラソフトが入った`状態を維持`できるようになっています。

`情報を一時的に保存`し、`保持`することで、
一度Amazonのサイトから離れても、
`再度アクセス`したら、`スマブラソフトが入ったまま`買い物を再開できるということです。
(sessionIDを元に、情報を返すイメージ)

# クッキー
クッキーとは、

```
ブラウザにあるセッションの情報の保存場所のこと
```
です。

特徴は、

```
① クライアント側に値を保存する

② データ改竄の可能性あり
- IDなどではないため、悪意のある人が個人情報を抜き取ってしまう。
- セッションと一緒に使うことで、データ改竄の可能性や情報漏洩のリスクを激減させる。
```

先ほどの、Amazonの買い物カゴに、
スマブラソフトが入った情報を保存する場所が、`クッキー`ということですね。

以上です。

# 終わりに
記事を書き終えて思いましたが、
絵や図がないと分かりづらいかもしれないですね。

勝手に使うわけにもいかないので、
いい記事を書くための工夫を考えて行けたらと思います。

以下参考サイト/YouTube動画です。
[セッションとクッキーの違い](https://ohs30359.hatenablog.com/entry/2015/09/04/235027)
[「分かりそう」で「分からない」でも「分かった」気になれるIT用語辞典](https://wa3.i-3-i.info/word1791.html)
[セッション管理の周辺知識まとめ](https://blog.takanabe.tokyo/2014/12/%E3%82%BB%E3%83%83%E3%82%B7%E3%83%A7%E3%83%B3%E7%AE%A1%E7%90%86%E3%81%AE%E5%91%A8%E8%BE%BA%E7%9F%A5%E8%AD%98%E3%81%BE%E3%81%A8%E3%82%81/)
↓個人的にオススメ
[Cookieとセッションってなに？ゼロからわかりやすく解説](https://www.youtube.com/watch?v=t8Xxp_dk214)

明日も頑張ります！
[fish-shell] [01] 第一階層のディレクトリを抽出する


## 概要

第一階層のディレクトリを抽出するスクリプト.
fish-shell V2.7.1 で動作確認済み.

## コード

```zsh
#!/usr/bin/env fish
#
# ルートファイルシステムの一覧を表示するプログラム.
# このとき、L_EXCLUDE_DIRS 変数で定義したディレクトリは表示対象外とする.

# find 実行対象外にしたいディレクトリを変数 L_EXCLUDE_DIRS に定義する
set -l L_EXCLUDE_DIRS "/lost+found" \
                      "/snap"       \
                      "/proc"       \
                      "/sbin"       \
                      "/media"      \
                      "/root"       \
                      "/opt"        \
                      "/srv"        \
                      "/cdrom"      \
                      "/lib64"      \
                      "/mnt"        \
                      "/run"        \
                      "/tmp"        \
                      "/lib"        \
                      "/dev"        \
                      ""

# ファイルシステムの第一階層ディレクトリを動的に取得して、変数 L_TARGET_DIRS に格納する
set -l L_TARGET_DIRS  ( find / -maxdepth 1 -mindepth 1 -type d )

echo "-------------------------------"
echo "[途中結果] L_TARGET_DIRS の内容"
echo "-------------------------------"
for i in $L_TARGET_DIRS
  # 空行は表示しない
  if test ! -z {$i}
    echo $i
  end
end

# L_TARGET_DIRS から L_EXCLUDE_DIRS に書かれた要素を削除する.
for i in ( seq 1 (count $L_EXCLUDE_DIRS) )
  # 「string」は fish-shell のコマンドである.
  # $L_TARGET_DIRS のうち、$L_EXCLUDE_DIRS[$i] に一致する文字列を '' に置換している.
  set L_TARGET_DIRS ( string replace $L_EXCLUDE_DIRS[$i] '' $L_TARGET_DIRS )
end

echo ""
echo "-------------------------------"
echo "[最終結果] L_TARGET_DIRS の内容"
echo "-------------------------------"
for i in $L_TARGET_DIRS
  # 空行は表示しない
  if test ! -z {$i}
    echo $i
  end
end
```

## 実行結果

`中間結果` では、find / -maxdepth 1 -mindepth 1 -type d の結果が全て表示されているが、
その後の `最終結果` では、L_EXCLUDE_DIRS で定義したディレクトリが除外されている.

```bash
-------------------------------
[途中結果] L_TARGET_DIRS の内容
-------------------------------
/lost+found
/export
/snap
/proc
/sbin
/media
/root
/opt
/var
/srv
/sys
/boot
/cdrom
/lib64
/bin
/mnt
/run
/home
/tmp
/lib
/dev
/usr
/etc

-------------------------------
[最終結果] L_TARGET_DIRS の内容
-------------------------------
/export
/var
/sys
/boot
/bin
/home
/usr
/etc
```

以上
RubyKaigi Takeout 2021 参加レポート

「RubyKaigi Takeout 2021」に初参加したので、そのレポートを簡単に書きました！
私の経歴ですが、Javaを5年近く経験した後、Ruby on Railsでの開発を1年半ほど経験、という流れです。

https://rubykaigi.org/2021-takeout/schedule#day1

# Day1

## TypeProf for IDE: Enrich Dev-Experience without Annotations
https://youtu.be/uNttp63ELoE

- RBS
    - Rubyの型を定義するための公式言語
- TypeProf/Steep/Sorbet
    - 静的型解析ツール
- TypeProfとはRubyコードを型レベルで実行する
- TypeProfの弱点としては解析に時間がかかる
    - require先のライブラリも解析しに行くのが主な原因
- TypeProf for IDEは1秒以上かかる解析は打ち切るという割り切った設計にした
- TypeProfを高速化するにはgemのRBSを書く必要がある

[感想]
Rubyの静的型解析に関する基本的な内容と、Ruby3.1でリリースされるVSCode用の拡張機能「TypeProf for IDE」に関するお話です。静的型解析は個人的にも一番注目している機能なので、とても興味深いセッションでした。

Rubyの静的型解析に関しては絶賛進化中という感じで、TypeProfも規模の大きいコードでは解析にとても時間がかかるらしいです。それを改善するために各種gemの方でRBSを書くことが重要になってくるとのことです。

私はRubyMineで開発していますが、VSCodeが便利になれば負けじとRubyMineも便利な機能が追加されるので、IDE/エディタ間の競争には今後も期待しております。



## RuboCop in 2021: Stable and Beyond
https://youtu.be/yJF5EKM_zPw

- Rubocop1.0リリース直前のバージョンが圧倒的にダウンロード数が多かった
    - なので1.0以降のダウンロード数を増やしたいと思ったのが今回のきっかけ
- 1.0以降はルールの互換性を担保する
- アップグレード時の痛みを減らす
    - いきなり適用せずユーザーが選択できるように
- auto-correction
    - `-A`オプションでunsafeな修正も可能になった
- `--parallel`オプションがデフォルトになった
    - Parallel gemを利用している
- 今のところRubocopはRBSをサポートしていない
- デフォルトルールが厳しすぎる、しかしカスタムするのも大変…、という意見をもらうことがある
    - 対策1: DisabledByDefault: trueから始めて、PRでよくコメントをもらう箇所から有効にしていく
        - Railsリポジトリはこの方法を採用している
    - 対策2: Third party presetを活用する

[感想]
私も普段からとてもお世話になっているRubocopの現在とこれからについてのお話でした。
`-A`というunsafeな修正が可能なオプションがある、`--parallel`オプションがデフォルトになった、など為になる情報も聞くことができました。
デフォルトルールが厳しすぎると思った際の、カスタマイズ方法に関する情報も参考になりました。

# Day2

## The newsletter of RBS updates
https://youtu.be/AwuSHC6j-48

- Ruby3.1で導入されるRBSの新機能について
- rbs collection
    - RBSのためのbundlerというイメージ
    - サードパーティーのRBSを管理するのは大変というのがモチベーション
        - 依存性の解決を手で行う必要がある
    - 依存性の解決にGemfile.lockを利用している
    - 標準ライブラリを手動で設定ファイルに記述する必要がある
        - 標準ライブラリはGemfile.lockに表れないため依存性の解決ができない
        - なるべく早く解決したいと思っている
- bounded type parameters
- Generic Type Aliases
    - Javaのジェネリクス的なもの？
    - 型の抽象度を上げてDRYな書き方ができる

[感想]
現状、サードパーティーのRBSを管理するのは大変だということを知りました。それがRuby3.1では解消されるとのことなので、既にRBSを使っている人たちには影響が大きいアップデートになりそうですね。

## Ruby Committers vs the World
https://youtu.be/zQnN1pqK4FQ

[感想]
Ruby3.1の新機能についてコミッターの方々30人近くがワイワイしゃべるという、盛り上がるセッションでした。RubyKaigiの参加者はIDEを使っていない人もけっこう多いということが意外でした。

やはりGoを意識したアップデートが多いように感じられました。
「Goの総合的な体験がよいのであって、ワンバイナリだけ切り出して考えても幸せになれない、という気はしてます」というチャット欄のコメントが印象に残りました。

# Day3

## Matz Keynote
https://youtu.be/QQASprf5EGw

[感想]
Rubyの生みの親まつもとゆきひろさんが各セッションの振り返りや3.1の新機能についてお話するセッションでした。

「新しい機能を作るだけでは自己満なので、開発者のためにRuby3.0からは後方互換性を大事にした」という思想は、開発者にはとてもありがたいことです。
PythonやGoなどと比較しながらRubyの利点に関する説明を聞けたのが面白かったです。

「パフォーマンスは言語の評価に直結」とMatzさんが言っていたので、今後もパフォーマンス改善には力を入れていくという強い意思が伝わってきました。

# まとめ
初参加でしたが、コミッターから直接Rubyの最新情報を聞くことができる、とても有意義なカンファレンスだと感じました。

Railsを主に利用しているWeb系エンジニアの自分には難しい内容もありましたが、セッションの動画がYouTubeにアップされているので、じっくりと復習できる点も素晴らしかったです。

静的型解析で開発体験の向上・JITコンパイラ/Ractorなどのパフォーマンス向上、などRuby3には開発者にとって魅力的な機能があることがわかりました。

今回のカンファレンスで、自分はRubyについて知らないことがたくさんあるということに気づき、Rubyの言語仕様を詳しく知りたい・Rubyのコアな部分のリポジトリを詳細に見てみたい、などのモチベーションに繋がりました。
ABC219 C - Neo-lexicographic Ordering から学んだ

https://atcoder.jp/contests/abc219/tasks/abc219_c

![abc219_1.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/737344/e6f1cdfd-113b-b138-bb5c-ea1864ee5f37.png)
![abc219_2.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/737344/d74a5c59-61c0-992b-8198-11b229358f22.png)

踏む踏む。
S に含まれる英小文字を X の中から探し、
数字に置き換えてみた。だがしかし WA.

```Neo-lexicographicOrdering_rv0.py
X = input()
N = int(input())
 
S =[]
dic = {}
for _ in range(N):#5*10**4
    s = input()
    y = ""
    for i in range(len(s)):#10
        y += str(X.index(s[i]))# index って 計算量は X 長に依存だなー 26
    dic[y] = s
 
#print(dic)
dic = sorted(dic.items(),key=lambda t:t[0])
#print(dic)
 
for a,b in dic:
    print(b)
```

数字を連結するのは良かったが、
例えば 1 , 2, 3 は 123 でよい。
しかし 1, 20 , 3 はどうなる？
1203 は正しく辞書順にできないのでは？

っというわけで、数字に置き換えるのではなく、
従来の abcdefghi... の順番に置き換えて考えたら通った。

```Neo-lexicographicOrdering_rv1.py
Y = "abcdefghijklmnopqrstuvwxyz"
X = input()
N = int(input())
 
S =[]
dic = {}
for _ in range(N):#5*10**4
    s = input()
    y = ""
    for i in range(len(s)):#10
        for j in range(len(X)):#26
            if s[i] == X[j]:
                y += Y[j]
    dic[s] = y
 
#print(dic)
dic = sorted(dic.items(),key=lambda t:t[1])
#print(dic)
 
for a,b in dic:
    print(a)
#1774ms
```

計算量は余裕のはずだったが、実際はギリギリだった。
もうちょい考えてみるか。
index を使えば、もう少し簡略化できると思った。

```abc219c.py
def solv():
    ref = "abcdefghijklmnopqrstuvwxyz"
    X = input()
    N = int(input())
    lis = []
    for _ in range(N):
        S = input()
        T = ""
        for i in range(len(S)):
            T += ref[X.index(S[i])]
        lis.append([S,T])
    lis = sorted(lis,key=lambda t:t[1])
    for a,b in lis:
        print(a)
solv()#232ms
```
Webシステムのセキュリティ対策まとめ　-不正アクセス-

#はじめに

前回、ファイアーウォールについて学習しました。今回ファイアーウォールでは防げない攻撃もあることを学習したので
今回まとめてみました。

#不正アクセスを検知する装置
IDSはIntrusion Detection Systemの略称で、不正侵入検知システム。

インターネットに公開するサービスでは、それに対する通信はファイアウォールでは接続許可の扱いとなるため、正常な通信と異常な通信は区別なくアクセスされることになります。

そこで、IDSを設置することで、通信を監視します。
また、もし異常があれば管理者へ通知することで、異常な通信をブロックするなどの対処をするきっかけとなる。

#IPS（不正侵入防止システム）とは？

IPSはIntrusion Prevention Systemのことで、不正侵入防止システム。

IPSはIDSより優秀で、異常な通信があれば、管理者へ通知するだけでなく、その通信をブロックも行える。

つまり、管理者が異常に気づいてから対処するのと異なり、迅速な対処が可能となります。

また、IDSでは本来の通信のコピーを監視して、異常を通知していましたが、IPSでは、異常な通信をブロックする必要があることから、通信経路の間に入ることになるというように、ネットワーク構成上の違いもあります。

なお、IPSの機器が故障した際は、通信を維持することを優先することから、基本動作は全ての通信が許可。

また、IDS/IPSだけでは、カバーできる範囲に限りがあるため、全ての攻撃を遮断することはできません。
少なくともファイアウォールと併せて利用される。

以上、IDS/IPSについてまとめさせていただきました。
【TypeScript】img画像を読み込めないエラー

# 画像が読み込めない
**TypeScript**で構成されたWebアプリケーションを作っているのですが、画像を読み込めなくて困っていました。

# 試したこと
 該当ファイル周辺のフォルダ構成は下記のようになっていて、

```
profileimage
|- ProfileImage.tsx
|- ProfileImage.module.scss
|- Rectangle81.jpg
```
`ProfileImage.tsx`と`ProfileImage.module.scss`は、

```ProfileImage.tsx
import React from "react";
import styles from "./ProfileImage.module.scss";

const ProfileImage = () => {
  return (
    <div className={styles.root}>
      <div className={styles.coverPhotoWrapper}></div>
    </div>
  );
};

export default ProfileImage;

```

```ProfileImage.module.scss
.root {
  width: 100%;
  height: 200px;
  .coverPhotoWrapper {
    background: url(./Rectangle81.jpg);
    background-repeat: no-repeat;
    width: 100%;
    height: 100%;
  }
}

```
このようになっていました。

# エラー発生
表示具合を確かめてみようと、ブラウザをリロードするとエラーが発生しました。
ターミナルを見ていると、

```
/Users/USERNAME/node_modules/file-loader.js doesn't exist
        /Users/USERNAME/node_modules/file-loader doesn't exist
```
上記エラー（一部抜粋）を発見。

# file-loaderをinstall
とりあえず上記エラーをそのままグーグル検索にかけると、

https://v4.webpack.js.org/loaders/file-loader/

こちらのページを発見。
サイト内で書かれている通り、

```
$ npm install file-loader --save-dev
```
を実行すると、無事画像が表示されました。

# まとめ
いつもは`create-react-app`からプロジェクトを始めるのですが、今回はとあるGithubレポジトリからクローンしたものからのスタートだったので、このようなエラーにつながったのかな？と思っています。

同じようなエラーに遭遇された方はぜひ試してみてください。