OmniAICreator/Qiita-1.07M huggingface dataset:
HDLC

>高い効率と信頼性を追求したフラグ同期方式を採用した伝送制御手順です。

### メリット
> * 任意のビットパターンを伝送できる
> * データを連続して転送することができる

> HDLCでは伝送する`データがキャラクタに拘束されない`ため、`任意のビット列をデータとして伝送`することができます。また、HDLCでは`データをフレーム単位で送信`しますが、`受信確認を待たずにフレームを送信する`ことができるため、伝送能力が大幅に向上します。

https://gihyo.jp/book/2023/978-4-297-13865-3

>HDLC (High-level Data Link Control) とは、IBM社が開発したSDLC（Synchronous Data Link Control）が元になっており、ISOによって標準化がされています。`大量かつ、高速なデータ通信に対応`しており、`高能率で信頼性の高い`伝送制御手順です。基本形データ伝送制御手順では、データはキャラクタの連続となりますが、HDLC手順では`任意長のデータの伝送が可能`なため、テキスト以外の多様なデータにも対応します。データはフレームという単位で送られ、相手の応答を待たずに連続して転送されます。また、誤り制御にBCCに比べ、より信頼性の高いCRC方式が使われます。任意のビットパターン伝送が可能で、分岐回線でも全二重通信ができます。

https://www.lineeye.co.jp/html/term_HDLC.html

>HDLCとは、ハイレベルデータリンク制御手順（High-Level Data Link Control）の略称でフレーム同期型の通信プロトコルのことを言います。
`任意のデータ長での伝送が可能で、CRC（Cyclic Redundancy Check）によりデータの誤り検出を行っている`ため信頼性の高いデータ伝送を行うことができます。

https://how.jp/column/tech-explanations/hdlc-yougo#:~:text=HDLC%E3%81%A8%E3%81%AF%E3%80%81%E3%83%8F%E3%82%A4%E3%83%AC%E3%83%99%E3%83%AB%E3%83%87%E3%83%BC%E3%82%BF%E3%83%AA%E3%83%B3%E3%82%AF%E5%88%B6%E5%BE%A1%E6%89%8B%E9%A0%86%EF%BC%88High%2DLevel%20Data%20Link%20Control%EF%BC%89%E3%81%AE%E7%95%A5%E7%A7%B0%E3%81%A7%E3%83%95%E3%83%AC%E3%83%BC%E3%83%A0%E5%90%8C%E6%9C%9F%E5%9E%8B%E3%81%AE%E9%80%9A%E4%BF%A1%E3%83%97%E3%83%AD%E3%83%88%E3%82%B3%E3%83%AB%E3%81%AE%E3%81%93%E3%81%A8%E3%82%92%E8%A8%80%E3%81%84%E3%81%BE%E3%81%99%E3%80%82%0A%E4%BB%BB%E6%84%8F%E3%81%AE%E3%83%87%E3%83%BC%E3%82%BF%E9%95%B7%E3%81%A7%E3%81%AE%E4%BC%9D%E9%80%81%E3%81%8C%E5%8F%AF%E8%83%BD%E3%81%A7%E3%80%81CRC%EF%BC%88Cyclic%20Redundancy%20Check%EF%BC%89%E3%81%AB%E3%82%88%E3%82%8A%E3%83%87%E3%83%BC%E3%82%BF%E3%81%AE%E8%AA%A4%E3%82%8A%E6%A4%9C%E5%87%BA%E3%82%92%E8%A1%8C%E3%81%A3%E3%81%A6%E3%81%84%E3%82%8B%E3%81%9F%E3%82%81%E4%BF%A1%E9%A0%BC%E6%80%A7%E3%81%AE%E9%AB%98%E3%81%84%E3%83%87%E3%83%BC%E3%82%BF%E4%BC%9D%E9%80%81%E3%82%92%E8%A1%8C%E3%81%86%E3%81%93%E3%81%A8%E3%81%8C%E3%81%A7%E3%81%8D%E3%81%BE%E3%81%99%E3%80%82

# 感想
フラグ同期方式やデータの誤りを検出するデータの伝送の規則のセットみたいなものか

https://lineeye.co.jp/html/term_denso_seigyo.html

https://basics.k-labo.work/2017/11/27/%E4%BC%9D%E9%80%81%E5%88%B6%E5%BE%A1/
【Swift】AVCaptureSession 公式ドキュメントのコードをコンパイルできるよう修正してみた

