OmniAICreator/Qiita-1.07M huggingface dataset:
ドライブ・パーティション・ボリュームなどの記憶領域について

# そもそもなぜ書こうと思ったのか

就職し同期（Rust書いてる人）としゃべっていたところボリュームとかの話を彼が知らなかったので「需要あるのでは」と思いメモ程度に書いてみよーとなった。
（最近はクラウドとかでふわっとしてるからしょうがないよね・・・）

# ディスクとパーティションとボリューム

- ディスク
  - HDDやSSD
- パーティション
  - ディスクを区切った論理的な領域
- ボリューム
  - パーティションの保存領域

図にするとこんな感じ(ディスク1つ)

![1.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/405444/ef439424-4adb-ab5a-08dd-a210143b38db.png)


ディスクの物理領域をパーティションで区切ってその上にボリュームを作成します。

図では1つのディスクで構成されていますが、複数のディスク上にパーティションを切ることも可能です。

複数の場合はRAIDを組み、複数の物理ディスクを1つの論理ディスクとして認識させます。

![2.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/405444/a4056bd3-50e1-3a83-c566-d5f86b68fc15.png)


図のように複数の物理ディスクを1つの論理ディスクにすることでOSからは1つのディスクのように見えます。

# パーティション

ディスクを分割した論理的な領域です。
パーティションを切る事でディスク（パーティションのサイズ分）を初期化します。

ディスク上に作れるパーティションの上限はパーティションテーブルによって変わります。

## パーティションテーブルの種類

パーティションテーブルの種類

- MBR
- GPT

## MBR(Master Boot Record)

### 特徴

- 古い(Windows XPとかでも使える)
- 2TBまでしか認識しない
- (プライマリ)パーティションの上限が4

MBRは古くから使われているパーティションであり、Windows XPより前のOSでも使えます。（Win10でも使える）
また、2TBのディスクまでしか認識しないなどの制約があります。

### 構造

![3.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/405444/028949a9-1dc8-926b-d734-3c2e4e6543aa.png)


## GPT(Globally Unique Identifier Partition Table)

### 特徴

- UEFIで使用可能
- 8ZBまで認識する
- パーティションの上限が128

実質制約がない。 

### 構造

![4.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/405444/5ec0be42-5d88-8fa6-594e-96cedad46248.png)


# ボリューム

パーティション上のファイルシステム領域です。

ディレクトリ構造や写真、動画などのファイルを保存します。
（普段ファイルを移動させたり作ったりする部分ですね）

## ファイルシステムの種類

- ext4
- NTFS
- btrfs
- FAT32
  など

# おわり

自分の知識＆軽く調べながら書いたので間違ってたらごめんなさいm(_ _)m
MySQLインストール(Mac)

## 前提
MacPC使っている人
homebrew必要まだの人は↓から導入

https://qiita.com/Tasuku-Q/items/ee4373edd22da7295b3e


## MySQLインストール
ターミナルを起動します

homebrewのupdateをしておく
```zsh
% brew update
```

インストール可能なMsSQLのバージョンを検索
```zsh
% brew search mysql | grep "mysql@"
mysql@5.7
mysql@8.0
```

バージョンを指定してMsSQLをbrewでインストール
```zsh
% brew install mysql@8.0
```
※最新verが欲しい場合は@でverを指定せず「brew install mysql」で実行すると最新verがインストールされます

Installing mysqlが完了したら終わりです
![スクリーンショット 2024-03-10 8.47.21.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/535004/d157d7fe-b80f-f7c9-961c-22dfc51b95ae.png)

MySQLのインストール確認
```zsh
% mysql --version
mysql  Ver 8.3.0 for macos12.6 on x86_64 (Homebrew)
```

MySQLのバージョンが確認できたらインストール完了です


## MySQL起動・停止
各種コマンド

・起動
```zsh
% mysql.server start
Starting MySQL
.. SUCCESS!
```


・ステータス確認
```zsh
% mysql.server status
 SUCCESS! MySQL running (7172)
 ```

・停止
```zsh
% mysql.server stop 
Shutting down MySQL
. SUCCESS!
```

MySQLは上記の起動コマンドを実行すると立ち上がります
起動していないとプログラムなどでDBとして使う時にエラーになるので注意が必要です
また、よく起動していたっけという状態になるのでstatusで起動しているか確認しましょう
使わない時は停止しておきましょう


## おわり
他の記事でMySQL使うことが多いとので導入まで
MySQLへのログインやMySQLのコマンド類は今回は省きます
SQLで日時型(DATETIME)から日付のみを取得する方法

## 困っていたこと
MySQLでSQL実行時の日付のレコードのみ取得するために、DATETIME(`YYYY-MM-DD hh:mm:ss`)型の日付部分のみを取り出したい。

## 解決方法
DBMS毎に関数が用意されているようですがISOで定められているCASTで記述するのが良さそうです。

### 使い方
```SQL
SELECT CAST(getdate() AS DATE)
-- 結果
-- 2024-03-10

-- サンプルクエリ
SELECT * 
WHERE CAST(DATETIME AS DATE) = CURRENT_DATE
FROM TABLE
```
※現在日付をISO 8601形式で取得するCURRENT_DATEはPostgreSQLとMySQLで使用できるようですが、
標準の書き方はないようなので、お使いのDBMSにあった書き方を確認する必要がございます。
ELBのHealthyHostCountメトリクスについて

# はじめに
ELB配下のターゲットが異常もしくはない場合にアラートを出したいケースってありますよね。
その場合、ELBのHealthyHostCountを利用するのが一般的かと思います。
ELBのHealthyHostCountを使ってアラートを上げる際に少し気にするポイントがあったので語っていきます。

# HealthyHostCount
その名の通り、ELB配下のHealthCheckに成功しELBがHealthyとみとめたターゲット数です。

https://docs.aws.amazon.com/ja_jp/elasticloadbalancing/latest/application/load-balancer-cloudwatch-metrics.html

通常以下のようにヘルスチェックに成功しELBがHealthyとみとめたターゲット数をメトリクスに出力します。
![スクリーンショット 2024-03-03 22.29.02.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/584167/b65fdab2-4746-3ced-fb80-b0e45a2df762.png)

つまり、以下のようにヘルスチェックに全台失敗し、ELBがHealthyと判定しなかった場合０が出力されます。

![スクリーンショット 2024-03-03 22.29.06.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/584167/be6fc28a-d110-552b-f080-b0542ae99bba.png)

以下のケースではどうでしょうか？AutoScalingなど、ターゲットを０台とした場合は、HealthyHostCountは０にはなりません。この場合、メトリクスは出力されず、アラームではデータ不足と判定されます。これが注意点ですね。
![スクリーンショット 2024-03-03 22.29.11.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/584167/001c5698-93ed-0ff6-95a3-d67fd535102b.png)

# アラームはどう設定すべきか
ターゲットに以上があり、ELB配下が正常に応答しない場合を検知したい、Sorryに切り替えたいなどの場合は、単純にHealthyHostCount＜=0でアラーム発報すればよいです。何らかの原因や明示的にELB配下のターゲットを０とした場合でも検知したい場合は、欠落データの扱いをしきい値超えと設定すればよいです。
この場合、一台もターゲットがないと判定されると、メトリクスはデータ不足となり、欠落データを不正扱いすることで、アラーム発報が可能です。

breaching – 欠落データポイントは「不良」とされ、しきい値超過として扱われます。

https://docs.aws.amazon.com/ja_jp/AmazonCloudWatch/latest/monitoring/AlarmThatSendsEmail.html

# まとめ
アラームの目的に対して、アラームのしきい値が適切なものかを判断するには、メトリクスの特性を理解する必要があります。必ず実際に検知したいケースを試すことが重要です。
Goでenumを使用する

Go で機能を作成しているときに、enum のような形で文字列を扱いたい場面がでてきました。
しかし、Go には厳密な意味での enum 型が存在しないため、その類似した機能を実現する方法を書き留めます。

# 方法 1: iota を用いた定数ブロックの作成をする

iota は定数宣言(const)で利用できる識別子で、型なしの整数の連番を生成します。
以下では、iota を用いて連番を生成し、それに対して String()メソッドを定義します。

```
package main

import "fmt"

type YearNumberEnum int

// iotaを用いて連番を生成する
const (
	Showa YearNumberEnum = iota
	Heisei
	Reiwa
)

// iotaを用いて生成した連番に対して、別名を与えて定義する
func (yn YearNumberEnum) String() string {
	switch yn {
	case Showa:
		return "昭和"
	case Heisei:
		return "平成"
	case Reiwa:
		return "令和"
	default:
		return "未定義"
	}
}

func main() {
    // Stringメソッドで定義した値を表示する
	fmt.Println(Showa.String())  // 昭和
	fmt.Println(Heisei.String()) // 平成
	fmt.Println(Reiwa.String())  // 令和
}
```

# 方法 2: 定数ブロックと map を使用する

定数ブロックと map を用いて enum のようなキーと値の関係を定義することが可能です。
以下では、map を使用して、定義した値を表示します。

```
package main

import "fmt"

type YearNumberEnum int

// iotaを用いて連番を生成する
const (
	Showa YearNumberEnum = iota
	Heisei
	Reiwa
)

// 定数ブロックとmapを用いてenumのようなキーと値の関係を定義する
var yearNumberMap = map[YearNumberEnum]string{
	Showa:  "昭和",
	Heisei: "平成",
	Reiwa:  "令和",
}

func main() {
    // mapを使用して定義した値を表示する
	fmt.Println(yearNumberMap[Showa])  // 昭和
	fmt.Println(yearNumberMap[Heisei]) // 平成
	fmt.Println(yearNumberMap[Reiwa])  // 令和
}

```

# 参考

