OmniAICreator/Qiita-1.07M huggingface dataset:
適当にでもいいけどそろそろ少しプロンプト凝って書いてみませんか…？

## 自己紹介
現在会社でシステムエンジニアとして開発業務を行いながら、少しだけ趣味感覚でAIの使い方を学んでいます。特にこだわりを持たなくてもChatGPTなどの生成AIを使用することももちろんできますが、少しカッコよく使ってみたく、その一部を紹介します。

# 7Rプロンプトの構成要素と効果

## Request（依頼）

### 説明
言語モデルに何を求めているのかを明確にする。

###  具体例
- 新しいカフェの開業に関するマーケティング戦略を提案してください
- 英語学習初月の人向けの英文を作成してください

### ポイント
ユーザーは自分のニーズや目的を明確にし、言語モデルに具体的なタスクを依頼する。

---

## Role（役割）

### 説明
言語モデルの役割を明確にする。

### 具体例
- あなたは経営コンサルタントです。私のビジネス計画を評価してください
- あなたはデザイナーです。この写真を参考にしつつ、よりクールな雰囲気のある画像を生成してください

### ポイント
ユーザーは言語モデルに特定の役割を割り当て、その視点からの回答を求める。

---

## Regulation（形式）

### 説明
言語モデルに期待する回答の形式を明確にする。

### 具体例
- 敬文を使って、気持ちを表現してください
- 私がmdファイルに直接貼り付けられるように文章を生成してください

### ポイント
ユーザーは回答の形式を指定し、特定のスタイルや方法で情報を提示するよう言語モデルに要求する。

---

## Rule（ルール）

### 説明
言語モデルが遵守すべきルールを明確にする。

### 具体例
- 曖昧な表現に頼らず、例示と論拠に基づいて述べなさい
- 100単語の英単語を用いて文章を作成してください

### ポイント
ユーザーは具体的なルールや制約を設定し、言語モデルにその枠内での回答やアイデアの提供を求める。

---

## Reference（参照知識・例）

### 説明
言語モデルが参照すべき知識や例を明確にする。

### 具体例
- 最新のAI技術動向についての事例を挙げて説明してください
- この文章を下に作者がどのような意図でこの文章を作成したと考えられるか、例を挙げてください。

### ポイント
ユーザーは言語モデルに特定の知識や事例等を参照して回答するよう要求し、より詳細かつ具体的な情報を得る。

---

## Run Scenario（実行シナリオ）

### 説明
言語モデルが返し、シナリオに沿った会話をさせる。

### 具体例
1. 1日目の出社を前に、「どの業務がありそうですか？」とユーザーにきく  
2. 私が新人職員として、仕事に関する質問をする

### ポイント
ユーザーは具体的なシナリオを設定し、ChatGPTにその状況に即した対応や会話の流れを作成するよう依頼する。

---

## ■ 7Rプロンプトを使うことでどのような効果が期待できるか？

### 効果1：効果的なプロンプトの作成
- AIがプロンプトを解釈し、行動を決定する方法を理解できたことで、より精度の高いアウトプットが出力できるようになる
- シンプルに便利度が向上する

### 効果2：プロンプトエンジニアリングの基礎知識が身につく
- 構造化されたプロンプトは奥深く応用が効く
- 他人の入力やプロンプトをどのように解釈するか、改善するかを通して、より効果的なプロンプトを作成できる能力が身につく
【Python初心者】ランダムな文字列生成とPythonのインポートパス管理

ランダム値の生成やPythonのインポートパスの扱いに関する基本をまとめました。  
パスワード生成やモジュールの読み込みに関係する、実用的な操作が多く含まれます。

## セキュアなランダム文字列を生成する：`secrets` モジュール

セキュリティ用途（例：トークン、パスワード）では `secrets` モジュールが推奨されます。  
`secrets.token_hex()` を使うと、指定バイト数の16進数文字列が得られます。

```python
import secrets

token = secrets.token_hex(8)  # 8バイト分のランダムな16進文字列
print("トークン:", token)
```

```
トークン: f1a4d2b3c8e6a9b0
```

## 通常のランダムな文字列を生成する：`random` モジュール + `string`

一時的なIDなどセキュリティ不要の用途には、`random.choice()` を使って英数字をランダムに選びます。

ここで使用する `string` モジュールは、**英字や数字などの文字列定数を提供する標準ライブラリ**です。  
以下のような定数が用意されています：

- `string.ascii_letters`: 英小文字＋英大文字
- `string.digits`: 数字（0～9）

この2つを組み合わせて「英数字全体」を対象にランダム文字列を作成することができます。

```python
import random
import string

chars = string.ascii_letters + string.digits
random_str = ''.join(random.choice(chars) for _ in range(12))
print("ランダム文字列:", random_str)
```

```
ランダム文字列: A4f9zBcWm7Qd
```

### 🔍 解説：この構文は何をしているのか？

```python
''.join(random.choice(chars) for _ in range(12))
```

この1行は、以下のような処理をしています：

1. `random.choice(chars)`：`chars` の中からランダムに1文字選ぶ  
2. `for _ in range(12)`：それを12回繰り返す  
3. `''.join(...)`：選ばれた12文字を空文字で結合して、1つの文字列にする  

つまり、「英数字からランダムに12文字選んで、1つの文字列としてまとめている」構文です。

---

## Pythonのインポートパスを確認・追加する：`sys.path`

Pythonがモジュールを探す際に参照するパス一覧は `sys.path` に格納されています。  
独自モジュールの読み込みなどで動的にパスを追加することも可能です。

```python
import sys

print("現在のインポートパス一覧:")
for p in sys.path:
    print(p)
```

```
現在のインポートパス一覧:
/Users/yourname/project
/usr/local/lib/python3.11/site-packages
...
```

パスを追加する場合は、`sys.path.append()` や `insert()` を使います。

```python
sys.path.append("/Users/yourname/mylib")  # 最後に追加
# sys.path.insert(0, "/Users/yourname/mylib")  # 優先的に読み込む場合
```

## Pythonのバージョンを確認する：`sys.version` / `sys.version_info`

スクリプトの実行中にPythonのバージョンを確認するには `sys.version` または `sys.version_info` を使います。

- `sys.version` は文字列形式  
- `sys.version_info` はタプル形式（比較に便利）

```python
import sys

print("Pythonバージョン（文字列）:", sys.version)
print("Pythonバージョン（数値）:", sys.version_info)
```

```
Pythonバージョン（文字列）: 3.11.8 (main, Feb  6 2024, 10:00:00) [Clang 15.0.0]
Pythonバージョン（数値）: sys.version_info(major=3, minor=11, micro=8, releaselevel='final', serial=0)
```

バージョンに応じて処理を変えるような場合には、数値で比較できる `version_info` が便利です。

```python
if sys.version_info < (3, 10):
    print("Python 3.10 未満です")
```

## おわりに

今回はランダムな文字列の生成方法と、Pythonのインポートパスの管理、バージョン取得について学びました。  
特に `sys.path` や `secrets`、それに `''.join(... for _ in range(...))` の構文は実務でもよく使われるそうなのでこの機にしっかり覚えたいと思いました。
最近使うgitコマンド

# 最近仕事や趣味で使用するgitコマンド

### 1. `git reset --hard HEAD^`

### ✅ 概要
直前のコミットを **完全に取り消す** コマンドです。  
作業ディレクトリ、インデックス（ステージ）もすべて元に戻します。

### 🔍 解説
- `HEAD^` は「1つ前のコミット」を指します。
- `--hard` は、**作業ツリー・インデックス・HEADすべて**を指定されたコミットに戻します。

### 💡 使う場面
- 間違ってコミットした内容を **完全になかったことにしたい** とき。
- ローカルで作業していて、コミットを **巻き戻したい** とき。

### ⚠️ 注意点
- **元に戻したコミットや変更は復元できません**。
- チームで共有しているブランチには **使わない方が安全** です。

---

### 2. `git reset --soft HEAD^`

### ✅ 概要
直前のコミットを取り消すが、**作業ツリーとステージの内容は残す** コマンドです。

### 🔍 解説
- `--soft` は、HEAD だけを 1つ前に戻します。
- 作業ファイルやステージの状態はそのままなので、**再コミット可能** です。


### 💡 使う場面
- コミットメッセージを **修正したいとき**。
- 複数のコミットを **1つにまとめたいとき（squashの準備）**。

---

### 3. `git rebase`

### ✅ 概要
現在のブランチの変更履歴を、**別のブランチの最新状態に基づいて付け替える** コマンドです。

### 🧾 基本構文
`git rebase <ブランチ名>`

例： `git rebase main`

→ 現在のブランチの履歴を `main` ブランチの先に移動する。

### 💡 使う場面
- **履歴をきれいに保ちたい** とき（マージコミットを避けたいとき）。
- 複数のブランチを順番に重ねて適用したいとき。

### ⚠️ 注意点
- すでに共有されたブランチで行うと、**履歴が変わるためトラブルの原因**になります。
- 実行前に `git status` と `git log` の確認が必須です。

---

### 4. `git cherry-pick`

### ✅ 概要
他のブランチの **特定のコミットだけを選んで現在のブランチに取り込む** コマンドです。

### 🧾 基本構文
`git cherry-pick <コミットハッシュ>`
例： `git cherry-pick abc1234`

→ `abc1234` のコミットを現在のブランチに適用する。

### 💡 使う場面
- 他ブランチの特定の修正だけを取り込みたいとき。
- バグ修正や機能追加の一部だけを反映したいとき。

### ⚠️ 注意点
- コンフリクトが起きることがあるので、適用後は `git status` で確認が必要です。
- 複数のコミットを取り込む場合は、個別に `cherry-pick` を行う必要があります。
【Python初心者】osモジュールでOS操作とファイル管理の基本を学ぶ

`os` モジュールに関する基本をまとめました。  
特に「OSプロセス管理」「ファイル・ディレクトリ操作」「OS情報の取得」といった操作について学びました。

## プロセスIDを取得する：`os.getpid()` / `os.getppid()`

現在のプロセスIDと、その親プロセスIDを取得するには `os.getpid()` と `os.getppid()` を使います。

```python
import os

print("現在のプロセスID:", os.getpid())
print("親プロセスID:", os.getppid())
```

```
現在のプロセスID: 12345  
親プロセスID: 6789
```

## 環境変数を扱う：`os.environ`

環境変数の値を取得したいときは `os.environ.get()`、新たに設定したいときは `os.environ[...] = 値` を使います。