# はじめに
本記事では、Swiftの公式ドキュメント([AVCaptureSession](https://developer.apple.com/documentation/avfoundation/avcapturesession))記載のコードについて、
コンパイルできるよう修正する方法を解説します。

https://developer.apple.com/documentation/avfoundation/avcapturesession

# 開発環境
OS : macOS Sequoia 15.0.1
Xcode : Version 16.0


# 修正前のコード

以下は公式ドキュメント([AVCaptureSession](https://developer.apple.com/documentation/avfoundation/avcapturesession))に記載されているコードです。

```swift:
// Create the capture session.
let captureSession = AVCaptureSession()

// Find the default audio device.
guard let audioDevice = AVCaptureDevice.default(for: .audio) else { return }

do {
    // Wrap the audio device in a capture device input.
    let audioInput = try AVCaptureDeviceInput(device: audioDevice)
    // If the input can be added, add it to the session.
    if captureSession.canAddInput(audioInput) {
        captureSession.addInput(audioInput)
    }
} catch {
    // Configuration failed. Handle error.
}
```
上記のコードは、XCodeにそのままコピペすると、コンパイルエラーが起きます。
きっと、公式ドキュメントでは簡略化された形でコードが記載されているのでしょう。

<br>

**エラー画面**
![スクリーンショット 2024-10-26 14.18.35.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/589104/0cc986f2-91f0-3dfd-fe33-c0069fc37884.png)

## エラーの解決方法
解決すべきコンパイルエラーは以下の２つです。
1. <font color = "red"> Cannot find 'AVCaptureSession' in scope </font>
1.  <font color = "red"> Return invalid outside of a func </font>

#### Cannot find 'AVCaptureSession' in scope

このエラーは`AVCaptureSession`がスコープから参照できないために起こっています。
コードの冒頭に`import AVCaptureSession`を追加することで解決できます。

#### Return invalid outside of a func

これは、guard文の `else { return }` の箇所で起きているエラーです。
`return` には「**関数・メソッド・クロージャのスコープの外では使えない**」といった制限があります。
guard文以下の式をまるごと関数の中に入れてあげると、このエラーを解決することができます。

## 修正後のコード

```diff_swift
// Create the capture session.
+ import AVFoundation
let captureSession = AVCaptureSession()

+ @MainActor
+ func setupAudioInput(){
    // Find the default audio device.
    guard let audioDevice = AVCaptureDevice.default(for: .audio)
    else { return }


    do {
        // Wrap the audio device in a capture device input.
        let audioInput = try AVCaptureDeviceInput(device: audioDevice)
        // If the input can be added, add it to the session.
        if captureSession.canAddInput(audioInput) {
            captureSession.addInput(audioInput)
        }
    } catch {
        // Configuration failed. Handle error.
    }
+ }

```

#### (備考) `func setupAudioInput()` に `@MainActor` をつけている理由

`AVCaptureSession` のインスタンス( **`captureSession`** )は、UIの更新に影響を与える要素であるため、**メインスレッドで動作するように制限されています**。

しかし、`captureSession` を参照している`setupAudioInput`は関数であり、どのスレッドでも実行できてしまいます。

`setupAudioInput` がメインスレッド以外のスレッドで実行されると、参照されている`captureSession`もメインスレッドの外で実行されてしまうことになります。
そうすると、`captureSession` が安全に参照されているか、コンパイルでは確認できません。

そこで、setupAudioに`@MainActor`をつけて、setupAudioが必ずメインスレッドで動作するよう制限しているのです。

# おわりに
説明は以上となります。
読んでいただき、ありがとうございました。
【LXC/LXD】E: パッケージ 'lxd' にはインストール候補がありません

この出力は、`lxd`パッケージがUbuntuのデフォルトリポジトリで見つからないことを示しています。
これは、使用しているUbuntuのバージョンによっては、LXDがSnapパッケージとして提供されている可能性があるためです。

以下の手順を試してみてください

1. まず、Snapがインストールされていることを確認します
   ```
   snap version
   ```
   もしSnapがインストールされていない場合は、以下のコマンドでインストールできます
   ```
   sudo apt install snapd
   ```

2. システムを再起動するか、以下のコマンドを実行してSnapデーモンを起動します
   ```
   sudo systemctl enable --now snapd.socket
   ```

3. LXDをSnapを使ってインストールします
   ```
   sudo snap install lxd
   ```

4. LXDを初期化します
   ```
   sudo lxd init
   ```

5. 現在のユーザーをlxdグループに追加します
   ```
   sudo usermod -aG lxd $USER
   ```

6. 変更を反映させるために、ログアウトして再ログインするか、新しいターミナルセッションを開始してください。

もし上記の方法でもインストールできない場合は、以下の点を確認してください

- Ubuntuのバージョンが最新であることを確認します。
- システムのパッケージリストを更新します：
  ```
  sudo apt update
  ```
- 必要に応じて、LXDの公式PPAを追加することもできます
  ```
  sudo add-apt-repository ppa:ubuntu-lxc/lxd-stable
  sudo apt update
  sudo apt install lxd
  ```
活動設定：ユーザーが複数取引先責任者をToDoと行動に関連付けられるようにする

### 設定箇所
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3894299/0c9d286b-fa59-0d7f-94e3-d4a7cd7c8f30.png)


### ONの場合
管理者はONにできるが、OFFにできない。
OFFにするにはSalesforce社へ問い合わせいが必要

ONにすると、複数人を設定できる
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3894299/075bc6d4-8338-10cb-affe-17ecfc4df934.png)


### OFFの場合は
以下の図のように、複数人の入力ができない
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3894299/39cb5e78-06ea-e96e-72e6-cfaa913c6a97.png)
【LXC/LXD】ubuntuへのインストール手順

# Ubuntuにリナックスコンテナ（LXC/LXD）をインストールする手順

1. **パッケージの更新**
   ```
   sudo apt update
   sudo apt upgrade
   ```

2. **LXDのインストール**
   ```
   sudo apt install lxd
   ```

3. **LXDの初期化**
   ```
   sudo lxd init
   ```
   - これにより対話式のセットアップが開始されます。
   - ほとんどの場合、デフォルト設定で問題ありませんが、ストレージやネットワークの設定をカスタマイズすることもできます。

4. **ユーザーをlxdグループに追加**
   ```
   sudo usermod -aG lxd $USER
   ```
   - 変更を反映させるには、ログアウトして再ログインするか、新しいターミナルセッションを開始してください。

5. **コンテナの作成と起動**
   ```
   lxc launch ubuntu:20.04 mycontainer
   ```
   - これはUbuntu 20.04のコンテナを作成し、「mycontainer」という名前で起動します。

6. **コンテナの一覧表示**
   ```
   lxc list
   ```

7. **コンテナへのアクセス**
   ```
   lxc exec mycontainer -- /bin/bash
   ```

8. **コンテナの停止**
   ```
   lxc stop mycontainer
   ```

9. **コンテナの削除**
   ```
   lxc delete mycontainer
   ```

注意点
- LXDはLXCの改良版で、より使いやすいインターフェースを提供します。
- コンテナの作成には、十分なディスク容量が必要です。
- ネットワーク設定によっては、追加の設定が必要な場合があります。

これらの手順で、UbuntuにLXC/LXDをインストールし、基本的な操作を行うことができます。
同期制御とは

>シリアル伝送では、毎秒何ビット送るかという伝送速度（bps）、データの1単位のビット長など、通信の方式について送信側と受信側が互いに合意している必要があります。そして`受信側は、送信側がデータを送るタイミングに合わせてデータを受信しなければなりません`。もしこの`タイミングがずれたら、データを正しく受信できません`。受信側は、送信側が送り出した最初の1ビットから最後の1ビットまでを、最初の1ビットから最後の1ビットとして正しく受信する必要があります。もし最初の何ビットかを読みこぼし、途中のビットから受信を始めたら、受信データは数ビットずれてしまいます。このようなことが起こらないように、`送信側と受信側が正しくタイミングを合わせることを「同期」`といいます。
>
>同期を取るための一番簡単な方法は、データの信号と並行して、タイミングを合わせるための信号を送ることです。この方法は配線が増えるという問題があるため、距離が離れている通信には実用的ではありません。そこで`伝送データを表す電気信号をうまく利用して、受信用のタイミング信号を受信側で生成`します（図1）。これなら、余計な配線は必要ありません。

https://thinkit.co.jp/story/2015/04/17/5793#:~:text=%E3%82%B7%E3%83%AA%E3%82%A2%E3%83%AB%E4%BC%9D%E9%80%81%E3%81%A7%E3%81%AF,%E5%BF%85%E8%A6%81%E3%81%82%E3%82%8A%E3%81%BE%E3%81%9B%E3%82%93%E3%80%82

# 非同期制御
>`調歩同期方式`とも呼ばれます。データを`キャラクタ単位(通常7または、8ビット)ごとに区切り`、`キャラクタの先頭にスタートビット`、（パリティビット）、`終端にストップビット`を付加して同期をとります。通常、データの無いときはストップビット状態になっていて、スタートビットを検出した時点でキャラクタの受信を行います。受信側で文字単位に同期をとることが出来るので、通信異常の際に全てのデータが失われる危険性は少なくなります。`キャラクタごとにスタートビット、ストップビットを付加するので、データが大きくなり、高速通信には向きません`。パソコンのシリアルポート（RS-232C）はこの方式で通信します。

キャラクタ単位で区切ったデータごとにスタート/ストップビットを間に挟むことでデータを正確に受信できるが、キャラクタごとに検査用ビットを挟むのでデータが大きくなる。

https://www.lineeye.co.jp/html/term_doki.html

# 独立同期方式(SYNC synchronous)
>`キャラクタ単位で同期をとることからキャラクタ同期`、または単に同期方式、あるいは連続同期方式とも呼ばれます。最初に`SYN(SYNchronous idle 同期信号)符号を２個以上送り`、そのあとに、`連続してキャラクタを伝送`します。`メッセージの最後にはトレイリングパッド`を付けます。非同期方式に比べ`データ量が少なくすむため、伝送効率は上がります`が、`SYN符号を検出できなかった場合は、より大きな単位でデータを失う危険性`を持っています。基本形データ伝送制御手順(ベーシック手順)で採用されています。

非同期制御よりも噛ませる検査用ビットがない分データ量が少ない。

https://www.lineeye.co.jp/html/term_doki.html

>キャラクタ同期方式　８ビットで構成されるテキストデータの送信に便利でよく利用されている

https://gihyo.jp/book/2023/978-4-297-13865-3

# フレーム同期方式(frame synchronization)
>特定のビット列で同期をとることから、`ビット同期方式とも`呼ばれます。`データの最初と最後に特定のフラグパターン(HDLCでは01111110のビット列)を付加`して同期をとります。データは、`キャラクタ単位でなく任意長`に送れるので、`テキストデータ以外の伝送、および高速通信に適しています`。フラグパターンとデータを区別するために５つ連続した１の後に０を挿入します。HDLC手順で採用されています

データの大きさが任意調なのでテキスト以外のデータに向いている。
高速通信はなんでできるんだ？

https://www.lineeye.co.jp/html/term_doki.html
> フラグ同期方式　送信するビットは何ビットでも構わない。

https://gihyo.jp/book/2023/978-4-297-13865-3

https://basics.k-labo.work/2017/09/21/%E4%BF%A1%E5%8F%B7%E5%90%8C%E6%9C%9F%E6%96%B9%E5%BC%8F/#:~:text=%E3%81%95%E3%82%8C%E3%81%BE%E3%81%99%E3%80%82-,%E3%83%95%E3%83%AC%E3%83%BC%E3%83%A0%E5%90%8C%E6%9C%9F%E6%96%B9%E5%BC%8F%EF%BC%88%E3%83%95%E3%83%A9%E3%82%B0%E5%90%8C%E6%9C%9F%E6%96%B9%E5%BC%8F%EF%BC%89,-%E3%83%95%E3%83%AC%E3%83%BC%E3%83%A0%E5%90%8C%E6%9C%9F%E6%96%B9%E5%BC%8F

# 感想
CSMA/CDでコリジョン、タイミングを合わせて、同期制御でフレームを正確に送れるようにする

https://www.lineeye.co.jp/html/term_denso_seigyo.html
モデル平均に対する適当考察

# 概要
モデル平均に対して適当考察をし、簡単な実験をしました。

# 背景
最近はエキスパート問題や、boostingと言われる手法について勉強しています。これは、ざっくり言えば複数人から誰を信頼すべきかみたいな問題なのですが、最近これって機械学習のアンサンブル的なアレ(語彙力)なのかな〜みたいなことを適当に考えていました。ただ、今までアンサンブルに関して疑問を持っており、それを示すために簡単な実験をしてみることにしました。正直自明な実験ではありますがまあよいでしょう。
# 疑問
アンサンブルに関して持っている疑問とは、単なる重み付き平均が果たして有意義なものなのかどうかは自明ではないということです。3人よれば文殊の知恵とは言いますが、3人共あまりよくわかっていない(精度がでていない)問題に対して、多数決を取ったところで性能は上がらないと思うわけです。それよりは、それぞれが特定のトピックに対して理解して、サポートし合うほうが有意義ではないでしょうか。
# 実験
1. データが[-1, 1]×[-1, 1]の2次元が一様にサンプリングされるとします。それに対して、x軸、y軸、y=x、y=-xで区切ってやり、8つの領域を作成します。便宜的に、45度ごとに領域0, 1 ,..., 7として、それぞれが得意な予測器も0, 1 ,..., 7とします。
2. 正解ラベルとして、長さ8の配列を考えます。領域iのデータに対しては、要素iに対して80%で1、それ以外に対しては50%で1とします。
4. DNNで、各データに対して、どの予測器を信頼すべきかを学習させます。出力は確率で、損失関数として正解ラベルとの内積(最小化問題なので×-1)を採用します。こうすれば、各学習器の重み×正解率を最適化するため、領域iのデータに対して要素i(分類器i)を信頼するはずです。

コードはこちらです。

https://github.com/tamakoshi2001/ensemble/tree/main

# 結果
結果として、うまく学習できていそうです。45度ごとに領域0, 1 ,..., 7となるわけですが、領域4に対しては予測器4が重み1で信頼されています。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1829579/426aa883-0037-a948-c6ba-5a8f73e62750.png)
# 考察
今回の場合、単一の予測器を全体に対して適応すると、正解率は53.75%になります。また、多数決をとっても、1つの予測器以外は50%でしか当たらないので、それほど正解率は上がりません。ただ、実際にはアンサンブルといって多数決を取っているだけでもうまくいっている例はよく見る気がします。これに対する一つの考察として、多くの予測器は一部にだけ苦手な領域ができるというのがあると思います。そのようであれば、多数決をとることでその領域を補い合えますし、一部なので広いデータ領域でそれがかぶることはそれほどないだろうと考えられます。その場合、それぞれがある程度予測できないと結局はほとんどの領域で意味のない予測をするようになると思います。
また、今回の場合、データは領域に対して密に集まっていますが、次元に応じてデータ空間を密に埋めるために必要なデータ量は次元数乗で大きくなるため、今回の実験の結果が適用できるか怪しいことも考慮すべきだと思います。
ちなみに、実際のboostingはデータに対する重み付けを変更するという手法が取られているようなので、今回とはあまり関係ないようです。残念。

# 追記
今回のアンサンブルのように、アルゴリズムをまとめるメタアルゴリズムに関する研究ってどのくらいなされているんでしょう？
OSカーネルの役割

## はじめに
1日1項目1時間学習の会
今回のテーマは**OSカーネルの役割について**です。

## カーネルとは
「カーネル(Kernel)」は、システム全体に中核部分です。
システム全体を管理し、ハードウェアとアプリケーションの橋渡しをする。

## カーネルの役割

### １.プロセス管理
- CPUを各プロセスに適切に割り当て、並列処理を実現
- プロセスの状態（実行中、待機中、終了）を管理してプロセスの生成・終了を制御する
- プロセス間の競合を防ぐためにスケジューリングを行う

### ２.メモリ管理
- プロセスが使用するメモリの割り当てと解放を行う
- 仮想メモリ機能を提供し、物理メモリが不足してもストレージを一時的にメモリとして使用する
- メモリの保護を行い、プロセス間でのメモリ侵害を防ぐ

### ３.デバイス管理
- キーボード、マウス、ディスク、ネットワークなどのハードウェアをアプリケーションが容易に操作できるようにする
- デバイスドライバを通じて、各種ハードウェアとの通信を行う

