OmniAICreator/Qiita-1.07M huggingface dataset:
DjangoとDocker練習O7o1o0 dataフォルダーを壊してしまったときのリセット方法を覚えよう！

# 目標

シナリオ:  

Djangoサーバーのデータベースが壊れてしまった。  
プログラムは残っている  

アクション:  

データが初期状態から Djangoサーバーを再開できるようにしたい  

## 詳細

シナリオ:  

既存のデータベースはフォルダーごと削除し、初期状態のデータベースを自動生成した。  
しかし Django フレームワークはエラーを起こし、サーバーが起動しないようだ。  
その原因としては、  
allauthなど、他のDjangoサーバーのアプリケーションを混ぜると、データベースを１から作り直すだけでは  
再開できないケースが出てくるのかもしれないが、よくわからない  

アクション:  

なんだかよくわからないが、やってみて直ったケースを　逐一　覚えていくことにする  

# 情報

この記事は Lesson 1. から順に全部やってこないと ソースが足りず実行できないので注意されたい  

| What is   | This is                                                                                                 |
| --------- | ------------------------------------------------------------------------------------------------------- |
| Lesson 1. | 📖 [DjangoとDockerでゲーム対局サーバーを作ろう！](https://qiita.com/muzudho1/items/eb0df0ea604e1fd9cdae) |

この記事のアーキテクチャ:  

| What is   | This is                                   |
| --------- | ----------------------------------------- |
| OS        | Windows10                                 |
| Container | Docker                                    |
| Editor    | Visual Studio Code （以下 VSCode と表記） |

ディレクトリ構成を抜粋すると 以下のようになっている  

```plaintext
    ├── 📂 src1
    │   ├── 📂 apps1
    │   │   ├── 📂 portal_v1                # アプリケーション
    │   │   └── 📂 practice_vol1o0              # アプリケーション
    │   ├── 📂 data
    │   ├── 📂 project1                     # プロジェクト
    │   │   ├── 📄 __init__.py
    │   │   ├── 📄 asgi.py
    │   │   ├── 📄 settings.py
    │   │   ├── 📄 urls_practice.py
    │   │   ├── 📄 urls.py
    │   │   └── 📄 wsgi.py
    │   ├── 📂 project2
    │   ├── 🐳 docker-compose-project2.yml
    │   ├── 🐳 docker-compose.yml
    │   ├── 🐳 Dockerfile
    │   ├── 📄 manage.py
    │   └── 📄 requirements.txt
    └── 📄 .gitignore
```

# 手順

## Step O7o1o0g1o0 バックアップを残しておけ

関連するすべてのフォルダーまるごと、 **バックアップを残しておけ**  

このレッスンは　異常時からの復旧の練習だ。  
データを損失するし、復旧できるとも限らない  

## Step O7o1o0g2o0 Dockerコンテナ停止

Dockerコンテナが動いていれば、停止させてほしい  

## Step O7o1o0g3o0 data フォルダーを消そう

👇 以下のフォルダーを消してほしい。 Webサイトのデータが全部飛ぶ  

```plaintext
    └── 📂 src1
👉      └── 📂 data
```

## Step O7o1o0g4o0 Dockerコンテナの起動

👇 Docker コンテナを起動しておいてほしい  

```shell
# docker-compose.yml ファイルを置いてあるディレクトリーへ移動してほしい
# cd src1

# Docker コンテナ起動
docker-compose up
```

## Step O7o1o0g5o0 コマンドの打鍵 - migrate

👇 以下のコマンドを打鍵してほしい。何をやっているかは分からない  

```shell
docker-compose run --rm web python3 manage.py migrate sites
docker-compose run --rm web python3 manage.py migrate
```

（マイグレーションをしているのは分かるが、何でこうなるのか　よく分からない）  

## Step O7o1o0g6o0 Webページへアクセス

📖 [http://localhost:8000/accounts/vol1.0/signup/](http://localhost:8000/accounts/vol1.0/signup/)  

👆 allauth など、正常に動いているか　確認してほしい。  
もし動いていなければ Webサイト は破壊してしまった。 連載を１からやり直してほしい  

## Step O7o1o0g7o0 やりなおし

今までにデータベースに登録した内容は消えているので、連載をやり直してほしい  

* Super-user の作成

# 次の記事

📖 [Djangoでサインイン（利用開始）のページを作ろう！](https://qiita.com/muzudho1/items/1d34d64562ff07f1742a)  

# 参考にした記事

📖 [Django: relation "django_site" does not exist](https://stackoverflow.com/questions/23925726/django-relation-django-site-does-not-exist)
Rspec request-specからOpenAPI 仕様ドキュメント自動生成(rspec-openapi)

# はじめに
案件で実装したAPIの仕様書が急遽必要になり、rspec-openapiというrailsのrequestテストからOpenAPI 仕様のドキュメントを出力することができるGemがありました。
便利だと思ったので、使用方法をまとめておこうと思いました。

# 開発環境
ruby '3.0.0'
Rails 6.0.3.4

# 前提
- rspecでテストを実施している
- requestのテストを書いている

# 使用方法

1.　Gem('rspec-openapi')のインストール　
```ruby:request.rb
group :test do
  gem "rspec-rails"
  gem "rspec-openapi"  # 今回追加
end
```

bundle install 実行


2.　OPENAPI=1 rspec を実行

環境変数等を設定する必要はなく、以下コマンドを実行

```erb:ターミナル
OPENAPI=1 rspec 
OPENAPI=1 rspec ファイルパス   # 指定したファイルのみ実行
```

※docker の場合はコンテナ内で実行
```erb:ターミナル
##入りたいコンテナ名を確認
docker ps

##コンテナに入る
docker exec -it コンテナ名 /bin/bash

##コンテナ内で実行
OPENAPI=1 rspec
```

実行後、ルートディレクトリにdoc/open.yaml　ファイルが作成される。

3.　Swaggaer Editer で自動生成されたopen.yamlをインポートする

https://editor.swagger.io/

 以下のようにして、参照することができる。
![スクリーンショット 2022-07-02 13.33.55.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1874224/8bd06800-482c-d39f-c9ce-bf63bf232089.png)


![スクリーンショット 2022-07-02 13.34.06.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1874224/d4102b9a-b3cf-ffef-2085-a978d87e213d.png)

#注意

Aithorization：トークン等の情報までは、乗せることができないため編集が必要。

#終わりに
Swaggerのような仕様書を位置から用意するのはかなり骨が折れる（拒絶）と思います。　　　　　　　
今回は、requestsのテストを書いていれば自動で生成してくれるため、特別必要な工数が少ないところが非常にいいなと思いました。


# 参考
https://tech.stmn.co.jp/entry/rspec-opnapi
【Python】ワーシャルフロイド法

# ワーシャルフロイド法とは
任意の2頂点間の最短距離を求める問題を解くアルゴリズム

# 特徴
* 有効グラフでも無向グラフでも使える
* 辺に負の重みがあっても使える

# 計算量
```math
O(|V|^3)
```

# 実装
```python
# cost[i][j]: 頂点v_iから頂点v_jへ到達するための辺コストの和
# 頂点v_iから頂点v_jへの辺がない場合はINFを設定

for k in range(V):
    for i in range(V):
        for j in range(V):
            if cost[i][k]!=INF and cost[k][j]!=INF:
                cost[i][j] = min(cost[i][j], cost[i][k] + cost[k][j])
```
Codility lesson3 TapeEquilibrium

Lesson3のTapeEquilibriumは右と左のブロック和の差の絶対値の差を考えるという問題です。
文章だけだと何のことって感じですよね笑
具体的にみていきます。

例えば長さ4の配列[3,1,2,4,3]について二つのブロックに分割することを考えます。

まず2番目で右と左の二つのブロックに分割したらどうなるでしょうか。
右の和 = 3 + 1 = 4
左の和 = 2 + 4 + 3 = 9

よって右と左のブロックの差の値は4-9 = -5であり、その絶対値は5です。

1番目で右と左の二つのブロックに分割したらどうなるでしょうか。
右の和 = 3  
左の和 = 1 + 2 + 4 + 3 =  10

よって右と左のブロックの差の値は3-10 = -7であり、その絶対値は7です。

このようにして1番目、2番目、３番目…と配列に対して、次々と右と左のブロック和の差の絶対値を考え、その最小値を求めていきます。

今回ですと３番目で分割した時、
右の和 = 6
左の和 = 7
右と左のブロック和の差 = -1、絶対値の値1が最小となります。

このように、任意の配列に対して、差の絶対値の最小値を求めていきます。

アルゴリズムは以下の通りです。 1.最初に右と左の差の絶対値の最小値の初期設定をしておいく。 2.右と左の値を更新し、新た差の絶対値の値を求めていく。先の差の絶対値の最小値と比較して、新しい方が小さければ、新たな差の絶対値の最小値として更新していく。
3.2を繰り返し行い、配列の差の絶対値の最小値を求めていく。

コードは以下の通りです。


    def solution(A):
        len_A = len(A)
        p = 1
        sum_left = A[0]
        sum_right = sum(A) - A[0]
        sum_difference = abs(sum_left - sum_right)   
        sum_difference_min = abs(sum_left - sum_right)
    
        while p < len_A:
            p += 1
            sum_left = sum_left + A[p-1]
            sum_right = sum_right - A[p-1]
            sum_difference = abs(sum_left - sum_right)

            if sum_difference <= sum_difference_min:
                sum_difference_min = sum_difference
    
        return sum_difference_min









さて結果は。。。。？


![スクリーンショット 2022-07-02 13.09.26.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1667538/536de433-cfe2-db90-16d3-08c69b6df97d.png)

あれ、84%？？？
考え方でどこが間違っているか、わかる方いたら教えてください。
trailhead-tips.herokuapp.com　関係


[Trailhead関係　個別の課題別 に戻る](https://qiita.com/Keiji_otsubo/items/56eb7a90bb72138ece1f)

# trailhead-tips.herokuapp.com response time is too long.

[trailhead-tips.herokuapp.com response time is too long.](https://trailhead.salesforce.com/ja/trailblazer-community/feed/0D54S00000HDxwF)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/328136/216b3a9a-8166-6580-3a6b-38455cd4f6a8.png)
2022年07月何故かベストアンサーをつけてくれない質問


+ [ダッシュボードまたはレポートの購読を解除するにはどうすればよいですか？](https://trailhead.salesforce.com/ja/trailblazer-community/feed/0D54S00000HEJN2)
+ [メンバーの管理画面でグループに追加するメンバーを検索する方法](https://trailhead.salesforce.com/ja/trailblazer-community/feed/0D54S00000IRRSX)


+ [How to bring down the storage used by Content Bodies Under File Storage Usage](https://trailhead.salesforce.com/ja/trailblazer-community/feed/0D54S00000HEKmhSAH)


+ [l need help](https://trailhead.salesforce.com/ja/trailblazer-community/feed/0D54S00000HEV5y) 
+ [How to Differentiate between @wire and imperative method?](https://trailhead.salesforce.com/ja/trailblazer-community/feed/0D54S00000HEV3x)
2022年07月未解決の質問


# トレイルヘッド

+ [Need help passing the Use External Services in a Flow" challenge.](https://trailhead.salesforce.com/ja/trailblazer-community/feed/0D54S00000IPkPn)
+ [Boa Noite, alguém já fez esse desafio? Estou com esse problema na validação desse desafio e não consigo resolver. Alguém poderia me ajudar?](https://trailhead.salesforce.com/ja/trailblazer-community/feed/0D54S00000HDzFm)


+ [INVALID_OR_NULL_FOR_RESTRICTED_PICKLIST, Status: bad value for restricted picklist field: test: [Status__c]
](https://trailhead.salesforce.com/ja/trailblazer-community/feed/0D54S00000HDz4F)
+ [Set up a Salesforce Direct Query: Whoops, looks like there was a problem. Please try again.](https://trailhead.salesforce.com/ja/trailblazer-community/feed/0D54S00000HDmnJ)
+ [unable to complete "user authentication" module](https://trailhead.salesforce.com/ja/trailblazer-community/feed/0D54S00000HE7xc)
+ [Visualize Your Data in the Create Reports and Dashboards for Sales and Marketing Managers](https://trailhead.salesforce.com/ja/trailblazer-community/feed/0D54S00000IPr7E)
+ [ServicesCloudユーザーを有効にできません](https://trailhead.salesforce.com/ja/trailblazer-community/feed/0D54S00000HmaDl)
+ [タイプ別にディスカバリーを要約したレポートを作成するための私の先駆者の旅。](https://trailhead.salesforce.com/ja/trailblazer-community/feed/0D54S00000HDj60)
+ [We can't find the pre-installed flow named 'Alert Acct Owner of New Case Added'. Make sure you sign up for a special Developer Edition org, connect it to Trailhead, and use it for this challenge.](https://trailhead.salesforce.com/ja/trailblazer-community/feed/0D54S00000Fxiqw)

+ [クリックを減らすためのマクロとクイックテキストの作成-Eメール](https://trailhead.salesforce.com/ja/trailblazer-community/feed/0D54S00000HEKEW)
+ [We updated the shipping address in an account record, but we can’t find the new address values in each child contact’s mailing address. Make sure the process is active.](https://trailhead.salesforce.com/ja/trailblazer-community/feed/0D54S00000HETPISA5)




# データーローダー

+ [データローダーで使用されるNTLMバージョン](https://trailhead.salesforce.com/ja/trailblazer-community/feed/0D54S00000IR1Fw)

# 数式

+ [Formula in Flow](https://trailhead.salesforce.com/ja/trailblazer-community/feed/0D54S00000HERSF)

# Apex

+ [FIELD_INTEGRITY_EXCEPTION, The price book entry is in a different price book than the one assigned to the Work Order, or Work Order has no price book assigned.: [PricebookEntryId].](https://trailhead.salesforce.com/ja/trailblazer-community/feed/0D54S00000ISHcx)

# 未分類

+ [How to set up a follow up/Reminder after an event](https://trailhead.salesforce.com/ja/trailblazer-community/feed/0D54S00000HEOwq)
+ [Configure Column not loading](https://trailhead.salesforce.com/ja/trailblazer-community/feed/0D54S00000HE7Bx)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/328136/4853ed37-e641-7667-d893-13cb5e693dd2.png)




# そもそもそんなことはできんだろうな質問

何度説明しても分かってもらえそうにない。ダメだな。本当にシステム屋さんか？

+ [Formula for Report](https://trailhead.salesforce.com/ja/trailblazer-community/feed/0D54S00000HEM9h)
良いコンテンツの概要

ポイントウォークランニングブーツであり、「ほとんどのトレイルのオペレーティングシューズ」以来注目されています。 それはタフで、ハードで、あなたがトレイルに着手するのを助ける準備ができています。 そのブーツは、ナイキのトレイルシューズの数とよく一致しています。 この靴は、ミニマリストの[27dk](https://www.27dk.com/jp/)靴のデザインとアウトソールの素晴らしい組み合わせを提供し、各パスランナーが必要とするヘルプとセキュリティを提供します。 エアフォーカステラキガーのグループは、トレイル用に選択された多くの靴の1つであり、このバリエーションは改善されていないままではありません。
【2022年版】macOS Monterey で Ubuntu 22.04 のインストール USB の作成

# 【2022年版】macOS Monterey で Ubuntu 22.04 のインストール USB の作成

## はじめに

  - Macbook Pro 2021 で Ubuntu 22.04 のインストール USB　を作成します
  - USB作成アプリは balena を使用します。

## 環境

  - M1 Mac

    ![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/143127/b499491a-84d2-8ea8-08ad-611b6b20457c.png)
  
```terminal
% sw_vers 
ProductName:	macOS
ProductVersion:	12.4
BuildVersion:	21F79
```

## 準備
### Ubuntu 22.04 の　iso　をダウンロードする

  - [Ubuntu Download](https://jp.ubuntu.com/download)

    ![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/143127/ddf89cdd-07ef-6ec1-f65d-9fd3a03bff82.png)

### isoをusbに書き込むためのアプリである balena をダウンロードする

  - [balena download](https://www.balena.io/etcher/)

    ![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/143127/6c428ea3-f27a-9669-d369-874766c73ced.png)

## 作成
### balena で isoを書き込む

  - balena を起動

    ![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/143127/b83a06b9-abee-89b7-657f-81f2d16d4076.png)

  - iso ファイルを選択

    ![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/143127/0f646ec7-8ae6-8e36-5929-2077fc6e53e8.png)

  - iso が選択された後、Flash Driveを選択する

    ![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/143127/f4163d72-eade-1853-9d7e-c140e6ffac7a.png)

    ![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/143127/320ee795-5607-5881-b794-7fdeb177640b.png)

  - 書き込みを開始する

    ![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/143127/114b27cf-c5a7-438d-2b51-fffeaba952be.png)

  - 書き込み中
  
    ![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/143127/53564be9-4c5b-ab41-d868-3d88094f787b.png)

  - 書き込み完了
  
    ![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/143127/f56484e6-8e49-d8db-6386-4f4fa0a9e836.png)

## さいごに

  - かんたんでしたね
flutter doctorで"Visual Studio not installed"という警告が消えない

Visual Studioをインストールしているのにも関わらず、上記警告が消えない場合の対応です。
Visual Studioをインストールしていない人は警告に従ってインストールしてください。

# 暫定対応
2022/07/02現在の暫定対応としては、次の2つの対応方法があるようです。

1. Flutterをプレリリース版にする
1. vswhereを更新する

私は2つ目のvswhereの更新でエラーが出なくなりました。

## vswhereの更新方法
`C:\Program Files (x86)\Microsoft Visual Studio\Installer`にある`vswhere.exe`を[vswhereの最新版](https://github.com/microsoft/vswhere/releases)で置き換えます。

# 最新状況
上記はあくまで暫定対応です。
最新状況は[こちら](https://github.com/flutter/flutter/issues/106601)で確認してください。
✘ [ERROR] In development, you should use a separate r2 bucket than the one you'd use in production.

✘ [ERROR] In development, you should use a separate r2 bucket than the one you'd use in production. Please create a new r2 bucket with "wrangler r2 bucket create <name>" and add its name as preview_bucket_name to the r2_buckets "MY_BUCKET" in your wrangler.toml

wrangler dev した時に出るエラー。
wrangler.toml に ローカル開発環境用のR2バケットの追加を促している。


## 対応
### 1. cli
```
wrangler r2 bucket create ローカル開発環境用のR2バケット名 # R2バケット作成
wrangler r2 bucket list # create で指定した名前が表示されればOK
```

### 2. wrangler.toml　[[r2_buckets]]にpreview_bucket_nameを追加

```
[[r2_buckets]]
binding = ""
bucket_name = ""
preview_bucket_name = "ローカル開発環境用のR2バケット名" # createで指定した名前を追加
```
npm installlをすると出てくる警告の解消

初めまして、現在ReactーReduxを勉強中のものです。

今回は、「npm install」をすると出てくる警告がうざかったので解消しようと思いました。

# 警告とは何？

`npm install`とかすると出てくるやつです。

```
# コマンド
$ npm install --save --force @mui/material 

# 以下警告文

npm WARN using --force Recommended protections disabled.

added 7 packages, removed 26 packages, changed 33 packages, and audited 612 packages in 6s

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

21 vulnerabilities (6 moderate, 14 high, 1 critical)

To address all issues, run:
  npm audit fix

Run `npm audit` for details.
```

「vulnerabilities」とは脆弱性です。
パッケージの中に脆弱性があると、正規表現とかで攻撃されるらしいです。

# 消し方

### 手順1

まず、警告文に書いてあるとおり、`npm audit fix`をしてみます。

```
npm WARN audit fix tar@4.4.8 node_modules/fsevents/node_modules/tar

# 中略

added 23 packages, removed 5 packages, changed 31 packages, and audited 630 packages in 8s

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

# npm audit report

glob-parent  <5.1.2
Severity: high
Regular expression denial of service in glob-parent - https://github.com/advisories/GHSA-ww39-953v-wcq6
fix available via `npm audit fix`
node_modules/watchpack-chokidar2/node_modules/glob-parent
  chokidar  1.0.0-rc1 - 2.1.8
  Depends on vulnerable versions of glob-parent
  node_modules/watchpack-chokidar2/node_modules/chokidar
    watchpack-chokidar2  *
    Depends on vulnerable versions of chokidar
    node_modules/watchpack-chokidar2
      watchpack  1.7.2 - 1.7.5
      Depends on vulnerable versions of watchpack-chokidar2
      node_modules/watchpack

4 high severity vulnerabilities

To address all issues, run:
  npm audit fix
```


「4 high severity vulnerabilities」、つまり、「4件の高い脆弱性」がまだ残ってるらしいです。

### 手順2

[こちらの記事](https://rinoguchi.net/2021/11/npm-version-up-and-fix-audit.html)を参考にしました。

「npm-check-updates」というパッケージを用いました。
パッケージの最新バージョンを調べて、package.jsonを書き換えてくれるらしいです。

1.   `npm install -g npm-check-updates`でインストール
2.   `ncu`で現在の状況を確認
2.   `ncu -u`でpackage.jsonを最新バージョンに書き換え
2.   `npm install`で最新バージョンをインストール

```
# 最新バージョンをインストール
npm install

# ログ
added 89 packages, removed 332 packages, changed 170 packages, and audited 366 packages in 21s

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

found 0 vulnerabilities
```

脆弱性がなくなりました:clap:

# まとめ

`npm audit fix`と「npm-check-updates」で警告文をなくすことができました。

警告文はうざったいので、さっさと取り除きたいですね。
備忘録：zabbixのアクティブチェックとパッシブチェックの違い

備忘録として投稿しています
個人的な感想として投稿しています

よく分からない2つのチェックの違いについて

抱いていたイメージ
・アクティブチェックはエージェントに対してリストを送ってそれをエージェントがレスポンスする

イメージと異なった点
・どうもACは不定期でPCはていきみたいです。なんでACとPCでわけられているのでしょう。どういったデータを取得するのかというと、死活管理全般、プロセスの起動、スクリプトを走らせる、ログ監視など多様です。重たい処理もあれば軽い処理もあります。ザビッグスサーバの運用を効率的に行うためには重たい処理と軽い処理を区別することが一つです。重たい処理は不定期に監視する一方、軽い処理は定期的に監視する。

・スペックが許す限りはすべてPCでいいような気もします。

・気になることは、アイテムがすべてACの場合、アベイラビリティーが緑にならないことです。
RSpecの導入　Rails6 × Docker【備忘録】

## はじめに
RSpecを導入しようと思い記事を見ながら進めていたら
思った通りに進まずエラーの沼にハマってしまったので、忘れないようにまとめておこうと思います。
(Dockerを考慮出来ていなかったのがエラーの原因だったので、完全に自分のミスですが。)

## 前提
__環境__
　Ruby 2.7系
　Rails 6.1系
　Docker 20.10.16

## 導入方法
#### ①Gemfileに以下を追加します。
```:Gemfile
group :development, :test do
  gem 'rspec-rails'
  gem "factory_bot_rails" # ←なくても問題ありませんが、使用したかったので入れてます
end
```

#### ②bundle install
```:ターミナル
% docker-compose run web bundle install
```

#### ③build
私はこれを完全に忘れてしまっていました。超初歩的なミスなので、今後は気をつけます。

```:ターミナル
% docker-compose build
```

#### ④インストール
```:ターミナル
% docker-compose run web rails g rspec:install
```
インストールすると「.rspec」というファイルが作られるので、そのファイルを開いて以下を追加します。
```:.rspec
--format documentation
```
この設定をすることでテスト実行時にログを詳細に見れるようになります。
特に気にしないのであれば必須ではありません。

## RSpecの実行
ここまで出来たら導入は出来ているので実行してみましょう。
```:ターミナル
% docker-compose run web rspec
Creating xxx_web_run ... done
No examples found.

Finished in 0.00118 seconds (files took 3.39 seconds to load)
0 examples, 0 failures
```
まだ何も書いていないので 0 examplesですが、正常に実行できることは確認できました。

FactoryBotについては今回は割愛させていただきます。
参考にさせていただいた記事だけ紹介して終わりとします。
[【RSpec初級編】FactoryBotを用いてテストコードを効率化する方法について解説](https://techtechmedia.com/factory-bot-rails/)
AWS FSxの用語要点まとめ（自分用メモ

Amazon FSxはAWSが提供するファイルストレージサービス。
ファイルストレージとはデータをファイルやフォルダの単位で階層構造として管理するストレージ形式のこと。

Amazon FSxには2種類のファイルシステム（ストレージ上のファイルを管理する仕組み）がある。
・Amazon FSx For Windowsファイルサーバー
・Amazon FSx For Lustre

いずれも「Windowsファイルサーバー」または「Lustre」という既存のファイルシステムをAWS上で利用できるようにしたサービスです。本項ではそれぞれの機能について説明します。

・Amazon FSx For Windowsファイルサーバー
FSx For Windowsファイルサーバーは、SMBプロトコル（主にWindowsコンピュータ間において、ファイル共有やプリンタ共有に使用されるプロトコル）を介してWindows Server（OS）上に構築されたファイルシステムを提供するフルマネージドのストレージサービス。
FSx For Windowsファイルサーバーは、AWS上のEC2インスタンスなどのクライアントからマウントして利用。マウント可能なクライアントは、EC2インスタンスのほか、オンプレミスのWindows 10がインストールされたコンピュータや、Windows Server 2016がインストールされたサーバーなどがあります。

AWSのFSx For Windowsファイルサーバーの特徴：
(1) フルマネージドシステムである、とは
オンプレミスでWindowsファイルサーバーを運用する場合、ハードウェアの用意やメンテナンス、OSやソフトウェアのパッチに加えて、バックアップの取得やストレージ容量の監視などが必要になります。
FSx For Windowsファイルサーバーはフルマネージドシステムのため、サーバーの運用管理はAWSが行います。さらに、Amazon CloudWatchと連携した容量監視やAWS CloudTrailによる操作ログの取得など、他のAWSサービスと連携した運用も可能。

(2) Windowsサーバーが提供する既存機能を利用できる
FSx For Windowsファイルサーバーでは、Windowsが提供する機能を利用できる。（NTFS、SMB、AD、Windows ACLなど）

AWSが用意した独自プロトコルなどではなくWindowsネイティブ（Windowsが提供する機能そのもの）ので、オンプレミスで構築済みのWindowsサーバーをAWSへ移行する場合でも、従来システムと同様に利用できます。


・Amazon FSx For Lustre
LustreとはLinux上で動作するオープンソースのファイルシステムで、主にスーパーコンピューターなどのHPC（High Performance Computing）や機械学習の分野で利用されています。大量のクライアント（ファイルシステムを利用する端末）から、低レイテンシかつ高スループットにファイルアクセスを行う必要のあるシステムで利用。
通常は大容量かつ高性能が求められる分野での使用が想定されている。


FSx For Lustreを利用するには、LinuxをインストールしたEC2インスタンスからファイルシステムをアタッチ（マウント）。1つのファイルシステムには、1台～数千台のインスタンスから同時アクセスが可能。
また、EC2インスタンスやFargate、ECSなどで実行されるコンテナからもLustreファイルシステムへアクセスできます。その際は、タスクロールと呼ばれるIAMロールの設定が必要になります。タスクロールは、コンテナがFSxやS3など他のAWSサービスを利用する際に設定します。
※Fargate ... コンテナ向けのサーバーレスコンピューティングエンジン。ECSやEKS（いずれもコンテナを生成したり管理するサービス）に対応している。Fargateを利用することにより、コンテナが動作する環境（ホスト）を意識することなくコンテナを実行できる。

AWSのFSx For Lustreの特徴：
(1) フルマネージドシステムである
Lustreを導入する際は、独自の役割を持った複数のサーバーや特殊なネットワーク環境が必要になるため、初期の導入コストは非常に高くなります。またLustreはオープンソースであるため、障害が発生した場合は解析および原因特定を自分で行わなければなりません。さらに、ファイルシステム上には重要なファイルや機密情報などが含まれますから、バックアップやセキュリティについても検討したうえで運用する必要があります。
FSx For Lustreは、上述したような煩雑な作業をすべてAWSが管理します。マネジメントコンソールからはAmazon CloudWatchを用いて利用状況を監視できたり、ストレージ容量の増加やバックアップの作成を少ないステップで行えます。

(2) Amazon S3と連携できる
S3バケットに格納されたデータをLustreファイルシステムへインポートできます。また、Lustreファイルシステム上のデータをS3バケットへエクスポートすることもできます。
FSx For LustreとS3を連携することで、アクティブにデータを扱う際はFSx For Lustreファイルシステム上に保存し、そうでない場合はS3へ保存してファイルシステムの容量を軽減するなど、ストレージを階層的に利用できます。ストレージの利用量あたりの金額はS3の方が安価なため、階層型ストレージを実現することによりコストを抑えた運用ができます。

(3) POSIXに準拠したファイルシステムである
FSx For LustreはPOSIX（Linuxを含めたUNIX系OSにおけるプログラミングに関する標準規格）に準拠しているため、Linuxの既存のファイルシステムと同様に利用できます。また、既存のアプリケーションをFSx For Lustreで動作させるために特別な対応をする必要もありません。
文系出身が基本情報技術者試験に合格する

前提としてCBT形式の午後受験について書きます。

備忘録のためのメモとして残します。
記事は個人的な感想です。


読者の中には、
１，①基本情報だけでいいと思われる方や、
２，②その次の応用情報資格や高度資格を狙いたいと思われるかたがいるかもしれません。

①基本情報だけでいい場合、
後半のプログラミングと疑似言語が出来ればかなり楽です。
難しかった午後の前半を頑張ります。
SCは必須なので確実にやります。
DBは覚えるところも少なく類似問題が多いので確実にやります。
あとは経営戦略系などの文章問題は本番解けそうだったら解きます。
NWは広範囲なため省くこと多いです。
システム開発も省くこと多いです。
SWやHWは興味があったら是非やりましょう。頻出テーマがいずれもあるのでいい得点源になります。

②応用情報以降もとりたい場合、
scに力をがっつりそそぎます。頻出する用語を誰かに説明できるまでいけばいい感じです。
頻出テーマを1問解いて、それをきちんとものにしたあとには、年度が異なる同じようなテーマの問題を解いていき、芋づる式に学習すると効率がいいです。
午後試験は読解力が大事なので、読解力に自信がない場合は、早い段階から対策をしてといいと思います。

以上になります。
dockerコンテナで引数としてホスト上のファイルを指定する



# はじめに

こんにちは、icemint0828です。  
今回はdockerコンテナで引数としてホスト上のファイルを指定する方法を紹介します。  
　※自作パッケージをdockerイメージとして公開する際にハマりました。

## 動作環境
dockerが動作する環境

## やりたいこと
ホスト上では以下のように実行していたコマンドをdockerコンテナにシングルバイナリとして持たせて実行したい時があります。
```shell
$ imgedit reverse srcImage.png
```

dockerコンテナ上で以下のように実行したいです。
```dockerfile:Dockerfile
# scratchはシングルバイナリを扱うためのベースイメージです。
FROM scratch
ADD imgedit /usr/bin/imgedit
ENTRYPOINT ["imgedit"]
```

```shell
$ docker run ghcr.io/icemint0828/imgedit:latest reverse srcImage.png
```

このコマンドを実行するとdockerコンテナ上には`srcImage.png`のファイルが存在しないため、実行エラーとなっていまします。
共有ボリュームを使用し、docker内でのワーキングディレクトリを変更する事で、ホスト上のファイルやディレクトリを扱う事が出来ます。

```dockerfile:Dockerfile
# scratchはシングルバイナリを扱うためのベースイメージです。
FROM scratch
ADD imgedit /usr/bin/imgedit
WORKDIR /mnt
ENTRYPOINT ["imgedit"]
```

```shell
$ docker run --rm -v $(pwd):/mnt ghcr.io/icemint0828/imgedit:latest reverse srcImage.png
```

カレントディレクトリをdockerコンテナ内の`/mnt`として共有ボリュームに指定する事で、ホスト上のファイルを引数として渡す事が出来ました。  
また、このコマンドでは実行時に画像ファイルの出力も行っており、ホスト上のカレントディレクトリに対してファイル出力もされました。

## (参考)動作確認用パッケージ
* icemint0828/imgedit
goで作成した画像変換用のパッケージです。

https://github.com/icemint0828/imgedit

# おわりに
簡単な内容とはなりますが、dockerコンテナで引数としてホスト上のファイルを指定する方法させて頂きました。
最後まで読んで頂き、ありがとうございました。
Salesforceフローを作成しよう～リードから取引開始で作成された商談のみチェックする～

Salesforceのフロー機能を使用し
「リードから取引開始で作成された商談のみチェックする」フローを作成しました

※前提条件
商談にカスタム項目（チェックボックス）「LeadCheck__c」作成


全体
![全体フロー.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/531631/8d5f9837-f2cc-ba7d-4a66-96eb2a1b51d3.png)


レコードトリガー　開始
IsConverted　がTrueである

![開始条件１.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/531631/77af6c25-5645-a2af-0a30-918f766bafd3.png)


レコードを更新
![更新.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/531631/b65fa71b-2c1a-6cc8-00f0-918095657ab9.png)

商談IDをリードの「取引開始済みの商談ID」と一致させ、項目更新をする
AWS StorageGatewayの用語要点まとめ（自分用メモ

AWS Storage Gateway
オンプレミスからAWSのストレージサービスへのアクセスを高速かつセキュアに行うことができるサービス。堅牢性・耐久性に優れたS3をファイル共有ストレージとして利用したり、災害対策を目的としたバックアップやアーカイブを行ったり、あまりアクセスされないデータを自社サーバーからAWSへ移動させるなど、様々なケースで利用することができる。
頻繁に利用するデータは高速なストレージに保存し、反対に利用頻度の低いデータを安価・低速なストレージに配置することをストレージの階層化という。利用頻度に応じて性能の異なるストレージを使い分けることで、コストとパフォーマンスを両立させることができる。

Storage GatewayそのものはS3やEBSなどのようなストレージではない。Gateway（規格の異なるネットワーク間を中継して接続する機器）の名が示す通り、オンプレミスとAWSのストレージサービスとを橋渡しする役目を持つサービス。ユーザーはStorage Gatewayを利用することによって、Amazon S3やGlacierなどのストレージサービスをデータの保存先として選択することができます。

●ボリュームゲートウェイ
S3をiSCSI接続のブロックストレージボリュームとして提供。iSCSI（Internet Small Computer System Interface）とはコンピュータのストレージを接続するSCSIプロトコルをTCP/IPで実現したもののことで、サーバーはiSCSIで接続されたストレージ（Storage Gatewayの場合はS3）をローカルディスクとして使用。

・キャッシュ型（キャッシュボリューム）
キャッシュストレージをオンプレミス（ローカル）に設置することで、高速アクセスが可能な堅牢性の高いストレージを利用することができます。オンプレミスのキャッシュストレージには頻繁にアクセスするデータのみを保持し、アクセス頻度の低いデータはS3へ保存することで、階層化されたストレージを実現。
キャッシュとして使用するストレージの容量を最小限に抑えることができますが、データがキャッシュ上に存在しない場合はS3へアクセスしに行くため、遅延が許容できないシステムには適していません。

・保管型（ストアドボリューム）
オンプレミスのボリュームストレージに全てのデータを保持。キャッシュ型とは異なり、全てのデータに対して高速アクセスが可能。
ボリュームストレージ上のデータは任意のタイミングでS3にスナップショットとして保存されますので、災害対策や定期的なバックアップとして利用。

●テープゲートウェイ
物理テープストレージの代替として利用できるサービス。VTL（Virtual Tape Library：仮想テープライブラリ）に対応したソフトウェアを介して、S3やGlacierにバックアップデータを保存することができます。
テープ（テープストレージ）とは磁気テープを用いたストレージです。HDDやSSDのようなディスクストレージとは異なり、大容量で安価、かつ長期的なデータ保存に向いているため、アーカイブやバックアップ用途として利用される。
テープゲートウェイを利用することにより、オンプレミスで新規に物理テープを用意したりテープの切り替えを行うなど、テープの操作や管理をする必要がなくなります。また、アーカイブ先としてGlacierとも連携しているため、よりコストを削減できます。
VirtualboxにUbuntu22.04をインストールしようとすると画面が見切れる問題の簡単な解決策

VirtualboxにUbuntu22.04をインストールしようとすると画面が見切れて困る。

## 結論

1. Try Ubuntu を選択する。
2. Ubuntuが起動したら、インストールがウィンドウをキャンセル。
3. Ubuntu の Setting を開き Display から画面のサイズを変更する。

## おまけ

画面サイズの比率によってうまくいかない場合があるが、いろいろなサイズを選んでみるとどこかでうまくいく。

インストールをダイアログを進んでいくと、もう一回画面のサイズが元に戻る場合があるが、その場合も焦らずSettingからもう一回画面サイズを変更。

いろいろ方法があると思うが、これが簡単。

この記事は以上です。
Ubuntu 22.04 LTS でIPを固定

# Ubuntu 22.04 LTS でIPを固定する方法

VMware上の Ubuntu 22.04 LTS をいじって遊んでいたら、
ある日突然VSCodeからsshできなくなった。
原因を探してみたら、どうやら再起動によってIPアドレスが変わっていた模様。
IPを固定するための方法を調べたのでメモ。

`netplan`を使って設定する。

## IPアドレス変更設定

`/etc/netplan`配下に`99_config.yaml`を作成してネットワークインターフェース情報を設定する。

`00-installer-config.yaml`を参考に設定する。

```yaml:00-installser-config.yaml
# This is the network config written by 'subiquity'
network:
  ethernets:
    ens33:
      dhcp4: true
  version: 2
```

ens33のDHCPを無効化して、IPアドレスを指定してあげればよい。

```yaml:99_config.yaml
network:
  version: 2
  renderer: networkd
  ethernets:
    ens33:
      dhcp4: false
      dhcp6: false
      addresses: [192.168.136.132/24]
      nameservers:
        addresses: [192.168.136.2]
```

今回は192.168.136.132とした。

## 適用

設定ファイルを作成したら、

```
# netplan apply
```

コマンドで適用させる。

## 確認

```
# ip ad show | grep ens33
2: ens33: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc fq_codel state UP group default qlen 1000
    inet 192.168.136.132/24 brd 192.168.136.255 scope global ens33
```

IPが指定したものに変更されている！

以上。

- 【参考】: [Ubuntu 20.04 LTSで固定IPアドレスの設定](https://qiita.com/zen3/items/757f96cbe522a9ad397d)
【Rails】gemアップデート時の依存関係の調べ方(Bundler attempted to update GEMNAME but its version stayed the same)

## はじめに
未経験からエンジニアに転職して、3ヶ月ほど経つエンジニアです。

今回は業務でgemをアップデートするときに詰まった
**gemアップデート時の依存関係の調べ**をテーマに書きます。
↓の警告がでて、gemをアップデートできない場合のアプローチについてです。
~~~
Bundler attempted to update GEMNAME but its version stayed the same
~~~

## 結論
https://rubygems.org/

- ↑で該当のgemを探す
- 依存関係を調べる

## 依存関係の例

例として、faradayというgemの依存関係を見ていきます。

https://github.com/lostisland/faraday


~~~Gemfile.lock
faraday (1.10.0) # 最新の2.3.0にしたい
~~~

~~~
$ bundle update faraday 
~~~

上記コマンドでgemをアップデートしようとするも、警告が出てアップデートできません。
~~~
Bundler attempted to update faraday but its version stayed the same
~~~

::: note warn
bundle update --conservative faraday
とすると他のgemのアップデートを抑制することができます。
慎重にアップデートしたい場合は付けるようです。
:::

警告が出たので、faradayの依存関係を見にいきます。

https://rubygems.org/gems/faraday/versions/2.3.0

![スクリーンショット 2022-07-02 10.02.55.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/916052/791913ae-0182-29f0-f04a-53402fb86a34.png)

アップデート前のバージョンを探します。

![スクリーンショット 2022-07-02 10.03.38.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/916052/938304c9-f5cf-9fb9-c055-2ff8bebb5caf.png)

依存関係をみます。

![スクリーンショット 2022-07-02 10.04.49.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/916052/ac1f757c-b73e-d1e0-e600-2ad81783600d.png)

見た感じ（自分の環境では）問題ありませんでした。
ここで問題となっている依存関係を発見できる場合もあると思います！

仕方がないので、Gemfile.lockを再度調べます。

faradayに関係するgemを見ていきます。
上記の画像で示した方法で依存関係を調べていきます。


自分の環境の場合は
~~~
faraday_middleware (1.2.0)
~~~
このgemの依存関係が原因でした。
![スクリーンショット 2022-07-02 10.10.52.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/916052/b0ca3c37-81ed-1beb-bd90-10cb0cbd40ab.png)

↑の画像の通り、
faraday1.10.0 から 1.0　に依存しています。
だから↓のコマンドでアップデートできなかった、ということです。
~~~
$ bundle update faraday 
~~~

## じゃあどうやってアップデートするの？
~~~
$ bundle update faraday --minor # マイナーバージョンのアップデート
$ bundle update faraday --patch # パッチバージョンのアップデート
~~~
これらのオプションを使用すればアップデートできる場合があります。
（パッチバージョンのアップデートでも依存関係の問題でアップデートできないこともあります）

::: note warn
他にもアップデートする方法はありますが、本稿の範疇を超えるので割愛させていただきます。
:::

## まとめ
gemのアップデートは深刻なバグを起こす恐れもあるため慎重に行う必要があります。
依存関係を一個ずつ見ていくのは面倒ですが、出戻りを防ぐ意味でも丁寧に確実にやっていくことが大事です。

間違っている点がありましたらご指摘をお願いいたします。
Unityの教科書（投稿予定indexで中身はこれから随時）

Unityに関わることをいくつか書いてきましたが、技術的な背景が判らないと表層だけで終わり、結局、使いこなせるまでいかないという場面を、自戒を含めて目にしてきました。それらを改善するため、抜本的に学習できるものを用意しようと思います。全てを解説するのは莫大な量になるので、とりあえず項目だけ作りつつ、項目ごとの中身を作っていきます。場合によってはYotubeや他の方でやることにするかも知れません。

# 基礎リテラシー
## 基礎的なコンピュータの仕組み
### メモリ、CPU、GPUの基礎
### CPUパイプラインの基本（ノイマン型の基礎、キャッシュ）
### GPUパイプラインの基本(レンダーターゲット、コマンドの基本）
### データ表現
#### ビット数と整数
#### IEE754
## CGのデータ表現
### 座標データの表現
### 色の表現
### 座標変換とレンダリング（簡単な数学、パイプラインの話に繋がる）
## ハードウエア毎の仕組み（キューブを出して回転するコードをネイティブで示す）
### DirectX
### Vulcan
### Metal
# Unityの骨格
## ネイティブとの関連（ゲームエンジンの基礎、どの部分が何に置き換わるか）
### MonoBehaviourの仕組み
### Componentシステム
## 実装方法
### レンダリングパイプライン（MeshRenderer、Materialの関係とShader基礎）
### 物理システム
### ゲーム開発向けの仕様(staticのGameObjectの扱い、タグ、レイヤなど)
### ターゲット切り替えの仕組み
## 実装の詳細
### メモリ管理システム
### URP
### Unsafeで出来ること

何かこういうのが欲しいとかあったらまた追加するかも知れませんしいつ完成するかは判りませんw
初めてのRailsチュートリアルに挑戦！第1章

# 学習内容
## 1.環境構築
1. AWS Cloud9でユーザ登録、クラウドIDE作成
1. Railsをインストール
　*バージョン6.0.4を利用。Rails6(第6版）の電子書籍に合わせた。

## 2.最初のアプリケーション
1. Railsのアプリケーション作成
1. hello_appの作成
　*第1章で使うアプリ。第2章以降は別のアプリを使う
1. Bundlerインストール
1. webpackerインストール
1. rails server起動
　*開発マシンでのみブラウズできるローカルWebサーバー
1. MVCの理解
1. 「hello, world!」の表示

## 3.Gitによるバージョン管理
1. Gitインストールとセットアップ
1. Git初期化
1. Git追加とコミット
1. Gitブランチ作成、編集、マージ
1. Gitプッシュ

## 4.Herokuのセットアップとデプロイ
1. 本番環境用以外のgemをインストール
1. Herokuインストール

# 学習時のエラー対応
## 1.Bundlerインストール時のエラー
`bundle _2.2.17_ install`を実行した際、Gemfileで定義したバージョンより、最新のバージョンが存在するため、アップデートを促される。
```
 $ bundle _2.2.17_ install
Fetching gem metadata from https://rubygems.org/...........
You have requested:
  listen = 3.1.5

The bundle currently has listen locked at 3.7.1.
Try running `bundle update listen`

If you are updating multiple gems in your Gemfile at once,
try passing them all to `bundle update`
```
そのため、`bundle update listen`を実行すると、
```
 $ bundle update listen
Fetching gem metadata from https://rubygems.org/...........
You have requested:
  spring = 2.1.0

The bundle currently has spring locked at 2.1.1.
Try running `bundle update spring`

If you are updating multiple gems in your Gemfile at once,
try passing them all to `bundle update`
```
すると今度は、springもアップデートを促されるので、 `bundle update`で全てのgemを一気にアップデートして解決。

## 2.webpackerインストール時のエラー
`rails webpacker:install`を実行した際に、conflict(競合）が発生。
```
$ rails webpacker:install
warning ../../package.json: No license field                             
    conflict  config/webpacker.yml
Overwrite /home/ubuntu/environment/hello_app/config/webpacker.yml? (enter "h" for help) [Ynaqdhm] 
```
ただ、既にあるwebpackerをOverwrite(上書き）するか、聞かれているだけなので、Enter。
他にも「webpacker.yml」、「bin/webpack」、「bin/webpack-dev-server」をOverwriteして解決。

## 3.GitHubにプッシュする際の認証
初めて`git push -u origin master`を実行すると、以下の認証が必要となる。
```
$ git push -u origin master
Username for 'https://github.com/'ユーザネーム'/hello_app.git': 'ユーザネーム'
Password for 'https://'ユーザネーム'@github.com/'ユーザネーム'/hello_app.git': 
```
パスワードはログイン時のものではなく、個人トークンでログインして解決。

## 4.Herokuにプッシュする際のエラー
`git push heroku master`を実行した際に、エラー発生。
```
$ git push heroku master

fatal: 'heroku' does not appear to be a git repository
fatal: Could not read from remote repository.

Please make sure you have the correct access rights
and the repository exists.
```
調べてみると、gitがリモートのリポジトリを参照出来ていなかったため、以下のように追加。
```
$ git remote add heroku https://git.heroku.com/アプリケーション名.git
```
その後、`git push heroku master`でpushができたので、解決。

# 学習を終えて
エラーが発生した際は、落ち着いてエラー内容を確認して対処することの大切さを学んだ。
また、バージョンのわずかな違いによってもエラー発生するので、テキストと全く同じバージョンになるように心がけた。
そして、コマンドを入力するだけでは、ただの写経なので意味をしっかり理解しながら進めることに意義があると実感した。
cryptoがimportできなかったのでmd5ライブラリを使用した話【react】

### about me
はむさんのオンラインスクールを見ながら勉強している31歳です。本職はプログラマーとは関係ない営業なので、プロからしたら「何言ってんだ？」かもしれませんが、温かい目で見ていただければと思います。

## 主題
今回はgravatarというサービスをreactから使用する為にcryptoをインポートしたかったが、下記の事象（エラー）が発生したため、代替手段としてmd5を使用した話です。

### 事象
実行したいけどcryptoが見つからないために動かないコード

```jsx
const crypto = require('crypto');

export const gravatarPath = (string) => {
    const lowerCaseString = string.trim().toLowerCase();
    const md5 = crypto.createHash('md5');
    const digest = md5.update(lowerCaseString,'binary').digest('hex');

    return `https://www.gravatar.com/avatar/${digest}/?d=robohash`;
};
```

cryptoで実行しているのはhex(16進数)でbainaryデータを返している様子。

エラーメッセージ

```jsx
Compiled with problems:X

ERROR in ./src/gravatar.js 3:15-32

Module not found: Error: Can't resolve 'crypto' in 'C:\Users\user\Desktop\dev\src'

BREAKING CHANGE: webpack < 5 used to include polyfills for node.js core modules by default.
This is no longer the case. Verify if you need this module and configure a polyfill for it.

If you want to include a polyfill, you need to:
	- add a fallback 'resolve.fallback: { "crypto": require.resolve("crypto-browserify") }'
	- install 'crypto-browserify'
If you don't want to include a polyfill, you can use an empty module like this:
	resolve.fallback: { "crypto": false }
```
調べて色々試みたが、cryptoのimportエラーを解決するための分かりやすい記事がなかったので、別の方法を模索しました。
### 解釈（考えたこと）
cryptoを使わなくても文字列をmd5の16進数にさえできればいいと考えて、google検索した結果、md5という標準ライブラリがあることを知りました。

教えてくれたqiita記事↓
[https://qiita.com/ffggss/items/2d48b0de5f95cd10ab66](https://qiita.com/ffggss/items/2d48b0de5f95cd10ab66)

npmのmd5ライブラリ↓
[https://www.npmjs.com/package/md5](https://www.npmjs.com/package/md5)

使い方が分かりやすく書いてあるgithub↓
[https://github.com/DefinitelyTyped/DefinitelyTyped/blob/master/types/md5/md5-tests.ts](https://github.com/DefinitelyTyped/DefinitelyTyped/blob/master/types/md5/md5-tests.ts)

### 解決
これをmd5を使用して実装すると(yarn add md5をしてから)
```jsx
const md5 = require('md5');

export const gravatarPath = (string) => {
    const lowerCaseString = string.trim().toLowerCase();
    const digest = md5(lowerCaseString, { encoding: 'binary' });

    return `https://www.gravatar.com/avatar/${digest}/?d=robohash`;
};
```

無事にgravatrを読み込んでエラーなく起動することができました。

本来はちゃんとエラーメッセージを読んで解決すべきだと思うのですが、一応こういう手段もありました、ってことで今回記事に書かせていただきました。
React(TypeScript)の構成でアプリを作成をしました【課題その②】【trend movie app】

## 学習したスキル

- TypeScript+ReactでWebアプリケーションを開発するスキル
- 基本的なhookの利用方法
- APIを通してバックエンドと連携するスキル
- ドキュメントを読むスキル
- ドキュメントを書くスキル

## 具体的な手順

1.参考サイトの熟読
2.Githubレポジトリの作成
3.必要な機能の明文化
4.タスクの優先順位付け
5.デモアプリを覗いてデザインの確認
6.自身が作成したスケージュールに沿ってアプリケーションを実装


## 作成したアプリについて

#### 作成したアプリ

[React（Tailwindcss + TypeScript）の構成でアプリを作成しました【Movie App】](https://qiita.com/kanfutrooper/items/da1e890f9a104fc4a527)

#### 完成品


![スクリーンショット 2022-07-10 13.35.02.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/939638/8ad9cefa-9993-9eb6-f015-35ee4d2aed6c.png)

## 基本的なhookについて

[Reactを基本からまとめてみた【7】【ReactHooks】](https://qiita.com/kanfutrooper/items/c79440a20df77f4ea67b)

## HTTP通信とは

http通信とは、URLを指定してインターネット上のwebサーバへアクセスし、データのやりとりをする通信のこと。
一般的にはブラウザからURLを指定して、webページを表示する際に使用される。


## RESTAPIとは

REST API (RESTful API とも言う) は、REST アーキテクチャスタイルの制約に従い、RESTful Web サービスとの対話を可能にするアプリケーション・プログラミング・インタフェース (API または Web API) 。

## 自身が今回の課題をこなす上で苦労した点

tailwindcssを使用してアプリを作成した点。

## 苦労した点をどのように克服したか

サンプルアプリを何個か作成して、仕組みを理解した。

## 参考サイト
[【初心者向け】httpリクエスト・レスポンスについて分かりやすく解説](https://kiyoakiweb.com/http-communication/#:~:text=http%E9%80%9A%E4%BF%A1%E3%81%A8%E3%81%AF%E3%80%81URL,%E9%9A%9B%E3%81%AB%E4%BD%BF%E7%94%A8%E3%81%95%E3%82%8C%E3%81%BE%E3%81%99%E3%80%82)
[REST API とは](https://www.redhat.com/ja/topics/api/what-is-a-rest-api)
Python requests問題とURLの補強

## 行っていたこと

1. pythonのrequestsを使って複数のURLをチェック(URLが死んでいないか)
1. URLの補強

## 問題

#### 問題1 ： 脆弱性に該当するSSL通信
エラー内容
`<urlopen error [SSL: DH_KEY_TOO_SMALL] dh key too small (_ssl.c:1091)>`

    requests.get(url, verify = False)

`verify = False`をつけるとセキュリティのレベルを下げてくれるらしい
しかし、エラーとしてではないけど、Warningがめちゃ出る

    import urllib3
    from urllib3.exceptions import InsecureRequestWarning
    urllib3.disable_warnings(InsecureRequestWarning)

#### 問題2 ： URLは開けるはずなのに、403で返ってくる

requestsでgetすると403で返ってきてしまう
・・・URLを踏むとUser Agentに応じてステータスコードが異なるように設定されている

    USER_AGENT = {"User-Agent": "Mozilla/5.0 (iPhone; CPU iPhone OS 10_3_3 like Mac OS X) AppleWebKit/603.3.8 (KHTML, like Gecko) Version/10.0 Mobile/14G60 Safari/602.1"}

    response = requests.get(url, headers=USER_AGENT, verify = False)
    print(response.status_code)

`headers=USER_AGENT`iPhoneで入っていると認識させる必要がある
(pythonのrequestsのデフォルトが`python-requests`)

## URLの補強
aタグのhrefに`/company`などが検出され、踏んでもページが発見できない

    from urllib.parse import urlparse

    parsed_url = urlparse(url)
    print(parsed_url.scheme) # http　or https
    print(parsed_url.netloc) # ドメイン

`/company`と同一ドメインの時に上記のコードを使うことで、URLを補強して作ることができる！

## 最後に
大量のURLを叩くほど、見たことないURLエラーが出たので備忘録としても記載しました。
URLのエラ−って沢山あるんだなぁと知りました。
また、新しいエラーがあったら追記します。

## 参考文献

https://www.python.ambitious-engineer.com/archives/35

urllibでも同じようなことができるので、使ってみました

https://docs.python.org/ja/3/howto/urllib2.html#info-and-geturl
Figmaの使い方

この記事ではFigmaの使い方を簡単に紹介いたします。
もちろん、随時更新予定です。

### まず、Figma とは？
ブラウザ上で<b>簡単</b>にデザインできるツール。
（公式ページ）
https://www.figma.com

#### Figmaでできること
・操作する場所を選ばない
・共同編集ができる
・操作がシンプルで動作が軽い
・データの共有が簡単

#### 料金は？

▼公式サイトからのキャプチャ▼


![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1314502/42aef795-7ad5-8bc9-0192-ce3218c7ce14.png)
もちろん無料枠もございます。

#### ログイン

emailアドレスがございましたら、登録できる！
Googleのアカウントが有れば、それでも登録できるよ！

### デザイン開始
#### 画面構成

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1314502/1d8ac772-2e80-d103-b515-3fe4c7782bb2.png)

あとは、自由に作成していきましょう！


以下の記事も一緒に読むといいかもです！
https://nocodedb.world/archives/5580


ご愛読ありがとうございました。
何か気づきや質問があれば、コメントお願いします。
新しい情報を取得するたび、更新していきます。

良ければ、LGTM、ストックよろしくお願いいたします！
SASSを理解しよう！

SASSとは？から始めます！
#### SASSとは

・CSSを拡張したもので、デザイナーやプログラマーがCSSに対していだいていた不満などが解消されるよう作られたスタイルシート
・CSSのメタ言語（メタ言語とはある言語に別のルールを定義するために使われる言語。）

#### SASSの特徴
入れ子の使用が可能
変数を利用できる
四則演算が可能
関数を使用できる
ミックスイン・継承による効率化

多分、何言ってるかわからないと思うので実践的に後で、説明致します。

#### SASSのインストール


####  先ほどの特徴を説明

##### 入れ子構造ができる。ネストとは？

親要素の中に子要素を入れることができるため、
直感的にHTML的な書き方をすることができる。
```
div{
	height: auto;
	h2{
	}
	h3{
	}
}
```
div h2{}というな書き方をしなくてよい。

#### &を使用して親要素を取得

&で親要素を取得できる。
状態変数を取得できる。
'''
div{
   &_btn{
     &:hover{
　　}
}
'''

#### 四則演算
グローバル変数とローカル変数を使用することができる。

（例）
$width はローカル変数
$a はグローバル変数

```
$a = 30 
div {
 $width: 200px;
 width: $width ? 2+ 5 * $a  
}
```

#### ミックスイン

ミックスインは@mixin, と@includeの2つで構成されています。
@mixin で定義して、@include で呼び出すが基本です

```
@mixin box001 {
    padding: 20px;
    margin-top: 30px;
    background-color: #ededed;
}
 
/*定義したミックスインを呼び出し*/
.sample-box {
    @include box001;
}
```
##### 引数を使うこともできる。

引数を@mixin の（）内に入れて、呼び出すときに（）内に引数を入れる
```
/*引数を使ったミックスインの定義*/
@mixin box002($value) {
    border: solid 2px #666;
    border-radius: $value;
}

@includで呼び出す

.sample-box {
    @include box002(10px);
}
.test-box {
    @include box002(7px 5px);
}

```

##### 引数の初期値も設定できる。

```
/*引数に初期値を設定*/
@mixin box002($value: 10px) {
    border: solid 2px #666;
    border-radius: $value;
}
```

##### 複数の引数を指定する
カンマでくぎることができる


```
/*引数を複数設定*/
@mixin box003($padding: 10px, $margin: 30px) {
    padding: $padding;
    margin: $margin;
}
```

基礎はここまでです。
特にSassは奥が深いので、これからも更新しています。

ご愛読ありがとうございました。
何か気づきや質問があれば、コメントお願いします。
新しい情報を取得するたび、更新していきます。

良ければ、LGTM、ストックよろしくお願いいたします！
Mr.Nam 先生の講義要約 Chapter 3, 1-8

1강 Spring DI 흉내내기 (1)
1)변경에 유리한 코드(1) - 다형성, factory method
//변경 포인트 2개
SportsCar car = new SportsCar();
--> Truck car = new Truck();

==>

//다형성 --> 변경에 유리
//변경 포인트 1개
Car car = new SportsCar();
--> Car car = new Truck();

==>

Car car = getCar(); // getCar()메서드 하나만 고치면 됨
static Car getCar() {
	return new SportsCar();
}
2)변경에 유리한 코드(2) - Map과 외부 파일

2강 Spring DI 흉내내기 (2)
객체 컨테이너(ApplicationContext) 만들기
Map map 객체 저장소
Properties에 저장된 내용을 Map에 저장
반복문으로 클래스 이름을 얻어서 객체를 생성해서 다시 map에 저장
자동 객체 등록하기 - Component Scanning
@Component
1) 패키지 내의 모든 클래스를 읽어서 Set에 저장
2) 반복문으로 클래스를 하나씩 읽어와서 @Component이 붙어 있는지 확인
3) @Component가 붙어있으면 객체를 생성해서 map에 저장

3강 Spring DI 흉내내기 (3)
객체 찾기 - by Name, by Type
AppContext ac = new AppContext();
Car car = (Car)ac.getBean("car"); //이름(id)으로 찾기
Car ca2 = (Car)ac.getBean("Car.class"); //타입을 찾기

객체를 자동 연결 하기(1) - @Autowired
1) 수동 연결
2. 자동 연결
@Autowired
맵을 뒤져서 각 타입에 맞는 객체주소를 찾아서 참조변수에 대입.
by Type, Key값을 찾음
@Resource
by Name, instanceof로 Value값을 찾음.
타입의 첫글자를 소문자로 바꿔서 찾음.
@Resource(name="engine2")을 써서 찾을 수도 있음.

4강 Spring DI 활용하기 - 실습
1)config1.xml
scope="prototype"은 매번 새로운 객체를 만듦 
Constructor-arg태그는  setter를 사용
String, 기본형일 때 value 사용
참조형은 ref 사용

2)SpringDiTest.java
Qualifier("superEngine") //타입으로 먼저 검색 후 n개면 이름으로 검색
@Resource(name="superEngine") //byName
Engine engine; //byType - 타입으로 먼저 검색, 여러개면 이름으로 검색. - engine, superEngine, turboEngine

5강 Spring DI 활용하기 - 이론(1)
1)빈(bean)이란?
JavaBeans
재사용 가능한 컴포넌트, 상태(iv), getter&setter, no-args constructor

Servlet & JSP bean
MVC의 Model, EL, scope, JSP container가 관리

EJB(Enterprise Java Beans)
복잡한 규칙, EJB container가 관리

Spring Bean
POJO(Plain Old Java Object). 단순, 독립적, Spring container가 관리

2)BeanFactory와 ApplicationContext
Bean
Spring Container가 관리하는 객체
xml에 빈을 정의 -> Spring Container

Spring Container
Bean 저장소, Bean을 저장, 관리(생성, 소멸, 연결)@Autowired

BeanFactory : Bean을 생성, 연결 등의 기본 기능을 정의한 인터페이스
ApplicationContext : BeanFactory를 확장해서 여러 기능을 추가 정의
(Spring Container와 ApplicationContext는 비슷하다 보면 됨)

6강 Spring DI 활용하기 - 이론(2)
1) ApplicationContext의 주요 메서드
getBean() //빈 얻기
isTypeMatch() //타입 확인
containsBean() //빈이 있는지 확인

7강 Spring DI 활용하기 - 이론(3)
1)loC와 DI
제어의 역전 IoC(Inversion of Control)
제어의 흐름을 전통적인 방식과 다르게 뒤바꾸는 것.
[전통적인 방식] 사용자 코드가 Framework 코드를 호출
[loc] Framework 코드가 사용자 코드를 호출

2)의존성 주입 DI(Dependency Injection)
사용할 객체를 외부에서 주입받는 것.
(IoC, DI는 디자인패턴의 전략패턴)
수동 주입, 자동 주입이 있음!

8강 Spring DI 활용하기 - 이론(4)
1)스프링 애너테이션 - @Resource
Spring container에서 "이름(by Name)"으로 빈을 검색해서 참조변수에 자동 주입(DI).
일치하는 이름의 빈이 없으면, 예외 발생.

2)스프링 애너테이션 - @Component
<component-scan>로 @Component가 클래스를 자동 검색해서 빈으로 등록

3)@Controller, @Service, @Repository, @ControllerAdvice의 메타 애너테이션
<component-scan>을 하면 @Controller, @Service, @Repository, @ControllerAdvice가 붙으면 자동 등록됨.
cscの作法 その224

# 概要
cscの作法、調べてみた。
SHA256CryptoServiceProvider使ってみた。

# サンプルコード

```
using System;
using System.IO;
using System.Security.Cryptography;
using System.Collections.Generic;
using System.Text;

	class test0 {
		static void Main() {
			var result = "";
			var hello = "password";
			Console.WriteLine(hello);
			var encoder = new UTF8Encoding();
			var buffer = encoder.GetBytes(hello);
			using (var csp = new SHA256CryptoServiceProvider())
			{
				var hash = csp.ComputeHash(buffer);
				result = Convert.ToBase64String(hash);
			}
			Console.WriteLine(result);
		}
	}
```

# 実行結果

```
>sha0
password
XohImNooBHFR0OVvjcYpJ3NgPQ1qq73WKhHvch0VQtg=

```



以上。
駆け出しエンジニアのJava Silver　受験記

<br>少し前に受けたJava Silver受験記。
参考になるかはわからないけど、いち駆け出しエンジニアの受験記録です。

# 受験時の状況

まず受験当時の状況はこちら
→Javaを勉強し始めてから2カ月弱
→勉強期間：3週間


# 勉強内容

### 試験3週間前～1週間前
受験を決意し、テキストを買い、申し込みをしたのが試験3週間前。<br>
資格試験の勉強はなるべく短期間で効率的にやりたいという気持ちから先に試験日を決め申し込むスタイル。
<br><br>
ただ思ったよりエンジンがかからなくて、テキスト購入から約2週間でやっと1周終了。
というか第1・2章を解いたときに、当時の自分は、
「こんなことまで問われるのか、細かい・・・」思ってしまい、あまり勉強が進まなかった。<br>
1周目は正解を求めず、「へえ、こんなことが聞かれるのねー－」くらいの軽い気持ちでいたほうがサクサク進めそう。
問題解いても全然当たらないから、楽観的に考えないと心折れそうだった。<br>
ちなみに第11章までを1周した後、第12章の総合問題を解きましたが、
結果は、_28/80（35％）_
合格は63％？だっけ？
この時点で試験1週間前。当時の私の心境↓
_「え、やば。3万・・・。。泣きそう、どうしよ。」_
ということで、ここでスイッチがはいりました。

# 試験1週間前の勉強
試験は土曜日。
35％を叩き出したのが、ちょうど１週間前の土曜日。
35％を叩き出した次の日の日曜日は忙しく、勉強時間は1～2時間。
それゆえ3万円は平日の私に託された。この月曜～金曜は非常にがんばった。<br>
試験直前の1週間の過ごし方はこんな感じ。<br>

* 6：00　起床
* 6：50～7：30　通勤電車で勉強
* 7：30～8：30　会社付近のカフェで勉強
* 仕事→定時退社
* 18：20～19：00　通勤電車で勉強
* 19：00～20：00　ごはん＆家事など
* 20：00～23：00　勉強
* 23：00～24：00　お風呂等→就寝

ということで、通勤時間も含めると1日5時間以上の勉強時間を確保できた。
（普段いかに時間を浪費しているかを痛感。）
定時で帰れる環境と、予定を入れなかった過去の自分に感謝。
月～金の5日間　×　5時間で25時間を使ってやったことは以下の通り。

* 月～水くらいで　黒本2周目。
* 木　苦手分野　3周目　気になる問題を確認。
* 金　一気に黒本3周目（第1章～第12章まで）。

受験した方の記事を参考に、黒本をひたすら周回した。<br>3周目にもなってくると答えを覚えて「あ～はいはい、これはこれね」と思ってしまうが、そのときも必ず理屈を説明できるかということを確認し、できないことに関しては、かならずテキストを読み直した。<br>
それでも腑に落ち切らないところは、ネットで検索して、理解を深めたり、Java Silverに関してまとめてくれている方のQiitaを読んだりして、なんとなく理解できるところまでがんばった。

3周目のころ（といっても試験前日だけど）には、総合問題の正答率も80％を超え、やっと、いけるかも！という気がしてきた。

# 試験当日

試験は11：00開始。
7：30～9：00　家で最後の演習。（第13章の3周目）
カフェに移動し、気になる問題を確認。
10：40　会場に到着。
本人確認・写真撮影を終え、荷物を預け、いざ会場へ。
11：00　
最初の20問くらいは手ごたえとしては半々くらい。
思ったより、問題集通りじゃないじゃん・・・と焦る。

解き進めると「あ～はいはい、これね」「これほぼ黒本のままじゃん」「得意なやつだ、ラッキー」とだんだん手ごたえを感じ始める。
不安　or あとで考えたい問題はチェックをつける。
心配性のわたし。めちゃめちゃ慎重に解いて、1時間40分ほどで一旦解き終わりました。
1時間ちょいで解いて、見直しして、まあ2時間で終わるだろうという予定だったけど、想定以上に時間がかかってしまった。
まあでも、なんてったって試験時間は180分だし、ゆっくり見直すかーとチェックを付けた問題を解きなおし。
見直しは20～30分ほどでおわり、その時点でまだ時間はだいぶある。
正直これでもういけたかなーと思ったが、まだ時間あるし、3万がかかってるだ！！と思い、全問を再度見直し。
ここで数問ミスに気づけたのでよかった。
トータル2時間半ほどで終了。

# 結果
終了ボタンを押すと、すぐにスコアが表示された。<br>
_結果　87％_
おおお、思ったより取れた！<br>
やった!!という気持ちと、3万が無駄にならなかったという安堵。
メールで正式なスコアも確認して、わたしのJava Silver受験が終了しました。

<h1>受験を通して感じたこと</h1>

### まじで黒本！！！！！！
これはみなさん口を揃えておっしゃっていますが、100％同意です。
黒本をそれなりに回せば、大丈夫。

### 第6・7章の理解
インターフェースとか抽象クラスとかややこしいけど、それなりに問題数が多いので、ここを確実に理解することは重要。
曖昧な理解で運悪く外しまくると、大きな失点につながってしまうと思う。

### モジュールも黒本のボリュームのわりに出た気がする
黒本では第11章に数問載っているだけで、はじめは諦めようかなと思っていたけど、
比較的最近追加された機能ということもあり、問題数が多かった印象。<br><br>


ということで、わたしのJava Silver受験記でした。
いち体験記として、少しでも助けになっていたら幸いです。
日経NETWORKの感想

日経NETWORKの2022年7月号が届いた。
個人的に面白かったところを軽くお伝えする。

プロンプト爆撃
---
プロンプト爆撃の「爆発」という言葉に興味を惹かれて読んでみると、今ではお馴染みに
なっているであろう、多要素認証に関するものであった。

:::note
多要素認証とは、不正アクセスを防ぐ為の対策の1つである。
これまではIDとパスワードというユーザーだけが知っていた「知識情報」で認証を行って
いたが、それでは「知識」が漏洩すれば不正アクセスが出来てしまう。
そこで、「知識情報」以外にも「所有情報」や「生体情報」と組み合わせて認証する
ことにしたのだ。

「所有情報」はスマホやタブレットの認証アプリ、「生体情報」は指紋や静脈などが
当てはまる。

例として、「知識情報」と「所有情報」を組み合わせた場合だと
IDとパスワードを入力すると、ユーザーが持っているスマホに認証の承認を求める
プッシュ通知が飛んでくる。これを承認して初めてアクセスが出来るようになる。
:::

多要素認証により、従来と比べてセキュリティーレベルは大きく向上する。
しかし、それを破る手段も出現し続けている。
その1つが「プロンプト爆撃」である。

プロンプト爆発がターゲットにしているのは、上の例でも記載したスマホへのプッシュ通知
である。プッシュ通知の利点は利便性にある。
スマホに通知が表示され、それをタップして承認するだけ。手軽だ。
これならばユーザーとしてもそこまでの負担にならない。この利便性が導入が進む理由の
1つかもしれない。

だが、利便性というのはいつの時代でも狙われる要因になる。
手法はこうだ。
攻撃者は事前に何等かの方法でIDとパスワードの情報を盗み出しておく。
そして、ユーザーが油断しているタイミングでログインを試みるのだ。

油断しているタイミングとして考えられるのは
+ 就寝後
ログインを繰り返し実行することで、ユーザーのスマホに山のようにプッシュ通知が
送られる。（ここが爆撃の理由らしい）
多くの場合、プッシュ通知が表示される時には着信音の設定がされているので、山のように
鳴り出してはとても眠れない。
寝ぼけたユーザーは通知の意味を理解しないまま、タップしてしまい不正なアクセスを許して
しまうことになる。

+ 日中
ユーザーが利用している時間帯であれば、通知が飛んできても認証のタイムアウトで再度
飛んできたのか、くらいにしか思わないだろう。そのまま深く考えずにタップして不正な
アクセスを許してしまう。

仮にこうした不正アクセスを許してしまった場合は、管理者に連絡すること、パスワードを
変更すること、など他のセキュリティ問題と同じような対処が必要になる。

> 日経NETWORK 2022.07

まとめ
---
プロンプト爆撃という手法についてまとめた。
この記事が面白いと思ったのは、いくらセキュリティ認証の方法を複雑、高度にしたとしても
結局、最後は人間のセキュリティに対する意識や危機感が大事になるということを改めて知る
ことが出来たからだ。

そして、危機感が大事というのは何もセキュリティに限った話ではない。
仕事をしていく上では自分の行いがどのような影響を与えてしまうのか、そのリスクを考慮
した上で判断しなければならない。
（先日、判断ミスで色々と叩かれた私が言うのだから間違いない）

この記事を読んでくれた方も、改めて危機感をもって仕事に取り組んで頂きたい。
RailsでのDB接続エラー

# エラー
AWS CodeBuild上でAurora(MySQL)に接続してrails db:migrateしようとすると、Access Denied。
この問題を解決するのにかなりの時間を費やしたので、メモ + 共有。

# 検証 + 解決方法
- そもそもDBは起動しているか。
- ネットワークとして、互いに接続できる状態か。（セキュリティグループ設定が正しいか）
- MySQLクライアントでDBに接続できるか。
```bash
mysql -h <ホスト> -u <DBユーザ名> --password=<DBパスワード> <DB名>
```
- DBホストを名前解決できているか。
```bash
nsloolup <ホスト>
```
- DBから応答はあるか。（CodeBuildで実行）
```bash
mysqladmin ping -h <ホスト> -u <DBユーザ名> --password=<DBパスワード> <DB名>
```

私の場合、以上に関しては問題が無かった。
そのため、Railsの設定のどこかが間違っているのだろうと当たりをつけることができた。

- Railsの設定は正しいか。
私の場合は、原因はdatabase.ymlの設定だった。`正`のように修正することで解決した。
```yml
# 不具合が起こる場合がある書き方
password: <%= ENV['RDS_PASSWORD']　%>
# 正
password: "<%= ENV['RDS_PASSWORD']　%>"
```

上側の記述方法で何が悪いかというと、下記の記事にもあるように、パスワードの先頭が記号`#`だった場合に無効になってしまうこと。
https://taker.hatenablog.com/entry/2020/02/18/000922

今回、パスワードをランダムな文字列で生成するようにしていたため、パスワードの先頭が`#`になっていた。

以上
cscの作法 その223

# 概要
cscの作法、調べてみた。
キーストアp12ファイルを読み込んで、秘密鍵を取り出して、平文を暗号化、復号してみた。

# サンプルコード

```
using System;
using System.IO;
using System.Security.Cryptography;
using System.Collections.Generic;
using System.Text;
using System.Security.Cryptography.X509Certificates;

	class test0 {
		static void Main() {
			string encryptWord = "hogehoge2";
			var encByte = Encoding.Unicode.GetBytes(encryptWord);
			Console.WriteLine("original: " + Encoding.Unicode.GetString(encByte));
			var certificate = new X509Certificate2("pkcs12.p12", "password");
			var rsa = (RSACryptoServiceProvider) certificate.PrivateKey;
			byte[] encryptedByte;
			encryptedByte = rsa.Encrypt(encByte, RSAEncryptionPadding.OaepSHA1);
			Console.WriteLine("encrypted: " + Convert.ToBase64String(encryptedByte));
			byte[] decryptedByte;
			decryptedByte = rsa.Decrypt(encryptedByte, RSAEncryptionPadding.OaepSHA1);
			var decryptedString = Encoding.Unicode.GetString(decryptedByte);
			Console.WriteLine("Decrypt: " + decryptedString);
			Console.WriteLine("ok");
		}
	}

```

# 実行結果

```
>ras3
original: hogehoge2
encrypted: USyHfi1J/io8rLbspjSYaThB36aZo45OQ1DNHDgsL19hGj/zOuJPGsxYnYkmlse2KLZyOw0b1XSLCVXc2vi+0R6oBOXuH1TB9216qrKSNeYHB7nZIeC+OCZH6haL3mXa9OK8nW94t4SBBMLbW5a+4lEb6ee0QVMz3vrk5WtL6gM69kebdRkrxSVmI4vQb4jjVhC6F5WnNt1iXB2UceV69an22910FIQwACPcrrQ0APr+G0WCJbAWxldRRb1Lv8Cy28jn8DhFDqelgxCzIJ9jtRVvqQCd4rgx+wqFvFwl3Qy56UUAc1VC9WYu7vcstHZ1IHtOBVKGO5lNmCxiAGy/GA==
Decrypt: hogehoge2
ok
```

以上。