- [golang で enum を使ってみよう](https://www.tukatech.jp/techblog/golang%E3%81%A7enum%E3%82%92%E4%BD%BF%E3%81%A3%E3%81%A6%E3%81%BF%E3%82%88%E3%81%86/)

- [go の enum は文字列でいいのではないかという話](https://zenn.dev/kyoh86/articles/qiita-18b8bfc6ffe045aaf380)
WARNING: REMOTE HOST IDENTIFICATION HAS CHANGED!

## 環境
- macOS Monterey 12.7.3

## git cloneでエラー
githubで管理していたプロジェクトをローカル環境に持ってくるため、git cloneを実行したところタイトルの通り、以下のエラーが発生しました。

```
@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
@    WARNING: REMOTE HOST IDENTIFICATION HAS CHANGED!     @
@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
IT IS POSSIBLE THAT SOMEONE IS DOING SOMETHING NASTY!
Someone could be eavesdropping on you right now (man-in-the-middle attack)!
It is also possible that a host key has just been changed.
The fingerprint for the RSA key sent by the remote host is
SHA256:uNiVztksCsDhcc0u9e8BujQXVUpKZIDTMczCvj3tD2s.
Please contact your system administrator.
Add correct host key in /Users/user_name/.ssh/known_hosts to get rid of this message.
Offending RSA key in /Users/user_name/.ssh/known_hosts:1
Host key for github.com has changed and you have requested strict checking.
Host key verification failed.
fatal: Could not read from remote repository.

Please make sure you have the correct access rights
and the repository exists.
```

## 対応
エラー文を読むと、ホスト鍵に問題があるとのことでした。

ホスト鍵の概要　[参考](https://qiita.com/angel_p_57/items/19eda15576b3dceb7608)
> 認証鍵がサーバでユーザを識別するものであるのに対し、ホスト鍵は「ホスト認証」においてクライアントがサーバを識別するために使うものです。
簡単に言うと、本物のサーバに接続できているかの判断材料になります。

ホスト鍵は`.ssh/known_hosts`で管理されており、エラー文にも`known_hosts:1`と書かれていましたので、該当の箇所(1行目)を確認すると、githubのホスト鍵が記載されていました。
ここがgithub側で変更されていたようなので、一旦この鍵を削除し再度`git clone`を実行したところ、今度は正常にプロジェクトを持ってくることができました。

`known_hosts`を再度確認すると、`github.com ssh-rsa AAAAB3...`という文が追加されているのを確認できました。他にも2行ほどgithub関連の行が追加されていました。
[参考](https://github.blog/2023-03-23-we-updated-our-rsa-ssh-host-key/)
mu-mu domain + AWS SES

# 結論
親ドメイン：example.com
サブドメイン:support.exmample.com

|サブドメイン|type|値|
|:----|:---|:---|
|xyz1._domainkey|CNAME|xyz1.dkim.amazonses.com|
|xyz2._domainkey|CNAME|xyz2.dkim.amazonses.com|
|xyz3._domainkey|CNAME|xyz3.dkim.amazonses.com|
|xyz4._domainkey.support|CNAME|xyz1.dkim.amazonses.com|
|xyz5._domainkey.support|CNAME|xyz2.dkim.amazonses.com|
|xyz6._domainkey.support|CNAME|xyz3.dkim.amazonses.com|
|(記載なし)|ALIAS|support.exmample.com|

# ムームードメインには既に自ドメインの設定がある
ALIASとして主のドメインにALIASでサブドメインを設定する。

# AWS SES
## 自ドメイン、サブドメインそれぞれをIDタイプ：ドメインで登録する。
CNMAEへ３レコード登録せよ、と出るので、それぞれを結論に記載のとおり登録する。

# テストメールのソースを確認。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/87538/bd827a65-c16d-d447-b940-3a30698b3013.png)
【Rust】String型で配列を初期化しようとした時に「the `Copy` trait is require」が発生

## 概要
Rustで配列の初期化を行う時、[Rustの配列（array）の使い方](https://yu-nix.com/archives/rust-array/)の記事内容を参考に実装してみました。今回はString型の配列にしたかったので、以下のように実装したのですが`the `Copy` trait is require`と言われてしまい、この実装だとダメでした。
```rust
let mut sample_array = ["".to_string(); 10];
```

少し対応など調べてみましたので、今回メモ書きします。

## 前提
使用したrustcのバージョンは`1.76.0`です。

## 対応案
いくつか対応案が考えられると思いますが、取り急ぎ2つ挙げておきます。

### 1. そもそもVecを使うようにする
特段、配列にこだわりがなければVecを使うという方法が挙げられます。[Rustで配列を『安全に』初期化する方法](https://qiita.com/mp2147483647/items/a14b89450f24679f6c0e)の記事で紹介されている通り、以下のようにマクロを使う方法などで初期化が行えます。
```rust
let mut sample_vec = vec!["".to_string(); 10];
```

### 2. 初期化の値をconstで宣言する
配列を使用したいケースの場合は、[Initializing an array of strings in Rust](https://stackoverflow.com/a/70267984)のstackoverflowの回答で紹介されている通り、初期化する値を`String::new()`でconstで宣言するという対応が挙げられます。

```rust
const EMPTY_STRING: String = String::new();
let mut sample_array = [EMPTY_STRING; 10];
```
p5play での Chain Collider（vertex mode）のグループを作った衝突判定を試す：重力をかけた円との衝突でテスト

以下の記事の続きです。

●p5play で Chain Collider（vertex mode）のグループを作ってみる - Qiita
　https://qiita.com/youtoy/items/589dad3ac7af138f79b8

前回の記事では、p5play で図形などのグループを作る仕組みを使い、基本図形ではない Chain Collider（vertex mode）をグループ化するというのを試してみました。

そして前回の記事で進めた内容は、Chain Collider（vertex mode）をグループ化した後の処理までは試していない内容でした。そのため、今回はグループ化したものと別の図形との間で、以下の衝突判定を適用するというのをやってみます。

●p5play : Group ＞ Collisions and Overlaps
　https://p5play.org/learn/group.html?page=2

## 試した内容
まず、今回の内容を動かしている時の様子は、以下のとおりです。

<iframe width="560" height="315" src="https://www.youtube.com/embed/EkWxkj5Hf7k?si=QysWcKLaIUDPHflF" title="YouTube video player" frameborder="0" allow="accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture; web-share" allowfullscreen></iframe>

上記の内容は、Chain Collider（vertex mode） 3つをグループ化したものと、重力がかかって跳びはねる円との間で衝突判定を行っています。

その衝突判定を行う部分に関して、個々の Chain Collider ごとに異なる処理を適用できるかを試しています。ひとまずは簡易な内容で試しており、具体的には、1つ目だけは衝突時に特に変化は起こらず、残り 2つは衝突時に円と同じ色に変化するという処理を適用しています。

### 実装内容と実行結果
実装した内容は、以下のとおりです。

```javascript
function setup() {
  new Canvas(300, 400);

  world.gravity.y = 10;

  strokeWeight(5);

  const floors = new Group();
  floors.collider = "static";
  floors.color = color(190, 200, 220); // 灰色

  new floors.Sprite([
    [20, 40],
    [100, 90],
    [150, 150],
  ]);
  new floors.Sprite([
    [250, 150],
    [100, 300],
    [50, 300],
  ]);
  new floors.Sprite([
    [0, 350],
    [50, 350],
  ]);

  noStroke();
  const ball = new Sprite(60, 0, 20);
  ball.bounciness = 0.6;

  ball.collides(floors, changeColor);
}

function changeColor(ball, floor) {
  if (floor.idNum > 0) floor.color = ball.color;
}

function draw() {
  background(50);
}
```

グループを作成する処理の内容に関しては、冒頭に掲載している前回の記事をご参照ください。それと、衝突判定全般の話は、以前書いた以下の記事をご参照ください。

●p5play の 2つのスプライトのグループ間で「Collisions and Overlaps」の仕組みを扱う  - Qiita
　https://qiita.com/youtoy/items/6d56327bd3a1d232cb9b

上記の参照先に書いていない、今回のポイントになりそうな部分を補足します。それは、changeColor() の中で、「グループ内の 3つある中で、2つだけ色が変化する」ということを実現している部分です。

その判定には、idNum というキーを用いています。
この idNum というキーは、公式ページの上部メニューから見られるドキュメント上には書いてなさそうでした（※ 詳細仕様などを見ていけば、書いてありそうですが）。そのため、このキーを探すために、上のプログラムの changeColor() の中で、floor をログとして出力し、その出力内容を見て個々の ID として使えそうな値を見つける形で探しました。

その結果、上で掲載していた動画のように「グループ中の特定のものだけに色が変わる処理を適用する」という処理を実現できました。

## 追記： 上記を基にしてやりたかったこと
今回の仕組みを適用したかった内容があったのですが、想定通りに作れた感じがするので、動作させている様子を追加で掲載してみます。

https://twitter.com/youtoy/status/1766840347953697054
Reactでimgのエラーが起きた時に代わりの画像を表示させる方法

# はじめに
ReactでWebサービスを開発する際、apiから持ってきた画像のurlを表示させることは多々あると思います。
そのとき何らかの原因で画像が表示できないと、なんとも言えない残念なUIになってしまいます。

そこで、imgタグに`onError`　というイベントハンドラーを使用することによって、画像が読み込めなかった時にデフォルトの画像を表示させるというようなことができます。

# 実際にやってみる

```tsx
import defaultImage from "src/assets/default_image.png";

const Image = ({ src, alt }: { src: string; alt: string }) => {
    return (
            <img
                src={src}
                alt={alt}
                onError={(e) => {
                    const target = e.target as HTMLImageElement;
                    target.src = defaultImage;
                }}
            />
    );
};
```
このように書くと、たとえ`src`の画像がエラーになった時でも、`defaultImage`を表示させることができます。

またこれを関数として切り出すと、もっと使いやすくなります。
例えば、アイコンやヘッダー、サムネイルなどの種類によって画像を分けたいときは以下のように書くことができます。

```tsx
const imageLoadErrorHandler = (
    e: React.SyntheticEvent<HTMLImageElement, Event>,
    imageType: "header" | "thumbnail" | "icon"
) => {
    const target = e.target as HTMLImageElement;

    switch (imageType) {
        case "header":
            target.src = defaultHeader;
            break;
        case "thumbnail":
            target.src = defaultThumbnail;
            break;
        case "icon":
            target.src = defaultIcon;
            break;
        default:
            break;
    }
};

// 使用するとき

const Image = ({ src, alt }: { src: string; alt: string }) => {
    return (
            <img
                src={src}
                alt={alt}
                onError={(e) => {
                    imageLoadErrorHandler(e,"icon")
                }}
            />
    );
};
```

# おわりに
最後までお読みいただきありがとうございました！
もっといい方法などありましたらコメントに書いていただけると嬉しいです!

## 参考リンクなど
https://developer.mozilla.org/ja/docs/Web/HTML/Element/img#%E7%94%BB%E5%83%8F%E8%AA%AD%E3%81%BF%E8%BE%BC%E3%81%BF%E3%82%A8%E3%83%A9%E3%83%BC

https://qiita.com/m3816/items/56b9b6b6f340265cbfab
Simulinkを用いたNucleoとMCP3008のSPI通信

## はじめに
Simulink + Nucleoで、MCP3008のSPI通信ができたのでそのメモ

## 用意するもの
ハードウェア
* Nucleo-F411RE
* MCP3008 10bitADコンバータ
* ブレッドボード
* ジャンパーワイヤー
* PCと通信するためのUSBケーブル（miniB-A）

ソフトウェア
* Simulink R2023a（私の環境）
* Simulink Coder Support Package for STMicroelectronics Nucleo Boards（アドオン）

## 解説
まずは完成したブロック図から

![スクリーンショット 2024-03-10 200155.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3687134/b4a5d4d7-87db-884f-1b79-e0a69e6d71d8.png)

基本構成は SPI Controller Transfer ブロックの前後で分かれます。

### 送信部分（Master Out）
今回はSPIブロックを通して、MCP3008に ①Startビット ②チャンネル選択 ③ゼロ
を送信しています。

送信するデータは Constant ブロックにすべて記載しています。行列表記になっているのでそれぞれ要素毎に送信してくれます。便利

①はデータシートにもあるように `1` を送信します。実際には `00000001` を送信する必要がありますが、勝手に必要な分の `0` は補ってくれるようです。
②はシングルエンドか差動か、そして読み取るチャンネルを決定づけます。今回は、シングルエンドのCH1ですので、①の後に、`1000` を送信します。
③は実はなんでもよく、受信データが欲しいために送ります。

uint8に変換しているのはSPIの送信が8ビットであるためです。

### 受信部分（Slave Out）
受信してきたデータは3つの要素に格納されてきます。そのため selectorブロック を使って要素毎に分けます。
ここから受け取ったデータ処理の部分になりますが少し厄介です。表6-1を見ながらですと理解しやすいかと。

表でも送信と受信でそれぞれ3要素あります。左から①、②、③に対応しています。
まず1要素目は、AD変換された結果には関係がないことが分かります。
そのためブロック図でもterminateしています。
2要素目は下位3bitのみ有効。2bit目は必ず0になるとあります。
3要素目は全ての値が必要です。
そのためMCP3008からの受信データは10bitになります（当たり前か）

これが分かったら必要な10bitを抜き出す作業です。
uint16に変換するのは、この後行うビットシフトに対応するためです。
1要素目は無視。
2要素目はビット演算のANDを用いて、下位2bitを抜き出しています。
そして8ビットシフト左にずらすことによって3要素目の居場所をつくります。
2要素目と3要素目をsumブロックで連結することによりデータを1つにすることができました。

最後は1024で割り、電源電圧（今回は5V）を掛けることで電圧に変換できました。

## 送受信ビットについての詳細

![スクリーンショット 2024-03-10 223906.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3687134/ba8d90e4-4932-ffe7-c266-16268cb8484c.png)
送信の×部分は、"Don't care"ビットと言い、どんなデータを送信してもICが無視をするという仕様です。今回は全部0で埋めました。
受信側の ? はランダムデータが入るので無視。赤丸の部分に結果が入るという仕組み


## 参考情報

https://www.denshi.club/cookbook/adda/adc/a-d210spi-mcp3008.html
昔の確率統計の教科書（高校）

古今、注目浴びている確率・統計の高校の教科書はこんな感じ

![IMG_3986.JPEG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/354057/922c3472-0b07-6a77-637d-a8650683adfb.jpeg)
![IMG_3987.JPEG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/354057/7de20825-a881-5f6c-8654-65f5feae8328.jpeg)
![IMG_3988.JPEG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/354057/5d6b0a62-5caf-986a-96c4-78e3fdc3e43c.jpeg)
![IMG_3989.JPEG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/354057/94c5a51a-b662-c7cc-25ab-75ff4948abef.jpeg)
![IMG_3990.JPEG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/354057/1946be90-a5ad-4a51-4d9a-3a266892ec98.jpeg)
![IMG_3991.JPEG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/354057/472ee022-e7c8-6af3-d4ba-92aade8cd20e.jpeg)
![IMG_3992.JPEG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/354057/fa376918-8876-1265-8b94-a4065086246d.jpeg)
![IMG_3993.JPEG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/354057/5dd01f13-1be8-5f0e-5ae7-714b9e12f328.jpeg)
![IMG_3994.JPEG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/354057/9c50bc03-de8b-7575-02f4-43d7a240c3b7.jpeg)
![IMG_3995.JPEG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/354057/58956986-5518-c619-8a10-f51a0cac7689.jpeg)
plotly でグラフに設定できる各種タイトル

plotlyはグラフ内に様々なタイトルを設定できる。
![newplot(18).png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/143934/bda955dd-2a7f-fc26-1b80-55e760b3d0c6.png)
~~~python
fig = make_subplots(
    rows=2, cols=1,
    subplot_titles=['subplot_titles_aa','subplot_titles_bb'],
    column_titles=['col_titles_1'],
    row_titles=['row_titles_1','row_titles_2'],
    x_title='x_title',
    y_title='y_title',
    specs=[[{}],[dict(secondary_y=True)]]
)
fig.update_layout(
    height=800, width=800, margin_l=120,
    title='title',
    legend_title='legend'
)

L1 = go.Scatter(x=[1,2,3], y=[1,3,1], name='foo')
L2 = go.Scatter(x=[1,2,3], y=[2,2,2], name='bar')
L3 = go.Scatter(x=[1,2,3], y=[4,80,4], name='bar2')
fig.add_traces([L1,L2,L3], rows=[1,2,2], cols=[1,1,1],secondary_ys=[False,False,True])

fig.update_layout(
    yaxis_title  = 'yaxis_title',
    yaxis2_title = 'yaxis2_title',
    yaxis3_title = 'yaxis3_title',
    xaxis_title  = 'xaxis_title',
    xaxis2_title = 'xaxis2_title',

)

fig.update_annotations(selector=dict(text='x_title'),bordercolor ='red',yshift=-50)
fig.update_annotations(selector=dict(text='y_title'),bordercolor ='blue',xshift=-80)
fig.update_annotations(selector=dict(text='col_titles_1'),bordercolor ='orange',xref='x')
fig.update_annotations(selector=dict(text='row_titles_1'),bordercolor ='yellow')
fig.update_annotations(selector=dict(text='row_titles_2'),bordercolor ='green',xshift=60)

fig.show()
~~~
デフォルトでは表示が重なってしまうタイトルもあるため、グラフの中身を考えて使用したほうが良い。（サブプロットタイトルと行・列タイトルは同時に使用しないなど）
周りから責任感があると思われるには、どうすれば良いか？

# はじめに

「責任感を持って仕事をする」ということは、あたり前の話ですが、周りを見渡しても、できている人はあまり多くありません。

「仕事ができる」と言われる人は、あたり前にできていることですが、「仕事ができない」と言われている人は、これができていないことが多いです。

技術力も重要ですが、こういったあたり前のことができることも非常に重要です。
自分の仕事の取り組み方について、ふりかえり、責任を持って仕事を取り組めるようになりましょう。

（時間ない方は「具体的には何をすれば良いのか」だけでもご覧ください。）

# 対象者

- 責任感を持って仕事に取り組めているか、疑問に思った人
- 仕事にまだ慣れていない人

# 責任感を持って仕事をするとは？

責任感を持って仕事をするとは、次の２つを行うことだと思います。
1. 自分のタスクを期日までに終わらせるために最大限の努力をする
2. 期日までに終わらないと気づいた時点ですぐに相談＆代替案を検討する


## 自分のタスクを期日までに終わらせるために最大限の努力をする

まずは期日までに仕事を終わらせるために、あらゆる努力をしましょう。
具体的なことについては、後ほど記載しますので、ここでは概要だけ記載します。
- わからないこと、疑問に思ったことがあれば、すぐに相談する
- 期日までに終わらないかもと思っても、まずはどうすれば終わらせられるかを考る（期日を延ばすことは最後に考える）
- 他の人にも作業してもらう場合は、他の人が期日までに作業してくれるように、フォローやリマインドなどを行う


## 期日までに終わらないと気づいた時点ですぐに相談＆代替案を検討する

１つ目をやった上で終わらない場合には、すぐに相談しましょう。

期日ギリギリになって取れることは期日を延ばすくらいですが、十分時間が残っていれば、他の代替案を考えることができます。

自分だけでは考えつかない案もあるかもしれません。
できるだけ早く相談しましょう。


# どんな良いこと・悪いことがあるか


## 責任感を持って仕事をするとどうなる？

仕事を期日までにしっかりと終わらせていれば、当然周りからの評価も良いものになります。
チームメンバーや上司からの信頼され、よりチャレンジングな仕事も任せてもらえるようになるかもしれません。

また、自分だけでなく、チームにもメリットがあります。
期日内に仕事が終わっているのであれば、スケジュール通りに物事が進んでおり、とても良い状態になっているでしょう。
仕事の品質も高いはずなので、後からバグが大量に発生し、スケジュールが遅延するという恐れも少ないでしょう。また、何かイレギュラーが起きたとしてもすぐに報告が上がるので、十分な時間を使って対応策を検討できるでしょう。


## 責任感を持って仕事をしないとどうなる？

基本的には、先ほどお伝えした内容の裏返しです。

あまり周りから信頼されず、簡単な仕事しか渡されないことになります。
それだけでなく、その簡単な仕事でさえダブルチェックをしないといけないかもしれません。

スケジュールについても遅延する可能性がかなり高くなります。
品質も低いことが予想されるため、後からバグなどが大量に出てきて、よりスケジュールが後ろ倒しになり、時間がない中、大量のバグの対応をすることになるかもしれません。


# 具体的には何をすれば良いのか

それでは、責任感を持って仕事に取り組むには、具体的に何をすれば良いか見ていきましょう。

ただ、アクションだけでなく、マインドも変えていく必要がありますので、マインド❤️ と アクション🏃‍♀️それぞれ、説明していきます。

## ❤️ できないから期日を延ばすではなく、どうすれば終わらせられるか考えよう

期日を延ばすというのは一番最後に考えることです。まずは終わらせられる方法はないかを考えましょう。

このとき、自分一人で終わらせる方法だけを考える必要はありません。
人を増やせば終わらせられるというのも立派な代替案の一つです。

リソースの関係で人を増員できない可能性もありますが、それは上司が判断すればよいことで、私たちが判断することではありません。

まずはいろんな人を巻き込んででも終わらせられる方法はないかを考えましょう。

## ❤️ 他人を言い訳にするのはやめよう

〇〇さんがこう言ってたから、〇〇さんがこうしろって言ったから、などと言い訳をするのはやめましょう。
タスクの中の最終的な決断を行うのは、あくまで自分です。他の人から言われたことは助言としてとらえ、決断は自分でしましょう。

自分で決断をするようになると、考慮漏れはないか？品質は大丈夫か？と事前に考える様になり、タスクの品質向上にもつながります。

## ❤️ そのタスクについては自分が一番詳しい状態になろう

自分のタスクについては、考慮漏れがないかなどを隅々までチェックしましょう。

大抵の場合、質問はタスクの作業者に来るものです。
考慮漏れなどがあると、しっかり考えていないんだなと思われてしまいますし、自分自身も自信がなくなってしまいます。

どうせ後から調べることになるので、先に調べておきましょう。

## 🏃‍♀️ ゴールや TODO を再確認しよう

上司からゴールや TODO を伝えられていても、問題ないかを自分自身で考えみましょう。
タスクの理解も深まりますし、考慮漏れを見つけられるかもしれません。

事前に考慮漏れを見つけることは、非常に Good です。
上司からもきっと感謝されるはずです。

考慮漏れの対応の分、少し作業は増えてしまうかもしれませんが、あとで自分の作った機能のバグが大量に見つかって、悲しい思いをするよりはよっぽどマシです。

## 🏃‍♀️ わからなければすぐ相談しよう

少し調べてわからないことは、有識者にサクッと聞いてしまいましょう。
多くの仕事のゴールは、期日内に作業を終わらせることです。
自分の力だけでやり切ることではないのです。

数時間かけてわからなかったことが、有識者に聞いたら 5 分で解決するということもザラにあります。
人に説明することで頭の整理にもつながるので、わからないことはどんどん相談しましょう。

## 🏃‍♀️ 終わらなそうならすぐに相談しよう

終わらなそうと感じたのであれば、すぐに相談しましょう。
終わらないと確定したタイミングではなく、終わらないかも？と思った時点がベストです。

上司に相談し、終わらない可能性も考慮した上で、どうしていくかを検討しましょう。
もしかしたら、そのまま仕事を続けてと言われるかもしれませんが、それならそれで良いのです。

上司もリスクを事前に把握することができますし、自分としても頭の中にある不安がなくなり、作業に集中することができます。

## 🏃‍♀️ 他の人にお願いするときには背景や期日を伝えよう＆リマインドをしよう

他の人も多くの仕事を抱えています。
優先度の判断をしてもらうためにも背景や期日をしっかり伝えましょう。

また、リマインドも忘れずに行いましょう。
仕事をお願いしている状態でもあるので、こちらがフォローできることはなるべくやりましょう。

# さいごに

私も社会人歴が長いわけではないのですが、上司や同僚に言われたこと、自分自身で思ったことなどをまとめてみました。

少しでも参考になれば幸いです。
それでは。
新卒1年目でAWS12冠＋セキスペ合格した学習法～知識は構造化して覚えよう～

新卒1年目にAWS12冠＋セキスペ合格を達成できたので、記念に学習のコツを書いてみます。おすすめの参考書や問題集を知りたい方は、別の方が30名以上の12冠達成者の記事をまとめて下さったので、こちらをご覧ください。また、12冠を達成してできるようになったことは以下にまとめてありますので、併せてご覧ください。本記事では、効率的な記憶術について紹介します。

https://qiita.com/mksamba/items/2d1a5b1147ec9f9ab0ab

https://qiita.com/Figure_Skate_IT/items/9dace44b1f10513f6a4b


## 12冠＋セキスペに１年で合格した記憶術

### 【大原則】知識は構造化して覚えよう
皆さんは単語などを覚えるとき、「名前：EC2　意味：AWSで使うサーバーのようなもの」のような感じで、名前と意味を1対1対応で覚えていませんか？このような覚え方をすると、知識同士のつながりが分からなくなったり、忘れやすくなったりします。さらに何のために暗記するのか分からなくなり、暗記が苦痛な作業になってしまいます。

知識を暗記するときには、その知識は全体のどこに位置し、別の知識とどのようなつながりがあるのか、構造化して覚えましょう。構造化すると、知識同士のつながりが理解できるので、応用しやすくなります。また、知識の内容自体を忘れてしまっても、その知識がそこにあったことを思いだせるので、検索や本を調べることでその知識にたどり着けます。

いきなり構造化して覚えようと思ってもやり方が分からないと思うので、絵付きで手順を解説します。


![スライド６.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3482344/da8db437-ef20-de4d-cc93-0da78806deaf.png)

### 1.知識の住所を特定する。
いきなり単語を覚えるのではなく、まずはその知識がどのカテゴリに属するのか、知識の住所を特定してください。住所を調べることでその知識が全体の中で果たす役割が分かります。するとよりその知識に対して興味がわき、忘れにくくなります。

![スライド1.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3482344/ff466a7a-4411-63c0-aa0a-138ce8bf07b5.png)

### 2. 記憶領域を確保する。
紙の書籍派の私は、本をざっとめくって、その章が何ページあるか調べ、どれくらいの暗記量が必要か、事前に身構えます。配列等を宣言してその記憶領域を確保するイメージです。

![スライド２.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3482344/e76b8fbd-bc27-c2d8-9bc5-2fb88bfd2e78.png)

### 3. カテゴライズしながら知識を暗記する。
記憶領域が確保できたら、暗記フェーズに入り、知識を変数に代入していきます。この時、自分なりにカテゴリ分けをして、構造を持たせながら暗記をしていくことが重要です。知識同士のつながりが多ければ多いほど忘れにくくなります。

![スライド３.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3482344/8bba8b69-0d96-4990-c874-ad303d49f1c7.png)

### 4. サブ概念があれば、①～③を繰り返す。
今覚えた知識に付属する概念があれば、再び ①住所の特定（知識のマッピング）、②記憶領域の確保、③カテゴライズしながら暗記 を繰り返しながら知識を覚えていきます。

![スライド４.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3482344/e7a3bc04-c39f-4e02-e3b9-7093a5fc4454.png)

### 5. 他の知識とつなげる

何度も繰り返しますが、知識は他の知識とのつながりが多ければ多いほど、多様なルートで思い出せるので、忘れにくくなります。知識を構造化して覚えたら終わりではなく、以前学習した別の知識と結び付けましょう。ちなみにこの結び付けができた時に「なるほど、そういうことだったのか」という、伏線回収の楽しみを感じられます。暗記するときは是非この段階まで行い、勉強を楽しんでくださいね！


![スライド５.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3482344/69671ae1-d8df-2767-b6ff-55e84daff001.png)

### まとめ

・知識は構造化して覚えると、忘れにくくなる。
・知識と知識をつなげたとき、快感が得られる。
・勉強を楽しもう！
OpenAIのAPIの課金が後払いから前払いに変わった

久々にOpenAIのAPIを使って作業をしたら以下のようなエラーが出た。
```
openai.RateLimitError: Error code: 429 - {‘error’: {‘message’: 'You exceeded your current quota, please check your plan and billing details., ‘type’: ‘insufficient_quota’, ‘param’: None, ‘code’: ‘insufficient_quota’}}
```
エラー文を読むと、どうやら何か割り当てを超過しておりプランを見直せと言っている。
何らかの理由で私のAPIが利用されまくっており、利用制限がかかったのかと思って、[ここ](https://platform.openai.com/usage)のページでAPIの利用状況を見ても何も使われていない。
色々調べてみると、OpenAIのAPIを使うためにはあらかじめ一定量のクレジットを購入しておき、そのクレジットの範囲内の料金でAPIを使う必要があるようだ。
しかし以前は使った分の料金が後でクレジットカードに請求されていたはずである。
どこかのタイミングで何か課金方法が変わったのかと思い、OpenAIのドキュメントなどでその知らせを探したが見当たらない。
日本語でGoogle検索をしてみても特に課金方法が変わったなどという情報は見つけられず・・・。
もしかして私が何か思い違いをしていて、APIの利用方法などを間違っているのかと不安に思った矢先に、[ここ](https://fozzels.com/en/changes-with-openai-billing-from-post-pay-to-pre-pay/)の英語のページで課金方法が変わったという情報を見つけることができた。
そしてよくよく確認すると、2/8にOpenAIから課金方法が変わったという旨のお知らせメールも届いていた↓。

![スクリーンショット 2024-03-09 10.30.48.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2708192/fa539497-84c6-8689-7a97-e7fc980b8664.png)

後払いよりも前払いの方がお金の使いすぎも防げるし良いことなのだが、こんなことで時間を使ってしまったのはもったいないことをした。
生成AIとかの分野は変化が早いからもっとアンテナを張っていなければいけないなと思った。
あと英語で調べるのも億劫だけどもっと早くやるべきだったな。
JFormDesigner java_form_デザイナー Swing で動かす

C# 探していたのや　![スクリーンショット 2024-03-03 193115.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3625232/91e281d6-23fb-1ddf-9859-d3c03e971549.png)
入れんし、デザイナー別のError出して、使えんくしてくれたから、VSの気持ちは、よーくわかった。

C#別の角度からトライしてみる。VSには、要らん子やし。
で、なんやらしていて、フォームの書き出し出来るの見つけたのです。
https://www.formdev.com/jformdesigner/

![スクリーンショット 2024-03-10 211403.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3625232/1c663305-d376-ba70-911e-92ca5ec3aa36.png)
![スクリーンショット 2024-03-10 211500.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3625232/b4c98872-c01a-d907-19d2-062483fe72e7.png)
![スクリーンショット 2024-03-10 211648.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3625232/24f167ce-c8d9-d3dd-e25e-bb3d95b6fd42.png)
![スクリーンショット 2024-03-10 211901.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3625232/606a5121-061d-639b-e146-a31605459c5e.png)
![スクリーンショット 2024-03-10 210913.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3625232/dec0bc04-dd95-5244-8b2a-f670b12e5ce6.png)
![スクリーンショット 2024-03-10 211124.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3625232/a5978465-604a-fe75-931d-c7a8caa3187f.png)

![ani_JForm_D.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3625232/5045b356-f53c-d586-67a8-09484be69a25.gif)

![スクリーンショット 2024-03-10 212009.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3625232/a76945a6-c17f-23b4-19c2-1c1a6efc8b84.png)
![スクリーンショット 2024-03-10 213039.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3625232/8d13e69f-0be8-9e5a-612e-eec7fe9251aa.png)
![スクリーンショット 2024-03-10 213217.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3625232/6f1d0f02-6235-dd74-2b25-f763554713b0.png)
![スクリーンショット 2024-03-10 213732.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3625232/6d816741-c3a3-b680-76f0-1322483071e7.png)

licenseの登録しなければならないから20日の運命だけどな。

まぁ、暇つぶしにやってみる。
React公式ページで学んでみた②（備忘録）

# はじめに
初めまして！
エンジニアになって数年、今まで本を読むだけでしたが、もっとプライベートで楽しみながら成長したい！自分が学んだ足跡を残していきたい！と思い記事を書きました！
最終的には自在に開発できるようになりたいと思っています。:triumph:
いろいろな記事を参考にさせてもらっています。:bow_tone2:
その中でもこれってどういう意味？とかつまづいたところを念入りに書いていこうかと思います。:fist:

# 今回の目的
前回の続きです。今回は「UIの記述」。被る部分もあると思いますが、後で振りかえって深掘りするきっかけになるのが理想です。細かく書くと大変なのであっさりめ。

https://qiita.com/mr_noppo/items/e19172fc58d2f930ac84

# 使用したものや事前準備
・Macbook Pro
・Visual Studio Code

# 主に参考にさせていただいた記事
https://ja.react.dev/learn/your-first-component

# 初めてのコンポーネント

## コンポーネントとは何か
・マークアップはHTML、CSS、JavaScriptが組み合わさってUIができている。Reactでは再利用可能なUI要素にまとめたものをコンポーネントという。
ネスト関係は、レンダーツリーで表現できる。
・コンポーネントは純粋でなくてはいけない。（純関数）常に同じ入力には同じ結果。
Strict Modeは関数の問題にいち早く気づかせてくれる。（必ずしも開発メリットがあるわけではない。）

https://ja.react.dev/learn/keeping-components-pure

## マークアップの書き方
### 今までのWebページの作成方法
コンテンツをマークアップしてからJavaScriptを加える。
### Reactコンポーネント
マークアップを添えることができるJavaScript関数。一度書けば何度でも使える。細かい内容は省略。

# ルートコンポーネントファイル
基本的にはApp.jsのこと。（Next.jsの場合はページごとに異なるなど）

# コンポーネントのインポートとエクスポート
## インポート
コンポーネントをモジュール化し、他のファイルからも再利用可能とする。
デフォルトエクスポートと名前付きエクスポートは記述を分ける。
```react
import Test,{Test2,Test3} from './Test.js';
```
## エクスポート
### デフォルトエクスポート
ファイルに一つしか作れない
### 名前付きエクスポート
幾つでもおける

# JSX でマークアップを記述する
## JSXとは
JavaScriptファイル内にHTMLのようなマークアップをかけるようにするもの。JSの動作で表示されるものが決まるようになり、HTMLも一緒に書けることで関心ごとをまとめることができるようになった。
タグは一つにまとめて返す。（JavaScriptのオブジェクトとして一つにして返さなければいけないから）
閉じタグは必須。
属性名はキャメルケースで。
コンバータを使うのが便利。（AIに聞くのも・・・）

https://transform.tools/html-to-jsx

# JSX に波括弧で JavaScript を含める
下記の書き方でマークアップ内にJavaScriptへ書ける。属性内にも書ける。
属性内でもダブルクォーテーションで囲む（"{Text}")と文字列そのものを渡す。
```React
<div>{Text}<div/>
```
波括弧二つでCSSスタイルを使うことができる。
波括弧二つ目はオブジェクトの意味なので、変数でオブジェクトを渡すやり方でも実現可能。
```React
<ul style={{
      backgroundColor: 'black',
      color: 'pink'
    }}>
```

# Props
オブジェクトや配列、関数などのあらゆるJavaScriptの値を渡すことができる。
イメージタグ（<img>)のsrc属性もProps。
分割代入の中でデフォルト値を書くこともできる。デフォルト値がなくpropsにない場合は、undefinedになる。
```react
<Test obj={{A:'a', B:'b'}} num={100} str={"moji"}>

function Test({obj,num=1000,str}){
}
```

## children
要素を囲みたい時に利用する。
```react
function Outer({children}){
    return (
        <div>{children}</div>
    )
}

functoin Child() {
    return (
        <Outer>
            <div></div>
        </Outer>
    )
}
```

# 条件付きレンダー
論理演算子の右は真偽値にすること（数値にすると0の場合は0が表示される）
```react
// 三項演算子
{isTest ? (<div> {test} </div>) : (<div></div>)}: 
// 論理演算子
{isTest && <div>{test}</div>}
```

# リストのレンダー
## map
リスト内の値を一つずつ処理する。
```react
numbers.map(number => number * number);
```
## filter
条件で抽出する。
```react
numbers.filter(number => number % 2 === 0);
```
## keyの設定
レンダリングした時にどの要素が何を指すか示すためにkeyを設定する。
```react
const items = [
  { id: 1, text: 'アイテム1' },
  { id: 2, text: 'アイテム2' },
  { id: 3, text: 'アイテム3' },
];

function ItemList() {
  return (
    <ul>
      {items.map((item) => (
        <li key={item.id}>{item.text}</li>
      ))}
    </ul>
  );
}
```


# 最後に
全体をまとめるのは難しいですが、少しずつ理解できてくると足りない部分が見えてきて面白いです。:fist:
express-sessionとMemcachedでセッション管理する方法

Node.jsのExpressでセッションを管理したい場合、”express-session”パッケージを使用します。また、サーバー側のセッション情報の保存はMemcachedを使用します。

ローカルの開発環境で動作させるには、Memcachedをインストールして、サービスを起動しておく必要があります。
Macで環境を構築する方法は前回の記事を参照してください。

前回：[Macにmemcachedをインストールする](https://qiita.com/SolitaireEgg/items/01c88221fd4a9fc6d36a "Macにmemcachedをインストールする")

## インストール

Node.jsおよびExpressはインストールされている前提で、新たに下記３つのパッケージをインストールします。

``` console.sh
npm install express-session
npm install memcached
npm install connect-memcached
```

## Expressに設定を追加する

``` app.js
const session = require('express-session');
const MemcachedStore = require('connect-memcached')(session);
app.use(session({
    secret: 'cookie-no-secret_key',  // 任意の文字列に書き換えること
    resave: false,
    saveUninitialized: false,
    cookie: {
        path: '/', 
        httpOnly: true, 
        secure: false, 
        maxAge: 1000 * 60 * 60
    },
    store: new MemcachedStore({
        hosts: ['127.0.0.1:11211'],
        secret: 'server-no-secret_key'  // 任意の文字列に書き換えること
    })
}));
```

2ヶ所あるsecretは（誰にも知られていない文字列に）書き換えてください。

一つ目（session）のsecretはクライアント側（Cookie）を保存する際の暗号化キーです。
二つ目（store）のsecretはサーバー側（Memcached）に値を保存する際の暗号化キーになります。
これら２つのsecretは異なる文字列で問題ありません。
異なる文字列のほうがセキュリティ的には良いと思います。

cookieのmaxAgeはミリ秒単位で指定します。
この例だと、クッキーの有効期間は1時間となります。
指定しない（デフォルト）の場合、クッキーの有効期間はブラウザを閉じるまでとなります。

## 動作チェック

アクセス数をカウントアップするテストページを作ります。

``` app.js
app.get('/test', (req, res) => {
    if(req.session.views){
        req.session.views++;
    }
    else {
        req.session.views = 1;
    }
    res.json({
        'session_id': req.sessionID,
        'views': req.session.views
    });
});
```

ローカルのポート3000番でサーバーを起動して、テストページ（[http://localhost:3000/test](http://localhost:3000/test)）にアクセスしてviewsの値がカウントアップされていれば成功です。
Raspberry Pi pico の Eclipseの μT-Kernel BSPの開発環境(Debian)

使用したパッケージ
eclipse-inst-jre-linux64.tar.gz
xpack-arm-none-eabi-gcc-12.2.1-1.2-linux-x64.tar.gz
xpack-openocd-0.12.0-2-linux-x64.tar.gz

以下の手順で、root以外のユーザーでOpenOCDを使用できるようにする。

plugdevグループにOpenOCDを使用するユーザを追加
sudo useradd -G plugdev $(whoami)

cd /etc/udev/rules.d/
vi 10-my-usb.rules
```
ACTION!="add|change", GOTO="openocd_rules_end"
SUBSYSTEM!="usb|tty|hidraw", GOTO="openocd_rules_end"
# CMSIS-DAP compatible adapters
ATTRS{product}=="*CMSIS-DAP*", MODE="664", GROUP="plugdev"
LABEL="openocd_rules_end"
```
JAMstackを始めて知ったのでフィジビリ用の備忘録

最近セミナーで知ったJAMstackがどんなものなのかを自分なりに整理してみようと思う。

## JAMstackってなに？？
多分JSの何かフレームワーク的な開発環境なんだろうな〜〜と思っていました。
開発環境であることは違いないのですがJSのフレームワークやライブラリではありません。

静的なWebサイトを素早くホスティングサービスやPIを使って
ユーザーに提供するタイプのフロントエンドのWeb開発....

という感じらしい。

静的サイトも最近いろんな要因で重たくなりがちだからめっちゃありがてぇそんな感想を抱きました。
構造的には`JS + api + Markup`なのでそんなに難しい印象もなく、学習コストも低いのかなという印象。



## JAMstackを活用したモダンな制作手法
開発のメリットはこんな感じ
- ビルドによって表示速度を早くできる
- サーバーメンテナンスが不要なので安全に利用できる
- マークアップと開発を同時に行えるので開発が早くできる

メリット良さげ。
サーバーメンテナンス不要なところが特に嬉しいような。

もっと細かくいうとこういう感じ↓

### ①表示速度が速い
これがJAMstackの最大のメリットのように感じた。
事前に生成された（ビルドされた）静的なファイルをサーバーに配信するのでロード時間が短くなるっぽい。

### ②セキュリティの向上
サーバーサイドの実行を必要ないので、コードとコンテンツが事前にビルドされた静的ファイルとして反映される（①のやつ）のでサーバー攻撃や脆弱性のリスクも完全には無くならないが低減できるし、何よりサーバーコストもそんなにかからないかもしれない。


### ③開発が楽
CDN経由で静的ファイルをアップしている感じ。
静的サイトジェネレーター（SSG）を活用すると、ファイルのビルドとデプロイが瞬時にできちゃう。
また、JSのライブラリやフレームワーク（VueとかReactとかnextとか）に柔軟に対応しているので組み合わせ次第では無双できるのでは??と思っています。


ええ....JAMstackなんかよくない???
SSGとかも使えるから、多分next環境よりもお手軽にできちゃうのかも。


## 逆にデメリットっぽいところ
メリット多くてよくなぁい???って思ったけれど、疑り深い私はデメリットも気になっちゃう。

多分だけどデメリットとしては
- 動的コンテンツは制限される?
- 複雑なコンテンツはどこまで管理できる?
ていうのが気になった。

セミナーではSEOには課題があるっておっしゃられていた（記憶がある）。


### ①動的コンテンツの制限
あの....ほんとここからは憶測だらけで恐縮なんですが
「静的」ページに特化しているということはおそらく動的処理は制限かかるのかなー？ていう雰囲気を感じた。
単純に内容によっては動的処理でページ重たくなるのもあるし、
そしたら「高速化された意味なくない?」...って思ったの。

多分...多分なんだけど
例えば
- フォームの処理とかのサーバへのデータ受け渡しとかゴリゴリのサーバーへ情報を渡すバックエンド処理が必要になる機能とか
- パラメータつきURLの動的処理とか

この辺の処理は複雑になるかできなくなるのかのいずれかだと思う。


### ②複雑なコンテンツはどこまで管理できるのか
例えば、LPとか10〜15ページぐらいで、コンテンツ管理する人も一人だけとか。
そんな時はすごく楽なんだろうなって思った。

問題は50ページ以上のサイトとかが来た時とか。
コンテンツもすごく複雑に管理されてる系のサイトの時はどうなのかが気になった。

ページ大きくなれば関わる人も増えるだろうし...このサービスの中でこのサービスの機能を....とか
できても管理が難しくなりそうな予感がした。


## 結局どうなん??
メリットとデメリットも知った上で使うのがよろし。
って至極当然な回答だけども

制作コンテンツによってはむっっっっちゃ楽になると思うし、いいこと多いと思うんだ。
なんたってジェネレータ使えるし開発の幅は自由だと思う。

なので何を作るかによって、開発環境を使い分けられるようにしておくのが得策なのかな。
開発の引き出しを広げるのは良いことだと思った。


JAMstack環境は、もう少し身の回りが落ち着いた時に作ってみようと思う。
ちなみにセミナーではジェネレータでAstroを使った開発をお勧めされていました。
Astro使ったことないのでちょっと気になる。
WinからMacに変えて苦戦中のショートカットキー

### はじめに
XX年の使用歴により指の幅がWin仕様になっており
ペースト（Command + V）しようとしただけなのに
新しいタブを開きまくる（Command + N）こと多々ですが
癖にも負けずMacでよく使うショートカットキーをまとめました。

### 共通

<dl>
  <dt>前面にデスクトップ表示（開いているアプリを全部横によける）</dt>
  <dd>F11</dd>
</dl>
<dl>
  <dt>前面に表示しているウィンドウ切り替え</dt>
  <dd>Command + Tab</dd>
</dl>
<dl>
  <dt>同じアプリ内で前面に表示しているウィンドウ切り替え</dt>
  <dd>Option + Tab</dd>
</dl>
<dl>
  <dt>スクリーンショット</dt>
  <dd>「Shift」「Command」「3」の 3 つのキーを同時に長押し</dd>
</dl>
<dl>
  <dt>画面ロック</dt>
  <dd>Command + Ctrl + q</dd>
</dl>
<dl>
  <dt>ログアウト</dt>
  <dd>Command + Shift + q</dd>
</dl>

:::note warn
ログアウトは画面ロックとよく間違えます！！
（ダイアログ表示で30秒の猶予はある）
:::

### Chrome
<dl>
  <dt>ブラウザのキャッシュ削除</dt>
  <dd>Command + Shift + R</dd>
</dl>

### VSCode
<dl>
  <dt>定義に移動した後、元に戻る</dt>
  <dd>Ctrl + 「-」（0の右隣）</dd>
</dl>
<dl>
  <dt>コメントアウト</dt>
  <dd>Command + 「/」</dd>
</dl>
<dl>
  <dt>UI全体の拡大（not フォントサイズ）</dt>
  <dd>Command + Shift + 「＋」</dd>
</dl>
<dl>
  <dt>UI全体の縮小（not フォントサイズ）</dt>
  <dd>Command + 「-」</dd>
</dl>
<dl>
  <dt>Command + 「z」で取り消してしまったコードを元に戻す（Redo）</dt>
  <dd>デフォルトではCommand + Shift + 「z」</dd>
  <dd>Win同様Command + 「y」にしたい場合は下記記事のように設定を行う</dd>  
</dl>

https://qiita.com/atsushi729/items/21a57857006747fad7e8

### Finder
<dl>
  <dt>パスを指定してディレクトリを表示</dt>
  <dd>Command + Shift + G</dd>
</dl>
<dl>
  <dt>すぐ上の階層のフォルダに移動</dt>
  <dd>Command + 「↑」</dd>
</dl>
<dl>
  <dt>今いるパスをコピー</dt>
  <dd>Option + Command + C</dd>
</dl>
<dl>
  <dt>ファイルやフォルダのパス名をコピー</dt>
  <dd>ファイルを選択した状態で Ctrlを押しながらクリック、あるいはマウスの副ボタンクリック</dd>
</dl>

### Figma
<dl>
  <dt>オブジェクトをコピー&ペースト</dt>
  <dd>Alt または Option を押しながらオブジェクトをクリックしてドラッグ</dd>
</dl>

### DBeaver
<dl>
  <dt>SQL整形</dt>
  <dd>Ctrl + Shift + f</dd>
</dl>

### まだまだ追記予定です
MacOS Sonoma(14)

不要な機能がどんどん追加されていきますね。

## デスクトップをクリックするとウィンドウがどっか行く（デスクトップが表示される）

正式な表記は「**壁紙をクリックしてデスクトップを表示**」の模様。

[デスクトップとDock]　→ [デスクトップとステージマネージャ]に「壁紙をクリックしてデスクトップを表示」で
「ステージマネージャ使用時のみ」にすると、通常時にはこのような挙動をしないようになる

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/90217/7c310e4b-0230-f84e-4e07-444e59a31b13.png)
Renesas TSIP⑤：RX65N上でKUKのWrapped Key計算

## はじめに
TSIPにおいて、Encrypted Keyは暗号化されているもののMCUとの紐づけはありません。デバイスごとのHUKで暗号化され、デバイスとの紐づけが行われた形式のことをWrapped Keyと呼びます。

この記事は、RX65N上でKUKのWrapped Keyを計算するためのものです。
プロビジョニング時に行う操作（のはず）ですが、ここでは簡単にするため、Security Key Management ToolでKUKのラッピングを行い、Cソースで出力した状態を想定します。

## 準備
e2studio でプロジェクトを作成し、FITモジュール r_tsip_rx を組み込んでおきます。

## Wrapped Key計算コード
以下のようにしてKUKのWrapped Keyを計算することができます。
```
#include "r_tsip_rx_if.h"
#include "w-kuk.h"

tsip_update_key_ring_t kuk_wrapped;

void generate_kuk_wrapped_key(void)
{
    R_TSIP_Open(NULL, NULL);

    R_TSIP_GenerateUpdateKeyRingKeyIndex(
        g_encrypted_user_key_data.wufpk,
        g_encrypted_user_key_data.initial_vector,
        g_encrypted_user_key_data.encrypted_user_key,
        &kuk_wrapped);

    R_TSIP_Close();
}
```

w-kuk.h はSecurity Key Management ToolがKUKのラップされた鍵として出力したCソースファイルで、`g_encrypted_user_key_data`を宣言・定義しています。
上記`generate_kuk_wrapped_key`関数を実行することで、`kuk_wrapped` にKUKのWrapped Keyが計算されます。

上記コードのようにCソースファイルとしてSecurity Key Management Toolの出力をファームウェアに取り込むと、この情報をコピーすることでKUKによる操作ができてしまいます。
実際は、Security Key Management Toolの出力をシリアル経由で与え、フラッシュには保存しないなど工夫が必要です。

作成されたKUKのWrapped Keyは、計算ごとに値が変わります。
また、KUKのWrapped Keyをフラッシュに保存しておくことが可能です。Wrapped Keyだけを保存することで、キーのコピーを防ぐことが可能です。

## KUK のWrapped Key利用方法
`R_TSIP_Open`の第二引数にKUK のWrapped Keyを指定することで、KUKで暗号化されたユーザ鍵（Encrypted Key）をMCUに注入で切るようになります。
```
#include "r_tsip_rx_if.h"

/* フラッシュに保存されている想定 */
tsip_update_key_ring_t kuk_wrapped = {...};

void test(void)
{
    R_TSIP_Open(NULL, &kuk_wrapped);

    /* 以後、KUKで暗号化されたユーザ鍵を注入できる　*/
}
```

## ユーザ鍵について
ここまでの設定で、やっとユーザ鍵を安全に配送しMCUに注入できるようになります。
* KUKの平文鍵がPC上に存在する。
* KUKのWrapped KeyがMCU上に存在する。フラッシュがコピーされると利用不可。

次回以降、ユーザ鍵をKUKで暗号化してMCUに注入する方法を見たいと思います。
Google のAI機械学習講座「TensorFlow on Google Cloud」の概要

# 概要
Googleが提供するAI機械学習講座「TensorFlow on Google Cloud」を修了しました。
TensorFlowについて基礎から学べる非常に良い教材でしたのでご紹介します。


# 教材について
タイトル： "TensorFlow on Google Cloud"
URL: https://www.cloudskillsboost.google/paths/17/course_templates/12

# 内容
- TensorFlow 2.x 入力データパイプラインの設計と構築
- TensorFlowとKerasを使用したニューラルネットワークの構築
- Vertex AIを使用したスケーリングトレーニング

# 対象者
初心者から中級者向けですが、後半は非常にチャレンジブルな内容になっています。

# 修了の特典
以下のようなバッジをいただけます。

[修了バッジ](https://partner.cloudskillsboost.google/public_profiles/345c763a-eb71-482b-aca5-0161c3b2de5e/badges/8274481?locale=en "TensorFlow badge")


# まとめ
TensorFlowやKerasについて、基礎から学習できます。
特に勉強になったこととして、Kerasで用意されているSequential モデルを使用すると、比較的容易にモデルを構築することができますが、たとえば本番環境で大量のデータに対して分散処理を行うなどの場合は、TensorFlowを使用する必要があります。
本教材で、TensorFlowでの分散処理について学ぶことができたのは非常に良かったです。


以上
【YOLOv8】特定の領域への侵入検知 自動で領域を設定

# 前書き
現在はプログラムに座標を直接与えて領域を設定しているが、物体認識でコーンを検出しその座標を元に領域を自動で設定する方法について記述する。

# 手法
1. modelの検出結果のlen()をとる。
1. result[i]の中のbox座標をもとにBBoxの中心座標を計算。
1. 結果をリストに格納
1. counter.set_args()に領域の座標をwhile文の中で再代入する。

以上を行うことでコーンを移動するたびに座標が変更されると考える。
せんせー、X線観測ってなに？

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3194265/2c47de5a-d81a-78f9-53c1-4d31d8398c36.png)

キーンコーンカーンコーン...
授業が始まります

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3194265/be1492ca-910f-2708-d0fa-8fcfcf14af73.png)

せんせー、X線観測ってなに？

# X線観測とは

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3194265/da229491-9c49-fb7a-a542-417180e256a7.png)

X線観測は、宇宙から来るX線を捉えて、宇宙の様子を調べる方法だよ。

X線は、光の一種だけど、目に見える光よりもずっとエネルギーが高いんだ。そのため、地球の大気に吸収されてしまって、地上からは観測できないんだよ。

でも、X線は、宇宙の高温のガスや、ブラックホールの周りの物質から発せられているんだ。だから、X線を観測することで、宇宙の激しい現象を研究することができるんだよ。

X線観測には、X線望遠鏡と呼ばれる特殊な望遠鏡を使うんだ。普通の望遠鏡はX線を反射できないから、X線を反射させる特別なミラーを使っているんだよ。

そして、集められたX線は、X線検出器で捉えられて、数値化されるんだ。その数値を分析することで、X線の強さや、エネルギーの分布がわかるんだよ。

X線観測は、地上からはできないから、X線天文衛星と呼ばれる人工衛星に望遠鏡を載せて、宇宙空間で行われているんだ。

これまでに、X線観測によって、ブラックホールの存在が確認されたり、宇宙の大規模構造が明らかになったりしたんだよ。

X線観測は、宇宙の激しくて極端な現象を探る、とってもエキサイティングな天文学の分野なんだ。

杉
X線観測
せんせー、超伝導検出器ってなに？

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3194265/2c47de5a-d81a-78f9-53c1-4d31d8398c36.png)

キーンコーンカーンコーン...
授業が始まります

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3194265/be1492ca-910f-2708-d0fa-8fcfcf14af73.png)

せんせー、超伝導検出器ってなに？

# 超伝導検出器とは

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3194265/da229491-9c49-fb7a-a542-417180e256a7.png)

超伝導検出器は、ごくわずかな エネルギーの変化を感知できる、とても高性能な センサーだよ。

この検出器の主な部分は、超伝導体と呼ばれる特殊な材料でできているんだ。超伝導体は、ある温度より低くなると、電気抵抗がゼロになる性質を持っているんだよ。

そして、超伝導体の温度を上げると、電気抵抗が急に大きくなるんだ。超伝導検出器は、この性質を利用しているんだよ。

検出器に放射線などのエネルギーが当たると、そのエネルギーを吸収して超伝導体の温度が上がるんだ。すると、電気抵抗が大きくなるから、電気信号の変化として検出できるんだよ。

この検出器は、とっても小さなエネルギーの変化も捉えられるから、宇宙から来る非常に弱い電磁波や、素粒子の反応なども観測できるすぐれものなんだ。

例えば、宇宙の始まりに起こったビッグバンの名残を探したり、未知の素粒子を発見したりするのに役立つんだよ。

でも、超伝導検出器を使うには、マイナス270度くらいまで冷やさないといけないから、特別な装置が必要なんだ。

超伝導検出器は、とてもわずかなエネルギーの変化を感知できる、頼もしい技術だね。
ローン返済額シミュレータを作ってみた

# まとめ
- ローン返済シミュレータを作成
- コードは[こちら](https://github.com/yosusi/loan)から
- 今後は繰り上げ返済などにも対応予定

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3740746/d47667b7-3ee9-a521-601b-4c6e97918160.png)

# はじめに
家を買うか考えるときに出てくるのがお金の問題。ローンを組むといっても3000万の話なんてよく分からないので試算をしたいと考えていた。
銀行のサイトでもローンの試算はできるが、どの銀行のサイトもボタンを押して計算が始まるので、再計算が面倒だった。そこで数値をある程度自由に変えながら、月ごとの返済のイメージをつけやすくするためのプログラムを組んでみた。

# 必要ライブラリ
- streamlit
- pandas
- numpy

# できること
- 借入金やボーナス、返済期間などをスライダーで設定して、月々の返済額を計算
- 元利均等計算・元本計算方式に対応
- ボーナス払いも含めて月ごとの返済内訳を可視化
- csvエクスポートにも対応

# 今後やること
- 繰り上げ返済の実装
- 変動金利への対応(3年固定などについても対応予定)
- commit時のgithubアクションのトライ

# 参考サイト
- [元利均等返済の計算サイト](https://mponline.sbi-moneyplaza.co.jp/housingloan/articles/20200903risokukeisan.html)
約数を求める

## はじめに
AtCoderの問題を解いていた時、計算量を減らすコードの書き方を学習しました。

学んだことをアウトプットしようと思い、記事を書きました。

## コード
```Ruby
a = 1000
divisor1 = []
#計算量の多いコード
for i in 1..a do
    if a%i==0
        divisor1<<i
    end
end
```
```Ruby
#計算量の少ないコード
divisor2 = []
a_root = Math.sqrt(a).floor

for i in 1..a_root do
    if a%i==0
        divisor2 << i
        divisor2 << a/i
    end
end
```
## 解説
1000の約数を求めるコードを書いています。

計算量を減らすポイントは平方根を利用することです。

(1,1000),(2,500)などのかけたら1000になる組み合わせのペアを考えます。平方根は整数のペアの小さい数の最大値になります。

つまり、1から平方根までの数を全探索すれば、整数のペアをすべて求めることができます。

そうすることで、コンピューターの計算量を減らして約数を全て求めることができます。
## おわりに
平方根を利用することで計算量を減らす方法を学習しました。この方法は、約数を求めること以外にも応用が利きそうだと感じました。
Renesas TSIP④：Security Key Management Tool によるKUKのEncrypted Key取得

## はじめに
Security Key Management Toolは、UFPKによりKUKを暗号化し、KUKのEncrypted Keyを得ることができます。

## Security Key Management Tool
「鍵のラッピング」タブの「鍵の種類」タブで以下の設定をします。
* 鍵の種類：KUKを選択します。
* ラッピング鍵：UFPKを選択し、UFPKファイルとしてUFPKの平文鍵を、W-UFPKファイルとしてUFPKのEncrypted Keyを指定します。
* 出力：バイナリを選択し、出力ファイル名（.bin）を指定します。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3738861/676db0bf-4482-daed-f286-f8ed0beada52.png)

「鍵データ」タブに移動し、以下の設定をします。
* ファイル：KUKの平文鍵を指定します。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3738861/469ba00e-0dfc-ecad-c8e0-7f56004e5af8.png)

上記設定後、「ファイルを生成する」をクリックすると「出力」に指定したファイルにバイナリ形式で出力が生成されます。
バイナリファイルのフォーマットはドキュメントまたはCソースでの出力に記載があります。
出力形式をCソースにすると以下のようになるはずです（具体的な値は異なる）。
```
const encrypted_user_key_data_t g_encrypted_user_key_data =
{
    /* uint32_t keytype; */
    0x00000000,
    /* uint32_t shared_key_number; */
    0x00000000,
    /* uint8_t wufpk[32]; */
    {
        0x57, 0xEF, 0xD8, 0x49, 0x76, 0x1E, 0x63, 0xE5, 0xA0, 0x5D, 0x9D, 0xA3, 0xF9, 0xF7, 0x51, 0xC0,
        0x8C, 0xF5, 0x0F, 0x53, 0x15, 0x32, 0xC4, 0x8A, 0xCE, 0xF2, 0x43, 0x11, 0x46, 0x7F, 0x04, 0xC3
    },
    /* uint8_t initial_vector[16]; */
    {
        0x31, 0x4F, 0x73, 0x0F, 0xFD, 0xE9, 0xFE, 0x3F, 0xD5, 0x13, 0xA9, 0x55, 0xA5, 0x41, 0x68, 0xF0
    },
    /* uint8_t encrypted_user_key[ENCRYPTED_KEY_BYTE_SIZE]; */
    {
        0x53, 0xDC, 0xD0, 0x82, 0xF7, 0x67, 0x4F, 0x63, 0x06, 0xA5, 0x94, 0x5F, 0xD0, 0x6D, 0x8D, 0x33,
        0xEE, 0x4C, 0x48, 0xEF, 0x14, 0xE4, 0xEC, 0x20, 0x13, 0xCB, 0x8F, 0xE0, 0x83, 0x52, 0x18, 0xD8,
        0x03, 0xD4, 0xC6, 0x58, 0x33, 0x8B, 0xAC, 0x00, 0xC3, 0x2D, 0x5B, 0x24, 0xCF, 0x4A, 0xEB, 0x22
    },
    /* uint8_t crc[4]; */
    {
        0x52, 0x49, 0x87, 0x31
    },
};
```

以下の情報が含まれています（big endian）。
* keytype(32bit)：キー種別ですが、RXの場合使用しません。
* shared_key_index(32bit)：RXの場合0x00000000固定です。
* wufpk(32byte)：UFPKのEncrypted Keyです。
* initial_vector(16byte)：KUKのEncrypted Keyを計算するときに使用されたIVです。
* encrypted_user_key(48byte)：KUKのEncrypted Keyです。
* crc(4byte)：keytype～encrypted_user_keyまでのCRCです。

上記のうちwufpk、initial_vector、encrypted_user_key を入力とし、KUKのWrapped KeyをMCUに計算させることができます。

ファームウェアへの組み込み方法は、以下のような方法が考えられそうです。
* Security Key Management ToolからCソースを出力しファームウェアに組み込む：攻撃者へのキーの漏洩はないものの、フラッシュのコピーによりUFPK、KUKで可能な操作がすべてできる。
* デバイスのプロビジョニング時にSecurity Key Management Toolからのバイナリ出力を読み込み、MCU上でKUKのWrapped Keyを計算・データフラッシュへ書き込む：プロビジョニング操作が必要な代わりに、フラッシュのコピーができない（デバイスごとのHUKで暗号化されるため）。

セキュリティを考えると、KUKのWrapped Keyのみをデータフラッシュに保存することがよさそうです。
せんせー、電子鼻ってなに？

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3194265/2c47de5a-d81a-78f9-53c1-4d31d8398c36.png)

キーンコーンカーンコーン...
授業が始まります

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3194265/be1492ca-910f-2708-d0fa-8fcfcf14af73.png)

