OmniAICreator/Qiita-1.07M huggingface dataset:
🧱 NestJSでモジュール肥大化して詰んだ話と、それをどう整理したか

## はじめに

> 「最初はControllerとService1個ずつでいいと思ってた」

NestJSで個人開発してたとき、最初は小さな機能だったから特に設計も気にせず進めてた。  
だけど、ユースケースが増えるたびにモジュールが肥大化していき、  
気づけば「このモジュール、誰も触りたくないやつ」になってた。

この記事では、そんな **モジュール肥大化で詰んだ実体験**と、  
それを **どうリファクタリングして乗り越えたか**をまとめておきます。

---

## 🧩 最初の構成（小さく始めたつもりだった）

```plaintext
src/
└── user/
    ├── user.module.ts
    ├── user.controller.ts
    ├── user.service.ts
    └── user.entity.ts
```
## 💥 詰んだ構成

最初はこんな感じだった。

- `Controller` にAPI10個以上
- `Service` にロジックどんどん生やす
- `Entity` をそのままレスポンスに使ってた

正直これで快適だった。が……。

---

## 💣 詰んだ瞬間

- `user.service.ts` が **500行超え**
- `createUser()` が **分岐だらけ**（招待コードあり/なし、キャンペーン経由など）
- **Entityをそのまま返してた**せいで、Prismaの構造が外にモロバレ
- テストしようとしたら、**DB依存が強すぎて単体化できない**
- フロントの仕様変更がくるたびに、**コードの影響範囲が爆発**

---

## 🛠️ モジュール分割でやったこと

### ✅ ユースケースごとに Service を分けた

```plaintext
src/
└── user/
    ├── use-case/
    │   ├── create-user-with-invite.service.ts
    │   ├── sync-user-profile.service.ts
    │   └── ...
```

→ 「**1ファイル＝1目的**」にしたら、思考も整理されてテストもしやすくなった。

---

### ✅ DTO と Entity を完全に分離

- `user.entity.ts` は **Prismaモデルに専念**
- `dto/` フォルダを作って、`CreateUserDto`, `UserResponseDto` を分離
- クライアントに返すレスポンスも **明示的に型定義**できるようになった

---

### ✅ Mapper を導入して変換処理を明確化

```ts
// user.mapper.ts
export class UserMapper {
  static toDto(entity: UserEntity): UserResponseDto {
    return {
      id: entity.id,
      name: entity.name,
      email: entity.email,
      // ...
    };
  }
}
```

→ これで「どこで Entity → DTO になるか」が一目で分かるように。

---

## 📐 リファクタ後の構成（抜粋）

```plaintext
src/
└── modules/
    └── user/
        ├── user.module.ts
        ├── api/
        │   ├── user.controller.ts
        │   └── dtos/
        ├── use-case/
        │   ├── create-user-with-invite.service.ts
        │   └── sync-profile.service.ts
        ├── core/
        │   ├── entities/
        │   ├── repositories/
        │   └── mappers/

```


- `Controller` は **API専用**
- `UseCase層` に処理を集約
- `Domainっぽい形` で整理が効くように

---

## 🔁 やって良かったこと／やりすぎたこと

### ✅ やって良かった

| 取り組み                        | 理由                                      |
|--------------------------------|-------------------------------------------|
| ユースケースごとにService分割  | テスト・リーダブル・拡張性全部向上        |
| DTOとEntityの完全分離          | Prismaに引きずられないAPI設計ができた     |
| Mapper導入                     | データ変換の責任範囲が明確になった        |

---

### ⚠ やりすぎたかも

| 取り組み                  | 理由                                               |
|--------------------------|----------------------------------------------------|
| Serviceが細かくなりすぎた | ファイル数が爆増。探すのが手間（命名でカバーした） |
| Mapperに処理詰めすぎた   | 共通化しすぎて逆に再利用性が落ちた場面もあった    |

---

## ✅ まとめ

- NestJSは**構造化しやすい反面、モジュールを育てすぎると破綻する**
- 特に個人開発だと、最初は雑に始めがち
- でも、**後から整理しても全然間に合う**
- モジュールが大きくなったら、**「ユースケース単位でServiceを切る」**のが第一歩

---

## 🙌 最後に

設計って「最初から完璧」にできることはほぼない。  
でも、**詰んだ時に構成を見直せるかどうかで、その後の開発体験が全然変わる。**

自分みたいに「やばい、Service肥大しすぎた…」ってなった人の参考になればうれしいです。
「js」setTimeout(fn, 0)ー非同期と呼べるが、実は...「順番をずらしたいだけ」!

`setTimeout(..., 0)` は**「非同期」**ですが、**「処理を待つわけではなく、イベントループの次のタイミングに回す」**だけなので、完全な意味で「何かの完了を待つ」動作とは違います。

---

## 🔄 正確に言うとこうなります：

- `setTimeout(fn, 0)` は、「**今やってる同期処理が全部終わった後**に、`fn` を**キューに入れて非同期実行**する」仕組みです。
- つまり、「次のタスク（マクロタスク）」として処理されます。

---

## ✅ たとえば：
```js
console.log('A');
setTimeout(() => console.log('B'), 0);
console.log('C');
```

結果は：
```
A
C
B
```

---

## ✨ だからこう言うと正確：
> 「`setTimeout(..., 0)` を使うと、**今の処理がすべて終わった後に**発火できるから、例えば DOM 更新が終わってから何かしたい時や、他のイベント発火後に順番をずらしたい時に使える」

---

## 🎯 まとめ

「何かが終わるまで**待つ**」という意味での「非同期処理」じゃないです。  
`setTimeout(..., 0)` は「**順番をずらしたいだけ**」の時に使うテクニックです。✨

---

:::note warn
では、`Microtask` と `setTimeout(fn, 0)` の違いは？　（2025/04/18テーマ追記）
:::

---

## 🧠 結論：どっちが先に実行される？

```js
Promise.resolve().then(() => console.log("microtask"));
setTimeout(() => console.log("macrotask (setTimeout 0)"), 0);
```

👉 結果は：
```
microtask
macrotask (setTimeout 0)
```

---

## 🔁 イベントループのおさらい

JavaScript の実行は「**イベントループ**」という仕組みで行われるんだけど、  
そこでキューが2種類登場する：

### ✔️ Microtask（マイクロタスク）キュー：
- `Promise.then`, `catch`, `finally`
- `queueMicrotask()`
- `MutationObserver`

→ **現在の実行が終わった直後、次の描画前に即実行**！

---

### ✔️ Macrotask（マクロタスク）キュー：
- `setTimeout`
- `setInterval`
- `setImmediate`（Node.js）
- `requestAnimationFrame`
- `UIイベント`

→ **1イベントループの最後に処理される**  
（次のループまで“後回し”される）

---

## 💥 違いを感覚的にいうと

| 処理           | どのくらい早い？ | 実行タイミング                              |
|----------------|------------------|---------------------------------------------|
| `Promise.then` | 超早い🔥        | 現在のタスクが終わった直後、即             |
| `setTimeout`   | 遅め🕗           | 「次のイベントループ」のタイミングで実行   |

---

## 🧪 比較コード

```js
console.log("start");

setTimeout(() => {
  console.log("setTimeout");
}, 0);

Promise.resolve().then(() => {
  console.log("promise");
});

console.log("end");
```

実行結果：

```
start
end
promise
setTimeout
```

---

## ✅ いつ使い分ける？


| 処理内容                   | おすすめ     | 理由                                         |
|----------------------------|--------------|----------------------------------------------|
| ★UIをブロックしたくない処理 | ★setTimeout   | ★イベントループを1周させるのでブロックしない |
| 軽くてすぐ終わる後処理     | Microtask    | すぐに実行される                             |


---

## 🤓 MDN の補足

MDNの [Microtask ガイド](https://developer.mozilla.org/ja/docs/Web/API/HTML_DOM_API/Microtask_guide) にもある通り：

> マイクロタスクはイベントループの「現在の」ターンの最後にまとめて実行されます。  
> 次の描画やイベントが来る前に全て終わらせる責任があるため、**重い処理を入れるとUIが止まる可能性もある**。

---

## 💡まとめ

- `Promise.then()` は **Microtask** → 超即実行（優先度高）
- `setTimeout(..., 0)` は **Macrotask** → 次のループで実行（後回し）

だから：

- 素早い後処理・順序制御 → `Promise.then`
- イベントループを遅らせたい処理 → `setTimeout`
量子力学とタロット：エンジニアとしての考え方にも役に立つはず

# はじめに
近年、スピリチュアルの世界では量子力学が注目を集めています。一見するとスピリチュアルは占いや当たる・当たらないで語られることが多いですが、その本質はもっと奥深いものです。特に、スピリチュアル界隈で人気の高いタロットは、量子力学との関連性がある点で興味深いです。

この記事では、量子力学とタロットの関係性について考察した内容を記述しています。
この考察は、エンジニアとしての考え方にも役に立つと思います。ぜひご覧ください。

## 和多志たちが見ている世界と量子力学
和多志たちの目の前に広がる世界は、実は量子という最小単位の存在から成り立っています。この量子が波動を生み出し、その波動が現実社会や人間関係といった和多志たちの世界を形作っているのです。
![3.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/4040756/89150a9e-d212-4d0a-b8d8-35ee2ea16df2.png)
さらに、この作られた世界は、**和多志たち自身の潜在意識**によって変化します。つまり、量子はそれぞれの潜在意識に反応し、それに応じて波動を形成し、目の前の世界を作り出しているのです。（これを「**宇宙**」といいます。）

それでは、量子の仕組みについて、少し深掘りしてみましょう。

### 量子の重ね合わせの原理
量子には、制限と自由(例: 0と1、闇と光など)の要素が同時に共存する性質があります。この状態を「重ね合わせ」と呼びます。そして、どちらの要素が強調されるかは、和多志たち自身の潜在意識によって決まります。たとえば、潜在意識が0を強く意識していれば、10:0のような比率に傾き、一方でバランスが変われば3:7や6:4の状態になるのです。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/4040756/c96f3389-73e2-4a5e-bfde-fe2ae33b42c6.png)