```python
print(os.environ.get("HOME"))  # 環境変数の取得
os.environ["MY_ENV"] = "test"  # 環境変数の設定
print(os.environ["MY_ENV"])
```

```
/Users/yourname  
test
```

## カレントディレクトリの確認と移動：`os.getcwd()` / `os.chdir()`

現在の作業ディレクトリを確認するには `os.getcwd()` を、移動するには `os.chdir()` を使います。

```python
print("カレントディレクトリ:", os.getcwd())
os.chdir("..")  # 1つ上のディレクトリに移動
print("移動後:", os.getcwd())
```

```
カレントディレクトリ: /Users/yourname/project  
移動後: /Users/yourname
```

## ディレクトリの作成と削除：`os.mkdir()` / `os.rmdir()`

単一のディレクトリを作成・削除する場合には `os.mkdir()` と `os.rmdir()` を使います。

```python
os.mkdir("test_dir")  # ディレクトリの作成
os.rmdir("test_dir")  # ディレクトリの削除
```

## 階層付きディレクトリの作成と削除：`os.makedirs()` / `os.removedirs()`

複数階層のディレクトリをまとめて作成・削除したいときは `os.makedirs()` と `os.removedirs()` を使います。

```python
os.makedirs("parent/child")       # ネストしたディレクトリ作成
os.removedirs("parent/child")     # 空のディレクトリ階層を削除
```

## ファイルの存在確認と削除：`os.path.exists()` / `os.remove()`

ファイルが存在するか確認したいときは `os.path.exists()`、削除するには `os.remove()` を使います。

```python
os.path.exists("example.txt")   # 存在確認（True / False）
os.remove("example.txt")        # ファイル削除
```

## パス情報の取得・結合：`os.path.basename()` / `os.path.dirname()` / `os.path.join()`

ファイルパスからファイル名やディレクトリ名を取得したり、パスを結合するには以下の関数を使います：

- `os.path.basename()`：ファイル名部分を取得  
- `os.path.dirname()`：ディレクトリ部分を取得  
- `os.path.join()`：複数のパスを安全に結合

```python
path = "/Users/yourname/sample.txt"
print(os.path.basename(path))   # sample.txt
print(os.path.dirname(path))    # /Users/yourname
print(os.path.join("folder", "file.txt"))  # folder/file.txt
```

```
sample.txt  
/Users/yourname  
folder/file.txt
```

## 実行中のOSを判定する：`os.name`

現在実行中のPythonが動作しているOSの種類を判定したいときは `os.name` を参照します。

```python
import os
print(os.name)  # 'posix'（Unix系）, 'nt'（Windows）
```

```
posix
```

## おわりに

今回は `os` モジュールを使って、プロセス情報の取得、環境変数の操作、ファイル・ディレクトリ操作、OSの種類判定などについて学びました。  
各関数の役割が明確に分かれているので、何をしたいのかに応じて使い分けるのが大事だと感じました。
GoogleCloud PCA資格の学習記録 - データ分析編

## はじめに

Google CloudのPCA(Professional Cloud Architect)認定資格取得に向けて学習した内容を自分なりに整理します。Google Cloudのサービスに限らず、それを扱う上での関連知識についても触れています。
本記事はデータ分析編ということで、下記の要素を扱います。


* データ分析
    * BigQuery
    * Dataproc
* メッセージング
    * Pub/Sub
* データ処理
    * Dataflow
    * Data Fusion
    * Dataprep

:::note
この記事における「現在」や「最近」などの表現は、特に断らない限り2025年6月時点を指します
:::



## データ分析

### BigQuery

* フルマネージドのデータウェアハウスサービス
* 大量のデータをリアルタイムで高速に分析
    * ペタバイト規模のデータを扱える
* SQLを使ってMapReduceの技術を扱えることが特徴
* 自然言語インターフェースによるデータ探索に対応
* BigQuery ML: 機械学習モデルの作成と予測にも対応
* Connected Sheet: スプレッドシートとの連携も可能


### Dataproc

* マネージドなHadoop/Sparkサービス
* ストレージ（Cloud Storage）とコンピュート（Dataproc）を分離し、それぞれでスケーリングが可能
* エフェメラルクラスタ（ジョブ単位の一時利用クラスタ）としての使用
    * 高速に起動できるので、常時起動せず、使う時だけ起動する使い方が可能。これにより無駄なコストを省く




## メッセージング

### Pub/Sub

* メッセージキューイングサービス
* パブリッシャー（発信者）が送信したメッセージをキューイング（待ち行列に入れ）し、サブスクライバー（受信者）と非同期に連携する
* メッセージ
    * Pull型: サブスクライバーが任意のタイミングでキューからメッセージを取得する方式
    * Push型: 指定されたエンドポイントに対してPub/Sub側からメッセージを配信する方式
* メッセージ送信の確実性を担保するため、下記の機能がある
    * 一定時間、Ack通信（受信確認）がなければメッセージを再送する
    * At-least-once
        * 最低一回の配信を保証する
        * デフォルトでは重複を排除しないため、2回以上配信されることもある
        * Dataflowの重複排除（Deduplication）と組み合わせてExactly-Onceを実現できる
    * メッセージ複製
        * Pub/Subにキューされたメッセージは複数のディスクに複製され、メッセージがAckされるまで永続化される
* バッチ処理
    * 複数のメッセージをまとめて送受信することでスループットを向上させる仕組み
    * ある程度の数のメッセージが貯まるか、一定時間が経過したらまとめて送信する
    * ただし、条件を満たすまでメッセージの送信が行われないため、個々のメッセージで見ると遅延（レイテンシー）も発生する
    * レイテンシーを最小にするためには、バッチ処理をオフにする必要がある


## データ処理

### Dataflow

* 大規模データに対する「バッチ処理」「ストリーミング処理」の両方を同一のプログラミングモデルで記述できる
    * Apache Beamのプログラミングモデルに則って実装
    * Java, Pythonが使用可能
* データを分散処理するフルマネージドサービス
    * 自動スケーリングや自己修復機能を備え、インフラ管理の手間を最小限に抑えられる
* コードベースでの記述が前提であるため、エンジニア主導のデータパイプライン構築に適している
    * 特に複雑なデータ変換や高頻度のストリーム処理が必要なユースケースで強みを発揮する


### Data Fusion

* GUIベースでデータパイプライン（ETL）を設計・運用できるサービス
* CDAP（Cask Data Application Platform）をベースとする
* GUI上でのドラッグ&ドロップでパイプラインを構築できるため、エンジニアでなくともデータ統合や変換処理を迅速に実現できる
* 数百種類のコネクタやトランスフォーマを活用できるのが特徴
    * オンプレミスやSaaS、各種クラウドサービス（postgreSQL, Salesforce, GCS, BigQuery など）を1つのパイプライン内で容易に統合できる
    * バックエンドではDataflowを実行エンジンとして使用するため、スケーラブルに処理が行える
    * バッチ処理だけでなく、ストリーミング処理にも対応（Spark Streamingを使用）
* 異種データソースの統合が求められるユースケースや、開発者と被技術者が連携するチームにおいて有効

### Dataprep

* データの分析の前に行う「前処理」や「データクレンジング」などを行うフルマネージド型サービス
    * データの不整合や欠損値を自動的に検出し、それらを補完したり除去したりする
    * スプレッドシートのような感覚でデータ処理を実施できる
* 実行エンジンとしてはDataflowを使用するため、データ量が多くなってもスケーラブルに処理される
* ノーコードで、ビジュアライズされた変換機能を提供する。非エンジニアでも簡単にデータ変換を実行できる
【2025年最新版】特権アクセス管理（PAM）とは何か？ゼロトラスト時代に不可欠な理由と導入のポイント

# 【2025年最新版】特権アクセス管理（PAM）とは何か？ゼロトラスト時代に不可欠な理由と導入のポイント

> **「その特権ID、誰が使って、何をしているか説明できますか？」**

特権アクセス管理（PAM）は、組織の中で最もリスクの高い「特権アカウント」へのアクセスを制御・監査・保護するためのセキュリティ領域です。

---

## 🔐 なぜ今、PAMが必要なのか？

- 増加する内部不正／外部攻撃の標的は「特権ID」
- ゼロトラスト時代、アクセス制御が境界防御より重要に
- 多くの業界規制（PCI-DSS, SOX, HIPAAなど）で特権管理は**必須**

> ✅ IBMの調査では、全セキュリティ侵害の約80%が「資格情報の悪用」に関連しています。

---

## 📌 PAMでできること一覧

| 領域 | 具体機能 |
|------|----------|
| **資格情報管理** | パスワードのローテーション／ヴォールト保存 |
| **アクセス制御** | JITアクセス／多要素認証／承認フロー |
| **セッション監査** | 操作録画／リアルタイム監視／異常検知 |
| **統合管理** | DevOps／CI/CDとのAPI連携／クラウド対応 |

---

## ✅ 実際の導入事例

- **カプコン**：CyberArk導入により、セッション録画とワークフロー承認を全社導入  
- **鴻池運輸**：ログ監査をPAMで統合し、コンプラ対応時間を大幅短縮  
- **米大学機関**：Vault導入で学内特権アカウントの棚卸とJIT制御を実現

---

## 🛠 実装のポイント

1. **インベントリ（特権アカウント洗い出し）**
2. **Vault構築と資格情報の集中管理**
3. **アクセス制御ポリシーの設計（RBAC/JIT）**
4. **セッションログの監査運用設計**
5. **DevOpsとの統合（Terraform / Ansible / GitHub Actions）**

---

## 🚀 次回予告

次回は、以下を予定しています：

> **「Terraform + Vault + Ansibleで作る！特権アクセス管理の自動構築フロー完全解説」**

---

## 🔗 関連リンク・資料