せんせー、電子鼻ってなに？

# 電子鼻とは

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3194265/da229491-9c49-fb7a-a542-417180e256a7.png)

電子鼻は、人間の鼻のように、においを感知して識別する装置のことだよ。

人間の鼻には、たくさんのにおいセンサーがあって、それぞれ異なるにおい物質に反応するんだ。電子鼻も、それと似たような仕組みになっているんだよ。

電子鼻の中には、ガスセンサーと呼ばれる部品がたくさん入っていて、それぞれ特定のにおい物質に反応するようにできているんだ。においのある空気が電子鼻に入ると、それぞれのセンサーが反応して電気信号を出すんだよ。

そして、その電気信号のパターンをコンピューターが解析することで、どんなにおいなのかを識別することができるんだ。

電子鼻は、食品の品質管理や、病気の早期発見、危険なガスの検知など、様々な分野で役立つと期待されているんだよ。

例えば、がんになると、体から特有のにおいが出ると言われているんだ。もし電子鼻で、そのにおいを早い段階で発見できれば、早期治療につなげられるかもしれないんだよ。

電子鼻は、人間の鼻の働きを人工的に再現する、とっても面白い技術だね。
せんせー、バイオレゾナンスセラピーってなに？

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3194265/2c47de5a-d81a-78f9-53c1-4d31d8398c36.png)