### 量子のもつれ
量子同士が関連し合っている(もつれ)状態にあるとき、一方の量子に変化が起これば、その影響が他の量子にも即座に伝わります。この相互作用が、量子の性質の一つです。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/4040756/13186af8-c5c6-4539-89bf-848da532eac8.png)

### 量子はすべての源
量子は、和多志たちが目にする世界を含む、すべての現象の源と言えます。この世界は、量子の重ね合わせと、もつれの性質によって創り出されています。そして、量子は潜在意識に応じて反応するため、和多志たち自身の意識が変われば、それに伴い世界線が分岐し（いわゆるパラレルワールドが生まれ）、無数の可能性が展開されます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/4040756/d886c559-33ab-45f5-9253-951b29366c3f.png)

### 量子力学の本質
いままでの内容を総合すると、物事すべての答えは自分の内側にのみ存在するということになります。また、自分の内側を追求するのに制限と自由の対立が伴うので、量子力学の本質は自分の内側を追求し(内観)、制限と自由の対立をどうバランスとるかの理論と考えられます。

### 補足：次元と波動
波動には階層があり、その階層が次元を表します。高次元では潜在意識が量子に反映される速度が速く、低次元では反映に時間がかかります。地球は3次元に属するため、和多志たち自身が潜在意識を変えてから現実が変化するまでに、時間差が生じるのです。
時間差が生じるは自分の理想状態になるまで時間がかかるということなので、低次元ほど制限があり、高次元ほど時間差が短いので自由であるともいえます。


![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/4040756/5b71883d-86c4-430c-ba43-871bf7df8b06.png)

## タロットと量子力学
タロットカードは占いとして使われることが多いですが、その本質は量子力学の理論に通じています。
### タロットの世界観
タロットの大アルカナ22枚は、0番「愚者」から21番「世界」の統合までを表し、人生における制限と自由のバランス及び統合への葛藤を描いています。タロットの目的は、占いの当たり外れではなく、自分自身の内側に気付くためのヒントを提供することです。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/4040756/e3372686-bc3a-488f-9cad-e3787f29efef.png)

量子力学と同様に、タロットは現実的なアドバイスや精神的なメッセージを通じて、重ね合わせの原理や潜在意識による世界の変化を示唆します。
例えば、状況によってカードの読み方が異なったり、占い結果が以前と変化することもあります。

# 最後に
すべての答えは自分の内側にしかありません。
また、自分の内側を追求(内観)することは周囲から自分を遮断することではありません。周囲の状況を自分の中で嚙み砕いて考えつつ、本来の人生の目的を発見することが内観なのです。
SPICE手法統合シミュレータ

##  Pythonコード


```python
# --- 総合SPICE手法統合シミュレータ / Full SPICE Simulation Python 合体プログラム ---
# Program Name: spice_solver_methods_demo.py
import numpy as np
import matplotlib.pyplot as plt
from scipy.sparse import csc_matrix
from scipy.sparse.linalg import splu
from sympy import symbols, diff, lambdify

# -------------------------------
# ① 疎行列LU分解（Sparse LU Decomposition）
# -------------------------------
A_dense = np.array([
    [10.0, 0.0, 2.0],
    [3.0, 9.0, 0.0],
    [0.0, 7.0, 8.0]
])
b = np.array([7.85, -19.3, 71.4])

A_sparse = csc_matrix(A_dense)     # 疎行列に変換 / Convert to sparse format
lu_sparse = splu(A_sparse)         # 疎LU分解 / Sparse LU factorization
x_sparse_lu = lu_sparse.solve(b)   # 解を得る / Solve Ax = b

# -------------------------------
# ② ニュートン・ラフソン法（ヤコビアン自動構築）
# -------------------------------
x_sym = symbols('x')
f_expr = x_sym**3 - x_sym - 2
df_expr = diff(f_expr, x_sym)

f_func = lambdify(x_sym, f_expr, modules='numpy')
df_func = lambdify(x_sym, df_expr, modules='numpy')

x0 = 1.5
tol = 1e-6
max_iter = 10
x_vals = [x0]

for i in range(max_iter):
    x_new = x0 - f_func(x0) / df_func(x0)
    x_vals.append(x_new)
    if abs(x_new - x0) < tol:
        break
    x0 = x_new

# -------------------------------
# ③ 過渡解析：台形法 vs 後退オイラー法 / Trapezoidal vs Backward Euler
# -------------------------------
a = 1.0   # 減衰係数 / Decay constant
dt = 0.1  # ステップ幅 / Time step
T = 1.0   # 総時間 / Total time
N = int(T / dt)
t_vals = np.linspace(0, T, N+1)

# 初期化 / Initialization
x_trap = np.zeros(N+1)
x_euler = np.zeros(N+1)
x_trap[0] = 1.0
x_euler[0] = 1.0

for n in range(N):
    x_trap[n+1] = ((1 - a*dt/2) / (1 + a*dt/2)) * x_trap[n]     # 台形法 / Trapezoidal
    x_euler[n+1] = x_euler[n] / (1 + a*dt)                      # 後退オイラー / Backward Euler

# -------------------------------
# 可視化 / Visualization
# -------------------------------
plt.figure(figsize=(14, 10))

# ① LU分解結果 / Sparse LU Decomposition
plt.subplot(3, 1, 1)
plt.bar(['x1', 'x2', 'x3'], x_sparse_lu)
plt.title("① Sparse LU Decomposition (for large circuit matrices)")
plt.ylabel("Value")
plt.grid(True)

# ② ニュートン法収束過程 / Newton-Raphson Method
plt.subplot(3, 1, 2)
plt.plot(range(len(x_vals)), x_vals, marker='o')
plt.title("② Newton-Raphson Iteration with Auto Jacobian")
plt.xlabel("Iteration")
plt.ylabel("x value")
plt.grid(True)

# ③ 台形法 vs 後退オイラー法 / Trapezoidal vs Backward Euler
plt.subplot(3, 1, 3)
plt.plot(t_vals, x_trap, marker='o', label='Trapezoidal')
plt.plot(t_vals, x_euler, marker='s', label='Backward Euler')
plt.title("③ Transient Analysis: Trapezoidal vs Backward Euler")
plt.xlabel("Time [s]")
plt.ylabel("x(t)")
plt.legend()
plt.grid(True)

plt.tight_layout()
plt.show()

```
結果
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/4046871/b2f5a600-5aec-4176-9b8d-5ec70c779873.png)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/4046871/3f1a3dab-039b-40fd-a7e5-5139b554ec59.png)
github-comment を使ってみた

# github-comment を使ってみた

## permissions

```yml:.github/workflows/somethig.yml
permissions:
  pull-requests: write   
```


が要りそう

## 個人的に気になったところ

### var オプション

https://suzuki-shunsuke.github.io/github-comment/usage#github-comment-post

```
   --var value [ --var value ]            template variable
```

`--var` で，`k:v` フォーマットであることがわからなかったけど，エラーですぐわかった．

https://github.com/suzuki-shunsuke/github-comment/blob/3dcf6dd54f8383e6c60c8bf182e2a942a060d603/pkg/cmd/parse_vars.go#L26

https://suzuki-shunsuke.github.io/github-comment/config#define-variables

> The variable can be passed with the option -var \<variable name>:\<variable value> too.



ここにも書いてあった

### Meta.Vars の埋め込み

https://suzuki-shunsuke.github.io/github-comment/hide

> From github-comment v4, only variables specified by embedded_var_names are embedded into the comment.

これに気付いてなかった

```yml:.github-comment.yml
exec:
  defaut:
    embedded_var_names:
      - something_key
```

### `when: ExitCode != 0`

使っていたコマンドの所為なんだけど，ステータスコードで失敗か判定できてなかった．(=コメントされなかった)

```yml:.github-comment.yml
exec:
  defaut:
    when: true
```

https://github.com/suzuki-shunsuke/github-comment/blob/3dcf6dd54f8383e6c60c8bf182e2a942a060d603/pkg/api/exec.go#L180

## Refs

https://github.com/suzuki-shunsuke/github-comment

https://suzuki-shunsuke.github.io/github-comment/
「テレビショッピングで掃除機を買いたくなる」技術記事について考える

社内の LT 会で発表したものになります。

## 概要

本記事は、技術記事を読む人の視点について考え、より多くのエンジニアが技術記事の執筆に参加しやすくなるヒントを共有します。

## はじめに

テレビショッピングで掃除機を買いたくなるのはなぜでしょうか？
（買いたくなるかどうかは人によります）
値段が安いから、掃除機が魅力的に見えたから、衝動買い、などなど…様々ありますが、一説に

> 🛒 掃除機が「テレビショッピングを見る人の視点」で紹介されているから

という考えがあります。
また、水族館に来てマグロを食べたくならないのはなぜか？という問いに対し、

> 🐟 水族館が「マグロを育てている海の視点」で作られているから

という考えがあります。
このような、テレビショッピングにおける「利用者の視点」やマグロにおける「制作者の視点」を、技術記事でも考えてみます。

## 技術記事の視点

ここでは、技術記事によって触れられる話題を、以下の 3 つの視点に分類してみます。
記事タイトルの例も挙げてみます。

### 利用者の視点（ユーザー視点）

開発ツールの使い方や、エラーの対処法

- Cloudflare でキャッシュパージする方法
- ValueError: Single '{' encountered in format string

### 制作者の視点（ベンダー視点）

システムの設計・運用方法や、開発ツールの詳しい仕様

- Microsoft Intune を使って開発者向け PC のインストールアプリを統括的に管理する
- Miro の付箋の個体差について

### どちらにも属さない視点（エクスペリエンス視点）

学習経験の共有や、体験談

- Ansible で Windows PC の開発環境構築を自動化した話
- ブラウザの開発者ツールで家庭用ごみ袋の外装を作った

## 同じ技術でも書き方によって視点が変わる

