OmniAICreator/Qiita-1.07M huggingface dataset:
お名前.comで取得したドメインをRoute53に登録し、証明書登録までを行ってみる。

SESでのメール送信を行うためには独自ドメインが必要とのことで、
お名前.comで取得したドメインをAWS側で設定してみた。
今回では、ACMでの証明書発行するまでを実施した。

#### ■お名前.comにてドメインを取得
![名称未設定.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/4053547/96ef3161-e832-45df-9e67-7d64ed409145.png)
ドメインは黒塗りしていますが、お名前.comの管理画面で取得後の画面になります。

#### ■Route53のホストゾーンに取得したドメインを登録
![名称未設定.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/4053547/edf4a996-0ff3-492f-8dde-57ee87a49a48.png)
ホストゾーンにて取得したドメインを設定


![名称未設定2.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/4053547/1e6d0b8d-3548-42e1-bbaf-0fe4a002a56d.png)
設定が完了すると2レコードが追加されていた。
NSレコードが確認可能となる。


#### ■お名前.comにNSレコードを登録
![名称未設定3.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/4053547/fc133a87-129b-4f9f-804b-d5999f997afd.png)
お名前.comの管理画面側で先ほど発行されたNSレコードを登録する。


#### ■反映確認
『反映完了まで24時間から72時間程度かかる場合がございます。』と書かれていたが、10分程度で上記コマンドで反映が確認できた。
```
% nslookup -type=NS [お名前comで取得したドメイン]
Server:		192.168.10.1
Address:	192.168.10.1#53

Non-authoritative answer:
[お名前comで取得したドメイン]	nameserver = ns-***.awsdns-**.***.
[お名前comで取得したドメイン]	nameserver = ns-***.awsdns-**.***.
[お名前comで取得したドメイン]	nameserver = ns-***.awsdns-**.***.
[お名前comで取得したドメイン]	nameserver = ns-***.awsdns-**.***.
```

#### ■ACMにて証明書をリクエスト
![名称未設定4.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/4053547/d33d23bd-d75e-4ec7-b711-7eccdbf4f167.png)
ACMにドメインを登録し、証明書のリクエストを行う。
その後、「Route53でDNSレコードを作成」をクリックし、レコードの設定を行う。

![名称未設定５.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/4053547/84799b45-7ac3-48e1-90a6-f166974d6606.png)
しばらく時間をおいてステータスを確認すると、ステータスが「発行済み」の状態になっていた。

今後はこの証明書を生かして後続の処理を構築していこうと思います。
Pythonの変数と代入

Pythonの変数と代入について説明します。


## Pythonの基本

Pythonの値（データ）は総てオブジェクトです。
None、数値、真偽値、文字列、リスト、関数、クラス、メソッド、その他　総てがオブジェクトです。

オブジェクトはメモリ上に生成され、オブジェクトを識別するオブジェクト識別子（オブジェクトID）が与えられます。

変数に値を代入すると、値そのものではなくオブジェクトIDを保持して、変数からオブジェクトを参照します。

オブジェクトIDは`id()`関数で調べる事ができます。



## 変数解釈

Pythonの変数をどう考えるかで解釈が二つあります。


### 箱解釈

変数を値（データ）が入る**箱**と解釈します。

```py
A = 1
```

この代入文は、Pythonでは
「数値1のオブジェクトIDを `A` という名前の**箱**に入れる」
と解釈します。



### 名札解釈

変数はオブジェクトに対する名札と解釈します。

```py
A = 1
```

この代入文は
「数値1 に `A` という**名札**を付ける（束縛する）」
と解釈します。



## 代入

代入の動作について説明します。
箱解釈で説明します。



### 数値オブジェクト

```py
A = 1  # 数値1がメモリ上に生成され、数値1のオブジェクトIDが変数Aに代入されます。
B = A  # 変数Aが保持してるオブジェクトIDが変数Bにも代入されます。
A = 2  # 数値2がメモリ上に生成され、数値2のオブジェクトIDが変数Aに代入されます。
```

`B = A`の動作を説明します。

右辺の変数Aに代入されてるオブジェクトが取り出され、そのオブジェクトIDが左辺の変数Bに代入されます。
変数Aと変数Bは同じオブジェクトIDを保持することになり、ひとつのオブジェクトを共有します。

`A = 2`で新たに数値2のオブジェクトが生成され、変数Aは変数Bとは異なる数値2のオブジェクトIDを保持します。

```py
print(A)  # 2
print(B)  # 1
```

**注意**

上の式の `A = 2` は、変数Aに代入されている数値1の内容を数値2に変更する動作だと誤解する人がいます。

`A = 2`はただ単に変数Aに数値2のオブジェクトIDが代入され、変数Bとは違うオブジェクトIDになり、オブジェクトを共有しなくなります。



### リストオブジェクト

```py
A = [1,2,3]  # 変数Aにリスト[1,2,3]のオブジェクトIDが代入されます。
B = A        # 変数Bに変数AのオブジェクトIDが代入され、リスト[1,2,3]を共有します。
A[1] = 4     # 変数Aのリストの１番目に4を代入します。
```

この段階では変数Aと変数Bは同じオブジェクトを共有しています。
なので変数Bも変数Aと同じ内容になります。

```py
print(A)  # [1,4,3]
print(B)  # [1,4,3]
```


***注意***

代入文
```py
A = 1
```
と
```py
A[0] = 1
```

は動作が異なります。

`A = 1` は変数**A**にオブジェクトIDが代入されます。

`A[0] = 1`は変数Aに代入されているリストを取り出し、リスト内部の**0番要素**に数値1のオブジェクトIDが代入されます。



## 累算代入

### イミュータブルオブジェクト

```py
A = 1
A += 1
```

数値などのイミュータブルオブジェクトでは、`A += 1` は `A = A + 1`　と同じです。

`A` の値を `+ 1`して新しく生成された数値2のオブジェクトIDを `A` に代入します。

`A` に代入されている数値1はイミュータブルオブジェクトで、オブジェクト内の値を2に変更することができないため、数値2を生成してそれまでとは異なるオブジェクトIDが変数Aに代入されます。

### ミュータブルオブジェクト

```py
A = [1, 2, 3]
A += [4]
```