キーンコーンカーンコーン...
授業が始まります

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3194265/be1492ca-910f-2708-d0fa-8fcfcf14af73.png)

せんせー、バイオレゾナンスセラピーってなに？

# バイオレゾナンスセラピーとは

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3194265/da229491-9c49-fb7a-a542-417180e256a7.png)

バイオレゾナンスセラピーは、体の電磁波を測定し、その情報を使って体の不調を改善しようとする療法だよ。

私たちの体は、細胞が活動することで、ごく微弱な電磁波を出しているんだ。バイオレゾナンスセラピーでは、その電磁波を特別な機械で測定するんだよ。

そして、その機械は、体の不調や病気に関係する異常な電磁波を見つけ出し、それを正常な状態に戻すための電磁波を逆に体に送り返すんだ。

例えば、アレルギーの原因物質に反応する異常な電磁波が見つかったら、その電磁波を打ち消すような電磁波を体に送ることで、アレルギー反応を抑えようとするんだよ。

この療法は、痛みを感じないし、薬を使わないから、体に優しい治療法だと言われているんだ。

でも、科学的にはまだ十分な証拠がないから、効果については意見が分かれているんだよ。

バイオレゾナンスセラピーは、電磁波を使って体を整える、興味深い療法だけど、もっと研究が必要だね。
GAIT受験記