Python だからユーザー視点とか、Zabbix だからベンダー視点とか、使う技術によって視点が決まるわけではありません。

技術が同じでも、書き方を変えることによって視点が変わります。

### Python の例

**ユーザー視点**

- 具体的な手法
- すぐに使えるコード

:::note info
Python で文字列をカンマで区切って配列するには split を使います。

受け取った入力の先頭や末尾にスペースが入っていることもあるので、split する前に strip で両端のスペースを除去するのがおすすめです。

```python
columns = row.strip().split(',')
```
:::

**ベンダー視点**

- クラスの詳しい仕様
- 必要に応じてコードでの説明

:::note info
IntEnum クラスは Enum の一種ですが、同時に int としての性質も持つため、int と IntEnum を == 演算子によって比較できます。

```python
class FruitPrice(IntEnum):
    APPLE = 100
    BANANA = 200

FruitPrice.APPLE == 100  # results True
FruitPrice.BANANA > 500  # results False
```
:::

**エクスペリエンス視点**

- 言語を使ってみての体験談
- 人生で役に立ったこと

:::note info
私が思う Python の好きなところは、コードを英語っぽく書けて、コーディング面接で非エンジニアの面接官への説明がしやすいところです。

人への説明が得意でない私を救ってくれたのは、ほかでもないこの Python です。

Python マジラブ💛
:::

### テクニカルライティングの例

**ユーザー視点**

- 説明そのものを端的に記述
- 例文でイメージを持たせる

:::note info
説明文は、あいまいな表現を避け、短くわかりやすく書きましょう。

「このボタンをクリックすると、ファイルシステム上のあらかじめ指定していたディレクトリにファイルが作成され、編集中の内容が書き込まれ、そしてまた閲覧したいときにいつでも閲覧することができるでしょう。」

→「保存するには【保存】をクリックします。」
:::

**ベンダー視点**

- 詳しく知りたい人・極めたい人向き
- もはやこれがマニュアルでは？

:::note info
テクニカルライティング（Technical Writing）は、技術的な情報をわかりやすく整理し、対象読者に伝えるためのライティング技術です。主に以下のような文書が含まれます。

- マニュアル・取扱説明書
- ヘルプドキュメント
- 技術仕様書・設計書
- API ドキュメント
- ホワイトペーパー
:::
（ChatGPT の回答を抜粋）

**エクスペリエンス視点**

- 活用事例の紹介
- 魅力を伝える

:::note info
社内でテクニカルライティングに関する研修を行い、翌日から業務で実践してもらったところ、実に 92 % の社員から「コミュニケーションロスが減った」「上司に褒められた」などの前向きでうれしい声が続出。

また、開発の生産性も研修前と比較して 28 % アップし、 “研修のこうかはばつぐん” だ。
:::

## まとめ

今回ご紹介した 3 つの視点は、私が日々記事を読んでいて面白そうだなと思った観点を言語化してみただけであり、各視点に良し悪しはありません。

どの視点で記事を書いても、読む人への効果があり、歓迎されるので、「書いてもどうせ読んでもらえない」などと心配する必要はありません。

私自身、

- ユーザー視点の記事は、すぐに使えるものが多く実用的
- ベンダー視点の記事は、もっと深く知りたい、人に教えたい、ツールそのものの開発に携わりたい人におすすめ
- エクスペリエンス視点の記事は、見ず知らずの人をその技術・ツールに誘う効果あり、もしくは読んでいて楽しい

と考えています。

また、この 3 視点をなんとなくでも知っていることで、記事を書く目的や記事を読んでほしい人物像が明確になり、記事が書きやすくなります。

もし、あなたが記事を書こうとしていて「何を書いたらいいかわからない」と悩んでいたら、ぜひ今回ご紹介した観点を参考にしてみてください。

みんなでたくさん記事を書いて、エンジニアのプレゼンスを高めていきましょう。
家計簿アプリを作る＃３４

![スクリーンショット 2025-04-16 122811.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/4012588/ee73dcf9-8fec-4bb3-85a0-f069c4c4c3be.png)
![スクリーンショット 2025-04-16 122918.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/4012588/9e53c602-b96b-4c44-98f6-59b7182d0bac.png)
key=の後の部分もtextからindexに変えます。

![スクリーンショット 2025-04-16 123004.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/4012588/62f70904-2b5c-4109-91b9-e7e22e493238.png)
item.iconも上記👆のように記述します。

![スクリーンショット 2025-04-16 123118.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/4012588/48410c84-418a-46e6-9c85-0142a6befe26.png)
![スクリーンショット 2025-04-16 123053.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/4012588/d1601d2c-c82b-460c-b77d-4589261e9822.png)
![スクリーンショット 2025-04-16 123219.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/4012588/9abe156d-0ff4-4782-9683-96d2324701f7.png)
サイドバーのメニューの部分の下の段は不要なので削除します。
[Linux][command] テキスト処理_その他_xargs, md5sum

# xargsコマンド
~~~terminal:
$ xargs [オプション] [コマンド [初期引数...]]
~~~

| オプション | 由来 | 説明 |
|:--|:--|:--|
| default | execute arguments | - 標準入力から読み取ったデータを引数として指定したコマンドを実行 |

## 使用例
- `file.txt`内の各行が`touch`コマンドの引数として渡し、それぞれの名前を持つファイルを作成する
~~~terminal:
$ cat file.txt | xargs touch
~~~


# ファイルをハッシュ値にするコマンド
|コマンド|説明|
|:--|:--|
|`md5sum`|MD5(ハッシュ関数)によるハッシュ値の出力|
|`sha1sum`|SHA1(ハッシュ関数)によるハッシュ値の出力|
|`sha256sum`|SHA256(ハッシュ関数)によるハッシュ値の出力|
|`sha512sum`|SHA512(ハッシュ関数)によるハッシュ値の出力|
|オプション|説明|
|`-c`<br>`--check`|読み込んだファイルの値とメッセージダイジェストを比較する<br>例: md5sum `-c` \| `--check` checksum.txt|