`A += [4]` は `A.__iadd__([4])`　と同じです。
リストなどのミュータブルオブジェクトには [`__iadd__` などの累算代入メソッド](https://docs.python.org/ja/3/reference/datamodel.html#object.__iadd__)があります。
変数`A`に代入されているオブジェクトを取り出し、オブジェクトの`__iadd__`メソッドを呼び出します。
リストの`__iadd__`メソッドではリスト自身にデータを追加します。新しいリストを生成しないため、共有している変数のオブジェクトも変更されることになります。

数値などのイミュータブルオブジェクトには累算代入メソッドがないため、`A += 1` は `A = A + 1` と解釈されます。


## まとめ

以上、Pythonの変数と代入について説明しました。


## おまけ

Pythonはオブジェクトを実行時に生成します。
しかし、`-5`～`256`までの整数値はよく使われるので、毎回オブジェクトを生成しなくて済むように起動時に生成しておいて共有・再利用します。

なので

```py
A = 1
B = 2
A += 1
```

の場合、通常は `A += 1` で新たな数値2が生成され、Bとは違うオブジェクトIDになるはずですが、

```py
print(id(A)) -> 140725856258520
print(id(B)) -> 140725856258520
```

のように同じオブジェクトIDになります。
猿でもわかるAIの倫理・リスクシリーズ 🐵⚠️AIによる中小企業排除リスク

  
## AIによる中小企業排除リスクとは？〜技術者が知っておくべき実情と対策〜
## 1. はじめに：便利なAIが中小企業を追い詰める？

ChatGPT、Copilot、生成AI……AI技術の進化により、大企業は圧倒的な生産性を手に入れました。しかし、その陰で静かに淘汰されつつあるのが**中小企業**です。  
「コストをかけられない」「高度なAI人材がいない」「API料金が高い」など、AI導入の壁は小さくありません。

この問題は単なる「経営努力の差」ではなく、**構造的な格差拡大**を生む可能性があります。この記事ではこのリスクに焦点を当て、技術者としてどのように備えるべきかを解説します。

---

## 2. AIと中小企業格差：技術の恩恵は平等か？

### 🧠 現実の構図

| 大企業の特徴           | 中小企業の特徴              |
|----------------------|--------------------------|
| 専任AIチームあり        | IT担当が1人〜兼任が多い       |
| AI APIコストに耐えられる | 毎月のAPI課金が負担になる     |
| データが豊富           | 顧客データが少なくモデルが学習できない |
| 内製・自動化しやすい     | 手作業・外注が多い            |

生成AIの導入は「選ばれし企業」しか得られない時代に入ろうとしています。

---

## 3. 実例とコード：中小企業でも使えるローカルAIソリューション

クラウドAPI（例：OpenAI API）に頼らず、**ローカルで動く軽量なLLMや画像分類モデル**を活用することで中小企業でもAI導入は可能です。

### ✅ 例：`llama.cpp` + `Langchain`によるローカルLLMチャットボット

```bash
# 1. llama.cpp のセットアップ
git clone https://github.com/ggerganov/llama.cpp
cd llama.cpp
make

# 2. モデルのダウンロード（例：Mistral-7B）
python3 download.py --repo mistralai/Mistral-7B-Instruct-v0.1

# 3. PythonでLangchainを使ってチャットボット構築
```

```python
from langchain.llms import LlamaCpp
from langchain.chains import ConversationChain

llm = LlamaCpp(
    model_path="./models/mistral-7b.gguf",
    temperature=0.7,
    max_tokens=256
)

chain = ConversationChain(llm=llm)
response = chain.run("請求書のテンプレートを作ってください")
print(response)
```

### 💡 解説図（画像1）：ローカルLLMの構成図  
*(※ここにモデル構成図を挿入)*

---

## 4. 実践Tips：小さく始めて、継続するための工夫

- **💡 Tip1：推論最適化**  
  GGUFフォーマットを使い、低メモリ環境（8GB〜16GB）でも動作可能に。

- **💡 Tip2：用途を限定する**  
  すべてをAI化するのではなく、「請求書自動作成」「問い合わせ対応」のような**単一業務特化**が効果的。

- **💡 Tip3：オープンソースを活用**  
  Hugging Face、Langchain、Haystackなどを組み合わせることで、費用を抑えて高機能なAIを実装可能。

### ⚠️ よくある落とし穴

- 「とりあえずChatGPTを導入して失敗」：目的なき導入は失敗しやすい
- API課金爆弾：試験導入でも数万円/月になることも
- セキュリティ軽視：顧客データをそのままクラウド送信する危険

---

## 5. 応用・拡張：中小企業向けのAI内製ロードマップ

1. **ステップ1：業務フロー可視化**  
   → AI化できるポイントを洗い出す

2. **ステップ2：ローカル推論環境の整備**  
   → GPU不要なCPUベースモデルから始める

3. **ステップ3：段階的にLangchainやRAGを組み込む**

4. **ステップ4：社内ポリシー策定とナレッジ共有**

### 💡 応用図（画像2）：AI内製ロードマップ

---

## 6. まとめ：技術の民主化に向けて、技術者ができること

| 項目             | 内容                                                |
|------------------|-----------------------------------------------------|
| ✅ メリット        | 自動化・省力化・競争力向上                                    |
| ⚠️ リスク         | 導入コスト・人材不足・運用スキルの欠如                           |
| 🌱 技術者の役割     | 中小企業に向けた**持続可能なAI設計・教育・普及活動**を担うこと       |

### 🚀 今後の展望

今後、軽量なオープンソースLLMやデバイス最適化技術（例：Edge AI）が進化することで、中小企業でも無理なくAI活用できる環境が整っていくと考えられます。


---

📌 ご意見・ご質問があればコメントでぜひ教えてください！
猿でもわかるAIの倫理・リスクシリーズ 🐵⚠️自律型武器（LAWS）の倫理と規制


## 自律型兵器（LAWS）の倫理と技術的実態：エンジニアの視点から読み解くAI兵器のリスク

---

### 1. 🧭 はじめに：AIと戦争、交差する未来

AI技術の進化は、医療や物流だけでなく、軍事分野にも深く浸透し始めています。中でも注目されるのが**自律型致死兵器（LAWS: Lethal Autonomous Weapon Systems）**です。人間の介入なしにターゲットを認識・判断・攻撃できるこれらの兵器は、「殺す判断をAIに任せるべきか？」という極めて重い倫理的・技術的問いを投げかけています。

本記事では、単なる倫理的な議論に留まらず、**LAWSに用いられる技術的仕組み・実装例・運用時のリスク・回避策**まで、現場のエンジニア視点で深掘りしていきます。

---

### 2. 🧠 自律型兵器（LAWS）とは？仕組みと構成技術の全体像

#### ▷ LAWSの定義

> 人間の関与なしに標的を選定・攻撃できる兵器システム。  
> 例: 自律型ドローン、監視AI＋自動砲台など

#### ▷ 技術構成の概要

| 機能 | 使われる技術 |
|------|---------------|
| 認識 | Computer Vision（YOLO, ResNet など） |
| 追跡 | マルチオブジェクトトラッキング（Deep SORTなど） |
| 意思決定 | 強化学習・ルールベースAI |
| 通信・同期 | Edge AI + 5G通信 |
| 自律制御 | ROS, PX4, オンボード制御系 |

<div align="center">
  <img src="https://upload.wikimedia.org/wikipedia/commons/thumb/f/f9/Autonomous_weapon_systems_diagram.svg/1024px-Autonomous_weapon_systems_diagram.svg.png" width="500" alt="LAWSの構成図"/>
  <p style="font-size: 12px">出典：Wikipedia「Autonomous weapon systems」</p>
</div>

---

### 3. 💻 実装例：AIドローンの標的認識プロトタイプ

実際の兵器開発は非公開ですが、民間技術で模倣できる部分も多いです。以下はYOLOv5を使った「人型標的の自律検知・追跡」システムの簡易実装例です。

#### 🧪 使用技術：
- YOLOv5（物体検出）
- OpenCV（カメラ入力・描画）
- Python

#### 🧾 コード例（一部抜粋）：

```python
import cv2
from ultralytics import YOLO

# モデルのロード（人を検出）
model = YOLO('yolov5s.pt')

cap = cv2.VideoCapture(0)  # カメラ入力
while True:
    ret, frame = cap.read()
    if not ret:
        break

    results = model(frame)
    annotated = results[0].plot()  # 検出結果の描画

    cv2.imshow('Target Tracking', annotated)
    if cv2.waitKey(1) == 27:  # ESCで終了
        break
cap.release()
cv2.destroyAllWindows()
```

#### 🎯 実用の視点：
- 実際にはターゲット識別後、攻撃指令や自律飛行と連動する必要あり
- エッジデバイス上でリアルタイム推論が可能（Jetson Nano等）

---

### 4. 🛠️ 現場の落とし穴と運用上の注意点

#### ⚠️ よくある技術的課題

| 課題 | 内容 | 対策 |
|------|------|------|
| 誤検出 | 子供や非戦闘員を誤認識 | ヒューマンインザループ導入、二重識別 |
| ブラックボックス問題 | AIの意思決定が不透明 | XAI（説明可能なAI）の活用 |
| 通信断 | 指令系が切断され自律暴走 | failsafeルール設計、冗長化 |

#### 🧩 制御アルゴリズムの注意点：

```python
if identify_target(frame) and confirm_rules_of_engagement():
    execute_engagement()  # 攻撃命令を下すロジックには厳格なチェックが必要
```

---

### 5. 🚀 発展応用と倫理的議論の交差点

#### ▷ 技術の進化：

- Federated Learningによる複数機体の共同学習
- GPT-4のような生成AIとの連携で「戦場の文脈理解」が向上する可能性

#### ▷ 国際的な規制動向：

| 年 | 動向 |
|----|------|
| 2013 | 国連、LAWS規制の初議論開始 |
| 2021 | EU、AI兵器の規制に関する枠組みを提言 |
| 2024 | 国際NGOが全面禁止を要請中（Campaign to Stop Killer Robots） |

> 💬 *“技術が可能であることと、それが倫理的に許容されるかは別問題”*

---

### 6. 🧾 まとめ：AI兵器時代のエンジニア倫理とは？

#### ✅ メリット：
- リスクの高い任務を人間から切り離せる
- 精度が高まれば民間応用にも貢献可能（災害救助など）

#### ❌ デメリット・懸念：
- 誤認識の命取りリスク
- 非倫理的な運用の可能性
- 法整備が追いつかない現状

#### 🔮 今後の展望：
- Explainable AIの標準搭載
- 国際条約レベルでの制限が必須
- 技術者が「創る責任」と「止める知識」の両方を持つことが不可欠

---

### 📝 おわりに：あなたのコードは、引き金を引くかもしれない

AIエンジニアとして、日々触れているコードやモデルが、戦争や倫理の最前線に使われる可能性がある時代です。**便利さの裏にある「責任」**を意識しながら、次の一行をどう書くか——私たち一人ひとりが問われています。

---

> 📌 本記事のコードや図解はGitHubにて公開中：[https://github.com/example/ai-laws-demo](https://github.com/example/ai-laws-demo)
猿でもわかるAIの倫理・リスクシリーズ 🐵⚠️AIに対する国際法規制の現状

   
## 「AIに対する国際法規制の現状」から学ぶ、技術者が知っておくべき実践知

---

### 1. 🧭 はじめに：ChatGPTは合法？それともグレーゾーン？

2023年以降、生成系AI（Generative AI）が急速に社会へ浸透しています。しかし、AIの利用が進む一方で「この使い方、法律的にOKなの？」という疑問を感じたことはありませんか？

たとえば：

- ChatGPTで生成したコードを商用に使っても問題ない？
- AIによる監視システムはプライバシー侵害にならない？
- モデル学習に使われたデータの著作権はどうなる？

このような疑問に対し、現在の国際的な法規制はまだ“整備中”の段階です。本記事では、技術者として最低限知っておくべきAIに対する国際法規制の現状を整理し、開発現場で実際に注意すべきポイントをコード例と共に紹介します。

---

### 2. 🌍 国際的なAI法規制の現状サマリー

#### 🧾 主要な動向

| 国・地域 | 法規制名・枠組み | 特徴 |
|----------|------------------|------|
| 🇪🇺 EU | AI Act（2025施行予定） | リスクベースアプローチ、高リスクAIには厳しい義務 |
| 🇺🇸 米国 | Blueprint for AI Bill of Rights | ガイドラインベース、強制力は低い |
| 🇯🇵 日本 | AI戦略2022、生成AIに関する指針（内閣府・経産省） | 民間主導の「ソフトロー」、原則中心 |

#### 🏷️ 分類と対応レベル（AI Act例）

- **禁止AI（例：社会信用スコア）**
- **高リスクAI（例：医療診断、顔認証）**
- **限定リスクAI（例：チャットボット）**
- **低リスクAI（例：メールフィルタ）**

💡**ポイント：** 技術者が「自分の作っているAIはどのリスク分類に該当するか？」を判断できるようになることが重要です。

---

### 3. 💻 実例：AIチャットボットを実装する際の法的配慮とコード例

#### 🧪 シナリオ：社内FAQボットを社外向けに公開したい

この場合、以下の法的な配慮が必要です：

- プライバシー保護（個人情報の取り扱い）
- ユーザーに「AIである」ことの明示
- 対話ログの適切な保存・管理

#### ✅ 実装例（Node.js + Express）

```javascript
// ユーザーに「AIボットである」ことを明示するミドルウェア
app.use('/chat', (req, res, next) => {
  res.setHeader('X-AI-Notice', 'This conversation is powered by an AI chatbot.');
  next();
});
```

```javascript
// 会話ログを保存（PIIフィルタ付き）
function saveChatLog(userId, message) {
  const filteredMessage = message.replace(/[\w.%+-]+@[A-Za-z0-9.-]+\.[A-Za-z]{2,}/g, '[email]');
  fs.appendFileSync(`logs/${userId}.log`, `${new Date().toISOString()}: ${filteredMessage}\n`);
}
```

---

### 4. 🛠️ 現場で役立つTips & よくある落とし穴

#### ✅ よくある落とし穴

| 問題 | 解説 | 対策 |
|------|------|------|
| ユーザーがAIと認識していない | Chat UIが自然すぎる | **明示表記**を画面に入れる |
| 無断で会話ログを保存 | プライバシー侵害の可能性 | 利用規約に**ログ保存の目的**を記載 |
| 学習データに著作物が含まれている | モデルが著作権侵害になることも | 商用モデルには**ライセンス明示されたデータのみ**使用 |

#### ⚠️ リスクチェックリスト（開発前に確認！）

- [ ] AIが扱うデータに個人情報やセンシティブ情報は含まれていないか？
- [ ] AIが意思決定に関与する範囲を明示しているか？
- [ ] 利用者にAI利用を明示しているか？
- [ ] ログや出力の取り扱い方針を定めているか？

---

### 5. 🔭 応用・拡張：マルチリージョン対応のAIサービス構築

#### 🌐 ユースケース：EUと日本の両方にサービス提供

EUのAI Actは日本よりも厳格なので、**リージョン別の制御レイヤー**を設ける必要があります。

```python
# 地域判定ロジック（Python例）
def is_eu_user(ip_address):
    eu_countries = ["FR", "DE", "ES", "IT", "NL", ...]
    country = ip_to_country(ip_address)
    return country in eu_countries
```

```python
# リスク別に異なる出力戦略を適用
if is_eu_user(user_ip):
    response = get_compliant_response(prompt, policy="EU")
else:
    response = get_compliant_response(prompt, policy="JP")
```

---

### 6. 🎯 まとめ：AI法規制は“技術者の責任”でもある

| 項目 | 評価 |
|------|------|
| 🔍 理解しやすさ | ★★★☆☆（法制度なので難解な部分あり） |
| 🛠️ 現場適用性 | ★★★★★ |
| 🚀 今後の重要度 | ★★★★★（AI Act施行により加速） |

---

### 👣 次のアクション

- 自社AIプロジェクトにおけるリスク分類をチェックしてみよう
- 契約書・利用規約にAI利用やログ保存を明記しよう
- ChatGPTや生成AIの利用ポリシーをチーム内で定めよう

---

🧑‍💻 **最後に：**
AI時代においては、コードを書くだけでなく「倫理や法」にも向き合うことがプロのエンジニアとしての責任です。
猿でもわかるAIの倫理・リスクシリーズ 🐵⚠️AI監視社会は到来するか？


 
## 「AI監視社会は到来するか？」現実と向き合う技術者の視点

---

### 1. はじめに：便利さの裏に潜む影  
近年、顔認識、行動解析、音声認識といったAI技術の進化により、私たちの生活は便利になりました。  
しかしその一方で、**「監視されている」という感覚**を抱いたことはありませんか？  
実際、中国やアメリカの一部地域では、公共空間に設置されたカメラとAIを組み合わせて、個人の行動をリアルタイムで把握するシステムが導入されています。

本記事では、AI監視社会の実情とリスクについて、**技術的観点から掘り下げ**、実装上の注意点や**エンジニアとしての倫理的判断軸**を共有します。

---

### 2. AI監視技術の概要  
監視AIには、以下のような代表的な技術があります。

| 技術 | 説明 | 使用例 |
|------|------|--------|
| 顔認識 | 画像から個人を特定 | 空港の自動入国管理 |
| 行動検出 | 動画から動きや姿勢を解析 | 万引き検知、群衆管理 |
| 音声解析 | 音声データからキーワード検出 | スマートスピーカー、セキュリティ監視 |
| パターン検出 | ビッグデータから異常パターンを特定 | 金融詐欺検出、警備強化 |

> 🧠 **用語解説：顔認識**
> 画像から目、鼻、口の位置を検出し、既知の顔データと照合して個人を特定する技術。

---

### 3. 実装例：Pythonで簡易顔認識監視システムを構築してみる  

#### 使用ライブラリ
```bash
pip install opencv-python face_recognition
```

#### コード例（監視カメラ風）
```python
import cv2
import face_recognition

# カメラを起動
video_capture = cv2.VideoCapture(0)

# 既知の顔画像を読み込み
known_image = face_recognition.load_image_file("me.jpg")
known_encoding = face_recognition.face_encodings(known_image)[0]

while True:
    ret, frame = video_capture.read()
    rgb_frame = frame[:, :, ::-1]

    face_locations = face_recognition.face_locations(rgb_frame)
    face_encodings = face_recognition.face_encodings(rgb_frame, face_locations)

    for face_encoding in face_encodings:
        match = face_recognition.compare_faces([known_encoding], face_encoding)
        if match[0]:
            print("✅ 顔認識成功：対象人物が検出されました")
        else:
            print("❌ 未知の人物")

    cv2.imshow('Video', frame)
    if cv2.waitKey(1) & 0xFF == ord('q'):
        break

video_capture.release()
cv2.destroyAllWindows()
```

> 📸 ローカル実行であっても、顔データは**機微情報（PII）**として扱うべきです。保管・共有に注意！

---

### 4. 現場での経験談と注意点  

#### ✅ 実務で役立つポイント
- **解像度が命**：顔認識は最低でも720p以上で運用すべき
- **光の影響**：暗所では精度が落ちる → 赤外線カメラの併用が効果的
- **リソース管理**：リアルタイム処理にはGPUや最適化が必要

#### ⚠️ よくある落とし穴
- 個人情報保護法やGDPRに違反 → 実装前に**法務チェック必須**
- 常時録画・分析のストレージが膨大になる → ストレージ戦略と圧縮技術が必要
- 誤検出によるクレーム → 精度の検証とフィードバックループがカギ

---

### 5. 発展応用：社会的信用スコアとAI統治
一部の国家では、AI監視と連携して**「社会的信用スコア」**が導入され、市民の行動が数値化されるケースもあります。  
技術的には下記のようなAIパイプラインが構築されます：

```plaintext
カメラ映像
   ↓
顔・行動認識AI
   ↓
行動スコアリング（ルールベース or 機械学習）
   ↓
個人IDと紐付けて記録
   ↓
政策判断・罰則・優遇処置への反映
```

このような社会的実装には、精度や透明性だけでなく、**偏見や差別を増幅させないための工夫**が不可欠です。

---

### 6. 結論：エンジニアとしての責任  

#### ✅ メリット
- セキュリティ強化
- 犯罪抑止力
- スマートシティの発展

#### ⚠️ デメリット
- プライバシー侵害の懸念
- 悪用のリスク（独裁・差別強化）
- 誤検出による冤罪

私たちエンジニアは、ただ便利なシステムを作るだけでなく、**その技術がどのように使われうるかを考え抜く責任**があります。

未来のAI社会が「監視」ではなく「共生」となるように、**倫理的リテラシー**を持った開発を心がけましょう。

---

🧰 本記事で使ったコード・資料はGitHubでも公開しています。  
💬 ご質問や実装相談はコメントでお気軽に！
猿でもわかるAIの倫理・リスクシリーズ 🐵⚠️AIによる刑事司法判断のリスク

1. はじめに：なぜ今「AIと刑事司法」が問題なのか？
近年、AIは医療、金融、製造業など様々な分野に浸透し、業務効率化や意思決定の支援に活用されています。その中でも特に議論を呼んでいるのが、刑事司法分野へのAI導入です。

「AIが犯罪者を判定するの？」「機械に“公正”な判断ができるのか？」
そんな不安を抱く方も多いのではないでしょうか？

実際に、アメリカなどではリスク評価ツール（例：COMPAS）が導入され、再犯リスクの予測などに活用されていますが、その結果がバイアスを含む不公平な判断を生むケースも報告されています。

本記事では、技術的な観点からこの問題を掘り下げ、

どのようにしてAIが司法判断に関わるのか
実装上のポイントや注意点
実務で気をつけたい落とし穴や対策
を、コードや図を交えて解説していきます。

2. AIによる刑事司法判断とは？
🔍 活用される技術の概要
司法分野で使われているAIの代表例：

リスクスコアモデル：犯罪歴や年齢、職歴などを元に再犯リスクを予測
自然言語処理（NLP）：裁判記録・判決文から傾向分析
顔認識・監視映像解析：捜査支援としての使用
中でも議論を呼んでいるのが、スコアリングAIです。

以下の図は、典型的なスコアリングシステムのフローです：

+------------------+     +-----------------------+     +----------------+
| 個人データ（入力） | --> | MLモデル（リスク予測）  | --> | 再犯リスクスコア |
+------------------+     +-----------------------+     +----------------+
3. 簡単な実装例：再犯リスクのスコアリングモデル
今回はシンプルなロジスティック回帰を使って、模擬データから再犯リスクを予測するモデルを作成してみます。

🧪 使用ライブラリ
import pandas as pd
from sklearn.linear_model import LogisticRegression
from sklearn.model_selection import train_test_split
from sklearn.metrics import classification_report
🗂️ ダミーデータの作成
data = pd.DataFrame({
    'age': [22, 35, 45, 18, 29, 40],
    'prior_offenses': [0, 3, 5, 1, 2, 4],
    'employment_status': [1, 0, 0, 1, 1, 0],  # 1=Employed
    'reoffended': [0, 1, 1, 0, 0, 1]
})
🤖 モデルの学習と評価
X = data[['age', 'prior_offenses', 'employment_status']]
y = data['reoffended']

X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.3, random_state=42)

model = LogisticRegression()
model.fit(X_train, y_train)

pred = model.predict(X_test)
print(classification_report(y_test, pred))
✅ 出力例
              precision    recall  f1-score   support

           0       1.00      1.00      1.00         1
           1       1.00      1.00      1.00         1

    accuracy                           1.00         2
このように、モデル構築自体は難しくありません。しかし、実運用では予測の根拠や公平性が大きな課題になります。

4. 実務での注意点と落とし穴
⚠️ よくある問題とその背景
問題	説明
データバイアス	黒人や若年層が不当に高リスクと評価されるケース
透明性の欠如（ブラックボックス）	裁判官がAIの判断理由を説明できない
フィードバックループ	AIの判断が次の逮捕や判決に影響し、偏りを強化
法制度との整合性	「AI判断」にどの程度法的拘束力を与えるべきか不明確
💡 技術的な対処法
SHAP / LIME を用いた説明可能性の確保
Fairlearn や AIF360 による公平性評価
意図的にデータのバランス補正を行う
「AIは参考意見に留める」設計原則を守る
5. 応用と今後の展望
🔍 他国の取り組み
アメリカ：COMPASやHARTなどのAIツールが一部州で導入
エストニア：軽微事件の処理にAI裁判官の実証実験
日本：現時点でAI判決は導入されていないが、捜査支援・文書解析にAI活用の兆しあり
🔮 今後の課題と可能性
「透明性と精度のトレードオフ」をどう解決するか
法制度との協調：AIガイドラインの整備と明文化
社会的合意の形成：エンジニアも倫理の理解が必要
6. まとめ：AIは万能ではないが無視もできない
AIは司法の効率化に貢献する可能性を持つ一方で、人権や公平性を脅かすリスクも含んでいます。

項目	評価
メリット	判断の一貫性、迅速化、コスト削減
デメリット	バイアス、不透明性、責任の所在の曖昧化
司法という人の運命を左右する場面では、単なる精度だけでなく人間らしい判断基準が求められます。

技術者として私たちは、ただコードを書くのではなく
「そのコードが誰に、どんな影響を与えるのか」まで想像力を働かせるべきだと感じます。

📚 参考資料
https://www.propublica.org/article/machine-bias-risk-assessments-in-criminal-sentencing
https://www.ibm.com/blogs/policy/trustworthy-ai/
👉 次回予告：芸術分野におけるAI生成のリスクとは？
シリーズ第6弾では、創作とAIの“著作権戦争”に迫ります！
4年目SEが伝える “後輩から信頼される先輩” になる工夫3選

## はじめに

⚠️注意：
この記事は、後輩と接するテクニックやマニュアル的な方法論ではなく、自分自身の内面的なスタンスや姿勢に焦点を当てた工夫を紹介しております。

社会人も4〜5年目になってくると、後輩ができ始めてくることかと思います。
そんな時、どう接すればいいのか迷ったことはありませんか？
「どう接すればいいのか」「丁寧に教えなきゃ」と思うほど、逆にストレスを感じることもあると思います。

私自身、SEとしてキャリアも4年目となり、初めて後輩の育成に関わるようになりました。
最初は、どこまで教えるべきか、どう伝えればいいのか、と手探りの状態。

そんな中、後輩からこんな言葉をもらったことがあります。

>「tomoya_1998さんって、わかりやすいですよね！」
>「話しかけやすいし、信頼できます！」

この言葉をきっかけに、「どう教えるか」ではなく「どう関わるか」という視点の大切さに気づきました。

この記事では、私がこれまでの経験で実践してきた中で、特に効果を感じた育成の工夫を3つ紹介します。

## 1. フラットに見る（バイアスを持たない）
私が後輩育成に限らず人と関わる際、最も気をつけていることです。
**自分の経験や価値観で後輩を判断すると、どうしてもバイアスが入りがち**です。

たとえば、

「自分の新人時代ならできたのに」

「この程度でつまずくのはおかしい」

こうした見方は、意識していなくても態度や言葉に出てしまい、関係を悪くしてしまうことがあります。

私が心がけているのは、**「今のその人」を見る**こと。過去の自分や他の後輩と比較せず、
その人がどういう背景を持って、どんな状況にあるのかを丁寧に観察するようにしています。

## 2. 目的を共有する
もしかしたら貴方自身も心当たりがあるかもしれませんが、同年代（社会人1〜5年目）と仕事の話をすると、大抵の人は意味のない作業を嫌っています。
より解像度を上げると、**自分のキャリア・ステップアップに直結しないであろう**作業を極端に嫌う人が多いです。（例：PCのキッティング、社内の事務処理など）

だからこそ先輩としては、**そうした作業の意味や全体への貢献を丁寧に伝え、後輩が納得して主体的に取り組めるよう導く**ことが求められます。

私が意識しているのは、「なぜその仕事をやるのか」「それがどんな意味を持っているのか」を一緒に共有することです。

実業務の中には、地味な作業も多く、指示だけだと意図が伝わらず、やらされ感が出てしまうこともあります。

ですが、「この資料があることでプロジェクト全体の進捗が可視化され、マネージャーの判断が早くなる」など、背景や目的を伝えるだけで、後輩の取り組み方が大きく変わるのを感じました。

## 3. 自律を育てる

私自身、育成のゴールは、**教えなくても自分で動ける状態**だと思っています。

そのために大事にしているのが、指示を出すだけでなく、**考えてもらう機会**をつくることです。

たとえば、

「この作業、どう進めた？次に改善できそうなところは？」

「今回のトラブル、次はどう防げそう？反省点と改善点を挙げてみて！」

こうした問いかけをすることで、自然と自分でPDCAを回す習慣がついてきます。

正解を与えるのではなく、考える材料や視点を渡す。
そうすることで、後輩自身が思考の幅を広げ、自立的に動けるようになっていくのを感じました。

## おわりに

信頼される先輩になるために必要なのは、教え方のテクニックではなく、向き合い方の姿勢だと実感しています。

１、フラットに見る

２、目的を共有する

３、自律を育てる

この3つを意識するだけで、後輩との関係性はぐっと良くなり、
結果的に自分自身の成長にもつながります。

完璧じゃなくても、丁寧に、誠実に関わる。それだけで信頼はきちんと育っていくものだと思います。

この記事が、同じように悩んでいる方のヒントになれば幸いです。

---

### 📌 著者プロフィール

SE歴4年目（PMO歴1年半）／株式会社ギグー所属。  
日々プロジェクト推進やメンバー支援を行いながら、  
「どうすればチーム全体が動きやすくなるか？」をテーマに試行錯誤しています。  

Qiitaでは、PMOの現場で得た気づきや、若手育成に役立つ工夫を発信中。
windows11で、sketchup6 その98

# 概要
windows11に、sketchup6を入れてみた。
rubyで、3Dを書く。
BVHファイルの仕様が、はっきりしないのでcopilotに聞いてみた。

# プロンプト
BVHファイルでmotionは差分ですか

# 回答
BVH（Biovision Hierarchy）ファイルのモーションデータは、基本的に各フレームごとの「絶対値」の変換情報を含んでいます。そのため、モーションは**差分**（前フレームとの差）ではなく、各関節の**絶対的な位置と回転**が記述されます。

ただし、BVHの構造上、**ルートノードの位置情報はグローバル座標**で記述されますが、それ以外の関節（ボーン）は**親ボーンからの相対的な回転**として記述されます。この相対回転を時間軸で処理すると、結果的に動きの変化（差分）のように見えることもあります。

もし「差分データ」として扱いたい場合、フレームごとの変化量を計算することで、差分モーションを作ることができます。例えば、前フレームとの位置・回転の差分を求めて、速度や加速度を計算することも可能です。

BVHファイルを解析して特定の処理をしたい場合、どのような用途に使うかを教えていただければ、より具体的なアドバイスができるかもしれませんよ！

以上。
Google Drive 上の画像を d3-org-chart に埋め込む方法（2025年版）

## はじめに

Google Sheets を組織データベースとして活用し、Google Apps Script（GAS）の HTML サービスを用いて動的な組織図を生成・配信する方法について、以前の記事で紹介した。

https://qiita.com/rairaii/items/9af5f32d6bbd827c6924

しかし、**Google Drive に保存した画像を d3-org-chart に描画する方法**については触れていなかったため、本記事で補足する。

---

## Google Drive 上の画像は iframe で埋め込むのが推奨されている

2023年10月、Google はサードパーティ Cookie の取り扱い変更に関するアップデートを発表し、Google Drive の埋め込みコンテンツにも影響が出るようになった。

https://workspaceupdates.googleblog.com/2023/10/upcoming-changes-to-third-party-cookies-in-google-drive.html

この変更により、画像やファイルをウェブに埋め込む場合は、**「Embed item...」で取得した iframe を使用することが推奨**されている。

![Googleからの通知画像](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1017489/c1f9696b-6618-430b-8f6a-0a33240ee08a.png)

---

## img 要素で直接画像を表示したい場合

一方で、たとえば **d3-org-chart を用いた組織図のノードに画像を表示したい場合**などは、iframe を使うことができない。

このような場合でも、**img 要素の src 属性に直接指定可能な代替 URL** を利用すれば、Google Drive 上の画像を読み込むことができる。

以下の表は、各 URL 形式とその挙動を比較したものである。

| 種類                           | URL 形式                                                              | 挙動                                                             |
|--------------------------------|------------------------------------------------------------------------|------------------------------------------------------------------|
| 共有用の URL                   | `https://drive.google.com/open?id=<画像のID>`                          | プレビュー用の Web ページが返され、画像としては使用できない       |
| 旧来の取得用 URL               | `https://drive.google.com/uc?export=view&id=<画像のID>`               | 画像ページは開けるが、img 要素では読み込みが拒否される            |
| **取得可能な URL(1)** | `https://drive.google.com/thumbnail?id=<画像のID>`                    | **画像そのものが返され、img 要素で表示可能**                     |
| **取得可能な URL(2)** | `https://lh3.googleusercontent.com/d/<画像のID>`                      | **同上。画像が直接返され、埋め込み可能**                          |

これらの URL を利用することで、d3-org-chart のノード内に画像を埋め込むことができる。ただし、**いずれも Google が公式に提供している API ではない**ため、将来的に利用できなくなるリスクがあることに注意してほしい。

---

## 参考資料

- [Google Drive 埋め込み画像に関する検証記事（Ameblo）](https://ameblo.jp/unicom-k/entry-12851857711.html)  
- [Drive 画像の埋め込み表示に関する調査まとめ（Reservoir Design）]()
【React初心者メモ】FelxとGridの違い

単純な横並び・縦並びには Flexbox、複数列のグリッド構造には Grid が一般的です。
### Flexbox
1次元レイアウト（横 or 縦）に特化し、要素の並びや揃えに強い
```
// 横並び＋中央揃え＋要素間スペース
<div className="flex flex-row justify-center items-center space-x-4">
  <div>Item A</div>
  <div>Item B</div>
  <div>Item C</div>
</div>
```
flex：Flexboxコンテナを有効化
flex-row：横方向（左→右）に並べる
flex-col：縦方向（上→下）に並べる
flex-row-reverse：横方向（右→左）に並べる
flex-col-reverse：縦方向（下→上）に並べる

### Grid
2次元レイアウト（行 × 列）に特化し、複雑なレイアウトを行列単位で制御できる
```
// 3列グリッド＋ギャップ
<div className="grid grid-cols-3 gap-4">
  <div>Card 1</div>
  <div>Card 2</div>
  <div>Card 3</div>
  <div>Card 4</div> {/* 自動で2行目の1列目に配置 */}
</div>
```
grid：Grid レイアウトを有効化
grid-cols-\<n\>：列数を\<n\>列に設定
grid-rows-\<n\>：行数を\<n\>行に設定
col-start-\<n\>：開始位置を列数\<n\>列に設定
row-start-\<n\>：開始位置を行数\<n\>行に設定
col-end-\<n\>：列の終了位置を\<n\>列目に設定
row-end-\<n\>：行の終了位置を\<n\>行目に設定
col-span-\<n\>：列にまたがる数を\<n\>列分に設定
row-span-\<n\>：行にまたがる数を\<n\>行分に設定
Geminiで笛を使う魔法少女を描いてみた。

# 概要

Geminiで笛を使う魔法少女を描いてみました。

# 実装

プロンプトと実行結果は以下の通りでした。

```
光の笛を使う魔法少女を描いてください。
```
![光の笛を使う魔法少女_20250506.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3192024/a804f960-f45c-46da-bcee-d9ba735d4046.png)


```
闇の笛を使う魔法少女を描いてください。
```
![闇の笛を使う魔法少女_20250506.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3192024/1ebd80cf-4f31-4e9f-893f-47209492191d.png)



```
聖なる笛を使う魔法少女を描いてください。
```
![聖なる笛を使う魔法少女_20250506.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3192024/35ec11b1-991a-4aca-a564-58b3ea0fa5d3.png)


# まとめ

聖の子が可愛いかも。
何かの役に立てばと。
Tensorflow.kerasにおいて、ニューラルネットワークモデルの中間層数を簡単に変化させる記述方法

# 背景
ニューラルネットワークを用いた機械学習において、より精度を上げようとする場合、モデルの中間層数を含めたハイパーパラメータチューニングは欠かせません。
ただ、tensorflowでニューラルネットワークモデルを記述する場合、下記のように記述されていることが多いと思います。
(Kaggleチュートリアルでよく知られている、タイタニック号製造予測を想定しています。)

```model_train01.py
#(前提)「in_var」は説明変数のリスト。「out_var」は目的変数のリスト（生/死=0/1の集まり）

import tensorflow as tf

model = tf.keras.models.Sequential([
    tf.keras.layers.Dense(12, activation='relu',name='dense0', input_shape=(in_var.shape[1],)),  #入力層定義
    tf.keras.layers.Dense(12, activation='relu'),   #1層目の『中間層』を定義。ノード数=12
    tf.keras.layers.Dense(12, activation='relu'),   #2層目の『中間層』を定義。ノード数=12
    tf.keras.layers.Dense(12, activation='relu'),   #3層目の『中間層』を定義。ノード数=12
    tf.keras.layers.Dropout(0.1),   #過学習防止のためのドロップアウト層。ドロップアウト率=0.1(10%)
    tf.keras.layers.Dense(2,activation='sigmoid')  #出力層（生/死=2値判定）
    ])
model.compile(optimizer='adam',loss='sparse_categorical_crossentropy',metrics=['accuracy'])
model.summary()

history=model.fit(in_var, out_var, epochs=500, batch_size=32,verbose=1,
                validation_split=0.3)
```

# 問題点
上記のように記述した場合、中間層ノード数や学習回数(epochs)が直接定義されているため、パラメータ調整をする際には下記のように変数を定義して記述することが多いと思います。

```model_train02.py
#学習条件(ハイパーパラメータ)を変数定義
node=12 #中間層ノード数
Epochs=500 #学習回数

model = tf.keras.models.Sequential([
    tf.keras.layers.Dense(node, activation='relu',name='dense0', input_shape=(in_var.shape[1],)),
    tf.keras.layers.Dense(node, activation='relu'),   #1層目の『中間層』を定義
    tf.keras.layers.Dense(node, activation='relu'),   #2層目の『中間層』を定義
    tf.keras.layers.Dense(node, activation='relu'),   #3層目の『中間層』を定義
    tf.keras.layers.Dropout(0.1),   #ドロップアウト層
    tf.keras.layers.Dense(2,activation='sigmoid')  #出力層（2値判定）
    ])
model.compile(optimizer='adam',loss='sparse_categorical_crossentropy',metrics=['accuracy'])
model.summary()

history=model.fit(in_var, out_var, epochs=Epochs, batch_size=32,verbose=1,
                validation_split=0.3)
```
こうすれば、学習条件（中間層ノード数、学習回数）を簡単に変化させることができます。

ただ、この場合でも中間層数を変化させるには、モデル定義時のDense行を追加する必要があり、ひと手間です。
特に、自動で中間層数含めたハイパーパラメータチューニングを行いたい場合には困ってしまいます。

# 解決策
中間層数を簡単に変化させたい場合には「.add」を使う記述方法が便利です。
```model_train03.py
#学習条件(ハイパーパラメータ)を変数定義
node=12 #中間層ノード数
Epochs=500 #学習回数
layer_N=3 #中間層数

model = keras.Sequential() #空のsequentialモデルを準備
model.add(layers.Dense(node, activation='relu',name='dense0', input_shape=(in_var.shape[1],)))  #入力層追加
for i in range(layer_N):
    model.add(layers.Dense(node, activation='relu'))  #中間層を追加
model.add(layers.Dropout(0.1))   #ドロップアウト層追加
model.add(layers.Dense(2,activation='sigmoid'))  #出力層追加（2値判定）
model.compile(optimizer='adam',loss='sparse_categorical_crossentropy',metrics=['accuracy'])
model.summary()

history=model.fit(in_var, out_var, epochs=Epochs, batch_size=32,verbose=1,
                validation_split=0.3)
```

この記述方法で中間層数を簡単に変化させることができ、ハイパーパラメータチューニングも捗ります。

誰かの参考になればうれしいです
【GraphAPI】Graph API とは

# はじめに

Graph API を利用するにあたり、アプリケーション開発の経験がないと Graph API がどのようなものなのかイメージが湧きづらいかと思います。

この記事では、Graph API を初めて使う方向けに、Graph API がどのようなものなのかまとめてみました。

# API とは？

Graph API の **API** とは、アプリケーション プログラミング インターフェース (**A**pplication **P**rogramming **I**nterface) の略です。

まず、そもそもインターフェースとは何でしょうか？

## インターフェースの例

インターフェースとは、異なるデバイスなどが情報をやり取りする接続口のことです。

身近な例では、USB もインターフェースのうちの 1 つです。例えば、PC にヘッドセットを USB で接続すると、USB を介して PC と ヘッドセットの間で音声データがやり取りされます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2680397/c034f0e3-e260-4728-a843-890bbab9d50a.png)

## Web API

同じように、API は異なるアプリケーションが情報をやり取りする接続口です。特に、インターネットを介して情報をやり取りする API を **Web API** と呼びます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2680397/aa2babe6-904c-415c-ac2e-781a58e874fb.png)