# GAIT試験とは？
[GAIT試験公式ページ](https://www.gait.org/)
> GAIT（ゲイト）は、Global Assessment of Information Technologyの略で、
ITエンジニアのスキルを定量的に評価するための、アセスメントツールです。

とのことです。よくわかんないけどITという広範囲なものをごった煮にした試験をして、「実はこの分野の知識があります（ありました）！」ということを証明する試験見たいです。
ITエンジニア向けとビジネスパーソン向けの2種類があるようですが、私が受験したのはITエンジニア向けのほうです。
スコアは990点満点…TOEICかな？
で、以下の通りにランク付けされるとのこと。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/616564/a8b0c2ff-de90-2819-5576-507613e27671.png)

# 受けた感想
普段Linux（オンプレミス環境）しか触らないので、正直そこ以外の問題を出されたらほぼお手上げ。とはいえ4択なので、ちゃんと選択肢を観察すれば推測できるものも多かった印象です。
全問知識問題なので、知ってるか知らないかを180問ひたすら問われる試験でした。なので、資格試験の勉強を手広くやっていたり、雑多に技術記事読み漁ってる人は点数高めに出るんじゃないかなと思いました。
ITエンジニア向けを受けたものの、「Windowsでファイルをダウンロードしたときのデフォルトのダウンロード先はどこか？」みたいなものも数問出題されました。

公式サイトにサンプル問題が載っており、似たような問題が数問出たので対策しようと思えば多少できそうですが、対策するような試験なのかと言われるとどうなんだろうという思いです（GAITの点数が高いです！っていうのはアピールポイントになるんでしょうか）。
単元としてはやはり昨今の潮流に乗ってかDXだのクラウドだのを問う問題が多かったので、効率的に点数を上げたいならその時流行りの技術を勉強しておくのがよさそうです。テストの点数が高いと嬉しいので、その辺のアンテナを敏感にしていきたいと思います。

なお、[スコアサマリー](https://www.gait.org/wp-content/uploads/2023/04/78be4c9f2bd1b41f929b0dfed237ef8d.pdf)が公式から開示されています。
今回私は415点だったので、見事にボリュームゾーンですね。
~~実は１年前も受験していて、その時は450点くらいでした…今回は480点以上を狙ってたので結構ショック~~

# おわりに
また受ける機会があれば今度こそ480点を取ってみたい。