- [CyberArk 製品概要（日本語）](https://www.cyberark.com/)
- [HashiCorp Vault 公式ドキュメント](https://developer.hashicorp.com/vault)
- [BeyondTrust 日本語サイト](https://www.beyondtrust.com/ja)

---

## 🙋‍♂️ おわりに

PAMはセキュリティだけでなく、**運用の効率化・監査の簡素化・文化的統制**にも直結する「組織セキュリティの中核」です。

あなたの組織の「最も重要な鍵」、きちんと管理できていますか？

---
【Python初心者】copyモジュールまとめ（浅いコピーとdeepcopyの違い）


`copy` モジュールによるオブジェクトの複製方法を整理しました。  
特に `copy()`（浅いコピー）と `deepcopy()`（完全コピー）の違いは、試験でも実務でも重要です。

## なぜコピーが必要？

Python ではオブジェクトを代入すると「同じものを共有」することになります。

```python
a = [1, 2, 3]
b = a
b[0] = 999

print(a)  # [999, 2, 3] ← aも変わってしまう！
```

- `b = a` は「aをコピー」しているのではなく、「aへの参照を代入」しています
- そのため `b` を変更すると `a` も変わってしまいます

このようなケースで「コピーして別物として扱いたい」ときに、`copy` モジュールが登場します。

## copy.copy()：浅いコピー（shallow copy）

浅いコピーでは、**最上位のオブジェクトだけがコピー**されます。  
その中にリストや辞書などの**入れ子構造があると、それらは共有されます**。

```python
import copy

original = [[1, 2], [3, 4]]
shallow = copy.copy(original)

shallow[0][0] = 999
print(original)  # [[999, 2], [3, 4]]
```

- `original` と `shallow` は別のリストオブジェクト
- ただし、**中のリスト（`[1, 2]` など）は同じものを指している**

### 🔍 「じゃあ代入と変わらなくない？」と感じた方へ

実はこの疑問、とても本質的です。  
中の要素が共有されるせいで「代入と変わらないのでは？」と思えてしまうのは自然なことです。

でも、**外側のリスト自体は完全に別物**であるという点が決定的に異なります。

```python
import copy

a = [[1, 2], [3, 4]]
b = a            # 代入
c = copy.copy(a) # 浅いコピー

b.append([5, 6])
c.append([7, 8])

print("a:", a)  # [[1, 2], [3, 4], [5, 6]]
print("b:", b)  # [[1, 2], [3, 4], [5, 6]]
print("c:", c)  # [[1, 2], [3, 4], [7, 8]]
```

- `b` は `a` に完全に追従している（代入）
- `c` は `a` のコピーなので、別のリストとして `.append()` ができる

つまり、浅いコピーは：

- **外側の構造をコピーして独立させたいとき**
- でも**内側のデータ（ネスト）は変更しない前提**

という場面で有効です。

## copy.deepcopy()：完全コピー（deep copy）

deepcopy() は、**中の要素も含めてすべて再帰的にコピー**します。

```python
import copy

original = [[1, 2], [3, 4]]
deep = copy.deepcopy(original)

deep[0][0] = 999
print(original)  # [[1, 2], [3, 4]] ← 元のデータは影響を受けない
```

- `deep` の中にあるリストも `original` とは完全に別物になります
- そのため、変更が元に影響しません

## copy.copy() と代入と deepcopy の違いまとめ

| 操作内容          | リスト本体 | 内部要素（入れ子） |
|-------------------|------------|---------------------|
| `=`（代入）        | 同じ       | 同じ                |
| `copy.copy()`     | 別         | 同じ                |
| `copy.deepcopy()` | 別         | 別                  |

## いつ使い分ける？

- **入れ子構造がない場合** → `copy.copy()` でも OK
- **外側だけ分離したい（中身は共有OK）** → `copy.copy()`
- **元データと完全に独立させたい** → `copy.deepcopy()`

## おわりに

今回は `copy` モジュールによるオブジェクトのコピー方法をまとめました。  
特に `copy()` は見た目はコピーっぽく見えても中身が共有されてしまう点に注意が必要です。

最初は「なんで元まで変わるの？」と混乱しましたが、`copy()` は表面だけをコピーし、`deepcopy()` は中身まで完全にコピーしてくれると覚えると分かりやすかったです。

また、「浅いコピーって代入と何が違うの？」と疑問に思ったのですが、外側のオブジェクトだけが独立していて、中身は共有されるという仕組みを理解することで納得感が得られました。  
この違いを意識することで、どんな場面で `copy()` を使うべきかがだんだん見えてきたように思います。
MOSFET



## ✅ 1. 非線形ドレイン電流

$$
I_D(t) = \frac{1}{2} \mu_n C_{\text{ox}} \frac{W}{L} \left( V_{\text{in}}(t) - V_{\text{th}} \right)^2
\quad \text{ただし} \quad V_{\text{in}}(t) > V_{\text{th}}
$$

* $\mu_n$：電子移動度
* $C_{\text{ox}}$：酸化膜容量
* $W, L$：チャネル幅・長さ
* $V_{\text{th}}$：しきい値電圧
* $V_{\text{in}}(t)$：MOSFETのゲート入力電圧（本モデルでは帰還考慮後の電圧）

---

## ✅ 2. フィードバック考慮後の入力電圧

$$
V_{\text{in}}(t) = V_{\text{ref}}(t) - \beta V_{\text{out}}(t) + u(t)
$$

* $V_{\text{ref}}(t)$：基準信号（目標値）
* $\beta$：帰還係数（0〜1の値でフィードバック量を制御）
* $V_{\text{out}}(t)$：出力電圧
* $u(t)$：外部からの制御入力やノイズ（本例ではゼロ）

---

## ✅ 3. 出力電圧の関係式

$$
V_{\text{out}}(t) = V_{DD} - R_D \cdot I_D(t)
= V_{DD} - R_D \cdot \frac{1}{2} \mu_n C_{\text{ox}} \frac{W}{L} \left( V_{\text{in}}(t) - V_{\text{th}} \right)^2
$$

* $V_{DD}$：電源電圧
* $R_D$：負荷抵抗

---

## ✅ 4. 非線形帰還ループの特徴

* 入力 $V_{\text{in}}(t)$ が **出力 $V_{\text{out}}(t)$ に依存**し、
  かつ非線形（2次）関数で結ばれる代数方程式の形となる。
* 解析的に $V_{\text{out}}(t)$ を明示的に解くことは困難なため、
  数値的に逐次近似（固定点反復法）で求めている。

---

## ✅ 5. シミュレーションの意義

* この式系を使い、**時間変化する基準入力に対する出力応答を非線形的に計算可能**。
* フィードバックがあることで、非線形利得の変動や歪みを抑え、
  システムの安定性や動作点維持を実現している様子が見える。


| パラメータ              | 値            | 説明            |
| ------------------ | ------------ | ------------- |
| 電子移動度 (mu\_n)      | 400e-4 m²/Vs | NMOSの電子移動度    |
| 酸化膜容量 (C\_ox)      | 5e-3 F/m²    | ゲート酸化膜の単位面積容量 |
| チャネル幅 (W)          | 10e-6 m      | MOSFETチャネルの幅  |
| チャネル長 (L)          | 1e-6 m       | MOSFETチャネルの長さ |
| 閾値電圧 (V\_th)       | 1.0 V        | MOSFETのしきい値電圧 |
| 電源電圧 (V\_DD)       | 5.0 V        | 電源電圧          |
| 負荷抵抗 (R\_D)        | 1e3 Ω        | ドレイン負荷抵抗      |
| フィードバック係数 (β)      | 0.2          | フィードバックループの係数 |
| 入力バイアス電圧 (V\_bias) | 2.5 V        | 入力信号の直流バイアス   |
| 入力サイン振幅 (A\_ref)   | 0.001 V        | 入力信号の交流振幅     |
| 入力周波数 (f\_ref)     | 1000 Hz      | 入力信号の周波数      |
【Python初心者】itertoolsモジュールの使い方まとめ（chain / groupby / islice / 組み合わせ系）

`itertools` モジュールの代表的な機能を整理しました。  
大量のデータを効率よく処理したり、組み合わせや連結を簡単に行いたいときにとても役立つツールです。

## itertools とは？

`itertools` は、**繰り返し処理を効率よく行うための標準ライブラリ**です。  
全体をメモリに読み込まずに「イテレータ（遅延処理）」で扱うのが特徴で、大量データでも軽く処理できます。


## chain：複数のイテラブルを連結

`chain()` を使うと、複数のリストなどを1つにつなげたように扱えます。

```python
from itertools import chain

a = [1, 2]
b = [3, 4]

for x in chain(a, b):
    print(x)
```

実行結果：

```
1
2
3
4
```

- `a + b` のようにリスト同士を足すのと似ていますが、**遅延評価でメモリ効率が良い**のが特徴です
- リスト以外のイテラブル（例えば range や文字列）にも使えます


## groupby：連続した同じ値をまとめる

```python
from itertools import groupby

data = ['A', 'A', 'B', 'B', 'B', 'A', 'A']

for key, group in groupby(data):
    print(key, list(group))
```

実行結果：

```
A ['A', 'A']
B ['B', 'B', 'B']
A ['A', 'A']
```

### 🔸 注意点

- **ソートされていないと「完全なグループ化」にはならない**
- `groupby()` は **連続する同一要素**を1グループとして扱います

```python
data = sorted(data)  # グループ化したい場合は事前にソート
```


## islice：一部だけ取り出す（スライス）

`islice()` はリストのスライスに似ていますが、**イテレータにも使える**のが強みです。

```python
from itertools import islice

nums = range(10)

for x in islice(nums, 3, 7):
    print(x)
```

実行結果：

```
3
4
5
6
```

- `islice(iterable, start, stop)` のように使います
- 通常のスライス（`a[start:stop]`）と違って、**イテレータを途中から一部だけ処理**できるのが便利です



## 組み合わせ系のツールまとめ

`itertools` には、組み合わせ・順列・直積などを求める便利な関数も揃っています。


### product：直積（全ての組み合わせ）

```python
from itertools import product

colors = ['red', 'blue']
sizes = ['S', 'M']

for item in product(colors, sizes):
    print(item)
```

実行結果：

```
('red', 'S')
('red', 'M')
('blue', 'S')
('blue', 'M')
```

- `product(A, B)` は「A×B」の全ての組み合わせを出してくれます


### permutations：順列（並び順あり）

```python
from itertools import permutations

items = ['A', 'B', 'C']

for p in permutations(items, 2):
    print(p)
```

実行結果：

```
('A', 'B')
('A', 'C')
('B', 'A')
('B', 'C')
('C', 'A')
('C', 'B')
```

- 順番が違うものは別の組として扱われます


### combinations：組み合わせ（順不同）

```python
from itertools import combinations

items = ['A', 'B', 'C']

for c in combinations(items, 2):
    print(c)
```

実行結果：

```
('A', 'B')
('A', 'C')
('B', 'C')
```

- 順番は関係なく、同じペアは1回だけ出てきます


## おわりに

今回は `itertools` モジュールの中でも、特によく使う `chain()`、`groupby()`、`islice()` と、組み合わせ系の関数についてまとめました。

通常の for 文や list 操作では難しい処理も、`itertools` を使えば短く書けることが分かってきました。特に組み合わせの生成はテストデータやUIのバリエーション生成などに応用できそうです。
[DXライブラリ]シェーダのdefineをcpp側から指定する方法

# シェーダのdefineをcpp側から指定したい(DxLib)
小ネタです
学生さんから質問があったので、ちゃちゃちゃっと解説したいと思います。  
前提知識としては、普通にシェーダが使える事ですので、シェーダ自体の使い方が分からない人はもっと初心者向けの記事をまず読んでください。  
また、ここでのDXライブラリのDirectXバージョンはDirectX11とします。DirectX9はサポートしていません。

はい、で、例えばMV1のデフォルトVertexShaderとかを見ると、やたらと#ifdefが書かれているのを見ると思います。
```C++
#ifdef BUMPMAP
	// バンプマップ
	float3 Tan             : TANGENT0 ;			// 接線( ローカル空間 )
	float3 Bin             : BINORMAL0 ;		// 従法線( ローカル空間 )
#endif // BUMPMAP

#ifdef SKINMESH
	// スキニングメッシュ
	int4   BlendIndices0   : BLENDINDICES0 ;	// ボーン処理用 Float型定数配列インデックス０
	float4 BlendWeight0    : BLENDWEIGHT0 ;		// ボーン処理用ウエイト値０

	#ifdef BONE8

		int4   BlendIndices1   : BLENDINDICES1 ;	// ボーン処理用 Float型定数配列インデックス１
		float4 BlendWeight1    : BLENDWEIGHT1 ;		// ボーン処理用ウエイト値１

	#endif // BONE8

#endif // SKINMESH
```
こんなやつ
なるほど、C++みたいに#defineや#ifdefや#elseや#endifが使えるというわけですね。

でもでも、あれれ？
そういえば#defineがないよ？どこで定義してるの？#include？

どこにもありませーん！

これ自体はDXライブラリ内で指定されてるモノなのでコントロールできないんですよね。
また、C++の#defineと同様に「プリプロセッサ」であるため、いったんコンパイル済みのVertexShader.vsoやらPixelShader.pso状態になると、もう定義できないんですよね～。

でも、設定によっていちいち新しくvsoやpsoを作るのは面倒っすよね。

じゃあ、どうするのかというとLoadVertexShaderFromMem,LoadPixelShaderFromMem,という関数を使用します。
こいつはメモリ上にある「コンパイル済みのバイナリだか中間言語だか(vsoやpsoのなかみ)」を読み取って、頂点シェーダやピクセルシェーダとして使用できるハンドルを得る関数です。

では、それをどうやって取得するのかというと、実行時にコンパイルしてしまうのです。
しかしそんな関数はDXライブラリにはありません。
外から持ってきます。
```C++
#include<d3dcompiler.h>
```
をインクルードし、
```C++
#pragma comment(lib, "d3dcompiler.lib")
```
でリンクします。
で、この中にある関数
D3DCompileFromFile
https://learn.microsoft.com/ja-jp/windows/win32/api/d3dcompiler/nf-d3dcompiler-d3dcompilefromfile

を使用します。使い方はとっても簡単！と言いたいのですが、DXライブラリしか使った事ない人にとってはちょっと難しいかもしれません。
細かい引数の説明は前述のリファレンスを見ていただくとして、このように使います。

```C++
D3D_SHADER_MACRO defines[] = {
	{ "DEFINE_TESTED", "1" }, // テスト出力
	{ nullptr, nullptr }
};
ID3DBlob* blobPS = nullptr;
ID3DBlob* blobErr = nullptr;
HRESULT result = D3DCompileFromFile(L"Shader/MV1PixelShader.hlsl", defines, D3D_COMPILE_STANDARD_FILE_INCLUDE, "main", "ps_5_0", 0, 0, &blobPS,&blobErr);
```
内容は
```C++
D3DCompileFromFile(ファイル名,
                defineマクロ配列,
                インクルードポインタ,
                エントリポイント,
                シェーダバージョン,
                パラメータ1,
                パラメータ2,
                コンパイル済みバイナリ受取ポインタ,
                エラー時のエラー情報受取ポインタ);
```
引数多いですね、イヤになります

ともかくこれでコンパイル済みのシェーダデータがblobPSに入るわけです。あとはこれをLoadPixelShaderFromMemに、よし、じゃあぶちこんでやるZE

```C++
int psH = LoadPixelShaderFromMem(blobPS->GetBufferPointer(), blobPS->GetBufferSize());
assert(psH >= 0);
```
なお、blobPSはただのデータの塊なので、GetBufferPointer()は先頭アドレス、GetBufferSize()はそのバッファのサイズを返します。
ここまでできたら、あとはいつもどおりです。

で、しれっと書きましたが、今回のテーマは「シェーダのdefineをcpp側から指定したい」でしたよね？
実はすでに指定しています。こ↑こ↓
```C++
D3D_SHADER_MACRO defines[] = {
	{ "DEFINE_TESTED", "1" }, // テスト出力
	{ nullptr, nullptr }
};
```
これは
https://learn.microsoft.com/ja-jp/windows/win32/api/d3dcommon/ns-d3dcommon-d3d_shader_macro
に書かれてあるように、define名と、その内容を指定するものです。正直ifdefに使うだけなら、名前の部分だけでOKだと思います。

で、これはサイズを入れられないので、最後には必ずnullptr,nullptrの指定を入れてください。

これで、cpp側で指定したdefineが実行時コンパイル時にhlsl側につたわりまｓ
GoogleCloud PCA資格の学習記録 - DB編

## はじめに

Google CloudのPCA(Professional Cloud Architect)認定資格取得に向けて学習した内容を自分なりに整理します。Google Cloudのサービスに限らず、それを扱う上での関連知識についても触れています。
本記事はDB編ということで、下記の要素を扱います。

* データベース
    * Cloud SQL
    * Cloud Spanner
    * BigTable
    * Firestore
    * Cloud MemoryStore


:::note
この記事における「現在」や「最近」などの表現は、特に断らない限り2025年6月時点を指します
:::

## データベース

共通的な特徴

* 高カスタマイズ性とスケーラビリティ、高可用性
* セキュリティ
* モニタリング / ロギング


### Cloud SQL

* 汎用的なフルマネージドのRDBMS
    * リレーショナルで構造化されたデータを保持する
    * パッチ適用、バックアップ、障害復旧などが自動的に行われる
* MySQL, PostgreSQL, SQL Serverを利用できる
* 標準のSQLをサポート
* バックアップ機能
    * 自動バックアップ / 手動バックアップ
    * 増分バックアップ
    * ポイントインタイムリカバリ
* パフォーマンス
    * 読み書き両方ができるプライマリインスタンス（Primary Instance）
    * 読み込み専用のリードレプリカ（Read-Replica）
        * クロスリージョンのリードレプリカや、外部（オンプレミスなど）のレプリカも作成可能
    * 読み書きのワークロードを分離することで負荷を分散
    * 高可用性（HA）構成
        * リージョン内の異なるゾーンに、フェイルオーバーレプリカを作成することで高可用性（HA）構成を実現できる
        * Cloud SQLはリージョナルサービスのため、リージョンをまたいでフェイルオーバーレプリカを作成することはできない
        * 複数リージョンにわたる設計はディザスタリカバリ構成として行う必要がある


#### シャーディング

* データベースの負荷分散の手法
* データベース全体を複数の「シャード」（＝データのサブセット）に分割し、複数のサーバに分散配置することで水平方向にスケールする（スケールアウトする）手法
* レプリケーションの負荷を軽減し、レイテンシの低減に寄与する
* Cloud SQLはあくまで既存RDBMSのマネージド版であり、RDBMS自体にはシャーディング機能がないので、自動的にはシャーディングされない。ユーザーが手動で設計・管理する必要がある
    * Cloud SpannerなどのクラウドネイティブなDBは自動でシャーディングが行われる



### Cloud Spanner

* グローバルスケールのRDB
    * リレーショナルで構造化されたデータを保持
    * 地理的に分散されたデータセンター間でデータを自動的にレプリケート
    * 大量のデータを処理し、高いトランザクションを実現
* 水平スケーリングと強力なトランザクション整合性を両立
    * 通常、動的スケーリングが保証される場合はトランザクション整合性を保つのは難しいが、Cloud Spannerは強力なトランザクション整合性を持つ
* 標準のSQLをサポート
* OLTP（Online Transaction Processing）など高いトランザクションレートを持つシステムに適している
* 3つの構成オプションが選択できる
    * リージョン構成 / デュアルリージョン構成 / マルチリージョン構成
    * リージョン構成でも同一リージョンの複数ゾーンにデータが分散配置され高い可用性を提供するが、マルチリージョナル構成では地理的に分散した複数のリージョンにデータがレプリケートされ、より高い可用性を提供する


### BigTable

* 大規模な分散をサポートする、マネージドなNoSQLデータベース
* リアルタイムのアプリケーションや大量のデータを処理するバッチジョブ、分析ワークロードに適する
* 数TBから数PBまでスケーリングする
* スキーマ設計
    * 単一の主キーと任意の数の列。列は列ファミリにグループ化される
* Hadoopエコシステムとの互換
    * HBase API規格のサポート


### Firestore

フルマネージドなNoSQLドキュメントデータベース
2つのモードが提供されている

#### Firestoreネイティブモード

FirebaseにもGoogle Cloudにも統合されているドキュメント指向NoSQLデータベース
現在はこちらが推奨されている

* ドキュメント / コレクション モデルに基づいており、柔軟な入れ子構造が可能
    * ドキュメントはコレクションとしてグループ化される
    * ドキュメントはフィールドを持ち、サブコレクションを持つ
    * コレクションとドキュメントを効率的に検索、フィルタリングできる
* 高スケーラビリティ、高可用性、ACIDトランザクション対応
    * 複数のドキュメントやコレクションにまたがるトランザクションも可能
* リアルタイムの同期が可能で、クライアント側のSDK（Firebase SDK）を使えば、データの変更を即時にアプリへ反映できる
    * オフライン対応もサポートされており、オフライン時の変更はオンライン復帰時に自動で同期される
* モバイルアプリやWebアプリにおけるリアルタイム性が求められるユースケースに最適

#### Firestore Datastoreモード（旧 Cloud Datastore）

Datastoreモードは、従来のCloud Datastoreとの互換性を維持するために提供されているレガシー互換モード

* データ構造はエンティティ / Kind / プロパティモデルに基づく
    * RDBで言うテーブルやレコードに近い
* スケーラブルでトランザクションにも対応するが、トランザクションは単一のエンティティグループ内に制限される
* リアルタイム同期やオフライン対応はサポートされていない
    * クライアント側の更新検知にはポーリングなど自前の実装が必要
* App Engineとの親和性が高く、旧来のアプリケーションにおけるデータストアとして引き続き利用可能


### Cloud MemoryStore

* フルマネージドなインメモリデータストアサービス
* RedisとMemcachedをサポート
* キャッシュ、セッション管理、リアルタイムアプリケーションのデータストアとして利用
* 高いパフォーマンスと低レイテンシを実現
* Redisクラスタ構成による高可用性とスケーラビリティもサポート
【Python初心者】enumによる定数の管理方法まとめ

`enum` モジュールの使い方を整理しました。  
複数の定数を管理したり、条件分岐に意味をもたせたいときにとても便利です。

## enum とは？

`enum` は「列挙型（Enumeration）」と呼ばれる仕組みで、**名前のついた定数の集まり**を作ることができます。  
例えば、「状態」や「曜日」など、決まった選択肢の中から1つを選ぶような場合に使います。

## 基本的な使い方

まずは `Enum` クラスを使って、名前付きの定数を定義してみます。

```python
from enum import Enum

class Color(Enum):
    RED = 1
    GREEN = 2
    BLUE = 3
```

- `Color` というクラスに、`RED`, `GREEN`, `BLUE` という**名前付きの定数**を定義しています
- 各定数に **一意な値（ここでは1, 2, 3）** を割り当てています

## 値へのアクセス方法

### 名前でアクセス

```python
print(Color.RED)         # Color.RED
print(Color.RED.name)    # RED
print(Color.RED.value)   # 1
```

- `.name`：定数名（文字列）
- `.value`：定数に対応する値（任意の値が使える）

### 値から定数を取り出す

```python
print(Color(2))  # Color.GREEN
```

`Color(2)` のようにすると、値 2 に対応する `Color.GREEN` が取得されます。

## 比較演算もできる

列挙メンバー同士は比較可能です。

```python
print(Color.RED == Color.RED)    # True
print(Color.RED == Color.BLUE)   # False
```

ただし、**異なる Enum クラス間では比較できません**。

```python
class Shape(Enum):
    CIRCLE = 1

# print(Color.RED == Shape.CIRCLE)  # エラーになる（型が違う）
```

## ループで使う

Enum メンバーは `for` 文で繰り返し処理できます。

```python
for color in Color:
    print(color.name, color.value)
```

実行結果：

```
RED 1
GREEN 2
BLUE 3
```

## auto() を使って値を自動で割り当てる

毎回 `= 1, = 2...` と書くのが面倒なときは、`auto()` を使うと自動で値を割り当てられます。

```python
from enum import Enum, auto

class Status(Enum):
    READY = auto()
    RUNNING = auto()
    DONE = auto()
```

```python
for s in Status:
    print(s.name, s.value)
```

実行結果：

```
READY 1
RUNNING 2
DONE 3
```

- 内部的に 1, 2, 3... のような連番になります

## 文字列比較との違いと安全性

状態を文字列で管理するコードは次のように書けます。

```python
state = "DOING"

if state == "DOING":
    print("作業中です")
```

一見問題なさそうですが、実はこの方法には落とし穴があります。

```python
if state == "DOIGN":  # ← タイプミス
    print("作業中です")
```

- `"DOING"` と `"DOIGN"` は異なる文字列なので `False` になります
- でも **エラーにはならない** ので、**間違っていることに気づけません**

### Enum なら安全！

```python
from enum import Enum, auto

class TaskState(Enum):
    TODO = auto()
    DOING = auto()
    DONE = auto()

state = TaskState.DOING

# 正しい比較
if state == TaskState.DOING:
    print("作業中です")

# 間違った定数名を使うと…
# if state == TaskState.DOIGN:  # ← AttributeError が発生！
```

- 存在しない定数名を使うとすぐにエラーになるため、**ミスに気づきやすい**です
- これが Enum を使う大きなメリットのひとつです

## 実用例：状態管理に使う

列挙型は「状態がいくつかに限られている場合」に特に便利です。

```python
class TaskState(Enum):
    TODO = auto()
    DOING = auto()
    DONE = auto()

state = TaskState.DOING

if state == TaskState.DOING:
    print("作業中です")
```

## おわりに

今回は `enum` モジュールを使って、定数を名前付きで管理する方法をまとめました。

状態のように「限られた選択肢の中から1つを使う」場面では、文字列で比較するよりも enum を使う方がコードが読みやすく、安全になります。

たとえば `if state == "DOING"` のような文字列比較では、タイプミスをしてもエラーにならず、意図しないまま動いてしまうことがあります。

一方、enum を使えば `TaskState.DOING` のように明示的に比較でき、間違った名前を使うとエラーになるため、ミスを早い段階で発見できます。

今後は状態管理や設定値など、選択肢が決まっているデータには enum を積極的に使っていきたいと思います。
なぜダイアログボックスのボタンは「OK」になったのか？ 

# はじめに
最近、「レボリューション・イン・ザ・バレー ―開発者が語るMacintosh誕生の舞台裏」という本を購入しました。これは、Macintoshの開発当初からいた [Andy Hertzfeld](https://ja.wikipedia.org/wiki/%E3%82%A2%E3%83%B3%E3%83%87%E3%82%A3%E3%83%BB%E3%83%8F%E3%83%BC%E3%83%84%E3%83%95%E3%82%A7%E3%83%AB%E3%83%89) さんが当時を振り返ってまとめたものです。
元記事の一部は英語で読むことができます。

https://www.folklore.org/0-index.html

# 「OK」ボタンの誕生

https://www.folklore.org/Do_It.html

この記事の中で、[Lisa](https://ja.wikipedia.org/wiki/Lisa_(%E3%82%B3%E3%83%B3%E3%83%94%E3%83%A5%E3%83%BC%E3%82%BF)) のユーザーテストをしていた時に「Do It(実行)」と「Cancel(取り消し)」のラベルが付いているダイアログボックスが表示された時点で、数人のユーザーが「Do it(実行)」をクリックするべきところを、「Cancel(取り消し)」をクリックしてしまうことに設計者が気づきました。何が問題なのかなかなか分からなかったのです。

そのうち一人のユーザーがとりわけダイアログボックスに困惑して、少し腹を立てている様子だったため、そのユーザーに何が問題なのか聞いたところ、彼は「俺は間抜けじゃない、なぜこのソフトウェアは人を間抜け扱いするんだ？」と答えました。
彼は「Do It」がフォントのせいで間のスペースがあることに気が付かず、かつ「I」が小文字の「l」に見えたため、「[Dolt](https://ejje.weblio.jp/content/dolt)(間抜け)」と読み、気分を害していたのです。

少し検討してから、肯定の確認のラベルを「OK」に変更しました。「OK」は口語的すぎるという理由で、当初は敬遠されていたものだったのです。
しかし、ラベル変更後に問題は起こらなくなりました。

## Lisa 以前
Lisa 以前はどうだったのか気になり調べてみました。

### Xerox Alto（1973年開発）
世界初のパーソナルコンピュータの一つであり、マウス、ビットマップディスプレイ、GUI の原型（ウィンドウ、アイコン、マウスポインタ）など、多くの革新的な機能を備えていました。しかし、当時の GUI はまだ発展途上で、モーダルなポップアップウィンドウ（＝現代のダイアログボックスのようなもの） のようなインタラクションは、一般的ではありませんでした。

### Xerox Star（1981年）
世界初の商用GUIパソコン「Xerox Star」では、ユーザーの操作を確認・修正させるために、モーダルウィンドウ（後のダイアログボックス）が導入されました。
たとえば、ファイルを削除する際には「Are you sure?」といったメッセージが表示され、「Confirm」「Cancel」といった選択肢が提示されていました。

また、Xerox Starのプロパティシートでは「Do It」というラベルが使われていたとも言われています。

## 「OK」はなぜ選ばれたのか？
### 1. 英語としての「OK」の特性
「OK」は、英語圏で非常に口語的でありながらも、肯定・同意を示す言葉としてきわめて広く使われています。

* Yes より柔らかく
* Accept より自然で
* Proceed より簡潔

つまり、「とりあえず先に進めたい」という心理にマッチしていたのです。

### 2. UI上の制約とデザイン的利点

* **短い**（2文字）
* **あらゆる文脈に応用可能**（保存、送信、確認……）
* **国際化しやすい**（多くの言語で「OK」は通じる）

### 3. 他の案も存在した
実は初期のGUIでは、「Do It」「Confirm」「Accept」などのラベルも試されていました。

しかし、「Do It」は命令口調に聞こえる上、やや曖昧。「OK」のような柔らかさと汎用性には勝てなかったようです。

## 「OK」は本当にベストなのか？
現代のUXガイドライン（Apple Human Interface GuidelinesやGoogle Material Designなど）では、できる限り**具体的な動詞**をボタンラベルにすることが推奨されています。

### たとえば：

* "Save"（保存）
* "Delete"（削除）
* "Send"（送信）

これは、「ユーザーがその操作の意味を即座に理解できるようにする」ためです。
つまり、「OK」は意味が曖昧であるという批判も、近年では無視できなくなってきています。

# 最後に
「OK」は短く、使いやすく、世界中の人に受け入れられてきたボタンラベルです。
しかし、だからこそ、その背後にある「何をOKしたのか？」という意味がぼやけがちになります。
アプリやWebサービスをデザインするとき、「本当にこのボタンは「OK」でよいのか？」を今一度問い直してみるのもいいかもしれませんね。
【MS】クラウド管理者向けセミナー行ってみた（その１）

本日（6/17）「クラウド管理者向けクラウド・セキュリティ実践セミナー」なるものがMS＠品川にて開催されたので行ってきました。

大変勉強になる内容だったので、その内容をざっくりまとめてみようと思います。

ざっくりいうと、AzureやAWS、GCPなどのクラウドを管理する人たちを対象としたセミナーで、Defender for Cloudについてやフレームワーク、Azure ネットワークやセキュリティプロダクトのアップデートについての話という感じでした。
（ほかにも導入事例やGitHub Advanced Securityの概要とベストプラクティスの紹介などもありましたが、主にMS製品・サービスについて触れます。）

:::note warn
なお、これは私自身が聞いて思ったことなどなので、正解ではない可能性もありますし、情報は更新されていくので、各々の責任・判断でご閲覧ください。
:::

クラウドセキュリティにおける課題
-------------------------
まず、クラウドにおける重大なセキュリティの脅威はCSA（Cloud Security Alliance）が公開しています。

https://www.cloudsecurityalliance.jp/site/?p=35829

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/4103210/98ed7dab-3e23-47f7-a913-67dcd59e9247.png)
その中でも上位に挙がっている
①設定ミスと不十分な変更管理
②アイデンティティとアクセス管理（IAM）
③クラウドセキュリティのアーキテクチャと戦略の欠如
について、上から以下の実態があります。

①不適切な設定が検出されないまま放置される。
②クラウド環境への理解と管理戦略の欠如。
③継続的な評価の仕組みがない。

これは確かに…そうだなと思います。
マニュアルを作ってもその目的や本質が理解されないと形骸化してしまうし、適切な運用ができないと安全な運用だけでなく、不要なコストがかかってしまうこともあると思います。（ログの精査、データのバックアップサイクル、ストレージや仮想マシンのパフォーマンスに応じた最適構成化等。肌感覚ですが）

そこで、<b>Defender for Cloud</b>を導入して運用しましょう。ということです。
※漏えい等は下手したら10年単位で駄々洩れになっていることも少なくないようなので、やはり構築したらおしまいではなく、運用の中で定期的に検査することが重要です。

Defender for Cloudとは・・・
・DevOps（DevSecOps）
・クラウドワークフロー保護
・クラウドセキュリティ能勢管理
・クラウドインフラストラクチャエンタイトルメント管理
など、様々なサイバー脅威や脆弱性から保護されたクラウドネイティブアプリケーション保護プラットフォーム（CNAPP：Cloud-Native Application Protection Platform）です。

簡単に言うと、<b>コードからライフサイクルまで全体を通して保護しましょう。</b>という考えです。

https://learn.microsoft.com/ja-jp/azure/defender-for-cloud/defender-for-cloud-introduction

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/4103210/405381d1-609f-419c-9b71-e03a2f3821e4.png)


Defeder for Cloudには大きく3つの機能があります。

| No | 機能 | 概要 | 
|:-:|:-|:-|
| 1 |DevOps |マルチクラウド環境とマルチパイプライン環境全体でコード レベルでセキュリティ管理を統合する開発セキュリティ運用ソリューション   | 
| 2 |CSPM（Cloud Security Posture Management） |侵害を防ぐためのアクションを識別するクラウド セキュリティ体制管理ソリューション   |
| 3 |CWPP（Cloud Workload Protection Platform） |サーバー、コンテナー、ストレージ、データベース、およびその他のワークロードの保護を備えたクラウド ワークロード保護プラットフォーム   |

CSPMなんかは無料版と有料版でできることに差異がありますが、無料版でもなかなか良い機能が提供されています。

https://learn.microsoft.com/ja-jp/azure/defender-for-cloud/concept-cloud-security-posture-management

CWPPは今後は生成AIに対しても対象となり、AWSやGoogleもカバーするので、一気通貫に管理するためには非常に有用ですね。

自分もCSPMでセキュリティスコアを良く見たりしますが、全体に対してスコアや推奨事項が定量的に見れるのはありがたいですね。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/4103210/8aae2d05-af14-46da-a47e-ac4c28a3434f.png)

※こちらはサンプルですが、csvでエクスポートもできるので、レポートを作ったり、ピポットテーブルで集計をカスタマイズしたりもできるので、結構便利です。

いじれる環境がある方はいろいろ触ってみるとよいと思います。無料でも結構出来ることがありますね。

ワークロードの保護などはやはりAIは注目されており、Azure AI Contents Safetyという仕組み（サービス）もしっかり取り入れていくことを検討しないといけないですね。
※例えば、武器の作り方を聞くとそれは教えてくれない。という制御は割と簡単に組み込めるようですが、その武器の「歴史」を聞いた流れで「作り方」を聞くとそのまま教えてくれちゃうことがあるようです。そういう、途中から誘導するような対話をしていてもしっかりと倫理感をもって制御するのがこのサービスみたいです。

https://learn.microsoft.com/ja-jp/azure/ai-services/content-safety/overview

しかし、AIしかりSNSしかり、インターネットが当たり前の世界で生きていく中できちんと理性と倫理観はもっていきたいですね。

クラーク博士の「紳士たれ」に考えさせられます。

ということで、セミナーのイントロダクションにもなるDefender for Cloudの概要の話までしかできていませんが、いったん本日はこちらまでとしたいと思います。

続きはまた今度にしたいと思います。

ご覧頂きありがとうございました
Spring Framework WebClient 接続先ごとに ConnectionProvider を分ける



## ✅ 分けるべき典型パターン

| 接続先ごとの違い                         | 影響                           | 分離理由                            |
| -------------------------------- | ---------------------------- | ------------------------------- |
| keep-alive タイムアウト値が異なる           | 不要な `Connection reset` が発生する | `maxIdleTime()` などを個別に調整する必要がある |
| アクセス頻度・同時接続数が大きく異なる              | 接続プールの枯渇・過負荷の原因に             | `maxConnections()` を用途に応じて最適化   |
| 特定接続先でだけ異常が頻発                    | 原因調査・制御が困難になる                | ログ・リトライ・タイムアウトなどを分けやすくなる        |
| 一部の相手は HTTP/1.1、一部は HTTP/2（ALPN） | プロトコル設定を別々にしたい               | HTTP クライアントごとに設定を切り替え可能に        |

---

## 🧪 実装例：接続先ごとに `WebClient` を分ける

```java
public class WebClientFactory {

    private static final WebClient clientA;
    private static final WebClient clientB;

    static {
        ConnectionProvider providerA = ConnectionProvider.builder("clientA")
            .maxConnections(50)
            .maxIdleTime(Duration.ofSeconds(55))  // 相手Aは ALB 60秒設定に合わせる
            .evictInBackground(Duration.ofSeconds(30))
            .build();

        ConnectionProvider providerB = ConnectionProvider.builder("clientB")
            .maxConnections(100)
            .maxIdleTime(Duration.ofSeconds(300)) // 相手Bは長めのkeep-aliveに対応
            .evictInBackground(Duration.ofSeconds(60))
            .build();

        HttpClient httpClientA = HttpClient.create(providerA)
            .responseTimeout(Duration.ofSeconds(10));
        HttpClient httpClientB = HttpClient.create(providerB)
            .responseTimeout(Duration.ofSeconds(20));

        clientA = WebClient.builder()
            .baseUrl("https://api.partner-a.com")
            .clientConnector(new ReactorClientHttpConnector(httpClientA))
            .build();

        clientB = WebClient.builder()
            .baseUrl("https://api.partner-b.com")
            .clientConnector(new ReactorClientHttpConnector(httpClientB))
            .build();
    }

    public static WebClient getClientA() {
        return clientA;
    }

    public static WebClient getClientB() {
        return clientB;
    }
}
```

---

## 🔍 ポイント

* `ConnectionProvider` を名前付きで個別作成
* 再利用を前提に Singleton / Factory 化
* 各 `HttpClient` に対し、`responseTimeout()` など個別設定も可
* Micrometer などで監視する場合にもラベルごとに分けやすくなる

---

## ✅ 結論

> **「接続先ごとに `ConnectionProvider` を分ける」＝ 接続設定を安全に最適化し、安定性・可観測性を高める鍵**

* 問題の切り分けも簡単になる
* チューニング・トラブル対応も柔軟にできる
* 大規模なシステム連携では「必須」と言ってもいいレベルです
Apple WalletのSuica情報はサードパーティでは取得できない

Apple Walletのフレームワーク「PassKit」には、`PKSuicaPassProperties` (Suicaのプロパティ)というクラスが存在する。
これはその名の通り交通系ICカードのSuicaを指しており、Apple Walletに登録されたSuicaの情報を取得できる。
`isInShinkansenStation`や`isGreenCarTicketUsed`など「新幹線」「グリーン車」のような直球的な名前のプロパティや、`transitBalance`のように残高が取得できるプロパティも存在する。
またSuica以外の交通系IC用(おそらく海外用)に`PKTransitPassProperties`というクラスもある。

実際にApple純正のマップアプリではWalletの交通系ICから残高を取得している。
![IMG_9510.jpeg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/4095975/bbe44ecd-8131-472a-b4e8-f60eb34f6b22.jpeg)

だが、Appleや発行元以外はこの情報を叩くことはできないようだ。
交通系ICに限らず、現時点でPassKitから情報取得できるパスはアプリが署名されたチームが発行したもののみで、仮にパスのIDをentitlementsに追加しても署名時にエラーとなる。
![スクリーンショット 2025-06-17 23.08.58.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/4095975/9dd43447-a52d-4a0c-8809-2a83fc43c4f9.png)

おそらくプライベートAPIではなく特殊な権限が与えられたアカウントで署名しないと実装できないので、交通系ICを発行した事業者かAppleでないと実装できないものと思われる。
セキュリティの都合上仕方ないのは理解できるが、カメラやマイクのようにユーザー許可制でアクセスできるように解放してもらいたい。
それと、唯一これを実装できるJR各社にはウィジェットで残高表示できるようにしてほしい。

（ちなみにSuica/PASMO/ICOCAはどれも利用履歴APIが公開されておらず、公式サイトのスクレイピング以外では残高照会を使った履歴取得はできない。物理的にFelicaを読み取れば読めるが手動更新の必要がある。）
Amazon Q CLIを使ってゲーム作ってみた

# はじめに

Amazon Q CLI でゲームを作ろう Tシャツキャンペーンを知り、今までamaoznQ CLIを使ったことがなかったのでいい機会だと思いチャレンジしてみました。(Tシャツがとても欲しかったのもあります。)
https://aws.amazon.com/jp/blogs/news/build-games-with-amazon-q-cli-and-score-a-t-shirt/

# Amazon Q CLIとは
Amazon Q CLI は、AWS Command Line Interface (AWS CLI) の機能を拡張する、生成AIを搭載したアシスタントです。自然言語での指示を理解し、AWS のサービス操作やコード生成などをサポートしてくれます。

# ゲーム作成
今回はAmazon Qを使って大人気パズルゲームのスイカゲームを真似たゲームを制作してみようと思います。

## Amazon Q CLIのチャットセッションを開始
Amazon Q CLIをインストールしたらさっそくチャットを動かしてみます。
```bash:
q chat
```
わかりやすい大きなロゴとともにチャットセッションが始まりました。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3912030/7aa4d700-08e7-4199-bf1b-f19c3d6a0c8e.png)

## ゲーム内容
Amzon Q CLIはチャットで簡単な指示からもゲームを作ることは可能ですが、最初からある程度完成させたいビジョンが決まっていたためplan.mdファイルを作成しそれを読み込んでもらう事でゲームのたたき台を作ってもらいました。
```md:plan.md
# ゲーム名：コイシゲーム

## 1. ゲーム概要

* **ゲームタイトル (仮):** 『コイシゲーム』
* **ジャンル:** パズルゲーム
# 人気のスイカゲームのようなゲームを作りたい。
---

## 2. 環境設定

* **開発環境:** WSL2 (Ubuntu 22.04)
* **主要ライブラリ:** **Pygame**

## 3. コアシステム

* 上から石を落として同じランクの石が触れ合うと合体して一つ上のランクの石になる
* 石のランクは、小石<砂利<丸石<砂岩<水晶<翡翠<ルビー<サファイア<金<ダイヤで上がっていく
* 上から落ちてくる石は、小石/砂利/丸石の三種類がランダムに選ばれる
* プレイヤーは石を落とす位置を左右に移動することと落とす操作のみできる
* 石同士がくっついてランクが上がる時にそのランクに応じたポイントが入る
* エリアが決まっており、そのエリアからはみ出るとゲームオーバー
```

## いざ作成依頼！
それではplan.mdを読み込んで実際にゲームを作ってもらいましょう。**Amazon Qのお手並み拝見！！**
```bash:
>plan.mdの内容を確認してゲームを実装してください。
まず、plan.mdファイルの内容を確認して、実装すべき内容を把握しましょう。
```
動き出しました。次に何をするのか解説しながら処理してくれるのは安心感があります。
```bash:
Using tool: fs_read(trusted)

●Reading file: /amazno-Q-game/src/plan.md, all lines

●Completed in 0.0s
plan.mdの内容を確認しました。「コイシゲーム」というパズルゲームを実装する計画のようです。スイカゲームのような合体系パズルゲームで、Pygameを使って開発する予定です。

それでは、この計画に基づいて実装を進めていきましょう。まず、必要なファイル構成を作成し、基本的なゲームフレームワークを実装します。
```
Game.pyとREADME.mdを作成してくれました。次は何をしてくれるのでしょうか。
```bash:
Using tool: execute_bash

●I will run the following shell command:
cd amazon-Q-game/src && python -m pygame.examples.aliens

↳Purpose: Pygameがインストールされているか確認するためのテスト
```
ここで最初のびっくりポイントがありました。私の開発環境にPygameをインストールしていなかったのですが、主要ライブラリにPygameと指定しておいたら、**Pygameがインストールされているか確認し、その後自動でPygameをインストールまでしてくれました。**
ただ勝手にインストールされる怖さもあるので慎重になる必要もありそうです。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3912030/dc87fd84-5d15-46cb-8c47-8eba9e57a6ef.png)

そんなこんなで依頼から10分ほど待つとゲームが完成しました。

## 初回ゲーム
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3912030/f763e894-c602-4ed2-adb9-f18436933449.png)
う～ん、思っていた感じと違う…。でも動きとしては大体指定していた通りになっていますし、何より0からのスタートで10分ほどで動くものが完成したと思うとその速さにはびっくりです。