例えば、Google Map や Instagram などのアプリケーションは、Web API によってインターネット上のサーバから情報を取得することで、地図や写真を表示しています。

::: note
Web API は **HTTPS** を使用してインターネットから情報を取得します。これは、私たちが普段ブラウザで Web サイトにアクセスしているのと同じ仕組みです。
:::

# Graph API とは？

Graph API も Web API のうちの 1 つです。Graph API は Microsoft 365 アプリケーションがインターネットを介して情報をやり取りする接続口です。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2680397/4bc1b3bc-99dc-4e94-b0d9-b79c034b3011.png)

Teams や Outlook などの Microsoft 365 Apps は、Graph API によってインターネット上のサーバから情報を取得して、メッセージやメールの情報を表示しています。

::: note
ユーザーが利用するアプリケーション (クライアント側) とサーバー側で動作するアプリケーションの間で、Graph API によって情報のやり取りが行われます。
:::

(参考：Microsoft Graph API を使用する)
https://learn.microsoft.com/ja-jp/graph/use-the-api

## Graph API の活用例

Graph API は Microsoft 365 Apps 以外のクライアント アプリケーションからも利用することができます。

以下のような利用方法があります。

* Microsoft 365 の運用管理
   テナント管理者が Graph API を利用して、テナントの情報取得や設定変更が行えます