### ４.ファイルシステム管理
- ファイルやディレクトリの管理を行い、読み取り・書き込み・削除などの操作をサポートする
- ストレージデバイス上のファイルの整合性を維持し、データの紛失を防ぐ仕組みを提供する

### ５.ネットワーク管理
- データの送受信を管理し、ネットワーク通信を可能にする
- TCP/IPなどの通信プロトコルを実装し、アプリケーションが通信機能を使えるようにする

### ６.セキュリティとアクセス制御
- ユーザーやプロセスに対するアクセス権限を管理し、不正なアクセスを防ぐ
- ユーザー認証、ファイル暗号化、プロセス隔離など、セキュリティ機能を提供する

## 参考
https://job-info.hateblo.jp/entry/2024/01/31/095336

https://udemy.benesse.co.jp/development/what-is-kernel.html
M5Stack CoreS3をMIDIデバイスとしてUSBでPCに認識させる

# 背景

https://qiita.com/yujimny/items/7cb28636d1725c76edd7

https://qiita.com/yujimny/items/5e08b3c8af68f84ff9f1

上記記事を調べているときについでにやってみたことも書いておく。

# やったこと
M5Stack CoreS3をMIDIデバイスとしてUSBでPCに認識させてMIDIイベント送受信する。

+ 焼くときはUSB MODEをUSB-OTG (TinyUSB)にする
+ 焼くときのボード選択では、M5CoreS3 esp32を選択する
+ サンプルコードはesp32の標準のサンプル(Macでは以下のパスに格納されている)

```
(ユーザーディレクトリ)/Library/Arduino15/packages/esp32/hardware/esp32/3.1.0-RC1/libraries/USB/examples/MIDI/
```

例えば、サンプル ReceiveMidi.ino を焼くとPCからのMIDIイベント受信が可能。

※USB-OTGで焼くとシリアルポートの認識名が変更されたり、M5Stackを書き込みモードに入れないと次にソフトを焼くことができなくなったりする。書き込みモードにするには、リセットボタンを3秒長押し、筐体奥の方に見えるLEDが緑色に光ったら長押しを離してUSB接続する。
公式ページに記載

https://docs.m5stack.com/ja/core/CoreS3

> ダウンロードモード: 下部のRSTボタンを3秒長押し（下部のLEDが緑に点灯します。）

※以前の記事にも書いたが、USBポートを使うとSerial.print系ができなくなるためデバッグがちょっと面倒になる。
[個人開発]学習記録アプリの振り返り

## 状況
JISOUというコミュニティでReactの学習を始めて一週間が過ぎました。

Udemyの「【最新ver対応済】モダンJavaScriptの基礎から始める挫折しないためのReact入門」を教材にインプットした後、Reactで簡易的な学習記録アプリを作成しましたので、その振り返りをしたいと思います。

## 使用ツール
* React
* JavaScript
* Vite

### 学習記録アプリの外観
※CSSなどのスタイリングはしていません

<img width="300" alt="スクリーンショット 2023-04-09 7.00.42.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3289947/54428bef-84cc-d8fd-87f6-e8281a866d6b.png">

* 入力フォームの内容をuseStateで反映させる
<img width="300" alt="スクリーンショット 2023-04-09 7.00.42.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3289947/cea51dd1-89d4-bb29-05e6-ba4ef3725176.png">

* 入力値が足りないまま登録すると警告を表示させる
<img width="300" alt="スクリーンショット 2023-04-09 7.00.42.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3289947/7ffd21eb-a03f-256f-0dc6-4c0e9b191b1a.png">

* 登録した内容を一覧にし学習時間を合計して表示する
<img width="300" alt="スクリーンショット 2023-04-09 7.00.42.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3289947/f0052be5-bc62-9e12-4314-6e8c61b42b2c.png">

## アプリを作ってみた所感
Udemyでインプットした後すぐに学習記録アプリ作成に取り掛かったのですが、思っていた半分以下しか記憶に定着していないと感じました。

やはり***インプットした後にアウトプットしないと自分の血肉にならない***と感じました。

何か作るものを決めて、あの構文はどうやって使うんだっけ？このバグはどうやって解消すればいいんだろう？など考えながら手を動かすのは***非常に業務と近く有意義な時間***でした。

アプリ作成中に詰まったりしたところは、Qiitaの記事に投稿することが出来たので、今までエラーに対するネガティブなイメージを***良いアウトプットのネタが出来たとポジティブに捉えられるようになった***のが大きな収穫です。

まだCSSなどのスタイリングは行なっていませんが、これからステップバイステップで良いアプリを作れるよう成長していきたいです。

## JISOUのメンバー募集中
プログラミングコーチングJISOUでは、新たなメンバーを募集しています。
実践的なカリキュラムで、あなたのエンジニアとしてのキャリアを最短で飛躍させましょう！
興味のある方は、ぜひホームページからお気軽にカウンセリングをお申し込みください！
▼▼▼

https://projisou.jp/
M5Stack CoreS3のUSB-CにMIDI Keyboardを接続してMIDIイベントを受信する

# 背景

https://qiita.com/yujimny/items/7cb28636d1725c76edd7

最近、上記記事を書いたが、そもそもM5Stack CoreS3はESP32-S3なのでそれ単体でUSB Hostに対応しているので、USB Hostモジュールなど追加せずとも直接MIDI機器をUSB-Cに挿したらやりたいことができるのでは？とおもいやってみた。

# やったこと

やってみたと言っても、ひたすら調べて結果見つけた以下のサンプルコードを焼いてみたらできた。ESP32S2向けのようだが、M5Stack CoreS3でも動いた。

https://github.com/touchgadget/esp32-usb-host-demos

examples/usbhmidi/usbhmidi.ino

サンプルは割とローレベルのUSB実装がメインでMIDI.hのようなMIDIに特化したことはやっていなく、以下のように受信したMIDIイベントのバイト列をそのままログ表示しているだけにとどまるので実際に作る際にはもう少し使いやすくした方が良さそうだ。

```usbhmidi.ino
uint8_t *const p = transfer->data_buffer;
for (int i = 0; i < transfer->actual_num_bytes; i += 4) {
    if ((p[i] + p[i+1] + p[i+2] + p[i+3]) == 0) break;
    ESP_LOGI("", "midi: %02x %02x %02x %02x",
        p[i], p[i+1], p[i+2], p[i+3]);
}
```

焼くときはUSB MODEをHardware CDC and JTAGにする (USB OTGにする必要はない)

### 注意点
これらを実施するとUSB-C Portを機器との接続使ってしまうため、PCでSerialログが表示できなくなる。
例えば、以下のようにしてデバッグする。
+ M5StackのLCDを使ってログを表示する(手軽だが表示領域が狭い)
+ Serial2にログを出力する。TX pin(M5Stack CoreS3ではG17)をUSB Serial converterのRXに繋いでPCで別ポートとして認識させる

また、M5StackはUSB-Cポートからの給電はしていないのでUSB Hostからの電源供給を前提としている機器は外部から電源供給しないといけないが、給電方法についてもこのサイトのREADMEに書いてある。
【Windows11】netplwizでの自動ログイン時にWindows Helloが要求される場合の対処法

## 概要

Windows11で`netplwiz`を使って自動ログイン設定を行ったにもかかわらず、PC起動時に`Windows Hello`のPINや指紋認証が要求される場合の対処法をまとめました。
これにより、ログイン時に認証をスキップし、その他の場面ではWindows Helloを利用することができました。

### 設定手順

1. 設定＞アカウント＞サインインオプション を開きます
1. サインインオプション内で`Windows Hello`に登録されているPINや指紋などのサインインオプションを削除します
    - 「`MicrosoftアカウントにWindows Helloサインインを要求する`」がオンの場合はオフにします
1. PCを再起動します
    - ここからは、`netplwiz`を使用した自動ログインが成功したことが前提です
1. 再び 設定＞アカウント＞サインインオプション を開きます
1. PINや指紋などの`Windows Hello`を設定し直します
    - 「`MicrosoftアカウントにWindows Helloサインインを要求する`」がオンの場合はオフにします

これで、Windows起動時にはログインパスワードもWindows Helloも要求されない状態になります。
加えて、ログイン以外の認証においてはWindows Helloでの認証も可能です。

### まとめ 

「自動ログイン」が成功している状態で、**改めてWindows Helloを設定しないと**、ログイン時にWindows Helloの認証が要求されるようになるのだと感じました。
この手順を行うことで、自動ログインを有効にしながらWindows Helloの利用がスムーズにすることができます。
Capabilities