# Ping-t
xargs
- [3190_xargs](https://mondai.ping-t.com/question_subjects/31/question_sessions/31223415/progressing_questions/478442914)
- [38060_xargs](https://mondai.ping-t.com/question_subjects/31/question_sessions/31600132/progressing_questions/484225486)


ファイルをハッシュ値にするコマンド
- [3356_md5sum](https://mondai.ping-t.com/question_subjects/31/question_sessions/30890995/progressing_questions/473266336)
- [3357_sha256sum](https://mondai.ping-t.com/question_subjects/31/question_sessions/31870469/progressing_questions/488372707)
- [3359_md5sum -c | --check](https://mondai.ping-t.com/question_subjects/31/question_sessions/32076138/progressing_questions/491415234)
参照渡し / not 参照渡し 簡単 見分け方 

# 参照渡しって何だっけ

というわけで 引数の渡し方として よく 値渡し / 参照渡し があると言われます（言語にもよりますし、そもそもその二つ以外も存在します。

他に 参照の値渡し（共有渡し）もありますが、これも後述の見分け方するならば 値渡しであることをわかってもらえると思います。

:::note warn 

**レギュレーション**

- ここでは構文上の話「のみ」します。糖衣構文とかマクロとかメモリとかアセンブリの話はしません。
- 参照渡しであるか そうでないか のみ話します。それ以外は基本的には値渡しでしょうが、詳しくは 評価戦略読んでください。

[評価戦略 - Wikipedia](https://ja.wikipedia.org/wiki/%E8%A9%95%E4%BE%A1%E6%88%A6%E7%95%A5)

:::

## 関数に於ける 仮引数 と 実引数 の関係

関数に渡すときの登場人物としては、渡す変数である「実引数」と 関数の中で受け取った変数である「仮引数」 が存在します。

この「実引数」と「仮引数」 への同じ代入構文を実施したときに 反映されるのが 「参照渡し」です

つまり、実引数に対して 仮引数がエイリアスとして機能するかという話です。

その為、ここに参照型/値型の話は登場しません。

これが満たせない Cのポインタの値渡しは 参照渡しではない という根拠としています。

## 関数以外の話として

私としては 参照変数（つまり上記でいうところのエイリアス関係が満たせている変数）が存在するかどうかとしても上記の話で解決したりします。

つまり 参照される変数が 参照された変数 と エイリアス関係であるかどうかです。

※ この参照変数という表現は そもそも参照型の値の入った変数の意としてもふつうに使われる([1](https://learn.microsoft.com/ja-jp/dotnet/csharp/language-reference/builtin-types/nullable-reference-types),[2](https://learn.microsoft.com/ja-jp/dotnet/visual-basic/misc/bc30795)) 語弊がある言い方なのでもしかしたらエイリアスと言い換えた方が良いかもしれません。

その為、 関数外で参照渡し云々言っているものも 同様に エイリアス関係が満たせているかが焦点となります。その為、ここに参照型/値型の話は登場しません。

以上。

## 追伸1: call by copy-restore と見分け付かないのでは？

上記の判断方法だと call by copy-restore が 参照渡しと判断されますが、まぁ最終的に参照渡しとしての反映するのでいいでしょと思います。

## 追伸2: 変数渡しと見分けつかないのでは？

参照渡しは変数渡しの実装の一つなので見分ける必要は無いのでは？
【SQL】Non-repeatable read

# はじめに

こんにちは。アメリカに住みながら、独学でエンジニアを目指しているTairaです。
SQLを学習中ですが、トランザクションの中で発生してしまうダーティーリード、Non_repeatable read(反復不能読み取り), ファントムリードがあります。
本日はその中でもNon_repeatable readについて説明していきたいと思います。

## Non-repeatable read（ノンリピータブルリード）とは

**Non-repeatable read（ノンリピータブルリード）**とは、データベースのトランザクション処理で起こる異常現象の一つです。

同一トランザクション内で複数回同じデータを読み取った際に、そのデータが途中で変更され、異なる結果が得られる現象です。

例えば、以下のようなケースです。

1. トランザクションAが口座残高を確認すると10万円でした。
2. トランザクションBが口座残高を20万円に更新し、コミットします。
3. 再びトランザクションAが同じ口座残高を確認すると、20万円になってしまっています。

このように、同じトランザクションで2回の読み取り結果が異なるため「ノンリピータブル（再現不可）な読み取り」と呼ばれます。

### なぜ発生するのか？
Non-repeatable readは、あるトランザクションが読み取りをした後、別のトランザクションがそのデータを更新しコミットしてしまうことが原因で発生します。これはトランザクションの分離レベルが低いために起きる問題です。

### 分離レベルによる影響
SQLのトランザクション分離レベルによって、Non-repeatable readが防げるかどうかが変わります。

| Isolation Level    | Non-repeatable read を防げるか |
|--------------------|-------------------------------|
| READ UNCOMMITTED   | ❌ 防げない                   |
| READ COMMITTED     | ❌ 防げない                   |
| REPEATABLE READ    | ✅ 防げる                     |
| SERIALIZABLE       | ✅ 防げる                     |

- **READ UNCOMMITTED、READ COMMITTED**では防げません。
- **REPEATABLE READ以上**では、データにロックをかけたり、REPEATABLE READの場合は最初のスクリーンショットをとりそれと比較することで、この問題を防ぐことができます。

### 具体例（銀行口座の場合）
| 時間 | トランザクションA（顧客） | トランザクションB（銀行） |
|------|----------------------------|----------------------------|
| t1   | 口座の残高を確認 ⇒ 10万円 |                            |
| t2   |                            | 残高を20万円に変更し、コミット|
| t3   | 再度口座の残高を確認 ⇒ 20万円に変更|                  |

顧客は1回目と2回目の結果が違うため混乱します。これがNon-repeatable readの典型的な例です。

### 対策
Non-repeatable readを防ぐには、トランザクションの分離レベルをREPEATABLE READ以上に設定します。

MySQLでの設定例：
```sql
SET TRANSACTION ISOLATION LEVEL REPEATABLE READ;
```

### まとめ
- Non-repeatable readはトランザクション内での読み取り結果が変化する現象です。
- 分離レベルを高く設定することで防止できます。
- トランザクション処理の際は、この問題を理解して適切な設定を行いましょう。
cscの作法 その578

# 概要
cscの作法、調べてみた。
OpenRCF v2.8、見つけたので、windows11で、MSbuildしてみた。
練習問題やってみた。

# 練習問題
ボールをシミュレーションせよ。

# 写真

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/18104/beeeb14e-73ff-48b6-915a-ffa6f2e00fdf.png)


# サンプルコード

```
using System;
using System.Windows;
using OpenRCF;
using Vector = OpenRCF.Vector;


namespace OpenRCF
{
	partial class MainWindow: Window {
		Sphere Ball = new Sphere(0.25f);
		float g = 9.8f,
			v0 = 6,
			t,
			z;
		bool isMoved = false;

		void Setup() {
			Ball.Position[2] = Ball.Radius;
		}
		void Loop() {
			if (isMoved)
			{
				t = Timer.GetElapsedTimeSec(0);
				z = Ball.Radius + v0 * t - 0.5F * g * t * t;
				if (Ball.Radius < z)
				{
					Ball.Position[2] = z;
				}
				else
				{
					Ball.Position[2] = Ball.Radius;
					//isMoved = false;
					v0 *= 0.8f;
					Timer.SetTimeLabel(0);
				}
			}
		}
		void Draw() {
			Ball.Draw();
		}
		void Button1_Click(object sender, RoutedEventArgs e) {
			Timer.SetTimeLabel(0);
			isMoved = true;
		}
		void Button2_Click(object sender, RoutedEventArgs e) {
			
		}
		void Button3_Click(object sender, RoutedEventArgs e) {
			
		}
		void Button4_Click(object sender, RoutedEventArgs e) {
			
		}
		void Button5_Click(object sender, RoutedEventArgs e) {
			
		}
	}
}




```

以上。
URIってなに？「URL」と「URI」の違い

# 背景
講座を受けていて「URI」と書いてあった。
え、URLのこと？誤字？？？って思ったから調べてみた。

# URIとは
Uniform Resource Identifier（ユニフォーム・リソース・アイデンティファイア）」の略。
URLとURNの総称。

# URL と URN と URI
URLはWebページの住所
URNはWebページの名前

URLもURNも、URIのひとつ。

今では、URIのことをURLと呼ぶことも多く、
URI＝URLと考えてもおそらく問題ないらしい。

とりあえずここまで。

# 参考
https://e-words.jp/w/URI.html
https://wa3.i-3-i.info/word1815.html
https://ferret-plus.com/4637
システム設計を任されたときのためのプラクティス

システムアーキテクトの失敗から得た学びを振り返って、次システム設計するときに同じ過ちを繰り返さないようにプラクティス化しました。

## 前提
- システムのこと
  - システム規模は中くらい
  - ３年間稼働しており、現在も成長中サービスでエンハンス案件多い
- 筆者のこと
  - エンジニア歴8年（インフラ構築、SRE的な業務がメイン）
  - 現職は中途入社で2年目
  - これまでは保守的なことがメイン業務なのでアーキテクト経験はあまりない

## ことの経緯
突如、ある要件を満たすようなアーキテクチャを設計することになりました。
既存システムで保持しているデータを外部に連携することが主な要求です。

自分のポジションは、案件の開発リーダーです。
要求はプロダクトオーナーが決めて、私がそれを要件に落とし込んで設計します。

設計したものは、有識者含む開発メンバーにレビューしてもらいます。

この設計&レビューのプロセスで想像以上に時間がかかり、スケジュールが大幅に遅延しました。
要求がシステムを複雑化させれたとはいえ、優秀な方ならもっとスムーズに進められたはずです。

一言でいうとアーキテクチャ経験の少なさが要因です。
進め方の何が悪かったのかを振り返ると、大きく3つの過ちがあったので、これらをプラクティスとします。

## 1. 何を軸に決めるのかを意思決定者と目線を合わせておく

これは一番最初にすべきことでした。

うちの職場はとても自由度が高く、新しいサービスを使うことに割と賛同してくれる方が多い印象です。
(例えばDatadogの新サービス、Amazon Bedrockを活用した運用効率化など)

むしろ、チャレンジングなことの方が目を惹く印象です。

でも時と場合によりけりで、今回は稼働中サービスにインフラを追加します。

最近は大きめな障害を起こしたこともあり、システムを止めないことに最も関心があります。

私はその前提があることを考慮せずに、保守実績のないサービスや、コア機能に大きめな改修を入れようとしていました。

結果、肯定的な意見はあまり貰えず、実装/保守コスト低の案を採用することになりました。

シンプルで運用しやすいことなのか、多少保守難易度が高くてもスマートにしたいのか、組織が何を重要視するのかによって選択するアーキテクチャは変わってきます。

上位目線の判断ができる有識者にシステム設計する上で、新サービスに対する温度感や明確な判断軸がないか確認しておくと良いです。

## 2.手段が先行しないこと
自分がイケてると思ったAWSのサービスでも、使い易さ、実装難易度といった観点で見れば、他の人にとってはイマイチということがあります。

そういった評価すべき別の軸を見落として、このサービスは銀の弾丸だ！と思い込んで前のめりになっていました。

気が付かないうちにこれを使いたいという手段が先行して、平等に評価するという姿勢を崩していました。

分かっていても誰しもが陥りがちなことですが、常に客観的な視点を持つことを忘れてはいけません。

仮にチャレンジングなアーキテクチャにするなら、しっかりと全体を見渡して、他にも実現方法を調査した上で、その良さを伝えることが大事です。

## 3.要求をどう実現するかだけでなく、構成をよりシンプルにするための要件を探る。

スタンスの話で、要件をどう実現するかを決めるのが自分の責務だと何処かで思い込んでいました。

これは本当に良くなくて、要求レベルを落とすことができるかもしれないのに、頑張ってどう実装するかを必死に考えていました。

要求をこのように変えられたらシンプルになるよね？とコメントを貰ったとき、ハッと気付かされました。

要求を鵜呑みにするのではなく、開発の難易度を伝えた上で、実装や構成をよりシンプルにできる妥協案を提案するべきです。

後々、無理に要求を実現したことでシステムが複雑化し、変更容易性が失われたり、システム障害を起こしてしまったら、WinWinではありません。

本当にその機能は必要なのか、もっと要求レベルを下げられないかといった疑いは常に持ち、システムを守るために要求の落とし所を探るスタンスを持てるようにしたいです。
【初心者向け】Eclipse の初期設定(画面の色（テーマ）とフォント、文字サイズ等のおすすめの変更)

ここでは Eclipse のおすすめな初期設定についてご説明します。

:::note info
テーマの変更方法
:::

1.画面上部のツールバーの [ウィンドウ] → [設定] を選択します。

<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/4056765/8bd8aa13-ab5b-41fe-8cb9-21bc145b373e.png" width="800">

2.設定画面が表示されますので、[一般] → [外観] を選択します。Eclipse 2021 のデフォルトは「ルック & フィール」が「ダーク」になっています。

<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/4056765/601ff31a-6170-45a2-a9fc-5892646d89b2.png" width="800">

3.「ルック & フィール」のプルダウンリストから好みのテーマを選択して [適用] ボタンをクリックします。ここでは「ライト」を選択しました。
<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/4056765/b750410f-2dfa-4423-9c10-51b851f012be.png" width="800">

4.[適用して閉じる] ボタンをクリックするとテーマが反映されます。


<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/4056765/3a4b6405-61b8-4642-a8de-a41b68a8d17b.png" width="800">


5.テーマを完全に有効にするには Eclipse を再開する必要がありますので、再開してください。再起動すると画面最上部もテーマが反映されます。
<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/4056765/1f0878e2-6b68-47ea-b8d4-6ca906c95a98.png" width="800">

:::note info
フォントの変更方法
:::

1.画面上部のツールバーの [ウィンドウ] → [設定] を選択します。
2.設定画面が表示されますので、[一般] → [外観] → [色とフォント] を選択します。
「色とフォント」から [基本] → [テキスト・フォント] を選択して [編集] ボタンをクリックします。
<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/4056765/44fedb40-ec31-4921-b59d-e69664ab45a7.png" width="800">
3.フォント画面より「フォント名」「スタイル」「サイズ」を設定して [OK] ボタンをクリックします。
<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/4056765/31d17748-3cd3-4517-a27a-0ebb578ef7e2.png" width="800">
4.プレビューで設定したフォントを確認できます。[適用して閉じる] ボタンをクリックするとフォントが反映されます。
<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/4056765/14a2efa8-151e-4c62-b61c-c649abce9aaa.png" width="800">


:::note info
保存時に末尾の空白の除去
:::

1.画面上部のツールバーの [ウィンドウ] → [設定] を選択します。
2.設定画面が表示されますので、[一般] → [エディター] → [AnyEdit ツール] を選択します。
[自動変換] タブの [末尾の空白を除去] をチェックして [適用して閉じる] ボタンをクリックします。
<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/4056765/94022c57-a17b-40bd-bd78-7c8b7452dbd2.png" width="800">


:::note info
保存時にタブ文字をスペースに変換する
:::

1.画面上部のツールバーの [ウィンドウ] → [設定] を選択します。
2.設定画面が表示されますので、[一般] → [エディター] → [AnyEdit ツール] を選択します。
[自動変換] タブの [タブ <-> スペースの変換] をチェックして [タブをスペースに] を選択したら [適用] ボタンをクリックします。

<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/4056765/707a22bd-df33-4f24-986e-0f8628a701b5.png" width="800">
これでファイル保存時にタブがスペースとして保存されるようになります。

:::note info
行番号をする
:::

<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/4056765/cfeb7513-a246-4edc-9da2-1833fdbc668f.png" width="800">

:::note info
テキストファイルのエンコードを設定する
:::
1.画面上部のツールバーの [ウィンドウ] → [設定] を選択します。
2.設定画面が表示されますので、[一般] → [ワークスペース] を選択します。
[テキスト・ファイル・エンコード] は [その他] で [UTF-8] を選択し、[新規テキスト・ファイルの行区切り文字] は [デフォルト (Windows)] をして [適用] ボタンをクリックします。
<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/4056765/82f318a6-5235-401c-9da8-e1472642ff05.png" width="800">

以上、Eclipse のおすすめな初期設定について解説しました。
文字コード改行コード混在のSpringBootプロジェクトをUTF-8+LFに統一する

```bash
#!/bin/bash

find . -type f \( -name "*.java" -o -name "*.xml" -o -name "*.properties" \) | while read file; do
  # BOMの有無を先頭3バイトで判定
  bom=$(xxd -p -l 3 "$file")

  if [ "$bom" = "efbbbf" ]; then
    echo "変換中（BOMあり → なし + LF）: $file"
    # BOM除去してUTF-8として再保存
    tail --bytes=+4 "$file" | dos2unix > "$file.tmp" && mv "$file.tmp" "$file"
  else
    echo "変換中（その他 → UTF-8 + LF）: $file"
    encoding=$(file -i "$file" | cut -d '=' -f 2)
    if [ "$encoding" != "utf-8" ]; then
      iconv -f "$encoding" -t UTF-8 "$file" > "$file.tmp" && mv "$file.tmp" "$file"
    fi
    dos2unix "$file" > /dev/null 2>&1
  fi
done
```
【完全ガイド】DatabuttonでMCPを使う方法｜AIエージェントにツールを持たせる最速の方法

🧠 MCPとは？

**MCP（Model Context Protocol）**は、ChatGPTのようなAIエージェントが
あなたが作ったツール（関数やAPI）を自動で使えるようにするための仕組みです。

Databuttonでは、これをノーコード的なUI＋コード少なめで実装できます。

⸻

💡 できることの例
	•	AIが「PDFを要約する関数」を呼び出す
	•	AIが「Firestoreから情報を検索」して返す
	•	AIが「スプレッドシートにデータを書き込む」
	•	AIが「天気APIを叩いて、気温に応じて服を提案」

⸻

🚀 全体の流れ（図解イメージ）

ChatGPT / LangChain Agent
         ↓
MCPサーバー（Databuttonアプリ）
         ↓
あなたが定義したカスタム関数やAPI



⸻

✅ Step 1: Databuttonアプリを作る
	1.	Databutton にログイン（無料）
	2.	新規アプリを作成（例：mcp-demo）

⸻

✅ Step 2: MCPツールを定義する

main.py を以下のように編集します：

from databutton import Tool

@Tool()
def greet(name: str):
    """Return a friendly greeting"""
    return f"Hello, {name}!"

これだけで、**greet() がAIエージェントから呼び出せる「ツール」**になります。

⸻

✅ Step 3: 公開してMCPサーバーにする

アプリを Publish すると、こんなURLが発行されます：

https://your-app.databutton.app/mcp

このURLが AI側から呼び出すためのMCPサーバーエンドポイントです。

⸻

✅ Step 4: LangChainから呼び出してみる（例）

from langchain.agents import initialize_agent
from langchain.tools.mcp import MCPToolkit

tools = MCPToolkit.from_url("https://your-app.databutton.app/mcp")
agent = initialize_agent(tools, llm)  # llmはOpenAIなど

agent.run("Greet someone named Satoshi")

LangChain側からは「ツール」として自動認識されます 🎉

⸻

🔐 認証やセキュリティは？
	•	Firebase Authentication や Secret を使ってAPIを保護できます。
	•	特定ユーザーだけが使えるようにすることも可能です。

⸻

📦 応用：複数ツールもOK

@Tool()
def add(a: int, b: int):
    return a + b

@Tool()
def subtract(a: int, b: int):
    return a - b

MCPはツールのコレクションを自動でまとめて公開します。

⸻

🧪 実用例（アイデア）
	•	「ChatGPTからFirestore検索」
	•	「ユーザー入力をスプレッドシートに追加」
	•	「AIがSlackに投稿するWebhookを呼ぶ」

⸻

📘 関連リンク
- [Databutton公式サイト](https://databutton.com?via=takahiro19)
- https://ronbun-ai.org
⸻

✅ まとめ

ポイント	内容
MCPとは	AIにツールを与えるプロトコル
Databuttonとは	MCPサーバーをノーコード感覚で構築できるプラットフォーム
実装方法	@Tool() で関数を定義 → 公開URLから接続
AI活用が加速	ChatGPTやLangChainと自作APIを接続できる世界へ！



⸻

🙌 最後に

AIに「自作の能力」を持たせたいなら、MCP＋Databuttonが今もっとも手軽で強力な選択肢です。
ChatGPTに「PDFを要約させたい」「業務DBを検索させたい」と思ったら、まずここから始めましょう！
LLMさんと仲良くテストケースを作成する

# 今時、テストケースの作成くらいならLLMさんでできる
そういう話

# 例
```text
名前は姓と名がある
姓は必須入力
名は必須入力
姓と名はどちらも最長100文字である

名前(カナ)はセイとメイがある
セイは必須入力
メイは必須入力
セイとメイどちらも全角カナだけ入力可能
セイとメイどちらも最長100文字である
```
こんな感じのファイルを作成します
chat gptさんに、このファイルをアップロードします
![スクリーンショット 2025-04-16 11.36.01.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2730381/2ad80a69-53e3-46a1-8ea5-d92ee012b321.png)
こんな感じで実行します
いろいろでてきます
![スクリーンショット 2025-04-16 11.36.19.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2730381/ce2c269d-cc68-4974-959f-86d0966e69e7.png)
tsvにしてもらいます
![スクリーンショット 2025-04-16 11.36.50.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2730381/8bab55bd-4602-4d81-a351-d44348038dac.png)
```tsv
テストケースID	テスト内容	入力値	期待される結果
TC-001	姓が未入力	"姓: """" / 名: ""太郎"""	エラー：「姓は必須です」
TC-002	名が未入力	"姓: ""山田"" / 名: """""	エラー：「名は必須です」
TC-003	姓が100文字	"姓: ""山田""×50 / 名: ""太郎"""	正常に登録できる
TC-004	名が100文字	"姓: ""山田"" / 名: ""太郎""×50"	正常に登録できる
TC-005	姓が101文字	"姓: ""山田""×51 / 名: ""太郎"""	エラー：「姓は100文字以内で入力してください」
TC-006	名が101文字	"姓: ""山田"" / 名: ""太郎""×51"	エラー：「名は100文字以内で入力してください」
TC-007	セイが未入力	"セイ: """" / メイ: ""タロウ"""	エラー：「セイは必須です」
TC-008	メイが未入力	"セイ: ""ヤマダ"" / メイ: """""	エラー：「メイは必須です」
TC-009	セイが半角カナ	"セイ: ""ﾔﾏﾀﾞ"" / メイ: ""タロウ"""	エラー：「セイは全角カナで入力してください」
TC-010	メイがひらがな	"セイ: ""ヤマダ"" / メイ: ""たろう"""	エラー：「メイは全角カナで入力してください」
TC-011	セイに漢字を含む	"セイ: ""山ダ"" / メイ: ""タロウ"""	エラー：「セイは全角カナで入力してください」
TC-012	セイが100文字	"セイ: ""ア""×100 / メイ: ""タロウ"""	正常に登録できる
TC-013	メイが100文字	"セイ: ""ヤマダ"" / メイ: ""ア""×100"	正常に登録できる
TC-014	セイが101文字	"セイ: ""ア""×101 / メイ: ""タロウ"""	エラー：「セイは100文字以内で入力してください」
TC-015	メイが101文字	"セイ: ""ヤマダ"" / メイ: ""ア""×101"	エラー：「メイは100文字以内で入力してください」
```
正常に登録されるは表現としてちょっと(あとで)困るので、そこはなおしてもらいます
さらに都道府県のテストを追加してもらいます
![スクリーンショット 2025-04-16 11.41.47.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2730381/49096072-1c5c-455c-a960-562d49e20f0c.png)
```tsv
テストケースID	テスト内容	入力値	期待される結果
TC-001	姓が未入力	"姓: """" / 名: ""太郎"""	エラー：「姓は必須です」
TC-002	名が未入力	"姓: ""山田"" / 名: """""	エラー：「名は必須です」
TC-003	姓が100文字	"姓: ""山田""×50 / 名: ""太郎"""	エラーにならない
TC-004	名が100文字	"姓: ""山田"" / 名: ""太郎""×50"	エラーにならない
TC-005	姓が101文字	"姓: ""山田""×51 / 名: ""太郎"""	エラー：「姓は100文字以内で入力してください」
TC-006	名が101文字	"姓: ""山田"" / 名: ""太郎""×51"	エラー：「名は100文字以内で入力してください」
TC-007	セイが未入力	"セイ: """" / メイ: ""タロウ"""	エラー：「セイは必須です」
TC-008	メイが未入力	"セイ: ""ヤマダ"" / メイ: """""	エラー：「メイは必須です」
TC-009	セイが半角カナ	"セイ: ""ﾔﾏﾀﾞ"" / メイ: ""タロウ"""	エラー：「セイは全角カナで入力してください」
TC-010	メイがひらがな	"セイ: ""ヤマダ"" / メイ: ""たろう"""	エラー：「メイは全角カナで入力してください」
TC-011	セイに漢字を含む	"セイ: ""山ダ"" / メイ: ""タロウ"""	エラー：「セイは全角カナで入力してください」
TC-012	セイが100文字	"セイ: ""ア""×100 / メイ: ""タロウ"""	エラーにならない
TC-013	メイが100文字	"セイ: ""ヤマダ"" / メイ: ""ア""×100"	エラーにならない
TC-014	セイが101文字	"セイ: ""ア""×101 / メイ: ""タロウ"""	エラー：「セイは100文字以内で入力してください」
TC-015	メイが101文字	"セイ: ""ヤマダ"" / メイ: ""ア""×101"	エラー：「メイは100文字以内で入力してください」
TC-016	都道府県が未選択（空）	"都道府県: """"（未選択）"	エラー：「都道府県は必須です」
TC-017	有効な都道府県が選択済み	"都道府県: ""東京都"""	エラーにならない
```

結果のtsvがこちらです
そのまま貼ればspreadsheetにもはれます

# 今後の課題
APIでやってspreadsheetにはるのは自動化できる
さらに、それをもとに自動テストを駆動させる

playwright mcpとかのやる気がでますね
cscの作法 その577

# 概要
cscの作法、調べてみた。
OpenRCF v2.8、見つけたので、windows11で、MSbuildしてみた。
調査してみた。

# 調査
プリミティブは、あるか
物理エンジンは、あるか
オービットは、あるのか

# 写真

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/18104/aa772456-3a94-4440-be11-4e2466a4dc37.png)

# 結果

- プリミティブは、あるか
ある。
ConeFrustum 
		Pillar
        SquareFrustum 
        Cuboid
        Circle 
        Rectangle
        RoughRectangle
        Sphere
        RoughSphere
        LiDAR
        Arrow
        ThreeAxis
        PrickleBall
        
- 物理エンジンは、あるか
無い。

- オービットは、あるのか
ある。

# サンプルコード

```
using System;
using System.Windows;
using OpenRCF;
using Vector = OpenRCF.Vector;


namespace OpenRCF
{
	partial class MainWindow: Window {
		ConeFrustum 	Cone = new ConeFrustum();
		Pillar 			Wheel = new Pillar();
		SquareFrustum 	sf = new SquareFrustum();
		Cuboid 			box = new Cuboid(1, 1, 1);
		Circle 			en = new Circle();
		Rectangle 		rt = new Rectangle();
		RoughRectangle 	rr = new RoughRectangle();
		Sphere 			Ball = new Sphere(0.25f);
		RoughSphere 	rs = new RoughSphere();
		LiDAR 			lider = new LiDAR();
		Arrow 			ya = new Arrow();
		ThreeAxis 		axis = new ThreeAxis(0.1f);
		PrickleBall		 pb = new PrickleBall();

		void Setup() {
			Cone.Position[2] = 10;
			Wheel.Position[2] = 9;
			sf.Position[2] = 8;
			box.Position[2] = 7;
			en.Position[2] = 6;
			rt.Position[2] = 5;
			rr.Position[2] = 4;
			Ball.Position[2] = 3;
			rs.Position[2] = 2;
			lider.Position[2] = 1;

			ya.Position[2] = -1;
			axis.Position[2] = -2;
			pb.Position[2] = -3;

		}
		void Loop() {
			
		}
		void Draw() {
			Cone.Draw();
			Wheel.Draw();
			sf.Draw();
			box.Draw();
			en.Draw();
			rt.Draw();
			rr.Draw();
			Ball.Draw();
			rs.Draw();
			lider.Draw();
			ya.Draw();
			axis.Draw();
			pb.Draw();

		}
		void Button1_Click(object sender, RoutedEventArgs e) {
			
		}
		void Button2_Click(object sender, RoutedEventArgs e) {
			
		}
		void Button3_Click(object sender, RoutedEventArgs e) {
			
		}
		void Button4_Click(object sender, RoutedEventArgs e) {
			
		}
		void Button5_Click(object sender, RoutedEventArgs e) {
			
		}
	}
}





```

以上。
💡1年目に読んでおけばよかった、インフラエンジニア必読書まとめ

インフラエンジニアとしてキャリアをスタートさせたとき、正直「なにから手をつければいいかわからない...！」と感じた人も多いはず。
そんな自分が 1年目に読んでおけばよかった！ と思った参考書をカテゴリごとにまとめました✍️

🔧 インフラ全般
まずはインフラ全体の概要や役割を理解するための本から！

<a href="https://amzn.to/3Es0zQr">インフラエンジニアの教科書</a>
　👉 インフラの役割や仕事の流れがつかめる。未経験者・新人に最適！

<a href="https://amzn.to/4jc1OCv">サーバ/インフラエンジニアの基本がこれ1本でしっかり身に付く本</a>
　👉 イラストが多くて、技術用語が頭にスッと入ってくる一冊！

<a href="https://amzn.to/4jc2AiT">絵で見てわかる ITインフラの仕組み</a>
　👉 「そもそもITインフラってなに？」から丁寧に解説されていて超初心者向け。

<a href="https://amzn.to/4jc308X">絵で見てわかる OS/ストレージ/ネットワーク</a>
　👉 OSやストレージ、NWの基礎が「なるほど〜」って感覚で理解できる良書。

🖥️ サーバー関連
LinuxやWindowsのサーバーに触れる前に読んでおくと理解が段違い！

<a href="https://amzn.to/42ztQAU">イラスト図解式 この一冊で全部わかるサーバーの基本</a>
　👉 全体像をつかむにはコレ！サーバーの仕組みを図で理解できる。

<a href="https://amzn.to/4jc4qjN">ゼロからはじめるLinuxサーバー構築・運用ガイド</a>
　👉 手を動かしながら学べて、「わかったつもり」を防げる！

<a href="https://amzn.to/4lDS8T4">絵で見てわかるWindowsインフラの仕組み</a>
　👉 Windowsサーバーに配属されそうならこれ一択！

<a href="https://amzn.to/4jc50ht">本気で学ぶ Linux実践入門</a>
　👉 業務で通用するLinuxの知識が詰まってます🔥

🌐 ネットワーク
インフラにおいて避けて通れないネットワーク知識も、まずはここから！

<a href="https://amzn.to/42ztSJ2">ネットワークはなぜつながるのか 第2版</a>
　👉 読み物的でサクサク読める！NW初心者でも理解できる名著。

<a href="https://amzn.to/43WyoU6">マスタリングTCP/IP 入門編</a>
　👉 TCP/IPといえばこれ。試験対策にもピッタリ！

<a href="https://amzn.to/4idWPQl">3分間ネットワーク基礎講座</a>
　👉 スキマ時間に読めて、ちょっとした確認にも便利。

<a href="https://amzn.to/44pK8yy">ネットワーク技術&設計入門</a>
　👉 「実務でどう設計するの？」に応えてくれる中級者向け。

<a href="https://amzn.to/44oDxo3">ネットワーク・デザインパターン</a>
　👉 実際の構成例が多数！構成図を作る前に読みたい。

☁️ クラウド
クラウド未経験者にもわかりやすく導入してくれる一冊たち。

<a href="https://amzn.to/42KzmBH">クラウドエンジニア 養成読本</a>
　👉 「クラウドって何？」から始めたい人向け。

<a href="https://amzn.to/42MpFmn">AWS 基礎からのネットワーク&サーバー構築</a>
　👉 AWSの基本を試しながら覚えられる実践書。

<a href="https://amzn.to/3GaRZ9i">図解即戦力 AWSのしくみと技術がわかる教科書</a>
　👉 AWSを図で理解したいならこれ！

🔐 セキュリティ
セキュリティ対策の基本を知っておかないと痛い目を見るかも？

<a href="https://amzn.to/3YtSVfa">図解まるわかり セキュリティの仕組み</a>
　👉 まずはここから！セキュリティの全体像をキャッチ。

<a href="https://amzn.to/44qULRF">情報セキュリティの基礎知識</a>
　👉 業務で必要なセキュリティの基本が身につく！

<a href="https://amzn.to/44tEKKS">この一冊で全部わかるセキュリティの基本</a>
　👉 図と例でとにかくわかりやすい。読書苦手な人にも。

<a href="https://amzn.to/42pOHI5">おうちで学べる セキュリティのきほん</a>
　👉 自宅学習にちょうどいいセキュリティ入門。

<a href="https://amzn.to/3Eqs8JZ">動かして学ぶ セキュリティ入門講座</a>
　👉 ハンズオンで理解が深まる！応用力もつく一冊。

📝まとめ
インフラエンジニアはとにかく知識が広い分、最初の頃は「全部中途半端で自信ない…」ってなりがち。でも、良書を味方につけることでグッと成長できます。
今回紹介した本はどれも 実際に役立った ものばかりなので、気になるジャンルから1冊ずつ手に取ってみてください✨
PythonとPyAutoGUIで始める画面操作の自動化

PyAutoGUIは、Pythonから**マウスの操作（移動、クリック、ドラッグ）やキーボードの操作（キー入力、タイピング）**を自動化できるライブラリです。APIが公開されていないデスクトップアプリや社内システムなど、**画面上でしか操作できないソフトウェアに対して、繰り返し行う必要がある操作を自動化する**のに役立ちます。PyAutoGUIはWindowsとMacの両方で利用でき、コードも比較的簡単なため、**自作の業務効率化ツール**を作成するのに適しています。

## PyAutoGUIの基本的な使い方

### 事前準備

まず、PyAutoGUIをインストールする必要があります。ターミナルまたはコマンドプロンプトで以下のコマンドを実行します。

```bash
pip install pyautogui
```

Macの場合は、システム設定の「プライバシーとセキュリティ」から「アクセシビリティ」を開き、コードを実行しているツール（例：VS Code）のコンピューター制御を許可する必要があります。

### マウス操作

#### マウスカーソルの移動

マウスカーソルを移動させるには、`pyautogui.moveTo(x座標, y座標)`を使用します。座標は画面の左上が(0, 0)となり、x座標が横軸、y座標が縦軸です。

```python
import pyautogui

pyautogui.moveTo(150, 100)
```

このコードを実行すると、マウスカーソルが(150, 100)の位置に移動します。

#### クリック

クリックを行うには、`pyautogui.click()`を使用します。現在のマウスカーソル位置でクリックします。座標を指定してクリックすることも可能です。

```python
pyautogui.click()  # 現在位置でクリック
pyautogui.click(x=100, y=200) # (100, 200)の位置へ移動してクリック
```

#### 右クリック

右クリックを行う場合は、`click()`関数の`button`引数に`'right'`を指定します。

```python
pyautogui.click(button='right')
```

#### ドラッグ

ドラッグ操作には、`pyautogui.dragTo(x座標, y座標, duration=秒数, button='ボタンの種類')`を使用します。`moveTo()`で開始位置に移動後、`dragTo()`で指定した座標までドラッグします。`duration`でドラッグの速度、`button`でドラッグ中に押すマウスボタン（例：`'left'`）を指定できます。

```python
pyautogui.moveTo(200, 200)
pyautogui.dragTo(300, 200, duration=1, button='left')
```

### キーボード操作

#### キーを押す

特定のキーを押すには、`pyautogui.keyDown('キー名')`を使用します。例えば、Enterキーを押す場合は以下のようになります。

```python
pyautogui.keyDown('enter')
```

#### タイピング

文字を入力するには、`pyautogui.typewrite('文字列')`を使用します。

```python
pyautogui.moveTo(200, 200)
pyautogui.click()
pyautogui.typewrite('Hello')
```

**日本語を入力する場合**、`pyautogui.typewrite()`ではうまくいきません。代わりに、`pyperclip`ライブラリーを使ってクリップボードに文字をコピーし、`pyautogui.hotkey()`で貼り付け（Ctrl+VまたはCmd+V）を実行します。`pyperclip`はPyAutoGUIインストール時に同時にインストールされます。

```python
import pyperclip
import pyautogui

pyperclip.copy('こんにちは')
pyautogui.hotkey('ctrl', 'v') # Windowsの場合
# pyautogui.hotkey('command', 'v') # Macの場合
```

### 具体的な利用ケース：近体システムへの社員情報登録の自動化

人事部から送られてくるCSVファイル（社員番号、氏名、雇用形態）をもとに、Webベースの近体システムに社員情報を登録する作業を自動化するシステムには、一括アップロード機能やAPIがないため、手作業でコピー＆ペーストを繰り返す必要がありました。
これを自動化のスクリプトとして、以下の手順で進めていきましょう。:

1.  `pandas`ライブラリーでCSVファイルを読み込みます。
2.  読み込んだデータを1行ずつ処理するループを作成します。
3.  各行の雇用形態に応じて、画面上の該当するラジオボタンをクリックします (`pyautogui.click()`)。
4.  社員番号のテキストボックスをクリックし (`pyautogui.click()`)、`pyperclip.copy()`で社員番号をクリップボードにコピーした後、`pyautogui.hotkey('ctrl', 'v')`で貼り付けます。
5.  同様に、氏名のテキストボックスをクリックし (`pyautogui.click()`)、`pyperclip.copy()`と`pyautogui.hotkey('ctrl', 'v')`で氏名を貼り付けます。
6.  登録ボタンをクリックします (`pyautogui.click()`)。
7.  登録完了のポップアップが表示されたらOKボタンをクリックします (`pyautogui.click()`)。

この例では、**繰り返し行う必要のある画面操作を自動化することで、大幅な時間短縮と正確性の向上**が期待できます。

**注意点**として、自動化プログラムが実行中はマウスカーソルがプログラムに制御されるため、基本的にPC上で他の作業は行わない方が良いとされています。

## 参照動画

*   業務効率化！【画面操作を自動化しよう】〜PyAutoGUIを解説〜初心者向け - Pythonプログラミング VTuber サプー: [https://www.youtube.com/watch?v=a_zP_v4t_Vw](https://www.youtube.com/watch?v=a_zP_v4t_Vw)
デュアルブートしてるPCでOS切り替えを楽にする方法

こんにちは、橋本千聡です。
みなさんはデュアルブートでOSを切り替えるときGRUBのOS選択画面をいつものクセでエンターしたり、勝手にいつものOSが起動してしまうことがあると思います
私も10回以上敗北しています。

https://x.com/kzs321/status/1893637998622724349

今回はそれを解消できるスクリプトを作成しようと思います！

# 要件
- いつもは0番のUbuntu22.04
- たまにWindows 11を起動したくなる
- そういうときはだいたいUbuntuを起動している
↓
- UbuntuからWindows11を起動できるスクリプトを作成すれば解決！

# 環境
| OS | Ubuntu22 | Windows11 |
| - | - | - |
| ブート番号 | 0 | 2 |

# スクリプト
```bash
sudo grub-reboot {ここにWindows11のブート番号を入れる}
sudo reboot
```

Ubuntuには`grub-reboot`という次のgrub選択画面でのデフォルトを選べるコマンドがあります。
最初は `/boot/grub`の中のファイルを書き換えようと思いましたが、調べたところちゃんとコマンドがありました。

# 終わりに
敗北し続けたwindows起動が一発でできるようになってすごい嬉しいです！
次はsudoなしでできないか試しますがgrubいじるのは流石にsudo必須な気もしなくないです
iOSアプリアイコンの通知バッヂを消したい

# 概要
iOSアプリでよく出てくる「通知バッヂ」
アレがアプリを起動しても消えなかったのでなんとかして消します。

# この記事を読んで嬉しい人
* Swiftを使って開発をしている人
* 通知バッヂを消したい人

# 必要な実装
今回はアプリアイコンにつく通知バッヂについてです。
よくあるのはアプリを起動するとバッヂが消える仕様です。他にあるのは通知を読むとその分だけ減るといったものです。
実は通知を受け取れるようにしただけではいけません。

必要な実装は以下です

```swift
@main
struct QuickMartApp: App {
    @UIApplicationDelegateAdaptor(AppDelegate.self) var appDelegate
    
    var body: some Scene {
        WindowGroup {
            RootView()
                .onReceive(NotificationCenter.default.publisher(for: UIApplication.didBecomeActiveNotification)) { _ in
                    Task {
                        await didBecomeActive()
                    }
                }
        }
    }
    
    private func didBecomeActive() async {
        try? await Task.sleep(for: .milliseconds(100))
        // ここから
        do {
            try await UNUserNotificationCenter.current().setBadgeCount(0)
        } catch {
            // エラー処理
        }
        // ここまで追加
    }
}
```

以上のコードを追加するだけで、アプリ起動時に通知バッヂを消すことが可能になります。
特にエラー処理を行わないのであれば、
```swift
try? await UNUserNotificationCenter.current().setBadgeCount(0)
```
とかでも十分です。

今回利用した`setBadgeCount`のドキュメントは以下です。

https://developer.apple.com/documentation/UserNotifications/UNUserNotificationCenter/setBadgeCount(_:withCompletionHandler:)

余談ですが、`UNUserNotificationCenter`では通知周りの管理を行うクラスオブジェクトです。

https://developer.apple.com/documentation/usernotifications/unusernotificationcenter

これを利用すると、そのアプリにおける通知の許可状態を取ることも可能です。

# 記事執筆裏話
本記事を制作するモチベーションとして、バッヂを消す方法を探していたときに以下のQiita記事を見つけました。

https://qiita.com/shi_ei/items/f17b57b30804e8e9cb4b

この方法に従って一旦実装してみたところ、制作中アプリの対応バージョンではDeprecatedとなっていたため、ドキュメント内で代わりに利用するよう促されていた今回の実装方法を採用した次第です。
Swiftは皆さんもご存知の通り進化の早い言語なので、頑張ってキャッチアップしていきたい所存です…！
Mac でウィンドウをDockにしまう / 元に戻すショートカット

## ウインドウをDockにしまう
`Command + M`

## Dockのウインドウを戻す
1. `左Option + Tab`でアプリを選択 (`Tab`を離す)
1. `左Option`を押したまま`右Option`を押す
1. `右Option`を押したまま`左Option`を離す

## あとがき
Dockのウインドウを戻すショートカットないかなと思い検索するとこちら
https://qiita.com/YumaInaura/items/cb92baab843a44115b58
にたどり着きいたのですが、何故か私のmacでは左optionでこちらの方法が効かず、適当に色々触っていたら上記方法を偶然発見しました。
キーボードの設定を使いやすいように変更しているのでもしかしたら私のMacでだけ使えるショートカットかもしれませんが、同じような人のお役に立てればと思いまして。
データソース


```markdown
テゴリー	データセット	概要	関連URL
製品のヒビや傷の外観検査	MVTec AD	工業製品（ボトル、金属、テキスタイル等15カテゴリ）の正常・異常画像を収録。傷・汚れ・歪み等の異常検出に最適。商用利用可。	https://www.mvtec.com/company/research/datasets/mvtec-ad
製品のヒビや傷の外観検査	VisA	電子部品等9カテゴリの異常画像を含む大規模データセット。リアルタイム異常検出向け。商用利用可。	https://github.com/amazon-science/visa-dataset
製品のヒビや傷の外観検査	MPDD	金属部品6種・12種の欠陥ラベル付き画像。自動車部品等の高精度表面欠陥検出に活用。商用利用可。	https://github.com/amazon-science/mpdd-dataset
製品のヒビや傷の外観検査	BTAD	実工場環境で収集した3カテゴリ・4種異常の画像データ。現場適用型異常検出に有用。商用利用可。	https://github.com/BeanTech/BTAD
製品のヒビや傷の外観検査	DAGM	合成テクスチャ画像10種。表面傷・変色等の異常検出モデルの学習に利用。商用利用可。	https://hci.iwr.uni-heidelberg.de/content/dagm-2007-dataset
製品のヒビや傷の外観検査	DTD-Synthetic	47種のテクスチャ異常画像。布・木材等の微細な表面異常検出に活用。商用利用可。	https://www.robots.ox.ac.uk/~vgg/data/dtd/
通行量分析	日本-道路交通データ（xMap）	日本全国の道路交通量・平均速度・渋滞等の詳細データ。都市計画や交通管理に活用。商用利用可。	https://www.xmap.ai/ja/data-catalogs/japan-road-traffic-data
通行量分析	道路通行量クラウド（ジオテクノロジーズ）	道路単位で車両通行量・属性（年齢・性別）をAPIで取得可能。小売・自治体の需要予測等に活用。商用利用可。	https://geot.jp/pressrelease-20230303/
通行量分析	国土交通省 道路交通量調査	全国の道路別交通量オープンデータ。商用利用可。	https://www.mlit.go.jp/road/census/
工場や倉庫での作業効率分析	ろじたん	スマホで倉庫作業時間を計測・自動収集し、作業効率を可視化。商用利用可。	https://iot-usecase.com/nx-soken/
工場や倉庫での作業効率分析	日立 倉庫業務効率化サービス	倉庫内作業・在庫・サプライチェーン全体のデータを分析し効率化。商用利用可。	https://ai-market.jp/industry/logistics_ai/
人流分析	G空間情報センター 人流オープンデータ	全国1kmメッシュ・市町村単位の人流データ。観光・防災・都市計画等に活用。商用利用可。	https://www.geospatial.jp/ckan/dataset/mlit-1km-fromto
人流分析	大手町・丸の内・有楽町エリア人流データ	東京駅周辺の詳細人流データ。商用利用可。	https://www.geospatial.jp/ckan/dataset/human-flow-marunouchi
人流分析	道路通行量クラウド（ジオテクノロジーズ）	道路単位で人流・通行量・属性データをAPIで取得。商用利用可。	https://geot.jp/pressrelease-20230303/
機械の異常検知	SECOMデータセット（UCI）	半導体製造装置のセンサ時系列データ。不良品検出の異常検知モデル構築に利用。商用利用可。	https://archive.ics.uci.edu/ml/datasets/SECOM
機械の異常検知	MVTec AD	工業製品の異常画像データ。異常検知アルゴリズムの学習に最適。商用利用可。	https://www.mvtec.com/company/research/datasets/mvtec-ad
機械の異常検知	BTAD	実工場環境の異常画像データ。現場適用型異常検知に有用。商用利用可。	https://github.com/BeanTech/BTAD
在庫分析と予測	Deep Predictor	AIによる在庫最適化・需要予測ツール。販売・外部データを統合し最適在庫を算出。商用利用可。	https://aicross.co.jp/deep-predictor/blog/blog-450/
在庫分析と予測	Excel/時系列データ	販売履歴等の時系列データを用いた在庫予測。商用利用可。	https://www.matrixflow.net/case-study/18/
サプライチェーン最適化	anyLogistix サプライチェーン最適化データ	サプライチェーンネットワーク設計・最適化用のシミュレーションデータ。商用利用可。	https://www.anylogistix.jp/features/supply-chain-network-optimization/
サプライチェーン最適化	ビッグデータ分析（Apache Spark等）	サプライチェーン全体の運用データを活用し、最適化・リスク管理。商用利用可。	https://note.com/moai_lab/n/nd67525a42a76
機械の異音検知	DCASE Challenge（Task2: Anomalous Sound Detection）	工場機械の異音検知用音響データセット。商用利用可。	https://dcase.community/challenge2020/task-unsupervised-detection-of-anomalous-sounds
経営分析	オープンデータ100	政府・自治体等の各種経営関連オープンデータ。商用利用可。	https://www.data.go.jp/data/dataset/opendata100
経営分析	統計局 統計データ	産業・経済・人口等の各種統計データ。商用利用可。	https://www.stat.go.jp/data/
※各データセットの利用条件は必ず公式サイトでご確認く

```
[Linux][command] コマンド制御演算子_;, &&, ||

# コマンド制御演算子
| 書式 | 説明 |
|:--|:--|
| `コマンドA ; コマンドB` | **逐次実行**：コマンドAの終了を待ってから、コマンドBを実行します。Aの成否に関係なくBも実行されます。 |
|  | 例：`echo Hello ; echo World` |
| `コマンドA && コマンドB` | **AND（かつ）**：コマンドAが**正常終了**したときだけ、コマンドBを実行します。 |
|  | 例：`make && echo "ビルド成功"` |
| `コマンドA \|\| コマンドB` | **OR（または）**：コマンドAが**失敗**したときだけ、コマンドBを実行します。 |
|  | 例：`make \|\| echo "ビルド失敗"` |


# Ping-t
- [3074_;](https://mondai.ping-t.com/question_subjects/31/question_sessions/31943721/progressing_questions/489464097)
- [3075_&&](https://mondai.ping-t.com/question_subjects/31/question_sessions/32018863/progressing_questions/490569317)
- [3076_||](https://mondai.ping-t.com/question_subjects/31/question_sessions/32076138/progressing_questions/491415229)
「テスト自動化＝便利屋」じゃない。本来のSETエンジニアの役割を整理してみた

## はじめに

近年、多くの現場で「SET（Software Engineer in Test）」というロールが取り入れられ始めています。テストの自動化を担当する技術職として認識されがちなこの役割ですが、実際には組織ごとに期待値が曖昧で、**「結局何をする人？」** といった議論が絶えません。

中には、SETが「QAが足りないから手動テストもやってほしい」「運用もできるでしょ？」と便利屋扱いされるケースもあります。私自身もそのような状況に直面し、強い違和感と危機感を感じています。

この記事では、そうした違和感の根源を掘り下げ、**「本来のSETの役割とは何か？」** を再定義したいと思います。

## SETとは何者か？

SET（Software Engineer in Test）は、簡単に言えば品質保証に特化した技術職です。QAエンジニアではありませんが、QAを支える立場として、以下のような役割を持ちます：

- テストの自動化（E2E/ユニット/統合）
- テスト基盤やツールの整備
- CI/CDパイプラインへのテスト統合
- テスト結果の可視化
- テストデータやMockの整備
- 品質メトリクスの収集と改善提案
- フレーキーなテストの対策と安定化

つまり、**“品質を技術で支えるエンジニア”** です。

## よくある誤解とその違い

|誤解|本来のSETの役割|
|:--|--|
|手動テストもできるテストエンジニア|QA観点を理解したうえで、技術的に自動化・効率化を図るエンジニア|
|テストスクリプトを書く人|テストの価値を評価し、継続可能な品質保証の仕組みを設計する人|
|QAの下位互換|テストプロセス全体を支援し、プロダクトの品質を長期的に担保する技術専門職|

SETは **「実行者」ではなく「仕組みを作る側」** だという意識が重要です。

## SETに求められる技術領域

SETの専門性は、単なるテスト自動化スクリプト作成にとどまりません。以下のような技術領域にまたがります：

- Playwright / CodeceptJS / Cypress などによるE2E自動化
- GitHub ActionsやJenkinsを用いたCI/CDパイプライン構築
- TestRailなどのテスト管理ツールとの連携
- DockerやMockサーバーによるテスト環境の構築
- AIによるテストケース生成、リスクベースド分析
- テスト実行結果の可視化、Slack通知、自動レポーティング

## 現場で起きている問題

実際の現場では、SETの役割が明確に定義されておらず、「テスト自動化ができる人＝何でもできる人」と捉えられてしまうケースが散見されます。その結果、SETが本来担うべき技術的な改善や自動化の設計ではなく、手動テストや運用業務のリソース補填として使われる場面が増えてきています。

これは特定の企業や地域に限った話ではなく、SETという職種そのものがまだ新しく、組織内での立ち位置や認識が定まっていないことに起因しています。

このような状況が続くと、SETエンジニアとして本来の専門性を発揮できず、キャリアとしての一貫性や成長の機会が損なわれるリスクがあります。

## 自分のスタンス

私は、SETエンジニアは「品質保証がしたい人」ではなく、「品質保証を技術で支えたい人」だと考えています。だからこそ、テストの実行や設計を代行するのではなく、テストを“しやすくする仕組み”を作ることこそが本質的な貢献だと思っています。

SETの役割が曖昧にされ、便利屋的に使い潰されることは、プロダクトにとっても、組織にとっても、そして何よりエンジニア自身にとっても大きな損失です。

## まとめ

- SETは「QA≠SET」であるべき存在
- 手動実行や設計業務の代行ではなく、技術による支援が本来の価値
- 組織としてSETの定義と期待を明文化し、分業体制を健全に保つことが重要

SETの価値が正しく理解され、真に力を発揮できる環境が増えていくことを願って、この文章を締めくくります。

最後までお読みいただき、ありがとうございました。