* Power Automate による自動化
   Power Automate から Graph API を実行することで、処理の自動化が行えます
   
### Microsoft 365 の運用管理

Graph API には **Graph Explorer** という Graph API を利用するための専用のアプリケーションが用意されています。Graph Explorer を利用して、テナント管理者がテナント内の情報にアクセスしたり、設定を変更することができます。

::: note
Graph API は PowerShell からも利用することができます。PowerShell を利用すると、スクリプトによって運用業務を自動化することができます。
:::

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2680397/805c917f-bb7c-4e50-8d3e-c9d80e62bf77.png)

(参考：Graph エクスプローラーを使用して Microsoft Graph API を試す)
https://learn.microsoft.com/ja-jp/graph/graph-explorer/graph-explorer-overview

(参考：Microsoft Graph PowerShell SDK をインストールする)
https://learn.microsoft.com/ja-jp/graph/sdks/sdk-installation#install-the-microsoft-graph-powershell-sdk

### Power Automate による自動化


Power Automate は様々な処理をフローとして自動化することができるツールです。Power Automate フローからも Graph API を利用することができます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2680397/34bb50e8-9be3-49a4-a86f-de922ab871f3.png)

(参考：HTTP アクション)
https://learn.microsoft.com/ja-jp/power-automate/desktop-flows/actions-reference/web#invokewebservicebase