[Previous << Access control](https://qiita.com/flowcadence/items/572df270135946f5290e)
[Next >> Interfaces](https://qiita.com/flowcadence/items/765a76e4fac1220ea7d9)

https://qiita.com/flowcadence/items/3073d69c6e9895e68b5a#cadenceの言語仕様を学ぶ

Cadenceは[Object-capability model](https://en.wikipedia.org/wiki/Object-capability_model)を通じて、[Capability-based security](https://en.wikipedia.org/wiki/Capability-based_security)をサポートします。

CadenceにおけるCapabilityとは、オブジェクトに対するアクセス及びそのオブジェクト上で特定の操作を実行する為の権利を表現した値です。一つのCapabilityは、アクセス可能なものは何で、それに対してどのようにアクセス出来るかを示しています。

Capabilityは偽造できず、譲渡可能で、削除可能です。

Capabilityには、ストレージCapabilityとアカウントCapabilityがあります。
* **ストレージCapability**は、[Path](https://qiita.com/flowcadence/items/9767ec3f9b8d757d75bf)を介して、[アカウントストレージ内のオブジェクト](https://qiita.com/flowcadence/items/129d58ae7cb962056c6c)へのアクセスを許可します。
* **アカウントCapability**は、[アカウント](https://qiita.com/flowcadence/items/5ddbb79fe8438850cf57)へのアクセスを許可します。

Capabilityは借用することで、格納されたオブジェクトへの、またはそのオブジェクトが参照するアカウントへの[参照](https://qiita.com/flowcadence/items/115d12a5deafc732636d)を取得できます。

Capabilityは、`Capability<T: &Any>`という型を持ちます。型のパラメータには、Capabilityの借用時に取得できる参照(Reference)の種類を指定します。型は、[Entitlement(権限)](https://qiita.com/flowcadence/items/572df270135946f5290e)により関連付けられた一連のアクセス権を示します。すなわち、Capabilityの参照型は認証されており、与えられた権限が必要とする対象のフィールドや関数にアクセスできる機能群がCapabilityの所有者に与えられています。

例えば、`Capability<auth(SaveValue) &Account>`という型を持つCapabilityはアカウントへのアクセスを許可し、そのアカウントへの値を保存することを(Capabilityの所有者に対して)許可しています。

各CapabilityにはIDがあります。IDは**アカウント即ちアドレス毎**に一意です。

Capabilityは、capability controllerを通じて作成および管理されます。

Capabilityは構造体であるため、コピーが可能です。対象の[capability controller](https://qiita.com/flowcadence/items/b70151356f4e548f2c91)が削除されない限り何回でも使用(借用)できます。

<h1 id="Capability">Capability</h1>

```ruby
access(all)
struct Capability<T: &Any> {
    
    /* The address of the account which the capability targets. */
    access(all)
    let address: Address

    /* The ID of the capability. */
    access(all)
    let id: UInt64

    /** Returns a reference to the targeted object.
      *
      * If the capability is revoked, the function returns nil.
      *
      * If the capability targets an object in account storage,
      * and and no object is stored at the target storage path,
      * the function returns nil.
      *
      * If the targeted object cannot be borrowed using the given type,
      * the function panics.
      */
    access(all)
    view fun borrow(): T?

    /** Returns true if the capability currently targets an object
     *  that satisfies the given type, i.e. could be borrowed using the given type.
     */
    access(all)
    view fun check(): Bool
}
```

翻訳元

https://cadence-lang.org/docs/language/capabilities

***
<b>[Previous << Access control](https://qiita.com/flowcadence/items/572df270135946f5290e)
</b>

[Flow blockchain / Cadence version1.0ドキュメント](https://qiita.com/flowcadence/items/3073d69c6e9895e68b5a) (Capabilities)

<b>[Next >> Interfaces](https://qiita.com/flowcadence/items/765a76e4fac1220ea7d9)</b>
読書感想　絵で見てわかる　システムパフォーマンスの仕組み

# 書籍名「絵で見てわかる　システムパフォーマンス」
著者：小田 圭二、平山 毅、榑松 谷仁、岡田 憲昌

# 読もうと思った動機

パフォーマンス計測で悩んでいたので。
絵が多く、入門者向けに大まかな概要が書かれている本だと思い選びました。
他の本も読んだのですが、詳細に書かれすぎて今の自分には難しかったですね…



# 印象に残った部分

## パフォーマンス計測　p48
目的：パフォーマンス問題対処やパフォーマンス・チューニングは正しい測定から始まる。
　　　誤ったデータを求めると、迷走し問題解決できない。


## ３種類のパフォーマンス情報　p50

### サマリ形式
説明：一定期間の情報を合計もしくは平均で見せる。
長所：概況を抑えやすい。
短所：期間内の変動が把握できない。（細かい部分を見ることができない）

例:sar,vmstatコマンド

### イベント記録形式
説明：個々の出来事（イベント）を逐次記録する形式。
長所：いつ何が起きていたのか、ほぼ全てわかる。
短所：記録したデータ量が多くなる。

例：wireshark

### スナップショット形式
説明：瞬間の状況を記録するものです。
長所：連写することで、パフォーマンストラブルの際に役に立つ
短所：連写していないと役に立ちにくい

例：ps top free コマンド、Windowsのタスクマネージャー

## システムパフォーマンス実例

サーバ名|説明|OS　ソフトウェア
-------|----|-----
Webサーバ|ユーザーからのリクエストに応じたWebサーバとのやり取りや、ユーザー側への画面表示処理を担っているサーバ|Linux Apache
Appサーバ|webサーバーから伝達されたユーザーのリクエストに応じてビジネスロジックを処理するサーバ|Linux JavaVM
DBサーバ|データ管理の役割を担っており、データの検索・作成・追加・削除・更新などの機能を提供しているサーバ|Linux Oracle RDBMS

Web3層構造について
https://dx.nid.co.jp/column/what-is-a-web-application-server#65eac32733b61a4581071fa5-1709886156360

Webサーバとアプリケーションサーバの違い
https://www.nginx.co.jp/resources/glossary/application-server-vs-web-server/

## パフォーマンスチューニング

パフォーマンス・チューニングとは、一般に、利用可能なコンピューティング、ネットワーク、またはストレージ・リソースの再割り振りを行うことによって、システムまたは一組のサービスの価格対パフォーマンス比を改善するためのもの

https://www.ibm.com/docs/ja/zos/2.2.0?topic=environment-what-is-performance-tuning

進め方
アーキテクチャを把握
↓
定石と実践的なテクニックを覚える


# 実践できること or 感想
入門者向けの本です。勉強になりましたね。

４章までは理解できる箇所が多かったです。
計測するには各ミドルウェア、ネットワークの知識はある程度必要ですね。
Webサーバー、DBサーバー、ネットワーク等評価ツール、設定方法などの知識が必要です。
腐りにくい技術かつ実務で使えそうなので、ぜひ身につけたいです。
あとUMLのシーケンス図と相性が良いと思いました。

Chapter5以降のパフォーマンステストの部分が難しかったです。今の私には理解できんところが多かったです。
担当者の数が想定以上に多い。
これ小規模開発でやるん（できるん）ですかね…？

実践することは、計測用の検証環境を作ることです。
検証方法の用意の仕方としては、Dockerでpostgresql、nginxを立てて実際に測ってみます。
本当はオンプレでできたらベストなのですが…物理ハード用意するの個人的に敷居高いんですよねorz

https://github.com/RYA234/External_Collaboration
ターミナルに出力方法

## ターミナルに出力方法
macの場合：gccをインストール
windowsの場合：C C++をインストール

**手順**
デスクトップに'sample'のファイルを作成
`cd Desktop`でデスクトップのディレクトリーへ移動
`gcc 〇〇.c`で実行ファイルを作成→a.outの実行ファイルを作成

:::note warn
書いたコードは設計図
実行ファイルは設計図をもとに組み立てられたプログラム
設計図だけではプログラム処理が行うことは出来ない
:::

`/a.out`でプログラム処理し、出力

:::note warn
C言語でプログラムをターミナルに出力する際、**毎回実行ファイルを作成する必要があるのは、C言語がコンパイル言語だから**
:::

:::note
コンパイル言語の仕組み
:::
C言語は「**コンパイラ言語**」と呼ばれ、プログラムを実行するために、ソースコードをコンパイラによって**機械語**（コンピュータが理解できるバイナリ形式）に変換する必要があります。この変換の過程で生成されるのが**実行ファイル**です。

**結論**ターミナルでプログラムを実行する際は、**必ず実行ファイルを生成してから実行**します。これは、ソースコードを直接実行できず、機械語に変換してから実行する必要があるためです。

実行ファイルの作成と実行を合わせて行う
**`gcc -o sample sample.c && ./sample`**

`-o`
出力ファイルの名前を指定するオプション→sample
`sample.c`
コンパイル対象のC言語のソースファイル
`&&`
前のコマンドが正常に終了した場合に次のコマンドが実行される（繋げ役）
`./sample`
実行ファイルsampleを実行

:::note
コンパイルとは
:::
コンパイルというのは、コンピュータが理解できる言葉にプログラムの内容を翻訳すること

プログラムは人間が分かりやすく英語や数字の文字で書かれています。しかし、コンピュータはそれらだけでは、理解できません。そこで**コンパイラ**という翻訳者が私たちの書いた文字をコンピュータが理解できる**0や1の形に**に変えてくれます。
Conventional Commitsとは？

# 概要
**「人間と機会が読みやすく、意味のあるコミットメッセージにするための仕様」である**

- コミットメッセージのための軽量の規約
- 明示的なコミット履歴を作成するための簡単なルール
- この規則に従うことで、自動化ツールの導入を簡単にする
- コミットメッセージで機能追加・修正・破壊的変更などを説明することで、**Semantic Versioning**と協調動作することができる

# コミットメッセージの形式
```
<type>[optional scope]: <description>

[optional body]

[optional footer]
```
- **type:** コミットの種類を表す（例: feat, fix, docsなど）
- **scope:** 変更が影響する範囲（オプション、例: login, api）
- **description:** 簡潔な変更内容の説明
- **body:** 詳細な説明（オプション）
- **footer:** 例として、関連するIssue番号やBREAKING CHANGEを示す（オプション）

# Type一覧
|Type| 説明|
|--|--|
|feat| 新機能の追加|
|fix|バグ修正|
|docs|ドキュメントの更新|
|style|コードフォーマットの変更|
|refactor|コードのリファクタリング|
|test|テストの追加や修正|
|chore|ビルドプロセスや補助ツールの変更|
1. `fix`：コードベースのバグにパッチを当てる
1. `feat`：コードベースに新しい機能を追加する
1. `BREAKING CHANGE` or `!`：APIの破壊的変更を導入する
1. `それ以外の型`：Angular の規約が基になっているものとして以下がある
```
- build
- chore
- ci
- docs
- style
- refactor
- perf
- test
```

# 破壊的変更への対応
#### 破壊的変更は、コミットメッセージで「!」を型に追加（例: feat!:）するか、フッターにBREAKING CHANGE:を記載すること
- 破壊的変更（breaking changes）は、以前のバージョンと互換性がなく、既存のコードや機能に影響を与える変更を指す
- これは、APIの変更、メソッドの削除、または動作の根本的な変更など、ユーザーがコードを更新する必要がある場合に該当します


# 使えそうなツール
|ツール名|説明|他ツールとの関係|
|--|--|--|
|Commitizen|コマンドラインでConventional Commits形式のコミットメッセージを作成可能 ([Commitizen](https://commitizen-tools.github.io/commitizen/))|commitlintで作成したメッセージを検証([commitlint](https://commitlint.js.org/))||
|commitlint|コミットメッセージの形式を検証|Huskyと統合し、コミット前にチェック可能
|Husky|Gitフックを使ってコミットメッセージの形式を検証 ([Husky](https://typicode.github.io/husky/))|commitlintをpre-commitフックに設定|
|Semantic Release|コミットメッセージに基づき、バージョンを自動更新し、CHANGELOGを生成 ([Semantic Release]())|commitlintで検証されたメッセージを基に動作|

#### ワークフローの例
1. 開発者はCommitizenを使って、git czでコミットメッセージを作成（例: feat: 新機能の追加）
1. Huskyがpre-commitフックをトリガーし、commitlintを実行。メッセージがConventional Commits形式でない場合、コミットを拒否
1. コミットが成功すると、コミット履歴が蓄積。リリース時にSemantic Releaseが実行され、コミットメッセージに基づいてバージョン（例: 1.0.0 → 1.1.0）を自動更新し、リリースノートを生成


# 使用例

##### タイトルおよび破壊的変更のフッターを持つコミットメッセージ
```
feat: allow provided config object to extend other configs

BREAKING CHANGE: `extends` key in config file is now used for extending other config files
```


##### 破壊的変更を目立たせるために ! を持つコミットメッセージ**
```
feat!: send an email to the customer when a product is shipped
```

##### スコープおよび破壊的変更を目立たせるための ! を持つコミットメッセージ
```
feat(api)!: send an email to the customer when a product is shipped
```

##### ! と BREAKING CHANGE フッターの両方を持つコミットメッセージ
```
chore!: drop support for Node 6

BREAKING CHANGE: use JavaScript features not available in Node 6.
```

##### 本文を持たないコミットメッセージ
```
docs: correct spelling of CHANGELOG
```

### スコープを持つコミットメッセージ
```
feat(lang): add polish language
```

### 複数段落からなる本文と複数のフッターを持ったコミットメッセージ

```
fix: prevent racing of requests

Introduce a request id and a reference to latest request. Dismiss
incoming responses other than from latest request.

Remove timeouts which were used to mitigate the racing issue but are
obsolete now.

Reviewed-by: Z
Refs: #123
```

## 参考
https://www.conventionalcommits.org/ja/v1.0.0/ 

https://zenn.dev/wakamsha/articles/about-conventional-commits
Claude 3.5シリーズ登場！新機能とアップデート内容を徹底解説

# Claude 3.5シリーズ登場！新機能とアップデート内容を徹底解説

最近AI関連のアップデートが話題になっていますが、今回はAnthropic社が発表した新しいAIモデル「Claude 3.5」シリーズについて、詳しく解説していきたいと思います。新しいモデル以外に、特に注目したい新機能として「computer use」という機能もリリースされましたので、こちらについても一緒に記事にまとめてみました。

## Claude 3.5シリーズとは？

まず、Anthropic社が新たに発表したAIモデルとして、「Claude 3.5 Sonnet」と「Claude 3.5 Haiku」という2つのモデルがリリースされました。「Claude 3.5 Sonnet」については同じ名称の従来モデルから性能がアップデートされた位置づけになり、「Claude 3.5 Haiku」は従来モデルから大幅な性能向上を実現し、特にコーディングやツール使用の能力が飛躍的に向上しています。

## Claude 3.5 Sonnetの特徴

### 驚異的なコーディング能力
Claude 3.5 Sonnetは、プログラミングの分野で特筆すべき進化を遂げました。業界で認められているベンチマーク「SWE-bench Verified」において、49.0%という高いスコアを達成しています。これは、実際のソフトウェアエンジニアリングのタスクにおいて、より正確で信頼性の高いコードを生成できることを意味します。

### ツール使用能力の向上
ビジネスシーンでの実用性を示すTAU-benchでも、素晴らしい成績を収めています：
- 小売分野：69.2%のスコア
- 航空分野：46.0%のスコア

これらの数字は、実際のビジネス現場での活用において、より効果的なサポートが可能になったことを示しています。

### コストパフォーマンス
価格と処理速度については、前バージョンと同等レベルを維持しながら、より高度な機能を提供することに成功しています。これにより、既存のユーザーは追加コストなしで、より高性能なAIツールを利用できるようになりました。

## Claude 3.5 Haikuの特徴

### 高速・低コストの実現
Claude 3.5 Haikuは、Claude 3 Opusと同等の性能を保ちながら、処理速度の向上とコストの削減を実現しました。特に以下の点が注目のポイントとなります。

- より高速な応答性能
- 低コストでの運用が可能
- 効率的なリソース使用

### 優れたコーディング性能
SWE-bench Verifiedにおいて40.6%のスコアを達成し、コンパクトなモデルながら高い性能を発揮します。これは、開発現場での実用に十分な性能といえます。

## 革新的な新機能「computer use」

### computer useとは？
今回のアップデートで最も注目すべき新機能が「computer use」です。この機能により、AIが人間のようにコンピュータを操作できるようになりました。具体的には以下のような操作が可能になります。

- スクリーン表示の確認
- カーソルの移動
- ボタンのクリック
- テキストの入力
- 基本的なコンピュータ操作

### ベンチマーク性能
OSWorldベンチマークのスクリーンショットのみのカテゴリーで14.9%のスコアを達成しており、まだ発展途上ながら、大きな可能性を秘めた機能といえます。

### 実用例と活用方法
computer use機能を使用することで、以下のようなタスクが可能になります。

- Webブラウジングの自動化
- アプリケーションの操作
- データ入力作業の効率化
- ユーザーインターフェースのテスト

## 安全性への取り組み

### 責任あるスケーリングポリシー
computer use機能が発表されたということはAIを使用する上での安全性が気になるところですが、Anthropic社は、AIの発展と同時に安全性も重視しています。新たに更新された責任あるスケーリングポリシー（RSP）には、以下の要素が含まれています。

- AIリスク管理の強化
- 段階的な安全対策の実施
- 業界標準に基づく運用指針

### ASLスタンダード
現在のモデルは、ASL-2（AI Safety Level 2）スタンダードで運用されています。

これにより、

- 安全性の確保
- リスクの最小化
- 透明性の維持

が実現されています。

## 実務での活用シーン

では、これらのモデルが実務でどのように役に立つかを見ていきましょう。一般的には下記のような業務タスクの負荷を軽減してくれると考えられています。

### プログラミング・開発
- コード生成の効率化
- バグ修正のサポート
- テストコードの作成
- ドキュメント作成の自動化

### ビジネス利用
- データ分析
- レポート作成
- 業務プロセスの自動化
- カスタマーサポート

### 教育分野
- プログラミング学習のサポート
- 教材作成の効率化
- 学習進捗の管理
- 個別指導の補助

## 今後の展開と期待

### リリーススケジュール
Claude 3.5 Haikuは今月後半にリリースされる予定です。これにより、より多くのユーザーが高性能なAIツールを利用できるようになります。

### 機能の改善予定
computer use機能は現在ベータ版であり、今後以下のような改善が期待されています。
- より複雑な操作への対応
- 操作精度の向上
- 新しいユースケースの開発
- フィードバックに基づく機能拡張

### 開発者コミュニティとの連携
Anthropic社は、開発者からのフィードバックを積極的に取り入れ、継続的な改善を進めていく方針です。これにより、以下のようなメリットが期待されています。

- より実用的な機能の追加
- バグの修正
- パフォーマンスの向上


## まとめ

Claude 3.5シリーズは、AIの新時代を切り開く画期的なアップデートといえます。特にこれらの特徴がより多くの場面でAIの活用が可能になることが期待されます。

1. コーディング能力の大幅な向上
2. 革新的なcomputer use機能の導入
3. 安全性と実用性の両立

また、Anthropic社の責任ある開発姿勢は、AIの健全な発展に向けた重要な取り組みとして評価できます。今後のアップデートや機能改善にも大きな期待が寄せられています。

初心者の方々にとっても、これらの新機能や改善は、AIをより身近に、より使いやすくするものとなるでしょう。特にcomputer use機能は、AIとの新しい関わり方を提示する可能性を秘めています。

今後も引き続き、Claude 3.5シリーズの進化に注目していきたいと思います。皆さんも、これらの新機能を活用して、より効率的で創造的な作業に取り組んでみてはいかがでしょうか。
【ChatGPT】「逆転発想」と「ペルソナ設定」を組み合わせた意見抽出Prompt。


　どうも、カーブミラーです。

　今回は、「逆転発想」と「ペルソナ設定」を組み合わせて、新たな視点からの意見を得るPromptです。

:::note info
本記事は、ChatGPT（有料版）
で行なっております。画像は
ありません。　あしからず。
:::
　ニュースはないので、
　　さっそく本題に入ります。

　今回は、
　　「逆転発想」と「ペルソナ設定」を
　　　組み合わせて、
　　　　新たな視点からの意見を
　　　　　得るPromptです。

```Text:意見抽出Prompt
逆転発想とペルソナ設定を用いて「＊＊＊」について考えて
```

　これは
　　X-Twitterで木内さんが
　　　ポストされたものです。
[木内翔大さんポスト](https://x.com/shota7180/status/1849956841242919057?t=O-kNKrougmfvEj5vfsb0Lw&s=19)


　実行すると
　　ひとりの人物が設定され、
　　　＊＊＊についての
　　　　逆転の発想を抽出します。
　　　　　最後に、まとめが出ます。

　ちなみに、
　　「ペルソナ設定」に
　　　“（？人）”を付け加えることで、
　　　　複数の意見が抽出できます。

　みなさんの
　　作品制作の糧に
　　　なれば、幸いです。

　今回は、ここまで。
入力フォームで数値を入力する際はparseIntを使用する（JavaScript, React）

## 状況
* JavaScriptで入力フォームから数値を入力する
* 入力フォームから受け取った数値を合計する

※コメントでご指摘を頂き、parseIntだと文字列によって誤った値を返す恐れがあるので、Number()や単項プラスを使う方が良いとのことです。

parseIntだと整数専用なので、Number()や単項プラスを使用して文字列全体を数値として扱ったほうが誤った変換を防ぐことが出来ます。

## parseIntを使わない場合の問題点
* 入力フォームで数値を入力して送信した場合、JavaScriptが動的にstring（文字列）型に変換してしまう
* 入力した数値がstring型だと何が良くないのか？
    * string型のまま数値を合計しようとすると文字列の連結を起こしてしまう
```javascript
例:string型での足し算
const str1 = "1";
const str2 = "2";

console.log(str1 + str2);

12
```

## parseIntの使い方
```javascript
    parseInt('5', 10)
    >> 5
    // 文字列から数値に変換されている
```
* parseIntの第一引数に数値に変換したい文字列、第二引数に基数を入力する
    * 基数を10にした場合、10進数で変換される

```react
<input
          type="number"
          value={time}
          min="0"
          onChange={(e) => setTime(parseInt(e.target.value, 10))}
/>
```
* Reactの入力フォームでparseIntを使用する例
    * onChange属性で入力フォームのイベントが発火されたときに、文字列ではなく数値としてuseStateにセットする

## まとめ
JavaScriptで入力フォームから数値を送信する際は、そのままでは文字列に変換されるのでparseIntを使用し数値に変換する
テスト駆動開発って何？（触りだけ）

# 概要
JUnitについて学んでいる中で、テスト駆動開発という言葉が気になったのでキーワードをまとめてみました。

# テスト駆動開発（TDD）とは
テストを積極的に設計のためにも使い、コーディングをより良くする手法。リファクタリングに寄与させるためのスキル。開発と改善を回していく。テストファーストというキーワードは、その手順の一部でしかない。

# キーワード
1. テストファースト
1. テストは「独立」しているべき
1. 実装手法は、仮実装、一発実装、三角測量（数打ちゃ当たる）の順が基本
1. Red、Green、Refactoring
1. TODOリストを作りながら「小さく」進める
1. 小さな割り込みを楽しむ
1. FIRST
1. Right-BICEP
1. CORRECT

# テスト駆動開発の手順
1. テストを作成する
1. テストを失敗させる
1. 値のベタ書きや最低限の実装でテストを成功させる（仮実装）・あるいは最初から分かるなら一発で実装する（一発実装）
1. リファクタリングする

# テスト対象の優先順序
1. ループ
1. 条件分岐
1. null、0、empty

# 個々のテストの手順
1. Arrange（設定・準備）
1. Act（操作）
1. Assert（アサーション）

# 参考文献
- テスト駆動開発/Kent Beck 著, 和田 卓人 訳/オーム社
- 実践JUnit/Jeff Langr 著, Andy Hunt 著, Dave Thomas 著, 牧野 聡 訳 /オライリー・ジャパン
Git概要

# Gitとはバージョン管理システムの一つ。
そもそも「バージョン管理システム」とは何なのか。「バージョン管理」とは、コードを管理するだけでなく、誰がいつどの部分を編集したのかが一目で分かる管理システムのこと。つまり、これを使用すれば、複数人で同じファイルを編集できる他、もし万が一間違えて更新してしまっても、前のデータにも戻ることが可能。また、どれが最新データなのか他の人に聞かなくても、Gitにアクセスすれば一目でどのデータが最新なのか、誰が編集したのかが分かる、便利な管理システム。

# Gitの特徴
データを分散して保存することができる仕組みを持っている。
他のバージョン管理システムは「集中型」で一つの場所でデータを保存する仕組みだが、Gitに関しては、「分散型」の仕組みを取っており、ローカル上とサーバー上で管理することができる。また、この保管場所のことを「リポジトリ」という。「リポジトリ（貯蔵庫）」は2種類あり、「リモートリポジトリ」と「ローカルリポジトリ」。この仕組みを採用することで、どこか一つのリポジトリが機能しなくなっても、他のリポジトリが使用可能であれば、すぐにデータを使用することができる。
reduceメソッドで配列の合計値を取得する（JavaScript）

## 状況
* JavaScriptで配列の合計値を取得したい
* for文のようなループ処理は使用せずワンラインで記述したい

## 配列の合計値を取得する記述
```javascript
const array = [1, 2, 3];

const result = array.reduce((sum, current) => sum + current, 0); 
console.log(result);

6
```
## 解説
* 処理の流れ
    ※引数のsum, currentは自身で好きな名前を使用できる
    1. 初期値を0に設定しているので、累積値であるsumに代入される
    1. currentに配列の要素が一つずつ代入され、sumと足し算される
    1. 配列の全ての要素がsumと足し算されるとresultに代入される
        sumは累積値なので、
        0 + 1 = 1
        1 + 2 = 3
        3 + 3 = 6
        といった増え方をする
Process PoolExecutorの基本の使い方

### **並行処理（Concurrency）とは？**

並行処理とは、コンピュータが複数の作業を同時に実行することです。例えば、ゲームをしながら音楽を聴くことができるのは、コンピュータが同時に複数の処理をこなしているからです。

### **マルチスレッドとマルチプロセスの違い**

- **マルチスレッド**: 1つのプログラム内で複数のスレッドが同時に動きます。スレッドはメモリを共有し、データをやり取りしやすいですが、1つのCPUしか使えません。
- **マルチプロセス**: プログラムを複数のプロセスに分けて並列に実行します。プロセスは独立して動き、複数のCPUを利用できるため、より多くの計算を同時に行えます。ただし、プロセス間でのデータのやり取りはスレッドより難しくなります。

![python_august_info.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/208980/bd36b40b-d74d-eab9-21fb-34a372141861.png)


https://blog.stepskochi.com/multi-processing-vs-multi-threading/

### **`from concurrent.futures` を使う文法**

`concurrent.futures` モジュールは、スレッド（`ThreadPoolExecutor`）とプロセス（`ProcessPoolExecutor`）の両方を使って並行処理や並列処理を簡単に行うことができます。`submit()` や `map()` メソッドを使うことで、関数を並行に実行し、結果を効率的に収集できます。

### **`import multiprocessing` との違い**

- `import multiprocessing` は低レベルなプロセス管理を行いますが、`concurrent.futures` は高レベルなインターフェースで、使いやすく設計されています。
- `concurrent.futures` では、スレッドとプロセスの両方の管理が統一された文法で行えるため、コードの可読性が向上します。

### **例題 1: マルチスレッドを使った並行処理**

まず、`ThreadPoolExecutor` を使った並行処理の例を見てみましょう。

```python
from concurrent.futures import ThreadPoolExecutor
import time

def func_1(x):
    for n in range(3):
        time.sleep(1)
        print(f"func_1 - {n} ({x})")
    return f"result - {x}"

def main():
    print("start")
    # スレッドプールを作成し、最大4つのスレッドで並行処理を実行
    with ThreadPoolExecutor(max_workers=4) as executor:
        results = executor.map(func_1, ["A", "B", "C", "D"])

    print(list(results))
    print("end")

if __name__ == "__main__":
    main()
```

#### **解説**

- **`ThreadPoolExecutor(max_workers=4)`** は、4つのスレッドを同時に作成し、それぞれが `func_1` を並行に実行します。
- **`executor.map(func_1, ["A", "B", "C", "D"])`** は、リスト内の要素を `func_1` に渡し、各スレッドで実行します。
- `map()` の結果はリストにまとめられます。

### **例題 2: マルチプロセスを使った並列処理**

次に、`ProcessPoolExecutor` を使った並列処理の例を見てみましょう。

```python
from concurrent.futures import ProcessPoolExecutor
import time

def func_2(x, y):
    for n in range(3):
        time.sleep(1)
        print(f"func_2 - {n} ({x}, {y})")
    return f"result - ({x}, {y})"

def main():
    print("start")
    # プロセスプールを作成し、最大2つのプロセスで並列処理を実行
    with ProcessPoolExecutor(max_workers=2) as executor:
        results = executor.map(func_2, ["A", "B"], ["X", "Y"])

    print(list(results))
    print("end")

if __name__ == "__main__":
    main()
```

#### **解説**

- **`ProcessPoolExecutor(max_workers=2)`** は、最大2つのプロセスを同時に作成します。
- **`executor.map(func_2, ["A", "B"], ["X", "Y"])`** は、`func_2` に ["A", "B"] と ["X", "Y"] の引数を渡し、並列に実行します。
- 各プロセスが独立して動作するため、複数のCPUコアを使って処理が行われます。

### **まとめ: 並行処理と並列処理の統一された使い方**

- `concurrent.futures` を使うことで、並行処理と並列処理を同じ構造で扱えます。
- `submit()` と `map()` を使えば、どちらの方法でも効率的にタスクを実行できます。
- スレッドとプロセスを使い分けることで、プログラムの実行速度や効率を大きく向上させることができます。



### 参考資料

https://qiita.com/kotai2003/items/2ac0b31245bb0d59a7ec

並列処理の基本を解説！マルチスレッド・マルチプロセスをconcurrent futuresで実装！
https://youtu.be/et-cDFbVkQw?si=byW5UavN_Go-lKz0
見て楽しむバブルソート

高井です。今回はバブルソートを見て気持ち良くなりましょう！

# バブルソートって何？
バラバラに並んでいるデータを小さい順(大きい順)に並び替えることを**ソート**と呼びます。

バブルソートは
**「隣の要素と比較して、順番が逆なら入れ替える」を繰り返して並び替える**
手法のことです。

### たとえば
例えば4つの要素を小さい順に並び替えるとき
+ 1番目と2番目の要素を比べて、1番目の要素の値のほうが大きかったら入れ替える
+ 2番目と3番目の要素を比べて、2番目の要素の値のほうが大きかったら入れ替える
+ 3番目と4番目の要素を比べて、3番目の要素の値のほうが大きかったら入れ替える

これで4番目の要素は最大のものになっています。**4番目の値が確定しました。**

次に、確定している4番目の要素以外を並び替えます。
+ 1番目と2番目の要素を比べて、1番目の要素の値のほうが大きかったら入れ替える
+ 2番目と3番目の要素を比べて、2番目の要素の値のほうが大きかったら入れ替える

これで**3番目の値も確定しました。**

これを全要素確定するまで繰り返します。

### メリットとデメリット
メリットは仕組みが単純なことです。言葉で説明するのも簡単だし、実装しやすいです。

デメリットはというと、時間がかかることです。
バブルソートを改良して、もっと早く処理できるものが作られたりしています。

### なんで「バブル」なの？
ソートの過程でデータが移動する様子が泡のように見えるからそう呼ばれるそうです。
ポエミーだなあ。

# 見てみたい
言葉で説明されてもピンとこないというか…見てみたいですよね。

**ソートの過程でデータが移動する様子が泡のよう**になっているのも見てみたいし。

あと、乱雑だったものがきれいに並ぶのを見るのって気持ちいいですから。

# 作ってみた
というわけでProcessingで作ってみました。
確定したデータは赤、未確定のところは青で表示されます。

https://openprocessing.org/sketch/2370636/embed/

正直、泡にはあんまり見えないですけど、気持ちいい感はありますね！

以上、高井でした:art:
Git BASHでtmux

Git BASHでTmuxを利用できるかなと思い、以下を実行しました。通常は、GitのコマンドやVSCodeのターミナルでシステム管理コマンドが実行できれば十分なのですが、興味本位でやってみました。ご参考まで。

# Git BASH アップデイト
Git BASHはMsys2(Cygwinの簡易版)を利用していて、コンパイラはMINGW GCC Compilerを利用しています。つまり想定では、Msys2でコンパイルされたものは、Git BASHでも利用できるはずです。

https://github.com/git-for-windows/git/wiki/The-difference-between-MINGW-and-MSYS2

但し、今回試しましたが、バージョンによっては、稼働しない場合があるので、すべて最新版にアップデイトします。以下からダウンロードして、アップデイトしてください。

https://git-scm.com/downloads

# Tmux側のダウンロード

64bit版を利用していますので、ここから以下のファイルをダウンロードします。

https://repo.msys2.org/msys/x86_64/

ファイルバージョンは最新版になりますので、番号は順次変わっています。

https://repo.msys2.org/msys/x86_64/libevent-2.1.12-4-x86_64.pkg.tar.zst
https://repo.msys2.org/msys/x86_64/tmux-3.4-1-x86_64.pkg.tar.zst

7-zip等で解凍してください。

https://www.7-zip.org/

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/283070/2310b634-a934-6cde-a59c-6518a2fc430d.png)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/283070/f0232f65-1ade-b2e4-c99b-f0e6bf09df5d.png)



そのファイルを以下にコピーしてください。
```bash
/c/'Program Files'/Git/user/bin
```

# Tmuxの立ち上げ

Git のターミナルを閉じて、新しいインスタンスを立ち上げて以下を実行します。

```bash
>tmux
```

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/283070/1728c4b1-868e-0062-e1d6-9b10b2bf4889.png)

いつものtmuxの画面になります。

今回は以上になります。おそらくやりすぎだと思います。Tmuxでコンソール管理や開発を実行したいのであれば、WSLやDockerを導入した方が良さそうです。

Happy Hacking!!!
【満ち欠けメンコ】Googleのゲームが運ゲーだという話


## そのゲーム

https://www.google.com/webhp?ddllb=1&doodle=350977392&hl=ja

## 基本的な考え方

とにかく相手の手を潰しつつ、点数を稼ぐことを意識する。
相手にリードされると巻き返すことはかなり難しい。

また満ち欠けメンコに十分に注意すること。

意識レベルはこんな感じ。

自分の点数を稼ぐ > 相手の手を潰す >>>>>>>>>>>>>> 満ち欠けメンコをする

## 攻略のヒント

### ダブル役

ダブルで役が確定する場合は愚直にとるべき。（ただし満ち欠けの場合は例外）
また、手札に関連札がない場合は逆に相手のダブル役を阻止することを考慮すること。

### 確定石

以下の盤面。
Aに置くことで満月が作れ、なおかつ確定石も作ることができるため推奨したい。
Bは相手に満ち欠けの種を与えてしまうため、置かないほうがいい。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/649673/5f8386fb-2688-ce79-23ab-20444200ab9e.png)

### 手詰まり時の裏目は考えない

以下の盤面。
悩ましいがこの手がよいと思われる。
相手にダブル満月をやられる裏目があるが、このゲームはとにかく点数を稼がないと負けるので仕方がない。
そもそも相手が関連札を持っているかどうかも分からない状態で弱気な打牌では勝てない。

なお、左上で満月を作るのは満ち欠けの種になるため推奨しない。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/649673/3396a126-262b-9f97-4d77-cc13a798f04b.png)

### 満ち欠けケア

以下の盤面。
難しいがここで満月を作りつつ満ち欠けケアをしたい。

理由1. 相手に🌕を置かれると🌖🌕🌔🌗の満ち欠け4点、ボーナス3点、こちらのボーナス-1点となるため。
理由2. 最後の最後まで満ち欠けに怯え、仮に満ち欠けされても勝てる程度の点数は稼ぎたいため。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/649673/c1fc9b47-a108-55d2-5fb6-840d58cfeb81.png)

この程度だったら虱潰しで最善手が分かるかもしれないが、やってみたら分かる。
このゲームは真剣にやると脳がかなり疲れるため、いちいち考えたくなくなる。

### 相手の手を潰す

以下の盤面。
相手のダブル満月を潰したい。
この手を潰すことは実質7点稼いだことと同じ価値がある。（満月 + 満月 + ボーナス3枚）

左上で満月を作る手もあるが、相手に片方の枝が潰されてももう片方が残っているため痛くはない。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/649673/0c5ad5e9-2ef8-d447-4297-3d5a7a1cb661.png)

なお、🌑ではなく🌕を選択した理由は、のちのち🌕を別の箇所に置いた場合、満ち欠けの種になりそうだと思ったから。

### 相手の選択肢を減らす

以下の盤面。
BではなくAに置きたい。

Aに置くことで相手が🌑を持っていた場合の満月役を潰すことができる。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/649673/6d3323ac-a66f-5592-ffa6-5bcd225a845a.png)

### 被害を最小に

以下の盤面。
こちらに有効札がなく、相手はダブル役が狙える状態。
この場合は、相手のダブル役を阻止するようにした方がいいだろう。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/649673/1cc63093-7c69-db0f-9656-2f89eae321b7.png)

なお間違っても、🌕を置いてはいけない。
何故なら満ち欠けメンコが発生するからだ。

### 初期配置

前半で点数を稼がないと負けるので初期手札で役が確定するなら、役を作れるように配置する。

配置場所はどこに置いても大差はないと思うが、自分は枝が少ない箇所に置くようにしている。（相手の選択肢を減らしたいため。）

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/649673/9d19cc5f-248a-3c87-7655-4ad8f4e0187d.png)

## 本文

と、攻略方法を書いたところで本文を書いていく。

このゲームは**運ゲー**である。

それはもうどうしようもない**運ゲー**である。

### 運ゲーの理由1（手札事故）

このゲーム、役を作らないと勝てないが、手配が悪いとそもそも役が作れないことがある。

自分：置く（強制先手）
相手：満月
自分：置く（役なし）
相手：満月
自分：置く（役なし）
相手：満月
（以下略）

このパターンはもはやどうしようもない。
戦略もクソもない。
完全な運ゲーである。

### 運ゲーの理由2（満ち欠けメンコ）

記事内に何度も出てきた満ち欠けメンコという言葉。
敗因の9割はこれだろう。

相手：満ち欠け
自分：満ち欠け
相手：満ち欠け
自分：満ち欠け
相手：満ち欠け
自分：満ち欠け
相手：満ち欠け
自分：手詰まり
相手：満ち欠け
結果 → 負け

これが本当にしょうもない。
満ち欠けの逆転要素があまりに強すぎる。
満ち欠けメンコが発生した場合、最後に満ち欠けを取れた方がほぼ勝ちであり、運用素がかなり強いと感じる。
（しかも相手の方がほぼ満ち欠けを取ってくる印象。手札操作をしているのではないかとすら思えてくる。）

満ち欠けをケアしても盤面によってはケアしきれないことがあり、満ち欠けメンコを阻止することもなかなか難しい。

これが本当につまらない。

## 何がつらいのか

このゲームをやってメンタルに来るのが、運ゲーで負けるとレベル1から再スタートになることだ。

これが本当につらい。

また、1からかよ。

と心が折れる。

## というわけで

Qiitaを読んでいるエンジニアの諸君。

運ゲーならコンティニュー機能を作ってれ…

ガチ勢はノーコンの記録。
エンジョイ勢はコンティニューありの記録でそれぞれ楽しめばいいじゃない。

## チラ裏

ちなみに自分はレベル20くらいまで行きました。
記憶があいまいなので明確には覚えていません。
【Java】JUnitの基本操作

# 概要
JUnitの基本操作について学習した際の備忘録です。

# JUnitによるテストのメリット
- テストに要する工数の削減。テストケースが体系化されており、一度作成したテストケースは何度も利用可能であるため
- 使用やソースプログラムの機能が明確になる
- コード変更による退行を防ぎ、リファクタリングを促進させる

# 網羅条件
- 命令網羅（statement coverage）（C0）
全ての命令を少なくとも１回は実行するテストを行う
- 分岐網羅（branch coverage）（C1）
分岐のパスを全て少なくとも１回は通るテストを行う
- 条件網羅（condition coverage）（C2）
分岐の際の判定条件が複数ある場合に、それぞれの条件が真あるいは偽になる場合を少なくとも１回は含むテストを行う

# JUnitの設定と基本操作
Eclipseを使用する場合の設定と基本操作です。バージョンはEclipse(pleiades all in one)2023です。
### テストケースの作成
1. テスト対象クラスを右クリック
1. 新規＞その他＞Java＞JUnit＞JUnitテスト・ケースと選択し、次へをクリック
1. 新規JUnit Jupiterテストを選択する。クラス名は、デフォルトで「テスト元クラス＋Test」という名前になっている。基本的にそのままで良い。次へをクリックする
1. テストするメソッドを選択してチェックをつけ、完了をクリックする
1. テストケースとなるクラスを持つファイルが生成される

### Assertions クラスの主なメソッド

JUnit5 の Assertions クラスに搭載されているメソッドを用いてテストを行う。ちなみに、assertion とは「表明」「断言」などを意味し、ある式や値が想定したものになっているか否かを確認するものである。

- `assertArrayEquals(arrays expected, arrays actual)`
  配列同士を比較し、等しければ true を返す
- `assertEquals(expected, actual)`
  **値**を比較し、等しければ true を返す
- `assertSame(expected, actual)`
  expected と actual が同じ**オブジェクト**の場合は true を返す
- `assertNotSame(expected, actual)`
  expected と actual が異なる**オブジェクト**の場合は true を返す
- `assertNull(obj)`
  オブジェクトが Null であることを確認し、Null の場合に true を返す
- `assertNotNull(obj)`
  オブジェクトが Null 出ないことを確認し、Null でない場合に true を返す
- `assertTrue(boolean condition)`
  条件が true であることを確認し、true の場合は true を返す
- `assertFalse(boolean condition)`
  条件が false であることを確認し、false の場合は true を返す

### assertEqualsメソッドを利用したテストの実行例
テストケースのクラス内のメソッドにおいて、次のように記述する。
```java:例
import static org.junit.jupiter.api.Assertions.*;

import org.junit.jupiter.api.Test;

class TaxTest {

    // テストメソッドには、@Testアノテーションを付与する。
    @Test
    void testTaxIn() {
        Tax tax = new Tax(); // テスト対象クラスのインスタンス化
        assertEquals(1100, tax.taxIn(1000)); // taxIn()は、消費税（10%）込みの数値を返すメソッド。
    }

}
```
テストの実行は、テストケースクラスを右クリックして、実行＞JUnitテストをクリックする。
JUnitビューに**緑色**の帯が表示されればテスト**成功**。
**赤色**の帯が表示されればテスト**失敗**。障害トレースに失敗のクラスやメソッドの該当行などが表示され、この箇所をダブルクリックすれば、エディター上の該当行へジャンプできる。

### 代表的なアノテーション
| アノテーション | 概要 |
|:-:|:-:|
| @Test | テストメソッド |
| @BeforeEach  | それぞれのテストメソッド実行の前に行われる処理  |
| @AfterEach  | それぞれのメソッド実行の後に行われる処理  |
| @BeforeAll  | テストクラスのテスト実行前に１度だけ行われる処理  |
| @AfterAll  | テストクラスのテスト実行後に１度だけ行われる処理  |

### 条件分岐のテスト（カバレッジ）
1. カバレッジを利用できるように、まずはEclEmmaを導入する。eclipseで、ヘルプ＞Eclipseマーケットプレースを選択
1. 検索欄にEclEmmaと入力し、検索してインストールする
1. テストケースクラスを右クリックし、カバレッジ＞JUnitテストを選択
1. カバレッジビューにカバレッジが表示される。なお、ソースコードに付いた色については、緑色がテストした処理、赤色はテストしていない処理、黄色は条件部分であり、黄色の行番号の左側のマークにマウスを合わせると、テストしていない分岐の数が表示される

# 関連リンク
https://qiita.com/ramgap/items/b49ae39608b8fd367945

# 参考文献
https://junit.org/junit5/docs/current/api/org.junit.jupiter.api/org/junit/jupiter/api/Assertions.html#assertSame(java.lang.Object,java.lang.Object)
オブジェクトのキーと変数名が同じ場合の省略記法（JavaScript）

## 概要
* JavaScriptでオブジェクトのキーと変数名が同じ場合、変数名を省略して記述出来る（オブジェクトリテラルの省略記法）
* オブジェクトを省略して記述できるのは便利だが、スプレッド構文と組み合わせた場合など勘違いしやすい
## コード

* 省略記法を使用しない場合
```javascript
const title = 'JavaScriptの学習';
const time = 2;

{
    title: title,
    time: time
}
```
* 省略記法を用いた場合（キー名と変数名が同じなので値を省略できる）
```javascript
const title = 'JavaScriptの学習';
const time = 2;

{
    title,
    time
}
```
* 間違えやすい状況
スプレッド構文と合わせてオブジェクトリテラルの省略記法が使われている場合、{}がオブジェクトを表しているのかJavaScriptを埋め込んでいるのか分かりづらい
```javascript
const newRecords = [...records, {title, time}];
```
MAC副層、LLC副層とは

# データリンク層はさらに二つの層に分けられる
>IEEE802では汎用性を持たせるためにデータリンク層の中でさらに二つの副層を設けている。 汎用性ということの意味は次のようである。データリンクの規格にはさまざまなものがあり、後の章で詳述するが、Ethernetや、トークンリング、`FDDI`などがあって、それぞれの規格で`共通にヘッダ規格を利用できる`ようにしているということである。
そして、その二つの副層とは、`論理リンク制御(LLC)副層`と`媒体アクセス制御(MAC)副層`のことを言う。
# 論理リンク制御 (LLC層)
>データリンク層の二つの副層のうち`上位に位置するものを論理リンク制御副層`(Logical Lind Control)という。 論理リンク制御はLANに接続される端末間のデータ転送方法に関するプロトコルである。 端末間でフレームを送受信するにあたって、`受信したすべてのフレームに抜けがないか`、また`正しい情報として受信できたかを判断`し、`受信フレームに異常があった場合は送信元に再送信を要求`する。また、受信側が正常に受信できる状態にないときは、送信側は`送信を一時見合わせ、再送信の時間間隔を長くして対応`する。

フレームの抜け、正しさを判断、異常があった場合は再送信させる。

# 媒体アクセス制御 (MAC層)
>データリンク層の二つの副層のうち下位に位置するものを 媒体アクセス制御副層(Media Access Control)という。 MAC層では以下のような処理が行われる。
### 送信側
>LLCから渡された情報に対して`宛先MACアドレスや送信元MACアドレスなどの制御情報を付加`し、フレームとして組み立てて、`物理層にbit列として引き渡す`。
### 受信側
>物理層から複合化された`bit列を受け取り`、`フレームを分解して制御情報を削除し、情報のみをLLC層に引き渡す`。

LLCはMACアドレスを付加、物理層にbit列に変更する

https://www.komazawa-u.ac.jp/~w3c/lecture/network/ccna6.html

>ＭＡＣ副層の任務は、実際に６オクテットのＭＡＣアドレス（Media Access Control Address）を使用して、`イーサーネット対応機器間の送受信`を行うことです

https://lantech.up.seesaa.net/subpage/nw_lan_mac.html#:~:text=%EF%BC%AD%EF%BC%A1%EF%BC%A3%E5%89%AF%E5%B1%A4%E3%81%AE%E4%BB%BB%E5%8B%99%E3%81%AF%E3%80%81%E5%AE%9F%E9%9A%9B%E3%81%AB%EF%BC%96%E3%82%AA%E3%82%AF%E3%83%86%E3%83%83%E3%83%88%E3%81%AE%EF%BC%AD%EF%BC%A1%EF%BC%A3%E3%82%A2%E3%83%89%E3%83%AC%E3%82%B9%EF%BC%88Media%20Access%20Control%20Address%EF%BC%89%E3%82%92%E4%BD%BF%E7%94%A8%E3%81%97%E3%81%A6%E3%80%81%E3%82%A4%E3%83%BC%E3%82%B5%E3%83%BC%E3%83%8D%E3%83%83%E3%83%88%E5%AF%BE%E5%BF%9C%E6%A9%9F%E5%99%A8%E9%96%93%E3%81%AE%E9%80%81%E5%8F%97%E4%BF%A1%E3%82%92%E8%A1%8C%E3%81%86%E3%81%93%E3%81%A8%E3%81%A7%E3%81%99

# 感想
データリンク層の中に２つの層があることを知った。しかしどこの層でプロトコルや制御が動いているのかは理解できなかった。まだレイヤーに対する理解が足りない。

上はデータのチェック、下はアドレスをつけてビット列に変換する
CSMA/CDなどのデータが衝突しないように工夫されているから`送信側は送信を一時見合わせ、再送信の時間間隔を長くして対応`とLLC層に書いてあるからLLC層にあるようだ。
MAC層の取り決めを上で利用しているからLLC層で使えるのかもしれない

#### MAC副層がCSMA/CDにある理由を考える
MAC副層が受信するとフレームを分解して中身のデータ部分だけを取り出す。
万が一再送させる場合、門前払いさせるからCSMA/CDがMAC層にあるのかな。

https://www.alaxala.com/jp/techinfo/archive/manual/AX2000R/HTML/KAISETSU/0033.HTM#ID00150

https://interface.cqpub.co.jp/wp-content/uploads/if2112_069.pdf

https://www.wenet.co.jp/PDF/netouyo.pdf

https://ocw.u-tokyo.ac.jp/lecture_files/engin_09/2/notes/ja/aida02.pdf

https://lantech.up.seesaa.net/subpage/nw_lan_llc.html
Enumerations

[Previous << Interfaces](https://qiita.com/flowcadence/items/765a76e4fac1220ea7d9)
[Next >> Intersection Types](https://qiita.com/flowcadence/items/582db1a97e279dfe033f)

https://qiita.com/flowcadence/items/3073d69c6e9895e68b5a#cadenceの言語仕様を学ぶ


列挙型(Enumerations)とは、一意の定数値に結び付けられたシンボル名(symbolic names)の集合であり、同一性(identity)によって比較できるものです。
<h1 id="Enum-Declaration">Enum Declaration</h1>

列挙型(Enum)は、`enum` キーワードを使用して宣言します。その後、列挙型の名前、コロン（:）の後にraw 型、そして開始と終了の波括弧で囲む必要があります。

raw 型は整数型サブタイプでなければならず、例えば、`UInt8` または `Int128` などです。

列挙型ケース(enum case)は、`case`キーワードを使用して宣言し、その後に列挙型ケースの名前を続けます。

列挙型ケース(enum case)は一意でなければなりません。各列挙型caseには、すべてのcaseの中でのcaseのインデックスであるraw 値があります。

列挙型ケース(enum case)のraw 値は、`rawValue`フィールドを使用してアクセスできます。

列挙型ケース(enum case)は、列挙型のフィールドとして名前を使用するか、引数としてraw 値を指定する必要がある列挙型コンストラクタを使用してアクセスできます。列挙型コンストラクタは、指定された生の値を持つ列挙型のcaseを返します。そのようなcaseが存在しない場合は、`nil`を返します。

列挙型のcaseは、等価演算子`==`および`!=`を使用して比較できます。

```ruby
/* Declare an enum named `Color` which has the raw value type `UInt8`,
 * and declare three enum cases: `red`, `green`, and `blue`
 */
access(all)
enum Color: UInt8 {

    access(all)
    case red

    access(all)
    case green
    
    access(all)
    case blue
}
/* Declare a variable which has the enum type `Color` and initialize
   it to the enum case `blue` of the enum */
let blue: Color = Color.blue
/* Get the raw value of the enum case `blue`.
 * As it is the third case, so it has index 2
 */
blue.rawValue /* is `2` */
/* Get the `green` enum case of the enum `Color` by using the enum
 * constructor and providing the raw value of the enum case `green`, 1,
 * as the enum case `green` is the second case, so it has index 1
 */
let green: Color? = Color(rawValue: 1) 
/* is `Color.green` */

/* Get the enum case of the enum `Color` that has the raw value 5.
 * As there are only three cases, the maximum raw value / index is 2.
 */
let nothing = Color(rawValue: 5)
/* is `nil` */

/* Enum cases can be compared */
Color.red == Color.red  /* is `true` */
Color(rawValue: 1) == Color.green 
/* is `true` */

/* Different enum cases are not the same */
Color.red != Color.blue  /* is `true` */
```

翻訳元

https://cadence-lang.org/docs/language/enumerations

***
<b>[Previous << Interfaces](https://qiita.com/flowcadence/items/765a76e4fac1220ea7d9)
</b>

[Flow blockchain / Cadence version1.0ドキュメント](https://qiita.com/flowcadence/items/3073d69c6e9895e68b5a) (Enumerations)

<b>[Next >> Intersection Types](https://qiita.com/flowcadence/items/582db1a97e279dfe033f)</b>