ここからはチャットでもっと色や大きさ、仕様の変更などかれこれ2時間ぐらい注文を繰り返してみました。

## 完成品
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3912030/325246fa-39cb-4ef2-9aca-7d3020d315f8.png)
ポップな感じのゲームができたのではないでしょうか！まだまだ改善し足りない所を上げたらきりがないですがスタートから3時間ほどで思っていたようなスイカゲームライクのゲームが作れました。

# 感想
とにかく0から一発でそれなりに動くものを作ってくれる速さには驚きました。Amazon Q CLI を使った今回のゲーム開発は、私にとって非常に画期的な体験でした。

ゼロからコードを書く手間が大幅に削減され、アイデアをすぐに形にできる感覚は、これまでの開発プロセスとは全く異なるものでした。

もちろん、生成されたコードの確認や微調整は必要ですし、微調整までQにさせようとすると一か所直したらさっき直した部分が元に戻るなど思うようにいかない部分もまだありました。しかし**開発のとっかかり**を与えてくれて、その後のプロセスをスムーズにしてくれる強力なツールであると実感しました。今後のさらなる進化が非常に楽しみです。
競プロ日記#25/06/17

# 競技プログラミングの鉄則

[A18 - Subset Sum](https://atcoder.jp/contests/tessoku-book/tasks/tessoku_book_r)
- 二次元DPの部分和問題について復習
- 一度目に解いたときも記したが二次元配列の[i][j]が単純に平面を表現しているわけではなく[i]は使うカードの枚数で[j]は和として表現できる対象の値であるという使い方

[A51 - Stack](https://atcoder.jp/contests/tessoku-book/tasks/tessoku_book_ay)
- Stackの実装についての基礎問題

[A52 - Queue](https://atcoder.jp/contests/tessoku-book/tasks/tessoku_book_az)
- Queueの実装についての基礎問題

[A53 - Priority Queue](https://atcoder.jp/contests/tessoku-book/tasks/tessoku_book_ba)
- 優先度付きキューについての基礎問題。この知識一撃で解ける問題もあったりするらしいので必須知識。

# 余談だん
本当に最近の無気力感が異常すぎてやばい。
競プロだけじゃなくて何もかもに気力を感じられない。よろしくない。
Claude CodeのWindows版で音を鳴らす方法

# Claude Codeで音を鳴らしたい！！
みなさん、Cluade Code使ってますか？
Mac環境での音の出し方はそこいら中に書いてあるんですが、Windows+WSL2環境についてなかったので備忘がてら書いておきます。
対応状況が二転三転しているようなのでどのバージョンでもできる、といえない状態のようです。 1.0.25 (Claude Code) での動作を確認しています。
# 対応方法
コマンドそのものは以下のような物になります。
``` Powershell:sound.ps
powershell.exe -Command '[System.Media.SystemSounds]::Hand.Play()'
```
これでWindowsの設定された警告音が鳴るはずです。WSL上でもWindowsのコマンドを呼ぶことができ、Windowsユーザーなら誰でも.Net Frameworks上のサウンドを鳴らすことができるわけです。

次に、Claude Codeで音声を鳴らすためには、たとえばCLAUDE.mdにこう記述してみてください。
``` markdown:CLAUDE.md
If you finish your works or you show to use message, use this command.
powershell.exe -Command '[System.Media.SystemSounds]::Hand.Play()'
```
あとは実行時にClaude CodeからPowerShellコマンドを使って良いか聞かれるので、自力でいつでも使えるように許可を与えてください。

参考資料。音の出し分けができるみたいなので、他の音を使いたいときはこちらからどうぞ。
https://learn.microsoft.com/nb-no/dotnet/api/system.media.systemsounds.hand?view=netframework-4.7.1
（自分用）「超シンプルなAIをPythonで作ってStreamlitで動かしてみる（予測モデルを保存して再利用）」

# 超シンプルなAIをPythonで作ってStreamlitで動かしてみた（予測モデルを保存して再利用）

こんにちは、最近AIに興味を持ち始めた初心者です！

「AIってどうやって作るの？」「とにかくシンプルなAIを試してみたい！」という思いで、
PythonとStreamlitを使って、超かんたんなAIを作ってみました。

今回は「時間から売上を予測するAIモデル」を作って、
学習済みモデルを保存し、Streamlitアプリで再利用するところまでやってみました！

---

## 📌 やったこと
- Pythonで機械学習（線形回帰）を使ってAIモデルを作成
- 学習済みモデルをファイルに保存
- StreamlitでWebアプリ化
- ユーザーの入力に応じて売上を予測して表示
---

## 🧠 1. 学習用コード（model.pklを作成）

まずは学習用のスクリプトを作成します。

```python:data_model.py
from sklearn.linear_model import LinearRegression
import joblib

# 学習データ
X = [[1], [2], [3]]
y = [100, 200, 300]

# モデル作成＆学習
model = LinearRegression()
model.fit(X, y)

# モデルを保存
joblib.dump(model, 'model.pkl')
print("✅ モデルを保存しました")
```
🖥️ 2. Streamlitアプリで予測してみる
--
次に、保存したモデルを使ってユーザーからの入力で予測を行うStreamlitアプリを作る。
```python:main.py
import streamlit as st
import joblib

# モデルを読み込み
model = joblib.load("model.pkl")

# アプリのタイトル
st.title("売り上げ予測AIシステム")

# ユーザーからの入力
user_input = st.number_input("何時間後の売上を予測したいか？", min_value=0, step=1)

# 予測ボタン
if st.button("予測する"):
    try:
        prediction = model.predict([[user_input]])
        st.success(f"{user_input}時間後の売上予測は {prediction[0]:.2f} 個です")
    except Exception as e:
        st.error(f"エラーが発生しました: {e}")
```
▶️ 実行方法
---
Streamlitアプリは以下のコマンドで起動できます。
```bash:bash
streamlit run main.py
```
📚 おわりに
--
AIはなんだか難しそうと思っていましたが、
「学習 → 保存 → 予測」 という流れを理解することで、ぐっと身近に感じた。
python-build-standalone で爆速起動のPythonツールを配布する

Pythonで書いた簡単なスクリプトを手軽に共有したいとき、ユーザー側のPython環境は悩みの種です。

- Pythonのインストールは面倒
- パッケージのインストールはもっと面倒
- [PyInstaller](https://pyinstaller.org/) はウィルス誤検知されるし起動が遅い
- [Nuitka](https://nuitka.net/) はビルドが大変
- 本家Pythonの [Embeddable Package](https://docs.python.org/ja/3.13/using/windows.html#windows-embeddable) はpipが入ってない

これらを解決してくれる [python-build-standalone](https://github.com/astral-sh/python-build-standalone) というプロジェクトがいつの間にか爆誕していました。
実は、[uv](https://github.com/astral-sh/uv) のPythonのインストールや実行が速いのは[このディストリビューションを使っている](https://astral.sh/blog/python-build-standalone)からだそうです。

## python-build-standalone とは？

- 完全にポータブルなPython環境（レジストリや環境変数に依存しない）
- 超高速な起動（パス探索や動的読み込みを省き最適化）
- pipによるパッケージ追加も簡単
- ユーザーはフォルダを解凍するだけで即使える

## 導入方法

### ダウンロード

[リリースページ](https://github.com/astral-sh/python-build-standalone/releases) から目的のシステム向けのビルドを入手します。
ファイルが多くて面食らいますが、

- Pythonバージョン
- [CPUアーキテクチャ](https://gregoryszorc.com/docs/python-build-standalone/main/running.html#obtaining-distributions)
- OS
- [ビルドのバリエーション](https://gregoryszorc.com/docs/python-build-standalone/main/running.html#obtaining-distributions)

を選んでダウンロードします。
ビルドのバリエーションは下記どちらかを使えば問題ないでしょう。

- `install_only`: 標準的な最小構成
- `install_only_stripped`: デバッグ機能を省いたさらに軽量なもの

今回は `cpython-3.12.11+20250612-x86_64-pc-windows-msvc-install_only.tar.gz` を使います。解凍すると下記のようになります。

```
# 主要なファイル以外は省略
project/
└─ python/
   ├─ python.exe
   ├─ python312.dll
   ├─ Lib/
   └─ DLLs/
```

### pipパッケージのインストール

pipが付属しているので簡単にインストールできます[^1]。
[^1]: パッケージは `python\Lib\site-packages` にインストールされます。

```winbatch
cd python
.\python.exe -m pip install -U pip
.\python.exe -m pip install requests
```

## 実行

「それだけ？」って感じですが、既にちゃんと `python.exe main.py` で実行できるようになっています。

```python: main.py
import requests
input("import successful!")
```

```
> .\python.exe main.py
import successful!
```

## 配布

社内ツールなら、下記のようなフォルダ構成にしておいて、

```
project/
├─ python/
├─ src/main.py
└─ run.bat
```

起動用のバッチファイルには下記のようにでも書いておけばOKです。

```winbatch: run.bat
python\python.exe src\main.py %*
```

これだけで、パッケージも含めたPython環境と一緒にツールを配布できます。起動も爆速！ぜひお試しあれ。
PVEのZFSプール上でNFSを利用する



## ユースケース

以下みたいなケースで、ファイル共有がほしくなったので手順をメモ。

- PVEノード構成
  - クラスタにNFS等の共有ストレージなし
  - OS用のディスクは小さめ
  - VM用のディスクは大き目かつZFS
- ファイル共有したい理由
  - ISOイメージ等を各PVEノードのlocal（デフォルト作成されるディレクトリ）に用意するのが大変
  - インポートウィザード以外の移行方式の場合にlocalがあるディスクが足りない
    - OVA/OVFインポート
    - P2V（Clonezillaとか）
      - ディスク→イメージを想定。ディスク→ディスクなら不要だが、失敗時の切り分け・手戻りを考慮。
    - [Attach Disk & Move Disk (minimal downtime)](https://pve.proxmox.com/wiki/Migrate_to_Proxmox_VE#Attach_Disk_&_Move_Disk_(minimal_downtime))
      - ZFSだとraw形式以外がVMディスクとして利用できないので、NFSとすることでvmdk形式が利用出来る点も〇


## 手順

### 有効化

- NFSのパッケージインストール
- 作成済みのZFSプールにNFS用のZFSファイルシステム作成
- 作成したZFSファイルシステムにNFS権限設定
  - この時、PVEをrootで利用していると`no_root_squash`が必要なのがはまりポイント。
- サービス設定


```
apt update
apt install nfs-kernel-server

zfs create mypool/share

zfs set sharenfs="rw=@xxx.xxx.xxx.xxx/xx,no_root_squash" mypool/share
zfs get sharenfs mypool/share

systemctl start nfs-kernel-server
systemctl enable nfs-kernel-server
```



### 無効化

作業終了したら無効化。

:::note alert
VMのディスクとしてNFSを利用していても、ストレージから削除出来たり、NFS共有設定を削除出来てしまう。
この時、VMとディスクを削除出来なくなってしまい面倒なので、先にVM等で利用されていないこと・ZFSファイルシステムが空であることを確認したほうがいい。
:::



```
systemctl stop nfs-kernel-server
systemctl disable nfs-kernel-server

zfs set sharenfs=off mypool/share
zfs destroy mypool/share
```


## メモ

Clonezilla等であれば関係ないが、[Attach Disk & Move Disk (minimal downtime)](https://pve.proxmox.com/wiki/Migrate_to_Proxmox_VE#Attach_Disk_&_Move_Disk_(minimal_downtime))などESXiからNFSにファイルをコピーする際、ESXiのAPI制限を受けて速度が出ないため、やり方検討したい。（未検討）
ただし、API制限がかかっているのでESXiの利用状況を気にしなくていい、という観点はあり。
※無制限で帯域等の使用して、既存のESXi利用に影響出ちゃうとか。


- データストアとしてでなく、普通にNFSとしてマウントする？
- ESXiローカルからNFSにストレージマイグレーションする？
  - vCenterが必要っぽい？
非線形の単振り子の運動方程式を出発点として、逐次線形化 → 離散化 → デジタル伝達関数（Z変換）



## ✅ 1. 非線形の単振り子の運動方程式

空気抵抗・外力なしの単振り子：

$$
\frac{d^2 \theta(t)}{dt^2} + \frac{g}{L} \sin\theta(t) = 0
$$

* $\theta(t)$：時間 $t$ における角度（\[rad]）
* $g$：重力加速度
* $L$：振り子の長さ

---

## ✅ 2. 状態空間化（非線形状態方程式）

状態変数：

$$
x_1 = \theta(t), \quad x_2 = \dot{\theta}(t)
$$

$$
\frac{d}{dt}
\begin{bmatrix}
x_1 \\ x_2
\end{bmatrix}
=
\begin{bmatrix}
x_2 \\
- \frac{g}{L} \sin x_1
\end{bmatrix}
$$

---

## ✅ 3. 任意点 $(x_1^0, x_2^0)$ における**逐次線形化**

ヤコビ行列（偏微分による線形化）：

$$
A =
\begin{bmatrix}
0 & 1 \\
- \frac{g}{L} \cos x_1^0 & 0
\end{bmatrix}
$$

入力 $u(t)$ がある場合（例：トルク）には、右辺に $+Bu(t)$ を加える：

$$
B =
\begin{bmatrix}
0 \\
1
\end{bmatrix}
$$

---

## ✅ 4. 離散化（オイラー法）

連続系：

$$
\dot{x}(t) = A x(t) + B u(t)
$$

オイラー法で離散化：

$$
x_{k+1} = (I + A \Delta t)x_k + B \Delta t \cdot u_k
\quad := A_d x_k + B_d u_k
$$

---

## ✅ 5. 離散時間伝達関数（Z変換）

出力 $y_k = C x_k$, 状態空間：

$$
x_{k+1} = A_d x_k + B_d u_k \\
y_k = C x_k
$$

Z変換を用いた伝達関数（1入力1出力）：

$$
G(z) = C (zI - A_d)^{-1} B_d
$$

---

## ✅ 6. 数値例付き：Pythonで実装可能な形

仮に基準点 $x_1^0 = 0$ 付近での線形化（小角近似）とすると：

$$
A = \begin{bmatrix}
0 & 1 \\
- \frac{g}{L} & 0
\end{bmatrix}
$$

$$
A_d = I + A \Delta t, \quad B_d = B \Delta t
$$

出力 $y_k = x_{1,k}$（角度）とすれば：

$$
C = \begin{bmatrix}1 & 0\end{bmatrix}
$$

→ このときの伝達関数は 2次系：

$$
G(z) = \frac{\text{numerator}}{z^2 + a_1 z + a_2}
$$

---
運動方程式 ↔ 畳み込み積分 ↔ 伝達関数



## ✅ 1. ラプラス変換の基本対応

ラプラス変換における**畳み込み定理（Convolution Theorem）**：

$$
\mathcal{L}\left[ (f * g)(t) \right] = F(s) \cdot G(s)
$$

したがって、時間領域で：

$$
x(t) = (g * u)(t) = \int_0^t g(\tau) \cdot u(t - \tau) \, d\tau
$$

ここで：

* $g(t)$：**インパルス応答**（伝達関数 $G(s)$ のラプラス逆変換）
* $u(t)$：入力
* $x(t)$：出力

---

## ✅ 2. システム例（質量–ダンパ–ばね系）

運動方程式：

$$
m\ddot{x}(t) + c\dot{x}(t) + kx(t) = u(t)
$$

ラプラス変換：

$$
X(s) = G(s) \cdot U(s), \quad G(s) = \frac{1}{ms^2 + cs + k}
$$

---

## ✅ 3. インパルス応答 $g(t)$

ラプラス逆変換により：

$$
g(t) = \mathcal{L}^{-1}[G(s)] = \text{（2次系の応答：指数 or 減衰振動）}
$$

例（過減衰）：

$$
g(t) = \frac{1}{m(\lambda_2 - \lambda_1)}\left(e^{\lambda_1 t} - e^{\lambda_2 t} \right), \quad \lambda_{1,2} = \text{固有根}
$$

---

## ✅ 4. 畳み込み積分による出力：

$$
x(t) = \int_0^t g(\tau) u(t - \tau) \, d\tau
\quad \text{（= 入力 × インパルス応答）}
$$

この積分は「**過去の入力履歴の加重和（=遅れの分布）**」として解釈されます。

---

## ✅ 5. まとめ：伝達関数 ↔ 畳み込み積分の対応表

| 項目    | 周波数領域（s領域）                 | 時間領域（t領域）                                 |
| ----- | -------------------------- | ----------------------------------------- |
| 入力    | $U(s)$                     | $u(t)$                                    |
| 出力    | $X(s) = G(s) U(s)$         | $x(t) = \int_0^t g(\tau) u(t-\tau) d\tau$ |
| 伝達関数  | $G(s) = \frac{X(s)}{U(s)}$ | $g(t) = \mathcal{L}^{-1}[G(s)]$           |
| 物理的意味 | 応答特性のフィルタ作用                | 入力の時間的重み付き積分（遅れの影響）                       |

---

## ✅ 追加例（ステップ応答）

入力：単位ステップ $u(t) = 1$ の場合：

$$
x(t) = \int_0^t g(\tau) \cdot 1 \, d\tau = \int_0^t g(\tau) d\tau
\quad \Rightarrow \quad \text{ステップ応答}
$$

---

## ✅ 結論：

伝達関数の式：

$$
G(s) = \frac{X(s)}{U(s)} = \frac{1}{ms^2 + cs + k}
\quad \Rightarrow \quad
x(t) = \int_0^t g(\tau) u(t - \tau) d\tau
$$