# 関連記事

Graph API でテナント内の情報にアクセスするためには、アクセス許可が必要です。Graph API のアクセス許可の概要については以下の記事で紹介しています。


https://qiita.com/atsmin77/items/31df2f5624840b45dda0
#0124（2025/05/06）UNIX思想における「表現性の原則」：ロジックではなく、データに寄せるとは？

## UNIX思想における「表現性の原則」：ロジックではなく、データに寄せるとは？

UNIXの哲学にはいくつかの重要な原則がありますが、その中でも「表現性の原則（Rule of Representation）」は、特にソフトウェアの設計において強力な指針となります。この原則はしばしば「ロジックではなく、データに寄せる（Represent knowledge as data, not as code）」と表現されます。

本記事では、この考え方が意味するところを解説し、「データ」という言葉が具体的に何を指すのか、またこの原則を活かした具体例を交えて紹介します。

---

### 表現性の原則とは何か？

「表現性の原則」とは、処理ロジックに組み込むのではなく、設定や構造をデータとして表現することで、プログラムの柔軟性・拡張性・再利用性を高めるという考え方です。

#### 「ロジックではなく、データに寄せる」とは？

プログラムの挙動を決定づける情報（例：設定、処理の順序、変換規則など）を、コードの中にハードコーディング（固定的な記述）するのではなく、外部ファイルや構造化されたデータ形式（JSON、XML、YAML、CSVなど）に切り出して保持することを意味します。

このようにすることで、以下のような利点が得られます：

* コードを変更せずに挙動を変えられる
* ユーザーや管理者が設定を柔軟にカスタマイズできる
* 汎用性の高いロジックを再利用可能にできる

---

### 「データ」とは何か？

ここで言う「データ」とは、構造化された形式で外部または内部に保持される情報のことです。代表的なものには以下のようなものがあります：

* 設定ファイル（例：`.ini`, `.conf`, `.yaml`）
* 入力パラメータ
* 状態遷移表やルール表
* 外部データベースやリソースファイル
* JSONやXMLで記述された構成情報

つまり、「コードそのもの」ではなく、「コードの動作を決定づける情報」を意味します。

---

### 具体例

#### 1. フィルター処理：`sed` や `awk`

```bash
awk -F, '{ print $1, $3 }' data.csv
```

この例では、CSVファイルという“データ”に対して汎用的なロジックで操作しています。特定のデータ構造（カンマ区切り）に寄せることで、`awk`という一般ツールでさまざまな処理が可能になります。

#### 2. 設定ファイルによるアプリ制御（データ寄せ）

```ini
# config.ini
mode = debug
log_level = info
```

アプリケーションがこの設定ファイルを読み込むことで、コードを変更せずに動作モードやログ出力レベルを切り替えられます。

#### 3. 状態遷移の記述（データ寄せ）

```json
{
  "states": [
    { "from": "init", "to": "processing", "on": "start" },
    { "from": "processing", "to": "done", "on": "finish" }
  ]
}
```

状態遷移をデータとして記述すれば、状態管理ロジックを汎用的に設計でき、別の状態遷移表に差し替えることで異なる挙動を実現可能です。

#### 4. テンプレートエンジン（例：Jinja2）

```html
<h1>Hello {{ name }}!</h1>
```

ここではテンプレート（＝データ）に埋め込まれた変数`name`に動的に値を挿入することで、ロジックを汎用化できます。

---

### 「ロジックに寄せる」場合の例

#### 例1：条件分岐をコードに埋め込む

```python
def process(mode):
    if mode == "debug":
        print("Debugging...")
    elif mode == "release":
        print("Running normally")
    else:
        print("Unknown mode")
```

この場合、動作モードの条件分岐はすべてロジック（コード）に書かれているため、モードを増やすにはコードの修正が必要です。

#### 例2：状態遷移をコードに埋め込む

```python
if current_state == "init" and event == "start":
    current_state = "processing"
elif current_state == "processing" and event == "finish":
    current_state = "done"
```

状態遷移がすべてコード内で記述されており、新しい状態を追加するたびに条件分岐を増やす必要があります。

---

### まとめ

UNIX思想における「表現性の原則」は、コードの柔軟性や再利用性、保守性を高めるための重要な視点です。「ロジックではなく、データに寄せる」ことで、ソフトウェアはより構造化され、他のツールとの連携や自動化も進めやすくなります。

現代のソフトウェア開発においても、この考え方は設定管理、CI/CDパイプライン、マイクロサービスの設計など、さまざまな場面で活用されています。
備忘録: ECSのタスク定義がどのクラスターと紐づいているか確認するためのスクリプト

## はじめに
ECS のクラスターが増えてきて、「このタスク定義はどのクラスターで動いてたっけ？」となることがよくあったので、AWS SDK for Ruby (v3) を用いて、ECS の全クラスターからサービス名と紐づくタスク定義を取得し、その結果を Markdown 表形式で出力するスクリプトを作成しました。

## 前提
- Ruby 2.5 以上
- aws-sdk-ecs gem（v3 系）をインストール済み
- AWS CLI などで認証情報が設定済み（~/.aws/credentials や環境変数）
- 実行環境に対して ECS の ListClusters / ListServices / DescribeServices 権限が付与されている IAM ロール／ユーザー
- aws-sdk-ecs をインストール
```bash
$ gem install aws-sdk-ecs
```

## スクリプト全体
```ruby
#!/usr/bin/env ruby
# encoding: utf-8

require 'aws-sdk-ecs'  # v3
require 'optparse'

# オプションの解析
options = {}
OptionParser.new do |opts|
  opts.banner = "Usage: list_ecs_services.rb [options]"
  opts.on("-r", "--region REGION", "AWS リージョン (例: ap-northeast-1)") do |r|
    options[:region] = r
  end
  opts.on("-h", "--help", "このヘルプを表示") do
    puts opts
    exit
  end
end.parse!

# ECS クライアントの初期化
ecs = Aws::ECS::Client.new(region: options[:region])

# 1) 全クラスター ARN を取得
cluster_arns = []
next_token = nil
begin
  loop do
    resp = ecs.list_clusters(max_results: 100, next_token: next_token)
    cluster_arns.concat(resp.cluster_arns)
    next_token = resp.next_token
    break unless next_token
  end
rescue => e
  warn "Error listing clusters: #{e.message}"
  exit 1
end

# 2) 各クラスターのサービス情報を集める
results = []
cluster_arns.each do |cluster_arn|
  cluster_name = cluster_arn.split('/').last

  # list_services でサービス ARN を取得
  service_arns = []
  token = nil
  begin
    loop do
      resp = ecs.list_services(cluster: cluster_arn, max_results: 100, next_token: token)
      service_arns.concat(resp.service_arns)
      token = resp.next_token
      break unless token
    end
  rescue => e
    warn "Error listing services for #{cluster_name}: #{e.message}"
    next
  end

  # describe_services でサービス詳細（名前・タスク定義）を取得
  service_arns.each_slice(10) do |batch|
    begin
      ds = ecs.describe_services(cluster: cluster_arn, services: batch)
      ds.services.each do |svc|
        results << {
          cluster:         cluster_name,
          service:         svc.service_name,
          task_definition: svc.task_definition
        }
      end
    rescue => e
      warn "Error describing services for #{cluster_name}: #{e.message}"
      next
    end
  end
end

# 3) 出力前にソート（クラスター名 → サービス名）
results.sort_by! { |r| [r[:cluster], r[:service]] }

# 4) マークダウン表で出力
puts "| Cluster | Service | Task Definition |"
puts "| ------- | ------- | ---------------- |"
results.each do |r|
  puts "| #{r[:cluster]} | #{r[:service]} | #{r[:task_definition]} |"
end

```

## 実行方法
```bash
$ ruby list_ecs_services.rb -r ap-northeast-1 > ecs_services.md
```
vscodeでもGitHub Copilot Agent modeが使えるようになった🎉

## はじめに

https://qiita.com/fujihara_hideyuki/items/23f51d27c13d908c5678

以前にこちらの記事を書いたのですが、

Insiders**ではない方**のvscodeでもAgent modeが使えるようになったので、

そのセットアップ方法について記事にしたいと思います。

## セットアップ方法⚙️

とはいってもとても簡単です🎶

### 手順1 : 歯車マーク（⚙️）をクリックして「設定」を開く

editorの左下にある⚙️マークをクリックして「**設定**」をクリックします。

英語表記の場合はこれが「settings」になっていると思いますので、これをクリックします。

### 手順2 : 検索欄に「chat.agent.enabled」と入力&チェック

手順1で進んだ先に検索欄があるかと思いますので、

こちらに「**chat.agent.enabled**」と入力して、

これにチェックマークを入れます。

### 手順3 : Copilot Edits欄のAgent modeを有効化

Copilotのchatを開き、

「**質問する**」

こちらをクリックします。

すると、

* 質問する
* 編集
* エージェント

とあるので「**エージェント**」をクリックします。

これでvscodeでもAgent modeが使えるようになります🙌

Agent modeをやめたい時も「エージェント」をクリックして、

「編集」or「質問する」をクリックすればいいだけなので、

とても簡単で楽チンですね♪

## 参考

https://forest.watch.impress.co.jp/docs/news/2004732.html

https://note.com/hantani/n/n2c5b453654ab
Reactで文字列内のURLをaタグにする方法

SlackやX（旧Twitter）、LineなどでURLを貼り付けて投稿するとURLの部分がリンクになり、クリックするとそのURLのページを開くことができますが、あれをReactでやる方法です。

「[react-string-replace](URL https://www.npmjs.com/package/react-string-replace)」というライブラリを使うと実現できます。

## サンプル
```React
import reactStringReplace from 'react-string-replace';

const text = 'URLをご確認ください。https://www.dabohaze.site よろしくお願いします。'

const Sample = () => {
  return (
    <p>
      {reactStringReplace(text, /(https?:\/\/\S+)/g, (match, i) => (
        <a key={i} href={match} target="_blank">{match}</a>
      ))}
    </p>
  )
}

export default Sample
```

## 解説
reactStringReplaceの第一引数の文字列内に第二引数の正規表現にマッチするパターンがあった場合、文字列を置換してくれます。

「match」には正規表現にマッチした文字列が入るので、上記の場合はURLが入るのでそれをhrefと文字列に指定しています。

正規表現にマッチする文字列が複数存在する場合は全て置換してくれますし、正規表現なのでURL以外にも電話番号やハッシュタグなどにも使用できます。
GitHubの登録メールアドレスを変更したらVercelにデプロイできなくなった場合の対応方法

## 状況
- GitHubのリポジトリにプッシュしてもVercelにデプロイがされなくなった
- 他メンバーは問題なくデプロイできる

## 原因
- GitHubに登録しているメールアドレスを変更したことにより、GitHubのメールアドレスとgitconfigのメールアドレスが異なってしまっいた

## 対応方法
- gitconfigメールアドレスをGitHubのメールアドレスと同じものに更新して再度プッシュしたら無事デプロイされた
Pythonで時系列データを１秒ごとに追加表示するサンプルプログラム

# 読み込んだデータを時系列表示する際に，逐次（１秒ごと）に追加（更新）してプロットするサンプルプログラム

## 出力プロット例
![add_plotting.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1979979/dfec906a-f01e-442f-9fb0-68d2d698723a.gif)


**コードブロック**
```add_plotting.py
import time
import random
import matplotlib.pyplot as plt
import matplotlib.animation as animation

# ランダムな時系列データを生成
data = [random.randint(0, 10) for _ in range(10)]

# FigureとAxesを作成
fig, ax = plt.subplots()
line, = ax.plot([], [])

# Axesの設定
ax.set_xlim(0, 10)
ax.set_ylim(0, 10)
ax.set_xlabel("Time (s)")
ax.set_ylabel("Value")

# アニメーションの更新関数
def update(frame):
    x = list(range(frame + 1))
    y = data[:frame + 1]
    line.set_data(x, y)
    return line,

# アニメーションの生成と表示
ani = animation.FuncAnimation(fig, update, frames=10, interval=1000, blit=True)
plt.show()
```
個人的備忘録：React初心者がJavaScriptからTypeScriptに切り替える際につまずいた構文の違いまとめ

## はじめに

この記事では、Next.js を使って開発を進める中で、TypeScript（TS）と JavaScript（JS）の構文の違いについて整理します。

:::note info
**個人の備忘録程度の走り書きとなっておりますが、温かい目で見守っていただければ幸いです。**
:::

日々の開発で混乱しないよう、基本的な構文の違いをまとめておきます。

## 書こうと思ったきっかけ

受講しているITスクールのハッカソンの開発の一環で、Next.js プロジェクト内で JavaScript と TypeScript の書き方が混在していたため、型の指定や構文の違いで戸惑う場面がありました。今後の開発でスムーズに書き分けるためにも、備忘録として記事にまとめています。

## 内容

### 1. 変数や関数の型定義

**JavaScript（型なし）**

```js
const userName = "Taro";
function greet(name) {
  return "Hello, " + name;
}
```

**TypeScript（型あり）**

```ts
const userName: string = "Taro";
function greet(name: string): string {
  return "Hello, " + name;
}
```

---

### 2. オブジェクトの型定義

**JavaScript**

```js
const user = {
  name: "Taro",
  age: 25
};
```

**TypeScript**

```ts
type User = {
  name: string;
  age: number;
};

const user: User = {
  name: "Taro",
  age: 25
};
```

---

### 3. useStateの型指定（React）

**JavaScript**

```js
const [count, setCount] = useState(0);
```

**TypeScript**

```ts
const [count, setCount] = useState<number>(0);
```

---

### 4. propsの型定義

**JavaScript**

```js
function Hello(props) {
  return <h1>Hello, {props.name}</h1>;
}
```

**TypeScript**

```ts
type HelloProps = {
  name: string;
};

function Hello({ name }: HelloProps) {
  return <h1>Hello, {name}</h1>;
}
```

---

### 5. Next.js API Routeの型定義

**JavaScript**

```js
export default function handler(req, res) {
  res.status(200).json({ message: "Hello World" });
}
```

**TypeScript**

```ts
import type { NextApiRequest, NextApiResponse } from "next";

export default function handler(req: NextApiRequest, res: NextApiResponse) {
  res.status(200).json({ message: "Hello World" });
}
```

---

## まとめ

Next.js では `.tsx` という拡張子を使えば、Reactコンポーネントに TypeScript を導入できます。型安全にコードを書きたいときや、補完機能を強化したいときには TypeScript が非常に便利だと感じました...！
個人的備忘録：The default export is not a React Component エラーの原因と対処法

## はじめに

この記事では、Next.js プロジェクトでよく見られるエラーの一つである `Error: The default export is not a React Component in "/page"` の発生原因とその対処法について解説します。

**個人の備忘録程度の走り書きとなっておりますが、温かい目で見守っていただければ幸いです。**

## 書こうと思ったきっかけ

受講しているITスクールのハッカソンの開発の一環で、ページを表示させようとした際にこのエラーに遭遇しました。原因が特定できるまで少し時間がかかり、同じようなエラーに悩む人の参考になればと思い、備忘録としてまとめました。

## 内容

このエラー：

```
Error: The default export is not a React Component in "/page"
```

は、Next.js が `app/page.tsx`（または `app/page.js`）を読み込もうとした際に、**正しく export された React コンポーネントが存在しない場合に発生**します。

## 問題だったこと

今回のケースで問題だったのは、React コンポーネントを定義していながら、それを `export default` していなかった点です。

### 原因: `export default` を書いていない

```tsx
const Home = () => {
  return <div>ようこそ</div>;
};
// ← export がない！
```

### 正しい例：

```tsx
const Home = () => {
  return <div>ようこそ</div>;
};

export default Home;
```

### 他の可能性：

* 関数の return が抜けている（記述ミス）
* `export default` しているのが Reactコンポーネントではない
* `page.tsx` が本来あるべき場所（`app/`直下）に存在しない

## まとめ

このエラーは初歩的なミスであることが多いですが、構文エラーや return 文の書き忘れなどが原因となるため、エディタで構文をしっかりチェックすることが大切だと思いました...。
個人的備忘録：React/Next.jsでのJavaScriptとTypeScriptの見分け方自分メモ

## はじめに

ReactやNext.jsで開発を行っていると、JavaScriptとTypeScriptの違いに戸惑うことがあります。

:::note info
**特にファイルを見ただけでは、どちらで書かれているのか一目で判断しづらいケースもあります。**
:::

この記事では、コードからJavaScriptかTypeScriptかを見分けるポイントを自分なりに整理しました。

## 書こうと思ったきっかけ

受講しているITスクールのハッカソンの開発の一環で忘れないように記事にまとめています。個人の備忘録程度の走り書きとなっておりますが、温かい目で見守っていただければ幸いです。

## 内容

以下のようなコード例から、JavaScriptかTypeScriptかを見分けるには、主に以下のポイントを確認します。

※以下の内容は、あくまで個人的な備忘録としてまとめたものであり、完全な網羅性や正確性を保証するものではありません。

### 型注釈があるかどうか

たとえば、

```tsx
const Home: React.FC = () => { ... }
```

や

```tsx
const handleRegister = async (e: React.FormEvent) => { ... }
```

のように、`React.FC` や `React.FormEvent` といった記述は **型注釈**です。これらはTypeScript特有の構文であり、JavaScriptでは使用できません。

### useStateなどのジェネリクス記法

```tsx
const [message, setMessage] = useState<string>("Loading...");
```

このように `<string>` のような型指定がされている場合もTypeScriptです。

### 拡張子の確認

ファイルの拡張子が `.tsx` であればTypeScript + JSX、`.ts` であれば純粋なTypeScriptです。`.js` や `.jsx` であればJavaScriptです。

## まとめ

ReactやNext.jsでのフロントエンド開発において、TypeScriptかJavaScriptかを判断するには、**型注釈の有無**と**ファイルの拡張子**を確認するのが最も簡単で確実です。今後の実装・コードレビュー・デバッグの際にも役立てたい知識として、この記事を備忘録として残します...！
ChatGPTを使用したアプリ開発記【コメント機能を実装】

# ✅ ステップ 1：Post にコメント配列を追加
```App.js
const newPost = {
  text: text,
  time: formattedTime,
  likes: 0,
  user: user?.email,
  imageUrl,
  videoUrl,

// コメントを配列として追加
  comments: [], 
};
```
# ✅ ステップ 2：posts.map の中にコメント入力欄と表示を追加
```App.js
              {/* コメント一覧表示 */}
              <h4>コメント</h4>
              <ul>
              // post.comments（各投稿のコメント配列）を .map() で繰り返し処理。
	          // comment がコメントの中身、cIndex がそのインデックス番号。
                {post.comments.map((comment, cIndex) => (

                // key={cIndex} は React がリストの要素を追跡するために必要。
                  <li key={cIndex} style={{ fontSize: '0.9rem' }}>{comment}</li>
                ))}
              </ul>
              {/* コメント入力欄 */}
              <textarea
                placeholder='コメントを追加...'
                rows={3}

                // 	ユーザーが入力したときに実行される処理。
	            // setPosts を使って、状態 posts を更新。
                onChange={(e) => setPosts((prev) => {

                // 現在の posts 配列をコピーして編集可能にします。
                  const updated = [...prev];

             // 対象の投稿（index）の draftComment プロパティに、入力中の値を保存します。
                  updated[index].draftComment = e.target.value;

                  // 編集した投稿配列を返し、React の状態として更新します。
                  return updated;
                })}
                // テキストエリアに表示する値を、post.draftComment から取得。
	            // 未入力なら空文字列を表示。
                value={post.draftComment || ''}
                style={{ width: '100%', marginTop: '0.5rem' }}
              />
              <button

              // ボタンがクリックされたときの処理。
	          // コメントが空でない場合のみ処理を進めます。
                onClick={() => {
                  if ((post.draftComment || '').trim()) {
                    handleAddComment(index, post.draftComment);
                    
                    // 入力欄をリセット（空文字にする）ために、draftComment を空に更新。
                    setPosts((prev) => {
                      const updated = [...prev];
                      updated[index].draftComment = ``;
                      return updated;
                    });
                  }
                }}
                style={{ marginTop: '0.0rem' }}
              >
                コメントする
              </button>
</button>
```
# ✅ ステップ 3：handleAddComment 関数を追加

```App.js
// postIndex は、どの投稿にコメントを付けるかを示すインデックス（番号）。
// commentText は、実際に追加するコメントのテキスト内容。
const handleAddComment = (postIndex, commentText) => {

// 直接 posts を変更すると React の再レンダリングが正しく動かないため、安全に状態を更新するためにコピーを作成しています（イミュータブルな更新）。
  const updatedPosts = [...posts];

// 	指定された投稿（postIndex）の comments 配列に、新しいコメント（commentText）を追加しています。
  updatedPosts[postIndex].comments.push(commentText);

// コメントを追加した posts を React の状態として更新します。
// これにより、UI が最新の状態（コメントが追加された投稿）に再描画されます。
  setPosts(updatedPosts);
};
```
# UI
![スクリーンショット 2025-05-05 8.41.04.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1058366/9aeda6a8-524e-420b-b2fa-3e77c430e031.png)
個人的備忘録：Next.js × TypeScriptで作るユーザー登録フォーム【実装メモ】

## はじめに

この記事では、React + Next.js を用いた一般ユーザー登録ページを TypeScript で実装した際のポイントと注意点についてまとめます。

:::note info
**個人の備忘録程度の走り書きとなっておりますが、温かい目で見守っていただければ幸いです。**
:::

主に `useState` や `useEffect`、フォーム送信イベントの型付けなど、基本的な型定義を中心に解説しています。

## 書こうと思ったきっかけ

受講しているITスクールのハッカソンの開発の一環で、フロントエンドとバックエンド（FastAPI）の連携部分を実装する機会がありました。JavaScriptで書いていたコードをTypeScriptに書き換える中で、型付けの方法や構文上の注意点を整理しておきたいと思い、この記事にまとめました。

## 内容

以下は、一般ユーザーの登録フォームを TypeScript で書いた実装の一部です。
**※内容については正確性に自信があるわけではなく、とりあえず動いたコードを記録しています。**

```tsx
const Register: React.FC = () => {
  const [userName, setUserName] = useState<string>("");
  const [email, setEmail] = useState<string>("");
  const [password, setPassword] = useState<string>("");

  const handleRegister = async (e: React.FormEvent<HTMLFormElement>) => {
    e.preventDefault();
    // fetch 処理など
  };

  return (
    <form onSubmit={handleRegister}>
      {/* 入力フォーム */}
    </form>
  );
};
```

### 解説ポイント：

* `useState<string>("")` と明示することで、型補完が効くようになる。
* フォーム送信イベント `handleRegister` の引数には `React.FormEvent<HTMLFormElement>` を使う。
* 関数コンポーネントは `React.FC` で型注釈すると、`children` や `props` を扱う際に楽になる。

## まとめ

JavaScriptでの実装に慣れていると、TypeScriptでの型付けが最初は面倒に感じることがありますが、エラーの予防や補完機能の強化により、開発体験が格段に良くなると思っています。

小さなフォームでも `useState` や `event` の型定義を丁寧に行うことで、保守性が高まり、チーム開発にも強いコードになるのではないかと考えています...。
Linucレベル１勉強メモ　＃２３

＃ 第二章　ファイル・ディレクトリの操作と管理

練習問題2.8
すべてのユーザーが利用できるユーティリティコマンドを作成しました。そのコマンドの実行ファイルを配置するのが最も適切と考えられるディレクトリを選択してください。

A. /bin

B. /sbin

C. /usr/local/bin

D. /usr/local/sbin

E. /home

（解答）C

（解説）
ディストリビューション標準ではないプログラムやおくじに作成した実行ファイルなどは/usr/localディレクトリ以下に配置するのが一般的です。/binや/sbin以下に配置するコマンドはFHSで定められています。従って、選択肢AとBは不正解です。すべてのユーザー向けの実行ファイルを/home以下に配置することはないので、選択肢Eは不正解です。

典型的なファイルとディレクトリの位置
linuxにおけるファイルシステム内のレイアウトは、FHSとして標準化が進められています。

ルートファイルシステムはlinuxのディレクトリ改装の中で最上位に位置します。ルートファイルシステムに含まれなければならないディレクトリは、/bin, /sbin, /etc, /dev, /libです。

* /bin<br>基本的なコマンドが配置されます。このディレクトリにあるコマンドは、一般ユーザーでも実行可能です。
* /sbin<br>システム管理に必須のコマンドが配置されます。このディレクトリにあるコマンドは、rootユーザーのみ実行可能です。
* /etc<br>システムやアプリケーションの設定情報、スクリプトファイルなどが配置されます。
* /dev<br>ハードディスクやDVDーROMなどのデバイスファイルが配置されます。デバイスファイルは特殊ファイルであり、デバイスに応じたデバイスファイルが必要です。
* /lib<br>共有ライブラリやカーネルモジュールが配置されます。とりわけ、/bin, /sbinにあるコマンドが必要とするライブラリはここに配置されます。
* /media<br>DVD-ROMなどのリムーバブルメディアのマウントポイントが配置されます。
* /mnt<br>一時的にマウントするファイルシステムのマウントポイントが配置されます。
* /opt<br>パッケージ管理の仕組みを使ってプログラムがインストールされるディレクトリです。ディストリビューションによって配置されません。
* /proc<br>カーネル内部の情報にアクセスするための仮想的なファイルシステムです。つまり、このディレクトリ内のファイルはファイルのように見えるだけで、実際にはディスク上に存在しません。
* /root<br>rootユーザーのホームディレクトリです。/homeファイルシステムがマウントできなくなった婆でも、システムのメンテナンスを行うことができるよう、/homeとはbつになっています。FHSではオプション扱いとなっています。
* /boot<br>軌道に必要な設定やカーネルイメージが配置されます。起動時にBIOSの制限を受けないようにするため、ルートファイルとは別に、ディスクの先頭付近に配置されることがあります。
* /home<br>ユーザーごとのホームディレクトリがおかれます。独立したファイルシステムにすることにより、クォータを設定することができたり、保守性を向上させたりできます。FHSではオプション扱いとなっています。
* /tmp<br>一時ファイルがおかれます。すべてのユーザーが読み書き可能です。
* /var<br>ログファイル、メールやプリンタのスプールなど、頻繁に書き換えられるファイルが配置されます。/varディレクトリの下はさらに細分化されており、次のようなディレクトリがあります。
1. /var/cache<br>manコマンドで表示するために整形したデータなあど、一時的なキャッシュファイルが配置されます。
1. /var/lock<br>アプリケーションが排他制御に使うためのロックファイルが配置されます。
1. /var/log<br>ログファイルが書き出されます。システムのログファイルmessages、メールシステムのログファイルmaillog(mail.log)などがあります。
1. /var/run<br>システムの状態を示すファイルが配置されます。
1. /var/spool<br>印刷待ちのデータ(/var/spool/lpd)や予約されたジョブ(/var/spool/at)など、処理待ちのデータが配置されます。
* /usr<br>コマンドやユーティリティなどが配置されます。/userディレクトリの下はさらに細分化されており、次のようなディレクトリがあります。
1. /usr/bin<br>ユーザーが一般的に使うコマンドで、緊急時のシステム保守に必須ではないコマンドはここに配置されます。
1. /usr/sbin<br>システム管理コマンドで緊急時のシステム保守に必須ではないコマンドがここに配置されます。
1. /usr/lib<br>プログラムに必要な共有ライブラリが配置されます。
1. /usr/local<br>ローカルシステムで必要とされるコマンドやライブラリ、ドキュメントなどが配置されます。このディレクトリ内は、さらにbin, sbin, libなどのディレクトリに細分化されます。
1. /usr/share<br>x86やx86-64といったシステムアーキテクチャに依存しないファイルが配置されます。例えば、/usr/share/manにはmanコマンドで使うマニュアルが配置されます。
1. /usr/src<br>linuxのカーネルソースなど、ソースコードが配置されます。

（わからない単語解説）
* FHS<br>linuxやUNIX系のオペレーティングシステムにおけるファイルシステムの階層構造の標準仕様です。FHSに準拠することで、ソフトウェアの移植性や管理の容易性が向上し、ユーザーはファイルやディレクトリの場所を予測しやすくなります。